webpack: get bcoin building in webpack for node.

This commit is contained in:
Christopher Jeffrey 2017-06-28 18:00:01 -07:00
parent 275580f4ac
commit 307e7dd698
No known key found for this signature in database
GPG Key ID: 8962AB9DE6666BBD
12 changed files with 111 additions and 24 deletions

View File

@ -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

View File

@ -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) {

View File

@ -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.');

View File

@ -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);

View File

@ -6,8 +6,6 @@
'use strict';
/* jshint -W069 */
var Stream = require('stream').Stream;
var assert = require('assert');
var url, qs, http, https, StringDecoder;

View File

@ -1 +1,3 @@
'use strict';
exports.binding = null;

View File

@ -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);
};

View File

@ -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
});

View File

@ -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"
}
}

View File

@ -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

42
webpack.node.js Normal file
View File

@ -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')")
})
]
};

13
webpack/bindings.js Normal file
View File

@ -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 + '".');
};