3

I am trying to create a node+socket.io+express+peerjs application for voice chat.

The problem I am facing is that I cannot access the stream of the connected peer since the call.on("stream") is not firing for some reason. I have tried to manipulate the .on events, but I'm still not able to get it to work. It's not giving me any errors. I am new to peerjs so any help is appreciated a lot, I already spent countless hours trying to fix this.

Client-side call creation and connection:

if(peerid!=-1 && peer){
    if(!window.localStream){
        window.localStream=new MediaStream();
    }
    
    //peer.listAllPeers((peers) => {
    //    console.log(peers);
    //});
    peerConn = peer.connect(peerid);

    peerConn.on("open", ()=>{
        // THIS IS FIRING
        call = peer.call(peerid, window.localStream);
        console.log("Connecting to: "+ peerid);

        call.on("stream", (stream)=>{
            // THIS IS NOT FIRING
            console.log("STEAMING CALLER");
        });

        call.on("error", function (err) {
            console.error(err);
        });
    });
}

Client side answer call:

peer.on('connection', function(connection){
    peerConn=connection;
});

peer.on('call', (incoming) => {
    // THIS IS FIRING
    if(!window.localStream){
        window.localStream=new MediaStream();
    }

    console.log('Answering incoming call from ' + incoming.peer);
    incoming.answer(window.localStream);

    incoming.on("stream", (stream) => {
        // THIS IS NOT FIRING
        console.log("STREAMING CALLEE");
    });

    incoming.on("error", (err) => {
        console.log(err);
    });

});

Thank you in advance for your help!

I tried to catch errors using the call.on("error"), no errors are thrown. I also tried inserting the call events inside different .on functions since I thought it was due to perhaps the call being answered before the connection was made, to no avail. The result is always the same: peer.on("call") fires but "stream" does not. I cannot for the life of me figure out this behaviour.

Update: after a lot of messing about, I found a solution, which is changing the call creation code to the following:

peerConn.on("open", ()=>{
    if(microphone&&peerMicrophone){
        setTimeout(function temp() {
            try {
                getLocalStream();

                call = peer.call(peerid, window.localStream);

                call.on("stream", (stream)=>{
                    window.remoteAudio.srcObject = stream;
                    window.remoteAudio.autoplay = true;
                    window.peerStream = stream;

                    addMessage(11);
                    console.log("Connecting asdato: "+ peerid);
                });
    
                call.on("error", function (err) {
                    console.error(err);
                });
            } catch (error) {
                setTimeout(temp, 20);
            }
        }, 10);
    } else {
        addMessage(12);
        peerConn.send("vc_unavailable");
    }
});

I dont really understand why I needed to add a timeout there, and I got it through pure trial and error. Is there perhaps a more elegant solution to the problem?

Ivan Griga
  • 33
  • 4

0 Answers0