diff --git a/examples/rest2/claim_positions.js b/examples/rest2/claim_positions.js index 60ee989f..e499ce46 100644 --- a/examples/rest2/claim_positions.js +++ b/examples/rest2/claim_positions.js @@ -1,18 +1,17 @@ 'use strict' const Promise = require('bluebird') +const { RESTv2 } = require('../../index') const _isEmpty = require('lodash/isEmpty') -const runExample = require('../util/run_example') - -module.exports = runExample({ - name: 'rest-claim-positions', - rest: { env: true, transform: true }, - readline: true, - params: { - filterByMarket: false - } -}, async ({ debug, debugTable, rest, readline, params }) => { - const { filterByMarket } = params +const { args: { apiKey, apiSecret }, debug, debugTable, readline } = require('../util/setup') + +async function execute () { + const rest = new RESTv2({ + apiKey, + apiSecret, + transform: true + }) + const filterByMarket = false const allPositions = await rest.positions() const positions = _isEmpty(filterByMarket) ? allPositions @@ -49,4 +48,7 @@ module.exports = runExample({ await Promise.all(positions.map(p => p.claim(rest))) debug('done!') -}) + readline.close() +} + +execute() diff --git a/examples/rest2/close_positions.js b/examples/rest2/close_positions.js index f5580386..1ee47e3b 100644 --- a/examples/rest2/close_positions.js +++ b/examples/rest2/close_positions.js @@ -2,24 +2,30 @@ const PI = require('p-iteration') const _isEmpty = require('lodash/isEmpty') -const runExample = require('../util/run_example') - -module.exports = runExample({ - name: 'rest-close-positions', - rest: { env: true, transform: true }, - ws: { env: true, transform: true, connect: true, auth: true }, - readline: true, - params: { - filterByMarket: null - } -}, async ({ - debug, debugTable, rest, ws, params, readline -}) => { - const { filterByMarket } = params +const WSv2 = require('../../lib/transports/ws2') +const { RESTv2 } = require('../../index') +const { args: { apiKey, apiSecret }, debug, debugTable, readline } = require('../util/setup') + +async function execute () { + const ws = new WSv2({ + apiKey, + apiSecret, + transform: true + }) + const rest = new RESTv2({ + apiKey, + apiSecret, + transform: true + }) + const filterByMarket = null const allPositions = await rest.positions() + await ws.open() + await ws.auth() if (allPositions.length === 0) { debug('no open positions') + await ws.close() + readline.close() return } @@ -34,6 +40,8 @@ module.exports = runExample({ if (positions.length === 0) { debug('no positions match filter') + await ws.close() + readline.close() return } @@ -57,6 +65,8 @@ module.exports = runExample({ ) if (confirm.toLowerCase()[0] !== 'y') { + await ws.close() + readline.close() return } @@ -70,4 +80,9 @@ module.exports = runExample({ debug('') debug('closed %d positions', positions.length) -}) + + await ws.close() + readline.close() +} + +execute() diff --git a/examples/rest2/currencies.js b/examples/rest2/currencies.js index 6fca2d0f..bac9db81 100644 --- a/examples/rest2/currencies.js +++ b/examples/rest2/currencies.js @@ -1,12 +1,11 @@ 'use strict' const _chunk = require('lodash/chunk') -const runExample = require('../util/run_example') +const { RESTv2 } = require('../../index') +const { debug } = require('../util/setup') -module.exports = runExample({ - name: 'rest-get-currencies', - rest: true -}, async ({ debug, rest }) => { +async function execute () { + const rest = new RESTv2() debug('fetching currency list...') const currencies = await rest.currencies() @@ -18,4 +17,6 @@ module.exports = runExample({ debug('%s', currencyChunk.join(', ')) }) debug('') -}) +} + +execute() diff --git a/examples/rest2/funding_credits.js b/examples/rest2/funding_credits.js index 27494481..589d4d59 100644 --- a/examples/rest2/funding_credits.js +++ b/examples/rest2/funding_credits.js @@ -2,16 +2,16 @@ const { prepareAmount } = require('bfx-api-node-util') const argFromCLI = require('../util/arg_from_cli') -const runExample = require('../util/run_example') +const { RESTv2 } = require('../../index') +const { args: { apiKey, apiSecret }, debug, debugTable } = require('../util/setup') -module.exports = runExample({ - name: 'rest-get-funding-credits', - rest: { env: true }, - params: { - symbol: argFromCLI(0, 'fUSD') - } -}, async ({ rest, debug, debugTable, params }) => { - const { symbol } = params +async function execute () { + const rest = new RESTv2({ + apiKey, + apiSecret, + transform: true + }) + const symbol = argFromCLI(0, 'fUSD') debug('fetching funding credits for %s', symbol) @@ -28,4 +28,6 @@ module.exports = runExample({ ]) }) } -}) +} + +execute() diff --git a/examples/rest2/funding_info.js b/examples/rest2/funding_info.js index 42ca7284..d2e9ceb0 100644 --- a/examples/rest2/funding_info.js +++ b/examples/rest2/funding_info.js @@ -2,16 +2,16 @@ const { prepareAmount } = require('bfx-api-node-util') const argFromCLI = require('../util/arg_from_cli') -const runExample = require('../util/run_example') +const { RESTv2 } = require('../../index') +const { args: { apiKey, apiSecret }, debug, debugTable } = require('../util/setup') -module.exports = runExample({ - name: 'rest-get-funding-info', - rest: { env: true }, - params: { - symbol: argFromCLI(0, 'fUSD') - } -}, async ({ rest, debug, debugTable, params }) => { - const { symbol } = params +async function execute () { + const rest = new RESTv2({ + apiKey, + apiSecret, + transform: true + }) + const symbol = argFromCLI(0, 'fUSD') debug('fetching funding info for %s', symbol) @@ -27,4 +27,6 @@ module.exports = runExample({ durationLend ]] }) -}) +} + +execute() diff --git a/examples/rest2/funding_loans.js b/examples/rest2/funding_loans.js index 25682844..17df637a 100644 --- a/examples/rest2/funding_loans.js +++ b/examples/rest2/funding_loans.js @@ -2,16 +2,16 @@ const { prepareAmount } = require('bfx-api-node-util') const argFromCLI = require('../util/arg_from_cli') -const runExample = require('../util/run_example') +const { RESTv2 } = require('../../index') +const { args: { apiKey, apiSecret }, debug, debugTable } = require('../util/setup') -module.exports = runExample({ - name: 'rest-get-funding-loans', - rest: { env: true }, - params: { - symbol: argFromCLI(0, 'fUSD') - } -}, async ({ rest, debug, debugTable, params }) => { - const { symbol } = params +async function execute () { + const rest = new RESTv2({ + apiKey, + apiSecret, + transform: true + }) + const symbol = argFromCLI(0, 'fUSD') debug('fetching funding loans for %s', symbol) @@ -28,4 +28,6 @@ module.exports = runExample({ ]) }) } -}) +} + +execute() diff --git a/examples/rest2/funding_offers.js b/examples/rest2/funding_offers.js index 191bef4c..ae40e5ab 100644 --- a/examples/rest2/funding_offers.js +++ b/examples/rest2/funding_offers.js @@ -2,16 +2,16 @@ const { prepareAmount } = require('bfx-api-node-util') const argFromCLI = require('../util/arg_from_cli') -const runExample = require('../util/run_example') +const { RESTv2 } = require('../../index') +const { args: { apiKey, apiSecret }, debug, debugTable } = require('../util/setup') -module.exports = runExample({ - name: 'rest-get-funding-offers', - rest: { env: true }, - params: { - symbol: argFromCLI(0, 'fUSD') - } -}, async ({ rest, debug, debugTable, params }) => { - const { symbol } = params +async function execute () { + const rest = new RESTv2({ + apiKey, + apiSecret, + transform: true + }) + const symbol = argFromCLI(0, 'fUSD') debug('fetching funding offers for %s', symbol) @@ -28,4 +28,6 @@ module.exports = runExample({ ]) }) } -}) +} + +execute() diff --git a/examples/rest2/key_permissions.js b/examples/rest2/key_permissions.js index 55227c2a..7fca64d6 100644 --- a/examples/rest2/key_permissions.js +++ b/examples/rest2/key_permissions.js @@ -1,14 +1,14 @@ 'use strict' -const runExample = require('../util/run_example') +const { RESTv2 } = require('../../index') +const { args: { apiKey, apiSecret }, debug, debugTable } = require('../util/setup') -module.exports = runExample({ - name: 'rest-key-permissions', - rest: { - env: true, +async function execute () { + const rest = new RESTv2({ + apiKey, + apiSecret, transform: true - } -}, async ({ debug, debugTable, rest }) => { + }) debug('fetching permissions') const perms = await rest.keyPermissions() @@ -21,4 +21,6 @@ module.exports = runExample({ rows, headers: ['Scope', 'Read', 'Write'] }) -}) +} + +execute() diff --git a/examples/rest2/ledgers.js b/examples/rest2/ledgers.js index 4d1ab00c..7d11ad9f 100644 --- a/examples/rest2/ledgers.js +++ b/examples/rest2/ledgers.js @@ -1,16 +1,19 @@ 'use strict' const { prepareAmount } = require('bfx-api-node-util') -const runExample = require('../util/run_example') +const { RESTv2 } = require('../../index') +const { args: { apiKey, apiSecret }, debug, debugTable } = require('../util/setup') const argFromCLI = require('../util/arg_from_cli') -module.exports = runExample({ - name: 'rest-get-ledgers', - rest: { env: true, transform: true }, - params: { +async function execute () { + const rest = new RESTv2({ + apiKey, + apiSecret, + transform: true + }) + const params = { ccy: argFromCLI(0, 'all') } -}, async ({ debug, debugTable, rest, params }) => { const ccy = params.ccy === 'all' ? null : params.ccy debug('fetching ledger entries for %s...', ccy || 'all currencies') @@ -27,4 +30,6 @@ module.exports = runExample({ 'Entry ID', 'Currency', 'Timestamp', 'Amount', 'Balance', 'Description' ] }) -}) +} + +execute() diff --git a/examples/rest2/list_open_orders.js b/examples/rest2/list_open_orders.js index 490cbe3f..ae068765 100644 --- a/examples/rest2/list_open_orders.js +++ b/examples/rest2/list_open_orders.js @@ -3,16 +3,16 @@ const _capitalize = require('lodash/capitalize') const _isEmpty = require('lodash/isEmpty') const { prepareAmount, preparePrice } = require('bfx-api-node-util') -const runExample = require('../util/run_example') - -module.exports = runExample({ - name: 'rest-list-open-orders', - rest: { env: true, transform: true }, - params: { - filterByMarket: null - } -}, async ({ rest, debug, debugTable, params }) => { - const { filterByMarket } = params +const { RESTv2 } = require('../../index') +const { args: { apiKey, apiSecret }, debug, debugTable } = require('../util/setup') + +async function execute () { + const rest = new RESTv2({ + apiKey, + apiSecret, + transform: true + }) + const filterByMarket = null debug('fetching open orders...') const allOrders = await rest.activeOrders() @@ -40,4 +40,6 @@ module.exports = runExample({ new Date(o.mtsUpdate).toLocaleString() ]) }) -}) +} + +execute() diff --git a/examples/rest2/margin_info.js b/examples/rest2/margin_info.js index c0b5bcb4..0363e833 100644 --- a/examples/rest2/margin_info.js +++ b/examples/rest2/margin_info.js @@ -1,12 +1,15 @@ 'use strict' const { prepareAmount } = require('bfx-api-node-util') -const runExample = require('../util/run_example') +const { RESTv2 } = require('../../index') +const { args: { apiKey, apiSecret }, debug } = require('../util/setup') -module.exports = runExample({ - name: 'rest-get-margin-info', - rest: { env: true, transform: true } -}, async ({ debug, rest }) => { +async function execute () { + const rest = new RESTv2({ + apiKey, + apiSecret, + transform: true + }) debug('fetching margin info...') const info = await rest.marginInfo() @@ -18,4 +21,6 @@ module.exports = runExample({ debug('Balance: %s', prepareAmount(marginBalance)) debug('Net Balance: %s', prepareAmount(marginNet)) debug('') -}) +} + +execute() diff --git a/examples/rest2/movements.js b/examples/rest2/movements.js index fb01c22c..5b7ea82e 100644 --- a/examples/rest2/movements.js +++ b/examples/rest2/movements.js @@ -1,16 +1,20 @@ 'use strict' const { prepareAmount, preparePrice } = require('bfx-api-node-util') -const runExample = require('../util/run_example') +const { RESTv2 } = require('../../index') +const { args: { apiKey, apiSecret }, debug, debugTable } = require('../util/setup') + const argFromCLI = require('../util/arg_from_cli') -module.exports = runExample({ - name: 'rest-get-movements', - rest: { env: true, transform: true }, - params: { +async function execute () { + const rest = new RESTv2({ + apiKey, + apiSecret, + transform: true + }) + const params = { ccy: argFromCLI(0, 'all') } -}, async ({ debug, debugTable, rest, params }) => { const ccy = params.ccy === 'all' ? null : params.ccy debug('fetching movements for %s...', ccy || 'all currencies') @@ -37,4 +41,6 @@ module.exports = runExample({ ] }) }) -}) +} + +execute() diff --git a/examples/rest2/order-history.js b/examples/rest2/order-history.js index 43fcdfe4..817e4f52 100644 --- a/examples/rest2/order-history.js +++ b/examples/rest2/order-history.js @@ -2,20 +2,20 @@ const { prepareAmount, preparePrice } = require('bfx-api-node-util') const _isEmpty = require('lodash/isEmpty') -const runExample = require('../util/run_example') +const { RESTv2 } = require('../../index') +const { args: { apiKey, apiSecret }, debug, debugTable } = require('../util/setup') const START = Date.now() - (30 * 24 * 60 * 60 * 1000 * 1000) const END = Date.now() const LIMIT = 25 -module.exports = runExample({ - name: 'rest-get-order-history', - rest: { env: true, transform: true }, - params: { - market: 'tBTCUSD' - } -}, async ({ debug, debugTable, rest, params }) => { - const { market } = params +async function execute () { + const rest = new RESTv2({ + apiKey, + apiSecret, + transform: true + }) + const market = 'tBTCUSD' if (_isEmpty(market)) { return debug('market required') @@ -46,4 +46,6 @@ module.exports = runExample({ ] }) }) -}) +} + +execute() diff --git a/examples/rest2/positions.js b/examples/rest2/positions.js index d1ca6e3a..060f6503 100644 --- a/examples/rest2/positions.js +++ b/examples/rest2/positions.js @@ -3,12 +3,15 @@ const _capitalize = require('lodash/capitalize') const _map = require('lodash/map') const { prepareAmount, preparePrice } = require('bfx-api-node-util') -const runExample = require('../util/run_example') - -module.exports = runExample({ - name: 'positions', - rest: { env: true, transform: true } -}, async ({ debug, debugTable, rest }) => { +const { RESTv2 } = require('../../index') +const { args: { apiKey, apiSecret }, debug, debugTable } = require('../util/setup') + +async function execute () { + const rest = new RESTv2({ + apiKey, + apiSecret, + transform: true + }) debug('fetching positions...') const positions = await rest.positions() @@ -45,4 +48,6 @@ module.exports = runExample({ ] }) }) -}) +} + +execute() diff --git a/examples/rest2/pulse.js b/examples/rest2/pulse.js index 6cc9dfe9..86ae8d4f 100644 --- a/examples/rest2/pulse.js +++ b/examples/rest2/pulse.js @@ -1,12 +1,15 @@ 'use strict' const { PulseMessage } = require('bfx-api-node-models') -const runExample = require('../util/run_example') +const { RESTv2 } = require('../../index') +const { args: { apiKey, apiSecret }, debug, debugTable } = require('../util/setup') -module.exports = runExample({ - name: 'rest-pulse', - rest: { env: true, transform: true } -}, async ({ debug, debugTable, rest }) => { +async function execute () { + const rest = new RESTv2({ + apiKey, + apiSecret, + transform: true + }) debug('gettting pulse history..') const pulseHistRes = await rest.pulseHistory() @@ -103,4 +106,6 @@ module.exports = runExample({ content.substring(0, 15) ]) }) -}) +} + +execute() diff --git a/examples/rest2/status.js b/examples/rest2/status.js index fd201f9d..2b4260c4 100644 --- a/examples/rest2/status.js +++ b/examples/rest2/status.js @@ -1,11 +1,10 @@ 'use strict' -const runExample = require('../util/run_example') +const { RESTv2 } = require('../../index') +const { debug } = require('../util/setup') -module.exports = runExample({ - name: 'rest-get-platform-status', - rest: true -}, async ({ debug, rest }) => { +async function execute () { + const rest = new RESTv2() debug('fetching platform status...') const status = await rest.status() @@ -14,4 +13,6 @@ module.exports = runExample({ ? 'Platform currently under maintenance' : 'Platform operating normally' ) -}) +} + +execute() diff --git a/examples/rest2/submit_funding_offer.js b/examples/rest2/submit_funding_offer.js index 324a6a52..4806b3bd 100644 --- a/examples/rest2/submit_funding_offer.js +++ b/examples/rest2/submit_funding_offer.js @@ -2,14 +2,17 @@ const Promise = require('bluebird') const { FundingOffer } = require('bfx-api-node-models') -const runExample = require('../util/run_example') +const { RESTv2 } = require('../../index') +const { args: { apiKey, apiSecret }, debug } = require('../util/setup') const CLOSE_DELAY_MS = 5 * 1000 -module.exports = runExample({ - name: 'rest-submit-funding-offer', - rest: { env: true, transform: true } -}, async ({ debug, rest, params }) => { +async function execute () { + const rest = new RESTv2({ + apiKey, + apiSecret, + transform: true + }) const fo = new FundingOffer({ type: 'LIMIT', symbol: 'fUSD', @@ -32,4 +35,6 @@ module.exports = runExample({ await fo.close() debug('offer closed') -}) +} + +execute() diff --git a/examples/rest2/submit_order.js b/examples/rest2/submit_order.js index 53a60432..842ad086 100644 --- a/examples/rest2/submit_order.js +++ b/examples/rest2/submit_order.js @@ -2,16 +2,21 @@ const Promise = require('bluebird') const { Order } = require('bfx-api-node-models') -const runExample = require('../util/run_example') +const { RESTv2 } = require('../../index') +const { args: { apiKey, apiSecret }, debug, readline } = require('../util/setup') const UPDATE_DELAY_MS = 5 * 1000 const CANCEL_DELAY_MS = 10 * 1000 -module.exports = runExample({ - name: 'rest-submit-order', - rest: { env: true }, - readline: true, - params: { +async function execute () { + const rest = new RESTv2({ + apiKey, + apiSecret + }) + const { + symbol, price, amount, type, affiliateCode, onlySubmitOrder, skipConfirm, + priceStop, distance + } = { // needed in order to pipe data to the process, until we can figure out a // workaround skipConfirm: false, @@ -22,11 +27,6 @@ module.exports = runExample({ type: Order.type.LIMIT, affiliateCode: 'xZvWHMNR' } -}, async ({ rest, debug, params, readline }) => { - const { - symbol, price, amount, type, affiliateCode, onlySubmitOrder, skipConfirm, - priceStop, distance - } = params const o = new Order({ cid: Date.now(), @@ -47,6 +47,7 @@ module.exports = runExample({ ].join('\n')) if (confirm.toLowerCase()[0] !== 'y') { + readline.close() return } } @@ -58,6 +59,7 @@ module.exports = runExample({ debug('order successfully submitted! (id %j, cid %j, gid %j)', o.id, o.cid, o.gid) if (onlySubmitOrder) { + readline.close() return // for bfx-cli } @@ -81,4 +83,7 @@ module.exports = runExample({ const cancelNotification = await o.cancel() debug('successfully canceled! (%s: %s)', cancelNotification.status, cancelNotification.text) -}) + readline.close() +} + +execute() diff --git a/examples/rest2/symbol-details.js b/examples/rest2/symbol-details.js index 8e2d4c1f..db98cc90 100644 --- a/examples/rest2/symbol-details.js +++ b/examples/rest2/symbol-details.js @@ -1,11 +1,12 @@ 'use strict' -const runExample = require('../util/run_example') +const { RESTv2 } = require('../../index') +const { debug, debugTable } = require('../util/setup') -module.exports = runExample({ - name: 'rest-get-symbol-details', - rest: { transform: true } -}, async ({ rest, debug, debugTable }) => { +async function execute () { + const rest = new RESTv2({ + transform: true + }) debug('fetching symbol details...') const details = await rest.symbolDetails() @@ -24,4 +25,6 @@ module.exports = runExample({ maximumOrderSize, minimumOrderSize, margin ? 'Y' : 'N' // eslint-disable-line ]) }) -}) +} + +execute() diff --git a/examples/rest2/symbols.js b/examples/rest2/symbols.js index 4f161497..2ad8d909 100644 --- a/examples/rest2/symbols.js +++ b/examples/rest2/symbols.js @@ -1,15 +1,18 @@ 'use strict' -const runExample = require('../util/run_example') +const { RESTv2 } = require('../../index') +const { debug } = require('../util/setup') -module.exports = runExample({ - name: 'rest-get-symbols', - rest: { transform: true } -}, async ({ rest, debug }) => { +async function execute () { + const rest = new RESTv2({ + transform: true + }) debug('fetching symbol list...') const symbols = await rest.symbols() debug('read %d symbols', symbols.length) debug('%s', symbols.map(s => `t${s.toUpperCase()}`).join(', ')) -}) +} + +execute() diff --git a/examples/rest2/tickers.js b/examples/rest2/tickers.js index 54d2ae2e..a033ff8d 100644 --- a/examples/rest2/tickers.js +++ b/examples/rest2/tickers.js @@ -1,16 +1,14 @@ 'use strict' const { preparePrice, prepareAmount } = require('bfx-api-node-util') -const runExample = require('../util/run_example') +const { RESTv2 } = require('../../index') +const { debug, debugTable } = require('../util/setup') -module.exports = runExample({ - name: 'rest-get-tickers', - rest: { transform: true }, - params: { - filterByMarket: null - } -}, async ({ rest, debug, debugTable, params }) => { - const { filterByMarket } = params +async function execute () { + const rest = new RESTv2({ + transform: true + }) + const filterByMarket = null debug('fetching symbol list...') @@ -45,4 +43,6 @@ module.exports = runExample({ preparePrice(t.ask), prepareAmount(t.bidSize), prepareAmount(t.askSize) ])) }) -}) +} + +execute() diff --git a/examples/rest2/trade-history.js b/examples/rest2/trade-history.js index 695043ee..04659571 100644 --- a/examples/rest2/trade-history.js +++ b/examples/rest2/trade-history.js @@ -2,20 +2,20 @@ const { prepareAmount, preparePrice } = require('bfx-api-node-util') const _isEmpty = require('lodash/isEmpty') -const runExample = require('../util/run_example') +const { RESTv2 } = require('../../index') +const { args: { apiKey, apiSecret }, debug, debugTable } = require('../util/setup') const START = Date.now() - (30 * 24 * 60 * 60 * 1000 * 1000) const END = Date.now() const LIMIT = 25 -module.exports = runExample({ - name: 'rest-get-trade-history', - rest: { env: true, transform: true }, - params: { - symbol: 'tBTCUSD' - } -}, async ({ debug, debugTable, rest, params }) => { - const { symbol } = params +async function execute () { + const rest = new RESTv2({ + apiKey, + apiSecret, + transform: true + }) + const symbol = 'tBTCUSD' if (_isEmpty(symbol)) { return debug('symbol required') @@ -40,4 +40,6 @@ module.exports = runExample({ `${t.fee} ${t.feeCurrency}` ]) }) -}) +} + +execute() diff --git a/examples/rest2/transfer.js b/examples/rest2/transfer.js index 69973d08..a151b21d 100644 --- a/examples/rest2/transfer.js +++ b/examples/rest2/transfer.js @@ -1,19 +1,21 @@ 'use strict' -const runExample = require('../util/run_example') +const { RESTv2 } = require('../../index') +const { args: { apiKey, apiSecret }, debug } = require('../util/setup') -module.exports = runExample({ - name: 'rest-transfer', - rest: { env: true, transform: true }, - params: { +async function execute () { + const rest = new RESTv2({ + apiKey, + apiSecret, + transform: true + }) + const { fromType, fromCCY, toType, toCCY, amount } = { fromType: 'deposit', fromCCY: 'USD', toType: 'trading', toCCY: 'USD', amount: 1 } -}, async ({ debug, rest, params }) => { - const { fromType, fromCCY, toType, toCCY, amount } = params debug( 'transferring %f from %s %s to %s %s', @@ -29,4 +31,6 @@ module.exports = runExample({ }) debug('done!') -}) +} + +execute() diff --git a/examples/rest2/wallet.js b/examples/rest2/wallet.js index 73d028fb..f3c2a089 100644 --- a/examples/rest2/wallet.js +++ b/examples/rest2/wallet.js @@ -1,11 +1,14 @@ 'use strict' -const runExample = require('../util/run_example') - -module.exports = runExample({ - name: 'rest-wallet', - rest: { env: true, transform: true } -}, async ({ rest, debug }) => { +const { RESTv2 } = require('../../index') +const { args: { apiKey, apiSecret }, debug } = require('../util/setup') + +async function execute () { + const rest = new RESTv2({ + apiKey, + apiSecret, + transform: true + }) debug('Submitting new order...') // get new deposit address @@ -37,4 +40,6 @@ module.exports = runExample({ }) debug('withdraw confirmed: %j', withdrawalConfirmation) -}) +} + +execute() diff --git a/examples/rest2/wallets.js b/examples/rest2/wallets.js index d9d01765..446dfee7 100644 --- a/examples/rest2/wallets.js +++ b/examples/rest2/wallets.js @@ -5,25 +5,23 @@ const _capitalize = require('lodash/capitalize') const _isFinite = require('lodash/isFinite') const _isEmpty = require('lodash/isEmpty') const { prepareAmount } = require('bfx-api-node-util') -const runExample = require('../util/run_example') +const { RESTv2 } = require('../../index') +const { args: { apiKey, apiSecret }, debug, debugTable } = require('../util/setup') -module.exports = runExample({ - name: 'rest-wallets', - rest: { - env: true, +async function execute () { + const rest = new RESTv2({ + apiKey, + apiSecret, transform: true - }, - - params: { + }) + const { + valueCCY, hideZeroBalances, filterByType, filterByCurrency + } = { hideZeroBalances: true, filterByType: false, filterByCurrency: false, valueCCY: 'USD' } -}, async ({ debug, debugTable, rest, params }) => { - const { - valueCCY, hideZeroBalances, filterByType, filterByCurrency - } = params const symbolForWallet = w => `t${w.currency}${valueCCY}` @@ -74,15 +72,15 @@ module.exports = runExample({ ...(_isFinite(value) ? [ - prepareAmount(value), - currency !== valueCCY - ? prepareAmount(lastPrices[symbolForWallet({ currency })]) - : 1 - ] + prepareAmount(value), + currency !== valueCCY + ? prepareAmount(lastPrices[symbolForWallet({ currency })]) + : 1 + ] : [ - '-', - '-' - ]) + '-', + '-' + ]) ] }) @@ -95,4 +93,6 @@ module.exports = runExample({ }) debug('total value: %d %s', prepareAmount(totalValue), valueCCY) -}) +} + +execute() diff --git a/examples/util/run_example.js b/examples/util/run_example.js deleted file mode 100644 index 7326de58..00000000 --- a/examples/util/run_example.js +++ /dev/null @@ -1,200 +0,0 @@ -const dotenv = require('dotenv') -const Promise = require('bluebird') -const _isEmpty = require('lodash/isEmpty') -const _isobject = require('lodash/isObject') -const { RESTv2 } = require('bfx-api-node-rest') -const Readline = require('readline-promise').default - -const WSv2 = require('../../lib/transports/ws2') -const argsFromEnv = require('./args_from_env') -const debugTableUtil = require('./debug_table') -const D = require('./debug').get() - -/** - * Helper to execute an async example with a debugger pre-initialized and - * WSv2/RESTv2 instances if requested. Captures errors and logs helpful - * information in case of config load failure. - * - * @param {object} args - arguments - * @param {string} args.name - example name, used in debug string - * @param {boolean|object} [args.ws] - if passed, a WSv2 connection is provided - * @param {boolean} [args.ws.connect] - if true, the connection is opened - * @param {boolean} [args.ws.env] - if true, the instance receives credentials/connection info from .env - * @param {boolean} [args.ws.args] - further args, passed to WSv2 constructor - * @param {boolean|object} [args.rest] - if passed, a RESTv2 instance is provided - * @param {boolean} [args.rest.env] - if true, the instance receives credentials/connection info from .env - * @param {boolean} [args.rest.args] - further args, passed to RESTv2 constructor - * @param {object} [args.params] - optional parameters to pass to the example - * @param {Function} example - must return a promise - * @returns {Function} paramOverride - func that can be used to override params - */ -module.exports = (args = {}, example = () => { }) => { - const { - testing, name, ws, rest, readline, params = {} - } = args - - if (_isEmpty(name)) { - throw new Error('no example name provided') - } - - let timeout = null // saved so it can be cleared/exec prevented by the caller - let noCatch = false - - /** - * TODO: extract timeout body - * we return an override method for params below the timeout block - * - * @param {object} paramOverrides - merged with default script parameters - * @returns {Promise} p - resolves on script completion - */ - const exec = (paramOverrides = {}) => { - Object.assign(params, paramOverrides) - - return new Promise((resolve, reject) => { - timeout = setTimeout(async () => { - const debug = D('>') - debug.enabled = true - - /** - * Log a table to the console - * - * @param {object} args - arguments - * @param {object[]} args.rows - data, can be specified as 2nd param - * @param {string[]} args.headers - column labels - * @param {number[]} args.widths - column widths - * @param {object[]} extraRows - optional row spec as 2nd param - */ - const debugTable = ({ rows = [], headers, widths }, extraRows = []) => { - debug('') - debugTableUtil({ - rows: [...rows, ...extraRows], - headers, - widths, - debug - }) - debug('') - } - - const { env: restEnv, ...restArgs } = _isobject(rest) ? rest : {} - const { - env: wsEnv, - connect: wsAutoConnect, - keepOpen: wsKeepOpen, - auth: wsAutoAuth, - ...wsArgs - } = _isobject(ws) ? ws : {} - - // load .env if needed for either API transport - if (restEnv || wsEnv) { - dotenv.config() - } - - // Build up example toolset, including API transports - let toolset - - try { - toolset = { - env: argsFromEnv(), - params, - debug, - debugTable, - - ...(!readline - ? {} - : { - readline: Readline.createInterface({ - input: process.stdin, - output: process.stdout, - terminal: false - }) - }), - - ...(!rest - ? {} - : { - rest: new RESTv2({ - ...(restEnv ? argsFromEnv('REST_URL') : {}), - ...restArgs - }) - }), - - ...(!ws - ? {} - : { - ws: new WSv2({ - ...(wsEnv ? argsFromEnv('WS_URL') : {}), - ...wsArgs - }) - }) - } - } catch (e) { - debug('error loading config: %s', e.message) - debug('did you create a .env file in the current directory?') - debug('') - debug('supported values in .env are:') - debug('') - debug('API_KEY=...') - debug('API_SECRET=...') - debug('WS_URL=...') - debug('REST_URL=...') - debug('SOCKS_PROXY_URL=...') - debug('VERBOSE_ERRORS=...') - return resolve() - } - - if (toolset.ws) { - toolset.ws.on('error', e => debug('WSv2 error: %s', e.message | e)) - } - - if (wsAutoConnect) { - if (!testing) debug('connecting with WSv2...') - await toolset.ws.open() - } - - if (wsAutoAuth) { - if (!testing) debug('authenticating with WSv2...') - await toolset.ws.auth() - } - - const startMTS = Date.now() - - try { - await example(toolset) - } catch (e) { - if (testing || noCatch) { - reject(e) // propagate, needed for tests - } else { - debug('error: %s', (process.env.VERBOSE_ERRORS ? e.stack : e.message) || e) - } - } finally { - if (toolset.ws && toolset.ws.isOpen() && !wsKeepOpen) { - await toolset.ws.close() - } - - if (toolset.readline) { - toolset.readline.close() - } - } - - if (!testing) { - debug('finished in %fs', (Date.now() - startMTS) / 1000) - } - - resolve() - }, 0) - }) - } - - // auto exec by default, can be stopped via skipAutoExec below due to timeout - exec().catch((e) => { - D('>')('error: %s', (process.env.VERBOSE_ERRORS ? e.stack : e.message) || e) - }) - - return { - skipAutoExec: () => clearTimeout(timeout), - exec: async (params) => { - noCatch = true // called externally, don't auto-catch errors - return exec(params) - } - } -} diff --git a/examples/util/setup.js b/examples/util/setup.js new file mode 100644 index 00000000..1c5c9dbc --- /dev/null +++ b/examples/util/setup.js @@ -0,0 +1,45 @@ +'use strict' + +const dotenv = require('dotenv') +const Readline = require('readline-promise').default +const argsFromEnv = require('./args_from_env') +const debugTableUtil = require('./debug_table') +const D = require('./debug').get() +const debug = D('>') +debug.enabled = true + +dotenv.config() + +/** + * Log a table to the console + * + * @param {object} args - arguments + * @param {object[]} args.rows - data, can be specified as 2nd param + * @param {string[]} args.headers - column labels + * @param {number[]} args.widths - column widths + * @param {object[]} extraRows - optional row spec as 2nd param + */ +const debugTable = ({ rows = [], headers, widths }, extraRows = []) => { + debug('') + debugTableUtil({ + rows: [...rows, ...extraRows], + headers, + widths, + debug + }) + debug('') +} +module.exports = { + get args () { + return argsFromEnv() + }, + debug, + debugTable, + get readline () { + return Readline.createInterface({ + input: process.stdin, + output: process.stdout, + terminal: false + }) + } +} diff --git a/examples/ws2/atomic_order_update.js b/examples/ws2/atomic_order_update.js index bf447229..08d55973 100644 --- a/examples/ws2/atomic_order_update.js +++ b/examples/ws2/atomic_order_update.js @@ -1,25 +1,26 @@ 'use strict' const { Order } = require('bfx-api-node-models') -const runExample = require('../util/run_example') +const { args: { apiKey, apiSecret }, debug } = require('../util/setup') +const WSv2 = require('../../lib/transports/ws2') const SYMBOL = 'tBTCUSD' -module.exports = runExample({ - name: 'ws2-atomic-order-update', - ws: { - env: true, +async function execute () { + const ws = new WSv2({ + apiKey, + apiSecret, transform: true, manageOrderBooks: true, packetWDDelay: 10 * 1000, autoReconnect: true, - seqAudit: true, + seqAudit: true + }) + ws.on('error', e => debug('WSv2 error: %s', e.message | e)) + await ws.open() + await ws.auth() - connect: true, - auth: true - } -}, async ({ ws, debug }) => { const orderSent = false await ws.subscribeOrderBook(SYMBOL, 'P0', '25') @@ -66,4 +67,7 @@ module.exports = runExample({ debug('order updated, new price %f', o.price) }) }) -}) + await ws.close() +} + +execute() diff --git a/examples/ws2/auth.js b/examples/ws2/auth.js index 9d99554d..6bf3901d 100644 --- a/examples/ws2/auth.js +++ b/examples/ws2/auth.js @@ -1,11 +1,15 @@ 'use strict' -const runExample = require('../util/run_example') +const { args: { apiKey, apiSecret }, debug } = require('../util/setup') +const WSv2 = require('../../lib/transports/ws2') + +async function execute () { + const ws = new WSv2({ + apiKey, + apiSecret + }) + ws.on('error', e => debug('WSv2 error: %s', e.message | e)) -module.exports = runExample({ - name: 'ws2-auth', - ws: { env: true } // manually open/auth to show usage -}, async ({ ws, debug }) => { // register a callback for any order snapshot that comes in (account orders) ws.onOrderSnapshot({}, (orders) => { debug(`order snapshot: ${JSON.stringify(orders, null, 2)}`) @@ -18,4 +22,7 @@ module.exports = runExample({ debug('authenticated') // do something with authenticated ws stream -}) + await ws.close() +} + +execute() diff --git a/examples/ws2/calc.js b/examples/ws2/calc.js index 1ed85ab4..026df75d 100644 --- a/examples/ws2/calc.js +++ b/examples/ws2/calc.js @@ -1,12 +1,18 @@ 'use strict' const Promise = require('bluebird') -const runExample = require('../util/run_example') +const { args: { apiKey, apiSecret }, debug } = require('../util/setup') +const WSv2 = require('../../lib/transports/ws2') + +async function execute () { + const ws = new WSv2({ + apiKey, + apiSecret + }) + ws.on('error', e => debug('WSv2 error: %s', e.message | e)) + await ws.open() + await ws.auth() -module.exports = runExample({ - name: 'ws2-calc', - ws: { env: true, connect: true, auth: true } -}, async ({ ws, debug }) => { await Promise.delay(5 * 1000) ws.requestCalc([ @@ -17,7 +23,10 @@ module.exports = runExample({ ]) // Watch log output for balance update packets (wu, miu, etc) - debug('sent calc, closing in 30s...') + debug('sent calc, closing in 3s...') + + await Promise.delay(3 * 1000) + await ws.close() +} - await Promise.delay(30 * 1000) -}) +execute() diff --git a/examples/ws2/cancel_all.js b/examples/ws2/cancel_all.js index 92ad86c4..d6acfe27 100644 --- a/examples/ws2/cancel_all.js +++ b/examples/ws2/cancel_all.js @@ -2,19 +2,19 @@ const Promise = require('bluebird') const _isEmpty = require('lodash/isEmpty') -const runExample = require('../util/run_example') - -module.exports = runExample({ - name: 'cancel-all-orders', - ws: { env: true, transform: true }, // no auto-auth so we can grab snapshot - readline: true, - params: { - filterByMarket: null - } -}, async ({ ws, debug, readline, params }) => { +const { args: { apiKey, apiSecret }, debug, readline } = require('../util/setup') +const WSv2 = require('../../lib/transports/ws2') + +async function execute () { + const ws = new WSv2({ + apiKey, + apiSecret, + transform: true + }) + ws.on('error', e => debug('WSv2 error: %s', e.message | e)) await ws.open() - const { filterByMarket } = params + const filterByMarket = null debug('awaiting order snapshot...') @@ -24,7 +24,10 @@ module.exports = runExample({ }) if (allOrders.length === 0) { - return debug('no orders to cancel') + debug('no orders to cancel') + await ws.close() + readline.close() + return } const orders = _isEmpty(filterByMarket) @@ -53,4 +56,8 @@ module.exports = runExample({ 'done! cancelled the following order IDs: %s', confirmations.map(o => o[0]).join(', ') ) -}) + await ws.close() + readline.close() +} + +execute() diff --git a/examples/ws2/cancel_all_buf.js b/examples/ws2/cancel_all_buf.js index 0aa41a2b..cee7b7be 100644 --- a/examples/ws2/cancel_all_buf.js +++ b/examples/ws2/cancel_all_buf.js @@ -1,26 +1,30 @@ 'use strict' -const runExample = require('../util/run_example') +const { args: { apiKey, apiSecret }, debug } = require('../util/setup') +const WSv2 = require('../../lib/transports/ws2') -module.exports = runExample({ - name: 'ws2-cancel-all-buffered', - ws: { - env: true, - connect: true, - auth: true, +async function execute () { + const ws = new WSv2({ + apiKey, + apiSecret, transform: true, orderOpBufferDelay: 250 - } -}, async ({ ws, debug }) => { + }) + ws.on('error', e => debug('WSv2 error: %s', e.message | e)) + await ws.open() + await ws.auth() + ws.onOrderSnapshot({}, async (snapshot) => { if (snapshot.length === 0) { debug('no orders to cancel') - return - } + } else { + debug('canceling %d orders', snapshot.length) - debug('canceling %d orders', snapshot.length) - - await ws.cancelOrders(snapshot) - debug('cancelled all orders') + await ws.cancelOrders(snapshot) + debug('cancelled all orders') + } + await ws.close() }) -}) +} + +execute() diff --git a/examples/ws2/candles.js b/examples/ws2/candles.js index 93c1f65f..3f291c3d 100644 --- a/examples/ws2/candles.js +++ b/examples/ws2/candles.js @@ -1,27 +1,20 @@ 'use strict' -const _isEmpty = require('lodash/isEmpty') -const runExample = require('../util/run_example') - -module.exports = runExample({ - name: 'ws2-candles', - ws: { - env: true, - connect: true, +const { args: { apiKey, apiSecret }, debug } = require('../util/setup') +const WSv2 = require('../../lib/transports/ws2') + +async function execute () { + const ws = new WSv2({ + apiKey, + apiSecret, manageCandles: true, // enable candle dataset persistence/management - transform: true, // converts ws data arrays to Candle models (and others) - keepOpen: true - }, - params: { - market: 'tBTCUSD', - tf: '5m' - } -}, async ({ ws, debug, params }) => { - const { market, tf } = params - - if (_isEmpty(market)) throw new Error('market required') - if (_isEmpty(tf)) throw new Error('time frame required') + transform: true // converts ws data arrays to Candle models (and others) + }) + ws.on('error', e => debug('WSv2 error: %s', e.message | e)) + await ws.open() + const market = 'tBTCUSD' + const tf = '5m' const candleKey = `trade:${tf}:${market}` let prevTS = null @@ -41,4 +34,6 @@ module.exports = runExample({ }) await ws.subscribeCandles(candleKey) -}) +} + +execute() diff --git a/examples/ws2/funding_info.js b/examples/ws2/funding_info.js index 80430352..74e76c9a 100644 --- a/examples/ws2/funding_info.js +++ b/examples/ws2/funding_info.js @@ -1,15 +1,25 @@ 'use strict' -const runExample = require('../util/run_example') +const { args: { apiKey, apiSecret }, debug } = require('../util/setup') +const WSv2 = require('../../lib/transports/ws2') const symbol = 'fUSD' -module.exports = runExample({ - name: 'ws2-funding-info', - ws: { env: true, connect: true, auth: true, transform: true } -}, async ({ ws, debug }) => { - ws.onFundingInfoUpdate({}, fiu => { - fiu.forEach(fl => debug('fl: %j', fl.toJS())) +async function execute () { + const ws = new WSv2({ + apiKey, + apiSecret, + transform: true + }) + ws.on('error', e => debug('WSv2 error: %s', e.message | e)) + await ws.open() + await ws.auth() + + ws.onFundingInfoUpdate({}, fi => { + debug('fl: %j', fi.toJS()) + ws.close() }) ws.requestCalc([`funding_sym_${symbol}`]) -}) +} + +execute() diff --git a/examples/ws2/info_events.js b/examples/ws2/info_events.js index 46faa14e..e2872e9d 100644 --- a/examples/ws2/info_events.js +++ b/examples/ws2/info_events.js @@ -1,13 +1,18 @@ 'use strict' -const runExample = require('../util/run_example') +const { args: { apiKey, apiSecret }, debug } = require('../util/setup') +const WSv2 = require('../../lib/transports/ws2') + +async function execute () { + const ws = new WSv2({ + apiKey, + apiSecret, + autoReconnect: true + }) + ws.on('error', e => debug('WSv2 error: %s', e.message | e)) + await ws.open() + await ws.auth() -module.exports = runExample({ - name: 'ws2-info-events', - ws: { - env: true, connect: true, auth: true, autoReconnect: true - } -}, async ({ ws, debug }) => { ws.onMaintenanceStart(() => { debug('info: maintenance period started') // pause activity untill further notice @@ -22,4 +27,7 @@ module.exports = runExample({ debug('info: bitfinex ws server restarted') // await ws.reconnect() // if not using autoReconnect }) -}) + await ws.close() +} + +execute() diff --git a/examples/ws2/liquidations.js b/examples/ws2/liquidations.js index 9b664d8d..29944c1f 100644 --- a/examples/ws2/liquidations.js +++ b/examples/ws2/liquidations.js @@ -1,12 +1,17 @@ 'use strict' const { Liquidations } = require('bfx-api-node-models') -const runExample = require('../util/run_example') +const { args: { apiKey, apiSecret }, debug } = require('../util/setup') +const WSv2 = require('../../lib/transports/ws2') + +async function execute () { + const ws = new WSv2({ + apiKey, + apiSecret + }) + ws.on('error', e => debug('WSv2 error: %s', e.message | e)) + await ws.open() -module.exports = runExample({ - name: 'ws2-liquidations', - ws: { env: true, connect: true, keepOpen: true } -}, async ({ ws, debug }) => { ws.onStatus({ key: 'liq:global' }, (data) => { data.forEach(liq => ( debug('liquidation: %s', new Liquidations(liq).toString()) @@ -14,4 +19,6 @@ module.exports = runExample({ }) await ws.subscribeStatus('liq:global') -}) +} + +execute() diff --git a/examples/ws2/notifications.js b/examples/ws2/notifications.js index 7a183f9d..1ff4ffc7 100644 --- a/examples/ws2/notifications.js +++ b/examples/ws2/notifications.js @@ -1,12 +1,21 @@ 'use strict' -const runExample = require('../util/run_example') +const { args: { apiKey, apiSecret }, debug } = require('../util/setup') +const WSv2 = require('../../lib/transports/ws2') + +async function execute () { + const ws = new WSv2({ + apiKey, + apiSecret, + transform: true + }) + ws.on('error', e => debug('WSv2 error: %s', e.message | e)) + await ws.open() + await ws.auth() -module.exports = runExample({ - name: 'ws2-notifications', - ws: { env: true, connect: true, auth: true, transform: true } -}, async ({ ws, debug }) => { ws.onNotification({ type: '*' }, (n) => { debug('recv notification: %j', n.toJS()) }) -}) +} + +execute() diff --git a/examples/ws2/notify_ui.js b/examples/ws2/notify_ui.js index 96315412..04dccf96 100644 --- a/examples/ws2/notify_ui.js +++ b/examples/ws2/notify_ui.js @@ -1,15 +1,25 @@ 'use strict' -const runExample = require('../util/run_example') +const { args: { apiKey, apiSecret }, debug } = require('../util/setup') +const WSv2 = require('../../lib/transports/ws2') + +async function execute () { + const ws = new WSv2({ + apiKey, + apiSecret, + transform: true + }) + ws.on('error', e => debug('WSv2 error: %s', e.message | e)) + await ws.open() + await ws.auth() -module.exports = runExample({ - name: 'ws2-notify-ui', - ws: { env: true, connect: true, auth: true, transform: true } -}, async ({ ws, debug }) => { ws.notifyUI({ type: 'success', message: 'This is a test notification sent via the WSv2 API' }) debug('notification sent') -}) + await ws.close() +} + +execute() diff --git a/examples/ws2/ob_checksum.js b/examples/ws2/ob_checksum.js index a0ac5311..2dd1a0a9 100644 --- a/examples/ws2/ob_checksum.js +++ b/examples/ws2/ob_checksum.js @@ -1,21 +1,20 @@ 'use strict' +const { debug } = require('../util/setup') const WSv2 = require('../../lib/transports/ws2') -const runExample = require('../util/run_example') const SYMBOL = 'tXRPBTC' const PRECISION = 'P0' const LENGTH = '25' -module.exports = runExample({ - name: 'ws2-ob-checksum', - ws: { - env: true, - connect: true, +async function execute () { + const ws = new WSv2({ transform: true, manageOrderbooks: true // managed OBs are verified against incoming checksums - } -}, async ({ ws, debug }) => { + }) + ws.on('error', e => debug('WSv2 error: %s', e.message | e)) + await ws.open() + ws.onOrderBookChecksum({ symbol: SYMBOL, prec: PRECISION, @@ -26,4 +25,6 @@ module.exports = runExample({ await ws.enableFlag(WSv2.flags.CHECKSUM) await ws.subscribeOrderBook(SYMBOL, PRECISION, LENGTH) -}) +} + +execute() diff --git a/examples/ws2/oc_multi.js b/examples/ws2/oc_multi.js index 0af31413..3ec22c6f 100644 --- a/examples/ws2/oc_multi.js +++ b/examples/ws2/oc_multi.js @@ -1,7 +1,8 @@ 'use strict' const { Order } = require('bfx-api-node-models') -const runExample = require('../util/run_example') +const { args: { apiKey, apiSecret }, debug } = require('../util/setup') +const WSv2 = require('../../lib/transports/ws2') const oA = new Order({ symbol: 'tBTCUSD', @@ -17,16 +18,16 @@ const oB = new Order({ type: 'EXCHANGE LIMIT' }) -module.exports = runExample({ - name: 'ws2-oc-multi', - ws: { - env: true, - connect: true, - auth: true, - transform: true, - keepOpen: true - } -}, async ({ ws, debug }) => { +async function execute () { + const ws = new WSv2({ + apiKey, + apiSecret, + transform: true + }) + ws.on('error', e => debug('WSv2 error: %s', e.message | e)) + await ws.open() + await ws.auth() + oA.registerListeners(ws) oB.registerListeners(ws) @@ -58,4 +59,8 @@ module.exports = runExample({ }]) debug('sent oc_multi for orders A & B') -}) + + await ws.close() +} + +execute() diff --git a/examples/ws2/oco-order.js b/examples/ws2/oco-order.js index 2912e882..0a59ddb5 100644 --- a/examples/ws2/oco-order.js +++ b/examples/ws2/oco-order.js @@ -2,7 +2,8 @@ const Promise = require('bluebird') const { Order } = require('bfx-api-node-models') -const runExample = require('../util/run_example') +const { args: { apiKey, apiSecret }, debug } = require('../util/setup') +const WSv2 = require('../../lib/transports/ws2') // Build new order const o = new Order({ @@ -16,10 +17,16 @@ const o = new Order({ priceAuxLimit: 1000 }) -module.exports = runExample({ - name: 'ws2-oco-order', - ws: { env: true, connect: true, auth: true, transform: true } -}, async ({ ws, debug }) => { +async function execute () { + const ws = new WSv2({ + apiKey, + apiSecret, + transform: true + }) + ws.on('error', e => debug('WSv2 error: %s', e.message | e)) + await ws.open() + await ws.auth() + o.registerListeners(ws) // enable automatic updates let orderClosed = false @@ -48,4 +55,7 @@ module.exports = runExample({ await o.cancel() debug('got cancel confirmation for order %d', o.cid) -}) + await ws.close() +} + +execute() diff --git a/examples/ws2/order_book_viz.js b/examples/ws2/order_book_viz.js index 3eb6bb3c..9872ff1e 100644 --- a/examples/ws2/order_book_viz.js +++ b/examples/ws2/order_book_viz.js @@ -5,22 +5,18 @@ const blessedContrib = require('blessed-contrib') const _isEmpty = require('lodash/isEmpty') const _reverse = require('lodash/reverse') const { preparePrice, prepareAmount } = require('bfx-api-node-util') -const runExample = require('../util/run_example') +const { debug } = require('../util/setup') +const WSv2 = require('../../lib/transports/ws2') -module.exports = runExample({ - name: 'ws2-order-book-viz', - ws: { - env: true, - connect: true, +async function execute () { + const ws = new WSv2({ transform: true, - manageOrderBooks: true, // tell the ws client to maintain full sorted OBs - keepOpen: true - }, - params: { - market: 'tBTCUSD' - } -}, async ({ ws, params }) => { - const { market } = params + manageOrderBooks: true // tell the ws client to maintain full sorted OBs + }) + ws.on('error', e => debug('WSv2 error: %s', e.message | e)) + await ws.open() + + const market = 'tBTCUSD' if (_isEmpty(market)) { throw new Error('market required') @@ -61,4 +57,6 @@ module.exports = runExample({ }) await ws.subscribeOrderBook(market, 'P0', '25') -}) +} + +execute() diff --git a/examples/ws2/order_books.js b/examples/ws2/order_books.js index 026b1187..3347b91d 100644 --- a/examples/ws2/order_books.js +++ b/examples/ws2/order_books.js @@ -1,16 +1,16 @@ 'use strict' -const runExample = require('../util/run_example') +const { debug } = require('../util/setup') +const WSv2 = require('../../lib/transports/ws2') -module.exports = runExample({ - name: 'ws2-order-books', - ws: { - env: true, - connect: true, +async function execute () { + const ws = new WSv2({ transform: true, // auto-transform array OBs to OrderBook objects manageOrderBooks: true // tell the ws client to maintain full sorted OBs - } -}, async ({ ws, debug }) => { + }) + ws.on('error', e => debug('WSv2 error: %s', e.message | e)) + await ws.open() + let lastMidPrice = -1 let midPrice @@ -29,4 +29,6 @@ module.exports = runExample({ }) await ws.subscribeOrderBook('tBTCUSD') -}) +} + +execute() diff --git a/examples/ws2/order_tif.js b/examples/ws2/order_tif.js index 7acabad9..f3c425be 100644 --- a/examples/ws2/order_tif.js +++ b/examples/ws2/order_tif.js @@ -1,7 +1,8 @@ 'use strict' const { Order } = require('bfx-api-node-models') -const runExample = require('../util/run_example') +const { args: { apiKey, apiSecret }, debug } = require('../util/setup') +const WSv2 = require('../../lib/transports/ws2') const o = new Order({ cid: Date.now(), @@ -12,10 +13,16 @@ const o = new Order({ tif: '2019-03-08 15:00:00' }) -module.exports = runExample({ - name: 'ws2-order-tif', - ws: { env: true, connect: true, auth: true, transform: true } -}, async ({ ws, debug }) => { +async function execute () { + const ws = new WSv2({ + apiKey, + apiSecret, + transform: true + }) + ws.on('error', e => debug('WSv2 error: %s', e.message | e)) + await ws.open() + await ws.auth() + o.registerListeners(ws) o.on('update', () => debug('updated: %s', o.toString())) @@ -28,4 +35,7 @@ module.exports = runExample({ 'got submit confirmation for order %d [%d] [tif: %d]', o.cid, o.id, o.mtsTIF ) -}) + await ws.close() +} + +execute() diff --git a/examples/ws2/orders.js b/examples/ws2/orders.js index 188b02dc..36b2f189 100644 --- a/examples/ws2/orders.js +++ b/examples/ws2/orders.js @@ -2,7 +2,8 @@ const Promise = require('bluebird') const { Order } = require('bfx-api-node-models') -const runExample = require('../util/run_example') +const { args: { apiKey, apiSecret }, debug } = require('../util/setup') +const WSv2 = require('../../lib/transports/ws2') // Build new order const o = new Order({ @@ -13,10 +14,16 @@ const o = new Order({ type: Order.type.EXCHANGE_LIMIT }) -module.exports = runExample({ - name: 'ws2-orders', - ws: { env: true, connect: true, auth: true, transform: true } -}, async ({ ws, debug }) => { +async function execute () { + const ws = new WSv2({ + apiKey, + apiSecret, + transform: true + }) + ws.on('error', e => debug('WSv2 error: %s', e.message | e)) + await ws.open() + await ws.auth() + let orderClosed = false // Enable automatic updates @@ -44,4 +51,7 @@ module.exports = runExample({ debug('canceling...') await o.cancel() debug('got cancel confirmation for order %d', o.cid) -}) + await ws.close() +} + +execute() diff --git a/examples/ws2/ox_multi.js b/examples/ws2/ox_multi.js index 3613c0f6..09ab7f58 100644 --- a/examples/ws2/ox_multi.js +++ b/examples/ws2/ox_multi.js @@ -1,7 +1,8 @@ 'use strict' const { Order } = require('bfx-api-node-models') -const runExample = require('../util/run_example') +const { args: { apiKey, apiSecret }, debug } = require('../util/setup') +const WSv2 = require('../../lib/transports/ws2') const oA = new Order({ symbol: 'tBTCUSD', @@ -24,16 +25,16 @@ const oC = new Order({ type: 'EXCHANGE LIMIT' }) -module.exports = runExample({ - name: 'ws2-ox-multi', - ws: { - env: true, - connect: true, - auth: true, - transform: true, - keepOpen: true - } -}, async ({ ws, debug }) => { +async function execute () { + const ws = new WSv2({ + apiKey, + apiSecret, + transform: true + }) + ws.on('error', e => debug('WSv2 error: %s', e.message | e)) + await ws.open() + await ws.auth() + oA.registerListeners(ws) oB.registerListeners(ws) oC.registerListeners(ws) @@ -78,4 +79,6 @@ module.exports = runExample({ ]) debug('sent ox_multi to cancel order A and orders [B, C]') -}) +} + +execute() diff --git a/examples/ws2/sequencing.js b/examples/ws2/sequencing.js index 33d2cf6e..1aa6f2f4 100644 --- a/examples/ws2/sequencing.js +++ b/examples/ws2/sequencing.js @@ -2,12 +2,19 @@ const _isArray = require('lodash/isArray') const _isFinite = require('lodash/isFinite') -const runExample = require('../util/run_example') +const { args: { apiKey, apiSecret }, debug } = require('../util/setup') +const WSv2 = require('../../lib/transports/ws2') + +async function execute () { + const ws = new WSv2({ + apiKey, + apiSecret, + transform: true + }) + ws.on('error', e => debug('WSv2 error: %s', e.message | e)) + await ws.open() + await ws.auth() -module.exports = runExample({ - name: 'ws2-sequencing', - ws: { env: true, connect: true, auth: true } -}, async ({ ws, debug }) => { // Enables internal sequence tracking; an error will be emitted if there is a // seq # mis-match await ws.enableSequencing({ audit: true }) @@ -39,4 +46,7 @@ module.exports = runExample({ debug('recv public seq # %d, auth seq # %d', seq, authSeq) } }) -}) + await ws.close() +} + +execute() diff --git a/examples/ws2/tickers.js b/examples/ws2/tickers.js index e5227851..ef601cfa 100644 --- a/examples/ws2/tickers.js +++ b/examples/ws2/tickers.js @@ -1,11 +1,15 @@ 'use strict' -const runExample = require('../util/run_example') +const { debug } = require('../util/setup') +const WSv2 = require('../../lib/transports/ws2') + +async function execute () { + const ws = new WSv2({ + transform: true + }) + ws.on('error', e => debug('WSv2 error: %s', e.message | e)) + await ws.open() -module.exports = runExample({ - name: 'ws2-tickers', - ws: { env: true, connect: true, transform: true } -}, async ({ ws, debug }) => { ws.onTicker({ symbol: 'tETHUSD' }, (ticker) => { debug('ETH/USD ticker: %j', ticker.toJS()) }) @@ -16,4 +20,7 @@ module.exports = runExample({ await ws.subscribeTicker('tETHUSD') await ws.subscribeTicker('fUSD') -}) + await ws.close() +} + +execute() diff --git a/examples/ws2/trades.js b/examples/ws2/trades.js index 09cb19a7..c47a7b93 100644 --- a/examples/ws2/trades.js +++ b/examples/ws2/trades.js @@ -1,25 +1,16 @@ 'use strict' -const _isEmpty = require('lodash/isEmpty') -const runExample = require('../util/run_example') +const { debug } = require('../util/setup') +const WSv2 = require('../../lib/transports/ws2') -module.exports = runExample({ - name: 'ws2-trades', - ws: { - env: true, - connect: true, - keepOpen: true, +async function execute () { + const ws = new WSv2({ transform: true - }, - params: { - market: 'tBTCUSD' - } -}, async ({ ws, debug, params }) => { - const { market } = params + }) + ws.on('error', e => debug('WSv2 error: %s', e.message | e)) + await ws.open() - if (_isEmpty(market)) { - throw new Error('market required') - } + const market = 'tBTCUSD' if (market[0] === 't') { ws.onTradeEntry({ symbol: market }, (trade) => { @@ -36,4 +27,6 @@ module.exports = runExample({ }) await ws.subscribeTrades(market) -}) +} + +execute() diff --git a/examples/ws2_manager.js b/examples/ws2_manager.js index 31c4b957..e9d3897c 100644 --- a/examples/ws2_manager.js +++ b/examples/ws2_manager.js @@ -3,14 +3,19 @@ process.env.DEBUG = 'bfx:examples:*' const _flatten = require('lodash/flatten') -const debug = require('debug')('bfx:examples:ws2-manager') -const runExample = require('./util/run_example') +const { RESTv2 } = require('../../index') +const { args, debug } = require('./util/setup') const Manager = require('../lib/ws2_manager') -module.exports = runExample({ - name: 'ws2-manger', - rest: { transform: true } -}, async ({ rest, env }) => { +const { apiKey, apiSecret } = args + +async function execute () { + const rest = new RESTv2({ + apiKey, + apiSecret, + transform: true + }) + debug('fetching symbol details...') const details = await rest.symbolDetails() @@ -20,7 +25,7 @@ module.exports = runExample({ return timeFrames.map(tf => `trade:${tf}:${s}`) })) - const m = new Manager({ ...env }) + const m = new Manager({ ...args }) m.on('error', (err) => { debug('error: %s', err) @@ -65,4 +70,6 @@ module.exports = runExample({ }) m.openSocket() -}) +} + +execute() diff --git a/lib/transports/ws2.js b/lib/transports/ws2.js index 3b09f502..fd603df1 100644 --- a/lib/transports/ws2.js +++ b/lib/transports/ws2.js @@ -473,7 +473,7 @@ class WSv2 extends EventEmitter { return authSeq !== this._lastAuthSeq ? new Error( `invalid auth seq #, expected no advancement but got ${authSeq}` - ) + ) : null } diff --git a/test/examples/run_example.js b/test/examples/run_example.js deleted file mode 100644 index d564b904..00000000 --- a/test/examples/run_example.js +++ /dev/null @@ -1,207 +0,0 @@ -/* eslint-env mocha */ -'use strict' - -const assert = require('assert') -const Promise = require('bluebird') -const _isObject = require('lodash/isObject') -const _isFunction = require('lodash/isFunction') -const { RESTv2 } = require('bfx-api-node-rest') - -const runExample = require('../../examples/util/run_example') -const WSv2 = require('../../lib/transports/ws2') - -const getRunArgs = (override = {}) => ({ - name: 'self-test', - testing: true, - ...override -}) - -describe('runExample', () => { - it('throws an error if no example name is provided', () => { - try { - runExample({}, () => (assert.fail('example should not have executed'))) - assert.fail('error should have been thrown with missing name') - } catch (e) { - assert.ok(!!e) - } - - try { - runExample({ name: '' }, async () => (assert.fail('example should not have executed'))) - assert.fail('error should have been thrown with empty name') - } catch (e) { - assert.ok(!!e) - } - }) - - it('supports async examples', (done) => { - try { - runExample(getRunArgs(), async () => { - await Promise.delay(10) - done() - }) - } catch (e) { - assert.fail('should not have thrown an error with an async example func') - } - }) - - it('passes a debugger to the example', (done) => { - runExample(getRunArgs(), async (args) => { - assert.ok(_isObject(args), 'example not passed a tooling object') - assert.ok(_isFunction(args.debug), 'example not passed a debug() instance') - done() - }) - }) - - it('passes a specialized table logging function to the example', (done) => { - runExample(getRunArgs(), async (args) => { - assert.ok(_isObject(args), 'example not passed a tooling object') - assert.ok(_isFunction(args.debugTable), 'example not passed a debugTable() instance') - done() - }) - }) - - it.skip('catches example errors', async () => { - let exampleExecuted = false - - try { - await runExample(getRunArgs({ testing: false }), () => { - exampleExecuted = true - throw new Error('test error') - })() - } catch (e) { - assert.fail('example error should have been caught internally') - } - - assert.ok(exampleExecuted, 'example was not executed') - }) - - it.skip('does not catch errors if testing is provided', () => { - let errorThrown = false - - try { - runExample(getRunArgs(), async () => { - throw new Error('test error') - }) - - assert.fail('error was not propagated') - } catch (e) { - errorThrown = true - } - - assert.ok(errorThrown, 'error was not thrown') - }) - - it('provides a RESTv2 client if requested', (done) => { - runExample(getRunArgs({ rest: true }), async ({ rest }) => { - assert.ok(rest instanceof RESTv2, 'no RESTv2 instance provided to example') - done() - }) - }) - - it('parses .env and passes data to RESTv2 constructor if requested', async () => { - process.env.SOCKS_PROXY_URL = 'socks4://127.0.0.1:9998' - process.env.REST_URL = 'localhost:8080' - - await runExample(getRunArgs({ - rest: { env: true } - }), ({ rest }) => { - assert.ok(rest.usesAgent(), 'RESTv2 instance provided to example does not use .env config') - - delete process.env.SOCKS_PROXY_URL - delete process.env.REST_URL - }) - - return runExample(getRunArgs({ - rest: { env: true } - }), async ({ rest }) => { - assert.ok(!rest.usesAgent(), 'RESTv2 instance provided to example uses .env config when not requested') - assert.strictEqual(rest.getURL(), RESTv2.url, 'RESTv2 instance provided to example does not use default URL when no override configured') - }) - }) - - it('passes extra RESTv2 args to constructor if provided', (done) => { - const URL = 'http://google.com' - - runExample(getRunArgs({ - rest: { url: URL } - }), ({ rest }) => { - assert.ok(rest instanceof RESTv2, 'did not receive a RESTv2 instance') - assert.strictEqual(rest.getURL(), URL, 'RESTv2 args were not passed through') - done() - }) - }).timeout(10000) - - it('provides a WSv2 client if requested', (done) => { - runExample(getRunArgs({ - ws: true - }), ({ ws }) => { - assert.ok(ws instanceof WSv2, 'no WSv2 instance provided to example') - done() - }) - }).timeout(10000) - - it('parses .env and passes data to WSv2 constructor if requested', async () => { - process.env.SOCKS_PROXY_URL = 'socks4://127.0.0.1:9998' - process.env.WS_URL = 'localhost:8080' - - await runExample(getRunArgs({ - ws: { env: true } - }), ({ ws }) => { - assert.ok(ws.usesAgent(), 'WSv2 instance provided to example not given connection agent') - assert.strictEqual(ws.getURL(), 'localhost:8080', 'WSv2 instance provided to example not given connection url') - - delete process.env.SOCKS_PROXY_URL - delete process.env.WS_URL - }) - - return runExample(getRunArgs({ - ws: { env: true } - }), ({ ws }) => { - assert.ok(!ws.usesAgent(), 'WSv2 instance provided to example used connection agent when none configured') - assert.strictEqual(ws.getURL(), WSv2.url, 'WSv2 instance provided to example does not use default URL when no override configured') - }) - }).timeout(10000) - - it('passes extra WSv2 args to constructor if provided', (done) => { - runExample(getRunArgs({ - ws: { seqAudit: true } - }), async ({ ws }) => { - assert.ok(ws instanceof WSv2, 'did not receive a WSv2 instance') - assert.ok(ws.sequencingEnabled(), 'WSv2 args were not passed through') - done() - }) - }).timeout(10000) - - it('closes WSv2 on example end if left open', (done) => { - runExample(getRunArgs({ - ws: true - }), async ({ ws }) => { - ws.on('close', done) - - await ws.open() - }) - }).timeout(6000) - - it('does not close WSv2 on example end if requested not too', (done) => { - runExample(getRunArgs({ - ws: { connect: true, keepOpen: true } - }), async ({ ws }) => { - setTimeout(async () => { - ws.once('close', done) - await ws.close() - }, 20) - }) - }).timeout(4000) - - it('provides a readline instance if requested', () => { - runExample(getRunArgs({ readline: true }), ({ readline }) => { - assert.ok(_isFunction(readline.questionAsync), 'no readline instance provided') - }) - }) - - it('automatically closes the readline instance if provided and not already closed', (done) => { - runExample(getRunArgs({ readline: true }), ({ readline }) => { - readline.on('close', done) - }) - }) -}).timeout(10 * 1000) // timeout for travis diff --git a/test/examples/setup.js b/test/examples/setup.js new file mode 100644 index 00000000..d9c06a5a --- /dev/null +++ b/test/examples/setup.js @@ -0,0 +1,20 @@ +/* eslint-env mocha */ +'use strict' + +const assert = require('assert') +const _isObject = require('lodash/isObject') +const _isFunction = require('lodash/isFunction') + +const { args, debug, debugTable, readline } = require('../../examples/util/setup') + +describe('setup', () => { + it('provides a debugger', () => { + assert.ok(_isObject(args), 'setup doesnt provide a tooling object') + assert.ok(_isFunction(debug), 'setup doesnt provide a debug() instance') + assert.ok(_isFunction(debugTable), 'setup doesnt provide a debugTable() instance') + }) + + it('provides a readline instance', () => { + assert.ok(_isFunction(readline.questionAsync), 'no readline instance provided') + }) +}).timeout(10 * 1000) // timeout for travis