Volver a la wiki

Tabla D1: webrtc_signaling — Canal de señalización WebRTC

Descripción

Tabla D1 (SQLite edge) creada en la migración 0035_webrtc_signaling.sql (s79, 22-05-2026). Almacena los mensajes de señalización efímeros que los browsers del workspace necesitan intercambiar para negociar conexiones WebRTC peer-to-peer.

Diseño para volatilidad: los mensajes tienen un TTL de 60 segundos. Una vez que dos peers han negociado su conexión (offer → answer → ICE), los mensajes ya no son necesarios. El cleanup se hace de forma inline en cada GET del endpoint, sin cron ni Worker dedicado.


Schema

CREATE TABLE IF NOT EXISTS webrtc_signaling (
  id          INTEGER PRIMARY KEY AUTOINCREMENT,
  room        TEXT    NOT NULL,
  from_peer   TEXT    NOT NULL,
  from_name   TEXT,
  to_peer     TEXT,
  kind        TEXT    NOT NULL CHECK (kind IN ('peer_joined','peer_left','offer','answer','ice')),
  payload     TEXT    NOT NULL DEFAULT '{}',
  created_at  TEXT    DEFAULT (datetime('now'))
);

Columnas

ColumnaTipoNullableDescripción
idINTEGER PK AUTOINCREMENTNoUsado como cursor para paginación pull-incremental (since=ID)
roomTEXTNoIdentificador de la sala de reuniones
from_peerTEXTNoID único del peer emisor (generado en cliente)
from_nameTEXTSíNombre del TeamMember (Edu/Dani/Txell). Validado contra CF Access.
to_peerTEXTSíPeer destino. NULL = broadcast (peer_joined/peer_left)
kindTEXT CHECKNoTipo de señal. Ver enum abajo.
payloadTEXT (JSON)NoSDP, ICE candidate, o {} para presencia
created_atTEXT (datetime)No (default now)Timestamp UTC para TTL cleanup

Enum kind

Valorto_peerDescripción
peer_joinedNULLBroadcast: un peer entró a la sala. Invita a otros a iniciar offer.
peer_leftNULLBroadcast: un peer salió. Los demás cierran su RTCPeerConnection.
offerpeer IDSDP offer dirigido a un peer específico (initiator → responder)
answerpeer IDSDP answer dirigido al initiator
icepeer IDICE candidate para completar la negociación de conectividad

Lógica initiator: el peer con ID lexicográficamente menor actúa como initiator (envía el offer). Esto evita el “glare” (ambos enviando offer simultáneamente).


Índices

CREATE INDEX idx_webrtc_room_created ON webrtc_signaling(room, created_at);
CREATE INDEX idx_webrtc_to_peer      ON webrtc_signaling(to_peer, created_at);

TTL y cleanup

DELETE FROM webrtc_signaling
WHERE created_at < datetime('now', '-60 seconds')

Ejecutado inline en cada GET y POST de /api/webrtc/signal. No hay cron ni Durable Object dedicado. El volumen es muy bajo (máx. 3 peers × ~10 mensajes/negociación = ~30 rows por sesión, todas borradas en 60s).


Migración


Volumen esperado

En condiciones normales (3 peers, 1 sala):

Véase también

Subir