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,535 @@
|
|
|
1
|
+
import { describe, it, expect, vi } from "vitest";
|
|
2
|
+
import { abortable, isAbortable, AbortableAbortedError, } from "./abortable";
|
|
3
|
+
import { async } from "./async";
|
|
4
|
+
describe("abortable", () => {
|
|
5
|
+
describe("abortable()", () => {
|
|
6
|
+
it("should create an abortable function", () => {
|
|
7
|
+
const fn = abortable(({}, x) => Promise.resolve(x * 2));
|
|
8
|
+
expect(typeof fn).toBe("function");
|
|
9
|
+
expect(typeof fn.withSignal).toBe("function");
|
|
10
|
+
expect(typeof fn.use).toBe("function");
|
|
11
|
+
expect(isAbortable(fn)).toBe(true);
|
|
12
|
+
});
|
|
13
|
+
it("should create AbortController when called directly", async () => {
|
|
14
|
+
const handler = vi.fn(({ signal }, x) => {
|
|
15
|
+
expect(signal).toBeDefined();
|
|
16
|
+
expect(signal).toBeInstanceOf(AbortSignal);
|
|
17
|
+
void signal; // Use signal to avoid unused warning
|
|
18
|
+
return Promise.resolve(x * 2);
|
|
19
|
+
});
|
|
20
|
+
const fn = abortable(handler);
|
|
21
|
+
const result = await fn(5);
|
|
22
|
+
expect(result).toBe(10);
|
|
23
|
+
expect(handler).toHaveBeenCalled();
|
|
24
|
+
});
|
|
25
|
+
it("should create own signal when using withSignal() - linked to parent", async () => {
|
|
26
|
+
const controller = new AbortController();
|
|
27
|
+
const handler = vi.fn(({ signal }, x, y) => {
|
|
28
|
+
// Signal is NOT the same as parent - abortable owns its own signal
|
|
29
|
+
expect(signal).toBeDefined();
|
|
30
|
+
expect(signal).toBeInstanceOf(AbortSignal);
|
|
31
|
+
expect(signal).not.toBe(controller.signal);
|
|
32
|
+
void signal; // Use signal to avoid unused warning
|
|
33
|
+
return Promise.resolve(`${x}-${y}`);
|
|
34
|
+
});
|
|
35
|
+
const fn = abortable(handler);
|
|
36
|
+
const result = await fn.withSignal(controller.signal, 42, "hello");
|
|
37
|
+
expect(result).toBe("42-hello");
|
|
38
|
+
expect(handler).toHaveBeenCalled();
|
|
39
|
+
});
|
|
40
|
+
it("should work with async functions", async () => {
|
|
41
|
+
const fn = abortable(async ({}, delay) => {
|
|
42
|
+
await new Promise((r) => setTimeout(r, delay));
|
|
43
|
+
return "done";
|
|
44
|
+
});
|
|
45
|
+
const result = await fn(10);
|
|
46
|
+
expect(result).toBe("done");
|
|
47
|
+
});
|
|
48
|
+
it("should abort when parent signal aborts", async () => {
|
|
49
|
+
const controller = new AbortController();
|
|
50
|
+
const fn = abortable(async ({ signal }, url) => {
|
|
51
|
+
// Wait a bit to allow abort to propagate
|
|
52
|
+
await new Promise((r) => setTimeout(r, 10));
|
|
53
|
+
if (signal.aborted) {
|
|
54
|
+
throw new AbortableAbortedError();
|
|
55
|
+
}
|
|
56
|
+
return `fetched: ${url}`;
|
|
57
|
+
});
|
|
58
|
+
controller.abort();
|
|
59
|
+
await expect(fn.withSignal(controller.signal, "/api")).rejects.toThrow(AbortableAbortedError);
|
|
60
|
+
});
|
|
61
|
+
it("should provide safe() in context", async () => {
|
|
62
|
+
const innerFn = abortable(async ({ signal: _signal }, value) => {
|
|
63
|
+
return `inner-${value}`;
|
|
64
|
+
});
|
|
65
|
+
const outerFn = abortable(async ({ safe }, value) => {
|
|
66
|
+
// Use safe to call another abortable function
|
|
67
|
+
const innerResult = await safe(innerFn, "test");
|
|
68
|
+
return `outer-${value}-${innerResult}`;
|
|
69
|
+
});
|
|
70
|
+
const result = await outerFn("hello");
|
|
71
|
+
expect(result).toBe("outer-hello-inner-test");
|
|
72
|
+
});
|
|
73
|
+
it("should create new AbortController when withSignal() receives undefined", async () => {
|
|
74
|
+
const handler = vi.fn(({ signal }) => {
|
|
75
|
+
expect(signal).toBeDefined();
|
|
76
|
+
void signal; // Use signal to avoid unused warning
|
|
77
|
+
expect(signal).toBeInstanceOf(AbortSignal);
|
|
78
|
+
return Promise.resolve("ok");
|
|
79
|
+
});
|
|
80
|
+
const fn = abortable(handler);
|
|
81
|
+
await fn.withSignal(undefined);
|
|
82
|
+
expect(handler).toHaveBeenCalled();
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
describe("AbortableResult control methods", () => {
|
|
86
|
+
it("should return AbortableResult with status methods", async () => {
|
|
87
|
+
const fn = abortable(async () => {
|
|
88
|
+
await new Promise((r) => setTimeout(r, 10));
|
|
89
|
+
return "done";
|
|
90
|
+
});
|
|
91
|
+
const result = fn();
|
|
92
|
+
expect(typeof result.status).toBe("function");
|
|
93
|
+
expect(typeof result.running).toBe("function");
|
|
94
|
+
expect(typeof result.succeeded).toBe("function");
|
|
95
|
+
expect(typeof result.failed).toBe("function");
|
|
96
|
+
expect(typeof result.aborted).toBe("function");
|
|
97
|
+
expect(typeof result.paused).toBe("function");
|
|
98
|
+
expect(typeof result.waiting).toBe("function");
|
|
99
|
+
expect(typeof result.completed).toBe("function");
|
|
100
|
+
await result;
|
|
101
|
+
expect(result.succeeded()).toBe(true);
|
|
102
|
+
expect(result.status()).toBe("success");
|
|
103
|
+
});
|
|
104
|
+
it("should support abort() method", async () => {
|
|
105
|
+
const fn = abortable(async ({ signal }) => {
|
|
106
|
+
await new Promise((r) => setTimeout(r, 100));
|
|
107
|
+
if (signal.aborted) {
|
|
108
|
+
throw new AbortableAbortedError();
|
|
109
|
+
}
|
|
110
|
+
return "done";
|
|
111
|
+
});
|
|
112
|
+
const result = fn();
|
|
113
|
+
expect(result.abort()).toBe(true);
|
|
114
|
+
expect(result.abort()).toBe(false); // Already aborted
|
|
115
|
+
await expect(result).rejects.toThrow(AbortableAbortedError);
|
|
116
|
+
expect(result.aborted()).toBe(true);
|
|
117
|
+
expect(result.status()).toBe("aborted");
|
|
118
|
+
});
|
|
119
|
+
it("should support pause() and resume() methods", async () => {
|
|
120
|
+
let step = 0;
|
|
121
|
+
let checkpointReached = false;
|
|
122
|
+
// Pause works at checkpoint() - a manual suspension point
|
|
123
|
+
const fn = abortable(async (ctx) => {
|
|
124
|
+
step = 1;
|
|
125
|
+
// This simulates waiting for something
|
|
126
|
+
await new Promise((r) => setTimeout(r, 20));
|
|
127
|
+
// Then hitting a checkpoint where pause is checked
|
|
128
|
+
await ctx.checkpoint();
|
|
129
|
+
checkpointReached = true;
|
|
130
|
+
step = 2;
|
|
131
|
+
return "done";
|
|
132
|
+
});
|
|
133
|
+
const result = fn();
|
|
134
|
+
// Immediately pause before checkpoint is reached
|
|
135
|
+
result.pause();
|
|
136
|
+
expect(result.paused()).toBe(true);
|
|
137
|
+
// Wait long enough for the setTimeout to complete
|
|
138
|
+
// but checkpoint should block because paused
|
|
139
|
+
await new Promise((r) => setTimeout(r, 50));
|
|
140
|
+
expect(checkpointReached).toBe(false);
|
|
141
|
+
expect(step).toBe(1);
|
|
142
|
+
// Resume - now checkpoint will pass
|
|
143
|
+
result.resume();
|
|
144
|
+
await result;
|
|
145
|
+
expect(checkpointReached).toBe(true);
|
|
146
|
+
expect(step).toBe(2);
|
|
147
|
+
expect(result.succeeded()).toBe(true);
|
|
148
|
+
});
|
|
149
|
+
it("should support send() for events", async () => {
|
|
150
|
+
const fn = abortable(async (ctx) => {
|
|
151
|
+
const confirmed = await ctx.take("confirm");
|
|
152
|
+
return confirmed ? "yes" : "no";
|
|
153
|
+
});
|
|
154
|
+
const result = fn();
|
|
155
|
+
// Should be waiting
|
|
156
|
+
await new Promise((r) => setTimeout(r, 10));
|
|
157
|
+
expect(result.waiting()).toBe(true);
|
|
158
|
+
// Send event
|
|
159
|
+
result.send("confirm", true);
|
|
160
|
+
const value = await result;
|
|
161
|
+
expect(value).toBe("yes");
|
|
162
|
+
});
|
|
163
|
+
it("should support checkpoint pattern (TYield = void)", async () => {
|
|
164
|
+
const steps = [];
|
|
165
|
+
const fn = abortable(async (ctx) => {
|
|
166
|
+
steps.push("step1");
|
|
167
|
+
await ctx.take();
|
|
168
|
+
steps.push("step2");
|
|
169
|
+
await ctx.take();
|
|
170
|
+
steps.push("step3");
|
|
171
|
+
return "done";
|
|
172
|
+
});
|
|
173
|
+
const result = fn();
|
|
174
|
+
await new Promise((r) => setTimeout(r, 10));
|
|
175
|
+
expect(steps).toEqual(["step1"]);
|
|
176
|
+
result.send();
|
|
177
|
+
await new Promise((r) => setTimeout(r, 10));
|
|
178
|
+
expect(steps).toEqual(["step1", "step2"]);
|
|
179
|
+
result.send();
|
|
180
|
+
await result;
|
|
181
|
+
expect(steps).toEqual(["step1", "step2", "step3"]);
|
|
182
|
+
});
|
|
183
|
+
it("should provide result() and error() accessors", async () => {
|
|
184
|
+
const successFn = abortable(async () => "success");
|
|
185
|
+
const errorFn = abortable(async () => {
|
|
186
|
+
throw new Error("test error");
|
|
187
|
+
});
|
|
188
|
+
const successResult = successFn();
|
|
189
|
+
await successResult;
|
|
190
|
+
expect(successResult.result()).toBe("success");
|
|
191
|
+
expect(successResult.error()).toBeUndefined();
|
|
192
|
+
const errorResult = errorFn();
|
|
193
|
+
await expect(errorResult).rejects.toThrow("test error");
|
|
194
|
+
expect(errorResult.result()).toBeUndefined();
|
|
195
|
+
expect(errorResult.error()).toBeInstanceOf(Error);
|
|
196
|
+
});
|
|
197
|
+
});
|
|
198
|
+
describe("use() - chainable wrappers", () => {
|
|
199
|
+
it("should apply a wrapper and return new Abortable", async () => {
|
|
200
|
+
const baseFn = abortable(async ({ signal: _signal }, x) => {
|
|
201
|
+
return x * 2;
|
|
202
|
+
});
|
|
203
|
+
// Create a wrapper that adds 10 to the result
|
|
204
|
+
const wrappedFn = baseFn.use((next) => async (ctx, x) => {
|
|
205
|
+
const result = await next(ctx, x);
|
|
206
|
+
return result + 10;
|
|
207
|
+
});
|
|
208
|
+
expect(isAbortable(wrappedFn)).toBe(true);
|
|
209
|
+
const result = await wrappedFn(5);
|
|
210
|
+
expect(result).toBe(20); // (5 * 2) + 10
|
|
211
|
+
});
|
|
212
|
+
it("should support chaining multiple wrappers", async () => {
|
|
213
|
+
const baseFn = abortable(async ({ signal: _signal }, x) => {
|
|
214
|
+
return x;
|
|
215
|
+
});
|
|
216
|
+
const wrappedFn = baseFn
|
|
217
|
+
.use((next) => async (ctx, x) => {
|
|
218
|
+
const result = await next(ctx, x);
|
|
219
|
+
return result * 2;
|
|
220
|
+
})
|
|
221
|
+
.use((next) => async (ctx, x) => {
|
|
222
|
+
const result = await next(ctx, x);
|
|
223
|
+
return result + 10;
|
|
224
|
+
});
|
|
225
|
+
// Order: base(5) = 5, then *2 = 10, then +10 = 20
|
|
226
|
+
const result = await wrappedFn(5);
|
|
227
|
+
expect(result).toBe(20);
|
|
228
|
+
});
|
|
229
|
+
it("should provide consistent context through wrappers", async () => {
|
|
230
|
+
const signalCaptures = [];
|
|
231
|
+
const baseFn = abortable(async ({ signal }, x) => {
|
|
232
|
+
signalCaptures.push(signal);
|
|
233
|
+
return x;
|
|
234
|
+
});
|
|
235
|
+
const wrappedFn = baseFn.use((next) => async (ctx, x) => {
|
|
236
|
+
signalCaptures.push(ctx.signal);
|
|
237
|
+
return next(ctx, x);
|
|
238
|
+
});
|
|
239
|
+
await wrappedFn(5);
|
|
240
|
+
// Both wrapper and base should see signals (may be different due to wrapping)
|
|
241
|
+
expect(signalCaptures).toHaveLength(2);
|
|
242
|
+
expect(signalCaptures[0]).toBeInstanceOf(AbortSignal);
|
|
243
|
+
expect(signalCaptures[1]).toBeInstanceOf(AbortSignal);
|
|
244
|
+
});
|
|
245
|
+
it("should allow transforming arguments", async () => {
|
|
246
|
+
// Base function takes a number
|
|
247
|
+
const baseFn = abortable(async ({}, x) => {
|
|
248
|
+
return x * 2;
|
|
249
|
+
});
|
|
250
|
+
// Wrapper transforms string to number
|
|
251
|
+
const wrappedFn = baseFn.use((next) => async (ctx, str) => {
|
|
252
|
+
const num = parseInt(str, 10);
|
|
253
|
+
return next(ctx, num);
|
|
254
|
+
});
|
|
255
|
+
const result = await wrappedFn("42");
|
|
256
|
+
expect(result).toBe(84);
|
|
257
|
+
});
|
|
258
|
+
it("should allow retry wrapper pattern", async () => {
|
|
259
|
+
let callCount = 0;
|
|
260
|
+
const flaky = abortable(async ({}) => {
|
|
261
|
+
callCount++;
|
|
262
|
+
if (callCount < 3) {
|
|
263
|
+
throw new Error("Flaky error");
|
|
264
|
+
}
|
|
265
|
+
return "success";
|
|
266
|
+
});
|
|
267
|
+
// Simple retry wrapper
|
|
268
|
+
const withRetry = flaky.use((next) => async (ctx) => {
|
|
269
|
+
let lastError;
|
|
270
|
+
for (let i = 0; i < 3; i++) {
|
|
271
|
+
try {
|
|
272
|
+
return await next(ctx);
|
|
273
|
+
}
|
|
274
|
+
catch (e) {
|
|
275
|
+
lastError = e;
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
throw lastError;
|
|
279
|
+
});
|
|
280
|
+
const result = await withRetry();
|
|
281
|
+
expect(result).toBe("success");
|
|
282
|
+
expect(callCount).toBe(3);
|
|
283
|
+
});
|
|
284
|
+
});
|
|
285
|
+
describe("isAbortable()", () => {
|
|
286
|
+
it("should return true for abortable functions", () => {
|
|
287
|
+
const fn = abortable(({ signal: _signal }, x) => Promise.resolve(x));
|
|
288
|
+
expect(isAbortable(fn)).toBe(true);
|
|
289
|
+
});
|
|
290
|
+
it("should return false for regular functions", () => {
|
|
291
|
+
const fn = (x) => x;
|
|
292
|
+
expect(isAbortable(fn)).toBe(false);
|
|
293
|
+
});
|
|
294
|
+
it("should return false for objects", () => {
|
|
295
|
+
expect(isAbortable({})).toBe(false);
|
|
296
|
+
expect(isAbortable({ with: () => { } })).toBe(false);
|
|
297
|
+
});
|
|
298
|
+
it("should return false for null/undefined", () => {
|
|
299
|
+
expect(isAbortable(null)).toBe(false);
|
|
300
|
+
expect(isAbortable(undefined)).toBe(false);
|
|
301
|
+
});
|
|
302
|
+
});
|
|
303
|
+
describe("type safety", () => {
|
|
304
|
+
it("should preserve function argument types", async () => {
|
|
305
|
+
const fn = abortable(({ signal: _signal }, a, b) => {
|
|
306
|
+
return Promise.resolve(`${a}-${b}`);
|
|
307
|
+
});
|
|
308
|
+
// Direct call
|
|
309
|
+
const r1 = await fn(1, "test");
|
|
310
|
+
expect(r1).toBe("1-test");
|
|
311
|
+
// With signal
|
|
312
|
+
const r2 = await fn.withSignal(undefined, 2, "hello");
|
|
313
|
+
expect(r2).toBe("2-hello");
|
|
314
|
+
});
|
|
315
|
+
it("should preserve async return types", async () => {
|
|
316
|
+
const fn = abortable(async ({ signal: _signal }, x) => {
|
|
317
|
+
return `result-${x}`;
|
|
318
|
+
});
|
|
319
|
+
const result = fn(42);
|
|
320
|
+
expect(await result).toBe("result-42");
|
|
321
|
+
});
|
|
322
|
+
});
|
|
323
|
+
describe("AbortableContext", () => {
|
|
324
|
+
it("should provide aborted() method", async () => {
|
|
325
|
+
let wasAborted = false;
|
|
326
|
+
// Use take() to create a suspension point where we can abort
|
|
327
|
+
const fn = abortable(async (ctx) => {
|
|
328
|
+
await ctx.take("continue");
|
|
329
|
+
wasAborted = ctx.aborted();
|
|
330
|
+
if (wasAborted) {
|
|
331
|
+
throw new AbortableAbortedError();
|
|
332
|
+
}
|
|
333
|
+
return "done";
|
|
334
|
+
});
|
|
335
|
+
const result = fn();
|
|
336
|
+
// Wait for take to be reached
|
|
337
|
+
await new Promise((r) => setTimeout(r, 10));
|
|
338
|
+
expect(result.waiting()).toBe(true);
|
|
339
|
+
// Abort while waiting
|
|
340
|
+
result.abort();
|
|
341
|
+
expect(result.aborted()).toBe(true);
|
|
342
|
+
// The promise should reject
|
|
343
|
+
await expect(result).rejects.toThrow(AbortableAbortedError);
|
|
344
|
+
});
|
|
345
|
+
it("should provide abort() method from inside", async () => {
|
|
346
|
+
const fn = abortable(async (ctx) => {
|
|
347
|
+
ctx.abort();
|
|
348
|
+
// Try to take - should see we're aborted
|
|
349
|
+
try {
|
|
350
|
+
await ctx.take("continue");
|
|
351
|
+
}
|
|
352
|
+
catch (e) {
|
|
353
|
+
if (ctx.aborted()) {
|
|
354
|
+
throw new AbortableAbortedError();
|
|
355
|
+
}
|
|
356
|
+
throw e;
|
|
357
|
+
}
|
|
358
|
+
return "done";
|
|
359
|
+
});
|
|
360
|
+
const result = fn();
|
|
361
|
+
await expect(result).rejects.toThrow(AbortableAbortedError);
|
|
362
|
+
expect(result.aborted()).toBe(true);
|
|
363
|
+
});
|
|
364
|
+
it("should provide checkpoint() that checks abort status", async () => {
|
|
365
|
+
let checkpointPassed = false;
|
|
366
|
+
const fn = abortable(async (ctx) => {
|
|
367
|
+
// Abort immediately
|
|
368
|
+
ctx.abort();
|
|
369
|
+
// Checkpoint should throw because aborted
|
|
370
|
+
await ctx.checkpoint();
|
|
371
|
+
checkpointPassed = true;
|
|
372
|
+
return "done";
|
|
373
|
+
});
|
|
374
|
+
const result = fn();
|
|
375
|
+
await expect(result).rejects.toThrow(AbortableAbortedError);
|
|
376
|
+
expect(checkpointPassed).toBe(false);
|
|
377
|
+
});
|
|
378
|
+
});
|
|
379
|
+
describe("join()", () => {
|
|
380
|
+
it("should join a single abortable result", async () => {
|
|
381
|
+
const innerFn = abortable(async () => {
|
|
382
|
+
await async.delay(10);
|
|
383
|
+
return "inner-result";
|
|
384
|
+
});
|
|
385
|
+
const outerFn = abortable(async (ctx) => {
|
|
386
|
+
const result = await ctx.join(innerFn());
|
|
387
|
+
return `outer-${result}`;
|
|
388
|
+
});
|
|
389
|
+
const result = await outerFn();
|
|
390
|
+
expect(result).toBe("outer-inner-result");
|
|
391
|
+
});
|
|
392
|
+
it("should join multiple abortable results", async () => {
|
|
393
|
+
const fn1 = abortable(async () => {
|
|
394
|
+
await async.delay(10);
|
|
395
|
+
return "a";
|
|
396
|
+
});
|
|
397
|
+
const fn2 = abortable(async () => {
|
|
398
|
+
await async.delay(20);
|
|
399
|
+
return "b";
|
|
400
|
+
});
|
|
401
|
+
const fn3 = abortable(async () => {
|
|
402
|
+
await async.delay(5);
|
|
403
|
+
return "c";
|
|
404
|
+
});
|
|
405
|
+
const outerFn = abortable(async (ctx) => {
|
|
406
|
+
const [r1, r2, r3] = await ctx.join([fn1(), fn2(), fn3()]);
|
|
407
|
+
return `${r1}-${r2}-${r3}`;
|
|
408
|
+
});
|
|
409
|
+
const result = await outerFn();
|
|
410
|
+
expect(result).toBe("a-b-c");
|
|
411
|
+
});
|
|
412
|
+
it("should abort joined results when parent aborts", async () => {
|
|
413
|
+
const abortedResults = [];
|
|
414
|
+
const innerFn = abortable(async (ctx, id) => {
|
|
415
|
+
await async.delay(100);
|
|
416
|
+
if (ctx.aborted()) {
|
|
417
|
+
abortedResults.push(id);
|
|
418
|
+
throw new AbortableAbortedError();
|
|
419
|
+
}
|
|
420
|
+
return id;
|
|
421
|
+
});
|
|
422
|
+
const outerFn = abortable(async (ctx) => {
|
|
423
|
+
const [r1, r2] = await ctx.join([innerFn("a"), innerFn("b")]);
|
|
424
|
+
return `${r1}-${r2}`;
|
|
425
|
+
});
|
|
426
|
+
const result = outerFn();
|
|
427
|
+
// Abort after a short delay
|
|
428
|
+
await async.delay(20);
|
|
429
|
+
result.abort();
|
|
430
|
+
await expect(result).rejects.toThrow(AbortableAbortedError);
|
|
431
|
+
});
|
|
432
|
+
it("should abort remaining joined results if one fails", async () => {
|
|
433
|
+
const innerFn1 = abortable(async () => {
|
|
434
|
+
await async.delay(50);
|
|
435
|
+
return "success";
|
|
436
|
+
});
|
|
437
|
+
const innerFn2 = abortable(async () => {
|
|
438
|
+
await async.delay(10);
|
|
439
|
+
throw new Error("inner error");
|
|
440
|
+
});
|
|
441
|
+
const outerFn = abortable(async (ctx) => {
|
|
442
|
+
const [r1, r2] = await ctx.join([innerFn1(), innerFn2()]);
|
|
443
|
+
return `${r1}-${r2}`;
|
|
444
|
+
});
|
|
445
|
+
await expect(outerFn()).rejects.toThrow("inner error");
|
|
446
|
+
});
|
|
447
|
+
it("should respect pause/checkpoint after join completes", async () => {
|
|
448
|
+
const innerFn = abortable(async () => {
|
|
449
|
+
await async.delay(10);
|
|
450
|
+
return "inner";
|
|
451
|
+
});
|
|
452
|
+
let pauseChecked = false;
|
|
453
|
+
const outerFn = abortable(async (ctx) => {
|
|
454
|
+
const r = await ctx.join(innerFn());
|
|
455
|
+
pauseChecked = true;
|
|
456
|
+
return r;
|
|
457
|
+
});
|
|
458
|
+
const result = outerFn();
|
|
459
|
+
const value = await result;
|
|
460
|
+
expect(value).toBe("inner");
|
|
461
|
+
expect(pauseChecked).toBe(true);
|
|
462
|
+
});
|
|
463
|
+
it("should throw AbortableAbortedError if already aborted before join", async () => {
|
|
464
|
+
const innerFn = abortable(async () => "inner");
|
|
465
|
+
const outerFn = abortable(async (ctx) => {
|
|
466
|
+
ctx.abort();
|
|
467
|
+
const r = await ctx.join(innerFn());
|
|
468
|
+
return r;
|
|
469
|
+
});
|
|
470
|
+
await expect(outerFn()).rejects.toThrow(AbortableAbortedError);
|
|
471
|
+
});
|
|
472
|
+
});
|
|
473
|
+
describe("safe() with abortable", () => {
|
|
474
|
+
it("should automatically join abortable when passed to safe()", async () => {
|
|
475
|
+
const innerFn = abortable(async () => {
|
|
476
|
+
await async.delay(10);
|
|
477
|
+
return "inner-result";
|
|
478
|
+
});
|
|
479
|
+
const outerFn = abortable(async (ctx) => {
|
|
480
|
+
const result = await ctx.safe(innerFn);
|
|
481
|
+
return `outer-${result}`;
|
|
482
|
+
});
|
|
483
|
+
const result = outerFn();
|
|
484
|
+
const value = await result;
|
|
485
|
+
expect(value).toBe("outer-inner-result");
|
|
486
|
+
});
|
|
487
|
+
it("should abort child abortable when parent is aborted via safe()", async () => {
|
|
488
|
+
let childAborted = false;
|
|
489
|
+
const innerFn = abortable(async (ctx) => {
|
|
490
|
+
await async.delay(100);
|
|
491
|
+
if (ctx.aborted()) {
|
|
492
|
+
childAborted = true;
|
|
493
|
+
}
|
|
494
|
+
return "inner";
|
|
495
|
+
});
|
|
496
|
+
const outerFn = abortable(async (ctx) => {
|
|
497
|
+
const result = await ctx.safe(innerFn);
|
|
498
|
+
return result;
|
|
499
|
+
});
|
|
500
|
+
const result = outerFn();
|
|
501
|
+
// Abort the parent after a short delay
|
|
502
|
+
await async.delay(10);
|
|
503
|
+
result.abort();
|
|
504
|
+
await expect(result).rejects.toThrow(AbortableAbortedError);
|
|
505
|
+
// Give time for child to detect abort
|
|
506
|
+
await async.delay(10);
|
|
507
|
+
expect(childAborted).toBe(true);
|
|
508
|
+
});
|
|
509
|
+
it("should pass arguments to abortable via safe()", async () => {
|
|
510
|
+
const innerFn = abortable(async (_ctx, a, b) => {
|
|
511
|
+
return `${a}-${b}`;
|
|
512
|
+
});
|
|
513
|
+
const outerFn = abortable(async (ctx) => {
|
|
514
|
+
const result = await ctx.safe(innerFn, 42, "hello");
|
|
515
|
+
return result;
|
|
516
|
+
});
|
|
517
|
+
const value = await outerFn();
|
|
518
|
+
expect(value).toBe("42-hello");
|
|
519
|
+
});
|
|
520
|
+
it("should propagate signal to child abortable via safe()", async () => {
|
|
521
|
+
let receivedSignal = null;
|
|
522
|
+
const innerFn = abortable(async (ctx) => {
|
|
523
|
+
receivedSignal = ctx.signal;
|
|
524
|
+
return "done";
|
|
525
|
+
});
|
|
526
|
+
const outerFn = abortable(async (ctx) => {
|
|
527
|
+
return await ctx.safe(innerFn);
|
|
528
|
+
});
|
|
529
|
+
await outerFn();
|
|
530
|
+
expect(receivedSignal).not.toBeNull();
|
|
531
|
+
expect(receivedSignal.aborted).toBe(false);
|
|
532
|
+
});
|
|
533
|
+
});
|
|
534
|
+
});
|
|
535
|
+
//# sourceMappingURL=abortable.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"abortable.test.js","sourceRoot":"","sources":["../../src/async/abortable.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type check file for abortable functions and wrapper chaining.
|
|
3
|
+
* This file should compile without errors - no runtime tests needed.
|
|
4
|
+
*
|
|
5
|
+
* Run: npx tsc --noEmit src/async/abortable.typeCheck.ts
|
|
6
|
+
*/
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=abortable.typeCheck.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"abortable.typeCheck.d.ts","sourceRoot":"","sources":["../../src/async/abortable.typeCheck.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|