bsp-network
Version:
SDK for writing node.js applications to interact with bsp network. This package encapsulates the APIs to connect to a bsp network, submit transactions and perform queries against the ledger.
155 lines (153 loc) • 5.8 kB
JavaScript
"use strict";
/*
Copyright 2019 IBM All Rights Reserved.
SPDX-License-Identifier: Apache-2.0
*/
const fs = require('fs-extra');
const { Utils: utils } = require('fabric-common');
const logger = utils.getLogger('NetworkConfig');
/**
* This is an implementation of the [NetworkConfig]{@link module:api.NetworkConfig} API.
* It will be used to work with the v1.0.1 version of a JSON based common connection profile.
* (also known as a network configuration).
*
* @class
*/
class NetworkConfig {
static async loadFromConfig(client, config = {}) {
const method = 'loadFromConfig';
logger.debug('%s - start', method);
// create peers
if (config.peers) {
for (const peer_name in config.peers) {
await buildPeer(client, peer_name, config.peers[peer_name], config);
}
}
// create orderers
if (config.orderers) {
for (const orderer_name in config.orderers) {
await buildOrderer(client, orderer_name, config.orderers[orderer_name]);
}
}
// build channels
if (config.channels) {
for (const channel_name in config.channels) {
buildChannel(client, channel_name, config.channels[channel_name]);
}
}
logger.debug('%s - end', method);
}
}
async function buildChannel(client, channel_name, channel_config, config) {
const method = 'buildChannel';
logger.debug('%s - start - %s', method, channel_name);
// this will add the channel to the client instance
const channel = client.getChannel(channel_name);
if (channel_config.peers) {
// using 'in' as peers is an object
for (const peer_name in channel_config.peers) {
const peer = client.getEndorser(peer_name);
channel.addEndorser(peer);
logger.debug('%s - added endorsing peer :: %s', method, peer.name);
}
}
else {
logger.debug('%s - no peers in config', method);
}
if (channel_config.orderers) {
// using 'of' as orderers is an array
for (const orderer_name of channel_config.orderers) {
const orderer = client.getCommitter(orderer_name);
channel.addCommitter(orderer);
logger.debug('%s - added orderer :: %s', method, orderer.name);
}
}
else {
logger.debug('%s - no orderers in config', method);
}
}
async function buildOrderer(client, orderer_name, orderer_config) {
const method = 'buildOrderer';
logger.debug('%s - start - %s', method, orderer_name);
const mspid = orderer_config.mspid;
const options = buildOptions(orderer_config);
const end_point = client.newEndpoint(options);
try {
logger.debug('%s - about to connect to committer %s url:%s mspid:%s', method, orderer_name, orderer_config.url, mspid);
// since the client saves the orderer, no need to save here
const orderer = client.getCommitter(orderer_name, mspid);
await orderer.connect(end_point);
logger.debug('%s - connected to committer %s url:%s', method, orderer_name, orderer_config.url);
}
catch (error) {
logger.error('%s - Unable to connect to the committer %s due to %s', method, orderer_name, error);
}
}
async function buildPeer(client, peer_name, peer_config, config) {
const method = 'buildPeer';
logger.debug('%s - start - %s', method, peer_name);
const mspid = findPeerMspid(peer_name, config);
const options = buildOptions(peer_config);
const end_point = client.newEndpoint(options);
try {
logger.debug('%s - about to connect to endorser %s url:%s mspid:%s', method, peer_name, peer_config.url, mspid);
// since this adds to the clients list, no need to save
const peer = client.getEndorser(peer_name, mspid);
await peer.connect(end_point);
logger.debug('%s - connected to endorser %s url:%s', method, peer_name, peer_config.url);
}
catch (error) {
logger.error('%s - Unable to connect to the endorser %s due to %s', method, peer_name, error);
}
}
function findPeerMspid(name, config) {
const method = 'findPeerMspid';
logger.debug('%s - start for %s', method, name);
let mspid = null;
here: for (const org_name in config.organizations) {
const org = config.organizations[org_name];
for (const peer of org.peers) {
logger.debug('%s - checking peer %s in org %s', method, peer, org_name);
if (peer === name) {
mspid = org.mspid;
logger.debug('%s - found mspid %s for %s', method, mspid, name);
break here;
}
}
}
return mspid;
}
function buildOptions(endpoint_config) {
const method = 'buildOptions';
logger.debug(`${method} - start`);
const options = {
url: endpoint_config.url
};
const pem = getPEMfromConfig(endpoint_config.tlsCACerts);
if (pem) {
options.pem = pem;
}
Object.assign(options, endpoint_config.grpcOptions);
if (options['request-timeout'] && !options.requestTimeout) {
options.requestTimeout = options['request-timeout'];
}
return options;
}
function getPEMfromConfig(config) {
let result = null;
if (config) {
if (config.pem) {
// cert value is directly in the configuration
result = config.pem;
}
else if (config.path) {
// cert value is in a file
const data = fs.readFileSync(config.path);
result = Buffer.from(data).toString();
result = utils.normalizeX509(result);
}
}
return result;
}
module.exports = NetworkConfig;
//# sourceMappingURL=networkconfig.js.map