type SvgLoadPromise = Promise; const SVG_LOAD_PROMISE_MAP = new WeakMap< SVGSVGElement, Map >(); export function getSvgLoadPromises(svg: SVGSVGElement): SvgLoadPromise[] { const map = SVG_LOAD_PROMISE_MAP.get(svg); return map ? Array.from(map.values()) : []; } export function getSvgLoadPromise( svg: SVGSVGElement, key: string, ): Promise | undefined { return SVG_LOAD_PROMISE_MAP.get(svg)?.get(key) as Promise | undefined; } export function trackSvgLoadPromise( svg: SVGSVGElement, key: string, promise: Promise, ): Promise { let map = SVG_LOAD_PROMISE_MAP.get(svg); if (!map) { map = new Map(); SVG_LOAD_PROMISE_MAP.set(svg, map); } map.set(key, promise as SvgLoadPromise); promise.finally(() => { const map = SVG_LOAD_PROMISE_MAP.get(svg); if (!map) return; if (map.get(key) === promise) map.delete(key); if (map.size === 0) SVG_LOAD_PROMISE_MAP.delete(svg); }); return promise; } export async function waitForSvgLoads(svg: SVGSVGElement): Promise { await Promise.resolve(); while (true) { const promises = getSvgLoadPromises(svg); if (!promises.length) break; await Promise.allSettled(promises); await Promise.resolve(); } }