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 {
  uri = '$uri'.startsWith('wss')
      ? Uri.parse('https' + '$uri'.substring(3))
      : Uri.parse('http' + '$uri'.substring(2));

  if (!tunneledSocket.connected && !tunneledSocket.connecting) {
    tunneledSocket = await connectUri(uri, tunneledSocket,
        secureUpgrade: (SocketInterface x) async =>
            SocketImpl(await io.SecureSocket.secure(
              SocketAdaptor(x),

              /// https://github.com/dart-lang/sdk/issues/39690
              /*io.Socket.fromRaw(RawSocketAdaptor(
                x,
                address: tryParseInternetAddress('127.0.0.1'),
                remoteAddress: (await io.InternetAddress.lookup(uri.host)).first,
                port: 1234,
                remotePort: uri.port,
                debugPrint: debugPrint,
              )),*/
              onBadCertificate: (io.X509Certificate certificate) =>
                  ignoreBadCert,
            )));
  }

  HttpResponse response = await httpRequest(
    uri,
    'GET',
    tunneledSocket,
    requestHeaders: <String, String>{
      'Connection': 'upgrade',
      'Upgrade': 'websocket',
      'sec-websocket-version': '13',
      'sec-websocket-key': base64.encode(randBytes(Random.secure(), 8))
    },
    debugPrint: debugPrint,
  );
  if (response.status == 101) {
    socket = io.WebSocket.fromUpgradedSocket(
        SocketAdaptor(
          tunneledSocket,
          address: tryParseInternetAddress('127.0.0.1'),
          remoteAddress: (await io.InternetAddress.lookup(uri.host)).first,
          port: 1234,
          remotePort: uri.port,
          debugPrint: debugPrint,
        ),

        /// https://github.com/dart-lang/sdk/issues/39690
        /*io.Socket.socketFromRaw(RawSocketAdaptor(
          tunneledSocket,
          address: tryParseInternetAddress('127.0.0.1'),
          remoteAddress: (await io.InternetAddress.lookup(uri.host)).first,
          port: 1234,
          remotePort: uri.port,
          debugPrint: debugPrint,
        )),*/
        serverSide: false);
    onConnected();
  } else {
    onError('status ${response.status} ${response.reason}');
  }
  tunneledSocket = null;
}