From 6faf577332f75225ab0e543a495ae64e669b6ce8 Mon Sep 17 00:00:00 2001 From: freewil Date: Wed, 25 Apr 2012 21:03:12 -0400 Subject: [PATCH] use Error object for errors Fixes GH-11 --- lib/jsonrpc.js | 46 +++++++++++++++++++++++++++++----------------- test/api.js | 14 +++++++------- 2 files changed, 36 insertions(+), 24 deletions(-) diff --git a/lib/jsonrpc.js b/lib/jsonrpc.js index 4ecc627..9b7eeb3 100644 --- a/lib/jsonrpc.js +++ b/lib/jsonrpc.js @@ -59,33 +59,45 @@ var Client = function(port, host, user, password) { // depending on whether it's got a result or an error, we call // emitSuccess or emitError on the promise. response.on('end', function() { + var err; + try { var decoded = JSON.parse(buffer); } catch (e) { if (response.statusCode !== 200) { - errback({ - code: -32602, - message: 'Invalid params, response status code: ' + response.statusCode - }); + err = new Error('Invalid params, response status code: ' + response.statusCode); + err.code = -32602; + errback(err); } else { - errback({ - code: -32603, - message: 'Problem parsing JSON response from server' - }); + err = new Error('Problem parsing JSON response from server'); + err.code = -32603; + errback(err); } return; } - if(decoded.hasOwnProperty('error') && decoded.error != null) { - if (errback) - errback(decoded.error); - } else if(decoded.hasOwnProperty('result')) { - if (callback) + + if (decoded.hasOwnProperty('error') && decoded.error != null) { + if (errback) { + err = new Error(decoded.error.message || ''); + if (decoded.error.code) { + err.code = decoded.error.code; + } + errback(err); + } + } else if (decoded.hasOwnProperty('result')) { + if (callback) { callback(decoded.result); + } + } else { + if (errback) { + err = new Error(decoded.error.message || ''); + if (decoded.error.code) { + err.code = decoded.error.code; + } + errback(err); + } } - else { - if (errback) - errback(decoded.error); - } + }); }); }; diff --git a/test/api.js b/test/api.js index 3051120..5cf6520 100644 --- a/test/api.js +++ b/test/api.js @@ -143,11 +143,10 @@ vows.describe('api').addBatch({ topic: function(client) { client.cmd('nomethod', this.callback); }, - 'should create non-null err in callback': function(err, expectedValue) { - assert.deepEqual(err, { - code: -32601, - message: 'Method not found' - }); + 'should pass Error object in callback': function(err, expectedValue) { + assert.instanceOf(err, Error); + assert.equal(err.message, 'Method not found'); + assert.equal(err.code, -32601); assert.equal(expectedValue, undefined); }, }, @@ -168,8 +167,9 @@ vows.describe('api').addBatch({ client.getDifficulty(this.callback); }, 'and should be able to handle it': function(err, difficulty) { - assert.isNotNull(err); - assert.isObject(err); + assert.instanceOf(err, Error); + assert.equal(err.message, 'Invalid params, response status code: 401'); + assert.equal(err.code, -32602); assert.equal(difficulty, undefined); }, },