@startuml title Stream — Session Planner : Pair A demande le plan de Pair B participant "App Pair A (oc-booking)" as AppA participant "NATS A" as NATSA participant "Node A" as NodeA participant "StreamService A" as StreamA participant "Node B" as NodeB participant "StreamService B" as StreamB participant "DB Pair B (oc-lib)" as DBB participant "NATS B" as NATSB ' Ouverture session planner AppA -> NATSA: Publish(PROPALGATION_EVENT, {PB_PLANNER, peer_id:PeerID_B, payload:{}}) NATSA -> NodeA: ListenNATS → PB_PLANNER NodeA -> NodeA: Unmarshal → {peer_id: PeerID_B, payload: {}} NodeA -> StreamA: PublishCommon(nil, user, PeerID_B, ProtocolSendPlanner, {}) note over StreamA: WaitResponse=true, TTL=24h\nStream long-lived vers Pair B StreamA -> NodeB: TempStream /opencloud/resource/planner/1.0 StreamA -> NodeB: json.Encode(Event{Type:planner, From:DID_A, Payload:{}}) NodeB -> StreamB: HandleResponse → readLoop(ProtocolSendPlanner) StreamB -> StreamB: handleEvent(ProtocolSendPlanner, evt) StreamB -> StreamB: sendPlanner(evt) alt evt.Payload vide (requête initiale) StreamB -> DBB: planner.GenerateShallow(AdminRequest) DBB --> StreamB: plan (shallow booking plan de Pair B) StreamB -> StreamA: PublishCommon(nil, user, DID_A, ProtocolSendPlanner, planJSON) StreamA -> NodeA: json.Encode(Event{plan de B}) NodeA -> NATSA: (forwardé à AppA via SEARCH_EVENT ou PLANNER event) NATSA -> AppA: Plan de Pair B else evt.Payload non vide (mise à jour planner) StreamB -> StreamB: m["peer_id"] = evt.From (DID_A) StreamB -> NATSB: SetNATSPub(PROPALGATION_EVENT, {PB_PLANNER, peer_id:DID_A, payload:plan}) NATSB -> DBB: (oc-booking traite le plan sur NATS B) end ' Fermeture session planner AppA -> NATSA: Publish(PROPALGATION_EVENT, {PB_CLOSE_PLANNER, peer_id:PeerID_B}) NATSA -> NodeA: ListenNATS → PB_CLOSE_PLANNER NodeA -> NodeA: Unmarshal → {peer_id: PeerID_B} NodeA -> StreamA: Mu.Lock() NodeA -> StreamA: Streams[ProtocolSendPlanner][PeerID_B].Stream.Close() NodeA -> StreamA: delete(Streams[ProtocolSendPlanner], PeerID_B) NodeA -> StreamA: Mu.Unlock() note over StreamA,NodeB: Stream planner fermé — session terminée @enduml