summaryrefslogtreecommitdiff
path: root/package.scala
diff options
context:
space:
mode:
Diffstat (limited to 'package.scala')
-rw-r--r--package.scala36
1 files changed, 25 insertions, 11 deletions
diff --git a/package.scala b/package.scala
index 6bc58b3..0e0e7be 100644
--- a/package.scala
+++ b/package.scala
@@ -22,11 +22,12 @@ import spray.can.server.websockets.model.OpCode.Text
package object workbench extends sbt.Plugin {
val refreshBrowsers = taskKey[Unit]("Sends a message to all connected web pages asking them to refresh the page")
+ val updateBrowsers = taskKey[Unit]("partially resets some of the stuff in the browser")
val generateClient = taskKey[File]("generates a .js file that can be embedded in your web page")
val localUrl = settingKey[(String, Int)]("localUrl")
val server = settingKey[ActorRef]("local websocket server")
val fileName = settingKey[String]("name of the generated javascript file")
-
+ val bootstrapSnippet = settingKey[String]("piece of javascript to make things happen")
implicit val system = ActorSystem(
"SystemLol",
config = ConfigFactory.load(ActorSystem.getClass.getClassLoader),
@@ -46,7 +47,7 @@ package object workbench extends sbt.Plugin {
localUrl := ("localhost", 12345),
fileName := "workbench.js",
server := {
- implicit val server = system.actorOf(Props(new SocketServer))
+ implicit val server = system.actorOf(Props(new SocketServer(bootstrapSnippet.value)))
val host = localUrl.value
io.IO(Sockets) ! Http.Bind(server, host._1, host._2)
server
@@ -57,8 +58,8 @@ package object workbench extends sbt.Plugin {
new Logger {
def log(level: Level.Value, message: => String): Unit =
if(level >= Level.Info) server.value.send(Json.arr("print", level.toString(), message))
- def success(message: => String): Unit = server.value.send(Json.arr("print", message))
- def trace(t: => Throwable): Unit = server.value.send(Json.arr("print", t.toString))
+ def success(message: => String): Unit = server.value.send(Json.arr("print", "info", message))
+ def trace(t: => Throwable): Unit = server.value.send(Json.arr("print", "error", t.toString))
}
}
val currentFunction = extraLoggers.value
@@ -68,16 +69,29 @@ package object workbench extends sbt.Plugin {
streams.value.log("Reloading Pages...")
server.value.send(Json.arr("reload"))
},
+ updateBrowsers := {
+ println("partialReload")
+ server.value send Json.arr("clear")
+ ((crossTarget in Compile).value * "*.js").get.map{ (x: File) =>
+ println("Checking " + x.getName)
+ FileFunction.cached(streams.value.cacheDirectory / x.getName, FilesInfo.lastModified, FilesInfo.lastModified){ (f: Set[File]) =>
+ println("Refreshing " + x.getName)
+ server.value send Json.arr("run", f.head.getAbsolutePath, bootstrapSnippet.value)
+ f
+ }(Set(x))
+ }
+ },
generateClient := {
- val clientTemplate = IO.readStream(getClass.getClassLoader.getResourceAsStream("workbench_template.ts"))
- val transformed = clientTemplate.replace("<host>", localUrl.value._1).replace("<port>", localUrl.value._2.toString)
- val outputFile = (crossTarget in Compile).value / fileName.value
- IO.write(outputFile, transformed)
- outputFile
+ FileFunction.cached(streams.value.cacheDirectory / "workbench"/ "workbench.js", FilesInfo.full, FilesInfo.full){ (f: Set[File]) =>
+ val transformed = IO.read(f.head).replace("<host>", localUrl.value._1).replace("<port>", localUrl.value._2.toString)
+ val outputFile = (crossTarget in Compile).value / fileName.value
+ IO.write(outputFile, transformed)
+ Set(outputFile)
+ }(Set(new File(getClass.getClassLoader.getResource("workbench_template.ts").getPath))).head
}
)
- class SocketServer extends Actor{
+ class SocketServer(bootstrapSnippet: String) extends Actor{
val sockets: mutable.Set[ActorRef] = mutable.Set.empty
def receive = {
case x: Tcp.Connected => sender ! Tcp.Register(self) // normal Http server init
@@ -97,6 +111,7 @@ package object workbench extends sbt.Plugin {
case Sockets.Upgraded =>
sockets.add(sender)
println("Browser Open n=" + sockets.size)
+ self send Json.arr("eval", bootstrapSnippet)
case f @ Frame(fin, rsv, Text, maskingKey, data) =>
sockets.foreach(_ ! f.copy(maskingKey=None))
@@ -105,7 +120,6 @@ package object workbench extends sbt.Plugin {
if (sockets.contains(sender)) println("Browser Closed n=" + sockets.size )
sockets.remove(sender)
-
case x =>
}
}