From bde02fe250a4dd22e83cd6b7fa0e178846573040 Mon Sep 17 00:00:00 2001 From: Sergiu Toma Date: Tue, 21 Feb 2023 02:41:48 +0200 Subject: [PATCH] LH-276: Add close-producer event handler; Update client --- app.js | 206 +++++++++++++++++------------------------------ public/bundle.js | 17 ++-- public/config.js | 2 +- public/index.js | 15 ++-- 4 files changed, 95 insertions(+), 145 deletions(-) diff --git a/app.js b/app.js index 7e97cec..e99d904 100644 --- a/app.js +++ b/app.js @@ -76,7 +76,7 @@ const createWorker = async () => { }); return worker; } catch (error) { - console.log(`ERROR | createWorker | ${error.message}`); + console.error(`[createWorker] | ERROR | error: ${error.message}`); } }; @@ -148,11 +148,10 @@ const closeCall = (callId) => { videoCalls[callId]?.receiverProducerTransport?.close(); videoCalls[callId]?.router?.close(); delete videoCalls[callId]; - } else { - console.log(`The call with id ${callId} has already been deleted`); + console.log(`[closeCall] | callId: ${callId}`); } } catch (error) { - console.log(`ERROR | closeCall | callid ${callId} | ${error.message}`); + console.error(`[closeCall] | ERROR | callId: ${callId} | error: ${error.message}`); } }; @@ -189,22 +188,21 @@ peers.on('connection', async (socket) => { console.log(`[createRoom] socket.id ${socket.id} callId ${callId}`); if (!videoCalls[callId]) { videoCalls[callId] = { router: await worker.createRouter({ mediaCodecs }) }; - console.log(`[createRoom] Router ID: ${videoCalls[callId].router.id}`); + console.log(`[createRoom] Generate Router ID: ${videoCalls[callId].router.id}`); videoCalls[callId].receiverSocket = socket; } else { videoCalls[callId].initiatorSocket = socket; } socketDetails[socket.id] = callId; // rtpCapabilities is set for callback - console.log('[getRtpCapabilities] callId', callId); callbackResponse = { rtpCapabilities: videoCalls[callId].router.rtpCapabilities, }; } else { - console.log(`[createRoom] missing callId ${callId}`); + console.log(`[createRoom] missing callId: ${callId}`); } } catch (error) { - console.log(`ERROR | createRoom | callId ${callId} | ${error.message}`); + console.error(`[createRoom] | ERROR | callId: ${callId} | error: ${error.message}`); } finally { callback(callbackResponse); } @@ -239,9 +237,7 @@ peers.on('connection', async (socket) => { } } } catch (error) { - console.log( - `ERROR | createWebRtcTransport | callId ${socketDetails[socket.id]} | sender ${sender} | ${error.message}` - ); + console.error(`[createWebRtcTransport] | ERROR | callId: ${socketDetails[socket.id]} | sender: ${sender} | error: ${error.message}`); callback(error); } }); @@ -261,7 +257,7 @@ peers.on('connection', async (socket) => { ? await videoCalls[callId].initiatorProducerTransport.connect({ dtlsParameters }) : await videoCalls[callId].receiverProducerTransport.connect({ dtlsParameters }); } catch (error) { - console.log(`ERROR | transport-connect | callId ${socketDetails[socket.id]} | ${error.message}`); + console.error(`[transport-connect] | ERROR | callId: ${socketDetails[socket.id]} | error: ${error.message}`); } }); @@ -275,7 +271,7 @@ peers.on('connection', async (socket) => { const callId = socketDetails[socket.id]; if (typeof rtpParameters === 'string') rtpParameters = JSON.parse(rtpParameters); - console.log(`[transport-produce] kind: ${kind} | socket: ${socket.id} | callId: ${callId}`); + console.log(`[transport-produce] callId: ${callId} | kind: ${kind} | socket: ${socket.id}`); if (kind === 'video') { if (!isInitiator(callId, socket.id)) { @@ -284,12 +280,7 @@ peers.on('connection', async (socket) => { rtpParameters, }); - console.log( - `[transport-produce] receiverVideoProducer Producer ID: ${videoCalls[callId].receiverVideoProducer.id} | kind: ${videoCalls[callId].receiverVideoProducer.kind}` - ); - videoCalls[callId].receiverVideoProducer.on('transportclose', () => { - const callId = socketDetails[socket.id]; console.log('transport for this producer closed', callId); closeCall(callId); }); @@ -305,12 +296,7 @@ peers.on('connection', async (socket) => { rtpParameters, }); - console.log( - `[transport-produce] initiatorVideoProducer Producer ID: ${videoCalls[callId].initiatorVideoProducer.id} | kind: ${videoCalls[callId].initiatorVideoProducer.kind}` - ); - videoCalls[callId].initiatorVideoProducer.on('transportclose', () => { - const callId = socketDetails[socket.id]; console.log('transport for this producer closed', callId); closeCall(callId); }); @@ -327,12 +313,7 @@ peers.on('connection', async (socket) => { rtpParameters, }); - console.log( - `[transport-produce] receiverAudioProducer Producer ID: ${videoCalls[callId].receiverAudioProducer.id} | kind: ${videoCalls[callId].receiverAudioProducer.kind}` - ); - videoCalls[callId].receiverAudioProducer.on('transportclose', () => { - const callId = socketDetails[socket.id]; console.log('transport for this producer closed', callId); closeCall(callId); }); @@ -348,12 +329,7 @@ peers.on('connection', async (socket) => { rtpParameters, }); - console.log( - `[transport-produce] initiatorAudioProducer Producer ID: ${videoCalls[callId].initiatorAudioProducer.id} | kind: ${videoCalls[callId].initiatorAudioProducer.kind}` - ); - videoCalls[callId].initiatorAudioProducer.on('transportclose', () => { - const callId = socketDetails[socket.id]; console.log('transport for this producer closed', callId); closeCall(callId); }); @@ -372,9 +348,9 @@ peers.on('connection', async (socket) => { // callId - Id of the call // kind - producer type: audio/video - socketToEmit.emit('new-producer', { callId, kind }); + socketToEmit?.emit('new-producer', { callId, kind }); } catch (error) { - console.log(`ERROR | transport-produce | callId ${socketDetails[socket.id]} | ${error.message}`); + console.error(`[transport-produce] | ERROR | callId: ${socketDetails[socket.id]} | error: ${error.message}`); } }); @@ -394,7 +370,7 @@ peers.on('connection', async (socket) => { await videoCalls[callId].initiatorConsumerTransport.connect({ dtlsParameters }); } } catch (error) { - console.log(`ERROR | transport-recv-connect | callId ${socketDetails[socket.id]} | ${error.message}`); + console.error(`[transport-recv-connect] | ERROR | callId: ${socketDetails[socket.id]} | error: ${error.message}`); } }); @@ -408,44 +384,44 @@ peers.on('connection', async (socket) => { socket.on('consume', async ({ rtpCapabilities }, callback) => { try { const callId = socketDetails[socket.id]; - console.log( - `[consume] socket ${socket.id} | callId ${callId} | rtpCapabilities: ${JSON.stringify(rtpCapabilities)}` - ); if (typeof rtpCapabilities === 'string') rtpCapabilities = JSON.parse(rtpCapabilities); - console.log('[consume] callId', callId); let canConsumeVideo, canConsumeAudio; - if (isInitiator(callId, socket.id)) { - canConsumeVideo = - !!videoCalls[callId].receiverVideoProducer && - !!videoCalls[callId].router.canConsume({ - producerId: videoCalls[callId].receiverVideoProducer.id, - rtpCapabilities, - }); - canConsumeAudio = - !!videoCalls[callId].receiverAudioProducer && - !!videoCalls[callId].router.canConsume({ - producerId: videoCalls[callId].receiverAudioProducer.id, - rtpCapabilities, - }); - } else { - canConsumeVideo = - !!videoCalls[callId].initiatorVideoProducer && - !!videoCalls[callId].router.canConsume({ - producerId: videoCalls[callId].initiatorVideoProducer.id, - rtpCapabilities, - }); - - canConsumeAudio = - !!videoCalls[callId].initiatorAudioProducer && - !!videoCalls[callId].router.canConsume({ - producerId: videoCalls[callId].initiatorAudioProducer.id, - rtpCapabilities, - }); + try { + if (isInitiator(callId, socket.id)) { + canConsumeVideo = + !!videoCalls[callId].receiverVideoProducer && + !!videoCalls[callId].router.canConsume({ + producerId: videoCalls[callId].receiverVideoProducer.id, + rtpCapabilities, + }); + canConsumeAudio = + !!videoCalls[callId].receiverAudioProducer && + !!videoCalls[callId].router.canConsume({ + producerId: videoCalls[callId].receiverAudioProducer.id, + rtpCapabilities, + }); + } else { + canConsumeVideo = + !!videoCalls[callId].initiatorVideoProducer && + !!videoCalls[callId].router.canConsume({ + producerId: videoCalls[callId].initiatorVideoProducer.id, + rtpCapabilities, + }); + + canConsumeAudio = + !!videoCalls[callId].initiatorAudioProducer && + !!videoCalls[callId].router.canConsume({ + producerId: videoCalls[callId].initiatorAudioProducer.id, + rtpCapabilities, + }); + } + } catch (error) { + console.error(`[consume] | ERROR | callId: ${callId} | error: ${error.message}`); } - console.log('[consume] canConsumeVideo', canConsumeVideo); - console.log('[consume] canConsumeAudio', canConsumeAudio); + + console.log(`[consume] socket ${socket.id} | callId: ${callId} | canConsumeVideo: ${canConsumeVideo} | canConsumeAudio: ${canConsumeAudio}`); if (canConsumeVideo && !canConsumeAudio) { const videoParams = await consumeVideo(callId, socket.id, rtpCapabilities); @@ -463,7 +439,7 @@ peers.on('connection', async (socket) => { callback(null); } } catch (error) { - console.log(`ERROR | consume | callId ${socketDetails[socket.id]} | ${error.message}`); + console.error(`[consume] | ERROR | callId: ${socketDetails[socket.id]} | error: ${error.message}`); callback({ params: { error } }); } }); @@ -473,24 +449,41 @@ peers.on('connection', async (socket) => { - When consuming on consumerTransport, it is initially done with paused: true, here we will resume - For the initiator we resume the initiatorConsumerAUDIO/VIDEO and for receiver the receiverConsumerAUDIO/VIDEO */ - socket.on('consumer-resume', () => { + socket.on('consumer-resume', () => { + try { + const callId = socketDetails[socket.id]; + const isInitiatorValue = isInitiator(callId, socket.id); + console.log(`[consumer-resume] callId: ${callId} | isInitiator: ${isInitiatorValue}`); + if (isInitiatorValue) { + videoCalls[callId].initiatorConsumerVideo && videoCalls[callId].initiatorConsumerVideo.resume(); + videoCalls[callId].initiatorConsumerAudio && videoCalls[callId].initiatorConsumerAudio.resume(); + } else { + videoCalls[callId].receiverConsumerVideo && videoCalls[callId].receiverConsumerVideo.resume(); + videoCalls[callId].receiverConsumerAudio && videoCalls[callId].receiverConsumerAudio.resume(); + } + } catch (error) { + console.error(`[consumer-resume] | ERROR | callId: ${socketDetails[socket.id]} | isInitiator: ${isInitiator} | error: ${error.message}`); + } + }); + + socket.on('close-producer', ({ callId, kind}) => { try { - const callId = socketDetails[socket.id]; - console.log(`[consumer-resume] callId ${callId}`); if (isInitiator(callId, socket.id)) { - videoCalls[callId]?.initiatorConsumerVideo?.resume(); - videoCalls[callId]?.initiatorConsumerAudio?.resume(); + console.log(`[close-producer] initiator --EMIT--> receiver | callId: ${callId} | kind: ${kind}`); + videoCalls[callId].receiverSocket.emit('close-producer', { callId, kind }); } else { - videoCalls[callId]?.receiverConsumerVideo?.resume(); - videoCalls[callId]?.receiverConsumerAudio?.resume(); + console.log(`[close-producer] receiver --EMIT--> initiator | callId: ${callId} | kind: ${kind}`); + videoCalls[callId].initiatorSocket.emit('close-producer', { callId, kind }); } } catch (error) { - console.log(`ERROR | consumer-resume | callId ${socketDetails[socket.id]} | ${error.message}`); + console.error(`[close-producer] | ERROR | callId: ${socketDetails[socket.id]} | error: ${error.message}`); } }); + }); const consumeVideo = async (callId, socketId, rtpCapabilities) => { + // Handlers for transports https://mediasoup.org/documentation/v3/mediasoup/api/#consumer-on-transportclose if (isInitiator(callId, socketId)) { videoCalls[callId].initiatorConsumerVideo = await videoCalls[callId].initiatorConsumerTransport.consume({ producerId: videoCalls[callId].receiverVideoProducer.id, @@ -498,20 +491,6 @@ const consumeVideo = async (callId, socketId, rtpCapabilities) => { paused: true, }); - // https://mediasoup.org/documentation/v3/mediasoup/api/#consumer-on-transportclose - videoCalls[callId].initiatorConsumerVideo.on('transportclose', () => { - const callId = socketDetails[socket.id]; - console.log('transport close from consumer', callId); - closeCall(callId); - }); - - // https://mediasoup.org/documentation/v3/mediasoup/api/#consumer-on-producerclose - videoCalls[callId].initiatorConsumerVideo.on('producerclose', () => { - const callId = socketDetails[socket.id]; - console.log('producer of consumer closed', callId); - closeCall(callId); - }); - return { id: videoCalls[callId].initiatorConsumerVideo.id, producerId: videoCalls[callId].receiverVideoProducer.id, @@ -525,18 +504,6 @@ const consumeVideo = async (callId, socketId, rtpCapabilities) => { paused: true, }); - videoCalls[callId].receiverConsumerVideo.on('transportclose', () => { - const callId = socketDetails[socket.id]; - console.log('transport close from consumer', callId); - closeCall(callId); - }); - - videoCalls[callId].receiverConsumerVideo.on('producerclose', () => { - const callId = socketDetails[socket.id]; - console.log('producer of consumer closed', callId); - closeCall(callId); - }); - return { id: videoCalls[callId].receiverConsumerVideo.id, producerId: videoCalls[callId].initiatorVideoProducer.id, @@ -554,20 +521,6 @@ const consumeAudio = async (callId, socketId, rtpCapabilities) => { paused: true, }); - // https://mediasoup.org/documentation/v3/mediasoup/api/#consumer-on-transportclose - videoCalls[callId].initiatorConsumerAudio.on('transportclose', () => { - const callId = socketDetails[socket.id]; - console.log('transport close from consumer', callId); - closeCall(callId); - }); - - // https://mediasoup.org/documentation/v3/mediasoup/api/#consumer-on-producerclose - videoCalls[callId].initiatorConsumerAudio.on('producerclose', () => { - const callId = socketDetails[socket.id]; - console.log('producer of consumer closed', callId); - closeCall(callId); - }); - return { id: videoCalls[callId].initiatorConsumerAudio.id, producerId: videoCalls[callId].receiverAudioProducer.id, @@ -581,18 +534,6 @@ const consumeAudio = async (callId, socketId, rtpCapabilities) => { paused: true, }); - videoCalls[callId].receiverConsumerAudio.on('transportclose', () => { - const callId = socketDetails[socket.id]; - console.log('transport close from consumer', callId); - closeCall(callId); - }); - - videoCalls[callId].receiverConsumerAudio.on('producerclose', () => { - const callId = socketDetails[socket.id]; - console.log('producer of consumer closed', callId); - closeCall(callId); - }); - return { id: videoCalls[callId].receiverConsumerAudio.id, producerId: videoCalls[callId].initiatorAudioProducer.id, @@ -615,7 +556,7 @@ const isInitiator = (callId, socketId) => { */ const createWebRtcTransportLayer = async (callId, callback) => { try { - console.log('[createWebRtcTransportLayer] callId', callId); + console.log(`[createWebRtcTransportLayer] callId: ${callId}`); // https://mediasoup.org/documentation/v3/mediasoup/api/#WebRtcTransportOptions const webRtcTransport_options = { listenIps: [ @@ -652,14 +593,13 @@ const createWebRtcTransportLayer = async (callId, callback) => { dtlsParameters: transport.dtlsParameters, }; - console.log('[createWebRtcTransportLayer] callback params', params); // Send back to the client the params callback({ params }); // Set transport to producerTransport or consumerTransport return transport; } catch (error) { - console.log(`ERROR | createWebRtcTransportLayer | callId ${socketDetails[socket.id]} | ${error.message}`); + console.error(`[createWebRtcTransportLayer] | ERROR | callId: ${socketDetails[socket.id]} | error: ${error.message}`); callback({ params: { error } }); } }; diff --git a/public/bundle.js b/public/bundle.js index ee7b33e..a2b43cb 100644 --- a/public/bundle.js +++ b/public/bundle.js @@ -20353,7 +20353,7 @@ module.exports = yeast; },{}],94:[function(require,module,exports){ module.exports = { hubAddress: 'https://hub.dev.linx.safemobile.com/', - mediasoupAddress: 'https://video.safemobile.org/', + mediasoupAddress: 'https://testing.video.safemobile.org/', } },{}],95:[function(require,module,exports){ const io = require('socket.io-client') @@ -20457,6 +20457,15 @@ setTimeout(() => { console.log(`🟢 new-producer | callId: ${callId} | kind: ${kind} | Ready to consume`); connectRecvTransport(); }) + + socket.on('close-producer', ({ callId, kind }) => { + console.log(`🔴 close-producer | callId: ${callId} | kind: ${kind}`); + if (kind === 'video') { + consumerVideo.close() + remoteVideo.srcObject = null + } + else if (kind === 'audio') consumerAudio.close() + }) } if (IS_PRODUCER === true) { @@ -20833,7 +20842,7 @@ const connectRecvTransport = async () => { console.log('remoteVideo PLAY') }) .catch((error) => { - displayError(`remoteVideo PLAY ERROR | ${error.message}`) + console.error(`remoteVideo PLAY ERROR | ${error.message}`) }) }) } @@ -20846,10 +20855,6 @@ const getVideoTrask = async (videoParams) => { rtpParameters: videoParams.rtpParameters }) - consumerVideo.on('transportclose', () => { - console.log('transport closed so consumer closed') - }) - return consumerVideo.track } diff --git a/public/config.js b/public/config.js index 4d1b6a4..233f24c 100644 --- a/public/config.js +++ b/public/config.js @@ -1,4 +1,4 @@ module.exports = { hubAddress: 'https://hub.dev.linx.safemobile.com/', - mediasoupAddress: 'https://video.safemobile.org/', + mediasoupAddress: 'https://testing.video.safemobile.org/', } \ No newline at end of file diff --git a/public/index.js b/public/index.js index 0fdb4f0..06625c0 100644 --- a/public/index.js +++ b/public/index.js @@ -99,6 +99,15 @@ setTimeout(() => { console.log(`🟢 new-producer | callId: ${callId} | kind: ${kind} | Ready to consume`); connectRecvTransport(); }) + + socket.on('close-producer', ({ callId, kind }) => { + console.log(`🔴 close-producer | callId: ${callId} | kind: ${kind}`); + if (kind === 'video') { + consumerVideo.close() + remoteVideo.srcObject = null + } + else if (kind === 'audio') consumerAudio.close() + }) } if (IS_PRODUCER === true) { @@ -475,7 +484,7 @@ const connectRecvTransport = async () => { console.log('remoteVideo PLAY') }) .catch((error) => { - displayError(`remoteVideo PLAY ERROR | ${error.message}`) + console.error(`remoteVideo PLAY ERROR | ${error.message}`) }) }) } @@ -488,10 +497,6 @@ const getVideoTrask = async (videoParams) => { rtpParameters: videoParams.rtpParameters }) - consumerVideo.on('transportclose', () => { - console.log('transport closed so consumer closed') - }) - return consumerVideo.track }