rexfect 0.0.7 → 0.2.0
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/dist/async/abortable.d.ts +44 -0
- package/dist/async/abortable.d.ts.map +1 -1
- package/dist/async/abortable.js +44 -7
- package/dist/async/abortable.js.map +1 -1
- package/dist/async/index.d.ts +1 -1
- package/dist/async/index.d.ts.map +1 -1
- package/dist/async/index.js +1 -1
- package/dist/async/index.js.map +1 -1
- package/dist/async/wrappers.d.ts +311 -0
- package/dist/async/wrappers.d.ts.map +1 -0
- package/dist/async/wrappers.js +542 -0
- package/dist/async/wrappers.js.map +1 -0
- package/dist/async/wrappers.test.d.ts +2 -0
- package/dist/async/wrappers.test.d.ts.map +1 -0
- package/dist/async/wrappers.test.js +649 -0
- package/dist/async/wrappers.test.js.map +1 -0
- package/dist/atom.d.ts +5 -0
- package/dist/atom.d.ts.map +1 -1
- package/dist/atom.js +11 -3
- package/dist/atom.js.map +1 -1
- package/dist/batch.js +1 -1
- package/dist/batch.js.map +1 -1
- package/dist/effect.d.ts.map +1 -1
- package/dist/effect.js +3 -2
- package/dist/effect.js.map +1 -1
- package/dist/emitter.d.ts +2 -2
- package/dist/emitter.d.ts.map +1 -1
- package/dist/emitter.js +20 -23
- package/dist/emitter.js.map +1 -1
- package/dist/emitter.test.js +11 -11
- package/dist/emitter.test.js.map +1 -1
- package/dist/pick.js +3 -2
- package/dist/pick.js.map +1 -1
- package/dist/react/useRx.d.ts.map +1 -1
- package/dist/react/useRx.js +75 -43
- package/dist/react/useRx.js.map +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/event.d.ts +0 -18
- package/dist/event.d.ts.map +0 -1
- package/dist/event.js +0 -166
- package/dist/event.js.map +0 -1
- package/dist/event.test.d.ts +0 -2
- package/dist/event.test.d.ts.map +0 -1
- package/dist/event.test.js +0 -167
- package/dist/event.test.js.map +0 -1
- package/dist/utils.d.ts +0 -7
- package/dist/utils.d.ts.map +0 -1
- package/dist/utils.js +0 -7
- package/dist/utils.js.map +0 -1
|
@@ -0,0 +1,542 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Built-in wrapper utilities for abortable functions.
|
|
3
|
+
*
|
|
4
|
+
* Use with the `.use()` method to compose behavior:
|
|
5
|
+
*
|
|
6
|
+
* ```ts
|
|
7
|
+
* import { retry, catchError, timeout, logging } from "storion/async";
|
|
8
|
+
*
|
|
9
|
+
* const getUser = userService.getUser
|
|
10
|
+
* .use(retry(3))
|
|
11
|
+
* .use(catchError(console.error))
|
|
12
|
+
* .use(timeout(5000))
|
|
13
|
+
* .use(logging("getUser"));
|
|
14
|
+
* ```
|
|
15
|
+
*/
|
|
16
|
+
// =============================================================================
|
|
17
|
+
// Types
|
|
18
|
+
// =============================================================================
|
|
19
|
+
/**
|
|
20
|
+
* Built-in retry delay strategies.
|
|
21
|
+
*/
|
|
22
|
+
export const retryStrategy = {
|
|
23
|
+
/** Exponential backoff: 1s, 2s, 4s, 8s... (max 30s) */
|
|
24
|
+
backoff: (attempt) => Math.min(1000 * 2 ** attempt, 30000),
|
|
25
|
+
/** Linear: 1s, 2s, 3s, 4s... (max 30s) */
|
|
26
|
+
linear: (attempt) => Math.min(1000 * (attempt + 1), 30000),
|
|
27
|
+
/** Fixed 1 second delay */
|
|
28
|
+
fixed: () => 1000,
|
|
29
|
+
/** Fibonacci: 1s, 1s, 2s, 3s, 5s, 8s... (max 30s) */
|
|
30
|
+
fibonacci: (attempt) => {
|
|
31
|
+
const fib = [1, 1, 2, 3, 5, 8, 13, 21, 30];
|
|
32
|
+
return Math.min(fib[attempt] ?? 30, 30) * 1000;
|
|
33
|
+
},
|
|
34
|
+
/** Immediate retry (no delay) */
|
|
35
|
+
immediate: () => 0,
|
|
36
|
+
/** Add jitter (±30%) to any strategy */
|
|
37
|
+
withJitter: (strategy) => (attempt) => {
|
|
38
|
+
const base = strategy(attempt);
|
|
39
|
+
const jitter = base * 0.3 * (Math.random() * 2 - 1); // ±30%
|
|
40
|
+
return Math.max(0, Math.round(base + jitter));
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
export function retry(retriesOrStrategyOrOptions) {
|
|
44
|
+
const options = typeof retriesOrStrategyOrOptions === "number"
|
|
45
|
+
? { retries: retriesOrStrategyOrOptions }
|
|
46
|
+
: typeof retriesOrStrategyOrOptions === "string"
|
|
47
|
+
? { delay: retriesOrStrategyOrOptions }
|
|
48
|
+
: retriesOrStrategyOrOptions ?? {};
|
|
49
|
+
const retries = options.retries ?? 3;
|
|
50
|
+
const delayOption = options.delay ?? "backoff";
|
|
51
|
+
// Get delay function
|
|
52
|
+
const getDelay = typeof delayOption === "function"
|
|
53
|
+
? delayOption
|
|
54
|
+
: typeof delayOption === "number"
|
|
55
|
+
? () => delayOption
|
|
56
|
+
: retryStrategy[delayOption];
|
|
57
|
+
return (next) => async (ctx, ...args) => {
|
|
58
|
+
let lastError;
|
|
59
|
+
for (let attempt = 0; attempt < retries; attempt++) {
|
|
60
|
+
try {
|
|
61
|
+
return await next(ctx, ...args);
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
lastError = error;
|
|
65
|
+
// Don't retry if cancelled
|
|
66
|
+
if (ctx.signal.aborted) {
|
|
67
|
+
throw error;
|
|
68
|
+
}
|
|
69
|
+
// Don't delay on last attempt
|
|
70
|
+
if (attempt < retries - 1) {
|
|
71
|
+
const delayResult = getDelay(attempt, lastError);
|
|
72
|
+
if (typeof delayResult === "number") {
|
|
73
|
+
// Abort-aware delay
|
|
74
|
+
await new Promise((resolve, reject) => {
|
|
75
|
+
const timer = setTimeout(resolve, delayResult);
|
|
76
|
+
const onAbort = () => {
|
|
77
|
+
clearTimeout(timer);
|
|
78
|
+
reject(ctx.signal.reason ?? new Error("Aborted"));
|
|
79
|
+
};
|
|
80
|
+
if (ctx.signal.aborted) {
|
|
81
|
+
onAbort();
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
ctx.signal.addEventListener("abort", onAbort, { once: true });
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
// Promise<void> - wait for it (e.g., wait for network)
|
|
90
|
+
await delayResult;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
throw lastError;
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Catch and handle errors with a callback (without swallowing them).
|
|
100
|
+
*
|
|
101
|
+
* @example
|
|
102
|
+
* ```ts
|
|
103
|
+
* fn.use(catchError((error) => {
|
|
104
|
+
* console.error("Failed:", error.message);
|
|
105
|
+
* analytics.track("error", { message: error.message });
|
|
106
|
+
* }))
|
|
107
|
+
* ```
|
|
108
|
+
*/
|
|
109
|
+
export function catchError(callback) {
|
|
110
|
+
return (next) => async (ctx, ...args) => {
|
|
111
|
+
try {
|
|
112
|
+
return await next(ctx, ...args);
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
callback(error, ctx, ...args);
|
|
116
|
+
throw error;
|
|
117
|
+
}
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Add timeout to abort after specified milliseconds.
|
|
122
|
+
*
|
|
123
|
+
* @example
|
|
124
|
+
* ```ts
|
|
125
|
+
* // Abort after 5 seconds
|
|
126
|
+
* fn.use(timeout(5000))
|
|
127
|
+
*
|
|
128
|
+
* // With custom error message
|
|
129
|
+
* fn.use(timeout(5000, "Request timed out"))
|
|
130
|
+
* ```
|
|
131
|
+
*/
|
|
132
|
+
export function timeout(ms, message = "Operation timed out") {
|
|
133
|
+
return (next) => async (ctx, ...args) => {
|
|
134
|
+
// Create timeout promise
|
|
135
|
+
const timeoutPromise = new Promise((_, reject) => {
|
|
136
|
+
const timer = setTimeout(() => {
|
|
137
|
+
reject(new Error(message));
|
|
138
|
+
}, ms);
|
|
139
|
+
// Clear timeout if signal is aborted
|
|
140
|
+
ctx.signal.addEventListener("abort", () => clearTimeout(timer));
|
|
141
|
+
});
|
|
142
|
+
// Race between operation and timeout (cancellation-aware)
|
|
143
|
+
return ctx.safe.race([next(ctx, ...args), timeoutPromise]);
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Debounce calls - only execute after delay with no new calls.
|
|
148
|
+
*
|
|
149
|
+
* Note: This creates a shared timer, so multiple calls to the same
|
|
150
|
+
* debounced function will share the debounce state.
|
|
151
|
+
*
|
|
152
|
+
* @example
|
|
153
|
+
* ```ts
|
|
154
|
+
* // Debounce search - only execute 300ms after last keystroke
|
|
155
|
+
* const debouncedSearch = search.use(debounce(300));
|
|
156
|
+
* ```
|
|
157
|
+
*/
|
|
158
|
+
export function debounce(ms) {
|
|
159
|
+
let timeoutId;
|
|
160
|
+
return (next) => async (ctx, ...args) => {
|
|
161
|
+
// Clear previous timeout
|
|
162
|
+
if (timeoutId) {
|
|
163
|
+
clearTimeout(timeoutId);
|
|
164
|
+
}
|
|
165
|
+
// Return a promise that will be resolved when the debounce completes
|
|
166
|
+
return new Promise((resolve, reject) => {
|
|
167
|
+
timeoutId = setTimeout(async () => {
|
|
168
|
+
try {
|
|
169
|
+
const result = await next(ctx, ...args);
|
|
170
|
+
resolve(result);
|
|
171
|
+
}
|
|
172
|
+
catch (error) {
|
|
173
|
+
reject(error);
|
|
174
|
+
}
|
|
175
|
+
}, ms);
|
|
176
|
+
// Cancel on abort
|
|
177
|
+
ctx.signal.addEventListener("abort", () => {
|
|
178
|
+
if (timeoutId) {
|
|
179
|
+
clearTimeout(timeoutId);
|
|
180
|
+
reject(new Error("Debounced operation cancelled"));
|
|
181
|
+
}
|
|
182
|
+
});
|
|
183
|
+
});
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Throttle calls - only execute once per time window.
|
|
188
|
+
*
|
|
189
|
+
* @example
|
|
190
|
+
* ```ts
|
|
191
|
+
* // Throttle to max once per second
|
|
192
|
+
* const throttledSave = save.use(throttle(1000));
|
|
193
|
+
* ```
|
|
194
|
+
*/
|
|
195
|
+
export function throttle(ms) {
|
|
196
|
+
let lastCall = 0;
|
|
197
|
+
let lastResult;
|
|
198
|
+
let pending;
|
|
199
|
+
return (next) => async (ctx, ...args) => {
|
|
200
|
+
const now = Date.now();
|
|
201
|
+
// If within throttle window, return last result or wait for pending
|
|
202
|
+
if (now - lastCall < ms) {
|
|
203
|
+
if (pending) {
|
|
204
|
+
return pending;
|
|
205
|
+
}
|
|
206
|
+
if (lastResult !== undefined) {
|
|
207
|
+
return lastResult;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
lastCall = now;
|
|
211
|
+
pending = next(ctx, ...args);
|
|
212
|
+
try {
|
|
213
|
+
lastResult = await pending;
|
|
214
|
+
return lastResult;
|
|
215
|
+
}
|
|
216
|
+
finally {
|
|
217
|
+
pending = undefined;
|
|
218
|
+
}
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Return a fallback value on error instead of throwing.
|
|
223
|
+
*
|
|
224
|
+
* @example
|
|
225
|
+
* ```ts
|
|
226
|
+
* // Return null on error
|
|
227
|
+
* fn.use(fallback(null))
|
|
228
|
+
*
|
|
229
|
+
* // Return empty array on error
|
|
230
|
+
* fn.use(fallback([]))
|
|
231
|
+
*
|
|
232
|
+
* // Dynamic fallback based on error
|
|
233
|
+
* fn.use(fallback((error) => ({ error: error.message })))
|
|
234
|
+
* ```
|
|
235
|
+
*/
|
|
236
|
+
export function fallback(value) {
|
|
237
|
+
return (next) => async (ctx, ...args) => {
|
|
238
|
+
try {
|
|
239
|
+
return await next(ctx, ...args);
|
|
240
|
+
}
|
|
241
|
+
catch (error) {
|
|
242
|
+
// Don't fallback on abort - propagate cancellation
|
|
243
|
+
if (ctx.signal.aborted) {
|
|
244
|
+
throw error;
|
|
245
|
+
}
|
|
246
|
+
return typeof value === "function"
|
|
247
|
+
? value(error, ctx, ...args)
|
|
248
|
+
: value;
|
|
249
|
+
}
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Cache results with TTL. Results are cached by serialized arguments.
|
|
254
|
+
*
|
|
255
|
+
* Note: This creates a shared cache, so all calls to the same
|
|
256
|
+
* cached function share the cache.
|
|
257
|
+
*
|
|
258
|
+
* @example
|
|
259
|
+
* ```ts
|
|
260
|
+
* // Cache for 5 minutes
|
|
261
|
+
* fn.use(cache(5 * 60 * 1000))
|
|
262
|
+
*
|
|
263
|
+
* // Cache with custom key function
|
|
264
|
+
* fn.use(cache({ ttl: 60000, key: (id) => `user:${id}` }))
|
|
265
|
+
* ```
|
|
266
|
+
*/
|
|
267
|
+
export function cache(ttlOrOptions) {
|
|
268
|
+
const options = typeof ttlOrOptions === "number" ? { ttl: ttlOrOptions } : ttlOrOptions;
|
|
269
|
+
const { ttl, key: keyFn = (...args) => JSON.stringify(args) } = options;
|
|
270
|
+
const cacheMap = new Map();
|
|
271
|
+
return (next) => async (ctx, ...args) => {
|
|
272
|
+
const cacheKey = keyFn(...args);
|
|
273
|
+
const now = Date.now();
|
|
274
|
+
// Check cache
|
|
275
|
+
const cached = cacheMap.get(cacheKey);
|
|
276
|
+
if (cached && cached.expires > now) {
|
|
277
|
+
return cached.value;
|
|
278
|
+
}
|
|
279
|
+
// Execute and cache
|
|
280
|
+
const result = await next(ctx, ...args);
|
|
281
|
+
cacheMap.set(cacheKey, { value: result, expires: now + ttl });
|
|
282
|
+
return result;
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* Rate limit calls - queue excess calls beyond the limit.
|
|
287
|
+
*
|
|
288
|
+
* Note: This creates shared state, so all calls to the same
|
|
289
|
+
* rate-limited function share the rate limit.
|
|
290
|
+
*
|
|
291
|
+
* @example
|
|
292
|
+
* ```ts
|
|
293
|
+
* // Max 10 calls per second
|
|
294
|
+
* fn.use(rateLimit({ limit: 10, window: 1000 }))
|
|
295
|
+
*
|
|
296
|
+
* // Max 100 calls per minute
|
|
297
|
+
* fn.use(rateLimit({ limit: 100, window: 60000 }))
|
|
298
|
+
* ```
|
|
299
|
+
*/
|
|
300
|
+
export function rateLimit(options) {
|
|
301
|
+
const { limit, window } = options;
|
|
302
|
+
const timestamps = [];
|
|
303
|
+
const queue = [];
|
|
304
|
+
let processing = false;
|
|
305
|
+
const processQueue = async () => {
|
|
306
|
+
if (processing || queue.length === 0)
|
|
307
|
+
return;
|
|
308
|
+
processing = true;
|
|
309
|
+
while (queue.length > 0) {
|
|
310
|
+
const now = Date.now();
|
|
311
|
+
// Remove expired timestamps
|
|
312
|
+
while (timestamps.length > 0 && timestamps[0] <= now - window) {
|
|
313
|
+
timestamps.shift();
|
|
314
|
+
}
|
|
315
|
+
// Check if we can process
|
|
316
|
+
if (timestamps.length < limit) {
|
|
317
|
+
const item = queue.shift();
|
|
318
|
+
// Skip if already aborted
|
|
319
|
+
if (item.ctx.signal.aborted) {
|
|
320
|
+
item.reject(item.ctx.signal.reason ?? new Error("Aborted"));
|
|
321
|
+
continue;
|
|
322
|
+
}
|
|
323
|
+
timestamps.push(now);
|
|
324
|
+
try {
|
|
325
|
+
const result = await item.next(item.ctx, ...item.args);
|
|
326
|
+
item.resolve(result);
|
|
327
|
+
}
|
|
328
|
+
catch (error) {
|
|
329
|
+
item.reject(error);
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
else {
|
|
333
|
+
// Wait until oldest timestamp expires
|
|
334
|
+
const waitTime = timestamps[0] + window - now;
|
|
335
|
+
await new Promise((r) => setTimeout(r, waitTime));
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
processing = false;
|
|
339
|
+
};
|
|
340
|
+
return (next) => async (ctx, ...args) => {
|
|
341
|
+
const now = Date.now();
|
|
342
|
+
// Remove expired timestamps
|
|
343
|
+
while (timestamps.length > 0 && timestamps[0] <= now - window) {
|
|
344
|
+
timestamps.shift();
|
|
345
|
+
}
|
|
346
|
+
// If under limit, execute immediately
|
|
347
|
+
if (timestamps.length < limit) {
|
|
348
|
+
timestamps.push(now);
|
|
349
|
+
return next(ctx, ...args);
|
|
350
|
+
}
|
|
351
|
+
// Queue the request
|
|
352
|
+
return new Promise((resolve, reject) => {
|
|
353
|
+
queue.push({ resolve, reject, ctx, args, next });
|
|
354
|
+
// Handle abort
|
|
355
|
+
ctx.signal.addEventListener("abort", () => {
|
|
356
|
+
const index = queue.findIndex((item) => item.ctx === ctx);
|
|
357
|
+
if (index !== -1) {
|
|
358
|
+
queue.splice(index, 1);
|
|
359
|
+
reject(ctx.signal.reason ?? new Error("Aborted"));
|
|
360
|
+
}
|
|
361
|
+
}, { once: true });
|
|
362
|
+
processQueue();
|
|
363
|
+
});
|
|
364
|
+
};
|
|
365
|
+
}
|
|
366
|
+
/**
|
|
367
|
+
* Circuit breaker - fail fast after repeated errors.
|
|
368
|
+
*
|
|
369
|
+
* States:
|
|
370
|
+
* - closed: Normal operation, requests pass through
|
|
371
|
+
* - open: Circuit tripped, requests fail immediately
|
|
372
|
+
* - half-open: Testing if service recovered (allows one request)
|
|
373
|
+
*
|
|
374
|
+
* @example
|
|
375
|
+
* ```ts
|
|
376
|
+
* // Open after 5 failures, try again after 30s
|
|
377
|
+
* fn.use(circuitBreaker())
|
|
378
|
+
*
|
|
379
|
+
* // Custom threshold and reset timeout
|
|
380
|
+
* fn.use(circuitBreaker({ threshold: 3, resetTimeout: 10000 }))
|
|
381
|
+
* ```
|
|
382
|
+
*/
|
|
383
|
+
export function circuitBreaker(options = {}) {
|
|
384
|
+
const { threshold = 5, resetTimeout = 30000 } = options;
|
|
385
|
+
let state = "closed";
|
|
386
|
+
let failures = 0;
|
|
387
|
+
let lastFailure = 0;
|
|
388
|
+
return (next) => async (ctx, ...args) => {
|
|
389
|
+
const now = Date.now();
|
|
390
|
+
// Check if we should transition from open to half-open
|
|
391
|
+
if (state === "open" && now - lastFailure >= resetTimeout) {
|
|
392
|
+
state = "half-open";
|
|
393
|
+
}
|
|
394
|
+
// Fail fast if circuit is open
|
|
395
|
+
if (state === "open") {
|
|
396
|
+
throw new Error(`Circuit breaker is open. Retry after ${Math.ceil((lastFailure + resetTimeout - now) / 1000)}s`);
|
|
397
|
+
}
|
|
398
|
+
try {
|
|
399
|
+
const result = await next(ctx, ...args);
|
|
400
|
+
// Success - reset on half-open or decrement failures
|
|
401
|
+
if (state === "half-open") {
|
|
402
|
+
state = "closed";
|
|
403
|
+
failures = 0;
|
|
404
|
+
}
|
|
405
|
+
else if (failures > 0) {
|
|
406
|
+
failures--;
|
|
407
|
+
}
|
|
408
|
+
return result;
|
|
409
|
+
}
|
|
410
|
+
catch (error) {
|
|
411
|
+
// Don't count aborts as failures
|
|
412
|
+
if (ctx.signal.aborted) {
|
|
413
|
+
throw error;
|
|
414
|
+
}
|
|
415
|
+
failures++;
|
|
416
|
+
lastFailure = now;
|
|
417
|
+
// Trip the circuit if threshold reached
|
|
418
|
+
if (failures >= threshold) {
|
|
419
|
+
state = "open";
|
|
420
|
+
}
|
|
421
|
+
throw error;
|
|
422
|
+
}
|
|
423
|
+
};
|
|
424
|
+
}
|
|
425
|
+
/**
|
|
426
|
+
* Create a simplified wrapper for argument/result transformations.
|
|
427
|
+
*
|
|
428
|
+
* Unlike regular wrappers, `map()` hides the `ctx` parameter, providing
|
|
429
|
+
* a simple `next(...args)` function. Use this for transformations that
|
|
430
|
+
* don't need access to the abort signal.
|
|
431
|
+
*
|
|
432
|
+
* @example
|
|
433
|
+
* ```ts
|
|
434
|
+
* // Transform return type: User → string
|
|
435
|
+
* const getUserName = getUser.use(
|
|
436
|
+
* map(async (next, id: string) => {
|
|
437
|
+
* const user = await next(id);
|
|
438
|
+
* return user.name;
|
|
439
|
+
* })
|
|
440
|
+
* );
|
|
441
|
+
*
|
|
442
|
+
* // Change argument signature: email → id lookup
|
|
443
|
+
* const getUserByEmail = getUser.use(
|
|
444
|
+
* map(async (next, email: string) => {
|
|
445
|
+
* const id = await lookupUserId(email);
|
|
446
|
+
* return next(id);
|
|
447
|
+
* })
|
|
448
|
+
* );
|
|
449
|
+
*
|
|
450
|
+
* // Combine multiple calls
|
|
451
|
+
* const getUserWithPosts = getUser.use(
|
|
452
|
+
* map(async (next, id: string) => {
|
|
453
|
+
* const [user, posts] = await Promise.all([
|
|
454
|
+
* next(id),
|
|
455
|
+
* fetchPosts(id),
|
|
456
|
+
* ]);
|
|
457
|
+
* return { ...user, posts };
|
|
458
|
+
* })
|
|
459
|
+
* );
|
|
460
|
+
* ```
|
|
461
|
+
*/
|
|
462
|
+
export function map(mapper) {
|
|
463
|
+
return (next) => async (ctx, ...newArgs) => {
|
|
464
|
+
return mapper((...args) => next(ctx, ...args), ...newArgs);
|
|
465
|
+
};
|
|
466
|
+
}
|
|
467
|
+
/**
|
|
468
|
+
* Observe lifecycle events of an abortable function.
|
|
469
|
+
* Useful for logging, analytics, loading indicators, or cleanup on abort.
|
|
470
|
+
*
|
|
471
|
+
* The `onStart` callback is invoked when the function starts. It can optionally
|
|
472
|
+
* return an object with lifecycle callbacks:
|
|
473
|
+
* - `onAbort` - Called when the function is aborted
|
|
474
|
+
* - `onSuccess` - Called when the function completes successfully (receives result)
|
|
475
|
+
* - `onError` - Called when the function throws (error is re-thrown after)
|
|
476
|
+
* - `onDone` - Called after completion, regardless of outcome (like finally)
|
|
477
|
+
*
|
|
478
|
+
* @param onStart - Called when the function starts. Can return lifecycle callbacks.
|
|
479
|
+
*
|
|
480
|
+
* @example Simple logging (no callbacks returned)
|
|
481
|
+
* ```ts
|
|
482
|
+
* const fetchUser = abortable(async (ctx, id: string) => { ... })
|
|
483
|
+
* .use(observe((ctx, id) => {
|
|
484
|
+
* console.log(`Fetching user ${id}`);
|
|
485
|
+
* }));
|
|
486
|
+
* ```
|
|
487
|
+
*
|
|
488
|
+
* @example Abort handling
|
|
489
|
+
* ```ts
|
|
490
|
+
* const fetchUser = abortable(async (ctx, id: string) => { ... })
|
|
491
|
+
* .use(observe((ctx, id) => ({
|
|
492
|
+
* onAbort: () => console.log(`Fetch ${id} aborted`),
|
|
493
|
+
* })));
|
|
494
|
+
* ```
|
|
495
|
+
*
|
|
496
|
+
* @example Loading indicator with cleanup
|
|
497
|
+
* ```ts
|
|
498
|
+
* const fetchData = abortable(async () => { ... })
|
|
499
|
+
* .use(observe(() => {
|
|
500
|
+
* showLoading();
|
|
501
|
+
* return { onDone: hideLoading };
|
|
502
|
+
* }));
|
|
503
|
+
* ```
|
|
504
|
+
*
|
|
505
|
+
* @example Full lifecycle
|
|
506
|
+
* ```ts
|
|
507
|
+
* const fetchUser = abortable(async (ctx, id: string) => { ... })
|
|
508
|
+
* .use(observe((ctx, id) => ({
|
|
509
|
+
* onAbort: () => console.log(`Aborted: ${id}`),
|
|
510
|
+
* onSuccess: (user) => console.log(`Fetched: ${user.name}`),
|
|
511
|
+
* onError: (err) => console.error(`Failed: ${err}`),
|
|
512
|
+
* onDone: () => console.log('Completed'),
|
|
513
|
+
* })));
|
|
514
|
+
* ```
|
|
515
|
+
*/
|
|
516
|
+
export function observe(onStart) {
|
|
517
|
+
return (next) => async (ctx, ...args) => {
|
|
518
|
+
// Call onStart and capture returned cleanup
|
|
519
|
+
const onStartResult = onStart(ctx, ...args);
|
|
520
|
+
if (!onStartResult) {
|
|
521
|
+
return next(ctx, ...args);
|
|
522
|
+
}
|
|
523
|
+
const { onAbort, onSuccess, onError, onDone } = onStartResult ?? {};
|
|
524
|
+
// Register abort handlers if any cleanup is needed
|
|
525
|
+
if (onAbort) {
|
|
526
|
+
ctx.signal.addEventListener("abort", onAbort, { once: true });
|
|
527
|
+
}
|
|
528
|
+
try {
|
|
529
|
+
const result = await next(ctx, ...args);
|
|
530
|
+
onSuccess?.(result);
|
|
531
|
+
return result;
|
|
532
|
+
}
|
|
533
|
+
catch (error) {
|
|
534
|
+
onError?.(error);
|
|
535
|
+
throw error;
|
|
536
|
+
}
|
|
537
|
+
finally {
|
|
538
|
+
onDone?.();
|
|
539
|
+
}
|
|
540
|
+
};
|
|
541
|
+
}
|
|
542
|
+
//# sourceMappingURL=wrappers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wrappers.js","sourceRoot":"","sources":["../../src/async/wrappers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wrappers.test.d.ts","sourceRoot":"","sources":["../../src/async/wrappers.test.ts"],"names":[],"mappings":""}
|