Estoy usando WebRTC para intentar conectar dos usuarios. Llamo a createOffer y luego configuro la descripción local de la conexión entre pares usando lo que devuelve createOffer. No sé por qué me sale el siguiente error:
Nota: estoy usando firebase firestore como servidor de señalización
No capturado (en promesa) DOMException: no se puede establecer una oferta local cuando no se ha llamado a createOffer.
Aquí está mi código:
async function preformSignaling() { let users = await negDoc.collection("users").get(); let newPeerConnection; users.forEach(async (doc) => { if (isNotAlreadyConnected(doc.id)) { newPeerConnection = new UserConnection(servers, doc.id); if (doc.id != sessionStorage.getItem("userID") && doc.id != "metadata") { let connOfferDescription = await newPeerConnection.userPeerConnection.createOffer(); await newPeerConnection.userPeerConnection.setLocalDescription( connOfferDescription ); await doc.collection("offer-candidates").doc("offer").set({ offer: newPeerConnection.userPeerConnection.localDescription, }); } peerConnections.push(newPeerConnection); } }); } class UserConnection { constructor(servers, remoteUserID) { this.userPeerConnection = new RTCPeerConnection(servers); this.remoteStream = new MediaStream(); this.remoteUserID = remoteUserID; } getRemoteUserID() { return this.remoteUserID; } }Estoy dando un poco de puñalada ciega aquí, pero usar async-await en un forEach (o mapa, filtro, reducción, etc.) es un problema común. Básicamente, solo dispara un montón de llamadas asíncronas.
No esperará a que termine lo que está sucediendo en esa devolución de llamada antes de disparar la siguiente. Las partes internas de forEach tendrían que esperar la devolución de llamada y la devolución de llamada debe devolver una promesa.
Debido a que ha let newPeerConnection fuera del ciclo, probablemente esté escribiendo esa variable varias veces antes de que finalice cualquiera de las llamadas a createOffer .
Podría traer esa variable dentro del ciclo si ninguna de estas llamadas simultáneas se afectará entre sí. De lo contrario, solo use un bucle for-of si desea ejecutarlos uno por uno. Eso podría ser algo como esto:
async function preformSignaling() { let users = await negDoc.collection('users').get(); let newPeerConnection; for (let doc of users) { if (!isNotAlreadyConnected(doc.id)) continue; newPeerConnection = new UserConnection(servers, doc.id); if ( doc.id !== sessionStorage.getItem('userID') && doc.id !== 'metadata' ) { let connOfferDescription = await newPeerConnection.userPeerConnection.createOffer(); await newPeerConnection.userPeerConnection.setLocalDescription( connOfferDescription ); await doc.collection('offer-candidates').doc('offer').set({ offer: newPeerConnection.userPeerConnection.localDescription, }); } peerConnections.push(newPeerConnection); } }Tenga en cuenta un par de cambios menores allí para mejores prácticas: !== no !=, y verifique el inverso del bool y continúe temprano para evitar la pirámide de la perdición.