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,331 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Abortable function utilities.
|
|
3
|
+
*
|
|
4
|
+
* Creates async functions with full lifecycle control:
|
|
5
|
+
* - Pause/Resume execution
|
|
6
|
+
* - Abort with cleanup
|
|
7
|
+
* - External event injection (take/send)
|
|
8
|
+
* - Status tracking
|
|
9
|
+
*
|
|
10
|
+
* Similar to saga pattern but uses async/await instead of suspense.
|
|
11
|
+
*/
|
|
12
|
+
import { type SafeFnWithUtils } from "./safe";
|
|
13
|
+
import { abortableSymbol, isAbortable } from "./abortable-guard";
|
|
14
|
+
export { abortableSymbol, isAbortable };
|
|
15
|
+
export type AbortableStatus = "running" | "success" | "error" | "paused" | "waiting" | "aborted";
|
|
16
|
+
/**
|
|
17
|
+
* Send function type.
|
|
18
|
+
* - When TYield is void: `() => void` (checkpoint/nudge pattern)
|
|
19
|
+
* - When TYield is object: `<K>(key: K, value: TYield[K]) => void`
|
|
20
|
+
*/
|
|
21
|
+
export type AbortableSend<TYield extends void | object = void> = void extends TYield ? () => void : <TKey extends keyof TYield>(key: TKey, value: TYield[TKey]) => void;
|
|
22
|
+
/**
|
|
23
|
+
* Take function type.
|
|
24
|
+
* Returns a Promise that resolves when the event arrives.
|
|
25
|
+
* - When TYield is void: `() => Promise<void>` (checkpoint pattern)
|
|
26
|
+
* - When TYield is object: `<K>(key: K) => Promise<TYield[K]>`
|
|
27
|
+
*/
|
|
28
|
+
export type AbortableTake<TYield extends void | object = void> = void extends TYield ? () => Promise<void> : <TKey extends keyof TYield>(key: TKey) => Promise<TYield[TKey]>;
|
|
29
|
+
/**
|
|
30
|
+
* Join function type for coordinating multiple abortable results.
|
|
31
|
+
* When the parent abortable is aborted, all joined results are also aborted.
|
|
32
|
+
*/
|
|
33
|
+
export type AbortableJoin = {
|
|
34
|
+
/** Join a single abortable result */
|
|
35
|
+
<TResult>(result: AbortableResult<TResult, any>): Promise<TResult>;
|
|
36
|
+
/** Join multiple abortable results (like Promise.all with abort propagation) */
|
|
37
|
+
<const T extends readonly AbortableResult<any, any>[]>(results: T): Promise<{
|
|
38
|
+
-readonly [K in keyof T]: Awaited<T[K]>;
|
|
39
|
+
}>;
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* Result returned when invoking an abortable function.
|
|
43
|
+
* Extends Promise for async consumption while providing control methods.
|
|
44
|
+
*
|
|
45
|
+
* @example
|
|
46
|
+
* ```ts
|
|
47
|
+
* const result = myAbortable(args);
|
|
48
|
+
*
|
|
49
|
+
* // Promise-like usage
|
|
50
|
+
* const value = await result;
|
|
51
|
+
*
|
|
52
|
+
* // Control methods
|
|
53
|
+
* result.pause();
|
|
54
|
+
* result.resume();
|
|
55
|
+
* result.abort();
|
|
56
|
+
*
|
|
57
|
+
* // Status checks
|
|
58
|
+
* result.running(); // boolean
|
|
59
|
+
* result.status(); // "running" | "success" | ...
|
|
60
|
+
*
|
|
61
|
+
* // Event sending
|
|
62
|
+
* result.send("eventKey", eventValue);
|
|
63
|
+
* ```
|
|
64
|
+
*/
|
|
65
|
+
export type AbortableResult<TResult, TYield extends void | object = void> = Promise<TResult> & {
|
|
66
|
+
/** Send an event to the abortable */
|
|
67
|
+
send: AbortableSend<TYield>;
|
|
68
|
+
/** Check if abortable has failed */
|
|
69
|
+
failed(): boolean;
|
|
70
|
+
/** Check if abortable has completed (success, error, or aborted) */
|
|
71
|
+
completed(): boolean;
|
|
72
|
+
/** Check if abortable is currently running */
|
|
73
|
+
running(): boolean;
|
|
74
|
+
/** Check if abortable succeeded */
|
|
75
|
+
succeeded(): boolean;
|
|
76
|
+
/** Check if abortable is paused */
|
|
77
|
+
paused(): boolean;
|
|
78
|
+
/** Check if abortable is waiting for async operation or event */
|
|
79
|
+
waiting(): boolean;
|
|
80
|
+
/** Check if abortable was aborted */
|
|
81
|
+
aborted(): boolean;
|
|
82
|
+
/** Get current status */
|
|
83
|
+
status(): AbortableStatus;
|
|
84
|
+
/** Get result if succeeded, undefined otherwise */
|
|
85
|
+
result(): Awaited<TResult> | undefined;
|
|
86
|
+
/** Get error if failed, undefined otherwise */
|
|
87
|
+
error(): Error | undefined;
|
|
88
|
+
/**
|
|
89
|
+
* Pause execution at current await point.
|
|
90
|
+
* @returns false if already paused or completed
|
|
91
|
+
*/
|
|
92
|
+
pause(): boolean;
|
|
93
|
+
/**
|
|
94
|
+
* Resume execution from paused state.
|
|
95
|
+
* @returns false if not paused
|
|
96
|
+
*/
|
|
97
|
+
resume(): boolean;
|
|
98
|
+
/**
|
|
99
|
+
* Abort execution.
|
|
100
|
+
* Does NOT affect parent signal - only this abortable's internal signal.
|
|
101
|
+
* @returns false if already aborted or completed
|
|
102
|
+
*/
|
|
103
|
+
abort(): boolean;
|
|
104
|
+
};
|
|
105
|
+
/**
|
|
106
|
+
* Context passed to abortable function handlers.
|
|
107
|
+
*
|
|
108
|
+
* @example
|
|
109
|
+
* ```ts
|
|
110
|
+
* const myFn = abortable<[string], Result, { confirm: boolean }>(
|
|
111
|
+
* async ({ signal, safe, take, aborted, abort }, id) => {
|
|
112
|
+
* const data = await safe(fetchData, id);
|
|
113
|
+
*
|
|
114
|
+
* if (aborted()) return null;
|
|
115
|
+
*
|
|
116
|
+
* const confirmed = await take("confirm");
|
|
117
|
+
* if (!confirmed) {
|
|
118
|
+
* abort();
|
|
119
|
+
* return null;
|
|
120
|
+
* }
|
|
121
|
+
*
|
|
122
|
+
* return processData(data);
|
|
123
|
+
* }
|
|
124
|
+
* );
|
|
125
|
+
* ```
|
|
126
|
+
*/
|
|
127
|
+
export interface AbortableContext<TYield extends void | object = void> {
|
|
128
|
+
/**
|
|
129
|
+
* AbortSignal for this abortable instance.
|
|
130
|
+
* This is the abortable's OWN signal, not the parent's.
|
|
131
|
+
* Use this for fetch, timers, etc.
|
|
132
|
+
*/
|
|
133
|
+
signal: AbortSignal;
|
|
134
|
+
/**
|
|
135
|
+
* Safe execution utility.
|
|
136
|
+
* Wraps async operations to handle abort gracefully.
|
|
137
|
+
*
|
|
138
|
+
* Includes utilities: `.all()`, `.race()`, `.any()`, `.settled()`, `.callback()`
|
|
139
|
+
*/
|
|
140
|
+
safe: SafeFnWithUtils;
|
|
141
|
+
/**
|
|
142
|
+
* Wait for an external event.
|
|
143
|
+
* Returns a Promise that resolves when `send(key, value)` is called.
|
|
144
|
+
*
|
|
145
|
+
* @example
|
|
146
|
+
* ```ts
|
|
147
|
+
* // With typed events
|
|
148
|
+
* const confirmed = await take("confirm");
|
|
149
|
+
*
|
|
150
|
+
* // Checkpoint pattern (TYield = void)
|
|
151
|
+
* await take(); // Waits for send()
|
|
152
|
+
* ```
|
|
153
|
+
*/
|
|
154
|
+
take: AbortableTake<TYield>;
|
|
155
|
+
/**
|
|
156
|
+
* Check if this abortable has been aborted.
|
|
157
|
+
*/
|
|
158
|
+
aborted(): boolean;
|
|
159
|
+
/**
|
|
160
|
+
* Abort this abortable from inside.
|
|
161
|
+
* Does NOT affect parent signal.
|
|
162
|
+
* @returns false if already aborted
|
|
163
|
+
*/
|
|
164
|
+
abort(): boolean;
|
|
165
|
+
/**
|
|
166
|
+
* Check for pause point.
|
|
167
|
+
* Call this between async operations to allow pause/resume.
|
|
168
|
+
* Throws AbortableAbortedError if aborted.
|
|
169
|
+
*
|
|
170
|
+
* @example
|
|
171
|
+
* ```ts
|
|
172
|
+
* const myFn = abortable(async (ctx) => {
|
|
173
|
+
* const data = await fetchData();
|
|
174
|
+
* await ctx.checkpoint(); // Allow pause here
|
|
175
|
+
* const processed = await process(data);
|
|
176
|
+
* await ctx.checkpoint(); // Allow pause here
|
|
177
|
+
* return processed;
|
|
178
|
+
* });
|
|
179
|
+
* ```
|
|
180
|
+
*/
|
|
181
|
+
checkpoint(): Promise<void>;
|
|
182
|
+
/**
|
|
183
|
+
* Join one or more abortable results.
|
|
184
|
+
* When this abortable is aborted, all joined results are also aborted.
|
|
185
|
+
*
|
|
186
|
+
* @example
|
|
187
|
+
* ```ts
|
|
188
|
+
* // Single result
|
|
189
|
+
* const user = await ctx.join(fetchUser(id));
|
|
190
|
+
*
|
|
191
|
+
* // Multiple results (like Promise.all)
|
|
192
|
+
* const [user, posts, comments] = await ctx.join([
|
|
193
|
+
* fetchUser(id),
|
|
194
|
+
* fetchPosts(id),
|
|
195
|
+
* fetchComments(id),
|
|
196
|
+
* ]);
|
|
197
|
+
* ```
|
|
198
|
+
*/
|
|
199
|
+
join: AbortableJoin;
|
|
200
|
+
/**
|
|
201
|
+
* Abort the previous invocation of this abortable function.
|
|
202
|
+
* Useful for "latest only" patterns where rapid calls should cancel in-flight operations.
|
|
203
|
+
*
|
|
204
|
+
* @param message - Optional abort message
|
|
205
|
+
*
|
|
206
|
+
* @example
|
|
207
|
+
* ```ts
|
|
208
|
+
* const search = abortable(async ({ signal, abortPrev }, query: string) => {
|
|
209
|
+
* abortPrev(); // Cancel previous search
|
|
210
|
+
* const res = await fetch(`/search?q=${query}`, { signal });
|
|
211
|
+
* return res.json();
|
|
212
|
+
* });
|
|
213
|
+
*
|
|
214
|
+
* search("h");
|
|
215
|
+
* search("he");
|
|
216
|
+
* const results = await search("hello"); // Only this completes
|
|
217
|
+
* ```
|
|
218
|
+
*/
|
|
219
|
+
abortPrev(message?: string): void;
|
|
220
|
+
/**
|
|
221
|
+
* Create a child context that aborts when this context aborts.
|
|
222
|
+
* Useful for sub-operations that should cancel with parent.
|
|
223
|
+
*/
|
|
224
|
+
fork(): AbortableContext<TYield>;
|
|
225
|
+
/**
|
|
226
|
+
* Create an independent context that doesn't abort with parent.
|
|
227
|
+
* Useful for background operations that should continue.
|
|
228
|
+
*/
|
|
229
|
+
spawn(): AbortableContext<TYield>;
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Handler function signature for abortable.
|
|
233
|
+
*/
|
|
234
|
+
export type AbortableFn<TArgs extends any[], TResult, TYield extends void | object = void> = (ctx: AbortableContext<TYield>, ...args: TArgs) => Promise<TResult>;
|
|
235
|
+
/**
|
|
236
|
+
* Wrapper type for use() method.
|
|
237
|
+
*/
|
|
238
|
+
export type AbortableWrapper<TArgs extends any[], TResult, TYield extends void | object, TNewArgs extends any[] = TArgs, TNewResult = TResult, TNewYield extends void | object = TYield> = (next: AbortableFn<TArgs, TResult, TYield>) => AbortableFn<TNewArgs, TNewResult, TNewYield>;
|
|
239
|
+
/**
|
|
240
|
+
* Identity wrapper that preserves all input types including TYield.
|
|
241
|
+
*/
|
|
242
|
+
export type IdentityWrapper = <TArgs extends any[], TResult, TYield extends void | object = void>(next: AbortableFn<TArgs, TResult, TYield>) => AbortableFn<TArgs, TResult, TYield>;
|
|
243
|
+
/**
|
|
244
|
+
* An abortable function with full lifecycle control.
|
|
245
|
+
*
|
|
246
|
+
* - Direct call: `fn(...args)` - creates new AbortController
|
|
247
|
+
* - With signal: `fn.withSignal(signal, ...args)` - links to parent signal
|
|
248
|
+
* - Chainable: `fn.use(wrapper)` - returns new Abortable with wrapper applied
|
|
249
|
+
*
|
|
250
|
+
* Signal relationship:
|
|
251
|
+
* - Abortable creates its own internal AbortController
|
|
252
|
+
* - When `withSignal(parentSignal)` is called:
|
|
253
|
+
* - If parent aborts → this abortable aborts
|
|
254
|
+
* - If this abortable aborts → parent NOT affected
|
|
255
|
+
*/
|
|
256
|
+
export interface Abortable<TArgs extends any[], TResult, TYield extends void | object = void> {
|
|
257
|
+
/** Call without signal (creates new AbortController) */
|
|
258
|
+
(...args: TArgs): AbortableResult<TResult, TYield>;
|
|
259
|
+
/**
|
|
260
|
+
* Call with parent signal.
|
|
261
|
+
* Parent abort → this aborts. This abort → parent unaffected.
|
|
262
|
+
*/
|
|
263
|
+
withSignal(signal: AbortSignal | undefined, ...args: TArgs): AbortableResult<TResult, TYield>;
|
|
264
|
+
/**
|
|
265
|
+
* Apply a wrapper and return a new Abortable.
|
|
266
|
+
*
|
|
267
|
+
* @example
|
|
268
|
+
* ```ts
|
|
269
|
+
* const fetchUserWithRetry = fetchUser.use(withRetry(3));
|
|
270
|
+
* ```
|
|
271
|
+
*/
|
|
272
|
+
use<TNewArgs extends any[] = TArgs, TNewResult = TResult, TNewYield extends void | object = TYield>(wrapper: AbortableWrapper<TArgs, TResult, TYield, TNewArgs, TNewResult, TNewYield>): Abortable<TNewArgs, TNewResult, TNewYield>;
|
|
273
|
+
/**
|
|
274
|
+
* Type assertion for return type.
|
|
275
|
+
*/
|
|
276
|
+
as<TNewResult, TNewArgs extends any[] = TArgs, TNewYield extends void | object = TYield>(): Abortable<TNewArgs, TNewResult, TNewYield>;
|
|
277
|
+
/** Type brand for discrimination */
|
|
278
|
+
readonly [abortableSymbol]: true;
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Error thrown when abortable is aborted.
|
|
282
|
+
*/
|
|
283
|
+
export declare class AbortableAbortedError extends Error {
|
|
284
|
+
readonly name = "AbortableAbortedError";
|
|
285
|
+
constructor(message?: string);
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* Create an abortable function with full lifecycle control.
|
|
289
|
+
*
|
|
290
|
+
* Features:
|
|
291
|
+
* - Pause/Resume execution
|
|
292
|
+
* - Abort with cleanup
|
|
293
|
+
* - External event injection (take/send)
|
|
294
|
+
* - Status tracking
|
|
295
|
+
* - Parent signal linkage (parent abort → this aborts, not vice versa)
|
|
296
|
+
*
|
|
297
|
+
* @example
|
|
298
|
+
* ```ts
|
|
299
|
+
* // Simple abortable
|
|
300
|
+
* const fetchUser = abortable(async ({ signal, safe }, id: string) => {
|
|
301
|
+
* const res = await fetch(`/api/users/${id}`, { signal });
|
|
302
|
+
* return res.json();
|
|
303
|
+
* });
|
|
304
|
+
*
|
|
305
|
+
* // With events
|
|
306
|
+
* const checkout = abortable<[Cart], Receipt, { confirm: boolean }>(
|
|
307
|
+
* async ({ signal, safe, take }, cart) => {
|
|
308
|
+
* const validated = await safe(validateCart, cart);
|
|
309
|
+
*
|
|
310
|
+
* const confirmed = await take("confirm");
|
|
311
|
+
* if (!confirmed) throw new Error("Cancelled");
|
|
312
|
+
*
|
|
313
|
+
* return await safe(processPayment, validated);
|
|
314
|
+
* }
|
|
315
|
+
* );
|
|
316
|
+
*
|
|
317
|
+
* // Usage
|
|
318
|
+
* const result = checkout(cart);
|
|
319
|
+
* result.send("confirm", true);
|
|
320
|
+
* const receipt = await result;
|
|
321
|
+
*
|
|
322
|
+
* // With pause/resume
|
|
323
|
+
* result.pause();
|
|
324
|
+
* result.resume();
|
|
325
|
+
*
|
|
326
|
+
* // With abort
|
|
327
|
+
* result.abort();
|
|
328
|
+
* ```
|
|
329
|
+
*/
|
|
330
|
+
export declare function abortable<const TArgs extends any[], TResult, TYield extends void | object = void>(fn: AbortableFn<TArgs, TResult, TYield>): Abortable<TArgs, TResult, TYield>;
|
|
331
|
+
//# sourceMappingURL=abortable.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"abortable.d.ts","sourceRoot":"","sources":["../../src/async/abortable.ts"],"names":[],"mappings":"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"}
|