UNPKG

@metamask/ocap-kernel

Version:
1 lines 4.79 kB
{"version":3,"file":"reachable.mjs","sourceRoot":"","sources":["../../../src/store/methods/reachable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,mBAAkB;AAC3C,OAAO,EAAE,gBAAgB,EAAE,qBAAoB;AAC/C,OAAO,EAAE,kBAAkB,EAAE,uBAAsB;AAGnD,OAAO,EAAE,QAAQ,EAAE,+BAA8B;AACjD,OAAO,EACL,wBAAwB,EACxB,wBAAwB,EACzB,+BAA8B;AAE/B;;;;;GAKG;AACH,4EAA4E;AAC5E,MAAM,UAAU,mBAAmB,CAAC,GAAiB;IACnD,MAAM,EAAE,UAAU,EAAE,GAAG,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC9C,MAAM,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;IACvE,MAAM,EAAE,eAAe,EAAE,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;IAEpD;;;;;;OAMG;IACH,SAAS,gBAAgB,CAAC,UAAsB,EAAE,IAAU;QAC1D,MAAM,GAAG,GAAG,UAAU,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QACzC,MAAM,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACrC,MAAM,EAAE,WAAW,EAAE,GAAG,wBAAwB,CAAC,IAAI,CAAC,CAAC;QACvD,OAAO,WAAW,CAAC;IACrB,CAAC;IAED;;;;;;OAMG;IACH,SAAS,sBAAsB,CAC7B,UAAsB,EACtB,IAAU;QAKV,MAAM,GAAG,GAAG,UAAU,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QACzC,MAAM,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACrC,OAAO,wBAAwB,CAAC,IAAI,CAAC,CAAC;IACxC,CAAC;IAED;;;;;OAKG;IACH,SAAS,kBAAkB,CAAC,UAAsB,EAAE,IAAU;QAC5D,MAAM,GAAG,GAAG,UAAU,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QACzC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,sBAAsB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAC1E,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,wBAAwB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;QAC1D,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;QACnD,sEAAsE;QACtE,IACE,WAAW;YACX,CAAC,SAAS;YACV,SAAS,KAAK,QAAQ;YACtB,eAAe,CAAC,IAAI,CAAC,EACrB,CAAC;YACD,MAAM,MAAM,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;YACvC,MAAM,CAAC,SAAS,IAAI,CAAC,CAAC;YACtB,iBAAiB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YAChC,IAAI,MAAM,CAAC,SAAS,KAAK,CAAC,EAAE,CAAC;gBAC3B,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,gBAAgB;QAChB,sBAAsB;QACtB,kBAAkB;KACnB,CAAC;AACJ,CAAC","sourcesContent":["import { getBaseMethods } from './base.ts';\nimport { getObjectMethods } from './object.ts';\nimport { getRefCountMethods } from './refcount.ts';\nimport type { EndpointId, KRef } from '../../types.ts';\nimport type { StoreContext } from '../types.ts';\nimport { parseRef } from '../utils/parse-ref.ts';\nimport {\n parseReachableAndVatSlot,\n buildReachableAndVatSlot,\n} from '../utils/reachable.ts';\n\n/**\n * Get the reachable methods that provide functionality for managing reachable flags.\n *\n * @param ctx - The store context.\n * @returns The reachable methods.\n */\n// eslint-disable-next-line @typescript-eslint/explicit-function-return-type\nexport function getReachableMethods(ctx: StoreContext) {\n const { getSlotKey } = getBaseMethods(ctx.kv);\n const { getObjectRefCount, setObjectRefCount } = getObjectMethods(ctx);\n const { kernelRefExists } = getRefCountMethods(ctx);\n\n /**\n * Check if a kernel object is reachable.\n *\n * @param endpointId - The endpoint for which the reachable flag is being checked.\n * @param kref - The kref.\n * @returns True if the kernel object is reachable, false otherwise.\n */\n function getReachableFlag(endpointId: EndpointId, kref: KRef): boolean {\n const key = getSlotKey(endpointId, kref);\n const data = ctx.kv.getRequired(key);\n const { isReachable } = parseReachableAndVatSlot(data);\n return isReachable;\n }\n\n /**\n * Get the reachable and vat slot for a given vat and kernel slot.\n *\n * @param endpointId - The vat ID.\n * @param kref - The kernel slot.\n * @returns The reachable and vat slot.\n */\n function getReachableAndVatSlot(\n endpointId: EndpointId,\n kref: KRef,\n ): {\n isReachable: boolean;\n vatSlot: string;\n } {\n const key = getSlotKey(endpointId, kref);\n const data = ctx.kv.getRequired(key);\n return parseReachableAndVatSlot(data);\n }\n\n /**\n * Clear the reachable flag for a given endpoint and kref.\n *\n * @param endpointId - The endpoint for which the reachable flag is being cleared.\n * @param kref - The kref.\n */\n function clearReachableFlag(endpointId: EndpointId, kref: KRef): void {\n const key = getSlotKey(endpointId, kref);\n const { isReachable, vatSlot } = getReachableAndVatSlot(endpointId, kref);\n ctx.kv.set(key, buildReachableAndVatSlot(false, vatSlot));\n const { direction, isPromise } = parseRef(vatSlot);\n // decrement 'reachable' part of refcount, but only for object imports\n if (\n isReachable &&\n !isPromise &&\n direction === 'import' &&\n kernelRefExists(kref)\n ) {\n const counts = getObjectRefCount(kref);\n counts.reachable -= 1;\n setObjectRefCount(kref, counts);\n if (counts.reachable === 0) {\n ctx.maybeFreeKrefs.add(kref);\n }\n }\n }\n\n return {\n getReachableFlag,\n getReachableAndVatSlot,\n clearReachableFlag,\n };\n}\n"]}