controlly
v1.1.0
Published
Async control flow: retry with backoff, timeout, concurrency limit, sleep, debounce, throttle. Zero deps.
Downloads
165
Maintainers
Readme
controlly
Async control-flow toolkit — sleep, deferred, timeout, retry with backoff, concurrency limit, debounce, throttle. Zero dependencies, ESM + CJS + TypeScript types.
npm install controllyimport {
sleep, deferred, withTimeout, retry, pLimit, debounce, throttle,
} from "controlly";
await sleep(200);
// Retry with exponential backoff
const data = await retry(() => fetch("/api").then((r) => r.json()), {
retries: 3,
minDelay: 100,
factor: 2,
onRetry: (err, attempt) => console.warn(`retry #${attempt}`, err),
});
// Timeout any promise
await withTimeout(slowTask(), 5000, "slowTask took too long");
// Limit concurrency
const limit = pLimit(2);
await Promise.all(urls.map((u) => limit(() => fetch(u))));
// Externally-resolvable promise
const d = deferred<number>();
setTimeout(() => d.resolve(42), 10);
await d.promise; // 42
const onScroll = throttle(() => render(), 100);
const onType = debounce((q: string) => search(q), 300);API
| Fonction | Description |
|---|---|
| sleep(ms, signal?) | Promise résolue après ms (annulable via AbortSignal) |
| deferred<T>() | { promise, resolve, reject } |
| withTimeout(promise, ms, msg?) | Rejette TimeoutError au-delà de ms |
| retry(fn, opts?) | Backoff exponentiel : retries, minDelay, factor, maxDelay, onRetry, shouldRetry, signal |
| pLimit(n) | Limiteur de concurrence (.active, .pending) |
| debounce(fn, ms) | + .cancel() / .flush() |
| throttle(fn, ms) | Bord montant + trailing |
Tout est typé strictement. retry/sleep respectent AbortSignal.
License
MIT © KIPDEV
