initSocket method
void
initSocket({})
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);
});
}