joopjs 2.0.6 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (140) hide show
  1. package/.claude/skills/observables.md +28 -0
  2. package/.claude/skills/setup.md +14 -3
  3. package/.cursor/rules/joopjs.mdc +4 -5
  4. package/.github/copilot-instructions.md +3 -1
  5. package/.windsurf/rules/joopjs.md +4 -0
  6. package/CHANGELOG.md +31 -2
  7. package/README.md +19 -7
  8. package/ai-rules/AGENTS.md +21 -0
  9. package/ai-rules/GEMINI.md +17 -3
  10. package/dist/ai/index.js +15 -3
  11. package/dist/ai/index.js.map +1 -1
  12. package/dist/ai/index.mjs +15 -3
  13. package/dist/ai/index.mjs.map +1 -1
  14. package/dist/analytics/index.js +10 -2
  15. package/dist/analytics/index.js.map +1 -1
  16. package/dist/analytics/index.mjs +10 -2
  17. package/dist/analytics/index.mjs.map +1 -1
  18. package/dist/angular/index.d.mts +98 -27
  19. package/dist/angular/index.d.ts +98 -27
  20. package/dist/angular/index.js +44 -0
  21. package/dist/angular/index.js.map +1 -1
  22. package/dist/angular/index.mjs +39 -1
  23. package/dist/angular/index.mjs.map +1 -1
  24. package/dist/api/index.js +15 -3
  25. package/dist/api/index.js.map +1 -1
  26. package/dist/api/index.mjs +15 -3
  27. package/dist/api/index.mjs.map +1 -1
  28. package/dist/auth/index.js +15 -3
  29. package/dist/auth/index.js.map +1 -1
  30. package/dist/auth/index.mjs +15 -3
  31. package/dist/auth/index.mjs.map +1 -1
  32. package/dist/banking/index.js +15 -3
  33. package/dist/banking/index.js.map +1 -1
  34. package/dist/banking/index.mjs +15 -3
  35. package/dist/banking/index.mjs.map +1 -1
  36. package/dist/cache/index.js +15 -3
  37. package/dist/cache/index.js.map +1 -1
  38. package/dist/cache/index.mjs +15 -3
  39. package/dist/cache/index.mjs.map +1 -1
  40. package/dist/{index-DFqEoX_l.d.ts → consent.service-CIHNtx9h.d.ts} +1 -2
  41. package/dist/{index-B_ksKpS1.d.mts → consent.service-DQ-JAEJx.d.mts} +1 -2
  42. package/dist/core/index.d.mts +34 -1
  43. package/dist/core/index.d.ts +34 -1
  44. package/dist/core/index.js +56 -5
  45. package/dist/core/index.js.map +1 -1
  46. package/dist/core/index.mjs +54 -6
  47. package/dist/core/index.mjs.map +1 -1
  48. package/dist/deeplink/index.js +15 -3
  49. package/dist/deeplink/index.js.map +1 -1
  50. package/dist/deeplink/index.mjs +15 -3
  51. package/dist/deeplink/index.mjs.map +1 -1
  52. package/dist/device/index.js +15 -3
  53. package/dist/device/index.js.map +1 -1
  54. package/dist/device/index.mjs +15 -3
  55. package/dist/device/index.mjs.map +1 -1
  56. package/dist/forms/index.js +15 -3
  57. package/dist/forms/index.js.map +1 -1
  58. package/dist/forms/index.mjs +15 -3
  59. package/dist/forms/index.mjs.map +1 -1
  60. package/dist/i18n/index.js +15 -3
  61. package/dist/i18n/index.js.map +1 -1
  62. package/dist/i18n/index.mjs +15 -3
  63. package/dist/i18n/index.mjs.map +1 -1
  64. package/dist/index.d.mts +2 -2
  65. package/dist/index.d.ts +2 -2
  66. package/dist/index.js +50 -8
  67. package/dist/index.js.map +1 -1
  68. package/dist/index.mjs +50 -8
  69. package/dist/index.mjs.map +1 -1
  70. package/dist/{joop-CA3DMeOO.d.ts → joop-Dim2yEKG.d.ts} +1 -1
  71. package/dist/{joop-Bx7Iwj5p.d.mts → joop-GkQw13f9.d.mts} +1 -1
  72. package/dist/native-bridge/index.js +10 -2
  73. package/dist/native-bridge/index.js.map +1 -1
  74. package/dist/native-bridge/index.mjs +10 -2
  75. package/dist/native-bridge/index.mjs.map +1 -1
  76. package/dist/network/index.js +15 -3
  77. package/dist/network/index.js.map +1 -1
  78. package/dist/network/index.mjs +15 -3
  79. package/dist/network/index.mjs.map +1 -1
  80. package/dist/observability/index.js +15 -3
  81. package/dist/observability/index.js.map +1 -1
  82. package/dist/observability/index.mjs +15 -3
  83. package/dist/observability/index.mjs.map +1 -1
  84. package/dist/pwa/index.js +15 -3
  85. package/dist/pwa/index.js.map +1 -1
  86. package/dist/pwa/index.mjs +15 -3
  87. package/dist/pwa/index.mjs.map +1 -1
  88. package/dist/react/index.d.mts +2 -2
  89. package/dist/react/index.d.ts +2 -2
  90. package/dist/react/index.js +15 -3
  91. package/dist/react/index.js.map +1 -1
  92. package/dist/react/index.mjs +15 -3
  93. package/dist/react/index.mjs.map +1 -1
  94. package/dist/router/index.js +15 -3
  95. package/dist/router/index.js.map +1 -1
  96. package/dist/router/index.mjs +15 -3
  97. package/dist/router/index.mjs.map +1 -1
  98. package/dist/security/index.js +15 -3
  99. package/dist/security/index.js.map +1 -1
  100. package/dist/security/index.mjs +15 -3
  101. package/dist/security/index.mjs.map +1 -1
  102. package/dist/session/index.js +15 -3
  103. package/dist/session/index.js.map +1 -1
  104. package/dist/session/index.mjs +15 -3
  105. package/dist/session/index.mjs.map +1 -1
  106. package/dist/state/index.js +15 -3
  107. package/dist/state/index.js.map +1 -1
  108. package/dist/state/index.mjs +15 -3
  109. package/dist/state/index.mjs.map +1 -1
  110. package/dist/storage/index.js +15 -3
  111. package/dist/storage/index.js.map +1 -1
  112. package/dist/storage/index.mjs +15 -3
  113. package/dist/storage/index.mjs.map +1 -1
  114. package/dist/sync/index.js +15 -3
  115. package/dist/sync/index.js.map +1 -1
  116. package/dist/sync/index.mjs +15 -3
  117. package/dist/sync/index.mjs.map +1 -1
  118. package/dist/theme/index.js +15 -3
  119. package/dist/theme/index.js.map +1 -1
  120. package/dist/theme/index.mjs +15 -3
  121. package/dist/theme/index.mjs.map +1 -1
  122. package/dist/ui/index.js +15 -3
  123. package/dist/ui/index.js.map +1 -1
  124. package/dist/ui/index.mjs +15 -3
  125. package/dist/ui/index.mjs.map +1 -1
  126. package/dist/utilities/index.js +46 -4
  127. package/dist/utilities/index.js.map +1 -1
  128. package/dist/utilities/index.mjs +46 -4
  129. package/dist/utilities/index.mjs.map +1 -1
  130. package/dist/vue/index.d.mts +2 -2
  131. package/dist/vue/index.d.ts +2 -2
  132. package/dist/vue/index.js +15 -3
  133. package/dist/vue/index.js.map +1 -1
  134. package/dist/vue/index.mjs +15 -3
  135. package/dist/vue/index.mjs.map +1 -1
  136. package/dist/workflow/index.js +15 -3
  137. package/dist/workflow/index.js.map +1 -1
  138. package/dist/workflow/index.mjs +15 -3
  139. package/dist/workflow/index.mjs.map +1 -1
  140. package/package.json +16 -2
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/events/index.ts","../../src/platform/platform.ts","../../src/device/network-monitor.ts","../../src/device/app-lifecycle.ts","../../src/device/key-vault.ts","../../src/react/index.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["export type Unsubscribe = () => void;\nexport type Listener<T> = (value: T) => void;\n\n/**\n * Lightweight pub/sub subject — emits to all current subscribers.\n * Replaces RxJS Subject without pulling in the full RxJS dependency.\n */\nexport class JoopSubject<T> {\n private _listeners: Listener<T>[] = [];\n\n subscribe(listener: Listener<T>): Unsubscribe {\n this._listeners.push(listener);\n return () => {\n this._listeners = this._listeners.filter(l => l !== listener);\n };\n }\n\n next(value: T): void {\n for (const listener of this._listeners) {\n listener(value);\n }\n }\n\n asObservable(): JoopObservable<T> {\n return new JoopObservable<T>(listener => this.subscribe(listener));\n }\n}\n\n/**\n * Stateful subject — replays the current value to any new subscriber immediately.\n * Replaces RxJS BehaviorSubject.\n */\nexport class JoopBehaviorSubject<T> extends JoopSubject<T> {\n private _value: T;\n\n constructor(initialValue: T) {\n super();\n this._value = initialValue;\n }\n\n getValue(): T {\n return this._value;\n }\n\n override next(value: T): void {\n this._value = value;\n super.next(value);\n }\n\n override subscribe(listener: Listener<T>): Unsubscribe {\n listener(this._value);\n return super.subscribe(listener);\n }\n\n override asObservable(): JoopObservable<T> {\n return new JoopObservable<T>(listener => this.subscribe(listener));\n }\n}\n\n/**\n * Read-only observable handle returned from asObservable().\n */\nexport class JoopObservable<T> {\n constructor(private _subscribeFn: (listener: Listener<T>) => Unsubscribe) {}\n\n subscribe(listener: Listener<T>): Unsubscribe {\n return this._subscribeFn(listener);\n }\n\n /** Returns the current value without subscribing (only meaningful for BehaviorSubject-backed observables). */\n getOnce(): T | undefined {\n let result: T | undefined;\n const unsub = this.subscribe(v => { result = v; });\n unsub();\n return result;\n }\n}\n","import type { JoopPlatformAdapterConfig, JoopStorageAdapter } from './adapters';\n\nexport type JoopPlatformType = 'web' | 'react-native' | 'node' | 'unknown';\n\nexport interface JoopCapabilities {\n compression: boolean;\n workers: boolean;\n cryptoSubtle: boolean;\n persistentStorage: boolean;\n dom: boolean;\n serviceWorker: boolean;\n}\n\nexport interface JoopPlatformConfig {\n adapter?: JoopPlatformAdapterConfig;\n /** Override auto-detection — useful in tests or SSR */\n platform?: JoopPlatformType;\n}\n\n// ---------------------------------------------------------------------------\n// Built-in storage adapters\n// ---------------------------------------------------------------------------\n\nconst _webStorage = (store: Storage): JoopStorageAdapter => ({\n getItem: (k) => store.getItem(k),\n setItem: (k, v) => store.setItem(k, v),\n removeItem: (k) => store.removeItem(k),\n clear: () => store.clear(),\n});\n\nclass _MemStorageImpl implements JoopStorageAdapter {\n private _m = new Map<string, string>();\n getItem(k: string) { return this._m.get(k) ?? null; }\n setItem(k: string, v: string) { this._m.set(k, v); }\n removeItem(k: string) { this._m.delete(k); }\n clear() { this._m.clear(); }\n}\n\n// ---------------------------------------------------------------------------\n// Platform detection\n// ---------------------------------------------------------------------------\n\nfunction _detect(): JoopPlatformType {\n // React Native sets navigator.product = 'ReactNative'\n if (typeof navigator !== 'undefined' && navigator.product === 'ReactNative') return 'react-native';\n // Node.js: no window, has globalThis.process.versions.node\n const _proc = (globalThis as Record<string, unknown>)['process'] as { versions?: { node?: string } } | undefined;\n if (typeof window === 'undefined' && _proc?.versions?.node) return 'node';\n // Browser\n if (typeof window !== 'undefined') return 'web';\n return 'unknown';\n}\n\n// ---------------------------------------------------------------------------\n// JoopPlatform\n// ---------------------------------------------------------------------------\n\nexport class JoopPlatform {\n private static _type: JoopPlatformType = _detect();\n private static _adapter: JoopPlatformAdapterConfig = {};\n private static _memStorage: JoopStorageAdapter | null = null;\n\n /**\n * Call once at app startup to configure adapters for your platform.\n *\n * Web (default — no call needed):\n * JoopPlatform.init();\n *\n * React Native with react-native-mmkv:\n * import { MMKV } from 'react-native-mmkv';\n * const mmkv = new MMKV();\n * JoopPlatform.init({ adapter: { storage: mmkv } });\n *\n * React Native with custom compression (fflate):\n * import { gzip, ungzip } from 'fflate';\n * JoopPlatform.init({\n * adapter: {\n * compression: {\n * compress: (d, fmt) => new Promise((res, rej) => gzip(d, (e, r) => e ? rej(e) : res(r))),\n * decompress: (d, fmt) => new Promise((res, rej) => ungzip(d, (e, r) => e ? rej(e) : res(r))),\n * },\n * },\n * });\n */\n static init(config: JoopPlatformConfig = {}): void {\n if (config.platform) this._type = config.platform;\n this._adapter = { ...this._adapter, ...(config.adapter ?? {}) };\n }\n\n /** Current detected or overridden platform type */\n static get type(): JoopPlatformType { return this._type; }\n\n static is(type: JoopPlatformType): boolean { return this._type === type; }\n static isMobile(): boolean { return this._type === 'react-native'; }\n static isWeb(): boolean { return this._type === 'web'; }\n static isNode(): boolean { return this._type === 'node'; }\n\n /** Raw adapter config registered via init() */\n static getAdapter(): JoopPlatformAdapterConfig { return this._adapter; }\n\n /**\n * Returns the best available storage adapter:\n * 1. Custom adapter registered via init()\n * 2. localStorage (web)\n * 3. In-memory fallback (Node / RN without adapter)\n */\n static getStorage(): JoopStorageAdapter {\n if (this._adapter.storage) return this._adapter.storage;\n if (typeof localStorage !== 'undefined') return _webStorage(localStorage);\n if (!this._memStorage) this._memStorage = new _MemStorageImpl();\n return this._memStorage;\n }\n\n /**\n * Returns the best available session-scoped storage:\n * 1. Custom adapter registered via init()\n * 2. sessionStorage (web)\n * 3. Shared in-memory fallback\n */\n static getSessionStorage(): JoopStorageAdapter {\n if (this._adapter.storage) return this._adapter.storage;\n if (typeof sessionStorage !== 'undefined') return _webStorage(sessionStorage);\n if (!this._memStorage) this._memStorage = new _MemStorageImpl();\n return this._memStorage;\n }\n\n /** What APIs are available in the current environment */\n static capabilities(): JoopCapabilities {\n return {\n compression: typeof CompressionStream !== 'undefined' || !!this._adapter.compression,\n workers: typeof Worker !== 'undefined' || !!this._adapter.worker,\n cryptoSubtle: !!(typeof globalThis !== 'undefined' && (globalThis as typeof globalThis & { crypto?: Crypto }).crypto?.subtle),\n persistentStorage: typeof localStorage !== 'undefined' || !!this._adapter.storage,\n dom: typeof document !== 'undefined',\n serviceWorker: typeof navigator !== 'undefined' && 'serviceWorker' in navigator,\n };\n }\n\n /** Reset to auto-detected defaults — useful between tests */\n static _reset(): void {\n this._type = _detect();\n this._adapter = {};\n this._memStorage = null;\n }\n}\n","import { JoopBehaviorSubject } from '../events';\nimport { JoopPlatform } from '../platform/platform';\nimport type { JoopNetworkAdapter, JoopNetworkState, JoopNetworkType, JoopEffectiveType } from '../platform/adapters';\n\nexport type { JoopNetworkState, JoopNetworkType, JoopEffectiveType };\n\nexport interface JoopNetworkMonitorConfig {\n /** Override platform adapter (e.g. RN NetInfo wrapper) */\n adapter?: JoopNetworkAdapter;\n}\n\ntype _NetInfoConnection = {\n type?: string;\n effectiveType?: string;\n downlink?: number;\n rtt?: number;\n saveData?: boolean;\n metered?: boolean;\n addEventListener(event: 'change', handler: () => void): void;\n removeEventListener(event: 'change', handler: () => void): void;\n};\n\nexport class JoopNetworkMonitor {\n private _adapter: JoopNetworkAdapter | null;\n private _state$: JoopBehaviorSubject<JoopNetworkState>;\n private _cleanup: Array<() => void> = [];\n\n constructor(config: JoopNetworkMonitorConfig = {}) {\n this._adapter = config.adapter ?? JoopPlatform.getAdapter().network ?? null;\n this._state$ = new JoopBehaviorSubject<JoopNetworkState>(this._read());\n this._init();\n }\n\n private _init(): void {\n if (this._adapter) {\n this._state$.next(this._adapter.getState());\n const unsub = this._adapter.onChange(s => this._state$.next(s));\n this._cleanup.push(unsub);\n return;\n }\n\n if (typeof window === 'undefined') return;\n\n const refresh = () => this._state$.next(this._read());\n\n window.addEventListener('online', refresh);\n window.addEventListener('offline', refresh);\n\n const conn = (navigator as unknown as { connection?: _NetInfoConnection }).connection;\n if (conn) {\n conn.addEventListener('change', refresh);\n this._cleanup.push(() => conn.removeEventListener('change', refresh));\n }\n\n this._cleanup.push(\n () => window.removeEventListener('online', refresh),\n () => window.removeEventListener('offline', refresh),\n );\n }\n\n private _read(): JoopNetworkState {\n if (this._adapter) return this._adapter.getState();\n if (typeof navigator === 'undefined') return { online: false, type: 'unknown' };\n\n const online = navigator.onLine;\n if (!online) return { online: false, type: 'offline' };\n\n const conn = (navigator as unknown as { connection?: _NetInfoConnection }).connection;\n const type = conn ? _mapType(conn.type) : 'unknown';\n\n return {\n online,\n type,\n effectiveType: conn?.effectiveType as JoopEffectiveType | undefined,\n downlink: conn?.downlink,\n rtt: conn?.rtt,\n saveData: conn?.saveData,\n metered: conn?.metered ?? type === 'cellular',\n };\n }\n\n getState(): JoopNetworkState { return this._state$.getValue(); }\n state$() { return this._state$.asObservable(); }\n isOnline(): boolean { return this.getState().online; }\n isMetered(): boolean { return this.getState().metered ?? this.getState().type === 'cellular'; }\n\n /** Call fn when connectivity is regained. */\n onOnline(fn: () => void): () => void {\n let prev = this.getState().online;\n return this._state$.subscribe(s => {\n if (s.online && !prev) fn();\n prev = s.online;\n });\n }\n\n /** Call fn when connectivity is lost. */\n onOffline(fn: () => void): () => void {\n let prev = this.getState().online;\n return this._state$.subscribe(s => {\n if (!s.online && prev) fn();\n prev = s.online;\n });\n }\n\n /** Call fn when the connection type changes (e.g. wifi → cellular). */\n onTypeChange(fn: (type: JoopNetworkType) => void): () => void {\n let prev = this.getState().type;\n return this._state$.subscribe(s => {\n if (s.type !== prev) { fn(s.type); prev = s.type; }\n });\n }\n\n destroy(): void {\n for (const fn of this._cleanup) fn();\n this._cleanup = [];\n }\n}\n\nfunction _mapType(raw?: string): JoopNetworkType {\n if (!raw) return 'unknown';\n if (raw === 'wifi' || raw === 'wimax') return 'wifi';\n if (raw === 'cellular' || raw === '2g' || raw === '3g' || raw === '4g' || raw === '5g') return 'cellular';\n if (raw === 'ethernet') return 'ethernet';\n if (raw === 'none' || raw === 'offline') return 'offline';\n return 'unknown';\n}\n","import { JoopBehaviorSubject } from '../events';\nimport { JoopPlatform } from '../platform/platform';\nimport type { JoopLifecycleAdapter, JoopAppState } from '../platform/adapters';\n\nexport type { JoopAppState };\n\nexport interface JoopLifecycleConfig {\n /** Override platform adapter (e.g. RN AppState wrapper) */\n adapter?: JoopLifecycleAdapter;\n}\n\nexport class JoopAppLifecycle {\n private _state$ = new JoopBehaviorSubject<JoopAppState>('unknown');\n private _cleanup: Array<() => void> = [];\n private _adapter: JoopLifecycleAdapter | null;\n\n constructor(config: JoopLifecycleConfig = {}) {\n this._adapter = config.adapter ?? JoopPlatform.getAdapter().lifecycle ?? null;\n this._init();\n }\n\n private _init(): void {\n if (this._adapter) {\n this._state$.next(this._adapter.getState());\n const unsub = this._adapter.onChange(s => this._state$.next(s));\n this._cleanup.push(unsub);\n return;\n }\n\n if (typeof document === 'undefined') { this._state$.next('unknown'); return; }\n\n this._state$.next(document.hidden ? 'background' : 'active');\n\n const onVisibility = () => this._state$.next(document.hidden ? 'background' : 'active');\n const onFocus = () => this._state$.next('active');\n const onBlur = () => this._state$.next('background');\n\n document.addEventListener('visibilitychange', onVisibility);\n window.addEventListener('focus', onFocus);\n window.addEventListener('blur', onBlur);\n\n this._cleanup.push(\n () => document.removeEventListener('visibilitychange', onVisibility),\n () => window.removeEventListener('focus', onFocus),\n () => window.removeEventListener('blur', onBlur),\n );\n }\n\n getState(): JoopAppState { return this._state$.getValue(); }\n state$() { return this._state$.asObservable(); }\n isActive(): boolean { return this.getState() === 'active'; }\n\n /** Call fn each time the app comes to the foreground (background → active). */\n onForeground(fn: () => void): () => void {\n let prev = this.getState();\n return this._state$.subscribe(s => {\n if (s === 'active' && prev !== 'active') fn();\n prev = s;\n });\n }\n\n /** Call fn each time the app goes to the background (active → background). */\n onBackground(fn: () => void): () => void {\n let prev = this.getState();\n return this._state$.subscribe(s => {\n if (s === 'background' && prev !== 'background') fn();\n prev = s;\n });\n }\n\n destroy(): void {\n for (const fn of this._cleanup) fn();\n this._cleanup = [];\n }\n}\n","import { JoopPlatform } from '../platform/platform';\nimport type { JoopKeyVaultAdapter } from '../platform/adapters';\n\nexport interface JoopKeyVaultConfig {\n /** AES-GCM encryption password. If omitted, values are base64-encoded only (no encryption). */\n encryptionKey?: string;\n /** localStorage key prefix. Default: 'joop_vault_' */\n prefix?: string;\n /** Override platform adapter (e.g. react-native-keychain wrapper) */\n adapter?: JoopKeyVaultAdapter;\n}\n\nexport class JoopKeyVault {\n private _prefix: string;\n private _encKey: string | undefined;\n private _adapter: JoopKeyVaultAdapter | null;\n private _cryptoKey: CryptoKey | null = null;\n\n constructor(config: JoopKeyVaultConfig = {}) {\n this._prefix = config.prefix ?? 'joop_vault_';\n this._encKey = config.encryptionKey;\n this._adapter = config.adapter ?? JoopPlatform.getAdapter().keyVault ?? null;\n }\n\n /** Store a secret. On web: AES-GCM encrypted if `encryptionKey` was provided. */\n async set(key: string, value: string): Promise<void> {\n if (this._adapter) return this._adapter.set(key, value);\n const stored = this._encKey\n ? await _encrypt(value, await this._key())\n : btoa(unescape(encodeURIComponent(value)));\n JoopPlatform.getStorage().setItem(this._prefix + key, stored);\n }\n\n /** Retrieve a secret, or null if not found. */\n async get(key: string): Promise<string | null> {\n if (this._adapter) return this._adapter.get(key);\n const raw = JoopPlatform.getStorage().getItem(this._prefix + key);\n if (!raw) return null;\n try {\n return this._encKey\n ? await _decrypt(raw, await this._key())\n : decodeURIComponent(escape(atob(raw)));\n } catch {\n return null;\n }\n }\n\n async remove(key: string): Promise<void> {\n if (this._adapter) return this._adapter.remove(key);\n JoopPlatform.getStorage().removeItem(this._prefix + key);\n }\n\n async clear(): Promise<void> {\n if (this._adapter) return this._adapter.clear();\n JoopPlatform.getStorage().clear?.();\n }\n\n async has(key: string): Promise<boolean> {\n return (await this.get(key)) !== null;\n }\n\n /** Rotate the encryption key: re-encrypts all known entries with a new key. */\n async rotateKey(newEncryptionKey: string, keys: string[]): Promise<void> {\n if (this._adapter) throw new Error('rotateKey not supported with native adapter');\n const values = await Promise.all(keys.map(k => this.get(k)));\n this._encKey = newEncryptionKey;\n this._cryptoKey = null;\n for (let i = 0; i < keys.length; i++) {\n if (values[i] !== null) await this.set(keys[i], values[i]!);\n }\n }\n\n private async _key(): Promise<CryptoKey> {\n if (!this._cryptoKey) this._cryptoKey = await _deriveKey(this._encKey!);\n return this._cryptoKey;\n }\n}\n\n// ── WebCrypto helpers ────────────────────────────────────────────────────────\n\nconst _SALT = new Uint8Array([\n 0x6a, 0x6f, 0x6f, 0x70, 0x2d, 0x76, 0x61, 0x75,\n 0x6c, 0x74, 0x2d, 0x76, 0x31, 0x00, 0x00, 0x00,\n]);\n\nasync function _deriveKey(password: string): Promise<CryptoKey> {\n const km = await crypto.subtle.importKey(\n 'raw', new TextEncoder().encode(password),\n { name: 'PBKDF2' }, false, ['deriveKey'],\n );\n return crypto.subtle.deriveKey(\n { name: 'PBKDF2', salt: _SALT, iterations: 100000, hash: 'SHA-256' },\n km,\n { name: 'AES-GCM', length: 256 },\n false,\n ['encrypt', 'decrypt'],\n );\n}\n\nasync function _encrypt(value: string, key: CryptoKey): Promise<string> {\n const iv = crypto.getRandomValues(new Uint8Array(12));\n const encrypted = await crypto.subtle.encrypt(\n { name: 'AES-GCM', iv },\n key,\n new TextEncoder().encode(value),\n );\n const combined = new Uint8Array(12 + encrypted.byteLength);\n combined.set(iv);\n combined.set(new Uint8Array(encrypted), 12);\n return btoa(String.fromCharCode(...combined));\n}\n\nasync function _decrypt(encoded: string, key: CryptoKey): Promise<string> {\n const combined = Uint8Array.from(atob(encoded), c => c.charCodeAt(0));\n const iv = combined.slice(0, 12);\n const data = combined.slice(12);\n const decrypted = await crypto.subtle.decrypt({ name: 'AES-GCM', iv }, key, data);\n return new TextDecoder().decode(decrypted);\n}\n","/**\n * joopjs/react — React hooks integration\n *\n * React 18+ is a required peer dependency. Call createJoopReact(React) once\n * at app level and destructure the hooks you need:\n *\n * import React from 'react';\n * import { createJoopReact } from 'joopjs/react';\n * export const { JoopProvider, useJoop, useJoopNetworkMonitor } = createJoopReact(React);\n */\n\nimport type { JoopInstance } from '../joop';\nimport type { JoopNetworkState } from '../device/network-monitor';\nimport type { JoopAppState } from '../device/app-lifecycle';\nimport type { JoopThemeInfo } from '../theme/theme.service';\nimport { JoopNetworkMonitor } from '../device/network-monitor';\nimport { JoopAppLifecycle } from '../device/app-lifecycle';\nimport { JoopKeyVault } from '../device/key-vault';\n\n// ── Minimal React type declarations (peer dependency) ─────────────────────────\n\ntype _Cleanup = (() => void) | void;\ntype _Deps = ReadonlyArray<unknown>;\n\ninterface _Ref<T> { current: T; }\ninterface _Context<T> { _brand: T; }\n\nexport interface ReactLike {\n useState<T>(init: T | (() => T)): [T, (value: T | ((prev: T) => T)) => void];\n useEffect(effect: () => _Cleanup, deps?: _Deps): void;\n useCallback<T extends (...args: never[]) => unknown>(fn: T, deps: _Deps): T;\n useMemo<T>(factory: () => T, deps: _Deps): T;\n useRef<T>(init: T): _Ref<T>;\n useRef<T>(): _Ref<T | undefined>;\n createContext<T>(defaultValue: T): _Context<T>;\n useContext<T>(ctx: _Context<T>): T;\n createElement(type: unknown, props?: Record<string, unknown> | null, ...children: unknown[]): unknown;\n}\n\n// ── Return types ──────────────────────────────────────────────────────────────\n\nexport interface JoopNetworkHook extends JoopNetworkState {\n monitor: JoopNetworkMonitor;\n}\n\nexport interface JoopLifecycleHook {\n state: JoopAppState;\n isActive: boolean;\n}\n\nexport interface JoopKeyVaultHook {\n value: string | null;\n loading: boolean;\n set(value: string): Promise<void>;\n remove(): Promise<void>;\n refresh(): Promise<void>;\n}\n\nexport interface JoopAuthHook {\n isLoggedIn: boolean;\n user: unknown;\n login(user: unknown): void;\n logout(): void;\n}\n\nexport interface JoopThemeHook {\n active: string;\n themes: JoopThemeInfo[];\n setTheme(nameOrId: string): void;\n}\n\nexport interface JoopI18nHook {\n language: string;\n direction: 'ltr' | 'rtl';\n t(key: string, params?: Record<string, string>): string;\n setLanguage(lang: string): void;\n}\n\nexport interface JoopLoaderHook {\n isLoading: boolean;\n show(): void;\n hide(): void;\n}\n\nexport interface JoopFeatureFlagHook {\n enabled: boolean;\n variant: string | null;\n}\n\n// ── Factory ───────────────────────────────────────────────────────────────────\n\nexport function createJoopReact<R extends ReactLike>(react: R) {\n const {\n useState, useEffect, useCallback, useMemo,\n useRef, createContext, useContext, createElement,\n } = react;\n\n // ── Context ────────────────────────────────────────────────────────────────\n const JoopCtx = createContext<JoopInstance | null>(null);\n\n // ── Provider ───────────────────────────────────────────────────────────────\n function JoopProvider(props: { joop: JoopInstance; children: unknown }): unknown {\n return createElement(\n (JoopCtx as unknown as { Provider: unknown }).Provider,\n { value: props.joop },\n props.children,\n );\n }\n\n // ── useJoop ────────────────────────────────────────────────────────────────\n function useJoop(): JoopInstance {\n const joop = useContext(JoopCtx);\n if (!joop) throw new Error('[joopjs] useJoop must be called inside <JoopProvider>');\n return joop;\n }\n\n // ── useJoopNetworkMonitor ─────────────────────────────────────────────────\n function useJoopNetworkMonitor(): JoopNetworkHook {\n const ref = useRef<JoopNetworkMonitor | undefined>();\n if (!ref.current) ref.current = new JoopNetworkMonitor();\n const monitor = ref.current as JoopNetworkMonitor;\n\n const [state, setState] = useState<JoopNetworkState>(() => monitor.getState());\n\n useEffect(() => {\n const unsub = monitor.state$().subscribe(s => setState({ ...s }));\n return () => { unsub(); monitor.destroy(); };\n }, []);\n\n return { ...state, monitor };\n }\n\n // ── useJoopAppLifecycle ───────────────────────────────────────────────────\n function useJoopAppLifecycle(): JoopLifecycleHook {\n const ref = useRef<JoopAppLifecycle | undefined>();\n if (!ref.current) ref.current = new JoopAppLifecycle();\n const lc = ref.current as JoopAppLifecycle;\n\n const [state, setState] = useState<JoopAppState>(() => lc.getState());\n\n useEffect(() => {\n const unsub = lc.state$().subscribe(s => setState(s));\n return () => { unsub(); lc.destroy(); };\n }, []);\n\n return { state, isActive: state === 'active' };\n }\n\n // ── useJoopKeyVault ───────────────────────────────────────────────────────\n function useJoopKeyVault(\n key: string,\n vaultConfig?: ConstructorParameters<typeof JoopKeyVault>[0],\n ): JoopKeyVaultHook {\n const vaultRef = useRef<JoopKeyVault | undefined>();\n if (!vaultRef.current) vaultRef.current = new JoopKeyVault(vaultConfig);\n const vault = vaultRef.current as JoopKeyVault;\n\n const [value, setValue] = useState<string | null>(null);\n const [loading, setLoading] = useState(true);\n\n const refresh = useCallback(async () => {\n setLoading(true);\n setValue(await vault.get(key));\n setLoading(false);\n }, [key]);\n\n useEffect(() => { refresh(); }, [key]);\n\n const set = useCallback(async (v: string) => {\n await vault.set(key, v);\n setValue(v);\n }, [key]);\n\n const remove = useCallback(async () => {\n await vault.remove(key);\n setValue(null);\n }, [key]);\n\n return { value, loading, set, remove, refresh };\n }\n\n // ── useJoopAuth ───────────────────────────────────────────────────────────\n function useJoopAuth(): JoopAuthHook {\n const joop = useJoop();\n const [isLoggedIn, setLoggedIn] = useState(() => joop.auth.isLoggedIn());\n\n useEffect(() => {\n const unsub = joop.auth.isLoggedIn$().subscribe(v => setLoggedIn(v));\n return () => unsub();\n }, []);\n\n const login = useCallback(() => joop.auth.setLoggedIn(true), []);\n const logout = useCallback(() => joop.auth.logout(), []);\n\n return { isLoggedIn, user: null, login, logout };\n }\n\n // ── useJoopTheme ─────────────────────────────────────────────────────────\n function useJoopTheme(): JoopThemeHook {\n const joop = useJoop();\n const [active, setActive] = useState(() => joop.theme.getActiveName());\n const themes = useMemo(() => joop.theme.getMapped(), []);\n\n useEffect(() => {\n const unsub = joop.theme.active$().subscribe(name => setActive(name));\n return () => unsub();\n }, []);\n\n const setTheme = useCallback((nameOrId: string) => {\n joop.theme.apply(nameOrId);\n }, []);\n\n return { active, themes, setTheme };\n }\n\n // ── useJoopI18n ───────────────────────────────────────────────────────────\n function useJoopI18n(): JoopI18nHook {\n const joop = useJoop();\n const [language, setLang] = useState(() => joop.i18n.getDetails().code);\n const [direction, setDir] = useState<'ltr' | 'rtl'>(() => joop.i18n.getDirection());\n\n useEffect(() => {\n const unsub = joop.i18n.language$().subscribe(lang => {\n setLang(lang);\n setDir(joop.i18n.getDirection());\n });\n return () => unsub();\n }, []);\n\n const t = useCallback(\n (key: string, params?: Record<string, string>) => joop.i18n.t(key, params),\n [language],\n );\n const setLanguage = useCallback((lang: string) => joop.i18n.setLanguage(lang), []);\n\n return { language, direction, t, setLanguage };\n }\n\n // ── useJoopLoader ─────────────────────────────────────────────────────────\n function useJoopLoader(): JoopLoaderHook {\n const joop = useJoop();\n const [isLoading, setLoading] = useState(() => joop.loader.isLoading());\n\n useEffect(() => {\n const unsub = joop.loader.isLoading$().subscribe(v => setLoading(v));\n return () => unsub();\n }, []);\n\n const show = useCallback(() => joop.loader.show(), []);\n const hide = useCallback(() => joop.loader.hide(), []);\n\n return { isLoading, show, hide };\n }\n\n // ── useJoopConfig ─────────────────────────────────────────────────────────\n function useJoopConfig<T>(key: string): T | undefined {\n const joop = useJoop();\n return useMemo(() => joop.config.get<T>(key), [key]);\n }\n\n // ── useJoopFeatureFlag ────────────────────────────────────────────────────\n function useJoopFeatureFlag(\n flagKey: string,\n context?: Record<string, unknown>,\n ): JoopFeatureFlagHook {\n const joop = useJoop();\n const enabled = useMemo(\n () => joop.featureFlags.isEnabled(flagKey, context as never),\n [flagKey],\n );\n const variant = useMemo(\n () => joop.featureFlags.getVariant(flagKey, context as never),\n [flagKey],\n );\n return { enabled, variant };\n }\n\n // ── useJoopStore ──────────────────────────────────────────────────────────\n function useJoopStore<S extends Record<string, unknown>, T>(\n selector: (state: S) => T,\n ): T {\n const joop = useJoop();\n const store = joop.store as unknown as {\n subscribe(fn: (s: S) => void): () => void;\n getState(): S;\n };\n const [value, setValue] = useState<T>(() => selector(store.getState()));\n\n useEffect(() => {\n const unsub = store.subscribe((s: S) => {\n setValue(selector(s));\n });\n return () => unsub();\n }, []);\n\n return value;\n }\n\n return {\n JoopProvider,\n JoopCtx,\n useJoop,\n useJoopNetworkMonitor,\n useJoopAppLifecycle,\n useJoopKeyVault,\n useJoopAuth,\n useJoopTheme,\n useJoopI18n,\n useJoopLoader,\n useJoopConfig,\n useJoopFeatureFlag,\n useJoopStore,\n };\n}\n\nexport type JoopReactHooks = ReturnType<typeof createJoopReact>;\n"]}
1
+ {"version":3,"sources":["../../src/events/index.ts","../../src/platform/platform.ts","../../src/device/network-monitor.ts","../../src/device/app-lifecycle.ts","../../src/device/key-vault.ts","../../src/react/index.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["export type Unsubscribe = () => void;\nexport type Listener<T> = (value: T) => void;\n\n/**\n * Reports a subscriber that threw during emission, without aborting delivery\n * to the remaining subscribers. Defaults to console.error; override to route\n * to your own logger (e.g. in a banking app where dropped events matter).\n */\nlet _onListenerError: (error: unknown) => void = (error) => {\n // eslint-disable-next-line no-console\n console.error('[joopjs] a subject subscriber threw during emission:', error);\n};\n\n/** Override how subscriber errors are reported during emission. */\nexport function setSubjectErrorHandler(handler: (error: unknown) => void): void {\n _onListenerError = handler;\n}\n\n/**\n * Lightweight pub/sub subject — emits to all current subscribers.\n * Replaces RxJS Subject without pulling in the full RxJS dependency.\n */\nexport class JoopSubject<T> {\n private _listeners: Listener<T>[] = [];\n\n subscribe(listener: Listener<T>): Unsubscribe {\n this._listeners.push(listener);\n return () => {\n this._listeners = this._listeners.filter(l => l !== listener);\n };\n }\n\n next(value: T): void {\n // Snapshot so a subscribe()/unsubscribe() triggered by a listener can't\n // disturb this emission, and isolate each listener so one that throws\n // doesn't deprive later subscribers of the value.\n const listeners = this._listeners.slice();\n for (const listener of listeners) {\n try {\n listener(value);\n } catch (error) {\n _onListenerError(error);\n }\n }\n }\n\n asObservable(): JoopObservable<T> {\n return new JoopObservable<T>(listener => this.subscribe(listener));\n }\n}\n\n/**\n * Stateful subject — replays the current value to any new subscriber immediately.\n * Replaces RxJS BehaviorSubject.\n */\nexport class JoopBehaviorSubject<T> extends JoopSubject<T> {\n private _value: T;\n\n constructor(initialValue: T) {\n super();\n this._value = initialValue;\n }\n\n getValue(): T {\n return this._value;\n }\n\n override next(value: T): void {\n this._value = value;\n super.next(value);\n }\n\n override subscribe(listener: Listener<T>): Unsubscribe {\n try {\n listener(this._value);\n } catch (error) {\n _onListenerError(error);\n }\n return super.subscribe(listener);\n }\n\n override asObservable(): JoopObservable<T> {\n return new JoopObservable<T>(listener => this.subscribe(listener));\n }\n}\n\n/**\n * Read-only observable handle returned from asObservable().\n */\nexport class JoopObservable<T> {\n constructor(private _subscribeFn: (listener: Listener<T>) => Unsubscribe) {}\n\n subscribe(listener: Listener<T>): Unsubscribe {\n return this._subscribeFn(listener);\n }\n\n /** Returns the current value without subscribing (only meaningful for BehaviorSubject-backed observables). */\n getOnce(): T | undefined {\n let result: T | undefined;\n const unsub = this.subscribe(v => { result = v; });\n unsub();\n return result;\n }\n}\n","import type { JoopPlatformAdapterConfig, JoopStorageAdapter } from './adapters';\n\nexport type JoopPlatformType = 'web' | 'react-native' | 'node' | 'unknown';\n\nexport interface JoopCapabilities {\n compression: boolean;\n workers: boolean;\n cryptoSubtle: boolean;\n persistentStorage: boolean;\n dom: boolean;\n serviceWorker: boolean;\n}\n\nexport interface JoopPlatformConfig {\n adapter?: JoopPlatformAdapterConfig;\n /** Override auto-detection — useful in tests or SSR */\n platform?: JoopPlatformType;\n}\n\n// ---------------------------------------------------------------------------\n// Built-in storage adapters\n// ---------------------------------------------------------------------------\n\nconst _webStorage = (store: Storage): JoopStorageAdapter => ({\n getItem: (k) => store.getItem(k),\n setItem: (k, v) => store.setItem(k, v),\n removeItem: (k) => store.removeItem(k),\n clear: () => store.clear(),\n});\n\nclass _MemStorageImpl implements JoopStorageAdapter {\n private _m = new Map<string, string>();\n getItem(k: string) { return this._m.get(k) ?? null; }\n setItem(k: string, v: string) { this._m.set(k, v); }\n removeItem(k: string) { this._m.delete(k); }\n clear() { this._m.clear(); }\n}\n\n// ---------------------------------------------------------------------------\n// Platform detection\n// ---------------------------------------------------------------------------\n\nfunction _detect(): JoopPlatformType {\n // React Native sets navigator.product = 'ReactNative'\n if (typeof navigator !== 'undefined' && navigator.product === 'ReactNative') return 'react-native';\n // Node.js: no window, has globalThis.process.versions.node\n const _proc = (globalThis as Record<string, unknown>)['process'] as { versions?: { node?: string } } | undefined;\n if (typeof window === 'undefined' && _proc?.versions?.node) return 'node';\n // Browser\n if (typeof window !== 'undefined') return 'web';\n return 'unknown';\n}\n\n// ---------------------------------------------------------------------------\n// JoopPlatform\n// ---------------------------------------------------------------------------\n\nexport class JoopPlatform {\n private static _type: JoopPlatformType = _detect();\n private static _adapter: JoopPlatformAdapterConfig = {};\n private static _memStorage: JoopStorageAdapter | null = null;\n\n /**\n * Call once at app startup to configure adapters for your platform.\n *\n * Web (default — no call needed):\n * JoopPlatform.init();\n *\n * React Native with react-native-mmkv:\n * import { MMKV } from 'react-native-mmkv';\n * const mmkv = new MMKV();\n * JoopPlatform.init({ adapter: { storage: mmkv } });\n *\n * React Native with custom compression (fflate):\n * import { gzip, ungzip } from 'fflate';\n * JoopPlatform.init({\n * adapter: {\n * compression: {\n * compress: (d, fmt) => new Promise((res, rej) => gzip(d, (e, r) => e ? rej(e) : res(r))),\n * decompress: (d, fmt) => new Promise((res, rej) => ungzip(d, (e, r) => e ? rej(e) : res(r))),\n * },\n * },\n * });\n */\n static init(config: JoopPlatformConfig = {}): void {\n if (config.platform) this._type = config.platform;\n this._adapter = { ...this._adapter, ...(config.adapter ?? {}) };\n }\n\n /** Current detected or overridden platform type */\n static get type(): JoopPlatformType { return this._type; }\n\n static is(type: JoopPlatformType): boolean { return this._type === type; }\n static isMobile(): boolean { return this._type === 'react-native'; }\n static isWeb(): boolean { return this._type === 'web'; }\n static isNode(): boolean { return this._type === 'node'; }\n\n /** Raw adapter config registered via init() */\n static getAdapter(): JoopPlatformAdapterConfig { return this._adapter; }\n\n /**\n * Returns the best available storage adapter:\n * 1. Custom adapter registered via init()\n * 2. localStorage (web)\n * 3. In-memory fallback (Node / RN without adapter)\n */\n static getStorage(): JoopStorageAdapter {\n if (this._adapter.storage) return this._adapter.storage;\n if (typeof localStorage !== 'undefined') return _webStorage(localStorage);\n if (!this._memStorage) this._memStorage = new _MemStorageImpl();\n return this._memStorage;\n }\n\n /**\n * Returns the best available session-scoped storage:\n * 1. Custom adapter registered via init()\n * 2. sessionStorage (web)\n * 3. Shared in-memory fallback\n */\n static getSessionStorage(): JoopStorageAdapter {\n if (this._adapter.storage) return this._adapter.storage;\n if (typeof sessionStorage !== 'undefined') return _webStorage(sessionStorage);\n if (!this._memStorage) this._memStorage = new _MemStorageImpl();\n return this._memStorage;\n }\n\n /** What APIs are available in the current environment */\n static capabilities(): JoopCapabilities {\n return {\n compression: typeof CompressionStream !== 'undefined' || !!this._adapter.compression,\n workers: typeof Worker !== 'undefined' || !!this._adapter.worker,\n cryptoSubtle: !!(typeof globalThis !== 'undefined' && (globalThis as typeof globalThis & { crypto?: Crypto }).crypto?.subtle),\n persistentStorage: typeof localStorage !== 'undefined' || !!this._adapter.storage,\n dom: typeof document !== 'undefined',\n serviceWorker: typeof navigator !== 'undefined' && 'serviceWorker' in navigator,\n };\n }\n\n /** Reset to auto-detected defaults — useful between tests */\n static _reset(): void {\n this._type = _detect();\n this._adapter = {};\n this._memStorage = null;\n }\n}\n","import { JoopBehaviorSubject } from '../events';\nimport { JoopPlatform } from '../platform/platform';\nimport type { JoopNetworkAdapter, JoopNetworkState, JoopNetworkType, JoopEffectiveType } from '../platform/adapters';\n\nexport type { JoopNetworkState, JoopNetworkType, JoopEffectiveType };\n\nexport interface JoopNetworkMonitorConfig {\n /** Override platform adapter (e.g. RN NetInfo wrapper) */\n adapter?: JoopNetworkAdapter;\n}\n\ntype _NetInfoConnection = {\n type?: string;\n effectiveType?: string;\n downlink?: number;\n rtt?: number;\n saveData?: boolean;\n metered?: boolean;\n addEventListener(event: 'change', handler: () => void): void;\n removeEventListener(event: 'change', handler: () => void): void;\n};\n\nexport class JoopNetworkMonitor {\n private _adapter: JoopNetworkAdapter | null;\n private _state$: JoopBehaviorSubject<JoopNetworkState>;\n private _cleanup: Array<() => void> = [];\n\n constructor(config: JoopNetworkMonitorConfig = {}) {\n this._adapter = config.adapter ?? JoopPlatform.getAdapter().network ?? null;\n this._state$ = new JoopBehaviorSubject<JoopNetworkState>(this._read());\n this._init();\n }\n\n private _init(): void {\n if (this._adapter) {\n this._state$.next(this._adapter.getState());\n const unsub = this._adapter.onChange(s => this._state$.next(s));\n this._cleanup.push(unsub);\n return;\n }\n\n if (typeof window === 'undefined') return;\n\n const refresh = () => this._state$.next(this._read());\n\n window.addEventListener('online', refresh);\n window.addEventListener('offline', refresh);\n\n const conn = (navigator as unknown as { connection?: _NetInfoConnection }).connection;\n if (conn) {\n conn.addEventListener('change', refresh);\n this._cleanup.push(() => conn.removeEventListener('change', refresh));\n }\n\n this._cleanup.push(\n () => window.removeEventListener('online', refresh),\n () => window.removeEventListener('offline', refresh),\n );\n }\n\n private _read(): JoopNetworkState {\n if (this._adapter) return this._adapter.getState();\n if (typeof navigator === 'undefined') return { online: false, type: 'unknown' };\n\n const online = navigator.onLine;\n if (!online) return { online: false, type: 'offline' };\n\n const conn = (navigator as unknown as { connection?: _NetInfoConnection }).connection;\n const type = conn ? _mapType(conn.type) : 'unknown';\n\n return {\n online,\n type,\n effectiveType: conn?.effectiveType as JoopEffectiveType | undefined,\n downlink: conn?.downlink,\n rtt: conn?.rtt,\n saveData: conn?.saveData,\n metered: conn?.metered ?? type === 'cellular',\n };\n }\n\n getState(): JoopNetworkState { return this._state$.getValue(); }\n state$() { return this._state$.asObservable(); }\n isOnline(): boolean { return this.getState().online; }\n isMetered(): boolean { return this.getState().metered ?? this.getState().type === 'cellular'; }\n\n /** Call fn when connectivity is regained. */\n onOnline(fn: () => void): () => void {\n let prev = this.getState().online;\n return this._state$.subscribe(s => {\n if (s.online && !prev) fn();\n prev = s.online;\n });\n }\n\n /** Call fn when connectivity is lost. */\n onOffline(fn: () => void): () => void {\n let prev = this.getState().online;\n return this._state$.subscribe(s => {\n if (!s.online && prev) fn();\n prev = s.online;\n });\n }\n\n /** Call fn when the connection type changes (e.g. wifi → cellular). */\n onTypeChange(fn: (type: JoopNetworkType) => void): () => void {\n let prev = this.getState().type;\n return this._state$.subscribe(s => {\n if (s.type !== prev) { fn(s.type); prev = s.type; }\n });\n }\n\n destroy(): void {\n for (const fn of this._cleanup) fn();\n this._cleanup = [];\n }\n}\n\nfunction _mapType(raw?: string): JoopNetworkType {\n if (!raw) return 'unknown';\n if (raw === 'wifi' || raw === 'wimax') return 'wifi';\n if (raw === 'cellular' || raw === '2g' || raw === '3g' || raw === '4g' || raw === '5g') return 'cellular';\n if (raw === 'ethernet') return 'ethernet';\n if (raw === 'none' || raw === 'offline') return 'offline';\n return 'unknown';\n}\n","import { JoopBehaviorSubject } from '../events';\nimport { JoopPlatform } from '../platform/platform';\nimport type { JoopLifecycleAdapter, JoopAppState } from '../platform/adapters';\n\nexport type { JoopAppState };\n\nexport interface JoopLifecycleConfig {\n /** Override platform adapter (e.g. RN AppState wrapper) */\n adapter?: JoopLifecycleAdapter;\n}\n\nexport class JoopAppLifecycle {\n private _state$ = new JoopBehaviorSubject<JoopAppState>('unknown');\n private _cleanup: Array<() => void> = [];\n private _adapter: JoopLifecycleAdapter | null;\n\n constructor(config: JoopLifecycleConfig = {}) {\n this._adapter = config.adapter ?? JoopPlatform.getAdapter().lifecycle ?? null;\n this._init();\n }\n\n private _init(): void {\n if (this._adapter) {\n this._state$.next(this._adapter.getState());\n const unsub = this._adapter.onChange(s => this._state$.next(s));\n this._cleanup.push(unsub);\n return;\n }\n\n if (typeof document === 'undefined') { this._state$.next('unknown'); return; }\n\n this._state$.next(document.hidden ? 'background' : 'active');\n\n const onVisibility = () => this._state$.next(document.hidden ? 'background' : 'active');\n const onFocus = () => this._state$.next('active');\n const onBlur = () => this._state$.next('background');\n\n document.addEventListener('visibilitychange', onVisibility);\n window.addEventListener('focus', onFocus);\n window.addEventListener('blur', onBlur);\n\n this._cleanup.push(\n () => document.removeEventListener('visibilitychange', onVisibility),\n () => window.removeEventListener('focus', onFocus),\n () => window.removeEventListener('blur', onBlur),\n );\n }\n\n getState(): JoopAppState { return this._state$.getValue(); }\n state$() { return this._state$.asObservable(); }\n isActive(): boolean { return this.getState() === 'active'; }\n\n /** Call fn each time the app comes to the foreground (background → active). */\n onForeground(fn: () => void): () => void {\n let prev = this.getState();\n return this._state$.subscribe(s => {\n if (s === 'active' && prev !== 'active') fn();\n prev = s;\n });\n }\n\n /** Call fn each time the app goes to the background (active → background). */\n onBackground(fn: () => void): () => void {\n let prev = this.getState();\n return this._state$.subscribe(s => {\n if (s === 'background' && prev !== 'background') fn();\n prev = s;\n });\n }\n\n destroy(): void {\n for (const fn of this._cleanup) fn();\n this._cleanup = [];\n }\n}\n","import { JoopPlatform } from '../platform/platform';\nimport type { JoopKeyVaultAdapter } from '../platform/adapters';\n\nexport interface JoopKeyVaultConfig {\n /** AES-GCM encryption password. If omitted, values are base64-encoded only (no encryption). */\n encryptionKey?: string;\n /** localStorage key prefix. Default: 'joop_vault_' */\n prefix?: string;\n /** Override platform adapter (e.g. react-native-keychain wrapper) */\n adapter?: JoopKeyVaultAdapter;\n}\n\nexport class JoopKeyVault {\n private _prefix: string;\n private _encKey: string | undefined;\n private _adapter: JoopKeyVaultAdapter | null;\n private _cryptoKey: CryptoKey | null = null;\n\n constructor(config: JoopKeyVaultConfig = {}) {\n this._prefix = config.prefix ?? 'joop_vault_';\n this._encKey = config.encryptionKey;\n this._adapter = config.adapter ?? JoopPlatform.getAdapter().keyVault ?? null;\n }\n\n /** Store a secret. On web: AES-GCM encrypted if `encryptionKey` was provided. */\n async set(key: string, value: string): Promise<void> {\n if (this._adapter) return this._adapter.set(key, value);\n const stored = this._encKey\n ? await _encrypt(value, await this._key())\n : btoa(unescape(encodeURIComponent(value)));\n JoopPlatform.getStorage().setItem(this._prefix + key, stored);\n }\n\n /** Retrieve a secret, or null if not found. */\n async get(key: string): Promise<string | null> {\n if (this._adapter) return this._adapter.get(key);\n const raw = JoopPlatform.getStorage().getItem(this._prefix + key);\n if (!raw) return null;\n try {\n return this._encKey\n ? await _decrypt(raw, await this._key())\n : decodeURIComponent(escape(atob(raw)));\n } catch {\n return null;\n }\n }\n\n async remove(key: string): Promise<void> {\n if (this._adapter) return this._adapter.remove(key);\n JoopPlatform.getStorage().removeItem(this._prefix + key);\n }\n\n async clear(): Promise<void> {\n if (this._adapter) return this._adapter.clear();\n JoopPlatform.getStorage().clear?.();\n }\n\n async has(key: string): Promise<boolean> {\n return (await this.get(key)) !== null;\n }\n\n /** Rotate the encryption key: re-encrypts all known entries with a new key. */\n async rotateKey(newEncryptionKey: string, keys: string[]): Promise<void> {\n if (this._adapter) throw new Error('rotateKey not supported with native adapter');\n const values = await Promise.all(keys.map(k => this.get(k)));\n this._encKey = newEncryptionKey;\n this._cryptoKey = null;\n for (let i = 0; i < keys.length; i++) {\n if (values[i] !== null) await this.set(keys[i], values[i]!);\n }\n }\n\n private async _key(): Promise<CryptoKey> {\n if (!this._cryptoKey) this._cryptoKey = await _deriveKey(this._encKey!);\n return this._cryptoKey;\n }\n}\n\n// ── WebCrypto helpers ────────────────────────────────────────────────────────\n\nconst _SALT = new Uint8Array([\n 0x6a, 0x6f, 0x6f, 0x70, 0x2d, 0x76, 0x61, 0x75,\n 0x6c, 0x74, 0x2d, 0x76, 0x31, 0x00, 0x00, 0x00,\n]);\n\nasync function _deriveKey(password: string): Promise<CryptoKey> {\n const km = await crypto.subtle.importKey(\n 'raw', new TextEncoder().encode(password),\n { name: 'PBKDF2' }, false, ['deriveKey'],\n );\n return crypto.subtle.deriveKey(\n { name: 'PBKDF2', salt: _SALT, iterations: 100000, hash: 'SHA-256' },\n km,\n { name: 'AES-GCM', length: 256 },\n false,\n ['encrypt', 'decrypt'],\n );\n}\n\nasync function _encrypt(value: string, key: CryptoKey): Promise<string> {\n const iv = crypto.getRandomValues(new Uint8Array(12));\n const encrypted = await crypto.subtle.encrypt(\n { name: 'AES-GCM', iv },\n key,\n new TextEncoder().encode(value),\n );\n const combined = new Uint8Array(12 + encrypted.byteLength);\n combined.set(iv);\n combined.set(new Uint8Array(encrypted), 12);\n return btoa(String.fromCharCode(...combined));\n}\n\nasync function _decrypt(encoded: string, key: CryptoKey): Promise<string> {\n const combined = Uint8Array.from(atob(encoded), c => c.charCodeAt(0));\n const iv = combined.slice(0, 12);\n const data = combined.slice(12);\n const decrypted = await crypto.subtle.decrypt({ name: 'AES-GCM', iv }, key, data);\n return new TextDecoder().decode(decrypted);\n}\n","/**\n * joopjs/react — React hooks integration\n *\n * React 18+ is a required peer dependency. Call createJoopReact(React) once\n * at app level and destructure the hooks you need:\n *\n * import React from 'react';\n * import { createJoopReact } from 'joopjs/react';\n * export const { JoopProvider, useJoop, useJoopNetworkMonitor } = createJoopReact(React);\n */\n\nimport type { JoopInstance } from '../joop';\nimport type { JoopNetworkState } from '../device/network-monitor';\nimport type { JoopAppState } from '../device/app-lifecycle';\nimport type { JoopThemeInfo } from '../theme/theme.service';\nimport { JoopNetworkMonitor } from '../device/network-monitor';\nimport { JoopAppLifecycle } from '../device/app-lifecycle';\nimport { JoopKeyVault } from '../device/key-vault';\n\n// ── Minimal React type declarations (peer dependency) ─────────────────────────\n\ntype _Cleanup = (() => void) | void;\ntype _Deps = ReadonlyArray<unknown>;\n\ninterface _Ref<T> { current: T; }\ninterface _Context<T> { _brand: T; }\n\nexport interface ReactLike {\n useState<T>(init: T | (() => T)): [T, (value: T | ((prev: T) => T)) => void];\n useEffect(effect: () => _Cleanup, deps?: _Deps): void;\n useCallback<T extends (...args: never[]) => unknown>(fn: T, deps: _Deps): T;\n useMemo<T>(factory: () => T, deps: _Deps): T;\n useRef<T>(init: T): _Ref<T>;\n useRef<T>(): _Ref<T | undefined>;\n createContext<T>(defaultValue: T): _Context<T>;\n useContext<T>(ctx: _Context<T>): T;\n createElement(type: unknown, props?: Record<string, unknown> | null, ...children: unknown[]): unknown;\n}\n\n// ── Return types ──────────────────────────────────────────────────────────────\n\nexport interface JoopNetworkHook extends JoopNetworkState {\n monitor: JoopNetworkMonitor;\n}\n\nexport interface JoopLifecycleHook {\n state: JoopAppState;\n isActive: boolean;\n}\n\nexport interface JoopKeyVaultHook {\n value: string | null;\n loading: boolean;\n set(value: string): Promise<void>;\n remove(): Promise<void>;\n refresh(): Promise<void>;\n}\n\nexport interface JoopAuthHook {\n isLoggedIn: boolean;\n user: unknown;\n login(user: unknown): void;\n logout(): void;\n}\n\nexport interface JoopThemeHook {\n active: string;\n themes: JoopThemeInfo[];\n setTheme(nameOrId: string): void;\n}\n\nexport interface JoopI18nHook {\n language: string;\n direction: 'ltr' | 'rtl';\n t(key: string, params?: Record<string, string>): string;\n setLanguage(lang: string): void;\n}\n\nexport interface JoopLoaderHook {\n isLoading: boolean;\n show(): void;\n hide(): void;\n}\n\nexport interface JoopFeatureFlagHook {\n enabled: boolean;\n variant: string | null;\n}\n\n// ── Factory ───────────────────────────────────────────────────────────────────\n\nexport function createJoopReact<R extends ReactLike>(react: R) {\n const {\n useState, useEffect, useCallback, useMemo,\n useRef, createContext, useContext, createElement,\n } = react;\n\n // ── Context ────────────────────────────────────────────────────────────────\n const JoopCtx = createContext<JoopInstance | null>(null);\n\n // ── Provider ───────────────────────────────────────────────────────────────\n function JoopProvider(props: { joop: JoopInstance; children: unknown }): unknown {\n return createElement(\n (JoopCtx as unknown as { Provider: unknown }).Provider,\n { value: props.joop },\n props.children,\n );\n }\n\n // ── useJoop ────────────────────────────────────────────────────────────────\n function useJoop(): JoopInstance {\n const joop = useContext(JoopCtx);\n if (!joop) throw new Error('[joopjs] useJoop must be called inside <JoopProvider>');\n return joop;\n }\n\n // ── useJoopNetworkMonitor ─────────────────────────────────────────────────\n function useJoopNetworkMonitor(): JoopNetworkHook {\n const ref = useRef<JoopNetworkMonitor | undefined>();\n if (!ref.current) ref.current = new JoopNetworkMonitor();\n const monitor = ref.current as JoopNetworkMonitor;\n\n const [state, setState] = useState<JoopNetworkState>(() => monitor.getState());\n\n useEffect(() => {\n const unsub = monitor.state$().subscribe(s => setState({ ...s }));\n return () => { unsub(); monitor.destroy(); };\n }, []);\n\n return { ...state, monitor };\n }\n\n // ── useJoopAppLifecycle ───────────────────────────────────────────────────\n function useJoopAppLifecycle(): JoopLifecycleHook {\n const ref = useRef<JoopAppLifecycle | undefined>();\n if (!ref.current) ref.current = new JoopAppLifecycle();\n const lc = ref.current as JoopAppLifecycle;\n\n const [state, setState] = useState<JoopAppState>(() => lc.getState());\n\n useEffect(() => {\n const unsub = lc.state$().subscribe(s => setState(s));\n return () => { unsub(); lc.destroy(); };\n }, []);\n\n return { state, isActive: state === 'active' };\n }\n\n // ── useJoopKeyVault ───────────────────────────────────────────────────────\n function useJoopKeyVault(\n key: string,\n vaultConfig?: ConstructorParameters<typeof JoopKeyVault>[0],\n ): JoopKeyVaultHook {\n const vaultRef = useRef<JoopKeyVault | undefined>();\n if (!vaultRef.current) vaultRef.current = new JoopKeyVault(vaultConfig);\n const vault = vaultRef.current as JoopKeyVault;\n\n const [value, setValue] = useState<string | null>(null);\n const [loading, setLoading] = useState(true);\n\n const refresh = useCallback(async () => {\n setLoading(true);\n setValue(await vault.get(key));\n setLoading(false);\n }, [key]);\n\n useEffect(() => { refresh(); }, [key]);\n\n const set = useCallback(async (v: string) => {\n await vault.set(key, v);\n setValue(v);\n }, [key]);\n\n const remove = useCallback(async () => {\n await vault.remove(key);\n setValue(null);\n }, [key]);\n\n return { value, loading, set, remove, refresh };\n }\n\n // ── useJoopAuth ───────────────────────────────────────────────────────────\n function useJoopAuth(): JoopAuthHook {\n const joop = useJoop();\n const [isLoggedIn, setLoggedIn] = useState(() => joop.auth.isLoggedIn());\n\n useEffect(() => {\n const unsub = joop.auth.isLoggedIn$().subscribe(v => setLoggedIn(v));\n return () => unsub();\n }, []);\n\n const login = useCallback(() => joop.auth.setLoggedIn(true), []);\n const logout = useCallback(() => joop.auth.logout(), []);\n\n return { isLoggedIn, user: null, login, logout };\n }\n\n // ── useJoopTheme ─────────────────────────────────────────────────────────\n function useJoopTheme(): JoopThemeHook {\n const joop = useJoop();\n const [active, setActive] = useState(() => joop.theme.getActiveName());\n const themes = useMemo(() => joop.theme.getMapped(), []);\n\n useEffect(() => {\n const unsub = joop.theme.active$().subscribe(name => setActive(name));\n return () => unsub();\n }, []);\n\n const setTheme = useCallback((nameOrId: string) => {\n joop.theme.apply(nameOrId);\n }, []);\n\n return { active, themes, setTheme };\n }\n\n // ── useJoopI18n ───────────────────────────────────────────────────────────\n function useJoopI18n(): JoopI18nHook {\n const joop = useJoop();\n const [language, setLang] = useState(() => joop.i18n.getDetails().code);\n const [direction, setDir] = useState<'ltr' | 'rtl'>(() => joop.i18n.getDirection());\n\n useEffect(() => {\n const unsub = joop.i18n.language$().subscribe(lang => {\n setLang(lang);\n setDir(joop.i18n.getDirection());\n });\n return () => unsub();\n }, []);\n\n const t = useCallback(\n (key: string, params?: Record<string, string>) => joop.i18n.t(key, params),\n [language],\n );\n const setLanguage = useCallback((lang: string) => joop.i18n.setLanguage(lang), []);\n\n return { language, direction, t, setLanguage };\n }\n\n // ── useJoopLoader ─────────────────────────────────────────────────────────\n function useJoopLoader(): JoopLoaderHook {\n const joop = useJoop();\n const [isLoading, setLoading] = useState(() => joop.loader.isLoading());\n\n useEffect(() => {\n const unsub = joop.loader.isLoading$().subscribe(v => setLoading(v));\n return () => unsub();\n }, []);\n\n const show = useCallback(() => joop.loader.show(), []);\n const hide = useCallback(() => joop.loader.hide(), []);\n\n return { isLoading, show, hide };\n }\n\n // ── useJoopConfig ─────────────────────────────────────────────────────────\n function useJoopConfig<T>(key: string): T | undefined {\n const joop = useJoop();\n return useMemo(() => joop.config.get<T>(key), [key]);\n }\n\n // ── useJoopFeatureFlag ────────────────────────────────────────────────────\n function useJoopFeatureFlag(\n flagKey: string,\n context?: Record<string, unknown>,\n ): JoopFeatureFlagHook {\n const joop = useJoop();\n const enabled = useMemo(\n () => joop.featureFlags.isEnabled(flagKey, context as never),\n [flagKey],\n );\n const variant = useMemo(\n () => joop.featureFlags.getVariant(flagKey, context as never),\n [flagKey],\n );\n return { enabled, variant };\n }\n\n // ── useJoopStore ──────────────────────────────────────────────────────────\n function useJoopStore<S extends Record<string, unknown>, T>(\n selector: (state: S) => T,\n ): T {\n const joop = useJoop();\n const store = joop.store as unknown as {\n subscribe(fn: (s: S) => void): () => void;\n getState(): S;\n };\n const [value, setValue] = useState<T>(() => selector(store.getState()));\n\n useEffect(() => {\n const unsub = store.subscribe((s: S) => {\n setValue(selector(s));\n });\n return () => unsub();\n }, []);\n\n return value;\n }\n\n return {\n JoopProvider,\n JoopCtx,\n useJoop,\n useJoopNetworkMonitor,\n useJoopAppLifecycle,\n useJoopKeyVault,\n useJoopAuth,\n useJoopTheme,\n useJoopI18n,\n useJoopLoader,\n useJoopConfig,\n useJoopFeatureFlag,\n useJoopStore,\n };\n}\n\nexport type JoopReactHooks = ReturnType<typeof createJoopReact>;\n"]}
@@ -1,6 +1,9 @@
1
1
  'use strict';
2
2
 
3
3
  // src/events/index.ts
4
+ var _onListenerError = (error) => {
5
+ console.error("[joopjs] a subject subscriber threw during emission:", error);
6
+ };
4
7
  var JoopSubject = class {
5
8
  _listeners = [];
6
9
  subscribe(listener) {
@@ -10,8 +13,13 @@ var JoopSubject = class {
10
13
  };
11
14
  }
12
15
  next(value) {
13
- for (const listener of this._listeners) {
14
- listener(value);
16
+ const listeners = this._listeners.slice();
17
+ for (const listener of listeners) {
18
+ try {
19
+ listener(value);
20
+ } catch (error) {
21
+ _onListenerError(error);
22
+ }
15
23
  }
16
24
  }
17
25
  asObservable() {
@@ -32,7 +40,11 @@ var JoopBehaviorSubject = class extends JoopSubject {
32
40
  super.next(value);
33
41
  }
34
42
  subscribe(listener) {
35
- listener(this._value);
43
+ try {
44
+ listener(this._value);
45
+ } catch (error) {
46
+ _onListenerError(error);
47
+ }
36
48
  return super.subscribe(listener);
37
49
  }
38
50
  asObservable() {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/events/index.ts","../../src/router/router.service.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["export type Unsubscribe = () => void;\nexport type Listener<T> = (value: T) => void;\n\n/**\n * Lightweight pub/sub subject — emits to all current subscribers.\n * Replaces RxJS Subject without pulling in the full RxJS dependency.\n */\nexport class JoopSubject<T> {\n private _listeners: Listener<T>[] = [];\n\n subscribe(listener: Listener<T>): Unsubscribe {\n this._listeners.push(listener);\n return () => {\n this._listeners = this._listeners.filter(l => l !== listener);\n };\n }\n\n next(value: T): void {\n for (const listener of this._listeners) {\n listener(value);\n }\n }\n\n asObservable(): JoopObservable<T> {\n return new JoopObservable<T>(listener => this.subscribe(listener));\n }\n}\n\n/**\n * Stateful subject — replays the current value to any new subscriber immediately.\n * Replaces RxJS BehaviorSubject.\n */\nexport class JoopBehaviorSubject<T> extends JoopSubject<T> {\n private _value: T;\n\n constructor(initialValue: T) {\n super();\n this._value = initialValue;\n }\n\n getValue(): T {\n return this._value;\n }\n\n override next(value: T): void {\n this._value = value;\n super.next(value);\n }\n\n override subscribe(listener: Listener<T>): Unsubscribe {\n listener(this._value);\n return super.subscribe(listener);\n }\n\n override asObservable(): JoopObservable<T> {\n return new JoopObservable<T>(listener => this.subscribe(listener));\n }\n}\n\n/**\n * Read-only observable handle returned from asObservable().\n */\nexport class JoopObservable<T> {\n constructor(private _subscribeFn: (listener: Listener<T>) => Unsubscribe) {}\n\n subscribe(listener: Listener<T>): Unsubscribe {\n return this._subscribeFn(listener);\n }\n\n /** Returns the current value without subscribing (only meaningful for BehaviorSubject-backed observables). */\n getOnce(): T | undefined {\n let result: T | undefined;\n const unsub = this.subscribe(v => { result = v; });\n unsub();\n return result;\n }\n}\n","import { JoopBehaviorSubject } from '../events';\n\nexport interface JoopRoute {\n path: string;\n params: Record<string, string>;\n query: Record<string, string>;\n hash: string;\n state: unknown;\n}\n\nexport type JoopRouteGuard = (from: JoopRoute, to: JoopRoute) => boolean | Promise<boolean>;\n\nexport interface JoopRoutePattern {\n pattern: string;\n keys: string[];\n regex: RegExp;\n}\n\nfunction _parseQuery(search: string): Record<string, string> {\n const out: Record<string, string> = {};\n for (const [k, v] of new URLSearchParams(search)) out[k] = v;\n return out;\n}\n\nfunction _compilePattern(pattern: string): JoopRoutePattern {\n const keys: string[] = [];\n const regex = new RegExp(\n '^' + pattern.replace(/:([^/]+)/g, (_, k) => { keys.push(k); return '([^/]+)'; }) + '/?$',\n );\n return { pattern, keys, regex };\n}\n\nfunction _matchRoute(pattern: JoopRoutePattern, path: string): Record<string, string> | null {\n const m = pattern.regex.exec(path);\n if (!m) return null;\n const params: Record<string, string> = {};\n pattern.keys.forEach((k, i) => { params[k] = decodeURIComponent(m[i + 1]); });\n return params;\n}\n\nexport class JoopRouterService {\n private _route$ = new JoopBehaviorSubject<JoopRoute>(this._current());\n private _guards: JoopRouteGuard[] = [];\n private _popHandler: (() => void) | null = null;\n\n constructor() {\n const handler = () => this._route$.next(this._current());\n window.addEventListener('popstate', handler);\n this._popHandler = () => window.removeEventListener('popstate', handler);\n }\n\n private _current(): JoopRoute {\n const { pathname, search, hash } = window.location;\n return { path: pathname, params: {}, query: _parseQuery(search), hash: hash.slice(1), state: history.state };\n }\n\n async navigate(path: string, state?: unknown, replace = false): Promise<boolean> {\n const from = this._route$.getValue();\n const to = this._parse(path, state);\n for (const guard of this._guards) {\n if (!await guard(from, to)) return false;\n }\n if (replace) history.replaceState(state ?? null, '', path);\n else history.pushState(state ?? null, '', path);\n this._route$.next(to);\n return true;\n }\n\n async replace(path: string, state?: unknown): Promise<boolean> { return this.navigate(path, state, true); }\n back(): void { history.back(); }\n forward(): void { history.forward(); }\n go(delta: number): void { history.go(delta); }\n\n currentRoute(): JoopRoute { return this._route$.getValue(); }\n currentPath(): string { return this._route$.getValue().path; }\n route$() { return this._route$.asObservable(); }\n\n addGuard(guard: JoopRouteGuard): () => void {\n this._guards.push(guard);\n return () => { this._guards = this._guards.filter(g => g !== guard); };\n }\n\n /** Match current path against a pattern like '/users/:id' */\n match(pattern: string): Record<string, string> | null {\n return _matchRoute(_compilePattern(pattern), this.currentPath());\n }\n\n buildUrl(path: string, params?: Record<string, string>, query?: Record<string, string>): string {\n let url = path;\n if (params) for (const [k, v] of Object.entries(params)) url = url.replace(`:${k}`, encodeURIComponent(v));\n if (query && Object.keys(query).length) url += '?' + new URLSearchParams(query).toString();\n return url;\n }\n\n parseUrl(url: string): JoopRoute {\n const a = document.createElement('a');\n a.href = url;\n return { path: a.pathname, params: {}, query: _parseQuery(a.search), hash: a.hash.slice(1), state: null };\n }\n\n private _parse(path: string, state: unknown): JoopRoute {\n const idx = path.indexOf('?');\n const hashIdx = path.indexOf('#');\n const bare = idx !== -1 ? path.slice(0, idx) : hashIdx !== -1 ? path.slice(0, hashIdx) : path;\n const search = idx !== -1 ? path.slice(idx, hashIdx !== -1 ? hashIdx : undefined) : '';\n const hash = hashIdx !== -1 ? path.slice(hashIdx + 1) : '';\n return { path: bare, params: {}, query: _parseQuery(search), hash, state };\n }\n\n destroy(): void { this._popHandler?.(); this._guards = []; }\n}\n"]}
1
+ {"version":3,"sources":["../../src/events/index.ts","../../src/router/router.service.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["export type Unsubscribe = () => void;\nexport type Listener<T> = (value: T) => void;\n\n/**\n * Reports a subscriber that threw during emission, without aborting delivery\n * to the remaining subscribers. Defaults to console.error; override to route\n * to your own logger (e.g. in a banking app where dropped events matter).\n */\nlet _onListenerError: (error: unknown) => void = (error) => {\n // eslint-disable-next-line no-console\n console.error('[joopjs] a subject subscriber threw during emission:', error);\n};\n\n/** Override how subscriber errors are reported during emission. */\nexport function setSubjectErrorHandler(handler: (error: unknown) => void): void {\n _onListenerError = handler;\n}\n\n/**\n * Lightweight pub/sub subject — emits to all current subscribers.\n * Replaces RxJS Subject without pulling in the full RxJS dependency.\n */\nexport class JoopSubject<T> {\n private _listeners: Listener<T>[] = [];\n\n subscribe(listener: Listener<T>): Unsubscribe {\n this._listeners.push(listener);\n return () => {\n this._listeners = this._listeners.filter(l => l !== listener);\n };\n }\n\n next(value: T): void {\n // Snapshot so a subscribe()/unsubscribe() triggered by a listener can't\n // disturb this emission, and isolate each listener so one that throws\n // doesn't deprive later subscribers of the value.\n const listeners = this._listeners.slice();\n for (const listener of listeners) {\n try {\n listener(value);\n } catch (error) {\n _onListenerError(error);\n }\n }\n }\n\n asObservable(): JoopObservable<T> {\n return new JoopObservable<T>(listener => this.subscribe(listener));\n }\n}\n\n/**\n * Stateful subject — replays the current value to any new subscriber immediately.\n * Replaces RxJS BehaviorSubject.\n */\nexport class JoopBehaviorSubject<T> extends JoopSubject<T> {\n private _value: T;\n\n constructor(initialValue: T) {\n super();\n this._value = initialValue;\n }\n\n getValue(): T {\n return this._value;\n }\n\n override next(value: T): void {\n this._value = value;\n super.next(value);\n }\n\n override subscribe(listener: Listener<T>): Unsubscribe {\n try {\n listener(this._value);\n } catch (error) {\n _onListenerError(error);\n }\n return super.subscribe(listener);\n }\n\n override asObservable(): JoopObservable<T> {\n return new JoopObservable<T>(listener => this.subscribe(listener));\n }\n}\n\n/**\n * Read-only observable handle returned from asObservable().\n */\nexport class JoopObservable<T> {\n constructor(private _subscribeFn: (listener: Listener<T>) => Unsubscribe) {}\n\n subscribe(listener: Listener<T>): Unsubscribe {\n return this._subscribeFn(listener);\n }\n\n /** Returns the current value without subscribing (only meaningful for BehaviorSubject-backed observables). */\n getOnce(): T | undefined {\n let result: T | undefined;\n const unsub = this.subscribe(v => { result = v; });\n unsub();\n return result;\n }\n}\n","import { JoopBehaviorSubject } from '../events';\n\nexport interface JoopRoute {\n path: string;\n params: Record<string, string>;\n query: Record<string, string>;\n hash: string;\n state: unknown;\n}\n\nexport type JoopRouteGuard = (from: JoopRoute, to: JoopRoute) => boolean | Promise<boolean>;\n\nexport interface JoopRoutePattern {\n pattern: string;\n keys: string[];\n regex: RegExp;\n}\n\nfunction _parseQuery(search: string): Record<string, string> {\n const out: Record<string, string> = {};\n for (const [k, v] of new URLSearchParams(search)) out[k] = v;\n return out;\n}\n\nfunction _compilePattern(pattern: string): JoopRoutePattern {\n const keys: string[] = [];\n const regex = new RegExp(\n '^' + pattern.replace(/:([^/]+)/g, (_, k) => { keys.push(k); return '([^/]+)'; }) + '/?$',\n );\n return { pattern, keys, regex };\n}\n\nfunction _matchRoute(pattern: JoopRoutePattern, path: string): Record<string, string> | null {\n const m = pattern.regex.exec(path);\n if (!m) return null;\n const params: Record<string, string> = {};\n pattern.keys.forEach((k, i) => { params[k] = decodeURIComponent(m[i + 1]); });\n return params;\n}\n\nexport class JoopRouterService {\n private _route$ = new JoopBehaviorSubject<JoopRoute>(this._current());\n private _guards: JoopRouteGuard[] = [];\n private _popHandler: (() => void) | null = null;\n\n constructor() {\n const handler = () => this._route$.next(this._current());\n window.addEventListener('popstate', handler);\n this._popHandler = () => window.removeEventListener('popstate', handler);\n }\n\n private _current(): JoopRoute {\n const { pathname, search, hash } = window.location;\n return { path: pathname, params: {}, query: _parseQuery(search), hash: hash.slice(1), state: history.state };\n }\n\n async navigate(path: string, state?: unknown, replace = false): Promise<boolean> {\n const from = this._route$.getValue();\n const to = this._parse(path, state);\n for (const guard of this._guards) {\n if (!await guard(from, to)) return false;\n }\n if (replace) history.replaceState(state ?? null, '', path);\n else history.pushState(state ?? null, '', path);\n this._route$.next(to);\n return true;\n }\n\n async replace(path: string, state?: unknown): Promise<boolean> { return this.navigate(path, state, true); }\n back(): void { history.back(); }\n forward(): void { history.forward(); }\n go(delta: number): void { history.go(delta); }\n\n currentRoute(): JoopRoute { return this._route$.getValue(); }\n currentPath(): string { return this._route$.getValue().path; }\n route$() { return this._route$.asObservable(); }\n\n addGuard(guard: JoopRouteGuard): () => void {\n this._guards.push(guard);\n return () => { this._guards = this._guards.filter(g => g !== guard); };\n }\n\n /** Match current path against a pattern like '/users/:id' */\n match(pattern: string): Record<string, string> | null {\n return _matchRoute(_compilePattern(pattern), this.currentPath());\n }\n\n buildUrl(path: string, params?: Record<string, string>, query?: Record<string, string>): string {\n let url = path;\n if (params) for (const [k, v] of Object.entries(params)) url = url.replace(`:${k}`, encodeURIComponent(v));\n if (query && Object.keys(query).length) url += '?' + new URLSearchParams(query).toString();\n return url;\n }\n\n parseUrl(url: string): JoopRoute {\n const a = document.createElement('a');\n a.href = url;\n return { path: a.pathname, params: {}, query: _parseQuery(a.search), hash: a.hash.slice(1), state: null };\n }\n\n private _parse(path: string, state: unknown): JoopRoute {\n const idx = path.indexOf('?');\n const hashIdx = path.indexOf('#');\n const bare = idx !== -1 ? path.slice(0, idx) : hashIdx !== -1 ? path.slice(0, hashIdx) : path;\n const search = idx !== -1 ? path.slice(idx, hashIdx !== -1 ? hashIdx : undefined) : '';\n const hash = hashIdx !== -1 ? path.slice(hashIdx + 1) : '';\n return { path: bare, params: {}, query: _parseQuery(search), hash, state };\n }\n\n destroy(): void { this._popHandler?.(); this._guards = []; }\n}\n"]}
@@ -1,4 +1,7 @@
1
1
  // src/events/index.ts
2
+ var _onListenerError = (error) => {
3
+ console.error("[joopjs] a subject subscriber threw during emission:", error);
4
+ };
2
5
  var JoopSubject = class {
3
6
  _listeners = [];
4
7
  subscribe(listener) {
@@ -8,8 +11,13 @@ var JoopSubject = class {
8
11
  };
9
12
  }
10
13
  next(value) {
11
- for (const listener of this._listeners) {
12
- listener(value);
14
+ const listeners = this._listeners.slice();
15
+ for (const listener of listeners) {
16
+ try {
17
+ listener(value);
18
+ } catch (error) {
19
+ _onListenerError(error);
20
+ }
13
21
  }
14
22
  }
15
23
  asObservable() {
@@ -30,7 +38,11 @@ var JoopBehaviorSubject = class extends JoopSubject {
30
38
  super.next(value);
31
39
  }
32
40
  subscribe(listener) {
33
- listener(this._value);
41
+ try {
42
+ listener(this._value);
43
+ } catch (error) {
44
+ _onListenerError(error);
45
+ }
34
46
  return super.subscribe(listener);
35
47
  }
36
48
  asObservable() {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/events/index.ts","../../src/router/router.service.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["export type Unsubscribe = () => void;\nexport type Listener<T> = (value: T) => void;\n\n/**\n * Lightweight pub/sub subject — emits to all current subscribers.\n * Replaces RxJS Subject without pulling in the full RxJS dependency.\n */\nexport class JoopSubject<T> {\n private _listeners: Listener<T>[] = [];\n\n subscribe(listener: Listener<T>): Unsubscribe {\n this._listeners.push(listener);\n return () => {\n this._listeners = this._listeners.filter(l => l !== listener);\n };\n }\n\n next(value: T): void {\n for (const listener of this._listeners) {\n listener(value);\n }\n }\n\n asObservable(): JoopObservable<T> {\n return new JoopObservable<T>(listener => this.subscribe(listener));\n }\n}\n\n/**\n * Stateful subject — replays the current value to any new subscriber immediately.\n * Replaces RxJS BehaviorSubject.\n */\nexport class JoopBehaviorSubject<T> extends JoopSubject<T> {\n private _value: T;\n\n constructor(initialValue: T) {\n super();\n this._value = initialValue;\n }\n\n getValue(): T {\n return this._value;\n }\n\n override next(value: T): void {\n this._value = value;\n super.next(value);\n }\n\n override subscribe(listener: Listener<T>): Unsubscribe {\n listener(this._value);\n return super.subscribe(listener);\n }\n\n override asObservable(): JoopObservable<T> {\n return new JoopObservable<T>(listener => this.subscribe(listener));\n }\n}\n\n/**\n * Read-only observable handle returned from asObservable().\n */\nexport class JoopObservable<T> {\n constructor(private _subscribeFn: (listener: Listener<T>) => Unsubscribe) {}\n\n subscribe(listener: Listener<T>): Unsubscribe {\n return this._subscribeFn(listener);\n }\n\n /** Returns the current value without subscribing (only meaningful for BehaviorSubject-backed observables). */\n getOnce(): T | undefined {\n let result: T | undefined;\n const unsub = this.subscribe(v => { result = v; });\n unsub();\n return result;\n }\n}\n","import { JoopBehaviorSubject } from '../events';\n\nexport interface JoopRoute {\n path: string;\n params: Record<string, string>;\n query: Record<string, string>;\n hash: string;\n state: unknown;\n}\n\nexport type JoopRouteGuard = (from: JoopRoute, to: JoopRoute) => boolean | Promise<boolean>;\n\nexport interface JoopRoutePattern {\n pattern: string;\n keys: string[];\n regex: RegExp;\n}\n\nfunction _parseQuery(search: string): Record<string, string> {\n const out: Record<string, string> = {};\n for (const [k, v] of new URLSearchParams(search)) out[k] = v;\n return out;\n}\n\nfunction _compilePattern(pattern: string): JoopRoutePattern {\n const keys: string[] = [];\n const regex = new RegExp(\n '^' + pattern.replace(/:([^/]+)/g, (_, k) => { keys.push(k); return '([^/]+)'; }) + '/?$',\n );\n return { pattern, keys, regex };\n}\n\nfunction _matchRoute(pattern: JoopRoutePattern, path: string): Record<string, string> | null {\n const m = pattern.regex.exec(path);\n if (!m) return null;\n const params: Record<string, string> = {};\n pattern.keys.forEach((k, i) => { params[k] = decodeURIComponent(m[i + 1]); });\n return params;\n}\n\nexport class JoopRouterService {\n private _route$ = new JoopBehaviorSubject<JoopRoute>(this._current());\n private _guards: JoopRouteGuard[] = [];\n private _popHandler: (() => void) | null = null;\n\n constructor() {\n const handler = () => this._route$.next(this._current());\n window.addEventListener('popstate', handler);\n this._popHandler = () => window.removeEventListener('popstate', handler);\n }\n\n private _current(): JoopRoute {\n const { pathname, search, hash } = window.location;\n return { path: pathname, params: {}, query: _parseQuery(search), hash: hash.slice(1), state: history.state };\n }\n\n async navigate(path: string, state?: unknown, replace = false): Promise<boolean> {\n const from = this._route$.getValue();\n const to = this._parse(path, state);\n for (const guard of this._guards) {\n if (!await guard(from, to)) return false;\n }\n if (replace) history.replaceState(state ?? null, '', path);\n else history.pushState(state ?? null, '', path);\n this._route$.next(to);\n return true;\n }\n\n async replace(path: string, state?: unknown): Promise<boolean> { return this.navigate(path, state, true); }\n back(): void { history.back(); }\n forward(): void { history.forward(); }\n go(delta: number): void { history.go(delta); }\n\n currentRoute(): JoopRoute { return this._route$.getValue(); }\n currentPath(): string { return this._route$.getValue().path; }\n route$() { return this._route$.asObservable(); }\n\n addGuard(guard: JoopRouteGuard): () => void {\n this._guards.push(guard);\n return () => { this._guards = this._guards.filter(g => g !== guard); };\n }\n\n /** Match current path against a pattern like '/users/:id' */\n match(pattern: string): Record<string, string> | null {\n return _matchRoute(_compilePattern(pattern), this.currentPath());\n }\n\n buildUrl(path: string, params?: Record<string, string>, query?: Record<string, string>): string {\n let url = path;\n if (params) for (const [k, v] of Object.entries(params)) url = url.replace(`:${k}`, encodeURIComponent(v));\n if (query && Object.keys(query).length) url += '?' + new URLSearchParams(query).toString();\n return url;\n }\n\n parseUrl(url: string): JoopRoute {\n const a = document.createElement('a');\n a.href = url;\n return { path: a.pathname, params: {}, query: _parseQuery(a.search), hash: a.hash.slice(1), state: null };\n }\n\n private _parse(path: string, state: unknown): JoopRoute {\n const idx = path.indexOf('?');\n const hashIdx = path.indexOf('#');\n const bare = idx !== -1 ? path.slice(0, idx) : hashIdx !== -1 ? path.slice(0, hashIdx) : path;\n const search = idx !== -1 ? path.slice(idx, hashIdx !== -1 ? hashIdx : undefined) : '';\n const hash = hashIdx !== -1 ? path.slice(hashIdx + 1) : '';\n return { path: bare, params: {}, query: _parseQuery(search), hash, state };\n }\n\n destroy(): void { this._popHandler?.(); this._guards = []; }\n}\n"]}
1
+ {"version":3,"sources":["../../src/events/index.ts","../../src/router/router.service.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["export type Unsubscribe = () => void;\nexport type Listener<T> = (value: T) => void;\n\n/**\n * Reports a subscriber that threw during emission, without aborting delivery\n * to the remaining subscribers. Defaults to console.error; override to route\n * to your own logger (e.g. in a banking app where dropped events matter).\n */\nlet _onListenerError: (error: unknown) => void = (error) => {\n // eslint-disable-next-line no-console\n console.error('[joopjs] a subject subscriber threw during emission:', error);\n};\n\n/** Override how subscriber errors are reported during emission. */\nexport function setSubjectErrorHandler(handler: (error: unknown) => void): void {\n _onListenerError = handler;\n}\n\n/**\n * Lightweight pub/sub subject — emits to all current subscribers.\n * Replaces RxJS Subject without pulling in the full RxJS dependency.\n */\nexport class JoopSubject<T> {\n private _listeners: Listener<T>[] = [];\n\n subscribe(listener: Listener<T>): Unsubscribe {\n this._listeners.push(listener);\n return () => {\n this._listeners = this._listeners.filter(l => l !== listener);\n };\n }\n\n next(value: T): void {\n // Snapshot so a subscribe()/unsubscribe() triggered by a listener can't\n // disturb this emission, and isolate each listener so one that throws\n // doesn't deprive later subscribers of the value.\n const listeners = this._listeners.slice();\n for (const listener of listeners) {\n try {\n listener(value);\n } catch (error) {\n _onListenerError(error);\n }\n }\n }\n\n asObservable(): JoopObservable<T> {\n return new JoopObservable<T>(listener => this.subscribe(listener));\n }\n}\n\n/**\n * Stateful subject — replays the current value to any new subscriber immediately.\n * Replaces RxJS BehaviorSubject.\n */\nexport class JoopBehaviorSubject<T> extends JoopSubject<T> {\n private _value: T;\n\n constructor(initialValue: T) {\n super();\n this._value = initialValue;\n }\n\n getValue(): T {\n return this._value;\n }\n\n override next(value: T): void {\n this._value = value;\n super.next(value);\n }\n\n override subscribe(listener: Listener<T>): Unsubscribe {\n try {\n listener(this._value);\n } catch (error) {\n _onListenerError(error);\n }\n return super.subscribe(listener);\n }\n\n override asObservable(): JoopObservable<T> {\n return new JoopObservable<T>(listener => this.subscribe(listener));\n }\n}\n\n/**\n * Read-only observable handle returned from asObservable().\n */\nexport class JoopObservable<T> {\n constructor(private _subscribeFn: (listener: Listener<T>) => Unsubscribe) {}\n\n subscribe(listener: Listener<T>): Unsubscribe {\n return this._subscribeFn(listener);\n }\n\n /** Returns the current value without subscribing (only meaningful for BehaviorSubject-backed observables). */\n getOnce(): T | undefined {\n let result: T | undefined;\n const unsub = this.subscribe(v => { result = v; });\n unsub();\n return result;\n }\n}\n","import { JoopBehaviorSubject } from '../events';\n\nexport interface JoopRoute {\n path: string;\n params: Record<string, string>;\n query: Record<string, string>;\n hash: string;\n state: unknown;\n}\n\nexport type JoopRouteGuard = (from: JoopRoute, to: JoopRoute) => boolean | Promise<boolean>;\n\nexport interface JoopRoutePattern {\n pattern: string;\n keys: string[];\n regex: RegExp;\n}\n\nfunction _parseQuery(search: string): Record<string, string> {\n const out: Record<string, string> = {};\n for (const [k, v] of new URLSearchParams(search)) out[k] = v;\n return out;\n}\n\nfunction _compilePattern(pattern: string): JoopRoutePattern {\n const keys: string[] = [];\n const regex = new RegExp(\n '^' + pattern.replace(/:([^/]+)/g, (_, k) => { keys.push(k); return '([^/]+)'; }) + '/?$',\n );\n return { pattern, keys, regex };\n}\n\nfunction _matchRoute(pattern: JoopRoutePattern, path: string): Record<string, string> | null {\n const m = pattern.regex.exec(path);\n if (!m) return null;\n const params: Record<string, string> = {};\n pattern.keys.forEach((k, i) => { params[k] = decodeURIComponent(m[i + 1]); });\n return params;\n}\n\nexport class JoopRouterService {\n private _route$ = new JoopBehaviorSubject<JoopRoute>(this._current());\n private _guards: JoopRouteGuard[] = [];\n private _popHandler: (() => void) | null = null;\n\n constructor() {\n const handler = () => this._route$.next(this._current());\n window.addEventListener('popstate', handler);\n this._popHandler = () => window.removeEventListener('popstate', handler);\n }\n\n private _current(): JoopRoute {\n const { pathname, search, hash } = window.location;\n return { path: pathname, params: {}, query: _parseQuery(search), hash: hash.slice(1), state: history.state };\n }\n\n async navigate(path: string, state?: unknown, replace = false): Promise<boolean> {\n const from = this._route$.getValue();\n const to = this._parse(path, state);\n for (const guard of this._guards) {\n if (!await guard(from, to)) return false;\n }\n if (replace) history.replaceState(state ?? null, '', path);\n else history.pushState(state ?? null, '', path);\n this._route$.next(to);\n return true;\n }\n\n async replace(path: string, state?: unknown): Promise<boolean> { return this.navigate(path, state, true); }\n back(): void { history.back(); }\n forward(): void { history.forward(); }\n go(delta: number): void { history.go(delta); }\n\n currentRoute(): JoopRoute { return this._route$.getValue(); }\n currentPath(): string { return this._route$.getValue().path; }\n route$() { return this._route$.asObservable(); }\n\n addGuard(guard: JoopRouteGuard): () => void {\n this._guards.push(guard);\n return () => { this._guards = this._guards.filter(g => g !== guard); };\n }\n\n /** Match current path against a pattern like '/users/:id' */\n match(pattern: string): Record<string, string> | null {\n return _matchRoute(_compilePattern(pattern), this.currentPath());\n }\n\n buildUrl(path: string, params?: Record<string, string>, query?: Record<string, string>): string {\n let url = path;\n if (params) for (const [k, v] of Object.entries(params)) url = url.replace(`:${k}`, encodeURIComponent(v));\n if (query && Object.keys(query).length) url += '?' + new URLSearchParams(query).toString();\n return url;\n }\n\n parseUrl(url: string): JoopRoute {\n const a = document.createElement('a');\n a.href = url;\n return { path: a.pathname, params: {}, query: _parseQuery(a.search), hash: a.hash.slice(1), state: null };\n }\n\n private _parse(path: string, state: unknown): JoopRoute {\n const idx = path.indexOf('?');\n const hashIdx = path.indexOf('#');\n const bare = idx !== -1 ? path.slice(0, idx) : hashIdx !== -1 ? path.slice(0, hashIdx) : path;\n const search = idx !== -1 ? path.slice(idx, hashIdx !== -1 ? hashIdx : undefined) : '';\n const hash = hashIdx !== -1 ? path.slice(hashIdx + 1) : '';\n return { path: bare, params: {}, query: _parseQuery(search), hash, state };\n }\n\n destroy(): void { this._popHandler?.(); this._guards = []; }\n}\n"]}
@@ -125,6 +125,9 @@ var JoopSecureStorage = class {
125
125
  };
126
126
 
127
127
  // src/events/index.ts
128
+ var _onListenerError = (error) => {
129
+ console.error("[joopjs] a subject subscriber threw during emission:", error);
130
+ };
128
131
  var JoopSubject = class {
129
132
  _listeners = [];
130
133
  subscribe(listener) {
@@ -134,8 +137,13 @@ var JoopSubject = class {
134
137
  };
135
138
  }
136
139
  next(value) {
137
- for (const listener of this._listeners) {
138
- listener(value);
140
+ const listeners = this._listeners.slice();
141
+ for (const listener of listeners) {
142
+ try {
143
+ listener(value);
144
+ } catch (error) {
145
+ _onListenerError(error);
146
+ }
139
147
  }
140
148
  }
141
149
  asObservable() {
@@ -156,7 +164,11 @@ var JoopBehaviorSubject = class extends JoopSubject {
156
164
  super.next(value);
157
165
  }
158
166
  subscribe(listener) {
159
- listener(this._value);
167
+ try {
168
+ listener(this._value);
169
+ } catch (error) {
170
+ _onListenerError(error);
171
+ }
160
172
  return super.subscribe(listener);
161
173
  }
162
174
  asObservable() {