parseSseEvents<T> function
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")
: "",
);
}