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),
),
);
}