tc39-weakrefs-shim
Version:
Shim for TC39 Weakrefs proposal
38 lines • 1.65 kB
JavaScript
// @ts-ignore
import WeakTag from "@mhofman/weak-napi-native/weak-tag.js";
// @ts-ignore
import ObjectInfo from "@mhofman/weak-napi-native/object-info.js";
import { createWeakRefClassShim } from "../internal/WeakRef.js";
import { createFinalizationGroupClassShim } from "../internal/FinalizationGroup.js";
import { createWeakRefJobsForTaskQueue } from "../internal/WeakRefJobs.js";
import { createFinalizationGroupJobsForTaskQueue } from "../internal/FinalizationGroupJobs.js";
import { setImmediate } from "../utils/tasks/setImmediate.js";
export { gc } from "./gc.js";
const tagCollector = new WeakMap();
const observedInfos = new Set();
function finalizedCallback() {
if (!observedInfos.has(this))
return;
observedInfos.delete(this);
finalizationGroupJobs.setFinalized(this);
}
function getInfo(target) {
let objectDetails = tagCollector.get(target);
if (!objectDetails) {
const info = new ObjectInfo(target, finalizedCallback);
objectDetails = { info, tag: new WeakTag(info) };
tagCollector.set(target, objectDetails);
}
return objectDetails.info;
}
const finalizationGroupJobs = createFinalizationGroupJobsForTaskQueue(setImmediate, {
registerObjectInfo: info => {
observedInfos.add(info);
},
unregisterObjectInfo: info => {
observedInfos.delete(info);
},
});
export const [WeakRef] = createWeakRefClassShim(createWeakRefJobsForTaskQueue(setImmediate), getInfo, info => info.target);
export const FinalizationGroup = createFinalizationGroupClassShim(finalizationGroupJobs, getInfo, info => observedInfos.has(info));
//# sourceMappingURL=index.js.map