openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
49 lines (48 loc) • 2.27 kB
JavaScript
import { c as isSqliteLockError, p as runWithSqliteBusyTimeout, t as openNodeSqliteDatabase, u as runSqliteImmediateTransactionSync } from "../node-sqlite-BpQX3W0e.js";
import { a as leaseHeartbeatState, i as renewOpenClawStateLeaseInTransaction, n as readOpenClawStateLeaseExpiry } from "../openclaw-state-lease-store-jGIk9tQ0.js";
import { parentPort, workerData } from "node:worker_threads";
//#region src/state/openclaw-state-lease-heartbeat.worker.ts
const params = workerData;
const shared = new BigInt64Array(params.shared);
const db = openNodeSqliteDatabase(params.path);
let heartbeat;
const lose = () => {
Atomics.compareExchange(shared, leaseHeartbeatState.status, leaseHeartbeatState.starting, leaseHeartbeatState.lost);
Atomics.compareExchange(shared, leaseHeartbeatState.status, leaseHeartbeatState.ready, leaseHeartbeatState.lost);
Atomics.notify(shared, leaseHeartbeatState.ack);
clearTimeout(heartbeat);
db.close();
parentPort?.close();
};
const renew = () => {
if (Atomics.load(shared, leaseHeartbeatState.status) >= leaseHeartbeatState.closed) return;
let expiresAt;
try {
expiresAt = runWithSqliteBusyTimeout(db, 0, () => runSqliteImmediateTransactionSync(db, () => {
if (Atomics.load(shared, leaseHeartbeatState.status) >= leaseHeartbeatState.closed) return;
return renewOpenClawStateLeaseInTransaction(db, params.identity, params.leaseMs);
}, { logger: { warn() {} } }), { lockFailureReporting: "suppress" });
} catch (error) {
if (!isSqliteLockError(error)) {
lose();
return;
}
expiresAt = readOpenClawStateLeaseExpiry(db, params.identity);
}
if (expiresAt === void 0) {
lose();
return;
}
heartbeat = setTimeout(renew, Math.max(1, Math.min(params.heartbeatMs, expiresAt - Date.now())));
};
renew();
if (Atomics.compareExchange(shared, leaseHeartbeatState.status, leaseHeartbeatState.starting, leaseHeartbeatState.ready) === leaseHeartbeatState.starting) {
parentPort?.on("message", () => {
if (Atomics.load(shared, leaseHeartbeatState.status) !== leaseHeartbeatState.ready) return;
Atomics.store(shared, leaseHeartbeatState.ack, Atomics.load(shared, leaseHeartbeatState.request));
Atomics.notify(shared, leaseHeartbeatState.ack);
});
parentPort?.postMessage(null, []);
}
//#endregion
export {};