UNPKG

nice-grpc-server-reflection

Version:

Server reflection for nice-grpc

131 lines 7.35 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ServerReflectionService = void 0; exports.ServerReflection = ServerReflection; const nice_grpc_1 = require("nice-grpc"); const descriptor_pb_1 = require("google-protobuf/google/protobuf/descriptor_pb"); const reflection_pb_1 = require("./proto/grpc/reflection/v1/reflection_pb"); var reflection_grpc_pb_1 = require("./proto/grpc/reflection/v1/reflection_grpc_pb"); Object.defineProperty(exports, "ServerReflectionService", { enumerable: true, get: function () { return reflection_grpc_pb_1.ServerReflectionService; } }); function ServerReflection(protoset, serviceNames) { const fileDescriptorSet = descriptor_pb_1.FileDescriptorSet.deserializeBinary(protoset); function findSymbol(symbol, descriptor, prefix = '') { if (descriptor instanceof descriptor_pb_1.FileDescriptorProto) { const packageName = descriptor.getPackage(); const packagePrefix = packageName == null ? '' : `${packageName}.`; return (descriptor .getMessageTypeList() .find(type => findSymbol(symbol, type, packagePrefix)) || descriptor .getEnumTypeList() .find(type => findSymbol(symbol, type, packagePrefix)) || descriptor .getServiceList() .find(type => findSymbol(symbol, type, packagePrefix))); } const fullName = prefix + descriptor.getName(); if (symbol === fullName) { return descriptor; } if (descriptor instanceof descriptor_pb_1.DescriptorProto) { const messagePrefix = `${fullName}.`; return (descriptor .getNestedTypeList() .find(type => findSymbol(symbol, type, messagePrefix)) || descriptor .getEnumTypeList() .find(type => findSymbol(symbol, type, messagePrefix))); } if (descriptor instanceof descriptor_pb_1.ServiceDescriptorProto) { const servicePrefix = `${fullName}.`; return descriptor .getMethodList() .find(method => findSymbol(symbol, method, servicePrefix)); } return undefined; } function handleRequest(request) { switch (request.getMessageRequestCase()) { case reflection_pb_1.ServerReflectionRequest.MessageRequestCase.FILE_BY_FILENAME: { const filename = request.getFileByFilename(); const fileDescriptorProto = fileDescriptorSet .getFileList() .find(file => file.getName() === filename); if (fileDescriptorProto == null) { return new reflection_pb_1.ServerReflectionResponse().setErrorResponse(new reflection_pb_1.ErrorResponse() .setErrorCode(nice_grpc_1.Status.NOT_FOUND) .setErrorMessage(`File not found: ${filename}`)); } return new reflection_pb_1.ServerReflectionResponse() .setOriginalRequest(request) .setFileDescriptorResponse(new reflection_pb_1.FileDescriptorResponse().setFileDescriptorProtoList([ fileDescriptorProto.serializeBinary(), ])); } case reflection_pb_1.ServerReflectionRequest.MessageRequestCase.FILE_CONTAINING_SYMBOL: { const symbol = request.getFileContainingSymbol(); const fileDescriptorProto = fileDescriptorSet .getFileList() .find(file => findSymbol(symbol, file) != null); if (fileDescriptorProto == null) { return new reflection_pb_1.ServerReflectionResponse().setErrorResponse(new reflection_pb_1.ErrorResponse() .setErrorCode(nice_grpc_1.Status.NOT_FOUND) .setErrorMessage(`Symbol not found: ${symbol}`)); } return new reflection_pb_1.ServerReflectionResponse() .setOriginalRequest(request) .setFileDescriptorResponse(new reflection_pb_1.FileDescriptorResponse().setFileDescriptorProtoList([ fileDescriptorProto.serializeBinary(), ])); } case reflection_pb_1.ServerReflectionRequest.MessageRequestCase .FILE_CONTAINING_EXTENSION: { const extensionRequest = request.getFileContainingExtension(); const containingType = extensionRequest.getContainingType(); const extensionNumber = extensionRequest.getExtensionNumber(); const fileDescriptorProto = fileDescriptorSet .getFileList() .find(file => { const descriptor = findSymbol(containingType, file); return (descriptor instanceof descriptor_pb_1.DescriptorProto && descriptor .getExtensionList() .some(extension => extensionNumber === extension.getNumber())); }); if (fileDescriptorProto == null) { return new reflection_pb_1.ServerReflectionResponse().setErrorResponse(new reflection_pb_1.ErrorResponse() .setErrorCode(nice_grpc_1.Status.NOT_FOUND) .setErrorMessage(`Extension not found: ${containingType}(${extensionNumber})`)); } return new reflection_pb_1.ServerReflectionResponse() .setOriginalRequest(request) .setFileDescriptorResponse(new reflection_pb_1.FileDescriptorResponse().setFileDescriptorProtoList([ fileDescriptorProto.serializeBinary(), ])); } case reflection_pb_1.ServerReflectionRequest.MessageRequestCase.LIST_SERVICES: { return new reflection_pb_1.ServerReflectionResponse() .setOriginalRequest(request) .setListServicesResponse(new reflection_pb_1.ListServiceResponse().setServiceList(serviceNames.map(serviceName => new reflection_pb_1.ServiceResponse().setName(serviceName)))); } case reflection_pb_1.ServerReflectionRequest.MessageRequestCase .ALL_EXTENSION_NUMBERS_OF_TYPE: { const type = request.getAllExtensionNumbersOfType(); return new reflection_pb_1.ServerReflectionResponse().setAllExtensionNumbersResponse(new reflection_pb_1.ExtensionNumberResponse().setBaseTypeName(type)); } } return new reflection_pb_1.ServerReflectionResponse().setErrorResponse(new reflection_pb_1.ErrorResponse() .setErrorCode(nice_grpc_1.Status.UNIMPLEMENTED) .setErrorMessage('Not implemented')); } return { async *serverReflectionInfo(requests) { for await (const request of requests) { yield handleRequest(request); } }, }; } //# sourceMappingURL=index.js.map