rexfect 0.0.7
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.
- package/README.md +1756 -0
- package/dist/abortableContext.d.ts +3 -0
- package/dist/abortableContext.d.ts.map +1 -0
- package/dist/abortableContext.js +48 -0
- package/dist/abortableContext.js.map +1 -0
- package/dist/action.d.ts +64 -0
- package/dist/action.d.ts.map +1 -0
- package/dist/action.js +208 -0
- package/dist/action.js.map +1 -0
- package/dist/action.test.d.ts +2 -0
- package/dist/action.test.d.ts.map +1 -0
- package/dist/action.test.js +189 -0
- package/dist/action.test.js.map +1 -0
- package/dist/async/abortable-guard.d.ts +25 -0
- package/dist/async/abortable-guard.d.ts.map +1 -0
- package/dist/async/abortable-guard.js +33 -0
- package/dist/async/abortable-guard.js.map +1 -0
- package/dist/async/abortable.d.ts +331 -0
- package/dist/async/abortable.d.ts.map +1 -0
- package/dist/async/abortable.js +410 -0
- package/dist/async/abortable.js.map +1 -0
- package/dist/async/abortable.test.d.ts +2 -0
- package/dist/async/abortable.test.d.ts.map +1 -0
- package/dist/async/abortable.test.js +535 -0
- package/dist/async/abortable.test.js.map +1 -0
- package/dist/async/abortable.typeCheck.d.ts +8 -0
- package/dist/async/abortable.typeCheck.d.ts.map +1 -0
- package/dist/async/abortable.typeCheck.js +138 -0
- package/dist/async/abortable.typeCheck.js.map +1 -0
- package/dist/async/async.d.ts +18 -0
- package/dist/async/async.d.ts.map +1 -0
- package/dist/async/async.js +20 -0
- package/dist/async/async.js.map +1 -0
- package/dist/async/index.d.ts +15 -0
- package/dist/async/index.d.ts.map +1 -0
- package/dist/async/index.js +13 -0
- package/dist/async/index.js.map +1 -0
- package/dist/async/loadable.d.ts +7 -0
- package/dist/async/loadable.d.ts.map +1 -0
- package/dist/async/loadable.js +52 -0
- package/dist/async/loadable.js.map +1 -0
- package/dist/async/loadable.test.d.ts +2 -0
- package/dist/async/loadable.test.d.ts.map +1 -0
- package/dist/async/loadable.test.js +322 -0
- package/dist/async/loadable.test.js.map +1 -0
- package/dist/async/promiseCache.d.ts +14 -0
- package/dist/async/promiseCache.d.ts.map +1 -0
- package/dist/async/promiseCache.js +29 -0
- package/dist/async/promiseCache.js.map +1 -0
- package/dist/async/read.d.ts +120 -0
- package/dist/async/read.d.ts.map +1 -0
- package/dist/async/read.js +286 -0
- package/dist/async/read.js.map +1 -0
- package/dist/async/read.test.d.ts +2 -0
- package/dist/async/read.test.d.ts.map +1 -0
- package/dist/async/read.test.js +419 -0
- package/dist/async/read.test.js.map +1 -0
- package/dist/async/read.typeCheck.d.ts +6 -0
- package/dist/async/read.typeCheck.d.ts.map +1 -0
- package/dist/async/read.typeCheck.js +101 -0
- package/dist/async/read.typeCheck.js.map +1 -0
- package/dist/async/safe.d.ts +230 -0
- package/dist/async/safe.d.ts.map +1 -0
- package/dist/async/safe.js +247 -0
- package/dist/async/safe.js.map +1 -0
- package/dist/async/safe.test.d.ts +2 -0
- package/dist/async/safe.test.d.ts.map +1 -0
- package/dist/async/safe.test.js +447 -0
- package/dist/async/safe.test.js.map +1 -0
- package/dist/async/utils.d.ts +17 -0
- package/dist/async/utils.d.ts.map +1 -0
- package/dist/async/utils.js +38 -0
- package/dist/async/utils.js.map +1 -0
- package/dist/async/wait.d.ts +120 -0
- package/dist/async/wait.d.ts.map +1 -0
- package/dist/async/wait.js +112 -0
- package/dist/async/wait.js.map +1 -0
- package/dist/async/wait.test.d.ts +2 -0
- package/dist/async/wait.test.d.ts.map +1 -0
- package/dist/async/wait.test.js +122 -0
- package/dist/async/wait.test.js.map +1 -0
- package/dist/async/wait.typeCheck.d.ts +6 -0
- package/dist/async/wait.typeCheck.d.ts.map +1 -0
- package/dist/async/wait.typeCheck.js +104 -0
- package/dist/async/wait.typeCheck.js.map +1 -0
- package/dist/atom.d.ts +46 -0
- package/dist/atom.d.ts.map +1 -0
- package/dist/atom.js +86 -0
- package/dist/atom.js.map +1 -0
- package/dist/atom.test.d.ts +2 -0
- package/dist/atom.test.d.ts.map +1 -0
- package/dist/atom.test.js +75 -0
- package/dist/atom.test.js.map +1 -0
- package/dist/batch.d.ts +15 -0
- package/dist/batch.d.ts.map +1 -0
- package/dist/batch.js +45 -0
- package/dist/batch.js.map +1 -0
- package/dist/defer.d.ts +56 -0
- package/dist/defer.d.ts.map +1 -0
- package/dist/defer.js +49 -0
- package/dist/defer.js.map +1 -0
- package/dist/effect.d.ts +91 -0
- package/dist/effect.d.ts.map +1 -0
- package/dist/effect.js +311 -0
- package/dist/effect.js.map +1 -0
- package/dist/effect.test.d.ts +2 -0
- package/dist/effect.test.d.ts.map +1 -0
- package/dist/effect.test.js +123 -0
- package/dist/effect.test.js.map +1 -0
- package/dist/emitter.d.ts +129 -0
- package/dist/emitter.d.ts.map +1 -0
- package/dist/emitter.js +164 -0
- package/dist/emitter.js.map +1 -0
- package/dist/emitter.test.d.ts +2 -0
- package/dist/emitter.test.d.ts.map +1 -0
- package/dist/emitter.test.js +259 -0
- package/dist/emitter.test.js.map +1 -0
- package/dist/equality.d.ts +66 -0
- package/dist/equality.d.ts.map +1 -0
- package/dist/equality.js +145 -0
- package/dist/equality.js.map +1 -0
- package/dist/event.d.ts +18 -0
- package/dist/event.d.ts.map +1 -0
- package/dist/event.js +166 -0
- package/dist/event.js.map +1 -0
- package/dist/event.test.d.ts +2 -0
- package/dist/event.test.d.ts.map +1 -0
- package/dist/event.test.js +167 -0
- package/dist/event.test.js.map +1 -0
- package/dist/hooks.d.ts +152 -0
- package/dist/hooks.d.ts.map +1 -0
- package/dist/hooks.js +122 -0
- package/dist/hooks.js.map +1 -0
- package/dist/hooks.test.d.ts +2 -0
- package/dist/hooks.test.d.ts.map +1 -0
- package/dist/hooks.test.js +99 -0
- package/dist/hooks.test.js.map +1 -0
- package/dist/index.d.ts +33 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +35 -0
- package/dist/index.js.map +1 -0
- package/dist/isPromiseLike.d.ts +10 -0
- package/dist/isPromiseLike.d.ts.map +1 -0
- package/dist/isPromiseLike.js +15 -0
- package/dist/isPromiseLike.js.map +1 -0
- package/dist/pick.d.ts +22 -0
- package/dist/pick.d.ts.map +1 -0
- package/dist/pick.js +46 -0
- package/dist/pick.js.map +1 -0
- package/dist/react/index.d.ts +8 -0
- package/dist/react/index.d.ts.map +1 -0
- package/dist/react/index.js +8 -0
- package/dist/react/index.js.map +1 -0
- package/dist/react/useRx.d.ts +14 -0
- package/dist/react/useRx.d.ts.map +1 -0
- package/dist/react/useRx.js +110 -0
- package/dist/react/useRx.js.map +1 -0
- package/dist/react/useRx.test.d.ts +2 -0
- package/dist/react/useRx.test.d.ts.map +1 -0
- package/dist/react/useRx.test.js +457 -0
- package/dist/react/useRx.test.js.map +1 -0
- package/dist/strictModeTest.d.ts +11 -0
- package/dist/strictModeTest.d.ts.map +1 -0
- package/dist/strictModeTest.js +41 -0
- package/dist/strictModeTest.js.map +1 -0
- package/dist/types.d.ts +606 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/untrack.d.ts +14 -0
- package/dist/untrack.d.ts.map +1 -0
- package/dist/untrack.js +17 -0
- package/dist/untrack.js.map +1 -0
- package/dist/utils/withUse.d.ts +10 -0
- package/dist/utils/withUse.d.ts.map +1 -0
- package/dist/utils/withUse.js +21 -0
- package/dist/utils/withUse.js.map +1 -0
- package/dist/utils/withUse.test.d.ts +2 -0
- package/dist/utils/withUse.test.d.ts.map +1 -0
- package/dist/utils/withUse.test.js +233 -0
- package/dist/utils/withUse.test.js.map +1 -0
- package/dist/utils.d.ts +7 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +7 -0
- package/dist/utils.js.map +1 -0
- package/dist/utils.test.d.ts +2 -0
- package/dist/utils.test.d.ts.map +1 -0
- package/dist/utils.test.js +119 -0
- package/dist/utils.test.js.map +1 -0
- package/package.json +64 -0
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Safe execution utilities.
|
|
3
|
+
*
|
|
4
|
+
* Creates a `safe` function that wraps operations to be aware of cancellation/staleness.
|
|
5
|
+
* Reused by both effect context and async context.
|
|
6
|
+
*/
|
|
7
|
+
import type { Abortable } from "./abortable";
|
|
8
|
+
/**
|
|
9
|
+
* Check if a value is a PromiseLike (has a .then method).
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* isPromiseLike(Promise.resolve(1)) // true
|
|
13
|
+
* isPromiseLike({ then: () => {} }) // true
|
|
14
|
+
* isPromiseLike(42) // false
|
|
15
|
+
*/
|
|
16
|
+
export declare function isPromiseLike(value: unknown): value is PromiseLike<unknown>;
|
|
17
|
+
/**
|
|
18
|
+
* Safe input: any value or parameterless function.
|
|
19
|
+
* Functions are invoked and their return value is processed.
|
|
20
|
+
*/
|
|
21
|
+
export type SafeInput<T> = T | (() => T);
|
|
22
|
+
/**
|
|
23
|
+
* Extract the resolved type from a SafeInput.
|
|
24
|
+
*/
|
|
25
|
+
export type SafeInputResult<T> = T extends () => infer R ? Awaited<R> : Awaited<T>;
|
|
26
|
+
type SafeAllArrayResult<T extends readonly SafeInput<any>[]> = {
|
|
27
|
+
-readonly [K in keyof T]: SafeInputResult<T[K]>;
|
|
28
|
+
};
|
|
29
|
+
type SafeAllObjectResult<T extends Record<string, SafeInput<any>>> = {
|
|
30
|
+
[K in keyof T]: SafeInputResult<T[K]>;
|
|
31
|
+
};
|
|
32
|
+
export interface SafeAll {
|
|
33
|
+
/**
|
|
34
|
+
* Wait for all inputs to complete. Returns array preserving order and types.
|
|
35
|
+
*
|
|
36
|
+
* @example
|
|
37
|
+
* const [user, posts] = await safe.all([fetchUser(), () => fetchPosts()]);
|
|
38
|
+
*/
|
|
39
|
+
<T extends readonly SafeInput<any>[]>(inputs: [...T]): Promise<SafeAllArrayResult<T>>;
|
|
40
|
+
/**
|
|
41
|
+
* Wait for all inputs to complete. Returns object preserving keys.
|
|
42
|
+
*
|
|
43
|
+
* @example
|
|
44
|
+
* const { user, posts } = await safe.all({
|
|
45
|
+
* user: fetchUser(),
|
|
46
|
+
* posts: () => fetchPosts(),
|
|
47
|
+
* });
|
|
48
|
+
*/
|
|
49
|
+
<T extends Record<string, SafeInput<any>>>(inputs: T): Promise<SafeAllObjectResult<T>>;
|
|
50
|
+
}
|
|
51
|
+
type SafeRaceArrayResult<T extends readonly SafeInput<any>[]> = SafeInputResult<T[number]>;
|
|
52
|
+
type SafeRaceObjectResult<T extends Record<string, SafeInput<any>>> = {
|
|
53
|
+
[K in keyof T]: [K, SafeInputResult<T[K]>];
|
|
54
|
+
}[keyof T];
|
|
55
|
+
export interface SafeRace {
|
|
56
|
+
/**
|
|
57
|
+
* Race inputs. Returns the first value to resolve.
|
|
58
|
+
*
|
|
59
|
+
* @example
|
|
60
|
+
* const fastest = await safe.race([api1(), api2(), api3()]);
|
|
61
|
+
*/
|
|
62
|
+
<T extends readonly SafeInput<any>[]>(inputs: [...T]): Promise<SafeRaceArrayResult<T>>;
|
|
63
|
+
/**
|
|
64
|
+
* Race inputs. Returns [winnerKey, value] tuple.
|
|
65
|
+
*
|
|
66
|
+
* @example
|
|
67
|
+
* const [winner, value] = await safe.race({
|
|
68
|
+
* primary: primaryApi(),
|
|
69
|
+
* fallback: fallbackApi(),
|
|
70
|
+
* });
|
|
71
|
+
* // winner: "primary" | "fallback"
|
|
72
|
+
*/
|
|
73
|
+
<T extends Record<string, SafeInput<any>>>(inputs: T): Promise<SafeRaceObjectResult<T>>;
|
|
74
|
+
}
|
|
75
|
+
type SafeSettledArrayResult<T extends readonly SafeInput<any>[]> = {
|
|
76
|
+
-readonly [K in keyof T]: PromiseSettledResult<SafeInputResult<T[K]>>;
|
|
77
|
+
};
|
|
78
|
+
type SafeSettledObjectResult<T extends Record<string, SafeInput<any>>> = {
|
|
79
|
+
[K in keyof T]: PromiseSettledResult<SafeInputResult<T[K]>>;
|
|
80
|
+
};
|
|
81
|
+
export interface SafeSettled {
|
|
82
|
+
/**
|
|
83
|
+
* Wait for all inputs to settle (resolve or reject).
|
|
84
|
+
*
|
|
85
|
+
* @example
|
|
86
|
+
* const results = await safe.settled([api1(), api2()]);
|
|
87
|
+
* results.forEach(r => {
|
|
88
|
+
* if (r.status === "fulfilled") console.log(r.value);
|
|
89
|
+
* else console.error(r.reason);
|
|
90
|
+
* });
|
|
91
|
+
*/
|
|
92
|
+
<T extends readonly SafeInput<any>[]>(inputs: [...T]): Promise<SafeSettledArrayResult<T>>;
|
|
93
|
+
/**
|
|
94
|
+
* Wait for all inputs to settle. Returns object with PromiseSettledResult values.
|
|
95
|
+
*
|
|
96
|
+
* @example
|
|
97
|
+
* const { user, posts } = await safe.settled({
|
|
98
|
+
* user: fetchUser(),
|
|
99
|
+
* posts: fetchPosts(),
|
|
100
|
+
* });
|
|
101
|
+
* if (user.status === "fulfilled") console.log(user.value);
|
|
102
|
+
*/
|
|
103
|
+
<T extends Record<string, SafeInput<any>>>(inputs: T): Promise<SafeSettledObjectResult<T>>;
|
|
104
|
+
}
|
|
105
|
+
export interface SafeAny {
|
|
106
|
+
/**
|
|
107
|
+
* Returns the first successful result. Throws AggregateError if all fail.
|
|
108
|
+
*
|
|
109
|
+
* @example
|
|
110
|
+
* const result = await safe.any([api1(), api2(), api3()]);
|
|
111
|
+
*/
|
|
112
|
+
<T extends readonly SafeInput<any>[]>(inputs: [...T]): Promise<SafeRaceArrayResult<T>>;
|
|
113
|
+
/**
|
|
114
|
+
* Returns [winnerKey, value] for first success. Throws AggregateError if all fail.
|
|
115
|
+
*
|
|
116
|
+
* @example
|
|
117
|
+
* const [winner, value] = await safe.any({
|
|
118
|
+
* primary: primaryApi(),
|
|
119
|
+
* fallback: fallbackApi(),
|
|
120
|
+
* });
|
|
121
|
+
*/
|
|
122
|
+
<T extends Record<string, SafeInput<any>>>(inputs: T): Promise<SafeRaceObjectResult<T>>;
|
|
123
|
+
}
|
|
124
|
+
export interface SafeCallback {
|
|
125
|
+
/**
|
|
126
|
+
* Wrap a callback to only execute if not cancelled.
|
|
127
|
+
* If cancelled, the callback is a no-op.
|
|
128
|
+
*
|
|
129
|
+
* @example
|
|
130
|
+
* const handleClick = safe.callback((e: MouseEvent) => {
|
|
131
|
+
* state.clicked = true;
|
|
132
|
+
* });
|
|
133
|
+
* document.addEventListener('click', handleClick);
|
|
134
|
+
*/
|
|
135
|
+
<TArgs extends any[]>(callback: (...args: TArgs) => void): (...args: TArgs) => void;
|
|
136
|
+
}
|
|
137
|
+
export interface SafeDelay {
|
|
138
|
+
/**
|
|
139
|
+
* Delay execution for specified milliseconds.
|
|
140
|
+
* Never resolves if cancelled.
|
|
141
|
+
*
|
|
142
|
+
* @example
|
|
143
|
+
* // Wait 1 second
|
|
144
|
+
* await safe.delay(1000);
|
|
145
|
+
*
|
|
146
|
+
* // Wait and return a value
|
|
147
|
+
* const result = await safe.delay(500, "done");
|
|
148
|
+
*/
|
|
149
|
+
<T = void>(ms: number, resolved?: T): Promise<T>;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Safe function type returned by createSafe.
|
|
153
|
+
*
|
|
154
|
+
* Overloads:
|
|
155
|
+
* 1. `safe(promise)` - Wrap promise, never resolve/reject if cancelled
|
|
156
|
+
* 2. `safe(normalFn, ...args)` - Call function, wrap result if promise
|
|
157
|
+
* 3. `safe(Abortable, ...args)` - Call with signal, wrap result if promise
|
|
158
|
+
*/
|
|
159
|
+
export interface SafeFn {
|
|
160
|
+
/**
|
|
161
|
+
* Wrap a promise to never resolve/reject if cancelled.
|
|
162
|
+
*
|
|
163
|
+
* @example
|
|
164
|
+
* ctx.safe(fetchData()).then(data => {
|
|
165
|
+
* // Only runs if not cancelled
|
|
166
|
+
* state.data = data;
|
|
167
|
+
* });
|
|
168
|
+
*/
|
|
169
|
+
<T>(promise: PromiseLike<T>): Promise<T>;
|
|
170
|
+
/**
|
|
171
|
+
* Call a normal function and wrap result if it's a promise.
|
|
172
|
+
*
|
|
173
|
+
* @example
|
|
174
|
+
* const result = await ctx.safe(myAsyncFn, arg1, arg2);
|
|
175
|
+
*/
|
|
176
|
+
<TArgs extends any[], TResult>(fn: (...args: TArgs) => TResult, ...args: TArgs): TResult extends PromiseLike<infer U> ? Promise<U> : TResult;
|
|
177
|
+
/**
|
|
178
|
+
* Call an abortable function with the context's signal.
|
|
179
|
+
* Wraps result if it's a promise.
|
|
180
|
+
*
|
|
181
|
+
* @example
|
|
182
|
+
* const user = await ctx.safe(getUser, userId);
|
|
183
|
+
*/
|
|
184
|
+
<TArgs extends any[], TResult>(fn: Abortable<TArgs, TResult>, ...args: TArgs): TResult extends PromiseLike<infer U> ? Promise<U> : TResult;
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Safe function with utility methods for concurrent operations.
|
|
188
|
+
*/
|
|
189
|
+
export interface SafeFnWithUtils extends SafeFn {
|
|
190
|
+
/** Wait for all inputs to complete */
|
|
191
|
+
all: SafeAll;
|
|
192
|
+
/** Race inputs, return first to resolve */
|
|
193
|
+
race: SafeRace;
|
|
194
|
+
/** Wait for all inputs to settle (resolve or reject) */
|
|
195
|
+
settled: SafeSettled;
|
|
196
|
+
/** Return first successful result */
|
|
197
|
+
any: SafeAny;
|
|
198
|
+
/** Wrap callback to only execute if not cancelled */
|
|
199
|
+
callback: SafeCallback;
|
|
200
|
+
/** Delay execution, never resolves if cancelled */
|
|
201
|
+
delay: SafeDelay;
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Create a safe function for a given context.
|
|
205
|
+
*
|
|
206
|
+
* @param getSignal - Function to get the current AbortSignal
|
|
207
|
+
* @param isCancelled - Function to check if the context is cancelled/stale
|
|
208
|
+
* @returns A safe function with utility methods
|
|
209
|
+
*
|
|
210
|
+
* @example
|
|
211
|
+
* ```ts
|
|
212
|
+
* const safe = createSafe(
|
|
213
|
+
* () => abortController.signal,
|
|
214
|
+
* () => abortController.signal.aborted
|
|
215
|
+
* );
|
|
216
|
+
*
|
|
217
|
+
* // Wrap promise
|
|
218
|
+
* await safe(fetchData());
|
|
219
|
+
*
|
|
220
|
+
* // Call abortable function
|
|
221
|
+
* await safe(getUser, userId);
|
|
222
|
+
*
|
|
223
|
+
* // Concurrent operations
|
|
224
|
+
* const [a, b] = await safe.all([fetchA(), fetchB()]);
|
|
225
|
+
* const fastest = await safe.race([api1(), api2()]);
|
|
226
|
+
* ```
|
|
227
|
+
*/
|
|
228
|
+
export declare function createSafe(getSignal: () => AbortSignal | undefined, isCancelled: () => boolean): SafeFnWithUtils;
|
|
229
|
+
export {};
|
|
230
|
+
//# 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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"}
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Safe execution utilities.
|
|
3
|
+
*
|
|
4
|
+
* Creates a `safe` function that wraps operations to be aware of cancellation/staleness.
|
|
5
|
+
* Reused by both effect context and async context.
|
|
6
|
+
*/
|
|
7
|
+
import { isAbortable } from "./abortable-guard";
|
|
8
|
+
import { toPromise } from "./utils";
|
|
9
|
+
// =============================================================================
|
|
10
|
+
// UTILITY: isPromiseLike & toPromise
|
|
11
|
+
// =============================================================================
|
|
12
|
+
/**
|
|
13
|
+
* Check if a value is a PromiseLike (has a .then method).
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* isPromiseLike(Promise.resolve(1)) // true
|
|
17
|
+
* isPromiseLike({ then: () => {} }) // true
|
|
18
|
+
* isPromiseLike(42) // false
|
|
19
|
+
*/
|
|
20
|
+
export function isPromiseLike(value) {
|
|
21
|
+
return (value !== null &&
|
|
22
|
+
typeof value === "object" &&
|
|
23
|
+
"then" in value &&
|
|
24
|
+
typeof value.then === "function");
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* AggregateError polyfill for environments without ES2021 support.
|
|
28
|
+
*/
|
|
29
|
+
class AggregateErrorImpl extends Error {
|
|
30
|
+
errors;
|
|
31
|
+
constructor(errors, message) {
|
|
32
|
+
super(message);
|
|
33
|
+
this.name = "AggregateError";
|
|
34
|
+
this.errors = errors;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Polyfill for Promise.any (ES2021).
|
|
39
|
+
* Returns first fulfilled promise, or rejects with AggregateError if all reject.
|
|
40
|
+
*/
|
|
41
|
+
function promiseAny(promises) {
|
|
42
|
+
return new Promise((resolve, reject) => {
|
|
43
|
+
const promiseArray = Array.from(promises);
|
|
44
|
+
if (promiseArray.length === 0) {
|
|
45
|
+
reject(new AggregateErrorImpl([], "All promises were rejected"));
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
const errors = [];
|
|
49
|
+
let rejectedCount = 0;
|
|
50
|
+
promiseArray.forEach((promise, index) => {
|
|
51
|
+
Promise.resolve(promise).then(resolve, (error) => {
|
|
52
|
+
errors[index] = error;
|
|
53
|
+
rejectedCount++;
|
|
54
|
+
if (rejectedCount === promiseArray.length) {
|
|
55
|
+
reject(new AggregateErrorImpl(errors, "All promises were rejected"));
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
// =============================================================================
|
|
62
|
+
// CREATE SAFE
|
|
63
|
+
// =============================================================================
|
|
64
|
+
/**
|
|
65
|
+
* Create a safe function for a given context.
|
|
66
|
+
*
|
|
67
|
+
* @param getSignal - Function to get the current AbortSignal
|
|
68
|
+
* @param isCancelled - Function to check if the context is cancelled/stale
|
|
69
|
+
* @returns A safe function with utility methods
|
|
70
|
+
*
|
|
71
|
+
* @example
|
|
72
|
+
* ```ts
|
|
73
|
+
* const safe = createSafe(
|
|
74
|
+
* () => abortController.signal,
|
|
75
|
+
* () => abortController.signal.aborted
|
|
76
|
+
* );
|
|
77
|
+
*
|
|
78
|
+
* // Wrap promise
|
|
79
|
+
* await safe(fetchData());
|
|
80
|
+
*
|
|
81
|
+
* // Call abortable function
|
|
82
|
+
* await safe(getUser, userId);
|
|
83
|
+
*
|
|
84
|
+
* // Concurrent operations
|
|
85
|
+
* const [a, b] = await safe.all([fetchA(), fetchB()]);
|
|
86
|
+
* const fastest = await safe.race([api1(), api2()]);
|
|
87
|
+
* ```
|
|
88
|
+
*/
|
|
89
|
+
export function createSafe(getSignal, isCancelled) {
|
|
90
|
+
/**
|
|
91
|
+
* Wrap a promise to never resolve/reject if cancelled.
|
|
92
|
+
*/
|
|
93
|
+
function wrapPromise(promise) {
|
|
94
|
+
return new Promise((resolve, reject) => {
|
|
95
|
+
promise.then((value) => {
|
|
96
|
+
if (!isCancelled()) {
|
|
97
|
+
resolve(value);
|
|
98
|
+
}
|
|
99
|
+
// Never resolve/reject if cancelled - promise stays pending
|
|
100
|
+
}, (error) => {
|
|
101
|
+
if (!isCancelled()) {
|
|
102
|
+
reject(error);
|
|
103
|
+
}
|
|
104
|
+
// Never resolve/reject if cancelled
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Wrap a value - if it's a promise-like, wrap it.
|
|
110
|
+
*/
|
|
111
|
+
function wrapResult(result) {
|
|
112
|
+
if (isPromiseLike(result)) {
|
|
113
|
+
return wrapPromise(result);
|
|
114
|
+
}
|
|
115
|
+
return result;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Convert and wrap input with never-resolve-if-cancelled behavior.
|
|
119
|
+
*/
|
|
120
|
+
function wrapInput(input) {
|
|
121
|
+
return wrapPromise(toPromise(input));
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* The safe function implementation.
|
|
125
|
+
*/
|
|
126
|
+
function safe(input, ...args) {
|
|
127
|
+
// Check if cancelled before doing anything
|
|
128
|
+
if (isCancelled()) {
|
|
129
|
+
// Return a never-resolving promise for consistency
|
|
130
|
+
if (isPromiseLike(input)) {
|
|
131
|
+
return new Promise(() => { });
|
|
132
|
+
}
|
|
133
|
+
// For functions, still call but wrap result
|
|
134
|
+
}
|
|
135
|
+
// Case 1: PromiseLike - wrap it
|
|
136
|
+
if (isPromiseLike(input)) {
|
|
137
|
+
return wrapPromise(input);
|
|
138
|
+
}
|
|
139
|
+
// Case 2: Abortable - call with signal and wrap result
|
|
140
|
+
if (isAbortable(input)) {
|
|
141
|
+
const signal = getSignal();
|
|
142
|
+
const result = input.withSignal(signal, ...args);
|
|
143
|
+
return wrapResult(result);
|
|
144
|
+
}
|
|
145
|
+
// Case 3: Normal function - call and wrap result
|
|
146
|
+
if (typeof input === "function") {
|
|
147
|
+
const result = input(...args);
|
|
148
|
+
return wrapResult(result);
|
|
149
|
+
}
|
|
150
|
+
// Fallback - shouldn't happen with proper types
|
|
151
|
+
return input;
|
|
152
|
+
}
|
|
153
|
+
// ---------------------------------------------------------------------------
|
|
154
|
+
// safe.all
|
|
155
|
+
// ---------------------------------------------------------------------------
|
|
156
|
+
const all = ((inputs) => {
|
|
157
|
+
if (isCancelled()) {
|
|
158
|
+
return new Promise(() => { });
|
|
159
|
+
}
|
|
160
|
+
if (Array.isArray(inputs)) {
|
|
161
|
+
return Promise.all(inputs.map(wrapInput));
|
|
162
|
+
}
|
|
163
|
+
// Object case
|
|
164
|
+
const obj = inputs;
|
|
165
|
+
const keys = Object.keys(obj);
|
|
166
|
+
return Promise.all(keys.map((k) => wrapInput(obj[k]))).then((values) => Object.fromEntries(keys.map((k, i) => [k, values[i]])));
|
|
167
|
+
});
|
|
168
|
+
// ---------------------------------------------------------------------------
|
|
169
|
+
// safe.race
|
|
170
|
+
// ---------------------------------------------------------------------------
|
|
171
|
+
const race = ((inputs) => {
|
|
172
|
+
if (isCancelled()) {
|
|
173
|
+
return new Promise(() => { });
|
|
174
|
+
}
|
|
175
|
+
if (Array.isArray(inputs)) {
|
|
176
|
+
return Promise.race(inputs.map(wrapInput));
|
|
177
|
+
}
|
|
178
|
+
// Object case - return [key, value] tuple
|
|
179
|
+
const obj = inputs;
|
|
180
|
+
const keys = Object.keys(obj);
|
|
181
|
+
return Promise.race(keys.map((k) => wrapInput(obj[k]).then((v) => [k, v])));
|
|
182
|
+
});
|
|
183
|
+
// ---------------------------------------------------------------------------
|
|
184
|
+
// safe.settled
|
|
185
|
+
// ---------------------------------------------------------------------------
|
|
186
|
+
const settled = ((inputs) => {
|
|
187
|
+
if (isCancelled()) {
|
|
188
|
+
return new Promise(() => { });
|
|
189
|
+
}
|
|
190
|
+
if (Array.isArray(inputs)) {
|
|
191
|
+
return wrapPromise(Promise.allSettled(inputs.map(toPromise)));
|
|
192
|
+
}
|
|
193
|
+
// Object case
|
|
194
|
+
const obj = inputs;
|
|
195
|
+
const keys = Object.keys(obj);
|
|
196
|
+
return wrapPromise(Promise.allSettled(keys.map((k) => toPromise(obj[k])))).then((results) => Object.fromEntries(keys.map((k, i) => [k, results[i]])));
|
|
197
|
+
});
|
|
198
|
+
// ---------------------------------------------------------------------------
|
|
199
|
+
// safe.any
|
|
200
|
+
// ---------------------------------------------------------------------------
|
|
201
|
+
const any = ((inputs) => {
|
|
202
|
+
if (isCancelled()) {
|
|
203
|
+
return new Promise(() => { });
|
|
204
|
+
}
|
|
205
|
+
if (Array.isArray(inputs)) {
|
|
206
|
+
return wrapPromise(promiseAny(inputs.map(toPromise)));
|
|
207
|
+
}
|
|
208
|
+
// Object case - return [key, value] tuple
|
|
209
|
+
const obj = inputs;
|
|
210
|
+
const keys = Object.keys(obj);
|
|
211
|
+
return wrapPromise(promiseAny(keys.map((k) => toPromise(obj[k]).then((v) => [k, v]))));
|
|
212
|
+
});
|
|
213
|
+
// ---------------------------------------------------------------------------
|
|
214
|
+
// safe.callback
|
|
215
|
+
// ---------------------------------------------------------------------------
|
|
216
|
+
const callback = ((cb) => {
|
|
217
|
+
return (...args) => {
|
|
218
|
+
if (isCancelled()) {
|
|
219
|
+
return;
|
|
220
|
+
}
|
|
221
|
+
cb(...args);
|
|
222
|
+
};
|
|
223
|
+
});
|
|
224
|
+
// ---------------------------------------------------------------------------
|
|
225
|
+
// safe.delay
|
|
226
|
+
// ---------------------------------------------------------------------------
|
|
227
|
+
const delay = ((ms, resolved) => {
|
|
228
|
+
if (isCancelled()) {
|
|
229
|
+
return new Promise(() => { });
|
|
230
|
+
}
|
|
231
|
+
return wrapPromise(new Promise((resolve) => {
|
|
232
|
+
setTimeout(() => resolve(resolved), ms);
|
|
233
|
+
}));
|
|
234
|
+
});
|
|
235
|
+
// ---------------------------------------------------------------------------
|
|
236
|
+
// Return safe with utilities attached
|
|
237
|
+
// ---------------------------------------------------------------------------
|
|
238
|
+
return Object.assign(safe, {
|
|
239
|
+
all,
|
|
240
|
+
race,
|
|
241
|
+
settled,
|
|
242
|
+
any,
|
|
243
|
+
callback,
|
|
244
|
+
delay,
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
//# sourceMappingURL=safe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"safe.js","sourceRoot":"","sources":["../../src/async/safe.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"safe.test.d.ts","sourceRoot":"","sources":["../../src/async/safe.test.ts"],"names":[],"mappings":""}
|