diff --git a/browser/index.js b/browser/index.js index 43469290..e49a381c 100644 --- a/browser/index.js +++ b/browser/index.js @@ -235,6 +235,8 @@ node = new bcoin.fullnode({ coinCache: 30000000, logConsole: true, workers: true, + workerURL: '/bcoin-worker.js', + masterURL: '/bcoin-master.js', logger: logger }); diff --git a/lib/node/node.js b/lib/node/node.js index 16ec7d6d..8e94c7cc 100644 --- a/lib/node/node.js +++ b/lib/node/node.js @@ -88,7 +88,10 @@ Node.prototype.initOptions = function initOptions() { this.workers = new WorkerPool({ enabled: config.bool('workers'), size: config.num('workers-size'), - timeout: config.num('workers-timeout') + timeout: config.num('workers-timeout'), + workerFile: config.str('worker-file'), + workerURL: config.str('worker-url'), + masterURL: config.str('master-url') }); }; diff --git a/lib/workers/master.js b/lib/workers/master.js index 28e35d3f..6bf3785b 100644 --- a/lib/workers/master.js +++ b/lib/workers/master.js @@ -84,7 +84,9 @@ Master.prototype._initWebWorkers = function _initWebWorkers() { global.onmessage = (event) => { let data; if (typeof event.data !== 'string') { - data = event.data.buf; + assert(event.data && typeof event.data === 'object'); + assert(event.data.data); + data = event.data.data; data.__proto__ = Buffer.prototype; } else { data = Buffer.from(event.data, 'hex'); @@ -110,7 +112,7 @@ Master.prototype._initChildProcess = function _initChildProcess() { process.on('uncaughtException', (err) => { this.send(new packets.ErrorPacket(err)); - setImmediate(() => process.exit(1)); + setTimeout(() => process.exit(1), 500); }); }; @@ -133,7 +135,7 @@ Master.prototype.write = function write(data) { if (HAS_WORKERS) { if (global.postMessage.length === 2) { data.__proto__ = Uint8Array.prototype; - global.postMessage({ buf: data }, [data]); + global.postMessage({ data }, [data]); } else { global.postMessage(data.toString('hex')); } diff --git a/lib/workers/workerpool.js b/lib/workers/workerpool.js index b732e3e8..86e5b2eb 100644 --- a/lib/workers/workerpool.js +++ b/lib/workers/workerpool.js @@ -52,6 +52,10 @@ function WorkerPool(options) { this.nonce = 0; this.enabled = true; + this.workerFile = WorkerPool.WORKER_FILE; + this.workerURL = WorkerPool.WORKER_URL; + this.masterURL = WorkerPool.MASTER_URL; + bindExit(); pools.add(this); @@ -72,21 +76,21 @@ WorkerPool.CORES = getCores(); * @const {String} */ -WorkerPool.WORKER_FILE = 'worker.js'; +WorkerPool.WORKER_FILE = process.env.BCOIN_WORKER_FILE || 'worker.js'; /** * Default worker URL. * @const {String} */ -WorkerPool.WORKER_URL = '/bcoin-worker.js'; +WorkerPool.WORKER_URL = process.env.BCOIN_WORKER_URL || '/bcoin-worker.js'; /** * Default master URL. * @const {String} */ -WorkerPool.MASTER_URL = '/bcoin-master.js'; +WorkerPool.MASTER_URL = process.env.BCOIN_MASTER_URL || '/bcoin-master.js'; /** * Set worker pool options. @@ -113,6 +117,21 @@ WorkerPool.prototype.set = function set(options) { assert(options.timeout > 0); this.timeout = options.timeout; } + + if (options.workerFile != null) { + assert(typeof options.workerFile === 'string'); + this.workerFile = options.workerFile; + } + + if (options.workerURL != null) { + assert(typeof options.workerURL === 'string'); + this.workerURL = options.workerURL; + } + + if (options.masterURL != null) { + assert(typeof options.masterURL === 'string'); + this.masterURL = options.masterURL; + } }; /** @@ -414,7 +433,7 @@ function Worker(id) { this.pending = new Map(); this.env = { - BCOIN_MASTER_URL: process.env.BCOIN_MASTER_URL || WorkerPool.MASTER_URL, + BCOIN_MASTER_URL: this.masterURL, BCOIN_WORKER_NETWORK: Network.type, BCOIN_WORKER_ISTTY: process.stdout ? (process.stdout.isTTY ? '1' : '0') @@ -463,12 +482,7 @@ Worker.prototype._init = function _init() { */ Worker.prototype._initWebWorkers = function _initWebWorkers() { - let file = WorkerPool.WORKER_URL; - - if (process.env.BCOIN_WORKER_URL) - file = process.env.BCOIN_WORKER_URL; - - this.child = new global.Worker(file); + this.child = new global.Worker(this.workerURL); this.child.onerror = (err) => { this.emit('error', err); @@ -478,7 +492,9 @@ Worker.prototype._initWebWorkers = function _initWebWorkers() { this.child.onmessage = (event) => { let data; if (typeof event.data !== 'string') { - data = event.data.buf; + assert(event.data && typeof event.data === 'object'); + assert(event.data.data); + data = event.data.data; data.__proto__ = Buffer.prototype; } else { data = Buffer.from(event.data, 'hex'); @@ -496,15 +512,10 @@ Worker.prototype._initWebWorkers = function _initWebWorkers() { Worker.prototype._initChildProcess = function _initChildProcess() { let bin = process.argv[0]; - let file = WorkerPool.WORKER_FILE; + let file = path.resolve(__dirname, this.workerFile); let env = Object.assign({}, process.env, this.env); let options = { stdio: 'pipe', env: env }; - if (process.env.BCOIN_WORKER_FILE) - file = process.env.BCOIN_WORKER_FILE; - - file = path.resolve(__dirname, file); - this.child = cp.spawn(bin, [file], options); this.child.unref(); @@ -601,7 +612,7 @@ Worker.prototype.write = function write(data) { if (HAS_WORKERS) { if (this.child.postMessage.length === 2) { data.__proto__ = Uint8Array.prototype; - this.child.postMessage({ buf: data }, [data]); + this.child.postMessage({ data }, [data]); } else { this.child.postMessage(data.toString('hex')); }