@metamask/ocap-kernel
Version:
OCap kernel core components
1 lines • 4.4 kB
Source Map (JSON)
{"version":3,"file":"crank.mjs","sourceRoot":"","sources":["../../../src/store/methods/crank.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,qBAAqB;AACvC,OAAO,EAAE,cAAc,EAAE,0BAA0B;AAKnD;;;;;;GAMG;AACH,4EAA4E;AAC5E,MAAM,UAAU,eAAe,CAAC,GAAiB,EAAE,GAAmB;IACpE;;OAEG;IACH,SAAS,UAAU;QACjB,CAAC,GAAG,CAAC,OAAO,IAAI,IAAI,CAAA,qCAAqC,CAAC;QAC1D,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC;QACnB,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,cAAc,EAAQ,CAAC;QACpD,GAAG,CAAC,YAAY,GAAG,OAAO,CAAC;QAC3B,GAAG,CAAC,YAAY,GAAG,OAAO,CAAC;IAC7B,CAAC;IAED;;;;OAIG;IACH,SAAS,oBAAoB,CAAC,IAAY;QACxC,GAAG,CAAC,OAAO,IAAI,IAAI,CAAA,uCAAuC,CAAC;QAC3D,MAAM,OAAO,GAAG,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC;QACtC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,GAAG,CAAC,eAAe,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC;IACrC,CAAC;IAED;;;;OAIG;IACH,SAAS,aAAa,CAAC,SAAiB;QACtC,GAAG,CAAC,OAAO,IAAI,IAAI,CAAA,gCAAgC,CAAC;QACpD,KAAK,MAAM,OAAO,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC;YAC5C,IAAI,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,SAAS,EAAE,CAAC;gBAC1C,GAAG,CAAC,iBAAiB,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC;gBACrC,GAAG,CAAC,UAAU,CAAC,MAAM,GAAG,OAAO,CAAC;gBAChC,OAAO;YACT,CAAC;QACH,CAAC;QACD,IAAI,CAAA,yBAAyB,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC;IAC/C,CAAC;IAED;;OAEG;IACH,SAAS,oBAAoB;QAC3B,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,GAAG,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;YAC3B,GAAG,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IAED;;OAEG;IACH,SAAS,QAAQ;QACf,GAAG,CAAC,OAAO,IAAI,IAAI,CAAA,2BAA2B,CAAC;QAC/C,oBAAoB,EAAE,CAAC;QACvB,GAAG,CAAC,OAAO,GAAG,KAAK,CAAC;QACpB,GAAG,CAAC,YAAY,EAAE,EAAE,CAAC;QACrB,GAAG,CAAC,YAAY,GAAG,SAAS,CAAC;IAC/B,CAAC;IAED;;;;OAIG;IACH,KAAK,UAAU,YAAY;QACzB,OAAO,GAAG,CAAC,OAAO;YAChB,CAAC,CAAC,CAAC,GAAG,CAAC,YAAY,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACzC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;IACxB,CAAC;IAED,OAAO;QACL,UAAU;QACV,oBAAoB;QACpB,aAAa;QACb,QAAQ;QACR,oBAAoB;QACpB,YAAY;KACb,CAAC;AACJ,CAAC","sourcesContent":["import { Fail, q } from '@endo/errors';\nimport { makePromiseKit } from '@endo/promise-kit';\nimport type { KernelDatabase } from '@metamask/kernel-store';\n\nimport type { StoreContext } from '../types.ts';\n\n/**\n * Get the crank methods.\n *\n * @param ctx - The store context.\n * @param kdb - The kernel database.\n * @returns The crank methods.\n */\n// eslint-disable-next-line @typescript-eslint/explicit-function-return-type\nexport function getCrankMethods(ctx: StoreContext, kdb: KernelDatabase) {\n /**\n * Start a crank.\n */\n function startCrank(): void {\n !ctx.inCrank || Fail`startCrank while already in a crank`;\n ctx.inCrank = true;\n const { promise, resolve } = makePromiseKit<void>();\n ctx.crankSettled = promise;\n ctx.resolveCrank = resolve;\n }\n\n /**\n * Create a savepoint in the crank.\n *\n * @param name - The savepoint name.\n */\n function createCrankSavepoint(name: string): void {\n ctx.inCrank || Fail`createCrankSavepoint outside of crank`;\n const ordinal = ctx.savepoints.length;\n ctx.savepoints.push(name);\n kdb.createSavepoint(`t${ordinal}`);\n }\n\n /**\n * Rollback a crank.\n *\n * @param savepoint - The savepoint name.\n */\n function rollbackCrank(savepoint: string): void {\n ctx.inCrank || Fail`rollbackCrank outside of crank`;\n for (const ordinal of ctx.savepoints.keys()) {\n if (ctx.savepoints[ordinal] === savepoint) {\n kdb.rollbackSavepoint(`t${ordinal}`);\n ctx.savepoints.length = ordinal;\n return;\n }\n }\n Fail`no such savepoint as \"${q(savepoint)}\"`;\n }\n\n /**\n * Release all savepoints.\n */\n function releaseAllSavepoints(): void {\n if (ctx.savepoints.length > 0) {\n kdb.releaseSavepoint('t0');\n ctx.savepoints.length = 0;\n }\n }\n\n /**\n * End a crank.\n */\n function endCrank(): void {\n ctx.inCrank || Fail`endCrank outside of crank`;\n releaseAllSavepoints();\n ctx.inCrank = false;\n ctx.resolveCrank?.();\n ctx.resolveCrank = undefined;\n }\n\n /**\n * Wait until the crank is finished.\n *\n * @returns A promise that resolves when the crank is finished.\n */\n async function waitForCrank(): Promise<void> {\n return ctx.inCrank\n ? (ctx.crankSettled ?? Promise.resolve())\n : Promise.resolve();\n }\n\n return {\n startCrank,\n createCrankSavepoint,\n rollbackCrank,\n endCrank,\n releaseAllSavepoints,\n waitForCrank,\n };\n}\n"]}