call method

Renders one loaded route branch.

Implementation

Future<ServerResponse> call(RenderContext context) async {
  final accept = AcceptPreferences.parse(
    context.request.request.headers.value('accept'),
  );
  final varyAccept = Headers.single(<String, String>{'vary': 'Accept'});

  if (accept.prefersJson) {
    final query = context.request.maybe(queryClientKey);
    final state = query == null
        ? null
        : _dehydrate(query, context.serializer.encode);
    final payload = _payload(context, state);
    if (state == null ||
        !state.queries.any((query) => query.pending != null)) {
      return ServerResponse.json(payload, headers: varyAccept);
    }
    return ServerResponse(
      headers: Headers.single(<String, String>{
        'content-type': 'application/x-ndjson; charset=utf-8',
        'vary': 'Accept',
      }),
      body: _jsonHandoff(payload, _pendingFrames(query!, state)),
    );
  }

  final documents = await buildDocuments(
    context.matches,
    context.loads,
    app: context.request.app,
  );
  final document = resolveDocument(documents);
  final bootstrap = context.flutter ? flutterBootstrap : null;
  if (bootstrap == null) {
    return ServerResponse.html(
      '${renderDocumentStart(document)}</body></html>',
      headers: varyAccept,
    );
  }

  final query = context.request.maybe(queryClientKey);
  final state = query == null
      ? null
      : _dehydrate(query, context.serializer.encode);
  final payload = _payload(context, state);
  final initial = _escapeScript(jsonEncode(payload));
  return ServerResponse(
    headers: Headers.single(<String, String>{
      'content-type': 'text/html; charset=utf-8',
      'vary': 'Accept',
    }),
    body: _htmlHandoff(
      renderDocumentStart(document, baseHref: baseHref),
      initial,
      bootstrap,
      state == null
          ? const Stream<Map<String, Object?>>.empty()
          : _pendingFrames(query!, state),
    ),
  );
}