sequenceDiagram title Stream — Session Planner : Pair A demande le plan de Pair B participant AppA as App Pair A (oc-booking) participant NATSA as NATS A participant NodeA as Node A participant StreamA as StreamService A participant NodeB as Node B participant StreamB as StreamService B participant DBB as DB Pair B (oc-lib) participant NATSB as NATS B %% 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
Stream 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