der_fenix
der_fenix

Reputation: 241

Webrtc setRemoteDescription don't work for caller

Part of code looks like this:

if (message.type === 'offer') {
    console.log("got offer");
    console.log(message);
    pc.setRemoteDescription(new SessionDescription(message));
    console.log(pc);
    createAnswer();
}
else if (message.type === 'answer') {
    console.log("got answer");
    console.log(message);
    pc.setRemoteDescription(new SessionDescription(message));
    console.log(pc);
}

Calee sets remote description successfully, pc.remoteDescription is filled. But caller... Receives the same message as callee but after pc.setRemoteDescription(new SessionDescription(message)); got pc.remoteDescription empty and noting happens. Callee ready to receive stream, but caller gets stucked.

Upvotes: 1

Views: 1897

Answers (1)

mido
mido

Reputation: 25054

I think the issue is because either setRemoteDescription is failing, or there is a race condition between that and createAnswer, so add it inside success callback and for clarity, add an error callback too...

something like:

if (message.type === 'offer') {
    console.log("got offer");
    console.log(message);
    pc.setRemoteDescription(new SessionDescription(message), function(){
        console.log(pc);
        createAnswer();
    }, console.error.bind(console));
}
else if (message.type === 'answer') {
    console.log("got answer");
    console.log(message);
    pc.setRemoteDescription(new SessionDescription(message), console.log.bind(console, 'success'), console.error.bind(console));
}

if Promise and ES6 are supported:

if (message.type === 'offer') {
    console.log("got offer");
    console.log(message);
    pc.setRemoteDescription(new SessionDescription(message))
      .then(() =>{
        console.log('success...', pc);
        createAnswer();            
      }).catch(e => console.error(e));
}
else if (message.type === 'answer') {
    console.log("got answer");
    console.log(message);
    pc.setRemoteDescription(new SessionDescription(message))
      .then(() => console.log('success...', pc))
      .catch(e => console.error(e));
}

Upvotes: 3

Related Questions