Здравствуйте! Пытаюсь разобраться с webrtc. Прошёл по
гайду от гугла, сделал всё вроде как там, не могу утверждать и получаю следующую ошибку:
OMException: Failed to execute 'setRemoteDescription' on 'RTCPeerConnection': Failed to set remote answer sdp: Called in wrong state: stable
Я создал сервер как канал для сигналов на node.js + socket.io:
const httpServer = require("http").createServer();
const io = require('socket.io')(httpServer, {
cors: {
origin: '*'
}
});
io.on('connection', socket => {
console.log(socket.id, ' connected')
socket.on('message', msg => {
console.log(msg);
socket.emit('response', msg);
})
});
httpServer.listen(4000, () => {
console.log('Server started on port 4000');
});
И вот такая функция у меня получилась после
гайда от гугла:
import { io } from "https://cdn.socket.io/4.3.2/socket.io.esm.min.js";
const socket = io('http://localhost:4000');
async function makeCall() {
const configuration = {'iceServers': [{'urls': 'stun:stun.l.google.com:19302'}]}
const peerConnection = new RTCPeerConnection(configuration);
socket.on('response', async message => {
console.log(message);
console.log();
if (message.answer) {
try {
const remoteDesc = new RTCSessionDescription(message.answer);
await peerConnection.setRemoteDescription(remoteDesc);
if(peerConnection.signalingState !== 'stable') {
const remoteDesc = new RTCSessionDescription(message.answer);
await peerConnection.setRemoteDescription(remoteDesc);
}
} catch (e) {
console.error('Answer error', e)
}
}
if (message.offer) {
try {
await peerConnection.setRemoteDescription(new RTCSessionDescription(message.offer));
const answer = await peerConnection.createAnswer();
await peerConnection.setLocalDescription(answer);
socket.emit('message', {'answer': answer});
} catch (e) {
console.error('Offer error', e)
}
}
if (message.iceCandidate) {
try {
await peerConnection.addIceCandidate(message.iceCandidate);
} catch (e) {
console.error('Error adding received ice candidate', e);
}
}
});
peerConnection.addEventListener('icecandidate', event => {
if (event.candidate) {
socket.emit('message', {iceCandidate: event.candidate});
}
});
peerConnection.addEventListener('connectionstatechange', event => {
console.log('PeerState: ', peerConnection.connectionState)
if (peerConnection.connectionState === 'connected') {
console.log('Peer connected')
}
});
const offer = await peerConnection.createOffer();
await peerConnection.setLocalDescription(offer);
socket.emit('message', {'offer': offer});
}
makeCall().then();
Я погуглил эту ошибку, но внятного решения никто не дал, единственное что убрало ошибку но вряд-ли проблему, я добавил
if(peerConnection.signalingState !== 'stable')
.
Однако сообщения Peer connected я так и не получил, я подумал возможно оно не успевает и поставил setInterval раз в секунду, но нет - результата не было.
Буду благодарен за любую помощь!