connect method

Future<WebSocketChannel?> connect({
  1. Duration? timeout,
})

Connects the WebSocket. timeout is optional.

Implementation

Future<WebSocketChannel?> connect({Duration? timeout}) async {
  if (timeout != null) {
    var c = Completer<WebSocketChannel>();
    late Timer timer;

    timer = Timer(timeout, () {
      if (!c.isCompleted) {
        if (timer.isActive) timer.cancel();
        c.completeError(
          TimeoutException(
            'WebSocket connection exceeded timeout of ${timeout.inMilliseconds} ms',
            timeout,
          ),
        );
      }
    });

    scheduleMicrotask(() {
      getConnectedWebSocket()
          .then((socket) {
            if (!c.isCompleted) {
              if (timer.isActive) timer.cancel();

              while (_queue.isNotEmpty) {
                var action = _queue.removeFirst();
                socket.sink.add(serialize(action));
              }

              c.complete(socket);
            }
          })
          .catchError((e, StackTrace st) {
            if (!c.isCompleted) {
              if (timer.isActive) {
                timer.cancel();
              }

              // TODO: Re-evaluate this error
              var obj = 'Error';
              c.completeError(obj, st);
            }
          });
    });

    return await c.future.then((socket) {
      _socket = socket;
      listen();

      return _socket;
    });
  } else {
    _socket = await getConnectedWebSocket();
    listen();
    return _socket;
  }
}