From 655c6fd24e661134c64a9549167bfea39ca05720 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ramirez=20Vargas=2C=20Jos=C3=A9=20Pablo?= Date: Sat, 24 Aug 2024 19:57:48 -0600 Subject: [PATCH 1/2] feat: Add package.json props --- package.json | 10 +++++++++- pages/package.json | 2 +- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 55bbf1c..bab6c50 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,15 @@ "import": "./dist/index.js" } }, - "author": "José Pablo Ramírez ", + "repository": { + "type": "git", + "url": "git+https://github.com/WJSoftware/wjfe-async-workers.git" + }, + "author": { + "email": "webJose@gmail.com", + "name": "José Pablo Ramírez Vargas" + }, + "homepage": "https://wjsoftware.github.io/wjfe-async-workers/", "license": "MIT", "devDependencies": { "publint": "^0.2.10", diff --git a/pages/package.json b/pages/package.json index de245c5..aa3d406 100644 --- a/pages/package.json +++ b/pages/package.json @@ -6,7 +6,7 @@ "dev": "vite dev", "build": "vite build", "preview": "vite preview", - "deploy-pages": "npm ci && npm run build && gh-pages -b Pages -d build -t true", + "deploy-pages": "npm run build && gh-pages -b Pages -d build -t true", "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", "lint": "eslint ." From 030b29c543d087fd7bcb3db8475b58e685ba11ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ramirez=20Vargas=2C=20Jos=C3=A9=20Pablo?= Date: Sat, 24 Aug 2024 21:04:50 -0600 Subject: [PATCH 2/2] fix: Stop cancelled work item from being queued Closes #9 --- src/workers.d.ts | 2 +- src/workers/InternalSharedWorker.ts | 2 +- src/workers/InternalWorker.ts | 3 ++- src/workers/WorkItem.ts | 3 ++- src/workers/WorkItemInternal.ts | 8 +++++--- 5 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/workers.d.ts b/src/workers.d.ts index e3b65a2..e1f77cd 100644 --- a/src/workers.d.ts +++ b/src/workers.d.ts @@ -57,7 +57,7 @@ export type QueueingOptions = { } export interface IWorker { - connect(id: number, processMessage: ProcessMessageFn, resolve: (data: any) => void, reject: (reason: any) => void): DisconnectFn; + connect(id: number, processMessage: ProcessMessageFn, resolve: (data: any) => void, reject: (reason: any) => void): DisconnectFn | undefined; post(message: AsyncMessage, transferables: Transferable[] | undefined): void; terminate(): boolean; } diff --git a/src/workers/InternalSharedWorker.ts b/src/workers/InternalSharedWorker.ts index f86f62e..10f946a 100644 --- a/src/workers/InternalSharedWorker.ts +++ b/src/workers/InternalSharedWorker.ts @@ -38,7 +38,7 @@ export class InternalSharedWorker implements IWorker { processMessage: ProcessMessageFn, resolve: (data: any) => void, reject: (reason: any) => void - ): DisconnectFn { + ): DisconnectFn | undefined { const listener = this.#listenerFactory(id, processMessage, resolve); this.#worker.port.addEventListener('message', listener); this.#worker.port.start(); diff --git a/src/workers/InternalWorker.ts b/src/workers/InternalWorker.ts index f8be109..533caaf 100644 --- a/src/workers/InternalWorker.ts +++ b/src/workers/InternalWorker.ts @@ -36,9 +36,10 @@ export class InternalWorker implements IWorker { }; } - connect(id: number, processMessage: ProcessMessageFn, resolve: (data: any) => void, reject: (reason: any) => void): DisconnectFn { + connect(id: number, processMessage: ProcessMessageFn, resolve: (data: any) => void, reject: (reason: any) => void): DisconnectFn | undefined { if (this.#terminated) { reject(new WorkerTerminatedMessage(id)); + return; } const listener = this.#listenerFactory(id, processMessage, resolve); this.#worker.addEventListener('message', listener); diff --git a/src/workers/WorkItem.ts b/src/workers/WorkItem.ts index 08db87c..775a1d1 100644 --- a/src/workers/WorkItem.ts +++ b/src/workers/WorkItem.ts @@ -43,6 +43,7 @@ export class WorkItem { if (this.status === WorkItemStatus.Enqueued) { this.#internal.data.reject(new CancelledMessage(true)); } - return this.#internal.cancellationSource || !this.#internal.disconnect; + this.#internal.cancelled ||= !!this.#internal.cancellationSource || this.status === WorkItemStatus.Cancelled; + return !!this.#internal.cancellationSource || this.status === WorkItemStatus.Cancelled; } } diff --git a/src/workers/WorkItemInternal.ts b/src/workers/WorkItemInternal.ts index 498abf7..c8439a0 100644 --- a/src/workers/WorkItemInternal.ts +++ b/src/workers/WorkItemInternal.ts @@ -9,11 +9,13 @@ export class WorkItemInternal { data; options; cancellationSource; + cancelled; status: WorkItemStatusEnum; disconnect: DisconnectFn | undefined; constructor(worker: IWorker, data: WorkItemData, options: QueueingOptions | undefined) { this.status = WorkItemStatus.Enqueued; + this.cancelled = false; this.worker = worker; this.data = { ...data, @@ -45,15 +47,15 @@ export class WorkItemInternal { } start() { - if (this.cancellationSource && CancellationSource.isSignalled(this.cancellationSource.token)) { - return; - } this.disconnect = this.worker.connect( this.data.id, this.options?.processMessage ?? this.#defaultProcessMessage.bind(this), this.data.resolve, this.data.reject ); + if (this.cancelled) { + return; + } this.status = WorkItemStatus.Started; const wiPayload: AsyncMessage = { workItemId: this.data.id,