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