@metamask/ocap-kernel
Version:
OCap kernel core components
1 lines • 3.56 kB
Source Map (JSON)
{"version":3,"file":"gc-finalize.mjs","sourceRoot":"","sources":["../../src/services/gc-finalize.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,+BAA+B;AAG/C;;;;;GAKG;AACH,KAAK,UAAU,aAAa,CAAC,MAAe;IAC1C,IAAI,OAAO,UAAU,CAAC,EAAE,KAAK,UAAU,EAAE,CAAC;QACxC,OAAO,UAAU,CAAC,EAAE,CAAC;IACvB,CAAC;IAED,4BAA4B;IAC5B,IACE,OAAO,UAAU,KAAK,QAAQ;QAC9B,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,kBAAkB,EACzE,CAAC;QACD,IAAI,CAAC;YACH,mFAAmF;YACnF,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,mBAAkB,CAAC;YACpD,OAAO,QAAQ,CAAC;QAClB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,EAAE,KAAK,CAAC,2CAA2C,EAAE,KAAK,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAe;IAC/C,gCAAgC;IAChC,MAAM,iBAAiB,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IAEhD;;OAEG;IACH,OAAO,KAAK,UAAU,aAAa;QACjC,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,MAAM,iBAAiB,CAAC;YAE3C,IAAI,UAAU,EAAE,CAAC;gBACf,gBAAgB;gBAChB,UAAU,EAAE,CAAC;gBACb,sCAAsC;gBACtC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC;gBACf,4DAA4D;gBAC5D,kCAAkC;gBAClC,UAAU,EAAE,CAAC;gBACb,gDAAgD;gBAChD,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC;YACjB,CAAC;iBAAM,CAAC;gBACN,iEAAiE;gBACjE,MAAM,EAAE,IAAI,CAAC,oDAAoD,CAAC,CAAC;gBACnE,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC;YACjB,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,EAAE,IAAI,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC,CAAC;AACJ,CAAC","sourcesContent":["import { delay } from '@metamask/kernel-utils';\nimport type { Logger } from '@metamask/logger';\n\n/**\n * Try to get a GC function for the current environment\n *\n * @param logger - The logger to use.\n * @returns A function that triggers GC and finalization when possible\n */\nasync function getGCFunction(logger?: Logger): Promise<GCFunction | undefined> {\n if (typeof globalThis.gc === 'function') {\n return globalThis.gc;\n }\n\n // Check if we're in Node.js\n if (\n typeof globalThis === 'object' &&\n Object.prototype.toString.call(globalThis.process) === '[object process]'\n ) {\n try {\n // Dynamic import of Node.js specific module so it's not included in browser builds\n const { engineGC } = await import('./gc-engine.ts');\n return engineGC;\n } catch (error) {\n logger?.debug('Failed to load Node.js GC implementation:', error);\n }\n }\n\n return undefined;\n}\n\n/**\n * Utility to create a function that performs garbage collection and finalization\n * in a cross-environment compatible way.\n *\n * @param logger - The logger to use.\n * @returns A function that triggers GC and finalization when possible\n */\nexport function makeGCAndFinalize(logger?: Logger): () => Promise<void> {\n // Cache the GC function promise\n const gcFunctionPromise = getGCFunction(logger);\n\n /**\n * Function to trigger garbage collection and finalization\n */\n return async function gcAndFinalize(): Promise<void> {\n try {\n const gcFunction = await gcFunctionPromise;\n\n if (gcFunction) {\n // First GC pass\n gcFunction();\n // Allow finalization callbacks to run\n await delay(0);\n // Second GC pass to clean up objects that might have become\n // unreachable during finalization\n gcFunction();\n // Another tick to ensure finalization completes\n await delay(0);\n } else {\n // No GC function available, log warning and cycle the event loop\n logger?.warn('Deterministic GC not available in this environment');\n await delay(0);\n }\n } catch (error) {\n logger?.warn('GC operation failed:', error);\n }\n };\n}\n"]}