Aller au contenu

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"]

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 :

CommandResultEffet
NotHandledLe SFU diffuse le message normalement
InterceptedConsommé, 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

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.

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.

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.