[mirotalksfu] - #200 improve webRTCTransport config, add restartTransportWithRetry, refactoring

هذا الالتزام موجود في:
Miroslav Pejic
2025-04-05 00:22:39 +02:00
الأصل e34198d738
التزام 943ee40c7c
7 ملفات معدلة مع 98 إضافات و95 حذوفات

عرض الملف

@@ -64,7 +64,7 @@ let BRAND = {
},
about: {
imageUrl: '../images/mirotalk-logo.gif',
title: '<strong>WebRTC SFU v1.8.10</strong>',
title: '<strong>WebRTC SFU v1.8.11</strong>',
html: `
<button
id="support-button"

عرض الملف

@@ -11,7 +11,7 @@ if (location.href.substr(0, 5) !== 'https') location.href = 'https' + location.h
* @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.8.10
* @version 1.8.11
*
*/
@@ -5324,7 +5324,7 @@ function showAbout() {
position: 'center',
imageUrl: BRAND.about?.imageUrl && BRAND.about.imageUrl.trim() !== '' ? BRAND.about.imageUrl : image.about,
customClass: { image: 'img-about' },
title: BRAND.about?.title && BRAND.about.title.trim() !== '' ? BRAND.about.title : 'WebRTC SFU v1.8.10',
title: BRAND.about?.title && BRAND.about.title.trim() !== '' ? BRAND.about.title : 'WebRTC SFU v1.8.11',
html: `
<br />
<div id="about">

عرض الملف

@@ -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.8.10
* @version 1.8.11
*
*/
@@ -750,6 +750,11 @@ class RoomClient {
this.producerTransport.on('connectionstatechange', async (state) => {
console.log(`Producer Transport state changed to: ${state}`, { id: this.producerTransport.id });
if (state === 'disconnected' || state === 'failed') {
console.warn('⚠️ Attempting ICE restart...');
await this.restartProducerIce();
}
switch (state) {
case 'connecting':
console.log('Producer Transport connecting...');
@@ -758,26 +763,14 @@ class RoomClient {
console.log('✅ Producer Transport connected', { id: this.producerTransport.id });
break;
case 'disconnected':
console.warn('Producer Transport disconnected', { id: this.producerTransport.id });
console.warn('⚠️ Producer Transport disconnected', { id: this.producerTransport.id });
break;
case 'failed':
console.warn('❌ Producer Transport failed', { id: this.producerTransport.id });
this.producerTransport.close();
popupHtmlMessage(
null,
image.network,
'Producer Transport',
'Unable to connect. Please check your network.',
'center',
false,
true,
);
break;
default:
console.log('Producer transport connection state changes', {
state: state,
console.log('Producer transport connection state changed', {
state,
id: this.producerTransport.id,
});
break;
@@ -834,6 +827,11 @@ class RoomClient {
this.consumerTransport.on('connectionstatechange', async (state) => {
console.log(`Consumer Transport state changed to: ${state}`, { id: this.consumerTransport.id });
if (state === 'disconnected' || state === 'failed') {
console.warn('⚠️ Attempting ICE restart...');
await this.restartConsumerIce();
}
switch (state) {
case 'connecting':
console.log('Consumer Transport connecting...');
@@ -842,26 +840,14 @@ class RoomClient {
console.log('✅ Consumer Transport connected', { id: this.consumerTransport.id });
break;
case 'disconnected':
console.warn('Consumer Transport disconnected', { id: this.consumerTransport.id });
console.warn('⚠️ Consumer Transport disconnected', { id: this.consumerTransport.id });
break;
case 'failed':
console.warn('❌ Consumer Transport failed', { id: this.consumerTransport.id });
this.consumerTransport.close();
popupHtmlMessage(
null,
image.network,
'Consumer Transport',
'Unable to connect. Please check your network.',
'center',
false,
true,
);
break;
default:
console.log('Consumer transport connection state changes', {
state: state,
console.log('Consumer transport connection state changed', {
state,
id: this.consumerTransport.id,
});
break;
@@ -892,7 +878,7 @@ class RoomClient {
// ####################################################
async restartTransportIce(transport, type) {
if (!transport || typeof transport !== 'object' || transport.closed) return;
if (!transport || typeof transport !== 'object' || transport.closed) return false;
try {
console.warn(`🔄 Restarting ${type} ICE...`, {
@@ -906,7 +892,7 @@ class RoomClient {
if (!iceParameters) {
console.warn(`⚠️ No ${type} ICE Parameters received`);
return;
return false;
}
console.info(`🚀 Restarting ${type} transport ICE`, iceParameters);
@@ -914,20 +900,50 @@ class RoomClient {
await transport.restartIce({ iceParameters });
console.info(`✅ Successfully restarted ${type} ICE`);
return true;
} catch (error) {
console.error(`🔥 Restart ${type} ICE error`, {
id: transport?.id,
error: error.message,
});
return false;
}
}
async restartProducerIce() {
await this.restartTransportIce(this.producerTransport, 'Producer');
async restartTransportWithRetry(transport, transportType, retries = 5, initialDelay = 1000) {
let delay = initialDelay;
for (let i = 0; i < retries; i++) {
const success = i === 4 ? await this.restartTransportIce(transport, transportType) : false;
if (success) return true; // Exit if reconnection is successful
console.warn(`🌀 Reconnection attempt ${i + 1} failed. Retrying in ${delay}ms...`);
await new Promise((resolve) => setTimeout(resolve, delay));
delay *= 2; // Exponential backoff: 1s -> 2s -> 4s -> 8s -> 16s
}
console.error('❌ Failed to reconnect after multiple attempts.');
transport.close();
popupHtmlMessage(
null,
image.network,
`${transportType} Transport`,
'Unable to reconnect. Please check your network.',
'center',
false,
true,
);
return false;
}
async restartConsumerIce() {
await this.restartTransportIce(this.consumerTransport, 'Consumer');
async restartProducerIce(retries = 5, delay = 1000) {
return this.restartTransportWithRetry(this.producerTransport, 'Producer', retries, delay);
}
async restartConsumerIce(retries = 5, delay = 1000) {
return this.restartTransportWithRetry(this.consumerTransport, 'Consumer', retries, delay);
}
async restartIce() {