connect method

void connect({
  1. required SocketData socketData,
  2. required TokenData tokenData,
  3. required User user,
  4. required Config config,
  5. required dynamic eventCallback(
    1. Map<String, dynamic>
    ),
})

Implementation

void connect({
  required SocketData socketData,
  required TokenData tokenData,
  required User user,
  required Config config,
  required Function(Map<String, dynamic>) eventCallback,
}) {
  Logs.info("connect called", tag: 'socket');

  // Store callback for reconnection
  _eventCallback = eventCallback;

  // Store connection parameters
  this.tokenData = tokenData;
  this.user = user;
  this.config = config;

  // Idempotent: already connected with valid socket
  if (socket != null && socket!.connected) {
    Logs.warning(
        "Socket already connected with ID: ${socket!.id}", tag: 'socket');
    Logs.warning("Skipping — already connected", tag: 'socket');
    return;
  }

  // Idempotent: connection already in progress
  if (_isConnecting) {
    Logs.warning("Connection already in progress — skipping duplicate",
        tag: 'socket');
    return;
  }

  // Clean up old socket if it exists but is disconnected
  if (socket != null) {
    Logs.warning("Disposing old disconnected socket before creating new one", tag: 'socket');
    try {
      socket!.dispose();
    } catch (e) {
      Logs.logError("Error disposing old socket", tag: 'socket', error: e);
    }
    socket = null;
    _eventListenerRegistered = false;
    _openInteractionCalled = false;
    _lastOpenInteractionTime = null;
  }

  Logs.info("Creating NEW socket connection", tag: 'socket');
  _isConnecting = true;

  socket = io(
      socketData.server,
      OptionBuilder()
          .setTransports(['websocket', 'polling'])
          .disableAutoConnect()
          .setPath(socketData.socketPath!)
          .setTimeout(60000)
          .setReconnectionDelay(1000)
          .setReconnectionDelayMax(5000)
          .enableReconnection()
          .setQuery({
            "id": user.participantId,
            "queue": tokenData.queue,
            "role": 'customer',
            "appId": tokenData.id,
            "token": tokenData.socketToken,
            "page": tokenData.page,
            "title": tokenData.title
          })
          .build());

  socket!
    ..onConnect((_) => _onConnect())
    ..onDisconnect((_) => _onDisconnect())
    ..onConnectError((err) => _onConnectError(err))
    ..onError((err) => _onError(err))
    ..onReconnect((_) => _onReconnect())
    ..onReconnectAttempt((attempt) => _onReconnectAttempt(attempt))
    ..onReconnectError((error) => _onReconnectError(error))
    ..onReconnectFailed((_) => _onReconnectFailed())
    ..connect();
}