[mirotalk] - add missing screen handle on disconnect, update dep

This commit is contained in:
Miroslav Pejic
2025-11-05 23:26:05 +01:00
parent 534d97b7c9
commit 2f48ce30cf
5 changed files with 74 additions and 37 deletions
+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.6.26
* @version 1.6.27
*
*/
+29 -29
View File
@@ -1,17 +1,17 @@
{
"name": "mirotalk",
"version": "1.6.26",
"version": "1.6.27",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "mirotalk",
"version": "1.6.26",
"version": "1.6.27",
"license": "AGPL-3.0",
"dependencies": {
"@mattermost/client": "11.0.4",
"@ngrok/ngrok": "1.5.2",
"@sentry/node": "^10.22.0",
"@sentry/node": "^10.23.0",
"axios": "^1.13.2",
"chokidar": "^4.0.3",
"colors": "^1.4.0",
@@ -29,14 +29,14 @@
"jsdom": "^27.1.0",
"jsonwebtoken": "^9.0.2",
"nodemailer": "^7.0.10",
"openai": "^6.8.0",
"openai": "^6.8.1",
"qs": "^6.14.0",
"socket.io": "^4.8.1",
"swagger-ui-express": "^5.0.1",
"uuid": "13.0.0"
},
"devDependencies": {
"mocha": "^11.7.4",
"mocha": "^11.7.5",
"node-fetch": "^3.3.2",
"nodemon": "^3.1.10",
"prettier": "3.6.2",
@@ -1161,18 +1161,18 @@
"license": "Apache-2.0"
},
"node_modules/@sentry/core": {
"version": "10.22.0",
"resolved": "https://registry.npmjs.org/@sentry/core/-/core-10.22.0.tgz",
"integrity": "sha512-V1oeHbrOKzxadsCmgtPku3v3Emo/Bpb3VSuKmlLrQefiHX98MWtjJ3XDGfduzD5/dCdh0r/OOLwjcmrO/PZ2aw==",
"version": "10.23.0",
"resolved": "https://registry.npmjs.org/@sentry/core/-/core-10.23.0.tgz",
"integrity": "sha512-4aZwu6VnSHWDplY5eFORcVymhfvS/P6BRfK81TPnG/ReELaeoykKjDwR+wC4lO7S0307Vib9JGpszjsEZw245g==",
"license": "MIT",
"engines": {
"node": ">=18"
}
},
"node_modules/@sentry/node": {
"version": "10.22.0",
"resolved": "https://registry.npmjs.org/@sentry/node/-/node-10.22.0.tgz",
"integrity": "sha512-PfG8AMT2kgFJ7rWb0lLJOmjLW2riytTliLMjfoJ8/tLGk964uKqE0xM7FLtXZjlLJqTXVYCVG7VIPj185uyckQ==",
"version": "10.23.0",
"resolved": "https://registry.npmjs.org/@sentry/node/-/node-10.23.0.tgz",
"integrity": "sha512-5PwJJ1zZ89tB8hrjTVKNE4fIGtSXlR+Mdg2u1Nm2FJ2Vj1Ac6JArLiRzMqoq/pA7vwgZMoHwviDAA+PfpJ0Agg==",
"license": "MIT",
"dependencies": {
"@opentelemetry/api": "^1.9.0",
@@ -1205,9 +1205,9 @@
"@opentelemetry/sdk-trace-base": "^2.1.0",
"@opentelemetry/semantic-conventions": "^1.37.0",
"@prisma/instrumentation": "6.15.0",
"@sentry/core": "10.22.0",
"@sentry/node-core": "10.22.0",
"@sentry/opentelemetry": "10.22.0",
"@sentry/core": "10.23.0",
"@sentry/node-core": "10.23.0",
"@sentry/opentelemetry": "10.23.0",
"import-in-the-middle": "^1.14.2",
"minimatch": "^9.0.0"
},
@@ -1216,14 +1216,14 @@
}
},
"node_modules/@sentry/node-core": {
"version": "10.22.0",
"resolved": "https://registry.npmjs.org/@sentry/node-core/-/node-core-10.22.0.tgz",
"integrity": "sha512-88Yyn+Qvmp0kPMnNRWgpUlAvhI9CNPqOT+0glW0L7OoN8LkJcNgx2GGUoLrJ+RGeHz/S7dIJY6DGa+u0Not2Qg==",
"version": "10.23.0",
"resolved": "https://registry.npmjs.org/@sentry/node-core/-/node-core-10.23.0.tgz",
"integrity": "sha512-3vhttO19pta7zIuecSrLoPTVN7NdjKtb/WK241H8znwKxukx3fj3M6+upN+JQtC6pERO3HfQwBpMMT9RMCUr3Q==",
"license": "MIT",
"dependencies": {
"@apm-js-collab/tracing-hooks": "^0.3.1",
"@sentry/core": "10.22.0",
"@sentry/opentelemetry": "10.22.0",
"@sentry/core": "10.23.0",
"@sentry/opentelemetry": "10.23.0",
"import-in-the-middle": "^1.14.2"
},
"engines": {
@@ -1240,12 +1240,12 @@
}
},
"node_modules/@sentry/opentelemetry": {
"version": "10.22.0",
"resolved": "https://registry.npmjs.org/@sentry/opentelemetry/-/opentelemetry-10.22.0.tgz",
"integrity": "sha512-XHXYYq3zsQ/dj1kQ7cGGLFIEVRmrmjcMhiJHvmKKsUGKxQjHe2G0LuG8clHIPkmbg7yEIxCT/W2I9QzrwYt5+g==",
"version": "10.23.0",
"resolved": "https://registry.npmjs.org/@sentry/opentelemetry/-/opentelemetry-10.23.0.tgz",
"integrity": "sha512-ZbSB5y8K8YXp5+sBp2w7xHsNLv9EglJRTRqWMi2ncovXy4jcvo+pSreiZu68nSGvxX25brYKDw19vl+tnmqZVg==",
"license": "MIT",
"dependencies": {
"@sentry/core": "10.22.0"
"@sentry/core": "10.23.0"
},
"engines": {
"node": ">=18"
@@ -3845,9 +3845,9 @@
}
},
"node_modules/mocha": {
"version": "11.7.4",
"resolved": "https://registry.npmjs.org/mocha/-/mocha-11.7.4.tgz",
"integrity": "sha512-1jYAaY8x0kAZ0XszLWu14pzsf4KV740Gld4HXkhNTXwcHx4AUEDkPzgEHg9CM5dVcW+zv036tjpsEbLraPJj4w==",
"version": "11.7.5",
"resolved": "https://registry.npmjs.org/mocha/-/mocha-11.7.5.tgz",
"integrity": "sha512-mTT6RgopEYABzXWFx+GcJ+ZQ32kp4fMf0xvpZIIfSq9Z8lC/++MtcCnQ9t5FP2veYEP95FIYSvW+U9fV4xrlig==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -4213,9 +4213,9 @@
}
},
"node_modules/openai": {
"version": "6.8.0",
"resolved": "https://registry.npmjs.org/openai/-/openai-6.8.0.tgz",
"integrity": "sha512-GQUpzb9FoNkh1wqJuDIQ8e/Sq8dW+T3GakG6wJTXBE8Lufx1GaUcgZd087vhm8f/MiOzsTEkfRamYxzJ/jOoiw==",
"version": "6.8.1",
"resolved": "https://registry.npmjs.org/openai/-/openai-6.8.1.tgz",
"integrity": "sha512-ACifslrVgf+maMz9vqwMP4+v9qvx5Yzssydizks8n+YUJ6YwUoxj51sKRQ8HYMfR6wgKLSIlaI108ZwCk+8yig==",
"license": "Apache-2.0",
"bin": {
"openai": "bin/cli"
+4 -4
View File
@@ -1,6 +1,6 @@
{
"name": "mirotalk",
"version": "1.6.26",
"version": "1.6.27",
"description": "A free WebRTC browser-based video call",
"main": "server.js",
"scripts": {
@@ -43,7 +43,7 @@
"dependencies": {
"@mattermost/client": "11.0.4",
"@ngrok/ngrok": "1.5.2",
"@sentry/node": "^10.22.0",
"@sentry/node": "^10.23.0",
"axios": "^1.13.2",
"chokidar": "^4.0.3",
"colors": "^1.4.0",
@@ -61,14 +61,14 @@
"jsonwebtoken": "^9.0.2",
"js-yaml": "^4.1.0",
"nodemailer": "^7.0.10",
"openai": "^6.8.0",
"openai": "^6.8.1",
"qs": "^6.14.0",
"socket.io": "^4.8.1",
"swagger-ui-express": "^5.0.1",
"uuid": "13.0.0"
},
"devDependencies": {
"mocha": "^11.7.4",
"mocha": "^11.7.5",
"node-fetch": "^3.3.2",
"nodemon": "^3.1.10",
"prettier": "3.6.2",
+1 -1
View File
@@ -75,7 +75,7 @@ let brand = {
},
about: {
imageUrl: '../images/mirotalk-logo.gif',
title: 'WebRTC P2P v1.6.26',
title: 'WebRTC P2P v1.6.27',
html: `
<button
id="support-button"
+39 -2
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.6.26
* @version 1.6.27
*
*/
@@ -559,6 +559,7 @@ let localVideoMediaStream; // my webcam
let localScreenMediaStream; // my screen share
let localAudioMediaStream; // my microphone
let noiseProcessor = null; // RNNoise audio processing
let peerScreenMediaElements = {}; // keep track of our peer <video> tags, indexed by peer_id_screen
let peerVideoMediaElements = {}; // keep track of our peer <video> tags, indexed by peer_id_video
let peerAudioMediaElements = {}; // keep track of our peer <audio> tags, indexed by peer_id_audio
@@ -2713,6 +2714,7 @@ function handleDisconnect(reason) {
checkRecording();
for (const peer_id in peerConnections) {
const peerScreenId = peer_id + '___screen';
const peerVideoId = peer_id + '___video';
const peerAudioId = peer_id + '___audio';
@@ -2727,6 +2729,20 @@ function handleDisconnect(reason) {
}
}
const screenVideo = getId(peerScreenId);
if (screenVideo) {
// Peer screen in focus mode
if (screenVideo.hasAttribute('focus-mode')) {
const remoteScreenFocusBtn = getId(peer_id + '_screen_focusMode');
if (remoteScreenFocusBtn) {
remoteScreenFocusBtn.click();
}
}
}
if (peerScreenMediaElements[peerScreenId] && peerScreenMediaElements[peerScreenId].parentNode) {
peerScreenMediaElements[peerScreenId].parentNode.removeChild(peerScreenMediaElements[peerScreenId]);
}
if (peerVideoMediaElements[peerVideoId] && peerVideoMediaElements[peerVideoId].parentNode) {
peerVideoMediaElements[peerVideoId].parentNode.removeChild(peerVideoMediaElements[peerVideoId]);
}
@@ -2744,6 +2760,7 @@ function handleDisconnect(reason) {
chatDataChannels = {};
fileDataChannels = {};
peerConnections = {};
peerScreenMediaElements = {};
peerVideoMediaElements = {};
peerAudioMediaElements = {};
@@ -2762,6 +2779,7 @@ function handleRemovePeer(config) {
const { peer_id } = config;
const peerScreenId = peer_id + '___screen';
const peerVideoId = peer_id + '___video';
const peerAudioId = peer_id + '___audio';
@@ -2780,6 +2798,21 @@ function handleRemovePeer(config) {
adaptAspectRatio();
}
if (peerScreenId in peerScreenMediaElements) {
const peerScreen = getId(peerScreenId);
if (peerScreen) {
// Peer screen in focus mode
if (peerScreen.hasAttribute('focus-mode')) {
const remoteScreenFocusBtn = getId(peer_id + '_screen_focusMode');
if (remoteScreenFocusBtn) {
remoteScreenFocusBtn.click();
}
}
}
peerScreenMediaElements[peerScreenId].parentNode.removeChild(peerScreenMediaElements[peerScreenId]);
adaptAspectRatio();
}
if (peerAudioId in peerAudioMediaElements) {
peerAudioMediaElements[peerAudioId].parentNode.removeChild(peerAudioMediaElements[peerAudioId]);
}
@@ -2792,6 +2825,7 @@ function handleRemovePeer(config) {
delete chatDataChannels[peer_id];
delete fileDataChannels[peer_id];
delete peerConnections[peer_id];
delete peerScreenMediaElements[peerScreenId];
delete peerVideoMediaElements[peerVideoId];
delete peerAudioMediaElements[peerAudioId];
delete allPeers[peer_id];
@@ -4242,6 +4276,9 @@ async function loadRemoteMediaStream(stream, peers, peer_id, kind) {
remoteScreenWrap.appendChild(remoteScreenMedia);
remoteScreenWrap.appendChild(remoteScreenPeerName);
// need later on disconnect or remove peers
peerScreenMediaElements[remoteScreenMedia.id] = remoteScreenWrap;
videoMediaContainer.appendChild(remoteScreenWrap);
attachMediaStream(remoteScreenMedia, stream);
adaptAspectRatio();
@@ -12302,7 +12339,7 @@ function showAbout() {
Swal.fire({
background: swBg,
position: 'center',
title: brand.about?.title && brand.about.title.trim() !== '' ? brand.about.title : 'WebRTC P2P v1.6.26',
title: brand.about?.title && brand.about.title.trim() !== '' ? brand.about.title : 'WebRTC P2P v1.6.27',
imageUrl: brand.about?.imageUrl && brand.about.imageUrl.trim() !== '' ? brand.about.imageUrl : images.about,
customClass: { image: 'img-about' },
html: `