Architecture générale
Vuisio se décompose en briques nettement séparées. Le principe directeur est que le cœur reste autonome et ignore tout des modules.
Schéma d’ensemble
Section intitulée « Schéma d’ensemble »flowchart TB
subgraph ORCH["Orchestrateur · bin/vuisio"]
direction LR
SFU["SFU Core<br/>core/server<br/>relais WebRTC sans transcodage"]
REG["Registre de modules<br/>gRPC :50050"]
ANON["Anonymizer<br/>anonymisation vocale<br/>lié statiquement"]
SFU <-->|Hooks| REG
SFU -->|on_media_transform| ANON
end
SFU <-->|"WebRTC · UDP 16384+"| NAV["Navigateurs<br/>webclient"]
REG <-->|gRPC| MOD["Modules<br/>capacités déclarées"]
classDef sfu fill:#072b73,stroke:#072b73,color:#ffffff;
classDef agpl stroke:#fd524e,stroke-width:2px;
class SFU sfu;
class ANON,NAV agpl;
Le cœur (SFU) ignore tout des modules. L’orchestrateur fait le lien.
Les briques principales
Section intitulée « Les briques principales »| Brique | Chemin | Rôle |
|---|---|---|
| SFU | core/server/ | Cœur WebRTC. Relaie audio et vidéo entre les clients, sans transcodage. Autonome. |
| SDK Traits | sdk/traits/ | Contrat Rust des modules : le trait Module, l’enum Capability, les événements. |
| SDK Proto | sdk/proto/ | Définitions Protobuf, source unique de vérité pour tous les services gRPC. |
| SDK gRPC Adapter | sdk/grpc-adapter/ | Pont gRPC client et serveur : registre de modules, flux d’événements. |
| Orchestrateur | bin/vuisio/ | Démarre le SFU, expose le registre gRPC, branche les hooks selon les capacités des modules. |
| Client web | modules/webclient/ | Interface de visioconférence (Next.js). |
| Anonymizer | modules/anonymizer/ | Anonymisation vocale en temps réel, liée statiquement à l’orchestrateur. |
| Installeur | tools/installer/ | Installeur interactif de serveur. |
La règle d’or
Section intitulée « La règle d’or »Cette contrainte est ce qui garantit qu’on peut publier et auditer le SFU seul, le faire tourner sans aucun module, et lui ajouter des capacités sans jamais toucher au cœur.
Le registre de modules
Section intitulée « Le registre de modules »L’orchestrateur expose trois services gRPC (port 50050 par défaut) :
- ModuleRegistry : un module s’enregistre (
Register), confirme sa présence (Heartbeat) et peut se retirer (Deregister). - EventStream : un module s’abonne (
Subscribe) au flux d’événements du SFU. - RoomManagement : pilotage des salles (créer, terminer, lister, envoyer un message de chat, lire les données de session).
À l’enregistrement, un module annonce ses capacités (l’enum Capability :
Recording, Analytics, Stun, ou une capacité libre Custom).
L’orchestrateur ne branche les hooks d’un module que pour les capacités qu’il a
réellement déclarées.
Le système de hooks
Section intitulée « Le système de hooks »Le SFU expose quatre hooks génériques, sans aucune connaissance des modules. Ils sont détaillés dans la section SDK.
on_command: intercepte un message de datachannel que le SFU ne reconnaît pas comme une commande interne, et renvoie une décision indiquant quoi en faire (le laisser suivre son cours, le consommer, le diffuser, ou répondre à l’émetteur seul).on_media_out: donne accès aux paquets média sortants, pour les observer ou les exporter.on_media_transform: transforme le flux média avant sa retransmission. C’est ce hook qu’utilise l’anonymizer pour anonymiser la voix en temps réel.on_lifecycle: réagit aux événements de cycle de vie (arrivée et départ d’un participant, ouverture et fermeture d’une piste, messages de chat).