UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

68 lines (67 loc) 2.46 kB
import { u as toStringifiedError } from "./error-coercion-D_-xJ90S.js"; import { I as sameFileIdentity } from "./fs-safe-B6pvPGnf.js"; import { t as resolveRuntimeProcessEntrypointUrl } from "./runtime-worker-url-CpdriB1D.js"; import fs from "node:fs"; import { Worker } from "node:worker_threads"; //#region src/infra/sqlite-integrity-worker.ts function readSqliteIntegrityFileIdentity(pathname, expected) { const current = fs.statSync(pathname, { bigint: true }); if (!current.isFile() || expected && !sameFileIdentity(expected, current)) throw new Error(`SQLite source changed during integrity admission: ${pathname}`); return { dev: current.dev, ino: current.ino }; } /** The caller retains its canonical runtime lease until the read-only Worker exits. */ function assertSqliteIntegrityInWorker(pathname, busyTimeoutMs, signal) { signal.throwIfAborted(); const identity = readSqliteIntegrityFileIdentity(pathname); const entry = resolveRuntimeProcessEntrypointUrl("sqliteIntegrity"); const worker = new Worker(entry, { workerData: { pathname, identity, busyTimeoutMs }, execArgv: entry.pathname.endsWith(".ts") ? ["--import", "tsx"] : void 0 }); return new Promise((resolve, reject) => { let result; let failure; const abort = () => { worker.terminate().catch((error) => { failure = toStringifiedError(error); }); }; signal.addEventListener("abort", abort, { once: true }); worker.on("message", (message) => { result = message; }); worker.on("error", (error) => { failure = toStringifiedError(error); }); worker.once("exit", (code) => { signal.removeEventListener("abort", abort); try { signal.throwIfAborted(); if (failure) throw failure; if (code !== 0 || !result) throw new Error(`SQLite integrity worker exited ${code} without a completed check`); readSqliteIntegrityFileIdentity(pathname, identity); if (!result.ok) { const cause = result.error.cause ? Object.assign(new Error(result.error.cause.message), result.error.cause) : void 0; throw Object.assign(new Error(result.error.message, cause ? { cause } : void 0), { name: result.error.name, code: result.error.code, errcode: result.error.errcode }); } resolve(); } catch (error) { reject(toStringifiedError(error)); } }); if (signal.aborted) abort(); }); } //#endregion export { readSqliteIntegrityFileIdentity as n, assertSqliteIntegrityInWorker as t };