connect method

void connect()

Connect to the WebSocket server

Implementation

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

  try {
    GlobalLogger().i('TxSocket :: connect : $hostAddress');

    final socket = await WebSocket.connect(hostAddress);
    if (!_isCurrentAttempt(generation)) {
      unawaited(socket.close());
      return;
    }

    _socket = socket;
    socket
      ..pingInterval = const Duration(seconds: 10)
      ..timeout(const Duration(seconds: 30));

    // Initialize connection tracking
    initializePingTracking();

    socket.listen(
      (dynamic data) {
        if (!_isActiveSocket(generation, socket)) return;

        // Check if this is a ping/pong message
        if (isPingMessage(data)) {
          handlePingReceived();
        }
        messageCallback.call(data);
      },
      onDone: () {
        if (!_isActiveSocket(generation, socket)) return;

        cleanPingIntervals();
        closeCallback.call(
          socket.closeCode ?? 0,
          socket.closeReason ?? 'Closed for unknown reason',
        );
        if (identical(_socket, socket)) {
          _socket = null;
        }
      },
    );

    openCallback.call();
    if (!_isActiveSocket(generation, socket)) {
      unawaited(socket.close());
      return;
    }

    // Emit initial calculating state
    emitInitialMetrics();
  } catch (e) {
    if (!_isCurrentAttempt(generation)) return;

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