let pc = new RTCPeerConnection({...}); let dc = pc.createDataChannel("msg"); dc.onopen = function (e) { console.log("Channel Opened", e); }; dc.onclose = function (e) { console.log("Channel closed"); }; let offer = await pc.createOffer(); await pc.setLocalDescription(offer); socket.emit("offer", JSON.stringify(pc.localDescription)); socket.on("answer", function (sdp) { pc.setRemoteDescription(JSON.parse(sdp)); });
let pc = new RTCPeerConnection({...}); pc.ondatachannel = function (e) { console.log(e); }; socket.on("offer", async function (sdp) { await pc.setRemoteDescription(JSON.parse(sdp)); let ans = await pc.createAnswer(); pc.setLocalDescription(ans); socket.emit("answer", JSON.stringify(ans)); });
Idealmente, se debe disparar el evento ondatachannel
.
¿Alguien puede decirme por qué esto no funciona?
Gracias por adelantado :)
https://github.com/ats1999/RTSP-webRTC/tree/main/webRTC/data-channel
Haz npm i
para instalar las dependencias del lado del servidor.
Nunca intercambia candidatos ICE (es decir, la dirección y el puerto a utilizar) y eso es necesario para establecer una conexión (que a su vez es necesaria para abrir un canal de datos). Tiene un controlador onicecandidate:
pc.onicecandidate = function (e) { if (e.candidate) try { // pc.addIceCandidate(e.candidate); } catch (e) {} log("onicecandidate"); };
pero el intento (comentado) de agregar el candidato a la conexión local es incorrecto. Lo que debe hacer es señalarlo al otro lado a través de algo como
socket.emit("candidate", JSON.stringify(e.candidate));
y luego agréguelo en un controlador para el evento candidate
a lo largo de estas líneas:
socket.on("candidate", async function (candidate) { await pc.addIceCandidate(JSON.parse(candidate)); });