Peerjs: Como o peer.js pode se reconectar ao mesmo par após a desconexão?

Criado em 14 abr. 2020  ·  7Comentários  ·  Fonte: peers/peerjs

Eu preciso saber se 2 pares estão conectados em chamada quando recebemos a mensagem - o estado de conexão do gelo está desconectado, fecha todas as janelas e dicsonnect 2 pares. Podemos reconectar quando o servidor de gelo se desconectar?

bug

Comentários muito úteis

Quero saber como posso reconectar quando o iceconnection desconectar. Eu tentei muitos códigos, mas não funciona

Esta biblioteca não permitirá que você faça uma recuperação normal do estado desconectado porque ela fecha imediatamente a conexão. A única coisa que você pode fazer é ouvir on('error') e, em seguida, conectar-se exatamente da mesma forma que fez quando configurou sua conexão original. É uma grande dor.

nota: existem dois locais para verificar se há erros. No próprio peer e na própria conexão. Na conexão, eles são quase todos fatais do jeito que esta biblioteca é agora, embora não devessem ser. No próprio peer, muitos dos erros são fatais, mas não todos.

Para erros de soquete no par, tenho algo assim:

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

onde backoff é um valor em segundos que eu incremento toda vez que tento até o máximo.

Para o erro de par, tenho algo assim:

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

E então para a conexão (mediaConnection no meu caso) eu tenho isso.

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

E o mencionado reconnectTimeout é uma função simples que tenta a conexão inteira novamente.

Em teoria, essa biblioteca poderia lidar com iceRestarts e não ser fatal na desconexão do gelo, o que eu acredito que resolveria a maioria dos problemas. Eu tenho um PR para a coisa de desconexão, mas ainda não para as reinicializações.

Todos 7 comentários

O estado de gelo desconectado deve ser recuperável, mas atualmente esta biblioteca fecha a conexão prematuramente. Até que isso seja resolvido, o melhor que você pode fazer é colocar um timer em erro e reconectar.

Quero saber como posso reconectar quando o iceconnection desconectar. Eu tentei muitos códigos, mas não funciona

Quero saber como posso reconectar quando o iceconnection desconectar. Eu tentei muitos códigos, mas não funciona

Esta biblioteca não permitirá que você faça uma recuperação normal do estado desconectado porque ela fecha imediatamente a conexão. A única coisa que você pode fazer é ouvir on('error') e, em seguida, conectar-se exatamente da mesma forma que fez quando configurou sua conexão original. É uma grande dor.

nota: existem dois locais para verificar se há erros. No próprio peer e na própria conexão. Na conexão, eles são quase todos fatais do jeito que esta biblioteca é agora, embora não devessem ser. No próprio peer, muitos dos erros são fatais, mas não todos.

Para erros de soquete no par, tenho algo assim:

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

onde backoff é um valor em segundos que eu incremento toda vez que tento até o máximo.

Para o erro de par, tenho algo assim:

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

E então para a conexão (mediaConnection no meu caso) eu tenho isso.

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

E o mencionado reconnectTimeout é uma função simples que tenta a conexão inteira novamente.

Em teoria, essa biblioteca poderia lidar com iceRestarts e não ser fatal na desconexão do gelo, o que eu acredito que resolveria a maioria dos problemas. Eu tenho um PR para a coisa de desconexão, mas ainda não para as reinicializações.

Senhor, estou usando peer.js para todo o projeto, aqui está o link para o arquivo peerjs
https://github.com/peers/peerjs/blob/master/dist/peerjs.js

agora o que estou tendo problema quando 2 pares se conectam para videochamada, quando um par obtém uma conexão lenta iceconnection desconecte os dois pares

e este é o código no arquivo peerjs onde está desconectando ambos

`` `
peerConnection.oniceconnectionstatechange = function () {
switch (peerConnection.iceConnectionState) {
caso "falhou":
logger_1.default.log ("iceConnectionState falhou, fechando conexões com" + 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, fechando conexões com" + peerId);

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

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

`` `

aqui a conexão chega perto e aqui eu quero reconectar a conexão de gelo

Releia minha resposta. Expliquei tão claramente quanto sei.

Esta biblioteca não permitirá que você faça uma recuperação normal do estado desconectado porque ela fecha imediatamente a conexão. A única coisa que você pode fazer é ouvir ('erro') e conectar da mesma forma que você fez quando configurou sua conexão original. É uma grande dor.

Sua única outra opção é fazer um fork ou usar meu fork aqui: https://github.com/peers/peerjs/pull/655

alguma outra opção? ou se você pode me ajudar em peer js onde e qual código devo escrever em caso de erro?
estou realmente preso senhor ....

@jrowny obrigado por uma investigação. vamos enviá-lo em 1.3.0

Esta página foi útil?
0 / 5 - 0 avaliações