diff --git a/API.md b/API.md index 2e50b10..4d204ef 100644 --- a/API.md +++ b/API.md @@ -148,80 +148,73 @@ Returns **cc.Condition** Ed25519 Condition (that will need to wrapped in an Outp Returns **[object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** Ed25519 Condition (that will need to wrapped in an Output) -## getBlock +## Connection + +### getBlock **Parameters** - `blockId` -- `API_PATH` -## getTransaction +### getTransaction **Parameters** - `txId` -- `API_PATH` -## getStatus +### getStatus **Parameters** - `tx_id` -- `API_PATH` -## listBlocks +### listBlocks **Parameters** - `$0` **[Object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** - `$0.tx_id` - `$0.status` -- `API_PATH` - `tx_id` - `status` -## listOutputs +### listOutputs **Parameters** - `$0` **[Object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** - `$0.public_key` - `$0.unspent` -- `API_PATH` - `onlyJsonResponse` - `public_key` - `unspent` -## listTransactions +### listTransactions **Parameters** - `$0` **[Object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** - `$0.asset_id` - `$0.operation` -- `API_PATH` - `asset_id` - `operation` -## listVotes +### listVotes **Parameters** - `block_id` -- `API_PATH` -## pollStatusAndFetchTransaction +### pollStatusAndFetchTransaction **Parameters** - `tx_id` -- `API_PATH` Returns **[Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise)** -## postTransaction +### postTransaction **Parameters** - `transaction` -- `API_PATH` diff --git a/src/connection/index.js b/src/connection/index.js index 7ad5b8e..a93aa0f 100644 --- a/src/connection/index.js +++ b/src/connection/index.js @@ -1,154 +1,158 @@ import request from '../request'; -export default function getApiUrls(API_PATH) { - return { - 'blocks': API_PATH + 'blocks', - 'blocks_detail': API_PATH + 'blocks/%(blockId)s', - 'outputs': API_PATH + 'outputs', - 'statuses': API_PATH + 'statuses', - 'transactions': API_PATH + 'transactions', - 'transactions_detail': API_PATH + 'transactions/%(txId)s', - 'votes': API_PATH + 'votes' - }; -} +class Connection { + constructor(path, headers) { + this.path = path; + this.headers = headers; + } -/** - * @public - * @param blockId - * @param API_PATH - */ -export default function getBlock(blockId, API_PATH) { - return request(getApiUrls(API_PATH)['blocks_detail'], { - urlTemplateSpec: { - blockId - } - }); -} + getApiUrls(endpoints) { + return { + 'blocks': this.path + 'blocks', + 'blocks_detail': this.path + 'blocks/%(blockId)s', + 'outputs': this.path + 'outputs', + 'statuses': this.path + 'statuses', + 'transactions': this.path + 'transactions', + 'transactions_detail': this.path + 'transactions/%(txId)s', + 'votes': this.path + 'votes' + }[endpoints]; + } -/** - * @public - * @param tx_id - * @param API_PATH - */ -export default function getStatus(tx_id, API_PATH) { - return request(getApiUrls(API_PATH)['statuses'], { + req(path, options={}) { + // NOTE: `options.headers` could be undefined, but that's OK. + options.headers = Object.assign({}, options.headers, this.headers) + return request(path, options) + } + + /** + * @public + * @param blockId + */ + getBlock(blockId) { + return this.req(this.getApiUrls('blocks_detail'), { + urlTemplateSpec: { + blockId + } + }); + } + + /** + * @public + * @param tx_id + */ + getStatus(tx_id) { + return this.req(this.getApiUrls('statuses'), { + query: { + tx_id + } + }); + } + + /** + * @public + * @param txId + */ + getTransaction(txId) { + return this.req(this.getApiUrls('transactions_detail'), { + urlTemplateSpec: { + txId + } + }); + } + + /** + * @public + * @param tx_id + * @param status + */ + listBlocks({ tx_id, status }) { + return this.req(this.getApiUrls('blocks'), { + query: { + tx_id, + status + } + }); + } + + /** + * @public + * @param public_key + * @param unspent + * @param onlyJsonResponse + */ + listOutputs({ public_key, unspent }, onlyJsonResponse=true) { + return this.req(this.getApiUrls('outputs'), { query: { - tx_id + public_key, + unspent } - }); -} + }, onlyJsonResponse) + } -/** - * @public - * @param txId - * @param API_PATH - */ -export default function getTransaction(txId, API_PATH) { - return request(getApiUrls(API_PATH)['transactions_detail'], { - urlTemplateSpec: { - txId - } - }); -} - -/** - * @public - * @param tx_id - * @param status - * @param API_PATH - */ -export default function listBlocks({tx_id, status}, API_PATH) { - return request(getApiUrls(API_PATH)['blocks'], { + /** + * @public + * @param asset_id + * @param operation + */ + listTransactions({ asset_id, operation }) { + return this.req(this.getApiUrls('transactions'), { query: { - tx_id, - status + asset_id, + operation } - }); -} + }) + } -/** - * @public - * @param public_key - * @param unspent - * @param API_PATH - * @param onlyJsonResponse - */ -export default function listOutputs({ public_key, unspent }, API_PATH, onlyJsonResponse=true) { - return request(getApiUrls(API_PATH)['outputs'], { - query: { - public_key, - unspent - } - }, onlyJsonResponse) -} + /** + * @public + * @param block_id + */ + listVotes(block_id) { + return this.req(this.getApiUrls('votes'), { + query: { + block_id + } + }); + } -/** - * @public - * @param asset_id - * @param operation - * @param API_PATH - */ -export default function listTransactions({ asset_id, operation }, API_PATH) { - return request(getApiUrls(API_PATH)['transactions'], { - query: { - asset_id, - operation - } - }) -} - -/** - * @public - * @param block_id - * @param API_PATH - */ -export default function listVotes(block_id, API_PATH) { - return request(getApiUrls(API_PATH)['votes'], { - query: { - block_id - } - }); -} - -/** - * @public - * @param tx_id - * @param API_PATH - * @return {Promise} - */ -export default function (tx_id, API_PATH) { - return new Promise((resolve, reject) => { - const timer = setInterval(() => { - getStatus(tx_id, API_PATH) - .then((res) => { - console.log('Fetched transaction status:', res); - if (res.status === 'valid') { + /** + * @public + * @param tx_id + * @return {Promise} + */ + pollStatusAndFetchTransaction(tx_id) { + return new Promise((resolve, reject) => { + const timer = setInterval(() => { + this.getStatus(tx_id) + .then((res) => { + console.log('Fetched transaction status:', res); + if (res.status === 'valid') { + clearInterval(timer); + this.getTransaction(tx_id) + .then((res) => { + console.log('Fetched transaction:', res); + resolve(res); + }); + } + }) + .catch((err) => { clearInterval(timer); - getTransaction(tx_id, API_PATH) - .then((res) => { - console.log('Fetched transaction:', res); - resolve(res); - }); - } - }) - .catch((err) => { - clearInterval(timer); - reject(err); - }); - }, 500) - }) -} + reject(err); + }); + }, 500) + }) + } -/** - * @public - * - * @param transaction - * @param API_PATH - */ -export default function postTransaction(transaction, API_PATH) { - return request(getApiUrls(API_PATH)['transactions'], { - method: 'POST', - jsonBody: transaction - }) + /** + * @public + * + * @param transaction + */ + postTransaction(transaction) { + return this.req(this.getApiUrls('transactions'), { + method: 'POST', + jsonBody: transaction + }) + } } diff --git a/src/request.js b/src/request.js index 13630bc..5360bbf 100644 --- a/src/request.js +++ b/src/request.js @@ -10,8 +10,8 @@ const DEFAULT_REQUEST_CONFIG = { }; /** - * Small wrapper around js-utility-belt's request that provides url resolving, default settings, and - * response handling. + * Small wrapper around js-utility-belt's request that provides url resolving, + * default settings, and response handling. */ export default function request(url, config = {}, onlyJsonResponse=true) { // Load default fetch configuration and remove any falsy query parameters @@ -42,4 +42,3 @@ export default function request(url, config = {}, onlyJsonResponse=true) { throw err; }); } -