protoc-gen-grpc
Version:
Protocol Buffers Compiler (protoc) plugin for generating grpc interfaces in TypeScript..
197 lines (196 loc) • 14.8 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.FileDescriptorGRPC = void 0;
const Utility_1 = require("../Utility");
const Printer_1 = require("../Printer");
const DependencyTypesMap_1 = require("../DependencyTypesMap");
const DependencyFilter_1 = require("../DependencyFilter");
const FieldTypes_1 = require("./partial/FieldTypes");
var FileDescriptorGRPC;
(function (FileDescriptorGRPC) {
FileDescriptorGRPC.defaultServiceType = JSON.stringify({
serviceName: '',
methods: [],
});
FileDescriptorGRPC.defaultServiceMethodType = JSON.stringify({
packageName: '',
serviceName: '',
methodName: '',
requestStream: false,
responseStream: false,
requestTypeName: '',
responseTypeName: '',
type: 'ClientUnaryCall',
});
function print(fileDescriptor, entryMap, isGrpcJs) {
if (fileDescriptor.getServiceList().length === 0) {
return '';
}
const fileName = fileDescriptor.getName();
const packageName = fileDescriptor.getPackage();
const upToRoot = Utility_1.Utility.getPathToRoot(fileName);
const printer = new Printer_1.Printer(0);
printer.printLn(`// package: ${packageName}`);
printer.printLn(`// file: ${fileDescriptor.getName()}`);
printer.printEmptyLn();
// Need to import the non-service file that was generated for this .proto file
if (isGrpcJs) {
printer.printLn(`import * as grpc from '@grpc/grpc-js';`);
}
else {
printer.printLn(`import * as grpc from 'grpc';`);
}
const asPseudoNamespace = Utility_1.Utility.filePathToPseudoNamespace(fileName);
printer.printLn(`import * as ${asPseudoNamespace} from '${upToRoot}${Utility_1.Utility.filePathFromProtoWithoutExtension(fileName)}';`);
fileDescriptor.getDependencyList().forEach((dependency) => {
if (DependencyFilter_1.DependencyFilter.indexOf(dependency) !== -1) {
return; // filtered
}
const pseudoNamespace = Utility_1.Utility.filePathToPseudoNamespace(dependency);
if (dependency in DependencyTypesMap_1.DependencyTypesMap) {
printer.printLn(`import * as ${pseudoNamespace} from '${DependencyTypesMap_1.DependencyTypesMap[dependency]}';`);
}
else {
const filePath = Utility_1.Utility.filePathFromProtoWithoutExtension(dependency);
printer.printLn(`import * as ${pseudoNamespace} from '${upToRoot + filePath}';`);
}
});
printer.printEmptyLn();
fileDescriptor.getServiceList().forEach((service) => {
let serviceData = JSON.parse(FileDescriptorGRPC.defaultServiceType);
serviceData.serviceName = service.getName();
service.getMethodList().forEach((method) => {
let methodData = JSON.parse(FileDescriptorGRPC.defaultServiceMethodType);
methodData.packageName = packageName;
methodData.serviceName = serviceData.serviceName;
methodData.methodName = method.getName();
methodData.requestStream = method.getClientStreaming();
methodData.responseStream = method.getServerStreaming();
methodData.requestTypeName = FieldTypes_1.FieldTypes.getFieldType(FieldTypes_1.MESSAGE_TYPE, method.getInputType().slice(1), '', entryMap);
methodData.responseTypeName = FieldTypes_1.FieldTypes.getFieldType(FieldTypes_1.MESSAGE_TYPE, method.getOutputType().slice(1), '', entryMap);
if (!method.getClientStreaming() && !method.getServerStreaming()) {
methodData.type = 'ClientUnaryCall';
}
else if (method.getClientStreaming() && !method.getServerStreaming()) {
methodData.type = 'ClientWritableStream';
}
else if (!method.getClientStreaming() && method.getServerStreaming()) {
methodData.type = 'ClientReadableStream';
}
else if (method.getClientStreaming() && method.getServerStreaming()) {
methodData.type = 'ClientDuplexStream';
}
serviceData.methods.push(methodData);
});
// print service interface
printer.printLn(`interface I${serviceData.serviceName}Service extends grpc.ServiceDefinition<grpc.UntypedServiceImplementation> {`);
serviceData.methods.forEach(methodData => {
printer.printIndentedLn(`${Utility_1.Utility.lcFirst(methodData.methodName)}: I${serviceData.serviceName}Service_I${methodData.methodName};`);
});
printer.printLn(`}`);
printer.printEmptyLn();
// print method interface
serviceData.methods.forEach(methodData => {
printer.printLn(`interface I${serviceData.serviceName}Service_I${methodData.methodName} extends grpc.MethodDefinition<${methodData.requestTypeName}, ${methodData.responseTypeName}> {`);
printer.printIndentedLn(`path: '/${methodData.packageName}.${methodData.serviceName}/${methodData.methodName}'`);
printer.printIndentedLn(`requestStream: ${methodData.requestStream}`);
printer.printIndentedLn(`responseStream: ${methodData.responseStream}`);
printer.printIndentedLn(`requestSerialize: grpc.serialize<${methodData.requestTypeName}>;`);
printer.printIndentedLn(`requestDeserialize: grpc.deserialize<${methodData.requestTypeName}>;`);
printer.printIndentedLn(`responseSerialize: grpc.serialize<${methodData.responseTypeName}>;`);
printer.printIndentedLn(`responseDeserialize: grpc.deserialize<${methodData.responseTypeName}>;`);
printer.printLn(`}`);
printer.printEmptyLn();
});
printer.printLn(`export const ${serviceData.serviceName}Service: I${serviceData.serviceName}Service;`);
// print server interface
printer.printLn(`export interface I${serviceData.serviceName}Server extends grpc.UntypedServiceImplementation {`);
serviceData.methods.forEach((methodData) => {
const methodName = Utility_1.Utility.lcFirst(methodData.methodName);
const requestTypeName = methodData.requestTypeName;
const responseTypeName = methodData.responseTypeName;
switch (methodData.type) {
case 'ClientUnaryCall':
printer.printIndentedLn(`${methodName}: grpc.handleUnaryCall<${requestTypeName}, ${responseTypeName}>;`);
break;
case 'ClientWritableStream':
printer.printIndentedLn(`${methodName}: grpc.handleClientStreamingCall<${requestTypeName}, ${responseTypeName}>;`);
break;
case 'ClientReadableStream':
printer.printIndentedLn(`${methodName}: grpc.handleServerStreamingCall<${requestTypeName}, ${responseTypeName}>;`);
break;
case 'ClientDuplexStream':
printer.printIndentedLn(`${methodName}: grpc.handleBidiStreamingCall<${requestTypeName}, ${responseTypeName}>;`);
break;
}
});
printer.printLn(`}`);
printer.printEmptyLn();
// print service client interface
printer.printLn(`export interface I${serviceData.serviceName}Client {`);
serviceData.methods.forEach(methodData => {
const methodName = Utility_1.Utility.lcFirst(methodData.methodName);
const requestTypeName = methodData.requestTypeName;
const responseTypeName = methodData.responseTypeName;
switch (methodData.type) {
case 'ClientUnaryCall':
printer.printIndentedLn(`${methodName}(request: ${requestTypeName}, callback: (error: grpc.ServiceError | null, response: ${responseTypeName}) => void): grpc.ClientUnaryCall;`);
printer.printIndentedLn(`${methodName}(request: ${requestTypeName}, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: ${responseTypeName}) => void): grpc.ClientUnaryCall;`);
printer.printIndentedLn(`${methodName}(request: ${requestTypeName}, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: ${responseTypeName}) => void): grpc.ClientUnaryCall;`);
break;
case 'ClientReadableStream':
printer.printIndentedLn(`${methodName}(request: ${requestTypeName}, options?: Partial<grpc.CallOptions>): grpc.ClientReadableStream<${responseTypeName}>;`);
printer.printIndentedLn(`${methodName}(request: ${requestTypeName}, metadata?: grpc.Metadata, options?: Partial<grpc.CallOptions>): grpc.ClientReadableStream<${responseTypeName}>;`);
break;
case 'ClientWritableStream':
printer.printIndentedLn(`${methodName}(callback: (error: grpc.ServiceError | null, response: ${responseTypeName}) => void): grpc.ClientWritableStream<${requestTypeName}>;`);
printer.printIndentedLn(`${methodName}(metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: ${responseTypeName}) => void): grpc.ClientWritableStream<${requestTypeName}>;`);
printer.printIndentedLn(`${methodName}(options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: ${responseTypeName}) => void): grpc.ClientWritableStream<${requestTypeName}>;`);
printer.printIndentedLn(`${methodName}(metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: ${responseTypeName}) => void): grpc.ClientWritableStream<${requestTypeName}>;`);
break;
case 'ClientDuplexStream':
printer.printIndentedLn(`${methodName}(): grpc.ClientDuplexStream<${requestTypeName}, ${responseTypeName}>;`);
printer.printIndentedLn(`${methodName}(options: Partial<grpc.CallOptions>): grpc.ClientDuplexStream<${requestTypeName}, ${responseTypeName}>;`);
printer.printIndentedLn(`${methodName}(metadata: grpc.Metadata, options?: Partial<grpc.CallOptions>): grpc.ClientDuplexStream<${requestTypeName}, ${responseTypeName}>;`);
break;
}
});
printer.printLn(`}`);
printer.printEmptyLn();
// print service client
printer.printLn(`export class ${serviceData.serviceName}Client extends grpc.Client implements I${serviceData.serviceName}Client {`);
printer.printIndentedLn(`constructor(address: string, credentials: grpc.ChannelCredentials, options?: Partial<grpc.ClientOptions>);`);
serviceData.methods.forEach(methodData => {
const methodName = Utility_1.Utility.lcFirst(methodData.methodName);
const requestTypeName = methodData.requestTypeName;
const responseTypeName = methodData.responseTypeName;
switch (methodData.type) {
case 'ClientUnaryCall':
printer.printIndentedLn(`public ${methodName}(request: ${requestTypeName}, callback: (error: grpc.ServiceError | null, response: ${responseTypeName}) => void): grpc.ClientUnaryCall;`);
printer.printIndentedLn(`public ${methodName}(request: ${requestTypeName}, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: ${responseTypeName}) => void): grpc.ClientUnaryCall;`);
printer.printIndentedLn(`public ${methodName}(request: ${requestTypeName}, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: ${responseTypeName}) => void): grpc.ClientUnaryCall;`);
break;
case 'ClientReadableStream':
printer.printIndentedLn(`public ${methodName}(request: ${requestTypeName}, options?: Partial<grpc.CallOptions>): grpc.ClientReadableStream<${responseTypeName}>;`);
printer.printIndentedLn(`public ${methodName}(request: ${requestTypeName}, metadata?: grpc.Metadata, options?: Partial<grpc.CallOptions>): grpc.ClientReadableStream<${responseTypeName}>;`);
break;
case 'ClientWritableStream':
printer.printIndentedLn(`public ${methodName}(callback: (error: grpc.ServiceError | null, response: ${responseTypeName}) => void): grpc.ClientWritableStream<${requestTypeName}>;`);
printer.printIndentedLn(`public ${methodName}(metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: ${responseTypeName}) => void): grpc.ClientWritableStream<${requestTypeName}>;`);
printer.printIndentedLn(`public ${methodName}(options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: ${responseTypeName}) => void): grpc.ClientWritableStream<${requestTypeName}>;`);
printer.printIndentedLn(`public ${methodName}(metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: ${responseTypeName}) => void): grpc.ClientWritableStream<${requestTypeName}>;`);
break;
case 'ClientDuplexStream':
printer.printIndentedLn(`public ${methodName}(): grpc.ClientDuplexStream<${requestTypeName}, ${responseTypeName}>;`);
printer.printIndentedLn(`public ${methodName}(options?: Partial<grpc.CallOptions>): grpc.ClientDuplexStream<${requestTypeName}, ${responseTypeName}>;`);
printer.printIndentedLn(`public ${methodName}(metadata?: grpc.Metadata, options?: Partial<grpc.CallOptions>): grpc.ClientDuplexStream<${requestTypeName}, ${responseTypeName}>;`);
break;
}
});
printer.printLn(`}`);
printer.printEmptyLn();
});
return printer.getOutput();
}
FileDescriptorGRPC.print = print;
})(FileDescriptorGRPC || (exports.FileDescriptorGRPC = FileDescriptorGRPC = {}));