"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.TestQuickJSWASMModule = void 0; const errors_1 = require("./errors"); const lifetime_1 = require("./lifetime"); /** * A test wrapper of [[QuickJSWASMModule]] that keeps a reference to each * context or runtime created. * * Call [[disposeAll]] to reset these sets and calls `dispose` on any left alive * (which may throw an error). * * Call [[assertNoMemoryAllocated]] at the end of a test, when you expect that you've * freed all the memory you've ever allocated. */ class TestQuickJSWASMModule { constructor(parent) { this.parent = parent; this.contexts = new Set(); this.runtimes = new Set(); } newRuntime(options) { const runtime = this.parent.newRuntime({ ...options, ownedLifetimes: [ new lifetime_1.Lifetime(undefined, undefined, () => this.runtimes.delete(runtime)), ...(options?.ownedLifetimes ?? []), ], }); this.runtimes.add(runtime); return runtime; } newContext(options) { const context = this.parent.newContext({ ...options, ownedLifetimes: [ new lifetime_1.Lifetime(undefined, undefined, () => this.contexts.delete(context)), ...(options?.ownedLifetimes ?? []), ], }); this.contexts.add(context); return context; } evalCode(code, options) { return this.parent.evalCode(code, options); } disposeAll() { const allDisposables = [...this.contexts, ...this.runtimes]; this.runtimes.clear(); this.contexts.clear(); allDisposables.forEach((d) => { if (d.alive) { d.dispose(); } }); } assertNoMemoryAllocated() { const leaksDetected = this.getFFI().QTS_RecoverableLeakCheck(); if (leaksDetected) { // Note: this is currently only available when building from source // with debug builds. throw new errors_1.QuickJSMemoryLeakDetected("Leak sanitizer detected un-freed memory"); } if (this.contexts.size > 0) { throw new errors_1.QuickJSMemoryLeakDetected(`${this.contexts.size} contexts leaked`); } if (this.runtimes.size > 0) { throw new errors_1.QuickJSMemoryLeakDetected(`${this.runtimes.size} runtimes leaked`); } } /** @private */ getFFI() { return this.parent.getFFI(); } } exports.TestQuickJSWASMModule = TestQuickJSWASMModule; //# sourceMappingURL=module-test.js.map