computeParticipantSessions

expérimentaldepuis 0.1.0@legba-core/realtime

computeParticipantSessions

Ce que ça fait

Reconstruit les sessions de participants (durée en salle) à partir d’une séquence d’événements webhook déjà vérifiés. Fonction pure, sans notion d’organisation ni de journée de facturation.

Signature

function computeParticipantSessions(events: LegbaWebhookEvent[]): ParticipantSession[]

Paramètres

NomTypeRequisDéfautDescription
eventsLegbaWebhookEvent[]ouiÉvénements déjà vérifiés (voir verifyWebhook/processWebhook), dans l’ordre chronologique

Retour

Un tableau de ParticipantSession :

ChampTypeDescription
identitystringIdentité du participant
roomNamestringNom de la salle
joinedAtnumber | undefinedSecondes epoch ; undefined pour une session "orphan-left"
leftAtnumber | undefinedSecondes epoch ; undefined pour une session "open"
durationSeconds / durationMinutesnumber | undefinedundefined tant que joinedAt et leftAt ne sont pas tous les deux connus
status"closed" | "open" | "orphan-left"Voir Pièges
closedBy"participant_left" | "room_finished" | undefinedQuel événement a clos la session

Erreurs

N/A — fonction pure, ne lève jamais.

Exemple minimal

import { computeParticipantSessions } from "@legba-core/realtime";

const sessions = computeParticipantSessions(events);

Exemple complet

import { computeParticipantSessions, summarizeSessionsByGroup } from "@legba-core/realtime";

const sessions = computeParticipantSessions(events);
const openSessions = sessions.filter((s) => s.status !== "closed");
if (openSessions.length > 0) {
  console.warn("sessions non closes à investiguer", openSessions);
}

const parSalle = summarizeSessionsByGroup(sessions);

Pièges

  • Un participant_joined sans participant_left correspondant (déconnexion brutale, ou simplement hors de la fenêtre d’événements fournie) rend une session status: "open", durée undefined — jamais une exception, jamais ignorée silencieusement.
  • Un participant_left sans participant_joined correspondant rend une session status: "orphan-left" — même logique.
  • Un room_finished complète automatiquement toute session encore ouverte de sa salle (closedBy: "room_finished"), mais ne touche aucune session d’une autre salle.
  • Aucune notion de journée de facturation : une session traversant minuit a sa durée calculée par simple soustraction d’horodatages, sans troncature à la frontière du jour civil.
  • Legba ne connaît aucune notion d’« organisation » — le regroupement se fait après coup, via summarizeSessionsByGroup.

Voir aussi