diff --git a/lib/utils/util.js b/lib/utils/util.js index c257f5b2..2109aa7e 100644 --- a/lib/utils/util.js +++ b/lib/utils/util.js @@ -416,9 +416,8 @@ util.fmt = nodeUtil.format; */ util.format = function format(args, color) { - color = color - ? (process.stdout ? process.stdout.isTTY : false) - : false; + if (color == null) + color = process.stdout ? process.stdout.isTTY : false; return typeof args[0] === 'object' ? util.inspectify(args[0], color) @@ -446,7 +445,7 @@ util.log = function log() { return; } - msg = util.format(args, true); + msg = util.format(args); process.stdout.write(msg + '\n'); }; @@ -471,7 +470,7 @@ util.error = function error() { return; } - msg = util.format(args, true); + msg = util.format(args); process.stderr.write(msg + '\n'); }; diff --git a/lib/workers/master.js b/lib/workers/master.js index a6f7f60a..c97cc7ff 100644 --- a/lib/workers/master.js +++ b/lib/workers/master.js @@ -34,6 +34,7 @@ function Master() { this.parser = new Parser(); this.env = {}; this.listening = false; + this.color = false; this._init(); } @@ -184,12 +185,14 @@ Master.prototype.destroy = function destroy() { Master.prototype.log = function log() { var items = new Array(arguments.length); - var i; + var i, text; for (i = 0; i < items.length; i++) items[i] = arguments[i]; - this.send(new packets.LogPacket(items)); + text = util.format(items, this.color); + + this.send(new packets.LogPacket(text)); }; /** @@ -205,6 +208,7 @@ Master.prototype.listen = function listen(env) { this.env = env; this.listening = true; + this.color = +env.BCOIN_WORKER_ISTTY === 1; Network.set(env.BCOIN_WORKER_NETWORK); diff --git a/lib/workers/packets.js b/lib/workers/packets.js index b478a3a4..f2a20074 100644 --- a/lib/workers/packets.js +++ b/lib/workers/packets.js @@ -87,9 +87,9 @@ EventPacket.fromRaw = function fromRaw(data) { * @constructor */ -function LogPacket(items) { +function LogPacket(text) { Packet.call(this); - this.items = items || []; + this.text = text || ''; } util.inherits(LogPacket, Packet); @@ -97,13 +97,13 @@ util.inherits(LogPacket, Packet); LogPacket.prototype.cmd = packetTypes.LOG; LogPacket.prototype.toRaw = function toRaw(bw) { - bw.writeVarString(JSON.stringify(this.items), 'utf8'); + bw.writeVarString(this.text, 'utf8'); }; LogPacket.fromRaw = function fromRaw(data) { var br = new BufferReader(data, true); var packet = new LogPacket(); - packet.items = JSON.parse(br.readVarString('utf8')); + packet.text = br.readVarString('utf8'); return packet; }; diff --git a/lib/workers/workerpool.js b/lib/workers/workerpool.js index 00e3008c..2ccf512d 100644 --- a/lib/workers/workerpool.js +++ b/lib/workers/workerpool.js @@ -411,7 +411,10 @@ function Worker(id) { this.child = null; this.pending = {}; this.env = { - BCOIN_WORKER_NETWORK: Network.type + BCOIN_WORKER_NETWORK: Network.type, + BCOIN_WORKER_ISTTY: process.stdout + ? (process.stdout.isTTY ? '1' : '0') + : '0' }; this._init(); @@ -581,7 +584,7 @@ Worker.prototype.handlePacket = function handlePacket(packet) { break; case packets.types.LOG: util.log('Worker %d:', this.id); - util.log.apply(util, packet.items); + util.log(packet.text); break; case packets.types.ERROR: this.emit('error', packet.error); @@ -680,7 +683,7 @@ Worker.prototype.execute = function execute(packet, timeout) { Worker.prototype._execute = function _execute(packet, timeout, callback) { var job = new PendingJob(this, packet.id, callback); - assert(!this.pending[packet.id]); + assert(!this.pending[packet.id], 'ID overflow.'); this.pending[packet.id] = job; @@ -697,7 +700,10 @@ Worker.prototype._execute = function _execute(packet, timeout, callback) { Worker.prototype.resolveJob = function resolveJob(id, result) { var job = this.pending[id]; - assert(job); + + if (!job) + throw new Error('Job ' + id + ' is not in progress.'); + job.finish(null, result); }; @@ -709,7 +715,10 @@ Worker.prototype.resolveJob = function resolveJob(id, result) { Worker.prototype.rejectJob = function rejectJob(id, err) { var job = this.pending[id]; - assert(job); + + if (!job) + throw new Error('Job ' + id + ' is not in progress.'); + job.finish(err); }; @@ -751,7 +760,7 @@ function PendingJob(worker, id, callback) { PendingJob.prototype.start = function start(timeout) { var self = this; - if (timeout === -1) + if (!timeout || timeout === -1) return; this.timer = setTimeout(function() {