sendMessageStream method

  1. @override
Stream<Message> sendMessageStream(
  1. ConversationHandle conversation,
  2. String messageJson, {
  3. String? extraContextJson,
})
override

Implementation

@override
Stream<Message> sendMessageStream(
  ConversationHandle conversation,
  String messageJson, {
  String? extraContextJson,
}) {
  if (extraContextJson != null) {
    return Stream.error(
      UnsupportedError(
        'Per-message extraContext is not supported by the LiteRT-LM JS SDK. '
        'Use ConversationConfig.extraContext on web.',
      ),
    );
  }
  final jsConversation = conversation as _WebConversationHandle;
  late StreamController<Message> controller;
  JSObject? streamCallback;

  controller = StreamController<Message>(
    onListen: () {
      final onChunk = ((JSAny chunk) {
        controller.add(Message.fromJsonString(_stringifyJson(chunk)));
      }).toJS;
      final onError = ((JSAny error) {
        controller.addError(LiteRtLmException(error.toString()));
        unawaited(controller.close());
      }).toJS;
      final onDone = (() {
        unawaited(controller.close());
      }).toJS;

      streamCallback = _startMessageStream(
        jsConversation.conversation,
        _parseJson(messageJson),
        onChunk,
        onError,
        onDone,
      );
    },
    onCancel: () {
      final callback = streamCallback;
      if (callback != null) {
        callback.callMethod<JSAny?>('cancel'.toJS);
      }
      return null;
    },
  );

  return controller.stream;
}