/** Ċ * ĠCopyright ĠS or am its u ĠCo ., ĠLtd . ĠAll ĠRights ĠReserved . Ċ * ĠSPDX - License - Identifier : ĠGPL - 3 . 0 Ċ */ Ċ Ċ package Ġjp . co . sor am its u . common . data . network . sse Ċ Ċ import Ġjp . co . sor am its u . common . domain . Serializer Ċ import Ġokhttp 3 . Call Ċ import Ġokhttp 3 . Callback Ċ import Ġokhttp 3 . Ok HttpClient Ċ import Ġokhttp 3 . Request Ċ import Ġokhttp 3 . Response Ċ import Ġok io . Buffered Source Ċ import Ġjava . io . IOException Ċ import Ġjava . util . concurrent . TimeUnit Ċ Ċ internal Ġclass ĠServer Sent Event Impl ( ĊĠĠĠ Ġprivate Ġval Ġclient : ĠOk HttpClient , ĊĠĠĠ Ġprivate Ġval Ġrequest : ĠRequest , ĊĠĠĠ Ġprivate Ġval Ġlistener : ĠServer Sent Event . Listener , ĊĠĠĠ Ġprivate Ġval Ġserializer : ĠSerializer Ċ ) Ġ: ĠServer Sent Event Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠCOL ON _ DI VIDER Ġ= Ġ':' ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠKEY _ DATA Ġ= Ġ" data " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠKEY _ ID Ġ= Ġ" id " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠKEY _ EVENT Ġ= Ġ" event " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġcall : ĠCall ? Ġ= Ġnull ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġcall Ġ= Ġclient . new Call ( request ) ĊĠĠĠĠĠĠĠ Ġenqueue () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġenqueue () Ġ{ ĊĠĠĠĠĠĠĠ Ġcall !!. enqueue ( object Ġ: ĠCallback Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Response ( call : ĠCall , Ġresponse : ĠResponse ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( response . is Successful ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġopen S se ( response , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġthrowable Ġ= ĠIOException ("${ response . code ()} Ġ${ response . message () }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . on ResponseError ( this @ Server Sent Event Impl , Ġthrowable , Ġresponse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . on Closed ( this @ Server Sent Event Impl ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclose () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Failure ( call : ĠCall , Ġexception : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . onError ( this @ Server Sent Event Impl , Ġexception ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . on Closed ( this @ Server Sent Event Impl ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclose () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġopen S se ( response : ĠResponse , Ġtimeout Millis : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġresponse . body ()?. use Ġ{ Ġbody Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠdataSource Ġ= Ġbody . source () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġs se Reader Ġ= ĠReader ( dataSource ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsetTimeout ( timeout Millis , ĠTimeUnit . MILLISECONDS ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . on Open ( this , Ġresponse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( sse Reader . can Read ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs se Reader . read () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġrequest (): ĠRequest Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġrequest ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( call Ġ!= Ġnull Ġ&& Ġ! call !!. is Canceled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall !!. cancel () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠReader ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġsource : ĠBuffered Source ĊĠĠĠ Ġ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġdata Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠ Ġprivate Ġvar ĠeventType : ĠServer Sent Event . Type ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġevent Id : ĠString Ġ= Ġ"" ĊĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġcan Read : ĠBoolean Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠ Ġfun Ġcan Read (): ĠBoolean Ġ= Ġcan Read ĊĊĠĠĠĠĠĠĠ Ġfun Ġread () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( call Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcan Read Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( call !!. is Canceled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcan Read Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġline Ġ= Ġsource . read Utf 8 Line Strict () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Line ( line ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exception : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . onError ( this @ Server Sent Event Impl , Ġexception ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . on Closed ( this @ Server Sent Event Impl ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclose () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcan Read Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun ĠsetTimeout ( timeout : ĠLong , Ġunit : ĠTimeUnit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsource . timeout ()?. timeout ( timeout , Ġunit ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġprocess Line ( line : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( line . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdispatch Event () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcolon Index Ġ= Ġline . indexOf ( COL ON _ DI VIDER ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( colon Index Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( colon Index Ġ== Ġ- 1 Ġ|| Ġcolon Index Ġ+ Ġ 1 Ġ>= Ġline . length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Field ( line , Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġline . substring ( 0 , Ġcolon Index ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġline . substring ( colon Index Ġ+ Ġ 1 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Field ( key , Ġvalue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġprocess Field ( key : ĠString , Ġvalue : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( key ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKEY _ DATA Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata . append ( value ). append ('\ n ') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKEY _ ID Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent Id Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKEY _ EVENT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠeventType Remote Ġ= Ġserializer . deserialize ( value , ĠServer Sent Event Remote :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠeventType Ġ= Ġmap EventType Remote To EventType ( eventType Remote . type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġmap EventType Remote To EventType ( server Sent EventType Remote : ĠServer Sent Event Remote . Type ): ĠServer Sent Event . Type Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( server Sent EventType Remote ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠServer Sent Event Remote . Type . EVENT Ġ-> ĠServer Sent Event . Type . EVENT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠServer Sent Event Remote . Type . SIGNAL Ġ-> ĠServer Sent Event . Type . SIGNAL ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġdispatch Event () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( data . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata String Ġ= Ġdata . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . on Message ( this @ Server Sent Event Impl , Ġevent Id , ĠeventType , Ġdata String ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata . set Length ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠeventType Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent Id Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }