diff --git a/lib/cmd.js b/lib/cmd.js index f2587bca9..a3440b974 100644 --- a/lib/cmd.js +++ b/lib/cmd.js @@ -58,11 +58,7 @@ Cmd.prototype.build = function() { .command('build [environment]') .description('deploy and build dapp at dist/ (default: development)') .action(function(env, options) { - self.Embark.initConfig(env || 'development', { - embarkConfig: 'embark.json', - interceptLogs: false - }); - self.Embark.build(env || 'development'); + self.Embark.build({env: env || 'development'}); }); }; @@ -77,9 +73,6 @@ Cmd.prototype.run = function() { .option('--no-color', 'no colors in case it\'s needed for compatbility purposes') .description('run dapp (default: development)') .action(function(env, options) { - self.Embark.initConfig(env || 'development', { - embarkConfig: 'embark.json' - }); self.Embark.run({ env: env || 'development', serverPort: options.port, diff --git a/lib/contracts/deploy_manager.js b/lib/contracts/deploy_manager.js index 31206e4a9..6ea9e98f3 100644 --- a/lib/contracts/deploy_manager.js +++ b/lib/contracts/deploy_manager.js @@ -10,6 +10,13 @@ var DeployManager = function(options) { this.blockchainConfig = this.config.blockchainConfig; this.plugins = options.plugins; this.events = options.events; + this.web3 = options.web3; + // TODO: lol, redo this + if (options.trackContracts !== false) { + this.chainConfig = this.config.chainTracker; + } else { + this.chainConfig = false; + } }; DeployManager.prototype.deployContracts = function(done) { @@ -31,19 +38,24 @@ DeployManager.prototype.deployContracts = function(done) { }); contractsManager.build(callback); }, - function deployContracts(contractsManager, callback) { + function deployContracts2(contractsManager, callback) { //TODO: figure out where to put this since the web3 can be passed along if needed // perhaps it should go into the deploy object itself // TODO: should come from the config object - var web3 = new Web3(); - var web3Endpoint = 'http://' + self.config.blockchainConfig.rpcHost + ':' + self.config.blockchainConfig.rpcPort; - web3.setProvider(new web3.providers.HttpProvider(web3Endpoint)); + var web3; + if (self.web3) { + web3 = self.web3; + } else { + web3 = new Web3(); + var web3Endpoint = 'http://' + self.config.blockchainConfig.rpcHost + ':' + self.config.blockchainConfig.rpcPort; + web3.setProvider(new web3.providers.HttpProvider(web3Endpoint)); - if (!web3.isConnected()) { - self.logger.error(("Couldn't connect to " + web3Endpoint.underline + " are you sure it's on?").red); - self.logger.info("make sure you have an ethereum node or simulator running. e.g 'embark blockchain'".magenta); - return callback(Error("error connecting to blockchain node")); + if (!web3.isConnected()) { + self.logger.error(("Couldn't connect to " + web3Endpoint.underline + " are you sure it's on?").red); + self.logger.info("make sure you have an ethereum node or simulator running. e.g 'embark blockchain'".magenta); + return callback(Error("error connecting to blockchain node")); + } } web3.eth.getAccounts(function(err, accounts) { @@ -56,7 +68,7 @@ DeployManager.prototype.deployContracts = function(done) { web3: web3, contractsManager: contractsManager, logger: self.logger, - chainConfig: self.config.chainTracker, + chainConfig: self.chainConfig, env: self.config.env }); deploy.deployAll(function() { diff --git a/lib/contracts/deploy_tracker.js b/lib/contracts/deploy_tracker.js index ac09890b4..79152057d 100644 --- a/lib/contracts/deploy_tracker.js +++ b/lib/contracts/deploy_tracker.js @@ -11,6 +11,7 @@ var DeployTracker = function(options) { return; } + // TODO: need to make this async var block = this.web3.eth.getBlock(0); var chainId = block.hash; diff --git a/lib/core/config.js b/lib/core/config.js index 26e172465..81465c632 100644 --- a/lib/core/config.js +++ b/lib/core/config.js @@ -61,7 +61,7 @@ Config.prototype.reloadConfig = function() { Config.prototype.loadBlockchainConfigFile = function() { var defaultBlockchainConfig = fs.readJSONSync(this.configDir + "blockchain.json"); - this.blockchainConfig = defaultBlockchainConfig[this.env]; + this.blockchainConfig = defaultBlockchainConfig[this.env] || {}; if (this.blockchainConfig.enabled === undefined) { this.blockchainConfig.enabled = true; @@ -109,7 +109,7 @@ Config.prototype.loadStorageConfigFile = function() { var envStorageConfig = configObject[this.env]; var mergedConfig = utils.recursiveMerge(defaultStorageConfig, envStorageConfig); - this.storageConfig = mergedConfig; + this.storageConfig = mergedConfig || {}; if (this.storageConfig.enabled === undefined) { this.storageConfig.enabled = true; @@ -137,7 +137,7 @@ Config.prototype.loadCommunicationConfigFile = function() { var envCommunicationConfig = configObject[this.env]; var mergedConfig = utils.recursiveMerge(defaultCommunicationConfig, envCommunicationConfig); - this.communicationConfig = mergedConfig; + this.communicationConfig = mergedConfig || {}; if (this.communicationConfig.enabled === undefined) { this.communicationConfig.enabled = true; diff --git a/lib/core/engine.js b/lib/core/engine.js new file mode 100644 index 000000000..32a1f8c23 --- /dev/null +++ b/lib/core/engine.js @@ -0,0 +1,115 @@ +var Events = require('./events.js'); +var Logger = require('./logger.js'); +var Config = require('./config.js'); + +var DeployManager = require('../contracts/deploy_manager.js'); +var ABIGenerator = require('../contracts/abi.js'); +var Dashboard = require('../dashboard/dashboard.js'); +var ServicesMonitor = require('./services.js'); +var Pipeline = require('../pipeline/pipeline.js'); +var Server = require('../pipeline/server.js'); +var Watch = require('../pipeline/watch.js'); + +var Engine = function(options) { + this.env = options.env; + this.embarkConfig = options.embarkConfig; + this.interceptLogs = options.interceptLogs; + this.version = "2.3.0"; +}; + +Engine.prototype.init = function(_options) { + var options = _options || {}; + this.events = new Events(); + this.logger = options.logger || new Logger({logLevel: 'debug'}); + this.config = new Config({env: this.env, logger: this.logger}); + this.config.loadConfigFiles({embarkConfig: this.embarkConfig, interceptLogs: this.interceptLogs}); + this.plugins = this.config.plugins; +}; + +Engine.prototype.startService = function(serviceName, _options) { + var self = this; + var options = _options || {}; + if (serviceName === "monitor") { + var servicesMonitor = new ServicesMonitor({ + logger: this.logger, + config: this.config, + serverHost: options.serverHost, + serverPort: options.serverPort, + runWebserver: options.runWebserver, + version: this.version + }); + servicesMonitor.startMonitor(); + } else if (serviceName === "pipeline") { + this.logger.setStatus("Building Assets"); + var pipeline = new Pipeline({ + buildDir: this.config.buildDir, + contractsFiles: this.config.contractsFiles, + assetFiles: this.config.assetFiles, + logger: this.logger, + plugins: this.plugins + }); + this.events.on('abi', function(abi) { + self.currentAbi = abi; + pipeline.build(abi); + }); + this.events.on('file-event', function(fileType, path) { + if (fileType === 'asset') { + self.config.reloadConfig(); + pipeline.build(self.abi, path); + } + }); + } else if (serviceName === "abi") { + var generateABICode = function(contractsManager) { + var abiGenerator = new ABIGenerator({ + blockchainConfig: self.config.blockchainConfig, + contractsManager: contractsManager, + plugins: self.plugins, + storageConfig: self.config.storageConfig, + communicationConfig: self.config.communicationConfig + }); + var embarkJSABI = abiGenerator.generateABI({useEmbarkJS: true}); + var vanillaABI = abiGenerator.generateABI({useEmbarkJS: false}); + var vanillaContractsABI = abiGenerator.generateContracts(false); + + self.events.emit('abi-contracts-vanila', vanillaContractsABI); + self.events.emit('abi-vanila', vanillaABI); + self.events.emit('abi', embarkJSABI); + }; + this.events.on('contractsDeployed', generateABICode); + this.events.on('blockchainDisabled', generateABICode); + } else if (serviceName === "deployment") { + this.deployManager = new DeployManager({ + web3: options.web3, + trackContracts: options.trackContracts, + config: this.config, + logger: this.logger, + plugins: this.plugins, + events: this.events + }); + //deployManager.deployContracts(function() { + //}); + + this.events.on('file-event', function(fileType, path) { + if (fileType === 'contract' || fileType === 'config') { + self.config.reloadConfig(); + deployManager.deployContracts(function() {}); + } + }); + } else if (serviceName === "fileWatcher") { + this.logger.setStatus("Watching for changes"); + var watch = new Watch({logger: this.logger, events: this.events}); + watch.start(); + } else if (serviceName === "webServer") { + this.logger.setStatus("Starting Server"); + var server = new Server({ + logger: this.logger, + host: options.serverHost, + port: options.serverPort + }); + server.start(function(){}); + } else { + throw new Error("unknown service: " + serviceName); + } +}; + +module.exports = Engine; diff --git a/lib/core/test.js b/lib/core/test.js index 0ecbcd39f..5173a86c4 100644 --- a/lib/core/test.js +++ b/lib/core/test.js @@ -3,6 +3,8 @@ var Web3 = require('web3'); var Embark = require('../index.js'); +var Engine = require('./engine.js'); + var ABIGenerator = require('../contracts/abi.js'); var ContractsManager = require('../contracts/contracts.js'); var Deploy = require('../contracts/deploy.js'); @@ -13,7 +15,17 @@ var TestLogger = require('./test_logger.js'); var Test = function(options) { this.options = options || {}; - this.logger = new TestLogger({logLevel: this.options.logLevel || 'debug'}); + this.engine = new Engine({ + env: this.options.env || 'test', + // TODO: confi will need to detect if this is a obj + embarkConfig: this.options.embarkConfig || 'embark.json', + interceptLogs: false + }); + + this.engine.init({ + logger: new TestLogger({logLevel: this.options.logLevel || 'debug'}) + }); + var simOptions = this.options.simulatorOptions || {}; try { @@ -43,41 +55,24 @@ Test.prototype.deployAll = function(contractsConfig, cb) { async.waterfall([ function getConfig(callback) { - var config = new Config({env: 'test', logger: self.logger}); - config.loadConfigFiles({ - embarkConfig: self.options.embarkConfig || 'embark.json', - interceptLogs: false - }); - config.contractsConfig = {contracts: contractsConfig}; - callback(null, config); + self.engine.config.contractsConfig = {contracts: contractsConfig}; + callback(); }, - function buildContracts(config, callback) { - var contractsManager = new ContractsManager({ - contractFiles: config.contractsFiles, - contractsConfig: config.contractsConfig, - logger: self.logger, - plugins: config.plugins - }); - contractsManager.build(function() { - callback(null, contractsManager); - }); - }, - function deployContracts(contractsManager, callback) { - var deploy = new Deploy({ + function startServices(callback) { + //{abiType: 'contracts', embarkJS: false} + self.engine.startService("abi"); + self.engine.startService("deployment", { web3: self.web3, - contractsManager: contractsManager, - logger: self.logger, - chainConfig: false, - env: 'test' - }); - deploy.deployAll(function() { - callback(null, contractsManager); + trackContracts: false }); + callback(); }, - function generateABI(contractsManager, callback) { - var abiGenerator = new ABIGenerator({contractsManager: contractsManager}); - var ABI = abiGenerator.generateContracts(false); - callback(null, ABI); + function deploy(callback) { + self.engine.events.on('abi-contracts-vanila', function(vanillaABI) { + callback(null, vanillaABI); + }); + self.engine.deployManager.deployContracts(function() { + }); } ], function(err, result) { if (err) { diff --git a/lib/index.js b/lib/index.js index 9ea8a65b3..2da436a63 100644 --- a/lib/index.js +++ b/lib/index.js @@ -5,25 +5,19 @@ var async = require('async'); var Web3 = require('web3'); var colors = require('colors'); +var Engine = require('./core/engine.js'); + var Blockchain = require('./cmds/blockchain/blockchain.js'); var Simulator = require('./cmds/simulator.js'); var TemplateGenerator = require('./cmds/template_generator.js'); -var DeployManager = require('./contracts/deploy_manager.js'); -var ABIGenerator = require('./contracts/abi.js'); - var Test = require('./core/test.js'); var Logger = require('./core/logger.js'); var Config = require('./core/config.js'); -var ServicesMonitor = require('./core/services.js'); var Events = require('./core/events.js'); var Dashboard = require('./dashboard/dashboard.js'); -var Pipeline = require('./pipeline/pipeline.js'); -var Server = require('./pipeline/server.js'); -var Watch = require('./pipeline/watch.js'); - var IPFS = require('./upload/ipfs.js'); var Swarm = require('./upload/swarm.js'); @@ -45,7 +39,6 @@ var Embark = { this.config = new Config({env: env, logger: this.logger}); this.config.loadConfigFiles(options); this.plugins = this.config.plugins; - }, blockchain: function(env, client) { @@ -67,6 +60,12 @@ var Embark = { var self = this; var env = options.env; + var engine = new Engine({ + env: options.env, + embarkConfig: 'embark.json' + }); + engine.init(); + if (!options.useDashboard) { console.log('========================'.bold.green); console.log(('Welcome to Embark ' + Embark.version).yellow.bold); @@ -80,13 +79,13 @@ var Embark = { } var dashboard = new Dashboard({ - logger: Embark.logger, - plugins: self.plugins, - version: self.version, - env: env + logger: engine.logger, + plugins: engine.plugins, + version: engine.version, + env: engine.env }); dashboard.start(function() { - self.events.on('abi-vanila', function(abi) { + engine.events.on('abi-vanila', function(abi) { dashboard.console.runCode(abi); }); @@ -94,177 +93,76 @@ var Embark = { }); }, function (callback) { - Embark.startEmbark(options, callback); - } - ], function(err, result) { - if (err) { - self.logger.error(err.message); - } else { - self.logger.setStatus("Ready".green); - self.logger.info("Looking for documentation? you can find it at ".cyan + "http://embark.readthedocs.io/".green.underline); - self.logger.info("Ready".underline); - } - }); - }, - - startEmbark: function(options, done) { - var self = this; - var env = options.env; - async.waterfall([ - function displayLoadedPlugins(callback) { - var pluginList = self.plugins.listPlugins(); + var pluginList = engine.plugins.listPlugins(); if (pluginList.length > 0) { - self.logger.info("loaded plugins: " + pluginList.join(", ")); + engine.logger.info("loaded plugins: " + pluginList.join(", ")); } - callback(); - }, - // can be done in paralell - function monitorServices(callback) { - if (!options.useDashboard) { - return callback(); - } - var servicesMonitor = new ServicesMonitor({ - logger: Embark.logger, - config: Embark.config, - serverHost: options.serverHost, - serverPort: options.serverPort, - runWebserver: options.runWebserver, - version: Embark.version - }); - servicesMonitor.startMonitor(); - callback(); - }, - - function buildPipeline(callback) { - self.logger.setStatus("Building Assets"); - var pipeline = new Pipeline({ - buildDir: self.config.buildDir, - contractsFiles: self.config.contractsFiles, - assetFiles: self.config.assetFiles, - logger: self.logger, - plugins: self.plugins - }); - self.events.on('abi', function(abi) { - Embark.currentAbi = abi; - pipeline.build(abi); - }); - self.events.on('file-event', function(fileType, path) { - if (fileType === 'asset') { - self.config.reloadConfig(); - pipeline.build(Embark.abi, path); - } - }); - callback(); - }, - - function generateABI(callback) { - var generateABICode = function(contractsManager) { - var abiGenerator = new ABIGenerator({ - blockchainConfig: self.config.blockchainConfig, - contractsManager: contractsManager, - plugins: self.plugins, - storageConfig: self.config.storageConfig, - communicationConfig: self.config.communicationConfig + if (options.useDashboard) { + engine.startService("monitor", { + serverHost: options.serverHost, + serverPort: options.serverPort, + runWebserver: options.runWebserver }); - var embarkJSABI = abiGenerator.generateABI({useEmbarkJS: true}); - var vanillaABI = abiGenerator.generateABI({useEmbarkJS: false}); + } + engine.startService("pipeline"); + engine.startService("abi"); + engine.startService("deployment"); - self.events.emit('abi-vanila', vanillaABI); - self.events.emit('abi', embarkJSABI); - }; - self.events.on('contractsDeployed', generateABICode); - self.events.on('blockchainDisabled', generateABICode); - callback(); - }, - - function deploy(callback) { - var deployManager = new DeployManager({ - config: Embark.config, - logger: Embark.logger, - plugins: self.plugins, - events: self.events - }); - deployManager.deployContracts(function() { + engine.deployManager.deployContracts(function() { + engine.startService("fileWatcher"); + if (options.runWebserver) { + engine.startService("webServer", { + host: options.serverHost, + port: options.serverPort + }); + } callback(); }); - - self.events.on('file-event', function(fileType, path) { - if (fileType === 'contract' || fileType === 'config') { - self.config.reloadConfig(); - deployManager.deployContracts(function() {}); - } - }); - }, - - function watchFilesForChanges(callback) { - self.logger.setStatus("Watching for changes"); - var watch = new Watch({logger: self.logger, events: self.events}); - watch.start(); - callback(); - }, - - function startAssetServer(callback) { - if (!options.runWebserver) { - return callback(); - } - self.logger.setStatus("Starting Server"); - var server = new Server({ - logger: self.logger, - host: options.serverHost, - port: options.serverPort - }); - server.start(callback); } - ], function(err, result) { if (err) { - self.logger.error(err.message); + engine.logger.error(err.message); + } else { + engine.logger.setStatus("Ready".green); + engine.logger.info("Looking for documentation? you can find it at ".cyan + "http://embark.readthedocs.io/".green.underline); + engine.logger.info("Ready".underline); } - done(); }); }, - build: function(env) { + build: function(options) { var self = this; + + var engine = new Engine({ + env: options.env, + embarkConfig: 'embark.json', + interceptLogs: false + }); + engine.init(); + async.waterfall([ - function displayLoadedPlugins(callback) { - var pluginList = self.plugins.listPlugins(); + function startServices(callback) { + var pluginList = engine.plugins.listPlugins(); if (pluginList.length > 0) { - self.logger.info("loaded plugins: " + pluginList.join(", ")); + engine.logger.info("loaded plugins: " + pluginList.join(", ")); } + + engine.startService("pipeline"); + engine.startService("abi"); + engine.startService("deployment"); callback(); }, - - function deployAndGenerateABI(callback) { - var deployManager = new DeployManager({ - config: Embark.config, - logger: Embark.logger, - plugins: self.plugins, - events: self.events + function deploy(callback) { + engine.deployManager.deployContracts(function() { + callback(); }); - deployManager.deployContracts(function(error, abi) { - callback(null, abi); - }); - }, - - function buildPipeline(abi, callback) { - self.logger.trace("Building Assets"); - var pipeline = new Pipeline({ - buildDir: self.config.buildDir, - contractsFiles: self.config.contractsFiles, - assetFiles: self.config.assetFiles, - logger: self.logger, - plugins: self.plugins - }); - pipeline.build(abi); - callback(); } ], function(err, result) { if (err) { - self.logger.error(err.message); + engine.logger.error(err.message); } else { - self.logger.info("finished building".underline); + engine.logger.info("finished building".underline); } // needed due to child processes process.exit();