package Ġorg . da iv . websocket Ċ Ċ import Ġmu . Kotlin Logging Ċ import Ġorg . da iv . util . Default Register er Ċ import Ġorg . da iv . util . Register er Ċ import Ġorg . w 3 c . dom . Close Event Ċ import Ġorg . w 3 c . dom . Message Event Ċ import Ġorg . w 3 c . dom . WebSocket Ċ import Ġorg . w 3 c . dom . events . Event Ċ import Ġkotlinx . browser . window Ċ import Ġkotlinx . coroutines . Coroutine ExceptionHandler Ċ import Ġkotlinx . coroutines . Global Scope Ċ import Ġkotlinx . coroutines . launch ĊĊ Ċ private Ġval Ġlogger Ġ= ĠKotlin Logging . logger (" org . da iv . websocket . event bus ") ĊĊ Ċ fun Ġstart Websocket ( ws Path : ĠString Ġ= Ġ" ws ", Ġon Host Empty Url : ĠString Ġ= Ġ" 1 2 7 . 0 . 0 . 1 : 8 0 8 0 "): ĠWebSocket Ġ{ ĊĠĠĠ Ġlogger . debug Ġ{ Ġ" protocol : Ġ${ window . location . protocol }" Ġ} ĊĠĠĠ Ġval Ġprotocol Ġ= Ġif Ġ( window . location . protocol Ġ== Ġ" http :" Ġ|| Ġwindow . location . protocol Ġ== Ġ" file :") Ġ" ws " Ġelse Ġ" wss " ĊĠĠĠ Ġlogger . debug Ġ{ Ġ" ws Ġprotocol : Ġ$ protocol " Ġ} ĊĠĠĠ Ġlogger . debug Ġ{ Ġ" window Ġlocation Ġhost : Ġ${ window . location . host }" Ġ} ĊĠĠĠ Ġval Ġhost Ġ= Ġif Ġ( window . location . host Ġ== Ġ"") Ġon Host Empty Url Ġelse Ġwindow . location . host ĊĊĠĠĠ Ġlogger . debug Ġ{ Ġ" host : Ġ$ host " Ġ} ĊĠĠĠ Ġval Ġuri Ġ= Ġ"$ protocol :// $ host /$ ws Path " ĊĠĠĠ Ġlogger . debug Ġ{ Ġ" uri : Ġ$ uri " Ġ} ĊĠĠĠ Ġval Ġws Ġ= ĠWebSocket ( uri ) ĊĊĠĠĠ Ġlogger . trace Ġ{ Ġ" ws : Ġ$ ws " Ġ} ĊĠĠĠ Ġreturn Ġws Ċ } Ċ Ċ interface ĠWebSocket Sender Ġ: ĠData Sender Ġ{ ĊĠĠĠ Ġvar Ġon close : Ġ( Event ) Ġ-> ĠUnit ĊĠĠĠ Ġvar Ġon open : Ġ( Event ) Ġ-> ĠUnit ĊĠĠĠ Ġvar Ġon error : Ġ( Event ) Ġ-> ĠUnit Ċ } Ċ Ċ class ĠEB Websocket ( ĊĠĠĠ Ġprivate Ġval Ġws : ĠWebSocket Ġ= Ġstart Websocket (), ĊĠĠĠ Ġprivate Ġval Ġregister er : ĠDefault Register er < Data Receiver > Ġ= ĠDefault Register er () Ċ ) Ġ: ĠData Sender , ĠWebSocket Sender , ĠRegister er < Data Receiver > Ġby Ġregister er Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠKotlin Logging . logger (" org . da iv . websocket . event bus ") ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġvar Ġon close : Ġ( Event ) Ġ-> ĠUnit Ġ= Ġ{} ĊĠĠĠ Ġoverride Ġvar Ġon open : Ġ( Event ) Ġ-> ĠUnit Ġ= Ġ{} ĊĠĠĠ Ġoverride Ġvar Ġon error : Ġ( Event ) Ġ-> ĠUnit Ġ= Ġ{} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġws . on message Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGlobal Scope . launch ( Coroutine ExceptionHandler Ġ{ Ġ_, Ġex Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġex . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparse ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġws . on close Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġas ĠClose Event ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ" ws : Ġ$ ws Ġwas Ġclosed Ġ-> Ġreason : Ġ${ it . reason }, Ġcode : Ġ${ it . code }" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ EB Websocket . on close ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġws . on open Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ" ws : Ġ$ ws Ġwas Ġopened " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ EB Websocket . on open ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġws . onerror Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error Ġ{ Ġ" ws : Ġ$ ws Ġhas Ġan Ġerror : Ġ$ it " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ EB Websocket . onerror ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsend ( message : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġws . send ( message ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġparse ( event : ĠMessage Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . trace Ġ{ Ġ" receive : Ġ$ event " Ġ} ĊĠĠĠĠĠĠĠ Ġevent . data ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstring Ġ= Ġit . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . trace Ġ{ Ġ" to Ġstring : Ġ$ string " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġregister er . suspend Event Ġ{ Ġreceive ( string ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error Ġ{ Ġ" received Ġdata Ġis Ġnull " Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊ