flowx-control 1.0.0 → 1.0.2
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/LICENSE +21 -0
- package/dist/debounce.js.map +1 -1
- package/dist/debounce.mjs.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Avinash Velu
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/dist/debounce.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/debounce.ts"],"names":[],"mappings":";;;AAiCO,SAAS,QAAA,CACd,EAAA,EACA,IAAA,EACA,OAAA,EACmC;AACnC,EAAA,MAAM,EAAE,UAAU,KAAA,EAAO,QAAA,GAAW,MAAM,OAAA,EAAQ,GAAI,WAAW,EAAC;AAElE,EAAA,IAAI,IAAA,GAAO,CAAA,EAAG,MAAM,IAAI,WAAW,mBAAmB,CAAA;AAEtD,EAAA,IAAI,KAAA,GAA8C,IAAA;AAClD,EAAA,IAAI,QAAA,GAAiD,IAAA;AACrD,EAAA,IAAI,QAAA,GAAyB,IAAA;AAC7B,EAAA,MAAM,mBAGD,EAAC;AACN,EAAA,IAAI,SAAA,GAAY,KAAA;AAEhB,EAAA,eAAe,MAAA,GAAwB;
|
|
1
|
+
{"version":3,"sources":["../src/debounce.ts"],"names":[],"mappings":"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","file":"debounce.js","sourcesContent":["// ============================================================================\n// FlowX — Async-Aware Debounce\n// ============================================================================\n\nexport interface DebounceOptions {\n /** Invoke on the leading edge (default: false) */\n leading?: boolean;\n /** Invoke on the trailing edge (default: true) */\n trailing?: boolean;\n /** Maximum wait time before forced invocation in ms */\n maxWait?: number;\n}\n\nexport interface DebouncedFunction<TArgs extends any[], TReturn> {\n /** Call the debounced function */\n (...args: TArgs): Promise<TReturn>;\n /** Cancel any pending invocation */\n cancel: () => void;\n /** Immediately invoke any pending call */\n flush: () => Promise<TReturn | undefined>;\n /** Whether there is a pending invocation */\n readonly pending: boolean;\n}\n\n/**\n * Create a debounced version of an async function.\n *\n * @example\n * ```ts\n * const debouncedSearch = debounce(searchApi, 300);\n * await debouncedSearch('query');\n * ```\n */\nexport function debounce<TArgs extends any[], TReturn>(\n fn: (...args: TArgs) => TReturn | Promise<TReturn>,\n wait: number,\n options?: DebounceOptions,\n): DebouncedFunction<TArgs, TReturn> {\n const { leading = false, trailing = true, maxWait } = options ?? {};\n\n if (wait < 0) throw new RangeError('wait must be >= 0');\n\n let timer: ReturnType<typeof setTimeout> | null = null;\n let maxTimer: ReturnType<typeof setTimeout> | null = null;\n let lastArgs: TArgs | null = null;\n const pendingResolvers: Array<{\n resolve: (value: TReturn) => void;\n reject: (error: Error) => void;\n }> = [];\n let isPending = false;\n\n async function invoke(): Promise<void> {\n const args = lastArgs!;\n const resolvers = pendingResolvers.splice(0);\n lastArgs = null;\n isPending = false;\n\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n if (maxTimer) {\n clearTimeout(maxTimer);\n maxTimer = null;\n }\n\n try {\n const result = await fn(...args);\n for (const r of resolvers) r.resolve(result);\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n for (const r of resolvers) r.reject(err);\n }\n }\n\n function debounced(...args: TArgs): Promise<TReturn> {\n lastArgs = args;\n\n return new Promise<TReturn>((resolve, reject) => {\n pendingResolvers.push({ resolve, reject });\n\n // Leading edge\n if (leading && !isPending) {\n isPending = true;\n invoke();\n return;\n }\n\n isPending = true;\n\n // Reset trailing timer\n if (timer) clearTimeout(timer);\n\n if (trailing) {\n timer = setTimeout(() => {\n timer = null;\n invoke();\n }, wait);\n }\n\n // Set max wait timer\n if (maxWait !== undefined && !maxTimer) {\n maxTimer = setTimeout(() => {\n maxTimer = null;\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n invoke();\n }, maxWait);\n }\n });\n }\n\n debounced.cancel = (): void => {\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n if (maxTimer) {\n clearTimeout(maxTimer);\n maxTimer = null;\n }\n lastArgs = null;\n isPending = false;\n // Reject all pending resolvers\n const resolvers = pendingResolvers.splice(0);\n for (const r of resolvers) {\n r.reject(new Error('Debounced call cancelled'));\n }\n };\n\n debounced.flush = async (): Promise<TReturn | undefined> => {\n if (!isPending) return undefined;\n const promise = new Promise<TReturn>((resolve, reject) => {\n pendingResolvers.push({ resolve, reject });\n });\n await invoke();\n return promise;\n };\n\n Object.defineProperty(debounced, 'pending', {\n get() {\n return isPending;\n },\n });\n\n return debounced as DebouncedFunction<TArgs, TReturn>;\n}\n"]}
|
package/dist/debounce.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/debounce.ts"],"names":[],"mappings":";AAiCO,SAAS,QAAA,CACd,EAAA,EACA,IAAA,EACA,OAAA,EACmC;AACnC,EAAA,MAAM,EAAE,UAAU,KAAA,EAAO,QAAA,GAAW,MAAM,OAAA,EAAQ,GAAI,WAAW,EAAC;AAElE,EAAA,IAAI,IAAA,GAAO,CAAA,EAAG,MAAM,IAAI,WAAW,mBAAmB,CAAA;AAEtD,EAAA,IAAI,KAAA,GAA8C,IAAA;AAClD,EAAA,IAAI,QAAA,GAAiD,IAAA;AACrD,EAAA,IAAI,QAAA,GAAyB,IAAA;AAC7B,EAAA,MAAM,mBAGD,EAAC;AACN,EAAA,IAAI,SAAA,GAAY,KAAA;AAEhB,EAAA,eAAe,MAAA,GAAwB;
|
|
1
|
+
{"version":3,"sources":["../src/debounce.ts"],"names":[],"mappings":"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","file":"debounce.mjs","sourcesContent":["// ============================================================================\n// FlowX — Async-Aware Debounce\n// ============================================================================\n\nexport interface DebounceOptions {\n /** Invoke on the leading edge (default: false) */\n leading?: boolean;\n /** Invoke on the trailing edge (default: true) */\n trailing?: boolean;\n /** Maximum wait time before forced invocation in ms */\n maxWait?: number;\n}\n\nexport interface DebouncedFunction<TArgs extends any[], TReturn> {\n /** Call the debounced function */\n (...args: TArgs): Promise<TReturn>;\n /** Cancel any pending invocation */\n cancel: () => void;\n /** Immediately invoke any pending call */\n flush: () => Promise<TReturn | undefined>;\n /** Whether there is a pending invocation */\n readonly pending: boolean;\n}\n\n/**\n * Create a debounced version of an async function.\n *\n * @example\n * ```ts\n * const debouncedSearch = debounce(searchApi, 300);\n * await debouncedSearch('query');\n * ```\n */\nexport function debounce<TArgs extends any[], TReturn>(\n fn: (...args: TArgs) => TReturn | Promise<TReturn>,\n wait: number,\n options?: DebounceOptions,\n): DebouncedFunction<TArgs, TReturn> {\n const { leading = false, trailing = true, maxWait } = options ?? {};\n\n if (wait < 0) throw new RangeError('wait must be >= 0');\n\n let timer: ReturnType<typeof setTimeout> | null = null;\n let maxTimer: ReturnType<typeof setTimeout> | null = null;\n let lastArgs: TArgs | null = null;\n const pendingResolvers: Array<{\n resolve: (value: TReturn) => void;\n reject: (error: Error) => void;\n }> = [];\n let isPending = false;\n\n async function invoke(): Promise<void> {\n const args = lastArgs!;\n const resolvers = pendingResolvers.splice(0);\n lastArgs = null;\n isPending = false;\n\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n if (maxTimer) {\n clearTimeout(maxTimer);\n maxTimer = null;\n }\n\n try {\n const result = await fn(...args);\n for (const r of resolvers) r.resolve(result);\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n for (const r of resolvers) r.reject(err);\n }\n }\n\n function debounced(...args: TArgs): Promise<TReturn> {\n lastArgs = args;\n\n return new Promise<TReturn>((resolve, reject) => {\n pendingResolvers.push({ resolve, reject });\n\n // Leading edge\n if (leading && !isPending) {\n isPending = true;\n invoke();\n return;\n }\n\n isPending = true;\n\n // Reset trailing timer\n if (timer) clearTimeout(timer);\n\n if (trailing) {\n timer = setTimeout(() => {\n timer = null;\n invoke();\n }, wait);\n }\n\n // Set max wait timer\n if (maxWait !== undefined && !maxTimer) {\n maxTimer = setTimeout(() => {\n maxTimer = null;\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n invoke();\n }, maxWait);\n }\n });\n }\n\n debounced.cancel = (): void => {\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n if (maxTimer) {\n clearTimeout(maxTimer);\n maxTimer = null;\n }\n lastArgs = null;\n isPending = false;\n // Reject all pending resolvers\n const resolvers = pendingResolvers.splice(0);\n for (const r of resolvers) {\n r.reject(new Error('Debounced call cancelled'));\n }\n };\n\n debounced.flush = async (): Promise<TReturn | undefined> => {\n if (!isPending) return undefined;\n const promise = new Promise<TReturn>((resolve, reject) => {\n pendingResolvers.push({ resolve, reject });\n });\n await invoke();\n return promise;\n };\n\n Object.defineProperty(debounced, 'pending', {\n get() {\n return isPending;\n },\n });\n\n return debounced as DebouncedFunction<TArgs, TReturn>;\n}\n"]}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types.ts","../src/retry.ts","../src/circuit-breaker.ts","../src/bulkhead.ts","../src/fallback.ts","../src/hedge.ts","../src/semaphore.ts","../src/mutex.ts","../src/queue.ts","../src/rate-limit.ts","../src/timeout.ts","../src/debounce.ts","../src/throttle.ts","../src/batch.ts","../src/pipeline.ts","../src/poll.ts","../src/deferred.ts","../src/memo.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["// ============================================================================\n// FlowX — Types & Error Hierarchy\n// ============================================================================\n\n/** Generic async function signature */\nexport type AsyncFn<TArgs extends any[] = any[], TReturn = any> = (\n ...args: TArgs\n) => Promise<TReturn>;\n\n/** Backoff strategy for retry/poll operations */\nexport type BackoffStrategy =\n | 'fixed'\n | 'linear'\n | 'exponential'\n | ((attempt: number, delay: number) => number);\n\n// ── Error Classes ───────────────────────────────────────────────────────────\n\n/** Base error class for all FlowX errors */\nexport class FlowXError extends Error {\n public readonly code: string;\n constructor(message: string, code: string) {\n super(message);\n this.name = 'FlowXError';\n this.code = code;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** Thrown when a promise exceeds its timeout */\nexport class TimeoutError extends FlowXError {\n constructor(message = 'Operation timed out') {\n super(message, 'ERR_TIMEOUT');\n this.name = 'TimeoutError';\n }\n}\n\n/** Thrown when a circuit breaker is open */\nexport class CircuitBreakerError extends FlowXError {\n constructor(message = 'Circuit breaker is open') {\n super(message, 'ERR_CIRCUIT_OPEN');\n this.name = 'CircuitBreakerError';\n }\n}\n\n/** Thrown when a bulkhead rejects due to capacity */\nexport class BulkheadError extends FlowXError {\n constructor(message = 'Bulkhead capacity exceeded') {\n super(message, 'ERR_BULKHEAD_FULL');\n this.name = 'BulkheadError';\n }\n}\n\n/** Thrown when an operation is aborted */\nexport class AbortError extends FlowXError {\n constructor(message = 'Operation aborted') {\n super(message, 'ERR_ABORTED');\n this.name = 'AbortError';\n }\n}\n\n/** Thrown when rate limit is exceeded */\nexport class RateLimitError extends FlowXError {\n constructor(message = 'Rate limit exceeded') {\n super(message, 'ERR_RATE_LIMIT');\n this.name = 'RateLimitError';\n }\n}\n\n// ── Utility Helpers ─────────────────────────────────────────────────────────\n\n/** Sleep for the specified duration, respecting AbortSignal */\nexport function sleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n if (signal?.aborted) {\n reject(new AbortError());\n return;\n }\n\n let onAbort: (() => void) | undefined;\n\n const timer = setTimeout(() => {\n if (signal && onAbort) {\n signal.removeEventListener('abort', onAbort);\n }\n resolve();\n }, ms);\n\n if (signal) {\n onAbort = () => {\n clearTimeout(timer);\n reject(new AbortError());\n };\n signal.addEventListener('abort', onAbort, { once: true });\n }\n });\n}\n\n/** Calculate delay based on backoff strategy */\nexport function calculateDelay(\n attempt: number,\n baseDelay: number,\n strategy: BackoffStrategy,\n jitter: boolean | number = false,\n): number {\n let delay: number;\n\n if (typeof strategy === 'function') {\n delay = strategy(attempt, baseDelay);\n } else {\n switch (strategy) {\n case 'fixed':\n delay = baseDelay;\n break;\n case 'linear':\n delay = baseDelay * attempt;\n break;\n case 'exponential':\n delay = baseDelay * Math.pow(2, attempt - 1);\n break;\n }\n }\n\n if (jitter) {\n const factor = typeof jitter === 'number' ? jitter : 1;\n delay = delay * (1 - factor * 0.5 + Math.random() * factor);\n }\n\n return Math.max(0, Math.floor(delay));\n}\n","// ============================================================================\n// FlowX — Retry with Advanced Backoff Strategies\n// ============================================================================\nimport { AbortError, BackoffStrategy, calculateDelay, sleep } from './types';\n\nexport interface RetryOptions {\n /** Maximum number of retry attempts (default: 3) */\n retries?: number;\n /** Base delay in ms between retries (default: 1000) */\n delay?: number;\n /** Backoff strategy (default: 'exponential') */\n backoff?: BackoffStrategy;\n /** Add randomized jitter to delays (default: false) */\n jitter?: boolean | number;\n /** Maximum delay cap in ms (default: 30000) */\n maxDelay?: number;\n /** Custom predicate to decide if retry should happen */\n shouldRetry?: (error: Error, attempt: number) => boolean | Promise<boolean>;\n /** Callback fired before each retry */\n onRetry?: (error: Error, attempt: number) => void | Promise<void>;\n /** AbortSignal for cancellation */\n signal?: AbortSignal;\n}\n\n/**\n * Execute an async function with automatic retry and configurable backoff.\n *\n * @example\n * ```ts\n * const data = await retry(() => fetch('/api/data'), {\n * retries: 5,\n * backoff: 'exponential',\n * jitter: true,\n * });\n * ```\n */\nexport async function retry<T>(fn: () => T | Promise<T>, options?: RetryOptions): Promise<T> {\n const {\n retries = 3,\n delay = 1000,\n backoff = 'exponential',\n jitter = false,\n maxDelay = 30000,\n shouldRetry,\n onRetry,\n signal,\n } = options ?? {};\n\n if (retries < 0) {\n throw new RangeError('retries must be >= 0');\n }\n\n let lastError: Error | undefined;\n\n for (let attempt = 0; attempt <= retries; attempt++) {\n if (signal?.aborted) {\n throw new AbortError('Retry aborted');\n }\n\n try {\n const result = await fn();\n return result;\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n\n if (attempt === retries) break;\n\n if (shouldRetry) {\n const shouldContinue = await shouldRetry(lastError, attempt + 1);\n if (!shouldContinue) break;\n }\n\n if (onRetry) {\n await onRetry(lastError, attempt + 1);\n }\n\n let waitTime = calculateDelay(attempt + 1, delay, backoff, jitter);\n waitTime = Math.min(waitTime, maxDelay);\n\n await sleep(waitTime, signal);\n }\n }\n\n throw lastError!;\n}\n\n/**\n * Wrap a function to automatically retry on failure.\n *\n * @example\n * ```ts\n * const safeFetch = retryable(fetch, { retries: 3 });\n * const data = await safeFetch('/api/data');\n * ```\n */\nexport function retryable<TArgs extends any[], TReturn>(\n fn: (...args: TArgs) => Promise<TReturn>,\n options?: RetryOptions,\n): (...args: TArgs) => Promise<TReturn> {\n return (...args: TArgs) => retry(() => fn(...args), options);\n}\n","// ============================================================================\n// FlowX — Circuit Breaker Pattern\n// ============================================================================\nimport { CircuitBreakerError } from './types';\n\nexport type CircuitState = 'closed' | 'open' | 'half-open';\n\nexport interface CircuitBreakerOptions {\n /** Number of failures before opening the circuit (default: 5) */\n failureThreshold?: number;\n /** Time in ms before attempting half-open (default: 30000) */\n resetTimeout?: number;\n /** Max concurrent calls in half-open state (default: 1) */\n halfOpenLimit?: number;\n /** Custom predicate to decide if an error should count as a failure */\n shouldTrip?: (error: Error) => boolean;\n /** Callback fired on state changes */\n onStateChange?: (from: CircuitState, to: CircuitState) => void;\n /** Number of successes in half-open to close the circuit (default: 1) */\n successThreshold?: number;\n}\n\nexport interface CircuitBreaker<TArgs extends any[], TReturn> {\n /** Execute the protected function */\n fire: (...args: TArgs) => Promise<TReturn>;\n /** Get the current circuit state */\n readonly state: CircuitState;\n /** Get the current failure count */\n readonly failureCount: number;\n /** Get the current success count (in half-open) */\n readonly successCount: number;\n /** Manually reset the circuit to closed */\n reset: () => void;\n /** Manually open the circuit */\n open: () => void;\n}\n\n/**\n * Create a circuit breaker to protect against cascading failures.\n *\n * @example\n * ```ts\n * const breaker = createCircuitBreaker(callExternalApi, {\n * failureThreshold: 5,\n * resetTimeout: 30000,\n * });\n * const data = await breaker.fire('arg1');\n * ```\n */\nexport function createCircuitBreaker<TArgs extends any[], TReturn>(\n fn: (...args: TArgs) => Promise<TReturn>,\n options?: CircuitBreakerOptions,\n): CircuitBreaker<TArgs, TReturn> {\n const {\n failureThreshold = 5,\n resetTimeout = 30000,\n halfOpenLimit = 1,\n shouldTrip,\n onStateChange,\n successThreshold = 1,\n } = options ?? {};\n\n let state: CircuitState = 'closed';\n let failureCount = 0;\n let successCount = 0;\n let halfOpenActive = 0;\n let resetTimer: ReturnType<typeof setTimeout> | null = null;\n\n function transition(to: CircuitState): void {\n if (state === to) return;\n const from = state;\n state = to;\n onStateChange?.(from, to);\n }\n\n function scheduleReset(): void {\n /* istanbul ignore next -- defensive guard; timer always fires before reschedule in normal flow */\n if (resetTimer) clearTimeout(resetTimer);\n resetTimer = setTimeout(() => {\n resetTimer = null;\n transition('half-open');\n halfOpenActive = 0;\n successCount = 0;\n }, resetTimeout);\n }\n\n function reset(): void {\n if (resetTimer) {\n clearTimeout(resetTimer);\n resetTimer = null;\n }\n failureCount = 0;\n successCount = 0;\n halfOpenActive = 0;\n transition('closed');\n }\n\n function manualOpen(): void {\n if (resetTimer) {\n clearTimeout(resetTimer);\n resetTimer = null;\n }\n failureCount = 0;\n successCount = 0;\n halfOpenActive = 0;\n transition('open');\n scheduleReset();\n }\n\n async function fire(...args: TArgs): Promise<TReturn> {\n if (state === 'open') {\n throw new CircuitBreakerError();\n }\n\n if (state === 'half-open' && halfOpenActive >= halfOpenLimit) {\n throw new CircuitBreakerError('Circuit breaker is half-open — limit reached');\n }\n\n if (state === 'half-open') {\n halfOpenActive++;\n }\n\n try {\n const result = await fn(...args);\n\n if (state === 'half-open') {\n successCount++;\n halfOpenActive--;\n if (successCount >= successThreshold) {\n reset();\n }\n } else {\n // In closed state, reset failure count on success\n failureCount = 0;\n }\n\n return result;\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n\n if (shouldTrip && !shouldTrip(err)) {\n if (state === 'half-open') {\n halfOpenActive--;\n }\n throw err;\n }\n\n if (state === 'half-open') {\n halfOpenActive--;\n transition('open');\n scheduleReset();\n } else {\n failureCount++;\n if (failureCount >= failureThreshold) {\n transition('open');\n scheduleReset();\n }\n }\n\n throw err;\n }\n }\n\n return {\n fire,\n get state() {\n return state;\n },\n get failureCount() {\n return failureCount;\n },\n get successCount() {\n return successCount;\n },\n reset,\n open: manualOpen,\n };\n}\n","// ============================================================================\n// FlowX — Bulkhead Isolation Pattern\n// ============================================================================\nimport { BulkheadError } from './types';\n\nexport interface BulkheadOptions {\n /** Maximum concurrent executions (default: 10) */\n concurrency?: number;\n /** Maximum queue size for waiting tasks (default: 10) */\n queueSize?: number;\n /** Timeout in ms for queued tasks (0 = no timeout) */\n queueTimeout?: number;\n}\n\nexport interface Bulkhead {\n /** Execute a function within the bulkhead */\n execute: <T>(fn: () => Promise<T>) => Promise<T>;\n /** Current number of active executions */\n readonly active: number;\n /** Current number of queued tasks */\n readonly queued: number;\n /** Available capacity */\n readonly available: number;\n}\n\ninterface QueueItem<T = any> {\n fn: () => Promise<T>;\n resolve: (value: T) => void;\n reject: (error: Error) => void;\n timer?: ReturnType<typeof setTimeout>;\n}\n\n/**\n * Create a bulkhead to isolate concurrent operations and prevent resource exhaustion.\n *\n * @example\n * ```ts\n * const bulkhead = createBulkhead({ concurrency: 5, queueSize: 10 });\n * const data = await bulkhead.execute(() => fetch('/api'));\n * ```\n */\nexport function createBulkhead(options?: BulkheadOptions): Bulkhead {\n const { concurrency = 10, queueSize = 10, queueTimeout = 0 } = options ?? {};\n\n if (concurrency < 1) throw new RangeError('concurrency must be >= 1');\n if (queueSize < 0) throw new RangeError('queueSize must be >= 0');\n\n let active = 0;\n const queue: QueueItem[] = [];\n\n function tryDequeue(): void {\n while (queue.length > 0 && active < concurrency) {\n const item = queue.shift()!;\n if (item.timer) clearTimeout(item.timer);\n run(item);\n }\n }\n\n async function run<T>(item: QueueItem<T>): Promise<void> {\n active++;\n try {\n const value = await item.fn();\n active--;\n tryDequeue();\n item.resolve(value);\n } catch (error) {\n active--;\n tryDequeue();\n item.reject(error instanceof Error ? error : new Error(String(error)));\n }\n }\n\n function execute<T>(fn: () => Promise<T>): Promise<T> {\n if (active < concurrency) {\n return new Promise<T>((resolve, reject) => {\n run({ fn, resolve, reject });\n });\n }\n\n if (queue.length >= queueSize) {\n return Promise.reject(new BulkheadError());\n }\n\n return new Promise<T>((resolve, reject) => {\n const item: QueueItem<T> = { fn, resolve, reject };\n\n if (queueTimeout > 0) {\n item.timer = setTimeout(() => {\n const idx = queue.indexOf(item as QueueItem);\n if (idx !== -1) {\n queue.splice(idx, 1);\n reject(new BulkheadError('Bulkhead queue timeout exceeded'));\n }\n }, queueTimeout);\n }\n\n queue.push(item as QueueItem);\n });\n }\n\n return {\n execute,\n get active() {\n return active;\n },\n get queued() {\n return queue.length;\n },\n get available() {\n return Math.max(0, concurrency - active);\n },\n };\n}\n","// ============================================================================\n// FlowX — Fallback Chain\n// ============================================================================\n\nexport interface FallbackOptions {\n /** Predicate to determine if the error warrants a fallback */\n shouldFallback?: (error: Error) => boolean;\n /** Callback fired when the primary function fails and fallback is used */\n onFallback?: (error: Error, fallbackIndex: number) => void;\n}\n\n/**\n * Execute a function with a fallback value or function if it fails.\n *\n * @example\n * ```ts\n * const data = await withFallback(\n * () => fetch('/primary-api'),\n * 'default-value',\n * );\n * ```\n */\nexport async function withFallback<T>(\n fn: () => T | Promise<T>,\n fallback: T | (() => T | Promise<T>),\n options?: FallbackOptions,\n): Promise<T> {\n try {\n return await fn();\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n\n if (options?.shouldFallback && !options.shouldFallback(err)) {\n throw err;\n }\n\n options?.onFallback?.(err, 0);\n\n if (typeof fallback === 'function') {\n return await (fallback as () => T | Promise<T>)();\n }\n return fallback;\n }\n}\n\n/**\n * Execute the first successful function from a chain of fallbacks.\n *\n * @example\n * ```ts\n * const data = await fallbackChain([\n * () => fetch('/primary'),\n * () => fetch('/secondary'),\n * () => fetch('/tertiary'),\n * ]);\n * ```\n */\nexport async function fallbackChain<T>(\n fns: Array<() => T | Promise<T>>,\n options?: FallbackOptions,\n): Promise<T> {\n if (fns.length === 0) {\n throw new Error('fallbackChain requires at least one function');\n }\n\n let lastError: Error | undefined;\n\n for (let i = 0; i < fns.length; i++) {\n try {\n return await fns[i]();\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n\n if (options?.shouldFallback && !options.shouldFallback(lastError)) {\n throw lastError;\n }\n\n if (i < fns.length - 1) {\n options?.onFallback?.(lastError, i + 1);\n }\n }\n }\n\n throw lastError!;\n}\n","// ============================================================================\n// FlowX — Hedged Requests\n// ============================================================================\n\nexport interface HedgeOptions {\n /** Delay in ms before launching the hedge request (default: 500) */\n delay?: number;\n /** Maximum number of parallel hedged calls (default: 1) */\n maxHedges?: number;\n}\n\n/**\n * Execute a function with hedged requests — if the primary doesn't respond\n * quickly enough, fire parallel redundant calls and return whichever resolves first.\n *\n * @example\n * ```ts\n * const data = await hedge(() => fetch('/api'), { delay: 200 });\n * ```\n */\nexport function hedge<T>(fn: () => Promise<T>, options?: HedgeOptions): Promise<T> {\n const { delay = 500, maxHedges = 1 } = options ?? {};\n\n if (delay < 0) throw new RangeError('delay must be >= 0');\n if (maxHedges < 1) throw new RangeError('maxHedges must be >= 1');\n\n return new Promise<T>((resolve, reject) => {\n let settled = false;\n let completedCount = 0;\n const totalAttempts = 1 + maxHedges;\n const errors: Error[] = [];\n const timers: ReturnType<typeof setTimeout>[] = [];\n\n function onResult(value: T): void {\n if (settled) return;\n settled = true;\n // Clear pending hedge timers\n for (const t of timers) clearTimeout(t);\n resolve(value);\n }\n\n function onError(error: Error): void {\n errors.push(error);\n completedCount++;\n if (completedCount >= totalAttempts && !settled) {\n settled = true;\n reject(errors[0]);\n }\n }\n\n // Launch primary request immediately\n fn().then(onResult, (err) => onError(err instanceof Error ? err : new Error(String(err))));\n\n // Launch hedged requests after delay\n for (let i = 0; i < maxHedges; i++) {\n const timer = setTimeout(\n () => {\n /* istanbul ignore if -- timer is always cleared by onResult before firing */\n if (settled) return;\n fn().then(onResult, (err) =>\n onError(err instanceof Error ? err : new Error(String(err))),\n );\n },\n delay * (i + 1),\n );\n timers.push(timer);\n }\n });\n}\n","// ============================================================================\n// FlowX — Counting Semaphore\n// ============================================================================\n\nexport interface Semaphore {\n /** Acquire a permit. Returns a release function. */\n acquire: () => Promise<() => void>;\n /** Execute a function exclusively within the semaphore */\n runExclusive: <T>(fn: () => T | Promise<T>) => Promise<T>;\n /** Number of available permits */\n readonly available: number;\n /** Number of tasks waiting for a permit */\n readonly waiting: number;\n}\n\ninterface Waiter {\n resolve: (release: () => void) => void;\n}\n\n/**\n * Create a counting semaphore for concurrency control.\n *\n * @example\n * ```ts\n * const sem = createSemaphore(3);\n * const release = await sem.acquire();\n * try {\n * await doWork();\n * } finally {\n * release();\n * }\n * ```\n */\nexport function createSemaphore(permits: number): Semaphore {\n if (permits < 1) throw new RangeError('permits must be >= 1');\n\n let available = permits;\n const waiters: Waiter[] = [];\n\n function release(): void {\n available++;\n if (waiters.length > 0) {\n available--;\n const next = waiters.shift()!;\n next.resolve(release);\n }\n }\n\n function acquire(): Promise<() => void> {\n if (available > 0) {\n available--;\n return Promise.resolve(release);\n }\n\n return new Promise<() => void>((resolve) => {\n waiters.push({ resolve });\n });\n }\n\n async function runExclusive<T>(fn: () => T | Promise<T>): Promise<T> {\n const releaseFn = await acquire();\n try {\n return await fn();\n } finally {\n releaseFn();\n }\n }\n\n return {\n acquire,\n runExclusive,\n get available() {\n return available;\n },\n get waiting() {\n return waiters.length;\n },\n };\n}\n","// ============================================================================\n// FlowX — Mutual Exclusion Lock\n// ============================================================================\n\nexport interface Mutex {\n /** Acquire the lock. Returns a release function. */\n lock: () => Promise<() => void>;\n /** Execute a function exclusively under the mutex */\n runExclusive: <T>(fn: () => T | Promise<T>) => Promise<T>;\n /** Whether the mutex is currently locked */\n readonly isLocked: boolean;\n /** Number of tasks waiting for the lock */\n readonly waiting: number;\n}\n\n/**\n * Create a mutual exclusion lock for serializing async operations.\n *\n * @example\n * ```ts\n * const mutex = createMutex();\n * await mutex.runExclusive(async () => {\n * await updateSharedResource();\n * });\n * ```\n */\nexport function createMutex(): Mutex {\n let locked = false;\n const waitQueue: Array<(release: () => void) => void> = [];\n\n function release(): void {\n if (waitQueue.length > 0) {\n const next = waitQueue.shift()!;\n // Stay locked, transfer to next waiter\n next(release);\n } else {\n locked = false;\n }\n }\n\n function lock(): Promise<() => void> {\n if (!locked) {\n locked = true;\n return Promise.resolve(release);\n }\n\n return new Promise<() => void>((resolve) => {\n waitQueue.push(resolve);\n });\n }\n\n async function runExclusive<T>(fn: () => T | Promise<T>): Promise<T> {\n const releaseFn = await lock();\n try {\n return await fn();\n } finally {\n releaseFn();\n }\n }\n\n return {\n lock,\n runExclusive,\n get isLocked() {\n return locked;\n },\n get waiting() {\n return waitQueue.length;\n },\n };\n}\n","// ============================================================================\n// FlowX — Priority Async Queue\n// ============================================================================\n\nexport interface QueueOptions {\n /** Maximum concurrent tasks (default: 1) */\n concurrency?: number;\n /** Start processing immediately (default: true) */\n autoStart?: boolean;\n /** Per-task timeout in ms (0 = no timeout) */\n timeout?: number;\n}\n\nexport interface QueueAddOptions {\n /** Task priority — lower number = higher priority (default: 0) */\n priority?: number;\n}\n\nexport interface AsyncQueue {\n /** Add a task to the queue */\n add: <T>(fn: () => Promise<T>, options?: QueueAddOptions) => Promise<T>;\n /** Add multiple tasks and return all results */\n addAll: <T>(fns: Array<() => Promise<T>>, options?: QueueAddOptions) => Promise<T[]>;\n /** Pause processing */\n pause: () => void;\n /** Resume processing */\n resume: () => void;\n /** Clear all pending tasks */\n clear: () => void;\n /** Wait until the queue is empty */\n onEmpty: () => Promise<void>;\n /** Wait until the queue is idle (empty + no active tasks) */\n onIdle: () => Promise<void>;\n /** Number of pending tasks */\n readonly size: number;\n /** Number of active tasks */\n readonly pending: number;\n /** Whether the queue is paused */\n readonly isPaused: boolean;\n}\n\ninterface QueueEntry {\n fn: () => Promise<any>;\n priority: number;\n resolve: (value: any) => void;\n reject: (error: Error) => void;\n}\n\n/**\n * Create a priority async queue with concurrency control.\n *\n * @example\n * ```ts\n * const queue = createQueue({ concurrency: 3 });\n * const result = await queue.add(() => fetch('/api'), { priority: 1 });\n * await queue.onIdle();\n * ```\n */\nexport function createQueue(options?: QueueOptions): AsyncQueue {\n const { concurrency = 1, autoStart = true, timeout = 0 } = options ?? {};\n\n if (concurrency < 1) throw new RangeError('concurrency must be >= 1');\n\n let paused = !autoStart;\n let active = 0;\n const entries: QueueEntry[] = [];\n const emptyCallbacks: Array<() => void> = [];\n const idleCallbacks: Array<() => void> = [];\n\n function notifyIdle(): void {\n if (active === 0 && entries.length === 0) {\n for (const cb of idleCallbacks.splice(0)) cb();\n }\n }\n\n function notifyEmpty(): void {\n if (entries.length === 0) {\n for (const cb of emptyCallbacks.splice(0)) cb();\n }\n }\n\n function tryRun(): void {\n if (paused) return;\n\n while (active < concurrency && entries.length > 0) {\n const entry = entries.shift()!;\n active++;\n\n let timer: ReturnType<typeof setTimeout> | undefined;\n\n const run = async () => {\n try {\n let result: any;\n if (timeout > 0) {\n result = await Promise.race([\n entry.fn(),\n new Promise<never>((_, rej) => {\n timer = setTimeout(() => rej(new Error('Queue task timeout')), timeout);\n }),\n ]);\n } else {\n result = await entry.fn();\n }\n if (timer) clearTimeout(timer);\n entry.resolve(result);\n } catch (error) {\n if (timer) clearTimeout(timer);\n entry.reject(error instanceof Error ? error : new Error(String(error)));\n } finally {\n active--;\n notifyEmpty();\n tryRun();\n notifyIdle();\n }\n };\n\n run();\n }\n\n notifyEmpty();\n notifyIdle();\n }\n\n function add<T>(fn: () => Promise<T>, addOptions?: QueueAddOptions): Promise<T> {\n const priority = addOptions?.priority ?? 0;\n\n return new Promise<T>((resolve, reject) => {\n const entry: QueueEntry = { fn, priority, resolve, reject };\n\n // Insert sorted by priority (lower = higher priority)\n let inserted = false;\n for (let i = 0; i < entries.length; i++) {\n if (priority < entries[i].priority) {\n entries.splice(i, 0, entry);\n inserted = true;\n break;\n }\n }\n if (!inserted) {\n entries.push(entry);\n }\n\n tryRun();\n });\n }\n\n function addAll<T>(fns: Array<() => Promise<T>>, addOptions?: QueueAddOptions): Promise<T[]> {\n return Promise.all(fns.map((fn) => add(fn, addOptions)));\n }\n\n function pause(): void {\n paused = true;\n }\n\n function resume(): void {\n paused = false;\n tryRun();\n }\n\n function clear(): void {\n for (const entry of entries.splice(0)) {\n entry.reject(new Error('Queue cleared'));\n }\n }\n\n function onEmpty(): Promise<void> {\n if (entries.length === 0) return Promise.resolve();\n return new Promise<void>((resolve) => emptyCallbacks.push(resolve));\n }\n\n function onIdle(): Promise<void> {\n if (active === 0 && entries.length === 0) return Promise.resolve();\n return new Promise<void>((resolve) => idleCallbacks.push(resolve));\n }\n\n return {\n add,\n addAll,\n pause,\n resume,\n clear,\n onEmpty,\n onIdle,\n get size() {\n return entries.length;\n },\n get pending() {\n return active;\n },\n get isPaused() {\n return paused;\n },\n };\n}\n","// ============================================================================\n// FlowX — Token Bucket Rate Limiter\n// ============================================================================\nimport { RateLimitError } from './types';\n\nexport interface RateLimitOptions {\n /** Maximum number of executions per interval */\n limit: number;\n /** Time window in ms */\n interval: number;\n /** Whether to reject or queue when limit is exceeded (default: 'queue') */\n strategy?: 'queue' | 'reject';\n}\n\nexport interface RateLimiter {\n /** Execute a function within the rate limit */\n execute: <T>(fn: () => T | Promise<T>) => Promise<T>;\n /** Reset the rate limiter state */\n reset: () => void;\n /** Number of remaining tokens in current window */\n readonly remaining: number;\n}\n\n/**\n * Create a rate limiter using the token bucket algorithm.\n *\n * @example\n * ```ts\n * const limiter = createRateLimiter({ limit: 10, interval: 1000 });\n * await limiter.execute(() => fetch('/api'));\n * ```\n */\nexport function createRateLimiter(options: RateLimitOptions): RateLimiter {\n const { limit, interval, strategy = 'queue' } = options;\n\n if (limit < 1) throw new RangeError('limit must be >= 1');\n if (interval < 1) throw new RangeError('interval must be >= 1');\n\n let tokens = limit;\n let lastRefill = Date.now();\n const queue: Array<{ resolve: () => void }> = [];\n let drainTimer: ReturnType<typeof setTimeout> | null = null;\n\n function refill(): void {\n const now = Date.now();\n const elapsed = now - lastRefill;\n const refillCount = Math.floor(elapsed / interval) * limit;\n\n if (refillCount > 0) {\n tokens = Math.min(limit, tokens + refillCount);\n lastRefill = now;\n }\n }\n\n function drainQueue(): void {\n refill();\n while (queue.length > 0 && tokens > 0) {\n tokens--;\n const item = queue.shift()!;\n item.resolve();\n }\n\n if (queue.length > 0) {\n scheduleDrain();\n } else {\n drainTimer = null;\n }\n }\n\n function scheduleDrain(): void {\n if (drainTimer) return;\n const timeToNextToken = interval / limit;\n drainTimer = setTimeout(() => {\n drainTimer = null;\n drainQueue();\n }, timeToNextToken);\n }\n\n async function execute<T>(fn: () => T | Promise<T>): Promise<T> {\n refill();\n\n if (tokens > 0) {\n tokens--;\n return await fn();\n }\n\n if (strategy === 'reject') {\n throw new RateLimitError();\n }\n\n // Queue strategy — wait for a token\n await new Promise<void>((resolve) => {\n queue.push({ resolve });\n scheduleDrain();\n });\n\n return await fn();\n }\n\n function reset(): void {\n tokens = limit;\n lastRefill = Date.now();\n if (drainTimer) {\n clearTimeout(drainTimer);\n drainTimer = null;\n }\n drainQueue();\n }\n\n return {\n execute,\n reset,\n get remaining() {\n refill();\n return tokens;\n },\n };\n}\n","// ============================================================================\n// FlowX — Promise Timeout with Cleanup\n// ============================================================================\nimport { AbortError, TimeoutError } from './types';\n\nexport interface TimeoutOptions<T = unknown> {\n /** Fallback value or factory when timeout occurs */\n fallback?: T | (() => T | Promise<T>);\n /** AbortSignal for external cancellation */\n signal?: AbortSignal;\n /** Custom error message */\n message?: string;\n}\n\n/**\n * Wrap an async operation with a timeout.\n *\n * @example\n * ```ts\n * const result = await withTimeout(() => fetch('/slow-api'), 5000);\n * ```\n */\nexport async function withTimeout<T>(\n fn: () => T | Promise<T>,\n ms: number,\n options?: TimeoutOptions<T>,\n): Promise<T> {\n if (ms <= 0) {\n throw new RangeError('Timeout must be > 0');\n }\n\n if (options?.signal?.aborted) {\n throw new AbortError();\n }\n\n const fnResult = fn(); // call synchronously so sync throws propagate\n\n return Promise.race([\n Promise.resolve(fnResult),\n new Promise<T>((_, reject) => {\n const timer = setTimeout(() => {\n if (options?.fallback !== undefined) {\n const fb = options.fallback;\n if (typeof fb === 'function') {\n try {\n const result = (fb as () => T | Promise<T>)();\n Promise.resolve(result).then(\n (v) => reject({ __resolved: true, value: v } as any),\n reject,\n );\n } catch (err) {\n reject(err);\n }\n } else {\n reject({ __resolved: true, value: fb } as any);\n }\n } else {\n reject(new TimeoutError(options?.message));\n }\n }, ms);\n\n // If signal aborts, reject the race\n if (options?.signal) {\n const onAbort = () => {\n clearTimeout(timer);\n reject(new AbortError());\n };\n options.signal.addEventListener('abort', onAbort, { once: true });\n }\n\n // Clean up timer when fn resolves\n Promise.resolve(fnResult).then(\n () => clearTimeout(timer),\n () => clearTimeout(timer),\n );\n }),\n ]).catch((err) => {\n // Handle the fallback resolution hack\n if (err && typeof err === 'object' && '__resolved' in err) {\n return err.value as T;\n }\n throw err;\n });\n}\n","// ============================================================================\n// FlowX — Async-Aware Debounce\n// ============================================================================\n\nexport interface DebounceOptions {\n /** Invoke on the leading edge (default: false) */\n leading?: boolean;\n /** Invoke on the trailing edge (default: true) */\n trailing?: boolean;\n /** Maximum wait time before forced invocation in ms */\n maxWait?: number;\n}\n\nexport interface DebouncedFunction<TArgs extends any[], TReturn> {\n /** Call the debounced function */\n (...args: TArgs): Promise<TReturn>;\n /** Cancel any pending invocation */\n cancel: () => void;\n /** Immediately invoke any pending call */\n flush: () => Promise<TReturn | undefined>;\n /** Whether there is a pending invocation */\n readonly pending: boolean;\n}\n\n/**\n * Create a debounced version of an async function.\n *\n * @example\n * ```ts\n * const debouncedSearch = debounce(searchApi, 300);\n * await debouncedSearch('query');\n * ```\n */\nexport function debounce<TArgs extends any[], TReturn>(\n fn: (...args: TArgs) => TReturn | Promise<TReturn>,\n wait: number,\n options?: DebounceOptions,\n): DebouncedFunction<TArgs, TReturn> {\n const { leading = false, trailing = true, maxWait } = options ?? {};\n\n if (wait < 0) throw new RangeError('wait must be >= 0');\n\n let timer: ReturnType<typeof setTimeout> | null = null;\n let maxTimer: ReturnType<typeof setTimeout> | null = null;\n let lastArgs: TArgs | null = null;\n const pendingResolvers: Array<{\n resolve: (value: TReturn) => void;\n reject: (error: Error) => void;\n }> = [];\n let isPending = false;\n\n async function invoke(): Promise<void> {\n\n const args = lastArgs!;\n const resolvers = pendingResolvers.splice(0);\n lastArgs = null;\n isPending = false;\n\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n if (maxTimer) {\n clearTimeout(maxTimer);\n maxTimer = null;\n }\n\n try {\n const result = await fn(...args);\n for (const r of resolvers) r.resolve(result);\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n for (const r of resolvers) r.reject(err);\n }\n }\n\n function debounced(...args: TArgs): Promise<TReturn> {\n lastArgs = args;\n\n return new Promise<TReturn>((resolve, reject) => {\n pendingResolvers.push({ resolve, reject });\n\n // Leading edge\n if (leading && !isPending) {\n isPending = true;\n invoke();\n return;\n }\n\n isPending = true;\n\n // Reset trailing timer\n if (timer) clearTimeout(timer);\n\n if (trailing) {\n timer = setTimeout(() => {\n timer = null;\n invoke();\n }, wait);\n }\n\n // Set max wait timer\n if (maxWait !== undefined && !maxTimer) {\n maxTimer = setTimeout(() => {\n maxTimer = null;\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n invoke();\n }, maxWait);\n }\n });\n }\n\n debounced.cancel = (): void => {\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n if (maxTimer) {\n clearTimeout(maxTimer);\n maxTimer = null;\n }\n lastArgs = null;\n isPending = false;\n // Reject all pending resolvers\n const resolvers = pendingResolvers.splice(0);\n for (const r of resolvers) {\n r.reject(new Error('Debounced call cancelled'));\n }\n };\n\n debounced.flush = async (): Promise<TReturn | undefined> => {\n if (!isPending) return undefined;\n const promise = new Promise<TReturn>((resolve, reject) => {\n pendingResolvers.push({ resolve, reject });\n });\n await invoke();\n return promise;\n };\n\n Object.defineProperty(debounced, 'pending', {\n get() {\n return isPending;\n },\n });\n\n return debounced as DebouncedFunction<TArgs, TReturn>;\n}\n","// ============================================================================\n// FlowX — Async-Aware Throttle\n// ============================================================================\n\nexport interface ThrottleOptions {\n /** Invoke on the leading edge (default: true) */\n leading?: boolean;\n /** Invoke on the trailing edge (default: true) */\n trailing?: boolean;\n}\n\nexport interface ThrottledFunction<TArgs extends any[], TReturn> {\n (...args: TArgs): Promise<TReturn>;\n /** Cancel any pending trailing invocation */\n cancel: () => void;\n /** Whether there is a pending trailing invocation */\n readonly pending: boolean;\n}\n\n/**\n * Create a throttled version of an async function.\n *\n * @example\n * ```ts\n * const throttledSave = throttle(saveData, 1000);\n * await throttledSave(data);\n * ```\n */\nexport function throttle<TArgs extends any[], TReturn>(\n fn: (...args: TArgs) => TReturn | Promise<TReturn>,\n wait: number,\n options?: ThrottleOptions,\n): ThrottledFunction<TArgs, TReturn> {\n const { leading = true, trailing = true } = options ?? {};\n\n if (wait < 0) throw new RangeError('wait must be >= 0');\n\n let lastCallTime: number | null = null;\n let timer: ReturnType<typeof setTimeout> | null = null;\n let lastArgs: TArgs | null = null;\n let isPending = false;\n const trailingResolvers: Array<{\n resolve: (value: TReturn) => void;\n reject: (error: Error) => void;\n }> = [];\n\n async function invokeTrailing(): Promise<void> {\n const args = lastArgs;\n const resolvers = trailingResolvers.splice(0);\n lastArgs = null;\n isPending = false;\n timer = null;\n\n if (!args) {\n /* istanbul ignore next -- resolvers is always empty here; lastArgs cleared before trailing fires */\n for (const r of resolvers) r.resolve(undefined as TReturn);\n return;\n }\n\n try {\n const result = await fn(...args);\n for (const r of resolvers) r.resolve(result);\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n for (const r of resolvers) r.reject(err);\n }\n }\n\n function throttled(...args: TArgs): Promise<TReturn> {\n const now = Date.now();\n lastArgs = args;\n\n const timeSinceLastCall = lastCallTime === null ? wait : now - lastCallTime;\n const shouldCallLeading = leading && timeSinceLastCall >= wait;\n\n if (shouldCallLeading) {\n lastCallTime = now;\n lastArgs = null;\n\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n\n // Resolve any pending trailing resolvers with this call's result\n const prevResolvers = trailingResolvers.splice(0);\n\n const resultPromise = (async () => {\n try {\n const result = await fn(...args);\n for (const r of prevResolvers) r.resolve(result);\n return result;\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n /* istanbul ignore next -- prevResolvers is always empty on leading calls in normal flow */\n for (const r of prevResolvers) r.reject(err);\n throw err;\n }\n })();\n\n if (trailing) {\n timer = setTimeout(() => {\n lastCallTime = Date.now();\n invokeTrailing();\n }, wait);\n }\n\n return resultPromise;\n }\n\n // Schedule trailing call\n isPending = true;\n\n return new Promise<TReturn>((resolve, reject) => {\n trailingResolvers.push({ resolve, reject });\n\n if (!timer && trailing) {\n const remaining = wait - timeSinceLastCall;\n timer = setTimeout(() => {\n lastCallTime = Date.now();\n invokeTrailing();\n }, remaining);\n }\n });\n }\n\n throttled.cancel = (): void => {\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n lastArgs = null;\n lastCallTime = null;\n isPending = false;\n const resolvers = trailingResolvers.splice(0);\n for (const r of resolvers) {\n r.reject(new Error('Throttled call cancelled'));\n }\n };\n\n Object.defineProperty(throttled, 'pending', {\n get() {\n return isPending;\n },\n });\n\n return throttled as ThrottledFunction<TArgs, TReturn>;\n}\n","// ============================================================================\n// FlowX — Batch Processing with Concurrency\n// ============================================================================\nimport { AbortError } from './types';\n\nexport interface BatchOptions {\n /** Maximum concurrent batch operations (default: Infinity) */\n concurrency?: number;\n /** Number of items per batch (default: 1) */\n batchSize?: number;\n /** Progress callback */\n onProgress?: (completed: number, total: number) => void;\n /** AbortSignal for cancellation */\n signal?: AbortSignal;\n}\n\nexport interface BatchResult<T> {\n /** All results in order */\n results: T[];\n /** Total items processed */\n total: number;\n /** Number of succeeded items */\n succeeded: number;\n /** Number of failed items */\n failed: number;\n /** Errors indexed by position */\n errors: Map<number, Error>;\n}\n\n/**\n * Process an array of items in batches with concurrency control.\n *\n * @example\n * ```ts\n * const results = await batch(\n * urls,\n * async (url) => fetch(url).then(r => r.json()),\n * { concurrency: 5, batchSize: 10 },\n * );\n * ```\n */\nexport async function batch<TItem, TResult>(\n items: TItem[],\n fn: (item: TItem, index: number) => Promise<TResult>,\n options?: BatchOptions,\n): Promise<BatchResult<TResult>> {\n const { concurrency = Infinity, batchSize = 1, onProgress, signal } = options ?? {};\n\n if (batchSize < 1) throw new RangeError('batchSize must be >= 1');\n if (concurrency < 1) throw new RangeError('concurrency must be >= 1');\n\n const results: TResult[] = new Array(items.length);\n const errors = new Map<number, Error>();\n let completed = 0;\n let succeeded = 0;\n let failed = 0;\n\n // Split items into batches\n const batches: Array<{ items: TItem[]; startIndex: number }> = [];\n for (let i = 0; i < items.length; i += batchSize) {\n batches.push({\n items: items.slice(i, i + batchSize),\n startIndex: i,\n });\n }\n\n // Process batches with concurrency control\n let batchIndex = 0;\n\n async function processBatch(): Promise<void> {\n while (batchIndex < batches.length) {\n if (signal?.aborted) throw new AbortError();\n\n const currentBatch = batches[batchIndex++];\n\n for (let i = 0; i < currentBatch.items.length; i++) {\n if (signal?.aborted) throw new AbortError();\n\n const globalIndex = currentBatch.startIndex + i;\n try {\n results[globalIndex] = await fn(currentBatch.items[i], globalIndex);\n succeeded++;\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n errors.set(globalIndex, err);\n results[globalIndex] = undefined as TResult;\n failed++;\n }\n completed++;\n onProgress?.(completed, items.length);\n }\n }\n }\n\n const workers: Promise<void>[] = [];\n const workerCount = Math.min(concurrency, batches.length);\n\n for (let i = 0; i < workerCount; i++) {\n workers.push(processBatch());\n }\n\n await Promise.all(workers);\n\n return {\n results,\n total: items.length,\n succeeded,\n failed,\n errors,\n };\n}\n","// ============================================================================\n// FlowX — Async Pipeline Composition\n// ============================================================================\n\n/** A step in the pipeline */\nexport type PipelineStep<TIn, TOut> = (input: TIn) => TOut | Promise<TOut>;\n\n/**\n * Compose multiple async functions into a single pipeline.\n *\n * @example\n * ```ts\n * const process = pipeline(\n * (x: number) => x * 2,\n * (x: number) => x + 1,\n * (x: number) => String(x),\n * );\n * const result = await process(5); // \"11\"\n * ```\n */\nexport function pipeline<A, B>(s1: PipelineStep<A, B>): (input: A) => Promise<B>;\nexport function pipeline<A, B, C>(\n s1: PipelineStep<A, B>,\n s2: PipelineStep<B, C>,\n): (input: A) => Promise<C>;\nexport function pipeline<A, B, C, D>(\n s1: PipelineStep<A, B>,\n s2: PipelineStep<B, C>,\n s3: PipelineStep<C, D>,\n): (input: A) => Promise<D>;\nexport function pipeline<A, B, C, D, E>(\n s1: PipelineStep<A, B>,\n s2: PipelineStep<B, C>,\n s3: PipelineStep<C, D>,\n s4: PipelineStep<D, E>,\n): (input: A) => Promise<E>;\nexport function pipeline<A, B, C, D, E, F>(\n s1: PipelineStep<A, B>,\n s2: PipelineStep<B, C>,\n s3: PipelineStep<C, D>,\n s4: PipelineStep<D, E>,\n s5: PipelineStep<E, F>,\n): (input: A) => Promise<F>;\nexport function pipeline(...steps: Array<PipelineStep<any, any>>): (input: any) => Promise<any>;\nexport function pipeline(...steps: Array<PipelineStep<any, any>>): (input: any) => Promise<any> {\n if (steps.length === 0) {\n throw new Error('pipeline requires at least one step');\n }\n\n return async (input: any) => {\n let current = input;\n for (const step of steps) {\n current = await step(current);\n }\n return current;\n };\n}\n\n/**\n * Execute a value through a series of async transformation steps.\n *\n * @example\n * ```ts\n * const result = await pipe(\n * 5,\n * (x) => x * 2,\n * (x) => x + 1,\n * (x) => String(x),\n * ); // \"11\"\n * ```\n */\nexport async function pipe<A, B>(input: A, s1: PipelineStep<A, B>): Promise<B>;\nexport async function pipe<A, B, C>(\n input: A,\n s1: PipelineStep<A, B>,\n s2: PipelineStep<B, C>,\n): Promise<C>;\nexport async function pipe<A, B, C, D>(\n input: A,\n s1: PipelineStep<A, B>,\n s2: PipelineStep<B, C>,\n s3: PipelineStep<C, D>,\n): Promise<D>;\nexport async function pipe<A, B, C, D, E>(\n input: A,\n s1: PipelineStep<A, B>,\n s2: PipelineStep<B, C>,\n s3: PipelineStep<C, D>,\n s4: PipelineStep<D, E>,\n): Promise<E>;\nexport async function pipe<A, B, C, D, E, F>(\n input: A,\n s1: PipelineStep<A, B>,\n s2: PipelineStep<B, C>,\n s3: PipelineStep<C, D>,\n s4: PipelineStep<D, E>,\n s5: PipelineStep<E, F>,\n): Promise<F>;\nexport async function pipe(input: any, ...steps: Array<PipelineStep<any, any>>): Promise<any>;\nexport async function pipe(input: any, ...steps: Array<PipelineStep<any, any>>): Promise<any> {\n if (steps.length === 0) {\n throw new Error('pipe requires at least one step');\n }\n\n let current = input;\n for (const step of steps) {\n current = await step(current);\n }\n return current;\n}\n","// ============================================================================\n// FlowX — Polling with Backoff\n// ============================================================================\nimport { AbortError, BackoffStrategy, calculateDelay, sleep } from './types';\n\nexport interface PollOptions<T> {\n /** Polling interval in ms (default: 1000) */\n interval?: number;\n /** Condition to stop polling — return true to resolve */\n until?: (result: T) => boolean;\n /** Maximum number of poll attempts (default: Infinity) */\n maxAttempts?: number;\n /** Backoff strategy for interval (default: 'fixed') */\n backoff?: BackoffStrategy;\n /** AbortSignal for cancellation */\n signal?: AbortSignal;\n}\n\nexport interface PollController<T> {\n /** Promise that resolves with the final result */\n result: Promise<T>;\n /** Stop polling early */\n stop: () => void;\n}\n\n/**\n * Poll an async function until a condition is met.\n *\n * @example\n * ```ts\n * const { result } = poll(\n * () => checkJobStatus(jobId),\n * { until: (status) => status === 'done', interval: 2000 },\n * );\n * const finalStatus = await result;\n * ```\n */\nexport function poll<T>(fn: () => T | Promise<T>, options?: PollOptions<T>): PollController<T> {\n const {\n interval = 1000,\n until,\n maxAttempts = Infinity,\n backoff = 'fixed',\n signal,\n } = options ?? {};\n\n if (interval < 0) throw new RangeError('interval must be >= 0');\n\n let stopped = false;\n let rejectFn: ((error: Error) => void) | null = null;\n\n const result = (async (): Promise<T> => {\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n if (stopped || signal?.aborted) {\n throw new AbortError('Polling stopped');\n }\n\n const value = await fn();\n\n if (until ? until(value) : true) {\n return value;\n }\n\n if (attempt < maxAttempts) {\n const waitTime = calculateDelay(attempt, interval, backoff);\n await sleep(waitTime, signal).catch((err) => {\n /* istanbul ignore if -- stop() doesn't abort sleep; this is a defensive guard */\n if (stopped) throw new AbortError('Polling stopped');\n throw err;\n });\n }\n }\n\n throw new Error('Polling exceeded maximum attempts');\n })();\n\n // Capture the reject function for external stopping\n const wrappedResult = new Promise<T>((resolve, reject) => {\n rejectFn = reject;\n result.then(resolve, reject);\n });\n\n function stop(): void {\n stopped = true;\n rejectFn?.(new AbortError('Polling stopped'));\n }\n\n return {\n result: wrappedResult,\n stop,\n };\n}\n","// ============================================================================\n// FlowX — Deferred Promise\n// ============================================================================\n\nexport interface Deferred<T> {\n /** The underlying promise */\n promise: Promise<T>;\n /** Resolve the deferred */\n resolve: (value: T | PromiseLike<T>) => void;\n /** Reject the deferred */\n reject: (reason?: any) => void;\n /** Whether the deferred has been settled */\n readonly isSettled: boolean;\n /** Whether the deferred was resolved */\n readonly isResolved: boolean;\n /** Whether the deferred was rejected */\n readonly isRejected: boolean;\n}\n\n/**\n * Create a deferred promise — a promise whose resolve/reject are externally accessible.\n *\n * @example\n * ```ts\n * const deferred = createDeferred<string>();\n * setTimeout(() => deferred.resolve('done'), 1000);\n * const result = await deferred.promise; // 'done'\n * ```\n */\nexport function createDeferred<T = void>(): Deferred<T> {\n let isSettled = false;\n let isResolved = false;\n let isRejected = false;\n let resolveFn!: (value: T | PromiseLike<T>) => void;\n let rejectFn!: (reason?: any) => void;\n\n const promise = new Promise<T>((resolve, reject) => {\n resolveFn = resolve;\n rejectFn = reject;\n });\n\n return {\n promise,\n resolve: (value: T | PromiseLike<T>) => {\n if (isSettled) return;\n isSettled = true;\n isResolved = true;\n resolveFn(value);\n },\n reject: (reason?: any) => {\n if (isSettled) return;\n isSettled = true;\n isRejected = true;\n rejectFn(reason);\n },\n get isSettled() {\n return isSettled;\n },\n get isResolved() {\n return isResolved;\n },\n get isRejected() {\n return isRejected;\n },\n };\n}\n","// ============================================================================\n// FlowX — Async Memoization with TTL\n// ============================================================================\n\nexport interface MemoOptions<TArgs extends any[]> {\n /** Time-to-live for cached results in ms (0 = forever) */\n ttl?: number;\n /** Maximum cache size (0 = unlimited) */\n maxSize?: number;\n /** Custom cache key generator */\n keyFn?: (...args: TArgs) => string;\n /** Whether to cache rejections (default: false) */\n cacheErrors?: boolean;\n}\n\nexport interface MemoizedFunction<TArgs extends any[], TReturn> {\n (...args: TArgs): Promise<TReturn>;\n /** Clear the entire cache */\n clear: () => void;\n /** Delete a specific cache entry */\n delete: (...args: TArgs) => boolean;\n /** Current cache size */\n readonly size: number;\n}\n\ninterface CacheEntry<T> {\n value: T;\n timestamp: number;\n isError: boolean;\n}\n\n/**\n * Create a memoized version of an async function with TTL and LRU eviction.\n *\n * @example\n * ```ts\n * const cachedFetch = memo(fetchUser, {\n * ttl: 60_000,\n * maxSize: 100,\n * keyFn: (id) => String(id),\n * });\n * const user = await cachedFetch(42);\n * ```\n */\nexport function memo<TArgs extends any[], TReturn>(\n fn: (...args: TArgs) => Promise<TReturn>,\n options?: MemoOptions<TArgs>,\n): MemoizedFunction<TArgs, TReturn> {\n const {\n ttl = 0,\n maxSize = 0,\n keyFn = (...args: TArgs) => JSON.stringify(args),\n cacheErrors = false,\n } = options ?? {};\n\n const cache = new Map<string, CacheEntry<TReturn>>();\n const pending = new Map<string, Promise<TReturn>>();\n\n function isExpired(entry: CacheEntry<TReturn>): boolean {\n if (ttl <= 0) return false;\n return Date.now() - entry.timestamp > ttl;\n }\n\n function evict(): void {\n if (maxSize <= 0 || cache.size < maxSize) return;\n // Remove the oldest entry (first key in Map insertion order)\n const firstKey = cache.keys().next().value;\n if (firstKey !== undefined) {\n cache.delete(firstKey);\n }\n }\n\n async function memoized(...args: TArgs): Promise<TReturn> {\n const key = keyFn(...args);\n\n // Check cache\n const cached = cache.get(key);\n if (cached && !isExpired(cached)) {\n // Move to end for LRU\n cache.delete(key);\n cache.set(key, cached);\n\n if (cached.isError) {\n throw cached.value;\n }\n return cached.value;\n }\n\n // Remove expired entry\n if (cached) {\n cache.delete(key);\n }\n\n // Check for in-flight request deduplication\n const inflight = pending.get(key);\n if (inflight) return inflight;\n\n const promise = fn(...args)\n .then((value) => {\n evict();\n cache.set(key, { value, timestamp: Date.now(), isError: false });\n pending.delete(key);\n return value;\n })\n .catch((error) => {\n pending.delete(key);\n if (cacheErrors) {\n evict();\n cache.set(key, { value: error, timestamp: Date.now(), isError: true });\n }\n throw error;\n });\n\n pending.set(key, promise);\n return promise;\n }\n\n memoized.clear = (): void => {\n cache.clear();\n pending.clear();\n };\n\n memoized.delete = (...args: TArgs): boolean => {\n const key = keyFn(...args);\n return cache.delete(key);\n };\n\n Object.defineProperty(memoized, 'size', {\n get() {\n return cache.size;\n },\n });\n\n return memoized as MemoizedFunction<TArgs, TReturn>;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/types.ts","../src/retry.ts","../src/circuit-breaker.ts","../src/bulkhead.ts","../src/fallback.ts","../src/hedge.ts","../src/semaphore.ts","../src/mutex.ts","../src/queue.ts","../src/rate-limit.ts","../src/timeout.ts","../src/debounce.ts","../src/throttle.ts","../src/batch.ts","../src/pipeline.ts","../src/poll.ts","../src/deferred.ts","../src/memo.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["// ============================================================================\n// FlowX — Types & Error Hierarchy\n// ============================================================================\n\n/** Generic async function signature */\nexport type AsyncFn<TArgs extends any[] = any[], TReturn = any> = (\n ...args: TArgs\n) => Promise<TReturn>;\n\n/** Backoff strategy for retry/poll operations */\nexport type BackoffStrategy =\n | 'fixed'\n | 'linear'\n | 'exponential'\n | ((attempt: number, delay: number) => number);\n\n// ── Error Classes ───────────────────────────────────────────────────────────\n\n/** Base error class for all FlowX errors */\nexport class FlowXError extends Error {\n public readonly code: string;\n constructor(message: string, code: string) {\n super(message);\n this.name = 'FlowXError';\n this.code = code;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** Thrown when a promise exceeds its timeout */\nexport class TimeoutError extends FlowXError {\n constructor(message = 'Operation timed out') {\n super(message, 'ERR_TIMEOUT');\n this.name = 'TimeoutError';\n }\n}\n\n/** Thrown when a circuit breaker is open */\nexport class CircuitBreakerError extends FlowXError {\n constructor(message = 'Circuit breaker is open') {\n super(message, 'ERR_CIRCUIT_OPEN');\n this.name = 'CircuitBreakerError';\n }\n}\n\n/** Thrown when a bulkhead rejects due to capacity */\nexport class BulkheadError extends FlowXError {\n constructor(message = 'Bulkhead capacity exceeded') {\n super(message, 'ERR_BULKHEAD_FULL');\n this.name = 'BulkheadError';\n }\n}\n\n/** Thrown when an operation is aborted */\nexport class AbortError extends FlowXError {\n constructor(message = 'Operation aborted') {\n super(message, 'ERR_ABORTED');\n this.name = 'AbortError';\n }\n}\n\n/** Thrown when rate limit is exceeded */\nexport class RateLimitError extends FlowXError {\n constructor(message = 'Rate limit exceeded') {\n super(message, 'ERR_RATE_LIMIT');\n this.name = 'RateLimitError';\n }\n}\n\n// ── Utility Helpers ─────────────────────────────────────────────────────────\n\n/** Sleep for the specified duration, respecting AbortSignal */\nexport function sleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n if (signal?.aborted) {\n reject(new AbortError());\n return;\n }\n\n let onAbort: (() => void) | undefined;\n\n const timer = setTimeout(() => {\n if (signal && onAbort) {\n signal.removeEventListener('abort', onAbort);\n }\n resolve();\n }, ms);\n\n if (signal) {\n onAbort = () => {\n clearTimeout(timer);\n reject(new AbortError());\n };\n signal.addEventListener('abort', onAbort, { once: true });\n }\n });\n}\n\n/** Calculate delay based on backoff strategy */\nexport function calculateDelay(\n attempt: number,\n baseDelay: number,\n strategy: BackoffStrategy,\n jitter: boolean | number = false,\n): number {\n let delay: number;\n\n if (typeof strategy === 'function') {\n delay = strategy(attempt, baseDelay);\n } else {\n switch (strategy) {\n case 'fixed':\n delay = baseDelay;\n break;\n case 'linear':\n delay = baseDelay * attempt;\n break;\n case 'exponential':\n delay = baseDelay * Math.pow(2, attempt - 1);\n break;\n }\n }\n\n if (jitter) {\n const factor = typeof jitter === 'number' ? jitter : 1;\n delay = delay * (1 - factor * 0.5 + Math.random() * factor);\n }\n\n return Math.max(0, Math.floor(delay));\n}\n","// ============================================================================\n// FlowX — Retry with Advanced Backoff Strategies\n// ============================================================================\nimport { AbortError, BackoffStrategy, calculateDelay, sleep } from './types';\n\nexport interface RetryOptions {\n /** Maximum number of retry attempts (default: 3) */\n retries?: number;\n /** Base delay in ms between retries (default: 1000) */\n delay?: number;\n /** Backoff strategy (default: 'exponential') */\n backoff?: BackoffStrategy;\n /** Add randomized jitter to delays (default: false) */\n jitter?: boolean | number;\n /** Maximum delay cap in ms (default: 30000) */\n maxDelay?: number;\n /** Custom predicate to decide if retry should happen */\n shouldRetry?: (error: Error, attempt: number) => boolean | Promise<boolean>;\n /** Callback fired before each retry */\n onRetry?: (error: Error, attempt: number) => void | Promise<void>;\n /** AbortSignal for cancellation */\n signal?: AbortSignal;\n}\n\n/**\n * Execute an async function with automatic retry and configurable backoff.\n *\n * @example\n * ```ts\n * const data = await retry(() => fetch('/api/data'), {\n * retries: 5,\n * backoff: 'exponential',\n * jitter: true,\n * });\n * ```\n */\nexport async function retry<T>(fn: () => T | Promise<T>, options?: RetryOptions): Promise<T> {\n const {\n retries = 3,\n delay = 1000,\n backoff = 'exponential',\n jitter = false,\n maxDelay = 30000,\n shouldRetry,\n onRetry,\n signal,\n } = options ?? {};\n\n if (retries < 0) {\n throw new RangeError('retries must be >= 0');\n }\n\n let lastError: Error | undefined;\n\n for (let attempt = 0; attempt <= retries; attempt++) {\n if (signal?.aborted) {\n throw new AbortError('Retry aborted');\n }\n\n try {\n const result = await fn();\n return result;\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n\n if (attempt === retries) break;\n\n if (shouldRetry) {\n const shouldContinue = await shouldRetry(lastError, attempt + 1);\n if (!shouldContinue) break;\n }\n\n if (onRetry) {\n await onRetry(lastError, attempt + 1);\n }\n\n let waitTime = calculateDelay(attempt + 1, delay, backoff, jitter);\n waitTime = Math.min(waitTime, maxDelay);\n\n await sleep(waitTime, signal);\n }\n }\n\n throw lastError!;\n}\n\n/**\n * Wrap a function to automatically retry on failure.\n *\n * @example\n * ```ts\n * const safeFetch = retryable(fetch, { retries: 3 });\n * const data = await safeFetch('/api/data');\n * ```\n */\nexport function retryable<TArgs extends any[], TReturn>(\n fn: (...args: TArgs) => Promise<TReturn>,\n options?: RetryOptions,\n): (...args: TArgs) => Promise<TReturn> {\n return (...args: TArgs) => retry(() => fn(...args), options);\n}\n","// ============================================================================\n// FlowX — Circuit Breaker Pattern\n// ============================================================================\nimport { CircuitBreakerError } from './types';\n\nexport type CircuitState = 'closed' | 'open' | 'half-open';\n\nexport interface CircuitBreakerOptions {\n /** Number of failures before opening the circuit (default: 5) */\n failureThreshold?: number;\n /** Time in ms before attempting half-open (default: 30000) */\n resetTimeout?: number;\n /** Max concurrent calls in half-open state (default: 1) */\n halfOpenLimit?: number;\n /** Custom predicate to decide if an error should count as a failure */\n shouldTrip?: (error: Error) => boolean;\n /** Callback fired on state changes */\n onStateChange?: (from: CircuitState, to: CircuitState) => void;\n /** Number of successes in half-open to close the circuit (default: 1) */\n successThreshold?: number;\n}\n\nexport interface CircuitBreaker<TArgs extends any[], TReturn> {\n /** Execute the protected function */\n fire: (...args: TArgs) => Promise<TReturn>;\n /** Get the current circuit state */\n readonly state: CircuitState;\n /** Get the current failure count */\n readonly failureCount: number;\n /** Get the current success count (in half-open) */\n readonly successCount: number;\n /** Manually reset the circuit to closed */\n reset: () => void;\n /** Manually open the circuit */\n open: () => void;\n}\n\n/**\n * Create a circuit breaker to protect against cascading failures.\n *\n * @example\n * ```ts\n * const breaker = createCircuitBreaker(callExternalApi, {\n * failureThreshold: 5,\n * resetTimeout: 30000,\n * });\n * const data = await breaker.fire('arg1');\n * ```\n */\nexport function createCircuitBreaker<TArgs extends any[], TReturn>(\n fn: (...args: TArgs) => Promise<TReturn>,\n options?: CircuitBreakerOptions,\n): CircuitBreaker<TArgs, TReturn> {\n const {\n failureThreshold = 5,\n resetTimeout = 30000,\n halfOpenLimit = 1,\n shouldTrip,\n onStateChange,\n successThreshold = 1,\n } = options ?? {};\n\n let state: CircuitState = 'closed';\n let failureCount = 0;\n let successCount = 0;\n let halfOpenActive = 0;\n let resetTimer: ReturnType<typeof setTimeout> | null = null;\n\n function transition(to: CircuitState): void {\n if (state === to) return;\n const from = state;\n state = to;\n onStateChange?.(from, to);\n }\n\n function scheduleReset(): void {\n /* istanbul ignore next -- defensive guard; timer always fires before reschedule in normal flow */\n if (resetTimer) clearTimeout(resetTimer);\n resetTimer = setTimeout(() => {\n resetTimer = null;\n transition('half-open');\n halfOpenActive = 0;\n successCount = 0;\n }, resetTimeout);\n }\n\n function reset(): void {\n if (resetTimer) {\n clearTimeout(resetTimer);\n resetTimer = null;\n }\n failureCount = 0;\n successCount = 0;\n halfOpenActive = 0;\n transition('closed');\n }\n\n function manualOpen(): void {\n if (resetTimer) {\n clearTimeout(resetTimer);\n resetTimer = null;\n }\n failureCount = 0;\n successCount = 0;\n halfOpenActive = 0;\n transition('open');\n scheduleReset();\n }\n\n async function fire(...args: TArgs): Promise<TReturn> {\n if (state === 'open') {\n throw new CircuitBreakerError();\n }\n\n if (state === 'half-open' && halfOpenActive >= halfOpenLimit) {\n throw new CircuitBreakerError('Circuit breaker is half-open — limit reached');\n }\n\n if (state === 'half-open') {\n halfOpenActive++;\n }\n\n try {\n const result = await fn(...args);\n\n if (state === 'half-open') {\n successCount++;\n halfOpenActive--;\n if (successCount >= successThreshold) {\n reset();\n }\n } else {\n // In closed state, reset failure count on success\n failureCount = 0;\n }\n\n return result;\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n\n if (shouldTrip && !shouldTrip(err)) {\n if (state === 'half-open') {\n halfOpenActive--;\n }\n throw err;\n }\n\n if (state === 'half-open') {\n halfOpenActive--;\n transition('open');\n scheduleReset();\n } else {\n failureCount++;\n if (failureCount >= failureThreshold) {\n transition('open');\n scheduleReset();\n }\n }\n\n throw err;\n }\n }\n\n return {\n fire,\n get state() {\n return state;\n },\n get failureCount() {\n return failureCount;\n },\n get successCount() {\n return successCount;\n },\n reset,\n open: manualOpen,\n };\n}\n","// ============================================================================\n// FlowX — Bulkhead Isolation Pattern\n// ============================================================================\nimport { BulkheadError } from './types';\n\nexport interface BulkheadOptions {\n /** Maximum concurrent executions (default: 10) */\n concurrency?: number;\n /** Maximum queue size for waiting tasks (default: 10) */\n queueSize?: number;\n /** Timeout in ms for queued tasks (0 = no timeout) */\n queueTimeout?: number;\n}\n\nexport interface Bulkhead {\n /** Execute a function within the bulkhead */\n execute: <T>(fn: () => Promise<T>) => Promise<T>;\n /** Current number of active executions */\n readonly active: number;\n /** Current number of queued tasks */\n readonly queued: number;\n /** Available capacity */\n readonly available: number;\n}\n\ninterface QueueItem<T = any> {\n fn: () => Promise<T>;\n resolve: (value: T) => void;\n reject: (error: Error) => void;\n timer?: ReturnType<typeof setTimeout>;\n}\n\n/**\n * Create a bulkhead to isolate concurrent operations and prevent resource exhaustion.\n *\n * @example\n * ```ts\n * const bulkhead = createBulkhead({ concurrency: 5, queueSize: 10 });\n * const data = await bulkhead.execute(() => fetch('/api'));\n * ```\n */\nexport function createBulkhead(options?: BulkheadOptions): Bulkhead {\n const { concurrency = 10, queueSize = 10, queueTimeout = 0 } = options ?? {};\n\n if (concurrency < 1) throw new RangeError('concurrency must be >= 1');\n if (queueSize < 0) throw new RangeError('queueSize must be >= 0');\n\n let active = 0;\n const queue: QueueItem[] = [];\n\n function tryDequeue(): void {\n while (queue.length > 0 && active < concurrency) {\n const item = queue.shift()!;\n if (item.timer) clearTimeout(item.timer);\n run(item);\n }\n }\n\n async function run<T>(item: QueueItem<T>): Promise<void> {\n active++;\n try {\n const value = await item.fn();\n active--;\n tryDequeue();\n item.resolve(value);\n } catch (error) {\n active--;\n tryDequeue();\n item.reject(error instanceof Error ? error : new Error(String(error)));\n }\n }\n\n function execute<T>(fn: () => Promise<T>): Promise<T> {\n if (active < concurrency) {\n return new Promise<T>((resolve, reject) => {\n run({ fn, resolve, reject });\n });\n }\n\n if (queue.length >= queueSize) {\n return Promise.reject(new BulkheadError());\n }\n\n return new Promise<T>((resolve, reject) => {\n const item: QueueItem<T> = { fn, resolve, reject };\n\n if (queueTimeout > 0) {\n item.timer = setTimeout(() => {\n const idx = queue.indexOf(item as QueueItem);\n if (idx !== -1) {\n queue.splice(idx, 1);\n reject(new BulkheadError('Bulkhead queue timeout exceeded'));\n }\n }, queueTimeout);\n }\n\n queue.push(item as QueueItem);\n });\n }\n\n return {\n execute,\n get active() {\n return active;\n },\n get queued() {\n return queue.length;\n },\n get available() {\n return Math.max(0, concurrency - active);\n },\n };\n}\n","// ============================================================================\n// FlowX — Fallback Chain\n// ============================================================================\n\nexport interface FallbackOptions {\n /** Predicate to determine if the error warrants a fallback */\n shouldFallback?: (error: Error) => boolean;\n /** Callback fired when the primary function fails and fallback is used */\n onFallback?: (error: Error, fallbackIndex: number) => void;\n}\n\n/**\n * Execute a function with a fallback value or function if it fails.\n *\n * @example\n * ```ts\n * const data = await withFallback(\n * () => fetch('/primary-api'),\n * 'default-value',\n * );\n * ```\n */\nexport async function withFallback<T>(\n fn: () => T | Promise<T>,\n fallback: T | (() => T | Promise<T>),\n options?: FallbackOptions,\n): Promise<T> {\n try {\n return await fn();\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n\n if (options?.shouldFallback && !options.shouldFallback(err)) {\n throw err;\n }\n\n options?.onFallback?.(err, 0);\n\n if (typeof fallback === 'function') {\n return await (fallback as () => T | Promise<T>)();\n }\n return fallback;\n }\n}\n\n/**\n * Execute the first successful function from a chain of fallbacks.\n *\n * @example\n * ```ts\n * const data = await fallbackChain([\n * () => fetch('/primary'),\n * () => fetch('/secondary'),\n * () => fetch('/tertiary'),\n * ]);\n * ```\n */\nexport async function fallbackChain<T>(\n fns: Array<() => T | Promise<T>>,\n options?: FallbackOptions,\n): Promise<T> {\n if (fns.length === 0) {\n throw new Error('fallbackChain requires at least one function');\n }\n\n let lastError: Error | undefined;\n\n for (let i = 0; i < fns.length; i++) {\n try {\n return await fns[i]();\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n\n if (options?.shouldFallback && !options.shouldFallback(lastError)) {\n throw lastError;\n }\n\n if (i < fns.length - 1) {\n options?.onFallback?.(lastError, i + 1);\n }\n }\n }\n\n throw lastError!;\n}\n","// ============================================================================\n// FlowX — Hedged Requests\n// ============================================================================\n\nexport interface HedgeOptions {\n /** Delay in ms before launching the hedge request (default: 500) */\n delay?: number;\n /** Maximum number of parallel hedged calls (default: 1) */\n maxHedges?: number;\n}\n\n/**\n * Execute a function with hedged requests — if the primary doesn't respond\n * quickly enough, fire parallel redundant calls and return whichever resolves first.\n *\n * @example\n * ```ts\n * const data = await hedge(() => fetch('/api'), { delay: 200 });\n * ```\n */\nexport function hedge<T>(fn: () => Promise<T>, options?: HedgeOptions): Promise<T> {\n const { delay = 500, maxHedges = 1 } = options ?? {};\n\n if (delay < 0) throw new RangeError('delay must be >= 0');\n if (maxHedges < 1) throw new RangeError('maxHedges must be >= 1');\n\n return new Promise<T>((resolve, reject) => {\n let settled = false;\n let completedCount = 0;\n const totalAttempts = 1 + maxHedges;\n const errors: Error[] = [];\n const timers: ReturnType<typeof setTimeout>[] = [];\n\n function onResult(value: T): void {\n if (settled) return;\n settled = true;\n // Clear pending hedge timers\n for (const t of timers) clearTimeout(t);\n resolve(value);\n }\n\n function onError(error: Error): void {\n errors.push(error);\n completedCount++;\n if (completedCount >= totalAttempts && !settled) {\n settled = true;\n reject(errors[0]);\n }\n }\n\n // Launch primary request immediately\n fn().then(onResult, (err) => onError(err instanceof Error ? err : new Error(String(err))));\n\n // Launch hedged requests after delay\n for (let i = 0; i < maxHedges; i++) {\n const timer = setTimeout(\n () => {\n /* istanbul ignore if -- timer is always cleared by onResult before firing */\n if (settled) return;\n fn().then(onResult, (err) =>\n onError(err instanceof Error ? err : new Error(String(err))),\n );\n },\n delay * (i + 1),\n );\n timers.push(timer);\n }\n });\n}\n","// ============================================================================\n// FlowX — Counting Semaphore\n// ============================================================================\n\nexport interface Semaphore {\n /** Acquire a permit. Returns a release function. */\n acquire: () => Promise<() => void>;\n /** Execute a function exclusively within the semaphore */\n runExclusive: <T>(fn: () => T | Promise<T>) => Promise<T>;\n /** Number of available permits */\n readonly available: number;\n /** Number of tasks waiting for a permit */\n readonly waiting: number;\n}\n\ninterface Waiter {\n resolve: (release: () => void) => void;\n}\n\n/**\n * Create a counting semaphore for concurrency control.\n *\n * @example\n * ```ts\n * const sem = createSemaphore(3);\n * const release = await sem.acquire();\n * try {\n * await doWork();\n * } finally {\n * release();\n * }\n * ```\n */\nexport function createSemaphore(permits: number): Semaphore {\n if (permits < 1) throw new RangeError('permits must be >= 1');\n\n let available = permits;\n const waiters: Waiter[] = [];\n\n function release(): void {\n available++;\n if (waiters.length > 0) {\n available--;\n const next = waiters.shift()!;\n next.resolve(release);\n }\n }\n\n function acquire(): Promise<() => void> {\n if (available > 0) {\n available--;\n return Promise.resolve(release);\n }\n\n return new Promise<() => void>((resolve) => {\n waiters.push({ resolve });\n });\n }\n\n async function runExclusive<T>(fn: () => T | Promise<T>): Promise<T> {\n const releaseFn = await acquire();\n try {\n return await fn();\n } finally {\n releaseFn();\n }\n }\n\n return {\n acquire,\n runExclusive,\n get available() {\n return available;\n },\n get waiting() {\n return waiters.length;\n },\n };\n}\n","// ============================================================================\n// FlowX — Mutual Exclusion Lock\n// ============================================================================\n\nexport interface Mutex {\n /** Acquire the lock. Returns a release function. */\n lock: () => Promise<() => void>;\n /** Execute a function exclusively under the mutex */\n runExclusive: <T>(fn: () => T | Promise<T>) => Promise<T>;\n /** Whether the mutex is currently locked */\n readonly isLocked: boolean;\n /** Number of tasks waiting for the lock */\n readonly waiting: number;\n}\n\n/**\n * Create a mutual exclusion lock for serializing async operations.\n *\n * @example\n * ```ts\n * const mutex = createMutex();\n * await mutex.runExclusive(async () => {\n * await updateSharedResource();\n * });\n * ```\n */\nexport function createMutex(): Mutex {\n let locked = false;\n const waitQueue: Array<(release: () => void) => void> = [];\n\n function release(): void {\n if (waitQueue.length > 0) {\n const next = waitQueue.shift()!;\n // Stay locked, transfer to next waiter\n next(release);\n } else {\n locked = false;\n }\n }\n\n function lock(): Promise<() => void> {\n if (!locked) {\n locked = true;\n return Promise.resolve(release);\n }\n\n return new Promise<() => void>((resolve) => {\n waitQueue.push(resolve);\n });\n }\n\n async function runExclusive<T>(fn: () => T | Promise<T>): Promise<T> {\n const releaseFn = await lock();\n try {\n return await fn();\n } finally {\n releaseFn();\n }\n }\n\n return {\n lock,\n runExclusive,\n get isLocked() {\n return locked;\n },\n get waiting() {\n return waitQueue.length;\n },\n };\n}\n","// ============================================================================\n// FlowX — Priority Async Queue\n// ============================================================================\n\nexport interface QueueOptions {\n /** Maximum concurrent tasks (default: 1) */\n concurrency?: number;\n /** Start processing immediately (default: true) */\n autoStart?: boolean;\n /** Per-task timeout in ms (0 = no timeout) */\n timeout?: number;\n}\n\nexport interface QueueAddOptions {\n /** Task priority — lower number = higher priority (default: 0) */\n priority?: number;\n}\n\nexport interface AsyncQueue {\n /** Add a task to the queue */\n add: <T>(fn: () => Promise<T>, options?: QueueAddOptions) => Promise<T>;\n /** Add multiple tasks and return all results */\n addAll: <T>(fns: Array<() => Promise<T>>, options?: QueueAddOptions) => Promise<T[]>;\n /** Pause processing */\n pause: () => void;\n /** Resume processing */\n resume: () => void;\n /** Clear all pending tasks */\n clear: () => void;\n /** Wait until the queue is empty */\n onEmpty: () => Promise<void>;\n /** Wait until the queue is idle (empty + no active tasks) */\n onIdle: () => Promise<void>;\n /** Number of pending tasks */\n readonly size: number;\n /** Number of active tasks */\n readonly pending: number;\n /** Whether the queue is paused */\n readonly isPaused: boolean;\n}\n\ninterface QueueEntry {\n fn: () => Promise<any>;\n priority: number;\n resolve: (value: any) => void;\n reject: (error: Error) => void;\n}\n\n/**\n * Create a priority async queue with concurrency control.\n *\n * @example\n * ```ts\n * const queue = createQueue({ concurrency: 3 });\n * const result = await queue.add(() => fetch('/api'), { priority: 1 });\n * await queue.onIdle();\n * ```\n */\nexport function createQueue(options?: QueueOptions): AsyncQueue {\n const { concurrency = 1, autoStart = true, timeout = 0 } = options ?? {};\n\n if (concurrency < 1) throw new RangeError('concurrency must be >= 1');\n\n let paused = !autoStart;\n let active = 0;\n const entries: QueueEntry[] = [];\n const emptyCallbacks: Array<() => void> = [];\n const idleCallbacks: Array<() => void> = [];\n\n function notifyIdle(): void {\n if (active === 0 && entries.length === 0) {\n for (const cb of idleCallbacks.splice(0)) cb();\n }\n }\n\n function notifyEmpty(): void {\n if (entries.length === 0) {\n for (const cb of emptyCallbacks.splice(0)) cb();\n }\n }\n\n function tryRun(): void {\n if (paused) return;\n\n while (active < concurrency && entries.length > 0) {\n const entry = entries.shift()!;\n active++;\n\n let timer: ReturnType<typeof setTimeout> | undefined;\n\n const run = async () => {\n try {\n let result: any;\n if (timeout > 0) {\n result = await Promise.race([\n entry.fn(),\n new Promise<never>((_, rej) => {\n timer = setTimeout(() => rej(new Error('Queue task timeout')), timeout);\n }),\n ]);\n } else {\n result = await entry.fn();\n }\n if (timer) clearTimeout(timer);\n entry.resolve(result);\n } catch (error) {\n if (timer) clearTimeout(timer);\n entry.reject(error instanceof Error ? error : new Error(String(error)));\n } finally {\n active--;\n notifyEmpty();\n tryRun();\n notifyIdle();\n }\n };\n\n run();\n }\n\n notifyEmpty();\n notifyIdle();\n }\n\n function add<T>(fn: () => Promise<T>, addOptions?: QueueAddOptions): Promise<T> {\n const priority = addOptions?.priority ?? 0;\n\n return new Promise<T>((resolve, reject) => {\n const entry: QueueEntry = { fn, priority, resolve, reject };\n\n // Insert sorted by priority (lower = higher priority)\n let inserted = false;\n for (let i = 0; i < entries.length; i++) {\n if (priority < entries[i].priority) {\n entries.splice(i, 0, entry);\n inserted = true;\n break;\n }\n }\n if (!inserted) {\n entries.push(entry);\n }\n\n tryRun();\n });\n }\n\n function addAll<T>(fns: Array<() => Promise<T>>, addOptions?: QueueAddOptions): Promise<T[]> {\n return Promise.all(fns.map((fn) => add(fn, addOptions)));\n }\n\n function pause(): void {\n paused = true;\n }\n\n function resume(): void {\n paused = false;\n tryRun();\n }\n\n function clear(): void {\n for (const entry of entries.splice(0)) {\n entry.reject(new Error('Queue cleared'));\n }\n }\n\n function onEmpty(): Promise<void> {\n if (entries.length === 0) return Promise.resolve();\n return new Promise<void>((resolve) => emptyCallbacks.push(resolve));\n }\n\n function onIdle(): Promise<void> {\n if (active === 0 && entries.length === 0) return Promise.resolve();\n return new Promise<void>((resolve) => idleCallbacks.push(resolve));\n }\n\n return {\n add,\n addAll,\n pause,\n resume,\n clear,\n onEmpty,\n onIdle,\n get size() {\n return entries.length;\n },\n get pending() {\n return active;\n },\n get isPaused() {\n return paused;\n },\n };\n}\n","// ============================================================================\n// FlowX — Token Bucket Rate Limiter\n// ============================================================================\nimport { RateLimitError } from './types';\n\nexport interface RateLimitOptions {\n /** Maximum number of executions per interval */\n limit: number;\n /** Time window in ms */\n interval: number;\n /** Whether to reject or queue when limit is exceeded (default: 'queue') */\n strategy?: 'queue' | 'reject';\n}\n\nexport interface RateLimiter {\n /** Execute a function within the rate limit */\n execute: <T>(fn: () => T | Promise<T>) => Promise<T>;\n /** Reset the rate limiter state */\n reset: () => void;\n /** Number of remaining tokens in current window */\n readonly remaining: number;\n}\n\n/**\n * Create a rate limiter using the token bucket algorithm.\n *\n * @example\n * ```ts\n * const limiter = createRateLimiter({ limit: 10, interval: 1000 });\n * await limiter.execute(() => fetch('/api'));\n * ```\n */\nexport function createRateLimiter(options: RateLimitOptions): RateLimiter {\n const { limit, interval, strategy = 'queue' } = options;\n\n if (limit < 1) throw new RangeError('limit must be >= 1');\n if (interval < 1) throw new RangeError('interval must be >= 1');\n\n let tokens = limit;\n let lastRefill = Date.now();\n const queue: Array<{ resolve: () => void }> = [];\n let drainTimer: ReturnType<typeof setTimeout> | null = null;\n\n function refill(): void {\n const now = Date.now();\n const elapsed = now - lastRefill;\n const refillCount = Math.floor(elapsed / interval) * limit;\n\n if (refillCount > 0) {\n tokens = Math.min(limit, tokens + refillCount);\n lastRefill = now;\n }\n }\n\n function drainQueue(): void {\n refill();\n while (queue.length > 0 && tokens > 0) {\n tokens--;\n const item = queue.shift()!;\n item.resolve();\n }\n\n if (queue.length > 0) {\n scheduleDrain();\n } else {\n drainTimer = null;\n }\n }\n\n function scheduleDrain(): void {\n if (drainTimer) return;\n const timeToNextToken = interval / limit;\n drainTimer = setTimeout(() => {\n drainTimer = null;\n drainQueue();\n }, timeToNextToken);\n }\n\n async function execute<T>(fn: () => T | Promise<T>): Promise<T> {\n refill();\n\n if (tokens > 0) {\n tokens--;\n return await fn();\n }\n\n if (strategy === 'reject') {\n throw new RateLimitError();\n }\n\n // Queue strategy — wait for a token\n await new Promise<void>((resolve) => {\n queue.push({ resolve });\n scheduleDrain();\n });\n\n return await fn();\n }\n\n function reset(): void {\n tokens = limit;\n lastRefill = Date.now();\n if (drainTimer) {\n clearTimeout(drainTimer);\n drainTimer = null;\n }\n drainQueue();\n }\n\n return {\n execute,\n reset,\n get remaining() {\n refill();\n return tokens;\n },\n };\n}\n","// ============================================================================\n// FlowX — Promise Timeout with Cleanup\n// ============================================================================\nimport { AbortError, TimeoutError } from './types';\n\nexport interface TimeoutOptions<T = unknown> {\n /** Fallback value or factory when timeout occurs */\n fallback?: T | (() => T | Promise<T>);\n /** AbortSignal for external cancellation */\n signal?: AbortSignal;\n /** Custom error message */\n message?: string;\n}\n\n/**\n * Wrap an async operation with a timeout.\n *\n * @example\n * ```ts\n * const result = await withTimeout(() => fetch('/slow-api'), 5000);\n * ```\n */\nexport async function withTimeout<T>(\n fn: () => T | Promise<T>,\n ms: number,\n options?: TimeoutOptions<T>,\n): Promise<T> {\n if (ms <= 0) {\n throw new RangeError('Timeout must be > 0');\n }\n\n if (options?.signal?.aborted) {\n throw new AbortError();\n }\n\n const fnResult = fn(); // call synchronously so sync throws propagate\n\n return Promise.race([\n Promise.resolve(fnResult),\n new Promise<T>((_, reject) => {\n const timer = setTimeout(() => {\n if (options?.fallback !== undefined) {\n const fb = options.fallback;\n if (typeof fb === 'function') {\n try {\n const result = (fb as () => T | Promise<T>)();\n Promise.resolve(result).then(\n (v) => reject({ __resolved: true, value: v } as any),\n reject,\n );\n } catch (err) {\n reject(err);\n }\n } else {\n reject({ __resolved: true, value: fb } as any);\n }\n } else {\n reject(new TimeoutError(options?.message));\n }\n }, ms);\n\n // If signal aborts, reject the race\n if (options?.signal) {\n const onAbort = () => {\n clearTimeout(timer);\n reject(new AbortError());\n };\n options.signal.addEventListener('abort', onAbort, { once: true });\n }\n\n // Clean up timer when fn resolves\n Promise.resolve(fnResult).then(\n () => clearTimeout(timer),\n () => clearTimeout(timer),\n );\n }),\n ]).catch((err) => {\n // Handle the fallback resolution hack\n if (err && typeof err === 'object' && '__resolved' in err) {\n return err.value as T;\n }\n throw err;\n });\n}\n","// ============================================================================\n// FlowX — Async-Aware Debounce\n// ============================================================================\n\nexport interface DebounceOptions {\n /** Invoke on the leading edge (default: false) */\n leading?: boolean;\n /** Invoke on the trailing edge (default: true) */\n trailing?: boolean;\n /** Maximum wait time before forced invocation in ms */\n maxWait?: number;\n}\n\nexport interface DebouncedFunction<TArgs extends any[], TReturn> {\n /** Call the debounced function */\n (...args: TArgs): Promise<TReturn>;\n /** Cancel any pending invocation */\n cancel: () => void;\n /** Immediately invoke any pending call */\n flush: () => Promise<TReturn | undefined>;\n /** Whether there is a pending invocation */\n readonly pending: boolean;\n}\n\n/**\n * Create a debounced version of an async function.\n *\n * @example\n * ```ts\n * const debouncedSearch = debounce(searchApi, 300);\n * await debouncedSearch('query');\n * ```\n */\nexport function debounce<TArgs extends any[], TReturn>(\n fn: (...args: TArgs) => TReturn | Promise<TReturn>,\n wait: number,\n options?: DebounceOptions,\n): DebouncedFunction<TArgs, TReturn> {\n const { leading = false, trailing = true, maxWait } = options ?? {};\n\n if (wait < 0) throw new RangeError('wait must be >= 0');\n\n let timer: ReturnType<typeof setTimeout> | null = null;\n let maxTimer: ReturnType<typeof setTimeout> | null = null;\n let lastArgs: TArgs | null = null;\n const pendingResolvers: Array<{\n resolve: (value: TReturn) => void;\n reject: (error: Error) => void;\n }> = [];\n let isPending = false;\n\n async function invoke(): Promise<void> {\n const args = lastArgs!;\n const resolvers = pendingResolvers.splice(0);\n lastArgs = null;\n isPending = false;\n\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n if (maxTimer) {\n clearTimeout(maxTimer);\n maxTimer = null;\n }\n\n try {\n const result = await fn(...args);\n for (const r of resolvers) r.resolve(result);\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n for (const r of resolvers) r.reject(err);\n }\n }\n\n function debounced(...args: TArgs): Promise<TReturn> {\n lastArgs = args;\n\n return new Promise<TReturn>((resolve, reject) => {\n pendingResolvers.push({ resolve, reject });\n\n // Leading edge\n if (leading && !isPending) {\n isPending = true;\n invoke();\n return;\n }\n\n isPending = true;\n\n // Reset trailing timer\n if (timer) clearTimeout(timer);\n\n if (trailing) {\n timer = setTimeout(() => {\n timer = null;\n invoke();\n }, wait);\n }\n\n // Set max wait timer\n if (maxWait !== undefined && !maxTimer) {\n maxTimer = setTimeout(() => {\n maxTimer = null;\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n invoke();\n }, maxWait);\n }\n });\n }\n\n debounced.cancel = (): void => {\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n if (maxTimer) {\n clearTimeout(maxTimer);\n maxTimer = null;\n }\n lastArgs = null;\n isPending = false;\n // Reject all pending resolvers\n const resolvers = pendingResolvers.splice(0);\n for (const r of resolvers) {\n r.reject(new Error('Debounced call cancelled'));\n }\n };\n\n debounced.flush = async (): Promise<TReturn | undefined> => {\n if (!isPending) return undefined;\n const promise = new Promise<TReturn>((resolve, reject) => {\n pendingResolvers.push({ resolve, reject });\n });\n await invoke();\n return promise;\n };\n\n Object.defineProperty(debounced, 'pending', {\n get() {\n return isPending;\n },\n });\n\n return debounced as DebouncedFunction<TArgs, TReturn>;\n}\n","// ============================================================================\n// FlowX — Async-Aware Throttle\n// ============================================================================\n\nexport interface ThrottleOptions {\n /** Invoke on the leading edge (default: true) */\n leading?: boolean;\n /** Invoke on the trailing edge (default: true) */\n trailing?: boolean;\n}\n\nexport interface ThrottledFunction<TArgs extends any[], TReturn> {\n (...args: TArgs): Promise<TReturn>;\n /** Cancel any pending trailing invocation */\n cancel: () => void;\n /** Whether there is a pending trailing invocation */\n readonly pending: boolean;\n}\n\n/**\n * Create a throttled version of an async function.\n *\n * @example\n * ```ts\n * const throttledSave = throttle(saveData, 1000);\n * await throttledSave(data);\n * ```\n */\nexport function throttle<TArgs extends any[], TReturn>(\n fn: (...args: TArgs) => TReturn | Promise<TReturn>,\n wait: number,\n options?: ThrottleOptions,\n): ThrottledFunction<TArgs, TReturn> {\n const { leading = true, trailing = true } = options ?? {};\n\n if (wait < 0) throw new RangeError('wait must be >= 0');\n\n let lastCallTime: number | null = null;\n let timer: ReturnType<typeof setTimeout> | null = null;\n let lastArgs: TArgs | null = null;\n let isPending = false;\n const trailingResolvers: Array<{\n resolve: (value: TReturn) => void;\n reject: (error: Error) => void;\n }> = [];\n\n async function invokeTrailing(): Promise<void> {\n const args = lastArgs;\n const resolvers = trailingResolvers.splice(0);\n lastArgs = null;\n isPending = false;\n timer = null;\n\n if (!args) {\n /* istanbul ignore next -- resolvers is always empty here; lastArgs cleared before trailing fires */\n for (const r of resolvers) r.resolve(undefined as TReturn);\n return;\n }\n\n try {\n const result = await fn(...args);\n for (const r of resolvers) r.resolve(result);\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n for (const r of resolvers) r.reject(err);\n }\n }\n\n function throttled(...args: TArgs): Promise<TReturn> {\n const now = Date.now();\n lastArgs = args;\n\n const timeSinceLastCall = lastCallTime === null ? wait : now - lastCallTime;\n const shouldCallLeading = leading && timeSinceLastCall >= wait;\n\n if (shouldCallLeading) {\n lastCallTime = now;\n lastArgs = null;\n\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n\n // Resolve any pending trailing resolvers with this call's result\n const prevResolvers = trailingResolvers.splice(0);\n\n const resultPromise = (async () => {\n try {\n const result = await fn(...args);\n for (const r of prevResolvers) r.resolve(result);\n return result;\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n /* istanbul ignore next -- prevResolvers is always empty on leading calls in normal flow */\n for (const r of prevResolvers) r.reject(err);\n throw err;\n }\n })();\n\n if (trailing) {\n timer = setTimeout(() => {\n lastCallTime = Date.now();\n invokeTrailing();\n }, wait);\n }\n\n return resultPromise;\n }\n\n // Schedule trailing call\n isPending = true;\n\n return new Promise<TReturn>((resolve, reject) => {\n trailingResolvers.push({ resolve, reject });\n\n if (!timer && trailing) {\n const remaining = wait - timeSinceLastCall;\n timer = setTimeout(() => {\n lastCallTime = Date.now();\n invokeTrailing();\n }, remaining);\n }\n });\n }\n\n throttled.cancel = (): void => {\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n lastArgs = null;\n lastCallTime = null;\n isPending = false;\n const resolvers = trailingResolvers.splice(0);\n for (const r of resolvers) {\n r.reject(new Error('Throttled call cancelled'));\n }\n };\n\n Object.defineProperty(throttled, 'pending', {\n get() {\n return isPending;\n },\n });\n\n return throttled as ThrottledFunction<TArgs, TReturn>;\n}\n","// ============================================================================\n// FlowX — Batch Processing with Concurrency\n// ============================================================================\nimport { AbortError } from './types';\n\nexport interface BatchOptions {\n /** Maximum concurrent batch operations (default: Infinity) */\n concurrency?: number;\n /** Number of items per batch (default: 1) */\n batchSize?: number;\n /** Progress callback */\n onProgress?: (completed: number, total: number) => void;\n /** AbortSignal for cancellation */\n signal?: AbortSignal;\n}\n\nexport interface BatchResult<T> {\n /** All results in order */\n results: T[];\n /** Total items processed */\n total: number;\n /** Number of succeeded items */\n succeeded: number;\n /** Number of failed items */\n failed: number;\n /** Errors indexed by position */\n errors: Map<number, Error>;\n}\n\n/**\n * Process an array of items in batches with concurrency control.\n *\n * @example\n * ```ts\n * const results = await batch(\n * urls,\n * async (url) => fetch(url).then(r => r.json()),\n * { concurrency: 5, batchSize: 10 },\n * );\n * ```\n */\nexport async function batch<TItem, TResult>(\n items: TItem[],\n fn: (item: TItem, index: number) => Promise<TResult>,\n options?: BatchOptions,\n): Promise<BatchResult<TResult>> {\n const { concurrency = Infinity, batchSize = 1, onProgress, signal } = options ?? {};\n\n if (batchSize < 1) throw new RangeError('batchSize must be >= 1');\n if (concurrency < 1) throw new RangeError('concurrency must be >= 1');\n\n const results: TResult[] = new Array(items.length);\n const errors = new Map<number, Error>();\n let completed = 0;\n let succeeded = 0;\n let failed = 0;\n\n // Split items into batches\n const batches: Array<{ items: TItem[]; startIndex: number }> = [];\n for (let i = 0; i < items.length; i += batchSize) {\n batches.push({\n items: items.slice(i, i + batchSize),\n startIndex: i,\n });\n }\n\n // Process batches with concurrency control\n let batchIndex = 0;\n\n async function processBatch(): Promise<void> {\n while (batchIndex < batches.length) {\n if (signal?.aborted) throw new AbortError();\n\n const currentBatch = batches[batchIndex++];\n\n for (let i = 0; i < currentBatch.items.length; i++) {\n if (signal?.aborted) throw new AbortError();\n\n const globalIndex = currentBatch.startIndex + i;\n try {\n results[globalIndex] = await fn(currentBatch.items[i], globalIndex);\n succeeded++;\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n errors.set(globalIndex, err);\n results[globalIndex] = undefined as TResult;\n failed++;\n }\n completed++;\n onProgress?.(completed, items.length);\n }\n }\n }\n\n const workers: Promise<void>[] = [];\n const workerCount = Math.min(concurrency, batches.length);\n\n for (let i = 0; i < workerCount; i++) {\n workers.push(processBatch());\n }\n\n await Promise.all(workers);\n\n return {\n results,\n total: items.length,\n succeeded,\n failed,\n errors,\n };\n}\n","// ============================================================================\n// FlowX — Async Pipeline Composition\n// ============================================================================\n\n/** A step in the pipeline */\nexport type PipelineStep<TIn, TOut> = (input: TIn) => TOut | Promise<TOut>;\n\n/**\n * Compose multiple async functions into a single pipeline.\n *\n * @example\n * ```ts\n * const process = pipeline(\n * (x: number) => x * 2,\n * (x: number) => x + 1,\n * (x: number) => String(x),\n * );\n * const result = await process(5); // \"11\"\n * ```\n */\nexport function pipeline<A, B>(s1: PipelineStep<A, B>): (input: A) => Promise<B>;\nexport function pipeline<A, B, C>(\n s1: PipelineStep<A, B>,\n s2: PipelineStep<B, C>,\n): (input: A) => Promise<C>;\nexport function pipeline<A, B, C, D>(\n s1: PipelineStep<A, B>,\n s2: PipelineStep<B, C>,\n s3: PipelineStep<C, D>,\n): (input: A) => Promise<D>;\nexport function pipeline<A, B, C, D, E>(\n s1: PipelineStep<A, B>,\n s2: PipelineStep<B, C>,\n s3: PipelineStep<C, D>,\n s4: PipelineStep<D, E>,\n): (input: A) => Promise<E>;\nexport function pipeline<A, B, C, D, E, F>(\n s1: PipelineStep<A, B>,\n s2: PipelineStep<B, C>,\n s3: PipelineStep<C, D>,\n s4: PipelineStep<D, E>,\n s5: PipelineStep<E, F>,\n): (input: A) => Promise<F>;\nexport function pipeline(...steps: Array<PipelineStep<any, any>>): (input: any) => Promise<any>;\nexport function pipeline(...steps: Array<PipelineStep<any, any>>): (input: any) => Promise<any> {\n if (steps.length === 0) {\n throw new Error('pipeline requires at least one step');\n }\n\n return async (input: any) => {\n let current = input;\n for (const step of steps) {\n current = await step(current);\n }\n return current;\n };\n}\n\n/**\n * Execute a value through a series of async transformation steps.\n *\n * @example\n * ```ts\n * const result = await pipe(\n * 5,\n * (x) => x * 2,\n * (x) => x + 1,\n * (x) => String(x),\n * ); // \"11\"\n * ```\n */\nexport async function pipe<A, B>(input: A, s1: PipelineStep<A, B>): Promise<B>;\nexport async function pipe<A, B, C>(\n input: A,\n s1: PipelineStep<A, B>,\n s2: PipelineStep<B, C>,\n): Promise<C>;\nexport async function pipe<A, B, C, D>(\n input: A,\n s1: PipelineStep<A, B>,\n s2: PipelineStep<B, C>,\n s3: PipelineStep<C, D>,\n): Promise<D>;\nexport async function pipe<A, B, C, D, E>(\n input: A,\n s1: PipelineStep<A, B>,\n s2: PipelineStep<B, C>,\n s3: PipelineStep<C, D>,\n s4: PipelineStep<D, E>,\n): Promise<E>;\nexport async function pipe<A, B, C, D, E, F>(\n input: A,\n s1: PipelineStep<A, B>,\n s2: PipelineStep<B, C>,\n s3: PipelineStep<C, D>,\n s4: PipelineStep<D, E>,\n s5: PipelineStep<E, F>,\n): Promise<F>;\nexport async function pipe(input: any, ...steps: Array<PipelineStep<any, any>>): Promise<any>;\nexport async function pipe(input: any, ...steps: Array<PipelineStep<any, any>>): Promise<any> {\n if (steps.length === 0) {\n throw new Error('pipe requires at least one step');\n }\n\n let current = input;\n for (const step of steps) {\n current = await step(current);\n }\n return current;\n}\n","// ============================================================================\n// FlowX — Polling with Backoff\n// ============================================================================\nimport { AbortError, BackoffStrategy, calculateDelay, sleep } from './types';\n\nexport interface PollOptions<T> {\n /** Polling interval in ms (default: 1000) */\n interval?: number;\n /** Condition to stop polling — return true to resolve */\n until?: (result: T) => boolean;\n /** Maximum number of poll attempts (default: Infinity) */\n maxAttempts?: number;\n /** Backoff strategy for interval (default: 'fixed') */\n backoff?: BackoffStrategy;\n /** AbortSignal for cancellation */\n signal?: AbortSignal;\n}\n\nexport interface PollController<T> {\n /** Promise that resolves with the final result */\n result: Promise<T>;\n /** Stop polling early */\n stop: () => void;\n}\n\n/**\n * Poll an async function until a condition is met.\n *\n * @example\n * ```ts\n * const { result } = poll(\n * () => checkJobStatus(jobId),\n * { until: (status) => status === 'done', interval: 2000 },\n * );\n * const finalStatus = await result;\n * ```\n */\nexport function poll<T>(fn: () => T | Promise<T>, options?: PollOptions<T>): PollController<T> {\n const {\n interval = 1000,\n until,\n maxAttempts = Infinity,\n backoff = 'fixed',\n signal,\n } = options ?? {};\n\n if (interval < 0) throw new RangeError('interval must be >= 0');\n\n let stopped = false;\n let rejectFn: ((error: Error) => void) | null = null;\n\n const result = (async (): Promise<T> => {\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n if (stopped || signal?.aborted) {\n throw new AbortError('Polling stopped');\n }\n\n const value = await fn();\n\n if (until ? until(value) : true) {\n return value;\n }\n\n if (attempt < maxAttempts) {\n const waitTime = calculateDelay(attempt, interval, backoff);\n await sleep(waitTime, signal).catch((err) => {\n /* istanbul ignore if -- stop() doesn't abort sleep; this is a defensive guard */\n if (stopped) throw new AbortError('Polling stopped');\n throw err;\n });\n }\n }\n\n throw new Error('Polling exceeded maximum attempts');\n })();\n\n // Capture the reject function for external stopping\n const wrappedResult = new Promise<T>((resolve, reject) => {\n rejectFn = reject;\n result.then(resolve, reject);\n });\n\n function stop(): void {\n stopped = true;\n rejectFn?.(new AbortError('Polling stopped'));\n }\n\n return {\n result: wrappedResult,\n stop,\n };\n}\n","// ============================================================================\n// FlowX — Deferred Promise\n// ============================================================================\n\nexport interface Deferred<T> {\n /** The underlying promise */\n promise: Promise<T>;\n /** Resolve the deferred */\n resolve: (value: T | PromiseLike<T>) => void;\n /** Reject the deferred */\n reject: (reason?: any) => void;\n /** Whether the deferred has been settled */\n readonly isSettled: boolean;\n /** Whether the deferred was resolved */\n readonly isResolved: boolean;\n /** Whether the deferred was rejected */\n readonly isRejected: boolean;\n}\n\n/**\n * Create a deferred promise — a promise whose resolve/reject are externally accessible.\n *\n * @example\n * ```ts\n * const deferred = createDeferred<string>();\n * setTimeout(() => deferred.resolve('done'), 1000);\n * const result = await deferred.promise; // 'done'\n * ```\n */\nexport function createDeferred<T = void>(): Deferred<T> {\n let isSettled = false;\n let isResolved = false;\n let isRejected = false;\n let resolveFn!: (value: T | PromiseLike<T>) => void;\n let rejectFn!: (reason?: any) => void;\n\n const promise = new Promise<T>((resolve, reject) => {\n resolveFn = resolve;\n rejectFn = reject;\n });\n\n return {\n promise,\n resolve: (value: T | PromiseLike<T>) => {\n if (isSettled) return;\n isSettled = true;\n isResolved = true;\n resolveFn(value);\n },\n reject: (reason?: any) => {\n if (isSettled) return;\n isSettled = true;\n isRejected = true;\n rejectFn(reason);\n },\n get isSettled() {\n return isSettled;\n },\n get isResolved() {\n return isResolved;\n },\n get isRejected() {\n return isRejected;\n },\n };\n}\n","// ============================================================================\n// FlowX — Async Memoization with TTL\n// ============================================================================\n\nexport interface MemoOptions<TArgs extends any[]> {\n /** Time-to-live for cached results in ms (0 = forever) */\n ttl?: number;\n /** Maximum cache size (0 = unlimited) */\n maxSize?: number;\n /** Custom cache key generator */\n keyFn?: (...args: TArgs) => string;\n /** Whether to cache rejections (default: false) */\n cacheErrors?: boolean;\n}\n\nexport interface MemoizedFunction<TArgs extends any[], TReturn> {\n (...args: TArgs): Promise<TReturn>;\n /** Clear the entire cache */\n clear: () => void;\n /** Delete a specific cache entry */\n delete: (...args: TArgs) => boolean;\n /** Current cache size */\n readonly size: number;\n}\n\ninterface CacheEntry<T> {\n value: T;\n timestamp: number;\n isError: boolean;\n}\n\n/**\n * Create a memoized version of an async function with TTL and LRU eviction.\n *\n * @example\n * ```ts\n * const cachedFetch = memo(fetchUser, {\n * ttl: 60_000,\n * maxSize: 100,\n * keyFn: (id) => String(id),\n * });\n * const user = await cachedFetch(42);\n * ```\n */\nexport function memo<TArgs extends any[], TReturn>(\n fn: (...args: TArgs) => Promise<TReturn>,\n options?: MemoOptions<TArgs>,\n): MemoizedFunction<TArgs, TReturn> {\n const {\n ttl = 0,\n maxSize = 0,\n keyFn = (...args: TArgs) => JSON.stringify(args),\n cacheErrors = false,\n } = options ?? {};\n\n const cache = new Map<string, CacheEntry<TReturn>>();\n const pending = new Map<string, Promise<TReturn>>();\n\n function isExpired(entry: CacheEntry<TReturn>): boolean {\n if (ttl <= 0) return false;\n return Date.now() - entry.timestamp > ttl;\n }\n\n function evict(): void {\n if (maxSize <= 0 || cache.size < maxSize) return;\n // Remove the oldest entry (first key in Map insertion order)\n const firstKey = cache.keys().next().value;\n if (firstKey !== undefined) {\n cache.delete(firstKey);\n }\n }\n\n async function memoized(...args: TArgs): Promise<TReturn> {\n const key = keyFn(...args);\n\n // Check cache\n const cached = cache.get(key);\n if (cached && !isExpired(cached)) {\n // Move to end for LRU\n cache.delete(key);\n cache.set(key, cached);\n\n if (cached.isError) {\n throw cached.value;\n }\n return cached.value;\n }\n\n // Remove expired entry\n if (cached) {\n cache.delete(key);\n }\n\n // Check for in-flight request deduplication\n const inflight = pending.get(key);\n if (inflight) return inflight;\n\n const promise = fn(...args)\n .then((value) => {\n evict();\n cache.set(key, { value, timestamp: Date.now(), isError: false });\n pending.delete(key);\n return value;\n })\n .catch((error) => {\n pending.delete(key);\n if (cacheErrors) {\n evict();\n cache.set(key, { value: error, timestamp: Date.now(), isError: true });\n }\n throw error;\n });\n\n pending.set(key, promise);\n return promise;\n }\n\n memoized.clear = (): void => {\n cache.clear();\n pending.clear();\n };\n\n memoized.delete = (...args: TArgs): boolean => {\n const key = keyFn(...args);\n return cache.delete(key);\n };\n\n Object.defineProperty(memoized, 'size', {\n get() {\n return cache.size;\n },\n });\n\n return memoized as MemoizedFunction<TArgs, TReturn>;\n}\n"]}
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types.ts","../src/retry.ts","../src/circuit-breaker.ts","../src/bulkhead.ts","../src/fallback.ts","../src/hedge.ts","../src/semaphore.ts","../src/mutex.ts","../src/queue.ts","../src/rate-limit.ts","../src/timeout.ts","../src/debounce.ts","../src/throttle.ts","../src/batch.ts","../src/pipeline.ts","../src/poll.ts","../src/deferred.ts","../src/memo.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["// ============================================================================\n// FlowX — Types & Error Hierarchy\n// ============================================================================\n\n/** Generic async function signature */\nexport type AsyncFn<TArgs extends any[] = any[], TReturn = any> = (\n ...args: TArgs\n) => Promise<TReturn>;\n\n/** Backoff strategy for retry/poll operations */\nexport type BackoffStrategy =\n | 'fixed'\n | 'linear'\n | 'exponential'\n | ((attempt: number, delay: number) => number);\n\n// ── Error Classes ───────────────────────────────────────────────────────────\n\n/** Base error class for all FlowX errors */\nexport class FlowXError extends Error {\n public readonly code: string;\n constructor(message: string, code: string) {\n super(message);\n this.name = 'FlowXError';\n this.code = code;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** Thrown when a promise exceeds its timeout */\nexport class TimeoutError extends FlowXError {\n constructor(message = 'Operation timed out') {\n super(message, 'ERR_TIMEOUT');\n this.name = 'TimeoutError';\n }\n}\n\n/** Thrown when a circuit breaker is open */\nexport class CircuitBreakerError extends FlowXError {\n constructor(message = 'Circuit breaker is open') {\n super(message, 'ERR_CIRCUIT_OPEN');\n this.name = 'CircuitBreakerError';\n }\n}\n\n/** Thrown when a bulkhead rejects due to capacity */\nexport class BulkheadError extends FlowXError {\n constructor(message = 'Bulkhead capacity exceeded') {\n super(message, 'ERR_BULKHEAD_FULL');\n this.name = 'BulkheadError';\n }\n}\n\n/** Thrown when an operation is aborted */\nexport class AbortError extends FlowXError {\n constructor(message = 'Operation aborted') {\n super(message, 'ERR_ABORTED');\n this.name = 'AbortError';\n }\n}\n\n/** Thrown when rate limit is exceeded */\nexport class RateLimitError extends FlowXError {\n constructor(message = 'Rate limit exceeded') {\n super(message, 'ERR_RATE_LIMIT');\n this.name = 'RateLimitError';\n }\n}\n\n// ── Utility Helpers ─────────────────────────────────────────────────────────\n\n/** Sleep for the specified duration, respecting AbortSignal */\nexport function sleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n if (signal?.aborted) {\n reject(new AbortError());\n return;\n }\n\n let onAbort: (() => void) | undefined;\n\n const timer = setTimeout(() => {\n if (signal && onAbort) {\n signal.removeEventListener('abort', onAbort);\n }\n resolve();\n }, ms);\n\n if (signal) {\n onAbort = () => {\n clearTimeout(timer);\n reject(new AbortError());\n };\n signal.addEventListener('abort', onAbort, { once: true });\n }\n });\n}\n\n/** Calculate delay based on backoff strategy */\nexport function calculateDelay(\n attempt: number,\n baseDelay: number,\n strategy: BackoffStrategy,\n jitter: boolean | number = false,\n): number {\n let delay: number;\n\n if (typeof strategy === 'function') {\n delay = strategy(attempt, baseDelay);\n } else {\n switch (strategy) {\n case 'fixed':\n delay = baseDelay;\n break;\n case 'linear':\n delay = baseDelay * attempt;\n break;\n case 'exponential':\n delay = baseDelay * Math.pow(2, attempt - 1);\n break;\n }\n }\n\n if (jitter) {\n const factor = typeof jitter === 'number' ? jitter : 1;\n delay = delay * (1 - factor * 0.5 + Math.random() * factor);\n }\n\n return Math.max(0, Math.floor(delay));\n}\n","// ============================================================================\n// FlowX — Retry with Advanced Backoff Strategies\n// ============================================================================\nimport { AbortError, BackoffStrategy, calculateDelay, sleep } from './types';\n\nexport interface RetryOptions {\n /** Maximum number of retry attempts (default: 3) */\n retries?: number;\n /** Base delay in ms between retries (default: 1000) */\n delay?: number;\n /** Backoff strategy (default: 'exponential') */\n backoff?: BackoffStrategy;\n /** Add randomized jitter to delays (default: false) */\n jitter?: boolean | number;\n /** Maximum delay cap in ms (default: 30000) */\n maxDelay?: number;\n /** Custom predicate to decide if retry should happen */\n shouldRetry?: (error: Error, attempt: number) => boolean | Promise<boolean>;\n /** Callback fired before each retry */\n onRetry?: (error: Error, attempt: number) => void | Promise<void>;\n /** AbortSignal for cancellation */\n signal?: AbortSignal;\n}\n\n/**\n * Execute an async function with automatic retry and configurable backoff.\n *\n * @example\n * ```ts\n * const data = await retry(() => fetch('/api/data'), {\n * retries: 5,\n * backoff: 'exponential',\n * jitter: true,\n * });\n * ```\n */\nexport async function retry<T>(fn: () => T | Promise<T>, options?: RetryOptions): Promise<T> {\n const {\n retries = 3,\n delay = 1000,\n backoff = 'exponential',\n jitter = false,\n maxDelay = 30000,\n shouldRetry,\n onRetry,\n signal,\n } = options ?? {};\n\n if (retries < 0) {\n throw new RangeError('retries must be >= 0');\n }\n\n let lastError: Error | undefined;\n\n for (let attempt = 0; attempt <= retries; attempt++) {\n if (signal?.aborted) {\n throw new AbortError('Retry aborted');\n }\n\n try {\n const result = await fn();\n return result;\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n\n if (attempt === retries) break;\n\n if (shouldRetry) {\n const shouldContinue = await shouldRetry(lastError, attempt + 1);\n if (!shouldContinue) break;\n }\n\n if (onRetry) {\n await onRetry(lastError, attempt + 1);\n }\n\n let waitTime = calculateDelay(attempt + 1, delay, backoff, jitter);\n waitTime = Math.min(waitTime, maxDelay);\n\n await sleep(waitTime, signal);\n }\n }\n\n throw lastError!;\n}\n\n/**\n * Wrap a function to automatically retry on failure.\n *\n * @example\n * ```ts\n * const safeFetch = retryable(fetch, { retries: 3 });\n * const data = await safeFetch('/api/data');\n * ```\n */\nexport function retryable<TArgs extends any[], TReturn>(\n fn: (...args: TArgs) => Promise<TReturn>,\n options?: RetryOptions,\n): (...args: TArgs) => Promise<TReturn> {\n return (...args: TArgs) => retry(() => fn(...args), options);\n}\n","// ============================================================================\n// FlowX — Circuit Breaker Pattern\n// ============================================================================\nimport { CircuitBreakerError } from './types';\n\nexport type CircuitState = 'closed' | 'open' | 'half-open';\n\nexport interface CircuitBreakerOptions {\n /** Number of failures before opening the circuit (default: 5) */\n failureThreshold?: number;\n /** Time in ms before attempting half-open (default: 30000) */\n resetTimeout?: number;\n /** Max concurrent calls in half-open state (default: 1) */\n halfOpenLimit?: number;\n /** Custom predicate to decide if an error should count as a failure */\n shouldTrip?: (error: Error) => boolean;\n /** Callback fired on state changes */\n onStateChange?: (from: CircuitState, to: CircuitState) => void;\n /** Number of successes in half-open to close the circuit (default: 1) */\n successThreshold?: number;\n}\n\nexport interface CircuitBreaker<TArgs extends any[], TReturn> {\n /** Execute the protected function */\n fire: (...args: TArgs) => Promise<TReturn>;\n /** Get the current circuit state */\n readonly state: CircuitState;\n /** Get the current failure count */\n readonly failureCount: number;\n /** Get the current success count (in half-open) */\n readonly successCount: number;\n /** Manually reset the circuit to closed */\n reset: () => void;\n /** Manually open the circuit */\n open: () => void;\n}\n\n/**\n * Create a circuit breaker to protect against cascading failures.\n *\n * @example\n * ```ts\n * const breaker = createCircuitBreaker(callExternalApi, {\n * failureThreshold: 5,\n * resetTimeout: 30000,\n * });\n * const data = await breaker.fire('arg1');\n * ```\n */\nexport function createCircuitBreaker<TArgs extends any[], TReturn>(\n fn: (...args: TArgs) => Promise<TReturn>,\n options?: CircuitBreakerOptions,\n): CircuitBreaker<TArgs, TReturn> {\n const {\n failureThreshold = 5,\n resetTimeout = 30000,\n halfOpenLimit = 1,\n shouldTrip,\n onStateChange,\n successThreshold = 1,\n } = options ?? {};\n\n let state: CircuitState = 'closed';\n let failureCount = 0;\n let successCount = 0;\n let halfOpenActive = 0;\n let resetTimer: ReturnType<typeof setTimeout> | null = null;\n\n function transition(to: CircuitState): void {\n if (state === to) return;\n const from = state;\n state = to;\n onStateChange?.(from, to);\n }\n\n function scheduleReset(): void {\n /* istanbul ignore next -- defensive guard; timer always fires before reschedule in normal flow */\n if (resetTimer) clearTimeout(resetTimer);\n resetTimer = setTimeout(() => {\n resetTimer = null;\n transition('half-open');\n halfOpenActive = 0;\n successCount = 0;\n }, resetTimeout);\n }\n\n function reset(): void {\n if (resetTimer) {\n clearTimeout(resetTimer);\n resetTimer = null;\n }\n failureCount = 0;\n successCount = 0;\n halfOpenActive = 0;\n transition('closed');\n }\n\n function manualOpen(): void {\n if (resetTimer) {\n clearTimeout(resetTimer);\n resetTimer = null;\n }\n failureCount = 0;\n successCount = 0;\n halfOpenActive = 0;\n transition('open');\n scheduleReset();\n }\n\n async function fire(...args: TArgs): Promise<TReturn> {\n if (state === 'open') {\n throw new CircuitBreakerError();\n }\n\n if (state === 'half-open' && halfOpenActive >= halfOpenLimit) {\n throw new CircuitBreakerError('Circuit breaker is half-open — limit reached');\n }\n\n if (state === 'half-open') {\n halfOpenActive++;\n }\n\n try {\n const result = await fn(...args);\n\n if (state === 'half-open') {\n successCount++;\n halfOpenActive--;\n if (successCount >= successThreshold) {\n reset();\n }\n } else {\n // In closed state, reset failure count on success\n failureCount = 0;\n }\n\n return result;\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n\n if (shouldTrip && !shouldTrip(err)) {\n if (state === 'half-open') {\n halfOpenActive--;\n }\n throw err;\n }\n\n if (state === 'half-open') {\n halfOpenActive--;\n transition('open');\n scheduleReset();\n } else {\n failureCount++;\n if (failureCount >= failureThreshold) {\n transition('open');\n scheduleReset();\n }\n }\n\n throw err;\n }\n }\n\n return {\n fire,\n get state() {\n return state;\n },\n get failureCount() {\n return failureCount;\n },\n get successCount() {\n return successCount;\n },\n reset,\n open: manualOpen,\n };\n}\n","// ============================================================================\n// FlowX — Bulkhead Isolation Pattern\n// ============================================================================\nimport { BulkheadError } from './types';\n\nexport interface BulkheadOptions {\n /** Maximum concurrent executions (default: 10) */\n concurrency?: number;\n /** Maximum queue size for waiting tasks (default: 10) */\n queueSize?: number;\n /** Timeout in ms for queued tasks (0 = no timeout) */\n queueTimeout?: number;\n}\n\nexport interface Bulkhead {\n /** Execute a function within the bulkhead */\n execute: <T>(fn: () => Promise<T>) => Promise<T>;\n /** Current number of active executions */\n readonly active: number;\n /** Current number of queued tasks */\n readonly queued: number;\n /** Available capacity */\n readonly available: number;\n}\n\ninterface QueueItem<T = any> {\n fn: () => Promise<T>;\n resolve: (value: T) => void;\n reject: (error: Error) => void;\n timer?: ReturnType<typeof setTimeout>;\n}\n\n/**\n * Create a bulkhead to isolate concurrent operations and prevent resource exhaustion.\n *\n * @example\n * ```ts\n * const bulkhead = createBulkhead({ concurrency: 5, queueSize: 10 });\n * const data = await bulkhead.execute(() => fetch('/api'));\n * ```\n */\nexport function createBulkhead(options?: BulkheadOptions): Bulkhead {\n const { concurrency = 10, queueSize = 10, queueTimeout = 0 } = options ?? {};\n\n if (concurrency < 1) throw new RangeError('concurrency must be >= 1');\n if (queueSize < 0) throw new RangeError('queueSize must be >= 0');\n\n let active = 0;\n const queue: QueueItem[] = [];\n\n function tryDequeue(): void {\n while (queue.length > 0 && active < concurrency) {\n const item = queue.shift()!;\n if (item.timer) clearTimeout(item.timer);\n run(item);\n }\n }\n\n async function run<T>(item: QueueItem<T>): Promise<void> {\n active++;\n try {\n const value = await item.fn();\n active--;\n tryDequeue();\n item.resolve(value);\n } catch (error) {\n active--;\n tryDequeue();\n item.reject(error instanceof Error ? error : new Error(String(error)));\n }\n }\n\n function execute<T>(fn: () => Promise<T>): Promise<T> {\n if (active < concurrency) {\n return new Promise<T>((resolve, reject) => {\n run({ fn, resolve, reject });\n });\n }\n\n if (queue.length >= queueSize) {\n return Promise.reject(new BulkheadError());\n }\n\n return new Promise<T>((resolve, reject) => {\n const item: QueueItem<T> = { fn, resolve, reject };\n\n if (queueTimeout > 0) {\n item.timer = setTimeout(() => {\n const idx = queue.indexOf(item as QueueItem);\n if (idx !== -1) {\n queue.splice(idx, 1);\n reject(new BulkheadError('Bulkhead queue timeout exceeded'));\n }\n }, queueTimeout);\n }\n\n queue.push(item as QueueItem);\n });\n }\n\n return {\n execute,\n get active() {\n return active;\n },\n get queued() {\n return queue.length;\n },\n get available() {\n return Math.max(0, concurrency - active);\n },\n };\n}\n","// ============================================================================\n// FlowX — Fallback Chain\n// ============================================================================\n\nexport interface FallbackOptions {\n /** Predicate to determine if the error warrants a fallback */\n shouldFallback?: (error: Error) => boolean;\n /** Callback fired when the primary function fails and fallback is used */\n onFallback?: (error: Error, fallbackIndex: number) => void;\n}\n\n/**\n * Execute a function with a fallback value or function if it fails.\n *\n * @example\n * ```ts\n * const data = await withFallback(\n * () => fetch('/primary-api'),\n * 'default-value',\n * );\n * ```\n */\nexport async function withFallback<T>(\n fn: () => T | Promise<T>,\n fallback: T | (() => T | Promise<T>),\n options?: FallbackOptions,\n): Promise<T> {\n try {\n return await fn();\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n\n if (options?.shouldFallback && !options.shouldFallback(err)) {\n throw err;\n }\n\n options?.onFallback?.(err, 0);\n\n if (typeof fallback === 'function') {\n return await (fallback as () => T | Promise<T>)();\n }\n return fallback;\n }\n}\n\n/**\n * Execute the first successful function from a chain of fallbacks.\n *\n * @example\n * ```ts\n * const data = await fallbackChain([\n * () => fetch('/primary'),\n * () => fetch('/secondary'),\n * () => fetch('/tertiary'),\n * ]);\n * ```\n */\nexport async function fallbackChain<T>(\n fns: Array<() => T | Promise<T>>,\n options?: FallbackOptions,\n): Promise<T> {\n if (fns.length === 0) {\n throw new Error('fallbackChain requires at least one function');\n }\n\n let lastError: Error | undefined;\n\n for (let i = 0; i < fns.length; i++) {\n try {\n return await fns[i]();\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n\n if (options?.shouldFallback && !options.shouldFallback(lastError)) {\n throw lastError;\n }\n\n if (i < fns.length - 1) {\n options?.onFallback?.(lastError, i + 1);\n }\n }\n }\n\n throw lastError!;\n}\n","// ============================================================================\n// FlowX — Hedged Requests\n// ============================================================================\n\nexport interface HedgeOptions {\n /** Delay in ms before launching the hedge request (default: 500) */\n delay?: number;\n /** Maximum number of parallel hedged calls (default: 1) */\n maxHedges?: number;\n}\n\n/**\n * Execute a function with hedged requests — if the primary doesn't respond\n * quickly enough, fire parallel redundant calls and return whichever resolves first.\n *\n * @example\n * ```ts\n * const data = await hedge(() => fetch('/api'), { delay: 200 });\n * ```\n */\nexport function hedge<T>(fn: () => Promise<T>, options?: HedgeOptions): Promise<T> {\n const { delay = 500, maxHedges = 1 } = options ?? {};\n\n if (delay < 0) throw new RangeError('delay must be >= 0');\n if (maxHedges < 1) throw new RangeError('maxHedges must be >= 1');\n\n return new Promise<T>((resolve, reject) => {\n let settled = false;\n let completedCount = 0;\n const totalAttempts = 1 + maxHedges;\n const errors: Error[] = [];\n const timers: ReturnType<typeof setTimeout>[] = [];\n\n function onResult(value: T): void {\n if (settled) return;\n settled = true;\n // Clear pending hedge timers\n for (const t of timers) clearTimeout(t);\n resolve(value);\n }\n\n function onError(error: Error): void {\n errors.push(error);\n completedCount++;\n if (completedCount >= totalAttempts && !settled) {\n settled = true;\n reject(errors[0]);\n }\n }\n\n // Launch primary request immediately\n fn().then(onResult, (err) => onError(err instanceof Error ? err : new Error(String(err))));\n\n // Launch hedged requests after delay\n for (let i = 0; i < maxHedges; i++) {\n const timer = setTimeout(\n () => {\n /* istanbul ignore if -- timer is always cleared by onResult before firing */\n if (settled) return;\n fn().then(onResult, (err) =>\n onError(err instanceof Error ? err : new Error(String(err))),\n );\n },\n delay * (i + 1),\n );\n timers.push(timer);\n }\n });\n}\n","// ============================================================================\n// FlowX — Counting Semaphore\n// ============================================================================\n\nexport interface Semaphore {\n /** Acquire a permit. Returns a release function. */\n acquire: () => Promise<() => void>;\n /** Execute a function exclusively within the semaphore */\n runExclusive: <T>(fn: () => T | Promise<T>) => Promise<T>;\n /** Number of available permits */\n readonly available: number;\n /** Number of tasks waiting for a permit */\n readonly waiting: number;\n}\n\ninterface Waiter {\n resolve: (release: () => void) => void;\n}\n\n/**\n * Create a counting semaphore for concurrency control.\n *\n * @example\n * ```ts\n * const sem = createSemaphore(3);\n * const release = await sem.acquire();\n * try {\n * await doWork();\n * } finally {\n * release();\n * }\n * ```\n */\nexport function createSemaphore(permits: number): Semaphore {\n if (permits < 1) throw new RangeError('permits must be >= 1');\n\n let available = permits;\n const waiters: Waiter[] = [];\n\n function release(): void {\n available++;\n if (waiters.length > 0) {\n available--;\n const next = waiters.shift()!;\n next.resolve(release);\n }\n }\n\n function acquire(): Promise<() => void> {\n if (available > 0) {\n available--;\n return Promise.resolve(release);\n }\n\n return new Promise<() => void>((resolve) => {\n waiters.push({ resolve });\n });\n }\n\n async function runExclusive<T>(fn: () => T | Promise<T>): Promise<T> {\n const releaseFn = await acquire();\n try {\n return await fn();\n } finally {\n releaseFn();\n }\n }\n\n return {\n acquire,\n runExclusive,\n get available() {\n return available;\n },\n get waiting() {\n return waiters.length;\n },\n };\n}\n","// ============================================================================\n// FlowX — Mutual Exclusion Lock\n// ============================================================================\n\nexport interface Mutex {\n /** Acquire the lock. Returns a release function. */\n lock: () => Promise<() => void>;\n /** Execute a function exclusively under the mutex */\n runExclusive: <T>(fn: () => T | Promise<T>) => Promise<T>;\n /** Whether the mutex is currently locked */\n readonly isLocked: boolean;\n /** Number of tasks waiting for the lock */\n readonly waiting: number;\n}\n\n/**\n * Create a mutual exclusion lock for serializing async operations.\n *\n * @example\n * ```ts\n * const mutex = createMutex();\n * await mutex.runExclusive(async () => {\n * await updateSharedResource();\n * });\n * ```\n */\nexport function createMutex(): Mutex {\n let locked = false;\n const waitQueue: Array<(release: () => void) => void> = [];\n\n function release(): void {\n if (waitQueue.length > 0) {\n const next = waitQueue.shift()!;\n // Stay locked, transfer to next waiter\n next(release);\n } else {\n locked = false;\n }\n }\n\n function lock(): Promise<() => void> {\n if (!locked) {\n locked = true;\n return Promise.resolve(release);\n }\n\n return new Promise<() => void>((resolve) => {\n waitQueue.push(resolve);\n });\n }\n\n async function runExclusive<T>(fn: () => T | Promise<T>): Promise<T> {\n const releaseFn = await lock();\n try {\n return await fn();\n } finally {\n releaseFn();\n }\n }\n\n return {\n lock,\n runExclusive,\n get isLocked() {\n return locked;\n },\n get waiting() {\n return waitQueue.length;\n },\n };\n}\n","// ============================================================================\n// FlowX — Priority Async Queue\n// ============================================================================\n\nexport interface QueueOptions {\n /** Maximum concurrent tasks (default: 1) */\n concurrency?: number;\n /** Start processing immediately (default: true) */\n autoStart?: boolean;\n /** Per-task timeout in ms (0 = no timeout) */\n timeout?: number;\n}\n\nexport interface QueueAddOptions {\n /** Task priority — lower number = higher priority (default: 0) */\n priority?: number;\n}\n\nexport interface AsyncQueue {\n /** Add a task to the queue */\n add: <T>(fn: () => Promise<T>, options?: QueueAddOptions) => Promise<T>;\n /** Add multiple tasks and return all results */\n addAll: <T>(fns: Array<() => Promise<T>>, options?: QueueAddOptions) => Promise<T[]>;\n /** Pause processing */\n pause: () => void;\n /** Resume processing */\n resume: () => void;\n /** Clear all pending tasks */\n clear: () => void;\n /** Wait until the queue is empty */\n onEmpty: () => Promise<void>;\n /** Wait until the queue is idle (empty + no active tasks) */\n onIdle: () => Promise<void>;\n /** Number of pending tasks */\n readonly size: number;\n /** Number of active tasks */\n readonly pending: number;\n /** Whether the queue is paused */\n readonly isPaused: boolean;\n}\n\ninterface QueueEntry {\n fn: () => Promise<any>;\n priority: number;\n resolve: (value: any) => void;\n reject: (error: Error) => void;\n}\n\n/**\n * Create a priority async queue with concurrency control.\n *\n * @example\n * ```ts\n * const queue = createQueue({ concurrency: 3 });\n * const result = await queue.add(() => fetch('/api'), { priority: 1 });\n * await queue.onIdle();\n * ```\n */\nexport function createQueue(options?: QueueOptions): AsyncQueue {\n const { concurrency = 1, autoStart = true, timeout = 0 } = options ?? {};\n\n if (concurrency < 1) throw new RangeError('concurrency must be >= 1');\n\n let paused = !autoStart;\n let active = 0;\n const entries: QueueEntry[] = [];\n const emptyCallbacks: Array<() => void> = [];\n const idleCallbacks: Array<() => void> = [];\n\n function notifyIdle(): void {\n if (active === 0 && entries.length === 0) {\n for (const cb of idleCallbacks.splice(0)) cb();\n }\n }\n\n function notifyEmpty(): void {\n if (entries.length === 0) {\n for (const cb of emptyCallbacks.splice(0)) cb();\n }\n }\n\n function tryRun(): void {\n if (paused) return;\n\n while (active < concurrency && entries.length > 0) {\n const entry = entries.shift()!;\n active++;\n\n let timer: ReturnType<typeof setTimeout> | undefined;\n\n const run = async () => {\n try {\n let result: any;\n if (timeout > 0) {\n result = await Promise.race([\n entry.fn(),\n new Promise<never>((_, rej) => {\n timer = setTimeout(() => rej(new Error('Queue task timeout')), timeout);\n }),\n ]);\n } else {\n result = await entry.fn();\n }\n if (timer) clearTimeout(timer);\n entry.resolve(result);\n } catch (error) {\n if (timer) clearTimeout(timer);\n entry.reject(error instanceof Error ? error : new Error(String(error)));\n } finally {\n active--;\n notifyEmpty();\n tryRun();\n notifyIdle();\n }\n };\n\n run();\n }\n\n notifyEmpty();\n notifyIdle();\n }\n\n function add<T>(fn: () => Promise<T>, addOptions?: QueueAddOptions): Promise<T> {\n const priority = addOptions?.priority ?? 0;\n\n return new Promise<T>((resolve, reject) => {\n const entry: QueueEntry = { fn, priority, resolve, reject };\n\n // Insert sorted by priority (lower = higher priority)\n let inserted = false;\n for (let i = 0; i < entries.length; i++) {\n if (priority < entries[i].priority) {\n entries.splice(i, 0, entry);\n inserted = true;\n break;\n }\n }\n if (!inserted) {\n entries.push(entry);\n }\n\n tryRun();\n });\n }\n\n function addAll<T>(fns: Array<() => Promise<T>>, addOptions?: QueueAddOptions): Promise<T[]> {\n return Promise.all(fns.map((fn) => add(fn, addOptions)));\n }\n\n function pause(): void {\n paused = true;\n }\n\n function resume(): void {\n paused = false;\n tryRun();\n }\n\n function clear(): void {\n for (const entry of entries.splice(0)) {\n entry.reject(new Error('Queue cleared'));\n }\n }\n\n function onEmpty(): Promise<void> {\n if (entries.length === 0) return Promise.resolve();\n return new Promise<void>((resolve) => emptyCallbacks.push(resolve));\n }\n\n function onIdle(): Promise<void> {\n if (active === 0 && entries.length === 0) return Promise.resolve();\n return new Promise<void>((resolve) => idleCallbacks.push(resolve));\n }\n\n return {\n add,\n addAll,\n pause,\n resume,\n clear,\n onEmpty,\n onIdle,\n get size() {\n return entries.length;\n },\n get pending() {\n return active;\n },\n get isPaused() {\n return paused;\n },\n };\n}\n","// ============================================================================\n// FlowX — Token Bucket Rate Limiter\n// ============================================================================\nimport { RateLimitError } from './types';\n\nexport interface RateLimitOptions {\n /** Maximum number of executions per interval */\n limit: number;\n /** Time window in ms */\n interval: number;\n /** Whether to reject or queue when limit is exceeded (default: 'queue') */\n strategy?: 'queue' | 'reject';\n}\n\nexport interface RateLimiter {\n /** Execute a function within the rate limit */\n execute: <T>(fn: () => T | Promise<T>) => Promise<T>;\n /** Reset the rate limiter state */\n reset: () => void;\n /** Number of remaining tokens in current window */\n readonly remaining: number;\n}\n\n/**\n * Create a rate limiter using the token bucket algorithm.\n *\n * @example\n * ```ts\n * const limiter = createRateLimiter({ limit: 10, interval: 1000 });\n * await limiter.execute(() => fetch('/api'));\n * ```\n */\nexport function createRateLimiter(options: RateLimitOptions): RateLimiter {\n const { limit, interval, strategy = 'queue' } = options;\n\n if (limit < 1) throw new RangeError('limit must be >= 1');\n if (interval < 1) throw new RangeError('interval must be >= 1');\n\n let tokens = limit;\n let lastRefill = Date.now();\n const queue: Array<{ resolve: () => void }> = [];\n let drainTimer: ReturnType<typeof setTimeout> | null = null;\n\n function refill(): void {\n const now = Date.now();\n const elapsed = now - lastRefill;\n const refillCount = Math.floor(elapsed / interval) * limit;\n\n if (refillCount > 0) {\n tokens = Math.min(limit, tokens + refillCount);\n lastRefill = now;\n }\n }\n\n function drainQueue(): void {\n refill();\n while (queue.length > 0 && tokens > 0) {\n tokens--;\n const item = queue.shift()!;\n item.resolve();\n }\n\n if (queue.length > 0) {\n scheduleDrain();\n } else {\n drainTimer = null;\n }\n }\n\n function scheduleDrain(): void {\n if (drainTimer) return;\n const timeToNextToken = interval / limit;\n drainTimer = setTimeout(() => {\n drainTimer = null;\n drainQueue();\n }, timeToNextToken);\n }\n\n async function execute<T>(fn: () => T | Promise<T>): Promise<T> {\n refill();\n\n if (tokens > 0) {\n tokens--;\n return await fn();\n }\n\n if (strategy === 'reject') {\n throw new RateLimitError();\n }\n\n // Queue strategy — wait for a token\n await new Promise<void>((resolve) => {\n queue.push({ resolve });\n scheduleDrain();\n });\n\n return await fn();\n }\n\n function reset(): void {\n tokens = limit;\n lastRefill = Date.now();\n if (drainTimer) {\n clearTimeout(drainTimer);\n drainTimer = null;\n }\n drainQueue();\n }\n\n return {\n execute,\n reset,\n get remaining() {\n refill();\n return tokens;\n },\n };\n}\n","// ============================================================================\n// FlowX — Promise Timeout with Cleanup\n// ============================================================================\nimport { AbortError, TimeoutError } from './types';\n\nexport interface TimeoutOptions<T = unknown> {\n /** Fallback value or factory when timeout occurs */\n fallback?: T | (() => T | Promise<T>);\n /** AbortSignal for external cancellation */\n signal?: AbortSignal;\n /** Custom error message */\n message?: string;\n}\n\n/**\n * Wrap an async operation with a timeout.\n *\n * @example\n * ```ts\n * const result = await withTimeout(() => fetch('/slow-api'), 5000);\n * ```\n */\nexport async function withTimeout<T>(\n fn: () => T | Promise<T>,\n ms: number,\n options?: TimeoutOptions<T>,\n): Promise<T> {\n if (ms <= 0) {\n throw new RangeError('Timeout must be > 0');\n }\n\n if (options?.signal?.aborted) {\n throw new AbortError();\n }\n\n const fnResult = fn(); // call synchronously so sync throws propagate\n\n return Promise.race([\n Promise.resolve(fnResult),\n new Promise<T>((_, reject) => {\n const timer = setTimeout(() => {\n if (options?.fallback !== undefined) {\n const fb = options.fallback;\n if (typeof fb === 'function') {\n try {\n const result = (fb as () => T | Promise<T>)();\n Promise.resolve(result).then(\n (v) => reject({ __resolved: true, value: v } as any),\n reject,\n );\n } catch (err) {\n reject(err);\n }\n } else {\n reject({ __resolved: true, value: fb } as any);\n }\n } else {\n reject(new TimeoutError(options?.message));\n }\n }, ms);\n\n // If signal aborts, reject the race\n if (options?.signal) {\n const onAbort = () => {\n clearTimeout(timer);\n reject(new AbortError());\n };\n options.signal.addEventListener('abort', onAbort, { once: true });\n }\n\n // Clean up timer when fn resolves\n Promise.resolve(fnResult).then(\n () => clearTimeout(timer),\n () => clearTimeout(timer),\n );\n }),\n ]).catch((err) => {\n // Handle the fallback resolution hack\n if (err && typeof err === 'object' && '__resolved' in err) {\n return err.value as T;\n }\n throw err;\n });\n}\n","// ============================================================================\n// FlowX — Async-Aware Debounce\n// ============================================================================\n\nexport interface DebounceOptions {\n /** Invoke on the leading edge (default: false) */\n leading?: boolean;\n /** Invoke on the trailing edge (default: true) */\n trailing?: boolean;\n /** Maximum wait time before forced invocation in ms */\n maxWait?: number;\n}\n\nexport interface DebouncedFunction<TArgs extends any[], TReturn> {\n /** Call the debounced function */\n (...args: TArgs): Promise<TReturn>;\n /** Cancel any pending invocation */\n cancel: () => void;\n /** Immediately invoke any pending call */\n flush: () => Promise<TReturn | undefined>;\n /** Whether there is a pending invocation */\n readonly pending: boolean;\n}\n\n/**\n * Create a debounced version of an async function.\n *\n * @example\n * ```ts\n * const debouncedSearch = debounce(searchApi, 300);\n * await debouncedSearch('query');\n * ```\n */\nexport function debounce<TArgs extends any[], TReturn>(\n fn: (...args: TArgs) => TReturn | Promise<TReturn>,\n wait: number,\n options?: DebounceOptions,\n): DebouncedFunction<TArgs, TReturn> {\n const { leading = false, trailing = true, maxWait } = options ?? {};\n\n if (wait < 0) throw new RangeError('wait must be >= 0');\n\n let timer: ReturnType<typeof setTimeout> | null = null;\n let maxTimer: ReturnType<typeof setTimeout> | null = null;\n let lastArgs: TArgs | null = null;\n const pendingResolvers: Array<{\n resolve: (value: TReturn) => void;\n reject: (error: Error) => void;\n }> = [];\n let isPending = false;\n\n async function invoke(): Promise<void> {\n\n const args = lastArgs!;\n const resolvers = pendingResolvers.splice(0);\n lastArgs = null;\n isPending = false;\n\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n if (maxTimer) {\n clearTimeout(maxTimer);\n maxTimer = null;\n }\n\n try {\n const result = await fn(...args);\n for (const r of resolvers) r.resolve(result);\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n for (const r of resolvers) r.reject(err);\n }\n }\n\n function debounced(...args: TArgs): Promise<TReturn> {\n lastArgs = args;\n\n return new Promise<TReturn>((resolve, reject) => {\n pendingResolvers.push({ resolve, reject });\n\n // Leading edge\n if (leading && !isPending) {\n isPending = true;\n invoke();\n return;\n }\n\n isPending = true;\n\n // Reset trailing timer\n if (timer) clearTimeout(timer);\n\n if (trailing) {\n timer = setTimeout(() => {\n timer = null;\n invoke();\n }, wait);\n }\n\n // Set max wait timer\n if (maxWait !== undefined && !maxTimer) {\n maxTimer = setTimeout(() => {\n maxTimer = null;\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n invoke();\n }, maxWait);\n }\n });\n }\n\n debounced.cancel = (): void => {\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n if (maxTimer) {\n clearTimeout(maxTimer);\n maxTimer = null;\n }\n lastArgs = null;\n isPending = false;\n // Reject all pending resolvers\n const resolvers = pendingResolvers.splice(0);\n for (const r of resolvers) {\n r.reject(new Error('Debounced call cancelled'));\n }\n };\n\n debounced.flush = async (): Promise<TReturn | undefined> => {\n if (!isPending) return undefined;\n const promise = new Promise<TReturn>((resolve, reject) => {\n pendingResolvers.push({ resolve, reject });\n });\n await invoke();\n return promise;\n };\n\n Object.defineProperty(debounced, 'pending', {\n get() {\n return isPending;\n },\n });\n\n return debounced as DebouncedFunction<TArgs, TReturn>;\n}\n","// ============================================================================\n// FlowX — Async-Aware Throttle\n// ============================================================================\n\nexport interface ThrottleOptions {\n /** Invoke on the leading edge (default: true) */\n leading?: boolean;\n /** Invoke on the trailing edge (default: true) */\n trailing?: boolean;\n}\n\nexport interface ThrottledFunction<TArgs extends any[], TReturn> {\n (...args: TArgs): Promise<TReturn>;\n /** Cancel any pending trailing invocation */\n cancel: () => void;\n /** Whether there is a pending trailing invocation */\n readonly pending: boolean;\n}\n\n/**\n * Create a throttled version of an async function.\n *\n * @example\n * ```ts\n * const throttledSave = throttle(saveData, 1000);\n * await throttledSave(data);\n * ```\n */\nexport function throttle<TArgs extends any[], TReturn>(\n fn: (...args: TArgs) => TReturn | Promise<TReturn>,\n wait: number,\n options?: ThrottleOptions,\n): ThrottledFunction<TArgs, TReturn> {\n const { leading = true, trailing = true } = options ?? {};\n\n if (wait < 0) throw new RangeError('wait must be >= 0');\n\n let lastCallTime: number | null = null;\n let timer: ReturnType<typeof setTimeout> | null = null;\n let lastArgs: TArgs | null = null;\n let isPending = false;\n const trailingResolvers: Array<{\n resolve: (value: TReturn) => void;\n reject: (error: Error) => void;\n }> = [];\n\n async function invokeTrailing(): Promise<void> {\n const args = lastArgs;\n const resolvers = trailingResolvers.splice(0);\n lastArgs = null;\n isPending = false;\n timer = null;\n\n if (!args) {\n /* istanbul ignore next -- resolvers is always empty here; lastArgs cleared before trailing fires */\n for (const r of resolvers) r.resolve(undefined as TReturn);\n return;\n }\n\n try {\n const result = await fn(...args);\n for (const r of resolvers) r.resolve(result);\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n for (const r of resolvers) r.reject(err);\n }\n }\n\n function throttled(...args: TArgs): Promise<TReturn> {\n const now = Date.now();\n lastArgs = args;\n\n const timeSinceLastCall = lastCallTime === null ? wait : now - lastCallTime;\n const shouldCallLeading = leading && timeSinceLastCall >= wait;\n\n if (shouldCallLeading) {\n lastCallTime = now;\n lastArgs = null;\n\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n\n // Resolve any pending trailing resolvers with this call's result\n const prevResolvers = trailingResolvers.splice(0);\n\n const resultPromise = (async () => {\n try {\n const result = await fn(...args);\n for (const r of prevResolvers) r.resolve(result);\n return result;\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n /* istanbul ignore next -- prevResolvers is always empty on leading calls in normal flow */\n for (const r of prevResolvers) r.reject(err);\n throw err;\n }\n })();\n\n if (trailing) {\n timer = setTimeout(() => {\n lastCallTime = Date.now();\n invokeTrailing();\n }, wait);\n }\n\n return resultPromise;\n }\n\n // Schedule trailing call\n isPending = true;\n\n return new Promise<TReturn>((resolve, reject) => {\n trailingResolvers.push({ resolve, reject });\n\n if (!timer && trailing) {\n const remaining = wait - timeSinceLastCall;\n timer = setTimeout(() => {\n lastCallTime = Date.now();\n invokeTrailing();\n }, remaining);\n }\n });\n }\n\n throttled.cancel = (): void => {\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n lastArgs = null;\n lastCallTime = null;\n isPending = false;\n const resolvers = trailingResolvers.splice(0);\n for (const r of resolvers) {\n r.reject(new Error('Throttled call cancelled'));\n }\n };\n\n Object.defineProperty(throttled, 'pending', {\n get() {\n return isPending;\n },\n });\n\n return throttled as ThrottledFunction<TArgs, TReturn>;\n}\n","// ============================================================================\n// FlowX — Batch Processing with Concurrency\n// ============================================================================\nimport { AbortError } from './types';\n\nexport interface BatchOptions {\n /** Maximum concurrent batch operations (default: Infinity) */\n concurrency?: number;\n /** Number of items per batch (default: 1) */\n batchSize?: number;\n /** Progress callback */\n onProgress?: (completed: number, total: number) => void;\n /** AbortSignal for cancellation */\n signal?: AbortSignal;\n}\n\nexport interface BatchResult<T> {\n /** All results in order */\n results: T[];\n /** Total items processed */\n total: number;\n /** Number of succeeded items */\n succeeded: number;\n /** Number of failed items */\n failed: number;\n /** Errors indexed by position */\n errors: Map<number, Error>;\n}\n\n/**\n * Process an array of items in batches with concurrency control.\n *\n * @example\n * ```ts\n * const results = await batch(\n * urls,\n * async (url) => fetch(url).then(r => r.json()),\n * { concurrency: 5, batchSize: 10 },\n * );\n * ```\n */\nexport async function batch<TItem, TResult>(\n items: TItem[],\n fn: (item: TItem, index: number) => Promise<TResult>,\n options?: BatchOptions,\n): Promise<BatchResult<TResult>> {\n const { concurrency = Infinity, batchSize = 1, onProgress, signal } = options ?? {};\n\n if (batchSize < 1) throw new RangeError('batchSize must be >= 1');\n if (concurrency < 1) throw new RangeError('concurrency must be >= 1');\n\n const results: TResult[] = new Array(items.length);\n const errors = new Map<number, Error>();\n let completed = 0;\n let succeeded = 0;\n let failed = 0;\n\n // Split items into batches\n const batches: Array<{ items: TItem[]; startIndex: number }> = [];\n for (let i = 0; i < items.length; i += batchSize) {\n batches.push({\n items: items.slice(i, i + batchSize),\n startIndex: i,\n });\n }\n\n // Process batches with concurrency control\n let batchIndex = 0;\n\n async function processBatch(): Promise<void> {\n while (batchIndex < batches.length) {\n if (signal?.aborted) throw new AbortError();\n\n const currentBatch = batches[batchIndex++];\n\n for (let i = 0; i < currentBatch.items.length; i++) {\n if (signal?.aborted) throw new AbortError();\n\n const globalIndex = currentBatch.startIndex + i;\n try {\n results[globalIndex] = await fn(currentBatch.items[i], globalIndex);\n succeeded++;\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n errors.set(globalIndex, err);\n results[globalIndex] = undefined as TResult;\n failed++;\n }\n completed++;\n onProgress?.(completed, items.length);\n }\n }\n }\n\n const workers: Promise<void>[] = [];\n const workerCount = Math.min(concurrency, batches.length);\n\n for (let i = 0; i < workerCount; i++) {\n workers.push(processBatch());\n }\n\n await Promise.all(workers);\n\n return {\n results,\n total: items.length,\n succeeded,\n failed,\n errors,\n };\n}\n","// ============================================================================\n// FlowX — Async Pipeline Composition\n// ============================================================================\n\n/** A step in the pipeline */\nexport type PipelineStep<TIn, TOut> = (input: TIn) => TOut | Promise<TOut>;\n\n/**\n * Compose multiple async functions into a single pipeline.\n *\n * @example\n * ```ts\n * const process = pipeline(\n * (x: number) => x * 2,\n * (x: number) => x + 1,\n * (x: number) => String(x),\n * );\n * const result = await process(5); // \"11\"\n * ```\n */\nexport function pipeline<A, B>(s1: PipelineStep<A, B>): (input: A) => Promise<B>;\nexport function pipeline<A, B, C>(\n s1: PipelineStep<A, B>,\n s2: PipelineStep<B, C>,\n): (input: A) => Promise<C>;\nexport function pipeline<A, B, C, D>(\n s1: PipelineStep<A, B>,\n s2: PipelineStep<B, C>,\n s3: PipelineStep<C, D>,\n): (input: A) => Promise<D>;\nexport function pipeline<A, B, C, D, E>(\n s1: PipelineStep<A, B>,\n s2: PipelineStep<B, C>,\n s3: PipelineStep<C, D>,\n s4: PipelineStep<D, E>,\n): (input: A) => Promise<E>;\nexport function pipeline<A, B, C, D, E, F>(\n s1: PipelineStep<A, B>,\n s2: PipelineStep<B, C>,\n s3: PipelineStep<C, D>,\n s4: PipelineStep<D, E>,\n s5: PipelineStep<E, F>,\n): (input: A) => Promise<F>;\nexport function pipeline(...steps: Array<PipelineStep<any, any>>): (input: any) => Promise<any>;\nexport function pipeline(...steps: Array<PipelineStep<any, any>>): (input: any) => Promise<any> {\n if (steps.length === 0) {\n throw new Error('pipeline requires at least one step');\n }\n\n return async (input: any) => {\n let current = input;\n for (const step of steps) {\n current = await step(current);\n }\n return current;\n };\n}\n\n/**\n * Execute a value through a series of async transformation steps.\n *\n * @example\n * ```ts\n * const result = await pipe(\n * 5,\n * (x) => x * 2,\n * (x) => x + 1,\n * (x) => String(x),\n * ); // \"11\"\n * ```\n */\nexport async function pipe<A, B>(input: A, s1: PipelineStep<A, B>): Promise<B>;\nexport async function pipe<A, B, C>(\n input: A,\n s1: PipelineStep<A, B>,\n s2: PipelineStep<B, C>,\n): Promise<C>;\nexport async function pipe<A, B, C, D>(\n input: A,\n s1: PipelineStep<A, B>,\n s2: PipelineStep<B, C>,\n s3: PipelineStep<C, D>,\n): Promise<D>;\nexport async function pipe<A, B, C, D, E>(\n input: A,\n s1: PipelineStep<A, B>,\n s2: PipelineStep<B, C>,\n s3: PipelineStep<C, D>,\n s4: PipelineStep<D, E>,\n): Promise<E>;\nexport async function pipe<A, B, C, D, E, F>(\n input: A,\n s1: PipelineStep<A, B>,\n s2: PipelineStep<B, C>,\n s3: PipelineStep<C, D>,\n s4: PipelineStep<D, E>,\n s5: PipelineStep<E, F>,\n): Promise<F>;\nexport async function pipe(input: any, ...steps: Array<PipelineStep<any, any>>): Promise<any>;\nexport async function pipe(input: any, ...steps: Array<PipelineStep<any, any>>): Promise<any> {\n if (steps.length === 0) {\n throw new Error('pipe requires at least one step');\n }\n\n let current = input;\n for (const step of steps) {\n current = await step(current);\n }\n return current;\n}\n","// ============================================================================\n// FlowX — Polling with Backoff\n// ============================================================================\nimport { AbortError, BackoffStrategy, calculateDelay, sleep } from './types';\n\nexport interface PollOptions<T> {\n /** Polling interval in ms (default: 1000) */\n interval?: number;\n /** Condition to stop polling — return true to resolve */\n until?: (result: T) => boolean;\n /** Maximum number of poll attempts (default: Infinity) */\n maxAttempts?: number;\n /** Backoff strategy for interval (default: 'fixed') */\n backoff?: BackoffStrategy;\n /** AbortSignal for cancellation */\n signal?: AbortSignal;\n}\n\nexport interface PollController<T> {\n /** Promise that resolves with the final result */\n result: Promise<T>;\n /** Stop polling early */\n stop: () => void;\n}\n\n/**\n * Poll an async function until a condition is met.\n *\n * @example\n * ```ts\n * const { result } = poll(\n * () => checkJobStatus(jobId),\n * { until: (status) => status === 'done', interval: 2000 },\n * );\n * const finalStatus = await result;\n * ```\n */\nexport function poll<T>(fn: () => T | Promise<T>, options?: PollOptions<T>): PollController<T> {\n const {\n interval = 1000,\n until,\n maxAttempts = Infinity,\n backoff = 'fixed',\n signal,\n } = options ?? {};\n\n if (interval < 0) throw new RangeError('interval must be >= 0');\n\n let stopped = false;\n let rejectFn: ((error: Error) => void) | null = null;\n\n const result = (async (): Promise<T> => {\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n if (stopped || signal?.aborted) {\n throw new AbortError('Polling stopped');\n }\n\n const value = await fn();\n\n if (until ? until(value) : true) {\n return value;\n }\n\n if (attempt < maxAttempts) {\n const waitTime = calculateDelay(attempt, interval, backoff);\n await sleep(waitTime, signal).catch((err) => {\n /* istanbul ignore if -- stop() doesn't abort sleep; this is a defensive guard */\n if (stopped) throw new AbortError('Polling stopped');\n throw err;\n });\n }\n }\n\n throw new Error('Polling exceeded maximum attempts');\n })();\n\n // Capture the reject function for external stopping\n const wrappedResult = new Promise<T>((resolve, reject) => {\n rejectFn = reject;\n result.then(resolve, reject);\n });\n\n function stop(): void {\n stopped = true;\n rejectFn?.(new AbortError('Polling stopped'));\n }\n\n return {\n result: wrappedResult,\n stop,\n };\n}\n","// ============================================================================\n// FlowX — Deferred Promise\n// ============================================================================\n\nexport interface Deferred<T> {\n /** The underlying promise */\n promise: Promise<T>;\n /** Resolve the deferred */\n resolve: (value: T | PromiseLike<T>) => void;\n /** Reject the deferred */\n reject: (reason?: any) => void;\n /** Whether the deferred has been settled */\n readonly isSettled: boolean;\n /** Whether the deferred was resolved */\n readonly isResolved: boolean;\n /** Whether the deferred was rejected */\n readonly isRejected: boolean;\n}\n\n/**\n * Create a deferred promise — a promise whose resolve/reject are externally accessible.\n *\n * @example\n * ```ts\n * const deferred = createDeferred<string>();\n * setTimeout(() => deferred.resolve('done'), 1000);\n * const result = await deferred.promise; // 'done'\n * ```\n */\nexport function createDeferred<T = void>(): Deferred<T> {\n let isSettled = false;\n let isResolved = false;\n let isRejected = false;\n let resolveFn!: (value: T | PromiseLike<T>) => void;\n let rejectFn!: (reason?: any) => void;\n\n const promise = new Promise<T>((resolve, reject) => {\n resolveFn = resolve;\n rejectFn = reject;\n });\n\n return {\n promise,\n resolve: (value: T | PromiseLike<T>) => {\n if (isSettled) return;\n isSettled = true;\n isResolved = true;\n resolveFn(value);\n },\n reject: (reason?: any) => {\n if (isSettled) return;\n isSettled = true;\n isRejected = true;\n rejectFn(reason);\n },\n get isSettled() {\n return isSettled;\n },\n get isResolved() {\n return isResolved;\n },\n get isRejected() {\n return isRejected;\n },\n };\n}\n","// ============================================================================\n// FlowX — Async Memoization with TTL\n// ============================================================================\n\nexport interface MemoOptions<TArgs extends any[]> {\n /** Time-to-live for cached results in ms (0 = forever) */\n ttl?: number;\n /** Maximum cache size (0 = unlimited) */\n maxSize?: number;\n /** Custom cache key generator */\n keyFn?: (...args: TArgs) => string;\n /** Whether to cache rejections (default: false) */\n cacheErrors?: boolean;\n}\n\nexport interface MemoizedFunction<TArgs extends any[], TReturn> {\n (...args: TArgs): Promise<TReturn>;\n /** Clear the entire cache */\n clear: () => void;\n /** Delete a specific cache entry */\n delete: (...args: TArgs) => boolean;\n /** Current cache size */\n readonly size: number;\n}\n\ninterface CacheEntry<T> {\n value: T;\n timestamp: number;\n isError: boolean;\n}\n\n/**\n * Create a memoized version of an async function with TTL and LRU eviction.\n *\n * @example\n * ```ts\n * const cachedFetch = memo(fetchUser, {\n * ttl: 60_000,\n * maxSize: 100,\n * keyFn: (id) => String(id),\n * });\n * const user = await cachedFetch(42);\n * ```\n */\nexport function memo<TArgs extends any[], TReturn>(\n fn: (...args: TArgs) => Promise<TReturn>,\n options?: MemoOptions<TArgs>,\n): MemoizedFunction<TArgs, TReturn> {\n const {\n ttl = 0,\n maxSize = 0,\n keyFn = (...args: TArgs) => JSON.stringify(args),\n cacheErrors = false,\n } = options ?? {};\n\n const cache = new Map<string, CacheEntry<TReturn>>();\n const pending = new Map<string, Promise<TReturn>>();\n\n function isExpired(entry: CacheEntry<TReturn>): boolean {\n if (ttl <= 0) return false;\n return Date.now() - entry.timestamp > ttl;\n }\n\n function evict(): void {\n if (maxSize <= 0 || cache.size < maxSize) return;\n // Remove the oldest entry (first key in Map insertion order)\n const firstKey = cache.keys().next().value;\n if (firstKey !== undefined) {\n cache.delete(firstKey);\n }\n }\n\n async function memoized(...args: TArgs): Promise<TReturn> {\n const key = keyFn(...args);\n\n // Check cache\n const cached = cache.get(key);\n if (cached && !isExpired(cached)) {\n // Move to end for LRU\n cache.delete(key);\n cache.set(key, cached);\n\n if (cached.isError) {\n throw cached.value;\n }\n return cached.value;\n }\n\n // Remove expired entry\n if (cached) {\n cache.delete(key);\n }\n\n // Check for in-flight request deduplication\n const inflight = pending.get(key);\n if (inflight) return inflight;\n\n const promise = fn(...args)\n .then((value) => {\n evict();\n cache.set(key, { value, timestamp: Date.now(), isError: false });\n pending.delete(key);\n return value;\n })\n .catch((error) => {\n pending.delete(key);\n if (cacheErrors) {\n evict();\n cache.set(key, { value: error, timestamp: Date.now(), isError: true });\n }\n throw error;\n });\n\n pending.set(key, promise);\n return promise;\n }\n\n memoized.clear = (): void => {\n cache.clear();\n pending.clear();\n };\n\n memoized.delete = (...args: TArgs): boolean => {\n const key = keyFn(...args);\n return cache.delete(key);\n };\n\n Object.defineProperty(memoized, 'size', {\n get() {\n return cache.size;\n },\n });\n\n return memoized as MemoizedFunction<TArgs, TReturn>;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/types.ts","../src/retry.ts","../src/circuit-breaker.ts","../src/bulkhead.ts","../src/fallback.ts","../src/hedge.ts","../src/semaphore.ts","../src/mutex.ts","../src/queue.ts","../src/rate-limit.ts","../src/timeout.ts","../src/debounce.ts","../src/throttle.ts","../src/batch.ts","../src/pipeline.ts","../src/poll.ts","../src/deferred.ts","../src/memo.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["// ============================================================================\n// FlowX — Types & Error Hierarchy\n// ============================================================================\n\n/** Generic async function signature */\nexport type AsyncFn<TArgs extends any[] = any[], TReturn = any> = (\n ...args: TArgs\n) => Promise<TReturn>;\n\n/** Backoff strategy for retry/poll operations */\nexport type BackoffStrategy =\n | 'fixed'\n | 'linear'\n | 'exponential'\n | ((attempt: number, delay: number) => number);\n\n// ── Error Classes ───────────────────────────────────────────────────────────\n\n/** Base error class for all FlowX errors */\nexport class FlowXError extends Error {\n public readonly code: string;\n constructor(message: string, code: string) {\n super(message);\n this.name = 'FlowXError';\n this.code = code;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** Thrown when a promise exceeds its timeout */\nexport class TimeoutError extends FlowXError {\n constructor(message = 'Operation timed out') {\n super(message, 'ERR_TIMEOUT');\n this.name = 'TimeoutError';\n }\n}\n\n/** Thrown when a circuit breaker is open */\nexport class CircuitBreakerError extends FlowXError {\n constructor(message = 'Circuit breaker is open') {\n super(message, 'ERR_CIRCUIT_OPEN');\n this.name = 'CircuitBreakerError';\n }\n}\n\n/** Thrown when a bulkhead rejects due to capacity */\nexport class BulkheadError extends FlowXError {\n constructor(message = 'Bulkhead capacity exceeded') {\n super(message, 'ERR_BULKHEAD_FULL');\n this.name = 'BulkheadError';\n }\n}\n\n/** Thrown when an operation is aborted */\nexport class AbortError extends FlowXError {\n constructor(message = 'Operation aborted') {\n super(message, 'ERR_ABORTED');\n this.name = 'AbortError';\n }\n}\n\n/** Thrown when rate limit is exceeded */\nexport class RateLimitError extends FlowXError {\n constructor(message = 'Rate limit exceeded') {\n super(message, 'ERR_RATE_LIMIT');\n this.name = 'RateLimitError';\n }\n}\n\n// ── Utility Helpers ─────────────────────────────────────────────────────────\n\n/** Sleep for the specified duration, respecting AbortSignal */\nexport function sleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n if (signal?.aborted) {\n reject(new AbortError());\n return;\n }\n\n let onAbort: (() => void) | undefined;\n\n const timer = setTimeout(() => {\n if (signal && onAbort) {\n signal.removeEventListener('abort', onAbort);\n }\n resolve();\n }, ms);\n\n if (signal) {\n onAbort = () => {\n clearTimeout(timer);\n reject(new AbortError());\n };\n signal.addEventListener('abort', onAbort, { once: true });\n }\n });\n}\n\n/** Calculate delay based on backoff strategy */\nexport function calculateDelay(\n attempt: number,\n baseDelay: number,\n strategy: BackoffStrategy,\n jitter: boolean | number = false,\n): number {\n let delay: number;\n\n if (typeof strategy === 'function') {\n delay = strategy(attempt, baseDelay);\n } else {\n switch (strategy) {\n case 'fixed':\n delay = baseDelay;\n break;\n case 'linear':\n delay = baseDelay * attempt;\n break;\n case 'exponential':\n delay = baseDelay * Math.pow(2, attempt - 1);\n break;\n }\n }\n\n if (jitter) {\n const factor = typeof jitter === 'number' ? jitter : 1;\n delay = delay * (1 - factor * 0.5 + Math.random() * factor);\n }\n\n return Math.max(0, Math.floor(delay));\n}\n","// ============================================================================\n// FlowX — Retry with Advanced Backoff Strategies\n// ============================================================================\nimport { AbortError, BackoffStrategy, calculateDelay, sleep } from './types';\n\nexport interface RetryOptions {\n /** Maximum number of retry attempts (default: 3) */\n retries?: number;\n /** Base delay in ms between retries (default: 1000) */\n delay?: number;\n /** Backoff strategy (default: 'exponential') */\n backoff?: BackoffStrategy;\n /** Add randomized jitter to delays (default: false) */\n jitter?: boolean | number;\n /** Maximum delay cap in ms (default: 30000) */\n maxDelay?: number;\n /** Custom predicate to decide if retry should happen */\n shouldRetry?: (error: Error, attempt: number) => boolean | Promise<boolean>;\n /** Callback fired before each retry */\n onRetry?: (error: Error, attempt: number) => void | Promise<void>;\n /** AbortSignal for cancellation */\n signal?: AbortSignal;\n}\n\n/**\n * Execute an async function with automatic retry and configurable backoff.\n *\n * @example\n * ```ts\n * const data = await retry(() => fetch('/api/data'), {\n * retries: 5,\n * backoff: 'exponential',\n * jitter: true,\n * });\n * ```\n */\nexport async function retry<T>(fn: () => T | Promise<T>, options?: RetryOptions): Promise<T> {\n const {\n retries = 3,\n delay = 1000,\n backoff = 'exponential',\n jitter = false,\n maxDelay = 30000,\n shouldRetry,\n onRetry,\n signal,\n } = options ?? {};\n\n if (retries < 0) {\n throw new RangeError('retries must be >= 0');\n }\n\n let lastError: Error | undefined;\n\n for (let attempt = 0; attempt <= retries; attempt++) {\n if (signal?.aborted) {\n throw new AbortError('Retry aborted');\n }\n\n try {\n const result = await fn();\n return result;\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n\n if (attempt === retries) break;\n\n if (shouldRetry) {\n const shouldContinue = await shouldRetry(lastError, attempt + 1);\n if (!shouldContinue) break;\n }\n\n if (onRetry) {\n await onRetry(lastError, attempt + 1);\n }\n\n let waitTime = calculateDelay(attempt + 1, delay, backoff, jitter);\n waitTime = Math.min(waitTime, maxDelay);\n\n await sleep(waitTime, signal);\n }\n }\n\n throw lastError!;\n}\n\n/**\n * Wrap a function to automatically retry on failure.\n *\n * @example\n * ```ts\n * const safeFetch = retryable(fetch, { retries: 3 });\n * const data = await safeFetch('/api/data');\n * ```\n */\nexport function retryable<TArgs extends any[], TReturn>(\n fn: (...args: TArgs) => Promise<TReturn>,\n options?: RetryOptions,\n): (...args: TArgs) => Promise<TReturn> {\n return (...args: TArgs) => retry(() => fn(...args), options);\n}\n","// ============================================================================\n// FlowX — Circuit Breaker Pattern\n// ============================================================================\nimport { CircuitBreakerError } from './types';\n\nexport type CircuitState = 'closed' | 'open' | 'half-open';\n\nexport interface CircuitBreakerOptions {\n /** Number of failures before opening the circuit (default: 5) */\n failureThreshold?: number;\n /** Time in ms before attempting half-open (default: 30000) */\n resetTimeout?: number;\n /** Max concurrent calls in half-open state (default: 1) */\n halfOpenLimit?: number;\n /** Custom predicate to decide if an error should count as a failure */\n shouldTrip?: (error: Error) => boolean;\n /** Callback fired on state changes */\n onStateChange?: (from: CircuitState, to: CircuitState) => void;\n /** Number of successes in half-open to close the circuit (default: 1) */\n successThreshold?: number;\n}\n\nexport interface CircuitBreaker<TArgs extends any[], TReturn> {\n /** Execute the protected function */\n fire: (...args: TArgs) => Promise<TReturn>;\n /** Get the current circuit state */\n readonly state: CircuitState;\n /** Get the current failure count */\n readonly failureCount: number;\n /** Get the current success count (in half-open) */\n readonly successCount: number;\n /** Manually reset the circuit to closed */\n reset: () => void;\n /** Manually open the circuit */\n open: () => void;\n}\n\n/**\n * Create a circuit breaker to protect against cascading failures.\n *\n * @example\n * ```ts\n * const breaker = createCircuitBreaker(callExternalApi, {\n * failureThreshold: 5,\n * resetTimeout: 30000,\n * });\n * const data = await breaker.fire('arg1');\n * ```\n */\nexport function createCircuitBreaker<TArgs extends any[], TReturn>(\n fn: (...args: TArgs) => Promise<TReturn>,\n options?: CircuitBreakerOptions,\n): CircuitBreaker<TArgs, TReturn> {\n const {\n failureThreshold = 5,\n resetTimeout = 30000,\n halfOpenLimit = 1,\n shouldTrip,\n onStateChange,\n successThreshold = 1,\n } = options ?? {};\n\n let state: CircuitState = 'closed';\n let failureCount = 0;\n let successCount = 0;\n let halfOpenActive = 0;\n let resetTimer: ReturnType<typeof setTimeout> | null = null;\n\n function transition(to: CircuitState): void {\n if (state === to) return;\n const from = state;\n state = to;\n onStateChange?.(from, to);\n }\n\n function scheduleReset(): void {\n /* istanbul ignore next -- defensive guard; timer always fires before reschedule in normal flow */\n if (resetTimer) clearTimeout(resetTimer);\n resetTimer = setTimeout(() => {\n resetTimer = null;\n transition('half-open');\n halfOpenActive = 0;\n successCount = 0;\n }, resetTimeout);\n }\n\n function reset(): void {\n if (resetTimer) {\n clearTimeout(resetTimer);\n resetTimer = null;\n }\n failureCount = 0;\n successCount = 0;\n halfOpenActive = 0;\n transition('closed');\n }\n\n function manualOpen(): void {\n if (resetTimer) {\n clearTimeout(resetTimer);\n resetTimer = null;\n }\n failureCount = 0;\n successCount = 0;\n halfOpenActive = 0;\n transition('open');\n scheduleReset();\n }\n\n async function fire(...args: TArgs): Promise<TReturn> {\n if (state === 'open') {\n throw new CircuitBreakerError();\n }\n\n if (state === 'half-open' && halfOpenActive >= halfOpenLimit) {\n throw new CircuitBreakerError('Circuit breaker is half-open — limit reached');\n }\n\n if (state === 'half-open') {\n halfOpenActive++;\n }\n\n try {\n const result = await fn(...args);\n\n if (state === 'half-open') {\n successCount++;\n halfOpenActive--;\n if (successCount >= successThreshold) {\n reset();\n }\n } else {\n // In closed state, reset failure count on success\n failureCount = 0;\n }\n\n return result;\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n\n if (shouldTrip && !shouldTrip(err)) {\n if (state === 'half-open') {\n halfOpenActive--;\n }\n throw err;\n }\n\n if (state === 'half-open') {\n halfOpenActive--;\n transition('open');\n scheduleReset();\n } else {\n failureCount++;\n if (failureCount >= failureThreshold) {\n transition('open');\n scheduleReset();\n }\n }\n\n throw err;\n }\n }\n\n return {\n fire,\n get state() {\n return state;\n },\n get failureCount() {\n return failureCount;\n },\n get successCount() {\n return successCount;\n },\n reset,\n open: manualOpen,\n };\n}\n","// ============================================================================\n// FlowX — Bulkhead Isolation Pattern\n// ============================================================================\nimport { BulkheadError } from './types';\n\nexport interface BulkheadOptions {\n /** Maximum concurrent executions (default: 10) */\n concurrency?: number;\n /** Maximum queue size for waiting tasks (default: 10) */\n queueSize?: number;\n /** Timeout in ms for queued tasks (0 = no timeout) */\n queueTimeout?: number;\n}\n\nexport interface Bulkhead {\n /** Execute a function within the bulkhead */\n execute: <T>(fn: () => Promise<T>) => Promise<T>;\n /** Current number of active executions */\n readonly active: number;\n /** Current number of queued tasks */\n readonly queued: number;\n /** Available capacity */\n readonly available: number;\n}\n\ninterface QueueItem<T = any> {\n fn: () => Promise<T>;\n resolve: (value: T) => void;\n reject: (error: Error) => void;\n timer?: ReturnType<typeof setTimeout>;\n}\n\n/**\n * Create a bulkhead to isolate concurrent operations and prevent resource exhaustion.\n *\n * @example\n * ```ts\n * const bulkhead = createBulkhead({ concurrency: 5, queueSize: 10 });\n * const data = await bulkhead.execute(() => fetch('/api'));\n * ```\n */\nexport function createBulkhead(options?: BulkheadOptions): Bulkhead {\n const { concurrency = 10, queueSize = 10, queueTimeout = 0 } = options ?? {};\n\n if (concurrency < 1) throw new RangeError('concurrency must be >= 1');\n if (queueSize < 0) throw new RangeError('queueSize must be >= 0');\n\n let active = 0;\n const queue: QueueItem[] = [];\n\n function tryDequeue(): void {\n while (queue.length > 0 && active < concurrency) {\n const item = queue.shift()!;\n if (item.timer) clearTimeout(item.timer);\n run(item);\n }\n }\n\n async function run<T>(item: QueueItem<T>): Promise<void> {\n active++;\n try {\n const value = await item.fn();\n active--;\n tryDequeue();\n item.resolve(value);\n } catch (error) {\n active--;\n tryDequeue();\n item.reject(error instanceof Error ? error : new Error(String(error)));\n }\n }\n\n function execute<T>(fn: () => Promise<T>): Promise<T> {\n if (active < concurrency) {\n return new Promise<T>((resolve, reject) => {\n run({ fn, resolve, reject });\n });\n }\n\n if (queue.length >= queueSize) {\n return Promise.reject(new BulkheadError());\n }\n\n return new Promise<T>((resolve, reject) => {\n const item: QueueItem<T> = { fn, resolve, reject };\n\n if (queueTimeout > 0) {\n item.timer = setTimeout(() => {\n const idx = queue.indexOf(item as QueueItem);\n if (idx !== -1) {\n queue.splice(idx, 1);\n reject(new BulkheadError('Bulkhead queue timeout exceeded'));\n }\n }, queueTimeout);\n }\n\n queue.push(item as QueueItem);\n });\n }\n\n return {\n execute,\n get active() {\n return active;\n },\n get queued() {\n return queue.length;\n },\n get available() {\n return Math.max(0, concurrency - active);\n },\n };\n}\n","// ============================================================================\n// FlowX — Fallback Chain\n// ============================================================================\n\nexport interface FallbackOptions {\n /** Predicate to determine if the error warrants a fallback */\n shouldFallback?: (error: Error) => boolean;\n /** Callback fired when the primary function fails and fallback is used */\n onFallback?: (error: Error, fallbackIndex: number) => void;\n}\n\n/**\n * Execute a function with a fallback value or function if it fails.\n *\n * @example\n * ```ts\n * const data = await withFallback(\n * () => fetch('/primary-api'),\n * 'default-value',\n * );\n * ```\n */\nexport async function withFallback<T>(\n fn: () => T | Promise<T>,\n fallback: T | (() => T | Promise<T>),\n options?: FallbackOptions,\n): Promise<T> {\n try {\n return await fn();\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n\n if (options?.shouldFallback && !options.shouldFallback(err)) {\n throw err;\n }\n\n options?.onFallback?.(err, 0);\n\n if (typeof fallback === 'function') {\n return await (fallback as () => T | Promise<T>)();\n }\n return fallback;\n }\n}\n\n/**\n * Execute the first successful function from a chain of fallbacks.\n *\n * @example\n * ```ts\n * const data = await fallbackChain([\n * () => fetch('/primary'),\n * () => fetch('/secondary'),\n * () => fetch('/tertiary'),\n * ]);\n * ```\n */\nexport async function fallbackChain<T>(\n fns: Array<() => T | Promise<T>>,\n options?: FallbackOptions,\n): Promise<T> {\n if (fns.length === 0) {\n throw new Error('fallbackChain requires at least one function');\n }\n\n let lastError: Error | undefined;\n\n for (let i = 0; i < fns.length; i++) {\n try {\n return await fns[i]();\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n\n if (options?.shouldFallback && !options.shouldFallback(lastError)) {\n throw lastError;\n }\n\n if (i < fns.length - 1) {\n options?.onFallback?.(lastError, i + 1);\n }\n }\n }\n\n throw lastError!;\n}\n","// ============================================================================\n// FlowX — Hedged Requests\n// ============================================================================\n\nexport interface HedgeOptions {\n /** Delay in ms before launching the hedge request (default: 500) */\n delay?: number;\n /** Maximum number of parallel hedged calls (default: 1) */\n maxHedges?: number;\n}\n\n/**\n * Execute a function with hedged requests — if the primary doesn't respond\n * quickly enough, fire parallel redundant calls and return whichever resolves first.\n *\n * @example\n * ```ts\n * const data = await hedge(() => fetch('/api'), { delay: 200 });\n * ```\n */\nexport function hedge<T>(fn: () => Promise<T>, options?: HedgeOptions): Promise<T> {\n const { delay = 500, maxHedges = 1 } = options ?? {};\n\n if (delay < 0) throw new RangeError('delay must be >= 0');\n if (maxHedges < 1) throw new RangeError('maxHedges must be >= 1');\n\n return new Promise<T>((resolve, reject) => {\n let settled = false;\n let completedCount = 0;\n const totalAttempts = 1 + maxHedges;\n const errors: Error[] = [];\n const timers: ReturnType<typeof setTimeout>[] = [];\n\n function onResult(value: T): void {\n if (settled) return;\n settled = true;\n // Clear pending hedge timers\n for (const t of timers) clearTimeout(t);\n resolve(value);\n }\n\n function onError(error: Error): void {\n errors.push(error);\n completedCount++;\n if (completedCount >= totalAttempts && !settled) {\n settled = true;\n reject(errors[0]);\n }\n }\n\n // Launch primary request immediately\n fn().then(onResult, (err) => onError(err instanceof Error ? err : new Error(String(err))));\n\n // Launch hedged requests after delay\n for (let i = 0; i < maxHedges; i++) {\n const timer = setTimeout(\n () => {\n /* istanbul ignore if -- timer is always cleared by onResult before firing */\n if (settled) return;\n fn().then(onResult, (err) =>\n onError(err instanceof Error ? err : new Error(String(err))),\n );\n },\n delay * (i + 1),\n );\n timers.push(timer);\n }\n });\n}\n","// ============================================================================\n// FlowX — Counting Semaphore\n// ============================================================================\n\nexport interface Semaphore {\n /** Acquire a permit. Returns a release function. */\n acquire: () => Promise<() => void>;\n /** Execute a function exclusively within the semaphore */\n runExclusive: <T>(fn: () => T | Promise<T>) => Promise<T>;\n /** Number of available permits */\n readonly available: number;\n /** Number of tasks waiting for a permit */\n readonly waiting: number;\n}\n\ninterface Waiter {\n resolve: (release: () => void) => void;\n}\n\n/**\n * Create a counting semaphore for concurrency control.\n *\n * @example\n * ```ts\n * const sem = createSemaphore(3);\n * const release = await sem.acquire();\n * try {\n * await doWork();\n * } finally {\n * release();\n * }\n * ```\n */\nexport function createSemaphore(permits: number): Semaphore {\n if (permits < 1) throw new RangeError('permits must be >= 1');\n\n let available = permits;\n const waiters: Waiter[] = [];\n\n function release(): void {\n available++;\n if (waiters.length > 0) {\n available--;\n const next = waiters.shift()!;\n next.resolve(release);\n }\n }\n\n function acquire(): Promise<() => void> {\n if (available > 0) {\n available--;\n return Promise.resolve(release);\n }\n\n return new Promise<() => void>((resolve) => {\n waiters.push({ resolve });\n });\n }\n\n async function runExclusive<T>(fn: () => T | Promise<T>): Promise<T> {\n const releaseFn = await acquire();\n try {\n return await fn();\n } finally {\n releaseFn();\n }\n }\n\n return {\n acquire,\n runExclusive,\n get available() {\n return available;\n },\n get waiting() {\n return waiters.length;\n },\n };\n}\n","// ============================================================================\n// FlowX — Mutual Exclusion Lock\n// ============================================================================\n\nexport interface Mutex {\n /** Acquire the lock. Returns a release function. */\n lock: () => Promise<() => void>;\n /** Execute a function exclusively under the mutex */\n runExclusive: <T>(fn: () => T | Promise<T>) => Promise<T>;\n /** Whether the mutex is currently locked */\n readonly isLocked: boolean;\n /** Number of tasks waiting for the lock */\n readonly waiting: number;\n}\n\n/**\n * Create a mutual exclusion lock for serializing async operations.\n *\n * @example\n * ```ts\n * const mutex = createMutex();\n * await mutex.runExclusive(async () => {\n * await updateSharedResource();\n * });\n * ```\n */\nexport function createMutex(): Mutex {\n let locked = false;\n const waitQueue: Array<(release: () => void) => void> = [];\n\n function release(): void {\n if (waitQueue.length > 0) {\n const next = waitQueue.shift()!;\n // Stay locked, transfer to next waiter\n next(release);\n } else {\n locked = false;\n }\n }\n\n function lock(): Promise<() => void> {\n if (!locked) {\n locked = true;\n return Promise.resolve(release);\n }\n\n return new Promise<() => void>((resolve) => {\n waitQueue.push(resolve);\n });\n }\n\n async function runExclusive<T>(fn: () => T | Promise<T>): Promise<T> {\n const releaseFn = await lock();\n try {\n return await fn();\n } finally {\n releaseFn();\n }\n }\n\n return {\n lock,\n runExclusive,\n get isLocked() {\n return locked;\n },\n get waiting() {\n return waitQueue.length;\n },\n };\n}\n","// ============================================================================\n// FlowX — Priority Async Queue\n// ============================================================================\n\nexport interface QueueOptions {\n /** Maximum concurrent tasks (default: 1) */\n concurrency?: number;\n /** Start processing immediately (default: true) */\n autoStart?: boolean;\n /** Per-task timeout in ms (0 = no timeout) */\n timeout?: number;\n}\n\nexport interface QueueAddOptions {\n /** Task priority — lower number = higher priority (default: 0) */\n priority?: number;\n}\n\nexport interface AsyncQueue {\n /** Add a task to the queue */\n add: <T>(fn: () => Promise<T>, options?: QueueAddOptions) => Promise<T>;\n /** Add multiple tasks and return all results */\n addAll: <T>(fns: Array<() => Promise<T>>, options?: QueueAddOptions) => Promise<T[]>;\n /** Pause processing */\n pause: () => void;\n /** Resume processing */\n resume: () => void;\n /** Clear all pending tasks */\n clear: () => void;\n /** Wait until the queue is empty */\n onEmpty: () => Promise<void>;\n /** Wait until the queue is idle (empty + no active tasks) */\n onIdle: () => Promise<void>;\n /** Number of pending tasks */\n readonly size: number;\n /** Number of active tasks */\n readonly pending: number;\n /** Whether the queue is paused */\n readonly isPaused: boolean;\n}\n\ninterface QueueEntry {\n fn: () => Promise<any>;\n priority: number;\n resolve: (value: any) => void;\n reject: (error: Error) => void;\n}\n\n/**\n * Create a priority async queue with concurrency control.\n *\n * @example\n * ```ts\n * const queue = createQueue({ concurrency: 3 });\n * const result = await queue.add(() => fetch('/api'), { priority: 1 });\n * await queue.onIdle();\n * ```\n */\nexport function createQueue(options?: QueueOptions): AsyncQueue {\n const { concurrency = 1, autoStart = true, timeout = 0 } = options ?? {};\n\n if (concurrency < 1) throw new RangeError('concurrency must be >= 1');\n\n let paused = !autoStart;\n let active = 0;\n const entries: QueueEntry[] = [];\n const emptyCallbacks: Array<() => void> = [];\n const idleCallbacks: Array<() => void> = [];\n\n function notifyIdle(): void {\n if (active === 0 && entries.length === 0) {\n for (const cb of idleCallbacks.splice(0)) cb();\n }\n }\n\n function notifyEmpty(): void {\n if (entries.length === 0) {\n for (const cb of emptyCallbacks.splice(0)) cb();\n }\n }\n\n function tryRun(): void {\n if (paused) return;\n\n while (active < concurrency && entries.length > 0) {\n const entry = entries.shift()!;\n active++;\n\n let timer: ReturnType<typeof setTimeout> | undefined;\n\n const run = async () => {\n try {\n let result: any;\n if (timeout > 0) {\n result = await Promise.race([\n entry.fn(),\n new Promise<never>((_, rej) => {\n timer = setTimeout(() => rej(new Error('Queue task timeout')), timeout);\n }),\n ]);\n } else {\n result = await entry.fn();\n }\n if (timer) clearTimeout(timer);\n entry.resolve(result);\n } catch (error) {\n if (timer) clearTimeout(timer);\n entry.reject(error instanceof Error ? error : new Error(String(error)));\n } finally {\n active--;\n notifyEmpty();\n tryRun();\n notifyIdle();\n }\n };\n\n run();\n }\n\n notifyEmpty();\n notifyIdle();\n }\n\n function add<T>(fn: () => Promise<T>, addOptions?: QueueAddOptions): Promise<T> {\n const priority = addOptions?.priority ?? 0;\n\n return new Promise<T>((resolve, reject) => {\n const entry: QueueEntry = { fn, priority, resolve, reject };\n\n // Insert sorted by priority (lower = higher priority)\n let inserted = false;\n for (let i = 0; i < entries.length; i++) {\n if (priority < entries[i].priority) {\n entries.splice(i, 0, entry);\n inserted = true;\n break;\n }\n }\n if (!inserted) {\n entries.push(entry);\n }\n\n tryRun();\n });\n }\n\n function addAll<T>(fns: Array<() => Promise<T>>, addOptions?: QueueAddOptions): Promise<T[]> {\n return Promise.all(fns.map((fn) => add(fn, addOptions)));\n }\n\n function pause(): void {\n paused = true;\n }\n\n function resume(): void {\n paused = false;\n tryRun();\n }\n\n function clear(): void {\n for (const entry of entries.splice(0)) {\n entry.reject(new Error('Queue cleared'));\n }\n }\n\n function onEmpty(): Promise<void> {\n if (entries.length === 0) return Promise.resolve();\n return new Promise<void>((resolve) => emptyCallbacks.push(resolve));\n }\n\n function onIdle(): Promise<void> {\n if (active === 0 && entries.length === 0) return Promise.resolve();\n return new Promise<void>((resolve) => idleCallbacks.push(resolve));\n }\n\n return {\n add,\n addAll,\n pause,\n resume,\n clear,\n onEmpty,\n onIdle,\n get size() {\n return entries.length;\n },\n get pending() {\n return active;\n },\n get isPaused() {\n return paused;\n },\n };\n}\n","// ============================================================================\n// FlowX — Token Bucket Rate Limiter\n// ============================================================================\nimport { RateLimitError } from './types';\n\nexport interface RateLimitOptions {\n /** Maximum number of executions per interval */\n limit: number;\n /** Time window in ms */\n interval: number;\n /** Whether to reject or queue when limit is exceeded (default: 'queue') */\n strategy?: 'queue' | 'reject';\n}\n\nexport interface RateLimiter {\n /** Execute a function within the rate limit */\n execute: <T>(fn: () => T | Promise<T>) => Promise<T>;\n /** Reset the rate limiter state */\n reset: () => void;\n /** Number of remaining tokens in current window */\n readonly remaining: number;\n}\n\n/**\n * Create a rate limiter using the token bucket algorithm.\n *\n * @example\n * ```ts\n * const limiter = createRateLimiter({ limit: 10, interval: 1000 });\n * await limiter.execute(() => fetch('/api'));\n * ```\n */\nexport function createRateLimiter(options: RateLimitOptions): RateLimiter {\n const { limit, interval, strategy = 'queue' } = options;\n\n if (limit < 1) throw new RangeError('limit must be >= 1');\n if (interval < 1) throw new RangeError('interval must be >= 1');\n\n let tokens = limit;\n let lastRefill = Date.now();\n const queue: Array<{ resolve: () => void }> = [];\n let drainTimer: ReturnType<typeof setTimeout> | null = null;\n\n function refill(): void {\n const now = Date.now();\n const elapsed = now - lastRefill;\n const refillCount = Math.floor(elapsed / interval) * limit;\n\n if (refillCount > 0) {\n tokens = Math.min(limit, tokens + refillCount);\n lastRefill = now;\n }\n }\n\n function drainQueue(): void {\n refill();\n while (queue.length > 0 && tokens > 0) {\n tokens--;\n const item = queue.shift()!;\n item.resolve();\n }\n\n if (queue.length > 0) {\n scheduleDrain();\n } else {\n drainTimer = null;\n }\n }\n\n function scheduleDrain(): void {\n if (drainTimer) return;\n const timeToNextToken = interval / limit;\n drainTimer = setTimeout(() => {\n drainTimer = null;\n drainQueue();\n }, timeToNextToken);\n }\n\n async function execute<T>(fn: () => T | Promise<T>): Promise<T> {\n refill();\n\n if (tokens > 0) {\n tokens--;\n return await fn();\n }\n\n if (strategy === 'reject') {\n throw new RateLimitError();\n }\n\n // Queue strategy — wait for a token\n await new Promise<void>((resolve) => {\n queue.push({ resolve });\n scheduleDrain();\n });\n\n return await fn();\n }\n\n function reset(): void {\n tokens = limit;\n lastRefill = Date.now();\n if (drainTimer) {\n clearTimeout(drainTimer);\n drainTimer = null;\n }\n drainQueue();\n }\n\n return {\n execute,\n reset,\n get remaining() {\n refill();\n return tokens;\n },\n };\n}\n","// ============================================================================\n// FlowX — Promise Timeout with Cleanup\n// ============================================================================\nimport { AbortError, TimeoutError } from './types';\n\nexport interface TimeoutOptions<T = unknown> {\n /** Fallback value or factory when timeout occurs */\n fallback?: T | (() => T | Promise<T>);\n /** AbortSignal for external cancellation */\n signal?: AbortSignal;\n /** Custom error message */\n message?: string;\n}\n\n/**\n * Wrap an async operation with a timeout.\n *\n * @example\n * ```ts\n * const result = await withTimeout(() => fetch('/slow-api'), 5000);\n * ```\n */\nexport async function withTimeout<T>(\n fn: () => T | Promise<T>,\n ms: number,\n options?: TimeoutOptions<T>,\n): Promise<T> {\n if (ms <= 0) {\n throw new RangeError('Timeout must be > 0');\n }\n\n if (options?.signal?.aborted) {\n throw new AbortError();\n }\n\n const fnResult = fn(); // call synchronously so sync throws propagate\n\n return Promise.race([\n Promise.resolve(fnResult),\n new Promise<T>((_, reject) => {\n const timer = setTimeout(() => {\n if (options?.fallback !== undefined) {\n const fb = options.fallback;\n if (typeof fb === 'function') {\n try {\n const result = (fb as () => T | Promise<T>)();\n Promise.resolve(result).then(\n (v) => reject({ __resolved: true, value: v } as any),\n reject,\n );\n } catch (err) {\n reject(err);\n }\n } else {\n reject({ __resolved: true, value: fb } as any);\n }\n } else {\n reject(new TimeoutError(options?.message));\n }\n }, ms);\n\n // If signal aborts, reject the race\n if (options?.signal) {\n const onAbort = () => {\n clearTimeout(timer);\n reject(new AbortError());\n };\n options.signal.addEventListener('abort', onAbort, { once: true });\n }\n\n // Clean up timer when fn resolves\n Promise.resolve(fnResult).then(\n () => clearTimeout(timer),\n () => clearTimeout(timer),\n );\n }),\n ]).catch((err) => {\n // Handle the fallback resolution hack\n if (err && typeof err === 'object' && '__resolved' in err) {\n return err.value as T;\n }\n throw err;\n });\n}\n","// ============================================================================\n// FlowX — Async-Aware Debounce\n// ============================================================================\n\nexport interface DebounceOptions {\n /** Invoke on the leading edge (default: false) */\n leading?: boolean;\n /** Invoke on the trailing edge (default: true) */\n trailing?: boolean;\n /** Maximum wait time before forced invocation in ms */\n maxWait?: number;\n}\n\nexport interface DebouncedFunction<TArgs extends any[], TReturn> {\n /** Call the debounced function */\n (...args: TArgs): Promise<TReturn>;\n /** Cancel any pending invocation */\n cancel: () => void;\n /** Immediately invoke any pending call */\n flush: () => Promise<TReturn | undefined>;\n /** Whether there is a pending invocation */\n readonly pending: boolean;\n}\n\n/**\n * Create a debounced version of an async function.\n *\n * @example\n * ```ts\n * const debouncedSearch = debounce(searchApi, 300);\n * await debouncedSearch('query');\n * ```\n */\nexport function debounce<TArgs extends any[], TReturn>(\n fn: (...args: TArgs) => TReturn | Promise<TReturn>,\n wait: number,\n options?: DebounceOptions,\n): DebouncedFunction<TArgs, TReturn> {\n const { leading = false, trailing = true, maxWait } = options ?? {};\n\n if (wait < 0) throw new RangeError('wait must be >= 0');\n\n let timer: ReturnType<typeof setTimeout> | null = null;\n let maxTimer: ReturnType<typeof setTimeout> | null = null;\n let lastArgs: TArgs | null = null;\n const pendingResolvers: Array<{\n resolve: (value: TReturn) => void;\n reject: (error: Error) => void;\n }> = [];\n let isPending = false;\n\n async function invoke(): Promise<void> {\n const args = lastArgs!;\n const resolvers = pendingResolvers.splice(0);\n lastArgs = null;\n isPending = false;\n\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n if (maxTimer) {\n clearTimeout(maxTimer);\n maxTimer = null;\n }\n\n try {\n const result = await fn(...args);\n for (const r of resolvers) r.resolve(result);\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n for (const r of resolvers) r.reject(err);\n }\n }\n\n function debounced(...args: TArgs): Promise<TReturn> {\n lastArgs = args;\n\n return new Promise<TReturn>((resolve, reject) => {\n pendingResolvers.push({ resolve, reject });\n\n // Leading edge\n if (leading && !isPending) {\n isPending = true;\n invoke();\n return;\n }\n\n isPending = true;\n\n // Reset trailing timer\n if (timer) clearTimeout(timer);\n\n if (trailing) {\n timer = setTimeout(() => {\n timer = null;\n invoke();\n }, wait);\n }\n\n // Set max wait timer\n if (maxWait !== undefined && !maxTimer) {\n maxTimer = setTimeout(() => {\n maxTimer = null;\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n invoke();\n }, maxWait);\n }\n });\n }\n\n debounced.cancel = (): void => {\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n if (maxTimer) {\n clearTimeout(maxTimer);\n maxTimer = null;\n }\n lastArgs = null;\n isPending = false;\n // Reject all pending resolvers\n const resolvers = pendingResolvers.splice(0);\n for (const r of resolvers) {\n r.reject(new Error('Debounced call cancelled'));\n }\n };\n\n debounced.flush = async (): Promise<TReturn | undefined> => {\n if (!isPending) return undefined;\n const promise = new Promise<TReturn>((resolve, reject) => {\n pendingResolvers.push({ resolve, reject });\n });\n await invoke();\n return promise;\n };\n\n Object.defineProperty(debounced, 'pending', {\n get() {\n return isPending;\n },\n });\n\n return debounced as DebouncedFunction<TArgs, TReturn>;\n}\n","// ============================================================================\n// FlowX — Async-Aware Throttle\n// ============================================================================\n\nexport interface ThrottleOptions {\n /** Invoke on the leading edge (default: true) */\n leading?: boolean;\n /** Invoke on the trailing edge (default: true) */\n trailing?: boolean;\n}\n\nexport interface ThrottledFunction<TArgs extends any[], TReturn> {\n (...args: TArgs): Promise<TReturn>;\n /** Cancel any pending trailing invocation */\n cancel: () => void;\n /** Whether there is a pending trailing invocation */\n readonly pending: boolean;\n}\n\n/**\n * Create a throttled version of an async function.\n *\n * @example\n * ```ts\n * const throttledSave = throttle(saveData, 1000);\n * await throttledSave(data);\n * ```\n */\nexport function throttle<TArgs extends any[], TReturn>(\n fn: (...args: TArgs) => TReturn | Promise<TReturn>,\n wait: number,\n options?: ThrottleOptions,\n): ThrottledFunction<TArgs, TReturn> {\n const { leading = true, trailing = true } = options ?? {};\n\n if (wait < 0) throw new RangeError('wait must be >= 0');\n\n let lastCallTime: number | null = null;\n let timer: ReturnType<typeof setTimeout> | null = null;\n let lastArgs: TArgs | null = null;\n let isPending = false;\n const trailingResolvers: Array<{\n resolve: (value: TReturn) => void;\n reject: (error: Error) => void;\n }> = [];\n\n async function invokeTrailing(): Promise<void> {\n const args = lastArgs;\n const resolvers = trailingResolvers.splice(0);\n lastArgs = null;\n isPending = false;\n timer = null;\n\n if (!args) {\n /* istanbul ignore next -- resolvers is always empty here; lastArgs cleared before trailing fires */\n for (const r of resolvers) r.resolve(undefined as TReturn);\n return;\n }\n\n try {\n const result = await fn(...args);\n for (const r of resolvers) r.resolve(result);\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n for (const r of resolvers) r.reject(err);\n }\n }\n\n function throttled(...args: TArgs): Promise<TReturn> {\n const now = Date.now();\n lastArgs = args;\n\n const timeSinceLastCall = lastCallTime === null ? wait : now - lastCallTime;\n const shouldCallLeading = leading && timeSinceLastCall >= wait;\n\n if (shouldCallLeading) {\n lastCallTime = now;\n lastArgs = null;\n\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n\n // Resolve any pending trailing resolvers with this call's result\n const prevResolvers = trailingResolvers.splice(0);\n\n const resultPromise = (async () => {\n try {\n const result = await fn(...args);\n for (const r of prevResolvers) r.resolve(result);\n return result;\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n /* istanbul ignore next -- prevResolvers is always empty on leading calls in normal flow */\n for (const r of prevResolvers) r.reject(err);\n throw err;\n }\n })();\n\n if (trailing) {\n timer = setTimeout(() => {\n lastCallTime = Date.now();\n invokeTrailing();\n }, wait);\n }\n\n return resultPromise;\n }\n\n // Schedule trailing call\n isPending = true;\n\n return new Promise<TReturn>((resolve, reject) => {\n trailingResolvers.push({ resolve, reject });\n\n if (!timer && trailing) {\n const remaining = wait - timeSinceLastCall;\n timer = setTimeout(() => {\n lastCallTime = Date.now();\n invokeTrailing();\n }, remaining);\n }\n });\n }\n\n throttled.cancel = (): void => {\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n lastArgs = null;\n lastCallTime = null;\n isPending = false;\n const resolvers = trailingResolvers.splice(0);\n for (const r of resolvers) {\n r.reject(new Error('Throttled call cancelled'));\n }\n };\n\n Object.defineProperty(throttled, 'pending', {\n get() {\n return isPending;\n },\n });\n\n return throttled as ThrottledFunction<TArgs, TReturn>;\n}\n","// ============================================================================\n// FlowX — Batch Processing with Concurrency\n// ============================================================================\nimport { AbortError } from './types';\n\nexport interface BatchOptions {\n /** Maximum concurrent batch operations (default: Infinity) */\n concurrency?: number;\n /** Number of items per batch (default: 1) */\n batchSize?: number;\n /** Progress callback */\n onProgress?: (completed: number, total: number) => void;\n /** AbortSignal for cancellation */\n signal?: AbortSignal;\n}\n\nexport interface BatchResult<T> {\n /** All results in order */\n results: T[];\n /** Total items processed */\n total: number;\n /** Number of succeeded items */\n succeeded: number;\n /** Number of failed items */\n failed: number;\n /** Errors indexed by position */\n errors: Map<number, Error>;\n}\n\n/**\n * Process an array of items in batches with concurrency control.\n *\n * @example\n * ```ts\n * const results = await batch(\n * urls,\n * async (url) => fetch(url).then(r => r.json()),\n * { concurrency: 5, batchSize: 10 },\n * );\n * ```\n */\nexport async function batch<TItem, TResult>(\n items: TItem[],\n fn: (item: TItem, index: number) => Promise<TResult>,\n options?: BatchOptions,\n): Promise<BatchResult<TResult>> {\n const { concurrency = Infinity, batchSize = 1, onProgress, signal } = options ?? {};\n\n if (batchSize < 1) throw new RangeError('batchSize must be >= 1');\n if (concurrency < 1) throw new RangeError('concurrency must be >= 1');\n\n const results: TResult[] = new Array(items.length);\n const errors = new Map<number, Error>();\n let completed = 0;\n let succeeded = 0;\n let failed = 0;\n\n // Split items into batches\n const batches: Array<{ items: TItem[]; startIndex: number }> = [];\n for (let i = 0; i < items.length; i += batchSize) {\n batches.push({\n items: items.slice(i, i + batchSize),\n startIndex: i,\n });\n }\n\n // Process batches with concurrency control\n let batchIndex = 0;\n\n async function processBatch(): Promise<void> {\n while (batchIndex < batches.length) {\n if (signal?.aborted) throw new AbortError();\n\n const currentBatch = batches[batchIndex++];\n\n for (let i = 0; i < currentBatch.items.length; i++) {\n if (signal?.aborted) throw new AbortError();\n\n const globalIndex = currentBatch.startIndex + i;\n try {\n results[globalIndex] = await fn(currentBatch.items[i], globalIndex);\n succeeded++;\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n errors.set(globalIndex, err);\n results[globalIndex] = undefined as TResult;\n failed++;\n }\n completed++;\n onProgress?.(completed, items.length);\n }\n }\n }\n\n const workers: Promise<void>[] = [];\n const workerCount = Math.min(concurrency, batches.length);\n\n for (let i = 0; i < workerCount; i++) {\n workers.push(processBatch());\n }\n\n await Promise.all(workers);\n\n return {\n results,\n total: items.length,\n succeeded,\n failed,\n errors,\n };\n}\n","// ============================================================================\n// FlowX — Async Pipeline Composition\n// ============================================================================\n\n/** A step in the pipeline */\nexport type PipelineStep<TIn, TOut> = (input: TIn) => TOut | Promise<TOut>;\n\n/**\n * Compose multiple async functions into a single pipeline.\n *\n * @example\n * ```ts\n * const process = pipeline(\n * (x: number) => x * 2,\n * (x: number) => x + 1,\n * (x: number) => String(x),\n * );\n * const result = await process(5); // \"11\"\n * ```\n */\nexport function pipeline<A, B>(s1: PipelineStep<A, B>): (input: A) => Promise<B>;\nexport function pipeline<A, B, C>(\n s1: PipelineStep<A, B>,\n s2: PipelineStep<B, C>,\n): (input: A) => Promise<C>;\nexport function pipeline<A, B, C, D>(\n s1: PipelineStep<A, B>,\n s2: PipelineStep<B, C>,\n s3: PipelineStep<C, D>,\n): (input: A) => Promise<D>;\nexport function pipeline<A, B, C, D, E>(\n s1: PipelineStep<A, B>,\n s2: PipelineStep<B, C>,\n s3: PipelineStep<C, D>,\n s4: PipelineStep<D, E>,\n): (input: A) => Promise<E>;\nexport function pipeline<A, B, C, D, E, F>(\n s1: PipelineStep<A, B>,\n s2: PipelineStep<B, C>,\n s3: PipelineStep<C, D>,\n s4: PipelineStep<D, E>,\n s5: PipelineStep<E, F>,\n): (input: A) => Promise<F>;\nexport function pipeline(...steps: Array<PipelineStep<any, any>>): (input: any) => Promise<any>;\nexport function pipeline(...steps: Array<PipelineStep<any, any>>): (input: any) => Promise<any> {\n if (steps.length === 0) {\n throw new Error('pipeline requires at least one step');\n }\n\n return async (input: any) => {\n let current = input;\n for (const step of steps) {\n current = await step(current);\n }\n return current;\n };\n}\n\n/**\n * Execute a value through a series of async transformation steps.\n *\n * @example\n * ```ts\n * const result = await pipe(\n * 5,\n * (x) => x * 2,\n * (x) => x + 1,\n * (x) => String(x),\n * ); // \"11\"\n * ```\n */\nexport async function pipe<A, B>(input: A, s1: PipelineStep<A, B>): Promise<B>;\nexport async function pipe<A, B, C>(\n input: A,\n s1: PipelineStep<A, B>,\n s2: PipelineStep<B, C>,\n): Promise<C>;\nexport async function pipe<A, B, C, D>(\n input: A,\n s1: PipelineStep<A, B>,\n s2: PipelineStep<B, C>,\n s3: PipelineStep<C, D>,\n): Promise<D>;\nexport async function pipe<A, B, C, D, E>(\n input: A,\n s1: PipelineStep<A, B>,\n s2: PipelineStep<B, C>,\n s3: PipelineStep<C, D>,\n s4: PipelineStep<D, E>,\n): Promise<E>;\nexport async function pipe<A, B, C, D, E, F>(\n input: A,\n s1: PipelineStep<A, B>,\n s2: PipelineStep<B, C>,\n s3: PipelineStep<C, D>,\n s4: PipelineStep<D, E>,\n s5: PipelineStep<E, F>,\n): Promise<F>;\nexport async function pipe(input: any, ...steps: Array<PipelineStep<any, any>>): Promise<any>;\nexport async function pipe(input: any, ...steps: Array<PipelineStep<any, any>>): Promise<any> {\n if (steps.length === 0) {\n throw new Error('pipe requires at least one step');\n }\n\n let current = input;\n for (const step of steps) {\n current = await step(current);\n }\n return current;\n}\n","// ============================================================================\n// FlowX — Polling with Backoff\n// ============================================================================\nimport { AbortError, BackoffStrategy, calculateDelay, sleep } from './types';\n\nexport interface PollOptions<T> {\n /** Polling interval in ms (default: 1000) */\n interval?: number;\n /** Condition to stop polling — return true to resolve */\n until?: (result: T) => boolean;\n /** Maximum number of poll attempts (default: Infinity) */\n maxAttempts?: number;\n /** Backoff strategy for interval (default: 'fixed') */\n backoff?: BackoffStrategy;\n /** AbortSignal for cancellation */\n signal?: AbortSignal;\n}\n\nexport interface PollController<T> {\n /** Promise that resolves with the final result */\n result: Promise<T>;\n /** Stop polling early */\n stop: () => void;\n}\n\n/**\n * Poll an async function until a condition is met.\n *\n * @example\n * ```ts\n * const { result } = poll(\n * () => checkJobStatus(jobId),\n * { until: (status) => status === 'done', interval: 2000 },\n * );\n * const finalStatus = await result;\n * ```\n */\nexport function poll<T>(fn: () => T | Promise<T>, options?: PollOptions<T>): PollController<T> {\n const {\n interval = 1000,\n until,\n maxAttempts = Infinity,\n backoff = 'fixed',\n signal,\n } = options ?? {};\n\n if (interval < 0) throw new RangeError('interval must be >= 0');\n\n let stopped = false;\n let rejectFn: ((error: Error) => void) | null = null;\n\n const result = (async (): Promise<T> => {\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n if (stopped || signal?.aborted) {\n throw new AbortError('Polling stopped');\n }\n\n const value = await fn();\n\n if (until ? until(value) : true) {\n return value;\n }\n\n if (attempt < maxAttempts) {\n const waitTime = calculateDelay(attempt, interval, backoff);\n await sleep(waitTime, signal).catch((err) => {\n /* istanbul ignore if -- stop() doesn't abort sleep; this is a defensive guard */\n if (stopped) throw new AbortError('Polling stopped');\n throw err;\n });\n }\n }\n\n throw new Error('Polling exceeded maximum attempts');\n })();\n\n // Capture the reject function for external stopping\n const wrappedResult = new Promise<T>((resolve, reject) => {\n rejectFn = reject;\n result.then(resolve, reject);\n });\n\n function stop(): void {\n stopped = true;\n rejectFn?.(new AbortError('Polling stopped'));\n }\n\n return {\n result: wrappedResult,\n stop,\n };\n}\n","// ============================================================================\n// FlowX — Deferred Promise\n// ============================================================================\n\nexport interface Deferred<T> {\n /** The underlying promise */\n promise: Promise<T>;\n /** Resolve the deferred */\n resolve: (value: T | PromiseLike<T>) => void;\n /** Reject the deferred */\n reject: (reason?: any) => void;\n /** Whether the deferred has been settled */\n readonly isSettled: boolean;\n /** Whether the deferred was resolved */\n readonly isResolved: boolean;\n /** Whether the deferred was rejected */\n readonly isRejected: boolean;\n}\n\n/**\n * Create a deferred promise — a promise whose resolve/reject are externally accessible.\n *\n * @example\n * ```ts\n * const deferred = createDeferred<string>();\n * setTimeout(() => deferred.resolve('done'), 1000);\n * const result = await deferred.promise; // 'done'\n * ```\n */\nexport function createDeferred<T = void>(): Deferred<T> {\n let isSettled = false;\n let isResolved = false;\n let isRejected = false;\n let resolveFn!: (value: T | PromiseLike<T>) => void;\n let rejectFn!: (reason?: any) => void;\n\n const promise = new Promise<T>((resolve, reject) => {\n resolveFn = resolve;\n rejectFn = reject;\n });\n\n return {\n promise,\n resolve: (value: T | PromiseLike<T>) => {\n if (isSettled) return;\n isSettled = true;\n isResolved = true;\n resolveFn(value);\n },\n reject: (reason?: any) => {\n if (isSettled) return;\n isSettled = true;\n isRejected = true;\n rejectFn(reason);\n },\n get isSettled() {\n return isSettled;\n },\n get isResolved() {\n return isResolved;\n },\n get isRejected() {\n return isRejected;\n },\n };\n}\n","// ============================================================================\n// FlowX — Async Memoization with TTL\n// ============================================================================\n\nexport interface MemoOptions<TArgs extends any[]> {\n /** Time-to-live for cached results in ms (0 = forever) */\n ttl?: number;\n /** Maximum cache size (0 = unlimited) */\n maxSize?: number;\n /** Custom cache key generator */\n keyFn?: (...args: TArgs) => string;\n /** Whether to cache rejections (default: false) */\n cacheErrors?: boolean;\n}\n\nexport interface MemoizedFunction<TArgs extends any[], TReturn> {\n (...args: TArgs): Promise<TReturn>;\n /** Clear the entire cache */\n clear: () => void;\n /** Delete a specific cache entry */\n delete: (...args: TArgs) => boolean;\n /** Current cache size */\n readonly size: number;\n}\n\ninterface CacheEntry<T> {\n value: T;\n timestamp: number;\n isError: boolean;\n}\n\n/**\n * Create a memoized version of an async function with TTL and LRU eviction.\n *\n * @example\n * ```ts\n * const cachedFetch = memo(fetchUser, {\n * ttl: 60_000,\n * maxSize: 100,\n * keyFn: (id) => String(id),\n * });\n * const user = await cachedFetch(42);\n * ```\n */\nexport function memo<TArgs extends any[], TReturn>(\n fn: (...args: TArgs) => Promise<TReturn>,\n options?: MemoOptions<TArgs>,\n): MemoizedFunction<TArgs, TReturn> {\n const {\n ttl = 0,\n maxSize = 0,\n keyFn = (...args: TArgs) => JSON.stringify(args),\n cacheErrors = false,\n } = options ?? {};\n\n const cache = new Map<string, CacheEntry<TReturn>>();\n const pending = new Map<string, Promise<TReturn>>();\n\n function isExpired(entry: CacheEntry<TReturn>): boolean {\n if (ttl <= 0) return false;\n return Date.now() - entry.timestamp > ttl;\n }\n\n function evict(): void {\n if (maxSize <= 0 || cache.size < maxSize) return;\n // Remove the oldest entry (first key in Map insertion order)\n const firstKey = cache.keys().next().value;\n if (firstKey !== undefined) {\n cache.delete(firstKey);\n }\n }\n\n async function memoized(...args: TArgs): Promise<TReturn> {\n const key = keyFn(...args);\n\n // Check cache\n const cached = cache.get(key);\n if (cached && !isExpired(cached)) {\n // Move to end for LRU\n cache.delete(key);\n cache.set(key, cached);\n\n if (cached.isError) {\n throw cached.value;\n }\n return cached.value;\n }\n\n // Remove expired entry\n if (cached) {\n cache.delete(key);\n }\n\n // Check for in-flight request deduplication\n const inflight = pending.get(key);\n if (inflight) return inflight;\n\n const promise = fn(...args)\n .then((value) => {\n evict();\n cache.set(key, { value, timestamp: Date.now(), isError: false });\n pending.delete(key);\n return value;\n })\n .catch((error) => {\n pending.delete(key);\n if (cacheErrors) {\n evict();\n cache.set(key, { value: error, timestamp: Date.now(), isError: true });\n }\n throw error;\n });\n\n pending.set(key, promise);\n return promise;\n }\n\n memoized.clear = (): void => {\n cache.clear();\n pending.clear();\n };\n\n memoized.delete = (...args: TArgs): boolean => {\n const key = keyFn(...args);\n return cache.delete(key);\n };\n\n Object.defineProperty(memoized, 'size', {\n get() {\n return cache.size;\n },\n });\n\n return memoized as MemoizedFunction<TArgs, TReturn>;\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "flowx-control",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"description": "Production-grade, zero-dependency TypeScript resilience & async flow control library. 100% test coverage. Retry with backoff, Circuit Breaker, Bulkhead, Rate Limiter, Priority Queue, Semaphore, Mutex, Debounce, Throttle, Timeout, Hedge, Poll, Batch, Pipeline — all tree-shakable & composable.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/index.mjs",
|