// Ein Aufruf hoechstens alle `maxAgeMs`: ein laufender Aufruf wird geteilt, danach liefert die // Funktion bis zum Ablauf null (uebersprungen). Nach einem Fehler darf sofort neu versucht // werden (sonst verschwand der Hinweis und der Abgleich fiel eine Minute lang still aus). // `now` nur fuer Tests. export function throttleRuns(run, maxAgeMs) { let pending = null let doneAt = 0 return ({ now = Date.now() } = {}) => { if (pending) return pending if (doneAt && now - doneAt < maxAgeMs) return Promise.resolve(null) pending = Promise.resolve() .then(run) .then( (result) => { doneAt = Date.now(); pending = null; return result }, (err) => { doneAt = 0; pending = null; throw err } ) return pending } }