UNPKG

tc39-weakrefs-shim

Version:
62 lines 2.31 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const WeakRefJobs_js_1 = require("./internal/WeakRefJobs.js"); const FinalizationGroupJobs_js_1 = require("./internal/FinalizationGroupJobs.js"); const setImmediate_js_1 = require("./utils/tasks/setImmediate.js"); const WeakRef_js_1 = require("./internal/WeakRef.js"); const FinalizationGroup_js_1 = require("./internal/FinalizationGroup.js"); class ObjectInfo { } function wrap(WeakRef, FinalizationGroup, gc) { const infos = new WeakMap(); const finalizationGroup = new FinalizationGroup(items => { for (const item of items) { if (item.alive) { item.alive = false; finalizationGroupJobs.setFinalized(item); } } }); function getInfo(target) { let info = infos.get(target); if (!info) { info = new ObjectInfo(); infos.set(target, info); } return info; } function getInfoWithRef(target) { let info = getInfo(target); if (!info.ref) { info.ref = new WeakRef(target); } return info; } function getInfoWithRegistration(target) { let info = getInfo(target); if (info.alive === undefined) { finalizationGroup.register(target, info, info); info.alive = true; } return info; } const finalizationGroupJobs = FinalizationGroupJobs_js_1.createFinalizationGroupJobsForTaskQueue(setImmediate_js_1.setImmediate, { unregisterObjectInfo: info => { if (info.alive) finalizationGroup.unregister(info); info.alive = undefined; }, }); const [WrappedWeakRef] = WeakRef_js_1.createWeakRefClassShim(WeakRefJobs_js_1.createWeakRefJobsForTaskQueue(setImmediate_js_1.setImmediate), getInfoWithRef, info => info.ref.deref()); async function wrappedGc() { await gc(); finalizationGroup.cleanupSome(); } return { WeakRef: WrappedWeakRef, FinalizationGroup: FinalizationGroup_js_1.createFinalizationGroupClassShim(finalizationGroupJobs, getInfoWithRegistration, info => info.alive === true), gc: gc && wrappedGc, }; } exports.wrap = wrap; //# sourceMappingURL=wrapper.js.map