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
| Nom | Type | Requis | Défaut | Description |
|---|---|---|---|---|
events | LegbaWebhookEvent[] | oui | — | Événements déjà vérifiés (voir verifyWebhook/processWebhook), dans l’ordre chronologique |
Retour
Un tableau de ParticipantSession :
| Champ | Type | Description |
|---|---|---|
identity | string | Identité du participant |
roomName | string | Nom de la salle |
joinedAt | number | undefined | Secondes epoch ; undefined pour une session "orphan-left" |
leftAt | number | undefined | Secondes epoch ; undefined pour une session "open" |
durationSeconds / durationMinutes | number | undefined | undefined 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" | undefined | Quel é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_joinedsansparticipant_leftcorrespondant (déconnexion brutale, ou simplement hors de la fenêtre d’événements fournie) rend une sessionstatus: "open", duréeundefined— jamais une exception, jamais ignorée silencieusement. - Un
participant_leftsansparticipant_joinedcorrespondant rend une sessionstatus: "orphan-left"— même logique. - Un
room_finishedcomplè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.