@@ -609,6 +609,10 @@ export const userEventHandler = (cb, transform = true, variator) => msg => {
609
609
)
610
610
}
611
611
612
+ const userErrorHandler = ( cb , transform = true ) => error => {
613
+ cb ( { [ transform ? 'eventType' : 'type' ] : 'error' , error} )
614
+ }
615
+
612
616
const STREAM_METHODS = [ 'get' , 'keep' , 'close' ]
613
617
614
618
const capitalize = ( str , check ) => ( check ? `${ str [ 0 ] . toUpperCase ( ) } ${ str . slice ( 1 ) } ` : str )
@@ -630,22 +634,28 @@ const user = (opts, variator) => (cb, transform) => {
630
634
let currentListenKey = null
631
635
let int = null
632
636
let w = null
637
+ let keepClosed = false
638
+ let errorHandler = userErrorHandler ( cb , transform )
633
639
634
640
const keepAlive = isReconnecting => {
635
641
if ( currentListenKey ) {
636
- keepStreamAlive ( keepDataStream , currentListenKey ) . catch ( ( ) => {
642
+ keepStreamAlive ( keepDataStream , currentListenKey ) . catch ( err => {
637
643
closeStream ( { } , true )
638
644
639
645
if ( isReconnecting ) {
640
646
setTimeout ( ( ) => makeStream ( true ) , 30e3 )
641
647
} else {
642
648
makeStream ( true )
643
649
}
650
+
651
+ opts . emitStreamErrors && errorHandler ( err )
644
652
} )
645
653
}
646
654
}
647
655
648
- const closeStream = ( options , catchErrors ) => {
656
+ const closeStream = ( options , catchErrors = false , setKeepClosed = false ) => {
657
+ keepClosed = setKeepClosed
658
+
649
659
if ( currentListenKey ) {
650
660
clearInterval ( int )
651
661
@@ -661,24 +671,30 @@ const user = (opts, variator) => (cb, transform) => {
661
671
}
662
672
663
673
const makeStream = isReconnecting => {
664
- return getDataStream ( )
674
+ return ! keepClosed && getDataStream ( )
665
675
. then ( ( { listenKey } ) => {
676
+ if ( keepClosed ) {
677
+ return closeDataStream ( { listenKey } ) . catch ( f => f )
678
+ }
679
+
666
680
w = openWebSocket (
667
681
`${ variator === 'futures' ? endpoints . futures : endpoints . base } /${ listenKey } ` ,
668
682
)
669
683
w . onmessage = msg => userEventHandler ( cb , transform , variator ) ( msg )
684
+ opts . emitSocketErrors && ( w . onerror = ( { error} ) => errorHandler ( error ) )
670
685
671
686
currentListenKey = listenKey
672
687
673
688
int = setInterval ( ( ) => keepAlive ( false ) , 50e3 )
674
689
675
690
keepAlive ( true )
676
691
677
- return options => closeStream ( options )
692
+ return options => closeStream ( options , false , true )
678
693
} )
679
694
. catch ( err => {
680
695
if ( isReconnecting ) {
681
- setTimeout ( ( ) => makeStream ( true ) , 30e3 )
696
+ ! keepClosed && setTimeout ( ( ) => makeStream ( true ) , 30e3 )
697
+ opts . emitStreamErrors && errorHandler ( err )
682
698
} else {
683
699
throw err
684
700
}
0 commit comments