diff --git a/packages/proto-loader/src/index.ts b/packages/proto-loader/src/index.ts index 9d1901b1..eab44963 100644 --- a/packages/proto-loader/src/index.ts +++ b/packages/proto-loader/src/index.ts @@ -391,12 +391,12 @@ export function loadFileDescriptorSet( options = options || {}; let decodedDescriptorSet: DecodedDescriptorSet; - if (typeof descriptorSet === 'object') { - decodedDescriptorSet = descriptor.FileDescriptorSet.fromObject( + if (Buffer.isBuffer(descriptorSet)) { + decodedDescriptorSet = descriptor.FileDescriptorSet.decode( descriptorSet ) as DecodedDescriptorSet; } else { - decodedDescriptorSet = descriptor.FileDescriptorSet.decode( + decodedDescriptorSet = descriptor.FileDescriptorSet.fromObject( descriptorSet ) as DecodedDescriptorSet; } @@ -418,7 +418,12 @@ export function loadFileDescriptorSetFile( return reject(err); } - return resolve(loadFileDescriptorSet(data, options)); + try { + const jsonData = JSON.parse(data.toString()); + return resolve(loadFileDescriptorSet(jsonData, options)); + } catch (e) { + return resolve(loadFileDescriptorSet(data, options)); + } }); }); } diff --git a/packages/proto-loader/test/descriptor_type_test.ts b/packages/proto-loader/test/descriptor_type_test.ts index 227b7565..7571da0a 100644 --- a/packages/proto-loader/test/descriptor_type_test.ts +++ b/packages/proto-loader/test/descriptor_type_test.ts @@ -103,7 +103,12 @@ describe('Descriptor types', () => { it('Can load binary-encoded proto file descriptor sets', () => { // This will throw if the rpc descriptor cannot be decoded - proto_loader.loadFileDescriptorSetFile(`${TEST_PROTO_DIR}/rpc.desc`); + proto_loader.loadFileDescriptorSetFile(`${TEST_PROTO_DIR}/rpc.desc.bin`); + }); + + it('Can load json file descriptor sets', () => { + // This will throw if the rpc descriptor JSON cannot be decoded + proto_loader.loadFileDescriptorSetFile(`${TEST_PROTO_DIR}/rpc.desc.json`); }); it('Can parse plain file descriptor set objects', () => { diff --git a/packages/proto-loader/test_protos/rpc.desc b/packages/proto-loader/test_protos/rpc.desc.bin similarity index 100% rename from packages/proto-loader/test_protos/rpc.desc rename to packages/proto-loader/test_protos/rpc.desc.bin diff --git a/packages/proto-loader/test_protos/rpc.desc.json b/packages/proto-loader/test_protos/rpc.desc.json new file mode 100644 index 00000000..3d608e0b --- /dev/null +++ b/packages/proto-loader/test_protos/rpc.desc.json @@ -0,0 +1,46 @@ +{ + "file": [ + { + "name": "test_protos/rpc.proto", + "messageType": [ + { + "name": "MyRequest", + "field": [ + { + "name": "path", + "number": 1, + "label": "LABEL_OPTIONAL", + "type": "TYPE_STRING", + "jsonName": "path" + } + ] + }, + { + "name": "MyResponse", + "field": [ + { + "name": "status", + "number": 2, + "label": "LABEL_OPTIONAL", + "type": "TYPE_INT32", + "jsonName": "status" + } + ] + } + ], + "service": [ + { + "name": "MyService", + "method": [ + { + "name": "MyMethod", + "inputType": ".MyRequest", + "outputType": ".MyResponse" + } + ] + } + ], + "syntax": "proto3" + } + ] +}