httpPushConnect function

PushConnect httpPushConnect({
  1. Client? client,
})

package:http 기반 PushConnect — 실시간 푸시 신호(SSE) 연결.

Flutter Web 주의: 브라우저 백엔드(BrowserClient)는 XHR 기반이라 응답을 끝까지 모아 한 번에 넘긴다 — SSE처럼 열어 두는 스트림에서는 신호가 제때 도착하지 않는다. 웹에서는 브라우저의 EventSource를 PushConnect로 감싸 넣는다(코어는 함수 하나만 요구하므로 이음새는 그대로다):

import 'package:web/web.dart' as web;

PushConnect eventSourceConnect() => (url) async {
      final source = web.EventSource(url);
      final controller = StreamController<String>(onCancel: source.close);
      source.addEventListener('manifest', (web.Event _) {
        controller.add('event: manifest\ndata: {}\n\n'); // 파서가 읽는 프레임 형태 그대로
      }.toJS);
      return PushResponse(200, controller.stream);
    };

폴링이 갱신의 보장선이므로, 웹에서 이 어댑터를 그대로 써도 기능이 깨지지는 않는다(지연만 남는다).

Implementation

PushConnect httpPushConnect({http.Client? client}) {
  final c = client ?? http.Client();
  return (String url) async {
    final request = http.Request('GET', Uri.parse(url))..headers['accept'] = 'text/event-stream';
    final response = await c.send(request);
    return PushResponse(response.statusCode, response.stream.transform(utf8.decoder));
  };
}