@startuml skinparam ParticipantPadding 20 skinparam BoxPadding 20 title Libsovrin Agent to Agent communucation API scale 0.9 box "Sender Agent" #LightBlue actor "Sender Agent" as SA participant "Sender Libsovrin" as SL participant "Sender Wallet" as SW participant "Sender Socket" as SS endbox box "Receiver Agent" #LightBlue actor "Receiver Agent" as RA participant "Receiver Libsovrin" as RL participant "Receiver Wallet" as RW participant "Receiver Socket" as RS endbox participant "Ledger" as L === Start listening == RA -> RL: 1. sovrin_create_and_store_my_did RL -> RW: Store receiver keys RA -> RL: 2. sovrin_agent_listen RL -> RS: Start listening RL -> RA: Listener handle (cb) === Establish connection == SA -> SL: 3. sovrin_create_and_store_my_did SL -> SW: Store sender keys SA -> SL: 4. sovrin_agent_connect SL -> SW: Get sender keys SW -> SL: Sender keys SL -> L: GET_NYM/GET_DDO L -> SL: Receiver keys and endpoint SL -> SW: Store receiver keys and endpoint SL -> SS: Receiver did, keys and endpoint. Sender did, keys SS -> RS: PairwiseCurveCP Hello message RS -> RL: Keys lookup request RL -> RW: Get keys and did for request RW -> RL: Receiver keys and did RL -> RS: Receiver keys RS -> SS: PairwiseCurveCP Welcome message SS -> RS: Next PairwiseCurveCP handshake messages RS -> SS: PairwiseCurveCP handshake messages answers SS -> SL: PairwiseCurveCP connection established SL -> SS: DID message SS -> RS: DID message RS -> RL: Sender did and public key RL -> L: GET_NYM/GET_DDO L -> RL: Sender keys and did (from Ledger) RL -> RL: Connection verification RL -> RS: DID message answer RS -> SS: DID message answer SS -> SL: DID message answer SL -> SA: Connection handle (cb) RL -> RA: Connection handle (cb) === Exchange messages == SA -> SL: 4. sovrin_agent_send SL -> SS: Message SS -> RS: Message RS -> RL: Message RL -> RA: Message (cb) RA -> RL: 5. sovrin_agent_send RL -> RS: Message RS -> SS: Message SS -> SL: Message SL -> SA: Message (cb) === Clean up == SA -> SL: 5. sovrin_agent_close_connection SL -> SS: Close socket RA -> RL: 5. sovrin_agent_close_listener RL -> RS: Close socket @enduml