Peerjs: ¿Cómo puede peer.js volver a conectarse al mismo par después de la desconexión?

Creado en 14 abr. 2020  ·  7Comentarios  ·  Fuente: peers/peerjs

Necesito saber si 2 pares están conectados en la llamada cuando recibimos el mensaje: el estado de la conexión de hielo está desconectado, cierra todas las ventanas y dicsonnect 2 peer. ¿Podemos volver a conectarnos cuando el servidor de hielo se desconecta?

bug

Comentario más útil

Quiero saber cómo puedo volver a conectarme cuando la conexión de hielo se desconecta. He probado tantos códigos pero no funciona

Esta biblioteca no le permitirá realizar una recuperación ordenada del estado desconectado porque cierra inmediatamente la conexión. Lo único que puede hacer es escuchar on('error') y luego conectarse exactamente de la misma manera que lo hizo cuando configuró su conexión original. Es bastante doloroso.

nota: hay dos lugares para comprobar si hay errores. En el mismo par y en la propia conexión. En la conexión, son casi todos fatales como es ahora esta biblioteca, aunque no deberían serlo. En el par en sí, muchos de los errores son fatales, pero no todos.

Para errores de socket en pares, tengo algo como esto:

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

donde el retroceso es un valor en segundos que incremento cada vez que intento hasta un máximo.

Para el error de pares, tengo algo como esto:

// 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);
        }
      });

Y luego para la conexión (mediaConnection en mi caso) tengo esto.

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();
      }
    });

Y el reconnectTimeout es una función simple que intenta la conexión completa nuevamente.

En teoría, esta biblioteca podría manejar iceRestarts y no ser fatal en la desconexión del hielo, lo que creo que resolvería la mayoría de los problemas. Tengo un PR para desconectar, pero aún no para los reinicios.

Todos 7 comentarios

El estado de hielo desconectado debería ser recuperable, pero actualmente esta biblioteca cierra la conexión prematuramente. Hasta que se maneje, lo mejor que puede hacer es poner un temporizador en error y volver a conectarse.

Quiero saber cómo puedo volver a conectarme cuando la conexión de hielo se desconecta. He probado tantos códigos pero no funciona

Quiero saber cómo puedo volver a conectarme cuando la conexión de hielo se desconecta. He probado tantos códigos pero no funciona

Esta biblioteca no le permitirá realizar una recuperación ordenada del estado desconectado porque cierra inmediatamente la conexión. Lo único que puede hacer es escuchar on('error') y luego conectarse exactamente de la misma manera que lo hizo cuando configuró su conexión original. Es bastante doloroso.

nota: hay dos lugares para comprobar si hay errores. En el mismo par y en la propia conexión. En la conexión, son casi todos fatales como es ahora esta biblioteca, aunque no deberían serlo. En el par en sí, muchos de los errores son fatales, pero no todos.

Para errores de socket en pares, tengo algo como esto:

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

donde el retroceso es un valor en segundos que incremento cada vez que intento hasta un máximo.

Para el error de pares, tengo algo como esto:

// 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);
        }
      });

Y luego para la conexión (mediaConnection en mi caso) tengo esto.

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();
      }
    });

Y el reconnectTimeout es una función simple que intenta la conexión completa nuevamente.

En teoría, esta biblioteca podría manejar iceRestarts y no ser fatal en la desconexión del hielo, lo que creo que resolvería la mayoría de los problemas. Tengo un PR para desconectar, pero aún no para los reinicios.

señor, estoy usando peer.js para todo el proyecto aquí está el enlace para el archivo peerjs
https://github.com/peers/peerjs/blob/master/dist/peerjs.js

Ahora, ¿qué problema tengo cuando 2 pares se conectaron entre sí para realizar una videollamada, cuando uno de los pares obtiene una conexión lenta?

y este es el código en el archivo peerjs donde está desconectando a ambos pares

''
peerConnection.oniceconnectionstatechange = function () {
switch (peerConnection.iceConnectionState) {
caso "fallido":
logger_1.default.log ("iceConnectionState falla, cerrando conexiones a" + 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 

caso "desconectado":
logger_1.default.log ("iceConnectionState está desconectado, cerrando conexiones a" + peerId);

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

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

''

aquí la conexión se acerca y aquí quiero volver a conectar la conexión de hielo

Vuelve a leer mi respuesta. Lo expliqué tan claramente como sé.

Esta biblioteca no le permitirá realizar una recuperación ordenada del estado desconectado porque cierra inmediatamente la conexión. Lo único que puede hacer es escuchar en ('error') y luego conectarse exactamente de la misma manera que lo hizo cuando configuró su conexión original. Es bastante doloroso.

Su única otra opción es bifurcarlo, o usar mi bifurcación aquí: https://github.com/peers/peerjs/pull/655

alguna otra opción? o si me pueden ayudar en peer js, ¿dónde y qué código debo escribir en caso de error?
estoy realmente atascado señor ...

@jrowny gracias por una investigación. lo enviaremos en 1.3.0

¿Fue útil esta página
0 / 5 - 0 calificaciones