sequenceDiagram participant M as Existing
member (M) participant MA as Existing
member
agent (MA) participant A as Alice (A) participant AA as Alice's
agent (AA) participant BA as Bob's
agent (BA) participant B as Bob (B) note over A, AA: 1. create new group (no members) A ->> AA: G:gidA? NEW
(gidA - group ID of this group for A,
can be generated by the agent) note over AA: create "internal" broadcast associated with the group
(B: NEW) AA ->> A: G:gidA OK note over A, BA: 2. add Bob to group A ->> AA: C:idAB INTRO G:gidA gInfo
(idAB - conn alias A has for B) note over AA: generate new random ID for member B (midB, unique per group)
initiate "internal" connection gidAB for B in group
(internal means that it is not visible to the clients
and cannot be used with client commands) AA ->> BA: via idAB: GROUP C:midB g:gInvAB gInfo BA ->> B: C:idBA REQ G:invID gInfo
(invID - to refer to it in ACPT) B ->> BA: G:gidB? ACPT G:invID
(RJCT G:invID could be added) note over BA: create group and "internal" broadcast associated with the group
(B: NEW) BA ->> B: G:gidB OK BA ->> AA: establish internal connection gidBA (using g:gInvAB) for A in group note over BA, AA: add connections gidBA and gidAB to broadcasts
(B: ADD) AA ->> A: G:gidA CON C:idAB BA ->> B: G:gidA CON C:idBA note over M, B: For each existing member M:
create and accept internal introduction between connections, related to the group, via gidAB/BA/AM/MA, connections created are gidBM and gidMB
The fact that the introduction arrives via connection allocated for the group, allows agents identify it as a new group member, ID used in introductions is group-scoped member ID. note over A, BA: once all members were sent to B AA ->> BA: via gidAB: MEM C:midB note over BA, B: once all members are connected BA ->> B: G:gidB MEM note over A, AA: once all members reported connection AA ->> A: G:gidA MEM C:idAB note over M, AA: for each member M AA ->> MA: via gidAM: MEM C:midB MA ->> M: G:gidM MEM C:idMB note over M, B: 3. B sends message to the group B ->> BA: G:gidB SEND msg note over BA: send message via associated broadcast and respond to client with SENT notifications BA ->> B: G:gidB SENT C:idBA intMsgID BA ->> B: G:gidB SENT C:idBM intMsgID note over BA, B: once sent to all BA ->> B: G:gidB SENT intMsgID AA ->> A: G:gidA MSG C:idAB intMsgID msgdata A ->> AA: G:gidA ACK intMsgID AA ->> BA: via gidAB: RCVD extMsgID hash sig BA ->> B: G:gidA RCVD C:idBA intMsgID status
(status - message integrity check) MA ->> M: G:gidM MSG C:idMB intMsgID msgdata M ->> MA: G:gidM ACK intMsgID MA ->> BA: via gidMB: RCVD extMsgID hash sig BA ->> B: G:gidM RCVD C:idBM intMsgID status note over BA, B: once received by all BA ->> B: G:gidM RCVD intMsgID status note over M, B: 4a. A leaves group A ->> AA: G:gidA LEAVE AA ->> A: G:gidA OK AA ->> BA: via gidAB: LEFT note over AA: remove gidAB, remove from broadcast note over BA: remove gidBA, remove from broadcast BA ->> B: G:gidB LEFT C:idBA AA ->> MA: via gidAM: LEFT note over AA: remove gidAM, remove from broadcast note over MA: remove gidMA, remove from broadcast MA ->> M: G:gidM LEFT C:idMA AA ->> A: G:gidA LEFT note over B, BA: if all members left BA ->> B: G:gidB: EMPTY note over M, B: 4b. A removes B from group A ->> AA: G:gidA REM C:idAB AA ->> A: G:gidA OK AA ->> BA: via gidAB: OUT note over BA: remove gidBA, all gidBM BA ->> B: G:gidB OUT C:idBA note over AA: remove gidAB AA ->> A: G:gidA OK note over M, B: below steps happen for each existing member M AA ->> MA: via gidAM: REM C:midB note over MA: remove gidMB MA ->> AA: via gidMA: REMD C:midB MA ->> M: G:gidM REMD C:idMB C:idMA
(B removed by A) note over A, AA: once all members removed B AA ->> A: G:gidA REMD C:idAB
(B removed by this agent) note over M, B: 4c. A deletes group A ->> AA: G:gidA DEL AA ->> A: G:gidA OK AA ->> BA: via gidAB: DEL note over BA: remove all group connections and messages BA ->> B: G:gidB DELD C:idBA
(group deleted by A) BA ->> AA: via gidBA: DELD AA ->> A: G:gidA DELD C:idAB AA ->> MA: via gidAM: DEL note over MA: remove all group connections and messages MA ->> M: G:gidM DELD C:idMA
(group deleted by A) MA ->> AA: via gidMA: DELD AA ->> A: G:gidA DELD C:idAM AA ->> A: G:gidA DELD
(group deleted by this agent - all confirmed)