registerDynamicService function

void registerDynamicService(
  1. Server server,
  2. FileModel fileModel,
  3. String serviceName,
  4. 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));
}