listen method
void
listen(})
override
Implementation
@override
void listen(void Function(dynamic) onData, String channelName, {bool isPrivate = false}) {
try {
final channelPrefix = options.usePrefix ? options.privatePrefix : '';
final fullChannelName = isPrivate ? '$channelPrefix$channelName' : channelName;
_subscribe(channelName, null);
_channel.stream.listen(
(message) async {
try {
final Map<String, dynamic> jsonMessage = jsonDecode(message);
final response = WebsocketResponse.fromJson(jsonMessage);
if (response.event == 'pusher:connection_established') {
final socketId = response.data?['socket_id'];
if (socketId == null) {
throw Exception('Socket ID is missing');
}
if (isPrivate) {
final authToken = await _authenticate(socketId, fullChannelName);
_subscribe(fullChannelName, authToken!, isPrivate: isPrivate);
} else {
_subscribe(fullChannelName, null, isPrivate: isPrivate);
}
} else if (response.event == 'pusher:ping') {
_channel.sink.add(jsonEncode({'event': 'pusher:pong'}));
}
onData(response);
} catch (e) {
_logger.e('Error processing message: $e');
}
},
onError: (error) => _logger.e('WebSocket error: $error'),
onDone: () => _logger.i('Connection closed: $channelName'),
);
} catch (e) {
_logger.e('Failed to listen to WebSocket: $e');
rethrow;
}
}