diff --git a/fabric-shim/lib/chaincode.js b/fabric-shim/lib/chaincode.js index 50cbaa68..9fcc06ec 100644 --- a/fabric-shim/lib/chaincode.js +++ b/fabric-shim/lib/chaincode.js @@ -6,7 +6,7 @@ /* eslint-disable no-useless-escape */ 'use strict'; -const grpc = require('grpc'); +const ProtoLoader = require('./protoloader'); const path = require('path'); const util = require('util'); const X509 = require('@ampretia/x509'); @@ -26,17 +26,17 @@ const StartCommand = require('./cmds/startCommand.js'); const yargs = require('yargs'); -const _chaincodeProto = grpc.load({ +const _chaincodeProto = ProtoLoader.load({ root: path.join(__dirname, './protos'), file: 'peer/chaincode.proto' }).protos; -const _serviceProto = grpc.load({ +const _serviceProto = ProtoLoader.load({ root: path.join(__dirname, './protos'), file: 'peer/chaincode_shim.proto' }).protos; -const _responseProto = grpc.load({ +const _responseProto = ProtoLoader.load({ root: path.join(__dirname, './protos'), file: 'peer/proposal_response.proto' }).protos; diff --git a/fabric-shim/lib/handler.js b/fabric-shim/lib/handler.js index 568e1d5b..54449c7a 100644 --- a/fabric-shim/lib/handler.js +++ b/fabric-shim/lib/handler.js @@ -9,6 +9,7 @@ process.env.GRPC_SSL_CIPHER_SUITES = 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384'; const grpc = require('grpc'); +const ProtoLoader = require('./protoloader'); const {URL} = require('url'); const path = require('path'); const util = require('util'); @@ -20,17 +21,17 @@ const Stub = require('./stub.js'); const utils = require('./utils/utils'); -const _serviceProto = grpc.load({ +const _serviceProto = ProtoLoader.load({ root: path.join(__dirname, './protos'), file: 'peer/chaincode_shim.proto' }).protos; -const _chaincodeProto = grpc.load({ +const _chaincodeProto = ProtoLoader.load({ root: path.join(__dirname, './protos'), file: 'peer/chaincode.proto' }).protos; -const _responseProto = grpc.load({ +const _responseProto = ProtoLoader.load({ root: path.join(__dirname, './protos'), file: 'peer/proposal_response.proto' }).protos; diff --git a/fabric-shim/lib/iterators.js b/fabric-shim/lib/iterators.js index 615fd11e..bfea8f73 100644 --- a/fabric-shim/lib/iterators.js +++ b/fabric-shim/lib/iterators.js @@ -1,9 +1,9 @@ 'use strict'; -const grpc = require('grpc'); +const ProtoLoader = require('./protoloader'); const path = require('path'); const EventEmitter = require('events'); -const _queryresultProto = grpc.load({ +const _queryresultProto = ProtoLoader.load({ root: path.join(__dirname, './protos'), file: 'ledger/queryresult/kv_query_result.proto' }).queryresult; diff --git a/fabric-shim/lib/protoloader.js b/fabric-shim/lib/protoloader.js new file mode 100644 index 00000000..cde767e6 --- /dev/null +++ b/fabric-shim/lib/protoloader.js @@ -0,0 +1,32 @@ +/** + * Copyright 2018 IBM All Rights Reserved. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +'use strict'; + +const grpc = require('grpc'); +const protobuf = require('protobufjs'); + +/** + * @ignore + * A class for easily loading service descriptors and client stub definitions from + * .proto files at runtime. + */ +class ProtoLoader { + + /** + * Load service descriptors and client stub definitions from a .proto file. + * @param {string} filename The filename of the .proto file. + * @param {Object} [options] The options used to load the .proto file. + * @returns {*} The loaded service descriptors and client stub definitions. + */ + static load (filename) { + const builder = protobuf.loadProtoFile(filename); + return grpc.loadObject(builder, {protobufjsVersion: 5}); + } + +} + +module.exports = ProtoLoader; \ No newline at end of file diff --git a/fabric-shim/lib/stub.js b/fabric-shim/lib/stub.js index f376338c..b3888856 100644 --- a/fabric-shim/lib/stub.js +++ b/fabric-shim/lib/stub.js @@ -7,32 +7,32 @@ // TODO: Need to add parameter validation to all calls. 'use strict'; -const grpc = require('grpc'); +const ProtoLoader = require('./protoloader'); const path = require('path'); const util = require('util'); const crypto = require('crypto'); -const _commonProto = grpc.load({ +const _commonProto = ProtoLoader.load({ root: path.join(__dirname, './protos'), file: 'common/common.proto' }).common; -const _proposalProto = grpc.load({ +const _proposalProto = ProtoLoader.load({ root: path.join(__dirname, './protos'), file: 'peer/proposal.proto' }).protos; -const _eventProto = grpc.load({ +const _eventProto = ProtoLoader.load({ root: path.join(__dirname, './protos'), file: 'peer/chaincode_event.proto' }).protos; -const _idProto = grpc.load({ +const _idProto = ProtoLoader.load({ root: path.join(__dirname, './protos'), file: 'msp/identities.proto' }).msp; -const _serviceProto = grpc.load({ +const _serviceProto = ProtoLoader.load({ root: path.join(__dirname, './protos'), file: 'peer/chaincode_shim.proto' }).protos; diff --git a/fabric-shim/lib/utils/statebased.js b/fabric-shim/lib/utils/statebased.js index 4100482e..cf4a7a9d 100644 --- a/fabric-shim/lib/utils/statebased.js +++ b/fabric-shim/lib/utils/statebased.js @@ -4,15 +4,15 @@ # SPDX-License-Identifier: Apache-2.0 */ -const grpc = require('grpc'); +const ProtoLoader = require('../protoloader'); const path = require('path'); -const _policiesProto = grpc.load({ +const _policiesProto = ProtoLoader.load({ root: path.join(__dirname, '../protos'), file: 'common/policies.proto' }).common; -const _principalProto = grpc.load({ +const _principalProto = ProtoLoader.load({ root: path.join(__dirname, '../protos'), file: 'msp/msp_principal.proto' }).common; diff --git a/fabric-shim/package.json b/fabric-shim/package.json index 47fd7d3d..b2d8bdf1 100644 --- a/fabric-shim/package.json +++ b/fabric-shim/package.json @@ -42,7 +42,8 @@ "reflect-metadata": "^0.1.12", "winston": "^2.4.1", "yargs": "^10.0.2", - "yargs-parser": "^11.0.0" + "yargs-parser": "^11.0.0", + "protobufjs": "5.0.3" }, "devDependencies": { "mocha": "5.2.0", diff --git a/fabric-shim/test/unit/chaincode.js b/fabric-shim/test/unit/chaincode.js index 2c379493..6e2b0a98 100644 --- a/fabric-shim/test/unit/chaincode.js +++ b/fabric-shim/test/unit/chaincode.js @@ -10,16 +10,16 @@ const sinon = require('sinon'); const chai = require('chai'); const expect = chai.expect; const rewire = require('rewire'); -const grpc = require('grpc'); +const ProtoLoader = require('../../lib/protoloader'); const path = require('path'); -const Logger = require('../../../fabric-shim/lib/logger'); +const Logger = require('../../lib/logger'); -const chaincodePath = '../../../fabric-shim/lib/chaincode.js'; +const chaincodePath = '../../lib/chaincode.js'; const StartCommand = require('../../lib/cmds/startCommand.js'); -const _serviceProto = grpc.load({ - root: path.join(__dirname, '../../../fabric-shim/lib/protos'), +const _serviceProto = ProtoLoader.load({ + root: path.join(__dirname, '../../lib/protos'), file: 'peer/chaincode_shim.proto' }).protos; diff --git a/fabric-shim/test/unit/stub.js b/fabric-shim/test/unit/stub.js index 51ec7bbc..c3af230a 100644 --- a/fabric-shim/test/unit/stub.js +++ b/fabric-shim/test/unit/stub.js @@ -11,15 +11,15 @@ const chai = require('chai'); chai.use(require('chai-as-promised')); const expect = chai.expect; const rewire = require('rewire'); -const grpc = require('grpc'); +const ProtoLoader = require('../../lib/protoloader'); const path = require('path'); -const _serviceProto = grpc.load({ +const _serviceProto = ProtoLoader.load({ root: path.join(__dirname, '../../lib/protos'), file: 'peer/chaincode_shim.proto' }).protos; -const Stub = rewire('../../../fabric-shim/lib/stub.js'); +const Stub = rewire('../../lib/stub.js'); describe('Stub', () => { describe('validateCompositeKeyAttribute', () => {