diff --git a/app.js b/app.js index 7e97cec..cf9ddee 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,8 +237,10 @@ 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 +261,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 +275,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 +284,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 +300,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 +317,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 +333,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 +352,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 +374,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}`); } }); @@ -406,66 +386,17 @@ peers.on('connection', async (socket) => { - The consumer does consumerTransport.consume(params) */ socket.on('consume', async ({ rtpCapabilities }, callback) => { - try { - const callId = socketDetails[socket.id]; - console.log( - `[consume] socket ${socket.id} | callId ${callId} | rtpCapabilities: ${JSON.stringify(rtpCapabilities)}` - ); + const callId = socketDetails[socket.id]; + const socketId = socket.id; - if (typeof rtpCapabilities === 'string') rtpCapabilities = JSON.parse(rtpCapabilities); + console.log(`[consume] socket ${socketId} | callId: ${callId}`); - 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, - }); + if (typeof rtpCapabilities === 'string') rtpCapabilities = JSON.parse(rtpCapabilities); - canConsumeAudio = - !!videoCalls[callId].initiatorAudioProducer && - !!videoCalls[callId].router.canConsume({ - producerId: videoCalls[callId].initiatorAudioProducer.id, - rtpCapabilities, - }); - } - console.log('[consume] canConsumeVideo', canConsumeVideo); - console.log('[consume] canConsumeAudio', canConsumeAudio); - - if (canConsumeVideo && !canConsumeAudio) { - const videoParams = await consumeVideo(callId, socket.id, rtpCapabilities); - callback({ videoParams, audioParams: null }); - } else if (canConsumeVideo && canConsumeAudio) { - const videoParams = await consumeVideo(callId, socket.id, rtpCapabilities); - const audioParams = await consumeAudio(callId, socket.id, rtpCapabilities); - callback({ videoParams, audioParams }); - } else if (!canConsumeVideo && canConsumeAudio) { - const audioParams = await consumeAudio(callId, socket.id, rtpCapabilities); - const data = { videoParams: null, audioParams }; - callback(data); - } else { - console.log(`[consume] Can't consume | callId ${callId}`); - callback(null); - } - } catch (error) { - console.log(`ERROR | consume | callId ${socketDetails[socket.id]} | ${error.message}`); - callback({ params: { error } }); - } + callback({ + videoParams: await consumeVideo({ callId, socketId, rtpCapabilities }), + audioParams: await consumeAudio({ callId, socketId, rtpCapabilities }), + }); }); /* @@ -476,129 +407,129 @@ peers.on('connection', async (socket) => { socket.on('consumer-resume', () => { try { const callId = socketDetails[socket.id]; - console.log(`[consumer-resume] callId ${callId}`); + const isInitiatorValue = isInitiator(callId, socket.id); + console.log(`[consumer-resume] callId: ${callId} | isInitiator: ${isInitiatorValue}`); + + const consumerVideo = isInitiatorValue + ? videoCalls[callId].initiatorConsumerVideo + : videoCalls[callId].receiverConsumerVideo; + + const consumerAudio = isInitiatorValue + ? videoCalls[callId].initiatorConsumerAudio + : videoCalls[callId].receiverConsumerAudio; + + consumerVideo?.resume(); + consumerAudio?.resume(); + } catch (error) { + console.error( + `[consumer-resume] | ERROR | callId: ${socketDetails[socket.id]} | isInitiator: ${isInitiator} | error: ${ + error.message + }` + ); + } + }); + + socket.on('close-producer', ({ callId, kind }) => { + try { 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) => { - if (isInitiator(callId, socketId)) { +const canConsume = ({ callId, producerId, rtpCapabilities }) => { + return !!videoCalls[callId].router.canConsume({ + producerId, + rtpCapabilities, + }); +}; + +const consumeVideo = async ({ callId, socketId, rtpCapabilities }) => { + // Handlers for consumer transport https://mediasoup.org/documentation/v3/mediasoup/api/#consumer-on-transportclose + if (isInitiator(callId, socketId) && videoCalls[callId].receiverVideoProducer) { + const producerId = videoCalls[callId].receiverVideoProducer.id; + if (!canConsume({ callId, producerId, rtpCapabilities })) return null; + videoCalls[callId].initiatorConsumerVideo = await videoCalls[callId].initiatorConsumerTransport.consume({ - producerId: videoCalls[callId].receiverVideoProducer.id, + producerId, 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, + producerId, kind: 'video', rtpParameters: videoCalls[callId].initiatorConsumerVideo.rtpParameters, }; - } else { + } else if (videoCalls[callId].initiatorVideoProducer) { + const producerId = videoCalls[callId].initiatorVideoProducer.id; + if (!canConsume({ callId, producerId, rtpCapabilities })) return null; + videoCalls[callId].receiverConsumerVideo = await videoCalls[callId].receiverConsumerTransport.consume({ - producerId: videoCalls[callId].initiatorVideoProducer.id, + producerId, 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, + producerId, kind: 'video', rtpParameters: videoCalls[callId].receiverConsumerVideo.rtpParameters, }; + } else { + return null; } }; -const consumeAudio = async (callId, socketId, rtpCapabilities) => { - if (isInitiator(callId, socketId)) { - videoCalls[callId].initiatorConsumerAudio = await videoCalls[callId].initiatorConsumerTransport.consume({ - producerId: videoCalls[callId].receiverAudioProducer.id, - rtpCapabilities, - paused: true, - }); +const consumeAudio = async ({ callId, socketId, rtpCapabilities }) => { + try { + // Handlers for consumer transport https://mediasoup.org/documentation/v3/mediasoup/api/#consumer-on-transportclose + if (isInitiator(callId, socketId) && videoCalls[callId].receiverAudioProducer) { + const producerId = videoCalls[callId].receiverAudioProducer.id; + if (!canConsume({ callId, producerId, rtpCapabilities })) return null; - // 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); - }); + videoCalls[callId].initiatorConsumerAudio = await videoCalls[callId].initiatorConsumerTransport.consume({ + producerId, + rtpCapabilities, + paused: true, + }); - // 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, + kind: 'audio', + rtpParameters: videoCalls[callId].initiatorConsumerAudio.rtpParameters, + }; + } else if (videoCalls[callId].initiatorAudioProducer) { + const producerId = videoCalls[callId].initiatorAudioProducer.id; + if (!canConsume({ callId, producerId, rtpCapabilities })) return null; - return { - id: videoCalls[callId].initiatorConsumerAudio.id, - producerId: videoCalls[callId].receiverAudioProducer.id, - kind: 'audio', - rtpParameters: videoCalls[callId].initiatorConsumerAudio.rtpParameters, - }; - } else { - videoCalls[callId].receiverConsumerAudio = await videoCalls[callId].receiverConsumerTransport.consume({ - producerId: videoCalls[callId].initiatorAudioProducer.id, - rtpCapabilities, - paused: true, - }); + videoCalls[callId].receiverConsumerAudio = await videoCalls[callId].receiverConsumerTransport.consume({ + producerId, + 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, - kind: 'audio', - rtpParameters: videoCalls[callId].receiverConsumerAudio.rtpParameters, - }; + return { + id: videoCalls[callId].receiverConsumerAudio.id, + producerId, + kind: 'audio', + rtpParameters: videoCalls[callId].receiverConsumerAudio.rtpParameters, + }; + } else { + return null; + } + } catch (error) { + console.error(`[consumeAudio] | ERROR | error: ${error}`); } }; @@ -615,7 +546,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 +583,15 @@ 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 }