@@ -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 /**
0 commit comments