initWebsocket method

Future<void> initWebsocket([
  1. bool reconnect = true
])

Implementation

Future<void> initWebsocket([bool reconnect = true]) async {
  if (_closed) return;

  reconnectWSCount++;
  if (reconnectWSCount > 10) {
    // if reconnected ws for more than 10 times, do a clean reconnct
    connDelay();
    return;
  }

  try {
    var hashSalt = _nonce.hashSalt(salt);
    var wsUrl = '$_wsUpdateUri&auth=$hashSalt&format=$format';
    if (tokenHash != null) {
      wsUrl = '$wsUrl$tokenHash';
    }

    var socket = await HttpHelper.connectToWebSocket(
      wsUrl,
      useStandardWebSocket: useStandardWebSocket,
    );

    _wsConnection = WebSocketConnection(
      socket,
      clientLink: this,
      enableTimeout: true,
      enableAck: enableAck,
      useCodec: DsCodec.getCodec(format),
    );

    logger.info(formatLogMessage('Connected'));
    if (!_onConnectedCompleter.isCompleted) {
      _onConnectedCompleter.complete();
    }

    // Reset delays, we've successfully connected.
    _connDelay = 0;
    _wsDelay = 0;

    if (responder != null) {
      responder!.connection = _wsConnection?.responderChannel;
    }

    if (requester != null) {
      await _wsConnection?.onRequesterReady.then((channel) {
        requester!.connection = channel;
        if (!_onRequesterReadyCompleter.isCompleted) {
          _onRequesterReadyCompleter.complete(requester);
        }
      });
    }

    await _wsConnection?.onDisconnected.then((connection) {
      initWebsocket();
    });
  } catch (error, stack) {
    logger.fine(
      formatLogMessage('Error while initializing WebSocket'),
      error,
      stack,
    );
    if (error is WebSocketException &&
        (error.message.contains(
              'not upgraded to websocket',
            ) // error from dart
            ||
            error.message.contains('(401)') // error from nodejs
            )) {
      connDelay();
    } else if (reconnect) {
      DsTimer.timerOnceAfter(
        initWebsocket,
        _wsDelay == 0 ? 20 : _wsDelay * 500,
      );
      if (_wsDelay < 30) _wsDelay++;
    }
  }
}