{"version":3,"file":"ngwr-storage.mjs","sources":["../../../projects/lib/storage/storage-config.ts","../../../projects/lib/storage/storage-engine.ts","../../../projects/lib/storage/storage.ts","../../../projects/lib/storage/provide-wr-storage.ts","../../../projects/lib/storage/ngwr-storage.ts"],"sourcesContent":["/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { InjectionToken } from '@angular/core';\n\nimport type { WrStorageConfigResolved } from './interfaces';\n\nexport const DEFAULT_WR_STORAGE_CONFIG: WrStorageConfigResolved = {\n  prefix: '',\n  json: true,\n  ttl: 0,\n};\n\nexport const WR_STORAGE_CONFIG = new InjectionToken<WrStorageConfigResolved>('WR_STORAGE_CONFIG', {\n  providedIn: 'root',\n  factory: () => DEFAULT_WR_STORAGE_CONFIG,\n});\n\nexport type { WrStorageConfig, WrStorageConfigResolved } from './interfaces';\n","/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { InjectionToken } from '@angular/core';\n\nimport type { WrStorageEngine } from './interfaces';\n\n/**\n * Probe a `Storage` candidate to confirm it's writable. Safari private\n * mode, disabled cookies, and storage-blocked iframes all throw on\n * `setItem` — fall back to memory in those cases.\n */\nfunction probe(engine: WrStorageEngine): boolean {\n  try {\n    const k = '__wr_storage_probe__';\n    engine.setItem(k, '1');\n    engine.removeItem(k);\n    return true;\n  } catch {\n    return false;\n  }\n}\n\n/**\n * In-memory implementation of `Storage`. Used as the SSR / private-mode\n * fallback. Exported so consumers can opt into it explicitly for tests.\n */\nexport function createMemoryStorage(): WrStorageEngine {\n  const map = new Map<string, string>();\n  return {\n    get length(): number {\n      return map.size;\n    },\n    clear(): void {\n      map.clear();\n    },\n    getItem(key: string): string | null {\n      return map.has(key) ? map.get(key)! : null;\n    },\n    key(i: number): string | null {\n      return Array.from(map.keys())[i] ?? null;\n    },\n    removeItem(key: string): void {\n      map.delete(key);\n    },\n    setItem(key: string, value: string): void {\n      map.set(key, value);\n    },\n  };\n}\n\n/**\n * Injection token for the active storage engine. Override at any\n * injector level to swap engines (e.g. a feature module uses\n * `sessionStorage`; the rest uses `localStorage`):\n *\n * ```ts\n * providers: [{ provide: WR_STORAGE_ENGINE, useValue: sessionStorage }]\n * ```\n *\n * The default factory returns `localStorage` in the browser when it's\n * actually writable, an in-memory map otherwise.\n */\nexport const WR_STORAGE_ENGINE = new InjectionToken<WrStorageEngine>('WR_STORAGE_ENGINE', {\n  providedIn: 'root',\n  factory: () => {\n    if (typeof localStorage === 'undefined') return createMemoryStorage();\n    return probe(localStorage) ? localStorage : createMemoryStorage();\n  },\n});\n\nexport type { WrStorageEngine } from './interfaces';\n","/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { isPlatformBrowser } from '@angular/common';\nimport { Service, PLATFORM_ID, type Signal, type WritableSignal, inject, signal } from '@angular/core';\n\nimport { WR_STORAGE_CONFIG } from './storage-config';\nimport { WR_STORAGE_ENGINE } from './storage-engine';\n\n/** Envelope written when `json` mode is on. `e` is epoch-ms expiry. @internal */\ninterface Envelope<T> {\n  readonly v: T;\n  readonly e?: number;\n}\n\nfunction isEnvelope(x: unknown): x is Envelope<unknown> {\n  return x !== null && typeof x === 'object' && 'v' in x;\n}\n\n/**\n * Reactive key/value storage on top of any `Storage`-compatible engine.\n *\n * - **Swap engines** through {@link WR_STORAGE_ENGINE} or\n *   {@link provideWrStorage}. Default: `localStorage` with an in-memory\n *   fallback for SSR / private mode.\n * - **Namespacing** via `prefix` (config) — every key is transparently\n *   prefixed on read / write.\n * - **TTL** per-call or default — values past their expiry are removed\n *   lazily on the next `get` / `watch` read.\n * - **Reactive watch** — `watch(key)` returns a `Signal` that updates on\n *   local writes and cross-tab `storage` events.\n *\n * SSR-safe: the default engine factory returns an in-memory shim when\n * `localStorage` is unavailable, so reads always work.\n *\n * @example\n * ```ts\n * const store = inject(WrStorage);\n *\n * store.set('user', { name: 'Ada' });\n * store.get<{ name: string }>('user');         // { name: 'Ada' }\n *\n * store.set('cart', items, { ttl: 60_000 });   // expires in 60s\n *\n * const theme = store.watch<'light' | 'dark'>('theme', 'light');\n * effect(() => console.log('theme is', theme()));\n * ```\n *\n * @see https://ngwr.dev/services/storage\n */\n@Service()\nexport class WrStorage {\n  private readonly engine = inject(WR_STORAGE_ENGINE);\n  private readonly config = inject(WR_STORAGE_CONFIG);\n  private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n\n  /** Per-key watchers. Shared so multiple `watch(k)` calls reuse one signal. */\n  private readonly watchers = new Map<string, WritableSignal<unknown>>();\n  private listenerInstalled = false;\n\n  // Public API\n\n  /** Is `key` present (regardless of value / expiry)? */\n  has(key: string): boolean {\n    return this.engine.getItem(this.fullKey(key)) !== null;\n  }\n\n  /**\n   * Read `key`. Returns `fallback` (default `null`) when the key is\n   * missing or expired. Expired values are also removed as a side effect.\n   */\n  get<T = unknown>(key: string, fallback: T | null = null): T | null {\n    const fk = this.fullKey(key);\n    const raw = this.engine.getItem(fk);\n    if (raw === null) return fallback;\n\n    if (!this.config.json) return raw as unknown as T;\n\n    let parsed: unknown;\n    try {\n      parsed = JSON.parse(raw);\n    } catch {\n      // Non-JSON value written by external code — return as-is.\n      return raw as unknown as T;\n    }\n\n    if (!isEnvelope(parsed)) return parsed as T;\n\n    if (parsed.e !== undefined && parsed.e < Date.now()) {\n      this.remove(key);\n      return fallback;\n    }\n    return parsed.v as T;\n  }\n\n  /**\n   * Write `value` at `key`. Per-call `ttl` (ms) overrides the config\n   * default. JSON-serializable values only when `json` is on (the default).\n   */\n  set<T = unknown>(key: string, value: T, opts?: { ttl?: number }): void {\n    const fk = this.fullKey(key);\n    let serialized: string;\n\n    if (this.config.json) {\n      const ttl = opts?.ttl ?? this.config.ttl;\n      const env: Envelope<T> = ttl ? { v: value, e: Date.now() + ttl } : { v: value };\n      try {\n        serialized = JSON.stringify(env);\n      } catch (err) {\n        // eslint-disable-next-line no-console -- intentional diagnostic for unserialisable values\n        console.warn('[ngwr/storage] value not JSON-serializable', err);\n        return;\n      }\n    } else {\n      serialized = String(value);\n    }\n\n    try {\n      this.engine.setItem(fk, serialized);\n    } catch (err) {\n      // Quota exceeded / disabled / cleared mid-write — log + carry on.\n      // eslint-disable-next-line no-console -- intentional diagnostic on storage write failure\n      console.warn('[ngwr/storage] setItem failed', err);\n      return;\n    }\n    this.notify(key);\n  }\n\n  /** Remove `key`. No-op when absent. */\n  remove(key: string): void {\n    this.engine.removeItem(this.fullKey(key));\n    this.notify(key);\n  }\n\n  /**\n   * Clear every key owned by this prefix. When `prefix` is empty this\n   * defers to `engine.clear()` (clears everything — be careful with\n   * shared storage).\n   */\n  clear(): void {\n    const p = this.config.prefix;\n    if (p) {\n      for (const fk of this.rawKeys()) this.engine.removeItem(fk);\n    } else {\n      this.engine.clear();\n    }\n    // Refresh every active watcher — they may have just been cleared.\n    for (const [k, sig] of this.watchers) sig.set(this.get(k));\n  }\n\n  /** All known keys under our prefix, with the prefix stripped. */\n  keys(): readonly string[] {\n    const p = this.config.prefix;\n    return this.rawKeys().map(k => (p ? k.slice(p.length) : k));\n  }\n\n  /**\n   * Reactive read of `key`. Updates when this instance writes to the key,\n   * when `clear()` runs, and when another tab updates `localStorage`\n   * under the same prefix. Returned signal is shared per key — calling\n   * `watch(k)` twice returns the same signal.\n   */\n  watch<T = unknown>(key: string, fallback: T | null = null): Signal<T | null> {\n    let sig = this.watchers.get(key) as WritableSignal<T | null> | undefined;\n    if (!sig) {\n      sig = signal<T | null>(this.get<T>(key, fallback));\n      this.watchers.set(key, sig);\n      this.installCrossTabListener();\n    }\n    return sig.asReadonly();\n  }\n\n  // Internals\n\n  private fullKey(key: string): string {\n    return this.config.prefix + key;\n  }\n\n  private notify(key: string): void {\n    const sig = this.watchers.get(key);\n    if (sig) sig.set(this.get(key));\n  }\n\n  private rawKeys(): string[] {\n    const p = this.config.prefix;\n    const out: string[] = [];\n    for (let i = 0; i < this.engine.length; i++) {\n      const k = this.engine.key(i);\n      if (k === null) continue;\n      if (!p || k.startsWith(p)) out.push(k);\n    }\n    return out;\n  }\n\n  private installCrossTabListener(): void {\n    if (!this.isBrowser || this.listenerInstalled) return;\n    this.listenerInstalled = true;\n    window.addEventListener('storage', (event: StorageEvent) => {\n      // `storage` only fires for `localStorage` / `sessionStorage`, and\n      // only for changes from OTHER tabs. Local writes are handled by\n      // `notify()` in `set`/`remove`/`clear`.\n      if (event.key === null) {\n        // Storage cleared from another tab.\n        for (const [k, sig] of this.watchers) sig.set(this.get(k));\n        return;\n      }\n      const p = this.config.prefix;\n      if (p && !event.key.startsWith(p)) return;\n      this.notify(p ? event.key.slice(p.length) : event.key);\n    });\n  }\n}\n","/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { type EnvironmentProviders, type Provider, makeEnvironmentProviders } from '@angular/core';\n\nimport {\n  DEFAULT_WR_STORAGE_CONFIG,\n  WR_STORAGE_CONFIG,\n  type WrStorageConfig,\n  type WrStorageConfigResolved,\n} from './storage-config';\nimport { WR_STORAGE_ENGINE, type WrStorageEngine } from './storage-engine';\n\n/**\n * Configure {@link WrStorage}. All fields optional — merged with defaults.\n *\n * @example Override the engine globally (e.g. session storage)\n * ```ts\n * provideWrStorage({ engine: sessionStorage })\n * ```\n *\n * @example Lazy engine factory (e.g. wrap localStorage with encryption)\n * ```ts\n * provideWrStorage({ engine: () => new EncryptedStorage(localStorage, key) })\n * ```\n *\n * @example Namespace + auto-expire\n * ```ts\n * provideWrStorage({ prefix: 'myapp:', ttl: 24 * 60 * 60 * 1000 })\n * ```\n */\nexport interface ProvideWrStorageOptions extends WrStorageConfig {\n  /**\n   * Storage engine. Either an instance (eager) or a factory (lazy —\n   * called inside the injection context the first time `WR_STORAGE_ENGINE`\n   * is read). Defaults to {@link WR_STORAGE_ENGINE}'s factory\n   * (`localStorage` with in-memory fallback).\n   */\n  readonly engine?: WrStorageEngine | (() => WrStorageEngine);\n}\n\nexport function provideWrStorage(options: ProvideWrStorageOptions = {}): EnvironmentProviders {\n  const { engine, ...config } = options;\n\n  const merged: WrStorageConfigResolved = { ...DEFAULT_WR_STORAGE_CONFIG, ...config };\n\n  const providers: Provider[] = [{ provide: WR_STORAGE_CONFIG, useValue: merged }];\n\n  if (engine !== undefined) {\n    providers.push(\n      typeof engine === 'function'\n        ? { provide: WR_STORAGE_ENGINE, useFactory: engine }\n        : { provide: WR_STORAGE_ENGINE, useValue: engine }\n    );\n  }\n\n  return makeEnvironmentProviders(providers);\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}