@legba-core/realtime

@legba-core/realtime

Ce que ça fait

Émission de jetons d’accès LiveKit, gestion du cycle de vie des salles, des participants, du chat, de l’enregistrement (egress), des webhooks et des salles de sous-groupe (côté serveur), et connexion client dans le navigateur.

Deux points d’entrée, jamais mélangés

ImportEnvironnementContenu
@legba-core/realtimeServeur Node (livekit-server-sdk)Jetons, salles, participants, chat, egress, webhooks, rôles, salles de sous-groupe
@legba-core/realtime/clientNavigateur (livekit-client)createLegbaRoom

Un backend Node ne doit jamais importer /client, un bundle navigateur ne doit jamais importer l’entrée par défaut : chaque entrée est son propre bundle tsup, sans code de l’autre environnement à l’intérieur.

Symboles publics — @legba-core/realtime (serveur)

Jetons d’accès et rôles

SymboleRôle
createAccessTokenConstruit et signe un jeton d’accès
DEFAULT_TOKEN_TTL_SECONDSDurée de vie par défaut d’un jeton
PARTICIPANT_ROLESLes trois rôles acceptés
permissionsForRoleLes permissions média d’un rôle
resolveRoleRésout un rôle externe vers un ParticipantRole Legba, via une politique
LegbaTokenErrorErreur de requête de jeton invalide
TOKEN_ERROR_CODESCodes d’erreur liés aux jetons
LegbaRolePolicyErrorErreur de politique de rôle mal configurée
ROLE_POLICY_ERROR_CODESCodes d’erreur liés aux politiques de rôle

Salles

SymboleRôle
createRoomServiceCrée un client de gestion des salles
LegbaRoomErrorErreur de gestion de salle
ROOM_ERROR_CODESCodes d’erreur liés aux salles
hashRoomPasscodeHache un code d’accès de salle
verifyRoomPasscodeVérifie un code d’accès contre son hachage
setRoomPasscodeProtège une salle avec un code d’accès
clearRoomPasscodeRetire la protection par code d’accès
isRoomProtectedIndique si une salle est protégée par un code

Participants

SymboleRôle
createParticipantServiceCrée un client de gestion des participants
LegbaParticipantErrorErreur de gestion de participant
PARTICIPANT_ERROR_CODESCodes d’erreur liés aux participants
computeParticipantSessionsReconstruit les sessions de participants depuis des événements webhook
summarizeSessionsByGroupAgrège des sessions de participants par groupe

Salles de sous-groupe (breakout rooms)

SymboleRôle
planBreakoutRoomsPlanifie une répartition en salles de sous-groupe (pur, sans réseau)
createBreakoutRoomsCrée réellement les salles de sous-groupe planifiées
DEFAULT_BREAKOUT_ROOM_NAME_PREFIXPréfixe par défaut des noms de salles de sous-groupe

Chat

SymboleRôle
createChatServiceCrée un service de chat, adossé à un ChatStore
createInMemoryChatStoreStockage de chat en mémoire (tests, démo)
createMongoChatStoreStockage de chat persistant sur MongoDB
DEFAULT_CHAT_PAGE_SIZETaille de page par défaut pour lister les messages
LegbaChatErrorErreur de chat
CHAT_ERROR_CODESCodes d’erreur liés au chat

Egress (enregistrement)

SymboleRôle
createEgressServiceCrée un client de gestion de l’enregistrement (egress)
LegbaEgressErrorErreur d’egress
EGRESS_ERROR_CODESCodes d’erreur liés à l’egress

Webhooks

SymboleRôle
createWebhookServiceVérifie et traite les webhooks LiveKit, avec idempotence
createInMemoryWebhookIdempotencyStoreStockage d’idempotence en mémoire (tests, démo)
LegbaWebhookErrorErreur de webhook
WEBHOOK_ERROR_CODESCodes d’erreur liés aux webhooks

Symboles publics — @legba-core/realtime/client (navigateur)

SymboleRôle
createLegbaRoomCrée un client de connexion (salle, pistes, événements)
LegbaClientErrorErreur du client de connexion
CLIENT_ERROR_CODESCodes d’erreur liés au client

Installation

pnpm add @legba-core/realtime

Pièges

  • Le serveur LiveKit applique une tolérance d’une minute sur l’expiration des jetons (jwt.WithLeeway(time.Minute), côté serveur) : un jeton n’est vraiment refusé qu’après ce délai, jamais immédiatement à exp.
  • La permission roomAdmin d’un rôle n’apparaît pas dans la réponse de connexion du serveur (participant.permission) : elle est vérifiée par le serveur au moment d’une action d’administration, pas à la connexion.
  • Le serveur doit être configuré avec room.auto_create: false, sinon closeRoom semble ne rien faire (la salle est recréée au prochain jeton valide qui tente de la rejoindre).
  • removeParticipant/muteParticipantMicrophone vérifient requestedByRole côté @legba-core/realtime, pas côté serveur LiveKit — voir createParticipantService.
  • planBreakoutRooms est pur (aucun réseau) ; createBreakoutRooms crée réellement les salles planifiées via RoomService — deux étapes volontairement séparées, jamais fusionnées.
  • Chaque service (RoomService, ParticipantService, EgressService, WebhookService) expose une propriété raw vers le client SDK natif correspondant, pour une fonctionnalité pas encore enveloppée — voir docs/recipes/raw-escape-hatch.md.