getResponseAsync method

  1. @override
Stream<String> getResponseAsync({
  1. Message? message,
})
override

Implementation

@override
Stream<String> getResponseAsync({Message? message}) async* {
  _assertNotClosed();
  await _awaitLastResponse();
  final completer = _responseCompleter = Completer<void>();
  try {
    final controller = _asyncResponseController = StreamController<String>();

    // Store subscription for proper cleanup
    _eventSubscription = eventChannel.receiveBroadcastStream().listen(
      (event) {
        // Check if controller is still open before adding events
        if (!controller.isClosed) {
          if (event is Map && event.containsKey('code') && event['code'] == "ERROR") {
            controller.addError(Exception(event['message'] ?? 'Unknown async error occurred'));
          } else if (event is Map && event.containsKey('partialResult')) {
            final partial = event['partialResult'] as String;
            controller.add(partial);
          } else {
            controller.addError(Exception('Unknown event type: $event'));
          }
        }
      },
      onError: (error, st) {
        if (!controller.isClosed) {
          controller.addError(error, st);
        }
      },
      onDone: () {
        if (!controller.isClosed) {
          controller.close();
        }
      },
    );

    if (message != null) {
      await addQueryChunk(message);
    }
    unawaited(_platformService.generateResponseAsync());

    yield* controller.stream;
  } finally {
    completer.complete();
    _asyncResponseController = null;
  }
}