actly 1.1.0 → 1.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.
Files changed (130) hide show
  1. package/LICENSE +0 -0
  2. package/README.md +262 -232
  3. package/dist/core/act.cjs +505 -39
  4. package/dist/core/act.d.ts +81 -10
  5. package/dist/core/act.d.ts.map +1 -1
  6. package/dist/core/act.js +504 -40
  7. package/dist/core/act.js.map +1 -1
  8. package/dist/core/executor.cjs +21 -9
  9. package/dist/core/executor.d.ts +31 -6
  10. package/dist/core/executor.d.ts.map +1 -1
  11. package/dist/core/executor.js +21 -9
  12. package/dist/core/executor.js.map +1 -1
  13. package/dist/core/health.cjs +34 -0
  14. package/dist/core/health.d.ts +18 -0
  15. package/dist/core/health.d.ts.map +1 -0
  16. package/dist/core/health.js +28 -0
  17. package/dist/core/health.js.map +1 -0
  18. package/dist/core/shutdown.cjs +60 -0
  19. package/dist/core/shutdown.d.ts +8 -0
  20. package/dist/core/shutdown.d.ts.map +1 -0
  21. package/dist/core/shutdown.js +56 -0
  22. package/dist/core/shutdown.js.map +1 -0
  23. package/dist/core/tenant.cjs +71 -0
  24. package/dist/core/tenant.d.ts +29 -0
  25. package/dist/core/tenant.d.ts.map +1 -0
  26. package/dist/core/tenant.js +68 -0
  27. package/dist/core/tenant.js.map +1 -0
  28. package/dist/errors.cjs +182 -0
  29. package/dist/errors.d.ts +151 -0
  30. package/dist/errors.d.ts.map +1 -0
  31. package/dist/errors.js +171 -0
  32. package/dist/errors.js.map +1 -0
  33. package/dist/index.cjs +56 -6
  34. package/dist/index.d.ts +22 -3
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js +24 -4
  37. package/dist/index.js.map +1 -1
  38. package/dist/observability.cjs +45 -0
  39. package/dist/observability.d.ts +145 -0
  40. package/dist/observability.d.ts.map +1 -0
  41. package/dist/observability.js +43 -0
  42. package/dist/observability.js.map +1 -0
  43. package/dist/policies/bulkhead.cjs +97 -0
  44. package/dist/policies/bulkhead.d.ts +3 -0
  45. package/dist/policies/bulkhead.d.ts.map +1 -0
  46. package/dist/policies/bulkhead.js +95 -0
  47. package/dist/policies/bulkhead.js.map +1 -0
  48. package/dist/policies/cache.cjs +223 -22
  49. package/dist/policies/cache.d.ts +42 -7
  50. package/dist/policies/cache.d.ts.map +1 -1
  51. package/dist/policies/cache.js +223 -22
  52. package/dist/policies/cache.js.map +1 -1
  53. package/dist/policies/circuitBreaker.cjs +85 -0
  54. package/dist/policies/circuitBreaker.d.ts +3 -0
  55. package/dist/policies/circuitBreaker.d.ts.map +1 -0
  56. package/dist/policies/circuitBreaker.js +83 -0
  57. package/dist/policies/circuitBreaker.js.map +1 -0
  58. package/dist/policies/dedupe.cjs +98 -21
  59. package/dist/policies/dedupe.d.ts +20 -13
  60. package/dist/policies/dedupe.d.ts.map +1 -1
  61. package/dist/policies/dedupe.js +98 -21
  62. package/dist/policies/dedupe.js.map +1 -1
  63. package/dist/policies/rateLimit.cjs +35 -0
  64. package/dist/policies/rateLimit.d.ts +3 -0
  65. package/dist/policies/rateLimit.d.ts.map +1 -0
  66. package/dist/policies/rateLimit.js +33 -0
  67. package/dist/policies/rateLimit.js.map +1 -0
  68. package/dist/policies/retry.cjs +103 -26
  69. package/dist/policies/retry.d.ts +25 -2
  70. package/dist/policies/retry.d.ts.map +1 -1
  71. package/dist/policies/retry.js +103 -26
  72. package/dist/policies/retry.js.map +1 -1
  73. package/dist/policies/timeout.cjs +78 -36
  74. package/dist/policies/timeout.d.ts +7 -18
  75. package/dist/policies/timeout.d.ts.map +1 -1
  76. package/dist/policies/timeout.js +84 -31
  77. package/dist/policies/timeout.js.map +1 -1
  78. package/dist/state/store.cjs +9 -2
  79. package/dist/state/store.d.ts +9 -0
  80. package/dist/state/store.d.ts.map +1 -1
  81. package/dist/state/store.js +9 -2
  82. package/dist/state/store.js.map +1 -1
  83. package/dist/stores/base.cjs +4 -4
  84. package/dist/stores/base.d.ts +32 -56
  85. package/dist/stores/base.d.ts.map +1 -1
  86. package/dist/stores/base.js +4 -4
  87. package/dist/stores/base.js.map +1 -1
  88. package/dist/stores/memory.cjs +161 -39
  89. package/dist/stores/memory.d.ts +64 -24
  90. package/dist/stores/memory.d.ts.map +1 -1
  91. package/dist/stores/memory.js +160 -39
  92. package/dist/stores/memory.js.map +1 -1
  93. package/dist/types/index.d.ts +315 -37
  94. package/dist/types/index.d.ts.map +1 -1
  95. package/dist/utils/abort.cjs +212 -0
  96. package/dist/utils/abort.d.ts +79 -0
  97. package/dist/utils/abort.d.ts.map +1 -0
  98. package/dist/utils/abort.js +206 -0
  99. package/dist/utils/abort.js.map +1 -0
  100. package/dist/utils/abortPool.cjs +26 -0
  101. package/dist/utils/abortPool.d.ts +4 -0
  102. package/dist/utils/abortPool.d.ts.map +1 -0
  103. package/dist/utils/abortPool.js +22 -0
  104. package/dist/utils/abortPool.js.map +1 -0
  105. package/dist/utils/backoff.cjs +54 -0
  106. package/dist/utils/backoff.d.ts +14 -0
  107. package/dist/utils/backoff.d.ts.map +1 -0
  108. package/dist/utils/backoff.js +52 -0
  109. package/dist/utils/backoff.js.map +1 -0
  110. package/dist/utils/key.cjs +77 -0
  111. package/dist/utils/key.d.ts +29 -0
  112. package/dist/utils/key.d.ts.map +1 -0
  113. package/dist/utils/key.js +75 -0
  114. package/dist/utils/key.js.map +1 -0
  115. package/dist/utils/limits.cjs +40 -0
  116. package/dist/utils/limits.d.ts +39 -0
  117. package/dist/utils/limits.d.ts.map +1 -0
  118. package/dist/utils/limits.js +38 -0
  119. package/dist/utils/limits.js.map +1 -0
  120. package/dist/utils/sanitize.cjs +29 -0
  121. package/dist/utils/sanitize.d.ts +3 -0
  122. package/dist/utils/sanitize.d.ts.map +1 -0
  123. package/dist/utils/sanitize.js +26 -0
  124. package/dist/utils/sanitize.js.map +1 -0
  125. package/dist/utils/validate.cjs +153 -0
  126. package/dist/utils/validate.d.ts +26 -0
  127. package/dist/utils/validate.d.ts.map +1 -0
  128. package/dist/utils/validate.js +141 -0
  129. package/dist/utils/validate.js.map +1 -0
  130. package/package.json +20 -37
package/dist/core/act.js CHANGED
@@ -3,29 +3,189 @@ import { retryPolicy } from '../policies/retry.js';
3
3
  import { timeoutPolicy, totalTimeoutPolicy } from '../policies/timeout.js';
4
4
  import { dedupePolicy } from '../policies/dedupe.js';
5
5
  import { cachePolicy } from '../policies/cache.js';
6
- import { InMemoryStore } from '../stores/memory.js';
6
+ import { circuitBreakerPolicy } from '../policies/circuitBreaker.js';
7
+ import { bulkheadPolicy } from '../policies/bulkhead.js';
8
+ import { rateLimitPolicy } from '../policies/rateLimit.js';
9
+ import { createDefaultStore } from '../stores/memory.js';
10
+ import { isSyncStore } from '../stores/base.js';
11
+ import { linkSignal, raceAbort } from '../utils/abort.js';
12
+ import { sanitizeError, sanitizeErrorMessage } from '../utils/sanitize.js';
13
+ import { registerInflight, unregisterInflight, recordError, recordSuccess } from './health.js';
14
+ import { registerDrainable, unregisterDrainable } from './shutdown.js';
15
+ import { assertKey, assertOptions, } from '../utils/validate.js';
7
16
  // Module-level default store so cache and dedupe persist across calls.
8
- // Always an InMemoryStore (SyncStateStore) required because the default
9
- // chain may include dedupePolicy, which mandates synchronous store access.
10
- // For SSR isolation or per-test control, construct an InMemoryStore and
11
- // call execute() directly with an explicit store.
12
- const defaultStore = new InMemoryStore();
17
+ // Bounded by default (maxSize: 10_000, autoCleanup: 60s) to
18
+ // prevent unbounded memory growth in long-running servers. Callers who
19
+ // want truly unbounded storage must construct their own `InMemoryStore`
20
+ // with `maxSize: Infinity` and pass it via `withStore()`.
21
+ const defaultStore = createDefaultStore();
22
+ // Namespace prefixes used by policies. Kept here (not in policy files) so
23
+ // `invalidate()` can resolve cache keys without importing policy internals.
24
+ const CACHE_NS = 'cache:';
13
25
  /**
14
- * Execute fn with the given reliability policies.
26
+ * Generate a trace ID for correlation across logs/metrics.
27
+ *
28
+ * Uses `crypto.randomUUID()` on Node 20+ (fast, native). Falls back to a
29
+ * timestamp+random string for environments without it.
30
+ */
31
+ function generateTraceId() {
32
+ const crypto = globalThis.crypto;
33
+ if (crypto && typeof crypto.randomUUID === 'function') {
34
+ return crypto.randomUUID();
35
+ }
36
+ return `actly-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`;
37
+ }
38
+ /**
39
+ * Build the observability context (or return undefined if no hooks).
40
+ * The context is shared via PolicyContext.observability so every policy
41
+ * can emit events through the same traceId + hooks.
42
+ */
43
+ function buildObservability(hooks, traceId) {
44
+ // Contract: if no hooks are supplied, return undefined.
45
+ // Policies check `ctx.observability != null` before allocating events.
46
+ if (!hooks)
47
+ return undefined;
48
+ // Check that at least one hook is actually defined (avoid allocating
49
+ // context for an empty hooks object).
50
+ const hasAnyHook = !!hooks.onAttempt ||
51
+ !!hooks.onRetry ||
52
+ !!hooks.onCacheHit ||
53
+ !!hooks.onCacheMiss ||
54
+ !!hooks.onDedupeJoin ||
55
+ !!hooks.onTimeout ||
56
+ !!hooks.onFinalSuccess ||
57
+ !!hooks.onFinalFailure;
58
+ if (!hasAnyHook)
59
+ return undefined;
60
+ return {
61
+ traceId: traceId ?? generateTraceId(),
62
+ hooks,
63
+ joinerCounter: 0,
64
+ };
65
+ }
66
+ /**
67
+ * Determine the `failedBy` discriminator from a caught error.
68
+ * Name sniffing requires `instanceof Error` to prevent plain-object spoofing.
69
+ */
70
+ function classifyFailure(error) {
71
+ if (error == null || typeof error !== 'object')
72
+ return 'fn-error';
73
+ const code = error.code;
74
+ if (code === 'ACTLY_ABORT')
75
+ return 'abort';
76
+ if (code === 'ACTLY_TIMEOUT')
77
+ return 'timeout';
78
+ if (code === 'ACTLY_TOTAL_TIMEOUT')
79
+ return 'total-timeout';
80
+ if (code === 'ACTLY_RETRY_EXHAUSTED')
81
+ return 'retry-exhausted';
82
+ if (code === 'ACTLY_VALIDATION')
83
+ return 'validation';
84
+ // Fall back to name sniffing for non-actly errors (e.g. DOMException abort).
85
+ // Require instanceof Error to prevent plain-object spoofing.
86
+ if (error instanceof Error) {
87
+ const name = error.name;
88
+ if (name === 'AbortError')
89
+ return 'abort';
90
+ }
91
+ return 'fn-error';
92
+ }
93
+ /**
94
+ * Normalise `dedupe: true` shorthand to `DedupeOptions`.
95
+ * Returns `undefined` if dedupe is disabled or absent.
96
+ */
97
+ function normalizeDedupe(opt) {
98
+ if (opt === true)
99
+ return { enabled: true };
100
+ if (opt && typeof opt === 'object' && opt.enabled) {
101
+ return {
102
+ enabled: true,
103
+ ...(opt.inflightTtl !== undefined ? { inflightTtl: opt.inflightTtl } : {}),
104
+ };
105
+ }
106
+ return undefined;
107
+ }
108
+ /**
109
+ * Build the policy chain from `ActOptions`. The order is fixed and
110
+ * documented in `executor.ts`. Policies with no effect (e.g. `retry.attempts: 1`)
111
+ * are skipped — they would be pure overhead.
112
+ */
113
+ function buildPolicies(options) {
114
+ const dedupe = normalizeDedupe(options.dedupe);
115
+ const policies = [];
116
+ // Outermost: rate limiter (blocks before any work is done)
117
+ if (options.rateLimit) {
118
+ policies.push(rateLimitPolicy(options.rateLimit));
119
+ }
120
+ // Circuit breaker (blocks if downstream is failing)
121
+ if (options.circuitBreaker) {
122
+ policies.push(circuitBreakerPolicy(options.circuitBreaker));
123
+ }
124
+ // Hard wall-clock budget over the entire operation
125
+ if (options.totalTimeout && options.totalTimeout.ms > 0) {
126
+ policies.push(totalTimeoutPolicy(options.totalTimeout));
127
+ }
128
+ // Cache: a hit short-circuits everything below it
129
+ if (options.cache && options.cache.ttl > 0) {
130
+ policies.push(cachePolicy(options.cache));
131
+ }
132
+ // Bulkhead: limits concurrency per key
133
+ if (options.bulkhead) {
134
+ policies.push(bulkheadPolicy(options.bulkhead));
135
+ }
136
+ // Dedupe: collapses concurrent callers before retry fires
137
+ if (dedupe) {
138
+ policies.push(dedupePolicy(dedupe));
139
+ }
140
+ // Retry: owns the attempt loop (attempts: 1 is a no-op — skip)
141
+ if (options.retry && options.retry.attempts > 1) {
142
+ policies.push(retryPolicy(options.retry));
143
+ }
144
+ // Innermost: per-attempt clock. Resets on every retry
145
+ if (options.timeout && options.timeout.ms > 0) {
146
+ policies.push(timeoutPolicy(options.timeout));
147
+ }
148
+ return policies;
149
+ }
150
+ /**
151
+ * Build a root AbortController from `options.signal`.
152
+ *
153
+ * - If no user signal: returns a fresh controller that never aborts unless
154
+ * an outer timeout policy aborts it.
155
+ * - If user signal is already aborted: returns a controller that is already
156
+ * aborted with the user's reason (so the operation rejects immediately).
157
+ * - Otherwise: links the user signal to the controller.
158
+ */
159
+ function buildRootSignal(userSignal) {
160
+ const controller = new AbortController();
161
+ if (userSignal) {
162
+ const unlink = linkSignal(userSignal, controller);
163
+ return { controller, cleanup: unlink };
164
+ }
165
+ return { controller, cleanup: () => { } };
166
+ }
167
+ /**
168
+ * Execute `fn` with the given reliability policies.
15
169
  *
16
170
  * @param key Stable identifier for this action. Scopes dedupe + cache.
17
- * @param fn The async work to run.
171
+ * @param fn The async work to run. Receives an `AbortSignal` for
172
+ * cooperative cancellation (legacy `() => Promise<T>` is
173
+ * still accepted — the signal is simply ignored).
18
174
  * @param options Which policies to apply and how. All fields are optional.
19
175
  *
20
- * @returns ActResult<T> — always resolves, never throws.
21
- * Check result.ok before reading result.value.
176
+ * @returns `ActResult<T>` — always resolves, never throws.
177
+ * Check `result.ok` before reading `result.value`.
22
178
  *
23
179
  * @example
24
- * const result = await act('user:42', () => fetchUser(42), {
25
- * retry: { attempts: 3, delayMs: 200, backoff: 'exponential' },
26
- * timeout: { ms: 5_000 },
27
- * dedupe: true,
28
- * cache: { ttl: 60_000 },
180
+ * // With cooperative cancellation
181
+ * const result = await act('user:42', async (signal) => {
182
+ * return fetch(`/api/users/42`, { signal })
183
+ * }, {
184
+ * retry: { attempts: 3, delayMs: 200, backoff: 'exponential' },
185
+ * timeout: { ms: 5_000 },
186
+ * totalTimeout: { ms: 12_000 },
187
+ * dedupe: true,
188
+ * cache: { ttl: 60_000 },
29
189
  * })
30
190
  *
31
191
  * if (result.ok) {
@@ -35,37 +195,341 @@ const defaultStore = new InMemoryStore();
35
195
  * }
36
196
  */
37
197
  export async function act(key, fn, options = {}) {
38
- const meta = { attempts: 1, source: 'fresh' };
39
- // Normalise dedupe: true → { enabled: true } so the rest of the function
40
- // always works with the object form.
41
- const dedupe = typeof options.dedupe === 'boolean'
42
- ? { enabled: options.dedupe }
43
- : options.dedupe;
44
- // Outermost -> innermost. See executor.ts for why this ordering matters.
45
- const policies = [];
46
- // totalTimeout sits before everything — it's a hard wall-clock budget over
47
- // the entire operation. If it fires, no inner policy can extend the deadline.
48
- if (options.totalTimeout && options.totalTimeout.ms > 0) {
49
- policies.push(totalTimeoutPolicy(options.totalTimeout)); // 0. hardest outer wall
50
- }
51
- if (options.cache && options.cache.ttl > 0) {
52
- policies.push(cachePolicy(options.cache)); // 1. skip all on hit
198
+ assertKey(key);
199
+ assertOptions(options);
200
+ // Fast path: no options means no policies, no signal, no observability.
201
+ const hasAnyOption = options.retry !== undefined ||
202
+ options.timeout !== undefined ||
203
+ options.totalTimeout !== undefined ||
204
+ options.dedupe !== undefined ||
205
+ options.cache !== undefined ||
206
+ options.signal !== undefined ||
207
+ options.observability !== undefined ||
208
+ options.traceId !== undefined ||
209
+ options.circuitBreaker !== undefined ||
210
+ options.bulkhead !== undefined ||
211
+ options.rateLimit !== undefined ||
212
+ options.hedge !== undefined ||
213
+ options.fallback !== undefined ||
214
+ options.audit !== undefined;
215
+ if (!hasAnyOption) {
216
+ const startedAt = Date.now();
217
+ registerInflight('default');
218
+ registerDrainable('default');
219
+ try {
220
+ const value = await fn(new AbortController().signal);
221
+ recordSuccess('default');
222
+ return { ok: true, value, source: 'fresh', attempts: 1, durationMs: Date.now() - startedAt };
223
+ }
224
+ catch (error) {
225
+ recordError('default', 'fn-error', sanitizeErrorMessage(error));
226
+ return { ok: false, error, attempts: 1, durationMs: Date.now() - startedAt };
227
+ }
228
+ finally {
229
+ unregisterInflight('default');
230
+ unregisterDrainable('default');
231
+ }
53
232
  }
54
- if (dedupe?.enabled) {
55
- policies.push(dedupePolicy()); // 2. collapse concurrent callers
56
- }
57
- if (options.retry && options.retry.attempts > 1) {
58
- policies.push(retryPolicy(options.retry)); // 3. own the attempt loop
233
+ const meta = { attempts: 1, source: 'fresh' };
234
+ const { controller: rootController, cleanup } = buildRootSignal(options.signal);
235
+ const observability = buildObservability(options.observability, options.traceId);
236
+ const startedAt = Date.now();
237
+ const scope = 'default';
238
+ registerInflight(scope);
239
+ registerDrainable(scope);
240
+ if (rootController.signal.aborted) {
241
+ cleanup();
242
+ unregisterInflight(scope);
243
+ unregisterDrainable(scope);
244
+ const error = rootController.signal.reason;
245
+ if (observability) {
246
+ observability.hooks.onFinalFailure?.({
247
+ type: 'final-failure',
248
+ key, traceId: observability.traceId, timestamp: Date.now(),
249
+ attempts: 0, durationMs: Date.now() - startedAt,
250
+ failedBy: 'abort', error,
251
+ });
252
+ }
253
+ if (options.audit) {
254
+ options.audit.log({ key, traceId: observability?.traceId ?? '', timestamp: Date.now(), durationMs: Date.now() - startedAt, ok: false, attempts: 0, failedBy: 'abort', error });
255
+ }
256
+ recordError(scope, 'ACTLY_ABORT', sanitizeErrorMessage(error));
257
+ return { ok: false, error, attempts: 0, traceId: observability?.traceId, durationMs: Date.now() - startedAt };
59
258
  }
60
- if (options.timeout && options.timeout.ms > 0) {
61
- policies.push(timeoutPolicy(options.timeout)); // 4. innermost — per-attempt clock
259
+ const policies = buildPolicies(options);
260
+ const hasRetryPolicy = !!(options.retry && options.retry.attempts > 1);
261
+ if (observability && !hasRetryPolicy) {
262
+ observability.hooks.onAttempt?.({
263
+ type: 'attempt', key, traceId: observability.traceId,
264
+ timestamp: Date.now(), attempt: 1,
265
+ });
62
266
  }
267
+ // Wrap fn with hedge request if configured
268
+ const fnWithHedge = options.hedge ? wrapHedge(fn, options.hedge.delayMs) : fn;
63
269
  try {
64
- const value = await execute({ key, fn, policies, store: defaultStore, meta });
65
- return { ok: true, value, source: meta.source, attempts: meta.attempts };
270
+ const value = await raceAbort(execute({
271
+ key,
272
+ fn: fnWithHedge,
273
+ policies,
274
+ store: defaultStore,
275
+ meta,
276
+ signal: rootController.signal,
277
+ observability,
278
+ }), rootController.signal);
279
+ const durationMs = Date.now() - startedAt;
280
+ recordSuccess(scope);
281
+ if (observability) {
282
+ observability.hooks.onFinalSuccess?.({
283
+ type: 'final-success',
284
+ key, traceId: observability.traceId, timestamp: Date.now(),
285
+ source: meta.source, attempts: meta.attempts, durationMs,
286
+ });
287
+ }
288
+ if (options.audit) {
289
+ options.audit.log({ key, traceId: observability?.traceId ?? '', timestamp: Date.now(), durationMs, ok: true, attempts: meta.attempts });
290
+ }
291
+ return { ok: true, value, source: meta.source, attempts: meta.attempts, traceId: observability?.traceId, durationMs };
66
292
  }
67
293
  catch (error) {
68
- return { ok: false, error, attempts: meta.attempts };
294
+ const durationMs = Date.now() - startedAt;
295
+ const failedBy = rootController.signal.aborted ? 'abort' : classifyFailure(error);
296
+ // Fallback: if configured, return fallback value instead of failure.
297
+ // Record the error in health check so monitoring can detect downstream
298
+ // failures even when fallback masks them from the caller.
299
+ let errorRecorded = false;
300
+ if (options.fallback) {
301
+ recordError(scope, failedBy, sanitizeErrorMessage(error));
302
+ errorRecorded = true;
303
+ try {
304
+ const fallbackValue = typeof options.fallback.value === 'function'
305
+ ? await options.fallback.value()
306
+ : options.fallback.value;
307
+ if (observability) {
308
+ observability.hooks.onFinalSuccess?.({
309
+ type: 'final-success',
310
+ key, traceId: observability.traceId, timestamp: Date.now(),
311
+ source: meta.source, attempts: meta.attempts, durationMs,
312
+ });
313
+ }
314
+ if (options.audit) {
315
+ options.audit.log({ key, traceId: observability?.traceId ?? '', timestamp: Date.now(), durationMs, ok: true, attempts: meta.attempts });
316
+ }
317
+ return { ok: true, value: fallbackValue, source: 'fresh', attempts: meta.attempts, traceId: observability?.traceId, durationMs };
318
+ }
319
+ catch {
320
+ // fallback itself failed — fall through to normal failure
321
+ }
322
+ }
323
+ const sanitizedError = options.audit ? sanitizeError(error) : error;
324
+ if (!errorRecorded) {
325
+ recordError(scope, failedBy, sanitizeErrorMessage(error));
326
+ }
327
+ if (observability) {
328
+ observability.hooks.onFinalFailure?.({
329
+ type: 'final-failure',
330
+ key, traceId: observability.traceId, timestamp: Date.now(),
331
+ attempts: meta.attempts, durationMs,
332
+ failedBy, error,
333
+ });
334
+ }
335
+ if (options.audit) {
336
+ options.audit.log({ key, traceId: observability?.traceId ?? '', timestamp: Date.now(), durationMs, ok: false, attempts: meta.attempts, failedBy, error: sanitizedError });
337
+ }
338
+ return { ok: false, error, attempts: meta.attempts, traceId: observability?.traceId, durationMs };
69
339
  }
340
+ finally {
341
+ cleanup();
342
+ unregisterInflight(scope);
343
+ unregisterDrainable(scope);
344
+ }
345
+ }
346
+ // Hedge request: sends a second call after delayMs, races them.
347
+ // Clears timer on settle to prevent leak. Marks primary as handled
348
+ // to prevent unhandled rejection if hedge wins.
349
+ function wrapHedge(fn, delayMs) {
350
+ return async (signal) => {
351
+ let timer;
352
+ const primary = fn(signal);
353
+ const hedgeTimeout = new Promise((_, reject) => {
354
+ timer = setTimeout(() => reject(new Error('__HEDGE_TIMEOUT__')), delayMs);
355
+ });
356
+ try {
357
+ return await Promise.race([primary, hedgeTimeout]);
358
+ }
359
+ catch (e) {
360
+ if (e instanceof Error && e.message === '__HEDGE_TIMEOUT__') {
361
+ // Primary is still running — mark as handled to prevent unhandled rejection
362
+ Promise.resolve(primary).catch(() => { });
363
+ const hedgePromise = Promise.resolve(fn(signal));
364
+ hedgePromise.catch(() => { }); // mark hedge as handled if primary wins
365
+ return await Promise.race([primary, hedgePromise]);
366
+ }
367
+ throw e;
368
+ }
369
+ finally {
370
+ if (timer)
371
+ clearTimeout(timer);
372
+ }
373
+ };
374
+ }
375
+ /**
376
+ * Invalidate the cached value for `key` on the default module-level store.
377
+ *
378
+ * Only clears the cache slot — does not affect in-flight dedupe entries
379
+ * (those will settle on their own). Returns `true` if a cache entry was
380
+ * removed, `false` otherwise.
381
+ *
382
+ * Useful when you know the underlying data has changed and you want the
383
+ * next `act()` call to re-run `fn` instead of serving stale cache:
384
+ *
385
+ * ```ts
386
+ * await act('user:42', () => fetchUser(42), { cache: { ttl: 60_000 } })
387
+ * // ... user updates their profile ...
388
+ * invalidate('user:42') // next call will re-fetch
389
+ * ```
390
+ */
391
+ export function invalidate(key) {
392
+ assertKey(key);
393
+ const cacheKey = CACHE_NS + key;
394
+ const existed = defaultStore.has(cacheKey);
395
+ defaultStore.delete(cacheKey);
396
+ return existed;
397
+ }
398
+ export function withStore(store) {
399
+ const scope = 'scoped:' + Math.random().toString(36).slice(2, 8);
400
+ const scopedAct = async (key, fn, options = {}) => {
401
+ assertKey(key);
402
+ assertOptions(options);
403
+ const meta = { attempts: 1, source: 'fresh' };
404
+ const { controller: rootController, cleanup } = buildRootSignal(options.signal);
405
+ const observability = buildObservability(options.observability, options.traceId);
406
+ const startedAt = Date.now();
407
+ registerInflight(scope);
408
+ registerDrainable(scope);
409
+ if (rootController.signal.aborted) {
410
+ cleanup();
411
+ unregisterInflight(scope);
412
+ unregisterDrainable(scope);
413
+ const error = rootController.signal.reason;
414
+ if (observability) {
415
+ observability.hooks.onFinalFailure?.({
416
+ type: 'final-failure', key, traceId: observability.traceId, timestamp: Date.now(),
417
+ attempts: 0, durationMs: Date.now() - startedAt, failedBy: 'abort', error,
418
+ });
419
+ }
420
+ return { ok: false, error, attempts: 0, traceId: observability?.traceId, durationMs: Date.now() - startedAt };
421
+ }
422
+ const policies = buildPolicies(options);
423
+ const hasRetryPolicy = !!(options.retry && options.retry.attempts > 1);
424
+ if (observability && !hasRetryPolicy) {
425
+ observability.hooks.onAttempt?.({
426
+ type: 'attempt', key, traceId: observability.traceId,
427
+ timestamp: Date.now(), attempt: 1,
428
+ });
429
+ }
430
+ const fnWithHedge = options.hedge ? wrapHedge(fn, options.hedge.delayMs) : fn;
431
+ try {
432
+ const value = await raceAbort(execute({
433
+ key,
434
+ fn: fnWithHedge,
435
+ policies,
436
+ store,
437
+ meta,
438
+ signal: rootController.signal,
439
+ observability,
440
+ }), rootController.signal);
441
+ const durationMs = Date.now() - startedAt;
442
+ recordSuccess(scope);
443
+ if (observability) {
444
+ observability.hooks.onFinalSuccess?.({
445
+ type: 'final-success', key, traceId: observability.traceId, timestamp: Date.now(),
446
+ source: meta.source, attempts: meta.attempts, durationMs,
447
+ });
448
+ }
449
+ if (options.audit) {
450
+ options.audit.log({ key, traceId: observability?.traceId ?? '', timestamp: Date.now(), durationMs, ok: true, attempts: meta.attempts });
451
+ }
452
+ return { ok: true, value, source: meta.source, attempts: meta.attempts, traceId: observability?.traceId, durationMs };
453
+ }
454
+ catch (error) {
455
+ const durationMs = Date.now() - startedAt;
456
+ const failedBy = rootController.signal.aborted ? 'abort' : classifyFailure(error);
457
+ let errorRecorded = false;
458
+ if (options.fallback) {
459
+ recordError(scope, failedBy, sanitizeErrorMessage(error));
460
+ errorRecorded = true;
461
+ try {
462
+ const fallbackValue = typeof options.fallback.value === 'function'
463
+ ? await options.fallback.value()
464
+ : options.fallback.value;
465
+ if (options.audit) {
466
+ options.audit.log({ key, traceId: observability?.traceId ?? '', timestamp: Date.now(), durationMs, ok: true, attempts: meta.attempts });
467
+ }
468
+ return { ok: true, value: fallbackValue, source: 'fresh', attempts: meta.attempts, traceId: observability?.traceId, durationMs };
469
+ }
470
+ catch {
471
+ // fallback failed — fall through
472
+ }
473
+ }
474
+ if (!errorRecorded) {
475
+ recordError(scope, failedBy, sanitizeErrorMessage(error));
476
+ }
477
+ if (observability) {
478
+ observability.hooks.onFinalFailure?.({
479
+ type: 'final-failure', key, traceId: observability.traceId, timestamp: Date.now(),
480
+ attempts: meta.attempts, durationMs, failedBy, error,
481
+ });
482
+ }
483
+ if (options.audit) {
484
+ const sanitizedError = sanitizeError(error);
485
+ options.audit.log({ key, traceId: observability?.traceId ?? '', timestamp: Date.now(), durationMs, ok: false, attempts: meta.attempts, failedBy, error: sanitizedError });
486
+ }
487
+ return { ok: false, error, attempts: meta.attempts, traceId: observability?.traceId, durationMs };
488
+ }
489
+ finally {
490
+ cleanup();
491
+ unregisterInflight(scope);
492
+ unregisterDrainable(scope);
493
+ }
494
+ };
495
+ // Build the `invalidate` implementation. The runtime branch on
496
+ // `isSyncStore` selects the correct path; the cast through `unknown`
497
+ // is required because TypeScript cannot narrow the union return type
498
+ // (`boolean | Promise<boolean>`) to match either overload signature
499
+ // individually. The overloads at the call site guarantee callers see
500
+ // the correct type.
501
+ //
502
+ // FIX: The old async path did has() then delete() in separate awaits —
503
+ // a TOCTOU race. Sync stores are safe (single synchronous frame).
504
+ // Async stores document this as a known limitation.
505
+ const invalidateImpl = (key) => {
506
+ assertKey(key);
507
+ const cacheKey = CACHE_NS + key;
508
+ if (isSyncStore(store)) {
509
+ // Sync store: has() + delete() in the same synchronous frame is safe in single-frame.
510
+ const existed = store.has(cacheKey);
511
+ store.delete(cacheKey);
512
+ return existed;
513
+ }
514
+ // Async store: safe in single-frame delete. We check has() first, then delete.
515
+ // Between the two awaits, another caller could delete — but the return
516
+ // value is "did this key exist at the time we checked", which is the
517
+ // best we can do without a store-level delete-and-return-existed API.
518
+ // For true safe in single-frame semantics, async stores should implement a
519
+ // `deleteIfExists()` method — documented as a future API enhancement.
520
+ return (async () => {
521
+ const existed = await store.has(cacheKey);
522
+ await store.delete(cacheKey);
523
+ return existed;
524
+ })();
525
+ };
526
+ // Attach `invalidate` and `store` to the function object. We use
527
+ // `Object.assign` rather than mutation so the types narrow cleanly at
528
+ // the call site. The cast through `unknown` is necessary because the
529
+ // implementation signature is wider than either overload.
530
+ return Object.assign(scopedAct, {
531
+ invalidate: invalidateImpl,
532
+ store,
533
+ });
70
534
  }
71
535
  //# sourceMappingURL=act.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"act.js","sourceRoot":"","sources":["../../src/core/act.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAa,eAAe,CAAA;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAS,sBAAsB,CAAA;AACrD,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAA;AAC1E,OAAO,EAAE,YAAY,EAAE,MAAQ,uBAAuB,CAAA;AACtD,OAAO,EAAE,WAAW,EAAE,MAAS,sBAAsB,CAAA;AACrD,OAAO,EAAE,aAAa,EAAE,MAAO,qBAAqB,CAAA;AAEpD,uEAAuE;AACvE,0EAA0E;AAC1E,2EAA2E;AAC3E,wEAAwE;AACxE,kDAAkD;AAClD,MAAM,YAAY,GAAG,IAAI,aAAa,EAAE,CAAA;AAExC;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,CAAC,KAAK,UAAU,GAAG,CACvB,GAAW,EACX,EAAY,EACZ,UAAsB,EAAE;IAExB,MAAM,IAAI,GAAY,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAA;IAEtD,yEAAyE;IACzE,qCAAqC;IACrC,MAAM,MAAM,GAAG,OAAO,OAAO,CAAC,MAAM,KAAK,SAAS;QAChD,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,EAAE;QAC7B,CAAC,CAAC,OAAO,CAAC,MAAM,CAAA;IAElB,yEAAyE;IACzE,MAAM,QAAQ,GAA4B,EAAE,CAAA;IAE5C,2EAA2E;IAC3E,8EAA8E;IAC9E,IAAI,OAAO,CAAC,YAAY,IAAI,OAAO,CAAC,YAAY,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;QACxD,QAAQ,CAAC,IAAI,CAAC,kBAAkB,CAAI,OAAO,CAAC,YAAY,CAAC,CAAC,CAAA,CAAC,wBAAwB;IACrF,CAAC;IAED,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC;QAC3C,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAI,OAAO,CAAC,KAAK,CAAC,CAAC,CAAA,CAAe,qBAAqB;IAClF,CAAC;IAED,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;QACpB,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAK,CAAC,CAAA,CAA2B,iCAAiC;IAC9F,CAAC;IAED,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,EAAE,CAAC;QAChD,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAI,OAAO,CAAC,KAAK,CAAC,CAAC,CAAA,CAAe,0BAA0B;IACvF,CAAC;IAED,IAAI,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;QAC9C,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAI,OAAO,CAAC,OAAO,CAAC,CAAC,CAAA,CAAW,mCAAmC;IAChG,CAAC;IAED,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAA;QAC7E,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAA;IAC1E,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAA;IACtD,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"act.js","sourceRoot":"","sources":["../../src/core/act.ts"],"names":[],"mappings":"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"}