storion 0.9.0 → 0.10.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/CHANGELOG.md +62 -4
  2. package/README.md +65 -2004
  3. package/dist/async/abortable.d.ts +295 -0
  4. package/dist/async/abortable.d.ts.map +1 -0
  5. package/dist/async/async.d.ts +86 -5
  6. package/dist/async/async.d.ts.map +1 -1
  7. package/dist/async/context.d.ts +15 -0
  8. package/dist/async/context.d.ts.map +1 -0
  9. package/dist/async/index.d.ts +16 -3
  10. package/dist/async/index.d.ts.map +1 -1
  11. package/dist/async/index.js +407 -137
  12. package/dist/async/safe.d.ts +221 -0
  13. package/dist/async/safe.d.ts.map +1 -0
  14. package/dist/async/types.d.ts +77 -29
  15. package/dist/async/types.d.ts.map +1 -1
  16. package/dist/async/wrappers.d.ts +217 -0
  17. package/dist/async/wrappers.d.ts.map +1 -0
  18. package/dist/core/effect.d.ts +34 -26
  19. package/dist/core/effect.d.ts.map +1 -1
  20. package/dist/core/equality.d.ts +25 -0
  21. package/dist/core/equality.d.ts.map +1 -1
  22. package/dist/core/focus.d.ts +20 -0
  23. package/dist/core/focus.d.ts.map +1 -0
  24. package/dist/core/focusHelpers.d.ts +258 -0
  25. package/dist/core/focusHelpers.d.ts.map +1 -0
  26. package/dist/core/middleware.d.ts +4 -4
  27. package/dist/core/store.d.ts.map +1 -1
  28. package/dist/core/storeContext.d.ts +2 -9
  29. package/dist/core/storeContext.d.ts.map +1 -1
  30. package/dist/dev.d.ts +0 -10
  31. package/dist/dev.d.ts.map +1 -1
  32. package/dist/{index-C8B6Mo8r.js → effect-BDQU8Voz.js} +1241 -583
  33. package/dist/errors.d.ts +6 -0
  34. package/dist/errors.d.ts.map +1 -1
  35. package/dist/index.d.ts +5 -4
  36. package/dist/index.d.ts.map +1 -1
  37. package/dist/network/index.d.ts +69 -0
  38. package/dist/network/index.d.ts.map +1 -0
  39. package/dist/network/retry.d.ts +53 -0
  40. package/dist/network/retry.d.ts.map +1 -0
  41. package/dist/network/services.d.ts +58 -0
  42. package/dist/network/services.d.ts.map +1 -0
  43. package/dist/network/store.d.ts +36 -0
  44. package/dist/network/store.d.ts.map +1 -0
  45. package/dist/network/utils.d.ts +9 -0
  46. package/dist/network/utils.d.ts.map +1 -0
  47. package/dist/persist/index.d.ts +1 -1
  48. package/dist/persist/index.d.ts.map +1 -1
  49. package/dist/persist/index.js +11 -9
  50. package/dist/persist/persist.d.ts +14 -14
  51. package/dist/persist/persist.d.ts.map +1 -1
  52. package/dist/pool.d.ts +77 -0
  53. package/dist/pool.d.ts.map +1 -0
  54. package/dist/react/index.d.ts +2 -2
  55. package/dist/react/index.d.ts.map +1 -1
  56. package/dist/react/index.js +245 -244
  57. package/dist/react/stable.d.ts +27 -0
  58. package/dist/react/stable.d.ts.map +1 -0
  59. package/dist/react/useStore.d.ts +38 -13
  60. package/dist/react/useStore.d.ts.map +1 -1
  61. package/dist/react/withStore.d.ts.map +1 -1
  62. package/dist/storion.js +911 -37
  63. package/dist/trigger.d.ts +12 -7
  64. package/dist/trigger.d.ts.map +1 -1
  65. package/dist/types.d.ts +133 -22
  66. package/dist/types.d.ts.map +1 -1
  67. package/dist/utils/storeTuple.d.ts +7 -0
  68. package/dist/utils/storeTuple.d.ts.map +1 -0
  69. package/package.json +5 -1
  70. package/dist/collection.d.ts +0 -34
  71. package/dist/collection.d.ts.map +0 -1
  72. package/dist/core/proxy.d.ts +0 -47
  73. package/dist/core/proxy.d.ts.map +0 -1
  74. package/dist/effect-C6h0PDDI.js +0 -446
  75. package/dist/isPromiseLike-bFkfHAbm.js +0 -6
  76. package/dist/react/useLocalStore.d.ts +0 -48
  77. package/dist/react/useLocalStore.d.ts.map +0 -1
@@ -0,0 +1,221 @@
1
+ import { Abortable } from './abortable';
2
+
3
+ /**
4
+ * Check if a value is a PromiseLike (has a .then method).
5
+ *
6
+ * @example
7
+ * isPromiseLike(Promise.resolve(1)) // true
8
+ * isPromiseLike({ then: () => {} }) // true
9
+ * isPromiseLike(42) // false
10
+ */
11
+ export declare function isPromiseLike(value: unknown): value is PromiseLike<unknown>;
12
+ /**
13
+ * Convert a value or parameterless function to a Promise.
14
+ * Handles: PromiseLike, sync values, functions returning either.
15
+ *
16
+ * @example
17
+ * toPromise(42) // Promise.resolve(42)
18
+ * toPromise(Promise.resolve(42)) // Promise.resolve(42)
19
+ * toPromise(() => 42) // Promise.resolve(42)
20
+ * toPromise(() => fetchData()) // fetchData() promise
21
+ * toPromise(thenable) // Promise wrapping thenable
22
+ */
23
+ export declare function toPromise<T>(value: T | (() => T)): Promise<Awaited<T>>;
24
+ /**
25
+ * Safe input: any value or parameterless function.
26
+ * Functions are invoked and their return value is processed.
27
+ */
28
+ export type SafeInput<T> = T | (() => T);
29
+ /**
30
+ * Extract the resolved type from a SafeInput.
31
+ */
32
+ export type SafeInputResult<T> = T extends () => infer R ? Awaited<R> : Awaited<T>;
33
+ type SafeAllArrayResult<T extends readonly SafeInput<any>[]> = {
34
+ -readonly [K in keyof T]: SafeInputResult<T[K]>;
35
+ };
36
+ type SafeAllObjectResult<T extends Record<string, SafeInput<any>>> = {
37
+ [K in keyof T]: SafeInputResult<T[K]>;
38
+ };
39
+ export interface SafeAll {
40
+ /**
41
+ * Wait for all inputs to complete. Returns array preserving order and types.
42
+ *
43
+ * @example
44
+ * const [user, posts] = await safe.all([fetchUser(), () => fetchPosts()]);
45
+ */
46
+ <T extends readonly SafeInput<any>[]>(inputs: [...T]): Promise<SafeAllArrayResult<T>>;
47
+ /**
48
+ * Wait for all inputs to complete. Returns object preserving keys.
49
+ *
50
+ * @example
51
+ * const { user, posts } = await safe.all({
52
+ * user: fetchUser(),
53
+ * posts: () => fetchPosts(),
54
+ * });
55
+ */
56
+ <T extends Record<string, SafeInput<any>>>(inputs: T): Promise<SafeAllObjectResult<T>>;
57
+ }
58
+ type SafeRaceArrayResult<T extends readonly SafeInput<any>[]> = SafeInputResult<T[number]>;
59
+ type SafeRaceObjectResult<T extends Record<string, SafeInput<any>>> = {
60
+ [K in keyof T]: [K, SafeInputResult<T[K]>];
61
+ }[keyof T];
62
+ export interface SafeRace {
63
+ /**
64
+ * Race inputs. Returns the first value to resolve.
65
+ *
66
+ * @example
67
+ * const fastest = await safe.race([api1(), api2(), api3()]);
68
+ */
69
+ <T extends readonly SafeInput<any>[]>(inputs: [...T]): Promise<SafeRaceArrayResult<T>>;
70
+ /**
71
+ * Race inputs. Returns [winnerKey, value] tuple.
72
+ *
73
+ * @example
74
+ * const [winner, value] = await safe.race({
75
+ * primary: primaryApi(),
76
+ * fallback: fallbackApi(),
77
+ * });
78
+ * // winner: "primary" | "fallback"
79
+ */
80
+ <T extends Record<string, SafeInput<any>>>(inputs: T): Promise<SafeRaceObjectResult<T>>;
81
+ }
82
+ type SafeSettledArrayResult<T extends readonly SafeInput<any>[]> = {
83
+ -readonly [K in keyof T]: PromiseSettledResult<SafeInputResult<T[K]>>;
84
+ };
85
+ type SafeSettledObjectResult<T extends Record<string, SafeInput<any>>> = {
86
+ [K in keyof T]: PromiseSettledResult<SafeInputResult<T[K]>>;
87
+ };
88
+ export interface SafeSettled {
89
+ /**
90
+ * Wait for all inputs to settle (resolve or reject).
91
+ *
92
+ * @example
93
+ * const results = await safe.settled([api1(), api2()]);
94
+ * results.forEach(r => {
95
+ * if (r.status === "fulfilled") console.log(r.value);
96
+ * else console.error(r.reason);
97
+ * });
98
+ */
99
+ <T extends readonly SafeInput<any>[]>(inputs: [...T]): Promise<SafeSettledArrayResult<T>>;
100
+ /**
101
+ * Wait for all inputs to settle. Returns object with PromiseSettledResult values.
102
+ *
103
+ * @example
104
+ * const { user, posts } = await safe.settled({
105
+ * user: fetchUser(),
106
+ * posts: fetchPosts(),
107
+ * });
108
+ * if (user.status === "fulfilled") console.log(user.value);
109
+ */
110
+ <T extends Record<string, SafeInput<any>>>(inputs: T): Promise<SafeSettledObjectResult<T>>;
111
+ }
112
+ export interface SafeAny {
113
+ /**
114
+ * Returns the first successful result. Throws AggregateError if all fail.
115
+ *
116
+ * @example
117
+ * const result = await safe.any([api1(), api2(), api3()]);
118
+ */
119
+ <T extends readonly SafeInput<any>[]>(inputs: [...T]): Promise<SafeRaceArrayResult<T>>;
120
+ /**
121
+ * Returns [winnerKey, value] for first success. Throws AggregateError if all fail.
122
+ *
123
+ * @example
124
+ * const [winner, value] = await safe.any({
125
+ * primary: primaryApi(),
126
+ * fallback: fallbackApi(),
127
+ * });
128
+ */
129
+ <T extends Record<string, SafeInput<any>>>(inputs: T): Promise<SafeRaceObjectResult<T>>;
130
+ }
131
+ export interface SafeCallback {
132
+ /**
133
+ * Wrap a callback to only execute if not cancelled.
134
+ * If cancelled, the callback is a no-op.
135
+ *
136
+ * @example
137
+ * const handleClick = safe.callback((e: MouseEvent) => {
138
+ * state.clicked = true;
139
+ * });
140
+ * document.addEventListener('click', handleClick);
141
+ */
142
+ <TArgs extends any[]>(callback: (...args: TArgs) => void): (...args: TArgs) => void;
143
+ }
144
+ /**
145
+ * Safe function type returned by createSafe.
146
+ *
147
+ * Overloads:
148
+ * 1. `safe(promise)` - Wrap promise, never resolve/reject if cancelled
149
+ * 2. `safe(normalFn, ...args)` - Call function, wrap result if promise
150
+ * 3. `safe(Abortable, ...args)` - Call with signal, wrap result if promise
151
+ */
152
+ export interface SafeFn {
153
+ /**
154
+ * Wrap a promise to never resolve/reject if cancelled.
155
+ *
156
+ * @example
157
+ * ctx.safe(fetchData()).then(data => {
158
+ * // Only runs if not cancelled
159
+ * state.data = data;
160
+ * });
161
+ */
162
+ <T>(promise: PromiseLike<T>): Promise<T>;
163
+ /**
164
+ * Call a normal function and wrap result if it's a promise.
165
+ *
166
+ * @example
167
+ * const result = await ctx.safe(myAsyncFn, arg1, arg2);
168
+ */
169
+ <TArgs extends any[], TResult>(fn: (...args: TArgs) => TResult, ...args: TArgs): TResult extends PromiseLike<infer U> ? Promise<U> : TResult;
170
+ /**
171
+ * Call an abortable function with the context's signal.
172
+ * Wraps result if it's a promise.
173
+ *
174
+ * @example
175
+ * const user = await ctx.safe(getUser, userId);
176
+ */
177
+ <TArgs extends any[], TResult>(fn: Abortable<TArgs, TResult>, ...args: TArgs): TResult extends PromiseLike<infer U> ? Promise<U> : TResult;
178
+ }
179
+ /**
180
+ * Safe function with utility methods for concurrent operations.
181
+ */
182
+ export interface SafeFnWithUtils extends SafeFn {
183
+ /** Wait for all inputs to complete */
184
+ all: SafeAll;
185
+ /** Race inputs, return first to resolve */
186
+ race: SafeRace;
187
+ /** Wait for all inputs to settle (resolve or reject) */
188
+ settled: SafeSettled;
189
+ /** Return first successful result */
190
+ any: SafeAny;
191
+ /** Wrap callback to only execute if not cancelled */
192
+ callback: SafeCallback;
193
+ }
194
+ /**
195
+ * Create a safe function for a given context.
196
+ *
197
+ * @param getSignal - Function to get the current AbortSignal
198
+ * @param isCancelled - Function to check if the context is cancelled/stale
199
+ * @returns A safe function with utility methods
200
+ *
201
+ * @example
202
+ * ```ts
203
+ * const safe = createSafe(
204
+ * () => abortController.signal,
205
+ * () => abortController.signal.aborted
206
+ * );
207
+ *
208
+ * // Wrap promise
209
+ * await safe(fetchData());
210
+ *
211
+ * // Call abortable function
212
+ * await safe(getUser, userId);
213
+ *
214
+ * // Concurrent operations
215
+ * const [a, b] = await safe.all([fetchA(), fetchB()]);
216
+ * const fastest = await safe.race([api1(), api2()]);
217
+ * ```
218
+ */
219
+ export declare function createSafe(getSignal: () => AbortSignal | undefined, isCancelled: () => boolean): SafeFnWithUtils;
220
+ export {};
221
+ //# sourceMappingURL=safe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safe.d.ts","sourceRoot":"","sources":["../../src/async/safe.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,5 @@
1
+ import { ActionsBase, StateBase, StoreSpec, StoreTuple } from '../types';
2
+
1
3
  /**
2
4
  * Async data mode:
3
5
  * - "fresh": data is undefined during loading/error (only show fresh data)
@@ -116,36 +118,33 @@ export interface AsyncContext {
116
118
  /** AbortSignal for cancellation */
117
119
  signal: AbortSignal;
118
120
  /**
119
- * Wrap a promise to never resolve if the async operation is cancelled.
120
- * Useful for nested async operations that should be cancelled together.
121
+ * Safely execute operations that should be cancelled together.
121
122
  *
122
- * @example
123
- * async(focus, async (ctx) => {
124
- * const data1 = await ctx.safe(fetch('/api/1'));
125
- * const data2 = await ctx.safe(fetch('/api/2'));
126
- * return { data1, data2 };
127
- * });
128
- */
129
- safe<T>(promise: Promise<T>): Promise<T>;
130
- /**
131
- * Wrap a callback to not run if the async operation is cancelled.
132
- * Useful for event handlers and timeouts.
123
+ * Overloads:
124
+ * 1. `safe(promise)` - Wrap promise, never resolve/reject if cancelled
125
+ * 2. `safe(fn, ...args)` - Call function, wrap result if promise
126
+ * 3. `safe(Abortable, ...args)` - Call with signal, wrap result if promise
133
127
  *
134
128
  * @example
135
- * async(focus, async (ctx) => {
136
- * setTimeout(ctx.safe(() => {
137
- * // Only runs if not cancelled
138
- * doSomething();
139
- * }), 1000);
140
- * });
129
+ * ```ts
130
+ * // Wrap a promise
131
+ * const data = await ctx.safe(fetch('/api/data'));
132
+ *
133
+ * // Call a normal function
134
+ * const result = await ctx.safe(myAsyncFn, arg1, arg2);
135
+ *
136
+ * // Call an abortable function (auto-injects signal)
137
+ * const user = await ctx.safe(getUser, userId);
138
+ * ```
141
139
  */
142
- safe<TArgs extends unknown[], TReturn>(callback: (...args: TArgs) => TReturn): (...args: TArgs) => TReturn | undefined;
140
+ safe<T>(promise: Promise<T>): Promise<T>;
141
+ safe<TArgs extends any[], TResult>(fn: (...args: TArgs) => TResult, ...args: TArgs): TResult extends Promise<infer U> ? Promise<U> : TResult;
143
142
  /**
144
143
  * Cancel the current async operation.
145
144
  * Useful for implementing timeouts.
146
145
  *
147
146
  * @example
148
- * async(focus, async (ctx) => {
147
+ * async.action(focus, async (ctx) => {
149
148
  * // Timeout after 5 seconds
150
149
  * setTimeout(ctx.cancel, 5000);
151
150
  *
@@ -154,26 +153,75 @@ export interface AsyncContext {
154
153
  * });
155
154
  */
156
155
  cancel(): void;
156
+ /**
157
+ * Get another store's state and actions.
158
+ *
159
+ * @example
160
+ * // Array destructuring
161
+ * const [state, actions] = get(counterSpec);
162
+ *
163
+ * // Named properties
164
+ * const tuple = get(counterSpec);
165
+ * tuple.state.count;
166
+ */
167
+ get<S extends StateBase, A extends ActionsBase>(spec: StoreSpec<S, A>): StoreTuple<S, A>;
168
+ /**
169
+ * Get a service or factory instance.
170
+ *
171
+ * @example
172
+ * const db = get(() => new IndexedDBService());
173
+ * await db.users.getAll();
174
+ */
175
+ get<T>(factory: (...args: any[]) => T): T;
157
176
  }
158
177
  /**
159
178
  * Async handler function signature.
160
179
  * Receives AsyncContext as first arg, then user-defined args.
161
180
  */
162
181
  export type AsyncHandler<T, TArgs extends any[]> = (context: AsyncContext, ...args: TArgs) => T | PromiseLike<T>;
182
+ /**
183
+ * Built-in retry delay strategies.
184
+ */
185
+ export declare const retryStrategy: {
186
+ /** Exponential backoff: 1s, 2s, 4s, 8s... (max 30s) */
187
+ readonly backoff: (attempt: number) => number;
188
+ /** Linear: 1s, 2s, 3s, 4s... (max 30s) */
189
+ readonly linear: (attempt: number) => number;
190
+ /** Fixed 1 second delay */
191
+ readonly fixed: () => number;
192
+ /** Fibonacci: 1s, 1s, 2s, 3s, 5s, 8s... (max 30s) */
193
+ readonly fibonacci: (attempt: number) => number;
194
+ /** Immediate retry (no delay) */
195
+ readonly immediate: () => number;
196
+ /** Add jitter (±30%) to any strategy */
197
+ readonly withJitter: (strategy: (n: number) => number) => (attempt: number) => number;
198
+ };
199
+ /** Built-in retry strategy names */
200
+ export type RetryStrategyName = Exclude<keyof typeof retryStrategy, "withJitter">;
201
+ export type AsyncRetryDelayFn = (attempt: number, error: Error) => number | Promise<void>;
202
+ export type AsyncRetryDelay = number | AsyncRetryDelayFn;
163
203
  export interface AsyncRetryOptions {
164
204
  /** Number of retry attempts */
165
205
  count: number;
166
- /** Delay between retries (ms) or function returning delay */
167
- delay?: number | ((attempt: number, error: Error) => number);
206
+ /** Delay between retries: ms, strategy name, or custom function */
207
+ delay?: AsyncRetryDelay | RetryStrategyName;
168
208
  }
169
209
  /**
170
- * Options for async mixin setup.
210
+ * Options for async state management.
211
+ *
212
+ * For retry, error handling, and other cross-cutting concerns,
213
+ * use the `use()` pattern with wrapper utilities:
214
+ *
215
+ * ```ts
216
+ * import { retry, catchError } from "storion/async";
217
+ *
218
+ * const userQuery = async.action(
219
+ * focus("user"),
220
+ * userService.getUser.use(retry(3)).use(catchError(console.error))
221
+ * );
222
+ * ```
171
223
  */
172
224
  export interface AsyncOptions {
173
- /** Error callback */
174
- onError?: (error: Error) => void;
175
- /** Retry configuration */
176
- retry?: number | AsyncRetryOptions;
177
225
  /** Auto-cancel previous request on new dispatch (default: true) */
178
226
  autoCancel?: boolean;
179
227
  }
@@ -192,7 +240,7 @@ export interface AsyncLastInvocation<T, M extends AsyncMode, TArgs extends any[]
192
240
  readonly state: AsyncState<T, M>;
193
241
  }
194
242
  /**
195
- * API returned from async() mixin.
243
+ * API returned from async.action() or async.mixin().
196
244
  */
197
245
  export interface AsyncActions<T, M extends AsyncMode, TArgs extends any[]> {
198
246
  /** Dispatch the async operation */
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/async/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/async/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,217 @@
1
+ import { AbortableContext, AbortableWrapper, IdentityWrapper } from './abortable';
2
+ import { RetryStrategyName, AsyncRetryDelayFn } from './types';
3
+
4
+ /** Options for retry wrapper */
5
+ export interface RetryOptions {
6
+ /** Number of retry attempts (default: 3) */
7
+ retries?: number;
8
+ /** Delay between retries: ms, strategy name, or custom function */
9
+ delay?: number | RetryStrategyName | AsyncRetryDelayFn;
10
+ }
11
+ /** Options for cache wrapper */
12
+ export interface CacheOptions {
13
+ /** Time-to-live in milliseconds */
14
+ ttl: number;
15
+ /** Custom key function (default: JSON.stringify of args) */
16
+ key?: (...args: any[]) => string;
17
+ }
18
+ /** Options for rate limit wrapper */
19
+ export interface RateLimitOptions {
20
+ /** Maximum number of calls allowed in the window */
21
+ limit: number;
22
+ /** Time window in milliseconds */
23
+ window: number;
24
+ }
25
+ /** Options for circuit breaker wrapper */
26
+ export interface CircuitBreakerOptions {
27
+ /** Number of failures before opening circuit (default: 5) */
28
+ threshold?: number;
29
+ /** Time in ms before attempting to close circuit (default: 30000) */
30
+ resetTimeout?: number;
31
+ }
32
+ /**
33
+ * Retry on failure.
34
+ *
35
+ * @example
36
+ * ```ts
37
+ * // Retry 3 times with backoff delay
38
+ * fn.use(retry(3))
39
+ *
40
+ * // Retry 3 times with named strategy
41
+ * fn.use(retry("linear"))
42
+ *
43
+ * // Retry 5 times with linear delay
44
+ * fn.use(retry({ retries: 5, delay: "linear" }))
45
+ *
46
+ * // Custom delay function
47
+ * fn.use(retry({ retries: 3, delay: (attempt) => attempt * 1000 }))
48
+ * ```
49
+ */
50
+ export declare function retry(retries?: number): IdentityWrapper;
51
+ export declare function retry(strategy: RetryStrategyName): IdentityWrapper;
52
+ export declare function retry(options: RetryOptions): IdentityWrapper;
53
+ /**
54
+ * Catch and handle errors with a callback (without swallowing them).
55
+ *
56
+ * @example
57
+ * ```ts
58
+ * fn.use(catchError((error) => {
59
+ * console.error("Failed:", error.message);
60
+ * analytics.track("error", { message: error.message });
61
+ * }))
62
+ * ```
63
+ */
64
+ export declare function catchError(callback: (error: Error, ctx: AbortableContext<any>, ...args: any[]) => void): IdentityWrapper;
65
+ /**
66
+ * Add timeout to abort after specified milliseconds.
67
+ *
68
+ * @example
69
+ * ```ts
70
+ * // Abort after 5 seconds
71
+ * fn.use(timeout(5000))
72
+ *
73
+ * // With custom error message
74
+ * fn.use(timeout(5000, "Request timed out"))
75
+ * ```
76
+ */
77
+ export declare function timeout(ms: number, message?: string): IdentityWrapper;
78
+ /**
79
+ * Log function calls for debugging.
80
+ *
81
+ * @example
82
+ * ```ts
83
+ * fn.use(logging("getUser"))
84
+ * // Logs: [getUser] calling with: ["123"]
85
+ * // Logs: [getUser] success: { id: "123", name: "John" }
86
+ * // Or: [getUser] error: Error: Not found
87
+ * ```
88
+ */
89
+ export declare function logging(name: string, logger?: Pick<Console, "log" | "error">): IdentityWrapper;
90
+ /**
91
+ * Debounce calls - only execute after delay with no new calls.
92
+ *
93
+ * Note: This creates a shared timer, so multiple calls to the same
94
+ * debounced function will share the debounce state.
95
+ *
96
+ * @example
97
+ * ```ts
98
+ * // Debounce search - only execute 300ms after last keystroke
99
+ * const debouncedSearch = search.use(debounce(300));
100
+ * ```
101
+ */
102
+ export declare function debounce(ms: number): IdentityWrapper;
103
+ /**
104
+ * Throttle calls - only execute once per time window.
105
+ *
106
+ * @example
107
+ * ```ts
108
+ * // Throttle to max once per second
109
+ * const throttledSave = save.use(throttle(1000));
110
+ * ```
111
+ */
112
+ export declare function throttle(ms: number): IdentityWrapper;
113
+ /**
114
+ * Return a fallback value on error instead of throwing.
115
+ *
116
+ * @example
117
+ * ```ts
118
+ * // Return null on error
119
+ * fn.use(fallback(null))
120
+ *
121
+ * // Return empty array on error
122
+ * fn.use(fallback([]))
123
+ *
124
+ * // Dynamic fallback based on error
125
+ * fn.use(fallback((error) => ({ error: error.message })))
126
+ * ```
127
+ */
128
+ export declare function fallback<T>(value: T | ((error: Error, ctx: AbortableContext, ...args: any[]) => T)): IdentityWrapper;
129
+ /**
130
+ * Cache results with TTL. Results are cached by serialized arguments.
131
+ *
132
+ * Note: This creates a shared cache, so all calls to the same
133
+ * cached function share the cache.
134
+ *
135
+ * @example
136
+ * ```ts
137
+ * // Cache for 5 minutes
138
+ * fn.use(cache(5 * 60 * 1000))
139
+ *
140
+ * // Cache with custom key function
141
+ * fn.use(cache({ ttl: 60000, key: (id) => `user:${id}` }))
142
+ * ```
143
+ */
144
+ export declare function cache(ttlOrOptions: number | CacheOptions): IdentityWrapper;
145
+ /**
146
+ * Rate limit calls - queue excess calls beyond the limit.
147
+ *
148
+ * Note: This creates shared state, so all calls to the same
149
+ * rate-limited function share the rate limit.
150
+ *
151
+ * @example
152
+ * ```ts
153
+ * // Max 10 calls per second
154
+ * fn.use(rateLimit({ limit: 10, window: 1000 }))
155
+ *
156
+ * // Max 100 calls per minute
157
+ * fn.use(rateLimit({ limit: 100, window: 60000 }))
158
+ * ```
159
+ */
160
+ export declare function rateLimit(options: RateLimitOptions): IdentityWrapper;
161
+ /**
162
+ * Circuit breaker - fail fast after repeated errors.
163
+ *
164
+ * States:
165
+ * - closed: Normal operation, requests pass through
166
+ * - open: Circuit tripped, requests fail immediately
167
+ * - half-open: Testing if service recovered (allows one request)
168
+ *
169
+ * @example
170
+ * ```ts
171
+ * // Open after 5 failures, try again after 30s
172
+ * fn.use(circuitBreaker())
173
+ *
174
+ * // Custom threshold and reset timeout
175
+ * fn.use(circuitBreaker({ threshold: 3, resetTimeout: 10000 }))
176
+ * ```
177
+ */
178
+ export declare function circuitBreaker(options?: CircuitBreakerOptions): IdentityWrapper;
179
+ /**
180
+ * Create a simplified wrapper for argument/result transformations.
181
+ *
182
+ * Unlike regular wrappers, `map()` hides the `ctx` parameter, providing
183
+ * a simple `next(...args)` function. Use this for transformations that
184
+ * don't need access to the abort signal.
185
+ *
186
+ * @example
187
+ * ```ts
188
+ * // Transform return type: User → string
189
+ * const getUserName = getUser.use(
190
+ * map(async (next, id: string) => {
191
+ * const user = await next(id);
192
+ * return user.name;
193
+ * })
194
+ * );
195
+ *
196
+ * // Change argument signature: email → id lookup
197
+ * const getUserByEmail = getUser.use(
198
+ * map(async (next, email: string) => {
199
+ * const id = await lookupUserId(email);
200
+ * return next(id);
201
+ * })
202
+ * );
203
+ *
204
+ * // Combine multiple calls
205
+ * const getUserWithPosts = getUser.use(
206
+ * map(async (next, id: string) => {
207
+ * const [user, posts] = await Promise.all([
208
+ * next(id),
209
+ * fetchPosts(id),
210
+ * ]);
211
+ * return { ...user, posts };
212
+ * })
213
+ * );
214
+ * ```
215
+ */
216
+ export declare function map<TArgs extends any[], TResult, TNewArgs extends any[], TNewResult>(mapper: (next: (...args: NoInfer<TArgs>) => Promise<NoInfer<TResult>>, ...newArgs: TNewArgs) => Promise<TNewResult>): AbortableWrapper<TArgs, TResult, any, TNewArgs, TNewResult, any>;
217
+ //# sourceMappingURL=wrappers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wrappers.d.ts","sourceRoot":"","sources":["../../src/async/wrappers.ts"],"names":[],"mappings":"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"}