resolve method

  1. @override
void resolve()

Resolve the incoming message packet.

Implementation

@override
void resolve() {
  if (resolvedAlready) {
    return;
  }
  for (final module in config.modulesContainer.scopes) {
    for (final controllerEntry in module.controllers.whereType<GrpcController>()) {
      for (final entry in controllerEntry.grpcRoutes.entries) {
        if (resolvedMessageRoutes.containsKey(entry.value.route.path)) {
          throw StateError(
            'A message route with pattern "${entry.value.route.path}" is already registered in the application.',
          );
        }
        final service = entry.value.route.path.split('.').first;
        final serviceNames = services.map((e) => e.runtimeType.toString());
        if (!serviceNames.contains(service)) {
          throw StateError(
            'Service "$service" for gRPC route "${entry.value.route.path}" is not registered in the gRPC server.',
          );
        }
        switch (entry.value) {
          case GrpcRouteHandlerSpec():
            resolvedMessageRoutes[entry.value.route.path] = GrpcRouteContextHandler(
              handler: entry.value.handler,
              providers: {
                for (final providerEntry in module.providers) providerEntry.runtimeType: providerEntry,
              },
              hooks: entry.value.route.hooks.merge([
                controllerEntry.hooks,
                config.globalHooks,
              ]),
              pipes: {
                ...entry.value.route.pipes,
                ...controllerEntry.pipes,
                ...config.globalPipes,
              },
              exceptionFilters: {
                ...entry.value.route.exceptionFilters,
                ...controllerEntry.exceptionFilters,
                ...config.globalExceptionFilters,
              },
            );
            break;
          case GrpcStreamRouteHandlerSpec():
            resolvedMessageRoutes[entry.value.route.path] = GrpcRouteContextStreamHandler(
              handler: entry.value.handler,
              providers: {
                for (final providerEntry in module.providers) providerEntry.runtimeType: providerEntry,
              },
              hooks: entry.value.route.hooks.merge([
                controllerEntry.hooks,
                config.globalHooks,
              ]),
              pipes: {
                ...entry.value.route.pipes,
                ...controllerEntry.pipes,
                ...config.globalPipes,
              },
              exceptionFilters: {
                ...entry.value.route.exceptionFilters,
                ...controllerEntry.exceptionFilters,
                ...config.globalExceptionFilters,
              },
            );
            break;
          default:
            throw StateError(
              'Unknown gRPC route handler type for route "${entry.value.route.path}".',
            );
        }
      }
    }
  }
}