@metamask/ocap-kernel
Version:
OCap kernel core components
76 lines • 2.22 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.getCrankMethods = getCrankMethods;
const errors_1 = require("@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
function getCrankMethods(ctx, kdb) {
/**
* Start a crank.
*/
function startCrank() {
!ctx.inCrank || (0, errors_1.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 || (0, errors_1.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 || (0, errors_1.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;
}
}
(0, errors_1.Fail) `no such savepoint as "${(0, errors_1.q)(savepoint)}"`;
}
/**
* End a crank.
*/
function endCrank() {
ctx.inCrank || (0, errors_1.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.cjs.map