embark/lib/modules/deployment/index.js

177 lines
5.4 KiB
JavaScript
Raw Normal View History

let async = require('async');
2018-07-24 12:29:06 +00:00
const ContractDeployer = require('./contract_deployer.js');
2018-09-30 16:48:44 +00:00
const cloneDeep = require('clone-deep');
2018-07-24 12:29:06 +00:00
2017-03-30 11:12:39 +00:00
class DeployManager {
2018-09-30 16:48:44 +00:00
constructor(embark, options) {
const self = this;
2018-09-30 16:48:44 +00:00
this.config = embark.config;
this.logger = embark.logger;
2017-03-30 11:12:39 +00:00
this.blockchainConfig = this.config.blockchainConfig;
2017-12-21 16:21:36 +00:00
2018-09-30 16:48:44 +00:00
this.events = embark.events;
2017-03-30 11:12:39 +00:00
this.plugins = options.plugins;
2018-05-18 22:31:47 +00:00
this.blockchain = options.blockchain;
2018-01-13 16:38:10 +00:00
this.gasLimit = false;
this.fatalErrors = false;
this.deployOnlyOnConfig = false;
this.onlyCompile = options.onlyCompile !== undefined ? options.onlyCompile : false;
2018-09-30 16:48:44 +00:00
this.contractDeployer = new ContractDeployer({
logger: this.logger,
events: this.events,
plugins: this.plugins
});
this.events.setCommandHandler('deploy:setGasLimit', (gasLimit) => {
self.gasLimit = gasLimit;
});
this.events.setCommandHandler('deploy:contracts', (cb) => {
self.deployContracts(cb);
});
2018-09-30 16:48:44 +00:00
this.events.setCommandHandler('deploy:contracts:test', (cb) => {
self.fatalErrors = true;
self.deployOnlyOnConfig = true;
self.deployContracts(cb);
});
}
deployAll(done) {
let self = this;
2018-08-22 22:36:34 +00:00
self.events.request('contracts:dependencies', (err, contractDependencies) => {
self.events.request('contracts:list', (err, contracts) => {
if (err) {
return done(err);
}
2018-09-22 13:43:10 +00:00
2018-08-22 22:36:34 +00:00
self.logger.info(__("deploying contracts"));
2018-09-30 01:13:55 +00:00
async.waterfall([
function (next) {
self.plugins.emitAndRunActionsForEvent("deploy:beforeAll", next);
},
function () {
const contractDeploys = {};
const errors = [];
contracts.forEach(contract => {
function deploy(result, callback) {
if (typeof result === 'function') {
callback = result;
}
contract._gasLimit = self.gasLimit;
self.events.request('deploy:contract', contract, (err) => {
if (err) {
contract.error = err.message || err;
self.logger.error(err.message || err);
errors.push(err);
}
callback();
});
}
const className = contract.className;
if (!contractDependencies[className] || contractDependencies[className].length === 0) {
contractDeploys[className] = deploy;
return;
}
contractDeploys[className] = cloneDeep(contractDependencies[className]);
contractDeploys[className].push(deploy);
});
2018-08-09 16:58:41 +00:00
2018-09-22 13:43:10 +00:00
try {
2018-09-26 22:44:36 +00:00
async.auto(contractDeploys, 1, function(_err, _results) {
2018-09-22 13:43:10 +00:00
if (errors.length) {
_err = __("Error deploying contracts. Please fix errors to continue.");
self.logger.error(_err);
self.events.emit("outputError", __("Error deploying contracts, please check console"));
2018-09-22 13:43:10 +00:00
return done(_err);
}
if (contracts.length === 0) {
self.logger.info(__("no contracts found"));
return done();
}
self.logger.info(__("finished deploying contracts"));
done(err);
});
} catch (e) {
self.logger.error(e.message || e);
done(__('Error deploying'));
2018-09-12 15:55:29 +00:00
}
}
2018-09-30 01:13:55 +00:00
]);
2018-08-22 22:36:34 +00:00
});
});
}
2017-03-30 11:12:39 +00:00
deployContracts(done) {
let self = this;
if (self.blockchainConfig === {} || self.blockchainConfig.enabled === false) {
2018-05-08 21:49:46 +00:00
self.logger.info(__("Blockchain component is disabled in the config").underline);
2017-03-31 11:34:43 +00:00
this.events.emit('blockchainDisabled', {});
2017-03-30 11:12:39 +00:00
return done();
}
2017-03-30 11:12:39 +00:00
async.waterfall([
2018-09-30 16:48:44 +00:00
function requestBlockchainConnector(callback) {
self.events.request("blockchain:object", (blockchain) => {
self.blockchain = blockchain;
callback();
});
},
2017-03-30 11:12:39 +00:00
function buildContracts(callback) {
self.events.request("contracts:build", self.deployOnlyOnConfig, (err) => {
callback(err);
});
2017-03-30 11:12:39 +00:00
},
// TODO: shouldn't be necessary
2018-09-30 16:48:44 +00:00
function checkCompileOnly(callback) {
if (self.onlyCompile) {
2018-05-30 10:56:51 +00:00
self.events.emit('contractsDeployed');
return done();
2018-08-09 16:58:41 +00:00
}
return callback();
},
2018-05-20 10:46:12 +00:00
2018-07-26 17:15:20 +00:00
// TODO: could be implemented as an event (beforeDeployAll)
function checkIsConnectedToBlockchain(callback) {
2018-09-30 16:48:44 +00:00
self.blockchain.onReady((err) => {
callback(err);
});
2018-07-26 17:15:20 +00:00
},
// TODO: this can be done on the fly or as part of the initialization
function determineDefaultAccount(callback) {
self.blockchain.determineDefaultAccount((err) => {
callback(err);
2017-03-30 11:12:39 +00:00
});
},
2018-05-20 10:46:12 +00:00
function deployAllContracts(callback) {
self.deployAll(function (err) {
2018-05-19 02:40:47 +00:00
if (!err) {
2018-05-30 10:56:51 +00:00
self.events.emit('contractsDeployed');
2018-05-19 02:40:47 +00:00
}
if (err && self.fatalErrors) {
return callback(err);
}
callback();
2017-03-30 11:12:39 +00:00
});
2017-12-21 16:21:36 +00:00
},
function runAfterDeploy(callback) {
2018-05-30 12:00:31 +00:00
self.plugins.emitAndRunActionsForEvent('contracts:deploy:afterAll', callback);
2017-02-24 13:20:03 +00:00
}
], function (err, _result) {
done(err);
2017-02-24 13:20:03 +00:00
});
}
2017-03-30 11:12:39 +00:00
}
2017-02-24 13:20:03 +00:00
module.exports = DeployManager;