postStream<T> static method

Stream<T> postStream<T>({
  1. required String to,
  2. required T onSuccess(
    1. Map<String, dynamic>
    ),
  3. required Map<String, dynamic> body,
})

Implementation

static Stream<T> postStream<T>({
  required String to,
  required T Function(Map<String, dynamic>) onSuccess,
  required Map<String, dynamic> body,
}) {
  StreamController<T> controller = StreamController<T>();

  final http.Client client = http.Client();
  http.Request request = http.Request(
    "POST",
    Uri.parse(to),
  );
  request.headers.addAll(AIConfigBuilder.instance.headers());
  request.body = jsonEncode(body);

  void close() {
    client.close();
    controller.close();
  }

  AILogger.log("starting request to $to");
  client.send(request).then(
    (respond) {
      AILogger.log("Starting to reading stream response");
      respond.stream.listen((value) {
        final String data = utf8.decode(value);

        final List<String> dataLines =
            data.split("\n").where((element) => element.isNotEmpty).toList();

        for (String line in dataLines) {
          if (line.startsWith("data: ")) {
            final String data = line.substring(6);
            if (data.startsWith("[DONE]")) {
              AILogger.log("stream response is done");
              return;
            }

            final decoded = jsonDecode(data) as Map<String, dynamic>;

            controller.add(onSuccess(decoded));
          }
        }
      }, onDone: () {
        close();
      }, onError: (error) {
        controller.addError(error);
      });
    },
  );

  return controller.stream;
}