diff --git a/src/agents/session-write-lock.ts b/src/agents/session-write-lock.ts index ca0b0c6f7d2..7ae9ae1c331 100644 --- a/src/agents/session-write-lock.ts +++ b/src/agents/session-write-lock.ts @@ -2,6 +2,7 @@ import fsSync from "node:fs"; import fs from "node:fs/promises"; import path from "node:path"; import { isPidAlive } from "../shared/pid-alive.js"; +import { resolveProcessScopedMap } from "../shared/process-scoped-map.js"; type LockFilePayload = { pid?: number; @@ -49,17 +50,7 @@ type WatchdogState = { timer?: NodeJS.Timeout; }; -function resolveHeldLocks(): Map { - const proc = process as NodeJS.Process & { - [HELD_LOCKS_KEY]?: Map; - }; - if (!proc[HELD_LOCKS_KEY]) { - proc[HELD_LOCKS_KEY] = new Map(); - } - return proc[HELD_LOCKS_KEY]; -} - -const HELD_LOCKS = resolveHeldLocks(); +const HELD_LOCKS = resolveProcessScopedMap(HELD_LOCKS_KEY); function resolveCleanupState(): CleanupState { const proc = process as NodeJS.Process & { diff --git a/src/plugin-sdk/file-lock.ts b/src/plugin-sdk/file-lock.ts index 9bbf2e5b6c9..98277381868 100644 --- a/src/plugin-sdk/file-lock.ts +++ b/src/plugin-sdk/file-lock.ts @@ -1,6 +1,7 @@ import fs from "node:fs/promises"; import path from "node:path"; import { isPidAlive } from "../shared/pid-alive.js"; +import { resolveProcessScopedMap } from "../shared/process-scoped-map.js"; export type FileLockOptions = { retries: { @@ -25,18 +26,7 @@ type HeldLock = { }; const HELD_LOCKS_KEY = Symbol.for("openclaw.fileLockHeldLocks"); - -function resolveHeldLocks(): Map { - const proc = process as NodeJS.Process & { - [HELD_LOCKS_KEY]?: Map; - }; - if (!proc[HELD_LOCKS_KEY]) { - proc[HELD_LOCKS_KEY] = new Map(); - } - return proc[HELD_LOCKS_KEY]; -} - -const HELD_LOCKS = resolveHeldLocks(); +const HELD_LOCKS = resolveProcessScopedMap(HELD_LOCKS_KEY); function computeDelayMs(retries: FileLockOptions["retries"], attempt: number): number { const base = Math.min( diff --git a/src/shared/process-scoped-map.ts b/src/shared/process-scoped-map.ts new file mode 100644 index 00000000000..8235ba66a10 --- /dev/null +++ b/src/shared/process-scoped-map.ts @@ -0,0 +1,12 @@ +export function resolveProcessScopedMap(key: symbol): Map { + const proc = process as NodeJS.Process & { + [symbolKey: symbol]: Map | undefined; + }; + const existing = proc[key]; + if (existing) { + return existing; + } + const created = new Map(); + proc[key] = created; + return created; +}