registerDynamicService function
void
registerDynamicService(
- Server server,
- FileModel fileModel,
- String serviceName,
- DynamicHandler handler,
Register a runtime-built service on a Server.
Implementation
void registerDynamicService(
Server server, FileModel fileModel, String serviceName, DynamicHandler handler) {
final service = fileModel.service(serviceName);
final methods = <Method>[];
for (final m in service.methods.values) {
methods.add(Method(m.name, m.path, m.kind, (ctx, reqs, sink) async {
Future<GenericMessage> recv() async =>
decodeGeneric(m.input!, await reqs.recvRaw(), fileModel);
Future<void> send(GenericMessage resp) async {
sink(encodeGeneric(m.output!, resp, fileModel));
}
switch (m.kind) {
case Server.kindUnary:
sink(encodeGeneric(
m.output!, await handler.unary(ctx, m, await recv()), fileModel));
break;
case Server.kindServerStreaming:
await handler.serverStream(ctx, m, await recv(), send);
break;
case Server.kindClientStreaming:
sink(encodeGeneric(
m.output!, await handler.clientStream(ctx, m, recv), fileModel));
break;
default:
await handler.bidi(ctx, m, recv, send);
break;
}
}));
}
server.registerService(ServiceDesc(service.fullName, methods));
}