From 55c6640ff96629494ab81bb6cc5da3e9c416cae4 Mon Sep 17 00:00:00 2001 From: NeuralFlux <40491005+NeuralFlux@users.noreply.github.com> Date: Tue, 5 Nov 2024 17:35:58 -0500 Subject: [PATCH] fix: remove sync lock and add simultaneous async locks --- src/misc.ts | 42 +++++++++--------------------------------- 1 file changed, 9 insertions(+), 33 deletions(-) diff --git a/src/misc.ts b/src/misc.ts index 29e2290..a318038 100644 --- a/src/misc.ts +++ b/src/misc.ts @@ -1,5 +1,4 @@ import lockfile from "proper-lockfile"; -import { setTimeout as sleep } from "timers/promises"; export function toArray(input: Type | Type[]): Type[] { if (Array.isArray(input)) { @@ -91,50 +90,27 @@ export const LOCKFILE_RETRY_CONFIG = { stale: LOCKFILE_STALENESS["stale"], }; -export async function lockWithActionAsync(filePath: string, action: () => Promise, debug?: (message: string) => void): Promise { +export async function lockWithActionAsync(filePaths: string[], action: () => Promise, debug?: (message: string) => void, lockfileRetryConfig?: any): Promise { if (process.env.NODE_ENV !== "production") { debug(`Development mode: Skipping lockfile ${process.env.NODE_ENV}`); const result = await action(); return result; } - let release; + const releases: (() => void)[] = []; + const retryConfig = lockfileRetryConfig || LOCKFILE_RETRY_CONFIG; try { - release = await lockfile.lock(filePath, LOCKFILE_RETRY_CONFIG); + for (const filePath of filePaths) { + let release = await lockfile.lock(filePath, retryConfig); + releases.push(release); + } const result = await action(); return result; } catch (error) { debug(`Lockfile error: ${error}`); // throw error; } finally { - if (release) release(); - } -} - -export function lockWithActionSync(filePath: string, action: () => T, debug?: (message: string) => void): T { - if (process.env.NODE_ENV !== "production") { - debug(`Development mode: Skipping lockfile ${process.env.NODE_ENV}`); - return action(); - } - - let release; - try { - const startTime = Date.now(); - - while (Date.now() - startTime < LOCKFILE_STALENESS["stale"]) { - if (!lockfile.checkSync(filePath)) { - release = lockfile.lockSync(filePath, LOCKFILE_STALENESS); - const result = action(); - return result; - } else { - sleep(LOCKFILE_RETRY_CONFIG["retries"]["minTimeout"]); - } - } - debug("Lockfile timeout: did not read file"); - } catch (error) { - debug(`Lockfile error: ${error}`); - // throw error; - } finally { - if (release) release(); + for (const release of releases) + if (release) release(); } }