package Ġcom . lux oft . blockchain lab . cord a . hyperledger . ind y Ċ Ċ import Ġcom . fasterxml . jackson . annotation . JsonProperty Ċ import Ġcom . fasterxml . jackson . databind . JsonNode Ċ import Ġcom . fasterxml . jackson . databind . node . Object Node Ċ import Ġcom . lux oft . blockchain lab . hyperledger . ind y . utils . Serialization Utils Ċ import Ġmu . Kotlin Logging Ċ import Ġnet . ih ar der . Base 6 4 Ċ import Ġrx . Single Ċ import Ġrx . Single Subscriber Ċ import Ġjava . net . URI Ċ import Ġjava . util .* Ċ import Ġjava . util . concurrent . Concurrent HashMap Ċ import Ġjava . util . concurrent . Linked BlockingQueue Ċ import Ġjava . util . concurrent . TimeUnit Ċ import Ġjava . util . concurrent . TimeoutException Ċ import Ġkotlin . concurrent . thread Ċ Ċ class ĠPython Ref Agent Connection Ġ: ĠAgent Connection Ġ{ ĊĠĠĠ Ġprivate Ġval Ġlog Ġ= ĠKotlin Logging . logger Ġ{} ĊĊĠĠĠ Ġoverride Ġfun Ġdisconnect () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( getConnection Status () Ġ== ĠAgent Connection Status . AGENT _ CONNECTED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġweb Socket . close Blocking () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpoll Agent Worker ?. interrupt () Ġ?: Ġlog . warn Ġ{ Ġ" Agent Ġstatus Ġis Ġconnected Ġwhile Ġpoll Agent Worker Ġis Ġnull " Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġto Process Pair wise Connections . clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġawait ing Pair wise Connections . clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġind y Part ies . clear () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnection Status Ġ= ĠAgent Connection Status . AGENT _ DIS CONNECTED ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠConnect s Ġto Ġan Ġagent 's Ġendpoint ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġconnect ( url : ĠString , Ġlogin : ĠString , Ġpassword : ĠString ): ĠSingle < Unit > Ġ{ ĊĠĠĠĠĠĠĠ Ġdisconnect () ĊĠĠĠĠĠĠĠ Ġreturn ĠSingle . create < Unit > Ġ{ Ġobserver Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġweb Socket Ġ= ĠAgent WebSocket Client ( URI ( url ), Ġlogin ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġweb Socket . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnect Blocking () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠCheck Ġthe Ġagent 's Ġcurrent Ġstate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreceive Message OfType < State >( MESSAGE _ TYPES . STATE _ RESPONSE ). subscribe ({ Ġstate Response Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! check User LoggedIn ( state Response , Ġlogin )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠIf Ġthe Ġagent Ġis Ġnot Ġyet Ġinitialized , Ġsend Ġthe Ġ" connect " Ġrequest ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend As Json ( Wallet Connect ( login , Ġpassword )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠThe Ġagent Ġwill Ġrespond Ġwith Ġthe Ġ" state " Ġmessage Ġwhich Ġagain Ġmust Ġbe Ġchecked ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreceive Message OfType < State >( MESSAGE _ TYPES . STATE _ RESPONSE ). subscribe ({ ĠnewState Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! check User LoggedIn ( newState , Ġlogin )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . error Ġ{ Ġ" Unable Ġto Ġconnect Ġto ĠWallet " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠAgent Connection Exception (" Error Ġconnecting Ġto Ġ$ url ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobserver . on Success ( Unit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ{ Ġe : ĠThrowable Ġ-> Ġthrow ( e ) Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠThe Ġagent Ġis Ġalready Ġlogged Ġin ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobserver . on Success ( Unit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ{ Ġe : ĠThrowable Ġ-> Ġthrow ( e ) Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend As Json ( State Request ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobserver . onError ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. do On Success Ġ{ Ġpoll Agent Worker Ġ= Ġcreate Agent Worker () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġconnection Status : ĠAgent Connection Status Ġ= ĠAgent Connection Status . AGENT _ DIS CONNECTED ĊĊĠĠĠ Ġoverride Ġfun Ġget Connection Status (): ĠAgent Connection Status Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnection Status Ġ== ĠAgent Connection Status . AGENT _ DIS CONNECTED Ġ-> ĠAgent Connection Status . AGENT _ DIS CONNECTED ĊĠĠĠĠĠĠĠĠĠĠĠ Ġweb Socket . isOpen Ġ-> ĠAgent Connection Status . AGENT _ CONNECTED ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnection Status Ġ= ĠAgent Connection Status . AGENT _ DIS CONNECTED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnection Status ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġweb Socket Ġ: ĠAgent WebSocket Client ĊĊĠĠĠ Ġprivate Ġval Ġind y Part ies Ġ= ĠConcurrent HashMap < String , ĠIn dy Party Connection >() ĊĊĠĠĠ Ġprivate Ġfun Ġget Pub key From Invite ( invite : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinv Encoded Ġ= Ġinvite . split (" ? c _ i =" )[ 1 ] ĊĠĠĠĠĠĠĠ Ġval Ġinv Ġ= ĠBase 6 4 . decode ( inv Encoded ). toString ( Charsets . UTF _ 8 ) ĊĠĠĠĠĠĠĠ Ġval Ġkey List Ġ= ĠSerialization Utils . j SON To Any < Map < String , ĠList < String >> >( inv )[" recipient Keys "] ĊĠĠĠĠĠĠĠ Ġreturn Ġkey List ?. get ( 0 ) !! ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġtrue , Ġbased Ġon Ġthe Ġ" state " Ġmessage Ġreturned Ġfrom Ġthe Ġagent , Ġif Ġthe Ġagent Ġis Ġalready Ġlogged - in . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġcheck User LoggedIn ( state Message : ĠState ?, ĠuserName : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif ( state Message Ġ!= Ġnull Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Message . content ?. get (" initialized ") Ġ== Ġtrue Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Message . content [" agent _ name "] Ġ== ĠuserName Ġ&& Ġweb Socket . isOpen ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnection Status Ġ= ĠAgent Connection Status . AGENT _ CONNECTED ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnection Status Ġ= ĠAgent Connection Status . AGENT _ DIS CONNECTED ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠEst abl ishes Ġa Ġconnection Ġto Ġremote ĠIn dy Party Ġbased Ġon Ġthe Ġgiven Ġinvite ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġaccept Invite ( invite : ĠString ): ĠSingle < Ind y Party Connection > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠSingle . create Ġ{ Ġobserver Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( getConnection Status () Ġ== ĠAgent Connection Status . AGENT _ CONNECTED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠTo Ġaccept Ġthe Ġinvite , Ġfirst Ġinform Ġthe Ġagent Ġwith Ġ" receive _ invite " Ġmessage ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġthis Ġis Ġdone Ġafter Ġsub scri bing Ġto Ġ" invite _ received ". ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpub Key Ġ= Ġget Pub key From Invite ( invite ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠThe Ġagent Ġmust Ġrespond Ġwith Ġ" invite _ received " Ġmessage , Ġcontaining Ġthe Ġpublic Ġkey Ġfrom Ġinvite ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġweb Socket . receive Message OfType < Invite Received Message >( MESSAGE _ TYPES . INV ITE _ RECE IVED , Ġpub Key ). subscribe ({ Ġinv R cv Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠNow Ġinstruct Ġthe Ġagent Ġto Ġsend Ġthe Ġconnection Ġrequest Ġwith Ġ" send _ request " Ġmessage . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠThe Ġagent Ġbuilds Ġup Ġthe Ġconnection Ġrequest Ġand Ġforwards Ġit Ġto Ġthe Ġother ĠIn dy Party 's Ġendpoint , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġrecall ing Ġthe Ġinvite Ġby Ġits Ġpublic Ġkey . ĠThe Ġrequest Ġis Ġsent Ġafter Ġthe Ġsubscription Ġto Ġ" response _ received ". ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠThe Ġagent Ġreceives Ġthe Ġresponse Ġfrom Ġthe Ġother Ġparty Ġand Ġinform s Ġthe Ġclient Ġwith Ġ" response _ received " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġmessage ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġweb Socket . receive Message OfType < Object Node >( MESSAGE _ TYPES . RESPONSE _ RECE IVED , Ġpub Key ). subscribe ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠWait Ġuntil Ġconnection _ key Ġappears Ġin Ġthe ĠSTATE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠwaitFor Pair wise Connection ( pub Key ). timeout ( 6 0 0 0 0 , ĠTimeUnit . MILLISECONDS ). subscribe ({ Ġpair wise Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtheir Did Ġ= Ġpair wise [" their _ did "]. as Text () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġind y Party Ġ= ĠIn dy Party ( web Socket , Ġtheir Did , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpair wise [" metadata "][" their _ endpoint "]. as Text (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpair wise [" metadata "][" connection _ key "]. as Text (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpair wise [" my _ did "]. as Text ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġind y Part ies [ their Did ] Ġ= Ġind y Party ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobserver . on Success ( ind y Party ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ{ Ġe Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e Ġis ĠTimeout Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġawait ing Pair wise Connections . remove ( pub Key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠAgent Connection Exception (" Inv iting Ġparty Ġdelayed Ġto Ġreport Ġto Ġthe ĠAgent . ĠTry Ġincreasing Ġthe Ġtimeout .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġthrow Ġe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ{ Ġe : ĠThrowable Ġ-> Ġthrow ( e ) Ġ}) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠNow Ġsend Ġthe Ġrequest ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Request ( pub Key ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ{ Ġe : ĠThrowable Ġ-> Ġthrow ( e ) Ġ}) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠNow Ġsend Ġ" receive _ invite " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend As Json ( Receive Invite Message ( invite )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠAgent Connection Exception (" Agent Connection Ġobject Ġhas Ġwrong Ġstate ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobserver . onError ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsend As Json ( obj : ĠAny ) Ġ= Ġweb Socket . send As Json ( obj ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRetrieves Ġa Ġnew Ġinvite Ġfrom Ġthe Ġagent ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġgenerate Invite (): ĠSingle < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠSingle . create Ġ{ Ġobserver Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġto Ġgenerate Ġthe Ġinvite , Ġsend Ġ" generate _ invite " Ġmessage Ġto Ġthe Ġagent , Ġand Ġwait Ġfor Ġ" invite _ generated " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġwhich Ġmust Ġcontain Ġan Ġinvite ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġweb Socket . receive Message OfType < Receive Invite Message >( MESSAGE _ TYPES . INV ITE _ GENERATED ). subscribe ({ Ġmsg Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobserver . on Success ( msg . invite ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ{ Ġe : ĠThrowable Ġ-> Ġthrow ( e ) Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠAfter Ġsubscription , Ġsend Ġthe Ġ" generate _ invite " Ġrequest ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġweb Socket . send As Json ( SendMessage ( type Ġ= ĠMESSAGE _ TYPES . GENER ATE _ INV ITE )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobserver . onError ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġto Process Pair wise Connections Ġ= ĠLinked BlockingQueue < Pair < String , ĠSingle Subscriber < in ĠJsonNode >> >() ĊĠĠĠ Ġprivate Ġval Ġawait ing Pair wise Connections Ġ= ĠConcurrent HashMap < String , ĠSingle Subscriber < in ĠJsonNode >>() ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAgent 's Ġstate Ġpolling Ġthread . ĠIt Ġresume s Ġwhenever Ġ[ to Process Pair wise Connections ] Ġis Ġnon - empty . ĊĠĠĠĠ Ġ* ĠIt Ġalso Ġloops Ġby Ġitself Ġwhen ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġpoll Agent Worker : ĠThread ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Agent Worker () Ġ= Ġthread Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġprocess State Response ( state Response : ĠObject Node ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate Response [" content "][" pair wise _ connections "]. forEach Ġ{ Ġpair wise Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠpublicKey Ġ= Ġpair wise [" metadata "][" connection _ key "]. as Text () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġobserver Ġ= Ġawait ing Pair wise Connections . remove ( publicKey ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( observer Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobserver . on Success ( pair wise ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . warn ( e ) Ġ{ Ġ" invalid Ġpair wise Ġconnection Ġ( no Ġconnection Ġkey ) Ġfound Ġin Ġthe Ġstate " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ(! Thread . inter rupted ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠSleep Ġuntil Ġa Ġpair wise Ġconnection Ġobserver Ġis Ġregistered . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( await ing Pair wise Connections . isEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Process Pair wise Connections . take (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġawait ing Pair wise Connections [ first ] Ġ= Ġsecond ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpair wise Connection Ġ= Ġto Process Pair wise Connections . poll ()?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġawait ing Pair wise Connections [ first ] Ġ= Ġsecond ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( pair wise Connection Ġ!= Ġnull ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( await ing Pair wise Connections . isEmpty ()) Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠSubscribe Ġfor Ġthe Ġresponse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsingle Ġ= Ġweb Socket . receive Message OfType < Object Node >( MESSAGE _ TYPES . STATE _ RESPONSE ). to Blocking (). to Future () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠAfter Ġsubscription Ġsend Ġthe Ġstate Ġrequest ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend As Json ( State Request ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess State Response ( single . get ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠSleep Ġto Ġreduce Ġpolling Ġthe Ġ( local ) Ġagent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThread . sleep ( 5 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e Ġis Ġjava . lang . InterruptedException ) Ġlog . info Ġ{ Ġ"${ Thread . currentThread ()} Ġinterrupted Ġby Ġdisconnect ()" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġthrow Ġe ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠwaitFor Pair wise Connection ( pub Key : ĠString ): ĠSingle < JsonNode > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠSingle . create Ġ{ Ġobserver Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠPut Ġthe Ġobserver Ġin Ġthe Ġqueue Ġand Ġnotify Ġthe Ġworker Ġto Ġpoll Ġthe Ġagent Ġstate . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠWhen Ġthe Ġworker Ġfinds Ġthe Ġpublic Ġkey Ġin Ġthe Ġparsed Ġstate , Ġit Ġwill Ġnotify Ġthe Ġobserver . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Process Pair wise Connections . put ( pub Key Ġto Ġobserver ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobserver . onError ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġfun Ġsubscribe On Request Received () Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠOn Ġan Ġincoming Ġconnection Ġrequest , Ġthe Ġagent Ġmust Ġsend Ġthe Ġ" request _ received " ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġweb Socket . receive Message OfType < Request Received Message >( MESSAGE _ TYPES . REQUEST _ RECE IVED ). subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠOn Ġthe Ġ" request _ received " Ġmessage , Ġreply Ġwith Ġ" send _ response " Ġwith Ġremote ĠD ID Ġto Ġany Ġincoming Ġconnection Ġrequest . ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠAt Ġthis Ġstage Ġit Ġdoesn 't Ġmatter Ġwhich Ġparty Ġsent Ġthe Ġconnection Ġrequest , Ġbecause Ġit 's Ġnot Ġpossible Ġto Ġcorre late ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġ" request _ received " Ġmessage Ġand Ġthe Ġinvite . ĠFor Ġthe Ġpurpose Ġof ĠPo C Ġwe Ġreply Ġwith Ġ" send _ response " ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġon Ġeach Ġ" request _ received ", Ġno Ġmatter Ġwhich Ġparty Ġis Ġon Ġthe Ġother Ġside . ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠTODO : Ġsuggest Ġan Ġimprovement Ġin Ġpython ic Ġind y - agent Ġthat Ġincorpor ates Ġthe Ġinvite 's Ġpublic Ġkey Ġin Ġthe Ġ" request " Ġmessage , ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠTODO : Ġso Ġthat Ġit 's Ġpossible Ġto Ġcorre late Ġ" request _ received " Ġwhich Ġincludes Ġ" request " Ġand Ġthe Ġinvite ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġweb Socket . receive Message OfType < Request Response Sent Message >( MESSAGE _ TYPES . RESPONSE _ SENT , Ġit . did ). subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . info Ġ{ Ġ" Accepted Ġconnection Ġrequest Ġfrom Ġ${ it . did }" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend As Json ( Request Send Response Message ( it . did )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠW aits Ġfor Ġincoming Ġconnection Ġfrom Ġwhatever Ġparty Ġwhich Ġpos ses ses Ġthe Ġinvite ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun ĠwaitFor Inv ited Party ( invite : ĠString , Ġtimeout Ms : ĠLong ): ĠSingle < Ind y Party Connection > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠSingle . create Ġ{ Ġobserver Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( getConnection Status () Ġ== ĠAgent Connection Status . AGENT _ CONNECTED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠSubscribe Ġon Ġ" request _ received " Ġso Ġto Ġmake Ġsure Ġthe Ġrequest Ġis Ġprocessed Ġwhen / if Ġit Ġcomes . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠIt 's Ġnothing Ġwrong Ġif Ġit Ġdoesn 't Ġcome Ġ( for Ġexample , Ġit 's Ġbeen Ġprocessed Ġearlier ). ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubscribe On Request Received () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpub Key Ġ= Ġget Pub key From Invite ( invite ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠWait Ġuntil Ġthe ĠSTATE Ġhas Ġpair wise Ġconnection Ġcorresponding Ġto Ġthe Ġinvite . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠwaitFor Pair wise Connection ( pub Key ). timeout ( timeout Ms , ĠTimeUnit . MILLISECONDS ). subscribe ({ Ġpair wise Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtheir Did Ġ= Ġpair wise [" their _ did "]. as Text () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġind y Party Ġ= ĠIn dy Party ( web Socket , Ġtheir Did , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpair wise [" metadata "][" their _ endpoint "]. as Text (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpair wise [" metadata "][" connection _ key "]. as Text (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpair wise [" my _ did "]. as Text ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġind y Part ies [ their Did ] Ġ= Ġind y Party ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobserver . on Success ( ind y Party ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ{ Ġe Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e Ġis ĠTimeout Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġawait ing Pair wise Connections . remove ( pub Key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠAgent Connection Exception (" Inv ited Ġparty Ġdelayed Ġto Ġreport Ġto Ġthe ĠAgent . ĠTry Ġincreasing Ġthe Ġtimeout .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġthrow Ġe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠAgent Connection Exception (" Agent Ġis Ġdisconnected ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobserver . onError ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Ind y Party Connection ( party DID : ĠString ): ĠSingle < Ind y Party Connection ?> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠSingle . create Ġ{ Ġobserver Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( getConnection Status () Ġ== ĠAgent Connection Status . AGENT _ CONNECTED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠQuery Ġlocal Ġconnection Ġobjects Ġassociated Ġwith Ġthe Ġremote Ġparty 's ĠD ID ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( party DID Ġin Ġind y Part ies . keys ) Ġobserver . on Success ( ind y Part ies [ party DID ]) Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠIf Ġnot Ġfound , Ġquery Ġagent Ġstate Ġfor Ġthe Ġproperties Ġof Ġthe Ġpreviously Ġset Ġpair wise Ġconnection ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġweb Socket . receive Message OfType < Object Node >( MESSAGE _ TYPES . STATE _ RESPONSE ). subscribe Ġ{ Ġstate Response Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpair wise Ġ= Ġstate Response [" content "][" pair wise _ connections "]. find Ġ{ Ġnode Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode [" their _ did "]. as Text () Ġ== Ġparty DID ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pair wise Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobserver . on Success ( Ind y Party ( web Socket , Ġparty DID , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpair wise [" metadata "][" their _ endpoint "]. as Text (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpair wise [" metadata "][" connection _ key "]. as Text (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpair wise [" my _ did "]. as Text ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobserver . on Success ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . info Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Remote ĠIn dy Party Ġ( DID :$ party DID ) Ġis Ġunknown Ġto Ġthe Ġagent . Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Init iate Ġa Ġnew Ġconnection Ġusing Ġgenerate Invite ()/ accept Invite ()/ waitFor Inv ited Party ()" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend As Json ( State Request ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠAgent Connection Exception (" Agent Ġis Ġdisconnected ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobserver . onError ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsend Request ( key : ĠString ) Ġ= Ġweb Socket . send As Json ( Send Request Message ( key )) Ċ } Ċ Ċ object ĠMESSAGE _ TYPES Ġ{ ĊĠĠĠ Ġval ĠCON N _ BASE Ġ= Ġ" did : so v : Bz C bs NY h Mr j H iq Z DT U ASH g ; spec / connections / 1 . 0 /" ĊĠĠĠ Ġval ĠADMIN _ CONNECTION S _ BASE Ġ= Ġ" did : so v : Bz C bs NY h Mr j H iq Z DT U ASH g ; spec / admin _ connections / 1 . 0 /" ĊĠĠĠ Ġval ĠADMIN _ BASE Ġ= Ġ" did : so v : Bz C bs NY h Mr j H iq Z DT U ASH g ; spec / admin / 1 . 0 /" ĊĠĠĠ Ġval ĠADMIN _ WAL LET CONNECTION _ BASE Ġ= Ġ" did : so v : Bz C bs NY h Mr j H iq Z DT U ASH g ; spec / admin _ wallet connection / 1 . 0 /" ĊĠĠĠ Ġval ĠADMIN _ BASIC MESSAGE _ BASE Ġ= Ġ" did : so v : Bz C bs NY h Mr j H iq Z DT U ASH g ; spec / admin _ basic message / 1 . 0 /" ĊĠĠĠ Ġval ĠRESP ONSE Ġ= ĠCON N _ BASE Ġ+ Ġ" response " ĊĠĠĠ Ġval ĠCONNECT Ġ= ĠADMIN _ WAL LET CONNECTION _ BASE Ġ+ Ġ" connect " ĊĠĠĠ Ġval ĠDIS CONNECT Ġ= ĠADMIN _ WAL LET CONNECTION _ BASE Ġ+ Ġ" disconnect " ĊĠĠĠ Ġval ĠS END _ MESSAGE Ġ= ĠADMIN _ BASIC MESSAGE _ BASE Ġ+ Ġ" send _ message " ĊĠĠĠ Ġval ĠMESSAGE _ RECE IVED Ġ= ĠADMIN _ BASIC MESSAGE _ BASE Ġ+ Ġ" message _ received " ĊĠĠĠ Ġval ĠMESSAGE _ SENT Ġ= ĠADMIN _ BASIC MESSAGE _ BASE Ġ+ Ġ" message _ sent " ĊĠĠĠ Ġval ĠGET _ MESSAGES Ġ= ĠADMIN _ BASIC MESSAGE _ BASE Ġ+ Ġ" get _ messages " ĊĠĠĠ Ġval ĠMESS AGES Ġ= ĠADMIN _ BASIC MESSAGE _ BASE Ġ+ Ġ" messages " ĊĠĠĠ Ġval ĠGENER ATE _ INV ITE Ġ= ĠADMIN _ CONNECTION S _ BASE Ġ+ Ġ" generate _ invite " ĊĠĠĠ Ġval ĠIN V ITE _ GENERATED Ġ= ĠADMIN _ CONNECTION S _ BASE Ġ+ Ġ" invite _ generated " ĊĠĠĠ Ġval ĠIN V ITE _ RECE IVED Ġ= ĠADMIN _ CONNECTION S _ BASE Ġ+ Ġ" invite _ received " ĊĠĠĠ Ġval ĠRE CE IVE _ INV ITE Ġ= ĠADMIN _ CONNECTION S _ BASE Ġ+ Ġ" receive _ invite " ĊĠĠĠ Ġval ĠS END _ REQUEST Ġ= ĠADMIN _ CONNECTION S _ BASE Ġ+ Ġ" send _ request " ĊĠĠĠ Ġval ĠREQUEST _ RECE IVED Ġ= ĠADMIN _ CONNECTION S _ BASE Ġ+ Ġ" request _ received " ĊĠĠĠ Ġval ĠS END _ RESPONSE Ġ= ĠADMIN _ CONNECTION S _ BASE Ġ+ Ġ" send _ response " ĊĠĠĠ Ġval ĠRESP ONSE _ RECE IVED Ġ= ĠADMIN _ CONNECTION S _ BASE Ġ+ Ġ" response _ received " ĊĠĠĠ Ġval ĠRESP ONSE _ SENT Ġ= ĠADMIN _ CONNECTION S _ BASE Ġ+ Ġ" response _ sent " ĊĠĠĠ Ġval ĠREQUEST _ SENT Ġ= ĠADMIN _ CONNECTION S _ BASE Ġ+ Ġ" request _ sent " ĊĠĠĠ Ġval ĠSTATE _ REQUEST Ġ= ĠADMIN _ BASE Ġ+ Ġ" state _ request " ĊĠĠĠ Ġval ĠSTATE _ RESPONSE Ġ= ĠADMIN _ BASE Ġ+ Ġ" state " Ċ } Ċ Ċ data Ġclass ĠWallet Connect ( val Ġname : ĠString , Ġval Ġpassphrase : ĠString , Ġ@ JsonProperty ("@ type ") Ġval Ġtype : ĠString Ġ= ĠMESSAGE _ TYPES . CONNECT ) Ċ data Ġclass ĠState Request (@ JsonProperty ("@ type ") Ġval Ġtype : ĠString Ġ= ĠMESSAGE _ TYPES . STATE _ REQUEST ) Ċ data Ġclass ĠState (@ JsonProperty ("@ type ") Ġval Ġtype : ĠString Ġ= ĠMESSAGE _ TYPES . STATE _ RESPONSE , Ġval Ġcontent : ĠMap < String , ĠAny >? Ġ= Ġnull ) Ċ data Ġclass ĠReceive Invite Message ( val Ġinvite : ĠString , Ġval Ġlabel : ĠString Ġ= Ġ"", Ġ@ JsonProperty ("@ type ") Ġval Ġtype : ĠString Ġ= ĠMESSAGE _ TYPES . RECEIVE _ INV ITE ) Ċ data Ġclass ĠInv ite Received Message ( val Ġconnection _ key : ĠString , Ġval Ġlabel : ĠString , Ġval Ġendpoint : ĠString , Ġ@ JsonProperty ("@ type ") Ġval Ġtype : ĠString ) Ċ data Ġclass ĠSend Request Message ( val Ġconnection _ key : ĠString , Ġ@ JsonProperty ("@ type ") Ġval Ġtype : ĠString Ġ= ĠMESSAGE _ TYPES . SEND _ REQUEST ) Ċ data Ġclass ĠRequest Received Message ( val Ġlabel : ĠString , Ġval Ġdid : ĠString , Ġval Ġendpoint : ĠString , Ġ@ JsonProperty ("@ type ") Ġval Ġtype : ĠString ) Ċ data Ġclass ĠRequest Send Response Message ( val Ġdid : ĠString , Ġ@ JsonProperty ("@ type ") Ġval Ġtype : ĠString Ġ= ĠMESSAGE _ TYPES . SEND _ RESPONSE ) Ċ data Ġclass ĠRequest Response Received Message ( val Ġtheir _ did : ĠString , Ġval Ġhistory : ĠObject Node , Ġ@ JsonProperty ("@ type ") Ġval Ġtype : ĠString ) Ċ data Ġclass ĠRequest Response Sent Message (@ JsonProperty ("@ type ") Ġval Ġtype : ĠString Ġ= ĠMESSAGE _ TYPES . RESPONSE _ SENT , Ġval Ġlabel : ĠString , Ġval Ġdid : ĠString ) Ċ data Ġclass ĠSend Message ( val Ġto : ĠString ? Ġ= Ġnull , Ġval Ġmessage : ĠTyped Body Message ? Ġ= Ġnull , Ġ@ JsonProperty ("@ type ") Ġval Ġtype : ĠString Ġ= ĠMESSAGE _ TYPES . SEND _ MESSAGE ) Ċ data Ġclass ĠMessage Received Message ( val Ġfrom : ĠString , Ġval Ġsent _ time : ĠString , Ġval Ġcontent : ĠTyped Body Message ) Ċ data Ġclass ĠMessage Received ( val Ġid : ĠString ?, Ġval Ġwith : ĠString ?, Ġval Ġmessage : ĠMessage Received Message , Ġ@ JsonProperty ("@ type ") Ġval Ġtype : ĠString Ġ= ĠMESSAGE _ TYPES . SEND _ MESSAGE ) Ċ data Ġclass ĠLoad Message ( val Ġwith : ĠString , Ġ@ JsonProperty ("@ type ") Ġval Ġtype : ĠString Ġ= ĠMESSAGE _ TYPES . GET _ MESSAGES ) Ċ data Ġclass ĠTyped Body Message ( val Ġmessage : ĠAny , Ġ@ JsonProperty ("@ class ") Ġval Ġclazz : ĠString , Ġval Ġcorrelation Id : ĠString Ġ= ĠUUID . randomUUID (). toString ())