sendMessageStream method

Stream<Message> sendMessageStream(
  1. Message message, {
  2. Map<String, Object?>? extraContext,
})

Sends a message to the conversation and streams the response.

Implementation

Stream<Message> sendMessageStream(
  Message message, {
  Map<String, Object?>? extraContext,
}) {
  late StreamController<Message> controller;
  var isCanceled = false;

  controller = StreamController<Message>(
    onListen: () {
      sendMessageWithCallback(
        message,
        _ForwardingMessageCallback(
          onMessage: (chunk) {
            if (!isCanceled) {
              controller.add(chunk);
            }
          },
          onDone: () {
            if (!isCanceled) {
              unawaited(controller.close());
            }
          },
          onError: (error, stackTrace) {
            if (!isCanceled) {
              controller.addError(error, stackTrace);
              unawaited(controller.close());
            }
          },
        ),
        extraContext: extraContext,
      ).ignore();
    },
    onCancel: () async {
      isCanceled = true;
      await cancel();
    },
  );

  return controller.stream;
}