postStream<T> static method
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;
}