Guillaume Besson
Guillaume Besson

Reputation: 572

Kurento IceConnection not resolving

I'm currently experimenting with Kurento Media Server to rebuild the One2Many example with NodeJS, Socket.io and React but I cannot seem to establish a conenction between the publisher and KMS.

The SDP offer is transmitted to KMS and the answer is transmitted to the client. Every ICECandidates from KMS and the client are transmitted too. The video feedback is showing on the app but nothing is sent to the server and there is no errors. Here's is the chrome://webrtc-internals for my app.

webrtc internal

The example app is perfectly working with the same Kurento server, I checked every line and I'm doing the same calls on the backend and on the frontend. Here's the chrome://webrtc-internals for the example app.

Example webrtc internal

For reference, here's the code I'm using on the backend (the errors checking have been removed for this example but nothing is raising an error when I'm using it):

io.on('connect', (socket) => {
  const socketInfo = {};
  socketInfo.webrtcEndpointCreation = new Promise((resolve, reject) => {
    socketInfo.webrtcEndpointCreationResolve = resolve;
    socketInfo.webrtcEndpointCreationReject = reject;
  });

  socket.on('broadcast', (infos, callback) => {
    kms.client.create('MediaPipeline', (mediaPipelineError, pipeline) => {
      mediaPipeline = pipeline;
      mediaPipeline.create('WebRtcEndpoint', (webRtcEndpointError, webRtcEndpoint) => {
        socketInfo.webRtcEndpoint = webRtcEndpoint;
        presenterWebRtc = webRtcEndpoint;
        socketInfo.webrtcEndpointCreationResolve();
        webRtcEndpoint.on('OnIceCandidate', (event) => {
          socket.emit('iceCandidate',
          new kms.lib.register.complexTypes.IceCandidate(event.candidate));
        });

        webRtcEndpoint.processOffer(infos.sdpOffer, (error, sdpAnswer) => {
          callback(null, sdpAnswer);
        });
        webRtcEndpoint.gatherCandidates();
      });
    });
  });
  socket.on('iceCandidate', (candidate) => {
    socketInfo.webrtcEndpointCreation.then(() => {
      socketInfo.webRtcEndpoint.addIceCandidate(candidate);
    });
  });
});

And this is the client code:

const options = {
  localVideo: document.getElementById('video'),
  onicecandidate: (candidate) => {
    global.socket.emit('iceCandidate', candidate);
  }
};

this.kurentoSocket = new WebRtcPeer.WebRtcPeerSendonly(options, (error) => {
  this.kurentoSocket.generateOffer((err, sdpOffer) => {
    global.socket.on('iceCandidate', (iceCandidate) => {
      this.kurentoSocket.addIceCandidate(iceCandidate);
    });
    global.socket.emit('broadcast', { sdpOffer }, (broadcastErr, sdpAnswer) => {
      this.kurentoSocket.processAnswer(sdpAnswer);
    });
  });
});

Upvotes: 1

Views: 604

Answers (1)

Guillaume Besson
Guillaume Besson

Reputation: 572

I finally found the problem, it was a Backend issue.

I need to create a IceCandidate object with new kms.lib.register.complexTypes.IceCandidate(candidate) from the message sent by the client before adding it. Because of the way promises works, the error was ignored.

Upvotes: 3

Related Questions