Peerjs: كيف يمكن لـ peer.js إعادة الاتصال بنفس النظير بعد قطع الاتصال؟

تم إنشاؤها على ١٤ أبريل ٢٠٢٠  ·  7تعليقات  ·  مصدر: peers/peerjs

أحتاج إلى معرفة ما إذا كان اثنان من الأقران متصلين عند الاتصال عندما نتلقى رسالة - حالة اتصال الجليد غير متصلة ، وتغلق جميع النوافذ و dicsonnect 2 peer. هل يمكننا التعامل مع إعادة الاتصال عند فصل خادم الجليد؟

bug

التعليق الأكثر فائدة

أريد أن أعرف كيف يمكنني إعادة الاتصال عند قطع اتصال iceconnection؟ لقد جربت الكثير من التعليمات البرمجية ولكنها لا تعمل

لن تسمح لك هذه المكتبة بإجراء استعادة رشيقة للحالة غير المتصلة لأنها تغلق الاتصال على الفور. الشيء الوحيد الذي يمكنك فعله هو الاستماع إلى on('error') ثم الاتصال بنفس الطريقة التي قمت بها عند إعداد الاتصال الأصلي. إنه ألم كبير.

ملاحظة: هناك مكانان للتحقق من وجود أخطاء. على الأقران نفسه وعلى الاتصال نفسه. فيما يتعلق بالاتصال ، فإنهم جميعًا قاتلون تمامًا كما هي الآن هذه المكتبة ، على الرغم من أنه لا ينبغي أن يكونوا كذلك. على النظير نفسه ، العديد من الأخطاء قاتلة ، ولكن ليس كلها.

بالنسبة لأخطاء المقبس على النظير ، لدي شيء مثل هذا:

this.peer.on('disconnected', () => {
        this.disconnectBackoff = 1;
        this.retrySocketConnection();
      });

حيث يمثل التراجع قيمة بالثواني والتي أزدادها في كل مرة أحاول فيها إلى أقصى حد.

بالنسبة لخطأ الأقران ، لدي شيء مثل هذا:

// Non-Fatal error:
// 'peer-unavailable' = maybe they left?
// 'disconnected' = this means the Peering server disconnected, we have a seperate retry for that on('disconnect')
// pretty much all of the rest are fatal.
const FATAL_ERRORS = ['invalid-id', 'invalid-key', 'network', 'ssl-unavailable', 'server-error', 'socket-error', 'socket-closed', 'unavailable-id', 'webrtc'];
this.peer.on('error', (e) => {
        if (FATAL_ERRORS.includes(e.type)) {
          this.reconnectTimeout(e); // this function waits then tries the entire connection over again
        } else {
          console.log('Non fatal error: ',  e.type);
        }
      });

ثم بالنسبة للاتصال (mediaConnection في حالتي) لدي هذا.

call.on('error', (e) => {
      console.warn('error with stream', e);
      if (initiator) { // initiator is a value I set myself
        // Optionally this should call only the user that failed instead of the whole thing
        this.reconnectTimeout();
      }
    });

والدالة المذكورة أعلاه reconnectTimeout هي وظيفة بسيطة تحاول الاتصال بالكامل مرة أخرى.

من الناحية النظرية ، يمكن لهذه المكتبة أن تتعامل مع iceRestarts ولن تكون قاتلة عند قطع الاتصال بالجليد ، والذي أعتقد أنه سيحل معظم المشكلات. لديّ PR لشيء قطع الاتصال ، لكن ليس بعد لإعادة التشغيل.

ال 7 كومينتر

يجب أن تكون حالة الجليد المنفصلة قابلة للاسترداد ، ولكن هذه المكتبة تغلق الاتصال حاليًا قبل النضج. حتى يتم التعامل مع ذلك ، فإن أفضل ما يمكنك فعله هو وضع مؤقت على خطأ وإعادة الاتصال.

أريد أن أعرف كيف يمكنني إعادة الاتصال عند قطع اتصال iceconnection؟ لقد جربت الكثير من التعليمات البرمجية ولكنها لا تعمل

أريد أن أعرف كيف يمكنني إعادة الاتصال عند قطع اتصال iceconnection؟ لقد جربت الكثير من التعليمات البرمجية ولكنها لا تعمل

لن تسمح لك هذه المكتبة بإجراء استعادة رشيقة للحالة غير المتصلة لأنها تغلق الاتصال على الفور. الشيء الوحيد الذي يمكنك فعله هو الاستماع إلى on('error') ثم الاتصال بنفس الطريقة التي قمت بها عند إعداد الاتصال الأصلي. إنه ألم كبير.

ملاحظة: هناك مكانان للتحقق من وجود أخطاء. على الأقران نفسه وعلى الاتصال نفسه. فيما يتعلق بالاتصال ، فإنهم جميعًا قاتلون تمامًا كما هي الآن هذه المكتبة ، على الرغم من أنه لا ينبغي أن يكونوا كذلك. على النظير نفسه ، العديد من الأخطاء قاتلة ، ولكن ليس كلها.

بالنسبة لأخطاء المقبس على النظير ، لدي شيء مثل هذا:

this.peer.on('disconnected', () => {
        this.disconnectBackoff = 1;
        this.retrySocketConnection();
      });

حيث يمثل التراجع قيمة بالثواني والتي أزدادها في كل مرة أحاول فيها إلى أقصى حد.

بالنسبة لخطأ الأقران ، لدي شيء مثل هذا:

// Non-Fatal error:
// 'peer-unavailable' = maybe they left?
// 'disconnected' = this means the Peering server disconnected, we have a seperate retry for that on('disconnect')
// pretty much all of the rest are fatal.
const FATAL_ERRORS = ['invalid-id', 'invalid-key', 'network', 'ssl-unavailable', 'server-error', 'socket-error', 'socket-closed', 'unavailable-id', 'webrtc'];
this.peer.on('error', (e) => {
        if (FATAL_ERRORS.includes(e.type)) {
          this.reconnectTimeout(e); // this function waits then tries the entire connection over again
        } else {
          console.log('Non fatal error: ',  e.type);
        }
      });

ثم بالنسبة للاتصال (mediaConnection في حالتي) لدي هذا.

call.on('error', (e) => {
      console.warn('error with stream', e);
      if (initiator) { // initiator is a value I set myself
        // Optionally this should call only the user that failed instead of the whole thing
        this.reconnectTimeout();
      }
    });

والدالة المذكورة أعلاه reconnectTimeout هي وظيفة بسيطة تحاول الاتصال بالكامل مرة أخرى.

من الناحية النظرية ، يمكن لهذه المكتبة أن تتعامل مع iceRestarts ولن تكون قاتلة عند قطع الاتصال بالجليد ، والذي أعتقد أنه سيحل معظم المشكلات. لديّ PR لشيء قطع الاتصال ، لكن ليس بعد لإعادة التشغيل.

سيدي أنا أستخدم peer.js للمشروع بأكمله هنا رابط ملف peerjs
https://github.com/peers/peerjs/blob/master/dist/peerjs.js

ما أواجهه الآن من مشكلة عندما قام اثنان من الأقران بالاتصال ببعضهما البعض لإجراء مكالمة فيديو ، عندما يحصل أحد الأقران على اتصال بطيء في اتصال iceconnection افصل كلا النظراء

وهذا هو الكود الموجود في ملف peerjs حيث يتم فصل كلا النظير

""
peerConnection.oniceconnectionstatechange = function () {
التبديل (peerConnection.iceConnectionState) {
الحالة "الفاشلة":
logger_1.default.log ("فشل iceConnectionState ، إغلاق الاتصالات بـ" + peerId) ؛

      _this.connection.emit(enums_1.ConnectionEventType.Error, new Error("Negotiation of connection to " + peerId + " failed."));

      _this.connection.close();

      break;

    case "closed":
      logger_1.default.log("iceConnectionState is closed, closing connections to " + peerId);

      _this.connection.emit(enums_1.ConnectionEventType.Error, new Error("Connection to " + peerId + " closed."));

      _this.connection.close();

      break;

    case "disconnected":
      logger_1.default.log("iceConnectionState is disconnected, closing connections to " + peerId);

      _this.connection.emit(enums_1.ConnectionEventType.Error, new Error("Connection to " + peerId + " disconnected."));

      _this.connection.close();

      break;

    case "completed":
      peerConnection.onicecandidate = util_1.util.noop;
      break;
  }

  _this.connection.emit(enums_1.ConnectionEventType.IceStateChanged, peerConnection.iceConnectionState);
}; // DATACONNECTION.

please check this code 

الحالة "غير متصلة":
logger_1.default.log ("iceConnectionState غير متصل ، يتم إغلاق الاتصالات بـ" + peerId) ؛

      _this.connection.emit(enums_1.ConnectionEventType.Error, new Error("Connection to " + peerId + " disconnected."));

      **_this.connection.close();**

""

هنا اقترب الاتصال وهنا أريد إعادة توصيل اتصال الجليد

نعيد قراءة ردي. شرحت ذلك بوضوح كما أعرف كيف.

لن تسمح لك هذه المكتبة بإجراء استعادة رشيقة للحالة غير المتصلة لأنها تغلق الاتصال على الفور. الشيء الوحيد الذي يمكنك فعله هو الاستماع إلى ("خطأ") ثم الاتصال بنفس الطريقة التي قمت بها بالضبط عند إعداد اتصالك الأصلي. إنه ألم كبير.

خيارك الآخر الوحيد هو تفرعها ، أو استخدام شوكة بلدي هنا: https://github.com/peers/peerjs/pull/655

أي خيار آخر؟ أو إذا كنت تستطيع مساعدتي في peer js أين وما هو الرمز الذي يجب أن أكتبه عند الخطأ؟
أنا عالق حقا يا سيدي ....

jrowny شكرا على التحقيق. سنقوم بشحنه في 1.3.0

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات