connect method

  1. @override
Future connect()
override

Implementation

@override
Future connect() async {
  if (_closed) {
    return;
  }

  lockCryptoProvider();
  DsTimer.timerCancel(initWebsocket);

  var headers = {'Content-Type': 'application/json'};

  var connUrl = '$_conn?dsId=${Uri.encodeComponent(dsId)}';
  if (home != null) {
    connUrl += '&home=$home';
  }
  if (tokenHash != null) {
    connUrl = '$connUrl$tokenHash';
  }
  var connUri = Uri.parse(connUrl);
  logger.info(formatLogMessage('Connecting to $_conn'));

  try {
    var handshakePayload = jsonEncode({
      'publicKey': privateKey.publicKey.qBase64,
      'isRequester': requester != null,
      'isResponder': responder != null,
      'formats': formats,
      'version': DSA_VERSION,
      'enableWebSocketCompression': true,
      if (linkData != null) 'linkData': linkData,
    });

    http.Response response = await http
        .post(connUri, headers: headers, body: handshakePayload)
        .timeout(Duration(minutes: 1));

    if (response.statusCode == 301 || response.statusCode == 302) {
      var newUrl = response.headers['location'];
      if (newUrl != null) {
        response = await http.post(
          Uri.parse(newUrl),
          headers: headers,
          body: handshakePayload,
        );
      } else {
        logger.finest(
          formatLogMessage('Handshake Response: ${response.statusCode}'),
        );
      }
    }

    if (response.statusCode != 200) {
      logger.warning(
        'Handshake failed with status code: ${response.statusCode}',
      );
      return;
    }

    var serverConfig = jsonDecode(response.body);
    logger.finest(formatLogMessage('Handshake Response: $serverConfig'));

    salt = serverConfig['salt'];

    String? tempKey = serverConfig['tempKey'];
    if (tempKey == null) {
      _nonce = const DummyECDH();
    } else {
      _nonce = await privateKey.getSecret(tempKey);
    }

    enableAck = serverConfig.containsKey('version');
    remotePath = serverConfig['path'];

    if (serverConfig['wsUri'] is String) {
      _wsUpdateUri =
          '${connUri.resolve(serverConfig['wsUri'])}?dsId=${Uri.encodeComponent(dsId)}'
              .replaceFirst('http', 'ws');
      if (home != null) {
        _wsUpdateUri = '$_wsUpdateUri&home=$home';
      }
    }

    if (serverConfig['format'] is String) {
      format = serverConfig['format'];
    }

    await initWebsocket(false);
  } catch (e, stackTrace) {
    logger.warning('Client socket crashed: $e\n$stackTrace');
    connDelay();
  }
}