parseSseEvents<T> function

ParseSseEventsResult<T> parseSseEvents<T>(
  1. String input,
  2. T dataParser(
    1. String
    )
)

Implementation

ParseSseEventsResult<T> parseSseEvents<T>(
  String input,
  T Function(String) dataParser,
) {
  final List<SseEvent<T>> events = [];
  String? id;
  String? event;
  String? data;
  int? retry;
  final splitter = LineSplitter();
  final lines = splitter.convert(input);
  int? lastIndex = 0;
  for (var i = 0; i < lines.length; i++) {
    final line = lines[i];
    final isEnd = line == "";
    if (line.isNotEmpty) {
      final lineResult = SseLineResult.fromString(line);
      switch (lineResult.type) {
        case SseLineResultType.id:
          id = lineResult.value;
          break;
        case SseLineResultType.event:
          event = lineResult.value;
          break;
        case SseLineResultType.data:
          data = lineResult.value;
          break;
        case SseLineResultType.retry:
          retry = int.tryParse(lineResult.value);
          break;
        case SseLineResultType.none:
          break;
      }
    }
    if (isEnd) {
      if (data != null) {
        events.add(
          SseEvent.fromSseRawEvent(
            SseRawEvent(
              id: id,
              event: event ?? "message",
              data: data,
              retry: retry,
            ),
            dataParser,
          ),
        );
      }
      id = null;
      event = null;
      data = null;
      retry = null;
      lastIndex = i + 1 < lines.length ? i + 1 : null;
    }
  }

  return ParseSseEventsResult(
    events: events,
    leftoverData: lastIndex != null
        ? lines.getRange(lastIndex, lines.length).join("\n")
        : "",
  );
}