@mmstack/resource 22.1.3 → 22.1.4

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.
@@ -2490,8 +2490,7 @@ function mutationResource(request, options0 = {}) {
2490
2490
  if (isDevMode())
2491
2491
  console.error('[@mmstack/resource]: error thrown in onMutate hook, mutation was not applied', mutationErr);
2492
2492
  }
2493
- }, /* @ts-ignore */
2494
- ...(ngDevMode ? [{ debugName: "queueRef" }] : /* istanbul ignore next */ []));
2493
+ }, { ...(ngDevMode ? { debugName: "queueRef" } : /* istanbul ignore next */ {}), injector: options.injector });
2495
2494
  const req = computed(() => {
2496
2495
  const nr = next();
2497
2496
  if (nr === NULL_VALUE)
@@ -2537,9 +2536,13 @@ function mutationResource(request, options0 = {}) {
2537
2536
  const destroyRef = options.injector
2538
2537
  ? options.injector.get(DestroyRef)
2539
2538
  : inject(DestroyRef);
2540
- const error$ = toObservable(resource.error);
2541
- const value$ = toObservable(resource.value).pipe(catchError(() => of(NULL_VALUE)));
2542
- const statusSub = toObservable(resource.status)
2539
+ const error$ = toObservable(resource.error, { injector: options.injector });
2540
+ const value$ = toObservable(resource.value, {
2541
+ injector: options.injector,
2542
+ }).pipe(catchError(() => of(NULL_VALUE)));
2543
+ const statusSub = toObservable(resource.status, {
2544
+ injector: options.injector,
2545
+ })
2543
2546
  .pipe(combineLatestWith(error$, value$), map(([status, error, value]) => {
2544
2547
  if (status === 'error' && error) {
2545
2548
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"mmstack-resource.mjs","sources":["../../../../packages/resource/src/lib/util/cache/persistence.ts","../../../../packages/resource/src/lib/util/cache/cache.ts","../../../../packages/resource/src/lib/util/hash-unknown.ts","../../../../packages/resource/src/lib/util/hash-request.ts","../../../../packages/resource/src/lib/util/share-pending.ts","../../../../packages/resource/src/lib/util/cache/cache-interceptor.ts","../../../../packages/resource/src/lib/util/catch-value-error.ts","../../../../packages/resource/src/lib/util/circuit-breaker.ts","../../../../packages/resource/src/lib/util/dedupe-interceptor.ts","../../../../packages/resource/src/lib/util/equality.ts","../../../../packages/resource/src/lib/util/has-slow-connection.ts","../../../../packages/resource/src/lib/util/merge-options.ts","../../../../packages/resource/src/lib/util/persist.ts","../../../../packages/resource/src/lib/util/refresh.ts","../../../../packages/resource/src/lib/util/retry-on-error.ts","../../../../packages/resource/src/lib/util/sensors.ts","../../../../packages/resource/src/lib/util/to-resource-object.ts","../../../../packages/resource/src/lib/options.ts","../../../../packages/resource/src/lib/query-resource.ts","../../../../packages/resource/src/lib/infinite-query.ts","../../../../packages/resource/src/lib/manual-query.ts","../../../../packages/resource/src/lib/mutation-resource.ts","../../../../packages/resource/src/mmstack-resource.ts"],"sourcesContent":["import { isDevMode } from '@angular/core';\nimport { type CacheEntry } from './cache';\n\ntype StoredEntry<T> = Omit<CacheEntry<T>, 'timeout'>;\n\nexport type CacheDB<T> = {\n getAll: () => Promise<StoredEntry<T>[]>;\n store: (value: StoredEntry<T>) => Promise<void>;\n remove: (key: string) => Promise<void>;\n};\n\nexport function createNoopDB<T>(): CacheDB<T> {\n return {\n getAll: async () => [],\n store: async () => {\n // noop\n },\n remove: async () => {\n // noop\n },\n };\n}\n\nfunction toCacheDB<T>(db: IDBDatabase, storeName: string): CacheDB<T> {\n const getAll = async () => {\n const now = Date.now();\n return new Promise<StoredEntry<T>[]>((res, rej) => {\n const transaction = db.transaction(storeName, 'readonly');\n const store = transaction.objectStore(storeName);\n const request = store.getAll();\n\n request.onsuccess = () => res(request.result);\n request.onerror = () => rej(request.error);\n // some browsers abort (rather than error) e.g. on quota issues — without this the promise would stay pending forever\n transaction.onabort = () => rej(transaction.error);\n })\n .then((entries) => entries.filter((e) => e.expiresAt > now))\n .catch((err) => {\n if (isDevMode())\n console.error('Error getting all items from cache DB:', err);\n return [];\n });\n };\n\n const store = (value: StoredEntry<T>) => {\n return new Promise<void>((res, rej) => {\n const transaction = db.transaction(storeName, 'readwrite');\n const store = transaction.objectStore(storeName);\n\n store.put(value);\n\n transaction.oncomplete = () => res();\n transaction.onerror = () => rej(transaction.error);\n // QuotaExceededError surfaces as an abort in some browsers\n transaction.onabort = () => rej(transaction.error);\n }).catch((err) => {\n if (isDevMode()) console.error('Error storing item in cache DB:', err);\n });\n };\n\n const remove = (key: string) => {\n return new Promise<void>((res, rej) => {\n const transaction = db.transaction(storeName, 'readwrite');\n const store = transaction.objectStore(storeName);\n\n store.delete(key);\n\n transaction.oncomplete = () => res();\n transaction.onerror = () => rej(transaction.error);\n transaction.onabort = () => rej(transaction.error);\n }).catch((err) => {\n if (isDevMode()) console.error('Error removing item from cache DB:', err);\n });\n };\n\n return {\n getAll,\n store,\n remove,\n };\n}\n\nexport function createSingleStoreDB<T>(\n name: string,\n getStoreName: (version: number) => string,\n version = 1,\n): Promise<CacheDB<T>> {\n const storeName = getStoreName(version);\n\n if (!globalThis.indexedDB) return Promise.resolve(createNoopDB());\n\n return new Promise<IDBDatabase>((res, rej) => {\n if (version < 1) {\n rej(new Error('Version must be 1 or greater'));\n return; // rej does not stop execution — without this, indexedDB.open(name, 0) still runs\n }\n\n const req = indexedDB.open(name, version);\n\n req.onupgradeneeded = (event) => {\n const db = req.result;\n const oldVersion = event.oldVersion;\n\n db.createObjectStore(storeName, { keyPath: 'key' });\n\n if (oldVersion > 0) {\n db.deleteObjectStore(getStoreName(oldVersion));\n }\n };\n\n req.onerror = () => {\n rej(req.error);\n };\n\n req.onsuccess = () => res(req.result);\n })\n .then((db) => toCacheDB<T>(db, storeName))\n .catch((err) => {\n if (isDevMode()) console.error('Error creating query DB:', err);\n return createNoopDB();\n });\n}\n","import { HttpHeaders, HttpResponse } from '@angular/common/http';\nimport {\n computed,\n DestroyRef,\n inject,\n InjectionToken,\n type Injector,\n isDevMode,\n PLATFORM_ID,\n type Provider,\n signal,\n type Signal,\n untracked,\n} from '@angular/core';\nimport { mutable } from '@mmstack/primitives';\nimport { type CacheDB, createNoopDB, createSingleStoreDB } from './persistence';\n\nfunction generateID() {\n if (globalThis.crypto?.randomUUID) {\n return globalThis.crypto.randomUUID();\n }\n return Math.random().toString(36).substring(2);\n}\n\ntype BaseSyncMessage<TEntry, TAction extends string> = {\n entry: TEntry;\n action: TAction;\n};\n\ntype InvalidateMessage<T> = BaseSyncMessage<\n Pick<CacheEntry<T>, 'key'>,\n 'invalidate'\n>;\n\ntype StoreMessage<T> = BaseSyncMessage<Omit<CacheEntry<T>, 'timeout'>, 'store'>;\n\ntype InternalSyncMessage<T> = InvalidateMessage<T> | StoreMessage<T>;\n\n/**\n * A message type used for synchronizing cache updates across tabs.\n * @internal\n * @template T - The type of data being cached.\n */\ntype SyncMessage<T> = InternalSyncMessage<T> & {\n cacheId: string;\n type: 'cache-sync-message';\n};\n\nfunction isSyncMessage<T>(msg: unknown): msg is SyncMessage<T> {\n return (\n typeof msg === 'object' &&\n msg !== null &&\n 'type' in msg &&\n (msg as SyncMessage<T>).type === 'cache-sync-message'\n );\n}\n\n/**\n * Options for configuring the Least Recently Used (LRU) cache cleanup strategy.\n * @internal\n */\ntype LRUCleanupType = {\n type: 'lru';\n /**\n * How often to check for expired or excess entries, in milliseconds.\n */\n checkInterval: number;\n /**\n * The maximum number of entries to keep in the cache. When the cache exceeds this size,\n * the least recently used entries will be removed.\n */\n maxSize: number;\n};\n\n/**\n * Options for configuring the \"oldest first\" cache cleanup strategy.\n * @internal\n */\ntype OldsetCleanupType = {\n type: 'oldest';\n /**\n * How often to check for expired or excess entries, in milliseconds.\n */\n checkInterval: number;\n /**\n * The maximum number of entries to keep in the cache. When the cache exceeds this size,\n * the oldest entries will be removed.\n */\n maxSize: number;\n};\n\n/**\n * Represents an entry in the cache.\n * @internal\n */\nexport type CacheEntry<T> = {\n value: T;\n created: number;\n updated: number;\n stale: number;\n useCount: number;\n /** Timestamp of the last read/write — drives LRU eviction. */\n lastAccessed: number;\n expiresAt: number;\n /** Absent for non-finite/over-int32 TTLs — those rely on lazy expiry instead. */\n timeout?: ReturnType<typeof setTimeout>;\n key: string;\n};\n\n/**\n * setTimeout coerces its delay through a signed 32-bit conversion: `Infinity` becomes 0\n * (immediate!) and anything above 2^31-1 ms (~24.8 days) wraps negative. Entries beyond\n * this bound get NO timer and rely on lazy expiry (`expiresAt <= now` checks) plus the\n * periodic sweep instead.\n */\nconst MAX_TIMER_DELAY = 2 ** 31 - 1;\n\n/**\n * Defines the types of cleanup strategies available for the cache.\n * - `lru`: Least Recently Used. Removes the least recently accessed entries when the cache is full.\n * - `oldest`: Removes the oldest entries when the cache is full.\n */\nexport type CleanupType = LRUCleanupType | OldsetCleanupType;\n\nconst ONE_DAY = 1000 * 60 * 60 * 24;\nconst ONE_HOUR = 1000 * 60 * 60;\n\nconst DEFAULT_CLEANUP_OPT = {\n type: 'lru',\n maxSize: 200,\n checkInterval: ONE_HOUR,\n} satisfies LRUCleanupType;\n\n/**\n * A generic cache implementation that stores data with time-to-live (TTL) and stale-while-revalidate capabilities.\n *\n * @typeParam T - The type of data to be stored in the cache.\n */\nexport class Cache<T> {\n private readonly internal = mutable(new Map<string, CacheEntry<T>>());\n private readonly cleanupOpt: CleanupType;\n private readonly id = generateID();\n /** True once async hydration from the persistence layer has completed (or was empty). */\n private hydrated = false;\n /** Keys invalidated while hydration was still in flight — must not be resurrected by it. */\n private readonly hydrationTombstones = new Set<string>();\n\n private readonly hitCount = signal(0);\n private readonly missCount = signal(0);\n\n /**\n * Read-only cache statistics for debugging/observability — entry count plus\n * request-level hit/miss counters (counted on direct lookups, e.g. the cache\n * interceptor's, not on every reactive signal read). Render it in a debug\n * panel; it intentionally exposes no way to mutate the cache.\n */\n readonly stats: Signal<{ size: number; hits: number; misses: number }> =\n computed(() => ({\n size: this.internal().size,\n hits: this.hitCount(),\n misses: this.missCount(),\n }));\n\n /**\n * Destroys the cache instance, clearing the cleanup interval and closing the\n * cross-tab channel. Called automatically when the providing injector is destroyed\n * (wired up by `provideQueryCache`); call it manually for caches you construct yourself.\n */\n readonly destroy: () => void;\n\n private readonly broadcast: (msg: InternalSyncMessage<T>) => void = () => {\n // noop\n };\n\n /**\n * Creates a new `Cache` instance.\n *\n * @param ttl - The default Time To Live (TTL) for cache entries, in milliseconds. Defaults to one day.\n * @param staleTime - The default duration, in milliseconds, during which a cache entry is considered\n * stale but can still be used while revalidation occurs in the background. Defaults to 1 hour.\n * @param cleanupOpt - Options for configuring the cache cleanup strategy. Defaults to LRU with a\n * `maxSize` of 200 and a `checkInterval` of one hour.\n * @param syncTabs - If provided, the cache will use the options a BroadcastChannel to send updates between tabs.\n * Defaults to `undefined`, meaning no synchronization across tabs.\n */\n constructor(\n protected readonly ttl: number = ONE_DAY,\n protected readonly staleTime: number = ONE_HOUR,\n cleanupOpt: Partial<CleanupType> = DEFAULT_CLEANUP_OPT,\n syncTabs?: {\n id: string;\n serialize: (value: T) => string;\n deserialize: (value: string) => T | null;\n },\n\n private readonly db: Promise<CacheDB<T>> = Promise.resolve(\n createNoopDB<T>(),\n ),\n ) {\n this.cleanupOpt = {\n ...DEFAULT_CLEANUP_OPT,\n ...cleanupOpt,\n };\n\n if (this.cleanupOpt.maxSize <= 0)\n throw new Error('maxSize must be greater than 0');\n\n // a non-finite checkInterval disables the sweeper entirely (used by the shared NoopCache)\n const cleanupInterval = Number.isFinite(this.cleanupOpt.checkInterval)\n ? setInterval(() => {\n this.cleanup();\n }, this.cleanupOpt.checkInterval)\n : undefined;\n\n let destroySyncTabs = () => {\n // noop\n };\n\n if (syncTabs) {\n const channel = new BroadcastChannel(syncTabs.id);\n this.broadcast = (msg: InternalSyncMessage<T>) => {\n if (msg.action === 'invalidate')\n return channel.postMessage({\n action: 'invalidate',\n entry: { key: msg.entry.key },\n cacheId: this.id,\n type: 'cache-sync-message',\n } satisfies SyncMessage<string>);\n\n return channel.postMessage({\n ...msg,\n entry: {\n ...msg.entry,\n value: syncTabs.serialize(msg.entry.value),\n },\n cacheId: this.id,\n type: 'cache-sync-message',\n } satisfies SyncMessage<string>);\n };\n\n channel.onmessage = (event) => {\n const msg = event.data;\n if (!isSyncMessage<string>(msg)) return;\n if (msg.cacheId === this.id) return; // ignore messages from this cache\n\n if (msg.action === 'store') {\n const value = syncTabs.deserialize(msg.entry.value);\n if (value === null) return;\n\n // Last-write-wins by `updated` timestamp.\n const existing = untracked(this.internal).get(msg.entry.key);\n if (existing && existing.updated >= msg.entry.updated) return;\n\n this.restoreInternal({ ...msg.entry, value });\n } else if (msg.action === 'invalidate') {\n this.invalidateInternal(msg.entry.key, true);\n }\n };\n\n destroySyncTabs = () => {\n channel.close();\n };\n }\n\n let destroyed = false;\n const destroy = () => {\n if (destroyed) return;\n destroyed = true;\n if (cleanupInterval !== undefined) clearInterval(cleanupInterval);\n destroySyncTabs();\n };\n\n this.db\n .then(async (db) => {\n if (destroyed) return [];\n return db.getAll();\n })\n .then((entries) => {\n if (destroyed) return;\n const current = untracked(this.internal);\n entries.forEach((entry) => {\n if (current.has(entry.key)) return;\n // a key invalidated while hydration was in flight must stay dead\n if (this.hydrationTombstones.has(entry.key)) return;\n this.restoreInternal(entry);\n });\n this.hydrated = true;\n this.hydrationTombstones.clear();\n });\n\n this.destroy = destroy;\n }\n\n /** @internal */\n private getInternal(\n key: () => string | null,\n ): Signal<(CacheEntry<T> & { isStale: boolean }) | null> {\n const keySignal = computed(() => key());\n\n return computed(\n () => {\n const key = keySignal();\n if (!key) return null;\n const found = this.internal().get(key);\n\n const now = Date.now();\n\n if (!found || found.expiresAt <= now) return null;\n return {\n ...found,\n isStale: found.stale <= now,\n };\n },\n {\n equal: (a, b) =>\n a === b ||\n (!!a &&\n !!b &&\n a.key === b.key &&\n a.value === b.value &&\n a.updated === b.updated &&\n a.isStale === b.isStale),\n },\n );\n }\n\n /** @internal Imperative access bookkeeping for LRU eviction. */\n private touch(entry: CacheEntry<T>) {\n entry.lastAccessed = Date.now();\n entry.useCount++;\n }\n\n /**\n * Retrieves a cache entry directly (non-reactively), updating its access bookkeeping\n * for LRU eviction.\n * @internal\n * @param key - The key of the entry to retrieve.\n * @returns The cache entry, or `null` if not found or expired.\n */\n getUntracked(key: string): (CacheEntry<T> & { isStale: boolean }) | null {\n const found = untracked(this.internal).get(key);\n const now = Date.now();\n if (!found || found.expiresAt <= now) {\n this.missCount.update((c) => c + 1);\n return null;\n }\n this.touch(found);\n this.hitCount.update((c) => c + 1);\n return {\n ...found,\n isStale: found.stale <= now,\n };\n }\n\n /**\n * Retrieves a cache entry as a signal.\n *\n * @param key - A function that returns the cache key. The key is a signal, allowing for dynamic keys. If the function returns null the value is also null.\n * @returns A signal that holds the cache entry, or `null` if not found or expired. The signal\n * updates whenever the cache entry changes (e.g., due to revalidation or expiration).\n */\n get(\n key: () => string | null,\n ): Signal<(CacheEntry<T> & { isStale: boolean }) | null> {\n return this.getInternal(key);\n }\n\n /**\n * Retrieves a cache entry or an object with the key if not found.\n *\n * @param key - A function that returns the cache key. The key is a signal, allowing for dynamic keys. If the function returns null the value is also null.\n * @returns A signal that holds the cache entry or an object with the key if not found. The signal\n * updates whenever the cache entry changes (e.g., due to revalidation or expiration).\n */\n getEntryOrKey(\n key: () => string | null,\n ): Signal<(CacheEntry<T> & { isStale: boolean }) | string | null> {\n const valueSig = this.getInternal(key);\n return computed(() => valueSig() ?? key());\n }\n\n /**\n * Stores a value in the cache.\n *\n * NOTE: cached values are shared by reference across all consumers (current and\n * future cache hits, persistence, cross-tab sync) — do not mutate a value after\n * storing it or after reading it from the cache.\n *\n * @param key - The key under which to store the value.\n * @param value - The value to store.\n * @param staleTime - (Optional) The stale time for this entry, in milliseconds. Overrides the default `staleTime`.\n * @param ttl - (Optional) The TTL for this entry, in milliseconds. Overrides the default `ttl`.\n * @param persist - (Optional) Whether to also write the entry to the persistence layer (IndexedDB). Defaults to `false`.\n */\n store(\n key: string,\n value: T,\n staleTime = this.staleTime,\n ttl = this.ttl,\n persist = false,\n ) {\n this.storeInternal(key, value, staleTime, ttl, false, persist);\n }\n\n private storeInternal(\n key: string,\n value: T,\n staleTime = this.staleTime,\n ttl = this.ttl,\n fromSync = false,\n persist = false,\n ) {\n const entry = untracked(this.internal).get(key);\n\n // ttl cannot be less than staleTime\n if (ttl < staleTime) staleTime = ttl;\n\n const now = Date.now();\n\n this.setEntry(\n {\n value,\n created: entry?.created ?? now,\n updated: now,\n useCount: (entry?.useCount ?? 0) + 1,\n lastAccessed: now,\n stale: now + staleTime,\n expiresAt: now + ttl,\n key,\n },\n fromSync,\n persist,\n );\n }\n\n /**\n * @internal\n * Inserts an entry that already carries ABSOLUTE timestamps — hydration from the\n * persistence layer and cross-tab sync messages. Never re-anchors freshness to\n * `Date.now()`, never persists, never broadcasts.\n */\n private restoreInternal(\n entry: Omit<CacheEntry<T>, 'timeout' | 'lastAccessed'> &\n Partial<Pick<CacheEntry<T>, 'lastAccessed'>>,\n ) {\n this.setEntry(\n {\n ...entry,\n // rows persisted by older versions may lack the field\n lastAccessed: entry.lastAccessed ?? entry.updated,\n },\n true,\n false,\n );\n }\n\n /** @internal Shared writer: arms the expiry timer only within the safe delay range. */\n private setEntry(\n next: Omit<CacheEntry<T>, 'timeout'>,\n fromSync: boolean,\n persist: boolean,\n ) {\n const existing = untracked(this.internal).get(next.key);\n if (existing) clearTimeout(existing.timeout); // stop the previous invalidation\n\n const remaining = next.expiresAt - Date.now();\n // already expired (clock skew on a synced/restored entry) — don't insert\n if (remaining <= 0) return;\n\n // Infinity (immutable) or > 2^31-1 would coerce to an IMMEDIATE timeout — such\n // entries get no timer and rely on lazy expiry + the periodic sweep instead\n const timeout =\n Number.isFinite(remaining) && remaining <= MAX_TIMER_DELAY\n ? setTimeout(() => this.invalidate(next.key), remaining)\n : undefined;\n\n this.internal.mutate((map) => {\n map.set(next.key, { ...next, timeout });\n return map;\n });\n\n if (!fromSync) {\n if (persist) this.db.then((db) => db.store(next));\n\n this.broadcast({\n action: 'store',\n entry: next,\n });\n }\n }\n\n /**\n * Invalidates (removes) a cache entry.\n *\n * @param key - The key of the entry to invalidate.\n */\n invalidate(key: string) {\n this.invalidateInternal(key);\n }\n\n /**\n * Invalidates every cache entry whose key starts with `prefix`. Common after a\n * list-mutating operation (e.g. invalidate every paginated `GET /api/posts*`\n * after a POST). Returns the number of entries removed.\n *\n * @example\n * cache.invalidatePrefix('GET https://api.example.com/posts');\n */\n invalidatePrefix(prefix: string): number {\n return this.invalidateWhere((key) => key.startsWith(prefix));\n }\n\n /**\n * Invalidates every cache entry whose key matches the predicate. Use for\n * arbitrary bulk invalidation that doesn't fit prefix matching (e.g.\n * \"everything containing `userId=42`\"). Returns the number of entries removed.\n *\n * @example\n * cache.invalidateWhere((key) => key.includes('/me/'));\n */\n invalidateWhere(predicate: (key: string) => boolean): number {\n const keys = Array.from(untracked(this.internal).keys()).filter(predicate);\n for (const key of keys) this.invalidateInternal(key);\n return keys.length;\n }\n\n private invalidateInternal(key: string, fromSync = false) {\n // a key invalidated before async hydration completes must not be resurrected by it\n if (!this.hydrated) this.hydrationTombstones.add(key);\n\n const entry = untracked(this.internal).get(key);\n if (entry) {\n clearTimeout(entry.timeout);\n this.internal.mutate((map) => {\n map.delete(key);\n return map;\n });\n }\n if (!fromSync) {\n this.db.then((db) => db.remove(key));\n this.broadcast({ action: 'invalidate', entry: { key } });\n }\n }\n\n /**\n * Removes EVERY entry — memory, persisted rows, and (via broadcast) other tabs.\n * Call on logout/auth changes so no prior user's responses survive.\n */\n clear() {\n for (const key of Array.from(untracked(this.internal).keys())) {\n this.invalidateInternal(key);\n }\n }\n\n /** @internal Drops expired entries, then enforces `maxSize` by the configured strategy. */\n private cleanup() {\n const now = Date.now();\n\n // expired entries first — their timers may never have fired (throttled background\n // tabs, or timer-less long-TTL entries)\n const expired = Array.from(untracked(this.internal).entries()).filter(\n ([, e]) => e.expiresAt <= now,\n );\n if (expired.length) {\n expired.forEach(([, e]) => clearTimeout(e.timeout));\n this.internal.mutate((map) => {\n expired.forEach(([key]) => map.delete(key));\n return map;\n });\n }\n\n if (untracked(this.internal).size <= this.cleanupOpt.maxSize) return;\n\n const sorted = Array.from(untracked(this.internal).entries()).toSorted(\n (a, b) => {\n if (this.cleanupOpt.type === 'lru') {\n return a[1].lastAccessed - b[1].lastAccessed; // least recently accessed first\n } else {\n return a[1].created - b[1].created; // oldest first\n }\n },\n );\n\n const keepCount = Math.max(1, Math.floor(this.cleanupOpt.maxSize / 2));\n\n const removed = sorted.slice(0, sorted.length - keepCount);\n const keep = sorted.slice(removed.length, sorted.length);\n\n removed.forEach(([, e]) => {\n clearTimeout(e.timeout);\n });\n\n this.internal.set(new Map(keep));\n }\n}\n\n/**\n * Options for configuring the cache.\n */\ntype CacheOptions = {\n /**\n * The default Time To Live (TTL) for cache entries, in milliseconds.\n */\n ttl?: number;\n /**\n * The default duration, in milliseconds, during which a cache entry is considered\n * stale but can still be used while revalidation occurs in the background.\n */\n staleTime?: number;\n /**\n * Options for configuring the cache cleanup strategy.\n */\n cleanup?: Partial<CleanupType>;\n /**\n * Whether to synchronize cache across tabs. If true, the cache will use a BroadcastChannel to send updates between tabs.\n */\n syncTabs?: boolean;\n /**\n * Globally disable persistence of cache entries.\n * If set to `false`, cache entries will not be persisted to the database.\n * `true` means, cache entries can be persisted, they must still be opted into on the resource level & allowed by server headers.\n * @default true\n */\n persist?: boolean;\n /**\n * Version of the caches database, increment this if the interfaces change, this will cause the old data to be deleted.\n * Minimum value is 1, so first increment should be 2.\n * @default 1\n */\n version?: number;\n};\n\nconst CLIENT_CACHE_TOKEN = new InjectionToken<Cache<HttpResponse<unknown>>>(\n 'INTERNAL_CLIENT_CACHE',\n);\n\n/**\n * Provides the instance of the QueryCache for queryResource. This should probably be called\n * in your application's root configuration, but can also be overriden with component/module providers.\n *\n * @param options - Optional configuration options for the cache.\n * @returns An Angular `Provider` for the cache.\n *\n * @example\n * // In your app.config.ts or AppModule providers:\n *\n * import { provideQueryCache } from './your-cache';\n *\n * export const appConfig: ApplicationConfig = {\n * providers: [\n * provideQueryCache({\n * ttl: 60000, // Default TTL of 60 seconds\n * staleTime: 30000, // Default staleTime of 30 seconds\n * }),\n * // ... other providers\n * ]\n * };\n */\nexport function provideQueryCache(opt?: CacheOptions): Provider {\n const serialize = (value: HttpResponse<unknown>) => {\n const headersRecord: Record<string, string[]> = {};\n\n const headerKeys = value.headers.keys();\n headerKeys.forEach((key) => {\n const values = value.headers.getAll(key);\n if (!values) return;\n headersRecord[key] = values;\n });\n\n return JSON.stringify({\n body: value.body,\n status: value.status,\n // statusText intentionally omitted: deprecated in Angular, meaningless under\n // HTTP/2+ (HttpResponse defaults it to 'OK' on reconstruction)\n headers: headerKeys.length > 0 ? headersRecord : undefined,\n url: value.url,\n });\n };\n\n const deserialize = (value: string) => {\n try {\n const parsed = JSON.parse(value);\n\n if (!parsed || typeof parsed !== 'object' || !('body' in parsed))\n throw new Error('Invalid cache entry format');\n\n const headers = parsed.headers\n ? new HttpHeaders(parsed.headers)\n : undefined;\n\n return new HttpResponse({\n body: parsed.body,\n status: parsed.status,\n headers: headers,\n url: parsed.url,\n });\n } catch (err) {\n if (isDevMode()) console.error('Failed to deserialize cache entry:', err);\n return null;\n }\n };\n\n // version-suffixed so two deploys with incompatible schemas in adjacent tabs don't\n // push entries into each other's caches (the `version` option only fences IndexedDB)\n const syncChannelId = `mmstack-query-cache-sync_v${opt?.version ?? 1}`;\n\n return {\n provide: CLIENT_CACHE_TOKEN,\n useFactory: () => {\n const onServer = inject(PLATFORM_ID) === 'server';\n\n // no IndexedDB / BroadcastChannel on the server — each request gets an\n // isolated, request-lived, memory-only cache\n const syncTabsOpt =\n !onServer && opt?.syncTabs\n ? {\n id: syncChannelId,\n serialize,\n deserialize,\n }\n : undefined;\n\n const db =\n onServer || opt?.persist === false\n ? undefined\n : createSingleStoreDB<string>(\n 'mmstack-query-cache-db',\n (version) => `query-store_v${version}`,\n opt?.version,\n ).then((db): CacheDB<HttpResponse<unknown>> => {\n return {\n getAll: () => {\n return db.getAll().then((entries) => {\n return entries\n .map((entry) => {\n const value = deserialize(entry.value);\n if (value === null) return null;\n return {\n ...entry,\n value,\n };\n })\n .filter((e) => e !== null);\n });\n },\n store: (entry) => {\n return db.store({ ...entry, value: serialize(entry.value) });\n },\n remove: db.remove,\n };\n });\n\n const cache = new Cache(\n opt?.ttl,\n opt?.staleTime,\n opt?.cleanup,\n syncTabsOpt,\n db,\n );\n\n // release the sweep interval / channel with the providing injector\n inject(DestroyRef, { optional: true })?.onDestroy(() => cache.destroy());\n\n return cache;\n },\n };\n}\n\nclass NoopCache<T> extends Cache<T> {\n constructor() {\n // Infinity checkInterval → no sweep interval is ever armed, so the shared\n // instance below never pins a timer\n super(undefined, undefined, {\n type: 'lru',\n maxSize: 200,\n checkInterval: Infinity,\n });\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n override store(_: string, __: T, ___ = super.staleTime, ____ = super.ttl) {\n // noop\n }\n}\n\n// one shared instance — minting a NoopCache per injectQueryCache() miss would leak\n// an instance (and previously an interval) on every prod call without a provider\nlet NOOP_CACHE: NoopCache<unknown> | undefined;\n\n/**\n * Injects the `QueryCache` instance that is used within queryResource.\n * Allows for direct modification of cached data, but is mostly meant for internal use.\n *\n * @param injector - (Optional) The injector to use. If not provided, the current\n * injection context is used.\n * @returns The `QueryCache` instance.\n *\n * @example\n * // In your component or service:\n *\n * import { injectQueryCache } from './your-cache';\n *\n * constructor() {\n * const cache = injectQueryCache();\n *\n * const myData = cache.get(() => 'my-data-key');\n * if (myData() !== null) {\n * // ... use cached data ...\n * }\n * }\n */\nexport function injectQueryCache<TRaw = unknown>(\n injector?: Injector,\n): Cache<HttpResponse<TRaw>> {\n const cache = injector\n ? injector.get(CLIENT_CACHE_TOKEN, null, {\n optional: true,\n })\n : inject(CLIENT_CACHE_TOKEN, {\n optional: true,\n });\n\n if (!cache) {\n if (isDevMode())\n throw new Error(\n 'Cache not provided, please add provideQueryCache() to providers array',\n );\n else return (NOOP_CACHE ??= new NoopCache()) as Cache<HttpResponse<TRaw>>;\n }\n\n return cache as Cache<HttpResponse<TRaw>>;\n}\n\n/**\n * Injects the cache statistics, including the current size of the cache and the number of hits and misses.\n *\n * @param injector - (Optional) The injector to use. If not provided, the current\n * injection context is used.\n * @returns A signal containing the cache statistics.\n */\nexport function injectCacheStats(injector?: Injector) {\n const cache = injectQueryCache(injector);\n return cache.stats;\n}\n","type UnknownObject = Record<PropertyKey, unknown>;\n\n/**\n * Returns `true` for any object-like value whose own enumerable keys should\n * be sorted for stable hashing. Excludes arrays (positional), `Date`\n * (handled by `toJSON`), `Map`/`Set` (handled explicitly), and binary types\n * (`Blob`/`FormData`/`URLSearchParams`/`ArrayBuffer`/typed arrays — these\n * should be branched on before reaching `hash()`, typically by `hashRequest`).\n *\n * Plain objects, class instances, and `Object.create(null)` all qualify.\n */\nfunction isHashableObject(value: unknown): value is UnknownObject {\n if (value === null || typeof value !== 'object') return false;\n if (Array.isArray(value)) return false;\n if (value instanceof Date) return false;\n if (value instanceof Map) return false;\n if (value instanceof Set) return false;\n if (typeof Blob !== 'undefined' && value instanceof Blob) return false;\n if (typeof FormData !== 'undefined' && value instanceof FormData) return false;\n if (\n typeof URLSearchParams !== 'undefined' &&\n value instanceof URLSearchParams\n )\n return false;\n if (value instanceof ArrayBuffer) return false;\n if (ArrayBuffer.isView(value)) return false;\n return true;\n}\n\nfunction sortKeys(val: UnknownObject): UnknownObject {\n return Object.keys(val)\n .toSorted()\n .reduce((result, key) => {\n result[key] = val[key];\n return result;\n }, {} as UnknownObject);\n}\n\n/**\n * Internal helper to generate a stable JSON string from an array.\n * - Object-like values (plain, class instances, null-proto) get their own\n * enumerable keys sorted alphabetically.\n * - `Map` → marker object with sorted entries (sorted by `JSON.stringify(key)`).\n * - `Set` → marker object with sorted values (sorted by `JSON.stringify(value)`).\n * - Arrays preserve order. `Date` serializes via `toJSON`.\n *\n * @internal\n */\nfunction hashKey(queryKey: unknown[]): string {\n return JSON.stringify(queryKey, (_, val) => {\n if (val instanceof Map) {\n // Schwartzian: compute each entry's sort key (recursive hash of the\n // Map key) once, then sort by the cheap string compare.\n const entries = [...val.entries()]\n .map((e) => [hash(e[0]), e] as const)\n .sort((a, b) => (a[0] < b[0] ? -1 : a[0] > b[0] ? 1 : 0))\n .map(([, e]) => e);\n return { __map__: entries };\n }\n if (val instanceof Set) {\n const values = [...val]\n .map((v) => [hash(v), v] as const)\n .sort((a, b) => (a[0] < b[0] ? -1 : a[0] > b[0] ? 1 : 0))\n .map(([, v]) => v);\n return { __set__: values };\n }\n if (isHashableObject(val)) return sortKeys(val);\n return val;\n });\n}\n\n/**\n * Generates a stable, unique string hash from one or more arguments.\n * Useful for creating cache keys or identifiers where object key order shouldn't matter.\n *\n * How it works:\n * - Object-like values (plain objects, class instances, `Object.create(null)`) have\n * their own enumerable keys sorted alphabetically before hashing. This ensures\n * `{ a: 1, b: 2 }` and `{ b: 2, a: 1 }` produce the same hash.\n * - `Map` and `Set` are serialized via stable, sorted markers (`__map__` / `__set__`).\n * - Arrays preserve positional order; `Date` uses its ISO string via `toJSON`.\n *\n * @param {...unknown} args Values to include in the hash.\n * @returns A stable string hash representing the input arguments.\n * @example\n * hash('posts', 10);\n * // => '[\"posts\",10]'\n *\n * hash({ a: 1, b: 2 }) === hash({ b: 2, a: 1 }); // true\n *\n * hash(new Map([['a', 1]])) === hash(new Map([['a', 1]])); // true\n *\n * // Be mindful of values JSON.stringify cannot handle (functions, undefined, Symbols)\n * // hash('a', undefined, function() {}) => '[\"a\",null,null]'\n */\nexport function hash(...args: unknown[]): string {\n return hashKey(args);\n}\n","import {\n HttpHeaders,\n HttpParams,\n type HttpRequest,\n type HttpResourceRequest,\n} from '@angular/common/http';\nimport { isDevMode } from '@angular/core';\nimport { hash } from './hash-unknown';\n\ntype HashableRequest = {\n method?: string;\n url: string;\n responseType?: string;\n params?: HttpResourceRequest['params'] | HttpRequest<unknown>['params'];\n body?: unknown;\n headers?: HttpResourceRequest['headers'] | HttpRequest<unknown>['headers'];\n};\n\n/**\n * @internal\n * One-way ~64-bit digest from two independent FNV-1a passes. Used for header VALUES in\n * cache keys: keys are persisted (IndexedDB) and broadcast cross-tab, so raw values\n * (auth tokens!) must never appear in them. A single 32-bit digest's 2^-32 collision\n * chance is too thin at a security boundary — two colliding tokens would serve one\n * user's cached data under another user's key; 64 bits puts collisions out of reach.\n * High-entropy secrets are not recoverable from the digest.\n */\nfunction digestHeaderValue(value: string): string {\n let h1 = 0x811c9dc5; // FNV-1a offset basis\n let h2 = 0xcbf29ce4; // independent second pass\n for (let i = 0; i < value.length; i++) {\n const c = value.charCodeAt(i);\n h1 = Math.imul(h1 ^ c, 0x01000193); // FNV prime\n h2 = Math.imul(h2 ^ c, 0x01000197); // distinct odd multiplier\n }\n return (\n (h1 >>> 0).toString(16).padStart(8, '0') +\n (h2 >>> 0).toString(16).padStart(8, '0')\n );\n}\n\nfunction readHeader(\n headers: HashableRequest['headers'],\n name: string,\n): string | null {\n if (!headers) return null;\n if (headers instanceof HttpHeaders) {\n const all = headers.getAll(name);\n return all && all.length ? all.join(',') : null;\n }\n // record form — header names are case-insensitive\n const lower = name.toLowerCase();\n for (const key of Object.keys(headers)) {\n if (key.toLowerCase() !== lower) continue;\n const value = (headers as Record<string, unknown>)[key];\n if (value == null) return null;\n return Array.isArray(value) ? value.join(',') : String(value);\n }\n return null;\n}\n\n/**\n * Content-negotiation headers whose values are low-entropy and non-identifying —\n * embedded (URI-encoded) raw, keeping keys human-readable and skipping the digest.\n * Anything NOT on this list (Authorization, api keys, tenant/x-* headers — we can't\n * know what they carry) is one-way digested instead.\n */\nconst SAFE_RAW_HEADERS = new Set([\n 'accept',\n 'accept-language',\n 'content-language',\n 'content-type',\n]);\n\nconst UNSAFE_HEADER_MESSAGES = new Map<string, string>([\n [\n 'cookie',\n \"[@mmstack/resource]: varyHeaders includes 'cookie'. Browser-attached cookies never appear on the request object (so this usually partitions nothing), and manually-set cookie values often rotate per-request (shredding the hit rate). The header IS still honored (digested) — but prefer varying on 'Authorization' or a tenant header.\",\n ],\n [\n 'set-cookie',\n \"[@mmstack/resource]: varyHeaders includes 'set-cookie'. Browser-attached cookies never appear on the request object (so this usually partitions nothing), and manually-set cookie values often rotate per-request (shredding the hit rate). The header IS still honored (digested) — but prefer varying on 'Authorization' or a tenant header.\",\n ],\n [\n 'authorization',\n \"[@mmstack/resource]: varyHeaders includes 'Authorization'. If your token rotates frequently (e.g., short-lived JWTs), this will cause 100% cache churn on refresh. Consider adding a namespace prefix with the users sub, not using it as a cache-key or using a custom 'cache.hash' function with a stable session/user ID instead.\",\n ],\n [\n 'x-request-id',\n \"[@mmstack/resource]: varyHeaders includes 'X-Request-ID'. This header is often set to a unique value per-request, which will cause 100% cache churn. Consider removing it from varyHeaders or using a custom 'cache.hash' function that ignores it.\",\n ],\n [\n 'x-correlation-id',\n \"[@mmstack/resource]: varyHeaders includes 'X-Correlation-ID'. This header is often set to a unique value per-request, which will cause 100% cache churn. Consider removing it from varyHeaders or using a custom 'cache.hash' function that ignores it.\",\n ],\n [\n 'if-none-match',\n \"[@mmstack/resource]: varyHeaders includes 'If-None-Match'. This header contains ETags that change whenever the server's resource version changes, which will cause cache misses on every update. Consider removing it from varyHeaders or using a custom 'cache.hash' function that ignores it.\",\n ],\n [\n 'if-modified-since',\n \"[@mmstack/resource]: varyHeaders includes 'If-Modified-Since'. This header contains timestamps that change whenever the server's resource version changes, which will cause cache misses on every update. Consider removing it from varyHeaders or using a custom 'cache.hash' function that ignores it.\",\n ],\n]);\n\nfunction normalizeVaryHeaders(\n headers: HashableRequest['headers'],\n names: readonly string[],\n): string {\n const isDev = isDevMode();\n return names\n .map((n) => n.toLowerCase())\n .toSorted()\n .map((name) => {\n if (isDev) {\n const warning = UNSAFE_HEADER_MESSAGES.get(name);\n if (warning) console.warn(warning);\n }\n\n const value = readHeader(headers, name);\n if (value === null) return `${name}=`;\n\n // known-safe values raw (readable, cheap); everything else digested, NEVER raw —\n // keys are persisted to IndexedDB and broadcast across tabs\n return SAFE_RAW_HEADERS.has(name)\n ? `${name}=${encodeURIComponent(value)}`\n : `${name}=${digestHeaderValue(value)}`;\n })\n .join('&');\n}\n\nfunction normalizeParams(\n params: NonNullable<HashableRequest['params']>,\n): string {\n const p =\n params instanceof HttpParams\n ? params\n : new HttpParams({ fromObject: params });\n\n return p\n .keys()\n .toSorted()\n .map((key) => {\n const encodedKey = encodeURIComponent(key);\n return (p.getAll(key) ?? [])\n .map((v) => `${encodedKey}=${encodeURIComponent(v)}`)\n .join('&');\n })\n .join('&');\n}\n\nfunction hashBody(body: unknown): string {\n // File extends Blob — must check File first\n if (typeof File !== 'undefined' && body instanceof File) {\n return `File:${body.name}:${body.type}:${body.size}:${body.lastModified}`;\n }\n\n if (typeof Blob !== 'undefined' && body instanceof Blob) {\n return `Blob:${body.type}:${body.size}`;\n }\n\n if (typeof FormData !== 'undefined' && body instanceof FormData) {\n const entries: [string, string][] = [];\n body.forEach((value, key) => {\n entries.push([key, hashBody(value)]);\n });\n entries.sort(\n ([ak, av], [bk, bv]) => ak.localeCompare(bk) || av.localeCompare(bv),\n );\n return `FormData:${entries.map(([k, v]) => `${k}=${v}`).join('&')}`;\n }\n\n if (\n typeof URLSearchParams !== 'undefined' &&\n body instanceof URLSearchParams\n ) {\n const sp = new URLSearchParams(body);\n sp.sort();\n return `URLSearchParams:${sp.toString()}`;\n }\n\n if (body instanceof ArrayBuffer) {\n return `ArrayBuffer:${body.byteLength}`;\n }\n\n if (ArrayBuffer.isView(body)) {\n return `${body.constructor.name}:${body.byteLength}`;\n }\n\n return hash(body);\n}\n\n/**\n * Builds a stable cache/dedupe key from an HTTP request shape (accepts both\n * `HttpRequest` and `HttpResourceRequest`).\n *\n * Key composition: `${method}:${url}:${responseType}[:${params}][:${body}][:${vary}]`\n * - `method` defaults to `'GET'`, `responseType` to `'json'` (Angular defaults).\n * - Query params are sorted alphabetically and URL-encoded for stability.\n * - Body hashing handles `File`/`Blob`/`FormData`/`URLSearchParams`/`ArrayBuffer`\n * and typed arrays explicitly; everything else flows through key-sorted\n * `JSON.stringify` via `hash()`.\n * - `varyHeaders` (opt-in) mixes the named request headers into the key so responses\n * that differ per header (e.g. `Authorization` → per-user, `Accept-Language`) get\n * separate entries. Known-safe content-negotiation headers (`Accept`,\n * `Accept-Language`, `Content-Language`, `Content-Type`) embed their value raw for\n * readable keys; all other header VALUES are one-way digested, never embedded raw —\n * keys are persisted to IndexedDB and broadcast across tabs.\n */\nexport function hashRequest(\n req: HashableRequest,\n varyHeaders?: readonly string[],\n): string {\n const method = req.method ?? 'GET';\n const responseType = req.responseType ?? 'json';\n const base = `${method}:${req.url}:${responseType}`;\n\n const params = req.params ? `:${normalizeParams(req.params)}` : '';\n const body = req.body != null ? `:${hashBody(req.body)}` : '';\n const vary = varyHeaders?.length\n ? `:vary(${normalizeVaryHeaders(req.headers, varyHeaders)})`\n : '';\n\n return base + params + body + vary;\n}\n","import { finalize, shareReplay, type Observable } from 'rxjs';\n\n/**\n * @internal\n * Single-flight sharing: if a pending observable is already registered under `key`,\n * return it; otherwise create one, share it (replaying the latest event to late\n * subscribers), and deregister it on teardown/settle.\n *\n * Used by both the dedupe interceptor (keyed by full request hash, app-wide) and the\n * cache interceptor (keyed by the CACHE key, guarding the miss/stale-revalidation path)\n * — same mechanism, different keying/scope, so it lives here exactly once.\n */\nexport function sharePending<T>(\n pending: Map<string, Observable<T>>,\n key: string,\n create: () => Observable<T>,\n): Observable<T> {\n const existing = pending.get(key);\n if (existing) return existing;\n\n const shared = create().pipe(\n finalize(() => pending.delete(key)),\n shareReplay({ bufferSize: 1, refCount: true }),\n );\n pending.set(key, shared);\n\n return shared;\n}\n","import {\n HttpContext,\n HttpContextToken,\n type HttpEvent,\n type HttpHandlerFn,\n type HttpInterceptorFn,\n type HttpRequest,\n HttpResponse,\n} from '@angular/common/http';\nimport { inject, isDevMode, PLATFORM_ID } from '@angular/core';\nimport { map, type Observable, of, tap } from 'rxjs';\nimport { hashRequest } from '../hash-request';\nimport { sharePending } from '../share-pending';\nimport { injectQueryCache } from './cache';\n\ntype CacheEntryOptions = {\n key?: string;\n ttl?: number;\n staleTime?: number;\n cache: boolean;\n bustBrowserCache?: boolean;\n ignoreCacheControl?: boolean;\n parse?: (val: unknown) => unknown;\n persist?: boolean;\n};\n\nconst CACHE_CONTEXT = new HttpContextToken<CacheEntryOptions>(() => ({\n cache: false,\n}));\n\nexport function setCacheContext(\n ctx = new HttpContext(),\n opt: Omit<CacheEntryOptions, 'cache' | 'key'> & {\n key: Required<CacheEntryOptions>['key'];\n },\n) {\n return ctx.set(CACHE_CONTEXT, { ...opt, cache: true });\n}\n\nfunction getCacheContext(ctx: HttpContext): CacheEntryOptions {\n return ctx.get(CACHE_CONTEXT);\n}\n\ntype ResolvedCacheControl = {\n noStore: boolean;\n noCache: boolean;\n mustRevalidate: boolean;\n immutable: boolean;\n /** `Cache-Control: private` — cacheable in memory, but must never be persisted. */\n isPrivate: boolean;\n maxAge: number | null;\n staleWhileRevalidate: number | null;\n};\n\nfunction parseCacheControlHeader(\n req: HttpResponse<unknown>,\n): ResolvedCacheControl {\n const header = req.headers.get('Cache-Control');\n\n let sMaxAge: number | null = null;\n const directives: ResolvedCacheControl = {\n noStore: false,\n noCache: false,\n mustRevalidate: false,\n immutable: false,\n isPrivate: false,\n maxAge: null,\n staleWhileRevalidate: null,\n };\n\n if (!header) return directives;\n\n const parts = header.split(',');\n\n for (const part of parts) {\n const [unparsedKey, value] = part.trim().split('=');\n const key = unparsedKey.trim().toLowerCase();\n\n switch (key) {\n case 'no-store':\n directives.noStore = true;\n break;\n case 'no-cache':\n directives.noCache = true;\n break;\n case 'must-revalidate':\n case 'proxy-revalidate':\n directives.mustRevalidate = true;\n break;\n case 'immutable':\n directives.immutable = true;\n break;\n case 'private':\n directives.isPrivate = true;\n break;\n case 'max-age': {\n if (!value) break;\n const parsedValue = parseInt(value, 10);\n if (!isNaN(parsedValue)) directives.maxAge = parsedValue;\n break;\n }\n\n case 's-maxage': {\n if (!value) break;\n const parsedValue = parseInt(value, 10);\n if (!isNaN(parsedValue)) sMaxAge = parsedValue;\n break;\n }\n case 'stale-while-revalidate': {\n if (!value) break;\n const parsedValue = parseInt(value, 10);\n if (!isNaN(parsedValue)) directives.staleWhileRevalidate = parsedValue;\n break;\n }\n }\n }\n\n // s-maxage takes precedence over max-age\n if (sMaxAge !== null) directives.maxAge = sMaxAge;\n\n // if no store nothing else is relevant\n if (directives.noStore)\n return {\n noStore: true,\n noCache: false,\n mustRevalidate: false,\n immutable: false,\n isPrivate: directives.isPrivate,\n maxAge: null,\n staleWhileRevalidate: null,\n };\n\n // max age does not apply to immutable resources\n if (directives.immutable)\n return {\n ...directives,\n maxAge: null,\n };\n\n return directives;\n}\n\nfunction resolveTimings(\n cacheControl: ResolvedCacheControl,\n optStaleTime?: number,\n optTTL?: number,\n): { staleTime?: number; ttl?: number } {\n let staleTime = optStaleTime;\n let ttl = optTTL;\n\n if (cacheControl.immutable)\n return {\n staleTime: Infinity,\n ttl: Infinity,\n };\n\n if (cacheControl.maxAge !== null) {\n staleTime = cacheControl.maxAge * 1000;\n if (cacheControl.staleWhileRevalidate !== null) {\n ttl = staleTime + cacheControl.staleWhileRevalidate * 1000;\n } else if (ttl !== undefined) {\n // a configured total lifetime must never undercut the server's fresh window\n ttl = Math.max(ttl, staleTime);\n }\n // no swr + no configured ttl → leave undefined so the cache's default ttl applies\n // (the entry stays resident past max-age for ETag revalidation)\n } else if (cacheControl.staleWhileRevalidate !== null) {\n // swr without max-age: stale immediately, revalidatable for the window\n staleTime = 0;\n ttl = cacheControl.staleWhileRevalidate * 1000;\n }\n\n // if no-cache is set, we must always revalidate (the entry stays usable for conditional requests until ttl)\n if (cacheControl.noCache || cacheControl.mustRevalidate) staleTime = 0;\n\n // option-only path (no server freshness): a misconfigured ttl < staleTime clamps the\n // fresh window down, mirroring the cache's own internal clamp\n if (\n cacheControl.maxAge === null &&\n ttl !== undefined &&\n staleTime !== undefined &&\n ttl < staleTime\n ) {\n staleTime = ttl;\n }\n\n return { staleTime, ttl };\n}\n\n/**\n * Creates an `HttpInterceptorFn` that implements caching for HTTP requests. This interceptor\n * checks for a caching configuration in the request's `HttpContext` (internally set by the queryResource).\n * If caching is enabled, it attempts to retrieve responses from the cache. If a cached response\n * is found and is not stale, it's returned directly. If the cached response is stale, it's returned,\n * and a background revalidation request is made. If no cached response is found, the request\n * is made to the server, and the response is cached according to the configured TTL and staleness.\n * The interceptor also respects `Cache-Control` headers from the server.\n *\n * Cache-enabled requests are single-flighted per cache key: N concurrent consumers of\n * the same missing/stale entry share ONE network request. Non-cached requests are not\n * touched — pair with `createDedupeRequestsInterceptor` to coalesce those as well.\n *\n * @param allowedMethods - An array of HTTP methods for which caching should be enabled.\n * Defaults to `['GET', 'HEAD', 'OPTIONS']`.\n *\n * @returns An `HttpInterceptorFn` that implements the caching logic.\n *\n * @example\n * // In your app.config.ts or module providers:\n *\n * import { provideHttpClient, withInterceptors } from '@angular/common/http';\n * import { createCacheInterceptor } from '@mmstack/resource';\n *\n * export const appConfig: ApplicationConfig = {\n * providers: [\n * provideHttpClient(withInterceptors([createCacheInterceptor()])),\n * // ... other providers\n * ],\n * };\n */\nexport function createCacheInterceptor(\n allowedMethods = ['GET', 'HEAD', 'OPTIONS'],\n): HttpInterceptorFn {\n const CACHE_METHODS = new Set<string>(allowedMethods);\n\n const inFlight = new Map<string, Observable<HttpEvent<unknown>>>();\n\n return (\n req: HttpRequest<unknown>,\n next: HttpHandlerFn,\n ): Observable<HttpEvent<unknown>> => {\n if (inject(PLATFORM_ID) === 'server') return next(req);\n\n const cache = injectQueryCache();\n\n if (!CACHE_METHODS.has(req.method)) return next(req);\n const opt = getCacheContext(req.context);\n\n if (!opt.cache) return next(req);\n\n const key = opt.key ?? hashRequest(req);\n const entry = cache.getUntracked(key); // null if expired or not found\n\n // If the entry is not stale, return it\n if (entry && !entry.isStale) return of(entry.value);\n\n // resource itself handles case of showing stale data...the request must process as this will \"refresh said data\"\n\n return sharePending(inFlight, key, () => {\n const eTag = entry?.value.headers.get('ETag');\n const lastModified = entry?.value.headers.get('Last-Modified');\n\n if (eTag) {\n req = req.clone({ setHeaders: { 'If-None-Match': eTag } });\n }\n\n if (lastModified) {\n req = req.clone({ setHeaders: { 'If-Modified-Since': lastModified } });\n }\n\n if (opt.bustBrowserCache) {\n req = req.clone({\n setParams: { _cb: Date.now().toString() },\n });\n }\n\n // non-JSON bodies (blob/arraybuffer) cannot survive the JSON persistence layer\n const persistable = req.responseType === 'json';\n if (opt.persist && !persistable && isDevMode()) {\n console.warn(\n `[@mmstack/resource]: persist was requested for a '${req.responseType}' response — such bodies don't survive JSON serialization, persisting skipped.`,\n );\n }\n\n return next(req).pipe(\n tap((event) => {\n if (!(event instanceof HttpResponse)) return;\n\n if (event.ok) {\n const cacheControl = parseCacheControlHeader(event);\n\n if (cacheControl.noStore && !opt.ignoreCacheControl) return;\n\n const { staleTime, ttl } = opt.ignoreCacheControl\n ? opt\n : resolveTimings(cacheControl, opt.staleTime, opt.ttl);\n\n if (ttl === 0) return; // no point\n\n // `Cache-Control: private` → fine to keep in memory, never on disk\n const persist =\n (opt.persist ?? false) &&\n persistable &&\n (opt.ignoreCacheControl || !cacheControl.isPrivate);\n\n const parsedResponse = opt.parse\n ? // statusText omitted — deprecated in Angular (HttpResponse defaults it)\n new HttpResponse({\n body: opt.parse(event.body),\n headers: event.headers,\n status: event.status,\n url: event.url ?? undefined,\n })\n : event;\n\n cache.store(key, parsedResponse, staleTime, ttl, persist);\n return;\n }\n\n // 304 → server confirmed our cached entry is still valid. Re-stamp the\n // existing entry so subsequent reads within the new freshness window\n // don't trigger another revalidation round-trip.\n if (event.status === 304 && entry) {\n // ...unless the key was invalidated while this conditional request was in\n // flight (e.g. by a mutation) — re-storing would resurrect deleted data\n if (!cache.getUntracked(key)) return;\n\n const cacheControl = parseCacheControlHeader(event);\n const { staleTime, ttl } = opt.ignoreCacheControl\n ? opt\n : resolveTimings(cacheControl, opt.staleTime, opt.ttl);\n\n const persist =\n (opt.persist ?? false) &&\n persistable &&\n (opt.ignoreCacheControl || !cacheControl.isPrivate);\n\n cache.store(key, entry.value, staleTime, ttl, persist);\n }\n }),\n map((event) => {\n // handle 304 responses due to eTag/last-modified\n if (event instanceof HttpResponse && event.status === 304 && entry) {\n return entry.value;\n }\n\n return event;\n }),\n );\n });\n };\n}\n","import { type HttpResourceRef } from '@angular/common/http';\nimport { computed } from '@angular/core';\nimport { toWritable } from '@mmstack/primitives';\n\nexport function catchValueError<T>(\n resource: HttpResourceRef<T>,\n fallback: T,\n): HttpResourceRef<T> {\n return {\n ...resource,\n value: toWritable(\n computed(() => {\n try {\n return resource.value();\n } catch {\n return fallback;\n }\n }),\n (value) => resource.value.set(value),\n ),\n };\n}\n","import {\n computed,\n effect,\n inject,\n InjectionToken,\n Injector,\n type Provider,\n type Signal,\n signal,\n untracked,\n} from '@angular/core';\n\n/**\n * Represents the possible states of a circuit breaker.\n * - `CLOSED`: The circuit breaker is closed, and operations are allowed to proceed.\n * - `OPEN`: The circuit breaker is open, and operations are blocked.\n * - `HALF_OPEN`: The circuit breaker is in a half-open state, allowing a limited number of operations to test if the underlying issue is resolved.\n */\ntype CircuitBreakerState = 'CLOSED' | 'OPEN' | 'HALF_OPEN';\n\n/**\n * Represents a circuit breaker, which monitors operations and prevents failures from cascading.\n */\nexport type CircuitBreaker = {\n /**\n * A signal indicating whether the circuit breaker is currently closed (allowing operations).\n */\n isClosed: Signal<boolean>;\n /**\n * A signal indicating whether the circuit breaker is either open or in a half-open state.\n * This is useful for checking if operations are blocked.\n * If the circuit breaker is open, operations should not proceed.\n */\n isOpen: Signal<boolean>;\n /**\n * A signal representing the current state of the circuit breaker.\n */\n status: Signal<CircuitBreakerState>;\n /**\n * Signals a failure to the circuit breaker. This may cause the circuit breaker to open.\n */\n fail: (err?: Error) => void;\n /**\n * Signals a success to the circuit breaker. This may cause the circuit breaker to close.\n */\n success: () => void;\n /**\n * Attempts to transition the circuit breaker to the half-open state. This is typically used\n * to test if the underlying issue has been resolved after the circuit breaker has been open.\n */\n halfOpen: () => void;\n /**\n * Fully resets the breaker state — clears the failure count, drops the half-open\n * flag, and lifts a permanent open caused by `shouldFailForever`. Use after the\n * underlying condition has been resolved (e.g. user re-authenticated after a\n * 401-triggered permanent open).\n */\n hardReset: () => void;\n /**\n * Destroys the circuit breaker & initiates related cleanup\n */\n destroy: () => void;\n};\n\n/**\n * Options for creating a circuit breaker.\n */\ntype CreateCircuitBreakerOptions = {\n /**\n * The number of failures that will cause the circuit breaker to open.\n * @default 5\n */\n threshold?: number;\n /**\n * @deprecated Misspelled — use `threshold` instead. Kept for backwards compatibility; will be removed in a future major.\n */\n treshold?: number;\n /**\n * The time in milliseconds after which the circuit breaker will reset and allow operations to proceed again.\n * @default 30000 (30 seconds)\n */\n timeout?: number;\n /**\n * A function that determines whether an error should cause the circuit breaker to increment the failure count.\n * @default Always returns true\n */\n shouldFail?: (err?: Error) => boolean;\n /**\n * A function that determines whether an error should cause the circuit breaker to be open forever.\n * `hardReset()` is required to lift this state.\n * @default Always returns false\n */\n shouldFailForever?: (err?: Error) => boolean;\n};\n\n/**\n * Options for creating a circuit breaker.\n * - `false`: Disables circuit breaker functionality (always open).\n * - true: Creates a new circuit breaker with default options.\n * - `CircuitBreaker`: Provides an existing `CircuitBreaker` instance to use.\n * - `{ threshold?: number; timeout?: number; }`: Creates a new circuit breaker with the specified options.\n */\nexport type CircuitBreakerOptions =\n | false\n | CircuitBreaker\n | CreateCircuitBreakerOptions;\n\n/** @internal */\nconst DEFAULT_OPTIONS: Required<\n Omit<CreateCircuitBreakerOptions, 'treshold'>\n> = {\n threshold: 5,\n timeout: 30000,\n shouldFail: () => true,\n shouldFailForever: () => false,\n};\n\n/** @internal */\nfunction internalCeateCircuitBreaker(\n threshold = 5,\n resetTimeout = 30000,\n shouldFail: (err?: Error) => boolean = () => true,\n shouldFailForever: (err?: Error) => boolean = () => false,\n): CircuitBreaker {\n const halfOpen = signal(false);\n const failureCount = signal(0);\n const failedForever = signal(false);\n\n const status = computed<CircuitBreakerState>(() => {\n if (failedForever() || failureCount() >= threshold) return 'OPEN';\n return halfOpen() ? 'HALF_OPEN' : 'CLOSED';\n });\n\n const isClosed = computed(() => status() !== 'OPEN');\n const isOpen = computed(() => status() !== 'CLOSED');\n\n const success = () => {\n failureCount.set(0);\n halfOpen.set(false);\n };\n\n const tryOnce = () => {\n if (!untracked(isOpen)) return;\n halfOpen.set(true);\n failureCount.set(threshold - 1);\n };\n\n // Auto-probe effect: schedules a half-open retry after `resetTimeout` whenever\n // the breaker is open, *unless* we've been failed forever (in which case only\n // hardReset() can recover).\n const effectRef = effect((cleanup) => {\n if (!isOpen() || failedForever()) return;\n\n const timeout = setTimeout(tryOnce, resetTimeout);\n return cleanup(() => {\n clearTimeout(timeout);\n });\n });\n\n const failInternal = () => {\n failureCount.set(failureCount() + 1);\n halfOpen.set(false);\n };\n\n const failForever = () => {\n failedForever.set(true);\n halfOpen.set(false);\n };\n\n const fail = (err?: Error) => {\n if (shouldFailForever(err)) return failForever();\n if (shouldFail(err)) return failInternal();\n // If the error does not trigger a failure, we do nothing.\n };\n\n const hardReset = () => {\n failedForever.set(false);\n failureCount.set(0);\n halfOpen.set(false);\n };\n\n return {\n status,\n isClosed,\n isOpen,\n fail,\n success,\n halfOpen: tryOnce,\n hardReset,\n destroy: () => effectRef.destroy(),\n };\n}\n\n/** @internal */\nfunction createNeverBrokenCircuitBreaker(): CircuitBreaker {\n return {\n isClosed: computed(() => true),\n isOpen: computed(() => false),\n status: signal('CLOSED'),\n fail: () => {\n // noop\n },\n success: () => {\n // noop\n },\n halfOpen: () => {\n // noop\n },\n hardReset: () => {\n // noop\n },\n destroy: () => {\n // noop\n },\n };\n}\n\nconst CB_DEFAULT_OPTIONS = new InjectionToken<\n Required<Omit<CreateCircuitBreakerOptions, 'treshold'>>\n>('MMSTACK_CIRCUIT_BREAKER_DEFAULT_OPTIONS');\n\n/**\n * Provides application-wide default options for {@link createCircuitBreaker}.\n * Any `createCircuitBreaker()` call without explicit options (or with only\n * partial options) merges these defaults in, so you can centralize threshold /\n * timeout / failure-classifier behavior in one place.\n *\n * Per-call options always win over the provided defaults.\n *\n * @example\n * ```ts\n * bootstrapApplication(AppComponent, {\n * providers: [\n * provideCircuitBreakerDefaultOptions({\n * threshold: 10,\n * timeout: 60_000,\n * shouldFailForever: (err) =>\n * err instanceof HttpErrorResponse && [401, 403].includes(err.status),\n * }),\n * ],\n * });\n * ```\n */\nexport function provideCircuitBreakerDefaultOptions(\n options: CircuitBreakerOptions,\n): Provider {\n return {\n provide: CB_DEFAULT_OPTIONS,\n useValue: {\n ...DEFAULT_OPTIONS,\n ...normalizeThreshold(options),\n },\n };\n}\n\nfunction injectCircuitBreakerOptions(\n injector = inject(Injector),\n): Required<Omit<CreateCircuitBreakerOptions, 'treshold'>> {\n return injector.get(CB_DEFAULT_OPTIONS, DEFAULT_OPTIONS, {\n optional: true,\n });\n}\n\n/** @internal — strips the deprecated `treshold` field and folds it into `threshold` */\nfunction normalizeThreshold(\n opt: CircuitBreakerOptions | undefined,\n): Partial<Omit<CreateCircuitBreakerOptions, 'treshold'>> {\n if (!opt || typeof opt !== 'object' || 'isClosed' in opt) return {};\n const { treshold, threshold, ...rest } = opt;\n return {\n ...rest,\n threshold: threshold ?? treshold,\n };\n}\n\n/**\n * Creates a circuit breaker instance.\n *\n * @param options - Configuration options for the circuit breaker. Can be:\n * - `undefined`: Uses defaults (threshold: 5, timeout: 30000ms) or provided defaults via {@link provideCircuitBreakerDefaultOptions}.\n * - `false`: Creates a \"no-op\" circuit breaker that is always closed (never trips).\n * - `true`: Creates a circuit breaker with default settings.\n * - `CircuitBreaker`: Reuses an existing `CircuitBreaker` instance.\n * - `{ threshold?: number; timeout?: number; }`: Creates a circuit breaker with the specified threshold and timeout.\n *\n * @returns A `CircuitBreaker` instance.\n *\n * @example\n * // Create a circuit breaker with default settings:\n * const breaker = createCircuitBreaker();\n *\n * // Create a circuit breaker with custom settings:\n * const customBreaker = createCircuitBreaker({ threshold: 10, timeout: 60000 });\n *\n * // Share a single circuit breaker instance across multiple resources:\n * const sharedBreaker = createCircuitBreaker();\n * const resource1 = queryResource(..., { circuitBreaker: sharedBreaker });\n * const resource2 = mutationResource(..., { circuitBreaker: sharedBreaker });\n */\nexport function createCircuitBreaker(\n opt?: CircuitBreakerOptions,\n injector?: Injector,\n): CircuitBreaker {\n if (opt === false) return createNeverBrokenCircuitBreaker();\n\n if (typeof opt === 'object' && 'isClosed' in opt) return opt;\n\n const { threshold, timeout, shouldFail, shouldFailForever } = {\n ...injectCircuitBreakerOptions(injector),\n ...normalizeThreshold(opt),\n };\n\n return internalCeateCircuitBreaker(\n threshold,\n timeout,\n shouldFail,\n shouldFailForever,\n );\n}\n","// Heavily inspired by: https://dev.to/kasual1/request-deduplication-in-angular-3pd8\n\nimport {\n HttpContext,\n HttpContextToken,\n type HttpEvent,\n type HttpHandlerFn,\n type HttpInterceptorFn,\n type HttpRequest,\n} from '@angular/common/http';\nimport { type Observable } from 'rxjs';\nimport { hashRequest } from './hash-request';\nimport { sharePending } from './share-pending';\n\nconst NO_DEDUPE = new HttpContextToken<boolean>(() => false);\n\n/**\n * Disables request deduplication for a specific HTTP request.\n *\n * @param ctx - The `HttpContext` to modify. If not provided, a new `HttpContext` is created.\n * @returns The modified `HttpContext` with the `NO_DEDUPE` token set to `true`.\n *\n * @example\n * // Disable deduplication for a specific POST request:\n * const context = noDedupe();\n * this.http.post('/api/data', payload, { context }).subscribe(...);\n *\n * // Disable deduplication, modifying an existing context:\n * let context = new HttpContext();\n * context = noDedupe(context);\n * this.http.post('/api/data', payload, { context }).subscribe(...);\n */\nexport function noDedupe(ctx: HttpContext = new HttpContext()) {\n return ctx.set(NO_DEDUPE, true);\n}\n\n/**\n * Creates an `HttpInterceptorFn` that deduplicates identical HTTP requests.\n * If multiple identical requests (same URL and parameters) are made concurrently,\n * only the first request will be sent to the server. Subsequent requests will\n * receive the response from the first request.\n *\n * Relationship to `createCacheInterceptor`: the cache interceptor has built-in\n * single-flight for CACHE-ENABLED requests (keyed by the cache key). This interceptor\n * covers everything the cache doesn't see — non-cached resources, plain HttpClient\n * calls, DELETEs — keyed by the request hash. Installing both is the recommended\n * setup; where they overlap, this one degrades to a no-op passthrough.\n *\n * @param allowed - An array of HTTP methods for which deduplication should be enabled.\n * Defaults to `['GET', 'DELETE', 'HEAD', 'OPTIONS']`.\n * @param keyFn - Optional function to compute the dedupe key from a request.\n * Defaults to `hashRequest`, which includes method, URL,\n * response type, params, and body.\n *\n * @returns An `HttpInterceptorFn` that implements the request deduplication logic.\n *\n * @example\n * // In your app.config.ts or module providers:\n * import { provideHttpClient, withInterceptors } from '@angular/common/http';\n * import { createDedupeRequestsInterceptor } from './your-dedupe-interceptor';\n *\n * export const appConfig: ApplicationConfig = {\n * providers: [\n * provideHttpClient(withInterceptors([createDedupeRequestsInterceptor()])),\n * // ... other providers\n * ],\n * };\n *\n * // You can also specify which methods should be deduped\n * export const appConfig: ApplicationConfig = {\n * providers: [\n * provideHttpClient(withInterceptors([createDedupeRequestsInterceptor(['GET'])])), // only dedupe GET calls\n * // ... other providers\n * ],\n * };\n */\nexport function createDedupeRequestsInterceptor(\n allowed = ['GET', 'DELETE', 'HEAD', 'OPTIONS'],\n keyFn: (req: HttpRequest<unknown>) => string = hashRequest,\n): HttpInterceptorFn {\n const inFlight = new Map<string, Observable<HttpEvent<unknown>>>();\n\n const DEDUPE_METHODS = new Set<string>(allowed);\n\n return (\n req: HttpRequest<unknown>,\n next: HttpHandlerFn,\n ): Observable<HttpEvent<unknown>> => {\n if (!DEDUPE_METHODS.has(req.method) || req.context.get(NO_DEDUPE))\n return next(req);\n\n return sharePending(inFlight, keyFn(req), () => next(req));\n };\n}\n","import {\n HttpContext,\n HttpHeaders,\n HttpParams,\n type HttpResourceRequest,\n} from '@angular/common/http';\nimport { type ValueEqualityFn } from '@angular/core';\nimport { hash } from './hash-unknown';\n\nfunction equalTransferCache(\n a: HttpResourceRequest['transferCache'],\n b: HttpResourceRequest['transferCache'],\n): boolean {\n if (!a && !b) return true;\n if (!a || !b) return false;\n\n if (typeof a !== typeof b) return false;\n if (typeof a === 'boolean' || typeof b === 'boolean') return a === b;\n\n if (!a.includeHeaders && !b.includeHeaders) return true;\n if (!a.includeHeaders || !b.includeHeaders) return false;\n\n if (a.includeHeaders.length !== b.includeHeaders.length) return false;\n\n if (a.includeHeaders.length === 0) return true;\n\n const aSet = new Set(a.includeHeaders ?? []);\n\n return b.includeHeaders.every((header) => aSet.has(header));\n}\n\nfunction equalParamArray(\n a: (string | number | boolean)[],\n b: (string | number | boolean)[],\n): boolean {\n if (!a && !b) return true;\n if (!a || !b) return false;\n if (a.length !== b.length) return false;\n\n return a.every((value) => b.includes(value));\n}\n\nfunction headersToObject(headerClass: HttpHeaders) {\n const headers: Exclude<Required<HttpResourceRequest['headers']>, HttpHeaders | undefined> = {};\n\n headerClass.keys().forEach((key) => {\n const value = headerClass.getAll(key);\n if (value === null) return;\n if (value.length === 1) {\n headers[key] = value[0];\n } else {\n headers[key] = value;\n }\n });\n\n return headers;\n}\n\nfunction paramToObject(paramsClass: HttpParams) {\n const params: Exclude<Required<HttpResourceRequest['params']>, HttpParams | undefined> = {};\n\n paramsClass.keys().forEach((key) => {\n const value = paramsClass.getAll(key);\n if (value === null) return;\n if (value.length === 1) {\n params[key] = value[0];\n } else {\n params[key] = value;\n }\n });\n\n return params;\n}\n\nfunction equalParams(a: HttpResourceRequest['params'], b: HttpResourceRequest['params']): boolean {\n if (!a && !b) return true;\n if (!a || !b) return false;\n\n const aObj = a instanceof HttpParams ? paramToObject(a) : a;\n const bObj = b instanceof HttpParams ? paramToObject(b) : b;\n\n const aKeys = Object.keys(aObj);\n const bKeys = Object.keys(bObj);\n if (aKeys.length !== bKeys.length) return false;\n\n return aKeys.every((key) => {\n if (Array.isArray(aObj[key]) || Array.isArray(bObj[key])) {\n return equalParamArray(\n Array.isArray(aObj[key]) ? aObj[key] : [aObj[key]],\n Array.isArray(bObj[key]) ? bObj[key] : [bObj[key]],\n );\n }\n\n return aObj[key] === bObj[key];\n });\n}\n\nfunction equalBody(a: HttpResourceRequest['body'], b: HttpResourceRequest['body']): boolean {\n if (!a && !b) return true;\n if (!a || !b) return false;\n return hash(a) === hash(b);\n}\n\nfunction equalHeaders(\n a: HttpResourceRequest['headers'],\n b: HttpResourceRequest['headers'],\n): boolean {\n if (!a && !b) return true;\n if (!a || !b) return false;\n\n const aObj = a instanceof HttpHeaders ? headersToObject(a) : a;\n const bObj = b instanceof HttpHeaders ? headersToObject(b) : b;\n\n const aKeys = Object.keys(aObj);\n const bKeys = Object.keys(bObj);\n if (aKeys.length !== bKeys.length) return false;\n return aKeys.every((key) => {\n if (Array.isArray(aObj[key]) || Array.isArray(bObj[key])) {\n return equalParamArray(\n Array.isArray(aObj[key]) ? aObj[key] : [aObj[key]],\n Array.isArray(bObj[key]) ? bObj[key] : [bObj[key]],\n );\n }\n\n return aObj[key] === bObj[key];\n });\n}\n\nfunction toHttpContextEntries(ctx: HttpResourceRequest['context']) {\n if (!ctx) return [];\n\n if (ctx instanceof HttpContext) {\n const tokens = Array.from(ctx.keys());\n return tokens.map((key) => [key.toString(), ctx.get(key)] as const);\n }\n\n if (typeof ctx === 'object') {\n return Object.entries(ctx) as [string, unknown][];\n }\n\n return [];\n}\n\nfunction equalContext(\n a: HttpResourceRequest['context'],\n b: HttpResourceRequest['context'],\n): boolean {\n if (!a && !b) return true;\n if (!a || !b) return false;\n\n const aEntries = toHttpContextEntries(a);\n const bEntries = toHttpContextEntries(b);\n if (aEntries.length !== bEntries.length) return false;\n if (aEntries.length === 0) return true;\n const bMap = new Map(bEntries);\n return aEntries.every(([key, value]) => value === bMap.get(key));\n}\n\nexport function createEqualRequest<TResult>(equalResult?: ValueEqualityFn<TResult>) {\n const eqb = equalResult ?? equalBody;\n\n return (\n a: Partial<HttpResourceRequest> | undefined,\n b: Partial<HttpResourceRequest> | undefined,\n ) => {\n if (!a && !b) return true;\n if (!a || !b) return false;\n\n if (a.url !== b.url) return false;\n if (a.method !== b.method) return false;\n if (!equalParams(a.params, b.params)) return false;\n if (!equalHeaders(a.headers, b.headers)) return false;\n if (!eqb(a.body as TResult, b.body as TResult)) return false;\n if (!equalContext(a.context, b.context)) return false;\n\n if (a.withCredentials !== b.withCredentials) return false;\n if (a.reportProgress !== b.reportProgress) return false;\n if (!equalTransferCache(a.transferCache, b.transferCache)) return false;\n\n return true;\n };\n}\n","export function hasSlowConnection() {\n if (\n window &&\n 'navigator' in window &&\n 'connection' in window.navigator &&\n typeof window.navigator.connection === 'object' &&\n !!window.navigator.connection &&\n 'effectiveType' in window.navigator.connection &&\n typeof window.navigator.connection.effectiveType === 'string'\n )\n return window.navigator.connection.effectiveType.endsWith('2g');\n\n return false;\n}\n","import type { CircuitBreakerOptions } from './circuit-breaker';\nimport type { RefreshOptions } from './refresh';\nimport type { RetryOptions } from './retry-on-error';\nimport type { ResourceCacheOptions } from '../options';\n\n/**\n * Deep merges multiple circuit breaker options.\n * The latter options override the former.\n */\nexport function mergeCircuitBreakerOptions(\n global?: CircuitBreakerOptions | true,\n query?: CircuitBreakerOptions | true,\n local?: CircuitBreakerOptions | true,\n): CircuitBreakerOptions | true | undefined {\n if (!global && !query && !local) return undefined;\n return {\n ...(global === true ? {} : global),\n ...(query === true ? {} : query),\n ...(local === true ? {} : local),\n };\n}\n\n/**\n * Deep merges multiple retry options.\n * The latter options override the former.\n */\nexport function mergeRetryOptions(\n global?: RetryOptions | number,\n query?: RetryOptions | number,\n local?: RetryOptions | number,\n): RetryOptions | number | undefined {\n if (global === undefined && query === undefined && local === undefined) return undefined;\n return {\n ...(typeof global === 'number' ? { max: global } : global),\n ...(typeof query === 'number' ? { max: query } : query),\n ...(typeof local === 'number' ? { max: local } : local),\n };\n}\n\n/**\n * Deep merges multiple cache options.\n * The latter options override the former.\n */\nexport function mergeCacheOptions(\n query?: ResourceCacheOptions,\n local?: ResourceCacheOptions\n): ResourceCacheOptions | undefined {\n if (query === undefined && local === undefined) return undefined;\n return {\n ...(query === true ? {} : query),\n ...(local === true ? {} : local),\n };\n}\n\n/**\n * Deep merges multiple refresh options.\n * The latter options override the former.\n */\nexport function mergeRefreshOptions(\n query?: RefreshOptions | number,\n local?: RefreshOptions | number\n): RefreshOptions | number | undefined {\n if (query === undefined && local === undefined) return undefined;\n return {\n ...(typeof query === 'number' ? { interval: query } : query),\n ...(typeof local === 'number' ? { interval: local } : local),\n };\n}\n","import { type HttpHeaders, type HttpResourceRef } from '@angular/common/http';\nimport { type ValueEqualityFn } from '@angular/core';\nimport { keepPrevious } from '@mmstack/primitives';\n\nexport function persistResourceValues<T>(\n resource: HttpResourceRef<T>,\n shouldPersist = false,\n equal?: ValueEqualityFn<T>,\n): HttpResourceRef<T> {\n if (!shouldPersist) return resource;\n\n return {\n ...resource,\n statusCode: keepPrevious<number | undefined>(resource.statusCode),\n headers: keepPrevious<HttpHeaders | undefined>(resource.headers),\n value: keepPrevious<T>(resource.value, { equal }),\n };\n}\n","import { type HttpResourceRef } from '@angular/common/http';\nimport {\n effect,\n untracked,\n type DestroyRef,\n type EffectRef,\n type Injector,\n type Signal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { interval } from 'rxjs';\n\n/**\n * Refresh configuration for a query resource.\n * - a `number` is shorthand for `{ interval: number }` (poll every n milliseconds)\n * - the object form composes polling with event-driven refresh triggers\n */\nexport type RefreshOptions =\n | number\n | {\n /**\n * Poll interval in milliseconds. Omit (or 0) for no polling — useful when only\n * the event-driven triggers below are wanted.\n */\n interval?: number;\n /**\n * Reload when the page becomes visible again (tab refocused, window restored).\n * @default false\n */\n onFocus?: boolean;\n /**\n * Reload when the browser comes back online.\n * @default false\n */\n onReconnect?: boolean;\n };\n\n/** @internal Reactive sources + injector for the event-driven refresh triggers. */\nexport type RefreshTriggers = {\n injector: Injector;\n visibility: Signal<DocumentVisibilityState>;\n online: Signal<boolean>;\n};\n\n// refresh resource every n milliseconds and/or on visibility/reconnect transitions.\nexport function refresh<T>(\n resource: HttpResourceRef<T>,\n destroyRef: DestroyRef,\n opt?: RefreshOptions,\n inactive?: () => boolean,\n triggers?: RefreshTriggers,\n): HttpResourceRef<T> {\n const normalized = typeof opt === 'number' ? { interval: opt } : (opt ?? {});\n const {\n interval: ms,\n onFocus = false,\n onReconnect = false,\n } = normalized;\n\n const hasInterval = !!ms; // 0 excluded — not a valid polling cadence\n const hasTriggerEffects = !!triggers && (onFocus || onReconnect);\n\n if (!hasInterval && !hasTriggerEffects) return resource; // no refresh requested\n\n const tick = () => {\n if (inactive?.()) return; // disabled / paused → skip\n resource.reload();\n };\n\n const effectRefs: EffectRef[] = [];\n\n if (triggers && onFocus) {\n const vis = triggers.visibility;\n let prev = untracked(vis);\n effectRefs.push(\n effect(\n () => {\n const next = vis();\n const was = prev;\n prev = next;\n // only the hidden → visible TRANSITION refreshes — not the initial run\n if (was !== 'visible' && next === 'visible') untracked(tick);\n },\n { injector: triggers.injector },\n ),\n );\n }\n\n if (triggers && onReconnect) {\n const online = triggers.online;\n let prev = untracked(online);\n effectRefs.push(\n effect(\n () => {\n const next = online();\n const was = prev;\n prev = next;\n if (!was && next) untracked(tick);\n },\n { injector: triggers.injector },\n ),\n );\n }\n\n if (!hasInterval) {\n return {\n ...resource,\n destroy: () => {\n effectRefs.forEach((ref) => ref.destroy());\n resource.destroy();\n },\n };\n }\n\n // we can use RxJs here as reloading the resource will always be a side effect & as such does not impact the reactive graph in any way.\n let sub = interval(ms)\n .pipe(takeUntilDestroyed(destroyRef))\n .subscribe(tick);\n\n const reload = (): boolean => {\n sub.unsubscribe(); // do not conflict with manual reload\n\n const hasReloaded = resource.reload();\n\n // resubscribe after manual reload\n sub = interval(ms)\n .pipe(takeUntilDestroyed(destroyRef))\n .subscribe(tick);\n\n return hasReloaded;\n };\n\n return {\n ...resource,\n reload,\n destroy: () => {\n sub.unsubscribe();\n effectRefs.forEach((ref) => ref.destroy());\n resource.destroy();\n },\n };\n}","import { type HttpResourceRef } from '@angular/common/http';\nimport { effect, untracked } from '@angular/core';\n\nexport type RetryOptions =\n | number\n | {\n max?: number;\n backoff?: number;\n };\n\n/**\n * Callback fired by the retry wrapper for every failed attempt.\n * `retryCount` is the number of retries that already happened before this\n * error (`0` on the original failure, `1` after the first retry, etc.).\n * `isFinal` is `true` when no further retry will be scheduled — either because\n * retries are exhausted or `retry` was unset/0.\n */\nexport type RetryErrorCallback<TError = unknown> = (\n err: TError,\n retryCount: number,\n isFinal: boolean,\n) => void;\n\n// Retry on error, if number is provided it will retry that many times with exponential backoff, otherwise it will use the options provided\nexport function retryOnError<T>(\n res: HttpResourceRef<T>,\n opt?: RetryOptions,\n onError?: RetryErrorCallback,\n): HttpResourceRef<T> {\n const max = opt ? (typeof opt === 'number' ? opt : (opt.max ?? 0)) : 0;\n const backoff = typeof opt === 'object' ? (opt.backoff ?? 1000) : 1000;\n\n let retries = 0;\n\n let timeout: ReturnType<typeof setTimeout> | undefined;\n\n const handleError = () => {\n const err = untracked(res.error);\n const isFinal = retries >= max;\n\n onError?.(err, retries, isFinal);\n\n if (isFinal) return;\n\n retries++;\n\n if (timeout) clearTimeout(timeout);\n\n timeout = setTimeout(\n () => res.reload(),\n retries <= 0 ? 0 : backoff * Math.pow(2, retries - 1),\n );\n };\n\n const onSuccess = () => {\n if (timeout) clearTimeout(timeout);\n retries = 0;\n };\n\n const ref = effect(() => {\n switch (res.status()) {\n case 'error':\n return handleError();\n case 'resolved':\n return onSuccess();\n }\n });\n\n return {\n ...res,\n destroy: () => {\n ref.destroy(); // cleanup on manual destroy\n res.destroy();\n },\n };\n}\n","import { inject, Injectable } from '@angular/core';\nimport { sensor } from '@mmstack/primitives';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class ResourceSensors {\n readonly networkStatus = sensor('networkStatus');\n readonly pageVisibility = sensor('pageVisibility');\n}\n\nexport function injectNetworkStatus() {\n return inject(ResourceSensors).networkStatus;\n}\n\nexport function injectPageVisibility() {\n return inject(ResourceSensors).pageVisibility;\n}\n","import { type HttpResourceRef } from '@angular/common/http';\n\nexport function toResourceObject<T>(\n res: HttpResourceRef<T>,\n): HttpResourceRef<T> {\n return {\n snapshot: res.snapshot,\n asReadonly: () => res.asReadonly(),\n destroy: () => res.destroy(),\n error: res.error,\n headers: res.headers,\n isLoading: res.isLoading,\n progress: res.progress,\n status: res.status,\n statusCode: res.statusCode,\n value: res.value,\n reload: () => res.reload(),\n hasValue: (() => res.hasValue()) as HttpResourceRef<T>['hasValue'],\n set: (v) => res.set(v),\n update: (v) => res.update(v),\n };\n}\n","import {\n DestroyRef,\n inject,\n InjectionToken,\n type Injector,\n type Provider,\n type ResourceRef,\n runInInjectionContext,\n} from '@angular/core';\nimport {\n injectTransitionScope,\n type RegisterOptions,\n} from '@mmstack/primitives';\nimport { type CircuitBreakerOptions, type RetryOptions } from './util';\nimport { type HttpResourceRequest } from '@angular/common/http';\n\n/**\n * Options for enabling and configuring caching for a resource.\n *\n * - `true`: Enables caching with default settings.\n * - `{ ttl?: number; staleTime?: number; hash?: (req: HttpResourceRequest) => string; }`: Configures caching with custom settings.\n */\nexport type ResourceCacheOptions =\n | true\n | {\n /**\n * The time-to-live for the cached value in milliseconds.\n * After this time, the value is removed from the cache entirely.\n * Defaults to 5 minutes (`300_000`).\n */\n ttl?: number;\n /**\n * The time in milliseconds during which the cached value is considered \"fresh\".\n * If a request is made within this time, the cached value is returned immediately without a background fetch.\n * Defaults to 0 (always stale, triggering a background fetch).\n */\n staleTime?: number;\n /**\n * A custom function to generate the cache key from the HTTP request.\n * By default, it hashes the URL, method, headers (specified by `varyHeaders`), and body.\n */\n hash?: (req: HttpResourceRequest) => string;\n /**\n * A list of header names to include in the default cache key generation.\n * Ignored if a custom `hash` function is provided.\n *\n * Note: still call `cache.clear()` on logout — the previous user's entries are\n * unreachable under the new key but linger until their TTL.\n */\n varyHeaders?: string[];\n /**\n * Whether to bust the browser cache by appending a unique query parameter to the request URL.\n * This is useful for ensuring that the latest data is fetched from the server, bypassing any\n * cached responses in the browser. The unique parameter is removed before calling the cache function, so it does not affect the cache key.\n * @default false - By default, the resource will not bust the browser cache.\n */\n bustBrowserCache?: boolean;\n /**\n * Whether to ignore the `Cache-Control` headers from the server when caching responses.\n * If set to `true`, the resource will not respect any cache directives from the server,\n * allowing you to control caching behavior entirely through the resource options.\n * @default false - By default the resource will respect `Cache-Control` headers.\n */\n ignoreCacheControl?: boolean;\n /**\n * If true, it saves the cached responses to an indexedDb table, making it available across\n * tabs, sessions and reloads..only valid JSON responses can be persisted (so no Blobs, formData, ArrayBuffers etc.)\n * @default false\n */\n persist?: boolean;\n };\n\n/**\n * Auto-registration into the nearest transition scope, as a resource OPTION:\n * - `'suspend'` — register as *suspending*: the boundary holds its placeholder until this\n * resource has a value (full Suspense). The right choice for data the subtree can't render without;\n * - `'indicator'` — register for the pending indicator + hold-stale only (does NOT block first\n * paint). The right choice for in-region data: the boundary shows the held value with `aria-busy`;\n * - `false` / omitted — don't register.\n *\n * Defaultable via `provideResourceOptions` / `provideQueryResourceOptions` and overridable\n * (including opting out with `false`) per call — so a dev can make \"all queries participate in\n * transitions\" the default and turn it off for the odd one.\n */\nexport type TransitionRegistration = false | 'indicator' | 'suspend';\n\n/** Options common to every resource kind (the base layer for the options-injection system). */\nexport type CommonResourceOptions = {\n /** Auto-registration into the nearest transition scope. */\n readonly register?: TransitionRegistration;\n /** Retry failed requests. */\n readonly retry?: RetryOptions;\n /** Configure a circuit breaker for the resource. */\n readonly circuitBreaker?: CircuitBreakerOptions | true;\n /** Trigger a request even when the request parameters are unchanged. @default false */\n readonly triggerOnSameRequest?: boolean;\n};\n\nconst RESOURCE_OPTIONS = new InjectionToken<CommonResourceOptions>(\n '@mmstack/resource:resource-options',\n { factory: () => ({}) },\n);\n\nfunction asProvider<T>(\n token: InjectionToken<T>,\n valueOrFn: T | (() => T),\n): Provider {\n return typeof valueOrFn === 'function'\n ? { provide: token, useFactory: valueOrFn as () => T }\n : { provide: token, useValue: valueOrFn };\n}\n\n/** Layer 1: defaults that apply to ALL resource kinds. Type-specific providers inherit + override these. */\nexport function provideResourceOptions(\n valueOrFn: CommonResourceOptions | (() => CommonResourceOptions),\n): Provider {\n return asProvider(RESOURCE_OPTIONS, valueOrFn);\n}\n\nexport function injectResourceOptions(\n injector?: Injector,\n): CommonResourceOptions {\n return injector ? injector.get(RESOURCE_OPTIONS) : inject(RESOURCE_OPTIONS);\n}\n\n/** Shared helper for the type-specific providers (query/mutation), so precedence is identical. */\nexport function provideTypedResourceOptions<T>(\n token: InjectionToken<T>,\n valueOrFn: T | (() => T),\n): Provider {\n return asProvider(token, valueOrFn);\n}\n\n/**\n * Applies a resolved `register` option to a freshly-created resource — adds it to the nearest\n * transition scope and removes it on destroy. Runs in the resource's injection context (or the\n * provided `injector`), since registration needs `TRANSITION_SCOPE` + `DestroyRef`.\n */\nexport function applyResourceRegistration(\n ref: ResourceRef<unknown>,\n register: TransitionRegistration | undefined,\n injector?: Injector,\n): void {\n if (!register) return;\n const opt: RegisterOptions = { suspends: register === 'suspend' };\n const run = injector\n ? (fn: () => void) => runInInjectionContext(injector, fn)\n : (fn: () => void) => fn();\n run(() => {\n const scope = injectTransitionScope();\n const destroyRef = inject(DestroyRef);\n scope.add(ref, opt);\n destroyRef.onDestroy(() => scope.remove(ref));\n });\n}\n","import {\n HttpClient,\n type HttpHeaders,\n httpResource,\n type HttpResourceOptions,\n type HttpResourceRef,\n type HttpResourceRequest,\n HttpResponse,\n} from '@angular/common/http';\nimport {\n computed,\n DestroyRef,\n effect,\n inject,\n InjectionToken,\n Injector,\n isDevMode,\n linkedSignal,\n type Provider,\n type ResourceRef,\n runInInjectionContext,\n type Signal,\n untracked,\n type WritableSignal,\n} from '@angular/core';\nimport {\n injectPaused,\n type PauseOption,\n toWritable,\n} from '@mmstack/primitives';\nimport { firstValueFrom } from 'rxjs';\nimport {\n applyResourceRegistration,\n type CommonResourceOptions,\n type ResourceCacheOptions,\n injectResourceOptions,\n provideTypedResourceOptions,\n} from './options';\nimport {\n catchValueError,\n createCircuitBreaker,\n createEqualRequest,\n hashRequest,\n hasSlowConnection,\n injectNetworkStatus,\n injectPageVisibility,\n injectQueryCache,\n mergeCacheOptions,\n mergeCircuitBreakerOptions,\n mergeRefreshOptions,\n mergeRetryOptions,\n persistResourceValues,\n refresh,\n type RefreshOptions,\n retryOnError,\n setCacheContext,\n toResourceObject,\n} from './util';\nimport { type CacheEntry } from './util/cache/cache';\n\nexport { type RefreshOptions } from './util';\n\n/**\n * Options for configuring a `queryResource`. Extends Angular's\n * `HttpResourceOptions` with caching, retries, refresh intervals, circuit\n * breakers, and lifecycle callbacks. See the linked properties below for the\n * full list.\n *\n * @example\n * ```ts\n * const options: QueryResourceOptions<User> = {\n * defaultValue: { id: 0, name: 'Anonymous' },\n * cache: { ttl: 60_000, staleTime: 10_000 },\n * refresh: 30_000,\n * retry: { max: 3 },\n * circuitBreaker: true,\n * onError: (err, retry, isFinal) => isFinal && toast.error(err),\n * };\n * ```\n */\nexport type QueryResourceOptions<TResult, TRaw = TResult> = HttpResourceOptions<\n TResult,\n TRaw\n> &\n CommonResourceOptions & {\n /**\n * Whether to keep the previous value of the resource while a refresh is in progress.\n * Defaults to `false`. Also keeps status & headers while refreshing.\n */\n keepPrevious?: boolean;\n /**\n * Automatic refresh behavior. A number polls every n milliseconds; the object form\n * composes polling with event-driven triggers:\n *\n * ```ts\n * refresh: 30_000 // poll every 30s\n * refresh: { onFocus: true, onReconnect: true } // refetch on tab refocus / back-online\n * refresh: { interval: 60_000, onFocus: true } // both\n * ```\n *\n * Triggers respect the resource's disabled/paused state (no refetch while\n * offline, circuit-open, or paused).\n */\n refresh?: RefreshOptions;\n /**\n * Called on every failed attempt, including each retry.\n *\n * @param err - The error from the underlying HTTP request.\n * @param retryCount - The number of retries that already happened before\n * this error (`0` on the original failure, `1` after the first retry, etc.).\n * @param isFinal - `true` when no further retry will be scheduled — either\n * because retries are exhausted or `retry` was unset/0. Branch on this for\n * \"user actually needs to know\" side effects (toasts, error reporting).\n */\n onError?: (err: unknown, retryCount: number, isFinal: boolean) => void;\n /**\n * Options for enabling and configuring caching for the resource.\n */\n cache?: ResourceCacheOptions;\n /**\n * Opt-in automatic pausing (off by default — existing behavior unchanged):\n * - `true` — pause whenever the surrounding Activity boundary (`MmActivity` /\n * `providePaused` from `@mmstack/primitives`) is paused. Outside a boundary this\n * is a no-op, so it's safe to set app-wide via `provideQueryResourceOptions`.\n * - a `() => boolean` predicate (a `Signal<boolean>` qualifies) — pause while it\n * returns `true`.\n *\n * Pausing has the same semantics as returning `ctx.paused` from the request fn:\n * the resource HOLDS its current value and last request (no refetch on resume if\n * the request is unchanged) and stops background work (polling, focus/reconnect\n * triggers). The two compose — either source can pause the resource.\n */\n pause?: PauseOption;\n /**\n * Comparison of request object\n */\n equalRequest?: (a: HttpResourceRequest, b: HttpResourceRequest) => boolean;\n };\n\nconst QUERY_RESOURCE_OPTIONS = new InjectionToken<\n Partial<QueryResourceOptions<any, any>>\n>('@mmstack/resource:query-resource-options', { factory: () => ({}) });\n\n/**\n * Layer 2 (query): default options for every `queryResource`, inheriting + overriding the\n * common defaults from `provideResourceOptions`. Per-call options override these in turn.\n */\nexport function provideQueryResourceOptions(\n valueOrFn:\n | Partial<QueryResourceOptions<any, any>>\n | (() => Partial<QueryResourceOptions<any, any>>),\n): Provider {\n return provideTypedResourceOptions(QUERY_RESOURCE_OPTIONS, valueOrFn);\n}\n\nfunction injectQueryResourceOptions(\n injector?: Injector,\n): Partial<QueryResourceOptions<any, any>> {\n return injector\n ? injector.get(QUERY_RESOURCE_OPTIONS)\n : inject(QUERY_RESOURCE_OPTIONS);\n}\n\n/**\n * The reason a query resource is currently in the `disabled` state, or `null`\n * if it is enabled. Useful for branching UI on cause (e.g. \"offline\" vs\n * \"circuit tripped\" vs \"nothing to fetch yet\").\n *\n * @example\n * ```ts\n * effect(() => {\n * switch (user.disabledReason()) {\n * case 'offline': return toast.warn('You are offline');\n * case 'circuit-open': return toast.warn('Service temporarily unavailable');\n * case 'no-request': return; // expected — request signal returned undefined\n * case null: return; // resource is enabled\n * }\n * });\n * ```\n *\n * Note: a PAUSED resource also reports `'no-request'` — it holds its previous value\n * and request, but no request is currently active.\n */\nexport type DisabledReason = 'offline' | 'circuit-open' | 'no-request';\n\n/**\n * Returned from a resource's request fn to PAUSE it: the resource holds its current value and last\n * request (so it does not refetch on resume), and stops background work (no polling, no refetch\n * while paused). Distinct from returning `undefined` (DISABLE), which drops the request — a\n * disabled resource may refetch when re-enabled, a paused one resumes exactly where it left off.\n *\n * The request fn receives a {@link RequestContext} and can just return `ctx.paused`.\n */\nexport const PAUSED: unique symbol = Symbol('@mmstack/resource:paused');\n\n/**\n * Context passed to a resource's request fn. An object (not positional args) so it can grow\n * without changing the call signature. Today it carries {@link PAUSED} so the fn can return it.\n */\nexport type RequestContext = { readonly paused: typeof PAUSED };\n\n/** The request fn shape: build a request, or return `undefined` (disable) / `ctx.paused` (pause). */\nexport type ResourceRequestFn = (\n ctx: RequestContext,\n) => HttpResourceRequest | string | undefined | void | typeof PAUSED;\n\n/**\n * Represents a resource created by `queryResource`. Extends `HttpResourceRef`\n * with `disabled` / `disabledReason` signals, writable `headers` / `statusCode`\n * (so optimistic updates can patch them), and `prefetch()` for proactive cache\n * warm-up.\n *\n * @example\n * ```ts\n * const user = queryResource<User>(() => `/api/users/${userId()}`);\n *\n * effect(() => {\n * if (user.status() === 'resolved') console.log(user.value());\n * });\n *\n * // Warm the cache before navigating\n * onMouseEnter(() => user.prefetch());\n * ```\n */\nexport type QueryResourceRef<TResult> = Omit<\n HttpResourceRef<TResult>,\n 'headers' | 'statusCode'\n> & {\n /**\n * Linkedsignal of the response headers, when available.\n */\n readonly headers: WritableSignal<HttpHeaders | undefined>;\n /**\n * Linkedsignal of the response status code, when available.\n */\n readonly statusCode: WritableSignal<number | undefined>;\n /**\n * A signal indicating whether the resource is currently disabled (due to circuit breaker, offline, or undefined request).\n */\n disabled: Signal<boolean>;\n /**\n * Why the resource is currently disabled, or `null` if it is enabled.\n * Maps to one of: `'offline'`, `'circuit-open'`, `'no-request'`.\n */\n disabledReason: Signal<DisabledReason | null>;\n /**\n * Prefetches data for the resource, populating the cache if caching is enabled. This can be\n * used to proactively load data before it's needed.\n *\n * Resolves immediately without fetching when caching is disabled or a slow\n * connection is detected (prefetching would compete with user-initiated requests).\n *\n * @param req - Optional partial request parameters to use for the prefetch. This allows you\n * to prefetch data with different parameters than the main resource request.\n */\n prefetch: (req?: Partial<HttpResourceRequest> | string) => Promise<void>;\n};\n\n/**\n * Creates an HTTP resource with features like caching, retries, refresh intervals, circuit breaker, and optimistic updates. Without additional options it is equivalent to simply calling `httpResource`.\n * This overload is for when a `defaultValue` is provided, ensuring that the resource's value is always defined.\n * @param request A function that returns the `HttpResourceRequest` or a URL string to be made. This function\n * is called reactively, so the request can change over time. If the function\n * returns `undefined`, the resource is considered \"disabled\" and no request will be made.\n * @param options Configuration options for the resource. These options extend the basic\n * `HttpResourceOptions` and add features like `keepPrevious`, `refresh`, `retry`,\n * `onError`, `circuitBreaker`, and `cache`. Additionally, when a `defaultValue` is provided, the resource's value will always be defined, even if the underlying HTTP request fails or is disabled.\n * @returns An `QueryResourceRef` instance, which extends the basic `HttpResourceRef` with additional features.\n *\n * @example\n * ```ts\n * const userId = signal(1);\n *\n * const user = queryResource<User>(\n * () => `/api/users/${userId()}`,\n * { defaultValue: { id: 0, name: 'Anonymous' } },\n * );\n *\n * user.value(); // always User — never undefined, even before the first fetch resolves\n * ```\n */\nexport function queryResource<TResult, TRaw = TResult>(\n request: ResourceRequestFn,\n options: QueryResourceOptions<TResult, TRaw> & {\n defaultValue: NoInfer<TResult>;\n },\n): QueryResourceRef<TResult>;\n\n/**\n * Creates an extended HTTP resource with features like caching, retries, refresh intervals,\n * circuit breaker, and optimistic updates. Without additional options it is equivalent to simply calling `httpResource`.\n *\n * @param request A function that returns the `HttpResourceRequest` or a URL string to be made. This function\n * is called reactively, so the request can change over time. If the function\n * returns `undefined`, the resource is considered \"disabled\" and no request will be made.\n * @param options Configuration options for the resource. These options extend the basic\n * `HttpResourceOptions` and add features like `keepPrevious`, `refresh`, `retry`,\n * `onError`, `circuitBreaker`, and `cache`.\n * @returns An `QueryResourceRef` instance, which extends the basic `HttpResourceRef` with additional features.\n *\n * @example\n * ```ts\n * const userId = signal<number | undefined>(undefined);\n *\n * const user = queryResource<User>(\n * () => userId() ? `/api/users/${userId()}` : undefined,\n * {\n * cache: { ttl: 60_000, staleTime: 10_000 },\n * refresh: 30_000,\n * retry: { max: 3 },\n * },\n * );\n *\n * user.value(); // User | undefined\n * user.status(); // 'idle' | 'loading' | 'resolved' | 'error'\n * user.disabledReason(); // null while enabled; 'offline' / 'circuit-open' / 'no-request' otherwise\n * ```\n */\nexport function queryResource<TResult, TRaw = TResult>(\n request: ResourceRequestFn,\n options?: QueryResourceOptions<TResult, TRaw>,\n): QueryResourceRef<TResult | undefined>;\n\nexport function queryResource<TResult, TRaw = TResult>(\n request: ResourceRequestFn,\n options0?: QueryResourceOptions<TResult, TRaw>,\n): QueryResourceRef<TResult | undefined> {\n // Two-layer option injection: per-call > provideQueryResourceOptions > provideResourceOptions.\n const globalOpts = injectResourceOptions(options0?.injector);\n const queryOpts = injectQueryResourceOptions(options0?.injector);\n\n const options = {\n ...globalOpts,\n ...queryOpts,\n ...options0,\n cache: mergeCacheOptions(queryOpts.cache, options0?.cache),\n circuitBreaker: mergeCircuitBreakerOptions(\n globalOpts.circuitBreaker,\n queryOpts.circuitBreaker,\n options0?.circuitBreaker,\n ),\n retry: mergeRetryOptions(globalOpts.retry, queryOpts.retry, options0?.retry),\n refresh: mergeRefreshOptions(queryOpts.refresh, options0?.refresh),\n } as QueryResourceOptions<TResult, TRaw>;\n\n const cache = injectQueryCache<TResult>(options?.injector);\n\n const destroyRef = options?.injector\n ? options.injector.get(DestroyRef)\n : inject(DestroyRef);\n\n const cb = createCircuitBreaker(\n options?.circuitBreaker === true\n ? undefined\n : (options?.circuitBreaker ?? false),\n options?.injector,\n );\n\n const networkAvailable = injectNetworkStatus();\n\n const eq = options?.triggerOnSameRequest\n ? undefined\n : (options?.equalRequest ?? createEqualRequest());\n\n // Opt-in auto-pausing: `true` reads the ambient Activity boundary (no-op outside\n // one), a predicate is used directly. Composes with the manual `ctx.paused` path.\n const pauseOpt = options?.pause ?? false;\n const externallyPaused: () => boolean =\n pauseOpt === false\n ? () => false\n : typeof pauseOpt === 'function'\n ? pauseOpt\n : options?.injector\n ? runInInjectionContext(options.injector, injectPaused)\n : injectPaused();\n\n const requestCtx: RequestContext = { paused: PAUSED };\n const rawResult = computed(() => request(requestCtx));\n const paused = computed(() => rawResult() === PAUSED || externallyPaused());\n const rawRequest = computed(() => {\n const r = rawResult();\n return r === PAUSED ? undefined : (r ?? undefined);\n });\n\n const disabledReason = computed<DisabledReason | null>(() => {\n if (!networkAvailable()) return 'offline';\n if (cb.isOpen()) return 'circuit-open';\n // Both pause sources report 'no-request' here — ctx.paused makes rawRequest\n // undefined, while the external `pause` option still yields a real request, so it\n // must be checked explicitly. Either way this also stops polling/refresh triggers\n // (their inactive() guard reads disabledReason), while stableRequest below HOLDS\n // the last request so the value is kept (no refetch on resume).\n if (paused() || !rawRequest()) return 'no-request';\n return null;\n });\n\n // While PAUSED, hold the previous request so httpResource sees no change — it keeps its value and\n // does NOT refetch. On resume the request is re-evaluated, so it refetches only if it changed.\n const heldRequest = linkedSignal<\n { req: HttpResourceRequest | undefined; held: boolean },\n HttpResourceRequest | undefined\n >({\n source: () => {\n if (paused()) return { req: undefined, held: true };\n if (disabledReason() !== null) return { req: undefined, held: false };\n const req = rawRequest();\n if (!req) return { req: undefined, held: false };\n if (typeof req === 'string')\n return { req: { method: 'GET', url: req }, held: false };\n return { req, held: false };\n },\n computation: (curr, prev) =>\n curr.held && prev !== undefined ? prev.value : curr.req,\n });\n\n // Dedup via the request-equality (the linkedSignal re-runs on every source tick; this computed\n // is what actually gates httpResource — so an equal/held request never triggers a refetch).\n const stableRequest = computed(\n (): HttpResourceRequest | undefined => heldRequest(),\n {\n equal: (a, b) => {\n if (a === b) return true;\n if (a === undefined || b === undefined) return false;\n if (eq) return eq(a, b);\n return a === b;\n },\n },\n );\n\n const varyHeaders =\n typeof options?.cache === 'object' ? options.cache.varyHeaders : undefined;\n\n const hashFn =\n typeof options?.cache === 'object'\n ? (options.cache.hash ??\n ((r: HttpResourceRequest) => hashRequest(r, varyHeaders)))\n : hashRequest;\n\n const staleTime =\n typeof options?.cache === 'object' ? options.cache.staleTime : 0;\n const ttl =\n typeof options?.cache === 'object' ? options.cache.ttl : undefined;\n\n const cacheKey = computed(() => {\n const r = stableRequest();\n if (!r) return null;\n return hashFn(r);\n });\n\n const bustBrowserCache =\n typeof options?.cache === 'object' &&\n options.cache.bustBrowserCache === true;\n\n const ignoreCacheControl =\n typeof options?.cache === 'object' &&\n options.cache.ignoreCacheControl === true;\n\n const persist =\n typeof options?.cache === 'object' && options.cache.persist === true;\n\n const cachedRequest = options?.cache\n ? computed(() => {\n const r = stableRequest();\n if (!r) return r;\n\n return {\n ...r,\n context: setCacheContext(r.context, {\n staleTime,\n ttl,\n key: cacheKey() ?? hashFn(r),\n bustBrowserCache,\n ignoreCacheControl,\n persist,\n }),\n };\n })\n : stableRequest;\n\n let resource = toResourceObject(\n httpResource<TResult>(cachedRequest, {\n ...options,\n parse: options?.parse as any, // Not my favorite thing to do, but here it is completely safe.\n }) as HttpResourceRef<TResult>,\n );\n\n resource = catchValueError(resource, options?.defaultValue as TResult);\n\n // get full HttpResonse from Cache\n const cachedEvent = cache.getEntryOrKey(cacheKey);\n\n const cacheEntry = linkedSignal<\n CacheEntry<HttpResponse<TResult>> | string | null,\n { key: string; value: TResult | null } | null\n >({\n source: () => cachedEvent(),\n computation: (entry, prev) => {\n if (!entry) return null;\n\n if (\n typeof entry === 'string' &&\n prev &&\n prev.value !== null &&\n prev.value.key === entry\n ) {\n return prev.value;\n }\n\n if (typeof entry === 'string') return { key: entry, value: null };\n\n if (!(entry.value instanceof HttpResponse))\n return { key: entry.key, value: null };\n\n return {\n value: entry.value.body,\n key: entry.key,\n };\n },\n });\n\n // A disabled (offline / circuit-open / no-request) or PAUSED resource must not poll\n // or react to focus/reconnect.\n resource = refresh(\n resource,\n destroyRef,\n options?.refresh,\n () => disabledReason() !== null,\n {\n injector: options?.injector ?? inject(Injector),\n visibility: injectPageVisibility(),\n online: networkAvailable,\n },\n );\n resource = retryOnError(resource, options?.retry, options?.onError);\n\n resource = persistResourceValues<TResult>(\n resource,\n options?.keepPrevious,\n options?.equal,\n );\n\n const set = (value: TResult) => {\n resource.value.set(value);\n const k = untracked(cacheKey);\n if (options?.cache && k)\n cache.store(\n k,\n // statusText omitted — deprecated in Angular (HttpResponse defaults it)\n new HttpResponse({\n body: value,\n status: 200,\n }),\n staleTime,\n ttl,\n persist,\n );\n };\n\n const update = (updater: (value: TResult) => TResult) => {\n // baseline on the COMPOSED value (cache-preferring): the cache entry can be newer\n // than resource.value (cross-tab sync, another instance's set)\n set(updater(untracked(value)));\n };\n\n const value = options?.cache\n ? toWritable(\n computed((): TResult => cacheEntry()?.value ?? resource.value()),\n set,\n update,\n )\n : resource.value;\n\n // iterate circuit breaker state, is effect as a computed would cause a circular dependency (resource -> cb -> resource)\n const cbEffectRef = effect(() => {\n const status = resource.status();\n if (status === 'error') cb.fail(untracked(resource.error));\n else if (status === 'resolved') cb.success();\n });\n\n const client = options?.injector\n ? options.injector.get(HttpClient)\n : inject(HttpClient);\n\n const ref: QueryResourceRef<TResult | undefined> = {\n ...resource,\n value,\n set,\n update,\n statusCode: linkedSignal(resource.statusCode),\n headers: linkedSignal(resource.headers),\n disabled: computed(() => disabledReason() !== null),\n disabledReason,\n reload: () => {\n cb.halfOpen(); // open the circuit for manual reload\n return resource.reload();\n },\n destroy: () => {\n cbEffectRef.destroy();\n cb.destroy();\n resource.destroy();\n },\n prefetch: async (partial) => {\n if (!options?.cache || hasSlowConnection()) return Promise.resolve();\n\n const request = untracked(stableRequest);\n\n const partialReq =\n typeof partial === 'string' ? { method: 'GET', url: partial } : partial;\n\n const prefetchRequest = {\n ...request,\n ...partialReq,\n };\n if (!prefetchRequest.url) return Promise.resolve();\n\n const key = hashFn({\n ...prefetchRequest,\n url: prefetchRequest.url ?? '',\n });\n\n const found = cache.getUntracked(key);\n if (found && !found.isStale) return Promise.resolve();\n\n try {\n await firstValueFrom(\n client.request(prefetchRequest.method ?? 'GET', prefetchRequest.url, {\n ...prefetchRequest,\n referrerPolicy: prefetchRequest.referrerPolicy as\n | ReferrerPolicy\n | undefined,\n credentials: prefetchRequest.credentials as\n | RequestCredentials\n | undefined,\n priority: prefetchRequest.priority as RequestPriority | undefined,\n cache: prefetchRequest.cache as RequestCache | undefined,\n mode: prefetchRequest.mode as RequestMode | undefined,\n redirect: prefetchRequest.redirect as RequestRedirect | undefined,\n context: setCacheContext(prefetchRequest.context, {\n staleTime,\n ttl,\n key: hashFn({\n ...prefetchRequest,\n url: prefetchRequest.url ?? '',\n }),\n bustBrowserCache,\n ignoreCacheControl,\n persist,\n }),\n headers: prefetchRequest.headers as HttpHeaders,\n observe: 'response',\n }),\n );\n\n return;\n } catch (err) {\n if (isDevMode()) console.error('Prefetch failed: ', err);\n return;\n }\n },\n };\n\n // Auto-register into the nearest transition scope if the (merged) options ask for it.\n applyResourceRegistration(\n ref as ResourceRef<unknown>,\n options.register,\n options?.injector,\n );\n\n return ref;\n}\n","import { type HttpResourceRequest } from '@angular/common/http';\nimport {\n computed,\n effect,\n inject,\n Injector,\n signal,\n untracked,\n type Signal,\n} from '@angular/core';\nimport {\n queryResource,\n type PAUSED,\n type QueryResourceOptions,\n type QueryResourceRef,\n type RequestContext,\n} from './query-resource';\n\n/**\n * Context passed to an infinite query's request fn: the {@link RequestContext}\n * (so the fn can return `ctx.paused` to pause the resource, exactly like\n * `queryResource`) plus the `pageParam` addressing the page to load.\n */\nexport type InfiniteRequestContext<TPageParam> = RequestContext & {\n pageParam: TPageParam;\n};\n\n/**\n * Options for {@link infiniteQueryResource}. Extends {@link QueryResourceOptions}\n * (minus `defaultValue` — the aggregate value is always the `pages` array) with the\n * pagination contract.\n */\nexport type InfiniteQueryResourceOptions<\n TPage,\n TRaw = TPage,\n TPageParam = unknown,\n> = Omit<QueryResourceOptions<TPage, TRaw>, 'defaultValue'> & {\n /** The page param the FIRST page is requested with (e.g. `0`, `1`, or a cursor seed). */\n initialPageParam: TPageParam;\n /**\n * Derives the NEXT page's param from the freshly loaded page (and all pages so far).\n * Return `null`/`undefined` to signal \"no more pages\" — `hasNextPage` flips false\n * and `fetchNextPage()` becomes a no-op.\n *\n * @example\n * // cursor-based\n * getNextPageParam: (last) => last.nextCursor;\n * // offset-based\n * getNextPageParam: (last, all) => (last.items.length < PAGE_SIZE ? null : all.length);\n */\n getNextPageParam: (\n lastPage: NoInfer<TPage>,\n allPages: NoInfer<TPage>[],\n ) => TPageParam | null | undefined;\n};\n\n/**\n * A paginated query resource. `pages` accumulates every loaded page in order;\n * `fetchNextPage()` loads the next one (no-op while one is in flight or when\n * exhausted). Inherits the underlying query's `status`/`error`/`isLoading` and\n * its features (cache, retry, circuit breaker, refresh).\n */\nexport type InfiniteQueryResourceRef<TPage> = {\n /** Every page loaded so far, in load order. */\n pages: Signal<TPage[]>;\n /** `true` once the first page is in and `getNextPageParam` keeps producing params. */\n hasNextPage: Signal<boolean>;\n /** `true` while a page request beyond the first is in flight. */\n isFetchingNextPage: Signal<boolean>;\n /** The underlying query's loading state (first page + subsequent pages). */\n isLoading: Signal<boolean>;\n status: QueryResourceRef<TPage | undefined>['status'];\n error: QueryResourceRef<TPage | undefined>['error'];\n /** Loads the next page. No-op while loading or when `hasNextPage()` is false. */\n fetchNextPage: () => void;\n /** Reloads the CURRENT page param — the freshly loaded page replaces its slot. */\n reload: () => boolean;\n /** Drops all pages and refetches from `initialPageParam`. */\n reset: () => void;\n destroy: () => void;\n};\n\n/**\n * Creates a paginated HTTP resource over {@link queryResource}: one page request at a\n * time, accumulated into a `pages` signal — cursor- and offset-based pagination both\n * fit through `getNextPageParam`. Each page request inherits the full queryResource\n * feature set (caching per page, retries, circuit breaker, refresh triggers).\n *\n * @example\n * ```ts\n * const posts = infiniteQueryResource<PostPage, PostPage, number>(\n * ({ pageParam }) => ({ url: '/api/posts', params: { page: pageParam } }),\n * {\n * initialPageParam: 0,\n * getNextPageParam: (last, all) => (last.items.length < 20 ? null : all.length),\n * cache: true,\n * },\n * );\n *\n * // template:\n * // @for (page of posts.pages(); track $index) { ... }\n * // <button (click)=\"posts.fetchNextPage()\" [disabled]=\"!posts.hasNextPage()\">More</button>\n * const flat = computed(() => posts.pages().flatMap((p) => p.items));\n * ```\n */\nexport function infiniteQueryResource<\n TPage,\n TRaw = TPage,\n TPageParam = unknown,\n>(\n request: (\n ctx: InfiniteRequestContext<TPageParam>,\n ) => HttpResourceRequest | string | undefined | typeof PAUSED,\n options: InfiniteQueryResourceOptions<TPage, TRaw, TPageParam>,\n): InfiniteQueryResourceRef<TPage> {\n const { initialPageParam, getNextPageParam, ...rest } = options;\n const injector = options.injector ?? inject(Injector);\n\n const pageParam = signal<TPageParam>(initialPageParam);\n // pages keyed by the param that produced them, so a reload of an already-loaded\n // page REPLACES its slot instead of appending a duplicate\n const loaded = signal<{ param: TPageParam; page: TPage }[]>([]);\n\n const resource = queryResource<TPage, TRaw>(\n // forward queryResource's own context so the fn can return ctx.paused —\n // pausing holds the loaded pages and stops page fetches until unpaused\n (qctx) => request({ ...qctx, pageParam: pageParam() }),\n { ...rest, injector } as QueryResourceOptions<TPage, TRaw>,\n );\n\n const appendRef = effect(\n () => {\n if (resource.status() !== 'resolved') return;\n const page = resource.value();\n if (page === undefined) return;\n\n untracked(() => {\n const param = pageParam();\n loaded.update((list) => {\n const idx = list.findIndex((e) => Object.is(e.param, param));\n if (idx >= 0) {\n const copy = [...list];\n copy[idx] = { param, page };\n return copy;\n }\n return [...list, { param, page }];\n });\n });\n },\n { injector },\n );\n\n const pages = computed(() => loaded().map((e) => e.page));\n\n const nextPageParam = computed(() => {\n const all = pages();\n if (all.length === 0) return null;\n return getNextPageParam(all[all.length - 1], all) ?? null;\n });\n\n const hasNextPage = computed(() => nextPageParam() !== null);\n\n const fetchNextPage = () => {\n if (untracked(resource.isLoading)) return; // one page at a time\n const next = untracked(nextPageParam);\n if (next === null) return;\n pageParam.set(next);\n };\n\n const reset = () => {\n loaded.set([]);\n if (Object.is(untracked(pageParam), initialPageParam)) {\n resource.reload(); // param unchanged — force the refetch\n } else {\n pageParam.set(initialPageParam);\n }\n };\n\n return {\n pages,\n hasNextPage,\n isFetchingNextPage: computed(\n () => resource.isLoading() && loaded().length > 0,\n ),\n isLoading: resource.isLoading,\n status: resource.status,\n error: resource.error,\n fetchNextPage,\n reload: () => resource.reload(),\n reset,\n destroy: () => {\n appendRef.destroy();\n resource.destroy();\n },\n };\n}\n","import { type HttpResourceRequest } from '@angular/common/http';\nimport { computed, inject, Injector, signal, untracked } from '@angular/core';\nimport { nestedEffect } from '@mmstack/primitives';\nimport {\n queryResource,\n type QueryResourceOptions,\n type QueryResourceRef,\n} from './query-resource';\n\n/**\n * A reference to a manually triggered query resource. Extends\n * {@link QueryResourceRef} with a `trigger()` method that runs the request\n * imperatively and returns a `Promise<TResult>`. Useful when a request should\n * only happen on user action (search submit, button click) rather than on\n * every reactive change of the request inputs.\n *\n * @example\n * ```ts\n * const search = manualQueryResource<SearchResults>(() => ({\n * url: '/api/search',\n * params: { q: query() },\n * }));\n *\n * async function onSubmit() {\n * try {\n * const results = await search.trigger();\n * showResults(results);\n * } catch (err) {\n * toast.error('Search failed');\n * }\n * }\n * ```\n *\n * @see QueryResourceRef\n */\nexport type ManualQueryResourceRef<TResult> = QueryResourceRef<TResult> & {\n trigger: (\n req?: HttpResourceRequest | string,\n injector?: Injector,\n ) => Promise<TResult>;\n};\n\n/**\n * Creates a manually triggered HTTP resource with features like caching, retries, refresh intervals, circuit breaker, and optimistic updates. Without additional options it is equivalent to simply calling `httpResource`.\n * This overload is for when a `defaultValue` is provided, ensuring that the resource's value is always defined.\n * @param request A function that returns the `HttpResourceRequest` or a URL string to be made. This function\n * is called reactively, so the request can change over time. If the function\n * returns `undefined`, the resource is considered \"disabled\" and no request will be made.\n * @param options Configuration options for the resource. These options extend the basic\n * `HttpResourceOptions` and add features like `keepPrevious`, `refresh`, `retry`,\n * `onError`, `circuitBreaker`, and `cache`. Additionally, when a `defaultValue` is provided, the resource's value will always be defined, even if the underlying HTTP request fails or is disabled.\n * @returns An `ManualQueryResourceRef` instance, which extends the basic `QueryResourceRef` with additional features.\n *\n * @example\n * ```ts\n * const search = manualQueryResource<SearchResults>(\n * () => ({ url: '/api/search', params: { q: query() } }),\n * { defaultValue: { hits: [], total: 0 } },\n * );\n *\n * // search.value() is always SearchResults (never undefined) thanks to defaultValue.\n * const results = await search.trigger();\n * ```\n */\nexport function manualQueryResource<TResult, TRaw = TResult>(\n request: () => HttpResourceRequest | string | undefined | void,\n options: QueryResourceOptions<TResult, TRaw> & {\n defaultValue: NoInfer<TResult>;\n },\n): ManualQueryResourceRef<TResult>;\n\n/**\n * Creates a manually triggered extended HTTP resource with features like caching, retries, refresh intervals,\n * circuit breaker, and optimistic updates. Without additional options it is equivalent to simply calling `httpResource`.\n *\n * @param request A function that returns the `HttpResourceRequest` or a URL string to be made. This function\n * is called reactively, so the request can change over time. If the function\n * returns `undefined`, the resource is considered \"disabled\" and no request will be made.\n * @param options Configuration options for the resource. These options extend the basic\n * `HttpResourceOptions` and add features like `keepPrevious`, `refresh`, `retry`,\n * `onError`, `circuitBreaker`, and `cache`.\n * @returns An `ManualQueryResourceRef` instance, which extends the basic `QueryResourceRef` with additional features.\n *\n * @example\n * ```ts\n * const exportReport = manualQueryResource<Report>(() => ({\n * url: '/api/reports/export',\n * params: { range: range() },\n * }));\n *\n * async function onExportClick() {\n * try {\n * const report = await exportReport.trigger();\n * download(report);\n * } catch (err) {\n * toast.error('Export failed');\n * }\n * }\n * ```\n */\nexport function manualQueryResource<TResult, TRaw = TResult>(\n request: () => HttpResourceRequest | string | undefined | void,\n options?: QueryResourceOptions<TResult, TRaw>,\n): ManualQueryResourceRef<TResult | undefined>;\n\nexport function manualQueryResource<TResult, TRaw = TResult>(\n request: () => HttpResourceRequest | string | undefined | void,\n options?: QueryResourceOptions<TResult, TRaw>,\n): ManualQueryResourceRef<TResult | undefined> {\n const trigger = signal<{\n epoch: number;\n override?: HttpResourceRequest | string;\n }>(\n { epoch: 0 },\n {\n equal: (a, b) => a.epoch === b.epoch,\n },\n );\n\n const injector = options?.injector ?? inject(Injector);\n\n const req = computed(\n () => {\n const state = trigger();\n if (state.epoch === 0) return;\n if (state.override) return state.override;\n\n return untracked(request);\n },\n {\n equal: () => false,\n },\n );\n\n const resource = queryResource(req, options);\n\n // Shared across trigger() calls: a per-call watcher could observe the PREVIOUS\n // request's `resolved` status before this trigger's load flips the resource to\n // loading (effect ordering within a flush is unspecified) and resolve with stale\n // data; concurrent triggers would also cross-resolve each other's promises.\n let pending: {\n res: (value: TResult) => void;\n rej: (err: unknown) => void;\n }[] = [];\n let watcher: { destroy: () => void } | null = null;\n\n return {\n ...resource,\n trigger: (override, injectorOverride) => {\n trigger.update((s) => ({\n epoch: s.epoch + 1,\n override,\n }));\n\n return new Promise<TResult>((res, rej) => {\n if (untracked(req) === undefined) {\n // the request fn produced nothing — no load will ever start, so a watcher\n // would hang this promise forever\n rej(\n new Error(\n '[@mmstack/resource]: trigger() produced no request (the request fn returned undefined)',\n ),\n );\n return;\n }\n\n pending.push({ res, rej });\n\n // an active watcher (concurrent trigger) settles ALL pending promises with\n // the final result of the latest request — TanStack-style latest-wins\n if (watcher) return;\n\n // only accept a settle AFTER the load for this trigger has been observed —\n // the pre-trigger status may still be a stale `resolved`/`error`\n let sawLoading = false;\n\n watcher = nestedEffect(\n () => {\n const status = resource.status();\n\n if (status === 'loading' || status === 'reloading') {\n sawLoading = true;\n return;\n }\n if (!sawLoading) return;\n\n if (status === 'resolved' || status === 'error') {\n const settled = pending;\n pending = [];\n watcher?.destroy();\n watcher = null;\n\n if (status === 'resolved') {\n const value = untracked(resource.value) as TResult;\n settled.forEach((p) => p.res(value));\n } else {\n const err = untracked(resource.error);\n settled.forEach((p) => p.rej(err));\n }\n }\n },\n { injector: injectorOverride ?? injector },\n );\n });\n },\n };\n}\n","import { type HttpResourceRequest } from '@angular/common/http';\nimport {\n computed,\n DestroyRef,\n effect,\n inject,\n InjectionToken,\n type Injector,\n isDevMode,\n linkedSignal,\n type Provider,\n type ResourceRef,\n type Signal,\n signal,\n untracked,\n type ValueEqualityFn,\n} from '@angular/core';\nimport { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';\nimport { catchError, combineLatestWith, filter, map, of } from 'rxjs';\nimport {\n applyResourceRegistration,\n injectResourceOptions,\n provideTypedResourceOptions,\n} from './options';\nimport {\n queryResource,\n type QueryResourceOptions,\n type QueryResourceRef,\n} from './query-resource';\nimport {\n createCircuitBreaker,\n createEqualRequest,\n injectQueryCache,\n mergeCircuitBreakerOptions,\n mergeRetryOptions,\n} from './util';\n\nconst NULL_VALUE = Symbol('@mmstack/resource:null');\n\n/**\n * @internal\n * Helper type for inferring the request body type based on the HTTP method.\n */\ntype NextRequest<\n TMethod extends HttpResourceRequest['method'],\n TMutation,\n> = TMethod extends 'DELETE' | 'delete'\n ? Omit<HttpResourceRequest, 'body' | 'method'> & { method: TMethod }\n : Omit<HttpResourceRequest, 'body' | 'method'> & {\n body: TMutation;\n method: TMethod;\n };\n\n/**\n * @internal\n * Helper type for tracking mutation status.\n */\ntype StatusResult<TResult> =\n | {\n status: 'error';\n error: unknown;\n }\n | {\n status: 'resolved';\n value: TResult;\n };\n\n/**\n * Options for configuring a `mutationResource`. Inherits from\n * `QueryResourceOptions` (minus options that don't apply to mutations:\n * `equal`, `keepPrevious`, `refresh`, `cache`) and adds lifecycle callbacks\n * (`onMutate`, `onError`, `onSuccess`, `onSettled`) for managing optimistic\n * updates, rollback, and side effects.\n *\n * @typeParam TResult - The type of the expected result from the mutation.\n * @typeParam TRaw - The raw response type from the HTTP request (defaults to TResult).\n * @typeParam TCTX - The type of the context value returned by `onMutate`.\n *\n * @example\n * ```ts\n * const options: MutationResourceOptions<User, User, Partial<User>, { previous: User | null }> = {\n * onMutate: (patch) => {\n * const previous = current();\n * current.update((u) => (u ? { ...u, ...patch } : u)); // optimistic\n * return { previous };\n * },\n * onError: (_err, { previous }) => current.set(previous), // rollback\n * onSuccess: (saved) => toast.success(`Updated ${saved.name}`),\n * queue: true, // serialize requests when offline / circuit open\n * };\n * ```\n */\nexport type MutationResourceOptions<\n TResult,\n TRaw = TResult,\n TMutation = TResult,\n TCTX = void,\n TICTX = TCTX,\n TError = unknown,\n> = Omit<\n QueryResourceOptions<TResult, TRaw>,\n 'equal' | 'onError' | 'keepPrevious' | 'refresh' | 'cache' | 'pause' // we can't keep previous values, refresh, cache or auto-pause mutations as they are meant to be one-off commands\n> & {\n /**\n * A callback function that is called before the mutation request is made.\n * @param value The value being mutated (the `body` of the request).\n * @returns An optional context value that will be passed to the `onError`, `onSuccess`, and `onSettled` callbacks. This is useful for storing\n * information needed during the mutation lifecycle, such as previous values for optimistic updates or rollback.\n */\n onMutate?: (value: TMutation, initialCTX?: TICTX) => TCTX;\n /**\n * A callback function that is called if the mutation request fails.\n * @param error The error that occurred.\n * @param ctx The context value returned by the `onMutate` callback (or `undefined` if `onMutate` was not provided or returned `undefined`).\n */\n onError?: (error: TError, ctx: NoInfer<TCTX>) => void;\n /**\n * A callback function that is called if the mutation request succeeds.\n * @param value The result of the mutation (the parsed response body).\n * @param ctx The context value returned by the `onMutate` callback (or `undefined` if `onMutate` was not provided or returned `undefined`).\n */\n onSuccess?: (value: TResult, ctx: NoInfer<TCTX>) => void;\n /**\n * A callback function that is called when the mutation request settles (either succeeds or fails).\n * @param ctx The context value returned by the `onMutate` callback (or `undefined` if `onMutate` was not provided or returned `undefined`).\n */\n onSettled?: (ctx: NoInfer<TCTX>) => void;\n /**\n * Whether to queue the mutation requests and execute them in series. For example if network is unavailable or circuit breaker is open.\n * @default false\n */\n queue?: boolean;\n /**\n * Cache entries to invalidate after a SUCCESSFUL mutation — the declarative\n * alternative to calling `injectQueryCache().invalidatePrefix(...)` in `onSuccess`.\n *\n * Each string is a URL prefix matched against auto-generated `GET` cache keys\n * (`GET:${url}:...`): `'/api/posts'` invalidates `/api/posts` with any query params,\n * plus subpaths like `/api/posts/123` — and all `varyHeaders` variants of each.\n * Note that plain prefix matching also catches sibling paths sharing the prefix\n * (`/api/posts-archive`); pass `'/api/posts/'` or the exact URL to narrow.\n *\n * Entries keyed by a custom `hash` function follow that function's shape, not the\n * auto-key shape — invalidate those manually via `injectQueryCache().invalidateWhere`.\n *\n * The function form receives the mutation result and the mutated value:\n * ```ts\n * invalidates: (saved) => [`/api/posts`, `/api/users/${saved.authorId}`]\n * ```\n */\n invalidates?:\n | string[]\n | ((value: NoInfer<TResult>, mutation: NoInfer<TMutation>) => string[]);\n equal?: ValueEqualityFn<TMutation>;\n};\n\nconst MUTATION_RESOURCE_OPTIONS = new InjectionToken<\n Partial<MutationResourceOptions<any, any, any, any, any, any>>\n>('@mmstack/resource:mutation-resource-options', { factory: () => ({}) });\n\n/**\n * Layer 2 (mutation): default options for every `mutationResource`, inheriting + overriding the\n * common defaults from `provideResourceOptions`. Per-call options override these in turn.\n */\nexport function provideMutationResourceOptions(\n valueOrFn:\n | Partial<MutationResourceOptions<any, any, any, any, any, any>>\n | (() => Partial<MutationResourceOptions<any, any, any, any, any, any>>),\n): Provider {\n return provideTypedResourceOptions(MUTATION_RESOURCE_OPTIONS, valueOrFn);\n}\n\nfunction injectMutationResourceOptions(\n injector?: Injector,\n): Partial<MutationResourceOptions<any, any, any, any, any, any>> {\n return injector\n ? injector.get(MUTATION_RESOURCE_OPTIONS)\n : inject(MUTATION_RESOURCE_OPTIONS);\n}\n\n/**\n * Represents a mutation resource created by `mutationResource`. Extends\n * `QueryResourceRef` but strips methods that don't make sense for one-off\n * writes (`prefetch`, `value`, `hasValue`, `set`, `update`) and adds `mutate()`\n * for triggering a mutation plus `current()` for tracking the in-flight value.\n *\n * @typeParam TResult - The type of the expected result from the mutation.\n *\n * @example\n * ```ts\n * const updateUser = mutationResource<User, User, Partial<User>>(...);\n *\n * effect(() => console.log('mutating:', updateUser.current()));\n * effect(() => {\n * if (updateUser.status() === 'error') toast.error(updateUser.error());\n * });\n *\n * updateUser.mutate({ name: 'Alice' });\n * ```\n */\nexport type MutationResourceRef<\n TResult,\n TMutation = TResult,\n TICTX = void,\n> = Omit<\n QueryResourceRef<TResult>,\n 'prefetch' | 'value' | 'hasValue' | 'set' | 'update' // we don't allow manually viewing the returned data or updating it manually, prefetching a mutation also doesn't make any sense\n> & {\n /**\n * Executes the mutation.\n *\n * @param value The mutation value (usually the request body).\n * @param ctx An optional initial context value that will be passed to the `onMutate` callback.\n */\n mutate: (value: TMutation, ctx?: TICTX) => void;\n /**\n * A signal that holds the current mutation request, or `null` if no mutation is in progress.\n * This can be useful for tracking the state of the mutation or for displaying loading indicators.\n */\n current: Signal<TMutation | null>;\n};\n\n/**\n * Creates a resource for performing mutations (e.g., POST, PUT, PATCH, DELETE requests).\n * Unlike `queryResource`, `mutationResource` is designed for one-off operations that change data.\n * It does *not* cache responses and does not provide a `value` signal. Instead, it focuses on\n * managing the mutation lifecycle (pending, error, success) and provides callbacks for handling\n * these states.\n *\n * @param request A function that returns the base `HttpResourceRequest` to be made. This function is called reactively. The parameter is the mutation value provided by the `mutate` method.\n * @param options Configuration options for the mutation resource. This includes callbacks\n * for `onMutate`, `onError`, `onSuccess`, and `onSettled`.\n * @typeParam TResult - The type of the expected result from the mutation.\n * @typeParam TRaw - The raw response type from the HTTP request (defaults to TResult).\n * @typeParam TMutation - The type of the mutation value (the request body).\n * @typeParam TICTX - The type of the initial context value passed to `onMutate`.\n * @typeParam TCTX - The type of the context value returned by `onMutate`.\n * @typeParam TMethod - The HTTP method to be used for the mutation (defaults to `HttpResourceRequest['method']`).\n * @returns A `MutationResourceRef` instance, which provides methods for triggering the mutation\n * and observing its status.\n *\n * @example\n * ```ts\n * // Basic PATCH mutation\n * const updateUser = mutationResource<User, User, Partial<User>>(\n * (body) => ({ url: `/api/users/${userId()}`, method: 'PATCH', body }),\n * {\n * onSuccess: (saved) => toast.success(`Updated ${saved.name}`),\n * onError: (err) => toast.error(err),\n * },\n * );\n *\n * updateUser.mutate({ name: 'Alice' });\n * ```\n *\n * @example\n * ```ts\n * // Optimistic update with rollback via the `ctx` returned from `onMutate`\n * const updateUser = mutationResource<User, User, Partial<User>, { prev: User | null }>(\n * (body) => ({ url: `/api/users/${userId()}`, method: 'PATCH', body }),\n * {\n * onMutate: (patch) => {\n * const prev = current();\n * current.update((u) => (u ? { ...u, ...patch } : u));\n * return { prev };\n * },\n * onError: (_err, { prev }) => current.set(prev),\n * },\n * );\n * ```\n */\nexport function mutationResource<\n TResult,\n TRaw = TResult,\n TMutation = TResult,\n TCTX = void,\n TICTX = TCTX,\n TMethod extends HttpResourceRequest['method'] = HttpResourceRequest['method'],\n>(\n request: (\n params: TMutation,\n ) => Omit<NextRequest<TMethod, TMutation>, 'body'> | undefined | void,\n options0: MutationResourceOptions<TResult, TRaw, TMutation, TCTX, TICTX> = {},\n): MutationResourceRef<TResult, TMutation, TICTX> {\n // Two-layer option injection: per-call > provideMutationResourceOptions > provideResourceOptions.\n const globalOpts = injectResourceOptions(options0.injector);\n const mutOpts = injectMutationResourceOptions(options0.injector);\n\n const options = {\n ...globalOpts,\n ...mutOpts,\n ...options0,\n circuitBreaker: mergeCircuitBreakerOptions(\n globalOpts.circuitBreaker,\n mutOpts.circuitBreaker,\n options0?.circuitBreaker,\n ),\n retry: mergeRetryOptions(globalOpts.retry, mutOpts.retry, options0?.retry),\n } as MutationResourceOptions<TResult, TRaw, TMutation, TCTX, TICTX>;\n\n // `register` is pulled out (and forced off on the inner query below) so the mutation ref is\n // the only thing registered into the transition scope, not its internal query resource.\n const {\n onMutate,\n onError,\n onSuccess,\n onSettled,\n equal,\n register,\n equalRequest,\n invalidates,\n ...rest\n } = options;\n\n const cache = invalidates ? injectQueryCache(options.injector) : undefined;\n\n const requestEqual = equalRequest ?? createEqualRequest(equal);\n\n // A mutation is an imperative command, so `triggerOnSameRequest` means \"fire on EVERY mutate(),\n // even with an identical body\". By default we dedup an identical value/request while one is in\n // flight (double-click protection); when this is set, both the `next` and `req` dedup are bypassed\n // so a repeat click isn't silently swallowed mid-flight. (Otherwise it'd be dropped until `next`\n // resets to NULL on settle — the \"every other click\" symptom.)\n const triggerOnSame = options.triggerOnSameRequest ?? false;\n\n const eq = equal ?? Object.is;\n const next = signal<TMutation | typeof NULL_VALUE>(NULL_VALUE, {\n equal: (a, b) => {\n if (a === NULL_VALUE && b === NULL_VALUE) return true;\n if (a === NULL_VALUE || b === NULL_VALUE) return false;\n if (triggerOnSame) return false;\n return eq(a, b);\n },\n });\n\n const queue = signal<[TMutation, TICTX | undefined][]>([]);\n\n let ctx: TCTX = undefined as TCTX;\n\n const queueRef = effect(() => {\n const nextInQueue = queue().at(0);\n if (nextInQueue === undefined || next() !== NULL_VALUE) return;\n queue.update((q) => q.slice(1));\n const [value, ictx] = nextInQueue;\n try {\n ctx = onMutate?.(value, ictx) as TCTX;\n next.set(value);\n } catch (mutationErr) {\n ctx = undefined as TCTX;\n next.set(NULL_VALUE);\n if (isDevMode())\n console.error(\n '[@mmstack/resource]: error thrown in onMutate hook, mutation was not applied',\n mutationErr,\n );\n }\n });\n\n const req = computed(\n (): HttpResourceRequest | undefined => {\n const nr = next();\n if (nr === NULL_VALUE) return;\n\n return request(nr) ?? undefined;\n },\n {\n equal: (a, b) => {\n if (a === undefined && b === undefined) return true;\n if (a === undefined || b === undefined) return false;\n if (triggerOnSame) return false;\n return requestEqual(a, b);\n },\n },\n );\n\n const lastValue = linkedSignal<\n TMutation | typeof NULL_VALUE,\n TMutation | typeof NULL_VALUE\n >({\n source: next,\n computation: (next, prev) => {\n if (next === NULL_VALUE && !!prev) return prev.value;\n return next;\n },\n });\n\n const lastValueRequest = computed(\n (): HttpResourceRequest | undefined => {\n const nr = lastValue();\n if (nr === NULL_VALUE) return;\n\n return request(nr) ?? undefined;\n },\n {\n equal: (a, b) => {\n if (a === b) return true;\n if (a === undefined || b === undefined) return false;\n return requestEqual(a, b);\n },\n },\n );\n\n const cb = createCircuitBreaker(\n options?.circuitBreaker === true\n ? undefined\n : (options?.circuitBreaker ?? false),\n options?.injector,\n );\n\n const resource = queryResource<TResult, TRaw>(req, {\n ...rest,\n register: false, // the mutation ref handles registration; never register the inner query\n circuitBreaker: cb,\n equalRequest: requestEqual,\n defaultValue: NULL_VALUE as unknown as TResult, // doesnt matter since .value is not accessible\n });\n\n const destroyRef = options.injector\n ? options.injector.get(DestroyRef)\n : inject(DestroyRef);\n\n const error$ = toObservable(resource.error);\n const value$ = toObservable(resource.value).pipe(\n catchError(() => of(NULL_VALUE)),\n );\n\n const statusSub = toObservable(resource.status)\n .pipe(\n combineLatestWith(error$, value$),\n map(\n ([status, error, value]): StatusResult<TResult> | typeof NULL_VALUE => {\n if (status === 'error' && error) {\n return {\n status: 'error',\n error,\n };\n }\n\n if (status === 'resolved' && value !== NULL_VALUE) {\n return {\n status: 'resolved',\n value,\n };\n }\n\n return NULL_VALUE;\n },\n ),\n filter((v) => v !== NULL_VALUE),\n takeUntilDestroyed(destroyRef),\n )\n .subscribe((result) => {\n if (result.status === 'error') onError?.(result.error, ctx);\n else {\n onSuccess?.(result.value, ctx);\n\n if (cache && invalidates) {\n const mutation = untracked(lastValue);\n const prefixes =\n typeof invalidates === 'function'\n ? invalidates(\n result.value,\n (mutation === NULL_VALUE ? undefined : mutation) as TMutation,\n )\n : invalidates;\n\n // auto-keys are `${method}:${url}:...` — a `GET:`-prefixed url prefix hits\n // the url with any params/subpaths and every varyHeaders variant\n for (const prefix of prefixes)\n cache.invalidatePrefix(`GET:${prefix}`);\n }\n }\n\n onSettled?.(ctx);\n ctx = undefined as TCTX;\n next.set(NULL_VALUE);\n });\n\n const shouldQueue = options.queue ?? false;\n\n const ref: MutationResourceRef<TResult, TMutation, TICTX> = {\n ...resource,\n destroy: () => {\n // queue first — a late queue flush must not poke an already-destroyed resource\n queueRef.destroy();\n statusSub.unsubscribe();\n resource.destroy();\n },\n mutate: (value, ictx) => {\n if (shouldQueue) {\n return queue.update((q) => [...q, [value, ictx]]);\n } else {\n // latest-wins: a mutation already in flight gets superseded (its request is\n // aborted by the request change), so its onSuccess/onError will never fire —\n // settle its context NOW so optimistic state can be rolled back/cleaned up\n if (untracked(next) !== NULL_VALUE) {\n if (isDevMode())\n console.warn(\n '[@mmstack/resource]: mutate() called while another mutation was in flight — the previous mutation was superseded (latest-wins) and its onSettled was invoked. Use `queue: true` for sequential mutations.',\n );\n try {\n onSettled?.(ctx);\n } catch (settleErr) {\n if (isDevMode())\n console.error(\n '[@mmstack/resource]: error thrown in onSettled hook for a superseded mutation',\n settleErr,\n );\n }\n ctx = undefined as TCTX;\n }\n\n try {\n ctx = onMutate?.(value, ictx) as TCTX;\n next.set(value);\n } catch (mutationErr) {\n ctx = undefined as TCTX;\n next.set(NULL_VALUE);\n if (isDevMode())\n console.error(\n '[@mmstack/resource]: error thrown in onMutate hook, mutation was not applied',\n mutationErr,\n );\n }\n }\n },\n current: computed(() => {\n const nv = next();\n return nv === NULL_VALUE ? null : nv;\n }),\n // redeclare disabled with last value so that it is not affected by the resource's internal disablement logic\n disabled: computed(() => cb.isOpen() || lastValueRequest() === undefined),\n };\n\n applyResourceRegistration(\n ref as unknown as ResourceRef<unknown>,\n register,\n options0.injector,\n );\n\n return ref;\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mmstack-resource.mjs","sources":["../../../../packages/resource/src/lib/util/cache/persistence.ts","../../../../packages/resource/src/lib/util/cache/cache.ts","../../../../packages/resource/src/lib/util/hash-unknown.ts","../../../../packages/resource/src/lib/util/hash-request.ts","../../../../packages/resource/src/lib/util/share-pending.ts","../../../../packages/resource/src/lib/util/cache/cache-interceptor.ts","../../../../packages/resource/src/lib/util/catch-value-error.ts","../../../../packages/resource/src/lib/util/circuit-breaker.ts","../../../../packages/resource/src/lib/util/dedupe-interceptor.ts","../../../../packages/resource/src/lib/util/equality.ts","../../../../packages/resource/src/lib/util/has-slow-connection.ts","../../../../packages/resource/src/lib/util/merge-options.ts","../../../../packages/resource/src/lib/util/persist.ts","../../../../packages/resource/src/lib/util/refresh.ts","../../../../packages/resource/src/lib/util/retry-on-error.ts","../../../../packages/resource/src/lib/util/sensors.ts","../../../../packages/resource/src/lib/util/to-resource-object.ts","../../../../packages/resource/src/lib/options.ts","../../../../packages/resource/src/lib/query-resource.ts","../../../../packages/resource/src/lib/infinite-query.ts","../../../../packages/resource/src/lib/manual-query.ts","../../../../packages/resource/src/lib/mutation-resource.ts","../../../../packages/resource/src/mmstack-resource.ts"],"sourcesContent":["import { isDevMode } from '@angular/core';\nimport { type CacheEntry } from './cache';\n\ntype StoredEntry<T> = Omit<CacheEntry<T>, 'timeout'>;\n\nexport type CacheDB<T> = {\n getAll: () => Promise<StoredEntry<T>[]>;\n store: (value: StoredEntry<T>) => Promise<void>;\n remove: (key: string) => Promise<void>;\n};\n\nexport function createNoopDB<T>(): CacheDB<T> {\n return {\n getAll: async () => [],\n store: async () => {\n // noop\n },\n remove: async () => {\n // noop\n },\n };\n}\n\nfunction toCacheDB<T>(db: IDBDatabase, storeName: string): CacheDB<T> {\n const getAll = async () => {\n const now = Date.now();\n return new Promise<StoredEntry<T>[]>((res, rej) => {\n const transaction = db.transaction(storeName, 'readonly');\n const store = transaction.objectStore(storeName);\n const request = store.getAll();\n\n request.onsuccess = () => res(request.result);\n request.onerror = () => rej(request.error);\n // some browsers abort (rather than error) e.g. on quota issues — without this the promise would stay pending forever\n transaction.onabort = () => rej(transaction.error);\n })\n .then((entries) => entries.filter((e) => e.expiresAt > now))\n .catch((err) => {\n if (isDevMode())\n console.error('Error getting all items from cache DB:', err);\n return [];\n });\n };\n\n const store = (value: StoredEntry<T>) => {\n return new Promise<void>((res, rej) => {\n const transaction = db.transaction(storeName, 'readwrite');\n const store = transaction.objectStore(storeName);\n\n store.put(value);\n\n transaction.oncomplete = () => res();\n transaction.onerror = () => rej(transaction.error);\n // QuotaExceededError surfaces as an abort in some browsers\n transaction.onabort = () => rej(transaction.error);\n }).catch((err) => {\n if (isDevMode()) console.error('Error storing item in cache DB:', err);\n });\n };\n\n const remove = (key: string) => {\n return new Promise<void>((res, rej) => {\n const transaction = db.transaction(storeName, 'readwrite');\n const store = transaction.objectStore(storeName);\n\n store.delete(key);\n\n transaction.oncomplete = () => res();\n transaction.onerror = () => rej(transaction.error);\n transaction.onabort = () => rej(transaction.error);\n }).catch((err) => {\n if (isDevMode()) console.error('Error removing item from cache DB:', err);\n });\n };\n\n return {\n getAll,\n store,\n remove,\n };\n}\n\nexport function createSingleStoreDB<T>(\n name: string,\n getStoreName: (version: number) => string,\n version = 1,\n): Promise<CacheDB<T>> {\n const storeName = getStoreName(version);\n\n if (!globalThis.indexedDB) return Promise.resolve(createNoopDB());\n\n return new Promise<IDBDatabase>((res, rej) => {\n if (version < 1) {\n rej(new Error('Version must be 1 or greater'));\n return; // rej does not stop execution — without this, indexedDB.open(name, 0) still runs\n }\n\n const req = indexedDB.open(name, version);\n\n req.onupgradeneeded = (event) => {\n const db = req.result;\n const oldVersion = event.oldVersion;\n\n db.createObjectStore(storeName, { keyPath: 'key' });\n\n if (oldVersion > 0) {\n db.deleteObjectStore(getStoreName(oldVersion));\n }\n };\n\n req.onerror = () => {\n rej(req.error);\n };\n\n req.onsuccess = () => res(req.result);\n })\n .then((db) => toCacheDB<T>(db, storeName))\n .catch((err) => {\n if (isDevMode()) console.error('Error creating query DB:', err);\n return createNoopDB();\n });\n}\n","import { HttpHeaders, HttpResponse } from '@angular/common/http';\nimport {\n computed,\n DestroyRef,\n inject,\n InjectionToken,\n type Injector,\n isDevMode,\n PLATFORM_ID,\n type Provider,\n signal,\n type Signal,\n untracked,\n} from '@angular/core';\nimport { mutable } from '@mmstack/primitives';\nimport { type CacheDB, createNoopDB, createSingleStoreDB } from './persistence';\n\nfunction generateID() {\n if (globalThis.crypto?.randomUUID) {\n return globalThis.crypto.randomUUID();\n }\n return Math.random().toString(36).substring(2);\n}\n\ntype BaseSyncMessage<TEntry, TAction extends string> = {\n entry: TEntry;\n action: TAction;\n};\n\ntype InvalidateMessage<T> = BaseSyncMessage<\n Pick<CacheEntry<T>, 'key'>,\n 'invalidate'\n>;\n\ntype StoreMessage<T> = BaseSyncMessage<Omit<CacheEntry<T>, 'timeout'>, 'store'>;\n\ntype InternalSyncMessage<T> = InvalidateMessage<T> | StoreMessage<T>;\n\n/**\n * A message type used for synchronizing cache updates across tabs.\n * @internal\n * @template T - The type of data being cached.\n */\ntype SyncMessage<T> = InternalSyncMessage<T> & {\n cacheId: string;\n type: 'cache-sync-message';\n};\n\nfunction isSyncMessage<T>(msg: unknown): msg is SyncMessage<T> {\n return (\n typeof msg === 'object' &&\n msg !== null &&\n 'type' in msg &&\n (msg as SyncMessage<T>).type === 'cache-sync-message'\n );\n}\n\n/**\n * Options for configuring the Least Recently Used (LRU) cache cleanup strategy.\n * @internal\n */\ntype LRUCleanupType = {\n type: 'lru';\n /**\n * How often to check for expired or excess entries, in milliseconds.\n */\n checkInterval: number;\n /**\n * The maximum number of entries to keep in the cache. When the cache exceeds this size,\n * the least recently used entries will be removed.\n */\n maxSize: number;\n};\n\n/**\n * Options for configuring the \"oldest first\" cache cleanup strategy.\n * @internal\n */\ntype OldsetCleanupType = {\n type: 'oldest';\n /**\n * How often to check for expired or excess entries, in milliseconds.\n */\n checkInterval: number;\n /**\n * The maximum number of entries to keep in the cache. When the cache exceeds this size,\n * the oldest entries will be removed.\n */\n maxSize: number;\n};\n\n/**\n * Represents an entry in the cache.\n * @internal\n */\nexport type CacheEntry<T> = {\n value: T;\n created: number;\n updated: number;\n stale: number;\n useCount: number;\n /** Timestamp of the last read/write — drives LRU eviction. */\n lastAccessed: number;\n expiresAt: number;\n /** Absent for non-finite/over-int32 TTLs — those rely on lazy expiry instead. */\n timeout?: ReturnType<typeof setTimeout>;\n key: string;\n};\n\n/**\n * setTimeout coerces its delay through a signed 32-bit conversion: `Infinity` becomes 0\n * (immediate!) and anything above 2^31-1 ms (~24.8 days) wraps negative. Entries beyond\n * this bound get NO timer and rely on lazy expiry (`expiresAt <= now` checks) plus the\n * periodic sweep instead.\n */\nconst MAX_TIMER_DELAY = 2 ** 31 - 1;\n\n/**\n * Defines the types of cleanup strategies available for the cache.\n * - `lru`: Least Recently Used. Removes the least recently accessed entries when the cache is full.\n * - `oldest`: Removes the oldest entries when the cache is full.\n */\nexport type CleanupType = LRUCleanupType | OldsetCleanupType;\n\nconst ONE_DAY = 1000 * 60 * 60 * 24;\nconst ONE_HOUR = 1000 * 60 * 60;\n\nconst DEFAULT_CLEANUP_OPT = {\n type: 'lru',\n maxSize: 200,\n checkInterval: ONE_HOUR,\n} satisfies LRUCleanupType;\n\n/**\n * A generic cache implementation that stores data with time-to-live (TTL) and stale-while-revalidate capabilities.\n *\n * @typeParam T - The type of data to be stored in the cache.\n */\nexport class Cache<T> {\n private readonly internal = mutable(new Map<string, CacheEntry<T>>());\n private readonly cleanupOpt: CleanupType;\n private readonly id = generateID();\n /** True once async hydration from the persistence layer has completed (or was empty). */\n private hydrated = false;\n /** Keys invalidated while hydration was still in flight — must not be resurrected by it. */\n private readonly hydrationTombstones = new Set<string>();\n\n private readonly hitCount = signal(0);\n private readonly missCount = signal(0);\n\n /**\n * Read-only cache statistics for debugging/observability — entry count plus\n * request-level hit/miss counters (counted on direct lookups, e.g. the cache\n * interceptor's, not on every reactive signal read). Render it in a debug\n * panel; it intentionally exposes no way to mutate the cache.\n */\n readonly stats: Signal<{ size: number; hits: number; misses: number }> =\n computed(() => ({\n size: this.internal().size,\n hits: this.hitCount(),\n misses: this.missCount(),\n }));\n\n /**\n * Destroys the cache instance, clearing the cleanup interval and closing the\n * cross-tab channel. Called automatically when the providing injector is destroyed\n * (wired up by `provideQueryCache`); call it manually for caches you construct yourself.\n */\n readonly destroy: () => void;\n\n private readonly broadcast: (msg: InternalSyncMessage<T>) => void = () => {\n // noop\n };\n\n /**\n * Creates a new `Cache` instance.\n *\n * @param ttl - The default Time To Live (TTL) for cache entries, in milliseconds. Defaults to one day.\n * @param staleTime - The default duration, in milliseconds, during which a cache entry is considered\n * stale but can still be used while revalidation occurs in the background. Defaults to 1 hour.\n * @param cleanupOpt - Options for configuring the cache cleanup strategy. Defaults to LRU with a\n * `maxSize` of 200 and a `checkInterval` of one hour.\n * @param syncTabs - If provided, the cache will use the options a BroadcastChannel to send updates between tabs.\n * Defaults to `undefined`, meaning no synchronization across tabs.\n */\n constructor(\n protected readonly ttl: number = ONE_DAY,\n protected readonly staleTime: number = ONE_HOUR,\n cleanupOpt: Partial<CleanupType> = DEFAULT_CLEANUP_OPT,\n syncTabs?: {\n id: string;\n serialize: (value: T) => string;\n deserialize: (value: string) => T | null;\n },\n\n private readonly db: Promise<CacheDB<T>> = Promise.resolve(\n createNoopDB<T>(),\n ),\n ) {\n this.cleanupOpt = {\n ...DEFAULT_CLEANUP_OPT,\n ...cleanupOpt,\n };\n\n if (this.cleanupOpt.maxSize <= 0)\n throw new Error('maxSize must be greater than 0');\n\n // a non-finite checkInterval disables the sweeper entirely (used by the shared NoopCache)\n const cleanupInterval = Number.isFinite(this.cleanupOpt.checkInterval)\n ? setInterval(() => {\n this.cleanup();\n }, this.cleanupOpt.checkInterval)\n : undefined;\n\n let destroySyncTabs = () => {\n // noop\n };\n\n if (syncTabs) {\n const channel = new BroadcastChannel(syncTabs.id);\n this.broadcast = (msg: InternalSyncMessage<T>) => {\n if (msg.action === 'invalidate')\n return channel.postMessage({\n action: 'invalidate',\n entry: { key: msg.entry.key },\n cacheId: this.id,\n type: 'cache-sync-message',\n } satisfies SyncMessage<string>);\n\n return channel.postMessage({\n ...msg,\n entry: {\n ...msg.entry,\n value: syncTabs.serialize(msg.entry.value),\n },\n cacheId: this.id,\n type: 'cache-sync-message',\n } satisfies SyncMessage<string>);\n };\n\n channel.onmessage = (event) => {\n const msg = event.data;\n if (!isSyncMessage<string>(msg)) return;\n if (msg.cacheId === this.id) return; // ignore messages from this cache\n\n if (msg.action === 'store') {\n const value = syncTabs.deserialize(msg.entry.value);\n if (value === null) return;\n\n // Last-write-wins by `updated` timestamp.\n const existing = untracked(this.internal).get(msg.entry.key);\n if (existing && existing.updated >= msg.entry.updated) return;\n\n this.restoreInternal({ ...msg.entry, value });\n } else if (msg.action === 'invalidate') {\n this.invalidateInternal(msg.entry.key, true);\n }\n };\n\n destroySyncTabs = () => {\n channel.close();\n };\n }\n\n let destroyed = false;\n const destroy = () => {\n if (destroyed) return;\n destroyed = true;\n if (cleanupInterval !== undefined) clearInterval(cleanupInterval);\n destroySyncTabs();\n };\n\n this.db\n .then(async (db) => {\n if (destroyed) return [];\n return db.getAll();\n })\n .then((entries) => {\n if (destroyed) return;\n const current = untracked(this.internal);\n entries.forEach((entry) => {\n if (current.has(entry.key)) return;\n // a key invalidated while hydration was in flight must stay dead\n if (this.hydrationTombstones.has(entry.key)) return;\n this.restoreInternal(entry);\n });\n this.hydrated = true;\n this.hydrationTombstones.clear();\n });\n\n this.destroy = destroy;\n }\n\n /** @internal */\n private getInternal(\n key: () => string | null,\n ): Signal<(CacheEntry<T> & { isStale: boolean }) | null> {\n const keySignal = computed(() => key());\n\n return computed(\n () => {\n const key = keySignal();\n if (!key) return null;\n const found = this.internal().get(key);\n\n const now = Date.now();\n\n if (!found || found.expiresAt <= now) return null;\n return {\n ...found,\n isStale: found.stale <= now,\n };\n },\n {\n equal: (a, b) =>\n a === b ||\n (!!a &&\n !!b &&\n a.key === b.key &&\n a.value === b.value &&\n a.updated === b.updated &&\n a.isStale === b.isStale),\n },\n );\n }\n\n /** @internal Imperative access bookkeeping for LRU eviction. */\n private touch(entry: CacheEntry<T>) {\n entry.lastAccessed = Date.now();\n entry.useCount++;\n }\n\n /**\n * Retrieves a cache entry directly (non-reactively), updating its access bookkeeping\n * for LRU eviction.\n * @internal\n * @param key - The key of the entry to retrieve.\n * @returns The cache entry, or `null` if not found or expired.\n */\n getUntracked(key: string): (CacheEntry<T> & { isStale: boolean }) | null {\n const found = untracked(this.internal).get(key);\n const now = Date.now();\n if (!found || found.expiresAt <= now) {\n this.missCount.update((c) => c + 1);\n return null;\n }\n this.touch(found);\n this.hitCount.update((c) => c + 1);\n return {\n ...found,\n isStale: found.stale <= now,\n };\n }\n\n /**\n * Retrieves a cache entry as a signal.\n *\n * @param key - A function that returns the cache key. The key is a signal, allowing for dynamic keys. If the function returns null the value is also null.\n * @returns A signal that holds the cache entry, or `null` if not found or expired. The signal\n * updates whenever the cache entry changes (e.g., due to revalidation or expiration).\n */\n get(\n key: () => string | null,\n ): Signal<(CacheEntry<T> & { isStale: boolean }) | null> {\n return this.getInternal(key);\n }\n\n /**\n * Retrieves a cache entry or an object with the key if not found.\n *\n * @param key - A function that returns the cache key. The key is a signal, allowing for dynamic keys. If the function returns null the value is also null.\n * @returns A signal that holds the cache entry or an object with the key if not found. The signal\n * updates whenever the cache entry changes (e.g., due to revalidation or expiration).\n */\n getEntryOrKey(\n key: () => string | null,\n ): Signal<(CacheEntry<T> & { isStale: boolean }) | string | null> {\n const valueSig = this.getInternal(key);\n return computed(() => valueSig() ?? key());\n }\n\n /**\n * Stores a value in the cache.\n *\n * NOTE: cached values are shared by reference across all consumers (current and\n * future cache hits, persistence, cross-tab sync) — do not mutate a value after\n * storing it or after reading it from the cache.\n *\n * @param key - The key under which to store the value.\n * @param value - The value to store.\n * @param staleTime - (Optional) The stale time for this entry, in milliseconds. Overrides the default `staleTime`.\n * @param ttl - (Optional) The TTL for this entry, in milliseconds. Overrides the default `ttl`.\n * @param persist - (Optional) Whether to also write the entry to the persistence layer (IndexedDB). Defaults to `false`.\n */\n store(\n key: string,\n value: T,\n staleTime = this.staleTime,\n ttl = this.ttl,\n persist = false,\n ) {\n this.storeInternal(key, value, staleTime, ttl, false, persist);\n }\n\n private storeInternal(\n key: string,\n value: T,\n staleTime = this.staleTime,\n ttl = this.ttl,\n fromSync = false,\n persist = false,\n ) {\n const entry = untracked(this.internal).get(key);\n\n // ttl cannot be less than staleTime\n if (ttl < staleTime) staleTime = ttl;\n\n const now = Date.now();\n\n this.setEntry(\n {\n value,\n created: entry?.created ?? now,\n updated: now,\n useCount: (entry?.useCount ?? 0) + 1,\n lastAccessed: now,\n stale: now + staleTime,\n expiresAt: now + ttl,\n key,\n },\n fromSync,\n persist,\n );\n }\n\n /**\n * @internal\n * Inserts an entry that already carries ABSOLUTE timestamps — hydration from the\n * persistence layer and cross-tab sync messages. Never re-anchors freshness to\n * `Date.now()`, never persists, never broadcasts.\n */\n private restoreInternal(\n entry: Omit<CacheEntry<T>, 'timeout' | 'lastAccessed'> &\n Partial<Pick<CacheEntry<T>, 'lastAccessed'>>,\n ) {\n this.setEntry(\n {\n ...entry,\n // rows persisted by older versions may lack the field\n lastAccessed: entry.lastAccessed ?? entry.updated,\n },\n true,\n false,\n );\n }\n\n /** @internal Shared writer: arms the expiry timer only within the safe delay range. */\n private setEntry(\n next: Omit<CacheEntry<T>, 'timeout'>,\n fromSync: boolean,\n persist: boolean,\n ) {\n const existing = untracked(this.internal).get(next.key);\n if (existing) clearTimeout(existing.timeout); // stop the previous invalidation\n\n const remaining = next.expiresAt - Date.now();\n // already expired (clock skew on a synced/restored entry) — don't insert\n if (remaining <= 0) return;\n\n // Infinity (immutable) or > 2^31-1 would coerce to an IMMEDIATE timeout — such\n // entries get no timer and rely on lazy expiry + the periodic sweep instead\n const timeout =\n Number.isFinite(remaining) && remaining <= MAX_TIMER_DELAY\n ? setTimeout(() => this.invalidate(next.key), remaining)\n : undefined;\n\n this.internal.mutate((map) => {\n map.set(next.key, { ...next, timeout });\n return map;\n });\n\n if (!fromSync) {\n if (persist) this.db.then((db) => db.store(next));\n\n this.broadcast({\n action: 'store',\n entry: next,\n });\n }\n }\n\n /**\n * Invalidates (removes) a cache entry.\n *\n * @param key - The key of the entry to invalidate.\n */\n invalidate(key: string) {\n this.invalidateInternal(key);\n }\n\n /**\n * Invalidates every cache entry whose key starts with `prefix`. Common after a\n * list-mutating operation (e.g. invalidate every paginated `GET /api/posts*`\n * after a POST). Returns the number of entries removed.\n *\n * @example\n * cache.invalidatePrefix('GET https://api.example.com/posts');\n */\n invalidatePrefix(prefix: string): number {\n return this.invalidateWhere((key) => key.startsWith(prefix));\n }\n\n /**\n * Invalidates every cache entry whose key matches the predicate. Use for\n * arbitrary bulk invalidation that doesn't fit prefix matching (e.g.\n * \"everything containing `userId=42`\"). Returns the number of entries removed.\n *\n * @example\n * cache.invalidateWhere((key) => key.includes('/me/'));\n */\n invalidateWhere(predicate: (key: string) => boolean): number {\n const keys = Array.from(untracked(this.internal).keys()).filter(predicate);\n for (const key of keys) this.invalidateInternal(key);\n return keys.length;\n }\n\n private invalidateInternal(key: string, fromSync = false) {\n // a key invalidated before async hydration completes must not be resurrected by it\n if (!this.hydrated) this.hydrationTombstones.add(key);\n\n const entry = untracked(this.internal).get(key);\n if (entry) {\n clearTimeout(entry.timeout);\n this.internal.mutate((map) => {\n map.delete(key);\n return map;\n });\n }\n if (!fromSync) {\n this.db.then((db) => db.remove(key));\n this.broadcast({ action: 'invalidate', entry: { key } });\n }\n }\n\n /**\n * Removes EVERY entry — memory, persisted rows, and (via broadcast) other tabs.\n * Call on logout/auth changes so no prior user's responses survive.\n */\n clear() {\n for (const key of Array.from(untracked(this.internal).keys())) {\n this.invalidateInternal(key);\n }\n }\n\n /** @internal Drops expired entries, then enforces `maxSize` by the configured strategy. */\n private cleanup() {\n const now = Date.now();\n\n // expired entries first — their timers may never have fired (throttled background\n // tabs, or timer-less long-TTL entries)\n const expired = Array.from(untracked(this.internal).entries()).filter(\n ([, e]) => e.expiresAt <= now,\n );\n if (expired.length) {\n expired.forEach(([, e]) => clearTimeout(e.timeout));\n this.internal.mutate((map) => {\n expired.forEach(([key]) => map.delete(key));\n return map;\n });\n }\n\n if (untracked(this.internal).size <= this.cleanupOpt.maxSize) return;\n\n const sorted = Array.from(untracked(this.internal).entries()).toSorted(\n (a, b) => {\n if (this.cleanupOpt.type === 'lru') {\n return a[1].lastAccessed - b[1].lastAccessed; // least recently accessed first\n } else {\n return a[1].created - b[1].created; // oldest first\n }\n },\n );\n\n const keepCount = Math.max(1, Math.floor(this.cleanupOpt.maxSize / 2));\n\n const removed = sorted.slice(0, sorted.length - keepCount);\n const keep = sorted.slice(removed.length, sorted.length);\n\n removed.forEach(([, e]) => {\n clearTimeout(e.timeout);\n });\n\n this.internal.set(new Map(keep));\n }\n}\n\n/**\n * Options for configuring the cache.\n */\ntype CacheOptions = {\n /**\n * The default Time To Live (TTL) for cache entries, in milliseconds.\n */\n ttl?: number;\n /**\n * The default duration, in milliseconds, during which a cache entry is considered\n * stale but can still be used while revalidation occurs in the background.\n */\n staleTime?: number;\n /**\n * Options for configuring the cache cleanup strategy.\n */\n cleanup?: Partial<CleanupType>;\n /**\n * Whether to synchronize cache across tabs. If true, the cache will use a BroadcastChannel to send updates between tabs.\n */\n syncTabs?: boolean;\n /**\n * Globally disable persistence of cache entries.\n * If set to `false`, cache entries will not be persisted to the database.\n * `true` means, cache entries can be persisted, they must still be opted into on the resource level & allowed by server headers.\n * @default true\n */\n persist?: boolean;\n /**\n * Version of the caches database, increment this if the interfaces change, this will cause the old data to be deleted.\n * Minimum value is 1, so first increment should be 2.\n * @default 1\n */\n version?: number;\n};\n\nconst CLIENT_CACHE_TOKEN = new InjectionToken<Cache<HttpResponse<unknown>>>(\n 'INTERNAL_CLIENT_CACHE',\n);\n\n/**\n * Provides the instance of the QueryCache for queryResource. This should probably be called\n * in your application's root configuration, but can also be overriden with component/module providers.\n *\n * @param options - Optional configuration options for the cache.\n * @returns An Angular `Provider` for the cache.\n *\n * @example\n * // In your app.config.ts or AppModule providers:\n *\n * import { provideQueryCache } from './your-cache';\n *\n * export const appConfig: ApplicationConfig = {\n * providers: [\n * provideQueryCache({\n * ttl: 60000, // Default TTL of 60 seconds\n * staleTime: 30000, // Default staleTime of 30 seconds\n * }),\n * // ... other providers\n * ]\n * };\n */\nexport function provideQueryCache(opt?: CacheOptions): Provider {\n const serialize = (value: HttpResponse<unknown>) => {\n const headersRecord: Record<string, string[]> = {};\n\n const headerKeys = value.headers.keys();\n headerKeys.forEach((key) => {\n const values = value.headers.getAll(key);\n if (!values) return;\n headersRecord[key] = values;\n });\n\n return JSON.stringify({\n body: value.body,\n status: value.status,\n // statusText intentionally omitted: deprecated in Angular, meaningless under\n // HTTP/2+ (HttpResponse defaults it to 'OK' on reconstruction)\n headers: headerKeys.length > 0 ? headersRecord : undefined,\n url: value.url,\n });\n };\n\n const deserialize = (value: string) => {\n try {\n const parsed = JSON.parse(value);\n\n if (!parsed || typeof parsed !== 'object' || !('body' in parsed))\n throw new Error('Invalid cache entry format');\n\n const headers = parsed.headers\n ? new HttpHeaders(parsed.headers)\n : undefined;\n\n return new HttpResponse({\n body: parsed.body,\n status: parsed.status,\n headers: headers,\n url: parsed.url,\n });\n } catch (err) {\n if (isDevMode()) console.error('Failed to deserialize cache entry:', err);\n return null;\n }\n };\n\n // version-suffixed so two deploys with incompatible schemas in adjacent tabs don't\n // push entries into each other's caches (the `version` option only fences IndexedDB)\n const syncChannelId = `mmstack-query-cache-sync_v${opt?.version ?? 1}`;\n\n return {\n provide: CLIENT_CACHE_TOKEN,\n useFactory: () => {\n const onServer = inject(PLATFORM_ID) === 'server';\n\n // no IndexedDB / BroadcastChannel on the server — each request gets an\n // isolated, request-lived, memory-only cache\n const syncTabsOpt =\n !onServer && opt?.syncTabs\n ? {\n id: syncChannelId,\n serialize,\n deserialize,\n }\n : undefined;\n\n const db =\n onServer || opt?.persist === false\n ? undefined\n : createSingleStoreDB<string>(\n 'mmstack-query-cache-db',\n (version) => `query-store_v${version}`,\n opt?.version,\n ).then((db): CacheDB<HttpResponse<unknown>> => {\n return {\n getAll: () => {\n return db.getAll().then((entries) => {\n return entries\n .map((entry) => {\n const value = deserialize(entry.value);\n if (value === null) return null;\n return {\n ...entry,\n value,\n };\n })\n .filter((e) => e !== null);\n });\n },\n store: (entry) => {\n return db.store({ ...entry, value: serialize(entry.value) });\n },\n remove: db.remove,\n };\n });\n\n const cache = new Cache(\n opt?.ttl,\n opt?.staleTime,\n opt?.cleanup,\n syncTabsOpt,\n db,\n );\n\n // release the sweep interval / channel with the providing injector\n inject(DestroyRef, { optional: true })?.onDestroy(() => cache.destroy());\n\n return cache;\n },\n };\n}\n\nclass NoopCache<T> extends Cache<T> {\n constructor() {\n // Infinity checkInterval → no sweep interval is ever armed, so the shared\n // instance below never pins a timer\n super(undefined, undefined, {\n type: 'lru',\n maxSize: 200,\n checkInterval: Infinity,\n });\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n override store(_: string, __: T, ___ = super.staleTime, ____ = super.ttl) {\n // noop\n }\n}\n\n// one shared instance — minting a NoopCache per injectQueryCache() miss would leak\n// an instance (and previously an interval) on every prod call without a provider\nlet NOOP_CACHE: NoopCache<unknown> | undefined;\n\n/**\n * Injects the `QueryCache` instance that is used within queryResource.\n * Allows for direct modification of cached data, but is mostly meant for internal use.\n *\n * @param injector - (Optional) The injector to use. If not provided, the current\n * injection context is used.\n * @returns The `QueryCache` instance.\n *\n * @example\n * // In your component or service:\n *\n * import { injectQueryCache } from './your-cache';\n *\n * constructor() {\n * const cache = injectQueryCache();\n *\n * const myData = cache.get(() => 'my-data-key');\n * if (myData() !== null) {\n * // ... use cached data ...\n * }\n * }\n */\nexport function injectQueryCache<TRaw = unknown>(\n injector?: Injector,\n): Cache<HttpResponse<TRaw>> {\n const cache = injector\n ? injector.get(CLIENT_CACHE_TOKEN, null, {\n optional: true,\n })\n : inject(CLIENT_CACHE_TOKEN, {\n optional: true,\n });\n\n if (!cache) {\n if (isDevMode())\n throw new Error(\n 'Cache not provided, please add provideQueryCache() to providers array',\n );\n else return (NOOP_CACHE ??= new NoopCache()) as Cache<HttpResponse<TRaw>>;\n }\n\n return cache as Cache<HttpResponse<TRaw>>;\n}\n\n/**\n * Injects the cache statistics, including the current size of the cache and the number of hits and misses.\n *\n * @param injector - (Optional) The injector to use. If not provided, the current\n * injection context is used.\n * @returns A signal containing the cache statistics.\n */\nexport function injectCacheStats(injector?: Injector) {\n const cache = injectQueryCache(injector);\n return cache.stats;\n}\n","type UnknownObject = Record<PropertyKey, unknown>;\n\n/**\n * Returns `true` for any object-like value whose own enumerable keys should\n * be sorted for stable hashing. Excludes arrays (positional), `Date`\n * (handled by `toJSON`), `Map`/`Set` (handled explicitly), and binary types\n * (`Blob`/`FormData`/`URLSearchParams`/`ArrayBuffer`/typed arrays — these\n * should be branched on before reaching `hash()`, typically by `hashRequest`).\n *\n * Plain objects, class instances, and `Object.create(null)` all qualify.\n */\nfunction isHashableObject(value: unknown): value is UnknownObject {\n if (value === null || typeof value !== 'object') return false;\n if (Array.isArray(value)) return false;\n if (value instanceof Date) return false;\n if (value instanceof Map) return false;\n if (value instanceof Set) return false;\n if (typeof Blob !== 'undefined' && value instanceof Blob) return false;\n if (typeof FormData !== 'undefined' && value instanceof FormData) return false;\n if (\n typeof URLSearchParams !== 'undefined' &&\n value instanceof URLSearchParams\n )\n return false;\n if (value instanceof ArrayBuffer) return false;\n if (ArrayBuffer.isView(value)) return false;\n return true;\n}\n\nfunction sortKeys(val: UnknownObject): UnknownObject {\n return Object.keys(val)\n .toSorted()\n .reduce((result, key) => {\n result[key] = val[key];\n return result;\n }, {} as UnknownObject);\n}\n\n/**\n * Internal helper to generate a stable JSON string from an array.\n * - Object-like values (plain, class instances, null-proto) get their own\n * enumerable keys sorted alphabetically.\n * - `Map` → marker object with sorted entries (sorted by `JSON.stringify(key)`).\n * - `Set` → marker object with sorted values (sorted by `JSON.stringify(value)`).\n * - Arrays preserve order. `Date` serializes via `toJSON`.\n *\n * @internal\n */\nfunction hashKey(queryKey: unknown[]): string {\n return JSON.stringify(queryKey, (_, val) => {\n if (val instanceof Map) {\n // Schwartzian: compute each entry's sort key (recursive hash of the\n // Map key) once, then sort by the cheap string compare.\n const entries = [...val.entries()]\n .map((e) => [hash(e[0]), e] as const)\n .sort((a, b) => (a[0] < b[0] ? -1 : a[0] > b[0] ? 1 : 0))\n .map(([, e]) => e);\n return { __map__: entries };\n }\n if (val instanceof Set) {\n const values = [...val]\n .map((v) => [hash(v), v] as const)\n .sort((a, b) => (a[0] < b[0] ? -1 : a[0] > b[0] ? 1 : 0))\n .map(([, v]) => v);\n return { __set__: values };\n }\n if (isHashableObject(val)) return sortKeys(val);\n return val;\n });\n}\n\n/**\n * Generates a stable, unique string hash from one or more arguments.\n * Useful for creating cache keys or identifiers where object key order shouldn't matter.\n *\n * How it works:\n * - Object-like values (plain objects, class instances, `Object.create(null)`) have\n * their own enumerable keys sorted alphabetically before hashing. This ensures\n * `{ a: 1, b: 2 }` and `{ b: 2, a: 1 }` produce the same hash.\n * - `Map` and `Set` are serialized via stable, sorted markers (`__map__` / `__set__`).\n * - Arrays preserve positional order; `Date` uses its ISO string via `toJSON`.\n *\n * @param {...unknown} args Values to include in the hash.\n * @returns A stable string hash representing the input arguments.\n * @example\n * hash('posts', 10);\n * // => '[\"posts\",10]'\n *\n * hash({ a: 1, b: 2 }) === hash({ b: 2, a: 1 }); // true\n *\n * hash(new Map([['a', 1]])) === hash(new Map([['a', 1]])); // true\n *\n * // Be mindful of values JSON.stringify cannot handle (functions, undefined, Symbols)\n * // hash('a', undefined, function() {}) => '[\"a\",null,null]'\n */\nexport function hash(...args: unknown[]): string {\n return hashKey(args);\n}\n","import {\n HttpHeaders,\n HttpParams,\n type HttpRequest,\n type HttpResourceRequest,\n} from '@angular/common/http';\nimport { isDevMode } from '@angular/core';\nimport { hash } from './hash-unknown';\n\ntype HashableRequest = {\n method?: string;\n url: string;\n responseType?: string;\n params?: HttpResourceRequest['params'] | HttpRequest<unknown>['params'];\n body?: unknown;\n headers?: HttpResourceRequest['headers'] | HttpRequest<unknown>['headers'];\n};\n\n/**\n * @internal\n * One-way ~64-bit digest from two independent FNV-1a passes. Used for header VALUES in\n * cache keys: keys are persisted (IndexedDB) and broadcast cross-tab, so raw values\n * (auth tokens!) must never appear in them. A single 32-bit digest's 2^-32 collision\n * chance is too thin at a security boundary — two colliding tokens would serve one\n * user's cached data under another user's key; 64 bits puts collisions out of reach.\n * High-entropy secrets are not recoverable from the digest.\n */\nfunction digestHeaderValue(value: string): string {\n let h1 = 0x811c9dc5; // FNV-1a offset basis\n let h2 = 0xcbf29ce4; // independent second pass\n for (let i = 0; i < value.length; i++) {\n const c = value.charCodeAt(i);\n h1 = Math.imul(h1 ^ c, 0x01000193); // FNV prime\n h2 = Math.imul(h2 ^ c, 0x01000197); // distinct odd multiplier\n }\n return (\n (h1 >>> 0).toString(16).padStart(8, '0') +\n (h2 >>> 0).toString(16).padStart(8, '0')\n );\n}\n\nfunction readHeader(\n headers: HashableRequest['headers'],\n name: string,\n): string | null {\n if (!headers) return null;\n if (headers instanceof HttpHeaders) {\n const all = headers.getAll(name);\n return all && all.length ? all.join(',') : null;\n }\n // record form — header names are case-insensitive\n const lower = name.toLowerCase();\n for (const key of Object.keys(headers)) {\n if (key.toLowerCase() !== lower) continue;\n const value = (headers as Record<string, unknown>)[key];\n if (value == null) return null;\n return Array.isArray(value) ? value.join(',') : String(value);\n }\n return null;\n}\n\n/**\n * Content-negotiation headers whose values are low-entropy and non-identifying —\n * embedded (URI-encoded) raw, keeping keys human-readable and skipping the digest.\n * Anything NOT on this list (Authorization, api keys, tenant/x-* headers — we can't\n * know what they carry) is one-way digested instead.\n */\nconst SAFE_RAW_HEADERS = new Set([\n 'accept',\n 'accept-language',\n 'content-language',\n 'content-type',\n]);\n\nconst UNSAFE_HEADER_MESSAGES = new Map<string, string>([\n [\n 'cookie',\n \"[@mmstack/resource]: varyHeaders includes 'cookie'. Browser-attached cookies never appear on the request object (so this usually partitions nothing), and manually-set cookie values often rotate per-request (shredding the hit rate). The header IS still honored (digested) — but prefer varying on 'Authorization' or a tenant header.\",\n ],\n [\n 'set-cookie',\n \"[@mmstack/resource]: varyHeaders includes 'set-cookie'. Browser-attached cookies never appear on the request object (so this usually partitions nothing), and manually-set cookie values often rotate per-request (shredding the hit rate). The header IS still honored (digested) — but prefer varying on 'Authorization' or a tenant header.\",\n ],\n [\n 'authorization',\n \"[@mmstack/resource]: varyHeaders includes 'Authorization'. If your token rotates frequently (e.g., short-lived JWTs), this will cause 100% cache churn on refresh. Consider adding a namespace prefix with the users sub, not using it as a cache-key or using a custom 'cache.hash' function with a stable session/user ID instead.\",\n ],\n [\n 'x-request-id',\n \"[@mmstack/resource]: varyHeaders includes 'X-Request-ID'. This header is often set to a unique value per-request, which will cause 100% cache churn. Consider removing it from varyHeaders or using a custom 'cache.hash' function that ignores it.\",\n ],\n [\n 'x-correlation-id',\n \"[@mmstack/resource]: varyHeaders includes 'X-Correlation-ID'. This header is often set to a unique value per-request, which will cause 100% cache churn. Consider removing it from varyHeaders or using a custom 'cache.hash' function that ignores it.\",\n ],\n [\n 'if-none-match',\n \"[@mmstack/resource]: varyHeaders includes 'If-None-Match'. This header contains ETags that change whenever the server's resource version changes, which will cause cache misses on every update. Consider removing it from varyHeaders or using a custom 'cache.hash' function that ignores it.\",\n ],\n [\n 'if-modified-since',\n \"[@mmstack/resource]: varyHeaders includes 'If-Modified-Since'. This header contains timestamps that change whenever the server's resource version changes, which will cause cache misses on every update. Consider removing it from varyHeaders or using a custom 'cache.hash' function that ignores it.\",\n ],\n]);\n\nfunction normalizeVaryHeaders(\n headers: HashableRequest['headers'],\n names: readonly string[],\n): string {\n const isDev = isDevMode();\n return names\n .map((n) => n.toLowerCase())\n .toSorted()\n .map((name) => {\n if (isDev) {\n const warning = UNSAFE_HEADER_MESSAGES.get(name);\n if (warning) console.warn(warning);\n }\n\n const value = readHeader(headers, name);\n if (value === null) return `${name}=`;\n\n // known-safe values raw (readable, cheap); everything else digested, NEVER raw —\n // keys are persisted to IndexedDB and broadcast across tabs\n return SAFE_RAW_HEADERS.has(name)\n ? `${name}=${encodeURIComponent(value)}`\n : `${name}=${digestHeaderValue(value)}`;\n })\n .join('&');\n}\n\nfunction normalizeParams(\n params: NonNullable<HashableRequest['params']>,\n): string {\n const p =\n params instanceof HttpParams\n ? params\n : new HttpParams({ fromObject: params });\n\n return p\n .keys()\n .toSorted()\n .map((key) => {\n const encodedKey = encodeURIComponent(key);\n return (p.getAll(key) ?? [])\n .map((v) => `${encodedKey}=${encodeURIComponent(v)}`)\n .join('&');\n })\n .join('&');\n}\n\nfunction hashBody(body: unknown): string {\n // File extends Blob — must check File first\n if (typeof File !== 'undefined' && body instanceof File) {\n return `File:${body.name}:${body.type}:${body.size}:${body.lastModified}`;\n }\n\n if (typeof Blob !== 'undefined' && body instanceof Blob) {\n return `Blob:${body.type}:${body.size}`;\n }\n\n if (typeof FormData !== 'undefined' && body instanceof FormData) {\n const entries: [string, string][] = [];\n body.forEach((value, key) => {\n entries.push([key, hashBody(value)]);\n });\n entries.sort(\n ([ak, av], [bk, bv]) => ak.localeCompare(bk) || av.localeCompare(bv),\n );\n return `FormData:${entries.map(([k, v]) => `${k}=${v}`).join('&')}`;\n }\n\n if (\n typeof URLSearchParams !== 'undefined' &&\n body instanceof URLSearchParams\n ) {\n const sp = new URLSearchParams(body);\n sp.sort();\n return `URLSearchParams:${sp.toString()}`;\n }\n\n if (body instanceof ArrayBuffer) {\n return `ArrayBuffer:${body.byteLength}`;\n }\n\n if (ArrayBuffer.isView(body)) {\n return `${body.constructor.name}:${body.byteLength}`;\n }\n\n return hash(body);\n}\n\n/**\n * Builds a stable cache/dedupe key from an HTTP request shape (accepts both\n * `HttpRequest` and `HttpResourceRequest`).\n *\n * Key composition: `${method}:${url}:${responseType}[:${params}][:${body}][:${vary}]`\n * - `method` defaults to `'GET'`, `responseType` to `'json'` (Angular defaults).\n * - Query params are sorted alphabetically and URL-encoded for stability.\n * - Body hashing handles `File`/`Blob`/`FormData`/`URLSearchParams`/`ArrayBuffer`\n * and typed arrays explicitly; everything else flows through key-sorted\n * `JSON.stringify` via `hash()`.\n * - `varyHeaders` (opt-in) mixes the named request headers into the key so responses\n * that differ per header (e.g. `Authorization` → per-user, `Accept-Language`) get\n * separate entries. Known-safe content-negotiation headers (`Accept`,\n * `Accept-Language`, `Content-Language`, `Content-Type`) embed their value raw for\n * readable keys; all other header VALUES are one-way digested, never embedded raw —\n * keys are persisted to IndexedDB and broadcast across tabs.\n */\nexport function hashRequest(\n req: HashableRequest,\n varyHeaders?: readonly string[],\n): string {\n const method = req.method ?? 'GET';\n const responseType = req.responseType ?? 'json';\n const base = `${method}:${req.url}:${responseType}`;\n\n const params = req.params ? `:${normalizeParams(req.params)}` : '';\n const body = req.body != null ? `:${hashBody(req.body)}` : '';\n const vary = varyHeaders?.length\n ? `:vary(${normalizeVaryHeaders(req.headers, varyHeaders)})`\n : '';\n\n return base + params + body + vary;\n}\n","import { finalize, shareReplay, type Observable } from 'rxjs';\n\n/**\n * @internal\n * Single-flight sharing: if a pending observable is already registered under `key`,\n * return it; otherwise create one, share it (replaying the latest event to late\n * subscribers), and deregister it on teardown/settle.\n *\n * Used by both the dedupe interceptor (keyed by full request hash, app-wide) and the\n * cache interceptor (keyed by the CACHE key, guarding the miss/stale-revalidation path)\n * — same mechanism, different keying/scope, so it lives here exactly once.\n */\nexport function sharePending<T>(\n pending: Map<string, Observable<T>>,\n key: string,\n create: () => Observable<T>,\n): Observable<T> {\n const existing = pending.get(key);\n if (existing) return existing;\n\n const shared = create().pipe(\n finalize(() => pending.delete(key)),\n shareReplay({ bufferSize: 1, refCount: true }),\n );\n pending.set(key, shared);\n\n return shared;\n}\n","import {\n HttpContext,\n HttpContextToken,\n type HttpEvent,\n type HttpHandlerFn,\n type HttpInterceptorFn,\n type HttpRequest,\n HttpResponse,\n} from '@angular/common/http';\nimport { inject, isDevMode, PLATFORM_ID } from '@angular/core';\nimport { map, type Observable, of, tap } from 'rxjs';\nimport { hashRequest } from '../hash-request';\nimport { sharePending } from '../share-pending';\nimport { injectQueryCache } from './cache';\n\ntype CacheEntryOptions = {\n key?: string;\n ttl?: number;\n staleTime?: number;\n cache: boolean;\n bustBrowserCache?: boolean;\n ignoreCacheControl?: boolean;\n parse?: (val: unknown) => unknown;\n persist?: boolean;\n};\n\nconst CACHE_CONTEXT = new HttpContextToken<CacheEntryOptions>(() => ({\n cache: false,\n}));\n\nexport function setCacheContext(\n ctx = new HttpContext(),\n opt: Omit<CacheEntryOptions, 'cache' | 'key'> & {\n key: Required<CacheEntryOptions>['key'];\n },\n) {\n return ctx.set(CACHE_CONTEXT, { ...opt, cache: true });\n}\n\nfunction getCacheContext(ctx: HttpContext): CacheEntryOptions {\n return ctx.get(CACHE_CONTEXT);\n}\n\ntype ResolvedCacheControl = {\n noStore: boolean;\n noCache: boolean;\n mustRevalidate: boolean;\n immutable: boolean;\n /** `Cache-Control: private` — cacheable in memory, but must never be persisted. */\n isPrivate: boolean;\n maxAge: number | null;\n staleWhileRevalidate: number | null;\n};\n\nfunction parseCacheControlHeader(\n req: HttpResponse<unknown>,\n): ResolvedCacheControl {\n const header = req.headers.get('Cache-Control');\n\n let sMaxAge: number | null = null;\n const directives: ResolvedCacheControl = {\n noStore: false,\n noCache: false,\n mustRevalidate: false,\n immutable: false,\n isPrivate: false,\n maxAge: null,\n staleWhileRevalidate: null,\n };\n\n if (!header) return directives;\n\n const parts = header.split(',');\n\n for (const part of parts) {\n const [unparsedKey, value] = part.trim().split('=');\n const key = unparsedKey.trim().toLowerCase();\n\n switch (key) {\n case 'no-store':\n directives.noStore = true;\n break;\n case 'no-cache':\n directives.noCache = true;\n break;\n case 'must-revalidate':\n case 'proxy-revalidate':\n directives.mustRevalidate = true;\n break;\n case 'immutable':\n directives.immutable = true;\n break;\n case 'private':\n directives.isPrivate = true;\n break;\n case 'max-age': {\n if (!value) break;\n const parsedValue = parseInt(value, 10);\n if (!isNaN(parsedValue)) directives.maxAge = parsedValue;\n break;\n }\n\n case 's-maxage': {\n if (!value) break;\n const parsedValue = parseInt(value, 10);\n if (!isNaN(parsedValue)) sMaxAge = parsedValue;\n break;\n }\n case 'stale-while-revalidate': {\n if (!value) break;\n const parsedValue = parseInt(value, 10);\n if (!isNaN(parsedValue)) directives.staleWhileRevalidate = parsedValue;\n break;\n }\n }\n }\n\n // s-maxage takes precedence over max-age\n if (sMaxAge !== null) directives.maxAge = sMaxAge;\n\n // if no store nothing else is relevant\n if (directives.noStore)\n return {\n noStore: true,\n noCache: false,\n mustRevalidate: false,\n immutable: false,\n isPrivate: directives.isPrivate,\n maxAge: null,\n staleWhileRevalidate: null,\n };\n\n // max age does not apply to immutable resources\n if (directives.immutable)\n return {\n ...directives,\n maxAge: null,\n };\n\n return directives;\n}\n\nfunction resolveTimings(\n cacheControl: ResolvedCacheControl,\n optStaleTime?: number,\n optTTL?: number,\n): { staleTime?: number; ttl?: number } {\n let staleTime = optStaleTime;\n let ttl = optTTL;\n\n if (cacheControl.immutable)\n return {\n staleTime: Infinity,\n ttl: Infinity,\n };\n\n if (cacheControl.maxAge !== null) {\n staleTime = cacheControl.maxAge * 1000;\n if (cacheControl.staleWhileRevalidate !== null) {\n ttl = staleTime + cacheControl.staleWhileRevalidate * 1000;\n } else if (ttl !== undefined) {\n // a configured total lifetime must never undercut the server's fresh window\n ttl = Math.max(ttl, staleTime);\n }\n // no swr + no configured ttl → leave undefined so the cache's default ttl applies\n // (the entry stays resident past max-age for ETag revalidation)\n } else if (cacheControl.staleWhileRevalidate !== null) {\n // swr without max-age: stale immediately, revalidatable for the window\n staleTime = 0;\n ttl = cacheControl.staleWhileRevalidate * 1000;\n }\n\n // if no-cache is set, we must always revalidate (the entry stays usable for conditional requests until ttl)\n if (cacheControl.noCache || cacheControl.mustRevalidate) staleTime = 0;\n\n // option-only path (no server freshness): a misconfigured ttl < staleTime clamps the\n // fresh window down, mirroring the cache's own internal clamp\n if (\n cacheControl.maxAge === null &&\n ttl !== undefined &&\n staleTime !== undefined &&\n ttl < staleTime\n ) {\n staleTime = ttl;\n }\n\n return { staleTime, ttl };\n}\n\n/**\n * Creates an `HttpInterceptorFn` that implements caching for HTTP requests. This interceptor\n * checks for a caching configuration in the request's `HttpContext` (internally set by the queryResource).\n * If caching is enabled, it attempts to retrieve responses from the cache. If a cached response\n * is found and is not stale, it's returned directly. If the cached response is stale, it's returned,\n * and a background revalidation request is made. If no cached response is found, the request\n * is made to the server, and the response is cached according to the configured TTL and staleness.\n * The interceptor also respects `Cache-Control` headers from the server.\n *\n * Cache-enabled requests are single-flighted per cache key: N concurrent consumers of\n * the same missing/stale entry share ONE network request. Non-cached requests are not\n * touched — pair with `createDedupeRequestsInterceptor` to coalesce those as well.\n *\n * @param allowedMethods - An array of HTTP methods for which caching should be enabled.\n * Defaults to `['GET', 'HEAD', 'OPTIONS']`.\n *\n * @returns An `HttpInterceptorFn` that implements the caching logic.\n *\n * @example\n * // In your app.config.ts or module providers:\n *\n * import { provideHttpClient, withInterceptors } from '@angular/common/http';\n * import { createCacheInterceptor } from '@mmstack/resource';\n *\n * export const appConfig: ApplicationConfig = {\n * providers: [\n * provideHttpClient(withInterceptors([createCacheInterceptor()])),\n * // ... other providers\n * ],\n * };\n */\nexport function createCacheInterceptor(\n allowedMethods = ['GET', 'HEAD', 'OPTIONS'],\n): HttpInterceptorFn {\n const CACHE_METHODS = new Set<string>(allowedMethods);\n\n const inFlight = new Map<string, Observable<HttpEvent<unknown>>>();\n\n return (\n req: HttpRequest<unknown>,\n next: HttpHandlerFn,\n ): Observable<HttpEvent<unknown>> => {\n if (inject(PLATFORM_ID) === 'server') return next(req);\n\n const cache = injectQueryCache();\n\n if (!CACHE_METHODS.has(req.method)) return next(req);\n const opt = getCacheContext(req.context);\n\n if (!opt.cache) return next(req);\n\n const key = opt.key ?? hashRequest(req);\n const entry = cache.getUntracked(key); // null if expired or not found\n\n // If the entry is not stale, return it\n if (entry && !entry.isStale) return of(entry.value);\n\n // resource itself handles case of showing stale data...the request must process as this will \"refresh said data\"\n\n return sharePending(inFlight, key, () => {\n const eTag = entry?.value.headers.get('ETag');\n const lastModified = entry?.value.headers.get('Last-Modified');\n\n if (eTag) {\n req = req.clone({ setHeaders: { 'If-None-Match': eTag } });\n }\n\n if (lastModified) {\n req = req.clone({ setHeaders: { 'If-Modified-Since': lastModified } });\n }\n\n if (opt.bustBrowserCache) {\n req = req.clone({\n setParams: { _cb: Date.now().toString() },\n });\n }\n\n // non-JSON bodies (blob/arraybuffer) cannot survive the JSON persistence layer\n const persistable = req.responseType === 'json';\n if (opt.persist && !persistable && isDevMode()) {\n console.warn(\n `[@mmstack/resource]: persist was requested for a '${req.responseType}' response — such bodies don't survive JSON serialization, persisting skipped.`,\n );\n }\n\n return next(req).pipe(\n tap((event) => {\n if (!(event instanceof HttpResponse)) return;\n\n if (event.ok) {\n const cacheControl = parseCacheControlHeader(event);\n\n if (cacheControl.noStore && !opt.ignoreCacheControl) return;\n\n const { staleTime, ttl } = opt.ignoreCacheControl\n ? opt\n : resolveTimings(cacheControl, opt.staleTime, opt.ttl);\n\n if (ttl === 0) return; // no point\n\n // `Cache-Control: private` → fine to keep in memory, never on disk\n const persist =\n (opt.persist ?? false) &&\n persistable &&\n (opt.ignoreCacheControl || !cacheControl.isPrivate);\n\n const parsedResponse = opt.parse\n ? // statusText omitted — deprecated in Angular (HttpResponse defaults it)\n new HttpResponse({\n body: opt.parse(event.body),\n headers: event.headers,\n status: event.status,\n url: event.url ?? undefined,\n })\n : event;\n\n cache.store(key, parsedResponse, staleTime, ttl, persist);\n return;\n }\n\n // 304 → server confirmed our cached entry is still valid. Re-stamp the\n // existing entry so subsequent reads within the new freshness window\n // don't trigger another revalidation round-trip.\n if (event.status === 304 && entry) {\n // ...unless the key was invalidated while this conditional request was in\n // flight (e.g. by a mutation) — re-storing would resurrect deleted data\n if (!cache.getUntracked(key)) return;\n\n const cacheControl = parseCacheControlHeader(event);\n const { staleTime, ttl } = opt.ignoreCacheControl\n ? opt\n : resolveTimings(cacheControl, opt.staleTime, opt.ttl);\n\n const persist =\n (opt.persist ?? false) &&\n persistable &&\n (opt.ignoreCacheControl || !cacheControl.isPrivate);\n\n cache.store(key, entry.value, staleTime, ttl, persist);\n }\n }),\n map((event) => {\n // handle 304 responses due to eTag/last-modified\n if (event instanceof HttpResponse && event.status === 304 && entry) {\n return entry.value;\n }\n\n return event;\n }),\n );\n });\n };\n}\n","import { type HttpResourceRef } from '@angular/common/http';\nimport { computed } from '@angular/core';\nimport { toWritable } from '@mmstack/primitives';\n\nexport function catchValueError<T>(\n resource: HttpResourceRef<T>,\n fallback: T,\n): HttpResourceRef<T> {\n return {\n ...resource,\n value: toWritable(\n computed(() => {\n try {\n return resource.value();\n } catch {\n return fallback;\n }\n }),\n (value) => resource.value.set(value),\n ),\n };\n}\n","import {\n computed,\n effect,\n inject,\n InjectionToken,\n Injector,\n type Provider,\n type Signal,\n signal,\n untracked,\n} from '@angular/core';\n\n/**\n * Represents the possible states of a circuit breaker.\n * - `CLOSED`: The circuit breaker is closed, and operations are allowed to proceed.\n * - `OPEN`: The circuit breaker is open, and operations are blocked.\n * - `HALF_OPEN`: The circuit breaker is in a half-open state, allowing a limited number of operations to test if the underlying issue is resolved.\n */\ntype CircuitBreakerState = 'CLOSED' | 'OPEN' | 'HALF_OPEN';\n\n/**\n * Represents a circuit breaker, which monitors operations and prevents failures from cascading.\n */\nexport type CircuitBreaker = {\n /**\n * A signal indicating whether the circuit breaker is currently closed (allowing operations).\n */\n isClosed: Signal<boolean>;\n /**\n * A signal indicating whether the circuit breaker is either open or in a half-open state.\n * This is useful for checking if operations are blocked.\n * If the circuit breaker is open, operations should not proceed.\n */\n isOpen: Signal<boolean>;\n /**\n * A signal representing the current state of the circuit breaker.\n */\n status: Signal<CircuitBreakerState>;\n /**\n * Signals a failure to the circuit breaker. This may cause the circuit breaker to open.\n */\n fail: (err?: Error) => void;\n /**\n * Signals a success to the circuit breaker. This may cause the circuit breaker to close.\n */\n success: () => void;\n /**\n * Attempts to transition the circuit breaker to the half-open state. This is typically used\n * to test if the underlying issue has been resolved after the circuit breaker has been open.\n */\n halfOpen: () => void;\n /**\n * Fully resets the breaker state — clears the failure count, drops the half-open\n * flag, and lifts a permanent open caused by `shouldFailForever`. Use after the\n * underlying condition has been resolved (e.g. user re-authenticated after a\n * 401-triggered permanent open).\n */\n hardReset: () => void;\n /**\n * Destroys the circuit breaker & initiates related cleanup\n */\n destroy: () => void;\n};\n\n/**\n * Options for creating a circuit breaker.\n */\ntype CreateCircuitBreakerOptions = {\n /**\n * The number of failures that will cause the circuit breaker to open.\n * @default 5\n */\n threshold?: number;\n /**\n * @deprecated Misspelled — use `threshold` instead. Kept for backwards compatibility; will be removed in a future major.\n */\n treshold?: number;\n /**\n * The time in milliseconds after which the circuit breaker will reset and allow operations to proceed again.\n * @default 30000 (30 seconds)\n */\n timeout?: number;\n /**\n * A function that determines whether an error should cause the circuit breaker to increment the failure count.\n * @default Always returns true\n */\n shouldFail?: (err?: Error) => boolean;\n /**\n * A function that determines whether an error should cause the circuit breaker to be open forever.\n * `hardReset()` is required to lift this state.\n * @default Always returns false\n */\n shouldFailForever?: (err?: Error) => boolean;\n};\n\n/**\n * Options for creating a circuit breaker.\n * - `false`: Disables circuit breaker functionality (always open).\n * - true: Creates a new circuit breaker with default options.\n * - `CircuitBreaker`: Provides an existing `CircuitBreaker` instance to use.\n * - `{ threshold?: number; timeout?: number; }`: Creates a new circuit breaker with the specified options.\n */\nexport type CircuitBreakerOptions =\n | false\n | CircuitBreaker\n | CreateCircuitBreakerOptions;\n\n/** @internal */\nconst DEFAULT_OPTIONS: Required<\n Omit<CreateCircuitBreakerOptions, 'treshold'>\n> = {\n threshold: 5,\n timeout: 30000,\n shouldFail: () => true,\n shouldFailForever: () => false,\n};\n\n/** @internal */\nfunction internalCeateCircuitBreaker(\n threshold = 5,\n resetTimeout = 30000,\n shouldFail: (err?: Error) => boolean = () => true,\n shouldFailForever: (err?: Error) => boolean = () => false,\n): CircuitBreaker {\n const halfOpen = signal(false);\n const failureCount = signal(0);\n const failedForever = signal(false);\n\n const status = computed<CircuitBreakerState>(() => {\n if (failedForever() || failureCount() >= threshold) return 'OPEN';\n return halfOpen() ? 'HALF_OPEN' : 'CLOSED';\n });\n\n const isClosed = computed(() => status() !== 'OPEN');\n const isOpen = computed(() => status() !== 'CLOSED');\n\n const success = () => {\n failureCount.set(0);\n halfOpen.set(false);\n };\n\n const tryOnce = () => {\n if (!untracked(isOpen)) return;\n halfOpen.set(true);\n failureCount.set(threshold - 1);\n };\n\n // Auto-probe effect: schedules a half-open retry after `resetTimeout` whenever\n // the breaker is open, *unless* we've been failed forever (in which case only\n // hardReset() can recover).\n const effectRef = effect((cleanup) => {\n if (!isOpen() || failedForever()) return;\n\n const timeout = setTimeout(tryOnce, resetTimeout);\n return cleanup(() => {\n clearTimeout(timeout);\n });\n });\n\n const failInternal = () => {\n failureCount.set(failureCount() + 1);\n halfOpen.set(false);\n };\n\n const failForever = () => {\n failedForever.set(true);\n halfOpen.set(false);\n };\n\n const fail = (err?: Error) => {\n if (shouldFailForever(err)) return failForever();\n if (shouldFail(err)) return failInternal();\n // If the error does not trigger a failure, we do nothing.\n };\n\n const hardReset = () => {\n failedForever.set(false);\n failureCount.set(0);\n halfOpen.set(false);\n };\n\n return {\n status,\n isClosed,\n isOpen,\n fail,\n success,\n halfOpen: tryOnce,\n hardReset,\n destroy: () => effectRef.destroy(),\n };\n}\n\n/** @internal */\nfunction createNeverBrokenCircuitBreaker(): CircuitBreaker {\n return {\n isClosed: computed(() => true),\n isOpen: computed(() => false),\n status: signal('CLOSED'),\n fail: () => {\n // noop\n },\n success: () => {\n // noop\n },\n halfOpen: () => {\n // noop\n },\n hardReset: () => {\n // noop\n },\n destroy: () => {\n // noop\n },\n };\n}\n\nconst CB_DEFAULT_OPTIONS = new InjectionToken<\n Required<Omit<CreateCircuitBreakerOptions, 'treshold'>>\n>('MMSTACK_CIRCUIT_BREAKER_DEFAULT_OPTIONS');\n\n/**\n * Provides application-wide default options for {@link createCircuitBreaker}.\n * Any `createCircuitBreaker()` call without explicit options (or with only\n * partial options) merges these defaults in, so you can centralize threshold /\n * timeout / failure-classifier behavior in one place.\n *\n * Per-call options always win over the provided defaults.\n *\n * @example\n * ```ts\n * bootstrapApplication(AppComponent, {\n * providers: [\n * provideCircuitBreakerDefaultOptions({\n * threshold: 10,\n * timeout: 60_000,\n * shouldFailForever: (err) =>\n * err instanceof HttpErrorResponse && [401, 403].includes(err.status),\n * }),\n * ],\n * });\n * ```\n */\nexport function provideCircuitBreakerDefaultOptions(\n options: CircuitBreakerOptions,\n): Provider {\n return {\n provide: CB_DEFAULT_OPTIONS,\n useValue: {\n ...DEFAULT_OPTIONS,\n ...normalizeThreshold(options),\n },\n };\n}\n\nfunction injectCircuitBreakerOptions(\n injector = inject(Injector),\n): Required<Omit<CreateCircuitBreakerOptions, 'treshold'>> {\n return injector.get(CB_DEFAULT_OPTIONS, DEFAULT_OPTIONS, {\n optional: true,\n });\n}\n\n/** @internal — strips the deprecated `treshold` field and folds it into `threshold` */\nfunction normalizeThreshold(\n opt: CircuitBreakerOptions | undefined,\n): Partial<Omit<CreateCircuitBreakerOptions, 'treshold'>> {\n if (!opt || typeof opt !== 'object' || 'isClosed' in opt) return {};\n const { treshold, threshold, ...rest } = opt;\n return {\n ...rest,\n threshold: threshold ?? treshold,\n };\n}\n\n/**\n * Creates a circuit breaker instance.\n *\n * @param options - Configuration options for the circuit breaker. Can be:\n * - `undefined`: Uses defaults (threshold: 5, timeout: 30000ms) or provided defaults via {@link provideCircuitBreakerDefaultOptions}.\n * - `false`: Creates a \"no-op\" circuit breaker that is always closed (never trips).\n * - `true`: Creates a circuit breaker with default settings.\n * - `CircuitBreaker`: Reuses an existing `CircuitBreaker` instance.\n * - `{ threshold?: number; timeout?: number; }`: Creates a circuit breaker with the specified threshold and timeout.\n *\n * @returns A `CircuitBreaker` instance.\n *\n * @example\n * // Create a circuit breaker with default settings:\n * const breaker = createCircuitBreaker();\n *\n * // Create a circuit breaker with custom settings:\n * const customBreaker = createCircuitBreaker({ threshold: 10, timeout: 60000 });\n *\n * // Share a single circuit breaker instance across multiple resources:\n * const sharedBreaker = createCircuitBreaker();\n * const resource1 = queryResource(..., { circuitBreaker: sharedBreaker });\n * const resource2 = mutationResource(..., { circuitBreaker: sharedBreaker });\n */\nexport function createCircuitBreaker(\n opt?: CircuitBreakerOptions,\n injector?: Injector,\n): CircuitBreaker {\n if (opt === false) return createNeverBrokenCircuitBreaker();\n\n if (typeof opt === 'object' && 'isClosed' in opt) return opt;\n\n const { threshold, timeout, shouldFail, shouldFailForever } = {\n ...injectCircuitBreakerOptions(injector),\n ...normalizeThreshold(opt),\n };\n\n return internalCeateCircuitBreaker(\n threshold,\n timeout,\n shouldFail,\n shouldFailForever,\n );\n}\n","// Heavily inspired by: https://dev.to/kasual1/request-deduplication-in-angular-3pd8\n\nimport {\n HttpContext,\n HttpContextToken,\n type HttpEvent,\n type HttpHandlerFn,\n type HttpInterceptorFn,\n type HttpRequest,\n} from '@angular/common/http';\nimport { type Observable } from 'rxjs';\nimport { hashRequest } from './hash-request';\nimport { sharePending } from './share-pending';\n\nconst NO_DEDUPE = new HttpContextToken<boolean>(() => false);\n\n/**\n * Disables request deduplication for a specific HTTP request.\n *\n * @param ctx - The `HttpContext` to modify. If not provided, a new `HttpContext` is created.\n * @returns The modified `HttpContext` with the `NO_DEDUPE` token set to `true`.\n *\n * @example\n * // Disable deduplication for a specific POST request:\n * const context = noDedupe();\n * this.http.post('/api/data', payload, { context }).subscribe(...);\n *\n * // Disable deduplication, modifying an existing context:\n * let context = new HttpContext();\n * context = noDedupe(context);\n * this.http.post('/api/data', payload, { context }).subscribe(...);\n */\nexport function noDedupe(ctx: HttpContext = new HttpContext()) {\n return ctx.set(NO_DEDUPE, true);\n}\n\n/**\n * Creates an `HttpInterceptorFn` that deduplicates identical HTTP requests.\n * If multiple identical requests (same URL and parameters) are made concurrently,\n * only the first request will be sent to the server. Subsequent requests will\n * receive the response from the first request.\n *\n * Relationship to `createCacheInterceptor`: the cache interceptor has built-in\n * single-flight for CACHE-ENABLED requests (keyed by the cache key). This interceptor\n * covers everything the cache doesn't see — non-cached resources, plain HttpClient\n * calls, DELETEs — keyed by the request hash. Installing both is the recommended\n * setup; where they overlap, this one degrades to a no-op passthrough.\n *\n * @param allowed - An array of HTTP methods for which deduplication should be enabled.\n * Defaults to `['GET', 'DELETE', 'HEAD', 'OPTIONS']`.\n * @param keyFn - Optional function to compute the dedupe key from a request.\n * Defaults to `hashRequest`, which includes method, URL,\n * response type, params, and body.\n *\n * @returns An `HttpInterceptorFn` that implements the request deduplication logic.\n *\n * @example\n * // In your app.config.ts or module providers:\n * import { provideHttpClient, withInterceptors } from '@angular/common/http';\n * import { createDedupeRequestsInterceptor } from './your-dedupe-interceptor';\n *\n * export const appConfig: ApplicationConfig = {\n * providers: [\n * provideHttpClient(withInterceptors([createDedupeRequestsInterceptor()])),\n * // ... other providers\n * ],\n * };\n *\n * // You can also specify which methods should be deduped\n * export const appConfig: ApplicationConfig = {\n * providers: [\n * provideHttpClient(withInterceptors([createDedupeRequestsInterceptor(['GET'])])), // only dedupe GET calls\n * // ... other providers\n * ],\n * };\n */\nexport function createDedupeRequestsInterceptor(\n allowed = ['GET', 'DELETE', 'HEAD', 'OPTIONS'],\n keyFn: (req: HttpRequest<unknown>) => string = hashRequest,\n): HttpInterceptorFn {\n const inFlight = new Map<string, Observable<HttpEvent<unknown>>>();\n\n const DEDUPE_METHODS = new Set<string>(allowed);\n\n return (\n req: HttpRequest<unknown>,\n next: HttpHandlerFn,\n ): Observable<HttpEvent<unknown>> => {\n if (!DEDUPE_METHODS.has(req.method) || req.context.get(NO_DEDUPE))\n return next(req);\n\n return sharePending(inFlight, keyFn(req), () => next(req));\n };\n}\n","import {\n HttpContext,\n HttpHeaders,\n HttpParams,\n type HttpResourceRequest,\n} from '@angular/common/http';\nimport { type ValueEqualityFn } from '@angular/core';\nimport { hash } from './hash-unknown';\n\nfunction equalTransferCache(\n a: HttpResourceRequest['transferCache'],\n b: HttpResourceRequest['transferCache'],\n): boolean {\n if (!a && !b) return true;\n if (!a || !b) return false;\n\n if (typeof a !== typeof b) return false;\n if (typeof a === 'boolean' || typeof b === 'boolean') return a === b;\n\n if (!a.includeHeaders && !b.includeHeaders) return true;\n if (!a.includeHeaders || !b.includeHeaders) return false;\n\n if (a.includeHeaders.length !== b.includeHeaders.length) return false;\n\n if (a.includeHeaders.length === 0) return true;\n\n const aSet = new Set(a.includeHeaders ?? []);\n\n return b.includeHeaders.every((header) => aSet.has(header));\n}\n\nfunction equalParamArray(\n a: (string | number | boolean)[],\n b: (string | number | boolean)[],\n): boolean {\n if (!a && !b) return true;\n if (!a || !b) return false;\n if (a.length !== b.length) return false;\n\n return a.every((value) => b.includes(value));\n}\n\nfunction headersToObject(headerClass: HttpHeaders) {\n const headers: Exclude<Required<HttpResourceRequest['headers']>, HttpHeaders | undefined> = {};\n\n headerClass.keys().forEach((key) => {\n const value = headerClass.getAll(key);\n if (value === null) return;\n if (value.length === 1) {\n headers[key] = value[0];\n } else {\n headers[key] = value;\n }\n });\n\n return headers;\n}\n\nfunction paramToObject(paramsClass: HttpParams) {\n const params: Exclude<Required<HttpResourceRequest['params']>, HttpParams | undefined> = {};\n\n paramsClass.keys().forEach((key) => {\n const value = paramsClass.getAll(key);\n if (value === null) return;\n if (value.length === 1) {\n params[key] = value[0];\n } else {\n params[key] = value;\n }\n });\n\n return params;\n}\n\nfunction equalParams(a: HttpResourceRequest['params'], b: HttpResourceRequest['params']): boolean {\n if (!a && !b) return true;\n if (!a || !b) return false;\n\n const aObj = a instanceof HttpParams ? paramToObject(a) : a;\n const bObj = b instanceof HttpParams ? paramToObject(b) : b;\n\n const aKeys = Object.keys(aObj);\n const bKeys = Object.keys(bObj);\n if (aKeys.length !== bKeys.length) return false;\n\n return aKeys.every((key) => {\n if (Array.isArray(aObj[key]) || Array.isArray(bObj[key])) {\n return equalParamArray(\n Array.isArray(aObj[key]) ? aObj[key] : [aObj[key]],\n Array.isArray(bObj[key]) ? bObj[key] : [bObj[key]],\n );\n }\n\n return aObj[key] === bObj[key];\n });\n}\n\nfunction equalBody(a: HttpResourceRequest['body'], b: HttpResourceRequest['body']): boolean {\n if (!a && !b) return true;\n if (!a || !b) return false;\n return hash(a) === hash(b);\n}\n\nfunction equalHeaders(\n a: HttpResourceRequest['headers'],\n b: HttpResourceRequest['headers'],\n): boolean {\n if (!a && !b) return true;\n if (!a || !b) return false;\n\n const aObj = a instanceof HttpHeaders ? headersToObject(a) : a;\n const bObj = b instanceof HttpHeaders ? headersToObject(b) : b;\n\n const aKeys = Object.keys(aObj);\n const bKeys = Object.keys(bObj);\n if (aKeys.length !== bKeys.length) return false;\n return aKeys.every((key) => {\n if (Array.isArray(aObj[key]) || Array.isArray(bObj[key])) {\n return equalParamArray(\n Array.isArray(aObj[key]) ? aObj[key] : [aObj[key]],\n Array.isArray(bObj[key]) ? bObj[key] : [bObj[key]],\n );\n }\n\n return aObj[key] === bObj[key];\n });\n}\n\nfunction toHttpContextEntries(ctx: HttpResourceRequest['context']) {\n if (!ctx) return [];\n\n if (ctx instanceof HttpContext) {\n const tokens = Array.from(ctx.keys());\n return tokens.map((key) => [key.toString(), ctx.get(key)] as const);\n }\n\n if (typeof ctx === 'object') {\n return Object.entries(ctx) as [string, unknown][];\n }\n\n return [];\n}\n\nfunction equalContext(\n a: HttpResourceRequest['context'],\n b: HttpResourceRequest['context'],\n): boolean {\n if (!a && !b) return true;\n if (!a || !b) return false;\n\n const aEntries = toHttpContextEntries(a);\n const bEntries = toHttpContextEntries(b);\n if (aEntries.length !== bEntries.length) return false;\n if (aEntries.length === 0) return true;\n const bMap = new Map(bEntries);\n return aEntries.every(([key, value]) => value === bMap.get(key));\n}\n\nexport function createEqualRequest<TResult>(equalResult?: ValueEqualityFn<TResult>) {\n const eqb = equalResult ?? equalBody;\n\n return (\n a: Partial<HttpResourceRequest> | undefined,\n b: Partial<HttpResourceRequest> | undefined,\n ) => {\n if (!a && !b) return true;\n if (!a || !b) return false;\n\n if (a.url !== b.url) return false;\n if (a.method !== b.method) return false;\n if (!equalParams(a.params, b.params)) return false;\n if (!equalHeaders(a.headers, b.headers)) return false;\n if (!eqb(a.body as TResult, b.body as TResult)) return false;\n if (!equalContext(a.context, b.context)) return false;\n\n if (a.withCredentials !== b.withCredentials) return false;\n if (a.reportProgress !== b.reportProgress) return false;\n if (!equalTransferCache(a.transferCache, b.transferCache)) return false;\n\n return true;\n };\n}\n","export function hasSlowConnection() {\n if (\n window &&\n 'navigator' in window &&\n 'connection' in window.navigator &&\n typeof window.navigator.connection === 'object' &&\n !!window.navigator.connection &&\n 'effectiveType' in window.navigator.connection &&\n typeof window.navigator.connection.effectiveType === 'string'\n )\n return window.navigator.connection.effectiveType.endsWith('2g');\n\n return false;\n}\n","import type { CircuitBreakerOptions } from './circuit-breaker';\nimport type { RefreshOptions } from './refresh';\nimport type { RetryOptions } from './retry-on-error';\nimport type { ResourceCacheOptions } from '../options';\n\n/**\n * Deep merges multiple circuit breaker options.\n * The latter options override the former.\n */\nexport function mergeCircuitBreakerOptions(\n global?: CircuitBreakerOptions | true,\n query?: CircuitBreakerOptions | true,\n local?: CircuitBreakerOptions | true,\n): CircuitBreakerOptions | true | undefined {\n if (!global && !query && !local) return undefined;\n return {\n ...(global === true ? {} : global),\n ...(query === true ? {} : query),\n ...(local === true ? {} : local),\n };\n}\n\n/**\n * Deep merges multiple retry options.\n * The latter options override the former.\n */\nexport function mergeRetryOptions(\n global?: RetryOptions | number,\n query?: RetryOptions | number,\n local?: RetryOptions | number,\n): RetryOptions | number | undefined {\n if (global === undefined && query === undefined && local === undefined) return undefined;\n return {\n ...(typeof global === 'number' ? { max: global } : global),\n ...(typeof query === 'number' ? { max: query } : query),\n ...(typeof local === 'number' ? { max: local } : local),\n };\n}\n\n/**\n * Deep merges multiple cache options.\n * The latter options override the former.\n */\nexport function mergeCacheOptions(\n query?: ResourceCacheOptions,\n local?: ResourceCacheOptions\n): ResourceCacheOptions | undefined {\n if (query === undefined && local === undefined) return undefined;\n return {\n ...(query === true ? {} : query),\n ...(local === true ? {} : local),\n };\n}\n\n/**\n * Deep merges multiple refresh options.\n * The latter options override the former.\n */\nexport function mergeRefreshOptions(\n query?: RefreshOptions | number,\n local?: RefreshOptions | number\n): RefreshOptions | number | undefined {\n if (query === undefined && local === undefined) return undefined;\n return {\n ...(typeof query === 'number' ? { interval: query } : query),\n ...(typeof local === 'number' ? { interval: local } : local),\n };\n}\n","import { type HttpHeaders, type HttpResourceRef } from '@angular/common/http';\nimport { type ValueEqualityFn } from '@angular/core';\nimport { keepPrevious } from '@mmstack/primitives';\n\nexport function persistResourceValues<T>(\n resource: HttpResourceRef<T>,\n shouldPersist = false,\n equal?: ValueEqualityFn<T>,\n): HttpResourceRef<T> {\n if (!shouldPersist) return resource;\n\n return {\n ...resource,\n statusCode: keepPrevious<number | undefined>(resource.statusCode),\n headers: keepPrevious<HttpHeaders | undefined>(resource.headers),\n value: keepPrevious<T>(resource.value, { equal }),\n };\n}\n","import { type HttpResourceRef } from '@angular/common/http';\nimport {\n effect,\n untracked,\n type DestroyRef,\n type EffectRef,\n type Injector,\n type Signal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { interval } from 'rxjs';\n\n/**\n * Refresh configuration for a query resource.\n * - a `number` is shorthand for `{ interval: number }` (poll every n milliseconds)\n * - the object form composes polling with event-driven refresh triggers\n */\nexport type RefreshOptions =\n | number\n | {\n /**\n * Poll interval in milliseconds. Omit (or 0) for no polling — useful when only\n * the event-driven triggers below are wanted.\n */\n interval?: number;\n /**\n * Reload when the page becomes visible again (tab refocused, window restored).\n * @default false\n */\n onFocus?: boolean;\n /**\n * Reload when the browser comes back online.\n * @default false\n */\n onReconnect?: boolean;\n };\n\n/** @internal Reactive sources + injector for the event-driven refresh triggers. */\nexport type RefreshTriggers = {\n injector: Injector;\n visibility: Signal<DocumentVisibilityState>;\n online: Signal<boolean>;\n};\n\n// refresh resource every n milliseconds and/or on visibility/reconnect transitions.\nexport function refresh<T>(\n resource: HttpResourceRef<T>,\n destroyRef: DestroyRef,\n opt?: RefreshOptions,\n inactive?: () => boolean,\n triggers?: RefreshTriggers,\n): HttpResourceRef<T> {\n const normalized = typeof opt === 'number' ? { interval: opt } : (opt ?? {});\n const {\n interval: ms,\n onFocus = false,\n onReconnect = false,\n } = normalized;\n\n const hasInterval = !!ms; // 0 excluded — not a valid polling cadence\n const hasTriggerEffects = !!triggers && (onFocus || onReconnect);\n\n if (!hasInterval && !hasTriggerEffects) return resource; // no refresh requested\n\n const tick = () => {\n if (inactive?.()) return; // disabled / paused → skip\n resource.reload();\n };\n\n const effectRefs: EffectRef[] = [];\n\n if (triggers && onFocus) {\n const vis = triggers.visibility;\n let prev = untracked(vis);\n effectRefs.push(\n effect(\n () => {\n const next = vis();\n const was = prev;\n prev = next;\n // only the hidden → visible TRANSITION refreshes — not the initial run\n if (was !== 'visible' && next === 'visible') untracked(tick);\n },\n { injector: triggers.injector },\n ),\n );\n }\n\n if (triggers && onReconnect) {\n const online = triggers.online;\n let prev = untracked(online);\n effectRefs.push(\n effect(\n () => {\n const next = online();\n const was = prev;\n prev = next;\n if (!was && next) untracked(tick);\n },\n { injector: triggers.injector },\n ),\n );\n }\n\n if (!hasInterval) {\n return {\n ...resource,\n destroy: () => {\n effectRefs.forEach((ref) => ref.destroy());\n resource.destroy();\n },\n };\n }\n\n // we can use RxJs here as reloading the resource will always be a side effect & as such does not impact the reactive graph in any way.\n let sub = interval(ms)\n .pipe(takeUntilDestroyed(destroyRef))\n .subscribe(tick);\n\n const reload = (): boolean => {\n sub.unsubscribe(); // do not conflict with manual reload\n\n const hasReloaded = resource.reload();\n\n // resubscribe after manual reload\n sub = interval(ms)\n .pipe(takeUntilDestroyed(destroyRef))\n .subscribe(tick);\n\n return hasReloaded;\n };\n\n return {\n ...resource,\n reload,\n destroy: () => {\n sub.unsubscribe();\n effectRefs.forEach((ref) => ref.destroy());\n resource.destroy();\n },\n };\n}","import { type HttpResourceRef } from '@angular/common/http';\nimport { effect, untracked } from '@angular/core';\n\nexport type RetryOptions =\n | number\n | {\n max?: number;\n backoff?: number;\n };\n\n/**\n * Callback fired by the retry wrapper for every failed attempt.\n * `retryCount` is the number of retries that already happened before this\n * error (`0` on the original failure, `1` after the first retry, etc.).\n * `isFinal` is `true` when no further retry will be scheduled — either because\n * retries are exhausted or `retry` was unset/0.\n */\nexport type RetryErrorCallback<TError = unknown> = (\n err: TError,\n retryCount: number,\n isFinal: boolean,\n) => void;\n\n// Retry on error, if number is provided it will retry that many times with exponential backoff, otherwise it will use the options provided\nexport function retryOnError<T>(\n res: HttpResourceRef<T>,\n opt?: RetryOptions,\n onError?: RetryErrorCallback,\n): HttpResourceRef<T> {\n const max = opt ? (typeof opt === 'number' ? opt : (opt.max ?? 0)) : 0;\n const backoff = typeof opt === 'object' ? (opt.backoff ?? 1000) : 1000;\n\n let retries = 0;\n\n let timeout: ReturnType<typeof setTimeout> | undefined;\n\n const handleError = () => {\n const err = untracked(res.error);\n const isFinal = retries >= max;\n\n onError?.(err, retries, isFinal);\n\n if (isFinal) return;\n\n retries++;\n\n if (timeout) clearTimeout(timeout);\n\n timeout = setTimeout(\n () => res.reload(),\n retries <= 0 ? 0 : backoff * Math.pow(2, retries - 1),\n );\n };\n\n const onSuccess = () => {\n if (timeout) clearTimeout(timeout);\n retries = 0;\n };\n\n const ref = effect(() => {\n switch (res.status()) {\n case 'error':\n return handleError();\n case 'resolved':\n return onSuccess();\n }\n });\n\n return {\n ...res,\n destroy: () => {\n ref.destroy(); // cleanup on manual destroy\n res.destroy();\n },\n };\n}\n","import { inject, Injectable } from '@angular/core';\nimport { sensor } from '@mmstack/primitives';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class ResourceSensors {\n readonly networkStatus = sensor('networkStatus');\n readonly pageVisibility = sensor('pageVisibility');\n}\n\nexport function injectNetworkStatus() {\n return inject(ResourceSensors).networkStatus;\n}\n\nexport function injectPageVisibility() {\n return inject(ResourceSensors).pageVisibility;\n}\n","import { type HttpResourceRef } from '@angular/common/http';\n\nexport function toResourceObject<T>(\n res: HttpResourceRef<T>,\n): HttpResourceRef<T> {\n return {\n snapshot: res.snapshot,\n asReadonly: () => res.asReadonly(),\n destroy: () => res.destroy(),\n error: res.error,\n headers: res.headers,\n isLoading: res.isLoading,\n progress: res.progress,\n status: res.status,\n statusCode: res.statusCode,\n value: res.value,\n reload: () => res.reload(),\n hasValue: (() => res.hasValue()) as HttpResourceRef<T>['hasValue'],\n set: (v) => res.set(v),\n update: (v) => res.update(v),\n };\n}\n","import {\n DestroyRef,\n inject,\n InjectionToken,\n type Injector,\n type Provider,\n type ResourceRef,\n runInInjectionContext,\n} from '@angular/core';\nimport {\n injectTransitionScope,\n type RegisterOptions,\n} from '@mmstack/primitives';\nimport { type CircuitBreakerOptions, type RetryOptions } from './util';\nimport { type HttpResourceRequest } from '@angular/common/http';\n\n/**\n * Options for enabling and configuring caching for a resource.\n *\n * - `true`: Enables caching with default settings.\n * - `{ ttl?: number; staleTime?: number; hash?: (req: HttpResourceRequest) => string; }`: Configures caching with custom settings.\n */\nexport type ResourceCacheOptions =\n | true\n | {\n /**\n * The time-to-live for the cached value in milliseconds.\n * After this time, the value is removed from the cache entirely.\n * Defaults to 5 minutes (`300_000`).\n */\n ttl?: number;\n /**\n * The time in milliseconds during which the cached value is considered \"fresh\".\n * If a request is made within this time, the cached value is returned immediately without a background fetch.\n * Defaults to 0 (always stale, triggering a background fetch).\n */\n staleTime?: number;\n /**\n * A custom function to generate the cache key from the HTTP request.\n * By default, it hashes the URL, method, headers (specified by `varyHeaders`), and body.\n */\n hash?: (req: HttpResourceRequest) => string;\n /**\n * A list of header names to include in the default cache key generation.\n * Ignored if a custom `hash` function is provided.\n *\n * Note: still call `cache.clear()` on logout — the previous user's entries are\n * unreachable under the new key but linger until their TTL.\n */\n varyHeaders?: string[];\n /**\n * Whether to bust the browser cache by appending a unique query parameter to the request URL.\n * This is useful for ensuring that the latest data is fetched from the server, bypassing any\n * cached responses in the browser. The unique parameter is removed before calling the cache function, so it does not affect the cache key.\n * @default false - By default, the resource will not bust the browser cache.\n */\n bustBrowserCache?: boolean;\n /**\n * Whether to ignore the `Cache-Control` headers from the server when caching responses.\n * If set to `true`, the resource will not respect any cache directives from the server,\n * allowing you to control caching behavior entirely through the resource options.\n * @default false - By default the resource will respect `Cache-Control` headers.\n */\n ignoreCacheControl?: boolean;\n /**\n * If true, it saves the cached responses to an indexedDb table, making it available across\n * tabs, sessions and reloads..only valid JSON responses can be persisted (so no Blobs, formData, ArrayBuffers etc.)\n * @default false\n */\n persist?: boolean;\n };\n\n/**\n * Auto-registration into the nearest transition scope, as a resource OPTION:\n * - `'suspend'` — register as *suspending*: the boundary holds its placeholder until this\n * resource has a value (full Suspense). The right choice for data the subtree can't render without;\n * - `'indicator'` — register for the pending indicator + hold-stale only (does NOT block first\n * paint). The right choice for in-region data: the boundary shows the held value with `aria-busy`;\n * - `false` / omitted — don't register.\n *\n * Defaultable via `provideResourceOptions` / `provideQueryResourceOptions` and overridable\n * (including opting out with `false`) per call — so a dev can make \"all queries participate in\n * transitions\" the default and turn it off for the odd one.\n */\nexport type TransitionRegistration = false | 'indicator' | 'suspend';\n\n/** Options common to every resource kind (the base layer for the options-injection system). */\nexport type CommonResourceOptions = {\n /** Auto-registration into the nearest transition scope. */\n readonly register?: TransitionRegistration;\n /** Retry failed requests. */\n readonly retry?: RetryOptions;\n /** Configure a circuit breaker for the resource. */\n readonly circuitBreaker?: CircuitBreakerOptions | true;\n /** Trigger a request even when the request parameters are unchanged. @default false */\n readonly triggerOnSameRequest?: boolean;\n};\n\nconst RESOURCE_OPTIONS = new InjectionToken<CommonResourceOptions>(\n '@mmstack/resource:resource-options',\n { factory: () => ({}) },\n);\n\nfunction asProvider<T>(\n token: InjectionToken<T>,\n valueOrFn: T | (() => T),\n): Provider {\n return typeof valueOrFn === 'function'\n ? { provide: token, useFactory: valueOrFn as () => T }\n : { provide: token, useValue: valueOrFn };\n}\n\n/** Layer 1: defaults that apply to ALL resource kinds. Type-specific providers inherit + override these. */\nexport function provideResourceOptions(\n valueOrFn: CommonResourceOptions | (() => CommonResourceOptions),\n): Provider {\n return asProvider(RESOURCE_OPTIONS, valueOrFn);\n}\n\nexport function injectResourceOptions(\n injector?: Injector,\n): CommonResourceOptions {\n return injector ? injector.get(RESOURCE_OPTIONS) : inject(RESOURCE_OPTIONS);\n}\n\n/** Shared helper for the type-specific providers (query/mutation), so precedence is identical. */\nexport function provideTypedResourceOptions<T>(\n token: InjectionToken<T>,\n valueOrFn: T | (() => T),\n): Provider {\n return asProvider(token, valueOrFn);\n}\n\n/**\n * Applies a resolved `register` option to a freshly-created resource — adds it to the nearest\n * transition scope and removes it on destroy. Runs in the resource's injection context (or the\n * provided `injector`), since registration needs `TRANSITION_SCOPE` + `DestroyRef`.\n */\nexport function applyResourceRegistration(\n ref: ResourceRef<unknown>,\n register: TransitionRegistration | undefined,\n injector?: Injector,\n): void {\n if (!register) return;\n const opt: RegisterOptions = { suspends: register === 'suspend' };\n const run = injector\n ? (fn: () => void) => runInInjectionContext(injector, fn)\n : (fn: () => void) => fn();\n run(() => {\n const scope = injectTransitionScope();\n const destroyRef = inject(DestroyRef);\n scope.add(ref, opt);\n destroyRef.onDestroy(() => scope.remove(ref));\n });\n}\n","import {\n HttpClient,\n type HttpHeaders,\n httpResource,\n type HttpResourceOptions,\n type HttpResourceRef,\n type HttpResourceRequest,\n HttpResponse,\n} from '@angular/common/http';\nimport {\n computed,\n DestroyRef,\n effect,\n inject,\n InjectionToken,\n Injector,\n isDevMode,\n linkedSignal,\n type Provider,\n type ResourceRef,\n runInInjectionContext,\n type Signal,\n untracked,\n type WritableSignal,\n} from '@angular/core';\nimport {\n injectPaused,\n type PauseOption,\n toWritable,\n} from '@mmstack/primitives';\nimport { firstValueFrom } from 'rxjs';\nimport {\n applyResourceRegistration,\n type CommonResourceOptions,\n type ResourceCacheOptions,\n injectResourceOptions,\n provideTypedResourceOptions,\n} from './options';\nimport {\n catchValueError,\n createCircuitBreaker,\n createEqualRequest,\n hashRequest,\n hasSlowConnection,\n injectNetworkStatus,\n injectPageVisibility,\n injectQueryCache,\n mergeCacheOptions,\n mergeCircuitBreakerOptions,\n mergeRefreshOptions,\n mergeRetryOptions,\n persistResourceValues,\n refresh,\n type RefreshOptions,\n retryOnError,\n setCacheContext,\n toResourceObject,\n} from './util';\nimport { type CacheEntry } from './util/cache/cache';\n\nexport { type RefreshOptions } from './util';\n\n/**\n * Options for configuring a `queryResource`. Extends Angular's\n * `HttpResourceOptions` with caching, retries, refresh intervals, circuit\n * breakers, and lifecycle callbacks. See the linked properties below for the\n * full list.\n *\n * @example\n * ```ts\n * const options: QueryResourceOptions<User> = {\n * defaultValue: { id: 0, name: 'Anonymous' },\n * cache: { ttl: 60_000, staleTime: 10_000 },\n * refresh: 30_000,\n * retry: { max: 3 },\n * circuitBreaker: true,\n * onError: (err, retry, isFinal) => isFinal && toast.error(err),\n * };\n * ```\n */\nexport type QueryResourceOptions<TResult, TRaw = TResult> = HttpResourceOptions<\n TResult,\n TRaw\n> &\n CommonResourceOptions & {\n /**\n * Whether to keep the previous value of the resource while a refresh is in progress.\n * Defaults to `false`. Also keeps status & headers while refreshing.\n */\n keepPrevious?: boolean;\n /**\n * Automatic refresh behavior. A number polls every n milliseconds; the object form\n * composes polling with event-driven triggers:\n *\n * ```ts\n * refresh: 30_000 // poll every 30s\n * refresh: { onFocus: true, onReconnect: true } // refetch on tab refocus / back-online\n * refresh: { interval: 60_000, onFocus: true } // both\n * ```\n *\n * Triggers respect the resource's disabled/paused state (no refetch while\n * offline, circuit-open, or paused).\n */\n refresh?: RefreshOptions;\n /**\n * Called on every failed attempt, including each retry.\n *\n * @param err - The error from the underlying HTTP request.\n * @param retryCount - The number of retries that already happened before\n * this error (`0` on the original failure, `1` after the first retry, etc.).\n * @param isFinal - `true` when no further retry will be scheduled — either\n * because retries are exhausted or `retry` was unset/0. Branch on this for\n * \"user actually needs to know\" side effects (toasts, error reporting).\n */\n onError?: (err: unknown, retryCount: number, isFinal: boolean) => void;\n /**\n * Options for enabling and configuring caching for the resource.\n */\n cache?: ResourceCacheOptions;\n /**\n * Opt-in automatic pausing (off by default — existing behavior unchanged):\n * - `true` — pause whenever the surrounding Activity boundary (`MmActivity` /\n * `providePaused` from `@mmstack/primitives`) is paused. Outside a boundary this\n * is a no-op, so it's safe to set app-wide via `provideQueryResourceOptions`.\n * - a `() => boolean` predicate (a `Signal<boolean>` qualifies) — pause while it\n * returns `true`.\n *\n * Pausing has the same semantics as returning `ctx.paused` from the request fn:\n * the resource HOLDS its current value and last request (no refetch on resume if\n * the request is unchanged) and stops background work (polling, focus/reconnect\n * triggers). The two compose — either source can pause the resource.\n */\n pause?: PauseOption;\n /**\n * Comparison of request object\n */\n equalRequest?: (a: HttpResourceRequest, b: HttpResourceRequest) => boolean;\n };\n\nconst QUERY_RESOURCE_OPTIONS = new InjectionToken<\n Partial<QueryResourceOptions<any, any>>\n>('@mmstack/resource:query-resource-options', { factory: () => ({}) });\n\n/**\n * Layer 2 (query): default options for every `queryResource`, inheriting + overriding the\n * common defaults from `provideResourceOptions`. Per-call options override these in turn.\n */\nexport function provideQueryResourceOptions(\n valueOrFn:\n | Partial<QueryResourceOptions<any, any>>\n | (() => Partial<QueryResourceOptions<any, any>>),\n): Provider {\n return provideTypedResourceOptions(QUERY_RESOURCE_OPTIONS, valueOrFn);\n}\n\nfunction injectQueryResourceOptions(\n injector?: Injector,\n): Partial<QueryResourceOptions<any, any>> {\n return injector\n ? injector.get(QUERY_RESOURCE_OPTIONS)\n : inject(QUERY_RESOURCE_OPTIONS);\n}\n\n/**\n * The reason a query resource is currently in the `disabled` state, or `null`\n * if it is enabled. Useful for branching UI on cause (e.g. \"offline\" vs\n * \"circuit tripped\" vs \"nothing to fetch yet\").\n *\n * @example\n * ```ts\n * effect(() => {\n * switch (user.disabledReason()) {\n * case 'offline': return toast.warn('You are offline');\n * case 'circuit-open': return toast.warn('Service temporarily unavailable');\n * case 'no-request': return; // expected — request signal returned undefined\n * case null: return; // resource is enabled\n * }\n * });\n * ```\n *\n * Note: a PAUSED resource also reports `'no-request'` — it holds its previous value\n * and request, but no request is currently active.\n */\nexport type DisabledReason = 'offline' | 'circuit-open' | 'no-request';\n\n/**\n * Returned from a resource's request fn to PAUSE it: the resource holds its current value and last\n * request (so it does not refetch on resume), and stops background work (no polling, no refetch\n * while paused). Distinct from returning `undefined` (DISABLE), which drops the request — a\n * disabled resource may refetch when re-enabled, a paused one resumes exactly where it left off.\n *\n * The request fn receives a {@link RequestContext} and can just return `ctx.paused`.\n */\nexport const PAUSED: unique symbol = Symbol('@mmstack/resource:paused');\n\n/**\n * Context passed to a resource's request fn. An object (not positional args) so it can grow\n * without changing the call signature. Today it carries {@link PAUSED} so the fn can return it.\n */\nexport type RequestContext = { readonly paused: typeof PAUSED };\n\n/** The request fn shape: build a request, or return `undefined` (disable) / `ctx.paused` (pause). */\nexport type ResourceRequestFn = (\n ctx: RequestContext,\n) => HttpResourceRequest | string | undefined | void | typeof PAUSED;\n\n/**\n * Represents a resource created by `queryResource`. Extends `HttpResourceRef`\n * with `disabled` / `disabledReason` signals, writable `headers` / `statusCode`\n * (so optimistic updates can patch them), and `prefetch()` for proactive cache\n * warm-up.\n *\n * @example\n * ```ts\n * const user = queryResource<User>(() => `/api/users/${userId()}`);\n *\n * effect(() => {\n * if (user.status() === 'resolved') console.log(user.value());\n * });\n *\n * // Warm the cache before navigating\n * onMouseEnter(() => user.prefetch());\n * ```\n */\nexport type QueryResourceRef<TResult> = Omit<\n HttpResourceRef<TResult>,\n 'headers' | 'statusCode'\n> & {\n /**\n * Linkedsignal of the response headers, when available.\n */\n readonly headers: WritableSignal<HttpHeaders | undefined>;\n /**\n * Linkedsignal of the response status code, when available.\n */\n readonly statusCode: WritableSignal<number | undefined>;\n /**\n * A signal indicating whether the resource is currently disabled (due to circuit breaker, offline, or undefined request).\n */\n disabled: Signal<boolean>;\n /**\n * Why the resource is currently disabled, or `null` if it is enabled.\n * Maps to one of: `'offline'`, `'circuit-open'`, `'no-request'`.\n */\n disabledReason: Signal<DisabledReason | null>;\n /**\n * Prefetches data for the resource, populating the cache if caching is enabled. This can be\n * used to proactively load data before it's needed.\n *\n * Resolves immediately without fetching when caching is disabled or a slow\n * connection is detected (prefetching would compete with user-initiated requests).\n *\n * @param req - Optional partial request parameters to use for the prefetch. This allows you\n * to prefetch data with different parameters than the main resource request.\n */\n prefetch: (req?: Partial<HttpResourceRequest> | string) => Promise<void>;\n};\n\n/**\n * Creates an HTTP resource with features like caching, retries, refresh intervals, circuit breaker, and optimistic updates. Without additional options it is equivalent to simply calling `httpResource`.\n * This overload is for when a `defaultValue` is provided, ensuring that the resource's value is always defined.\n * @param request A function that returns the `HttpResourceRequest` or a URL string to be made. This function\n * is called reactively, so the request can change over time. If the function\n * returns `undefined`, the resource is considered \"disabled\" and no request will be made.\n * @param options Configuration options for the resource. These options extend the basic\n * `HttpResourceOptions` and add features like `keepPrevious`, `refresh`, `retry`,\n * `onError`, `circuitBreaker`, and `cache`. Additionally, when a `defaultValue` is provided, the resource's value will always be defined, even if the underlying HTTP request fails or is disabled.\n * @returns An `QueryResourceRef` instance, which extends the basic `HttpResourceRef` with additional features.\n *\n * @example\n * ```ts\n * const userId = signal(1);\n *\n * const user = queryResource<User>(\n * () => `/api/users/${userId()}`,\n * { defaultValue: { id: 0, name: 'Anonymous' } },\n * );\n *\n * user.value(); // always User — never undefined, even before the first fetch resolves\n * ```\n */\nexport function queryResource<TResult, TRaw = TResult>(\n request: ResourceRequestFn,\n options: QueryResourceOptions<TResult, TRaw> & {\n defaultValue: NoInfer<TResult>;\n },\n): QueryResourceRef<TResult>;\n\n/**\n * Creates an extended HTTP resource with features like caching, retries, refresh intervals,\n * circuit breaker, and optimistic updates. Without additional options it is equivalent to simply calling `httpResource`.\n *\n * @param request A function that returns the `HttpResourceRequest` or a URL string to be made. This function\n * is called reactively, so the request can change over time. If the function\n * returns `undefined`, the resource is considered \"disabled\" and no request will be made.\n * @param options Configuration options for the resource. These options extend the basic\n * `HttpResourceOptions` and add features like `keepPrevious`, `refresh`, `retry`,\n * `onError`, `circuitBreaker`, and `cache`.\n * @returns An `QueryResourceRef` instance, which extends the basic `HttpResourceRef` with additional features.\n *\n * @example\n * ```ts\n * const userId = signal<number | undefined>(undefined);\n *\n * const user = queryResource<User>(\n * () => userId() ? `/api/users/${userId()}` : undefined,\n * {\n * cache: { ttl: 60_000, staleTime: 10_000 },\n * refresh: 30_000,\n * retry: { max: 3 },\n * },\n * );\n *\n * user.value(); // User | undefined\n * user.status(); // 'idle' | 'loading' | 'resolved' | 'error'\n * user.disabledReason(); // null while enabled; 'offline' / 'circuit-open' / 'no-request' otherwise\n * ```\n */\nexport function queryResource<TResult, TRaw = TResult>(\n request: ResourceRequestFn,\n options?: QueryResourceOptions<TResult, TRaw>,\n): QueryResourceRef<TResult | undefined>;\n\nexport function queryResource<TResult, TRaw = TResult>(\n request: ResourceRequestFn,\n options0?: QueryResourceOptions<TResult, TRaw>,\n): QueryResourceRef<TResult | undefined> {\n // Two-layer option injection: per-call > provideQueryResourceOptions > provideResourceOptions.\n const globalOpts = injectResourceOptions(options0?.injector);\n const queryOpts = injectQueryResourceOptions(options0?.injector);\n\n const options = {\n ...globalOpts,\n ...queryOpts,\n ...options0,\n cache: mergeCacheOptions(queryOpts.cache, options0?.cache),\n circuitBreaker: mergeCircuitBreakerOptions(\n globalOpts.circuitBreaker,\n queryOpts.circuitBreaker,\n options0?.circuitBreaker,\n ),\n retry: mergeRetryOptions(globalOpts.retry, queryOpts.retry, options0?.retry),\n refresh: mergeRefreshOptions(queryOpts.refresh, options0?.refresh),\n } as QueryResourceOptions<TResult, TRaw>;\n\n const cache = injectQueryCache<TResult>(options?.injector);\n\n const destroyRef = options?.injector\n ? options.injector.get(DestroyRef)\n : inject(DestroyRef);\n\n const cb = createCircuitBreaker(\n options?.circuitBreaker === true\n ? undefined\n : (options?.circuitBreaker ?? false),\n options?.injector,\n );\n\n const networkAvailable = injectNetworkStatus();\n\n const eq = options?.triggerOnSameRequest\n ? undefined\n : (options?.equalRequest ?? createEqualRequest());\n\n // Opt-in auto-pausing: `true` reads the ambient Activity boundary (no-op outside\n // one), a predicate is used directly. Composes with the manual `ctx.paused` path.\n const pauseOpt = options?.pause ?? false;\n const externallyPaused: () => boolean =\n pauseOpt === false\n ? () => false\n : typeof pauseOpt === 'function'\n ? pauseOpt\n : options?.injector\n ? runInInjectionContext(options.injector, injectPaused)\n : injectPaused();\n\n const requestCtx: RequestContext = { paused: PAUSED };\n const rawResult = computed(() => request(requestCtx));\n const paused = computed(() => rawResult() === PAUSED || externallyPaused());\n const rawRequest = computed(() => {\n const r = rawResult();\n return r === PAUSED ? undefined : (r ?? undefined);\n });\n\n const disabledReason = computed<DisabledReason | null>(() => {\n if (!networkAvailable()) return 'offline';\n if (cb.isOpen()) return 'circuit-open';\n // Both pause sources report 'no-request' here — ctx.paused makes rawRequest\n // undefined, while the external `pause` option still yields a real request, so it\n // must be checked explicitly. Either way this also stops polling/refresh triggers\n // (their inactive() guard reads disabledReason), while stableRequest below HOLDS\n // the last request so the value is kept (no refetch on resume).\n if (paused() || !rawRequest()) return 'no-request';\n return null;\n });\n\n // While PAUSED, hold the previous request so httpResource sees no change — it keeps its value and\n // does NOT refetch. On resume the request is re-evaluated, so it refetches only if it changed.\n const heldRequest = linkedSignal<\n { req: HttpResourceRequest | undefined; held: boolean },\n HttpResourceRequest | undefined\n >({\n source: () => {\n if (paused()) return { req: undefined, held: true };\n if (disabledReason() !== null) return { req: undefined, held: false };\n const req = rawRequest();\n if (!req) return { req: undefined, held: false };\n if (typeof req === 'string')\n return { req: { method: 'GET', url: req }, held: false };\n return { req, held: false };\n },\n computation: (curr, prev) =>\n curr.held && prev !== undefined ? prev.value : curr.req,\n });\n\n // Dedup via the request-equality (the linkedSignal re-runs on every source tick; this computed\n // is what actually gates httpResource — so an equal/held request never triggers a refetch).\n const stableRequest = computed(\n (): HttpResourceRequest | undefined => heldRequest(),\n {\n equal: (a, b) => {\n if (a === b) return true;\n if (a === undefined || b === undefined) return false;\n if (eq) return eq(a, b);\n return a === b;\n },\n },\n );\n\n const varyHeaders =\n typeof options?.cache === 'object' ? options.cache.varyHeaders : undefined;\n\n const hashFn =\n typeof options?.cache === 'object'\n ? (options.cache.hash ??\n ((r: HttpResourceRequest) => hashRequest(r, varyHeaders)))\n : hashRequest;\n\n const staleTime =\n typeof options?.cache === 'object' ? options.cache.staleTime : 0;\n const ttl =\n typeof options?.cache === 'object' ? options.cache.ttl : undefined;\n\n const cacheKey = computed(() => {\n const r = stableRequest();\n if (!r) return null;\n return hashFn(r);\n });\n\n const bustBrowserCache =\n typeof options?.cache === 'object' &&\n options.cache.bustBrowserCache === true;\n\n const ignoreCacheControl =\n typeof options?.cache === 'object' &&\n options.cache.ignoreCacheControl === true;\n\n const persist =\n typeof options?.cache === 'object' && options.cache.persist === true;\n\n const cachedRequest = options?.cache\n ? computed(() => {\n const r = stableRequest();\n if (!r) return r;\n\n return {\n ...r,\n context: setCacheContext(r.context, {\n staleTime,\n ttl,\n key: cacheKey() ?? hashFn(r),\n bustBrowserCache,\n ignoreCacheControl,\n persist,\n }),\n };\n })\n : stableRequest;\n\n let resource = toResourceObject(\n httpResource<TResult>(cachedRequest, {\n ...options,\n parse: options?.parse as any, // Not my favorite thing to do, but here it is completely safe.\n }) as HttpResourceRef<TResult>,\n );\n\n resource = catchValueError(resource, options?.defaultValue as TResult);\n\n // get full HttpResonse from Cache\n const cachedEvent = cache.getEntryOrKey(cacheKey);\n\n const cacheEntry = linkedSignal<\n CacheEntry<HttpResponse<TResult>> | string | null,\n { key: string; value: TResult | null } | null\n >({\n source: () => cachedEvent(),\n computation: (entry, prev) => {\n if (!entry) return null;\n\n if (\n typeof entry === 'string' &&\n prev &&\n prev.value !== null &&\n prev.value.key === entry\n ) {\n return prev.value;\n }\n\n if (typeof entry === 'string') return { key: entry, value: null };\n\n if (!(entry.value instanceof HttpResponse))\n return { key: entry.key, value: null };\n\n return {\n value: entry.value.body,\n key: entry.key,\n };\n },\n });\n\n // A disabled (offline / circuit-open / no-request) or PAUSED resource must not poll\n // or react to focus/reconnect.\n resource = refresh(\n resource,\n destroyRef,\n options?.refresh,\n () => disabledReason() !== null,\n {\n injector: options?.injector ?? inject(Injector),\n visibility: injectPageVisibility(),\n online: networkAvailable,\n },\n );\n resource = retryOnError(resource, options?.retry, options?.onError);\n\n resource = persistResourceValues<TResult>(\n resource,\n options?.keepPrevious,\n options?.equal,\n );\n\n const set = (value: TResult) => {\n resource.value.set(value);\n const k = untracked(cacheKey);\n if (options?.cache && k)\n cache.store(\n k,\n // statusText omitted — deprecated in Angular (HttpResponse defaults it)\n new HttpResponse({\n body: value,\n status: 200,\n }),\n staleTime,\n ttl,\n persist,\n );\n };\n\n const update = (updater: (value: TResult) => TResult) => {\n // baseline on the COMPOSED value (cache-preferring): the cache entry can be newer\n // than resource.value (cross-tab sync, another instance's set)\n set(updater(untracked(value)));\n };\n\n const value = options?.cache\n ? toWritable(\n computed((): TResult => cacheEntry()?.value ?? resource.value()),\n set,\n update,\n )\n : resource.value;\n\n // iterate circuit breaker state, is effect as a computed would cause a circular dependency (resource -> cb -> resource)\n const cbEffectRef = effect(() => {\n const status = resource.status();\n if (status === 'error') cb.fail(untracked(resource.error));\n else if (status === 'resolved') cb.success();\n });\n\n const client = options?.injector\n ? options.injector.get(HttpClient)\n : inject(HttpClient);\n\n const ref: QueryResourceRef<TResult | undefined> = {\n ...resource,\n value,\n set,\n update,\n statusCode: linkedSignal(resource.statusCode),\n headers: linkedSignal(resource.headers),\n disabled: computed(() => disabledReason() !== null),\n disabledReason,\n reload: () => {\n cb.halfOpen(); // open the circuit for manual reload\n return resource.reload();\n },\n destroy: () => {\n cbEffectRef.destroy();\n cb.destroy();\n resource.destroy();\n },\n prefetch: async (partial) => {\n if (!options?.cache || hasSlowConnection()) return Promise.resolve();\n\n const request = untracked(stableRequest);\n\n const partialReq =\n typeof partial === 'string' ? { method: 'GET', url: partial } : partial;\n\n const prefetchRequest = {\n ...request,\n ...partialReq,\n };\n if (!prefetchRequest.url) return Promise.resolve();\n\n const key = hashFn({\n ...prefetchRequest,\n url: prefetchRequest.url ?? '',\n });\n\n const found = cache.getUntracked(key);\n if (found && !found.isStale) return Promise.resolve();\n\n try {\n await firstValueFrom(\n client.request(prefetchRequest.method ?? 'GET', prefetchRequest.url, {\n ...prefetchRequest,\n referrerPolicy: prefetchRequest.referrerPolicy as\n | ReferrerPolicy\n | undefined,\n credentials: prefetchRequest.credentials as\n | RequestCredentials\n | undefined,\n priority: prefetchRequest.priority as RequestPriority | undefined,\n cache: prefetchRequest.cache as RequestCache | undefined,\n mode: prefetchRequest.mode as RequestMode | undefined,\n redirect: prefetchRequest.redirect as RequestRedirect | undefined,\n context: setCacheContext(prefetchRequest.context, {\n staleTime,\n ttl,\n key: hashFn({\n ...prefetchRequest,\n url: prefetchRequest.url ?? '',\n }),\n bustBrowserCache,\n ignoreCacheControl,\n persist,\n }),\n headers: prefetchRequest.headers as HttpHeaders,\n observe: 'response',\n }),\n );\n\n return;\n } catch (err) {\n if (isDevMode()) console.error('Prefetch failed: ', err);\n return;\n }\n },\n };\n\n // Auto-register into the nearest transition scope if the (merged) options ask for it.\n applyResourceRegistration(\n ref as ResourceRef<unknown>,\n options.register,\n options?.injector,\n );\n\n return ref;\n}\n","import { type HttpResourceRequest } from '@angular/common/http';\nimport {\n computed,\n effect,\n inject,\n Injector,\n signal,\n untracked,\n type Signal,\n} from '@angular/core';\nimport {\n queryResource,\n type PAUSED,\n type QueryResourceOptions,\n type QueryResourceRef,\n type RequestContext,\n} from './query-resource';\n\n/**\n * Context passed to an infinite query's request fn: the {@link RequestContext}\n * (so the fn can return `ctx.paused` to pause the resource, exactly like\n * `queryResource`) plus the `pageParam` addressing the page to load.\n */\nexport type InfiniteRequestContext<TPageParam> = RequestContext & {\n pageParam: TPageParam;\n};\n\n/**\n * Options for {@link infiniteQueryResource}. Extends {@link QueryResourceOptions}\n * (minus `defaultValue` — the aggregate value is always the `pages` array) with the\n * pagination contract.\n */\nexport type InfiniteQueryResourceOptions<\n TPage,\n TRaw = TPage,\n TPageParam = unknown,\n> = Omit<QueryResourceOptions<TPage, TRaw>, 'defaultValue'> & {\n /** The page param the FIRST page is requested with (e.g. `0`, `1`, or a cursor seed). */\n initialPageParam: TPageParam;\n /**\n * Derives the NEXT page's param from the freshly loaded page (and all pages so far).\n * Return `null`/`undefined` to signal \"no more pages\" — `hasNextPage` flips false\n * and `fetchNextPage()` becomes a no-op.\n *\n * @example\n * // cursor-based\n * getNextPageParam: (last) => last.nextCursor;\n * // offset-based\n * getNextPageParam: (last, all) => (last.items.length < PAGE_SIZE ? null : all.length);\n */\n getNextPageParam: (\n lastPage: NoInfer<TPage>,\n allPages: NoInfer<TPage>[],\n ) => TPageParam | null | undefined;\n};\n\n/**\n * A paginated query resource. `pages` accumulates every loaded page in order;\n * `fetchNextPage()` loads the next one (no-op while one is in flight or when\n * exhausted). Inherits the underlying query's `status`/`error`/`isLoading` and\n * its features (cache, retry, circuit breaker, refresh).\n */\nexport type InfiniteQueryResourceRef<TPage> = {\n /** Every page loaded so far, in load order. */\n pages: Signal<TPage[]>;\n /** `true` once the first page is in and `getNextPageParam` keeps producing params. */\n hasNextPage: Signal<boolean>;\n /** `true` while a page request beyond the first is in flight. */\n isFetchingNextPage: Signal<boolean>;\n /** The underlying query's loading state (first page + subsequent pages). */\n isLoading: Signal<boolean>;\n status: QueryResourceRef<TPage | undefined>['status'];\n error: QueryResourceRef<TPage | undefined>['error'];\n /** Loads the next page. No-op while loading or when `hasNextPage()` is false. */\n fetchNextPage: () => void;\n /** Reloads the CURRENT page param — the freshly loaded page replaces its slot. */\n reload: () => boolean;\n /** Drops all pages and refetches from `initialPageParam`. */\n reset: () => void;\n destroy: () => void;\n};\n\n/**\n * Creates a paginated HTTP resource over {@link queryResource}: one page request at a\n * time, accumulated into a `pages` signal — cursor- and offset-based pagination both\n * fit through `getNextPageParam`. Each page request inherits the full queryResource\n * feature set (caching per page, retries, circuit breaker, refresh triggers).\n *\n * @example\n * ```ts\n * const posts = infiniteQueryResource<PostPage, PostPage, number>(\n * ({ pageParam }) => ({ url: '/api/posts', params: { page: pageParam } }),\n * {\n * initialPageParam: 0,\n * getNextPageParam: (last, all) => (last.items.length < 20 ? null : all.length),\n * cache: true,\n * },\n * );\n *\n * // template:\n * // @for (page of posts.pages(); track $index) { ... }\n * // <button (click)=\"posts.fetchNextPage()\" [disabled]=\"!posts.hasNextPage()\">More</button>\n * const flat = computed(() => posts.pages().flatMap((p) => p.items));\n * ```\n */\nexport function infiniteQueryResource<\n TPage,\n TRaw = TPage,\n TPageParam = unknown,\n>(\n request: (\n ctx: InfiniteRequestContext<TPageParam>,\n ) => HttpResourceRequest | string | undefined | typeof PAUSED,\n options: InfiniteQueryResourceOptions<TPage, TRaw, TPageParam>,\n): InfiniteQueryResourceRef<TPage> {\n const { initialPageParam, getNextPageParam, ...rest } = options;\n const injector = options.injector ?? inject(Injector);\n\n const pageParam = signal<TPageParam>(initialPageParam);\n // pages keyed by the param that produced them, so a reload of an already-loaded\n // page REPLACES its slot instead of appending a duplicate\n const loaded = signal<{ param: TPageParam; page: TPage }[]>([]);\n\n const resource = queryResource<TPage, TRaw>(\n // forward queryResource's own context so the fn can return ctx.paused —\n // pausing holds the loaded pages and stops page fetches until unpaused\n (qctx) => request({ ...qctx, pageParam: pageParam() }),\n { ...rest, injector } as QueryResourceOptions<TPage, TRaw>,\n );\n\n const appendRef = effect(\n () => {\n if (resource.status() !== 'resolved') return;\n const page = resource.value();\n if (page === undefined) return;\n\n untracked(() => {\n const param = pageParam();\n loaded.update((list) => {\n const idx = list.findIndex((e) => Object.is(e.param, param));\n if (idx >= 0) {\n const copy = [...list];\n copy[idx] = { param, page };\n return copy;\n }\n return [...list, { param, page }];\n });\n });\n },\n { injector },\n );\n\n const pages = computed(() => loaded().map((e) => e.page));\n\n const nextPageParam = computed(() => {\n const all = pages();\n if (all.length === 0) return null;\n return getNextPageParam(all[all.length - 1], all) ?? null;\n });\n\n const hasNextPage = computed(() => nextPageParam() !== null);\n\n const fetchNextPage = () => {\n if (untracked(resource.isLoading)) return; // one page at a time\n const next = untracked(nextPageParam);\n if (next === null) return;\n pageParam.set(next);\n };\n\n const reset = () => {\n loaded.set([]);\n if (Object.is(untracked(pageParam), initialPageParam)) {\n resource.reload(); // param unchanged — force the refetch\n } else {\n pageParam.set(initialPageParam);\n }\n };\n\n return {\n pages,\n hasNextPage,\n isFetchingNextPage: computed(\n () => resource.isLoading() && loaded().length > 0,\n ),\n isLoading: resource.isLoading,\n status: resource.status,\n error: resource.error,\n fetchNextPage,\n reload: () => resource.reload(),\n reset,\n destroy: () => {\n appendRef.destroy();\n resource.destroy();\n },\n };\n}\n","import { type HttpResourceRequest } from '@angular/common/http';\nimport { computed, inject, Injector, signal, untracked } from '@angular/core';\nimport { nestedEffect } from '@mmstack/primitives';\nimport {\n queryResource,\n type QueryResourceOptions,\n type QueryResourceRef,\n} from './query-resource';\n\n/**\n * A reference to a manually triggered query resource. Extends\n * {@link QueryResourceRef} with a `trigger()` method that runs the request\n * imperatively and returns a `Promise<TResult>`. Useful when a request should\n * only happen on user action (search submit, button click) rather than on\n * every reactive change of the request inputs.\n *\n * @example\n * ```ts\n * const search = manualQueryResource<SearchResults>(() => ({\n * url: '/api/search',\n * params: { q: query() },\n * }));\n *\n * async function onSubmit() {\n * try {\n * const results = await search.trigger();\n * showResults(results);\n * } catch (err) {\n * toast.error('Search failed');\n * }\n * }\n * ```\n *\n * @see QueryResourceRef\n */\nexport type ManualQueryResourceRef<TResult> = QueryResourceRef<TResult> & {\n trigger: (\n req?: HttpResourceRequest | string,\n injector?: Injector,\n ) => Promise<TResult>;\n};\n\n/**\n * Creates a manually triggered HTTP resource with features like caching, retries, refresh intervals, circuit breaker, and optimistic updates. Without additional options it is equivalent to simply calling `httpResource`.\n * This overload is for when a `defaultValue` is provided, ensuring that the resource's value is always defined.\n * @param request A function that returns the `HttpResourceRequest` or a URL string to be made. This function\n * is called reactively, so the request can change over time. If the function\n * returns `undefined`, the resource is considered \"disabled\" and no request will be made.\n * @param options Configuration options for the resource. These options extend the basic\n * `HttpResourceOptions` and add features like `keepPrevious`, `refresh`, `retry`,\n * `onError`, `circuitBreaker`, and `cache`. Additionally, when a `defaultValue` is provided, the resource's value will always be defined, even if the underlying HTTP request fails or is disabled.\n * @returns An `ManualQueryResourceRef` instance, which extends the basic `QueryResourceRef` with additional features.\n *\n * @example\n * ```ts\n * const search = manualQueryResource<SearchResults>(\n * () => ({ url: '/api/search', params: { q: query() } }),\n * { defaultValue: { hits: [], total: 0 } },\n * );\n *\n * // search.value() is always SearchResults (never undefined) thanks to defaultValue.\n * const results = await search.trigger();\n * ```\n */\nexport function manualQueryResource<TResult, TRaw = TResult>(\n request: () => HttpResourceRequest | string | undefined | void,\n options: QueryResourceOptions<TResult, TRaw> & {\n defaultValue: NoInfer<TResult>;\n },\n): ManualQueryResourceRef<TResult>;\n\n/**\n * Creates a manually triggered extended HTTP resource with features like caching, retries, refresh intervals,\n * circuit breaker, and optimistic updates. Without additional options it is equivalent to simply calling `httpResource`.\n *\n * @param request A function that returns the `HttpResourceRequest` or a URL string to be made. This function\n * is called reactively, so the request can change over time. If the function\n * returns `undefined`, the resource is considered \"disabled\" and no request will be made.\n * @param options Configuration options for the resource. These options extend the basic\n * `HttpResourceOptions` and add features like `keepPrevious`, `refresh`, `retry`,\n * `onError`, `circuitBreaker`, and `cache`.\n * @returns An `ManualQueryResourceRef` instance, which extends the basic `QueryResourceRef` with additional features.\n *\n * @example\n * ```ts\n * const exportReport = manualQueryResource<Report>(() => ({\n * url: '/api/reports/export',\n * params: { range: range() },\n * }));\n *\n * async function onExportClick() {\n * try {\n * const report = await exportReport.trigger();\n * download(report);\n * } catch (err) {\n * toast.error('Export failed');\n * }\n * }\n * ```\n */\nexport function manualQueryResource<TResult, TRaw = TResult>(\n request: () => HttpResourceRequest | string | undefined | void,\n options?: QueryResourceOptions<TResult, TRaw>,\n): ManualQueryResourceRef<TResult | undefined>;\n\nexport function manualQueryResource<TResult, TRaw = TResult>(\n request: () => HttpResourceRequest | string | undefined | void,\n options?: QueryResourceOptions<TResult, TRaw>,\n): ManualQueryResourceRef<TResult | undefined> {\n const trigger = signal<{\n epoch: number;\n override?: HttpResourceRequest | string;\n }>(\n { epoch: 0 },\n {\n equal: (a, b) => a.epoch === b.epoch,\n },\n );\n\n const injector = options?.injector ?? inject(Injector);\n\n const req = computed(\n () => {\n const state = trigger();\n if (state.epoch === 0) return;\n if (state.override) return state.override;\n\n return untracked(request);\n },\n {\n equal: () => false,\n },\n );\n\n const resource = queryResource(req, options);\n\n // Shared across trigger() calls: a per-call watcher could observe the PREVIOUS\n // request's `resolved` status before this trigger's load flips the resource to\n // loading (effect ordering within a flush is unspecified) and resolve with stale\n // data; concurrent triggers would also cross-resolve each other's promises.\n let pending: {\n res: (value: TResult) => void;\n rej: (err: unknown) => void;\n }[] = [];\n let watcher: { destroy: () => void } | null = null;\n\n return {\n ...resource,\n trigger: (override, injectorOverride) => {\n trigger.update((s) => ({\n epoch: s.epoch + 1,\n override,\n }));\n\n return new Promise<TResult>((res, rej) => {\n if (untracked(req) === undefined) {\n // the request fn produced nothing — no load will ever start, so a watcher\n // would hang this promise forever\n rej(\n new Error(\n '[@mmstack/resource]: trigger() produced no request (the request fn returned undefined)',\n ),\n );\n return;\n }\n\n pending.push({ res, rej });\n\n // an active watcher (concurrent trigger) settles ALL pending promises with\n // the final result of the latest request — TanStack-style latest-wins\n if (watcher) return;\n\n // only accept a settle AFTER the load for this trigger has been observed —\n // the pre-trigger status may still be a stale `resolved`/`error`\n let sawLoading = false;\n\n watcher = nestedEffect(\n () => {\n const status = resource.status();\n\n if (status === 'loading' || status === 'reloading') {\n sawLoading = true;\n return;\n }\n if (!sawLoading) return;\n\n if (status === 'resolved' || status === 'error') {\n const settled = pending;\n pending = [];\n watcher?.destroy();\n watcher = null;\n\n if (status === 'resolved') {\n const value = untracked(resource.value) as TResult;\n settled.forEach((p) => p.res(value));\n } else {\n const err = untracked(resource.error);\n settled.forEach((p) => p.rej(err));\n }\n }\n },\n { injector: injectorOverride ?? injector },\n );\n });\n },\n };\n}\n","import { type HttpResourceRequest } from '@angular/common/http';\nimport {\n computed,\n DestroyRef,\n effect,\n inject,\n InjectionToken,\n type Injector,\n isDevMode,\n linkedSignal,\n type Provider,\n type ResourceRef,\n type Signal,\n signal,\n untracked,\n type ValueEqualityFn,\n} from '@angular/core';\nimport { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';\nimport { catchError, combineLatestWith, filter, map, of } from 'rxjs';\nimport {\n applyResourceRegistration,\n injectResourceOptions,\n provideTypedResourceOptions,\n} from './options';\nimport {\n queryResource,\n type QueryResourceOptions,\n type QueryResourceRef,\n} from './query-resource';\nimport {\n createCircuitBreaker,\n createEqualRequest,\n injectQueryCache,\n mergeCircuitBreakerOptions,\n mergeRetryOptions,\n} from './util';\n\nconst NULL_VALUE = Symbol('@mmstack/resource:null');\n\n/**\n * @internal\n * Helper type for inferring the request body type based on the HTTP method.\n */\ntype NextRequest<\n TMethod extends HttpResourceRequest['method'],\n TMutation,\n> = TMethod extends 'DELETE' | 'delete'\n ? Omit<HttpResourceRequest, 'body' | 'method'> & { method: TMethod }\n : Omit<HttpResourceRequest, 'body' | 'method'> & {\n body: TMutation;\n method: TMethod;\n };\n\n/**\n * @internal\n * Helper type for tracking mutation status.\n */\ntype StatusResult<TResult> =\n | {\n status: 'error';\n error: unknown;\n }\n | {\n status: 'resolved';\n value: TResult;\n };\n\n/**\n * Options for configuring a `mutationResource`. Inherits from\n * `QueryResourceOptions` (minus options that don't apply to mutations:\n * `equal`, `keepPrevious`, `refresh`, `cache`) and adds lifecycle callbacks\n * (`onMutate`, `onError`, `onSuccess`, `onSettled`) for managing optimistic\n * updates, rollback, and side effects.\n *\n * @typeParam TResult - The type of the expected result from the mutation.\n * @typeParam TRaw - The raw response type from the HTTP request (defaults to TResult).\n * @typeParam TCTX - The type of the context value returned by `onMutate`.\n *\n * @example\n * ```ts\n * const options: MutationResourceOptions<User, User, Partial<User>, { previous: User | null }> = {\n * onMutate: (patch) => {\n * const previous = current();\n * current.update((u) => (u ? { ...u, ...patch } : u)); // optimistic\n * return { previous };\n * },\n * onError: (_err, { previous }) => current.set(previous), // rollback\n * onSuccess: (saved) => toast.success(`Updated ${saved.name}`),\n * queue: true, // serialize requests when offline / circuit open\n * };\n * ```\n */\nexport type MutationResourceOptions<\n TResult,\n TRaw = TResult,\n TMutation = TResult,\n TCTX = void,\n TICTX = TCTX,\n TError = unknown,\n> = Omit<\n QueryResourceOptions<TResult, TRaw>,\n 'equal' | 'onError' | 'keepPrevious' | 'refresh' | 'cache' | 'pause' // we can't keep previous values, refresh, cache or auto-pause mutations as they are meant to be one-off commands\n> & {\n /**\n * A callback function that is called before the mutation request is made.\n * @param value The value being mutated (the `body` of the request).\n * @returns An optional context value that will be passed to the `onError`, `onSuccess`, and `onSettled` callbacks. This is useful for storing\n * information needed during the mutation lifecycle, such as previous values for optimistic updates or rollback.\n */\n onMutate?: (value: TMutation, initialCTX?: TICTX) => TCTX;\n /**\n * A callback function that is called if the mutation request fails.\n * @param error The error that occurred.\n * @param ctx The context value returned by the `onMutate` callback (or `undefined` if `onMutate` was not provided or returned `undefined`).\n */\n onError?: (error: TError, ctx: NoInfer<TCTX>) => void;\n /**\n * A callback function that is called if the mutation request succeeds.\n * @param value The result of the mutation (the parsed response body).\n * @param ctx The context value returned by the `onMutate` callback (or `undefined` if `onMutate` was not provided or returned `undefined`).\n */\n onSuccess?: (value: TResult, ctx: NoInfer<TCTX>) => void;\n /**\n * A callback function that is called when the mutation request settles (either succeeds or fails).\n * @param ctx The context value returned by the `onMutate` callback (or `undefined` if `onMutate` was not provided or returned `undefined`).\n */\n onSettled?: (ctx: NoInfer<TCTX>) => void;\n /**\n * Whether to queue the mutation requests and execute them in series. For example if network is unavailable or circuit breaker is open.\n * @default false\n */\n queue?: boolean;\n /**\n * Cache entries to invalidate after a SUCCESSFUL mutation — the declarative\n * alternative to calling `injectQueryCache().invalidatePrefix(...)` in `onSuccess`.\n *\n * Each string is a URL prefix matched against auto-generated `GET` cache keys\n * (`GET:${url}:...`): `'/api/posts'` invalidates `/api/posts` with any query params,\n * plus subpaths like `/api/posts/123` — and all `varyHeaders` variants of each.\n * Note that plain prefix matching also catches sibling paths sharing the prefix\n * (`/api/posts-archive`); pass `'/api/posts/'` or the exact URL to narrow.\n *\n * Entries keyed by a custom `hash` function follow that function's shape, not the\n * auto-key shape — invalidate those manually via `injectQueryCache().invalidateWhere`.\n *\n * The function form receives the mutation result and the mutated value:\n * ```ts\n * invalidates: (saved) => [`/api/posts`, `/api/users/${saved.authorId}`]\n * ```\n */\n invalidates?:\n | string[]\n | ((value: NoInfer<TResult>, mutation: NoInfer<TMutation>) => string[]);\n equal?: ValueEqualityFn<TMutation>;\n};\n\nconst MUTATION_RESOURCE_OPTIONS = new InjectionToken<\n Partial<MutationResourceOptions<any, any, any, any, any, any>>\n>('@mmstack/resource:mutation-resource-options', { factory: () => ({}) });\n\n/**\n * Layer 2 (mutation): default options for every `mutationResource`, inheriting + overriding the\n * common defaults from `provideResourceOptions`. Per-call options override these in turn.\n */\nexport function provideMutationResourceOptions(\n valueOrFn:\n | Partial<MutationResourceOptions<any, any, any, any, any, any>>\n | (() => Partial<MutationResourceOptions<any, any, any, any, any, any>>),\n): Provider {\n return provideTypedResourceOptions(MUTATION_RESOURCE_OPTIONS, valueOrFn);\n}\n\nfunction injectMutationResourceOptions(\n injector?: Injector,\n): Partial<MutationResourceOptions<any, any, any, any, any, any>> {\n return injector\n ? injector.get(MUTATION_RESOURCE_OPTIONS)\n : inject(MUTATION_RESOURCE_OPTIONS);\n}\n\n/**\n * Represents a mutation resource created by `mutationResource`. Extends\n * `QueryResourceRef` but strips methods that don't make sense for one-off\n * writes (`prefetch`, `value`, `hasValue`, `set`, `update`) and adds `mutate()`\n * for triggering a mutation plus `current()` for tracking the in-flight value.\n *\n * @typeParam TResult - The type of the expected result from the mutation.\n *\n * @example\n * ```ts\n * const updateUser = mutationResource<User, User, Partial<User>>(...);\n *\n * effect(() => console.log('mutating:', updateUser.current()));\n * effect(() => {\n * if (updateUser.status() === 'error') toast.error(updateUser.error());\n * });\n *\n * updateUser.mutate({ name: 'Alice' });\n * ```\n */\nexport type MutationResourceRef<\n TResult,\n TMutation = TResult,\n TICTX = void,\n> = Omit<\n QueryResourceRef<TResult>,\n 'prefetch' | 'value' | 'hasValue' | 'set' | 'update' // we don't allow manually viewing the returned data or updating it manually, prefetching a mutation also doesn't make any sense\n> & {\n /**\n * Executes the mutation.\n *\n * @param value The mutation value (usually the request body).\n * @param ctx An optional initial context value that will be passed to the `onMutate` callback.\n */\n mutate: (value: TMutation, ctx?: TICTX) => void;\n /**\n * A signal that holds the current mutation request, or `null` if no mutation is in progress.\n * This can be useful for tracking the state of the mutation or for displaying loading indicators.\n */\n current: Signal<TMutation | null>;\n};\n\n/**\n * Creates a resource for performing mutations (e.g., POST, PUT, PATCH, DELETE requests).\n * Unlike `queryResource`, `mutationResource` is designed for one-off operations that change data.\n * It does *not* cache responses and does not provide a `value` signal. Instead, it focuses on\n * managing the mutation lifecycle (pending, error, success) and provides callbacks for handling\n * these states.\n *\n * @param request A function that returns the base `HttpResourceRequest` to be made. This function is called reactively. The parameter is the mutation value provided by the `mutate` method.\n * @param options Configuration options for the mutation resource. This includes callbacks\n * for `onMutate`, `onError`, `onSuccess`, and `onSettled`.\n * @typeParam TResult - The type of the expected result from the mutation.\n * @typeParam TRaw - The raw response type from the HTTP request (defaults to TResult).\n * @typeParam TMutation - The type of the mutation value (the request body).\n * @typeParam TICTX - The type of the initial context value passed to `onMutate`.\n * @typeParam TCTX - The type of the context value returned by `onMutate`.\n * @typeParam TMethod - The HTTP method to be used for the mutation (defaults to `HttpResourceRequest['method']`).\n * @returns A `MutationResourceRef` instance, which provides methods for triggering the mutation\n * and observing its status.\n *\n * @example\n * ```ts\n * // Basic PATCH mutation\n * const updateUser = mutationResource<User, User, Partial<User>>(\n * (body) => ({ url: `/api/users/${userId()}`, method: 'PATCH', body }),\n * {\n * onSuccess: (saved) => toast.success(`Updated ${saved.name}`),\n * onError: (err) => toast.error(err),\n * },\n * );\n *\n * updateUser.mutate({ name: 'Alice' });\n * ```\n *\n * @example\n * ```ts\n * // Optimistic update with rollback via the `ctx` returned from `onMutate`\n * const updateUser = mutationResource<User, User, Partial<User>, { prev: User | null }>(\n * (body) => ({ url: `/api/users/${userId()}`, method: 'PATCH', body }),\n * {\n * onMutate: (patch) => {\n * const prev = current();\n * current.update((u) => (u ? { ...u, ...patch } : u));\n * return { prev };\n * },\n * onError: (_err, { prev }) => current.set(prev),\n * },\n * );\n * ```\n */\nexport function mutationResource<\n TResult,\n TRaw = TResult,\n TMutation = TResult,\n TCTX = void,\n TICTX = TCTX,\n TMethod extends HttpResourceRequest['method'] = HttpResourceRequest['method'],\n>(\n request: (\n params: TMutation,\n ) => Omit<NextRequest<TMethod, TMutation>, 'body'> | undefined | void,\n options0: MutationResourceOptions<TResult, TRaw, TMutation, TCTX, TICTX> = {},\n): MutationResourceRef<TResult, TMutation, TICTX> {\n // Two-layer option injection: per-call > provideMutationResourceOptions > provideResourceOptions.\n const globalOpts = injectResourceOptions(options0.injector);\n const mutOpts = injectMutationResourceOptions(options0.injector);\n\n const options = {\n ...globalOpts,\n ...mutOpts,\n ...options0,\n circuitBreaker: mergeCircuitBreakerOptions(\n globalOpts.circuitBreaker,\n mutOpts.circuitBreaker,\n options0?.circuitBreaker,\n ),\n retry: mergeRetryOptions(globalOpts.retry, mutOpts.retry, options0?.retry),\n } as MutationResourceOptions<TResult, TRaw, TMutation, TCTX, TICTX>;\n\n // `register` is pulled out (and forced off on the inner query below) so the mutation ref is\n // the only thing registered into the transition scope, not its internal query resource.\n const {\n onMutate,\n onError,\n onSuccess,\n onSettled,\n equal,\n register,\n equalRequest,\n invalidates,\n ...rest\n } = options;\n\n const cache = invalidates ? injectQueryCache(options.injector) : undefined;\n\n const requestEqual = equalRequest ?? createEqualRequest(equal);\n\n // A mutation is an imperative command, so `triggerOnSameRequest` means \"fire on EVERY mutate(),\n // even with an identical body\". By default we dedup an identical value/request while one is in\n // flight (double-click protection); when this is set, both the `next` and `req` dedup are bypassed\n // so a repeat click isn't silently swallowed mid-flight. (Otherwise it'd be dropped until `next`\n // resets to NULL on settle — the \"every other click\" symptom.)\n const triggerOnSame = options.triggerOnSameRequest ?? false;\n\n const eq = equal ?? Object.is;\n const next = signal<TMutation | typeof NULL_VALUE>(NULL_VALUE, {\n equal: (a, b) => {\n if (a === NULL_VALUE && b === NULL_VALUE) return true;\n if (a === NULL_VALUE || b === NULL_VALUE) return false;\n if (triggerOnSame) return false;\n return eq(a, b);\n },\n });\n\n const queue = signal<[TMutation, TICTX | undefined][]>([]);\n\n let ctx: TCTX = undefined as TCTX;\n\n const queueRef = effect(\n () => {\n const nextInQueue = queue().at(0);\n if (nextInQueue === undefined || next() !== NULL_VALUE) return;\n queue.update((q) => q.slice(1));\n const [value, ictx] = nextInQueue;\n try {\n ctx = onMutate?.(value, ictx) as TCTX;\n next.set(value);\n } catch (mutationErr) {\n ctx = undefined as TCTX;\n next.set(NULL_VALUE);\n if (isDevMode())\n console.error(\n '[@mmstack/resource]: error thrown in onMutate hook, mutation was not applied',\n mutationErr,\n );\n }\n },\n { injector: options.injector },\n );\n\n const req = computed(\n (): HttpResourceRequest | undefined => {\n const nr = next();\n if (nr === NULL_VALUE) return;\n\n return request(nr) ?? undefined;\n },\n {\n equal: (a, b) => {\n if (a === undefined && b === undefined) return true;\n if (a === undefined || b === undefined) return false;\n if (triggerOnSame) return false;\n return requestEqual(a, b);\n },\n },\n );\n\n const lastValue = linkedSignal<\n TMutation | typeof NULL_VALUE,\n TMutation | typeof NULL_VALUE\n >({\n source: next,\n computation: (next, prev) => {\n if (next === NULL_VALUE && !!prev) return prev.value;\n return next;\n },\n });\n\n const lastValueRequest = computed(\n (): HttpResourceRequest | undefined => {\n const nr = lastValue();\n if (nr === NULL_VALUE) return;\n\n return request(nr) ?? undefined;\n },\n {\n equal: (a, b) => {\n if (a === b) return true;\n if (a === undefined || b === undefined) return false;\n return requestEqual(a, b);\n },\n },\n );\n\n const cb = createCircuitBreaker(\n options?.circuitBreaker === true\n ? undefined\n : (options?.circuitBreaker ?? false),\n options?.injector,\n );\n\n const resource = queryResource<TResult, TRaw>(req, {\n ...rest,\n register: false, // the mutation ref handles registration; never register the inner query\n circuitBreaker: cb,\n equalRequest: requestEqual,\n defaultValue: NULL_VALUE as unknown as TResult, // doesnt matter since .value is not accessible\n });\n\n const destroyRef = options.injector\n ? options.injector.get(DestroyRef)\n : inject(DestroyRef);\n\n const error$ = toObservable(resource.error, { injector: options.injector });\n const value$ = toObservable(resource.value, {\n injector: options.injector,\n }).pipe(catchError(() => of(NULL_VALUE)));\n\n const statusSub = toObservable(resource.status, {\n injector: options.injector,\n })\n .pipe(\n combineLatestWith(error$, value$),\n map(\n ([status, error, value]): StatusResult<TResult> | typeof NULL_VALUE => {\n if (status === 'error' && error) {\n return {\n status: 'error',\n error,\n };\n }\n\n if (status === 'resolved' && value !== NULL_VALUE) {\n return {\n status: 'resolved',\n value,\n };\n }\n\n return NULL_VALUE;\n },\n ),\n filter((v) => v !== NULL_VALUE),\n takeUntilDestroyed(destroyRef),\n )\n .subscribe((result) => {\n if (result.status === 'error') onError?.(result.error, ctx);\n else {\n onSuccess?.(result.value, ctx);\n\n if (cache && invalidates) {\n const mutation = untracked(lastValue);\n const prefixes =\n typeof invalidates === 'function'\n ? invalidates(\n result.value,\n (mutation === NULL_VALUE ? undefined : mutation) as TMutation,\n )\n : invalidates;\n\n // auto-keys are `${method}:${url}:...` — a `GET:`-prefixed url prefix hits\n // the url with any params/subpaths and every varyHeaders variant\n for (const prefix of prefixes)\n cache.invalidatePrefix(`GET:${prefix}`);\n }\n }\n\n onSettled?.(ctx);\n ctx = undefined as TCTX;\n next.set(NULL_VALUE);\n });\n\n const shouldQueue = options.queue ?? false;\n\n const ref: MutationResourceRef<TResult, TMutation, TICTX> = {\n ...resource,\n destroy: () => {\n // queue first — a late queue flush must not poke an already-destroyed resource\n queueRef.destroy();\n statusSub.unsubscribe();\n resource.destroy();\n },\n mutate: (value, ictx) => {\n if (shouldQueue) {\n return queue.update((q) => [...q, [value, ictx]]);\n } else {\n // latest-wins: a mutation already in flight gets superseded (its request is\n // aborted by the request change), so its onSuccess/onError will never fire —\n // settle its context NOW so optimistic state can be rolled back/cleaned up\n if (untracked(next) !== NULL_VALUE) {\n if (isDevMode())\n console.warn(\n '[@mmstack/resource]: mutate() called while another mutation was in flight — the previous mutation was superseded (latest-wins) and its onSettled was invoked. Use `queue: true` for sequential mutations.',\n );\n try {\n onSettled?.(ctx);\n } catch (settleErr) {\n if (isDevMode())\n console.error(\n '[@mmstack/resource]: error thrown in onSettled hook for a superseded mutation',\n settleErr,\n );\n }\n ctx = undefined as TCTX;\n }\n\n try {\n ctx = onMutate?.(value, ictx) as TCTX;\n next.set(value);\n } catch (mutationErr) {\n ctx = undefined as TCTX;\n next.set(NULL_VALUE);\n if (isDevMode())\n console.error(\n '[@mmstack/resource]: error thrown in onMutate hook, mutation was not applied',\n mutationErr,\n );\n }\n }\n },\n current: computed(() => {\n const nv = next();\n return nv === NULL_VALUE ? null : nv;\n }),\n // redeclare disabled with last value so that it is not affected by the resource's internal disablement logic\n disabled: computed(() => cb.isOpen() || lastValueRequest() === undefined),\n };\n\n applyResourceRegistration(\n ref as unknown as ResourceRef<unknown>,\n register,\n options0.injector,\n );\n\n return ref;\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mmstack/resource",
3
- "version": "22.1.3",
3
+ "version": "22.1.4",
4
4
  "keywords": [
5
5
  "angular",
6
6
  "signals",