package Ġcom . genes ys . cloud . messenger . transport Ċ Ċ import Ġcom . genes ys . cloud . messenger . transport . Messaging Client . State Ċ import Ġcom . genes ys . cloud . messenger . transport . sh yr ka . Web Messaging Json Ċ import Ġcom . genes ys . cloud . messenger . transport . sh yr ka . receive . Attachment Deleted Response Ċ import Ġcom . genes ys . cloud . messenger . transport . sh yr ka . receive . Generate Url Error Ċ import Ġcom . genes ys . cloud . messenger . transport . sh yr ka . receive . Jwt Response Ċ import Ġcom . genes ys . cloud . messenger . transport . sh yr ka . receive . Pres ign ed Url Response Ċ import Ġcom . genes ys . cloud . messenger . transport . sh yr ka . receive . Session Expired Event Ċ import Ġcom . genes ys . cloud . messenger . transport . sh yr ka . receive . Session Response Ċ import Ġcom . genes ys . cloud . messenger . transport . sh yr ka . receive . Structured Message Ċ import Ġcom . genes ys . cloud . messenger . transport . sh yr ka . receive . Upload Failure Event Ċ import Ġcom . genes ys . cloud . messenger . transport . sh yr ka . receive . Upload Success Event Ċ import Ġcom . genes ys . cloud . messenger . transport . sh yr ka . send . Configure Session Request Ċ import Ġcom . genes ys . cloud . messenger . transport . sh yr ka . send . Delete Attachment Request Ċ import Ġcom . genes ys . cloud . messenger . transport . sh yr ka . send . Echo Request Ċ import Ġcom . genes ys . cloud . messenger . transport . sh yr ka . send . Get Attachment Request Ċ import Ġcom . genes ys . cloud . messenger . transport . sh yr ka . send . Jo urney Context Ċ import Ġcom . genes ys . cloud . messenger . transport . sh yr ka . send . Jo urney Customer Ċ import Ġcom . genes ys . cloud . messenger . transport . sh yr ka . send . Jo urney Customer Session Ċ import Ġcom . genes ys . cloud . messenger . transport . util . ErrorCode Ċ import Ġcom . genes ys . cloud . messenger . transport . util . Platform Ċ import Ġcom . genes ys . cloud . messenger . transport . util . Platform Socket Ċ import Ġcom . genes ys . cloud . messenger . transport . util . Platform Socket Listener Ċ import Ġcom . genes ys . cloud . messenger . transport . util . Socket Close Code Ċ import Ġcom . genes ys . cloud . messenger . transport . util . extensions . to Message Ċ import Ġcom . genes ys . cloud . messenger . transport . util . extensions . to Message List Ċ import Ġcom . genes ys . cloud . messenger . transport . util . logs . Log Ċ import Ġcom . genes ys . cloud . messenger . transport . util . logs . Log Tag Ċ import Ġkotlinx . serialization . Serialization Exception Ċ import Ġkotlinx . serialization . encode ToString Ċ Ċ internal Ġclass ĠMessaging Client Impl ( ĊĠĠĠ Ġprivate Ġval Ġapi : ĠWeb Messaging Api , ĊĠĠĠ Ġprivate Ġval Ġweb Socket : ĠPlatform Socket , ĊĠĠĠ Ġprivate Ġval Ġconfiguration : ĠConfiguration , ĊĠĠĠ Ġprivate Ġval Ġlog : ĠLog , ĊĠĠĠ Ġprivate Ġval Ġjwt Handler : ĠJwt Handler , ĊĠĠĠ Ġprivate Ġval Ġtoken : ĠString , ĊĠĠĠ Ġprivate Ġval Ġattachment Handler : ĠAttachment Handler , ĊĠĠĠ Ġprivate Ġval Ġmessage Store : ĠMessage Store , Ċ ) Ġ: ĠMessaging Client Ġ{ ĊĊĠĠĠ Ġoverride Ġvar Ġcurrent State : ĠState Ġ= ĠState . Idle ĊĠĠĠĠĠĠĠ Ġprivate Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate Listener ?. invoke ( value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġvar Ġstate Listener : Ġ(( State ) Ġ-> ĠUnit )? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġval Ġpending Message : ĠMessage ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġmessage Store . pending Message ĊĊĠĠĠ Ġoverride Ġval Ġconversation : ĠList < Message > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġmessage Store . get Conversation () ĊĊĠĠĠ Ġ@ Throws ( IllegalStateException :: class ) ĊĠĠĠ Ġoverride Ġfun Ġconnect () Ġ{ ĊĠĠĠĠĠĠĠ Ġlog . i Ġ{ Ġ" connect ()" Ġ} ĊĠĠĠĠĠĠĠ Ġcheck ( currentState Ġis ĠState . Closed Ġ|| Ġcurrent State Ġis ĠState . Idle Ġ|| Ġcurrent State Ġis ĠState . Error ) Ġ{ Ġ" Messaging Client Ġmust Ġbe Ġin Ġclosed , Ġidle Ġor Ġerror Ġstate " Ġ} ĊĠĠĠĠĠĠĠ Ġcurrent State Ġ= ĠState . Connecting ĊĠĠĠĠĠĠĠ Ġweb Socket . open Socket ( socket Listener ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IllegalStateException :: class ) ĊĠĠĠ Ġoverride Ġfun Ġdisconnect () Ġ{ ĊĠĠĠĠĠĠĠ Ġlog . i Ġ{ Ġ" disconnect ()" Ġ} ĊĠĠĠĠĠĠĠ Ġcheck ( currentState Ġ! is ĠState . Closed Ġ&& Ġcurrent State Ġ! is ĠState . Idle ) Ġ{ Ġ" Messaging Client Ġmust Ġnot Ġalready Ġbe Ġclosed Ġor Ġidle " Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġcode Ġ= ĠSocket Close Code . NORMAL _ CLO S URE . value ĊĠĠĠĠĠĠĠ Ġval Ġreason Ġ= Ġ" The Ġuser Ġhas Ġclosed Ġthe Ġconnection ." ĊĠĠĠĠĠĠĠ Ġcurrent State Ġ= ĠState . Closing ( code , Ġreason ) ĊĠĠĠĠĠĠĠ Ġweb Socket . close Socket ( code , Ġreason ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IllegalStateException :: class ) ĊĠĠĠ Ġoverride Ġfun Ġconfigure Session () Ġ{ ĊĠĠĠĠĠĠĠ Ġlog . i Ġ{ Ġ" configure Session ( token Ġ= Ġ$ token )" Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( currentState Ġ! is ĠState . Connected ) Ġthrow ĠIllegalStateException (" Web Messaging Ġclient Ġis Ġnot Ġconnected .") ĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= ĠConfigure Session Request ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Ġ= Ġtoken , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdeployment Id Ġ= Ġconfiguration . deployment Id , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjourney Context Ġ= ĠJo urney Context ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJo urney Customer ( token , Ġ" cookie "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJo urney Customer Session ("", Ġ" web ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġencoded Json Ġ= ĠWeb Messaging Json . json . encode ToString ( request ) ĊĠĠĠĠĠĠĠ Ġweb Socket . sendMessage ( encoded Json ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IllegalStateException :: class ) ĊĠĠĠ Ġoverride Ġfun ĠsendMessage ( text : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlog . i Ġ{ Ġ" sendMessage ( text Ġ= Ġ$ text )" Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġmessage Store . prepare Message ( text ) ĊĠĠĠĠĠĠĠ Ġattachment Handler . clear () ĊĠĠĠĠĠĠĠ Ġval Ġencoded Json Ġ= ĠWeb Messaging Json . json . encode ToString ( request ) ĊĠĠĠĠĠĠĠ Ġsend ( encoded Json ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IllegalStateException :: class ) ĊĠĠĠ Ġoverride Ġfun Ġsend HealthCheck () Ġ{ ĊĠĠĠĠĠĠĠ Ġlog . i Ġ{ Ġ" send HealthCheck ()" Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= ĠEcho Request ( token Ġ= Ġtoken ) ĊĠĠĠĠĠĠĠ Ġval Ġencoded Json Ġ= ĠWeb Messaging Json . json . encode ToString ( request ) ĊĠĠĠĠĠĠĠ Ġsend ( encoded Json ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġattach ( ĊĠĠĠĠĠĠĠ ĠbyteArray : ĠByteArray , ĊĠĠĠĠĠĠĠ ĠfileName : ĠString , ĊĠĠĠĠĠĠĠ Ġupload Progress : Ġ(( Float ) Ġ-> ĠUnit )? ĊĠĠĠ Ġ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġlog . i Ġ{ Ġ" attach ( fileName Ġ= Ġ$ fileName )" Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġattachment Handler . prepare Attachment ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPlatform (). randomUUID (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠbyteArray , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠfileName , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupload Progress , ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġencoded Json Ġ= ĠWeb Messaging Json . json . encode ToString ( request ) ĊĠĠĠĠĠĠĠ Ġsend ( encoded Json ) ĊĠĠĠĠĠĠĠ Ġreturn Ġrequest . attachment Id ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdetach ( attachment Id : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlog . i Ġ{ Ġ" detach ( attachment Id Ġ= Ġ$ attachment Id )" Ġ} ĊĠĠĠĠĠĠĠ Ġattachment Handler . detach ( attachment Id ) Ġ{ Ġdelete Attachment ( attachment Id ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsend ( message : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( currentState Ġ! is ĠState . Configured ) Ġthrow ĠIllegalStateException (" Web Messaging Ġclient Ġis Ġnot Ġconfigured .") ĊĠĠĠĠĠĠĠ Ġlog . i Ġ{ Ġ" Will Ġsend Ġmessage " Ġ} ĊĠĠĠĠĠĠĠ Ġweb Socket . sendMessage ( message ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IllegalStateException :: class ) ĊĠĠĠ Ġoverride Ġfun Ġgenerate Download Url ( attachment Id : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlog . i Ġ{ Ġ" generate Download Url ( attachment Id Ġ= Ġ$ attachment Id )" Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= ĠGet Attachment Request ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Ġ= Ġtoken , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġattachment Id Ġ= Ġattachment Id ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IllegalStateException :: class ) ĊĠĠĠ Ġoverride Ġfun Ġdelete Attachment ( attachment Id : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlog . i Ġ{ Ġ" delete Attachment ( attachment Id Ġ= Ġ$ attachment Id )" Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= ĠDelete Attachment Request ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Ġ= Ġtoken , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġattachment Id Ġ= Ġattachment Id ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġencoded Json Ġ= ĠWeb Messaging Json . json . encode ToString ( request ) ĊĠĠĠĠĠĠĠ Ġsend ( encoded Json ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġfetch Next Page () Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck ( currentState Ġis ĠState . Configured ) Ġ{ Ġ" Web Messaging Ġclient Ġis Ġnot Ġconfigured ." Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( message Store . start Of Conversation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . i Ġ{ Ġ" All Ġhistory Ġhave Ġbeen Ġfetched ." Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlog . i Ġ{ Ġ" fetch ing Ġhistory Ġfor Ġpage Ġindex Ġ= Ġ${ message Store . next Page }" Ġ} ĊĠĠĠĠĠĠĠ Ġjwt Handler . with Jwt Ġ{ Ġjwt Ġ-> Ġapi . get Messages ( jwt , Ġmessage Store . next Page ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Store . update Message History ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . to Message List (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . total , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Error ( code : ĠErrorCode , Ġmessage : ĠString ? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( code Ġ== ĠErrorCode . Session Has Expired Ġ|| Ġcode Ġ== ĠErrorCode . Session NotFound ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent State Ġ= ĠState . Error ( code , Ġmessage ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( code Ġ== ĠErrorCode . Message Too Long ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Store . on Message Error ( code , Ġmessage ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġsocket Listener Ġ= ĠSocket Listener ( ĊĠĠĠĠĠĠĠ Ġlog Ġ= Ġlog . with Tag ( Log Tag . WEB SOCKET ) ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠSocket Listener ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlog : ĠLog , ĊĠĠĠ Ġ) Ġ: ĠPlatform Socket Listener Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Open () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . i Ġ{ Ġ" on Open ()" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent State Ġ= ĠState . Connected ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Failure ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . e ( throwable Ġ= Ġt ) Ġ{ Ġ" on Failure ( message : Ġ${ t . message })" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent State Ġ= ĠState . Error ( ErrorCode . Websocket Error , Ġt . message ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġweb Socket . close Socket ( Socket Close Code . GO ING _ AW AY . value , Ġ" Go ing Ġaway .") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Message ( text : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . i Ġ{ Ġ" on Message ( text Ġ= Ġ$ text )" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdecoded Ġ= ĠWeb Messaging Json . decode FromString ( text ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( decoded . body ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠString Ġ-> Ġhandle Error ( ErrorCode . map From ( decoded . code ), Ġdecoded . body ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSession Expired Event Ġ-> Ġhandle Error ( ErrorCode . Session Has Expired ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSession Response Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdecoded . body . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent State Ġ= ĠState . Configured ( connected , Ġnew Session ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠJwt Response Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjwt Handler . jwt Response Ġ= Ġdecoded . body ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠPres ign ed Url Response Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattachment Handler . upload ( decoded . body ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠUpload Success Event Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattachment Handler . upload Success ( decoded . body ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠStruct ured Message Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Store . update ( decoded . body . to Message ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠAttachment Deleted Response Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattachment Handler . on Deleted ( decoded . body . attachment Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠGenerate Url Error Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdecoded . body . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattachment Handler . onError ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattachment Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠErrorCode . map From ( errorCode ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠerrorMessage ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠUpload Failure Event Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdecoded . body . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattachment Handler . onError ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattachment Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠErrorCode . map From ( errorCode ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠerrorMessage ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exception : ĠSerialization Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . e ( throwable Ġ= Ġexception ) Ġ{ Ġ" Failed Ġto Ġdeserialize Ġmessage " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exception : ĠIllegalArgumentException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . e ( throwable Ġ= Ġexception ) Ġ{ Ġ" Message Ġdecoded Ġas Ġnull " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Closing ( code : ĠInt , Ġreason : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . i Ġ{ Ġ" on Closing ( code Ġ= Ġ$ code , Ġreason Ġ= Ġ$ reason )" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent State Ġ= ĠState . Closing ( code , Ġreason ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Closed ( code : ĠInt , Ġreason : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . i Ġ{ Ġ" on Closed ( code Ġ= Ġ$ code , Ġreason Ġ= Ġ$ reason )" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent State Ġ= ĠState . Closed ( code , Ġreason ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ