decorio
Version:
First-class ECMAScript decorators for caching, binding, and concurrency patterns
31 lines (30 loc) • 1.35 kB
TypeScript
/**
* 🎯 Decorator `@latest` ensures that an async method runs *immediately* on each invocation,
* but automatically cancels any prior in-flight invocation (via `AbortSignal`) if it's still pending.
*
* Think of it as `@debounced(0)` - it collapses overlapping calls - but it
* executes synchronously (no deferral).
*
* ⚠️ Ignores all arguments when deciding what to cancel: every new call, regardless of its parameters,
* will abort whatever was running before.
*
* Usage:
* ```typescript
* class Example {
* @latest async fetchData(id: string): Promise<Data> {
* const { signal } = latest;
*
* return fetch(`/api/data/${id}`, { signal }).then((r) => r.json());
* }
* }
*
* const e = new Example();
* e.fetchData('1'); // fires immediately
* e.fetchData('2'); // aborts the '1' request and fires '2' immediately
* ```
*/
export declare function latest<A extends Array<unknown>, R extends Promise<unknown>>(value: unknown, context: ClassMethodDecoratorContext<object, (...args: A) => R>): (...args: A) => R;
export declare function latest<A extends Array<unknown>, R extends Promise<unknown>>(value: unknown, context: ClassFieldDecoratorContext<object, (...args: A) => R>): (originalFn: (...args: A) => R) => (...args: A) => R;
export declare namespace latest {
var signal: AbortSignal | undefined;
}