respondEvents method
void
respondEvents(})
Answers with a stream of server-sent events, as an
EventStream endpoint does: Content-Type: text/event-stream (unless
headers set another), then events, one chunk each. Data that is
not a String is written as JSON. The stream ends after the last
event, so a client that reconnects sends a new request; with
keepOpen it stays open until the client cancels.
transport.when(HttpMethod.get, '/orders/events').respondEvents([
ServerSentEvent({'id': 1, 'status': 'NEW'}, id: '1'),
]);
Implementation
void respondEvents(
List<ServerSentEvent<Object?>> events, {
int status = 200,
bool keepOpen = false,
Map<String, String> headers = const {},
}) {
final responseHeaders = HttpHeaders(headers);
if (!responseHeaders.contains(HttpHeaders.contentTypeHeader)) {
responseHeaders.set(
HttpHeaders.contentTypeHeader,
MediaType.textEventStream,
);
}
respondStream(status, () async* {
for (final event in events) {
yield utf8.encode(
event.encode((data) => data is String ? data : jsonEncode(data)),
);
}
if (keepOpen) {
await Completer<void>().future;
}
}, headers: responseHeaders.toMap());
}