openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
23 lines (22 loc) • 1.29 kB
JavaScript
import { i as executeSqliteQuerySync } from "./kysely-sync-DUWzQvCU.mjs";
import { h as required } from "./placement-record-BZ5ExJ2S.mjs";
import { a as query, b as publishPlacementTurnClaimCleared, d as turnClaimValues } from "./placement-row-codec-Cpn-JKmv.mjs";
//#region src/gateway/worker-environments/placement-retirement.ts
const RETIRABLE_PLACEMENT_STATES = [
"local",
"requested",
"reclaimed",
"failed"
];
function retireWorkerSessionPlacement(db, input, options = {}) {
const sessionId = required(input.sessionId, "session id");
if (!RETIRABLE_PLACEMENT_STATES.some((state) => state === input.expectedState)) throw new Error(`Cannot retire worker session placement from ${input.expectedState}`);
if (executeSqliteQuerySync(db, query(db).deleteFrom("worker_session_placements").where("session_id", "=", sessionId).where("state", "=", input.expectedState).where("transition_generation", "=", input.expectedGeneration).where((eb) => eb.and(turnClaimValues(null)))).numAffectedRows !== 1n) {
if (options.onlyIfCurrent) return false;
throw new Error(`Worker session placement ${sessionId} changed before retirement`);
}
publishPlacementTurnClaimCleared(db, sessionId, input.expectedState, true);
return true;
}
//#endregion
export { retireWorkerSessionPlacement as t };