UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

49 lines (48 loc) 2.27 kB
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 {};