openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
50 lines (49 loc) • 2.69 kB
JavaScript
import { a as getNodeSqliteKysely, i as executeSqliteQueryTakeFirstSync, r as executeSqliteQuerySync } from "./kysely-sync-COmh4HWh.js";
//#region src/state/openclaw-state-lease-heartbeat-shared.ts
const leaseHeartbeatState = {
status: 0,
request: 1,
ack: 2,
starting: 0n,
ready: 1n,
closed: 2n,
lost: 3n
};
//#endregion
//#region src/state/openclaw-state-lease-store.ts
/** The caller owns the write transaction; only absent or expired leases can be acquired. */
function acquireOpenClawStateLeaseInTransaction(db, identity, leaseMs) {
const now = Date.now();
const kysely = getNodeSqliteKysely(db);
executeSqliteQuerySync(db, kysely.deleteFrom("state_leases").where("scope", "=", identity.scope).where("lease_key", "=", identity.key).where("expires_at", "<=", now));
const expiresAt = now + leaseMs;
return executeSqliteQuerySync(db, kysely.insertInto("state_leases").values({
scope: identity.scope,
lease_key: identity.key,
owner: identity.owner,
expires_at: expiresAt,
heartbeat_at: now,
payload_json: null,
created_at: now,
updated_at: now
}).onConflict((conflict) => conflict.columns(["scope", "lease_key"]).doNothing())).numAffectedRows === 1n ? expiresAt : void 0;
}
function readOpenClawStateLeaseExpiry(db, identity) {
return executeSqliteQueryTakeFirstSync(db, getNodeSqliteKysely(db).selectFrom("state_leases").select("expires_at").where("scope", "=", identity.scope).where("lease_key", "=", identity.key).where("owner", "=", identity.owner).where("expires_at", ">", Date.now()).$narrowType())?.expires_at;
}
/** The caller owns the write transaction; expired or replaced owners cannot renew. */
function renewOpenClawStateLeaseInTransaction(db, identity, leaseMs) {
const now = Date.now();
const expiresAt = now + leaseMs;
return executeSqliteQuerySync(db, getNodeSqliteKysely(db).updateTable("state_leases").set({
expires_at: expiresAt,
heartbeat_at: now,
updated_at: now
}).where("scope", "=", identity.scope).where("lease_key", "=", identity.key).where("owner", "=", identity.owner).where("expires_at", ">", now)).numAffectedRows === 1n ? expiresAt : void 0;
}
/** The caller owns the write transaction; a replaced owner cannot release its successor. */
function releaseOpenClawStateLeaseInTransaction(db, identity) {
executeSqliteQuerySync(db, getNodeSqliteKysely(db).deleteFrom("state_leases").where("scope", "=", identity.scope).where("lease_key", "=", identity.key).where("owner", "=", identity.owner));
}
//#endregion
export { leaseHeartbeatState as a, renewOpenClawStateLeaseInTransaction as i, readOpenClawStateLeaseExpiry as n, releaseOpenClawStateLeaseInTransaction as r, acquireOpenClawStateLeaseInTransaction as t };