Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,4 @@ target/
.settings/
.idea
.idea_modules
.vscode
5 changes: 3 additions & 2 deletions build.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ lazy val root = project.in(file(".")).settings(defaultSettings:_*).settings(
name := "workbench",
version := "0.4.1",
organization := "com.lihaoyi",
scalaVersion := "2.12.4",
scalaVersion := "2.12.6",
sbtPlugin := true,
publishArtifact in Test := false,
publishTo := Some("releases" at "https://oss.sonatype.org/service/local/staging/deploy/maven2"),
Expand Down Expand Up @@ -38,10 +38,11 @@ lazy val root = project.in(file(".")).settings(defaultSettings:_*).settings(
(fullOptJS in (client, Compile)).value
(artifactPath in (client, Compile, fullOptJS)).value
},
addSbtPlugin("org.scala-js" % "sbt-scalajs" % "0.6.21"),
addSbtPlugin("org.scala-js" % "sbt-scalajs" % "0.6.24"),
libraryDependencies ++= Seq(
Dependencies.akkaHttp,
Dependencies.akka,
Dependencies.akkaStream,
Dependencies.autowire.value,
Dependencies.upickle.value
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,14 +19,14 @@ object Wire extends autowire.Server[Js.Value, Reader, Writer] with ReadWrite {
def wire(parsed: Js.Arr): Unit = {
val Js.Arr(path, args: Js.Obj) = parsed
val req = new Request(default.readJs[Seq[String]](path), args.value.toMap)
Wire.route[Api](WorkbenchClient).apply(req)
Wire.route[WorkbenchApi](WorkbenchClient).apply(req)
}
}

@JSExportTopLevel("WorkbenchClient")
object WorkbenchClient extends Api {
object WorkbenchClient extends WorkbenchApi {
@JSExport
lazy val shadowBody = dom.document.body.cloneNode(deep = true)
lazy val shadowBody: Node = dom.document.body.cloneNode(deep = true)

@JSExport
var interval = 1000
Expand Down
2 changes: 1 addition & 1 deletion example/build.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ enablePlugins(WorkbenchPlugin)

name := "Example"

scalaVersion := "2.12.3"
scalaVersion := "2.12.6"

version := "0.1-SNAPSHOT"

Expand Down
2 changes: 1 addition & 1 deletion example/project/build.sbt
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
addSbtPlugin("org.scala-js" % "sbt-scalajs" % "0.6.19")
addSbtPlugin("org.scala-js" % "sbt-scalajs" % "0.6.24")

lazy val workbench = RootProject(file("../.."))
lazy val root = project.in(file(".")).dependsOn(workbench)
2 changes: 1 addition & 1 deletion example/src/main/resources/index-dev.html
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
<script type="text/javascript" src="../example-fastopt.js"></script>

<script>
example.ScalaJSExample().main();
example.ScalaJSExample.main();
</script>
</body>
</html>
26 changes: 15 additions & 11 deletions example/src/main/scala/example/ScalaJSExample.scala
Original file line number Diff line number Diff line change
@@ -1,45 +1,49 @@
package example
import scala.scalajs.js.annotation.JSExport
import org.scalajs.dom
import org.scalajs.dom.html
import scala.scalajs.js.annotation.{JSExportTopLevel, JSExport}
import org.scalajs.dom.{html, document, window, CanvasRenderingContext2D}
import scala.util.Random

case class Point(x: Int, y: Int){
case class Point(x: Int = Random.nextInt(255),
y: Int = Random.nextInt(255),
dx: Int = Random.nextInt(3) - 1,
dy: Int = Random.nextInt(3) - 1){
def +(p: Point) = Point(x + p.x, y + p.y)
def /(d: Int) = Point(x / d, y / d)
}

@JSExport
@JSExportTopLevel("example.ScalaJSExample")
object ScalaJSExample {
val ctx =
dom.document
document
.getElementById("canvas")
.asInstanceOf[html.Canvas]
.getContext("2d")
.asInstanceOf[dom.CanvasRenderingContext2D]
.asInstanceOf[CanvasRenderingContext2D]

var p = Point(128, 128)
var color = "black"

var enemiess = List.fill(10)(Point(util.Random.nextInt(255), util.Random.nextInt(255)))
var enemiess = List.fill(10)(Point())
def clear() = {
ctx.fillStyle = color
ctx.fillRect(0, 0, 255, 255)
}

def run = {
def run(time: Double): Unit = {
clear()
ctx.fillStyle = "yellow"
p = Point(p.x, (p.y + 2) % 255)
ctx.fillRect(p.x, p.y, 5, 20)
enemiess = for (enemy <- enemiess) yield {
ctx.fillStyle = "red"
ctx.fillRect(enemy.x, enemy.y, 10, 10)
Point((enemy.x + 1) % 255, (enemy.y + 1) % 255)
enemy.copy(x = (enemy.x + enemy.dx + 255) % 255, y = (enemy.y + enemy.dy + 255) % 255)
}
window.requestAnimationFrame(this.run)
}

@JSExport
def main(): Unit = {
dom.window.setInterval(() => run, 10)
run(0)
}
}
8 changes: 4 additions & 4 deletions project/Dependencies.scala
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
import sbt._
import org.scalajs.sbtplugin.ScalaJSPlugin.autoImport._
import org.portablescala.sbtplatformdeps.PlatformDepsPlugin.autoImport._

object Dependencies {

// jvm dependencies
val akkaHttp = "com.typesafe.akka" %% "akka-http" % "10.0.10"
val akka = "com.typesafe.akka" %% "akka-actor" % "2.4.19"
val akkaHttp = "com.typesafe.akka" %% "akka-http" % "10.1.3"
val akka = "com.typesafe.akka" %% "akka-actor" % "2.5.13"
val akkaStream = "com.typesafe.akka" %% "akka-stream" % "2.5.13"

// js and shared dependencies
val autowire = Def.setting("com.lihaoyi" %%% "autowire" % "0.2.6")
val dom = Def.setting("org.scala-js" %%% "scalajs-dom" % "0.9.3")
val upickle = Def.setting("com.lihaoyi" %%% "upickle" % "0.4.4")

}
2 changes: 1 addition & 1 deletion project/build.properties
Original file line number Diff line number Diff line change
@@ -1 +1 @@
sbt.version=1.0.3
sbt.version=1.1.6
2 changes: 1 addition & 1 deletion project/build.sbt
Original file line number Diff line number Diff line change
@@ -1 +1 @@
addSbtPlugin("org.scala-js" % "sbt-scalajs" % "0.6.21")
addSbtPlugin("org.scala-js" % "sbt-scalajs" % "0.6.24")
42 changes: 42 additions & 0 deletions shared/main/scala/com/lihaoyi/package.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package com.lihaoyi

package object workbench {

import upickle.default.{Reader, Writer}
import upickle.Js

/**
* A standard way to read and write `Js.Value`s with autowire/upickle
*/
trait ReadWrite {
def write[Result: Writer](r: Result) = upickle.default.writeJs(r)
def read[Result: Reader](p: Js.Value) = upickle.default.readJs[Result](p)
}

/**
* Shared API between the workbench server and the workbench client,
* comprising methods the server can call on the client to make it do
* things
*/
trait WorkbenchApi {
/**
* Reset the HTML page to its initial state
*/
def clear(): Unit
/**
* Reload the entire webpage
*/
def reload(): Unit

/**
* Print a `msg` with the given logging `level`
*/
def print(level: String, msg: String): Unit

/**
* Execute the javascript file available at the given `path`.
*/
def run(path: String): Unit
}

}
39 changes: 0 additions & 39 deletions shared/main/scala/workbench/Shared.scala

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.lihaoyi.workbench


import java.io.File

import akka.event.LoggingAdapter
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ package com.lihaoyi.workbench

import java.util.concurrent.atomic.AtomicReference

import akka.actor.{Actor, ActorSystem, Props}
import akka.actor.{Actor, ActorSystem, Props, Terminated}
import akka.http.scaladsl.Http
import akka.http.scaladsl.coding.{Encoder, Gzip, NoCoding}
import akka.http.scaladsl.model.HttpMethods._
Expand Down Expand Up @@ -49,7 +49,7 @@ class WorkbenchActor extends Actor {
queuedMessages = Nil
}

override def receive = {
override def receive: Receive = {
case a: PromiseMessage =>
// Even if there's someone already waiting,
// a new actor waiting replaces the old one
Expand Down Expand Up @@ -81,10 +81,10 @@ class Server(
`Access-Control-Allow-Headers`("Origin, X-Requested-With, Content-Type, Accept, Accept-Encoding, Accept-Language, Host, Referer, User-Agent"),
`Access-Control-Max-Age`(1728000)
)
val cl = getClass.getClassLoader
val cl: ClassLoader = getClass.getClassLoader


implicit val system = ActorSystem(
implicit val system: ActorSystem = ActorSystem(
"Workbench-System",
config = ConfigFactory.load(cl),
classLoader = cl
Expand Down Expand Up @@ -115,9 +115,9 @@ class Server(
*/


implicit val materializer = ActorMaterializer()
implicit val materializer: ActorMaterializer = ActorMaterializer()
// needed for the future map/flatmap in the end
implicit val executionContext = system.dispatcher
implicit val executionContext: ExecutionContext = system.dispatcher

private val serverBinding = new AtomicReference[Http.ServerBinding]()
private val encoder: Encoder = if (useCompression) Gzip else NoCoding
Expand Down Expand Up @@ -176,7 +176,7 @@ class Server(
}
}

def kill() = {
def kill(): Future[Terminated] = {
system.terminate()
}
}
Original file line number Diff line number Diff line change
@@ -1,21 +1,18 @@
package com.lihaoyi.workbench

import sbt._
import sbt.Keys._
import autowire._
import org.scalajs.sbtplugin.ScalaJSPlugin

import org.apache.logging.log4j.message._

import org.apache.logging.log4j.core.{LogEvent => Log4JLogEvent, _}
import org.apache.logging.log4j.core.appender.AbstractAppender
import org.apache.logging.log4j.core.layout.PatternLayout

import scala.concurrent.ExecutionContext.Implicits.global
import org.apache.logging.log4j.core.{LogEvent => Log4JLogEvent}
import org.apache.logging.log4j.message._
import org.scalajs.sbtplugin.ScalaJSPlugin
import sbt.Keys._
import sbt._

object WorkbenchBasePlugin extends AutoPlugin {
import scala.concurrent.ExecutionContext.Implicits.global

override def requires = ScalaJSPlugin
override def requires: AutoPlugin = ScalaJSPlugin

object autoImport {

Expand Down Expand Up @@ -58,20 +55,19 @@ object WorkbenchBasePlugin extends AutoPlugin {
val message = event.getMessage

message match {
case o: ObjectMessage => {
case o: ObjectMessage =>
o.getParameter match {
case e: sbt.internal.util.StringEvent => server.value.Wire[Api].print(level.toString, e.message).call()
case e: sbt.internal.util.ObjectEvent[_] => server.value.Wire[Api].print(level.toString, e.message.toString).call()
case _ => server.value.Wire[Api].print(level.toString, message.getFormattedMessage).call()
case e: sbt.internal.util.StringEvent => server.value.Wire[WorkbenchApi].print(level.toString, e.message).call()
case e: sbt.internal.util.ObjectEvent[_] => server.value.Wire[WorkbenchApi].print(level.toString, e.message.toString).call()
case _ => server.value.Wire[WorkbenchApi].print(level.toString, message.getFormattedMessage).call()
}
}
case _ => server.value.Wire[Api].print(level.toString, message.getFormattedMessage).call()
case _ => server.value.Wire[WorkbenchApi].print(level.toString, message.getFormattedMessage).call()
}
}
}
clientLogger.start()
val currentFunction = extraLoggers.value
(key: ScopedKey[_]) => clientLogger +: currentFunction(key)
key: ScopedKey[_] => clientLogger +: currentFunction(key)
},
server := {
val server = new Server(localUrl.value._1, localUrl.value._2,
Expand All @@ -95,8 +91,6 @@ object WorkbenchBasePlugin extends AutoPlugin {
}
)

private def getScopeId(scope: ScopeAxis[sbt.Reference]): String = {
"" + scope.hashCode()
}
override def projectSettings = workbenchSettings
private def getScopeId(scope: ScopeAxis[sbt.Reference]): String = s"${scope.hashCode()}"
override def projectSettings: Seq[Setting[_]] = workbenchSettings
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
package com.lihaoyi.workbench

import sbt._
import sbt.Keys._
import autowire._
Expand All @@ -20,7 +21,7 @@ object WorkbenchPlugin extends AutoPlugin {
val workbenchSettings = Seq(
refreshBrowsers := {
streams.value.log.info("workbench: Reloading Pages...")
server.value.Wire[Api].reload().call()
server.value.Wire[WorkbenchApi].reload().call()
},

refreshBrowsers := refreshBrowsers.triggeredBy(fastOptJS in Compile).value
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ object WorkbenchSplicePlugin extends AutoPlugin {
val s = munge(sbt.IO.read(new sbt.File(path.drop(prefix.length))))

sbt.IO.write(new sbt.File(path.drop(prefix.length) + ".js"), s.getBytes)
server.value.Wire[Api].run(path + ".js").call()
server.value.Wire[WorkbenchApi].run(path + ".js").call()
}
}
},
Expand Down