connect method

  1. @override
void connect(
  1. Uri uri,
  2. VoidCallback onConnected,
  3. StringCallback onError, {
  4. int timeoutSeconds = 15,
  5. bool ignoreBadCert = false,
})
override

Connects the socket to uri then invokes onConnected or onError.

Implementation

@override
void connect(Uri uri, VoidCallback onConnected, StringCallback onError,
    {int timeoutSeconds = 15, bool ignoreBadCert = false}) async {
  assert(!connecting);
  connecting = true;

  if (!ignoreBadCert || !uri.hasScheme || uri.scheme != 'wss') {
    return io.WebSocket.connect('$uri')
        .timeout(Duration(seconds: timeoutSeconds))
        .then((io.WebSocket x) {
      socket = x;
      connectSucceeded(onConnected);
    }, onError: (error, _) => onError(error));
  }

  io.HttpClient client = io.HttpClient();
  client.badCertificateCallback =
      (io.X509Certificate cert, String host, int port) => true;

  /// Upgrade https to wss using [badCertificateCallback] to allow
  /// self-signed certificates.  This still gains you stream encryption.
  try {
    io.HttpClientRequest request =
        await client.getUrl(Uri.parse('https' + '$uri'.substring(3)));
    request.headers.add('Connection', 'upgrade');
    request.headers.add('Upgrade', 'websocket');
    request.headers.add('sec-websocket-version', '13');
    request.headers.add(
        'sec-websocket-key', base64.encode(randBytes(Random.secure(), 8)));

    io.HttpClientResponse response = await request.close()
      ..timeout(Duration(seconds: timeoutSeconds));

    socket = io.WebSocket.fromUpgradedSocket(await response.detachSocket(),
        serverSide: false);
    connectSucceeded(onConnected);
  } catch (error) {
    onError(error);
  }
}