-
-
Notifications
You must be signed in to change notification settings - Fork 1
/
TestWebWorker.scala
90 lines (68 loc) · 2.38 KB
/
TestWebWorker.scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
package japgolly.webapputil.test
import japgolly.scalajs.react._
import japgolly.webapputil.webworker.AbstractWebWorker.TransferList
import japgolly.webapputil.webworker._
import scala.scalajs.js
object TestWebWorker {
final class Client(server: () => Server) extends AbstractWebWorker.Client {
private var onMessage: js.Any => Callback =
_ => Callback.empty
override def onError(f: OnError): Callback =
Callback.empty
override def listen(f: js.Any => Callback): Callback =
Callback {
onMessage = f
}
override def send(msg: js.Any, transferList: TransferList): Callback =
Callback(server().recvFromClient(this, msg))
def connect(s: Server): Unit =
s.connect(this)
def recvFromServer(msg: js.Any): Unit = {
onMessage(msg).runNow()
}
}
// ===================================================================================================================
final class Server extends AbstractWebWorker.Server {
override type Client = TestWebWorker.Client
private var ports: List[Port] =
Nil
private var onConnect: Client => CallbackTo[js.Any => Callback] =
_ => CallbackTo.pure(_ => Callback.empty)
override def onError(f: OnError): Callback =
Callback.empty
override def listen(f: Client => CallbackTo[js.Any => Callback]): Callback =
Callback {
onConnect = f
}
override def send(to: IterableOnce[Client], msg: js.Any, transferList: TransferList): Callback =
Callback {
for (c <- to.iterator)
c.recvFromServer(msg)
}
def newClient(connect: Boolean = true): Client = {
val c = new Client(() => this)
if (connect)
this.connect(c)
c
}
def connect(c: Client): Unit = {
val port = new Port(c)
ports ::= port
port.onMessage = onConnect(c).runNow()
}
def recvFromClient(client: Client, msg: js.Any): Unit = {
val port = ports.find(_.client eq client).getOrElse(sys error "Client not connected")
port.onMessage(msg).runNow()
}
}
final class Port(val client: Client) {
var onMessage: js.Any => Callback =
_ => Callback.empty
}
// ===================================================================================================================
def pair(): (Client, Server) = {
val s = new Server
val c = s.newClient()
(c, s)
}
}