@metamask/ocap-kernel
Version:
OCap kernel core components
73 lines • 2.02 kB
JavaScript
import { Fail, q } from "@endo/errors";
/**
* Get the crank methods.
*
* @param ctx - The store context.
* @param kdb - The kernel database.
* @returns The crank methods.
*/
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
export function getCrankMethods(ctx, kdb) {
/**
* Start a crank.
*/
function startCrank() {
!ctx.inCrank || Fail `startCrank while already in a crank`;
ctx.inCrank = true;
}
/**
* Create a savepoint in the crank.
*
* @param name - The savepoint name.
*/
function createCrankSavepoint(name) {
ctx.inCrank || Fail `createCrankSavepoint outside of crank`;
const ordinal = ctx.savepoints.length;
ctx.savepoints.push(name);
kdb.createSavepoint(`t${ordinal}`);
}
/**
* Rollback a crank.
*
* @param savepoint - The savepoint name.
*/
function rollbackCrank(savepoint) {
ctx.inCrank || Fail `rollbackCrank outside of crank`;
for (const ordinal of ctx.savepoints.keys()) {
if (ctx.savepoints[ordinal] === savepoint) {
kdb.rollbackSavepoint(`t${ordinal}`);
ctx.savepoints.length = ordinal;
return;
}
}
Fail `no such savepoint as "${q(savepoint)}"`;
}
/**
* End a crank.
*/
function endCrank() {
ctx.inCrank || Fail `endCrank outside of crank`;
if (ctx.savepoints.length > 0) {
kdb.releaseSavepoint('t0');
ctx.savepoints.length = 0;
}
ctx.inCrank = false;
}
/**
* Release all savepoints.
*/
function releaseAllSavepoints() {
if (ctx.savepoints.length > 0) {
kdb.releaseSavepoint('t0');
ctx.savepoints.length = 0;
}
}
return {
startCrank,
createCrankSavepoint,
rollbackCrank,
endCrank,
releaseAllSavepoints,
};
}
//# sourceMappingURL=crank.mjs.map