[mirotalk] - improve reconnect logic and logs, update dep

This commit is contained in:
Miroslav Pejic
2026-01-14 22:25:31 +01:00
parent 8201912574
commit 8fd4701e23
7 changed files with 85 additions and 50 deletions
+1 -1
View File
@@ -1,5 +1,5 @@
# ====================================================
# MiroTalk P2P v.1.7.04 - Environment Configuration
# MiroTalk P2P v.1.7.05 - Environment Configuration
# ====================================================
# App environment
+1 -1
View File
@@ -2,7 +2,7 @@
/**
* ==============================================
* MiroTalk P2P v.1.7.04 - Configuration File
* MiroTalk P2P v.1.7.05 - Configuration File
* ==============================================
*
* Branding and customizations require a license:
+1 -1
View File
@@ -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.7.04
* @version 1.7.05
*
*/
+39 -39
View File
@@ -1,17 +1,17 @@
{
"name": "mirotalk",
"version": "1.7.04",
"version": "1.7.05",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "mirotalk",
"version": "1.7.04",
"version": "1.7.05",
"license": "AGPL-3.0",
"dependencies": {
"@mattermost/client": "11.2.0",
"@ngrok/ngrok": "1.7.0",
"@sentry/node": "^10.33.0",
"@sentry/node": "^10.34.0",
"axios": "^1.13.2",
"chokidar": "^5.0.0",
"colors": "^1.4.0",
@@ -608,9 +608,9 @@
}
},
"node_modules/@opentelemetry/context-async-hooks": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-2.3.0.tgz",
"integrity": "sha512-hGcsT0qDP7Il1L+qT3JFpiGl1dCjF794Bb4yCRCYdr7XC0NwHtOF3ngF86Gk6TUnsakbyQsDQ0E/S4CU0F4d4g==",
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-2.4.0.tgz",
"integrity": "sha512-jn0phJ+hU7ZuvaoZE/8/Euw3gvHJrn2yi+kXrymwObEPVPjtwCmkvXDRQCWli+fCTTF/aSOtXaLr7CLIvv3LQg==",
"license": "Apache-2.0",
"peer": true,
"engines": {
@@ -1025,13 +1025,13 @@
}
},
"node_modules/@opentelemetry/resources": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.3.0.tgz",
"integrity": "sha512-shlr2l5g+87J8wqYlsLyaUsgKVRO7RtX70Ckd5CtDOWtImZgaUDmf4Z2ozuSKQLM2wPDR0TE/3bPVBNJtRm/cQ==",
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.4.0.tgz",
"integrity": "sha512-RWvGLj2lMDZd7M/5tjkI/2VHMpXebLgPKvBUd9LRasEWR2xAynDwEYZuLvY9P2NGG73HF07jbbgWX2C9oavcQg==",
"license": "Apache-2.0",
"peer": true,
"dependencies": {
"@opentelemetry/core": "2.3.0",
"@opentelemetry/core": "2.4.0",
"@opentelemetry/semantic-conventions": "^1.29.0"
},
"engines": {
@@ -1042,9 +1042,9 @@
}
},
"node_modules/@opentelemetry/resources/node_modules/@opentelemetry/core": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.3.0.tgz",
"integrity": "sha512-PcmxJQzs31cfD0R2dE91YGFcLxOSN4Bxz7gez5UwSUjCai8BwH/GI5HchfVshHkWdTkUs0qcaPJgVHKXUp7I3A==",
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.4.0.tgz",
"integrity": "sha512-KtcyFHssTn5ZgDu6SXmUznS80OFs/wN7y6MyFRRcKU6TOw8hNcGxKvt8hsdaLJfhzUszNSjURetq5Qpkad14Gw==",
"license": "Apache-2.0",
"dependencies": {
"@opentelemetry/semantic-conventions": "^1.29.0"
@@ -1057,14 +1057,14 @@
}
},
"node_modules/@opentelemetry/sdk-trace-base": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.3.0.tgz",
"integrity": "sha512-B0TQ2e9h0ETjpI+eGmCz8Ojb+lnYms0SE3jFwEKrN/PK4aSVHU28AAmnOoBmfub+I3jfgPwvDJgomBA5a7QehQ==",
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.4.0.tgz",
"integrity": "sha512-WH0xXkz/OHORDLKqaxcUZS0X+t1s7gGlumr2ebiEgNZQl2b0upK2cdoD0tatf7l8iP74woGJ/Kmxe82jdvcWRw==",
"license": "Apache-2.0",
"peer": true,
"dependencies": {
"@opentelemetry/core": "2.3.0",
"@opentelemetry/resources": "2.3.0",
"@opentelemetry/core": "2.4.0",
"@opentelemetry/resources": "2.4.0",
"@opentelemetry/semantic-conventions": "^1.29.0"
},
"engines": {
@@ -1075,9 +1075,9 @@
}
},
"node_modules/@opentelemetry/sdk-trace-base/node_modules/@opentelemetry/core": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.3.0.tgz",
"integrity": "sha512-PcmxJQzs31cfD0R2dE91YGFcLxOSN4Bxz7gez5UwSUjCai8BwH/GI5HchfVshHkWdTkUs0qcaPJgVHKXUp7I3A==",
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.4.0.tgz",
"integrity": "sha512-KtcyFHssTn5ZgDu6SXmUznS80OFs/wN7y6MyFRRcKU6TOw8hNcGxKvt8hsdaLJfhzUszNSjURetq5Qpkad14Gw==",
"license": "Apache-2.0",
"dependencies": {
"@opentelemetry/semantic-conventions": "^1.29.0"
@@ -1154,18 +1154,18 @@
"license": "Apache-2.0"
},
"node_modules/@sentry/core": {
"version": "10.33.0",
"resolved": "https://registry.npmjs.org/@sentry/core/-/core-10.33.0.tgz",
"integrity": "sha512-ehH1VSUclIHZKEZVdv+klofsFIh8FFzqA6AAV23RtLepptzA8wqQzUGraEuSN25sYcNmYJ0jti5U0Ys+WZv5Dw==",
"version": "10.34.0",
"resolved": "https://registry.npmjs.org/@sentry/core/-/core-10.34.0.tgz",
"integrity": "sha512-4FFpYBMf0VFdPcsr4grDYDOR87mRu6oCfb51oQjU/Pndmty7UgYo0Bst3LEC/8v0SpytBtzXq+Wx/fkwulBesg==",
"license": "MIT",
"engines": {
"node": ">=18"
}
},
"node_modules/@sentry/node": {
"version": "10.33.0",
"resolved": "https://registry.npmjs.org/@sentry/node/-/node-10.33.0.tgz",
"integrity": "sha512-HZ7U0igIXs8nHSeh0YAe9C3eE/fjkHOprctQHwoYpRrZelsKO8NsvZU0K/1+knFr36vFj7jtt1QlF/UjCQZD+Q==",
"version": "10.34.0",
"resolved": "https://registry.npmjs.org/@sentry/node/-/node-10.34.0.tgz",
"integrity": "sha512-bEOyH97HuVtWZYAZ5mp0NhYNc+n6QCfiKuLee2P75n2kt4cIPTGvLOSdUwwjllf795uOdKZJuM1IUN0W+YMcVg==",
"license": "MIT",
"dependencies": {
"@opentelemetry/api": "^1.9.0",
@@ -1198,9 +1198,9 @@
"@opentelemetry/sdk-trace-base": "^2.2.0",
"@opentelemetry/semantic-conventions": "^1.37.0",
"@prisma/instrumentation": "6.19.0",
"@sentry/core": "10.33.0",
"@sentry/node-core": "10.33.0",
"@sentry/opentelemetry": "10.33.0",
"@sentry/core": "10.34.0",
"@sentry/node-core": "10.34.0",
"@sentry/opentelemetry": "10.34.0",
"import-in-the-middle": "^2.0.1",
"minimatch": "^9.0.0"
},
@@ -1209,14 +1209,14 @@
}
},
"node_modules/@sentry/node-core": {
"version": "10.33.0",
"resolved": "https://registry.npmjs.org/@sentry/node-core/-/node-core-10.33.0.tgz",
"integrity": "sha512-73J1yLMdtjyadtcsrZ5VBYIyWrJ5gHh5dRsJlfm6XMD3ZFHQQ9Fwd6mwnSY+X+VLJaNq7RtoNECij6LLqE4R0g==",
"version": "10.34.0",
"resolved": "https://registry.npmjs.org/@sentry/node-core/-/node-core-10.34.0.tgz",
"integrity": "sha512-FrGfC8GzD1cnZDO3zwQ4cjyoY1ZwNHvZbXSvXRYxpjhXidZhvaPurjgLRSB0xGaFgoemmOp1ufsx/w6fQOGA6Q==",
"license": "MIT",
"dependencies": {
"@apm-js-collab/tracing-hooks": "^0.3.1",
"@sentry/core": "10.33.0",
"@sentry/opentelemetry": "10.33.0",
"@sentry/core": "10.34.0",
"@sentry/opentelemetry": "10.34.0",
"import-in-the-middle": "^2.0.1"
},
"engines": {
@@ -1233,12 +1233,12 @@
}
},
"node_modules/@sentry/opentelemetry": {
"version": "10.33.0",
"resolved": "https://registry.npmjs.org/@sentry/opentelemetry/-/opentelemetry-10.33.0.tgz",
"integrity": "sha512-v/6mAYLxtfcKLCw6Ktk46T6fWEQBVWB9Ah81axr8OvuIomK71jkv1zb0v7D8ot0ESesJ3JF6I/aKhfxpyLInSQ==",
"version": "10.34.0",
"resolved": "https://registry.npmjs.org/@sentry/opentelemetry/-/opentelemetry-10.34.0.tgz",
"integrity": "sha512-uKuULBOmdVu3bYdD8doMLqKgN0PP3WWtI7Shu11P9PVrhSNT4U9yM9Z6v1aFlQcbrgyg3LynZuXs8lyjt90UbA==",
"license": "MIT",
"dependencies": {
"@sentry/core": "10.33.0"
"@sentry/core": "10.34.0"
},
"engines": {
"node": ">=18"
+2 -2
View File
@@ -1,6 +1,6 @@
{
"name": "mirotalk",
"version": "1.7.04",
"version": "1.7.05",
"description": "A free WebRTC browser-based video call",
"main": "server.js",
"scripts": {
@@ -43,7 +43,7 @@
"dependencies": {
"@mattermost/client": "11.2.0",
"@ngrok/ngrok": "1.7.0",
"@sentry/node": "^10.33.0",
"@sentry/node": "^10.34.0",
"axios": "^1.13.2",
"chokidar": "^5.0.0",
"colors": "^1.4.0",
+1 -1
View File
@@ -77,7 +77,7 @@ let brand = {
},
about: {
imageUrl: '../images/mirotalk-logo.gif',
title: 'WebRTC P2P v1.7.04',
title: 'WebRTC P2P v1.7.05',
html: `
<button
id="support-button"
+40 -5
View File
@@ -15,7 +15,7 @@
* @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.7.04
* @version 1.7.05
*
*/
@@ -1270,6 +1270,18 @@ function initClientPeer() {
// on receiving data from signaling server...
signalingSocket.on('connect', handleConnect);
signalingSocket.on('reconnect', (attemptNumber) => {
console.log('Socket reconnected after', attemptNumber, 'attempts');
});
signalingSocket.on('reconnect_attempt', (attemptNumber) => {
console.log('Attempting to reconnect...', attemptNumber);
});
signalingSocket.on('reconnect_error', (error) => {
console.error('Reconnection error:', error);
});
signalingSocket.on('reconnect_failed', () => {
console.error('Reconnection failed');
});
signalingSocket.on('unauthorized', handleUnauthorized);
signalingSocket.on('roomIsLocked', handleUnlockTheRoom);
signalingSocket.on('roomAction', handleRoomAction);
@@ -1328,7 +1340,12 @@ async function handleConnect() {
await getButtons();
if (localVideoMediaStream && localAudioMediaStream) {
// If reconnecting, force rejoin to properly sync with other peers
if (isPeerReconnected && localVideoMediaStream && localAudioMediaStream) {
console.log('Reconnected - rejoining channel');
await joinToChannel();
isPeerReconnected = false; // Reset flag after successful rejoin
} else if (localVideoMediaStream && localAudioMediaStream) {
await joinToChannel();
} else {
await initEnumerateDevices();
@@ -1380,7 +1397,14 @@ function handleServerInfo(config) {
}
// Let start with some basic rules
isPresenter = isPeerReconnected ? isPresenter : is_presenter;
// On reconnection, preserve presenter status if we were presenter before
// Otherwise, accept what the server tells us
if (isPeerReconnected) {
console.log('Reconnected - preserving presenter status:', isPresenter);
} else {
isPresenter = is_presenter;
console.log('New connection - presenter status from server:', isPresenter);
}
isPeerPresenter.innerText = isPresenter;
// Peer identified if presenter or not then....
@@ -2311,7 +2335,16 @@ async function handleAddPeer(config) {
if (peer_id in peerConnections) {
// This could happen if the user joins multiple channels where the other peer is also in.
return console.log('Already connected to peer', peer_id);
// Or when a peer reconnects - close the old connection and create a new one
console.log('Already connected to peer', peer_id, '- closing old connection and creating new one');
try {
peerConnections[peer_id].close();
delete peerConnections[peer_id];
delete chatDataChannels[peer_id];
delete fileDataChannels[peer_id];
} catch (err) {
console.error('Error closing stale peer connection', err);
}
}
console.log('iceServers', iceServers[0]);
@@ -2822,7 +2855,9 @@ function handleDisconnect(reason) {
peerVideoMediaElements = {};
peerAudioMediaElements = {};
// Set reconnection flag to trigger proper rejoin
isPeerReconnected = true;
console.log('Set isPeerReconnected=true, will attempt to rejoin on reconnect');
}
/**
@@ -13571,7 +13606,7 @@ function showAbout() {
Swal.fire({
background: swBg,
position: 'center',
title: brand.about?.title && brand.about.title.trim() !== '' ? brand.about.title : 'WebRTC P2P v1.7.04',
title: brand.about?.title && brand.about.title.trim() !== '' ? brand.about.title : 'WebRTC P2P v1.7.05',
imageUrl: brand.about?.imageUrl && brand.about.imageUrl.trim() !== '' ? brand.about.imageUrl : images.about,
customClass: { image: 'img-about' },
html: `