aiSseDataEvents function

Stream<String> aiSseDataEvents(
  1. Stream<String> chunks
)

Parses Server-Sent Events and yields each data: payload.

Implementation

Stream<String> aiSseDataEvents(Stream<String> chunks) async* {
  var buffer = '';

  await for (final chunk in chunks) {
    buffer += chunk.replaceAll('\r\n', '\n');

    while (true) {
      final boundary = buffer.indexOf('\n\n');
      if (boundary == -1) break;

      final rawEvent = buffer.substring(0, boundary);
      buffer = buffer.substring(boundary + 2);
      final data = _sseDataFromRawEvent(rawEvent);
      if (data != null) yield data;
    }
  }

  final tail = buffer.trim();
  if (tail.isNotEmpty) {
    final data = _sseDataFromRawEvent(tail);
    if (data != null) yield data;
  }
}