UNPKG

@metamask/ocap-kernel

Version:
1 lines 4.47 kB
{"version":3,"file":"vat-kv-store.cjs","sourceRoot":"","sources":["../../src/store/vat-kv-store.ts"],"names":[],"mappings":";;AAaA,wCAiEC;AA3ED,2DAAmD;AAEnD;;;;;;;GAOG;AACH,SAAgB,cAAc,CAAC,KAA0B;IACvD,MAAM,IAAI,GAAwB,IAAI,GAAG,EAAE,CAAC;IAC5C,MAAM,OAAO,GAAgB,IAAI,GAAG,EAAE,CAAC;IACvC,IAAI,QAAQ,GAAoB,IAAI,CAAC;IACrC,IAAI,WAAW,GAAkB,IAAI,CAAC;IACtC,IAAI,gBAAgB,GAAW,CAAC,CAAC,CAAC;IAElC,OAAO;QACL,GAAG,CAAC,GAAW;YACb,OAAO,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACxB,CAAC;QACD,WAAW,CAAC,GAAW;YACrB,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC9B,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO,MAAM,CAAC;YAChB,CAAC;YACD,MAAM,KAAK,CAAC,0BAA0B,GAAG,GAAG,CAAC,CAAC;QAChD,CAAC;QACD,UAAU,CAAC,GAAW;YACpB,QAAQ,KAAR,QAAQ,GAAK,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAC;YAC7C,MAAM,KAAK,GACT,WAAW,KAAK,GAAG,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAA,yBAAS,EAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;YACpE,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;gBACd,WAAW,GAAG,IAAI,CAAC;gBACnB,gBAAgB,GAAG,CAAC,CAAC,CAAC;gBACtB,OAAO,SAAS,CAAC;YACnB,CAAC;YACD,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAW,CAAC;YACxC,IAAI,GAAG,GAAG,WAAW,EAAE,CAAC;gBACtB,gBAAgB,GAAG,KAAK,CAAC;gBACzB,OAAO,WAAW,CAAC;YACrB,CAAC;iBAAM,CAAC;gBACN,IAAI,KAAK,GAAG,CAAC,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;oBACjC,WAAW,GAAG,IAAI,CAAC;oBACnB,gBAAgB,GAAG,CAAC,CAAC,CAAC;oBACtB,OAAO,SAAS,CAAC;gBACnB,CAAC;qBAAM,CAAC;oBACN,WAAW,GAAG,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAW,CAAC;oBAC5C,gBAAgB,GAAG,KAAK,GAAG,CAAC,CAAC;oBAC7B,OAAO,WAAW,CAAC;gBACrB,CAAC;YACH,CAAC;QACH,CAAC;QACD,GAAG,CAAC,GAAW,EAAE,KAAa;YAC5B,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YACtB,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YACrB,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACpB,QAAQ,GAAG,IAAI,CAAC;QAClB,CAAC;QACD,MAAM,CAAC,GAAW;YAChB,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAClB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACjB,QAAQ,GAAG,IAAI,CAAC;QAClB,CAAC;QACD,UAAU;YACR,MAAM,MAAM,GAAkB;gBAC5B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;gBAC1B,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC;aACpB,CAAC;YACF,IAAI,CAAC,KAAK,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,EAAE,CAAC;YAChB,OAAO,MAAM,CAAC;QAChB,CAAC;KACF,CAAC;AACJ,CAAC","sourcesContent":["/* eslint-disable no-lonely-if, no-else-return */\nimport type { VatKVStore, VatCheckpoint } from '@metamask/kernel-store';\n\nimport { keySearch } from '../utils/key-search.ts';\n\n/**\n * Create an in-memory VatKVStore for a vat, backed by a Map and tracking\n * changes so that they can be reported at the end of a crank.\n *\n * @param state - The state to begin with.\n *\n * @returns a VatKVStore wrapped around `state`.\n */\nexport function makeVatKVStore(state: Map<string, string>): VatKVStore {\n const sets: Map<string, string> = new Map();\n const deletes: Set<string> = new Set();\n let keyCache: string[] | null = null;\n let lastNextKey: string | null = null;\n let lastNextKeyIndex: number = -1;\n\n return {\n get(key: string): string | undefined {\n return state.get(key);\n },\n getRequired(key: string): string {\n const result = state.get(key);\n if (result) {\n return result;\n }\n throw Error(`no value matching key '${key}'`);\n },\n getNextKey(key: string): string | undefined {\n keyCache ??= Array.from(state.keys()).sort();\n const index =\n lastNextKey === key ? lastNextKeyIndex : keySearch(keyCache, key);\n if (index < 0) {\n lastNextKey = null;\n lastNextKeyIndex = -1;\n return undefined;\n }\n lastNextKey = keyCache[index] as string;\n if (key < lastNextKey) {\n lastNextKeyIndex = index;\n return lastNextKey;\n } else {\n if (index + 1 >= keyCache.length) {\n lastNextKey = null;\n lastNextKeyIndex = -1;\n return undefined;\n } else {\n lastNextKey = keyCache[index + 1] as string;\n lastNextKeyIndex = index + 1;\n return lastNextKey;\n }\n }\n },\n set(key: string, value: string): void {\n state.set(key, value);\n sets.set(key, value);\n deletes.delete(key);\n keyCache = null;\n },\n delete(key: string): void {\n state.delete(key);\n sets.delete(key);\n deletes.add(key);\n keyCache = null;\n },\n checkpoint(): VatCheckpoint {\n const result: VatCheckpoint = [\n Array.from(sets.entries()),\n Array.from(deletes),\n ];\n sets.clear();\n deletes.clear();\n return result;\n },\n };\n}\n"]}