fetchLive method

Stream<SanityQueryResponse> fetchLive(
  1. String query, {
  2. Map<String, String>? params,
  3. dynamic includeDrafts = false,
})

Fetches data from Sanity using Server-Sent Events (SSE) for live updates.

includeDrafts whe true it will also listen to draft changes.

Implementation

Stream<SanityQueryResponse> fetchLive(
  String query, {
  Map<String, String>? params,
  includeDrafts = false,
}) {
  assert(
    includeDrafts
        ? config.perspective == Perspective.drafts && !config.useCdn
        : true,
    'When includeDrafts is true, the config must have perspective set to previewDrafts and useCdn set to false',
  );

  final liveConfig = includeDrafts ? LiveConfig.withDrafts() : LiveConfig();
  final sanityRequest = SanityRequest(
    urlBuilder: urlBuilder,
    query: '',
    live: liveConfig,
  );

  final uri = sanityRequest.getUri;

  final headers = Map<String, String>.from(_requestHeaders);
  headers['Accept'] = 'text/event-stream';

  final controller = StreamController<SanityQueryResponse>();

  final flux = SanityConfig.createEventFlux();

  flux.connect(
    EventFluxConnectionType.get,
    uri.toString(),
    autoReconnect: true,
    reconnectConfig: ReconnectConfig(
      mode: ReconnectMode.linear,
      maxAttempts: 5,
      onReconnect: () => debugPrint('Reconnected to Live API'),
    ),
    header: headers,
    httpClient: _EventFluxHttpClientAdapter(httpClient: httpClient),
    tag: query,
    onSuccessCallback: (response) {
      if (response == null || response.stream == null) {
        throw LiveConnectException('With query: $query, params: $params');
      }

      _onLiveConnectCallback(query, params, config: (
        liveConfig: liveConfig,
        controller: controller,
        stream: response.stream!,
        flux: flux,
      ));
    },
    onError: (error) {
      controller.close();
      throw LiveConnectException(
          'With query: $query, params: $params, error: $error');
    },
  );

  return controller.stream;
}