11package util
22
33import model .BasicWebSocket
4+ import org .scalajs .dom .raw .Event
45import util .logger .log
5-
66import scala .language .reflectiveCalls
77import scala .scalajs .js
8- import scala .scalajs .js .Function1
8+ import scala .scalajs .js .annotation .{JSExport , JSExportAll }
9+
10+ import js .Dynamic .{ global => g , newInstance => jsnew }
911
1012@ js.native
1113trait HijackSocket extends js.Object {
12- def addListener (eventName : String , listener : js.Function1 [js.Dynamic , _]): this .type = js.native
13- def write (data : String ): Unit = js.native
14+ def addListener (eventName : String , listener : js.Function1 [_, _]): this .type = js.native
15+
16+ def removeListener (eventName : String , listener : js.Function1 [_, _]): this .type = js.native
17+ def write (data : js.Any ): Unit = js.native
1418 def destroy (): Unit = js.native
1519}
1620
21+ @ JSExportAll
22+ case class CustomTextEvent (data : String )
1723
24+ @ JSExportAll
1825class HijackWebSocket (socket : HijackSocket ) extends BasicWebSocket {
1926
2027 socket.addListener(" data" , { socketData : js.Any =>
2128 log.debug(s " HijackWebSocket data: $socketData" )
22- onmessage(new {
23- def data = socketData
24- })
2529 })
2630
2731 socket.addListener(" connect" , { socketData : js.Any =>
2832 log.debug(s " HijackWebSocket connect: $socketData" )
29- onopen()
3033 })
3134
32- socket.addListener(" close" , { socketData : js.Any =>
33- log.debug(s " HijackWebSocket close: $socketData" )
34- onclose(new {
35- def code = 1
36- })
37- })
38-
39- socket.addListener(" error" , { socketData : js.Dynamic =>
40- log.debug(s " HijackWebSocket error: $socketData" )
41- onerror(new {
42- def message = socketData.message.toString
43- })
44- })
45-
46- override def send (data : String ): Unit = {
35+ @ JSExport
36+ override def send (data : js.Any ): Unit = {
4737 socket.write(data)
4838 }
4939
40+ @ JSExport
5041 override def close (code : Int , reason : String ): Unit = {
5142 socket.destroy()
5243 }
5344
54- // Default impl, will be replaced by the attached Terminal
55- override var onopen : Function1 [Unit , _] = { x : Unit => () }
56- override var onmessage : js.Function1 [ {def data : js.Any }, _] = { x : {def data : js.Any } => () }
57- override var onclose : js.Function1 [ {def code : Int }, _] = { x : {def code : Int } => () }
58- override var onerror : js.Function1 [ {def message : String }, _] = { x : {def message : String } => () }
45+ @ JSExport
46+ def addEventListener (`type` : String , listener : js.Function1 [Any , _]): Unit = {
47+ if (`type` == " message" ) {
48+ socket.addListener(" data" , { socketData : js.Any =>
49+ log.debug(s " HijackWebSocket data: $socketData" )
50+ val decoder = jsnew(g.TextDecoder )(" utf-8" )
51+ val data = decoder.decode(socketData).replace(" \r $/g" , " \r\n " )
52+ listener(new CustomTextEvent (data.toString.replace(" \n " , " \r\n " )))
53+ ()
54+ })
55+ } else {
56+ socket.addListener(`type`, listener)
57+ }
58+
59+ }
60+
61+ @ JSExport
62+ def removeEventListener (`type` : String , listener : js.Function1 [Any , _]): Unit = {
63+ if (`type` == " message" ) {
64+ socket.removeListener(" data" , listener)
65+ }
66+ socket.removeListener(`type`, listener)
67+ }
5968}
0 commit comments