@@ -198,9 +198,9 @@ class WSv2 extends EventEmitter {
198
198
*
199
199
* @return {Promise } p
200
200
*/
201
- open ( ) {
201
+ async open ( ) {
202
202
if ( this . _isOpen || this . _ws !== null ) {
203
- return Promise . reject ( new Error ( 'already open' ) )
203
+ throw new Error ( 'already open' )
204
204
}
205
205
206
206
debug ( 'connecting to %s...' , this . _url )
@@ -219,14 +219,14 @@ class WSv2 extends EventEmitter {
219
219
220
220
return new Promise ( ( resolve , reject ) => {
221
221
this . _ws . on ( 'open' , ( ) => {
222
- if ( this . _enabledFlags !== 0 ) {
223
- this . sendEnabledFlags ( )
224
- }
225
-
226
222
// call manually instead of binding to open event so it fires at the
227
223
// right time
228
224
this . _onWSOpen ( )
229
225
226
+ if ( this . _enabledFlags !== 0 ) {
227
+ this . sendEnabledFlags ( )
228
+ }
229
+
230
230
debug ( 'connected' )
231
231
resolve ( )
232
232
} )
@@ -239,16 +239,16 @@ class WSv2 extends EventEmitter {
239
239
*
240
240
* @param {number } code - passed to ws
241
241
* @param {string } reason - passed to ws
242
- * @return {Promise }
242
+ * @return {Promise } p
243
243
*/
244
- close ( code , reason ) {
244
+ async close ( code , reason ) {
245
245
if ( ! this . _isOpen || this . _ws === null ) {
246
- return Promise . reject ( new Error ( 'not open' ) )
246
+ throw new Error ( 'not open' )
247
247
}
248
248
249
249
debug ( 'disconnecting...' )
250
250
251
- return new Promise ( ( resolve , reject ) => {
251
+ return new Promise ( ( resolve ) => {
252
252
this . _ws . once ( 'close' , ( ) => {
253
253
this . _isOpen = false
254
254
this . _ws = null
@@ -275,10 +275,13 @@ class WSv2 extends EventEmitter {
275
275
* @param {number? } dms - optional dead man switch flag, active 4
276
276
* @return {Promise } p
277
277
*/
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
+
280
283
if ( this . _isAuthenticated ) {
281
- return Promise . reject ( new Error ( 'already authenticated' ) )
284
+ throw new Error ( 'already authenticated' )
282
285
}
283
286
284
287
const authNonce = nonce ( )
@@ -289,7 +292,7 @@ class WSv2 extends EventEmitter {
289
292
if ( _isFinite ( calc ) ) authArgs . calc = calc
290
293
if ( _isFinite ( dms ) ) authArgs . dms = dms
291
294
292
- return new Promise ( ( resolve , reject ) => {
295
+ return new Promise ( ( resolve ) => {
293
296
this . once ( 'auth' , ( ) => {
294
297
debug ( 'authenticated' )
295
298
resolve ( )
@@ -317,6 +320,10 @@ class WSv2 extends EventEmitter {
317
320
318
321
if ( this . _ws !== null && this . _isOpen ) { // did we get a watchdog timeout and need to close the connection?
319
322
await this . close ( )
323
+
324
+ return new Promise ( ( resolve ) => {
325
+ this . once ( this . _wasEverAuthenticated ? 'auth' : 'open' , resolve )
326
+ } )
320
327
} else {
321
328
await this . reconnectAfterClose ( ) // we are already closed, so reopen and re-auth
322
329
}
@@ -393,11 +400,13 @@ class WSv2 extends EventEmitter {
393
400
/**
394
401
* Trigger the packet watch-dog; called when we haven't seen a new WS packet
395
402
* for longer than our WD duration (if provided)
403
+ *
404
+ * @return {Promise } p
396
405
* @private
397
406
*/
398
- _triggerPacketWD ( ) {
407
+ async _triggerPacketWD ( ) {
399
408
if ( ! this . _packetWDDelay || ! this . _isOpen ) {
400
- return Promise . resolve ( )
409
+ return
401
410
}
402
411
403
412
debug (
@@ -429,6 +438,9 @@ class WSv2 extends EventEmitter {
429
438
} , this . _packetWDDelay )
430
439
}
431
440
441
+ /**
442
+ * Subscribes to previously subscribed channels, used after reconnecting
443
+ */
432
444
resubscribePreviousChannels ( ) {
433
445
Object . values ( this . _prevChannelMap ) . forEach ( ( chan ) => {
434
446
const { channel } = chan
@@ -458,7 +470,9 @@ class WSv2 extends EventEmitter {
458
470
break
459
471
}
460
472
461
- default : { }
473
+ default : {
474
+ debug ( 'unknown previously subscribed channel type: %s' , channel )
475
+ }
462
476
}
463
477
} )
464
478
}
@@ -486,7 +500,7 @@ class WSv2 extends EventEmitter {
486
500
/**
487
501
* @private
488
502
*/
489
- _onWSClose ( ) {
503
+ async _onWSClose ( ) {
490
504
this . _isOpen = false
491
505
this . _isAuthenticated = false
492
506
this . _lastAuthSeq = - 1
@@ -504,17 +518,15 @@ class WSv2 extends EventEmitter {
504
518
if ( this . _isReconnecting || ( this . _autoReconnect && ! this . _isClosing ) ) {
505
519
this . _prevChannelMap = this . _channelMap
506
520
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 )
518
530
}
519
531
} , this . _reconnectDelay )
520
532
}
@@ -1371,7 +1383,7 @@ class WSv2 extends EventEmitter {
1371
1383
* @param {boolean } args.audit - if true, an error is emitted on invalid seq
1372
1384
* @return {Promise } p
1373
1385
*/
1374
- enableSequencing ( args = { audit : true } ) {
1386
+ async enableSequencing ( args = { audit : true } ) {
1375
1387
this . _seqAudit = args . audit === true
1376
1388
1377
1389
return this . enableFlag ( FLAGS . SEQ_ALL )
@@ -1588,9 +1600,9 @@ class WSv2 extends EventEmitter {
1588
1600
* @param {Object|Array } order
1589
1601
* @return {Promise } p - resolves on submit notification
1590
1602
*/
1591
- submitOrder ( order ) {
1603
+ async submitOrder ( order ) {
1592
1604
if ( ! this . _isAuthenticated ) {
1593
- return Promise . reject ( new Error ( 'not authenticated' ) )
1605
+ throw new Error ( 'not authenticated' )
1594
1606
}
1595
1607
1596
1608
const packet = Array . isArray ( order )
@@ -1620,13 +1632,13 @@ class WSv2 extends EventEmitter {
1620
1632
* @param {Object } changes - requires at least an 'id'
1621
1633
* @return {Promise } p - resolves on receival of confirmation notification
1622
1634
*/
1623
- updateOrder ( changes = { } ) {
1635
+ async updateOrder ( changes = { } ) {
1624
1636
const { id } = changes
1625
1637
1626
1638
if ( ! this . _isAuthenticated ) {
1627
- return Promise . reject ( new Error ( 'not authenticated' ) )
1639
+ throw new Error ( 'not authenticated' )
1628
1640
} else if ( ! id ) {
1629
- return Promise . reject ( new Error ( 'order ID required for update' ) )
1641
+ throw new Error ( 'order ID required for update' )
1630
1642
}
1631
1643
1632
1644
this . _sendOrderPacket ( [ 0 , 'ou' , null , changes ] )
@@ -1642,9 +1654,9 @@ class WSv2 extends EventEmitter {
1642
1654
* @param {Object|Array|number } order
1643
1655
* @return {Promise } p
1644
1656
*/
1645
- cancelOrder ( order ) {
1657
+ async cancelOrder ( order ) {
1646
1658
if ( ! this . _isAuthenticated ) {
1647
- return Promise . reject ( new Error ( 'not authenticated' ) )
1659
+ throw new Error ( 'not authenticated' )
1648
1660
}
1649
1661
1650
1662
const id = typeof order === 'number'
@@ -1668,14 +1680,12 @@ class WSv2 extends EventEmitter {
1668
1680
* @param {Object[]|Array[]|number[] } orders
1669
1681
* @return {Promise } p
1670
1682
*/
1671
- cancelOrders ( orders ) {
1683
+ async cancelOrders ( orders ) {
1672
1684
if ( ! this . _isAuthenticated ) {
1673
- return Promise . reject ( new Error ( 'not authenticated' ) )
1685
+ throw new Error ( 'not authenticated' )
1674
1686
}
1675
1687
1676
- return Promise . all ( orders . map ( ( order ) => {
1677
- return this . cancelOrder ( order )
1678
- } ) )
1688
+ return Promise . all ( orders . map ( this . cancelOrder ) )
1679
1689
}
1680
1690
1681
1691
/**
@@ -1686,14 +1696,13 @@ class WSv2 extends EventEmitter {
1686
1696
* @param {Object[] } opPayloads
1687
1697
* @return {Promise } p - rejects if not authenticated
1688
1698
*/
1689
- submitOrderMultiOp ( opPayloads ) {
1699
+ async submitOrderMultiOp ( opPayloads ) {
1690
1700
if ( ! this . _isAuthenticated ) {
1691
- return Promise . reject ( new Error ( 'not authenticated' ) )
1701
+ throw new Error ( 'not authenticated' )
1692
1702
}
1693
1703
1704
+ // TODO: multi-op tracking
1694
1705
this . send ( [ 0 , 'ox_multi' , null , opPayloads ] )
1695
-
1696
- return Promise . resolve ( ) // TODO: multi-op tracking
1697
1706
}
1698
1707
1699
1708
/**
0 commit comments