grpc-reflection-js
Advanced tools
Comparing version 0.1.2 to 0.2.0
@@ -1,8 +0,10 @@ | ||
import { ChannelCredentials } from '@grpc/grpc-js'; | ||
import { ChannelCredentials, Metadata } from '@grpc/grpc-js'; | ||
import * as services from './reflection_grpc_pb'; | ||
import { Root } from 'protobufjs'; | ||
export declare class Client { | ||
metadata: Metadata; | ||
grpcClient: services.IServerReflectionClient; | ||
constructor(url: string, credentials: ChannelCredentials, options?: object); | ||
listServices(): Promise<string[] | void[]>; | ||
private fileDescriptorCache; | ||
constructor(url: string, credentials: ChannelCredentials, options?: object, metadata?: Metadata); | ||
listServices(): Promise<string[]>; | ||
fileContainingSymbol(symbol: string): Promise<Root>; | ||
@@ -13,3 +15,3 @@ fileByFilename(filename: string): Promise<Root>; | ||
private getFileContainingSymbol; | ||
private getFileByFilename; | ||
private getFilesByFilenames; | ||
} |
@@ -26,2 +26,3 @@ "use strict"; | ||
exports.Client = void 0; | ||
const grpc_js_1 = require("@grpc/grpc-js"); | ||
const descriptor_1 = require("./descriptor"); | ||
@@ -33,3 +34,6 @@ const services = __importStar(require("./reflection_grpc_pb")); | ||
class Client { | ||
constructor(url, credentials, options) { | ||
constructor(url, credentials, options, metadata) { | ||
this.fileDescriptorCache = new Map(); | ||
this.fileDescriptorCache = new Map(); | ||
this.metadata = metadata || new grpc_js_1.Metadata(); | ||
this.grpcClient = new services.ServerReflectionClient(url, credentials, options); | ||
@@ -46,3 +50,3 @@ } | ||
}); | ||
resolve(services); | ||
resolve(services || []); | ||
} | ||
@@ -58,3 +62,3 @@ else { | ||
request.setListServices('*'); | ||
const grpcCall = this.grpcClient.serverReflectionInfo({}); | ||
const grpcCall = this.grpcClient.serverReflectionInfo(this.metadata); | ||
grpcCall.on('data', dataCallback); | ||
@@ -75,3 +79,3 @@ grpcCall.on('error', errorCallback); | ||
return new Promise((resolve, reject) => { | ||
this.getFileByFilename(filename) | ||
this.getFilesByFilenames([filename]) | ||
.then(val => resolve(this.resolveFileDescriptorSet(val))) | ||
@@ -81,30 +85,25 @@ .catch(err => reject(err)); | ||
} | ||
async resolveFileDescriptorSet(fileDescriptorProtoBytes) { | ||
async resolveFileDescriptorSet(fileDescriptorProtos) { | ||
const fileDescriptorMap = await this.resolveDescriptorRecursive(fileDescriptorProtos); | ||
const fileDescriptorSet = descriptor_2.FileDescriptorSet.create(); | ||
const fileDescriptorProtos = await this.resolveDescriptorRecursive(fileDescriptorProtoBytes); | ||
lodash_set_1.default(fileDescriptorSet, 'file', Array.from(fileDescriptorProtos.values())); | ||
lodash_set_1.default(fileDescriptorSet, 'file', Array.from(fileDescriptorMap.values())); | ||
return descriptor_1.getDescriptorRootFromDescriptorSet(fileDescriptorSet); | ||
} | ||
async resolveDescriptorRecursive(fileDescriptorProtoBytes) { | ||
let fileDescriptorProtos = new Map(); | ||
for (const descriptorByte of fileDescriptorProtoBytes) { | ||
const fileDescriptorProto = descriptor_2.FileDescriptorProto.decode(descriptorByte); | ||
if (fileDescriptorProto.dependency) { | ||
const dependencies = fileDescriptorProto.dependency; | ||
for (const dep of dependencies) { | ||
const depProtoBytes = await this.getFileByFilename(dep); | ||
const protoDependencies = await this.resolveDescriptorRecursive(depProtoBytes); | ||
fileDescriptorProtos = new Map([ | ||
...fileDescriptorProtos, | ||
...protoDependencies, | ||
]); | ||
} | ||
async resolveDescriptorRecursive(fileDescriptorProtos = [], fileDescriptorMap = new Map()) { | ||
await Promise.all(fileDescriptorProtos.map(async (fileDescriptorProto) => { | ||
if (fileDescriptorMap.has(fileDescriptorProto.name)) { | ||
return; | ||
} | ||
if (!fileDescriptorProtos.has(fileDescriptorProto.name)) { | ||
fileDescriptorProtos.set(fileDescriptorProto.name, fileDescriptorProto); | ||
else { | ||
fileDescriptorMap.set(fileDescriptorProto.name, fileDescriptorProto); | ||
} | ||
} | ||
return fileDescriptorProtos; | ||
const dependencies = (fileDescriptorProto.dependency || []).filter((dependency) => !fileDescriptorMap.has(dependency)); | ||
if (dependencies.length) { | ||
await this.resolveDescriptorRecursive(await this.getFilesByFilenames(dependencies), fileDescriptorMap); | ||
} | ||
})); | ||
return fileDescriptorMap; | ||
} | ||
getFileContainingSymbol(symbol) { | ||
const fileDescriptorCache = this.fileDescriptorCache; | ||
return new Promise((resolve, reject) => { | ||
@@ -114,3 +113,9 @@ function dataCallback(response) { | ||
if (response.hasFileDescriptorResponse()) { | ||
resolve((_a = response.getFileDescriptorResponse()) === null || _a === void 0 ? void 0 : _a.getFileDescriptorProtoList()); | ||
const fileDescriptorProtoBytes = (((_a = response | ||
.getFileDescriptorResponse()) === null || _a === void 0 ? void 0 : _a.getFileDescriptorProtoList()) || []); | ||
resolve(fileDescriptorProtoBytes.map(descriptorByte => { | ||
const fileDescriptorProto = descriptor_2.FileDescriptorProto.decode(descriptorByte); | ||
fileDescriptorCache.set(fileDescriptorProto.name, fileDescriptorProto); | ||
return fileDescriptorProto; | ||
})); | ||
} | ||
@@ -126,3 +131,3 @@ else { | ||
request.setFileContainingSymbol(symbol); | ||
const grpcCall = this.grpcClient.serverReflectionInfo({}); | ||
const grpcCall = this.grpcClient.serverReflectionInfo(this.metadata); | ||
grpcCall.on('data', dataCallback); | ||
@@ -134,8 +139,28 @@ grpcCall.on('error', errorCallback); | ||
} | ||
getFileByFilename(symbol) { | ||
getFilesByFilenames(symbols) { | ||
const result = []; | ||
const fileDescriptorCache = this.fileDescriptorCache; | ||
const symbolsToFetch = symbols.filter(symbol => { | ||
const cached = fileDescriptorCache.get(symbol); | ||
if (cached) { | ||
result.push(cached); | ||
return false; | ||
} | ||
return true; | ||
}); | ||
if (symbolsToFetch.length === 0) { | ||
return Promise.resolve(result); | ||
} | ||
return new Promise((resolve, reject) => { | ||
function dataCallback(response) { | ||
var _a; | ||
var _a, _b; | ||
if (response.hasFileDescriptorResponse()) { | ||
resolve((_a = response.getFileDescriptorResponse()) === null || _a === void 0 ? void 0 : _a.getFileDescriptorProtoList()); | ||
(_b = (_a = response | ||
.getFileDescriptorResponse()) === null || _a === void 0 ? void 0 : _a.getFileDescriptorProtoList()) === null || _b === void 0 ? void 0 : _b.forEach(descriptorByte => { | ||
if (descriptorByte instanceof Uint8Array) { | ||
const fileDescriptorProto = descriptor_2.FileDescriptorProto.decode(descriptorByte); | ||
fileDescriptorCache.set(fileDescriptorProto.name, fileDescriptorProto); | ||
result.push(fileDescriptorProto); | ||
} | ||
}); | ||
} | ||
@@ -149,8 +174,12 @@ else { | ||
} | ||
const request = new reflection_pb_1.ServerReflectionRequest(); | ||
request.setFileByFilename(symbol); | ||
const grpcCall = this.grpcClient.serverReflectionInfo({}); | ||
const grpcCall = this.grpcClient.serverReflectionInfo(this.metadata); | ||
grpcCall.on('data', dataCallback); | ||
grpcCall.on('error', errorCallback); | ||
grpcCall.write(request); | ||
grpcCall.on('end', () => { | ||
resolve(result); | ||
}); | ||
const request = new reflection_pb_1.ServerReflectionRequest(); | ||
symbolsToFetch.forEach(symbol => { | ||
grpcCall.write(request.setFileByFilename(symbol)); | ||
}); | ||
grpcCall.end(); | ||
@@ -157,0 +186,0 @@ }); |
@@ -14,3 +14,3 @@ export namespace ServerReflectionService { | ||
} | ||
export var ServerReflectionClient: import("@grpc/grpc-js/build/src/make-client").ServiceClientConstructor; | ||
export var ServerReflectionClient: import("@grpc/grpc-js").ServiceClientConstructor; | ||
declare function serialize_grpc_reflection_v1alpha_ServerReflectionRequest(arg: any): Buffer; | ||
@@ -17,0 +17,0 @@ declare function deserialize_grpc_reflection_v1alpha_ServerReflectionRequest(buffer_arg: any): import("./reflection_pb.js").ServerReflectionRequest; |
@@ -56,3 +56,3 @@ "use strict"; | ||
]; | ||
chai_1.assert.deepEqual(await reflectionClient.listServices(), expectedServices); | ||
chai_1.assert.sameMembers(await reflectionClient.listServices(), expectedServices); | ||
}); | ||
@@ -68,2 +68,5 @@ }); | ||
on: function (_event, listener) { | ||
if (_event === 'error') { | ||
return; | ||
} | ||
const res = new reflection_pb_1.ServerReflectionResponse(); | ||
@@ -83,2 +86,5 @@ const fileDescriptorResponse = new reflection_pb_1.FileDescriptorResponse(); | ||
on: function (_event, listener) { | ||
if (_event === 'error') { | ||
return; | ||
} | ||
const res = new reflection_pb_1.ServerReflectionResponse(); | ||
@@ -99,3 +105,3 @@ const fileDescriptorResponse = new reflection_pb_1.FileDescriptorResponse(); | ||
const root = await reflectionClient.fileContainingSymbol('phone.Messenger'); | ||
chai_1.assert.deepEqual(root.files, ['contact.proto', 'phone.proto']); | ||
chai_1.assert.sameDeepMembers(root.files, ['contact.proto', 'phone.proto']); | ||
}); | ||
@@ -111,2 +117,5 @@ }); | ||
on: function (_event, listener) { | ||
if (_event === 'error') { | ||
return; | ||
} | ||
const res = new reflection_pb_1.ServerReflectionResponse(); | ||
@@ -113,0 +122,0 @@ const fileDescriptorResponse = new reflection_pb_1.FileDescriptorResponse(); |
{ | ||
"name": "grpc-reflection-js", | ||
"version": "0.1.2", | ||
"version": "0.2.0", | ||
"main": "build/src/index.js", | ||
@@ -5,0 +5,0 @@ "repository": "https://github.com/redhoyasa/grpc-reflection-js", |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
164228
2127