Skip to content

Commit bbf3166

Browse files
f3rnoJacobPlaster
authored andcommitted
(refactor) use async/await where possible in tests/ws2
1 parent e0656cb commit bbf3166

File tree

5 files changed

+385
-351
lines changed

5 files changed

+385
-351
lines changed

CHANGELOG

+4
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
4.0.7
2+
- WSv2: refactor to use async/await style where possible
3+
- WSv2: reconnect() now always resolves on completion
4+
15
4.0.6
26
- WSv2: fix internal flag persistence #521
37

lib/transports/ws2.js

+55-46
Original file line numberDiff line numberDiff line change
@@ -198,9 +198,9 @@ class WSv2 extends EventEmitter {
198198
*
199199
* @return {Promise} p
200200
*/
201-
open () {
201+
async open () {
202202
if (this._isOpen || this._ws !== null) {
203-
return Promise.reject(new Error('already open'))
203+
throw new Error('already open')
204204
}
205205

206206
debug('connecting to %s...', this._url)
@@ -219,14 +219,14 @@ class WSv2 extends EventEmitter {
219219

220220
return new Promise((resolve, reject) => {
221221
this._ws.on('open', () => {
222-
if (this._enabledFlags !== 0) {
223-
this.sendEnabledFlags()
224-
}
225-
226222
// call manually instead of binding to open event so it fires at the
227223
// right time
228224
this._onWSOpen()
229225

226+
if (this._enabledFlags !== 0) {
227+
this.sendEnabledFlags()
228+
}
229+
230230
debug('connected')
231231
resolve()
232232
})
@@ -239,16 +239,16 @@ class WSv2 extends EventEmitter {
239239
*
240240
* @param {number} code - passed to ws
241241
* @param {string} reason - passed to ws
242-
* @return {Promise}
242+
* @return {Promise} p
243243
*/
244-
close (code, reason) {
244+
async close (code, reason) {
245245
if (!this._isOpen || this._ws === null) {
246-
return Promise.reject(new Error('not open'))
246+
throw new Error('not open')
247247
}
248248

249249
debug('disconnecting...')
250250

251-
return new Promise((resolve, reject) => {
251+
return new Promise((resolve) => {
252252
this._ws.once('close', () => {
253253
this._isOpen = false
254254
this._ws = null
@@ -275,10 +275,13 @@ class WSv2 extends EventEmitter {
275275
* @param {number?} dms - optional dead man switch flag, active 4
276276
* @return {Promise} p
277277
*/
278-
auth (calc, dms) {
279-
if (!this._isOpen) return Promise.reject(new Error('not open'))
278+
async auth (calc, dms) {
279+
if (!this._isOpen) {
280+
throw new Error('not open')
281+
}
282+
280283
if (this._isAuthenticated) {
281-
return Promise.reject(new Error('already authenticated'))
284+
throw new Error('already authenticated')
282285
}
283286

284287
const authNonce = nonce()
@@ -289,7 +292,7 @@ class WSv2 extends EventEmitter {
289292
if (_isFinite(calc)) authArgs.calc = calc
290293
if (_isFinite(dms)) authArgs.dms = dms
291294

292-
return new Promise((resolve, reject) => {
295+
return new Promise((resolve) => {
293296
this.once('auth', () => {
294297
debug('authenticated')
295298
resolve()
@@ -317,6 +320,10 @@ class WSv2 extends EventEmitter {
317320

318321
if (this._ws !== null && this._isOpen) { // did we get a watchdog timeout and need to close the connection?
319322
await this.close()
323+
324+
return new Promise((resolve) => {
325+
this.once(this._wasEverAuthenticated ? 'auth' : 'open', resolve)
326+
})
320327
} else {
321328
await this.reconnectAfterClose() // we are already closed, so reopen and re-auth
322329
}
@@ -393,11 +400,13 @@ class WSv2 extends EventEmitter {
393400
/**
394401
* Trigger the packet watch-dog; called when we haven't seen a new WS packet
395402
* for longer than our WD duration (if provided)
403+
*
404+
* @return {Promise} p
396405
* @private
397406
*/
398-
_triggerPacketWD () {
407+
async _triggerPacketWD () {
399408
if (!this._packetWDDelay || !this._isOpen) {
400-
return Promise.resolve()
409+
return
401410
}
402411

403412
debug(
@@ -429,6 +438,9 @@ class WSv2 extends EventEmitter {
429438
}, this._packetWDDelay)
430439
}
431440

441+
/**
442+
* Subscribes to previously subscribed channels, used after reconnecting
443+
*/
432444
resubscribePreviousChannels () {
433445
Object.values(this._prevChannelMap).forEach((chan) => {
434446
const { channel } = chan
@@ -458,7 +470,9 @@ class WSv2 extends EventEmitter {
458470
break
459471
}
460472

461-
default: {}
473+
default: {
474+
debug('unknown previously subscribed channel type: %s', channel)
475+
}
462476
}
463477
})
464478
}
@@ -486,7 +500,7 @@ class WSv2 extends EventEmitter {
486500
/**
487501
* @private
488502
*/
489-
_onWSClose () {
503+
async _onWSClose () {
490504
this._isOpen = false
491505
this._isAuthenticated = false
492506
this._lastAuthSeq = -1
@@ -504,17 +518,15 @@ class WSv2 extends EventEmitter {
504518
if (this._isReconnecting || (this._autoReconnect && !this._isClosing)) {
505519
this._prevChannelMap = this._channelMap
506520

507-
setTimeout(() => {
508-
if (this._reconnectThrottler) {
509-
this._reconnectThrottler
510-
.add(this.reconnectAfterClose.bind(this))
511-
.catch((err) => {
512-
debug('error reconnectAfterClose: %s', err.stack)
513-
})
514-
} else {
515-
this.reconnectAfterClose().catch((err) => {
516-
debug('error reconnectAfterClose: %s', err.stack)
517-
})
521+
setTimeout(async () => {
522+
try {
523+
if (this._reconnectThrottler) {
524+
await this._reconnectThrottler.add(this.reconnectAfterClose.bind(this))
525+
} else {
526+
await this.reconnectAfterClose()
527+
}
528+
} catch (err) {
529+
debug('error reconnectAfterClose: %s', err.stack)
518530
}
519531
}, this._reconnectDelay)
520532
}
@@ -1371,7 +1383,7 @@ class WSv2 extends EventEmitter {
13711383
* @param {boolean} args.audit - if true, an error is emitted on invalid seq
13721384
* @return {Promise} p
13731385
*/
1374-
enableSequencing (args = { audit: true }) {
1386+
async enableSequencing (args = { audit: true }) {
13751387
this._seqAudit = args.audit === true
13761388

13771389
return this.enableFlag(FLAGS.SEQ_ALL)
@@ -1588,9 +1600,9 @@ class WSv2 extends EventEmitter {
15881600
* @param {Object|Array} order
15891601
* @return {Promise} p - resolves on submit notification
15901602
*/
1591-
submitOrder (order) {
1603+
async submitOrder (order) {
15921604
if (!this._isAuthenticated) {
1593-
return Promise.reject(new Error('not authenticated'))
1605+
throw new Error('not authenticated')
15941606
}
15951607

15961608
const packet = Array.isArray(order)
@@ -1620,13 +1632,13 @@ class WSv2 extends EventEmitter {
16201632
* @param {Object} changes - requires at least an 'id'
16211633
* @return {Promise} p - resolves on receival of confirmation notification
16221634
*/
1623-
updateOrder (changes = {}) {
1635+
async updateOrder (changes = {}) {
16241636
const { id } = changes
16251637

16261638
if (!this._isAuthenticated) {
1627-
return Promise.reject(new Error('not authenticated'))
1639+
throw new Error('not authenticated')
16281640
} else if (!id) {
1629-
return Promise.reject(new Error('order ID required for update'))
1641+
throw new Error('order ID required for update')
16301642
}
16311643

16321644
this._sendOrderPacket([0, 'ou', null, changes])
@@ -1642,9 +1654,9 @@ class WSv2 extends EventEmitter {
16421654
* @param {Object|Array|number} order
16431655
* @return {Promise} p
16441656
*/
1645-
cancelOrder (order) {
1657+
async cancelOrder (order) {
16461658
if (!this._isAuthenticated) {
1647-
return Promise.reject(new Error('not authenticated'))
1659+
throw new Error('not authenticated')
16481660
}
16491661

16501662
const id = typeof order === 'number'
@@ -1668,14 +1680,12 @@ class WSv2 extends EventEmitter {
16681680
* @param {Object[]|Array[]|number[]} orders
16691681
* @return {Promise} p
16701682
*/
1671-
cancelOrders (orders) {
1683+
async cancelOrders (orders) {
16721684
if (!this._isAuthenticated) {
1673-
return Promise.reject(new Error('not authenticated'))
1685+
throw new Error('not authenticated')
16741686
}
16751687

1676-
return Promise.all(orders.map((order) => {
1677-
return this.cancelOrder(order)
1678-
}))
1688+
return Promise.all(orders.map(this.cancelOrder))
16791689
}
16801690

16811691
/**
@@ -1686,14 +1696,13 @@ class WSv2 extends EventEmitter {
16861696
* @param {Object[]} opPayloads
16871697
* @return {Promise} p - rejects if not authenticated
16881698
*/
1689-
submitOrderMultiOp (opPayloads) {
1699+
async submitOrderMultiOp (opPayloads) {
16901700
if (!this._isAuthenticated) {
1691-
return Promise.reject(new Error('not authenticated'))
1701+
throw new Error('not authenticated')
16921702
}
16931703

1704+
// TODO: multi-op tracking
16941705
this.send([0, 'ox_multi', null, opPayloads])
1695-
1696-
return Promise.resolve() // TODO: multi-op tracking
16971706
}
16981707

16991708
/**

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "bitfinex-api-node",
3-
"version": "4.0.6",
3+
"version": "4.0.7",
44
"description": "Node reference library for Bitfinex API",
55
"engines": {
66
"node": ">=7"

0 commit comments

Comments
 (0)