diff --git a/cli/bitcore-node.js b/cli/bitcore-node.js index e53ffdb2..a99704ed 100755 --- a/cli/bitcore-node.js +++ b/cli/bitcore-node.js @@ -2,84 +2,43 @@ 'use strict'; -var program = require('commander'); -var version = require(__dirname + '/../package.json').version; -var bitcore = require('bitcore'); -var $ = bitcore.util.preconditions; -var path = require('path'); -var create = require('../lib/scaffold/create'); -var add = require('../lib/scaffold/add'); -var start = require('../lib/scaffold/start'); -var findConfig = require('../lib/scaffold/find-config'); -var defaultConfig = require('../lib/scaffold/default-config'); +var semver = require('semver'); +var Liftoff = require('liftoff'); +var cliPackage = require('../package.json'); -program - .version(version); +var liftoff = new Liftoff({ + name: 'bitcore-node', + moduleName: 'bitcore-node', + configName: 'bitcore-node', + processTitle: 'bitcore-node' +}).on('require', function (name, module) { + console.log('Loading:', name); +}).on('requireFail', function (name, err) { + console.log('Unable to load:', name, err); +}).on('respawn', function (flags, child) { + console.log('Detected node flags:', flags); + console.log('Respawned to PID:', child.pid); +}); -program - .command('create [name]') - .description('Create a new node') - .option('-d, --datadir ', 'Specify the bitcoin database directory') - .action(function(dirname, name, cmd){ - if (cmd.datadir) { - cmd.datadir = path.resolve(process.cwd(), cmd.datadir); +liftoff.launch({ + cwd: process.cwd() +}, function(env){ + + var bitcorenode; + if (env.modulePackage && env.configPath) { + // use the local version + if (semver.gt(cliPackage.version, env.modulePackage.version)) { + throw new Error( + 'Version mismatch, global bitcore-node is ' + cliPackage.version + + ' and local bitcore-node is ' + env.modulePackage.version + ); } - var opts = { - cwd: process.cwd(), - dirname: dirname, - name: name, - datadir: cmd.datadir || './data', - isGlobal: false - }; - create(opts, function(err) { - if (err) { - throw err; - } - console.log('Successfully created node in directory: ', dirname); - }); - }); + bitcorenode = require(env.modulePath); + } else { + // use the global version + bitcorenode = require('..'); + } -program - .command('start') - .description('Start the current node') - .option('-c, --config ', 'Specify the directory with Bitcore Node configuration') - .action(function(cmd){ - if (cmd.config) { - cmd.config = path.resolve(process.cwd(), cmd.config); - } - var configInfo = findConfig(cmd.config || process.cwd()); - if (!configInfo) { - configInfo = defaultConfig(); - } - start(configInfo); - }); + bitcorenode.cli.main(); -program - .command('add ') - .alias('install') - .description('Install a module for the current node') - .action(function(modules){ - var configInfo = findConfig(process.cwd()); - if (!configInfo) { - throw new Error('Could not find configuration, see `bitcore-node create --help`'); - } - var opts = { - path: configInfo.path, - modules: modules - }; - add(opts, function() { - console.log('Successfully added modules: ', modules.join(', ')); - }); - }).on('--help', function() { - console.log(' Examples:'); - console.log(); - console.log(' $ bitcore-node add wallet-service'); - console.log(' $ bitcore-node add insight-api'); - console.log(); - }); - -program.parse(process.argv); - -if (process.argv.length === 2) { - program.help(); -} +}); diff --git a/cli/main.js b/cli/main.js new file mode 100644 index 00000000..33e18c74 --- /dev/null +++ b/cli/main.js @@ -0,0 +1,90 @@ +'use strict'; + +var program = require('commander'); +var path = require('path'); +var bitcorenode = require('..'); + +function main() { + + // local commands + var version = bitcorenode.version; + var create = bitcorenode.scaffold.create; + var add = bitcorenode.scaffold.add; + var start = bitcorenode.scaffold.start; + var findConfig = bitcorenode.scaffold.findConfig; + var defaultConfig = bitcorenode.scaffold.defaultConfig; + + program + .version(version); + + program + .command('create [name]') + .description('Create a new node') + .option('-d, --datadir ', 'Specify the bitcoin database directory') + .action(function(dirname, name, cmd){ + if (cmd.datadir) { + cmd.datadir = path.resolve(process.cwd(), cmd.datadir); + } + var opts = { + cwd: process.cwd(), + dirname: dirname, + name: name, + datadir: cmd.datadir || './data', + isGlobal: false + }; + create(opts, function(err) { + if (err) { + throw err; + } + console.log('Successfully created node in directory: ', dirname); + }); + }); + + program + .command('start') + .description('Start the current node') + .option('-c, --config ', 'Specify the directory with Bitcore Node configuration') + .action(function(cmd){ + if (cmd.config) { + cmd.config = path.resolve(process.cwd(), cmd.config); + } + var configInfo = findConfig(cmd.config || process.cwd()); + if (!configInfo) { + configInfo = defaultConfig(); + } + start(configInfo); + }); + + program + .command('add ') + .alias('install') + .description('Install a module for the current node') + .action(function(modules){ + var configInfo = findConfig(process.cwd()); + if (!configInfo) { + throw new Error('Could not find configuration, see `bitcore-node create --help`'); + } + var opts = { + path: configInfo.path, + modules: modules + }; + add(opts, function() { + console.log('Successfully added modules: ', modules.join(', ')); + }); + }).on('--help', function() { + console.log(' Examples:'); + console.log(); + console.log(' $ bitcore-node add wallet-service'); + console.log(' $ bitcore-node add insight-api'); + console.log(); + }); + + program.parse(process.argv); + + if (process.argv.length === 2) { + program.help(); + } + +} + +module.exports = main; diff --git a/index.js b/index.js index eee37c48..49938a63 100644 --- a/index.js +++ b/index.js @@ -13,5 +13,15 @@ module.exports.errors = require('./lib/errors'); module.exports.modules = {}; module.exports.modules.AddressModule = require('./lib/modules/address'); +module.exports.scaffold = {}; +module.exports.scaffold.create = require('./lib/scaffold/create'); +module.exports.scaffold.add = require('./lib/scaffold/add'); +module.exports.scaffold.start = require('./lib/scaffold/start'); +module.exports.scaffold.findConfig = require('./lib/scaffold/find-config'); +module.exports.scaffold.defaultConfig = require('./lib/scaffold/default-config'); + +module.exports.cli = {}; +module.exports.cli.main = require('./cli/main'); + module.exports.deps = {}; module.exports.deps.chainlib = require('chainlib'); diff --git a/lib/scaffold/start.js b/lib/scaffold/start.js index 4ae6ea6d..c2cac866 100644 --- a/lib/scaffold/start.js +++ b/lib/scaffold/start.js @@ -15,7 +15,7 @@ var interval = false; function start(options) { /* jshint maxstatements: 100 */ - var modules = []; + var bitcoreModules = []; var configPath = options.path; var config = options.config; @@ -23,16 +23,31 @@ function start(options) { if (config.modules) { for (var i = 0; i < config.modules.length; i++) { var moduleName = config.modules[i]; - var module; + var bitcoreModule; try { // first try in the built-in bitcore-node modules directory - module = require(path.resolve(__dirname, '../modules/' + moduleName)); + bitcoreModule = require(path.resolve(__dirname, '../modules/' + moduleName)); } catch(e) { - // then try loading external modules - module = require(moduleName); + + // check if the package.json specifies a specific file to use + var modulePackage = require(moduleName + '/package.json'); + var bitcoreNodeModule = moduleName; + if (modulePackage.bitcoreNode) { + bitcoreNodeModule = moduleName + '/' + modulePackage.bitcoreNode; + } + bitcoreModule = require(bitcoreNodeModule); + } - modules.push(module); + // check that the module supports expected methods + if (!bitcoreModule.prototype || + !bitcoreModule.prototype.start || + !bitcoreModule.prototype.stop) { + throw new Error( + 'Could not load module "' + moduleName + '" as it does not support necessary methods.' + ); + } + bitcoreModules.push(bitcoreModule); } } @@ -46,7 +61,7 @@ function start(options) { // load the modules fullConfig.db = { - modules: modules + modules: bitcoreModules }; var node = new BitcoreNode(fullConfig); diff --git a/package.json b/package.json index dc9aead7..3201eb05 100644 --- a/package.json +++ b/package.json @@ -50,9 +50,11 @@ "chainlib": "^0.2.0", "commander": "^2.8.1", "errno": "^0.1.2", + "liftoff": "^2.1.0", "memdown": "^1.0.0", "mkdirp": "0.5.0", "nan": "1.3.0", + "semver": "^5.0.1", "socket.io": "^1.3.6" }, "devDependencies": {