package Ġcom . jetbrains . rd . framework Ċ Ċ import Ġcom . jetbrains . rd . framework . base . Wire Base Ċ import Ġcom . jetbrains . rd . util .* Ċ import Ġcom . jetbrains . rd . util . lifetime . Lifetime Ċ import Ġcom . jetbrains . rd . util . lifetime . plus Assign Ċ import Ġcom . jetbrains . rd . util . reactive . IS cheduler Ċ import Ġorg . kh ronos . webgl . ArrayBuffer Ċ import Ġorg . w 3 c . dom . ARRAY BUFFER Ċ import Ġorg . w 3 c . dom . Binary Type Ċ import Ġorg . w 3 c . dom . Message Event Ċ import Ġorg . w 3 c . dom . WebSocket Ċ Ċ class ĠWebSocket Wire Ġ{ ĊĊĠĠĠ Ġclass ĠClient ( lifetime : ĠL ifetime , Ġscheduler : ĠIS cheduler , Ġport : ĠInt , Ġprivate Ġval Ġopt Id : ĠString ? Ġ= Ġ" Client Socket ") ĊĠĠĠĠĠĠĠ Ġ: ĠWire Base ( scheduler ) ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlogger : ĠLogger Ġ= Ġget Logger ( this :: class ) ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġsocket : ĠWebSocket ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġinitial BufferSize Ġ= Ġ 4 0 9 6 ĊĠĠĠĠĠĠĠ Ġvar Ġbytes Received Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġbytes Send Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ"$ opt Id Ġinit " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġs Ġ= ĠWebSocket (" ws :// 1 2 7 . 0 . 0 . 1 :$ port ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs . binary Type Ġ= ĠBinary Type . ARRAY BUFFER ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs . onerror Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error Ġ{ Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUnit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs . on close Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ"$ opt Id Ġon close " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsocket Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUnit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs . on open Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ"$ opt Id Ġon open " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsocket Ġ= Ġs ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUnit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs . on message Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage Event Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġmessage Event . data Ġas ĠArray Buffer ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbytes Received Ġ+= Ġdata . byte Length ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuffer Ġ= ĠJs Buffer ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage Len Ġ= Ġbuffer . readInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( message Len Ġ!= Ġdata . byte Length Ġ- Ġ 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException (" Message Ġis Ġcorrupted ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Ġ= ĠR d Id . read ( buffer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Broker . dispatch ( id , Ġbuffer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error ("$ opt Id Ġon message Ġexception ", Ġex ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUnit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlifetime Ġ+= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ"$ opt Id Ġstart Ġterminating Ġlifetime " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcatch Ġ{ Ġsocket ?. close () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error ("$ opt Id Ġinit Ġexception ", Ġex ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġsend ( id : ĠR d Id , Ġwriter : Ġ( Abstract Buffer ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( socket Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn Ġ{ Ġ"$ opt Id Ġsend Ġis Ġfailed , Ġno Ġconnection Ġestablished Ġyet " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire (! id . isNull ) Ġ{ Ġ" id Ġmust n 't Ġbe Ġnull " Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġunsafe Buffer Ġ= ĠJs Buffer ( ArrayBuffer ( initial BufferSize )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunsafe Buffer . writeInt ( 0 ) Ġ// placeholder Ġfor Ġlength ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid . write ( unsafe Buffer ) Ġ// write Ġid ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontexts . write Current Message Context ( unsafe Buffer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwriter ( unsafe Buffer ) Ġ// write Ġrest ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlength Ġ= Ġunsafe Buffer . position ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunsafe Buffer . rewind () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunsafe Buffer . writeInt ( length Ġ- Ġ 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsocket ?. send ( unsafe Buffer . getFirst Bytes ( length )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbytes Send Ġ+= Ġlength ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error ("$ opt Id Ġsend Ġ$ id Ġexception ", Ġex ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }