diff --git a/README.md b/README.md index c7d4b1ee..649149a8 100644 --- a/README.md +++ b/README.md @@ -162,6 +162,8 @@ You'll also need to specify the `grpc_js` option within the `--grpc_out` flag, f --grpc_out="grpc_js:${OUT_DIR}" ``` +If you're consuming the server interface types you'll need to use version `@grpc/grpc-js@1.2.0` or higher. + ## Examples - [Example output](https://github.com/improbable-eng/ts-protoc-gen/tree/master/examples) -- Code generated by `ts-protoc-gen`. diff --git a/examples/generated-grpc-js-node/proto/examplecom/simple_service_grpc_pb.d.ts b/examples/generated-grpc-js-node/proto/examplecom/simple_service_grpc_pb.d.ts index 9a51222e..2d42c4cc 100644 --- a/examples/generated-grpc-js-node/proto/examplecom/simple_service_grpc_pb.d.ts +++ b/examples/generated-grpc-js-node/proto/examplecom/simple_service_grpc_pb.d.ts @@ -18,6 +18,14 @@ interface ISimpleServiceService extends grpc.ServiceDefinition; + doServerStream: grpc.handleServerStreamingCall; + doClientStream: grpc.handleClientStreamingCall; + doBidiStream: grpc.handleBidiStreamingCall; + delete: grpc.handleUnaryCall; +} + export class SimpleServiceClient extends grpc.Client { constructor(address: string, credentials: grpc.ChannelCredentials, options?: object); doUnary(argument: proto_examplecom_simple_service_pb.UnaryRequest, callback: grpc.requestCallback): grpc.ClientUnaryCall; diff --git a/examples/generated-grpc-js-node/proto/orphan_grpc_pb.d.ts b/examples/generated-grpc-js-node/proto/orphan_grpc_pb.d.ts index de95af71..b832a4c1 100644 --- a/examples/generated-grpc-js-node/proto/orphan_grpc_pb.d.ts +++ b/examples/generated-grpc-js-node/proto/orphan_grpc_pb.d.ts @@ -13,6 +13,11 @@ interface IOrphanServiceService extends grpc.ServiceDefinition; + doStream: grpc.handleServerStreamingCall; +} + export class OrphanServiceClient extends grpc.Client { constructor(address: string, credentials: grpc.ChannelCredentials, options?: object); doUnary(argument: proto_orphan_pb.OrphanUnaryRequest, callback: grpc.requestCallback): grpc.ClientUnaryCall; diff --git a/examples/generated-grpc-node/proto/examplecom/simple_service_grpc_pb.d.ts b/examples/generated-grpc-node/proto/examplecom/simple_service_grpc_pb.d.ts index 6284bc1f..81be49a6 100644 --- a/examples/generated-grpc-node/proto/examplecom/simple_service_grpc_pb.d.ts +++ b/examples/generated-grpc-node/proto/examplecom/simple_service_grpc_pb.d.ts @@ -18,6 +18,14 @@ interface ISimpleServiceService extends grpc.ServiceDefinition; + doServerStream: grpc.handleServerStreamingCall; + doClientStream: grpc.handleClientStreamingCall; + doBidiStream: grpc.handleBidiStreamingCall; + delete: grpc.handleUnaryCall; +} + export class SimpleServiceClient extends grpc.Client { constructor(address: string, credentials: grpc.ChannelCredentials, options?: object); doUnary(argument: proto_examplecom_simple_service_pb.UnaryRequest, callback: grpc.requestCallback): grpc.ClientUnaryCall; diff --git a/examples/generated-grpc-node/proto/orphan_grpc_pb.d.ts b/examples/generated-grpc-node/proto/orphan_grpc_pb.d.ts index 01bf38d0..5bf0f50f 100644 --- a/examples/generated-grpc-node/proto/orphan_grpc_pb.d.ts +++ b/examples/generated-grpc-node/proto/orphan_grpc_pb.d.ts @@ -13,6 +13,11 @@ interface IOrphanServiceService extends grpc.ServiceDefinition; + doStream: grpc.handleServerStreamingCall; +} + export class OrphanServiceClient extends grpc.Client { constructor(address: string, credentials: grpc.ChannelCredentials, options?: object); doUnary(argument: proto_orphan_pb.OrphanUnaryRequest, callback: grpc.requestCallback): grpc.ClientUnaryCall; diff --git a/src/service/grpcnode.ts b/src/service/grpcnode.ts index 07653ce5..72571a77 100644 --- a/src/service/grpcnode.ts +++ b/src/service/grpcnode.ts @@ -43,6 +43,8 @@ function generateTypeScriptDefinition(fileDescriptor: FileDescriptorProto, expor printer.printEmptyLn(); printService(printer, service); printer.printEmptyLn(); + printServer(printer, service); + printer.printEmptyLn(); printClient(printer, service); }); @@ -62,6 +64,24 @@ function printService(printer: Printer, service: RPCDescriptor) { printer.printLn(`export const ${serviceName}: I${serviceName};`); } +function printServer(printer: Printer, service: RPCDescriptor) { + const serverName = `${service.name}Server`; + printer.printLn(`export interface I${serverName} extends grpc.UntypedServiceImplementation {`); + service.methods + .forEach(method => { + if (!method.requestStream && !method.responseStream) { + printer.printIndentedLn(`${method.nameAsCamelCase}: grpc.handleUnaryCall<${method.requestType}, ${method.responseType}>;`); + } else if (!method.requestStream) { + printer.printIndentedLn(`${method.nameAsCamelCase}: grpc.handleServerStreamingCall<${method.requestType}, ${method.responseType}>;`); + } else if (!method.responseStream) { + printer.printIndentedLn(`${method.nameAsCamelCase}: grpc.handleClientStreamingCall<${method.requestType}, ${method.responseType}>;`); + } else { + printer.printIndentedLn(`${method.nameAsCamelCase}: grpc.handleBidiStreamingCall<${method.requestType}, ${method.responseType}>;`); + } + }); + printer.printLn("}"); +} + function printClient(printer: Printer, service: RPCDescriptor) { printer.printLn(`export class ${service.name}Client extends grpc.Client {`); printer.printIndentedLn("constructor(address: string, credentials: grpc.ChannelCredentials, options?: object);");