Skip to content

Commit 79e4bbf

Browse files
authored
fix: Stop cancelled work item from being queued (#10)
* feat: Add package.json props * fix: Stop cancelled work item from being queued Closes #9
1 parent b3d6f49 commit 79e4bbf

5 files changed

Lines changed: 11 additions & 7 deletions

File tree

src/workers.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ export type QueueingOptions = {
5757
}
5858

5959
export interface IWorker {
60-
connect(id: number, processMessage: ProcessMessageFn, resolve: (data: any) => void, reject: (reason: any) => void): DisconnectFn;
60+
connect(id: number, processMessage: ProcessMessageFn, resolve: (data: any) => void, reject: (reason: any) => void): DisconnectFn | undefined;
6161
post(message: AsyncMessage, transferables: Transferable[] | undefined): void;
6262
terminate(): boolean;
6363
}

src/workers/InternalSharedWorker.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ export class InternalSharedWorker implements IWorker {
3838
processMessage: ProcessMessageFn,
3939
resolve: (data: any) => void,
4040
reject: (reason: any) => void
41-
): DisconnectFn {
41+
): DisconnectFn | undefined {
4242
const listener = this.#listenerFactory(id, processMessage, resolve);
4343
this.#worker.port.addEventListener('message', listener);
4444
this.#worker.port.start();

src/workers/InternalWorker.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,10 @@ export class InternalWorker implements IWorker {
3636
};
3737
}
3838

39-
connect(id: number, processMessage: ProcessMessageFn, resolve: (data: any) => void, reject: (reason: any) => void): DisconnectFn {
39+
connect(id: number, processMessage: ProcessMessageFn, resolve: (data: any) => void, reject: (reason: any) => void): DisconnectFn | undefined {
4040
if (this.#terminated) {
4141
reject(new WorkerTerminatedMessage(id));
42+
return;
4243
}
4344
const listener = this.#listenerFactory(id, processMessage, resolve);
4445
this.#worker.addEventListener('message', listener);

src/workers/WorkItem.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ export class WorkItem<TResult> {
4343
if (this.status === WorkItemStatus.Enqueued) {
4444
this.#internal.data.reject(new CancelledMessage(true));
4545
}
46-
return this.#internal.cancellationSource || !this.#internal.disconnect;
46+
this.#internal.cancelled ||= !!this.#internal.cancellationSource || this.status === WorkItemStatus.Cancelled;
47+
return !!this.#internal.cancellationSource || this.status === WorkItemStatus.Cancelled;
4748
}
4849
}

src/workers/WorkItemInternal.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,13 @@ export class WorkItemInternal<TResult = any> {
99
data;
1010
options;
1111
cancellationSource;
12+
cancelled;
1213
status: WorkItemStatusEnum;
1314
disconnect: DisconnectFn | undefined;
1415

1516
constructor(worker: IWorker, data: WorkItemData<TResult>, options: QueueingOptions | undefined) {
1617
this.status = WorkItemStatus.Enqueued;
18+
this.cancelled = false;
1719
this.worker = worker;
1820
this.data = {
1921
...data,
@@ -45,15 +47,15 @@ export class WorkItemInternal<TResult = any> {
4547
}
4648

4749
start() {
48-
if (this.cancellationSource && CancellationSource.isSignalled(this.cancellationSource.token)) {
49-
return;
50-
}
5150
this.disconnect = this.worker.connect(
5251
this.data.id,
5352
this.options?.processMessage ?? this.#defaultProcessMessage.bind(this),
5453
this.data.resolve,
5554
this.data.reject
5655
);
56+
if (this.cancelled) {
57+
return;
58+
}
5759
this.status = WorkItemStatus.Started;
5860
const wiPayload: AsyncMessage = {
5961
workItemId: this.data.id,

0 commit comments

Comments
 (0)