tc39-weakrefs-shim
Version:
Shim for TC39 Weakrefs proposal
74 lines • 3.58 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
function createFinalizationGroupJobs(scheduleCleanupFinalizationGroup, hooks = {}) {
const finalizationGroupDetails = new WeakMap();
const finalizationGroupsForInfos = new Map();
return {
setFinalized(...infos) {
for (const info of infos) {
const finalizationGroups = finalizationGroupsForInfos.get(info);
if (!finalizationGroups || finalizationGroups.size == 0)
continue;
for (const finalizationGroup of finalizationGroups) {
const details = finalizationGroupDetails.get(finalizationGroup);
details.finalizedInfos.add(info);
if (!details.cleanupTaskId)
details.cleanupTaskId = scheduleCleanupFinalizationGroup(finalizationGroup);
}
finalizationGroupsForInfos.delete(info);
if (hooks.unregisterObjectInfo) {
hooks.unregisterObjectInfo(info);
}
}
},
registerFinalizationGroup(finalizationGroup, info) {
let finalizationGroupsForInfo = finalizationGroupsForInfos.get(info);
if (!finalizationGroupsForInfo) {
if (hooks.registerObjectInfo)
hooks.registerObjectInfo(info);
finalizationGroupsForInfo = new Set();
finalizationGroupsForInfos.set(info, finalizationGroupsForInfo);
}
finalizationGroupsForInfo.add(finalizationGroup);
if (!finalizationGroupDetails.has(finalizationGroup)) {
finalizationGroupDetails.set(finalizationGroup, {
finalizedInfos: new Set(),
cleanupTaskId: 0,
});
}
},
unregisterFinalizationGroup(finalizationGroup, info) {
const details = finalizationGroupDetails.get(finalizationGroup);
if (details.finalizedInfos.delete(info)) {
return;
}
let finalizationGroupsForInfo = finalizationGroupsForInfos.get(info);
finalizationGroupsForInfo.delete(finalizationGroup);
if (finalizationGroupsForInfo.size == 0) {
finalizationGroupsForInfos.delete(info);
if (hooks.unregisterObjectInfo)
hooks.unregisterObjectInfo(info);
}
},
getFinalizedInFinalizationGroup(finalizationGroup) {
const details = finalizationGroupDetails.get(finalizationGroup);
return details ? details.finalizedInfos : new Set();
},
checkForEmptyCells(finalizationGroup) {
const details = finalizationGroupDetails.get(finalizationGroup);
return !!details && details.finalizedInfos.size > 0;
},
cleanupFinalizationGroup(finalizationGroup) {
const details = finalizationGroupDetails.get(finalizationGroup);
details.cleanupTaskId = 0;
finalizationGroup.cleanupSome();
},
};
}
exports.createFinalizationGroupJobs = createFinalizationGroupJobs;
function createFinalizationGroupJobsForTaskQueue(setTask, hooks = {}) {
const jobs = createFinalizationGroupJobs(finalizationGroup => setTask(jobs.cleanupFinalizationGroup, finalizationGroup), hooks);
return jobs;
}
exports.createFinalizationGroupJobsForTaskQueue = createFinalizationGroupJobsForTaskQueue;
//# sourceMappingURL=FinalizationGroupJobs.js.map