Skip to content

Commit 3e6060d

Browse files
committed
Pause should not wait for retry delay
1 parent 9382870 commit 3e6060d

File tree

3 files changed

+39
-7
lines changed

3 files changed

+39
-7
lines changed

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "nextjs-chunk-upload-action",
3-
"version": "6.0.0",
3+
"version": "6.1.0",
44
"description": "Uploading large files with chunking using server action in Next.js",
55
"main": "dist/index.js",
66
"scripts": {

src/index.ts

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)