connect method
Implementation
Future<void> connect(String channelId, [String? firstMessage]) async {
try {
_channelId = channelId;
final wsUrl = '$baseWsUrl/$channelId';
print('Attempting to connect to WebSocket...');
_socket = await WebSocket.connect(wsUrl);
print('WebSocket connection established successfully!');
// Initialize message controller if not already done
_messageController ??= StreamController<Map<String, dynamic>>.broadcast();
// Send initial connection message
final initialMessage = {
'firstMsg': 'client',
'usernameCookie': '',
'message':
(firstMessage != null && firstMessage.isNotEmpty)
? firstMessage
: null,
'chatInstanceId': null,
'channelID': channelId,
};
// print('Sending initial connection message: $initialMessage');
_socket!.add(jsonEncode(initialMessage));
_socket!.listen(
(data) {
if (_messageController?.isClosed == false) {
final message = jsonDecode(data);
print('Received message');
// print(message);
// Store instanceId from first response
if (_instanceId == null && message['instanceId'] != null) {
_instanceId = message['instanceId'];
print('Stored instanceId: $_instanceId');
// Save instance ID to local storage
_saveInstanceId(_instanceId!);
// Send first message after we have instanceId
if (firstMessage != null && firstMessage.isNotEmpty) {
final messageId = generateUniqueId();
final timestamp = DateTime.now().millisecondsSinceEpoch / 1000;
final newMessage = {
'instanceId': _instanceId,
"channelID": channelId,
"messageId": messageId,
"timestamp": timestamp,
"chatMessage": {
"message": firstMessage,
"realMessage": firstMessage,
"displayType": "text",
"chatSide": "incoming",
},
};
print('Sending initial message: $newMessage');
_messageController?.add(newMessage);
}
}
_messageController?.add(message);
}
},
onError: (error) {
print('WebSocket Error: $error');
},
onDone: () {
print('WebSocket connection closed');
disconnect();
},
);
} catch (e) {
print('WebSocket connection error: $e');
}
}