diff --git a/packages/grpc-es/package.json b/packages/grpc-es/package.json index d2eec01..571988f 100644 --- a/packages/grpc-es/package.json +++ b/packages/grpc-es/package.json @@ -1,6 +1,6 @@ { "name": "@kanziw/grpc-es", - "version": "0.2.0", + "version": "0.2.1", "description": "A collection of grpc libraries using connect-es", "repository": { "type": "git", diff --git a/packages/grpc-es/src/server/index.ts b/packages/grpc-es/src/server/index.ts index e2c41c4..176cc8b 100644 --- a/packages/grpc-es/src/server/index.ts +++ b/packages/grpc-es/src/server/index.ts @@ -1,3 +1,4 @@ export { stdoutUnaryServerInterceptor } from './interceptor.js' export { GrpcEsServer } from './server.js' export type { Handler, Interceptor } from './types.js' +export { Code, GrpcError } from './status.js' diff --git a/packages/grpc-es/src/server/server.ts b/packages/grpc-es/src/server/server.ts index 927783c..fc170ab 100644 --- a/packages/grpc-es/src/server/server.ts +++ b/packages/grpc-es/src/server/server.ts @@ -3,6 +3,7 @@ import type { AnyMessage, ServiceType } from '@bufbuild/protobuf' import type { HandlerContext, ServiceImpl } from '@connectrpc/connect' import { connectNodeAdapter } from '@connectrpc/connect-node' import { UniversalHandlerOptions } from '@connectrpc/connect/protocol' +import { Code, GrpcError } from './status.js' import type { Handler, Interceptor } from './types.js' export class GrpcEsServer { @@ -16,8 +17,9 @@ export class GrpcEsServer { return this } - register<Service extends ServiceType>(service: Service, implementation: ServiceImpl<Service>): this { - const interceptorAppliedImplementation = {} as ServiceImpl<typeof service> + register<Service extends ServiceType>(service: Service, partialImplementation: Partial<ServiceImpl<Service>>): this { + const implementation = { ...makeUnimplementedService(service), ...partialImplementation } as ServiceImpl<Service> + const interceptorAppliedImplementation = {} as ServiceImpl<Service> for (const [key, handler] of Object.entries(implementation)) { let appliedHandler = handler @@ -47,3 +49,16 @@ export class GrpcEsServer { .listen(port) } } + +function makeUnimplementedService<Service extends ServiceType>(service: Service): ServiceImpl<Service> { + return Object.keys(service.methods).reduce( + (us, method) => { + // @ts-ignore + us[method] = () => { + throw new GrpcError(`Unimplemented method: [${method}]`, Code.Unimplemented) + } + return us + }, + {} as ServiceImpl<Service>, + ) +} diff --git a/packages/grpc-es/src/server/status.ts b/packages/grpc-es/src/server/status.ts new file mode 100644 index 0000000..39fe55b --- /dev/null +++ b/packages/grpc-es/src/server/status.ts @@ -0,0 +1,3 @@ +import { Code, ConnectError as GrpcError } from '@connectrpc/connect' + +export { Code, GrpcError }