Peerjs: Как peer.js может повторно подключиться к тому же партнеру после отключения?

Созданный на 14 апр. 2020  ·  7Комментарии  ·  Источник: peers/peerjs

Мне нужно знать, подключены ли 2 пира по вызову, когда мы получаем сообщение - состояние ледяного соединения отключено, оно закрывает все окна и dicsonnect 2 peer. Можем ли мы справиться с повторным подключением при отключении ледового сервера?

Самый полезный комментарий

Я хочу знать, как я могу повторно подключиться при отключении 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

Теперь, что у меня возникает проблема, когда 2 одноранговых узла подключились друг к другу для видеозвонка, когда один одноранговый узел получает медленное соединение iceconnection отключение обоих одноранговых узлов

и это код в файле peerjs, где он отключает оба одноранговых узла

``
peerConnection.oniceconnectionstatechange = function () {
switch (peerConnection.iceConnectionState) {
case "не удалось":
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 рейтинги