@nexusts/resilience 0.9.6 → 0.9.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -20,12 +20,15 @@ var RESILIENCE_META = Symbol.for("nexus:Resilience:Meta");
20
20
  // packages/resilience/src/stores/memory.ts
21
21
  class MemoryResilienceStore {
22
22
  #snapshots = new Map;
23
- async getSnapshot(name) {
23
+ async loadSnapshot(name) {
24
24
  return this.#snapshots.get(name) ?? null;
25
25
  }
26
26
  async saveSnapshot(name, snapshot) {
27
27
  this.#snapshots.set(name, { ...snapshot });
28
28
  }
29
+ async getSnapshot(name) {
30
+ return this.loadSnapshot(name);
31
+ }
29
32
  }
30
33
  // packages/resilience/src/stores/redis.ts
31
34
  class RedisResilienceStore {
@@ -509,9 +512,11 @@ class ResilienceService {
509
512
  bulkheads = new Map;
510
513
  store;
511
514
  syncIntervalMs;
512
- constructor(config = {}, store) {
513
- this.syncIntervalMs = config.syncIntervalMs ?? 5000;
514
- this.store = store ?? undefined;
515
+ constructor(configOrStore, store) {
516
+ const cfg = configOrStore && typeof configOrStore === "object" && "retry" in configOrStore ? configOrStore : this._config ?? {};
517
+ const resolvedStore = store ?? (configOrStore && typeof configOrStore === "object" && !("retry" in configOrStore) ? configOrStore : undefined);
518
+ this.syncIntervalMs = cfg.syncIntervalMs ?? 5000;
519
+ this.store = resolvedStore ?? undefined;
515
520
  this.defaults = {
516
521
  retry: {
517
522
  attempts: 3,
@@ -519,7 +524,7 @@ class ResilienceService {
519
524
  maxDelay: 30000,
520
525
  backoff: "exponential-jitter",
521
526
  multiplier: 2,
522
- ...config.retry
527
+ ...cfg.retry
523
528
  },
524
529
  circuit: {
525
530
  threshold: 0.5,
@@ -527,13 +532,13 @@ class ResilienceService {
527
532
  timeout: 30000,
528
533
  halfOpenAfter: 1,
529
534
  window: 60000,
530
- ...config.circuit
535
+ ...cfg.circuit
531
536
  },
532
537
  bulkhead: {
533
538
  maxConcurrent: 10,
534
539
  maxQueued: 100,
535
540
  rejectOnFull: false,
536
- ...config.bulkhead
541
+ ...cfg.bulkhead
537
542
  }
538
543
  };
539
544
  }
@@ -614,11 +619,13 @@ class ResilienceService {
614
619
  return Math.min(raw, maxDelay);
615
620
  }
616
621
  }
622
+ __legacyDecorateClassTS([
623
+ Inject("RESILIENCE_CONFIG")
624
+ ], ResilienceService.prototype, "_config", undefined);
617
625
  ResilienceService = __legacyDecorateClassTS([
618
626
  Injectable(),
619
- __legacyDecorateParamTS(0, Inject("RESILIENCE_CONFIG")),
620
627
  __legacyMetadataTS("design:paramtypes", [
621
- typeof ResilienceConfig === "undefined" ? Object : ResilienceConfig,
628
+ Object,
622
629
  typeof ResilienceStore === "undefined" ? Object : ResilienceStore
623
630
  ])
624
631
  ], ResilienceService);
@@ -788,10 +795,6 @@ class ResilienceAdminModule {
788
795
  const prefix = config.prefix ?? "/resilience";
789
796
 
790
797
  class ResilienceAdminController {
791
- _svc;
792
- constructor(svc) {
793
- this._svc = svc;
794
- }
795
798
  listCircuits() {
796
799
  return this._svc.listCircuits();
797
800
  }
@@ -823,6 +826,9 @@ class ResilienceAdminModule {
823
826
  return { name, state: "closed" };
824
827
  }
825
828
  }
829
+ __legacyDecorateClassTS([
830
+ Inject2(ResilienceService.TOKEN)
831
+ ], ResilienceAdminController.prototype, "_svc", undefined);
826
832
  __legacyDecorateClassTS([
827
833
  Get("/circuits"),
828
834
  __legacyMetadataTS("design:type", Function),
@@ -863,11 +869,7 @@ class ResilienceAdminModule {
863
869
  __legacyMetadataTS("design:returntype", undefined)
864
870
  ], ResilienceAdminController.prototype, "reset", null);
865
871
  ResilienceAdminController = __legacyDecorateClassTS([
866
- Controller(prefix),
867
- __legacyDecorateParamTS(0, Inject2(ResilienceService.TOKEN)),
868
- __legacyMetadataTS("design:paramtypes", [
869
- typeof ResilienceService === "undefined" ? Object : ResilienceService
870
- ])
872
+ Controller(prefix)
871
873
  ], ResilienceAdminController);
872
874
  Object.defineProperty(ResilienceAdminController, "name", {
873
875
  value: "ResilienceAdminController"
@@ -913,5 +915,5 @@ export {
913
915
  Bulkhead
914
916
  };
915
917
 
916
- //# debugId=E341E3389B8B37CD64756E2164756E21
918
+ //# debugId=4CD142AD13A28E7B64756E2164756E21
917
919
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -3,18 +3,18 @@
3
3
  "sources": ["../src/types.ts", "../src/stores/memory.ts", "../src/stores/redis.ts", "../src/stores/drizzle.ts", "../src/retry.ts", "../src/circuit-breaker.ts", "../src/bulkhead.ts", "../src/resilience.service.ts", "../src/resilience.module.ts", "../src/decorators/index.ts", "../src/admin.module.ts"],
4
4
  "sourcesContent": [
5
5
  "/**\n * `@nexusts/resilience` — public types and config.\n *\n * The resilience module groups three classic distributed-systems\n * primitives — retry with backoff, circuit breaker, and bulkhead\n * (concurrency limiter) — under a single, decorator-friendly API.\n * Each primitive can be used as a class, a method decorator, or a\n * standalone function.\n */\n\n// ============================================================================\n// Retry\n// ============================================================================\n\n/** Backoff strategy between retry attempts. */\nexport type BackoffStrategy =\n\t| \"constant\"\n\t| \"linear\"\n\t| \"exponential\"\n\t| \"exponential-jitter\";\n\n/**\n * Predicate: should we retry this error? Default: retry on any\n * non-abort error. Set to a function to filter (e.g. only retry\n * on network errors, not on 4xx HTTP responses).\n */\nexport type RetryOnPredicate = (err: unknown, attempt: number) => boolean;\n\n/** Configuration for `@Retry()` and `retry()`. */\nexport interface RetryConfig {\n\t/** Maximum number of attempts (including the first call). Default: 3. */\n\tattempts?: number;\n\t/** Initial backoff in ms. Default: 100. */\n\tinitialDelay?: number;\n\t/** Max backoff in ms (caps the exponential growth). Default: 30_000. */\n\tmaxDelay?: number;\n\t/** Backoff strategy. Default: \"exponential-jitter\". */\n\tbackoff?: BackoffStrategy;\n\t/** Multiplier for \"linear\" and \"exponential*\". Default: 2. */\n\tmultiplier?: number;\n\t/** Optional: only retry if this predicate returns true. */\n\tretryOn?: RetryOnPredicate;\n\t/**\n\t * Optional: hook called before each retry. Useful for logging\n\t * and metrics.\n\t */\n\tonRetry?: (err: unknown, attempt: number, delayMs: number) => void;\n\t/**\n\t * Optional: hard timeout for the entire retried operation, in ms.\n\t * If the operation takes longer, it is aborted.\n\t */\n\ttimeout?: number;\n}\n\n// ============================================================================\n// Circuit Breaker\n// ============================================================================\n\n/** A circuit breaker's lifecycle state. */\nexport type CircuitState = \"closed\" | \"open\" | \"half-open\";\n\n/** Configuration for `@CircuitBreaker()` and `CircuitBreaker`. */\nexport interface CircuitBreakerConfig {\n\t/**\n\t * Failure ratio (0..1) that opens the circuit. Default: 0.5.\n\t * Open when `failures / (failures + successes) >= threshold` over\n\t * the rolling window.\n\t */\n\tthreshold?: number;\n\t/** Minimum number of calls before the threshold matters. Default: 5. */\n\tminCalls?: number;\n\t/** How long the circuit stays open before going half-open. Default: 30s. */\n\ttimeout?: number;\n\t/** Calls allowed in half-open. Default: 1. */\n\thalfOpenAfter?: number;\n\t/** Predicate: should this error count as a failure? */\n\tisFailure?: (err: unknown) => boolean;\n\t/** Hook on state change. */\n\tonStateChange?: (from: CircuitState, to: CircuitState, name: string) => void;\n\t/** Hook on every call (good for metrics). */\n\tonCall?: (name: string, success: boolean, latencyMs: number) => void;\n\t/**\n\t * Rolling window length for failure ratio, in ms. Default: 60_000.\n\t */\n\twindow?: number;\n}\n\n// ============================================================================\n// Bulkhead\n// ============================================================================\n\n/** Configuration for `Bulkhead`. */\nexport interface BulkheadConfig {\n\t/** Max concurrent executions. Default: 10. */\n\tmaxConcurrent?: number;\n\t/** Max queued callers waiting for a slot. Default: 100. */\n\tmaxQueued?: number;\n\t/** Reject immediately if queue is full (vs. wait for a slot). */\n\trejectOnFull?: boolean;\n\t/** Optional name for logging / metrics. */\n\tname?: string;\n}\n\n/** Result of a bulkhead call. */\nexport type BulkheadOutcome<T> = {\n\tok: boolean;\n\tvalue?: T;\n\terror?: unknown;\n\tqueueMs?: number;\n\texecutionMs?: number;\n};\n\n// ============================================================================\n// Combined decorator: `@Resilient`\n// ============================================================================\n\n/**\n * All three primitives in one decorator. Each section is optional;\n * pass only what you need.\n *\n * @Resilient({\n * retry: { attempts: 3, backoff: \"exponential\" },\n * circuit: { threshold: 0.5, timeout: 30_000 },\n * bulkhead: { maxConcurrent: 5 },\n * })\n * async callExternal() { ... }\n */\nexport interface ResilientConfig {\n\tretry?: RetryConfig;\n\tcircuit?: CircuitBreakerConfig;\n\tbulkhead?: BulkheadConfig;\n}\n\n// ============================================================================\n// Cross-pod Store\n// ============================================================================\n\n/** Snapshot of a circuit's shared state persisted in an external store. */\nexport interface CircuitSnapshot {\n\tstate: CircuitState;\n\topenedAt: number;\n\tfailures: number;\n\tsuccesses: number;\n\tupdatedAt: number;\n}\n\n/**\n * Persistence backend for cross-pod circuit state.\n * Implement this interface to share circuit state across pods.\n * Comes pre-built as `MemoryResilienceStore`, `RedisResilienceStore`,\n * and `DrizzleResilienceStore`.\n */\nexport interface ResilienceStore {\n\tgetSnapshot(name: string): Promise<CircuitSnapshot | null>;\n\tsaveSnapshot(name: string, snapshot: CircuitSnapshot): Promise<void>;\n\tclose?(): Promise<void>;\n}\n\n/** Redis connection options for `ResilienceModule.forRoot({ store: 'redis' })`. */\nexport interface ResilienceRedisOptions {\n\turl?: string;\n\thost?: string;\n\tport?: number;\n\tpassword?: string;\n\tdb?: number;\n\tkeyPrefix?: string;\n}\n\n// ============================================================================\n// Module\n// ============================================================================\n\n/** Top-level config for `ResilienceModule.forRoot()`. */\nexport interface ResilienceConfig {\n\t/**\n\t * Default retry config — used when `@Retry()` is applied without\n\t * explicit options.\n\t */\n\tretry?: RetryConfig;\n\t/**\n\t * Default circuit breaker config — used when `@CircuitBreaker()`\n\t * is applied without explicit options, and as the template for\n\t * circuit breakers created via `getOrCreate()`.\n\t */\n\tcircuit?: CircuitBreakerConfig;\n\t/**\n\t * Default bulkhead config — same as above.\n\t */\n\tbulkhead?: BulkheadConfig;\n\t/**\n\t * Cross-pod circuit state backend.\n\t * - `'memory'` (default): in-process, no sharing\n\t * - `'redis'`: shared via Redis (requires `redis` option)\n\t * - `ResilienceStore`: custom / pre-built store instance (e.g. `DrizzleResilienceStore`)\n\t */\n\tstore?: \"memory\" | \"redis\" | ResilienceStore;\n\t/** Redis connection options for `store: 'redis'`. */\n\tredis?: ResilienceRedisOptions;\n\t/**\n\t * How often (ms) a circuit breaker polls the external store to pull\n\t * the latest cross-pod state. Default: 5000 (5s).\n\t */\n\tsyncIntervalMs?: number;\n}\n\n// ============================================================================\n// Metrics\n// ============================================================================\n\n/** Snapshot of a circuit breaker's current state and stats. */\nexport interface CircuitMetrics {\n\tname: string;\n\tstate: CircuitState;\n\t/** Total calls recorded in the current rolling window. */\n\ttotalCalls: number;\n\t/** Failed calls in the rolling window. */\n\tfailures: number;\n\t/** Successes in the rolling window. */\n\tsuccesses: number;\n\t/** Failure ratio (0..1) in the rolling window. */\n\tfailureRatio: number;\n\t/** Timestamp when the circuit was last opened (0 if never). */\n\topenedAt: number;\n\t/** Milliseconds until the circuit transitions from open → half-open (0 if not open). */\n\tmsUntilHalfOpen: number;\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/** Internal — used by decorators to attach metadata. */\nexport const RESILIENCE_META = Symbol.for(\"nexus:Resilience:Meta\");\n",
6
- "import type { CircuitSnapshot, ResilienceStore } from \"../types.js\";\n\n/** In-process store — default, no external dependencies. */\nexport class MemoryResilienceStore implements ResilienceStore {\n\t#snapshots = new Map<string, CircuitSnapshot>();\n\n\tasync getSnapshot(name: string): Promise<CircuitSnapshot | null> {\n\t\treturn this.#snapshots.get(name) ?? null;\n\t}\n\n\tasync saveSnapshot(name: string, snapshot: CircuitSnapshot): Promise<void> {\n\t\tthis.#snapshots.set(name, { ...snapshot });\n\t}\n}\n",
6
+ "import type { CircuitSnapshot, ResilienceStore } from \"../types.js\";\n\n/** In-process store — default, no external dependencies. */\nexport class MemoryResilienceStore implements ResilienceStore {\n\t#snapshots = new Map<string, CircuitSnapshot>();\n\n\tasync loadSnapshot(name: string): Promise<CircuitSnapshot | null> {\n\t\treturn this.#snapshots.get(name) ?? null;\n\t}\n\n\tasync saveSnapshot(name: string, snapshot: CircuitSnapshot): Promise<void> {\n\t\tthis.#snapshots.set(name, { ...snapshot });\n\t}\n\n\t/** @deprecated Use loadSnapshot instead. */\n\tasync getSnapshot(name: string): Promise<CircuitSnapshot | null> {\n\t\treturn this.loadSnapshot(name);\n\t}\n}\n",
7
7
  "import type { CircuitSnapshot, ResilienceStore } from \"../types.js\";\n\nexport interface RedisResilienceStoreOptions {\n\t/** Key prefix. Default: `\"nexus:circuit:\"`. */\n\tkeyPrefix?: string;\n\t/** TTL in seconds for each snapshot entry. Default: 3600 (1h). */\n\tttlSeconds?: number;\n}\n\n/**\n * Cross-pod circuit state backed by Redis.\n * Accepts any `RedisClient`-compatible object (from `@nexusts/redis`).\n *\n * const client = await createRedisClient({ url: process.env.REDIS_URL });\n * const store = new RedisResilienceStore(client);\n *\n * ResilienceModule.forRoot({ store });\n */\nexport class RedisResilienceStore implements ResilienceStore {\n\t#client: any;\n\t#prefix: string;\n\t#ttl: number;\n\n\tconstructor(client: any, opts: RedisResilienceStoreOptions = {}) {\n\t\tthis.#client = client;\n\t\tthis.#prefix = opts.keyPrefix ?? \"nexus:circuit:\";\n\t\tthis.#ttl = opts.ttlSeconds ?? 3600;\n\t}\n\n\t#key(name: string): string {\n\t\treturn `${this.#prefix}${name}`;\n\t}\n\n\tasync getSnapshot(name: string): Promise<CircuitSnapshot | null> {\n\t\tconst raw = await this.#client.get(this.#key(name));\n\t\tif (!raw) return null;\n\t\ttry {\n\t\t\treturn JSON.parse(raw) as CircuitSnapshot;\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tasync saveSnapshot(name: string, snapshot: CircuitSnapshot): Promise<void> {\n\t\tawait this.#client.set(this.#key(name), JSON.stringify(snapshot), {\n\t\t\tex: this.#ttl,\n\t\t});\n\t}\n\n\tasync close(): Promise<void> {\n\t\tawait this.#client.close();\n\t}\n}\n",
8
8
  "import type { CircuitSnapshot, ResilienceStore } from \"../types.js\";\n\nexport interface DrizzleResilienceStoreOptions {\n\t/** Table name. Default: `\"nexus_circuit_state\"`. */\n\ttableName?: string;\n}\n\n/**\n * Cross-pod circuit state backed by a Drizzle-connected database.\n * Accepts any `DrizzleService`-compatible object.\n *\n * const store = new DrizzleResilienceStore(db);\n * ResilienceModule.forRoot({ store });\n *\n * Creates `nexus_circuit_state` automatically on first use.\n */\nexport class DrizzleResilienceStore implements ResilienceStore {\n\t#db: any;\n\t#table: string;\n\t#ready: Promise<void>;\n\n\tconstructor(db: any, opts: DrizzleResilienceStoreOptions = {}) {\n\t\tthis.#db = db;\n\t\tthis.#table = opts.tableName ?? \"nexus_circuit_state\";\n\t\tthis.#ready = this.#ensureTable();\n\t}\n\n\tasync #ensureTable(): Promise<void> {\n\t\tawait this.#db.rawQuery(\n\t\t\t`CREATE TABLE IF NOT EXISTS ${this.#table} (\n\t\t\t\tname TEXT PRIMARY KEY,\n\t\t\t\tstate TEXT NOT NULL DEFAULT 'closed',\n\t\t\t\topened_at INTEGER NOT NULL DEFAULT 0,\n\t\t\t\tfailures INTEGER NOT NULL DEFAULT 0,\n\t\t\t\tsuccesses INTEGER NOT NULL DEFAULT 0,\n\t\t\t\tupdated_at INTEGER NOT NULL DEFAULT 0\n\t\t\t)`,\n\t\t\t[],\n\t\t);\n\t}\n\n\tasync getSnapshot(name: string): Promise<CircuitSnapshot | null> {\n\t\tawait this.#ready;\n\t\tconst rows = (await this.#db.rawQuery(\n\t\t\t`SELECT state, opened_at, failures, successes, updated_at FROM ${this.#table} WHERE name = ?`,\n\t\t\t[name],\n\t\t)) as Array<{\n\t\t\tstate: string;\n\t\t\topened_at: number;\n\t\t\tfailures: number;\n\t\t\tsuccesses: number;\n\t\t\tupdated_at: number;\n\t\t}>;\n\t\tconst row = rows[0];\n\t\tif (!row) return null;\n\t\treturn {\n\t\t\tstate: row.state as CircuitSnapshot[\"state\"],\n\t\t\topenedAt: row.opened_at,\n\t\t\tfailures: row.failures,\n\t\t\tsuccesses: row.successes,\n\t\t\tupdatedAt: row.updated_at,\n\t\t};\n\t}\n\n\tasync saveSnapshot(name: string, snapshot: CircuitSnapshot): Promise<void> {\n\t\tawait this.#ready;\n\t\tawait this.#db.rawQuery(\n\t\t\t`INSERT INTO ${this.#table} (name, state, opened_at, failures, successes, updated_at)\n\t\t\t VALUES (?, ?, ?, ?, ?, ?)\n\t\t\t ON CONFLICT(name) DO UPDATE SET\n\t\t\t state = excluded.state,\n\t\t\t opened_at = excluded.opened_at,\n\t\t\t failures = excluded.failures,\n\t\t\t successes = excluded.successes,\n\t\t\t updated_at = excluded.updated_at`,\n\t\t\t[name, snapshot.state, snapshot.openedAt, snapshot.failures, snapshot.successes, snapshot.updatedAt],\n\t\t);\n\t}\n}\n",
9
9
  "/**\n * `retry()` — pure function. The same code that powers `@Retry()`\n * — useful when you can't (or don't want to) decorate a method.\n *\n * import { retry } from \"@nexusts/resilience\";\n *\n * const user = await retry(\n * () => fetch(\"https://api.example.com/users/42\").then(r => r.json()),\n * { attempts: 3, backoff: \"exponential-jitter\" },\n * );\n *\n * Error handling:\n * - If the function throws and `retryOn(err)` returns true, the\n * call is retried up to `attempts` times.\n * - The final error is re-thrown to the caller.\n * - AbortError / CancellationError short-circuit immediately.\n */\nimport type { RetryConfig, RetryOnPredicate } from \"./types.js\";\n\nconst DEFAULTS = {\n\tattempts: 3,\n\tinitialDelay: 100,\n\tmaxDelay: 30_000,\n\tbackoff: \"exponential-jitter\" as const,\n\tmultiplier: 2,\n};\n\nconst defaultRetryOn: RetryOnPredicate = (err: unknown) => {\n\tif (err == null) return false;\n\t// Honour explicit aborts.\n\tconst name = (err as { name?: string })?.name ?? \"\";\n\tif (name === \"AbortError\" || name === \"CancellationError\") return false;\n\treturn true;\n};\n\n/** Sleep helper that respects AbortSignal. */\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n\treturn new Promise((resolve, reject) => {\n\t\tif (signal?.aborted) {\n\t\t\treject(signal.reason ?? new DOMException(\"Aborted\", \"AbortError\"));\n\t\t\treturn;\n\t\t}\n\t\tconst id = setTimeout(() => {\n\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\tresolve();\n\t\t}, ms);\n\t\tconst onAbort = () => {\n\t\t\tclearTimeout(id);\n\t\t\treject(signal?.reason ?? new DOMException(\"Aborted\", \"AbortError\"));\n\t\t};\n\t\tsignal?.addEventListener(\"abort\", onAbort, { once: true });\n\t});\n}\n\n/**\n * Compute the next backoff delay. Returns ms.\n *\n * constant: initialDelay\n * linear: initialDelay * attempt * multiplier\n * exponential: initialDelay * multiplier^(attempt-1)\n * exponential-jitter: above * (0.5..1.5) random factor\n */\nexport function computeBackoff(\n\tattempt: number,\n\tcfg: Required<Pick<RetryConfig, \"initialDelay\" | \"maxDelay\" | \"backoff\" | \"multiplier\">>,\n): number {\n\tconst { initialDelay, maxDelay, backoff, multiplier } = cfg;\n\tlet raw: number;\n\tswitch (backoff) {\n\t\tcase \"constant\":\n\t\t\traw = initialDelay;\n\t\t\tbreak;\n\t\tcase \"linear\":\n\t\t\traw = initialDelay * attempt;\n\t\t\tbreak;\n\t\tcase \"exponential\":\n\t\t\traw = initialDelay * Math.pow(multiplier, attempt - 1);\n\t\t\tbreak;\n\t\tcase \"exponential-jitter\": {\n\t\t\tconst base = initialDelay * Math.pow(multiplier, attempt - 1);\n\t\t\t// ±50% jitter — full jitter (AWS-style).\n\t\t\traw = Math.random() * base;\n\t\t\tbreak;\n\t\t}\n\t\tdefault:\n\t\t\traw = initialDelay;\n\t}\n\treturn Math.min(raw, maxDelay);\n}\n\n/**\n * Retry `fn` according to `cfg`. Returns the eventual value or\n * re-throws the last error.\n */\nexport async function retry<T>(\n\tfn: (signal: AbortSignal) => Promise<T> | T,\n\tcfg: RetryConfig = {},\n): Promise<T> {\n\tconst attempts = Math.max(1, cfg.attempts ?? DEFAULTS.attempts);\n\tconst initialDelay = cfg.initialDelay ?? DEFAULTS.initialDelay;\n\tconst maxDelay = cfg.maxDelay ?? DEFAULTS.maxDelay;\n\tconst backoff = cfg.backoff ?? DEFAULTS.backoff;\n\tconst multiplier = cfg.multiplier ?? DEFAULTS.multiplier;\n\tconst retryOn = cfg.retryOn ?? defaultRetryOn;\n\tconst onRetry = cfg.onRetry;\n\tconst overallTimeout = cfg.timeout;\n\n\tconst ac = new AbortController();\n\tconst overallTimer = overallTimeout\n\t\t? setTimeout(() => ac.abort(new Error(\"retry: overall timeout exceeded\")), overallTimeout)\n\t\t: undefined;\n\n\tconst normalized = { initialDelay, maxDelay, backoff, multiplier };\n\tlet lastErr: unknown;\n\tfor (let attempt = 1; attempt <= attempts; attempt++) {\n\t\tif (ac.signal.aborted) break;\n\t\ttry {\n\t\t\treturn await fn(ac.signal);\n\t\t} catch (err) {\n\t\t\tlastErr = err;\n\t\t\tif (attempt >= attempts) break;\n\t\t\tif (!retryOn(err, attempt)) break;\n\t\t\tconst delay = computeBackoff(attempt, normalized);\n\t\t\tif (onRetry) {\n\t\t\t\ttry {\n\t\t\t\t\tonRetry(err, attempt, delay);\n\t\t\t\t} catch {\n\t\t\t\t\t/* hook errors must not break the retry */\n\t\t\t\t}\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tawait sleep(delay, ac.signal);\n\t\t\t} catch (sleepErr) {\n\t\t\t\tlastErr = sleepErr;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (overallTimer) clearTimeout(overallTimer);\n\tthrow lastErr;\n}\n",
10
10
  "/**\n * `CircuitBreaker` — a single named circuit. Constructed on demand\n * via `ResilienceService.getOrCreate()` (so multiple parts of your\n * app share one circuit per external dependency), or directly:\n *\n * import { CircuitBreaker } from \"@nexusts/resilience\";\n *\n * const stripe = new CircuitBreaker(\"stripe\", {\n * threshold: 0.5,\n * timeout: 30_000,\n * });\n *\n * const result = await stripe.execute(() => stripeApi.charge(...));\n *\n * State machine:\n *\n * closed ──failures ≥ threshold──▶ open\n * ▲ │\n * │ │ after `timeout` ms\n * │ ▼\n * closed ◀──success── half-open\n * │\n * └─ failure ──▶ open (reset)\n *\n * - `closed`: all calls go through. Track success/failure in a\n * rolling window.\n * - `open`: calls fail-fast with `CircuitOpenError`. After\n * `timeout` ms, transition to `half-open`.\n * - `half-open`: at most `halfOpenAfter` calls are allowed. If any\n * of them fails → back to `open`. If all succeed → back to\n * `closed`.\n */\nimport type { CircuitBreakerConfig, CircuitMetrics, CircuitState, ResilienceStore } from \"./types.js\";\n\nconst DEFAULTS = {\n\tthreshold: 0.5,\n\tminCalls: 5,\n\ttimeout: 30_000,\n\thalfOpenAfter: 1,\n\twindow: 60_000,\n};\n\nconst defaultIsFailure = (_err: unknown): boolean => true;\n\n/** Thrown when the circuit is open. Callers should treat as \"fail-fast\". */\nexport class CircuitOpenError extends Error {\n\treadonly name = \"CircuitOpenError\";\n\treadonly circuit: string;\n\treadonly nextRetryAt: number;\n\tconstructor(circuit: string, nextRetryAt: number) {\n\t\tsuper(`Circuit \"${circuit}\" is open; retry after ${nextRetryAt}ms`);\n\t\tthis.circuit = circuit;\n\t\tthis.nextRetryAt = nextRetryAt;\n\t}\n}\n\ninterface Sample {\n\tts: number;\n\tok: boolean;\n}\n\nexport class CircuitBreaker {\n\treadonly name: string;\n\treadonly config: Required<Omit<CircuitBreakerConfig, \"onStateChange\" | \"onCall\" | \"isFailure\">> & {\n\t\tisFailure: NonNullable<CircuitBreakerConfig[\"isFailure\"]>;\n\t};\n\tprivate state: CircuitState = \"closed\";\n\tprivate samples: Sample[] = [];\n\tprivate openedAt = 0;\n\tprivate halfOpenInFlight = 0;\n\tprivate halfOpenAllowed = 0;\n\n\t/** Set by ResilienceService when a cross-pod store is configured. */\n\t_store?: ResilienceStore;\n\t/** How often (ms) to pull state from the store. Default: 5000. */\n\t_syncIntervalMs = 5000;\n\tprivate _lastSync = 0;\n\tprivate _lastRemoteUpdate = 0;\n\n\tconstructor(name: string, config: CircuitBreakerConfig = {}) {\n\t\tthis.name = name;\n\t\tthis.config = {\n\t\t\tthreshold: config.threshold ?? DEFAULTS.threshold,\n\t\t\tminCalls: config.minCalls ?? DEFAULTS.minCalls,\n\t\t\ttimeout: config.timeout ?? DEFAULTS.timeout,\n\t\t\thalfOpenAfter: config.halfOpenAfter ?? DEFAULTS.halfOpenAfter,\n\t\t\twindow: config.window ?? DEFAULTS.window,\n\t\t\tisFailure: config.isFailure ?? defaultIsFailure,\n\t\t};\n\t}\n\n\tget currentState(): CircuitState {\n\t\t// Lazy transition: if the open timer has elapsed, flip to half-open\n\t\t// before the next call, so the consumer sees the right state.\n\t\tif (\n\t\t\tthis.state === \"open\" &&\n\t\t\tDate.now() - this.openedAt >= this.config.timeout\n\t\t) {\n\t\t\tthis.transition(\"half-open\");\n\t\t\tthis.halfOpenAllowed = this.config.halfOpenAfter;\n\t\t\tthis.halfOpenInFlight = 0;\n\t\t}\n\t\treturn this.state;\n\t}\n\n\t/** Run `fn` through the circuit. Throws `CircuitOpenError` when open. */\n\tasync execute<T>(fn: () => Promise<T> | T): Promise<T> {\n\t\tif (this._store) await this._maybeSyncFromStore();\n\t\tconst state = this.currentState;\n\n\t\tif (state === \"open\") {\n\t\t\tthrow new CircuitOpenError(this.name, this.openedAt + this.config.timeout);\n\t\t}\n\n\t\t// Concurrency control for half-open.\n\t\tif (state === \"half-open\") {\n\t\t\tif (this.halfOpenInFlight >= this.halfOpenAllowed) {\n\t\t\t\tthrow new CircuitOpenError(this.name, this.openedAt + this.config.timeout);\n\t\t\t}\n\t\t\tthis.halfOpenInFlight += 1;\n\t\t}\n\n\t\tconst start = Date.now();\n\t\tlet ok = false;\n\t\ttry {\n\t\t\tconst result = await fn();\n\t\t\tok = true;\n\t\t\treturn result;\n\t\t} finally {\n\t\t\tconst latency = Date.now() - start;\n\t\t\tthis.record(ok, latency, state);\n\t\t}\n\t}\n\n\t// ===================================================================\n\t// Admin API — manual overrides & inspection\n\t// ===================================================================\n\n\t/**\n\t * Return a snapshot of the circuit's current state and metrics.\n\t * Useful for admin dashboards and monitoring.\n\t */\n\tmetrics(): CircuitMetrics {\n\t\tconst now = Date.now();\n\t\tconst cutoff = now - this.config.window;\n\t\tconst windowSamples = this.samples.filter((s) => s.ts >= cutoff);\n\t\tconst total = windowSamples.length;\n\t\tconst failures = windowSamples.filter((s) => !s.ok).length;\n\t\tconst successes = total - failures;\n\t\tconst ratio = total > 0 ? failures / total : 0;\n\t\tconst openedAt = this.openedAt;\n\t\tconst msUntilHalfOpen =\n\t\t\tthis.state === \"open\"\n\t\t\t\t? Math.max(0, openedAt + this.config.timeout - Date.now())\n\t\t\t\t: 0;\n\n\t\treturn {\n\t\t\tname: this.name,\n\t\t\tstate: this.currentState,\n\t\t\ttotalCalls: total,\n\t\t\tfailures,\n\t\t\tsuccesses,\n\t\t\tfailureRatio: ratio,\n\t\t\topenedAt,\n\t\t\tmsUntilHalfOpen,\n\t\t};\n\t}\n\n\t/** Manually open the circuit (overrides normal state machine). */\n\tforceOpen(): void {\n\t\tthis.openedAt = Date.now();\n\t\tthis.halfOpenInFlight = 0;\n\t\tthis.transition(\"open\");\n\t}\n\n\t/** Manually close the circuit (overrides normal state machine). */\n\tforceClose(): void {\n\t\tthis.openedAt = 0;\n\t\tthis.halfOpenInFlight = 0;\n\t\tthis.samples = [];\n\t\tthis.transition(\"closed\");\n\t}\n\n\t/** Reset the circuit to its initial closed state (clears all history). */\n\treset(): void {\n\t\tthis.state = \"closed\";\n\t\tthis.openedAt = 0;\n\t\tthis.halfOpenInFlight = 0;\n\t\tthis.halfOpenAllowed = 0;\n\t\tthis.samples = [];\n\t}\n\n\t// ===================================================================\n\t// Internal\n\t// ===================================================================\n\n\tprivate record(ok: boolean, latency: number, stateAtCall: CircuitState): void {\n\t\t// Fire per-call hook.\n\t\ttry {\n\t\t\tthis._onCall?.(this.name, ok, latency);\n\t\t} catch {\n\t\t\t/* ignore */\n\t\t}\n\n\t\t// Track in the rolling window.\n\t\tconst now = Date.now();\n\t\tthis.samples.push({ ts: now, ok });\n\t\tconst cutoff = now - this.config.window;\n\t\twhile (this.samples.length > 0 && this.samples[0].ts < cutoff) {\n\t\t\tthis.samples.shift();\n\t\t}\n\n\t\t// State transitions.\n\t\tif (stateAtCall === \"half-open\") {\n\t\t\tthis.halfOpenInFlight = Math.max(0, this.halfOpenInFlight - 1);\n\t\t\tif (!ok) {\n\t\t\t\tthis.openedAt = now;\n\t\t\t\tthis.transition(\"open\");\n\t\t\t} else if (this.halfOpenInFlight === 0) {\n\t\t\t\tthis.transition(\"closed\");\n\t\t\t\tthis.samples = [];\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// closed → possibly open\n\t\tif (!ok) {\n\t\t\tconst total = this.samples.length;\n\t\t\tif (total >= this.config.minCalls) {\n\t\t\t\tconst failures = this.samples.filter((s) => !s.ok).length;\n\t\t\t\tconst ratio = failures / total;\n\t\t\t\tif (ratio >= this.config.threshold) {\n\t\t\t\t\tthis.openedAt = now;\n\t\t\t\t\tthis.transition(\"open\");\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\t// Reset the window on full-success periods so a long-stable\n\t\t\t// upstream doesn't carry stale failures forever.\n\t\t\tif (this.samples.length > this.config.minCalls * 4) {\n\t\t\t\tthis.samples = this.samples.slice(-this.config.minCalls);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate transition(to: CircuitState): void {\n\t\tconst from = this.state;\n\t\tif (from === to) return;\n\t\tthis.state = to;\n\t\t// Hooks are passed in `config`; we only know about them via\n\t\t// the outer constructor so we keep them on a parallel field.\n\t\t// (The hook API is set in the ResilienceService which owns\n\t\t// the onStateChange list.)\n\t\tthis.fireHook(from, to);\n\t\tif (this._store) this._saveToStore();\n\t}\n\n\t// ===================================================================\n\t// Cross-pod store sync (best-effort, non-throwing)\n\t// ===================================================================\n\n\tprivate async _maybeSyncFromStore(): Promise<void> {\n\t\tconst now = Date.now();\n\t\tif (now - this._lastSync < this._syncIntervalMs) return;\n\t\tthis._lastSync = now;\n\t\ttry {\n\t\t\tconst snap = await this._store!.getSnapshot(this.name);\n\t\t\tif (!snap) return;\n\t\t\t// Apply only if the remote snapshot is newer than the last one we applied.\n\t\t\tif (snap.updatedAt <= this._lastRemoteUpdate) return;\n\t\t\tthis._lastRemoteUpdate = snap.updatedAt;\n\t\t\tthis.state = snap.state;\n\t\t\tthis.openedAt = snap.openedAt;\n\t\t\tif (snap.state === \"half-open\") {\n\t\t\t\tthis.halfOpenAllowed = this.config.halfOpenAfter;\n\t\t\t\tthis.halfOpenInFlight = 0;\n\t\t\t}\n\t\t} catch {\n\t\t\t// Degraded to local-only mode — do not throw.\n\t\t}\n\t}\n\n\tprivate _saveToStore(): void {\n\t\tconst now = Date.now();\n\t\tconst cutoff = now - this.config.window;\n\t\tconst win = this.samples.filter((s) => s.ts >= cutoff);\n\t\tconst failures = win.filter((s) => !s.ok).length;\n\t\tconst successes = win.length - failures;\n\t\tthis._store!\n\t\t\t.saveSnapshot(this.name, {\n\t\t\t\tstate: this.state,\n\t\t\t\topenedAt: this.openedAt,\n\t\t\t\tfailures,\n\t\t\t\tsuccesses,\n\t\t\t\tupdatedAt: now,\n\t\t\t})\n\t\t\t.catch(() => {}); // fire-and-forget; errors are non-fatal\n\t}\n\n\t/** Set by ResilienceService — fires on each transition. */\n\t_onStateChange?: (from: CircuitState, to: CircuitState, name: string) => void;\n\t_onCall?: (name: string, success: boolean, latencyMs: number) => void;\n\tprivate fireHook(from: CircuitState, to: CircuitState): void {\n\t\ttry {\n\t\t\tthis._onStateChange?.(from, to, this.name);\n\t\t} catch {\n\t\t\t/* ignore */\n\t\t}\n\t}\n}\n",
11
11
  "/**\n * `Bulkhead` — concurrency limiter with optional queue.\n *\n * import { Bulkhead } from \"@nexusts/resilience\";\n *\n * const api = new Bulkhead({ maxConcurrent: 5, maxQueued: 100 });\n *\n * const result = await api.execute(() => fetch(\"...\"));\n *\n * Behavior:\n * - `maxConcurrent`: how many `execute()` calls may be in-flight at once.\n * - `maxQueued`: how many additional callers may wait in the queue\n * for a free slot.\n * - `rejectOnFull` (default false): when the queue is full, reject\n * immediately with `BulkheadFullError` instead of waiting.\n *\n * The bulkhead is fair: callers are released in FIFO order. Each\n * waiter carries its own resolver; when a slot frees up we wake the\n * next waiter in the queue, who then re-enters and runs its function.\n */\nimport type { BulkheadConfig } from \"./types.js\";\n\nconst DEFAULTS = {\n\tmaxConcurrent: 10,\n\tmaxQueued: 100,\n\trejectOnFull: false,\n};\n\n/** Thrown when `rejectOnFull` is set and the queue is at capacity. */\nexport class BulkheadFullError extends Error {\n\treadonly name = \"BulkheadFullError\";\n\tconstructor(public readonly name_: string) {\n\t\tsuper(`Bulkhead \"${name_}\" is at capacity`);\n\t}\n}\n\n/** A queued caller. Resolves when this caller gets a slot. */\ninterface SlotToken {\n\t/** Acquired by the drain loop when a slot opens. */\n\tacquired: boolean;\n\t/** Cancelled before we got a slot. */\n\tcancelled: boolean;\n\tresolve: () => void;\n\treject: (e: unknown) => void;\n}\n\nexport class Bulkhead {\n\treadonly name: string;\n\treadonly config: Required<Omit<BulkheadConfig, \"name\">>;\n\n\tprivate inFlight = 0;\n\tprivate queue: SlotToken[] = [];\n\n\tconstructor(config: BulkheadConfig = {}) {\n\t\tthis.name = config.name ?? \"bulkhead\";\n\t\tthis.config = {\n\t\t\tmaxConcurrent: config.maxConcurrent ?? DEFAULTS.maxConcurrent,\n\t\t\tmaxQueued: config.maxQueued ?? DEFAULTS.maxQueued,\n\t\t\trejectOnFull: config.rejectOnFull ?? DEFAULTS.rejectOnFull,\n\t\t};\n\t}\n\n\tget stats(): { inFlight: number; queued: number } {\n\t\treturn { inFlight: this.inFlight, queued: this.queue.length };\n\t}\n\n\t/** Run `fn` through the bulkhead. */\n\tasync execute<T>(fn: () => Promise<T> | T): Promise<T> {\n\t\t// Fast path: a slot is free.\n\t\tif (this.inFlight < this.config.maxConcurrent) {\n\t\t\tthis.inFlight += 1;\n\t\t\ttry {\n\t\t\t\treturn await fn();\n\t\t\t} finally {\n\t\t\t\tthis.inFlight -= 1;\n\t\t\t\tthis.drain();\n\t\t\t}\n\t\t}\n\n\t\t// No slot — wait for one.\n\t\tif (this.queue.length >= this.config.maxQueued) {\n\t\t\tthrow new BulkheadFullError(this.name);\n\t\t}\n\n\t\tconst token = this.enqueue();\n\t\ttry {\n\t\t\tawait token.acquire();\n\t\t} catch (err) {\n\t\t\t// Cancelled or aborted — drop the token and re-throw.\n\t\t\tthrow err;\n\t\t}\n\t\t// Slot acquired. Run and release on completion.\n\t\tthis.inFlight += 1;\n\t\ttry {\n\t\t\treturn await fn();\n\t\t} finally {\n\t\t\tthis.inFlight -= 1;\n\t\t\tthis.drain();\n\t\t}\n\t}\n\n\t/** Allocate a slot token, joining the FIFO queue. */\n\tprivate enqueue(): SlotToken & { acquire(): Promise<void> } {\n\t\tlet resolve!: () => void;\n\t\tlet reject!: (e: unknown) => void;\n\t\tconst promise = new Promise<void>((res, rej) => {\n\t\t\tresolve = res;\n\t\t\treject = rej;\n\t\t});\n\t\tconst token: SlotToken = {\n\t\t\tacquired: false,\n\t\t\tcancelled: false,\n\t\t\tresolve,\n\t\t\treject,\n\t\t};\n\t\tthis.queue.push(token);\n\t\treturn Object.assign(promise as never, {\n\t\t\tacquire: () => promise,\n\t\t\tcancel: () => {\n\t\t\t\tif (token.acquired) return;\n\t\t\t\ttoken.cancelled = true;\n\t\t\t\ttoken.reject(new DOMException(\"Cancelled\", \"AbortError\"));\n\t\t\t},\n\t\t});\n\t}\n\n\t/** Release a slot by waking the next waiter. Idempotent. */\n\tprivate drain(): void {\n\t\twhile (\n\t\t\tthis.inFlight < this.config.maxConcurrent &&\n\t\t\tthis.queue.length > 0\n\t\t) {\n\t\t\tconst next = this.queue.shift()!;\n\t\t\tif (next.cancelled) continue;\n\t\t\tnext.acquired = true;\n\t\t\tnext.resolve();\n\t\t\treturn; // Only one slot opens per drain call.\n\t\t}\n\t}\n}\n",
12
- "/**\n * `ResilienceService` — owns the named circuit-breaker and bulkhead\n * registry. Exposed via DI so multiple parts of an app can share\n * the same circuit for an external dependency.\n *\n * constructor(@Inject(ResilienceService.TOKEN) private r: ResilienceService) {}\n *\n * const cb = this.r.getOrCreateCircuit(\"stripe\", { threshold: 0.5 });\n * const result = await cb.execute(() => stripeApi.charge(...));\n *\n * The service also holds the *default* config (RetryConfig,\n * CircuitBreakerConfig, BulkheadConfig) used by the decorators\n * when no per-call options are given.\n */\nimport { Inject, Injectable } from \"@nexusts/core\";\nimport { CircuitBreaker } from \"./circuit-breaker.js\";\nimport { Bulkhead } from \"./bulkhead.js\";\nimport { retry } from \"./retry.js\";\nimport { safeGetMeta, safeDefineMeta, safeHasMeta } from \"@nexusts/core/di/safe-reflect\";\nimport type {\n\tBackoffStrategy,\n\tBulkheadConfig,\n\tCircuitBreakerConfig,\n\tResilienceConfig,\n\tResilienceStore,\n\tRetryConfig,\n} from \"./types.js\";\n\n@Injectable()\nexport class ResilienceService {\n\t/** DI token — `@Inject(ResilienceService.TOKEN)`. */\n\tstatic readonly TOKEN = Symbol.for(\"nexus:ResilienceService\");\n\n\treadonly defaults: {\n\t\tretry: Required<RetryConfig>;\n\t\tcircuit: Required<CircuitBreakerConfig>;\n\t\tbulkhead: Required<BulkheadConfig>;\n\t};\n\n\tprivate circuits = new Map<string, CircuitBreaker>();\n\tprivate bulkheads = new Map<string, Bulkhead>();\n\tprivate store?: ResilienceStore;\n\tprivate syncIntervalMs: number;\n\n\tconstructor(\n\t\t@Inject(\"RESILIENCE_CONFIG\") config: ResilienceConfig = {},\n\t\tstore?: ResilienceStore,\n\t) {\n\t\tthis.syncIntervalMs = config.syncIntervalMs ?? 5000;\n\t\tthis.store = store ?? undefined;\n\t\tthis.defaults = {\n\t\t\tretry: {\n\t\t\t\tattempts: 3,\n\t\t\t\tinitialDelay: 100,\n\t\t\t\tmaxDelay: 30_000,\n\t\t\t\tbackoff: \"exponential-jitter\",\n\t\t\t\tmultiplier: 2,\n\t\t\t\t...config.retry,\n\t\t\t} as Required<RetryConfig>,\n\t\t\tcircuit: {\n\t\t\t\tthreshold: 0.5,\n\t\t\t\tminCalls: 5,\n\t\t\t\ttimeout: 30_000,\n\t\t\t\thalfOpenAfter: 1,\n\t\t\t\twindow: 60_000,\n\t\t\t\t...config.circuit,\n\t\t\t} as Required<CircuitBreakerConfig>,\n\t\t\tbulkhead: {\n\t\t\t\tmaxConcurrent: 10,\n\t\t\t\tmaxQueued: 100,\n\t\t\t\trejectOnFull: false,\n\t\t\t\t...config.bulkhead,\n\t\t\t} as Required<BulkheadConfig>,\n\t\t};\n\t}\n\n\t/** Set (or replace) the cross-pod store after construction. */\n\tsetStore(store: ResilienceStore): void {\n\t\tthis.store = store;\n\t\tfor (const cb of this.circuits.values()) {\n\t\t\tcb._store = store;\n\t\t\tcb._syncIntervalMs = this.syncIntervalMs;\n\t\t}\n\t}\n\n\t/** Get or create a named circuit breaker. Shared across the app. */\n\tgetOrCreateCircuit(name: string, config: CircuitBreakerConfig = {}): CircuitBreaker {\n\t\tlet cb = this.circuits.get(name);\n\t\tif (!cb) {\n\t\t\tcb = new CircuitBreaker(name, { ...this.defaults.circuit, ...config });\n\t\t\tif (this.store) {\n\t\t\t\tcb._store = this.store;\n\t\t\t\tcb._syncIntervalMs = this.syncIntervalMs;\n\t\t\t}\n\t\t\tthis.circuits.set(name, cb);\n\t\t}\n\t\treturn cb;\n\t}\n\n\t/** Get or create a named bulkhead. */\n\tgetOrCreateBulkhead(name: string, config: BulkheadConfig = {}): Bulkhead {\n\t\tlet bh = this.bulkheads.get(name);\n\t\tif (!bh) {\n\t\t\t// Merge: explicit config overrides defaults, except for\n\t\t\t// `name` (always use the caller's name). Strip `name` from\n\t\t\t// the defaults before spreading to avoid a duplicate.\n\t\t\tconst { name: _ignored, ...defaultRest } = this.defaults.bulkhead as BulkheadConfig;\n\t\t\tvoid _ignored;\n\t\t\tbh = new Bulkhead({ ...defaultRest, ...config, name });\n\t\t\tthis.bulkheads.set(name, bh);\n\t\t}\n\t\treturn bh;\n\t}\n\n\t/** Look up an existing circuit (no creation). */\n\tgetCircuit(name: string): CircuitBreaker | undefined {\n\t\treturn this.circuits.get(name);\n\t}\n\n\t/** Look up an existing bulkhead. */\n\tgetBulkhead(name: string): Bulkhead | undefined {\n\t\treturn this.bulkheads.get(name);\n\t}\n\n\t/**\n\t * List all registered circuit breakers and their current metrics.\n\t * Useful for admin dashboards and monitoring.\n\t */\n\tlistCircuits(): Array<{\n\t\tname: string;\n\t\tstate: import(\"./types.js\").CircuitState;\n\t\tmetrics: import(\"./types.js\").CircuitMetrics;\n\t}> {\n\t\tconst results: Array<{\n\t\t\tname: string;\n\t\t\tstate: import(\"./types.js\").CircuitState;\n\t\t\tmetrics: import(\"./types.js\").CircuitMetrics;\n\t\t}> = [];\n\t\tfor (const [name, cb] of this.circuits) {\n\t\t\tresults.push({ name, state: cb.currentState, metrics: cb.metrics() });\n\t\t}\n\t\treturn results;\n\t}\n\n\t/**\n\t * List all registered bulkheads and their current stats.\n\t */\n\tlistBulkheads(): Array<{\n\t\tname: string;\n\t\tinFlight: number;\n\t\tqueued: number;\n\t\tmaxConcurrent: number;\n\t}> {\n\t\tconst results: Array<{\n\t\t\tname: string;\n\t\t\tinFlight: number;\n\t\t\tqueued: number;\n\t\t\tmaxConcurrent: number;\n\t\t}> = [];\n\t\tfor (const [name, bh] of this.bulkheads) {\n\t\t\tresults.push({\n\t\t\t\tname,\n\t\t\t\t...bh.stats,\n\t\t\t\tmaxConcurrent: bh.config.maxConcurrent,\n\t\t\t});\n\t\t}\n\t\treturn results;\n\t}\n\n\t/** Retry with default config. */\n\tretry<T>(fn: (signal: AbortSignal) => Promise<T> | T, cfg?: RetryConfig): Promise<T> {\n\t\treturn retry(fn, { ...this.defaults.retry, ...cfg });\n\t}\n\n\t/** Compute the backoff for a given attempt. Exposed for tests. */\n\tcomputeBackoff(attempt: number, overrides?: Partial<RetryConfig>): number {\n\t\tconst cfg = { ...this.defaults.retry, ...overrides };\n\t\t// Local copy of the same algorithm — kept here to avoid\n\t\t// importing from retry.ts just for the math.\n\t\tconst { initialDelay, maxDelay, multiplier } = cfg;\n\t\tconst backoff: BackoffStrategy = cfg.backoff;\n\t\tlet raw: number;\n\t\tswitch (backoff) {\n\t\t\tcase \"constant\":\n\t\t\t\traw = initialDelay;\n\t\t\t\tbreak;\n\t\t\tcase \"linear\":\n\t\t\t\traw = initialDelay * attempt;\n\t\t\t\tbreak;\n\t\t\tcase \"exponential\":\n\t\t\t\traw = initialDelay * Math.pow(multiplier, attempt - 1);\n\t\t\t\tbreak;\n\t\t\tcase \"exponential-jitter\":\n\t\t\t\traw = Math.random() * initialDelay * Math.pow(multiplier, attempt - 1);\n\t\t\t\tbreak;\n\t\t}\n\t\treturn Math.min(raw, maxDelay);\n\t}\n}\n",
12
+ "/**\n * `ResilienceService` — owns the named circuit-breaker and bulkhead\n * registry. Exposed via DI so multiple parts of an app can share\n * the same circuit for an external dependency.\n *\n * @Inject(ResilienceService.TOKEN) declare private r: ResilienceService;\n *\n * const cb = this.r.getOrCreateCircuit(\"stripe\", { threshold: 0.5 });\n * const result = await cb.execute(() => stripeApi.charge(...));\n *\n * The service also holds the *default* config (RetryConfig,\n * CircuitBreakerConfig, BulkheadConfig) used by the decorators\n * when no per-call options are given.\n */\nimport { Inject, Injectable } from \"@nexusts/core\";\nimport { CircuitBreaker } from \"./circuit-breaker.js\";\nimport { Bulkhead } from \"./bulkhead.js\";\nimport { retry } from \"./retry.js\";\nimport type {\n\tBackoffStrategy,\n\tBulkheadConfig,\n\tCircuitBreakerConfig,\n\tResilienceConfig,\n\tResilienceStore,\n\tRetryConfig,\n} from \"./types.js\";\n\n@Injectable()\nexport class ResilienceService {\n\t/** DI token — `@Inject(ResilienceService.TOKEN)`. */\n\tstatic readonly TOKEN = Symbol.for(\"nexus:ResilienceService\");\n\n\t/** Resilience config — injected by DI container. */\n\t@Inject(\"RESILIENCE_CONFIG\") declare private _config: ResilienceConfig;\n\n\treadonly defaults: {\n\t\tretry: Required<RetryConfig>;\n\t\tcircuit: Required<CircuitBreakerConfig>;\n\t\tbulkhead: Required<BulkheadConfig>;\n\t};\n\n\tprivate circuits = new Map<string, CircuitBreaker>();\n\tprivate bulkheads = new Map<string, Bulkhead>();\n\tprivate store?: ResilienceStore;\n\tprivate syncIntervalMs: number;\n\n\tconstructor(configOrStore?: ResilienceConfig | ResilienceStore, store?: ResilienceStore) {\n\t\t// Support two call patterns:\n\t\t// new ResilienceService(config, store) — from module's useFactory\n\t\t// new ResilienceService() — direct (DI sets @Inject fields)\n\t\tconst cfg = (configOrStore && typeof configOrStore === \"object\" && \"retry\" in configOrStore) \n\t\t\t? (configOrStore as ResilienceConfig) \n\t\t\t: (this._config ?? {});\n\t\tconst resolvedStore = store ?? \n\t\t\t((configOrStore && typeof configOrStore === \"object\" && !(\"retry\" in configOrStore))\n\t\t\t\t? (configOrStore as ResilienceStore) \n\t\t\t\t: undefined);\n\t\tthis.syncIntervalMs = cfg.syncIntervalMs ?? 5000;\n\t\tthis.store = resolvedStore ?? undefined;\n\t\tthis.defaults = {\n\t\t\tretry: {\n\t\t\t\tattempts: 3,\n\t\t\t\tinitialDelay: 100,\n\t\t\t\tmaxDelay: 30_000,\n\t\t\t\tbackoff: \"exponential-jitter\",\n\t\t\t\tmultiplier: 2,\n\t\t\t\t...cfg.retry,\n\t\t\t} as Required<RetryConfig>,\n\t\t\tcircuit: {\n\t\t\t\tthreshold: 0.5,\n\t\t\t\tminCalls: 5,\n\t\t\t\ttimeout: 30_000,\n\t\t\t\thalfOpenAfter: 1,\n\t\t\t\twindow: 60_000,\n\t\t\t\t...cfg.circuit,\n\t\t\t} as Required<CircuitBreakerConfig>,\n\t\t\tbulkhead: {\n\t\t\t\tmaxConcurrent: 10,\n\t\t\t\tmaxQueued: 100,\n\t\t\t\trejectOnFull: false,\n\t\t\t\t...cfg.bulkhead,\n\t\t\t} as Required<BulkheadConfig>,\n\t\t};\n\t}\n\n\t/** Set (or replace) the cross-pod store after construction. */\n\tsetStore(store: ResilienceStore): void {\n\t\tthis.store = store;\n\t\tfor (const cb of this.circuits.values()) {\n\t\t\tcb._store = store;\n\t\t\tcb._syncIntervalMs = this.syncIntervalMs;\n\t\t}\n\t}\n\n\t/** Get or create a named circuit breaker. Shared across the app. */\n\tgetOrCreateCircuit(name: string, config: CircuitBreakerConfig = {}): CircuitBreaker {\n\t\tlet cb = this.circuits.get(name);\n\t\tif (!cb) {\n\t\t\tcb = new CircuitBreaker(name, { ...this.defaults.circuit, ...config });\n\t\t\tif (this.store) {\n\t\t\t\tcb._store = this.store;\n\t\t\t\tcb._syncIntervalMs = this.syncIntervalMs;\n\t\t\t}\n\t\t\tthis.circuits.set(name, cb);\n\t\t}\n\t\treturn cb;\n\t}\n\n\t/** Get or create a named bulkhead. */\n\tgetOrCreateBulkhead(name: string, config: BulkheadConfig = {}): Bulkhead {\n\t\tlet bh = this.bulkheads.get(name);\n\t\tif (!bh) {\n\t\t\t// Merge: explicit config overrides defaults, except for\n\t\t\t// `name` (always use the caller's name). Strip `name` from\n\t\t\t// the defaults before spreading to avoid a duplicate.\n\t\t\tconst { name: _ignored, ...defaultRest } = this.defaults.bulkhead as BulkheadConfig;\n\t\t\tvoid _ignored;\n\t\t\tbh = new Bulkhead({ ...defaultRest, ...config, name });\n\t\t\tthis.bulkheads.set(name, bh);\n\t\t}\n\t\treturn bh;\n\t}\n\n\t/** Look up an existing circuit (no creation). */\n\tgetCircuit(name: string): CircuitBreaker | undefined {\n\t\treturn this.circuits.get(name);\n\t}\n\n\t/** Look up an existing bulkhead. */\n\tgetBulkhead(name: string): Bulkhead | undefined {\n\t\treturn this.bulkheads.get(name);\n\t}\n\n\t/**\n\t * List all registered circuit breakers and their current metrics.\n\t * Useful for admin dashboards and monitoring.\n\t */\n\tlistCircuits(): Array<{\n\t\tname: string;\n\t\tstate: import(\"./types.js\").CircuitState;\n\t\tmetrics: import(\"./types.js\").CircuitMetrics;\n\t}> {\n\t\tconst results: Array<{\n\t\t\tname: string;\n\t\t\tstate: import(\"./types.js\").CircuitState;\n\t\t\tmetrics: import(\"./types.js\").CircuitMetrics;\n\t\t}> = [];\n\t\tfor (const [name, cb] of this.circuits) {\n\t\t\tresults.push({ name, state: cb.currentState, metrics: cb.metrics() });\n\t\t}\n\t\treturn results;\n\t}\n\n\t/**\n\t * List all registered bulkheads and their current stats.\n\t */\n\tlistBulkheads(): Array<{\n\t\tname: string;\n\t\tinFlight: number;\n\t\tqueued: number;\n\t\tmaxConcurrent: number;\n\t}> {\n\t\tconst results: Array<{\n\t\t\tname: string;\n\t\t\tinFlight: number;\n\t\t\tqueued: number;\n\t\t\tmaxConcurrent: number;\n\t\t}> = [];\n\t\tfor (const [name, bh] of this.bulkheads) {\n\t\t\tresults.push({\n\t\t\t\tname,\n\t\t\t\t...bh.stats,\n\t\t\t\tmaxConcurrent: bh.config.maxConcurrent,\n\t\t\t});\n\t\t}\n\t\treturn results;\n\t}\n\n\t/** Retry with default config. */\n\tretry<T>(fn: (signal: AbortSignal) => Promise<T> | T, cfg?: RetryConfig): Promise<T> {\n\t\treturn retry(fn, { ...this.defaults.retry, ...cfg });\n\t}\n\n\t/** Compute the backoff for a given attempt. Exposed for tests. */\n\tcomputeBackoff(attempt: number, overrides?: Partial<RetryConfig>): number {\n\t\tconst cfg = { ...this.defaults.retry, ...overrides };\n\t\t// Local copy of the same algorithm — kept here to avoid\n\t\t// importing from retry.ts just for the math.\n\t\tconst { initialDelay, maxDelay, multiplier } = cfg;\n\t\tconst backoff: BackoffStrategy = cfg.backoff;\n\t\tlet raw: number;\n\t\tswitch (backoff) {\n\t\t\tcase \"constant\":\n\t\t\t\traw = initialDelay;\n\t\t\t\tbreak;\n\t\t\tcase \"linear\":\n\t\t\t\traw = initialDelay * attempt;\n\t\t\t\tbreak;\n\t\t\tcase \"exponential\":\n\t\t\t\traw = initialDelay * Math.pow(multiplier, attempt - 1);\n\t\t\t\tbreak;\n\t\t\tcase \"exponential-jitter\":\n\t\t\t\traw = Math.random() * initialDelay * Math.pow(multiplier, attempt - 1);\n\t\t\t\tbreak;\n\t\t}\n\t\treturn Math.min(raw, maxDelay);\n\t}\n}\n",
13
13
  "/**\n * `ResilienceModule` — drop-in DI for the resilience primitives.\n *\n * @Module({\n * imports: [\n * ResilienceModule.forRoot({\n * retry: { attempts: 3, backoff: \"exponential-jitter\" },\n * circuit: { threshold: 0.5, timeout: 30_000 },\n * }),\n * ],\n * })\n * class AppModule {}\n *\n * After boot, the service is available as `@Inject(ResilienceService.TOKEN)`\n * — controllers can call `svc.getOrCreateCircuit(\"stripe\")` to share\n * a circuit breaker with the rest of the app.\n *\n * The decorators (`@Retry`, `@CircuitBreaker`, `@Bulkhead`,\n * `@Resilient`) work without the module — they pick up the\n * service from the DI container at controller-mount time.\n */\nimport { Module, setControllerMethodHook } from \"@nexusts/core\";\nimport { ResilienceService } from \"./resilience.service.js\";\nimport {\n\tsetResilienceService,\n\tgetResilientMetadata,\n\tmakeResilientWrapper,\n} from \"./decorators/index.js\";\nimport { MemoryResilienceStore } from \"./stores/memory.js\";\nimport type { ResilienceConfig, ResilienceStore } from \"./types.js\";\n\n@Module({\n\tproviders: [\n\t\tResilienceService,\n\t\t{ provide: ResilienceService.TOKEN, useExisting: ResilienceService },\n\t],\n\texports: [ResilienceService, ResilienceService.TOKEN],\n})\nexport class ResilienceModule {\n\tstatic forRoot(config: ResilienceConfig = {}) {\n\t\t// Eager-wrap: at controller-mount time, check each method for\n\t\t// @Retry / @CircuitBreaker / @Bulkhead / @Resilient metadata and\n\t\t// wrap it so the call goes through the resilience pipeline without\n\t\t// any explicit `svc.retry(...)` / `cb.execute(...)` boilerplate.\n\t\t// The service is resolved lazily at call time via getResilienceService().\n\t\tsetControllerMethodHook((proto, propertyKey, handler) => {\n\t\t\tconst meta = getResilientMetadata(proto, propertyKey);\n\t\t\tif (!meta.retry && !meta.circuit && !meta.bulkhead) return handler;\n\t\t\treturn makeResilientWrapper(\n\t\t\t\thandler,\n\t\t\t\t() => getResilientMetadata(proto, propertyKey),\n\t\t\t);\n\t\t});\n\n\t\t@Module({\n\t\t\tproviders: [\n\t\t\t\t{\n\t\t\t\t\tprovide: ResilienceService.TOKEN,\n\t\t\t\t\tuseFactory: () => {\n\t\t\t\t\t\t// Resolve the cross-pod store synchronously.\n\t\t\t\t\t\t// For Redis: pre-build the store and pass it as an instance:\n\t\t\t\t\t\t// const store = new RedisResilienceStore(client);\n\t\t\t\t\t\t// ResilienceModule.forRoot({ store });\n\t\t\t\t\t\tlet store: ResilienceStore | undefined;\n\t\t\t\t\t\tif (config.store && config.store !== \"memory\" && config.store !== \"redis\") {\n\t\t\t\t\t\t\tstore = config.store as ResilienceStore;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tstore = new MemoryResilienceStore();\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst svc = new ResilienceService(config, store);\n\t\t\t\t\t\t// Register globally so the eager-decorator path\n\t\t\t\t\t\t// (in `decorators/index.ts`) can find us without\n\t\t\t\t\t\t// needing each controller method to carry an\n\t\t\t\t\t\t// `@Inject(ResilienceService.TOKEN)` argument.\n\t\t\t\t\t\tsetResilienceService(svc);\n\t\t\t\t\t\treturn svc;\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tprovide: \"RESILIENCE_CONFIG\",\n\t\t\t\t\tuseValue: config,\n\t\t\t\t},\n\t\t\t],\n\t\t\texports: [ResilienceService.TOKEN, \"RESILIENCE_CONFIG\"],\n\t\t})\n\t\tclass ConfiguredResilienceModule {}\n\t\tObject.defineProperty(ConfiguredResilienceModule, \"name\", {\n\t\t\tvalue: \"ConfiguredResilienceModule\",\n\t\t});\n\t\treturn ConfiguredResilienceModule;\n\t}\n}\n",
14
14
  "/**\n * Decorator barrel for `@nexusts/resilience`.\n *\n * The three method decorators (`@Retry`, `@CircuitBreaker`,\n * `@Bulkhead`) plus the combined `@Resilient` decorator are\n * implemented as **metadata-only** decorators — they write options\n * to the method's `reflect-metadata` store, and an\n * `ResilienceInterceptor` (or a runtime hook) reads and applies\n * them at call time.\n *\n * @Retry({ attempts: 3, backoff: \"exponential\" })\n * async fetchUser(id: string) { ... }\n *\n * @CircuitBreaker({ threshold: 0.5, timeout: 30_000 })\n * async callStripe() { ... }\n *\n * @Bulkhead({ maxConcurrent: 5 })\n * async callExpensive() { ... }\n *\n * @Resilient({ retry: {...}, circuit: {...}, bulkhead: {...} })\n * async criticalCall() { ... }\n */\nimport type {\n\tBulkheadConfig,\n\tCircuitBreakerConfig,\n\tResilientConfig,\n\tRetryConfig,\n} from \"../types.js\";\nimport { RESILIENCE_META } from \"../types.js\";\n\n// Use `import type` for the service to avoid a circular import:\n// `resilience.service.ts` → `decorators/index.ts` → `resilience.service.ts`.\n// At runtime, the dependency is set via `setResilienceService()` so\n// only the *type* needs to be visible at type-check time.\nimport type { ResilienceService } from \"../resilience.service.js\";\nimport { safeGetMeta, safeDefineMeta, safeHasMeta } from \"@nexusts/core/di/safe-reflect\";\n\n// Per-method metadata kinds. Each decorator stores its own\n// payload under a separate key so a method can have e.g. `@Retry`\n// and `@CircuitBreaker` simultaneously.\nconst KEY_RETRY = Symbol.for(\"nexus:Resilience:Retry\");\nconst KEY_CIRCUIT = Symbol.for(\"nexus:Resilience:Circuit\");\nconst KEY_BULKHEAD = Symbol.for(\"nexus:Resilience:Bulkhead\");\nconst KEY_RESILIENT = Symbol.for(\"nexus:Resilience:Resilient\");\n\nexport interface RetryMeta {\n\tconfig: RetryConfig;\n\t/** Captured bound `this` at call time. */\n}\nexport interface CircuitMeta {\n\tconfig: CircuitBreakerConfig;\n}\nexport interface BulkheadMeta {\n\tconfig: BulkheadConfig;\n}\nexport interface ResilientMeta {\n\tconfig: ResilientConfig;\n}\n\n/** Read the metadata for a given method. */\nexport function getMethodRetry(\n\ttarget: object,\n\tpropertyKey: string | symbol,\n): RetryConfig | undefined {\n\treturn safeGetMeta(KEY_RETRY, target, propertyKey) as RetryConfig | undefined;\n}\n\nexport function getMethodCircuit(\n\ttarget: object,\n\tpropertyKey: string | symbol,\n): CircuitBreakerConfig | undefined {\n\treturn safeGetMeta(KEY_CIRCUIT, target, propertyKey) as\n\t\t| CircuitBreakerConfig\n\t\t| undefined;\n}\n\nexport function getMethodBulkhead(\n\ttarget: object,\n\tpropertyKey: string | symbol,\n): BulkheadConfig | undefined {\n\treturn safeGetMeta(KEY_BULKHEAD, target, propertyKey) as\n\t\t| BulkheadConfig\n\t\t| undefined;\n}\n\nexport function getMethodResilient(\n\ttarget: object,\n\tpropertyKey: string | symbol,\n): ResilientConfig | undefined {\n\treturn safeGetMeta(KEY_RESILIENT, target, propertyKey) as\n\t\t| ResilientConfig\n\t\t| undefined;\n}\n\n// ============================================================================\n// Decorator factories\n// ============================================================================\n\nfunction makeMethodDecorator<TConfig>(\n\tkey: symbol,\n\textract: (config: TConfig) => unknown,\n): (config: TConfig) => MethodDecorator {\n\treturn (config: TConfig): MethodDecorator => {\n\t\treturn (\n\t\t\t_target: object,\n\t\t\tpropertyKey: string | symbol,\n\t\t\t_descriptor: TypedPropertyDescriptor<any>,\n\t\t): void => {\n\t\t\t// Metadata-only — we don't touch `descriptor.value`\n\t\t\t// here because Bun 1.3's stage-3 decorator mode (the\n\t\t\t// default) doesn't pass it. Instead, the framework\n\t\t\t// reads the metadata at controller-mount time and\n\t\t\t// calls `applyResilience()` to wrap the method.\n\t\t\tsafeDefineMeta(key, extract(config), _target, propertyKey);\n\t\t};\n\t};\n}\n\n// Used by `applyResilience()` below (exported for users who want\n// to wire it into their own framework hook). Not invoked from the\n// decorator factories themselves — that would require reading\n// `descriptor.value` in the decorator body, which Bun's stage-3\n// decorator mode (the default in Bun 1.3+) doesn't supply.\nexport function getResilientMetadata(target: object, propertyKey: string | symbol) {\n\tconst resilient = getMethodResilient(target, propertyKey);\n\tconst retry = resilient?.retry ?? getMethodRetry(target, propertyKey);\n\tconst circuit = resilient?.circuit ?? getMethodCircuit(target, propertyKey);\n\tconst bulkhead = resilient?.bulkhead ?? getMethodBulkhead(target, propertyKey);\n\treturn { retry, circuit, bulkhead };\n}\n\n// Used by `applyResilience()` below; same rationale as above.\nexport function makeResilientWrapper(\n\toriginal: Function,\n\tresolveMeta: () => {\n\t\tretry?: RetryConfig;\n\t\tcircuit?: CircuitBreakerConfig;\n\t\tbulkhead?: BulkheadConfig;\n\t},\n): Function {\n\treturn function (this: unknown, ...args: any[]) {\n\t\tconst meta = resolveMeta();\n\t\tif (!meta.retry && !meta.circuit && !meta.bulkhead) {\n\t\t\treturn original.apply(this, args);\n\t\t}\n\t\tconst svc = getResilienceService();\n\t\tif (!svc) {\n\t\t\treturn original.apply(this, args);\n\t\t}\n\t\tconst name = original.name || \"anonymous\";\n\n\t\tconst fn = () => original.apply(this, args);\n\t\tconst runOnce = () =>\n\t\t\tmeta.bulkhead\n\t\t\t\t? svc.getOrCreateBulkhead(name, meta.bulkhead).execute(fn)\n\t\t\t\t: fn();\n\t\tconst runWithCircuit = () =>\n\t\t\tmeta.circuit\n\t\t\t\t? svc.getOrCreateCircuit(name, meta.circuit).execute(runOnce)\n\t\t\t\t: runOnce();\n\t\tconst runWithRetry = () =>\n\t\t\tmeta.retry ? svc.retry(runWithCircuit, meta.retry) : runWithCircuit();\n\n\t\treturn runWithRetry();\n\t};\n}\n\n/**\n * Module-level handle to the `ResilienceService`. Set by\n * `ResilienceModule.forRoot()` so the eager-decorator path can\n * access the registry without each method carrying the DI token.\n */\nlet _resilienceService: ResilienceService | null = null;\n\n/** Public — used by `ResilienceModule` to register the service. */\nexport function setResilienceService(svc: ResilienceService | null): void {\n\t_resilienceService = svc;\n}\n\n/** Public — used by the eager decorator path. */\nexport function getResilienceService(): ResilienceService | null {\n\treturn _resilienceService;\n}\n\n/** `@Retry(config)` — retry the method with backoff. */\nexport const Retry = makeMethodDecorator<RetryConfig>(KEY_RETRY, (c) => c);\n\n/** `@CircuitBreaker(config)` — wrap the method in a named circuit. */\nexport const CircuitBreaker = makeMethodDecorator<CircuitBreakerConfig>(\n\tKEY_CIRCUIT,\n\t(c) => c,\n);\n\n/** `@Bulkhead(config)` — limit concurrency for the method. */\nexport const Bulkhead = makeMethodDecorator<BulkheadConfig>(KEY_BULKHEAD, (c) => c);\n\n/** `@Resilient(config)` — combine retry + circuit + bulkhead. */\nexport const Resilient = makeMethodDecorator<ResilientConfig>(\n\tKEY_RESILIENT,\n\t(c) => c,\n);\n\n// ============================================================================\n// `applyResilience()` — runtime hook\n// ============================================================================\n\n/**\n * Read all `@Resilient` / `@Retry` / `@CircuitBreaker` / `@Bulkhead`\n * metadata on `target` and apply the corresponding wrappers around\n * `descriptor.value`. The framework wires this up via\n * `ResilienceService` when controllers are mounted.\n */\nexport function applyResilience(\n\ttarget: object,\n\tpropertyKey: string | symbol,\n\tdescriptor: TypedPropertyDescriptor<any>,\n\tsvc: import(\"../resilience.service.js\").ResilienceService,\n): TypedPropertyDescriptor<any> {\n\tif (!descriptor.value || typeof descriptor.value !== \"function\") {\n\t\treturn descriptor;\n\t}\n\tconst original = descriptor.value;\n\n\tconst resilient = getMethodResilient(target, propertyKey);\n\tconst retry = resilient?.retry ?? getMethodRetry(target, propertyKey);\n\tconst circuit = resilient?.circuit ?? getMethodCircuit(target, propertyKey);\n\tconst bulkhead = resilient?.bulkhead ?? getMethodBulkhead(target, propertyKey);\n\n\tif (!retry && !circuit && !bulkhead) {\n\t\treturn descriptor; // No resilience — leave the method alone.\n\t}\n\n\tconst wrapped = async function (this: unknown, ...args: any[]) {\n\t\tconst name = String(propertyKey);\n\t\tconst fn = () => original.apply(this, args);\n\n\t\tconst runOnce = async () => {\n\t\t\tif (bulkhead) {\n\t\t\t\tconst bh = svc.getOrCreateBulkhead(name, bulkhead);\n\t\t\t\treturn bh.execute(fn);\n\t\t\t}\n\t\t\treturn fn();\n\t\t};\n\n\t\tconst runWithCircuit = async () => {\n\t\t\tif (circuit) {\n\t\t\t\tconst cb = svc.getOrCreateCircuit(name, circuit);\n\t\t\t\treturn cb.execute(runOnce);\n\t\t\t}\n\t\t\treturn runOnce();\n\t\t};\n\n\t\tconst runWithRetry = async () => {\n\t\t\tif (retry) {\n\t\t\t\treturn svc.retry(runWithCircuit, retry);\n\t\t\t}\n\t\t\treturn runWithCircuit();\n\t\t};\n\n\t\treturn runWithRetry();\n\t};\n\n\treturn {\n\t\t...descriptor,\n\t\tvalue: wrapped,\n\t};\n}\n\n// Re-export the meta key for tests.\nexport { RESILIENCE_META };\n",
15
- "/**\n * `ResilienceAdminModule` — opt-in HTTP endpoints for inspecting and\n * controlling circuit breakers and bulkheads at runtime.\n *\n * Usage:\n *\n * @Module({\n * imports: [\n * ResilienceModule.forRoot({ threshold: 0.5 }),\n * ResilienceAdminModule.forRoot({ prefix: '/admin/resilience' }),\n * ],\n * })\n * class AppModule {}\n *\n * Endpoints (relative to `prefix`, default `/resilience`):\n * GET /resilience/circuits — list all circuits\n * GET /resilience/bulkheads — list all bulkheads\n * POST /resilience/circuits/:name/force-open\n * POST /resilience/circuits/:name/force-close\n * POST /resilience/circuits/:name/reset\n *\n * Requires `ResilienceModule.forRoot()` to also be imported — the admin\n * module resolves `ResilienceService.TOKEN` through the shared DI parent\n * container that both modules register into.\n */\nimport { Controller, Get, Post, Param, Inject, Module } from \"@nexusts/core\";\nimport { ResilienceService } from \"./resilience.service.js\";\n\nexport interface ResilienceAdminConfig {\n\t/** Route prefix. Default: `\"/resilience\"`. */\n\tprefix?: string;\n}\n\nexport class ResilienceAdminModule {\n\tstatic forRoot(config: ResilienceAdminConfig = {}) {\n\t\tconst prefix = config.prefix ?? \"/resilience\";\n\n\t\t@Controller(prefix)\n\t\tclass ResilienceAdminController {\n\t\t\t_svc: ResilienceService;\n\t\t\tconstructor(@Inject(ResilienceService.TOKEN) svc: ResilienceService) {\n\t\t\t\tthis._svc = svc;\n\t\t\t}\n\n\t\t\t@Get(\"/circuits\")\n\t\t\tlistCircuits() {\n\t\t\t\treturn this._svc.listCircuits();\n\t\t\t}\n\n\t\t\t@Get(\"/bulkheads\")\n\t\t\tlistBulkheads() {\n\t\t\t\treturn this._svc.listBulkheads();\n\t\t\t}\n\n\t\t\t@Post(\"/circuits/:name/force-open\")\n\t\t\tforceOpen(@Param(\"name\") name: string) {\n\t\t\t\tconst cb = this._svc.getCircuit(name);\n\t\t\t\tif (!cb) {\n\t\t\t\t\treturn { status: 404, body: { error: `Circuit \"${name}\" not found` } };\n\t\t\t\t}\n\t\t\t\tcb.forceOpen();\n\t\t\t\treturn { name, state: \"open\" };\n\t\t\t}\n\n\t\t\t@Post(\"/circuits/:name/force-close\")\n\t\t\tforceClose(@Param(\"name\") name: string) {\n\t\t\t\tconst cb = this._svc.getCircuit(name);\n\t\t\t\tif (!cb) {\n\t\t\t\t\treturn { status: 404, body: { error: `Circuit \"${name}\" not found` } };\n\t\t\t\t}\n\t\t\t\tcb.forceClose();\n\t\t\t\treturn { name, state: \"closed\" };\n\t\t\t}\n\n\t\t\t@Post(\"/circuits/:name/reset\")\n\t\t\treset(@Param(\"name\") name: string) {\n\t\t\t\tconst cb = this._svc.getCircuit(name);\n\t\t\t\tif (!cb) {\n\t\t\t\t\treturn { status: 404, body: { error: `Circuit \"${name}\" not found` } };\n\t\t\t\t}\n\t\t\t\tcb.reset();\n\t\t\t\treturn { name, state: \"closed\" };\n\t\t\t}\n\t\t}\n\n\t\tObject.defineProperty(ResilienceAdminController, \"name\", {\n\t\t\tvalue: \"ResilienceAdminController\",\n\t\t});\n\n\t\t@Module({\n\t\t\tcontrollers: [ResilienceAdminController],\n\t\t})\n\t\tclass ConfiguredResilienceAdminModule {}\n\n\t\tObject.defineProperty(ConfiguredResilienceAdminModule, \"name\", {\n\t\t\tvalue: \"ConfiguredResilienceAdminModule\",\n\t\t});\n\n\t\treturn ConfiguredResilienceAdminModule;\n\t}\n}\n"
15
+ "/**\n * `ResilienceAdminModule` — opt-in HTTP endpoints for inspecting and\n * controlling circuit breakers and bulkheads at runtime.\n *\n * Usage:\n *\n * @Module({\n * imports: [\n * ResilienceModule.forRoot({ threshold: 0.5 }),\n * ResilienceAdminModule.forRoot({ prefix: '/admin/resilience' }),\n * ],\n * })\n * class AppModule {}\n *\n * Endpoints (relative to `prefix`, default `/resilience`):\n * GET /resilience/circuits — list all circuits\n * GET /resilience/bulkheads — list all bulkheads\n * POST /resilience/circuits/:name/force-open\n * POST /resilience/circuits/:name/force-close\n * POST /resilience/circuits/:name/reset\n *\n * Requires `ResilienceModule.forRoot()` to also be imported — the admin\n * module resolves `ResilienceService.TOKEN` through the shared DI parent\n * container that both modules register into.\n */\nimport { Controller, Get, Post, Param, Inject, Module } from \"@nexusts/core\";\nimport { ResilienceService } from \"./resilience.service.js\";\n\nexport interface ResilienceAdminConfig {\n\t/** Route prefix. Default: `\"/resilience\"`. */\n\tprefix?: string;\n}\n\nexport class ResilienceAdminModule {\n\tstatic forRoot(config: ResilienceAdminConfig = {}) {\n\t\tconst prefix = config.prefix ?? \"/resilience\";\n\n\t\t@Controller(prefix)\n\t\tclass ResilienceAdminController {\n\t\t\t@Inject(ResilienceService.TOKEN) declare private _svc: ResilienceService;\n\n\t\t\t@Get(\"/circuits\")\n\t\t\tlistCircuits() {\n\t\t\t\treturn this._svc.listCircuits();\n\t\t\t}\n\n\t\t\t@Get(\"/bulkheads\")\n\t\t\tlistBulkheads() {\n\t\t\t\treturn this._svc.listBulkheads();\n\t\t\t}\n\n\t\t\t@Post(\"/circuits/:name/force-open\")\n\t\t\tforceOpen(@Param(\"name\") name: string) {\n\t\t\t\tconst cb = this._svc.getCircuit(name);\n\t\t\t\tif (!cb) {\n\t\t\t\t\treturn { status: 404, body: { error: `Circuit \"${name}\" not found` } };\n\t\t\t\t}\n\t\t\t\tcb.forceOpen();\n\t\t\t\treturn { name, state: \"open\" };\n\t\t\t}\n\n\t\t\t@Post(\"/circuits/:name/force-close\")\n\t\t\tforceClose(@Param(\"name\") name: string) {\n\t\t\t\tconst cb = this._svc.getCircuit(name);\n\t\t\t\tif (!cb) {\n\t\t\t\t\treturn { status: 404, body: { error: `Circuit \"${name}\" not found` } };\n\t\t\t\t}\n\t\t\t\tcb.forceClose();\n\t\t\t\treturn { name, state: \"closed\" };\n\t\t\t}\n\n\t\t\t@Post(\"/circuits/:name/reset\")\n\t\t\treset(@Param(\"name\") name: string) {\n\t\t\t\tconst cb = this._svc.getCircuit(name);\n\t\t\t\tif (!cb) {\n\t\t\t\t\treturn { status: 404, body: { error: `Circuit \"${name}\" not found` } };\n\t\t\t\t}\n\t\t\t\tcb.reset();\n\t\t\t\treturn { name, state: \"closed\" };\n\t\t\t}\n\t\t}\n\n\t\tObject.defineProperty(ResilienceAdminController, \"name\", {\n\t\t\tvalue: \"ResilienceAdminController\",\n\t\t});\n\n\t\t@Module({\n\t\t\tcontrollers: [ResilienceAdminController],\n\t\t})\n\t\tclass ConfiguredResilienceAdminModule {}\n\n\t\tObject.defineProperty(ConfiguredResilienceAdminModule, \"name\", {\n\t\t\tvalue: \"ConfiguredResilienceAdminModule\",\n\t\t});\n\n\t\treturn ConfiguredResilienceAdminModule;\n\t}\n}\n"
16
16
  ],
17
- "mappings": "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",
18
- "debugId": "E341E3389B8B37CD64756E2164756E21",
17
+ "mappings": "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",
18
+ "debugId": "4CD142AD13A28E7B64756E2164756E21",
19
19
  "names": []
20
20
  }
@@ -4,6 +4,8 @@ import type { BulkheadConfig, CircuitBreakerConfig, ResilienceConfig, Resilience
4
4
  export declare class ResilienceService {
5
5
  /** DI token — `@Inject(ResilienceService.TOKEN)`. */
6
6
  static readonly TOKEN: unique symbol;
7
+ /** Resilience config — injected by DI container. */
8
+ private _config;
7
9
  readonly defaults: {
8
10
  retry: Required<RetryConfig>;
9
11
  circuit: Required<CircuitBreakerConfig>;
@@ -13,7 +15,7 @@ export declare class ResilienceService {
13
15
  private bulkheads;
14
16
  private store?;
15
17
  private syncIntervalMs;
16
- constructor(config?: ResilienceConfig, store?: ResilienceStore);
18
+ constructor(configOrStore?: ResilienceConfig | ResilienceStore, store?: ResilienceStore);
17
19
  /** Set (or replace) the cross-pod store after construction. */
18
20
  setStore(store: ResilienceStore): void;
19
21
  /** Get or create a named circuit breaker. Shared across the app. */
@@ -2,6 +2,8 @@ import type { CircuitSnapshot, ResilienceStore } from "../types.js";
2
2
  /** In-process store — default, no external dependencies. */
3
3
  export declare class MemoryResilienceStore implements ResilienceStore {
4
4
  #private;
5
- getSnapshot(name: string): Promise<CircuitSnapshot | null>;
5
+ loadSnapshot(name: string): Promise<CircuitSnapshot | null>;
6
6
  saveSnapshot(name: string, snapshot: CircuitSnapshot): Promise<void>;
7
+ /** @deprecated Use loadSnapshot instead. */
8
+ getSnapshot(name: string): Promise<CircuitSnapshot | null>;
7
9
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nexusts/resilience",
3
- "version": "0.9.6",
3
+ "version": "0.9.8",
4
4
  "description": "Retry + Circuit Breaker + Bulkhead",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -26,7 +26,7 @@
26
26
  ],
27
27
  "license": "MIT",
28
28
  "dependencies": {
29
- "@nexusts/core": "^0.9.6"
29
+ "@nexusts/core": "^0.9.8"
30
30
  },
31
31
  "repository": {
32
32
  "type": "git",