diff --git a/app/src/config.template.js b/app/src/config.template.js index 1fb631f8..5df94c19 100644 --- a/app/src/config.template.js +++ b/app/src/config.template.js @@ -190,4 +190,8 @@ module.exports = { whiteboardLockBtn: false, }, }, + webhook: { + enabled: false, // Enable webhook functionality + url: 'http://localhost:8888/webhook-endpoint', // Webhook server URL + }, }; diff --git a/app/src/logs.js b/app/src/logs.js index b4dc2b8a..f79d3e9e 100644 --- a/app/src/logs.js +++ b/app/src/logs.js @@ -104,10 +104,12 @@ module.exports = class Logs { } } - getDateTime() { - const currentTime = new Date().toLocaleString('en-US', this.tzOptions); - const milliseconds = String(new Date().getMilliseconds()).padStart(3, '0'); - return colors.cyan(`${currentTime}:${milliseconds}`); + getDateTime(color = true) { + const now = new Date(); + const currentTime = now.toLocaleString('en-US', this.tzOptions); + const milliseconds = String(now.getMilliseconds()).padStart(3, '0'); + const timestamp = `${currentTime}:${milliseconds}`; + return color ? colors.cyan(timestamp) : timestamp; } getFormatTime(ms) { diff --git a/app/src/server.js b/app/src/server.js index 2ec16e40..a871c94f 100755 --- a/app/src/server.js +++ b/app/src/server.js @@ -45,7 +45,7 @@ dependencies: { * @license For commercial use or closed source, contact us at license.mirotalk@gmail.com or purchase directly from CodeCanyon * @license CodeCanyon: https://codecanyon.net/item/mirotalk-p2p-webrtc-realtime-video-conferences/38376661 * @author Miroslav Pejic - miroslav.pejic.85@gmail.com - * @version 1.5.61 + * @version 1.5.62 * */ @@ -183,6 +183,12 @@ const ngrok = require('@ngrok/ngrok'); const ngrokEnabled = getEnvBoolean(process.env.NGROK_ENABLED); const ngrokAuthToken = process.env.NGROK_AUTH_TOKEN; +// Handle WebHook +const webhook = { + enabled: config?.webhook?.enabled || false, + url: config?.webhook?.url || 'http://localhost:8888/webhook-endpoint', +}; + // Stun (https://bloggeek.me/webrtcglossary/stun/) // Turn (https://bloggeek.me/webrtcglossary/turn/) const iceServers = []; @@ -1153,7 +1159,7 @@ io.sockets.on('connect', async (socket) => { socket.on('disconnect', async (reason) => { removeIP(socket); for (let channel in socket.channels) { - await removePeerFrom(channel); + await removePeerFrom(channel, reason); } log.debug('[' + socket.id + '] disconnected', { reason: reason }); delete sockets[socket.id]; @@ -1420,6 +1426,16 @@ io.sockets.on('connect', async (socket) => { browser: browserName ? `${browserName} ${browserVersion}` : '', }); // .env EMAIL_ALERT=true } + + // Handle WebHook + if (webhook.enabled) { + // Trigger a POST request when a user joins + config.timestamp = log.getDateTime(false); + axios + .post(webhook.url, { event: 'join', data: config }) + .then((response) => log.debug('Join event tracked:', response.data)) + .catch((error) => log.error('Error tracking join event:', error.message)); + } }); /** @@ -1846,11 +1862,26 @@ io.sockets.on('connect', async (socket) => { * Remove peers from channel * @param {string} channel room id */ - async function removePeerFrom(channel) { + async function removePeerFrom(channel, reason = 'unknown') { if (!(channel in socket.channels)) { return log.debug('[' + socket.id + '] [Warning] not in ', channel); } try { + // Handle WebHook + if (webhook.enabled) { + const data = { + timestamp: log.getDateTime(false), + room_id: channel, + peer: socket.channels[channel], + reason: reason, + }; + // Trigger a POST request when a user disconnects + axios + .post(webhook.url, { event: 'disconnect', data }) + .then((response) => log.debug('Disconnect event tracked:', response.data)) + .catch((error) => log.error('Error tracking disconnect event:', error.message)); + } + delete socket.channels[channel]; delete channels[channel][socket.id]; delete peers[channel][socket.id]; // delete peer data from the room diff --git a/package.json b/package.json index 905a565f..8d3bdc4b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mirotalk", - "version": "1.5.61", + "version": "1.5.62", "description": "A free WebRTC browser-based video call", "main": "server.js", "scripts": { diff --git a/public/js/brand.js b/public/js/brand.js index e7a314dd..f76b4eb7 100644 --- a/public/js/brand.js +++ b/public/js/brand.js @@ -103,7 +103,7 @@ let brand = { }, about: { imageUrl: '../images/mirotalk-logo.gif', - title: 'WebRTC P2P v1.5.61', + title: 'WebRTC P2P v1.5.62', html: `