From f414853d70b79db71c0e1bdae85cb316de5f9bbc Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Sun, 14 Dec 2025 04:41:14 +0000 Subject: [PATCH] fix(config): tolerate session store races --- src/config/sessions.ts | 33 +++++++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/src/config/sessions.ts b/src/config/sessions.ts index 31ae326bb..6acb6e7aa 100644 --- a/src/config/sessions.ts +++ b/src/config/sessions.ts @@ -62,9 +62,38 @@ export async function saveSessionStore( store: Record, ) { await fs.promises.mkdir(path.dirname(storePath), { recursive: true }); + const json = JSON.stringify(store, null, 2); const tmp = `${storePath}.${process.pid}.${crypto.randomUUID()}.tmp`; - await fs.promises.writeFile(tmp, JSON.stringify(store, null, 2), "utf-8"); - await fs.promises.rename(tmp, storePath); + try { + await fs.promises.writeFile(tmp, json, "utf-8"); + await fs.promises.rename(tmp, storePath); + } catch (err) { + const code = + err && typeof err === "object" && "code" in err + ? String((err as { code?: unknown }).code) + : null; + + if (code === "ENOENT") { + // In tests the temp session-store directory may be deleted while writes are in-flight. + // Best-effort: try a direct write (recreating the parent dir), otherwise ignore. + try { + await fs.promises.mkdir(path.dirname(storePath), { recursive: true }); + await fs.promises.writeFile(storePath, json, "utf-8"); + } catch (err2) { + const code2 = + err2 && typeof err2 === "object" && "code" in err2 + ? String((err2 as { code?: unknown }).code) + : null; + if (code2 === "ENOENT") return; + throw err2; + } + return; + } + + throw err; + } finally { + await fs.promises.rm(tmp, { force: true }); + } } export async function updateLastRoute(params: {