listen method

  1. @override
void listen(
  1. void onData(
    1. dynamic
    ),
  2. String channelName, {
  3. bool isPrivate = false,
})
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;
  }
}