respondEvents method

void respondEvents(
  1. List<ServerSentEvent<Object?>> events, {
  2. int status = 200,
  3. bool keepOpen = false,
  4. Map<String, String> headers = const {},
})

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());
}