summaryrefslogtreecommitdiff
path: root/client/src/main/scala/workbench/WorkbenchClient.scala
diff options
context:
space:
mode:
authorLi Haoyi <haoyi@dropbox.com>2014-09-05 13:20:48 -0700
committerLi Haoyi <haoyi@dropbox.com>2014-09-05 13:20:48 -0700
commitcf9b1e5dc81d4c3a30a26cb18e38f7db03460ef4 (patch)
tree8df706e2ebcbab222e898d30dea71fdef0b419ca /client/src/main/scala/workbench/WorkbenchClient.scala
parent020885615083203808a3ea7ab3181cedf9a48331 (diff)
downloadworkbench-cf9b1e5dc81d4c3a30a26cb18e38f7db03460ef4.tar.gz
workbench-cf9b1e5dc81d4c3a30a26cb18e38f7db03460ef4.tar.bz2
workbench-cf9b1e5dc81d4c3a30a26cb18e38f7db03460ef4.zip
Workbench is now pure-scala
Diffstat (limited to 'client/src/main/scala/workbench/WorkbenchClient.scala')
-rw-r--r--client/src/main/scala/workbench/WorkbenchClient.scala87
1 files changed, 87 insertions, 0 deletions
diff --git a/client/src/main/scala/workbench/WorkbenchClient.scala b/client/src/main/scala/workbench/WorkbenchClient.scala
new file mode 100644
index 0000000..c67d4c6
--- /dev/null
+++ b/client/src/main/scala/workbench/WorkbenchClient.scala
@@ -0,0 +1,87 @@
+package com.lihaoyi.workbench
+import upickle._
+import org.scalajs.dom
+import org.scalajs.dom.extensions._
+import upickle.{Reader, Writer, Js}
+import scala.scalajs.js
+import scala.scalajs.js.annotation.JSExport
+import scalajs.concurrent.JSExecutionContext.Implicits.runNow
+object WireServer extends autowire.Server[Js.Value, upickle.Reader, upickle.Writer]{
+
+ def write[Result: Writer](r: Result) = upickle.writeJs(r)
+ def read[Result: Reader](p: Js.Value) = upickle.readJs[Result](p)
+ def wire(parsed: Js.Arr): Unit = {
+ val Js.Arr(path, args: Js.Obj) = parsed
+
+ val req = new Request(
+ upickle.readJs[Seq[String]](path),
+ args.value.toMap
+ )
+ WireServer.route[Api](WorkbenchClient).apply(req)
+ }
+}
+@JSExport
+object WorkbenchClient extends Api{
+ val shadowBody = dom.document.body.cloneNode(deep = true)
+ var interval = 1000
+ var success = false
+ @JSExport
+ def main(bootSnippet: String, host: String, port: Int): Unit = {
+ Ajax.post(s"http://$host:$port/notifications").onComplete{
+ case util.Success(data) =>
+ if (!success) println("Workbench connected")
+ success = true
+ interval = 1000
+ json.read(data.responseText)
+ .asInstanceOf[Js.Arr]
+ .value
+ .foreach(v => WireServer.wire(v.asInstanceOf[Js.Arr]))
+ main(bootSnippet, host, port)
+ case util.Failure(e) =>
+ if (!success) println("Workbench disconnected " + e)
+ success = false
+ interval = math.min(interval * 2, 30000)
+ dom.setTimeout(() => main(bootSnippet, host, port), interval)
+ }
+ }
+
+ override def clear(): Unit = {
+ dom.document.asInstanceOf[js.Dynamic].body = shadowBody.cloneNode(true)
+ for(i <- 0 until 100000){
+ dom.clearTimeout(i)
+ dom.clearInterval(i)
+ }
+ }
+
+ override def reload(): Unit = {
+ dom.console.log("Reloading page...")
+ dom.location.reload()
+ }
+
+ override def run(path: String, bootSnippet: Option[String]): Unit = {
+ val tag = dom.document.createElement("script")
+ var loaded = false
+
+ tag.setAttribute("src", path)
+ bootSnippet.foreach{ bootSnippet =>
+ tag.onreadystatechange = (e: dom.Event) => {
+ if (!loaded) {
+ dom.console.log("Post-run reboot")
+ js.eval(bootSnippet)
+ }
+ loaded = true
+ }
+ tag.asInstanceOf[js.Dynamic].onload = tag.onreadystatechange
+ }
+ dom.document.head.appendChild(tag)
+ }
+
+ override def print(level: String, msg: String): Unit = {
+ level match {
+ case "error" => dom.console.error(msg)
+ case "warn" => dom.console.warn(msg)
+ case "info" => dom.console.info(msg)
+ case "log" => dom.console.log(msg)
+ }
+ }
+} \ No newline at end of file