initSocket method

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

  // 🔥 CRITICAL FIX: Check if socket already exists and is connected
  if (socket != null && socket!.connected) {
    Logs.warning("Socket already connected with ID: ${socket!.id}",
        tag: 'socket');
    Logs.warning("Reusing existing socket connection - PREVENTING DUPLICATE!",
        tag: 'socket');
    // Update user/config in case they changed
    this.tokenData = tokenData;
    this.user = user;
    this.config = config;
    return; // 🔥 Don't create a new socket!
  }

  // 🔥 CRITICAL FIX: Dispose old socket if it exists but is disconnected
  if (socket != null) {
    Logs.warning("Disposing old disconnected socket", tag: 'socket');
    try {
      socket!.dispose();
    } catch (e) {
      Logs.logError("Error disposing old socket", tag: 'socket', error: e);
    }
    _eventListenerRegistered = false;
    _openInteractionCalled = false;
    _lastOpenInteractionTime = null;
  }

  Logs.info("Creating NEW socket connection", tag: 'socket');
  this.tokenData = tokenData;
  this.user = user;
  this.config = config;
  socket = io(
      socketData.server,
      OptionBuilder()
          .setTransports(['websocket', 'polling'])
          .disableAutoConnect()
          .setReconnectionAttempts(5)
          .setPath(socketData.socketPath!)
          .setQuery({
            "id": user.participantId,
            "queue": tokenData.queue,
            "role": 'customer',
            "appId": tokenData.id,
            "token": tokenData.socketToken,
            "page": tokenData.page,
            "title": tokenData.title
          })
          .build());

  socket!.connect();

  socket!.onConnect((_) {
    Logs.info("Connection established - Socket ID: ${socket!.id}",
        tag: 'connection');
    _isInitialized = true;
    eventListener(callback: eventCallback);
  });

  socket!.onDisconnect((_) {
    Logs.warning("Connection Disconnection - Socket ID: ${socket?.id}",
        tag: 'connection');
    _isInitialized = false;
  });

  socket!.onConnectError((err) {
    Logs.logError("Connection Error", tag: 'connection', error: err);
    _isInitialized = false;
  });

  socket!.onError((err) {
    Logs.logError("Socket Error", tag: 'socket', error: err);
  });
}