openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
83 lines (82 loc) • 3.84 kB
JavaScript
import { c as isRecord } from "../record-coerce-TIsquoVR.mjs";
import { c as withSqlitePostCommitPublications } from "../sqlite-post-commit-DENvzR6w.mjs";
import { s as runSqliteWorkerTransactionSync, t as assertTransactionUsable } from "../sqlite-transaction-DBRLvCDM.mjs";
import { i as sessionChanges } from "../session-row-changes-Dj2yVWo-.mjs";
import { i as getSqliteWorkerStateContext } from "../sqlite-worker-state-context-G3Xbcj1W.mjs";
import { i as getOpenClawAgentDatabaseIfOpen } from "../openclaw-agent-db-DWI9Bgur.mjs";
import { r as BoardValidationError } from "../board-layout-6DyK3jbx.mjs";
import { t as readSessionSourceValidation } from "../session-source-predicate.worker-BPzqDAQ2.mjs";
import { a as putBoardWidgetInDatabase, i as hasBoardSession, l as normalizeBoardWidgetPutParams, n as ensureBoardSchema, r as grantBoardWidgetInDatabase, t as applyBoardOpsToDatabase } from "../sqlite-board-store.kernel-DgDGNaxo.mjs";
//#region src/boards/sqlite-board-store.worker.ts
function bindSqliteWorkerBackend(input, context) {
const database = {
db: context.database,
path: context.databasePath
};
const canonical = input && getOpenClawAgentDatabaseIfOpen({
agentId: input.agentId,
path: context.databasePath,
env: getSqliteWorkerStateContext().environment
});
if (input && (!canonical || canonical.db !== context.database)) throw new Error("Board publication lost its canonical database owner");
const admission = {
...context,
admit(stage) {
const validation = input && canonical && readSessionSourceValidation(canonical, input.sources);
context.admit(stage, validation ? (request, dispatch) => {
if (!isRecord(request.facts)) throw new Error("Board admission omitted its database identity");
dispatch({
...request,
facts: {
...request.facts,
boardSourceValidation: validation
}
});
} : void 0);
if (validation?.refusedSource) throw new Error("Board source refusal was not rejected");
}
};
ensureBoardSchema(database);
let closed = false;
return {
execute(command) {
if (closed) throw new Error("Board publication scope is closed");
const assertSessionCurrent = () => {
if (input && (command.input.sessionKey !== input.sessionKey || !hasBoardSession(database, input.sessionKey, input.expectedSession))) throw new BoardValidationError("invalid_operation", "board session changed; retry");
};
const changes = [];
const unsubscribe = sessionChanges.subscribeFacts((change) => {
if ("sessionKey" in change && change.sessionKey === command.input.sessionKey && change.storePath === database.path) changes.push(change);
});
try {
return {
value: withSqlitePostCommitPublications(database.db, () => runSqliteWorkerTransactionSync(admission, () => {
assertSessionCurrent();
if (command.type === "boards.applyOps") return applyBoardOpsToDatabase(database, command.input.sessionKey, command.input.ops);
if (command.type === "boards.putWidget") return putBoardWidgetInDatabase(database, command.input.sessionKey, normalizeBoardWidgetPutParams(command.input.params, command.input.sessionKey), command.input.viewGeneration);
return grantBoardWidgetInDatabase(database, command.input.sessionKey, command.input.name, command.input.decision, command.input.revision, command.input.instanceId);
}, {
databaseLabel: database.path,
operationLabel: command.type,
withCommit(commit) {
assertSessionCurrent();
return commit();
}
})),
changes
};
} finally {
unsubscribe();
}
},
assertSettled() {
assertTransactionUsable(database.db);
if (database.db.isTransaction) throw new Error("Board publication left an unsettled transaction");
},
close() {
closed = true;
}
};
}
//#endregion
export { bindSqliteWorkerBackend };