vania-dart / framework

Fast, simple, and powerful backend framework for Dart built with ❤️
https://vdart.dev
MIT License
155 stars 12 forks source link

How does Response support returning to SSE #89

Closed Dartly closed 1 week ago

Dartly commented 1 week ago

How does Response support returning to SSE

Dartly commented 1 week ago

I added the sse method

import 'dart:convert';
import 'dart:io';
import 'dart:typed_data';
import 'package:meta/meta.dart';
import 'package:vania/src/http/response/stream_file.dart';

enum ResponseType {
  ...
  sse,
}

class Response {
       ...
      case ResponseType.sse:
        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();
        break;
      default:
        res.write(data);
        await res.close();
    }
  }

  ...
  static sse(
      Stream<dynamic> eventStream, {
        int statusCode = HttpStatus.ok,
        Map<String, String> headers = const {},
      }) =>
      Response(
        data: eventStream,
        responseType: ResponseType.sse,
        httpStatusCode: statusCode,
        headers: headers,
      );
}
javad-zobeidi commented 1 week ago

@Dartly your code merged (#90)

Thank you,