UNPKG

tc39-weakrefs-shim

Version:
70 lines 3.36 kB
export 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(); }, }; } export function createFinalizationGroupJobsForTaskQueue(setTask, hooks = {}) { const jobs = createFinalizationGroupJobs(finalizationGroup => setTask(jobs.cleanupFinalizationGroup, finalizationGroup), hooks); return jobs; } //# sourceMappingURL=FinalizationGroupJobs.js.map