openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
82 lines (81 loc) • 2.54 kB
JavaScript
import { f as toStringifiedError } from "../error-coercion-W9BtigRm.mjs";
import { r as openNodeSqliteDatabase } from "../node-sqlite-DyeJqxPf.mjs";
import { i as setSqliteBusyTimeout } from "../sqlite-busy-timeout-D3v1uB5d.mjs";
import { n as readSqliteIntegrityFileIdentity } from "../sqlite-file-generation-HEkrmgCv.mjs";
import { n as assertSqliteIntegrity } from "../sqlite-integrity-D3yHPOet.mjs";
import { n as serializeNativeErrorResponse } from "../native-error-response-7Uj9hPFb.mjs";
import { t as configureSqliteMaintenanceCache } from "../sqlite-maintenance-cache-AYpxl8JZ.mjs";
import { performance } from "node:perf_hooks";
import { on } from "node:events";
//#region src/infra/sqlite-integrity.worker.ts
if (!process.send || !process.disconnect) throw new Error("SQLite integrity child requires parent IPC.");
const sendMessage = process.send.bind(process);
const disconnect = process.disconnect.bind(process);
function send(message) {
return new Promise((resolve, reject) => {
sendMessage(message, (error) => {
if (error) reject(error);
else resolve();
});
});
}
function sendPhase(phase) {
return send({
type: "phase",
phase
});
}
async function check(input) {
let database;
let failure;
let checkElapsedMs;
try {
await sendPhase("opening");
readSqliteIntegrityFileIdentity(input.pathname, input.identity);
database = openNodeSqliteDatabase(input.pathname, { readOnly: true });
setSqliteBusyTimeout(database, input.busyTimeoutMs);
configureSqliteMaintenanceCache(database);
readSqliteIntegrityFileIdentity(input.pathname, input.identity);
await sendPhase("checking");
const startedAt = performance.now();
try {
assertSqliteIntegrity(database, input.databaseLabel);
} finally {
checkElapsedMs = performance.now() - startedAt;
}
} catch (error) {
failure = toStringifiedError(error);
} finally {
if (database) try {
await sendPhase("closing");
} catch (error) {
failure ??= toStringifiedError(error);
}
try {
database?.close();
} catch (error) {
failure = toStringifiedError(error);
}
}
let result = { ok: true };
if (failure) result = {
ok: false,
error: serializeNativeErrorResponse(failure)
};
if (checkElapsedMs !== void 0) result.checkElapsedMs = checkElapsedMs;
return result;
}
for await (const [input] of on(process, "message")) {
if ("type" in input) {
disconnect();
break;
}
const result = await check(input);
await send(result);
if (!input.reuse || !result.ok) {
disconnect();
break;
}
}
//#endregion
export {};