diff --git a/lib/src/http/response/response.dart b/lib/src/http/response/response.dart index 726ca16..66f239d 100644 --- a/lib/src/http/response/response.dart +++ b/lib/src/http/response/response.dart @@ -8,6 +8,7 @@ enum ResponseType { json, none, html, + sse, streamFile, download, } @@ -29,6 +30,25 @@ class Response { this.headers = const {}, }); + @protected + Future sseHandler(HttpResponse res) async { + res.headers.contentType = ContentType.parse('text/event-stream'); + res.headers.add(HttpHeaders.cacheControlHeader, 'no-cache'); + res.headers.add(HttpHeaders.connectionHeader, 'keep-alive'); + res.headers.add(HttpHeaders.transferEncodingHeader, 'chunked'); + + void writeSSE(String data) { + res.add(utf8.encode('data: $data\n\n')); + } + + await for (var event in data) { + writeSSE(jsonEncode(event)); + await res.flush(); + } + + await res.close(); + } + void makeResponse(HttpResponse res) async { res.statusCode = httpStatusCode; if (headers.isNotEmpty) { @@ -51,6 +71,9 @@ class Response { res.write(data); await res.close(); break; + case ResponseType.sse: + await sseHandler(res); + break; case ResponseType.streamFile: StreamFile? stream = StreamFile( fileName: data['fileName'], @@ -134,6 +157,18 @@ class Response { headers: headers, ); + static sse( + Stream eventStream, { + int statusCode = HttpStatus.ok, + Map headers = const {}, + }) => + Response( + data: eventStream, + responseType: ResponseType.sse, + httpStatusCode: statusCode, + headers: headers, + ); + static download( String fileName, Uint8List bytes, {