UNPKG

tc39-weakrefs-shim

Version:
59 lines 2.14 kB
import { createWeakRefJobsForTaskQueue } from "./internal/WeakRefJobs.js"; import { createFinalizationGroupJobsForTaskQueue } from "./internal/FinalizationGroupJobs.js"; import { setImmediate } from "./utils/tasks/setImmediate.js"; import { createWeakRefClassShim } from "./internal/WeakRef.js"; import { createFinalizationGroupClassShim } from "./internal/FinalizationGroup.js"; class ObjectInfo { } export 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 = createFinalizationGroupJobsForTaskQueue(setImmediate, { unregisterObjectInfo: info => { if (info.alive) finalizationGroup.unregister(info); info.alive = undefined; }, }); const [WrappedWeakRef] = createWeakRefClassShim(createWeakRefJobsForTaskQueue(setImmediate), getInfoWithRef, info => info.ref.deref()); async function wrappedGc() { await gc(); finalizationGroup.cleanupSome(); } return { WeakRef: WrappedWeakRef, FinalizationGroup: createFinalizationGroupClassShim(finalizationGroupJobs, getInfoWithRegistration, info => info.alive === true), gc: gc && wrappedGc, }; } //# sourceMappingURL=wrapper.js.map