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