UNPKG

@metamask/ocap-kernel

Version:
1 lines 4.31 kB
{"version":3,"file":"meter-control.cjs","sourceRoot":"","sources":["../../src/services/meter-control.ts"],"names":[],"mappings":";;AAUA,sDAgGC;AAzGD,yCAAsC;AAEtC;;;;;;GAMG;AACH,SAAgB,qBAAqB;IACnC,oCAAoC;IACpC,IAAI,gBAAgB,GAAG,CAAC,CAAC;IAEzB;;;;OAIG;IACH,SAAS,kBAAkB;QACzB,OAAO,gBAAgB,GAAG,CAAC,CAAC;IAC9B,CAAC;IAED;;;;OAIG;IACH,SAAS,eAAe,CAAC,OAAe;QACtC,IAAA,eAAM,EAAC,gBAAgB,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;IAC1C,CAAC;IAED;;;;OAIG;IACH,SAAS,gBAAgB,CAAC,OAAe;QACvC,IAAA,eAAM,EAAC,gBAAgB,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IACxC,CAAC;IAED;;;;;OAKG;IACH,SAAS,kBAAkB,CAAC,KAAoB;QAC9C,gBAAgB,IAAI,CAAC,CAAC;QACtB,IAAI,CAAC;YACH,OAAO,KAAK,EAAE,CAAC;QACjB,CAAC;gBAAS,CAAC;YACT,gBAAgB,IAAI,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,KAAK,UAAU,uBAAuB,CACpC,KAAoB;QAEpB,gBAAgB,IAAI,CAAC,CAAC;QACtB,OAAO,OAAO,CAAC,OAAO,EAAE;aACrB,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC;aACnB,OAAO,CAAC,GAAG,EAAE;YACZ,gBAAgB,IAAI,CAAC,CAAC;QACxB,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;;;;;;;OAQG;IACH,SAAS,SAAS,CAChB,IAAqC;QAErC;;;;;WAKG;QACH,SAAS,OAAO,CAAC,GAAG,IAAe;YACjC,OAAO,kBAAkB,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;QACjD,CAAC;QACD,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC;IACzB,CAAC;IAED,MAAM,YAAY,GAAG;QACnB,kBAAkB;QAClB,eAAe;QACf,gBAAgB;QAChB,kBAAkB;QAClB,uBAAuB;QACvB,SAAS;KACV,CAAC;IACF,OAAO,MAAM,CAAC,YAAY,CAAC,CAAC;AAC9B,CAAC","sourcesContent":["import type { MeterControl } from '@agoric/swingset-liveslots';\nimport { assert } from '@endo/errors';\n\n/**\n * Liveslots must be given a MeterControl object so it can turn metering on and\n * off in metered execution environments. We have no metering, so this produces\n * an object that obeys the MeterControl API but doesn't actually do anything.\n *\n * @returns a dummy MeterControl object.\n */\nexport function makeDummyMeterControl(): MeterControl {\n /** Depth of metering disablement */\n let meteringDisabled = 0;\n\n /**\n * Test if metering is disabled.\n *\n * @returns true iff metering is currently off.\n */\n function isMeteringDisabled(): boolean {\n return meteringDisabled > 0;\n }\n\n /**\n * Require metering to be on.\n *\n * @param message - Error message to throw if metering is off.\n */\n function assertIsMetered(message: string): void {\n assert(meteringDisabled === 0, message);\n }\n\n /**\n * Require metering to be off.\n *\n * @param message - Error message to throw if metering is on.\n */\n function assertNotMetered(message: string): void {\n assert(meteringDisabled > 0, message);\n }\n\n /**\n * Execute a thunk with metering off.\n *\n * @param thunk - The thunk to execute.\n * @returns whatever `thunk` returns.\n */\n function runWithoutMetering(thunk: () => unknown): unknown {\n meteringDisabled += 1;\n try {\n return thunk();\n } finally {\n meteringDisabled -= 1;\n }\n }\n\n /**\n * Execute an aynchronous thunk with metering off.\n *\n * @param thunk - The thunk to execute.\n * @returns a promise for whatever `thunk` returns.\n */\n async function runWithoutMeteringAsync(\n thunk: () => unknown,\n ): Promise<unknown> {\n meteringDisabled += 1;\n return Promise.resolve()\n .then(() => thunk())\n .finally(() => {\n meteringDisabled -= 1;\n });\n }\n\n /**\n * Return a version of func that runs outside metering. Since we have no\n * metering, everything actually runs outside metering, so func itself would\n * do, but we need to wrap it anyway to account for the nesting depth of\n * metering disablement.\n *\n * @param func - The function to wrap.\n * @returns A version of `func` that runs without being metered.\n */\n function unmetered(\n func: (...args: unknown[]) => unknown,\n ): (...args: unknown[]) => unknown {\n /**\n * A version of `func` with `runWithoutMetering` wrapped around it.\n *\n * @param args - The args to `func`.\n * @returns whatever `func` returns.\n */\n function wrapped(...args: unknown[]): unknown {\n return runWithoutMetering(() => func(...args));\n }\n return harden(wrapped);\n }\n\n const meterControl = {\n isMeteringDisabled,\n assertIsMetered,\n assertNotMetered,\n runWithoutMetering,\n runWithoutMeteringAsync,\n unmetered,\n };\n return harden(meterControl);\n}\n"]}