diff --git a/lib/commands.js b/lib/commands.js index 79f8552..572ace0 100644 --- a/lib/commands.js +++ b/lib/commands.js @@ -28,6 +28,9 @@ module.exports = { getDifficulty: 'getdifficulty', getGenerate: 'getgenerate', getInfo: 'getinfo', + getMempoolAncestors: 'getmempoolancestors', + getMempoolDescendants: 'getmempooldescendants', + getMempoolEntry: 'getmempoolentry', getMempoolInfo: 'getmempoolinfo', // bitcoind v0.10+ getMiningInfo: 'getmininginfo', getNetTotals: 'getnettotals', diff --git a/lib/index.js b/lib/index.js index 35c4002..5b6f8fb 100644 --- a/lib/index.js +++ b/lib/index.js @@ -31,7 +31,7 @@ function callRpc (cmd, args, rpc) { fn = function () {} } - rpc.call(cmd, args, function () { + return rpc.call(cmd, args, function () { var args = [].slice.call(arguments) args.unshift(null) fn.apply(this, args) @@ -48,7 +48,7 @@ function callRpc (cmd, args, rpc) { (function (protoFn) { Client.prototype[protoFn] = function () { var args = [].slice.call(arguments) - callRpc(commands[protoFn], args, this.rpc) + return callRpc(commands[protoFn], args, this.rpc) } })(protoFn) } diff --git a/lib/jsonrpc.js b/lib/jsonrpc.js index 70bca32..9c8f6d0 100644 --- a/lib/jsonrpc.js +++ b/lib/jsonrpc.js @@ -6,150 +6,150 @@ var Client = function (opts) { this.http = this.opts.ssl ? https : http } -Client.prototype.call = function (method, params, callback, errback, path) { - var time = Date.now() - var requestJSON +Client.prototype.call = function (method, params) { + return new Promise((resolve, reject) => { + var time = Date.now() + var requestJSON - if (Array.isArray(method)) { - // multiple rpc batch call - requestJSON = [] - method.forEach(function (batchCall, i) { - requestJSON.push({ - id: time + '-' + i, - method: batchCall.method, - params: batchCall.params + if (Array.isArray(method)) { + // multiple rpc batch call + requestJSON = [] + method.forEach(function (batchCall, i) { + requestJSON.push({ + id: time + '-' + i, + method: batchCall.method, + params: batchCall.params + }) }) - }) - } else { - // single rpc call - requestJSON = { - id: time, - method: method, - params: params + } else { + // single rpc call + requestJSON = { + id: time, + method: method, + params: params + } } - } - // First we encode the request into JSON - requestJSON = JSON.stringify(requestJSON) + // First we encode the request into JSON + requestJSON = JSON.stringify(requestJSON) - // prepare request options - var requestOptions = { - host: this.opts.host || 'localhost', - port: this.opts.port || 8332, - method: 'POST', - path: path || '/', - headers: { - 'Host': this.opts.host || 'localhost', - 'Content-Length': requestJSON.length - }, - agent: false, - rejectUnauthorized: this.opts.ssl && this.opts.sslStrict !== false - } + // prepare request options + var requestOptions = { + host: this.opts.host || 'localhost', + port: this.opts.port || 8332, + method: 'POST', + path: '/', + headers: { + 'Host': this.opts.host || 'localhost', + 'Content-Length': requestJSON.length + }, + agent: false, + rejectUnauthorized: this.opts.ssl && this.opts.sslStrict !== false + } - if (this.opts.ssl && this.opts.sslCa) { - requestOptions.ca = this.opts.sslCa - } + if (this.opts.ssl && this.opts.sslCa) { + requestOptions.ca = this.opts.sslCa + } - // use HTTP auth if user and password set - if (this.opts.user && this.opts.pass) { - requestOptions.auth = this.opts.user + ':' + this.opts.pass - } + // use HTTP auth if user and password set + if (this.opts.user && this.opts.pass) { + requestOptions.auth = this.opts.user + ':' + this.opts.pass + } - // Now we'll make a request to the server - var cbCalled = false - var request = this.http.request(requestOptions) - - // start request timeout timer - var reqTimeout = setTimeout(function () { - if (cbCalled) return - cbCalled = true - request.abort() - var err = new Error('ETIMEDOUT') - err.code = 'ETIMEDOUT' - errback(err) - }, this.opts.timeout || 30000) - - // set additional timeout on socket in case of remote freeze after sending headers - request.setTimeout(this.opts.timeout || 30000, function () { - if (cbCalled) return - cbCalled = true - request.abort() - var err = new Error('ESOCKETTIMEDOUT') - err.code = 'ESOCKETTIMEDOUT' - errback(err) - }) - - request.on('error', function (err) { - if (cbCalled) return - cbCalled = true - clearTimeout(reqTimeout) - errback(err) - }) - - request.on('response', function (response) { - clearTimeout(reqTimeout) - - // We need to buffer the response chunks in a nonblocking way. - var buffer = '' - response.on('data', function (chunk) { - buffer = buffer + chunk - }) - // When all the responses are finished, we decode the JSON and - // 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 + // Now we'll make a request to the server + var cbCalled = false + var request = this.http.request(requestOptions) + // start request timeout timer + var reqTimeout = setTimeout(function () { if (cbCalled) return cbCalled = true + request.abort() + var err = new Error('ETIMEDOUT') + err.code = 'ETIMEDOUT' + reject(err) + }, this.opts.timeout || 30000) - try { - var decoded = JSON.parse(buffer) - } catch (e) { - if (response.statusCode !== 200) { - err = new Error('Invalid params, response status code: ' + response.statusCode) - err.code = -32602 - errback(err) - } else { - err = new Error('Problem parsing JSON response from server') - err.code = -32603 - errback(err) + // set additional timeout on socket in case of remote freeze after sending headers + request.setTimeout(this.opts.timeout || 30000, function () { + if (cbCalled) return + cbCalled = true + request.abort() + var err = new Error('ESOCKETTIMEDOUT') + err.code = 'ESOCKETTIMEDOUT' + reject(err) + }) + + request.on('error', function (err) { + if (cbCalled) return + cbCalled = true + clearTimeout(reqTimeout) + reject(err) + }) + + request.on('response', function (response) { + clearTimeout(reqTimeout) + + // We need to buffer the response chunks in a nonblocking way. + var buffer = '' + response.on('data', function (chunk) { + buffer = buffer + chunk + }) + // When all the responses are finished, we decode the JSON and + // 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 + + if (cbCalled) return + cbCalled = true + + try { + var decoded = JSON.parse(buffer) + } catch (e) { + if (response.statusCode !== 200) { + err = new Error('Invalid params, response status code: ' + response.statusCode) + err.code = -32602 + reject(err) + } else { + err = new Error('Problem parsing JSON response from server') + err.code = -32603 + reject(err) + } + return } - return - } - if (!Array.isArray(decoded)) { - decoded = [decoded] - } - - // iterate over each response, normally there will be just one - // unless a batch rpc call response is being processed - decoded.forEach(function (decodedResponse, i) { - if (decodedResponse.hasOwnProperty('error') && decodedResponse.error != null) { - if (errback) { - err = new Error(decodedResponse.error.message || '') - if (decodedResponse.error.code) { - err.code = decodedResponse.error.code - } - errback(err) - } - } else if (decodedResponse.hasOwnProperty('result')) { - if (callback) { - callback(decodedResponse.result, response.headers) - } - } else { - if (errback) { - err = new Error(decodedResponse.error.message || '') - if (decodedResponse.error.code) { - err.code = decodedResponse.error.code - } - errback(err) - } + if (!Array.isArray(decoded)) { + decoded = [decoded] } + + // iterate over each response, normally there will be just one + // unless a batch rpc call response is being processed + decoded.forEach(function (decodedResponse, i) { + if (decodedResponse.hasOwnProperty('error') && decodedResponse.error != null) { + if (reject) { + err = new Error(decodedResponse.error.message || '') + if (decodedResponse.error.code) { + err.code = decodedResponse.error.code + } + reject(err) + } + } else if (decodedResponse.hasOwnProperty('result')) { + resolve(decodedResponse.result, response.headers) + } else { + if (reject) { + err = new Error(decodedResponse.error.message || '') + if (decodedResponse.error.code) { + err.code = decodedResponse.error.code + } + reject(err) + } + } + }) }) }) - }) - request.end(requestJSON) + request.end(requestJSON); + }); } module.exports.Client = Client diff --git a/package.json b/package.json index 8d79517..46f6933 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { - "name": "bitcoin", + "name": "@mempool/bitcoin", "description": "Communicate with bitcoind via JSON-RPC", - "version": "3.0.1", + "version": "3.0.2", "main": "lib/index.js", "keywords": [ "bitcoin", @@ -20,7 +20,7 @@ "optionalDependencies": {}, "repository": { "type": "git", - "url": "git://github.com/freewil/node-bitcoin.git" + "url": "git://github.com/mempool/node-bitcoin.git" }, "engines": { "node": ">= 0.10.0" @@ -30,9 +30,9 @@ "test": "make test" }, "bugs": { - "url": "https://github.com/freewil/node-bitcoin/issues" + "url": "https://github.com/mempool/node-bitcoin/issues" }, - "homepage": "https://github.com/freewil/node-bitcoin#readme", + "homepage": "https://github.com/mempool/node-bitcoin#readme", "directories": { "test": "test" },