package Ġcom . f ow allet . wallet core . b ts Ċ Ċ import Ġbit shares .* Ċ import Ġcom . crash ly t ics . android . Crash ly t ics Ċ import Ġorg . json . JSONArray Ċ import Ġorg . json . JSONObject Ċ import Ġjava . net . URI Ċ import Ġjava . util .* Ċ Ċ /** Ċ Ġ* Ġwebsocket Ġstatus Ċ Ġ*/ Ċ enum Ġclass ĠGraph ene Socket Status ( val Ġvalue : ĠInt ) Ġ{ ĊĠĠĠ Ġpending ( 0 ), ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ Ġ è¿ŀæİ¥ ä¸Ń ĊĠĠĠ Ġlog ined ( 1 ), ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ Ġ å·² è¿ŀæİ¥ ĊĠĠĠ Ġclosed ( 2 ), ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ Ġ æĸŃ å¼Ģ è¿ŀæİ¥ Ċ } Ċ Ċ const Ġval Ġk G ws KeepAlive IN ter val : ĠInt Ġ= Ġ 5 0 0 0 Ċ const Ġval Ġk G ws Max Send Life : ĠInt Ġ= Ġ 5 Ċ const Ġval Ġk G ws Max Recv Life : ĠInt Ġ= Ġk G ws Max Send Life Ġ* Ġ 2 Ċ const Ġval Ġk G ws Connect Promise Key : ĠString Ġ= Ġ"__ connect Promise Callback " Ċ Ċ class ĠGraph ene WebSocket Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġ_ web Socket : ĠB ts Ws Client ? Ġ= Ġnull ĊĊĠĠĠ Ġlateinit Ġvar Ġ_ keep alive Cb : Ġ( sock : ĠGraph ene WebSocket ) Ġ-> ĠUnit ĊĠĠĠ Ġprivate Ġvar Ġ_ cb Id : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġ_ cbs : ĠMutable Map < String , ĠPromise > Ġ= Ġmutable Map Of () ĠĠĠĠĠ Ġ// Ġ Ġæ Ļ ® éĢļ è¯·æ±Ĥ çļĦ åĽŀè°ĥ åĩ½æķ° åĪĹè¡¨ ĊĠĠĠ Ġprivate Ġvar Ġ_ subs : ĠMutable Map < String , ĠAny > Ġ= Ġmutable Map Of () ĠĠĠĠĠĠĠĠ Ġ// Ġ Ġ è®¢ éĺħ æİ¨ éĢģ åĽŀè°ĥ åĪĹè¡¨ ĊĠĠĠ Ġprivate Ġvar Ġ_ un sub : ĠMutable Map < String , ĠAny > Ġ= Ġmutable Map Of () ĠĠĠĠĠĠĠ Ġ// Ġ Ġ åıĸæ¶Ī è®¢ éĺħ ĊĠĠĠ Ġprivate Ġvar Ġ_ keep Alive Timer : ĠTimer ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġ_ send _ life : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġ_ recv _ life : ĠInt Ġ= Ġ 0 ĊĊĠĠĠ Ġ// Ġ Ġ---------------- ---------- ĊĠĠĠ Ġprivate Ġvar Ġ_ username : ĠString Ġ= Ġ"" ĊĠĠĠ Ġprivate Ġvar Ġ_ password : ĠString Ġ= Ġ"" ĊĠĠĠ Ġprivate Ġvar Ġ_ auto _ reconnect : ĠBoolean Ġ= Ġtrue ĊĠĠĠ Ġprivate Ġvar Ġ_ reconnect _ times : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġ_ url _ list Ġ= Ġmutable ListOf < String >() ĊĠĠĠ Ġprivate Ġvar Ġ_ api _ list : ĠArray < String >? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġ_ api _ ids Ġ= Ġmutable Map Of < String , ĠNumber >() ĊĊĠĠĠ Ġprivate Ġvar Ġ_ curr _ ws node : ĠString Ġ= Ġ"" ĊĠĠĠ Ġprivate Ġvar Ġ_ wait _ promises _ queue Ġ= Ġmutable ListOf < Promise >() ĊĠĠĠ Ġprivate Ġvar Ġ_ conn _ promise : ĠPromise ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġ_ status Ġ= ĠGraph ene Socket Status . pending ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ( public ) Ġ è°ĥçĶ¨ è¯·æ±Ĥ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġcall ( api _ name : ĠString , Ġmethod : ĠString , Ġparams : ĠJSONArray ): ĠPromise Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwait (). then Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġapi _ id Ġ= Ġ_ api _ ids [ api _ name ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( api _ id Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ then Ġexec ( json Array from ( api _ id , Ġmethod , Ġparams )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ then ĠPromise ._ reject (" unsupported Ġap iname : Ġ${ api _ name }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġæĺ¯åĲ¦ è¿ŀæİ¥ å¹¶ä¸Ķ çĻ»å½ķ æĪĲåĬŁ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġis _ connected (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ_ status Ġ== ĠGraph ene Socket Status . log ined ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġæĺ¯åĲ¦ æĸŃ å¼Ģ è¿ŀæİ¥ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġis _ closed (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ_ status Ġ== ĠGraph ene Socket Status . closed ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġæĺ¯åĲ¦ åľ¨ è¿ŀæİ¥ ä¸Ń ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġis _ pending (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ_ status Ġ== ĠGraph ene Socket Status . pending ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġappend Ġa Ġnew Ġnode ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġadd _ node ( url : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ url _ list . add ( url ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġinit With Server ( url : ĠString , Ġapi _ list : ĠArray < String >, Ġconnect _ timeout : ĠInt , Ġkeep alive Cb : Ġ( sock : ĠGraph ene WebSocket ) Ġ-> ĠUnit ): ĠGraph ene WebSocket Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ url _ list . add ( url ) ĊĊĠĠĠĠĠĠĠ Ġ_ web Socket Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ_ keep alive Cb Ġ= Ġkeep alive Cb ĊĠĠĠĠĠĠĠ Ġ_ api _ list Ġ= Ġapi _ list ĊĠĠĠĠĠĠĠ Ġ_ auto _ reconnect Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠ Ġ// Ġ Ġ--- Ġ å¼Ģå§ĭ åĪĿå§ĭåĮĸ Ġ--- ĊĠĠĠĠĠĠĠ Ġreconnect () ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġreconnect ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġmanual _ reconnect () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is _ closed ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreconnect () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ( private ) Ġèİ·åıĸ è¿ŀæİ¥ çļĦ èĬĤçĤ¹ åľ°åĿĢ ï¼Ī æł¹æį® æķ°ç»Ħ å¤§å°ı è¿Ľè¡Į è½® è¯¢ ï¼ī ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġgen _ next _ ws _ node (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġassert (_ url _ list . isNotEmpty ()) ĊĠĠĠĠĠĠĠ Ġreturn Ġ_ url _ list [_ reconnect _ times ++ Ġ% Ġ_ url _ list . size ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ( private ) Ġ å¼Ģå§ĭ è¿ŀæİ¥ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġreconnect () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġ Ġgen Ġurl ĊĠĠĠĠĠĠĠ Ġ_ curr _ ws node Ġ= Ġgen _ next _ ws _ node () ĊĊĠĠĠĠĠĠĠ Ġ// Ġ Ġå½ĵåīį è¯·æ±Ĥ æķ°æį® ĊĠĠĠĠĠĠĠ Ġ_ cb Id Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ_ cbs Ġ= Ġmutable Map Of () ĊĠĠĠĠĠĠĠ Ġ_ subs Ġ= Ġmutable Map Of () ĊĠĠĠĠĠĠĠ Ġ_ un sub Ġ= Ġmutable Map Of () ĊĊĠĠĠĠĠĠĠ Ġ// Ġ Ġ è¿ŀæİ¥ çŃīå¾ħ éĺŁåĪĹ ĊĠĠĠĠĠĠĠ Ġ_ wait _ promises _ queue Ġ= Ġmutable ListOf < Promise >() ĊĠĠĠĠĠĠĠ Ġ_ api _ ids Ġ= Ġmutable Map Of < String , ĠNumber >() ĊĊĠĠĠĠĠĠĠ Ġ// Ġ Ġ å¿ĥ è·³ æķ°æį® ĊĠĠĠĠĠĠĠ Ġ_ keep Alive Timer Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ_ send _ life Ġ= Ġk G ws Max Send Life ĊĠĠĠĠĠĠĠ Ġ_ recv _ life Ġ= Ġk G ws Max Recv Life ĊĊĠĠĠĠĠĠĠ Ġ// Ġ Ġstatus ĊĠĠĠĠĠĠĠ Ġ_ status Ġ= ĠGraph ene Socket Status . pending ĊĊĠĠĠĠĠĠĠ Ġ// Ġ ĠçĶŁæĪĲ çŃīå¾ħ è¿ŀæİ¥ promise ĊĠĠĠĠĠĠĠ Ġ_ conn _ promise Ġ= ĠPromise () ĊĠĠĠĠĠĠĠ Ġ_ conn _ promise !!. then Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon _ connect _ response d ( it , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ then Ġnull ĊĠĠĠĠĠĠĠ Ġ}. catch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon _ connect _ response d ( null , Ġit ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġ ĠåĪĿå§ĭåĮĸ websocket è¿ŀæİ¥ ĊĠĠĠĠĠĠĠ Ġ_ web Socket Ġ= ĠB ts Ws Client ( URI (_ curr _ ws node ), Ġthis , Ġ 5 0 0 0 ) ĊĠĠĠĠĠĠĠ Ġ_ web Socket !!. connect () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ( private ) Ġ äºĭä»¶ Ġ- Ġ è¿ŀæİ¥ æĪĲåĬŁ Ġor Ġ è¿ŀæİ¥ å¤±è´¥ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġon _ connect _ response d ( data : ĠAny ?, Ġerror : ĠAny ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( error Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ status Ġ= ĠGraph ene Socket Status . closed ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( promise Ġin Ġ_ wait _ promises _ queue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpromise . reject ( error ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ wait _ promises _ queue . clear () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is _ closed ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon _ login _ response d ( null , Ġ" closed Ġon Ġpending ...") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexec ( json Array from ( 1 , Ġ" login ", Ġjson Array from (_ username , Ġ_ password ))). then Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon _ login _ response d ( it , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ then Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. catch Ġ{ Ġerr Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon _ login _ response d ( null , Ġerr ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ( private ) Ġ äºĭä»¶ Ġ- Ġ çĻ»å½ķ æĪĲåĬŁ Ġor Ġ çĻ»å½ķ å¤±è´¥ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġon _ login _ response d ( data : ĠAny ?, Ġerror : ĠAny ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( error Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ status Ġ= ĠGraph ene Socket Status . closed ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( promise Ġin Ġ_ wait _ promises _ queue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpromise . reject ( error ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ wait _ promises _ queue . clear () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpromise _ list Ġ= ĠJSONArray () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ api _ list !!. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpromise _ list . put ( exec ( json Array from ( 1 , Ġit , ĠJSONArray ()))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPromise . all ( promise _ list ). then Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon _ api _ init _ response d ( it Ġas ? ĠJSONArray , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ then Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. catch Ġ{ Ġerr Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon _ api _ init _ response d ( null , Ġerr ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ( private ) Ġ äºĭä»¶ Ġ- ĠåĪĿå§ĭåĮĸ API ID Ġ æĪĲåĬŁ Ġor Ġ å¤±è´¥ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġon _ api _ init _ response d ( data _ array : ĠJSONArray ?, Ġerror : ĠAny ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( error Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ status Ġ= ĠGraph ene Socket Status . closed ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( promise Ġin Ġ_ wait _ promises _ queue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpromise . reject ( error ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ wait _ promises _ queue . clear () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġidx Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( api _ id Ġin Ġdata _ array !!. for in < Number >()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ api _ ids [_ api _ list ! ![ idx ++ ]] Ġ= Ġapi _ id !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ status Ġ= ĠGraph ene Socket Status . log ined ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( promise Ġin Ġ_ wait _ promises _ queue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpromise . resolve ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ wait _ promises _ queue . clear () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ( private ) Ġ çŃīå¾ħ è¿ŀæİ¥ æĪĲåĬŁ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġwait (): ĠPromise Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is _ connected ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPromise ._ resolve ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( is _ closed () Ġ&& Ġ!_ auto _ reconnect ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPromise ._ reject (" websocket Ġdisconnected ...") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( is _ closed ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreconnect () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġvar Ġp Ġ= ĠPromise () ĊĠĠĠĠĠĠĠ Ġ_ wait _ promises _ queue . add ( p ) ĊĠĠĠĠĠĠĠ Ġreturn Ġp ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ( private ) Ġ å¤ĦçĲĨ è¯·æ±Ĥ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġexec ( params : ĠJSONArray ): ĠPromise Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġ Ġ å·²ç»ı æĸŃ çº¿ ĊĠĠĠĠĠĠĠ Ġif Ġ( is _ closed ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPromise ._ reject (" websocket Ġdisconnected ...") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġ ĠTODO : è¯¥ æĸ¹æ³ķ å¾ħ check ĊĊĠĠĠĠĠĠĠ Ġ// Ġ è®¡ç®Ĺ åĻ¨ ĊĠĠĠĠĠĠĠ Ġ_ cb Id ++ ĊĊĠĠĠĠĠĠĠ Ġ// Ġ Ġ éĥ¨åĪĨ æĸ¹æ³ķ çī¹æ®Ĭ å¤ĦçĲĨ ĊĠĠĠĠĠĠĠ Ġval Ġmethod : ĠString Ġ= Ġparams [ 1 ] Ġas ĠString ĊĠĠĠĠĠĠĠ Ġif Ġ( method Ġ== Ġ" set _ subscribe _ callback " Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmethod Ġ== Ġ" subscribe _ to _ market " Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmethod Ġ== Ġ" broadcast _ transaction _ with _ callback " Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmethod Ġ== Ġ" set _ pending _ transaction _ callback ") Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġold _ sub _ params Ġ= Ġparams [ 2 ] Ġas ĠJSONArray ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsub _ callback Ġ= Ġold _ sub _ params [ 0 ] ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ Ġ è®¢ éĺħ çļĦ callback æĽ¿æį¢ ä¸º cb Id ä¼ł éĢģ åĪ° æľįåĬ¡åĻ¨ ãĢĤ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġold _ sub _ params . put ( 0 , Ġ_ cb Id . toString ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ Ġ ä¿ĿåŃĺ è®¢ éĺħ callback ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ subs [_ cb Id . toString ()] Ġ= Ġsub _ callback ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġ Ġ åıĸæ¶Ī è®¢ éĺħ ĊĠĠĠĠĠĠĠ Ġif Ġ( method Ġ== Ġ" unsubscribe _ from _ market " Ġ|| Ġmethod Ġ== Ġ" unsubscribe _ from _ accounts ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġold _ sub _ params Ġ= Ġparams [ 2 ] Ġas ĠJSONArray ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġun sub _ callback Ġ= Ġold _ sub _ params [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ subs . keys . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcb Ġ= Ġ_ subs [ it ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cb Ġ=== Ġun sub _ callback ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ un sub [_ cb Id . toString ()] Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ forEach ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ Ġ ç§»éĻ¤ ç¬¬ä¸Ģä¸ª Ġcallback ĠåıĤæķ° ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsub _ params _ mutable Ġ= ĠJSONArray () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġidx Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( obj Ġin Ġold _ sub _ params . for in < Any >()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( idx Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub _ params _ mutable . put ( obj ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ++ idx ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparams . put ( 2 , Ġsub _ params _ mutable ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġ// Ġ ĠTODO : f ow allet Ġ åıĸæ¶Ī è®¢ éĺħ Ġunsubscribe _ from _ market Ġunsubscribe _ from _ accounts ĊĊĠĠĠĠĠĠĠ Ġ// Ġ Ġ åºıåĪĹåĮĸ ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= ĠjsonObject from K VS (" id ", Ġ_ cb Id , Ġ" method ", Ġ" call ", Ġ" params ", Ġparams ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġ Ġ æŀĦéĢł promise å¯¹è±¡ å¹¶ åıĳéĢģ æķ°æį® ĊĠĠĠĠĠĠĠ Ġ_ send _ life Ġ= Ġk G ws Max Send Life ĊĊĠĠĠĠĠĠĠ Ġval Ġp Ġ= ĠPromise () ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsend _ data Ġ= Ġdata . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ web Socket !!. send ( send _ data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert (_ cbs [_ cb Id . toString ()] Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ cbs [_ cb Id . toString ()] Ġ= Ġp ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġp . reject ( e ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġp ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġlistener ( response : ĠJSONObject ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġcallback _ id Ġ= Ġresponse . opt String (" id ", Ġ"") ĊĊĠĠĠĠĠĠĠ Ġvar Ġsub Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġmethod : ĠString Ġ= Ġresponse . opt String (" method ") ĊĊĠĠĠĠĠĠĠ Ġif Ġ( method Ġ== Ġ" notice ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsub Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallback _ id Ġ= Ġresponse . get JSONArray (" params "). getString ( 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġcallback : ĠAny ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( sub ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue Ġ-> Ġcallback Ġ= Ġ_ subs [ callback _ id ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse Ġ-> Ġcallback Ġ= Ġ_ cbs [ callback _ id ] ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( callback Ġ!= Ġnull Ġ&& Ġsub ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ Ġ è®¢ éĺħ æĸ¹æ³ķ Ġcallback ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcb Ġ= Ġcallback Ġas Ġ( Boolean , ĠAny ) Ġ-> ĠUnit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcb ( true , Ġresponse . get JSONArray (" params ")[ 1 ]) ĊĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( callback Ġ!= Ġnull Ġ&& Ġ! sub ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ Ġæ Ļ ® éĢļ è¯·æ±Ĥ Ġcallback ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ cbs . remove ( callback _ id ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ ĠAPI è°ĥçĶ¨ æĺ¯åĲ¦ å¼Ĥå¸¸ åĪ¤æĸŃ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresp _ error Ġ= Ġresponse . opt JSONObject (" error ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallback Ġ= Ġcallback Ġas ĠPromise ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( resp _ error Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ Ġ éĶĻè¯¯ æł¼å¼ı ï¼ļ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġ@ {" code ":" 1 ", Ġ@" data ": @{ @" code ": @" code ", Ġ@" message ": @" base Ġerror Ġmessage ", Ġ@" name ": @" xx ", Ġ@" stack ": @ {} }, Ġ@" message ": @" detail Ġmessage "} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ Ġ[ ç»Łè®¡ ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdetail _ error _ message Ġ= Ġresp _ error . opt String (" message ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ Ġ ç»Łè®¡ Crash æĹ¥å¿Ĺ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCrash ly t ics . log ( detail _ error _ message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġerror _ data Ġ= Ġresp _ error . opt JSONObject (" data ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( error _ data Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġerror _ message Ġ= Ġerror _ data . opt String (" message ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġerror _ code Ġ= Ġerror _ data . opt Int (" code "). toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġerror _ stack Ġ= Ġerror _ data . opt JSONArray (" stack ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( error _ message Ġ!= Ġ"" Ġ&& Ġerror _ code Ġ!= Ġ"" Ġ&& Ġerror _ stack Ġ!= Ġnull Ġ&& Ġerror _ stack . length () Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstack _ str Ġ= Ġerror _ stack . last < JSONObject >(). toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbt sp p Log Custom (" api _ error _${ error _ code }", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠjsonObject from K VS (" message ", Ġerror _ message , Ġ" detail _ message ", Ġdetail _ error _ message , Ġ" stack _ str ", Ġstack _ str )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ Ġè¿ĶåĽŀ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . reject ( resp _ error ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . resolve ( response . get (" result ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ Ġ åıĸæ¶Ī è®¢ éĺħ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġun sub _ id Ġ= Ġ_ un sub [ callback _ id ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( un sub _ id Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ subs . remove ( un sub _ id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ un sub . remove ( callback _ id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( false ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠ Ġprocess _ websocket _ error _ or _ close (" user Ġclose ...") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart KeepAlive Timer () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(_ keep Alive Timer Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ keep Alive Timer Ġ= ĠTimer () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ keep Alive Timer !!. schedule ( object Ġ: ĠTimer Task () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay _ main Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon KeepAlive Timer Tick () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ 5 0 0 0 , Ġ 5 0 0 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstop KeepAlive Timer () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(_ keep Alive Timer Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ keep Alive Timer !!. cancel () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ keep Alive Timer Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon KeepAlive Timer Tick () Ġ{ ĊĠĠĠĠĠĠĠ Ġ-- _ recv _ life ĊĠĠĠĠĠĠĠ Ġif Ġ(_ recv _ life Ġ<= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocess _ websocket _ error _ or _ close (" heartbeat ...") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ-- _ send _ life ĊĠĠĠĠĠĠĠ Ġif Ġ(_ send _ life Ġ<= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(_ keep alive Cb Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ keep alive Cb ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ send _ life Ġ= Ġk G ws Max Send Life ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠ ĠCalled Ġwhen Ġany Ġmessage Ġwas Ġreceived Ġfrom Ġa Ġweb Ġsocket . ĊĠĠĠ ĠThis Ġmethod Ġis Ġsub optimal Ġand Ġmight Ġbe Ġdeprecated Ġin Ġa Ġfuture Ġrelease . ĊĊĠĠĠ Ġ@ param Ġweb Socket ĠAn Ġinstance Ġof Ġ` SR WebSocket ` Ġthat Ġreceived Ġa Ġmessage . ĊĠĠĠ Ġ@ param Ġmessage ĠĠ ĠReceived Ġmessage . ĠEither Ġa Ġ` String ` Ġor Ġ` NS Data `. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġdid Receive Message ( message : ĠAny ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġ Ġ éĩį ç½® æİ¥åıĹ æķ°æį® åĮħ çļĦ å¿ĥ è·³ è®¡ æķ° ĊĠĠĠĠĠĠĠ Ġ_ recv _ life Ġ= Ġk G ws Max Recv Life ĊĊĠĠĠĠĠĠĠ Ġ// Ġ Ġ è§£æŀĲ æľįåĬ¡åĻ¨ åĵįåºĶ ä¸º Ġjson Ġ æł¼å¼ı ĊĠĠĠĠĠĠĠ Ġvar Ġdata : ĠJSONObject ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( message :: class Ġ== ĠString :: class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Ġ= ĠJSONObject ( message . toString (). trim ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Ġ= Ġmessage Ġas ĠJSONObject ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( err : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocess _ websocket _ error _ or _ close (" websocket Ġevents Ġmessage : Ġinvalid Ġjson , Ġ${ err . message }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlistener ( data ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠ ĠCalled Ġwhen Ġa Ġgiven Ġweb Ġsocket Ġwas Ġopen Ġand Ġauthenticated . ĊĊĠĠĠ Ġ@ param Ġweb Socket ĠAn Ġinstance Ġof Ġ` SR WebSocket ` Ġthat Ġwas Ġopen . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġweb Socket Did Open () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġ ĠRE MARK ï¼ļ å¿ĥ è·³ å®ļæĹ¶ åĻ¨ ĊĠĠĠĠĠĠĠ Ġstart KeepAlive Timer () ĊĠĠĠĠĠĠĠ Ġ// Ġ Ġ è¿ŀæİ¥ æĪĲåĬŁ ĊĠĠĠĠĠĠĠ Ġassert (_ conn _ promise Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠ Ġ_ conn _ promise ?. resolve (" websocket Ġopened ...") ĊĠĠĠĠĠĠĠ Ġ_ conn _ promise Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġprocess _ websocket _ error _ or _ close ( message : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is _ closed ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġ Ġ å¤Ħ äºİ Ġpending ãĢģ log ined Ġ çĬ¶æĢģ åĪĻ çĽ´æİ¥ åħ³éĹŃ ĊĠĠĠĠĠĠĠ Ġ_ status Ġ= ĠGraph ene Socket Status . closed ĊĊĠĠĠĠĠĠĠ Ġ_ conn _ promise ?. reject ( message ) ĊĠĠĠĠĠĠĠ Ġ_ conn _ promise Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġ// Ġ Ġ åıĸæ¶Ī å¿ĥ è·³ è®¡ æĹ¶ åĻ¨ ĊĠĠĠĠĠĠĠ Ġstop KeepAlive Timer () ĊĊĠĠĠĠĠĠĠ Ġ// Ġ Ġ éĢļ è®¯ ä¸Ń æĪĸ çĻ»å½ķ ä¸Ń å¼Ĥå¸¸ ï¼ļ åĪĻ å½ĵåīį çļĦæīĢæľī å¾ħ å®ĮæĪĲ promise åħ¨éĥ¨ reject ĊĠĠĠĠĠĠĠ Ġif Ġ(_ cbs . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ(( _, Ġv ) Ġin Ġ_ cbs ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv . reject ( message ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ cbs . clear () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(_ subs . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ(( _, Ġv ) Ġin Ġ_ subs ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcb Ġ= Ġv Ġas Ġ( Boolean , ĠAny ?) Ġ-> ĠUnit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcb . invoke ( false , Ġmessage ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ subs . clear () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġ Ġ åħ³éĹŃ ç½ĳç»ľ è¿ŀæİ¥ ĊĠĠĠĠĠĠĠ Ġ_ web Socket ?. close () ĊĠĠĠĠĠĠĠ Ġ_ web Socket Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġ// Ġ ĠTODO : un se ? Ċ // ĠĠĠĠĠĠĠ Ġ_ un sub . clear () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdid Fail WithError ( error : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprocess _ websocket _ error _ or _ close (" websocket Ġevents Ġerror , Ġ${ error . message }") ĊĠĠĠ Ġ} Ċ Ċ } ĊĊĊ