@@ -86,6 +86,7 @@ export class ChunkUploader<TMetadata extends Metadata> {
8686 this . _onPaused = options . onPaused ;
8787 this . _onAborted = options . onAborted ;
8888 this . _onStatusChange = options . onStatusChange ;
89+ this . _statusChangedEventListeners = { } ;
8990
9091 if ( this . _onStatusChange ) this . _onStatusChange ( undefined , this . status ) ;
9192 }
@@ -182,6 +183,8 @@ export class ChunkUploader<TMetadata extends Metadata> {
182183 const oldValue = this . _status ;
183184 if ( oldValue === value ) return ;
184185 this . _status = value ;
186+ const listenerSet = this . _statusChangedEventListeners [ value ] ;
187+ if ( listenerSet ) listenerSet . forEach ( listener => listener ( ) ) ;
185188 if ( this . _onStatusChange ) this . _onStatusChange ( oldValue , value ) ;
186189 }
187190 protected _position : number ;
@@ -238,7 +241,7 @@ export class ChunkUploader<TMetadata extends Metadata> {
238241 break ;
239242 } catch ( error ) {
240243 if ( this . status === 'pausing' ) return false ;
241- if ( retry < this . _retryDelays . length ) await wait ( this . _retryDelays [ retry ] ) ;
244+ if ( retry < this . _retryDelays . length ) await this . _waitForRetry ( this . _retryDelays [ retry ] ) ;
242245 else {
243246 this . status = 'error' ;
244247 this . _error = error ;
@@ -307,8 +310,37 @@ export class ChunkUploader<TMetadata extends Metadata> {
307310 throw new Error ( 'onStatusChange must be a function' ) ;
308311 }
309312 }
310- }
311313
312- function wait ( ms : number ) {
313- return new Promise < void > ( resolve => setTimeout ( resolve , ms ) ) ;
314+ protected _waitForRetry ( ms : number ) {
315+ return new Promise < void > ( resolve => {
316+ let isResolved = false ;
317+
318+ const handleResolve = ( ) => {
319+ if ( isResolved ) return ;
320+ isResolved = true ;
321+ this . _removeStatusChangedEventListener ( 'pausing' , handleResolve ) ;
322+ resolve ( ) ;
323+ } ;
324+
325+ setTimeout ( handleResolve , ms ) ;
326+
327+ this . _addStatusChangedEventListener ( 'pausing' , handleResolve ) ;
328+ } ) ;
329+ }
330+
331+ protected _statusChangedEventListeners : Partial < Record < ChunkUploaderStatus , Set < ( ) => void > > > ;
332+
333+ protected _addStatusChangedEventListener ( status : ChunkUploaderStatus , listener : ( ) => void ) {
334+ const listenerSet = this . _statusChangedEventListeners [ status ] || new Set ( ) ;
335+ if ( ! this . _statusChangedEventListeners [ status ] )
336+ this . _statusChangedEventListeners [ status ] = listenerSet ;
337+ listenerSet . add ( listener ) ;
338+ }
339+
340+ protected _removeStatusChangedEventListener ( status : ChunkUploaderStatus , listener : ( ) => void ) {
341+ const listenerSet = this . _statusChangedEventListeners [ status ] || new Set ( ) ;
342+ if ( ! this . _statusChangedEventListeners [ status ] )
343+ this . _statusChangedEventListeners [ status ] = listenerSet ;
344+ listenerSet . delete ( listener ) ;
345+ }
314346}
0 commit comments