From 2efef797a2e6b70566af773edf3e0c1fa3a913a9 Mon Sep 17 00:00:00 2001 From: eligrey <~@eligrey.com> Date: Fri, 4 Nov 2022 10:05:20 -0700 Subject: [PATCH 1/2] Improve penumbra worker init reliability This PR prevents `getFreeWorker()` from setting `busy = true` whenever no workers are available and also fixes setWorkerLocation() when called post-init to correctly re-init worker threads. --- demo/demo.js | 1 + package.json | 2 +- src/workers.ts | 19 ++++++------------- 3 files changed, 8 insertions(+), 14 deletions(-) diff --git a/demo/demo.js b/demo/demo.js index 8aa65269..f472757c 100644 --- a/demo/demo.js +++ b/demo/demo.js @@ -418,6 +418,7 @@ const onReady = async ( }, )), ); + writer.write( ...(await penumbra.get( { diff --git a/package.json b/package.json index a6627eff..b03bcdb0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@transcend-io/penumbra", - "version": "5.3.2", + "version": "5.3.3", "description": "Crypto streams for the browser.", "main": "dist/main.penumbra.js", "types": "ts-build/src/index.d.ts", diff --git a/src/workers.ts b/src/workers.ts index aa998eb3..c2ed607b 100644 --- a/src/workers.ts +++ b/src/workers.ts @@ -172,7 +172,11 @@ const onWorkerInitQueue: (() => void)[] = []; * @returns Worker */ function getFreeWorker(): PenumbraWorker { - // Poll for any available free workers + if (workers.length === 0) { + throw new Error('No Penumbra workers available.'); + } + + // Poll for any available free workers or create a new one const freeWorker = workers.find(({ busy }) => !busy); // return any free worker or a random one if all are busy @@ -233,21 +237,11 @@ export async function getWorker(): Promise { } return getFreeWorker(); } - -/** - * Returns all active Penumbra Workers - * - * @returns Workers - */ -function getActiveWorkers(): PenumbraWorker[] { - return workers; -} - /** * Terminate Penumbra worker and de-allocate their resources */ function cleanup(): void { - getActiveWorkers().forEach((thread) => { + workers.forEach((thread) => { thread.worker.terminate(); }); workers.length = 0; @@ -285,7 +279,6 @@ export async function setWorkerLocation( if (initialized) { logger.warn('Penumbra Workers are already active. Reinitializing...'); await cleanup(); - return; } settings.workers = JSON.stringify( typeof options === 'string' From e8065a7dd8a35e7a7a1cba86c4477c965eea8642 Mon Sep 17 00:00:00 2001 From: Eli Grey <~@eligrey.com> Date: Sat, 5 Nov 2022 18:03:24 -0700 Subject: [PATCH 2/2] Apply suggestions from code review --- src/workers.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/workers.ts b/src/workers.ts index c2ed607b..f7296bc0 100644 --- a/src/workers.ts +++ b/src/workers.ts @@ -176,7 +176,7 @@ function getFreeWorker(): PenumbraWorker { throw new Error('No Penumbra workers available.'); } - // Poll for any available free workers or create a new one + // Poll for any available free workers const freeWorker = workers.find(({ busy }) => !busy); // return any free worker or a random one if all are busy