package Ġcom . fox . one . ex . core . stream Ċ Ċ import Ġandroid . os . Handler Ċ import Ġandroid . os . Looper Ċ import Ġandroid . os . Message Ċ import Ġandroid . text . TextUtils Ċ import Ġcom . fox . one . ex . core . stream . model .* Ċ import Ġcom . fox . one . support . common . concurrent . Task Scheduler Ċ import Ġcom . fox . one . support . common . utils . Json Utils Ċ import Ġcom . fox . one . support . common . utils . Log Utils Ċ import Ġcom . fox . one . support . framework . network . API Loader Ċ import Ġcom . fox . one . support . framework . network . Http Engine Ċ import Ġcom . fox . one . support . framework . network . WebSocket Engine Ċ import Ġcom . fox . one . support . framework . network . un G zip Ċ import Ġokhttp 3 . Ok HttpClient Ċ import Ġokhttp 3 . Response Ċ import Ġokhttp 3 . WebSocket Ċ import Ġokhttp 3 . WebSocket Listener Ċ import Ġok io . ByteString Ċ import Ġjava . net . URL Ċ import Ġjava . util . concurrent . Concurrent HashMap Ċ import Ġjava . util . concurrent . Copy On Write ArrayList Ċ Ċ /** Ċ Ġ* Ġclass Ġdescription Ġhere Ċ Ġ* Ġ@ author Ġx ia om ing 1 1 0 9 @ gmail . com Ċ Ġ* Ġ@ version Ġ 1 . 0 . 0 Ċ Ġ* Ġ@ since Ġ 2 0 1 8 - 1 2 - 1 7 Ċ Ġ*/ Ċ object ĠStream DataManager Ġ{ ĊĊĠĠĠ Ġprivate Ġconst Ġval ĠTAG Ġ= Ġ" Stream DataManager " ĊĊĠĠĠ Ġprivate Ġconst Ġval ĠAL PH A _ URL Ġ= Ġ" https :// dev - gateway . fox . one " ĊĠĠĠ Ġprivate Ġconst Ġval ĠB ETA _ URL Ġ= Ġ" https :// openapi . fox . one " ĊĠĠĠ Ġprivate Ġconst Ġval ĠRELEASE _ URL Ġ= Ġ" https :// openapi . fox . one " ĊĊĠĠĠ Ġprivate Ġconst Ġval ĠPATH _ WS Ġ= Ġ"/ ws " ĊĊĠĠĠ Ġprivate Ġconst Ġval ĠALIGN MENT _ DELAY Ġ= Ġ 3 0 0 0 ĊĊĠĠĠ Ġprivate Ġvar Ġalignment Time : ĠLong Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġval Ġhandler Ġ= ĠStream Handler () ĊĊĠĠĠ Ġprivate Ġval Ġob servers : ĠMutable Map < String , ĠStream Observer < *, Ġ* >> Ġ= ĠConcurrent HashMap () ĊĊĠĠĠ Ġprivate Ġval Ġapi Loader Ġ= ĠAPI Loader () ĊĠĠĠ Ġprivate Ġvar Ġweb Socket Engine : ĠWebSocket Engine ?= Ġnull ĊĊĠĠĠ Ġ@ Volatile ĊĠĠĠ Ġprivate Ġvar Ġstate : ĠWebSocket Engine . State Ġ= ĠWebSocket Engine . State . IDLE ĊĊĠĠĠ Ġprivate Ġval Ġalignment Cache : Concurrent HashMap < String ?, ĠStream Response > Ġ= ĠConcurrent HashMap () ĊĠĠĠ Ġprivate Ġval Ġreq Cache : ĠMutable List < String > Ġ= ĠCopy On Write ArrayList < String >() ĊĊĠĠĠ Ġvar Ġweb Socket Listener Ġ= Ġobject : ĠWebSocket Listener () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Open ( web Socket : ĠWebSocket , Ġresponse : ĠResponse ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog Utils . i ( TAG , Ġ"${ response . toString () }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= ĠWebSocket Engine . State . OPEN ED ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Message ( web Socket : ĠWebSocket , Ġtext : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog Utils . i ( TAG , Ġ" String :: Ġ$ text ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= ĠWebSocket Engine . State . OPEN ED ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdispatch Message ( text ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Message ( web Socket : ĠWebSocket , Ġbytes : ĠByte String ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= ĠWebSocket Engine . State . OPEN ED ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbytes ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTask Scheduler . execute Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠbyteArray Ġ= Ġit . toByteArray (). un G zip () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjson String Ġ= ĠbyteArray . toString ( Charsets . UTF _ 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog Utils . i ( TAG , Ġ" String :: Ġ$ json String ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdispatch Message ( json String ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Closing ( web Socket : ĠWebSocket , Ġcode : ĠInt , Ġreason : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= ĠWebSocket Engine . State . CLO SING ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog Utils . i ( TAG , Ġ"$ code , Ġ$ reason ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Closed ( web Socket : ĠWebSocket , Ġcode : ĠInt , Ġreason : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= ĠWebSocket Engine . State . CLOSED ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog Utils . i ( TAG , Ġ"$ code , Ġ$ reason ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Failure ( web Socket : ĠWebSocket , Ġt : ĠThrowable , Ġresponse : ĠResponse ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= ĠWebSocket Engine . State . CLOSED ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog Utils . i ( TAG , Ġ"${ response ?. toString ()}, Ġ${ t . toString () }") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Real Url (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġurl Ġ= ĠURL ( api Loader . get BaseUrl ()) ĊĠĠĠĠĠĠĠ Ġval Ġhost Ġ= Ġurl . host ĊĠĠĠĠĠĠĠ Ġreturn Ġ" wss :// $ host $ PATH _ WS " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġapi Loader . set Base Uri ( API Loader . BaseUrl ( ALPHA _ URL , ĠB ETA _ URL , ĠRELEASE _ URL )) ĊĠĠĠĠĠĠĠ Ġweb Socket Engine Ġ= ĠWebSocket Engine ( get Real Url (), Ġapi Loader . get HttpClient (), Ġweb Socket Listener ) ĊĊĠĠĠĠĠĠĠ ĠLog Utils . i (" fox one ", Ġ" websocket : Ġ${ get Real Url () }") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdispatch Message ( message : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstream Response Ġ= ĠJson Utils . opt FromJson ( message , ĠStream Response :: class . java ) ĊĠĠĠĠĠĠĠ Ġstream Response ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( TextUtils . isEmpty ( it . event )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġalignment Cache [ it . event ] Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( System . currentTimeMillis () Ġ- Ġalignment Time Ġ> ĠALIGN MENT _ DELAY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler . post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalignment Cache . forEach Ġ{ Ġcache Item Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen ( cache Item . key ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStream Event . ORDER _ OPEN Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġob servers . forEach Ġ{ entry Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( entry . value . getEvent () Ġ== ĠStream Event . USER _ DATA ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= ĠJson Utils . opt From ( cache Item . value . data , ĠOrder Open Stream Info :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( entry . value Ġas ĠStream Observer < Order Stream Req Body , ĠBase Order Stream Info >). on Update ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStream Event . ORDER _ CANCEL Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġob servers . forEach Ġ{ entry Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( entry . value . getEvent () Ġ== ĠStream Event . USER _ DATA ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= ĠJson Utils . opt From ( cache Item . value . data , ĠOrder Cancel Stream Info :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( entry . value Ġas ĠStream Observer < Order Stream Req Body , ĠBase Order Stream Info >). on Update ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStream Event . ORDER _ MATCH Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġob servers . forEach Ġ{ entry Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( entry . value . getEvent () Ġ== ĠStream Event . USER _ DATA ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= ĠJson Utils . opt From ( cache Item . value . data , ĠOrder Match Stream Info :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( entry . value Ġas ĠStream Observer < Order Stream Req Body , ĠBase Order Stream Info >). on Update ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStream Event . K LINE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġob servers . forEach Ġ{ entry Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( entry . value . getEvent () Ġ== ĠStream Event . K LINE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= ĠJson Utils . opt From ( cache Item . value . data , ĠK Line Stream Info :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( entry . value Ġas ĠStream Observer < K Line Stream Req Body , ĠK Line Stream Info >). on Update ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStream Event . TICK ER _ 2 4 HR Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġob servers . forEach Ġ{ entry Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( entry . value . getEvent () Ġ== ĠStream Event . TICK ER _ 2 4 HR ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= ĠJson Utils . opt From ( cache Item . value . data , ĠT icker Stream Info :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( entry . value Ġas ĠStream Observer < Ticker Stream Req Body , ĠT icker Stream Info >). on Update ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStream Event . ALL _ TICK ER _ 2 4 HR Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġob servers . forEach Ġ{ entry Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( entry . value . getEvent () Ġ== ĠStream Event . ALL _ TICK ER _ 2 4 HR ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= ĠJson Utils . opt From ( cache Item . value . data , ĠAll Ticker Stream Info :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( entry . value Ġas ĠStream Observer < All Ticker Stream Req Body , ĠAll Ticker Stream Info >). on Update ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStream Event . DEPTH _ UPDATE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġob servers . forEach Ġ{ entry Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( entry . value . getEvent () Ġ== ĠStream Event . DEPTH _ UPDATE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= ĠJson Utils . opt From ( cache Item . value . data , ĠDepth Stream Info :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( entry . value Ġas ĠStream Observer < Depth Stream Req Body , ĠDepth Stream Info >). on Update ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStream Event . DEPTH _ WITH _ LEVEL Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġob servers . forEach Ġ{ entry Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( entry . value . getEvent () Ġ== ĠStream Event . DEPTH _ WITH _ LEVEL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= ĠJson Utils . opt From ( cache Item . value . data , ĠDepth Level Stream Info :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( entry . value Ġas ĠStream Observer < Depth Level Stream Req Body , ĠDepth Level Stream Info >). on Update ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStream Event . TRA DE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġob servers . forEach Ġ{ entry Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( entry . value . getEvent () Ġ== ĠStream Event . TRA DE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= ĠJson Utils . opt From ( cache Item . value . data , ĠTrade Stream Info :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( entry . value Ġas ĠStream Observer < Trade Stream Req Body , ĠTrade Stream Info >). on Update ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalignment Time Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġreset () Ġ{ ĊĠĠĠĠĠĠĠ Ġclose () ĊĠĠĠĠĠĠĠ Ġweb Socket Engine Ġ= ĠWebSocket Engine ( get Real Url (), Ġapi Loader . get HttpClient (), Ġweb Socket Listener ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠ Ġweb Socket Engine ?. close () ĊĊĠĠĠĠĠĠĠ Ġob servers . clear () ĊĠĠĠĠĠĠĠ Ġreq Cache . clear () ĊĠĠĠĠĠĠĠ Ġhandler . remove Messages ( WH AT _ CHECK _ CONNECTION ) ĊĠĠĠĠĠĠĠ Ġhandler . remove Messages ( WH AT _ SEND _ MSG ) ĊĠĠĠĠĠĠĠ Ġhandler . remove Messages ( WH AT _ CLOSE ) ĊĊĠĠĠĠĠĠĠ ĠLog Utils . i ( TAG , Ġ" websocket Ġclose >>>>>>>> >>>> >> ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtry Connect () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( state Ġ!= ĠWebSocket Engine . State . OPEN ING ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġstate Ġ!= ĠWebSocket Engine . State . OPEN ED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġweb Socket Engine ?. connect () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog Utils . i ( TAG , Ġ" websocket Ġconnect ----------- ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= ĠWebSocket Engine . State . OPEN ING ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdo Subscribe ( observer : ĠStream Observer < *, Ġ* >) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Connect () ĊĊĠĠĠĠĠĠĠ Ġval Ġreq Str Ġ= ĠJson Utils . opt ToJson ( observer . req Body ) ĊĠĠĠĠĠĠĠ Ġob servers [ observer . req Body . sub Id ] Ġ= Ġobserver ĊĊĠĠĠĠĠĠĠ ĠLog Utils . i ( TAG , Ġ" state :$ state ;; Ġsub Message ::$ req Str ") ĊĊĠĠĠĠĠĠĠ Ġif Ġ( state Ġ== ĠWebSocket Engine . State . OPEN ED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġweb Socket Engine ?. send ( req Str ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreq Cache . add ( req Str ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandler . send Empty Message ( WH AT _ CHECK _ CONNECTION ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġhandler . remove Messages ( WH AT _ CLOSE ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdo Un Subscribe ( sub Id : ĠString , Ġun Sub Req : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog Utils . i ( TAG , Ġ"$ un Sub Req ") ĊĊĠĠĠĠĠĠĠ Ġweb Socket Engine ?. send ( un Sub Req ) ĊĠĠĠĠĠĠĠ Ġob servers . remove ( sub Id ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( ob servers . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandler . send Empty Message Delayed ( WH AT _ CLOSE , ĠDEL AY _ CLOSE ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ è®¢ éĺħ K çº¿ æķ°æį® æµģ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġsubscribe ( observer : ĠK Line Stream Observer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdo Subscribe ( observer ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ åıĸæ¶Ī K çº¿ æķ°æį® æµģ è®¢ éĺħ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġunsubscribe ( k line Request : ĠK Line Stream Req Body ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdo Un Subscribe ( k line Request . sub Id , ĠJson Utils . opt ToJson ( k line Request )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ è®¢ éĺħ Ticker æķ°æį® æµģ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġsubscribe ( observer : ĠT icker Stream Observer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdo Subscribe ( observer ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ åıĸæ¶Ī Ticker æķ°æį® æµģ è®¢ éĺħ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġunsubscribe ( ticker Request : ĠT icker Stream Req Body ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdo Un Subscribe ( ticker Request . sub Id , ĠJson Utils . opt ToJson ( ticker Request )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ è®¢ éĺħ æīĢæľī å¸ģ å¯¹ çļĦ Ticker æķ°æį® æµģ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġsubscribe ( observer : ĠAll Ticker Stream Observer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdo Subscribe ( observer ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ åıĸæ¶Ī æīĢæľī å¸ģ å¯¹ Ticker æķ°æį® æµģ çļĦ è®¢ éĺħ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġunsubscribe ( all Ticker Request : ĠAll Ticker Stream Req Body ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdo Un Subscribe ( all Ticker Request . sub Id , ĠJson Utils . opt ToJson ( all Ticker Request )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ è®¢ éĺħ æ·± åº¦ æķ°æį® æµģ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġsubscribe ( observer : ĠDepth Stream Observer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdo Subscribe ( observer ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ åıĸæ¶Ī æ·± åº¦ æķ°æį® æµģ è®¢ éĺħ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġunsubscribe ( depth Request : ĠDepth Stream Req Body ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdo Un Subscribe ( depth Request . sub Id , ĠJson Utils . opt ToJson ( depth Request )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ è®¢ éĺħ æ·± åº¦ æķ°æį® æµģ ï¼Į level : Ġ 5 , Ġ 1 0 , Ġ 2 0 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġsubscribe ( observer : ĠDepth Level Stream Observer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdo Subscribe ( observer ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ åıĸæ¶Ī æ·± åº¦ æķ°æį® æµģ è®¢ éĺħ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġunsubscribe ( depth Level Request : ĠDepth Level Stream Req Body ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdo Un Subscribe ( depth Level Request . sub Id , ĠJson Utils . opt ToJson ( depth Level Request )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ è®¢ éĺħ äº¤æĺĵ æķ°æį® æµģ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġsubscribe ( observer : ĠTrade Stream Observer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdo Subscribe ( observer ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ åıĸæ¶Ī äº¤æĺĵ æķ°æį® æµģ è®¢ éĺħ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġunsubscribe ( trade Request : ĠTrade Stream Req Body ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdo Un Subscribe ( trade Request . sub Id , ĠJson Utils . opt ToJson ( trade Request )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ è®¢ éĺħ è®¢åįķ æķ°æį® æµģ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġsubscribe ( observer : ĠOrder Stream Observer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdo Subscribe ( observer ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ åıĸæ¶Ī è®¢åįķ æķ°æį® æµģ è®¢ éĺħ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġunsubscribe ( order Request : ĠOrder Stream Req Body ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdo Un Subscribe ( order Request . sub Id , ĠJson Utils . opt ToJson ( order Request )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġconst Ġval ĠWHAT _ SEND _ MSG Ġ= Ġ 1 ĊĠĠĠ Ġprivate Ġconst Ġval ĠWHAT _ CHECK _ CONNECTION Ġ= Ġ 2 ĊĠĠĠ Ġprivate Ġconst Ġval ĠWHAT _ CLOSE Ġ= Ġ 3 ĊĠĠĠ Ġprivate Ġconst Ġval ĠDEL AY _ CHECK Ġ= Ġ 5 0 0 L ĊĠĠĠ Ġprivate Ġconst Ġval ĠDEL AY _ CLOSE Ġ= Ġ 2 0 Ġ* Ġ 1 0 0 0 L ĊĠĠĠ Ġclass ĠStream Handler : ĠHandler ( Looper . get Main Looper ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġhandle Message ( msg : ĠMessage ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwhat Ġ= Ġmsg ?. what Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen ( what ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWHAT _ CHECK _ CONNECTION Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( state Ġ== ĠWebSocket Engine . State . OPEN ED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreq Cache . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog Utils . i ( TAG , Ġ" handler Ġsend Ġmessage :$ it ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġweb Socket Engine ?. send ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreq Cache . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( handler . has Messages ( WH AT _ CHECK _ CONNECTION )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler . remove Messages ( WH AT _ CHECK _ CONNECTION ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog Utils . i ( TAG , Ġ" handler Ġcheck Ġconnection ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler . send Empty Message Delayed ( WH AT _ CHECK _ CONNECTION , ĠDEL AY _ CHECK ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWHAT _ CLOSE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclose () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }