connect method

void connect()

Connect to the WebSocket server

Implementation

void connect() {
  final generation = ++_connectGeneration;
  final openCallback = onOpen;
  final messageCallback = onMessage;
  final closeCallback = onClose;

  try {
    final socket = WebSocket(hostAddress);

    socket.onOpen.listen((e) {
      if (!_isCurrentAttempt(generation)) {
        socket.close();
        return;
      }

      _socket = socket;

      // Initialize connection tracking
      initializePingTracking();

      openCallback.call();
      if (_isActiveSocket(generation, socket)) {
        // Emit initial calculating state
        emitInitialMetrics();
      } else {
        socket.close();
      }
    });

    socket.onMessage.listen((e) {
      if (!_isActiveSocket(generation, socket)) return;

      // Check if this is a ping/pong message
      if (isPingMessage(e.data)) {
        handlePingReceived();
      }
      messageCallback.call(e.data);
    });

    socket.onClose.listen((e) {
      if (!_isActiveSocket(generation, socket)) return;

      cleanPingIntervals();
      closeCallback.call(
        e.code ?? 0,
        e.reason ?? 'Closed for unknown reason',
      );
      if (identical(_socket, socket)) {
        _socket = null;
      }
    });
  } catch (e) {
    if (!_isCurrentAttempt(generation)) return;

    cleanPingIntervals();
    closeCallback.call(500, e.toString());
  }
}