Les hooks
Le SFU expose quatre hooks génériques, tous facultatifs, regroupés dans
SfuHooks. Il ne sait rien des modules : c’est l’orchestrateur qui relie ces
hooks aux modules selon leurs capacités.
flowchart TD
A["Paquet ou message reçu"] --> B{Quoi ?}
B -->|"Audio"| T["on_media_transform"]
B -->|"Datachannel non reconnu"| C["on_command"]
T --> F["Relai aux participants"]
B -->|"Autre média"| F
F --> O["on_media_out"]
E["Arrivée, départ, piste, chat..."] --> L["on_lifecycle"]
on_command
Section intitulée « on_command »Intercepte un message de datachannel que le SFU ne reconnaît pas comme une commande interne, et renvoie une décision.
pub type OnCommandHook = Arc<dyn Fn(CommandContext) -> CommandResult + Send + Sync>;Le contexte donne tout le nécessaire pour décider :
pub struct CommandContext { pub room_id: String, pub client_id: ClientId, pub is_moderator: bool, pub is_presenter: bool, pub raw_message: String, pub binary_payload: Option<Vec<u8>>, // trames binaires (ex. mises à jour CRDT) pub active_tracks: Vec<ActiveTrack>, pub all_clients: Vec<RoomClient>,}La valeur de retour indique au SFU quoi faire du message :
CommandResult | Effet |
|---|---|
NotHandled | Le SFU diffuse le message normalement |
Intercepted | Consommé, rien n’est diffusé |
Broadcast(String) | Diffuse ce message à la place |
BroadcastAndRequestKeyframes(String) | Diffuse, et redemande des keyframes à tous les émetteurs vidéo |
BroadcastBinary(Vec<u8>) | Diffuse des octets bruts |
ReplyOnly(String) | Répond uniquement au client émetteur |
on_media_out
Section intitulée « on_media_out »Donne accès à chaque paquet média sortant, après le relai aux participants locaux (pour observer ou exporter le flux). Appelé une fois par paquet source.
pub type OnMediaOutHook = Arc<dyn Fn(&str, ClientId, &MediaData, Option<&[u8]>, &mut Vec<u8>) + Send + Sync>;Le paramètre Option<&[u8]> porte la charge audio déjà transformée (par exemple
anonymisée), à préférer à l’original pour l’audio. Le &mut Vec<u8> est un
tampon pré-alloué réutilisable, pour éviter les allocations.
on_media_transform
Section intitulée « on_media_transform »Transforme la charge utile d’un paquet audio avant sa retransmission. Appelé une fois par paquet source.
pub type OnMediaTransformHook = Arc<dyn Fn(&str, ClientId, &MediaData, &mut Vec<u8>) -> bool + Send + Sync>;Le hook écrit les octets transformés dans le tampon de sortie et renvoie true
pour remplacer l’original, ou false pour laisser passer le paquet tel quel.
C’est ce hook qu’utilise l’anonymisation vocale.
on_lifecycle
Section intitulée « on_lifecycle »Réagit aux événements de cycle de vie d’une salle.
pub type OnLifecycleHook = Arc<dyn Fn(LifecycleEvent) -> Vec<String> + Send + Sync>;Les événements émis : ClientJoined, ClientLeft, RoomClosed, TrackOpened,
ChatMessage, ChatReaction, HandRaise, Reaction (la variante
TrackClosed existe mais n’est pas encore émise). La valeur de retour, une liste
de messages, n’est utilisée que pour ClientJoined : ces messages sont alors
envoyés au client qui vient d’arriver.