ENbext.dev
DocumentationProtocoles

Traduction automatique depuis l’anglais. Consulter l’original.

Sur cette page

Signalisation WebRTC

bext gère uniquement la signalisation WebRTC — l'échange d'offres/réponses SDP et de candidats ICE dont les pairs ont besoin pour établir une connexion directe. bext ne relaie pas les médias et n'agit pas comme un serveur STUN/TURN.

La signalisation WebRTC fait partie de bext-realtime. Aucun indicateur de fonctionnalité supplémentaire n'est requis au-delà du module temps réel de base.

Comment ça marche#

  1. Les pairs se connectent à bext via WebSocket (ou SSE).
  2. Ils rejoignent une salle de signalisation par leur nom.
  3. bext relaie les messages SDP et ICE entre pairs dans la pièce.
  4. Une fois que les pairs échangent suffisamment d’informations, ils se connectent directement (P2P).
  5. bext ne se trouve plus dans le chemin de données.
code
   Peer A ──ws──▶ bext ◀──ws── Peer B
      │                          │
      └──── direct P2P ─────────┘

Salles de signalisation#

Les chambres isolent le trafic de signalisation. Une salle est créée lorsque le premier pair rejoint et détruite lorsque le dernier pair part.

javascript
const ws = new WebSocket("wss://example.com/__bext/rtc/room-42");

ws.onmessage = (e) => {
  const msg = JSON.parse(e.data);
  switch (msg.type) {
    case "PeerJoined":
      startOffer(msg.peerId);
      break;
    case "Offer":
      handleOffer(msg.peerId, msg.sdp);
      break;
    case "Answer":
      handleAnswer(msg.peerId, msg.sdp);
      break;
    case "IceCandidate":
      addCandidate(msg.peerId, msg.candidate);
      break;
    case "PeerLeft":
      removePeer(msg.peerId);
      break;
  }
};

Les noms de salles sont des chaînes arbitraires. Utilisez-les pour étendre la signalisation à un appel, à un lobby de jeu ou à une session de transfert de fichiers.

Types de messages#

Tous les messages sont au format JSON avec un champ type :

Rejoint par les pairs#

Envoyé aux pairs existants lorsqu’un nouveau pair entre dans la salle.

json
{
  "type": "PeerJoined",
  "peerId": "abc-123",
  "metadata": { "name": "Alice" }
}

Offre#

Une offre SDP transmise d’un homologue à un autre.

json
{
  "type": "Offer",
  "peerId": "abc-123",
  "targetPeerId": "def-456",
  "sdp": "v=0\r\no=- ..."
}

Répondre#

Une réponse SDP en réponse à une offre.

json
{
  "type": "Answer",
  "peerId": "def-456",
  "targetPeerId": "abc-123",
  "sdp": "v=0\r\no=- ..."
}

Candidat à la glace#

Un filet de candidat ICE relayé entre pairs.

json
{
  "type": "IceCandidate",
  "peerId": "abc-123",
  "targetPeerId": "def-456",
  "candidate": {
    "candidate": "candidate:1 1 UDP ...",
    "sdpMLineIndex": 0,
    "sdpMid": "0"
  }
}

PairGauche#

Envoyé aux pairs restants lorsque quelqu'un se déconnecte.

json
{
  "type": "PeerLeft",
  "peerId": "abc-123"
}

Configuration#

toml
[realtime.signaling]
enabled = true
max_room_size = 50
room_idle_timeout_secs = 300
Champ Défaut Description
max_room_size 50 Nombre maximum de pairs par salle.
room_idle_timeout_secs 300 Détruisez la pièce après cette durée d'inactivité.

Pas d'étourdissement/retour#

bext achemine uniquement les messages de signalisation. Il n'implémente pas les serveurs STUN ou TURN. Pour les homologues derrière des NAT symétriques, vous avez besoin d'un serveur TURN externe. Dirigez les clients vers ce dernier dans la configuration RTCPeerConnection :

javascript
const pc = new RTCPeerConnection({
  iceServers: [
    { urls: "stun:stun.example.com:3478" },
    { urls: "turn:turn.example.com:3478", username: "u", credential: "p" },
  ],
});

Cas d'utilisation#

  • Appels vocaux et vidéo — échangez SDP contre des pistes multimédias, puis diffusez en streaming directement entre les navigateurs.
  • Transfert de fichiers — négociez un DataChannel, transférez des fichiers P2P sans coût de la bande passante du serveur.
  • Jeux multijoueurs — DataChannels pour une synchronisation de l'état du jeu à faible latence entre joueurs.
  • Partage d'écran — ajoutez une piste de capture d'écran à un homologue existant connexion.

Authentification#

Les connexions de signalisation WebSocket passent par le middleware d'authentification standard de bext. Exiger une authentification sur le point de terminaison de signalisation pour empêcher tout accès non autorisé à la salle :

toml
[[routes]]
path = "/__bext/rtc/*"
auth = "required"

Les métadonnées des pairs (comme le nom d'affichage) sont jointes lors de la jointure et transférées dans Messages PeerJoined permettant aux autres pairs d'identifier qui se trouve dans la pièce.

Métrique#

Métrique Description
rtc_signaling_rooms_active Chambres actuellement actives.
rtc_signaling_peers_connected Nombre total de pairs connectés.
rtc_signaling_messages_relayed Messages relayés entre pairs.
Remarque

bext gère uniquement la signalisation – échange SDP et ICE. Il ne relaie pas les médias. Les homologues derrière des NAT symétriques qui ne peuvent pas former un chemin P2P direct ont besoin d'un serveur TURN externe ; sans cela, ces appels échoueront silencieusement à se connecter une fois la phase de signalisation terminée avec succès.

Conseil

Protéger les salles de signalisation avec authentification ( auth = "required" sur le /__bext/rtc/*). Les points de terminaison de signalisation non authentifiés permettent à n'importe quel client de rejoindre n'importe quelle salle en devinant son nom.

En rapport#

Modifier cette page ↗Besoin d’aide ? ↗
Rechercher dans la documentation

Saisissez un sujet, une commande ou une question.