openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
68 lines (67 loc) • 2.46 kB
JavaScript
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 };