Échappatoire .raw
Utiliser .raw pour une fonctionnalité SDK non encore enveloppée
Ce que ça fait
Chaque service de @legba-core/realtime expose une propriété raw :
l’instance réelle du client SDK LiveKit sous-jacente, typée exactement comme
le SDK l’exporte (jamais any). Elle permet d’appeler directement une
méthode native quand la fonctionnalité voulue n’est pas (encore) enveloppée
par Legba — sans attendre qu’un billet l’ajoute.
| Service | raw |
|---|---|
RoomService (createRoomService) | RoomServiceClient |
ParticipantService (createParticipantService) | RoomServiceClient (sa propre instance, pas celle de RoomService) |
EgressService (createEgressService) | EgressClient |
WebhookService (createWebhookService) | WebhookReceiver |
LegbaClientRoom (createLegbaRoom, navigateur) | Room (livekit-client) |
Exemple : rendre un participant invisible aux autres, à la volée
ParticipantService ne couvre pas (encore) la mise à jour des permissions
d’un participant déjà connecté — seulement lister/lire/exclure/couper le
micro. Le SDK natif le permet via RoomServiceClient.updateParticipant(),
avec le champ hidden de ParticipantPermission (ex. un modérateur qui
observe une salle sans apparaître dans la liste des présents côté clients) :
import { createParticipantService } from "@legba-core/realtime";
const participants = createParticipantService({ serverUrl, apiKey, apiSecret });
// Fonctionnalité non enveloppée par ParticipantService : accès direct au
// client natif, sous la responsabilité de l'appelant.
await participants.raw.updateParticipant("salle-demo", "moderateur-observateur", {
permission: {
canSubscribe: true,
canPublish: false,
canPublishData: false,
hidden: true,
},
});
Piège vérifié en écrivant cet exemple : roomAdmin n’existe pas sur
ParticipantPermission (le type que updateParticipant accepte) — c’est un
champ de VideoGrant, uniquement accordé à la création d’un jeton
(AccessToken), jamais modifiable à la volée sur un participant déjà
connecté, même via raw. Vérifié directement dans les types de
@livekit/protocol avant d’écrire cette recette.
Les autres méthodes de ParticipantService (removeParticipant,
muteParticipantMicrophone, …) continuent de fonctionner normalement
après cet appel — raw et les méthodes enveloppées partagent la même
instance de client, sans effet de bord entre elles.
Pièges
rawcontourne toute validation propre à Legba. Aucune vérification de format de nom de salle, aucun contrôlerequestedByRole, aucune erreurLegbaParticipantError/LegbaRoomError/… typée : une erreur du SDK natif remonte telle quelle. C’est un compromis assumé, pas un bug — documenté ici plutôt que « corrigé ».- Stabilité
expérimental, jamaisstable.rawsuit les évolutions du SDK LiveKit lui-même, hors du contrôle de version de@legba-core/realtime. - Utiliser
rawpour une opération déjà enveloppée par Legba (ex.raw.createRoom(...)au lieu deroomService.createRoom(...)) perd tous les garde-fous de cette méthode (vérification d’existence, validation du nom, etc.) sans aucun bénéfice — préférer la méthode enveloppée dans ce cas. - Un projet qui n’utilise jamais
rawne paie aucun coût : c’est une référence vers un objet déjà construit par le service, pas une fonctionnalité additionnelle qui s’exécute.