nice-grpc-server-reflection
Version:
Server reflection for nice-grpc
131 lines • 7.35 kB
JavaScript
;
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