diff --git a/app/src/Server.js b/app/src/Server.js
index 7bc69e90..91c6ad94 100644
--- a/app/src/Server.js
+++ b/app/src/Server.js
@@ -58,7 +58,7 @@ dev dependencies: {
* @license For commercial or closed source, contact us at license.mirotalk@gmail.com or purchase directly via CodeCanyon
* @license CodeCanyon: https://codecanyon.net/item/mirotalk-sfu-webrtc-realtime-video-conferences/40769970
* @author Miroslav Pejic - miroslav.pejic.85@gmail.com
- * @version 1.7.64
+ * @version 1.7.65
*
*/
diff --git a/package.json b/package.json
index 1fcbbd7e..4eaf8d09 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "mirotalksfu",
- "version": "1.7.64",
+ "version": "1.7.65",
"description": "WebRTC SFU browser-based video calls",
"main": "Server.js",
"scripts": {
@@ -76,7 +76,7 @@
"jsdom": "^26.0.0",
"jsonwebtoken": "^9.0.2",
"mediasoup": "3.15.4",
- "mediasoup-client": "3.8.2",
+ "mediasoup-client": "3.9.1",
"ngrok": "^5.0.0-beta.2",
"nodemailer": "^6.10.0",
"openai": "^4.86.1",
diff --git a/public/js/Brand.js b/public/js/Brand.js
index ab035b69..7c548361 100644
--- a/public/js/Brand.js
+++ b/public/js/Brand.js
@@ -64,7 +64,7 @@ let BRAND = {
},
about: {
imageUrl: '../images/mirotalk-logo.gif',
- title: 'WebRTC SFU v1.7.64',
+ title: 'WebRTC SFU v1.7.65',
html: `
diff --git a/public/js/RoomClient.js b/public/js/RoomClient.js
index 1270b0c3..f218a79a 100644
--- a/public/js/RoomClient.js
+++ b/public/js/RoomClient.js
@@ -9,7 +9,7 @@
* @license For commercial or closed source, contact us at license.mirotalk@gmail.com or purchase directly via CodeCanyon
* @license CodeCanyon: https://codecanyon.net/item/mirotalk-sfu-webrtc-realtime-video-conferences/40769970
* @author Miroslav Pejic - miroslav.pejic.85@gmail.com
- * @version 1.7.64
+ * @version 1.7.65
*
*/
@@ -784,6 +784,20 @@ class RoomClient {
break;
}
});
+
+ this.producerTransport.on('icegatheringstatechange', (state) => {
+ console.warn('Producer ICE gathering change state', {
+ state: state,
+ id: this.producerTransport.id,
+ });
+ });
+
+ this.producerTransport.on('icecandidateerror', (error) => {
+ console.error('❌ Producer ICE candidate error', {
+ error: error,
+ id: this.producerTransport.id,
+ });
+ });
}
// ####################################################
@@ -857,6 +871,20 @@ class RoomClient {
break;
}
});
+
+ this.consumerTransport.on('icegatheringstatechange', (state) => {
+ console.warn('Consumer ICE gathering change state', {
+ state: state,
+ id: this.consumerTransport.id,
+ });
+ });
+
+ this.consumerTransport.on('icecandidateerror', (error) => {
+ console.error('❌ Consumer ICE candidate error', {
+ error: error,
+ id: this.consumerTransport.id,
+ });
+ });
}
// ####################################################
diff --git a/public/sfu/MediasoupClient.js b/public/sfu/MediasoupClient.js
index 311407d4..1004db52 100644
--- a/public/sfu/MediasoupClient.js
+++ b/public/sfu/MediasoupClient.js
@@ -3998,6 +3998,12 @@
this.safeEmit('icegatheringstatechange', iceGatheringState);
}
});
+ handler.on('@icecandidateerror', (event) => {
+ logger.warn(
+ `ICE candidate error [url:${event.url}, localAddress:${event.address}, localPort:${event.port}]: ${event.errorCode} "${event.errorText}"`,
+ );
+ this.safeEmit('icecandidateerror', event);
+ });
handler.on('@connectionstatechange', (connectionState) => {
if (connectionState === this._connectionState) {
return;
@@ -4470,6 +4476,9 @@
this._pc.addEventListener('icegatheringstatechange', () => {
this.emit('@icegatheringstatechange', this._pc.iceGatheringState);
});
+ this._pc.addEventListener('icecandidateerror', (event) => {
+ this.emit('@icecandidateerror', event);
+ });
if (this._pc.connectionState) {
this._pc.addEventListener('connectionstatechange', () => {
this.emit('@connectionstatechange', this._pc.connectionState);
@@ -5230,6 +5239,9 @@
this._pc.addEventListener('icegatheringstatechange', () => {
this.emit('@icegatheringstatechange', this._pc.iceGatheringState);
});
+ this._pc.addEventListener('icecandidateerror', (event) => {
+ this.emit('@icecandidateerror', event);
+ });
if (this._pc.connectionState) {
this._pc.addEventListener('connectionstatechange', () => {
this.emit('@connectionstatechange', this._pc.connectionState);
@@ -5845,6 +5857,9 @@
this._pc.addEventListener('icegatheringstatechange', () => {
this.emit('@icegatheringstatechange', this._pc.iceGatheringState);
});
+ this._pc.addEventListener('icecandidateerror', (event) => {
+ this.emit('@icecandidateerror', event);
+ });
if (this._pc.connectionState) {
this._pc.addEventListener('connectionstatechange', () => {
this.emit('@connectionstatechange', this._pc.connectionState);
@@ -6503,6 +6518,9 @@
this._pc.addEventListener('icegatheringstatechange', () => {
this.emit('@icegatheringstatechange', this._pc.iceGatheringState);
});
+ this._pc.addEventListener('icecandidateerror', (event) => {
+ this.emit('@icecandidateerror', event);
+ });
if (this._pc.connectionState) {
this._pc.addEventListener('connectionstatechange', () => {
this.emit('@connectionstatechange', this._pc.connectionState);
@@ -7207,6 +7225,9 @@
this._pc.addEventListener('icegatheringstatechange', () => {
this.emit('@icegatheringstatechange', this._pc.iceGatheringState);
});
+ this._pc.addEventListener('icecandidateerror', (event) => {
+ this.emit('@icecandidateerror', event);
+ });
if (this._pc.connectionState) {
this._pc.addEventListener('connectionstatechange', () => {
this.emit('@connectionstatechange', this._pc.connectionState);
@@ -8498,6 +8519,9 @@
this._pc.addEventListener('icegatheringstatechange', () => {
this.emit('@icegatheringstatechange', this._pc.iceGatheringState);
});
+ this._pc.addEventListener('icecandidateerror', (event) => {
+ this.emit('@icecandidateerror', event);
+ });
if (this._pc.connectionState) {
this._pc.addEventListener('connectionstatechange', () => {
this.emit('@connectionstatechange', this._pc.connectionState);
@@ -9277,6 +9301,9 @@
this._pc.addEventListener('icegatheringstatechange', () => {
this.emit('@icegatheringstatechange', this._pc.iceGatheringState);
});
+ this._pc.addEventListener('icecandidateerror', (event) => {
+ this.emit('@icecandidateerror', event);
+ });
if (this._pc.connectionState) {
this._pc.addEventListener('connectionstatechange', () => {
this.emit('@connectionstatechange', this._pc.connectionState);
@@ -10052,6 +10079,9 @@
this._pc.addEventListener('icegatheringstatechange', () => {
this.emit('@icegatheringstatechange', this._pc.iceGatheringState);
});
+ this._pc.addEventListener('icecandidateerror', (event) => {
+ this.emit('@icecandidateerror', event);
+ });
if (this._pc.connectionState) {
this._pc.addEventListener('connectionstatechange', () => {
this.emit('@connectionstatechange', this._pc.connectionState);
@@ -10689,6 +10719,9 @@
this._pc.addEventListener('icegatheringstatechange', () => {
this.emit('@icegatheringstatechange', this._pc.iceGatheringState);
});
+ this._pc.addEventListener('icecandidateerror', (event) => {
+ this.emit('@icecandidateerror', event);
+ });
if (this._pc.connectionState) {
this._pc.addEventListener('connectionstatechange', () => {
this.emit('@connectionstatechange', this._pc.connectionState);
@@ -11491,6 +11524,9 @@
this._pc.addEventListener('icegatheringstatechange', () => {
this.emit('@icegatheringstatechange', this._pc.iceGatheringState);
});
+ this._pc.addEventListener('icecandidateerror', (event) => {
+ this.emit('@icecandidateerror', event);
+ });
if (this._pc.connectionState) {
this._pc.addEventListener('connectionstatechange', () => {
this.emit('@connectionstatechange', this._pc.connectionState);
@@ -12154,6 +12190,9 @@
this._pc.addEventListener('icegatheringstatechange', () => {
this.emit('@icegatheringstatechange', this._pc.iceGatheringState);
});
+ this._pc.addEventListener('icecandidateerror', (event) => {
+ this.emit('@icecandidateerror', event);
+ });
if (this._pc.connectionState) {
this._pc.addEventListener('connectionstatechange', () => {
this.emit('@connectionstatechange', this._pc.connectionState);
@@ -14507,7 +14546,7 @@
/**
* Expose mediasoup-client version.
*/
- exports.version = '3.8.2';
+ exports.version = '3.9.1';
/**
* Expose parseScalabilityMode() function.
*/