tc39-weakrefs-shim
Version:
Shim for TC39 Weakrefs proposal
59 lines • 2.14 kB
JavaScript
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