@decaf-ts/fabric-weaver
Version:
template for ts projects
115 lines • 13.7 kB
JavaScript
import { Logging } from "@decaf-ts/logging";
import { FabricBinaries } from "../constants/fabric-binaries";
import { OSN_ADMIN_BASE_COMMAND, OSN_ADMIN_SUBCOMMANDS, } from "../constants/fabric-orderer";
import { runCommand } from "../../utils/child-process";
export class FabricOSNAdminCommandBuilder {
constructor(logger) {
this.binName = FabricBinaries.OSNADMIN;
this.baseCommand = OSN_ADMIN_BASE_COMMAND;
this.command = OSN_ADMIN_SUBCOMMANDS.JOIN;
this.args = [];
if (!logger)
this.log = Logging.for(FabricOSNAdminCommandBuilder);
else
this.log = logger.for(FabricOSNAdminCommandBuilder.name);
}
setCommand(command) {
if (command !== undefined) {
this.log.debug(`Setting command to ${command}`);
this.command = command;
}
return this;
}
setHelp(show) {
if (show !== undefined && show === true) {
this.log.debug(`Setting help flag: ${show}`);
this.args.push("--help");
}
return this;
}
setOrdererAddress(address) {
if (address !== undefined) {
this.log.debug(`Setting orderer address: ${address}`);
this.args.push(`--orderer-address=${address}`);
}
return this;
}
setCAFile(caFile) {
if (caFile !== undefined) {
this.log.debug(`Setting CA file: ${caFile}`);
this.args.push(`--ca-file=${caFile}`);
}
return this;
}
setClientCert(clientCert) {
if (clientCert !== undefined) {
this.log.debug(`Setting client cert: ${clientCert}`);
this.args.push(`--client-cert=${clientCert}`);
}
return this;
}
setClientKey(clientKey) {
if (clientKey !== undefined) {
this.log.debug(`Setting client key: ${clientKey}`);
this.args.push(`--client-key=${clientKey}`);
}
return this;
}
setNoStatus(noStatus) {
if (noStatus !== undefined && noStatus === true) {
this.log.debug(`Setting no-status to ${noStatus}`);
this.args.push("--no-status");
}
return this;
}
setChannelID(channelID) {
if (channelID !== undefined) {
this.log.debug(`Setting channel ID to ${channelID}`);
this.args.push(`--channelID=${channelID}`);
}
return this;
}
setConfigBlock(configBlock) {
if (configBlock !== undefined) {
this.log.debug(`Setting config block to ${configBlock}`);
this.args.push(`--config-block=${configBlock}`);
}
return this;
}
build() {
const command = [
this.getBinary(),
this.getBaseCommand(),
this.getCommand(),
...[...new Set(this.args)],
].join(" ");
this.log.debug(`Built command: ${command}`);
return command;
}
getBaseCommand() {
return this.baseCommand;
}
getCommand() {
return this.command;
}
getBinary() {
return this.binName;
}
getArgs() {
return [...new Set(this.args)];
}
async execute() {
const bin = this.getBinary();
const argz = [this.getBaseCommand(), this.getCommand(), ...this.getArgs()];
try {
// const regex = /\[\s*INFO\s*\] Listening on http/;
// can be used as a promise but to lock the logs running as execsync
await runCommand(bin, argz);
}
catch (error) {
this.log.error(`Error: Failed to execute the command: ${error}`);
process.exit(1);
}
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFicmljLW9zbi1hZG1pbi1jb21tYW5kLWJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZmFicmljL29yZGVyZXIvZmFicmljLW9zbi1hZG1pbi1jb21tYW5kLWJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFVLE9BQU8sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUM5RCxPQUFPLEVBQ0wsc0JBQXNCLEVBQ3RCLHFCQUFxQixHQUN0QixNQUFNLDZCQUE2QixDQUFDO0FBQ3JDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUV2RCxNQUFNLE9BQU8sNEJBQTRCO0lBU3ZDLFlBQVksTUFBZTtRQU5uQixZQUFPLEdBQW1CLGNBQWMsQ0FBQyxRQUFRLENBQUM7UUFDbEQsZ0JBQVcsR0FBRyxzQkFBc0IsQ0FBQztRQUNyQyxZQUFPLEdBQTBCLHFCQUFxQixDQUFDLElBQUksQ0FBQztRQUU1RCxTQUFJLEdBQWEsRUFBRSxDQUFDO1FBRzFCLElBQUksQ0FBQyxNQUFNO1lBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLDRCQUE0QixDQUFDLENBQUM7O1lBQzdELElBQUksQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyw0QkFBNEIsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBRUQsVUFBVSxDQUFDLE9BQStCO1FBQ3hDLElBQUksT0FBTyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzFCLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLHNCQUFzQixPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQ2hELElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3pCLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7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QUFDO1lBQ2pFLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEIsQ0FBQztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IExvZ2dlciwgTG9nZ2luZyB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgRmFicmljQmluYXJpZXMgfSBmcm9tIFwiLi4vY29uc3RhbnRzL2ZhYnJpYy1iaW5hcmllc1wiO1xuaW1wb3J0IHtcbiAgT1NOX0FETUlOX0JBU0VfQ09NTUFORCxcbiAgT1NOX0FETUlOX1NVQkNPTU1BTkRTLFxufSBmcm9tIFwiLi4vY29uc3RhbnRzL2ZhYnJpYy1vcmRlcmVyXCI7XG5pbXBvcnQgeyBydW5Db21tYW5kIH0gZnJvbSBcIi4uLy4uL3V0aWxzL2NoaWxkLXByb2Nlc3NcIjtcblxuZXhwb3J0IGNsYXNzIEZhYnJpY09TTkFkbWluQ29tbWFuZEJ1aWxkZXIge1xuICBwcml2YXRlIGxvZzogTG9nZ2VyO1xuXG4gIHByaXZhdGUgYmluTmFtZTogRmFicmljQmluYXJpZXMgPSBGYWJyaWNCaW5hcmllcy5PU05BRE1JTjtcbiAgcHJpdmF0ZSBiYXNlQ29tbWFuZCA9IE9TTl9BRE1JTl9CQVNFX0NPTU1BTkQ7XG4gIHByaXZhdGUgY29tbWFuZDogT1NOX0FETUlOX1NVQkNPTU1BTkRTID0gT1NOX0FETUlOX1NVQkNPTU1BTkRTLkpPSU47XG5cbiAgcHJpdmF0ZSBhcmdzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKGxvZ2dlcj86IExvZ2dlcikge1xuICAgIGlmICghbG9nZ2VyKSB0aGlzLmxvZyA9IExvZ2dpbmcuZm9yKEZhYnJpY09TTkFkbWluQ29tbWFuZEJ1aWxkZXIpO1xuICAgIGVsc2UgdGhpcy5sb2cgPSBsb2dnZXIuZm9yKEZhYnJpY09TTkFkbWluQ29tbWFuZEJ1aWxkZXIubmFtZSk7XG4gIH1cblxuICBzZXRDb21tYW5kKGNvbW1hbmQ/OiBPU05fQURNSU5fU1VCQ09NTUFORFMpOiB0aGlzIHtcbiAgICBpZiAoY29tbWFuZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBjb21tYW5kIHRvICR7Y29tbWFuZH1gKTtcbiAgICAgIHRoaXMuY29tbWFuZCA9IGNvbW1hbmQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRIZWxwKHNob3c/OiBib29sZWFuKTogdGhpcyB7XG4gICAgaWYgKHNob3cgIT09IHVuZGVmaW5lZCAmJiBzaG93ID09PSB0cnVlKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBoZWxwIGZsYWc6ICR7c2hvd31gKTtcbiAgICAgIHRoaXMuYXJncy5wdXNoKFwiLS1oZWxwXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldE9yZGVyZXJBZGRyZXNzKGFkZHJlc3M/OiBzdHJpbmcpOiB0aGlzIHtcbiAgICBpZiAoYWRkcmVzcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBvcmRlcmVyIGFkZHJlc3M6ICR7YWRkcmVzc31gKTtcbiAgICAgIHRoaXMuYXJncy5wdXNoKGAtLW9yZGVyZXItYWRkcmVzcz0ke2FkZHJlc3N9YCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0Q0FGaWxlKGNhRmlsZT86IHN0cmluZyk6IHRoaXMge1xuICAgIGlmIChjYUZpbGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgQ0EgZmlsZTogJHtjYUZpbGV9YCk7XG4gICAgICB0aGlzLmFyZ3MucHVzaChgLS1jYS1maWxlPSR7Y2FGaWxlfWApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldENsaWVudENlcnQoY2xpZW50Q2VydD86IHN0cmluZyk6IHRoaXMge1xuICAgIGlmIChjbGllbnRDZXJ0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIGNsaWVudCBjZXJ0OiAke2NsaWVudENlcnR9YCk7XG4gICAgICB0aGlzLmFyZ3MucHVzaChgLS1jbGllbnQtY2VydD0ke2NsaWVudENlcnR9YCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0Q2xpZW50S2V5KGNsaWVudEtleT86IHN0cmluZyk6IHRoaXMge1xuICAgIGlmIChjbGllbnRLZXkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgY2xpZW50IGtleTogJHtjbGllbnRLZXl9YCk7XG4gICAgICB0aGlzLmFyZ3MucHVzaChgLS1jbGllbnQta2V5PSR7Y2xpZW50S2V5fWApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldE5vU3RhdHVzKG5vU3RhdHVzPzogYm9vbGVhbik6IHRoaXMge1xuICAgIGlmIChub1N0YXR1cyAhPT0gdW5kZWZpbmVkICYmIG5vU3RhdHVzID09PSB0cnVlKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBuby1zdGF0dXMgdG8gJHtub1N0YXR1c31gKTtcbiAgICAgIHRoaXMuYXJncy5wdXNoKFwiLS1uby1zdGF0dXNcIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0Q2hhbm5lbElEKGNoYW5uZWxJRD86IHN0cmluZyk6IHRoaXMge1xuICAgIGlmIChjaGFubmVsSUQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgY2hhbm5lbCBJRCB0byAke2NoYW5uZWxJRH1gKTtcbiAgICAgIHRoaXMuYXJncy5wdXNoKGAtLWNoYW5uZWxJRD0ke2NoYW5uZWxJRH1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRDb25maWdCbG9jayhjb25maWdCbG9jaz86IHN0cmluZyk6IHRoaXMge1xuICAgIGlmIChjb25maWdCbG9jayAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBjb25maWcgYmxvY2sgdG8gJHtjb25maWdCbG9ja31gKTtcbiAgICAgIHRoaXMuYXJncy5wdXNoKGAtLWNvbmZpZy1ibG9jaz0ke2NvbmZpZ0Jsb2NrfWApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGJ1aWxkKCk6IHN0cmluZyB7XG4gICAgY29uc3QgY29tbWFuZDogc3RyaW5nID0gW1xuICAgICAgdGhpcy5nZXRCaW5hcnkoKSxcbiAgICAgIHRoaXMuZ2V0QmFzZUNvbW1hbmQoKSxcbiAgICAgIHRoaXMuZ2V0Q29tbWFuZCgpLFxuICAgICAgLi4uWy4uLm5ldyBTZXQodGhpcy5hcmdzKV0sXG4gICAgXS5qb2luKFwiIFwiKTtcblxuICAgIHRoaXMubG9nLmRlYnVnKGBCdWlsdCBjb21tYW5kOiAke2NvbW1hbmR9YCk7XG4gICAgcmV0dXJuIGNvbW1hbmQ7XG4gIH1cblxuICBnZXRCYXNlQ29tbWFuZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmJhc2VDb21tYW5kO1xuICB9XG5cbiAgZ2V0Q29tbWFuZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNvbW1hbmQ7XG4gIH1cblxuICBnZXRCaW5hcnkoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5iaW5OYW1lO1xuICB9XG5cbiAgZ2V0QXJncygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIFsuLi5uZXcgU2V0KHRoaXMuYXJncyldO1xuICB9XG5cbiAgYXN5bmMgZXhlY3V0ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBiaW4gPSB0aGlzLmdldEJpbmFyeSgpO1xuICAgIGNvbnN0IGFyZ3ogPSBbdGhpcy5nZXRCYXNlQ29tbWFuZCgpLCB0aGlzLmdldENvbW1hbmQoKSwgLi4udGhpcy5nZXRBcmdzKCldO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIGNvbnN0IHJlZ2V4ID0gL1xcW1xccypJTkZPXFxzKlxcXSBMaXN0ZW5pbmcgb24gaHR0cC87XG4gICAgICAvLyBjYW4gYmUgdXNlZCBhcyBhIHByb21pc2UgYnV0IHRvIGxvY2sgdGhlIGxvZ3MgcnVubmluZyBhcyBleGVjc3luY1xuICAgICAgYXdhaXQgcnVuQ29tbWFuZChiaW4sIGFyZ3opO1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICB0aGlzLmxvZy5lcnJvcihgRXJyb3I6IEZhaWxlZCB0byBleGVjdXRlIHRoZSBjb21tYW5kOiAke2Vycm9yfWApO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgfVxufVxuIl19