@historydev
Острая аллергия на анимешников

Как настроить мой первый webRTC?

Здравствуйте! Пытаюсь разобраться с 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 раз в секунду, но нет - результата не было.

Буду благодарен за любую помощь!
  • Вопрос задан
  • 224 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы