diff --git a/lib/crypto/secp256k1-native.js b/lib/crypto/secp256k1-native.js index a7a0b0a1..256a43f3 100644 --- a/lib/crypto/secp256k1-native.js +++ b/lib/crypto/secp256k1-native.js @@ -8,8 +8,8 @@ 'use strict'; var assert = require('assert'); -var random = require('./random'); var secp256k1 = require('secp256k1'); +var random = require('./random'); /** * @exports crypto/secp256k1 diff --git a/lib/crypto/secp256k1.js b/lib/crypto/secp256k1.js index 4f14413b..d00b58ae 100644 --- a/lib/crypto/secp256k1.js +++ b/lib/crypto/secp256k1.js @@ -8,7 +8,7 @@ var native; -if (+process.env.BCOIN_USE_ELLIPTIC !== 1) { +if (+process.env.BCOIN_NO_SECP256K1 !== 1) { try { native = require('secp256k1/bindings'); } catch (e) { diff --git a/lib/db/backends.js b/lib/db/backends.js index 073a4cb1..fc7bee74 100644 --- a/lib/db/backends.js +++ b/lib/db/backends.js @@ -7,11 +7,19 @@ 'use strict'; exports.get = function get(name) { - if (name === 'memory') - return require('./memdb'); - try { - return require(name); + switch (name) { + case 'leveldown': + return require('leveldown'); + case 'rocksdown': + return require('rocksdown'); + case 'lmdb': + return require('lmdb'); + case 'memory': + return require('./memdb'); + default: + throw new Error('Database backend "' + name + '" not found.'); + } } catch (e) { if (e.code === 'MODULE_NOT_FOUND') throw new Error('Database backend "' + name + '" not found.'); diff --git a/lib/http/base.js b/lib/http/base.js index 5ceb050e..9d394e50 100644 --- a/lib/http/base.js +++ b/lib/http/base.js @@ -7,8 +7,6 @@ 'use strict'; -/* jshint -W069 */ - var assert = require('assert'); var EventEmitter = require('events').EventEmitter; var URL = require('url'); @@ -535,7 +533,8 @@ HTTPBase.prototype._initSockets = function _initSockets() { return; this.io = new IOServer({ - transports: ['websocket'] + transports: ['websocket'], + serveClient: false }); this.io.attach(this.server); diff --git a/lib/http/request.js b/lib/http/request.js index 1a5f67d4..0d661272 100644 --- a/lib/http/request.js +++ b/lib/http/request.js @@ -6,8 +6,6 @@ 'use strict'; -/* jshint -W069 */ - var Stream = require('stream').Stream; var assert = require('assert'); var url, qs, http, https, StringDecoder; diff --git a/lib/native-browser.js b/lib/native-browser.js index 7b814419..8f8d0686 100644 --- a/lib/native-browser.js +++ b/lib/native-browser.js @@ -1 +1,3 @@ +'use strict'; + exports.binding = null; diff --git a/lib/workers/worker-browser.js b/lib/workers/worker-browser.js index a1fa25d9..a72642ae 100644 --- a/lib/workers/worker-browser.js +++ b/lib/workers/worker-browser.js @@ -7,16 +7,17 @@ 'use strict'; -/* jshint worker: true */ - -self.importScripts('/bcoin-master.js'); - self.onmessage = function onmessage(event) { + var file = '/bcoin-master.js'; var env; self.onmessage = function() {}; env = JSON.parse(event.data); + if (env.BCOIN_MASTER_URL) + file = env.BCOIN_MASTER_URL; + + self.importScripts(file); self.master.listen(env); }; diff --git a/lib/workers/workerpool.js b/lib/workers/workerpool.js index 4d1949c8..d9a4de79 100644 --- a/lib/workers/workerpool.js +++ b/lib/workers/workerpool.js @@ -10,6 +10,7 @@ var assert = require('assert'); var EventEmitter = require('events').EventEmitter; var os = require('os'); +var path = require('path'); var cp = require('./cp'); var util = require('../utils/util'); var co = require('../utils/co'); @@ -18,6 +19,7 @@ var jobs = require('./jobs'); var Parser = require('./parser'); var Framer = require('./framer'); var packets = require('./packets'); + var HAS_WORKERS = typeof global.Worker === 'function'; var HAS_CP = typeof cp.spawn === 'function'; @@ -464,6 +466,7 @@ function Worker(id) { this.pending = {}; this.env = { + BCOIN_MASTER_URL: process.env.BCOIN_MASTER_URL, BCOIN_WORKER_NETWORK: Network.type, BCOIN_WORKER_ISTTY: process.stdout ? (process.stdout.isTTY ? '1' : '0') @@ -516,8 +519,12 @@ Worker.prototype._init = function _init() { Worker.prototype._initWebWorkers = function _initWebWorkers() { var self = this; + var file = '/bcoin-worker.js'; - this.child = new global.Worker('/bcoin-worker.js'); + if (process.env.BCOIN_WORKER_URL) + file = process.env.BCOIN_WORKER_URL; + + this.child = new global.Worker(file); this.child.onerror = function onerror(err) { self.emit('error', err); @@ -545,12 +552,15 @@ Worker.prototype._initWebWorkers = function _initWebWorkers() { Worker.prototype._initChildProcess = function _initChildProcess() { var self = this; - var file = process.argv[0]; - var argv = [__dirname + '/worker.js']; + var bin = process.argv[0]; + var file = path.join(__dirname, 'worker.js'); var env = Object.assign({}, process.env, this.env); var options = { stdio: 'pipe', env: env }; - this.child = cp.spawn(file, argv, options); + if (process.env.BCOIN_WORKER_FILE) + file = process.env.BCOIN_WORKER_FILE; + + this.child = cp.spawn(bin, [file], options); this.child.unref(); this.child.stdin.unref(); @@ -911,7 +921,7 @@ exports.disable = function disable() { }; exports.set({ - enabled: HAS_CP && +process.env.BCOIN_WORKERS_ENABLED !== 0, + enabled: +process.env.BCOIN_WORKERS_ENABLED !== 0, size: +process.env.BCOIN_WORKERS_SIZE || null, timeout: +process.env.BCOIN_WORKERS_TIMEOUT || null }); diff --git a/package.json b/package.json index 9d7ab6f2..e76f9705 100644 --- a/package.json +++ b/package.json @@ -47,6 +47,7 @@ "jsdoc": "^3.4.3", "level-js": "^2.2.4", "mocha": "^3.4.1", + "node-loader": "^0.6.0", "webpack": "^3.0.0" }, "main": "./lib/bcoin.js", @@ -62,8 +63,9 @@ "lint": "eslint lib/ test/ migrate/ examples/ bench/ bin/cli bin/node bin/spvnode || exit 0", "lint-file": "eslint", "test": "mocha --reporter spec test/*-test.js", - "test-browser": "BCOIN_NO_NATIVE=1 BCOIN_USE_ELLIPTIC=1 mocha --reporter spec test/*-test.js", + "test-browser": "BCOIN_NO_NATIVE=1 BCOIN_NO_SECP256K1=1 mocha --reporter spec test/*-test.js", "test-file": "mocha --reporter spec", - "webpack": "webpack" + "webpack": "webpack --config webpack.browser.js", + "webpack-node": "webpack --config webpack.node.js" } } diff --git a/webpack.config.js b/webpack.browser.js similarity index 50% rename from webpack.config.js rename to webpack.browser.js index cc7c56cb..c8571011 100644 --- a/webpack.config.js +++ b/webpack.browser.js @@ -2,6 +2,8 @@ var webpack = require('webpack') var path = require('path'); +var str = JSON.stringify; +var env = process.env; module.exports = { target: 'web', @@ -10,7 +12,7 @@ module.exports = { 'bcoin-master': './lib/workers/master' }, output: { - path: path.resolve(__dirname, 'browser'), + path: path.join(__dirname, 'browser'), filename: '[name].js' }, resolve: { @@ -20,11 +22,21 @@ module.exports = { module: { rules: [{ test: /\.js$/, - exclude: path.resolve(__dirname, 'node_modules'), + exclude: path.join(__dirname, 'node_modules'), loader: 'babel-loader' }] }, plugins: [ + new webpack.DefinePlugin({ + 'process.env.BCOIN_NETWORK': + str(env.BCOIN_NETWORK || 'main'), + 'process.env.BCOIN_WORKERS_ENABLED': + str(env.BCOIN_WORKERS_ENABLED || '0'), + 'process.env.BCOIN_WORKER_URL': + str(env.BCOIN_WORKER_URL || '/bcoin-worker.js'), + 'process.env.BCOIN_MASTER_URL': + str(env.BCOIN_MASTER_URL || '/bcoin-master.js') + }), new webpack.optimize.UglifyJsPlugin({ compress: { warnings: false diff --git a/webpack.node.js b/webpack.node.js new file mode 100644 index 00000000..3f71ae87 --- /dev/null +++ b/webpack.node.js @@ -0,0 +1,42 @@ +'use strict'; + +var webpack = require('webpack') +var path = require('path'); +var str = JSON.stringify; +var env = process.env; + +module.exports = { + target: 'node', + entry: { + 'bcoin': './lib/bcoin-browser', + 'bcoin-worker': './lib/workers/worker' + }, + output: { + path: __dirname, + filename: '[name].js', + libraryTarget: 'commonjs2' + }, + resolve: { + modules: ['node_modules'], + extensions: ['.node', '.js', '.json'], + alias: { + 'bindings': __dirname + '/webpack/bindings.js' + } + }, + node: { + __dirname: false, + __filename: false + }, + module: { + rules: [{ + test: /\.node$/, + loader: 'node-loader' + }] + }, + plugins: [ + new webpack.DefinePlugin({ + 'process.env.BCOIN_WORKER_FILE': + str(env.BCOIN_WORKER_FILE || "path.join(__dirname, 'bcoin-worker.js')") + }) + ] +}; diff --git a/webpack/bindings.js b/webpack/bindings.js new file mode 100644 index 00000000..919b3d23 --- /dev/null +++ b/webpack/bindings.js @@ -0,0 +1,13 @@ +'use strict'; + +module.exports = function bindings(name) { + switch (name) { + case 'leveldown': + return require('leveldown/build/Release/leveldown.node'); + case 'bcoin-native': + return require('bcoin-native/build/Release/bcoin-native.node'); + case 'secp256k1': + return require('secp256k1/build/Release/secp256k1.node'); + } + throw new Error('Cannot find module "' + name + '".'); +};