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/observability/web-vitals.ts","../../src/observability/session-recorder.ts","../../src/observability/correlation.service.ts","../../src/observability/audit-log.service.ts","../../src/observability/performance.service.ts","../../src/observability/error-reporter.service.ts"],"names":["e"],"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, JoopSubject } from '../events';\n\nexport interface JoopVitalsSnapshot {\n lcp: number | null; // Largest Contentful Paint (ms)\n fid: number | null; // First Input Delay (ms) — deprecated, use INP\n inp: number | null; // Interaction to Next Paint (ms)\n cls: number | null; // Cumulative Layout Shift (score)\n ttfb: number | null; // Time to First Byte (ms)\n fcp: number | null; // First Contentful Paint (ms)\n capturedAt: number;\n}\n\nexport interface JoopVitalUpdate {\n metric: keyof Omit<JoopVitalsSnapshot, 'capturedAt'>;\n value: number;\n rating: 'good' | 'needs-improvement' | 'poor';\n}\n\n// Thresholds per https://web.dev/vitals/\nconst THRESHOLDS: Record<string, [number, number]> = {\n lcp: [2500, 4000],\n fid: [100, 300],\n inp: [200, 500],\n cls: [0.1, 0.25],\n ttfb: [800, 1800],\n fcp: [1800, 3000],\n};\n\nexport class JoopWebVitals {\n private _vitals: Partial<JoopVitalsSnapshot> = {};\n private _vitals$ = new JoopSubject<JoopVitalUpdate>();\n private _snapshot$ = new JoopBehaviorSubject<JoopVitalsSnapshot>(this._buildSnapshot());\n private _observers: PerformanceObserver[] = [];\n private _running = false;\n\n start(): void {\n if (this._running || typeof PerformanceObserver === 'undefined') return;\n this._running = true;\n this._observeLCP();\n this._observeFID();\n this._observeINP();\n this._observeCLS();\n this._observeTTFB();\n this._observeFCP();\n }\n\n stop(): void {\n this._running = false;\n for (const obs of this._observers) { try { obs.disconnect(); } catch {} }\n this._observers = [];\n }\n\n snapshot(): JoopVitalsSnapshot { return this._buildSnapshot(); }\n vitals$() { return this._vitals$.asObservable(); }\n snapshot$() { return this._snapshot$.asObservable(); }\n\n getLCP(): number | null { return this._vitals.lcp ?? null; }\n getCLS(): number | null { return this._vitals.cls ?? null; }\n getINP(): number | null { return this._vitals.inp ?? null; }\n getTTFB(): number | null { return this._vitals.ttfb ?? null; }\n getFCP(): number | null { return this._vitals.fcp ?? null; }\n getFID(): number | null { return this._vitals.fid ?? null; }\n\n getRating(metric: string): 'good' | 'needs-improvement' | 'poor' {\n const value = (this._vitals as Record<string, number | null>)[metric];\n return _rate(metric, value ?? null);\n }\n\n private _record(metric: keyof Omit<JoopVitalsSnapshot, 'capturedAt'>, value: number): void {\n (this._vitals as Record<string, number>)[metric] = value;\n const rating = _rate(metric as string, value);\n this._vitals$.next({ metric, value, rating });\n this._snapshot$.next(this._buildSnapshot());\n }\n\n private _observe(types: string[], callback: (list: PerformanceObserverEntryList) => void): void {\n try {\n const obs = new PerformanceObserver(callback);\n obs.observe({ type: types[0], buffered: true });\n this._observers.push(obs);\n } catch {}\n }\n\n private _observeLCP(): void {\n this._observe(['largest-contentful-paint'], list => {\n const entries = list.getEntries();\n if (entries.length) this._record('lcp', (entries[entries.length - 1] as PerformanceEntry & { renderTime?: number; loadTime?: number }).renderTime || (entries[entries.length - 1] as PerformanceEntry & { renderTime?: number; loadTime?: number }).loadTime || entries[entries.length - 1].startTime);\n });\n }\n\n private _observeFID(): void {\n this._observe(['first-input'], list => {\n const e = list.getEntries()[0] as PerformanceEntry & { processingStart?: number };\n if (e && e.processingStart) this._record('fid', e.processingStart - e.startTime);\n });\n }\n\n private _observeINP(): void {\n this._observe(['event'], list => {\n let max = this._vitals.inp ?? 0;\n for (const e of list.getEntries()) {\n const entry = e as PerformanceEntry & { processingEnd?: number };\n if (entry.processingEnd) max = Math.max(max, entry.processingEnd - entry.startTime);\n }\n if (max > 0) this._record('inp', max);\n });\n }\n\n private _observeCLS(): void {\n let clsValue = 0;\n let sessionStart = 0;\n let lastEntry = 0;\n this._observe(['layout-shift'], list => {\n for (const e of list.getEntries()) {\n const entry = e as PerformanceEntry & { hadRecentInput?: boolean; value?: number };\n if (entry.hadRecentInput) continue;\n if (lastEntry > 0 && (entry.startTime - lastEntry) > 1000) {\n if (entry.startTime - sessionStart > 5000) { clsValue = 0; sessionStart = entry.startTime; }\n }\n if (lastEntry === 0) sessionStart = entry.startTime;\n clsValue += entry.value ?? 0;\n lastEntry = entry.startTime;\n this._record('cls', clsValue);\n }\n });\n }\n\n private _observeTTFB(): void {\n const nav = performance.getEntriesByType?.('navigation')?.[0] as PerformanceEntry & { responseStart?: number };\n if (nav?.responseStart) this._record('ttfb', nav.responseStart);\n this._observe(['navigation'], list => {\n const e = list.getEntries()[0] as PerformanceEntry & { responseStart?: number };\n if (e?.responseStart) this._record('ttfb', e.responseStart);\n });\n }\n\n private _observeFCP(): void {\n this._observe(['paint'], list => {\n const e = list.getEntries().find(e => e.name === 'first-contentful-paint');\n if (e) this._record('fcp', e.startTime);\n });\n }\n\n private _buildSnapshot(): JoopVitalsSnapshot {\n return {\n lcp: this._vitals.lcp ?? null,\n fid: this._vitals.fid ?? null,\n inp: this._vitals.inp ?? null,\n cls: this._vitals.cls ?? null,\n ttfb: this._vitals.ttfb ?? null,\n fcp: this._vitals.fcp ?? null,\n capturedAt: Date.now(),\n };\n }\n}\n\nfunction _rate(metric: string, value: number | null): 'good' | 'needs-improvement' | 'poor' {\n if (value === null) return 'good';\n const [good, poor] = THRESHOLDS[metric] ?? [Infinity, Infinity];\n return value <= good ? 'good' : value <= poor ? 'needs-improvement' : 'poor';\n}\n","export type JoopRecordedEventType = 'dom-mutation' | 'click' | 'input' | 'scroll' | 'resize' | 'navigation' | 'custom';\n\nexport interface JoopRecordedEvent {\n type: JoopRecordedEventType;\n timestamp: number;\n selector?: string;\n value?: string;\n data?: Record<string, unknown>;\n}\n\nexport interface JoopSessionRecord {\n startedAt: number;\n stoppedAt: number;\n events: JoopRecordedEvent[];\n url: string;\n userAgent: string;\n}\n\nexport interface JoopSessionRecorderOptions {\n maskSelectors?: string[]; // CSS selectors to mask (replace with ***)\n ignoreSelectors?: string[]; // CSS selectors to ignore entirely\n redactInputs?: boolean; // auto-redact password + [data-pii] inputs\n maxEvents?: number;\n captureScroll?: boolean;\n captureResize?: boolean;\n}\n\nexport class JoopSessionRecorder {\n private _events: JoopRecordedEvent[] = [];\n private _running = false;\n private _paused = false;\n private _startedAt = 0;\n private _opts: Required<JoopSessionRecorderOptions> = {\n maskSelectors: [], ignoreSelectors: [],\n redactInputs: true, maxEvents: 10000,\n captureScroll: true, captureResize: true,\n };\n private _cleanup: Array<() => void> = [];\n private _mutationObserver: MutationObserver | null = null;\n private _scrollTimer: ReturnType<typeof setTimeout> | null = null;\n\n start(options: JoopSessionRecorderOptions = {}): void {\n if (this._running) return;\n this._opts = { ...this._opts, ...options };\n this._running = true; this._paused = false;\n this._events = []; this._startedAt = Date.now();\n this._attachListeners();\n }\n\n pause(): void { this._paused = true; }\n resume(): void { this._paused = false; }\n\n stop(): JoopSessionRecord {\n this._running = false; this._paused = false;\n this._detach();\n return {\n startedAt: this._startedAt, stoppedAt: Date.now(),\n events: [...this._events],\n url: typeof location !== 'undefined' ? location.href : '',\n userAgent: typeof navigator !== 'undefined' ? navigator.userAgent : '',\n };\n }\n\n events(): JoopRecordedEvent[] { return [...this._events]; }\n\n export(format: 'json' | 'compressed' = 'json'): string {\n const record: JoopSessionRecord = {\n startedAt: this._startedAt, stoppedAt: Date.now(),\n events: this._events, url: typeof location !== 'undefined' ? location.href : '', userAgent: typeof navigator !== 'undefined' ? navigator.userAgent : '',\n };\n const json = JSON.stringify(record);\n if (format === 'compressed') {\n try { return btoa(json); } catch { return json; }\n }\n return json;\n }\n\n addEvent(type: JoopRecordedEventType, data?: Record<string, unknown>): void {\n this._push({ type, timestamp: Date.now(), data });\n }\n\n private _push(event: JoopRecordedEvent): void {\n if (!this._running || this._paused) return;\n if (this._events.length >= this._opts.maxEvents) this._events.shift();\n this._events.push(event);\n }\n\n private _attachListeners(): void {\n // DOM mutations\n this._mutationObserver = new MutationObserver(mutations => {\n for (const m of mutations) {\n if (this._shouldIgnore(m.target as Element)) continue;\n this._push({ type: 'dom-mutation', timestamp: Date.now(), selector: _selector(m.target as Element), data: { addedNodes: m.addedNodes.length, removedNodes: m.removedNodes.length, type: m.type } });\n }\n });\n this._mutationObserver.observe(document.documentElement, { childList: true, subtree: true, attributes: true, characterData: false, attributeFilter: ['class', 'style', 'hidden', 'disabled'] });\n\n // Click\n const onClick = (e: MouseEvent) => {\n const el = e.target as Element;\n if (this._shouldIgnore(el)) return;\n this._push({ type: 'click', timestamp: Date.now(), selector: _selector(el) });\n };\n document.addEventListener('click', onClick, { capture: true });\n this._cleanup.push(() => document.removeEventListener('click', onClick, { capture: true }));\n\n // Input\n const onInput = (e: Event) => {\n const el = e.target as HTMLInputElement;\n if (this._shouldIgnore(el)) return;\n const redact = this._opts.redactInputs && (el.type === 'password' || el.dataset?.pii !== undefined || this._opts.maskSelectors.some(s => el.matches(s)));\n this._push({ type: 'input', timestamp: Date.now(), selector: _selector(el), value: redact ? '***' : undefined });\n };\n document.addEventListener('input', onInput, { capture: true });\n this._cleanup.push(() => document.removeEventListener('input', onInput, { capture: true }));\n\n // Scroll (throttled)\n if (this._opts.captureScroll) {\n const onScroll = () => {\n if (this._scrollTimer) return;\n this._scrollTimer = setTimeout(() => {\n this._scrollTimer = null;\n this._push({ type: 'scroll', timestamp: Date.now(), data: { x: window.scrollX, y: window.scrollY } });\n }, 250);\n };\n window.addEventListener('scroll', onScroll, { passive: true });\n this._cleanup.push(() => window.removeEventListener('scroll', onScroll));\n }\n\n // Resize (throttled)\n if (this._opts.captureResize) {\n let resizeTimer: ReturnType<typeof setTimeout> | null = null;\n const onResize = () => {\n if (resizeTimer) return;\n resizeTimer = setTimeout(() => {\n resizeTimer = null;\n this._push({ type: 'resize', timestamp: Date.now(), data: { w: window.innerWidth, h: window.innerHeight } });\n }, 250);\n };\n window.addEventListener('resize', onResize, { passive: true });\n this._cleanup.push(() => window.removeEventListener('resize', onResize));\n }\n\n // Navigation\n const onPop = () => this._push({ type: 'navigation', timestamp: Date.now(), data: { url: location.href } });\n window.addEventListener('popstate', onPop);\n this._cleanup.push(() => window.removeEventListener('popstate', onPop));\n }\n\n private _detach(): void {\n this._mutationObserver?.disconnect(); this._mutationObserver = null;\n for (const fn of this._cleanup) fn();\n this._cleanup = [];\n }\n\n private _shouldIgnore(el: Element | null): boolean {\n if (!el) return false;\n return this._opts.ignoreSelectors.some(s => { try { return el.matches?.(s); } catch { return false; } });\n }\n}\n\nfunction _selector(el: Element | null): string {\n if (!el) return '';\n const parts: string[] = [];\n let current: Element | null = el;\n while (current && current !== document.body && parts.length < 4) {\n let part = current.tagName.toLowerCase();\n if (current.id) { parts.unshift(`#${current.id}`); break; }\n if (current.className) part += '.' + Array.from(current.classList).slice(0, 2).join('.');\n parts.unshift(part);\n current = current.parentElement;\n }\n return parts.join(' > ');\n}\n","export class JoopCorrelationService {\n private _correlationId = '';\n private _requestId = '';\n\n newCorrelation(): string {\n this._correlationId = crypto.randomUUID();\n return this._correlationId;\n }\n\n newRequest(): string {\n this._requestId = crypto.randomUUID();\n return this._requestId;\n }\n\n getCorrelationId(): string { return this._correlationId; }\n getRequestId(): string { return this._requestId; }\n\n headers(): Record<string, string> {\n const h: Record<string, string> = {};\n if (this._correlationId) h['X-Correlation-ID'] = this._correlationId;\n if (this._requestId) h['X-Request-ID'] = this._requestId;\n return h;\n }\n\n clear(): void { this._correlationId = ''; this._requestId = ''; }\n}\n","export type JoopAuditAction =\n | 'login' | 'logout' | 'session-timeout' | 'session-extended'\n | 'transfer-initiated' | 'transfer-confirmed' | 'transfer-failed'\n | 'profile-updated' | 'password-changed' | 'settings-changed'\n | 'document-viewed' | 'statement-downloaded' | 'otp-sent' | 'otp-verified'\n | 'biometric-registered' | 'biometric-authenticated'\n | string;\n\nexport interface JoopAuditEntry {\n id: string;\n action: JoopAuditAction;\n timestamp: number;\n userId?: string;\n sessionId?: string;\n correlationId?: string;\n metadata?: Record<string, unknown>;\n success: boolean;\n}\n\nexport type JoopAuditListener = (entry: JoopAuditEntry) => void;\n\nexport class JoopAuditLog {\n private _entries: JoopAuditEntry[] = [];\n private _listeners: JoopAuditListener[] = [];\n\n constructor(private _maxEntries = 500) {}\n\n record(action: JoopAuditAction, options: {\n userId?: string;\n sessionId?: string;\n correlationId?: string;\n metadata?: Record<string, unknown>;\n success?: boolean;\n } = {}): JoopAuditEntry {\n const entry: JoopAuditEntry = {\n id: crypto.randomUUID(),\n action,\n timestamp: Date.now(),\n success: options.success ?? true,\n ...options,\n };\n this._entries.push(entry);\n if (this._entries.length > this._maxEntries) this._entries = this._entries.slice(-this._maxEntries);\n this._listeners.forEach(l => l(entry));\n return entry;\n }\n\n getAll(): JoopAuditEntry[] { return [...this._entries]; }\n getByAction(action: JoopAuditAction): JoopAuditEntry[] { return this._entries.filter(e => e.action === action); }\n getBySession(sessionId: string): JoopAuditEntry[] { return this._entries.filter(e => e.sessionId === sessionId); }\n getByUser(userId: string): JoopAuditEntry[] { return this._entries.filter(e => e.userId === userId); }\n\n onRecord(listener: JoopAuditListener): () => void {\n this._listeners.push(listener);\n return () => { this._listeners = this._listeners.filter(l => l !== listener); };\n }\n\n clear(): void { this._entries = []; }\n export(): string { return JSON.stringify(this._entries, null, 2); }\n}\n","export interface JoopPerfMark {\n name: string;\n startTime: number;\n endTime?: number;\n duration?: number;\n metadata?: Record<string, unknown>;\n}\n\nexport class JoopPerformanceService {\n private _marks = new Map<string, JoopPerfMark>();\n private _completed: JoopPerfMark[] = [];\n\n mark(name: string, metadata?: Record<string, unknown>): void {\n this._marks.set(name, { name, startTime: performance.now(), metadata });\n }\n\n measure(name: string): JoopPerfMark | null {\n const mark = this._marks.get(name);\n if (!mark) return null;\n const endTime = performance.now();\n const entry: JoopPerfMark = { ...mark, endTime, duration: endTime - mark.startTime };\n this._marks.delete(name);\n this._completed.push(entry);\n return entry;\n }\n\n async timeAsync<T>(name: string, fn: () => Promise<T>): Promise<T> {\n this.mark(name);\n try {\n const result = await fn();\n this.measure(name);\n return result;\n } catch (err) {\n this.measure(name);\n throw err;\n }\n }\n\n timeSync<T>(name: string, fn: () => T): T {\n this.mark(name);\n try {\n const result = fn();\n this.measure(name);\n return result;\n } catch (err) {\n this.measure(name);\n throw err;\n }\n }\n\n getCompleted(): JoopPerfMark[] { return [...this._completed]; }\n getByName(name: string): JoopPerfMark[] { return this._completed.filter(m => m.name === name); }\n\n getAverage(name: string): number | null {\n const entries = this._completed.filter(m => m.name === name && m.duration !== undefined);\n if (!entries.length) return null;\n return entries.reduce((sum, m) => sum + m.duration!, 0) / entries.length;\n }\n\n clear(): void { this._marks.clear(); this._completed = []; }\n}\n","export interface JoopErrorReport {\n id: string;\n message: string;\n stack?: string;\n context?: Record<string, unknown>;\n timestamp: number;\n userId?: string;\n sessionId?: string;\n}\n\nexport type JoopErrorHandler = (report: JoopErrorReport) => void | Promise<void>;\n\nexport class JoopErrorReporter {\n private _handlers: JoopErrorHandler[] = [];\n private _userId = '';\n private _sessionId = '';\n private _context: Record<string, unknown> = {};\n\n setUser(userId: string): void { this._userId = userId; }\n setSession(sessionId: string): void { this._sessionId = sessionId; }\n setContext(ctx: Record<string, unknown>): void { this._context = { ...this._context, ...ctx }; }\n\n addHandler(handler: JoopErrorHandler): () => void {\n this._handlers.push(handler);\n return () => { this._handlers = this._handlers.filter(h => h !== handler); };\n }\n\n capture(error: unknown, extra?: Record<string, unknown>): JoopErrorReport {\n const err = error instanceof Error ? error : new Error(String(error));\n const report: JoopErrorReport = {\n id: crypto.randomUUID(),\n message: err.message,\n stack: err.stack,\n context: { ...this._context, ...extra },\n timestamp: Date.now(),\n ...(this._userId ? { userId: this._userId } : {}),\n ...(this._sessionId ? { sessionId: this._sessionId } : {}),\n };\n this._handlers.forEach(h => Promise.resolve(h(report)).catch(() => {}));\n return report;\n }\n\n captureMessage(message: string, extra?: Record<string, unknown>): JoopErrorReport {\n return this.capture(new Error(message), extra);\n }\n\n clear(): void {\n this._handlers = [];\n this._userId = '';\n this._sessionId = '';\n this._context = {};\n }\n}\n"]}
1
+ {"version":3,"sources":["../../src/events/index.ts","../../src/observability/web-vitals.ts","../../src/observability/session-recorder.ts","../../src/observability/correlation.service.ts","../../src/observability/audit-log.service.ts","../../src/observability/performance.service.ts","../../src/observability/error-reporter.service.ts"],"names":["e"],"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, JoopSubject } from '../events';\n\nexport interface JoopVitalsSnapshot {\n lcp: number | null; // Largest Contentful Paint (ms)\n fid: number | null; // First Input Delay (ms) — deprecated, use INP\n inp: number | null; // Interaction to Next Paint (ms)\n cls: number | null; // Cumulative Layout Shift (score)\n ttfb: number | null; // Time to First Byte (ms)\n fcp: number | null; // First Contentful Paint (ms)\n capturedAt: number;\n}\n\nexport interface JoopVitalUpdate {\n metric: keyof Omit<JoopVitalsSnapshot, 'capturedAt'>;\n value: number;\n rating: 'good' | 'needs-improvement' | 'poor';\n}\n\n// Thresholds per https://web.dev/vitals/\nconst THRESHOLDS: Record<string, [number, number]> = {\n lcp: [2500, 4000],\n fid: [100, 300],\n inp: [200, 500],\n cls: [0.1, 0.25],\n ttfb: [800, 1800],\n fcp: [1800, 3000],\n};\n\nexport class JoopWebVitals {\n private _vitals: Partial<JoopVitalsSnapshot> = {};\n private _vitals$ = new JoopSubject<JoopVitalUpdate>();\n private _snapshot$ = new JoopBehaviorSubject<JoopVitalsSnapshot>(this._buildSnapshot());\n private _observers: PerformanceObserver[] = [];\n private _running = false;\n\n start(): void {\n if (this._running || typeof PerformanceObserver === 'undefined') return;\n this._running = true;\n this._observeLCP();\n this._observeFID();\n this._observeINP();\n this._observeCLS();\n this._observeTTFB();\n this._observeFCP();\n }\n\n stop(): void {\n this._running = false;\n for (const obs of this._observers) { try { obs.disconnect(); } catch {} }\n this._observers = [];\n }\n\n snapshot(): JoopVitalsSnapshot { return this._buildSnapshot(); }\n vitals$() { return this._vitals$.asObservable(); }\n snapshot$() { return this._snapshot$.asObservable(); }\n\n getLCP(): number | null { return this._vitals.lcp ?? null; }\n getCLS(): number | null { return this._vitals.cls ?? null; }\n getINP(): number | null { return this._vitals.inp ?? null; }\n getTTFB(): number | null { return this._vitals.ttfb ?? null; }\n getFCP(): number | null { return this._vitals.fcp ?? null; }\n getFID(): number | null { return this._vitals.fid ?? null; }\n\n getRating(metric: string): 'good' | 'needs-improvement' | 'poor' {\n const value = (this._vitals as Record<string, number | null>)[metric];\n return _rate(metric, value ?? null);\n }\n\n private _record(metric: keyof Omit<JoopVitalsSnapshot, 'capturedAt'>, value: number): void {\n (this._vitals as Record<string, number>)[metric] = value;\n const rating = _rate(metric as string, value);\n this._vitals$.next({ metric, value, rating });\n this._snapshot$.next(this._buildSnapshot());\n }\n\n private _observe(types: string[], callback: (list: PerformanceObserverEntryList) => void): void {\n try {\n const obs = new PerformanceObserver(callback);\n obs.observe({ type: types[0], buffered: true });\n this._observers.push(obs);\n } catch {}\n }\n\n private _observeLCP(): void {\n this._observe(['largest-contentful-paint'], list => {\n const entries = list.getEntries();\n if (entries.length) this._record('lcp', (entries[entries.length - 1] as PerformanceEntry & { renderTime?: number; loadTime?: number }).renderTime || (entries[entries.length - 1] as PerformanceEntry & { renderTime?: number; loadTime?: number }).loadTime || entries[entries.length - 1].startTime);\n });\n }\n\n private _observeFID(): void {\n this._observe(['first-input'], list => {\n const e = list.getEntries()[0] as PerformanceEntry & { processingStart?: number };\n if (e && e.processingStart) this._record('fid', e.processingStart - e.startTime);\n });\n }\n\n private _observeINP(): void {\n this._observe(['event'], list => {\n let max = this._vitals.inp ?? 0;\n for (const e of list.getEntries()) {\n const entry = e as PerformanceEntry & { processingEnd?: number };\n if (entry.processingEnd) max = Math.max(max, entry.processingEnd - entry.startTime);\n }\n if (max > 0) this._record('inp', max);\n });\n }\n\n private _observeCLS(): void {\n let clsValue = 0;\n let sessionStart = 0;\n let lastEntry = 0;\n this._observe(['layout-shift'], list => {\n for (const e of list.getEntries()) {\n const entry = e as PerformanceEntry & { hadRecentInput?: boolean; value?: number };\n if (entry.hadRecentInput) continue;\n if (lastEntry > 0 && (entry.startTime - lastEntry) > 1000) {\n if (entry.startTime - sessionStart > 5000) { clsValue = 0; sessionStart = entry.startTime; }\n }\n if (lastEntry === 0) sessionStart = entry.startTime;\n clsValue += entry.value ?? 0;\n lastEntry = entry.startTime;\n this._record('cls', clsValue);\n }\n });\n }\n\n private _observeTTFB(): void {\n const nav = performance.getEntriesByType?.('navigation')?.[0] as PerformanceEntry & { responseStart?: number };\n if (nav?.responseStart) this._record('ttfb', nav.responseStart);\n this._observe(['navigation'], list => {\n const e = list.getEntries()[0] as PerformanceEntry & { responseStart?: number };\n if (e?.responseStart) this._record('ttfb', e.responseStart);\n });\n }\n\n private _observeFCP(): void {\n this._observe(['paint'], list => {\n const e = list.getEntries().find(e => e.name === 'first-contentful-paint');\n if (e) this._record('fcp', e.startTime);\n });\n }\n\n private _buildSnapshot(): JoopVitalsSnapshot {\n return {\n lcp: this._vitals.lcp ?? null,\n fid: this._vitals.fid ?? null,\n inp: this._vitals.inp ?? null,\n cls: this._vitals.cls ?? null,\n ttfb: this._vitals.ttfb ?? null,\n fcp: this._vitals.fcp ?? null,\n capturedAt: Date.now(),\n };\n }\n}\n\nfunction _rate(metric: string, value: number | null): 'good' | 'needs-improvement' | 'poor' {\n if (value === null) return 'good';\n const [good, poor] = THRESHOLDS[metric] ?? [Infinity, Infinity];\n return value <= good ? 'good' : value <= poor ? 'needs-improvement' : 'poor';\n}\n","export type JoopRecordedEventType = 'dom-mutation' | 'click' | 'input' | 'scroll' | 'resize' | 'navigation' | 'custom';\n\nexport interface JoopRecordedEvent {\n type: JoopRecordedEventType;\n timestamp: number;\n selector?: string;\n value?: string;\n data?: Record<string, unknown>;\n}\n\nexport interface JoopSessionRecord {\n startedAt: number;\n stoppedAt: number;\n events: JoopRecordedEvent[];\n url: string;\n userAgent: string;\n}\n\nexport interface JoopSessionRecorderOptions {\n maskSelectors?: string[]; // CSS selectors to mask (replace with ***)\n ignoreSelectors?: string[]; // CSS selectors to ignore entirely\n redactInputs?: boolean; // auto-redact password + [data-pii] inputs\n maxEvents?: number;\n captureScroll?: boolean;\n captureResize?: boolean;\n}\n\nexport class JoopSessionRecorder {\n private _events: JoopRecordedEvent[] = [];\n private _running = false;\n private _paused = false;\n private _startedAt = 0;\n private _opts: Required<JoopSessionRecorderOptions> = {\n maskSelectors: [], ignoreSelectors: [],\n redactInputs: true, maxEvents: 10000,\n captureScroll: true, captureResize: true,\n };\n private _cleanup: Array<() => void> = [];\n private _mutationObserver: MutationObserver | null = null;\n private _scrollTimer: ReturnType<typeof setTimeout> | null = null;\n\n start(options: JoopSessionRecorderOptions = {}): void {\n if (this._running) return;\n this._opts = { ...this._opts, ...options };\n this._running = true; this._paused = false;\n this._events = []; this._startedAt = Date.now();\n this._attachListeners();\n }\n\n pause(): void { this._paused = true; }\n resume(): void { this._paused = false; }\n\n stop(): JoopSessionRecord {\n this._running = false; this._paused = false;\n this._detach();\n return {\n startedAt: this._startedAt, stoppedAt: Date.now(),\n events: [...this._events],\n url: typeof location !== 'undefined' ? location.href : '',\n userAgent: typeof navigator !== 'undefined' ? navigator.userAgent : '',\n };\n }\n\n events(): JoopRecordedEvent[] { return [...this._events]; }\n\n export(format: 'json' | 'compressed' = 'json'): string {\n const record: JoopSessionRecord = {\n startedAt: this._startedAt, stoppedAt: Date.now(),\n events: this._events, url: typeof location !== 'undefined' ? location.href : '', userAgent: typeof navigator !== 'undefined' ? navigator.userAgent : '',\n };\n const json = JSON.stringify(record);\n if (format === 'compressed') {\n try { return btoa(json); } catch { return json; }\n }\n return json;\n }\n\n addEvent(type: JoopRecordedEventType, data?: Record<string, unknown>): void {\n this._push({ type, timestamp: Date.now(), data });\n }\n\n private _push(event: JoopRecordedEvent): void {\n if (!this._running || this._paused) return;\n if (this._events.length >= this._opts.maxEvents) this._events.shift();\n this._events.push(event);\n }\n\n private _attachListeners(): void {\n // DOM mutations\n this._mutationObserver = new MutationObserver(mutations => {\n for (const m of mutations) {\n if (this._shouldIgnore(m.target as Element)) continue;\n this._push({ type: 'dom-mutation', timestamp: Date.now(), selector: _selector(m.target as Element), data: { addedNodes: m.addedNodes.length, removedNodes: m.removedNodes.length, type: m.type } });\n }\n });\n this._mutationObserver.observe(document.documentElement, { childList: true, subtree: true, attributes: true, characterData: false, attributeFilter: ['class', 'style', 'hidden', 'disabled'] });\n\n // Click\n const onClick = (e: MouseEvent) => {\n const el = e.target as Element;\n if (this._shouldIgnore(el)) return;\n this._push({ type: 'click', timestamp: Date.now(), selector: _selector(el) });\n };\n document.addEventListener('click', onClick, { capture: true });\n this._cleanup.push(() => document.removeEventListener('click', onClick, { capture: true }));\n\n // Input\n const onInput = (e: Event) => {\n const el = e.target as HTMLInputElement;\n if (this._shouldIgnore(el)) return;\n const redact = this._opts.redactInputs && (el.type === 'password' || el.dataset?.pii !== undefined || this._opts.maskSelectors.some(s => el.matches(s)));\n this._push({ type: 'input', timestamp: Date.now(), selector: _selector(el), value: redact ? '***' : undefined });\n };\n document.addEventListener('input', onInput, { capture: true });\n this._cleanup.push(() => document.removeEventListener('input', onInput, { capture: true }));\n\n // Scroll (throttled)\n if (this._opts.captureScroll) {\n const onScroll = () => {\n if (this._scrollTimer) return;\n this._scrollTimer = setTimeout(() => {\n this._scrollTimer = null;\n this._push({ type: 'scroll', timestamp: Date.now(), data: { x: window.scrollX, y: window.scrollY } });\n }, 250);\n };\n window.addEventListener('scroll', onScroll, { passive: true });\n this._cleanup.push(() => window.removeEventListener('scroll', onScroll));\n }\n\n // Resize (throttled)\n if (this._opts.captureResize) {\n let resizeTimer: ReturnType<typeof setTimeout> | null = null;\n const onResize = () => {\n if (resizeTimer) return;\n resizeTimer = setTimeout(() => {\n resizeTimer = null;\n this._push({ type: 'resize', timestamp: Date.now(), data: { w: window.innerWidth, h: window.innerHeight } });\n }, 250);\n };\n window.addEventListener('resize', onResize, { passive: true });\n this._cleanup.push(() => window.removeEventListener('resize', onResize));\n }\n\n // Navigation\n const onPop = () => this._push({ type: 'navigation', timestamp: Date.now(), data: { url: location.href } });\n window.addEventListener('popstate', onPop);\n this._cleanup.push(() => window.removeEventListener('popstate', onPop));\n }\n\n private _detach(): void {\n this._mutationObserver?.disconnect(); this._mutationObserver = null;\n for (const fn of this._cleanup) fn();\n this._cleanup = [];\n }\n\n private _shouldIgnore(el: Element | null): boolean {\n if (!el) return false;\n return this._opts.ignoreSelectors.some(s => { try { return el.matches?.(s); } catch { return false; } });\n }\n}\n\nfunction _selector(el: Element | null): string {\n if (!el) return '';\n const parts: string[] = [];\n let current: Element | null = el;\n while (current && current !== document.body && parts.length < 4) {\n let part = current.tagName.toLowerCase();\n if (current.id) { parts.unshift(`#${current.id}`); break; }\n if (current.className) part += '.' + Array.from(current.classList).slice(0, 2).join('.');\n parts.unshift(part);\n current = current.parentElement;\n }\n return parts.join(' > ');\n}\n","export class JoopCorrelationService {\n private _correlationId = '';\n private _requestId = '';\n\n newCorrelation(): string {\n this._correlationId = crypto.randomUUID();\n return this._correlationId;\n }\n\n newRequest(): string {\n this._requestId = crypto.randomUUID();\n return this._requestId;\n }\n\n getCorrelationId(): string { return this._correlationId; }\n getRequestId(): string { return this._requestId; }\n\n headers(): Record<string, string> {\n const h: Record<string, string> = {};\n if (this._correlationId) h['X-Correlation-ID'] = this._correlationId;\n if (this._requestId) h['X-Request-ID'] = this._requestId;\n return h;\n }\n\n clear(): void { this._correlationId = ''; this._requestId = ''; }\n}\n","export type JoopAuditAction =\n | 'login' | 'logout' | 'session-timeout' | 'session-extended'\n | 'transfer-initiated' | 'transfer-confirmed' | 'transfer-failed'\n | 'profile-updated' | 'password-changed' | 'settings-changed'\n | 'document-viewed' | 'statement-downloaded' | 'otp-sent' | 'otp-verified'\n | 'biometric-registered' | 'biometric-authenticated'\n | string;\n\nexport interface JoopAuditEntry {\n id: string;\n action: JoopAuditAction;\n timestamp: number;\n userId?: string;\n sessionId?: string;\n correlationId?: string;\n metadata?: Record<string, unknown>;\n success: boolean;\n}\n\nexport type JoopAuditListener = (entry: JoopAuditEntry) => void;\n\nexport class JoopAuditLog {\n private _entries: JoopAuditEntry[] = [];\n private _listeners: JoopAuditListener[] = [];\n\n constructor(private _maxEntries = 500) {}\n\n record(action: JoopAuditAction, options: {\n userId?: string;\n sessionId?: string;\n correlationId?: string;\n metadata?: Record<string, unknown>;\n success?: boolean;\n } = {}): JoopAuditEntry {\n const entry: JoopAuditEntry = {\n id: crypto.randomUUID(),\n action,\n timestamp: Date.now(),\n success: options.success ?? true,\n ...options,\n };\n this._entries.push(entry);\n if (this._entries.length > this._maxEntries) this._entries = this._entries.slice(-this._maxEntries);\n this._listeners.forEach(l => l(entry));\n return entry;\n }\n\n getAll(): JoopAuditEntry[] { return [...this._entries]; }\n getByAction(action: JoopAuditAction): JoopAuditEntry[] { return this._entries.filter(e => e.action === action); }\n getBySession(sessionId: string): JoopAuditEntry[] { return this._entries.filter(e => e.sessionId === sessionId); }\n getByUser(userId: string): JoopAuditEntry[] { return this._entries.filter(e => e.userId === userId); }\n\n onRecord(listener: JoopAuditListener): () => void {\n this._listeners.push(listener);\n return () => { this._listeners = this._listeners.filter(l => l !== listener); };\n }\n\n clear(): void { this._entries = []; }\n export(): string { return JSON.stringify(this._entries, null, 2); }\n}\n","export interface JoopPerfMark {\n name: string;\n startTime: number;\n endTime?: number;\n duration?: number;\n metadata?: Record<string, unknown>;\n}\n\nexport class JoopPerformanceService {\n private _marks = new Map<string, JoopPerfMark>();\n private _completed: JoopPerfMark[] = [];\n\n mark(name: string, metadata?: Record<string, unknown>): void {\n this._marks.set(name, { name, startTime: performance.now(), metadata });\n }\n\n measure(name: string): JoopPerfMark | null {\n const mark = this._marks.get(name);\n if (!mark) return null;\n const endTime = performance.now();\n const entry: JoopPerfMark = { ...mark, endTime, duration: endTime - mark.startTime };\n this._marks.delete(name);\n this._completed.push(entry);\n return entry;\n }\n\n async timeAsync<T>(name: string, fn: () => Promise<T>): Promise<T> {\n this.mark(name);\n try {\n const result = await fn();\n this.measure(name);\n return result;\n } catch (err) {\n this.measure(name);\n throw err;\n }\n }\n\n timeSync<T>(name: string, fn: () => T): T {\n this.mark(name);\n try {\n const result = fn();\n this.measure(name);\n return result;\n } catch (err) {\n this.measure(name);\n throw err;\n }\n }\n\n getCompleted(): JoopPerfMark[] { return [...this._completed]; }\n getByName(name: string): JoopPerfMark[] { return this._completed.filter(m => m.name === name); }\n\n getAverage(name: string): number | null {\n const entries = this._completed.filter(m => m.name === name && m.duration !== undefined);\n if (!entries.length) return null;\n return entries.reduce((sum, m) => sum + m.duration!, 0) / entries.length;\n }\n\n clear(): void { this._marks.clear(); this._completed = []; }\n}\n","export interface JoopErrorReport {\n id: string;\n message: string;\n stack?: string;\n context?: Record<string, unknown>;\n timestamp: number;\n userId?: string;\n sessionId?: string;\n}\n\nexport type JoopErrorHandler = (report: JoopErrorReport) => void | Promise<void>;\n\nexport class JoopErrorReporter {\n private _handlers: JoopErrorHandler[] = [];\n private _userId = '';\n private _sessionId = '';\n private _context: Record<string, unknown> = {};\n\n setUser(userId: string): void { this._userId = userId; }\n setSession(sessionId: string): void { this._sessionId = sessionId; }\n setContext(ctx: Record<string, unknown>): void { this._context = { ...this._context, ...ctx }; }\n\n addHandler(handler: JoopErrorHandler): () => void {\n this._handlers.push(handler);\n return () => { this._handlers = this._handlers.filter(h => h !== handler); };\n }\n\n capture(error: unknown, extra?: Record<string, unknown>): JoopErrorReport {\n const err = error instanceof Error ? error : new Error(String(error));\n const report: JoopErrorReport = {\n id: crypto.randomUUID(),\n message: err.message,\n stack: err.stack,\n context: { ...this._context, ...extra },\n timestamp: Date.now(),\n ...(this._userId ? { userId: this._userId } : {}),\n ...(this._sessionId ? { sessionId: this._sessionId } : {}),\n };\n this._handlers.forEach(h => Promise.resolve(h(report)).catch(() => {}));\n return report;\n }\n\n captureMessage(message: string, extra?: Record<string, unknown>): JoopErrorReport {\n return this.capture(new Error(message), extra);\n }\n\n clear(): void {\n this._handlers = [];\n this._userId = '';\n this._sessionId = '';\n this._context = {};\n }\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/observability/web-vitals.ts","../../src/observability/session-recorder.ts","../../src/observability/correlation.service.ts","../../src/observability/audit-log.service.ts","../../src/observability/performance.service.ts","../../src/observability/error-reporter.service.ts"],"names":["e"],"mappings":";AAOO,IAAM,cAAN,MAAqB;AAAA,EAClB,aAA4B,EAAC;AAAA,EAErC,UAAU,QAAA,EAAoC;AAC5C,IAAA,IAAA,CAAK,UAAA,CAAW,KAAK,QAAQ,CAAA;AAC7B,IAAA,OAAO,MAAM;AACX,MAAA,IAAA,CAAK,aAAa,IAAA,CAAK,UAAA,CAAW,MAAA,CAAO,CAAA,CAAA,KAAK,MAAM,QAAQ,CAAA;AAAA,IAC9D,CAAA;AAAA,EACF;AAAA,EAEA,KAAK,KAAA,EAAgB;AACnB,IAAA,KAAA,MAAW,QAAA,IAAY,KAAK,UAAA,EAAY;AACtC,MAAA,QAAA,CAAS,KAAK,CAAA;AAAA,IAChB;AAAA,EACF;AAAA,EAEA,YAAA,GAAkC;AAChC,IAAA,OAAO,IAAI,cAAA,CAAkB,CAAA,QAAA,KAAY,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAC,CAAA;AAAA,EACnE;AACF,CAAA;AAMO,IAAM,mBAAA,GAAN,cAAqC,WAAA,CAAe;AAAA,EACjD,MAAA;AAAA,EAER,YAAY,YAAA,EAAiB;AAC3B,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,MAAA,GAAS,YAAA;AAAA,EAChB;AAAA,EAEA,QAAA,GAAc;AACZ,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA,EAES,KAAK,KAAA,EAAgB;AAC5B,IAAA,IAAA,CAAK,MAAA,GAAS,KAAA;AACd,IAAA,KAAA,CAAM,KAAK,KAAK,CAAA;AAAA,EAClB;AAAA,EAES,UAAU,QAAA,EAAoC;AACrD,IAAA,QAAA,CAAS,KAAK,MAAM,CAAA;AACpB,IAAA,OAAO,KAAA,CAAM,UAAU,QAAQ,CAAA;AAAA,EACjC;AAAA,EAES,YAAA,GAAkC;AACzC,IAAA,OAAO,IAAI,cAAA,CAAkB,CAAA,QAAA,KAAY,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAC,CAAA;AAAA,EACnE;AACF,CAAA;AAKO,IAAM,iBAAN,MAAwB;AAAA,EAC7B,YAAoB,YAAA,EAAsD;AAAtD,IAAA,IAAA,CAAA,YAAA,GAAA,YAAA;AAAA,EAAuD;AAAA,EAAvD,YAAA;AAAA,EAEpB,UAAU,QAAA,EAAoC;AAC5C,IAAA,OAAO,IAAA,CAAK,aAAa,QAAQ,CAAA;AAAA,EACnC;AAAA;AAAA,EAGA,OAAA,GAAyB;AACvB,IAAA,IAAI,MAAA;AACJ,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,SAAA,CAAU,CAAA,CAAA,KAAK;AAAE,MAAA,MAAA,GAAS,CAAA;AAAA,IAAG,CAAC,CAAA;AACjD,IAAA,KAAA,EAAM;AACN,IAAA,OAAO,MAAA;AAAA,EACT;AACF,CAAA;;;ACzDA,IAAM,UAAA,GAA+C;AAAA,EACnD,GAAA,EAAM,CAAC,IAAA,EAAM,GAAI,CAAA;AAAA,EACjB,GAAA,EAAM,CAAC,GAAA,EAAK,GAAG,CAAA;AAAA,EACf,GAAA,EAAM,CAAC,GAAA,EAAK,GAAG,CAAA;AAAA,EACf,GAAA,EAAM,CAAC,GAAA,EAAK,IAAI,CAAA;AAAA,EAChB,IAAA,EAAM,CAAC,GAAA,EAAK,IAAI,CAAA;AAAA,EAChB,GAAA,EAAM,CAAC,IAAA,EAAM,GAAI;AACnB,CAAA;AAEO,IAAM,gBAAN,MAAoB;AAAA,EACjB,UAAuC,EAAC;AAAA,EACxC,QAAA,GAAW,IAAI,WAAA,EAA6B;AAAA,EAC5C,UAAA,GAAa,IAAI,mBAAA,CAAwC,IAAA,CAAK,gBAAgB,CAAA;AAAA,EAC9E,aAAoC,EAAC;AAAA,EACrC,QAAA,GAAW,KAAA;AAAA,EAEnB,KAAA,GAAc;AACZ,IAAA,IAAI,IAAA,CAAK,QAAA,IAAY,OAAO,mBAAA,KAAwB,WAAA,EAAa;AACjE,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAChB,IAAA,IAAA,CAAK,WAAA,EAAY;AACjB,IAAA,IAAA,CAAK,WAAA,EAAY;AACjB,IAAA,IAAA,CAAK,WAAA,EAAY;AACjB,IAAA,IAAA,CAAK,WAAA,EAAY;AACjB,IAAA,IAAA,CAAK,YAAA,EAAa;AAClB,IAAA,IAAA,CAAK,WAAA,EAAY;AAAA,EACnB;AAAA,EAEA,IAAA,GAAa;AACX,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAChB,IAAA,KAAA,MAAW,GAAA,IAAO,KAAK,UAAA,EAAY;AAAE,MAAA,IAAI;AAAE,QAAA,GAAA,CAAI,UAAA,EAAW;AAAA,MAAG,CAAA,CAAA,MAAQ;AAAA,MAAC;AAAA,IAAE;AACxE,IAAA,IAAA,CAAK,aAAa,EAAC;AAAA,EACrB;AAAA,EAEA,QAAA,GAA+B;AAAE,IAAA,OAAO,KAAK,cAAA,EAAe;AAAA,EAAG;AAAA,EAC/D,OAAA,GAAU;AAAE,IAAA,OAAO,IAAA,CAAK,SAAS,YAAA,EAAa;AAAA,EAAG;AAAA,EACjD,SAAA,GAAY;AAAE,IAAA,OAAO,IAAA,CAAK,WAAW,YAAA,EAAa;AAAA,EAAG;AAAA,EAErD,MAAA,GAAwB;AAAE,IAAA,OAAO,IAAA,CAAK,QAAQ,GAAA,IAAO,IAAA;AAAA,EAAM;AAAA,EAC3D,MAAA,GAAwB;AAAE,IAAA,OAAO,IAAA,CAAK,QAAQ,GAAA,IAAO,IAAA;AAAA,EAAM;AAAA,EAC3D,MAAA,GAAwB;AAAE,IAAA,OAAO,IAAA,CAAK,QAAQ,GAAA,IAAO,IAAA;AAAA,EAAM;AAAA,EAC3D,OAAA,GAAyB;AAAE,IAAA,OAAO,IAAA,CAAK,QAAQ,IAAA,IAAQ,IAAA;AAAA,EAAM;AAAA,EAC7D,MAAA,GAAwB;AAAE,IAAA,OAAO,IAAA,CAAK,QAAQ,GAAA,IAAO,IAAA;AAAA,EAAM;AAAA,EAC3D,MAAA,GAAwB;AAAE,IAAA,OAAO,IAAA,CAAK,QAAQ,GAAA,IAAO,IAAA;AAAA,EAAM;AAAA,EAE3D,UAAU,MAAA,EAAuD;AAC/D,IAAA,MAAM,KAAA,GAAS,IAAA,CAAK,OAAA,CAA0C,MAAM,CAAA;AACpE,IAAA,OAAO,KAAA,CAAM,MAAA,EAAQ,KAAA,IAAS,IAAI,CAAA;AAAA,EACpC;AAAA,EAEQ,OAAA,CAAQ,QAAsD,KAAA,EAAqB;AACzF,IAAC,IAAA,CAAK,OAAA,CAAmC,MAAM,CAAA,GAAI,KAAA;AACnD,IAAA,MAAM,MAAA,GAAS,KAAA,CAAM,MAAA,EAAkB,KAAK,CAAA;AAC5C,IAAA,IAAA,CAAK,SAAS,IAAA,CAAK,EAAE,MAAA,EAAQ,KAAA,EAAO,QAAQ,CAAA;AAC5C,IAAA,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,IAAA,CAAK,cAAA,EAAgB,CAAA;AAAA,EAC5C;AAAA,EAEQ,QAAA,CAAS,OAAiB,QAAA,EAA8D;AAC9F,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,IAAI,mBAAA,CAAoB,QAAQ,CAAA;AAC5C,MAAA,GAAA,CAAI,OAAA,CAAQ,EAAE,IAAA,EAAM,KAAA,CAAM,CAAC,CAAA,EAAG,QAAA,EAAU,MAAM,CAAA;AAC9C,MAAA,IAAA,CAAK,UAAA,CAAW,KAAK,GAAG,CAAA;AAAA,IAC1B,CAAA,CAAA,MAAQ;AAAA,IAAC;AAAA,EACX;AAAA,EAEQ,WAAA,GAAoB;AAC1B,IAAA,IAAA,CAAK,QAAA,CAAS,CAAC,0BAA0B,CAAA,EAAG,CAAA,IAAA,KAAQ;AAClD,MAAA,MAAM,OAAA,GAAU,KAAK,UAAA,EAAW;AAChC,MAAA,IAAI,OAAA,CAAQ,QAAQ,IAAA,CAAK,OAAA,CAAQ,OAAQ,OAAA,CAAQ,OAAA,CAAQ,MAAA,GAAS,CAAC,CAAA,CAAoE,UAAA,IAAe,QAAQ,OAAA,CAAQ,MAAA,GAAS,CAAC,CAAA,CAAoE,QAAA,IAAY,QAAQ,OAAA,CAAQ,MAAA,GAAS,CAAC,CAAA,CAAE,SAAS,CAAA;AAAA,IACvS,CAAC,CAAA;AAAA,EACH;AAAA,EAEQ,WAAA,GAAoB;AAC1B,IAAA,IAAA,CAAK,QAAA,CAAS,CAAC,aAAa,CAAA,EAAG,CAAA,IAAA,KAAQ;AACrC,MAAA,MAAM,CAAA,GAAI,IAAA,CAAK,UAAA,EAAW,CAAE,CAAC,CAAA;AAC7B,MAAA,IAAI,CAAA,IAAK,EAAE,eAAA,EAAiB,IAAA,CAAK,QAAQ,KAAA,EAAO,CAAA,CAAE,eAAA,GAAkB,CAAA,CAAE,SAAS,CAAA;AAAA,IACjF,CAAC,CAAA;AAAA,EACH;AAAA,EAEQ,WAAA,GAAoB;AAC1B,IAAA,IAAA,CAAK,QAAA,CAAS,CAAC,OAAO,CAAA,EAAG,CAAA,IAAA,KAAQ;AAC/B,MAAA,IAAI,GAAA,GAAM,IAAA,CAAK,OAAA,CAAQ,GAAA,IAAO,CAAA;AAC9B,MAAA,KAAA,MAAW,CAAA,IAAK,IAAA,CAAK,UAAA,EAAW,EAAG;AACjC,QAAA,MAAM,KAAA,GAAQ,CAAA;AACd,QAAA,IAAI,KAAA,CAAM,eAAe,GAAA,GAAM,IAAA,CAAK,IAAI,GAAA,EAAK,KAAA,CAAM,aAAA,GAAgB,KAAA,CAAM,SAAS,CAAA;AAAA,MACpF;AACA,MAAA,IAAI,GAAA,GAAM,CAAA,EAAG,IAAA,CAAK,OAAA,CAAQ,OAAO,GAAG,CAAA;AAAA,IACtC,CAAC,CAAA;AAAA,EACH;AAAA,EAEQ,WAAA,GAAoB;AAC1B,IAAA,IAAI,QAAA,GAAW,CAAA;AACf,IAAA,IAAI,YAAA,GAAe,CAAA;AACnB,IAAA,IAAI,SAAA,GAAY,CAAA;AAChB,IAAA,IAAA,CAAK,QAAA,CAAS,CAAC,cAAc,CAAA,EAAG,CAAA,IAAA,KAAQ;AACtC,MAAA,KAAA,MAAW,CAAA,IAAK,IAAA,CAAK,UAAA,EAAW,EAAG;AACjC,QAAA,MAAM,KAAA,GAAQ,CAAA;AACd,QAAA,IAAI,MAAM,cAAA,EAAgB;AAC1B,QAAA,IAAI,SAAA,GAAY,CAAA,IAAM,KAAA,CAAM,SAAA,GAAY,YAAa,GAAA,EAAM;AACzD,UAAA,IAAI,KAAA,CAAM,SAAA,GAAY,YAAA,GAAe,GAAA,EAAM;AAAE,YAAA,QAAA,GAAW,CAAA;AAAG,YAAA,YAAA,GAAe,KAAA,CAAM,SAAA;AAAA,UAAW;AAAA,QAC7F;AACA,QAAA,IAAI,SAAA,KAAc,CAAA,EAAG,YAAA,GAAe,KAAA,CAAM,SAAA;AAC1C,QAAA,QAAA,IAAY,MAAM,KAAA,IAAS,CAAA;AAC3B,QAAA,SAAA,GAAY,KAAA,CAAM,SAAA;AAClB,QAAA,IAAA,CAAK,OAAA,CAAQ,OAAO,QAAQ,CAAA;AAAA,MAC9B;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA,EAEQ,YAAA,GAAqB;AAC3B,IAAA,MAAM,GAAA,GAAM,WAAA,CAAY,gBAAA,GAAmB,YAAY,IAAI,CAAC,CAAA;AAC5D,IAAA,IAAI,KAAK,aAAA,EAAe,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,IAAI,aAAa,CAAA;AAC9D,IAAA,IAAA,CAAK,QAAA,CAAS,CAAC,YAAY,CAAA,EAAG,CAAA,IAAA,KAAQ;AACpC,MAAA,MAAM,CAAA,GAAI,IAAA,CAAK,UAAA,EAAW,CAAE,CAAC,CAAA;AAC7B,MAAA,IAAI,GAAG,aAAA,EAAe,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,EAAE,aAAa,CAAA;AAAA,IAC5D,CAAC,CAAA;AAAA,EACH;AAAA,EAEQ,WAAA,GAAoB;AAC1B,IAAA,IAAA,CAAK,QAAA,CAAS,CAAC,OAAO,CAAA,EAAG,CAAA,IAAA,KAAQ;AAC/B,MAAA,MAAM,CAAA,GAAI,KAAK,UAAA,EAAW,CAAE,KAAK,CAAAA,EAAAA,KAAKA,EAAAA,CAAE,IAAA,KAAS,wBAAwB,CAAA;AACzE,MAAA,IAAI,CAAA,EAAG,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,EAAE,SAAS,CAAA;AAAA,IACxC,CAAC,CAAA;AAAA,EACH;AAAA,EAEQ,cAAA,GAAqC;AAC3C,IAAA,OAAO;AAAA,MACL,GAAA,EAAK,IAAA,CAAK,OAAA,CAAQ,GAAA,IAAO,IAAA;AAAA,MACzB,GAAA,EAAK,IAAA,CAAK,OAAA,CAAQ,GAAA,IAAO,IAAA;AAAA,MACzB,GAAA,EAAK,IAAA,CAAK,OAAA,CAAQ,GAAA,IAAO,IAAA;AAAA,MACzB,GAAA,EAAK,IAAA,CAAK,OAAA,CAAQ,GAAA,IAAO,IAAA;AAAA,MACzB,IAAA,EAAM,IAAA,CAAK,OAAA,CAAQ,IAAA,IAAQ,IAAA;AAAA,MAC3B,GAAA,EAAK,IAAA,CAAK,OAAA,CAAQ,GAAA,IAAO,IAAA;AAAA,MACzB,UAAA,EAAY,KAAK,GAAA;AAAI,KACvB;AAAA,EACF;AACF;AAEA,SAAS,KAAA,CAAM,QAAgB,KAAA,EAA6D;AAC1F,EAAA,IAAI,KAAA,KAAU,MAAM,OAAO,MAAA;AAC3B,EAAA,MAAM,CAAC,MAAM,IAAI,CAAA,GAAI,WAAW,MAAM,CAAA,IAAK,CAAC,QAAA,EAAU,QAAQ,CAAA;AAC9D,EAAA,OAAO,KAAA,IAAS,IAAA,GAAO,MAAA,GAAS,KAAA,IAAS,OAAO,mBAAA,GAAsB,MAAA;AACxE;;;ACrIO,IAAM,sBAAN,MAA0B;AAAA,EACvB,UAA+B,EAAC;AAAA,EAChC,QAAA,GAAW,KAAA;AAAA,EACX,OAAA,GAAU,KAAA;AAAA,EACV,UAAA,GAAa,CAAA;AAAA,EACb,KAAA,GAA8C;AAAA,IACpD,eAAe,EAAC;AAAA,IAAG,iBAAiB,EAAC;AAAA,IACrC,YAAA,EAAc,IAAA;AAAA,IAAM,SAAA,EAAW,GAAA;AAAA,IAC/B,aAAA,EAAe,IAAA;AAAA,IAAM,aAAA,EAAe;AAAA,GACtC;AAAA,EACQ,WAA8B,EAAC;AAAA,EAC/B,iBAAA,GAA6C,IAAA;AAAA,EAC7C,YAAA,GAAqD,IAAA;AAAA,EAE7D,KAAA,CAAM,OAAA,GAAsC,EAAC,EAAS;AACpD,IAAA,IAAI,KAAK,QAAA,EAAU;AACnB,IAAA,IAAA,CAAK,QAAQ,EAAE,GAAG,IAAA,CAAK,KAAA,EAAO,GAAG,OAAA,EAAQ;AACzC,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAAM,IAAA,IAAA,CAAK,OAAA,GAAU,KAAA;AACrC,IAAA,IAAA,CAAK,UAAU,EAAC;AAAG,IAAA,IAAA,CAAK,UAAA,GAAa,KAAK,GAAA,EAAI;AAC9C,IAAA,IAAA,CAAK,gBAAA,EAAiB;AAAA,EACxB;AAAA,EAEA,KAAA,GAAc;AAAE,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AAAA,EAAM;AAAA,EACrC,MAAA,GAAe;AAAE,IAAA,IAAA,CAAK,OAAA,GAAU,KAAA;AAAA,EAAO;AAAA,EAEvC,IAAA,GAA0B;AACxB,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAO,IAAA,IAAA,CAAK,OAAA,GAAU,KAAA;AACtC,IAAA,IAAA,CAAK,OAAA,EAAQ;AACb,IAAA,OAAO;AAAA,MACL,WAAW,IAAA,CAAK,UAAA;AAAA,MAAY,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MAChD,MAAA,EAAQ,CAAC,GAAG,IAAA,CAAK,OAAO,CAAA;AAAA,MACxB,GAAA,EAAK,OAAO,QAAA,KAAa,WAAA,GAAc,SAAS,IAAA,GAAO,EAAA;AAAA,MACvD,SAAA,EAAW,OAAO,SAAA,KAAc,WAAA,GAAc,UAAU,SAAA,GAAY;AAAA,KACtE;AAAA,EACF;AAAA,EAEA,MAAA,GAA8B;AAAE,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,OAAO,CAAA;AAAA,EAAG;AAAA,EAE1D,MAAA,CAAO,SAAgC,MAAA,EAAgB;AACrD,IAAA,MAAM,MAAA,GAA4B;AAAA,MAChC,WAAW,IAAA,CAAK,UAAA;AAAA,MAAY,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MAChD,QAAQ,IAAA,CAAK,OAAA;AAAA,MAAS,GAAA,EAAK,OAAO,QAAA,KAAa,WAAA,GAAc,SAAS,IAAA,GAAO,EAAA;AAAA,MAAI,SAAA,EAAW,OAAO,SAAA,KAAc,WAAA,GAAc,UAAU,SAAA,GAAY;AAAA,KACvJ;AACA,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA;AAClC,IAAA,IAAI,WAAW,YAAA,EAAc;AAC3B,MAAA,IAAI;AAAE,QAAA,OAAO,KAAK,IAAI,CAAA;AAAA,MAAG,CAAA,CAAA,MAAQ;AAAE,QAAA,OAAO,IAAA;AAAA,MAAM;AAAA,IAClD;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,QAAA,CAAS,MAA6B,IAAA,EAAsC;AAC1E,IAAA,IAAA,CAAK,KAAA,CAAM,EAAE,IAAA,EAAM,SAAA,EAAW,KAAK,GAAA,EAAI,EAAG,MAAM,CAAA;AAAA,EAClD;AAAA,EAEQ,MAAM,KAAA,EAAgC;AAC5C,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,OAAA,EAAS;AACpC,IAAA,IAAI,IAAA,CAAK,QAAQ,MAAA,IAAU,IAAA,CAAK,MAAM,SAAA,EAAW,IAAA,CAAK,QAAQ,KAAA,EAAM;AACpE,IAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,KAAK,CAAA;AAAA,EACzB;AAAA,EAEQ,gBAAA,GAAyB;AAE/B,IAAA,IAAA,CAAK,iBAAA,GAAoB,IAAI,gBAAA,CAAiB,CAAA,SAAA,KAAa;AACzD,MAAA,KAAA,MAAW,KAAK,SAAA,EAAW;AACzB,QAAA,IAAI,IAAA,CAAK,aAAA,CAAc,CAAA,CAAE,MAAiB,CAAA,EAAG;AAC7C,QAAA,IAAA,CAAK,KAAA,CAAM,EAAE,IAAA,EAAM,cAAA,EAAgB,SAAA,EAAW,IAAA,CAAK,GAAA,EAAI,EAAG,QAAA,EAAU,SAAA,CAAU,CAAA,CAAE,MAAiB,CAAA,EAAG,IAAA,EAAM,EAAE,UAAA,EAAY,CAAA,CAAE,UAAA,CAAW,MAAA,EAAQ,YAAA,EAAc,CAAA,CAAE,YAAA,CAAa,MAAA,EAAQ,IAAA,EAAM,CAAA,CAAE,IAAA,EAAK,EAAG,CAAA;AAAA,MACpM;AAAA,IACF,CAAC,CAAA;AACD,IAAA,IAAA,CAAK,iBAAA,CAAkB,QAAQ,QAAA,CAAS,eAAA,EAAiB,EAAE,SAAA,EAAW,IAAA,EAAM,SAAS,IAAA,EAAM,UAAA,EAAY,MAAM,aAAA,EAAe,KAAA,EAAO,iBAAiB,CAAC,OAAA,EAAS,SAAS,QAAA,EAAU,UAAU,GAAG,CAAA;AAG9L,IAAA,MAAM,OAAA,GAAU,CAAC,CAAA,KAAkB;AACjC,MAAA,MAAM,KAAK,CAAA,CAAE,MAAA;AACb,MAAA,IAAI,IAAA,CAAK,aAAA,CAAc,EAAE,CAAA,EAAG;AAC5B,MAAA,IAAA,CAAK,KAAA,CAAM,EAAE,IAAA,EAAM,OAAA,EAAS,SAAA,EAAW,IAAA,CAAK,GAAA,EAAI,EAAG,QAAA,EAAU,SAAA,CAAU,EAAE,CAAA,EAAG,CAAA;AAAA,IAC9E,CAAA;AACA,IAAA,QAAA,CAAS,iBAAiB,OAAA,EAAS,OAAA,EAAS,EAAE,OAAA,EAAS,MAAM,CAAA;AAC7D,IAAA,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,MAAM,QAAA,CAAS,mBAAA,CAAoB,OAAA,EAAS,OAAA,EAAS,EAAE,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA;AAG1F,IAAA,MAAM,OAAA,GAAU,CAAC,CAAA,KAAa;AAC5B,MAAA,MAAM,KAAK,CAAA,CAAE,MAAA;AACb,MAAA,IAAI,IAAA,CAAK,aAAA,CAAc,EAAE,CAAA,EAAG;AAC5B,MAAA,MAAM,SAAS,IAAA,CAAK,KAAA,CAAM,iBAAiB,EAAA,CAAG,IAAA,KAAS,cAAc,EAAA,CAAG,OAAA,EAAS,QAAQ,MAAA,IAAa,IAAA,CAAK,MAAM,aAAA,CAAc,IAAA,CAAK,OAAK,EAAA,CAAG,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA;AACtJ,MAAA,IAAA,CAAK,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,SAAA,EAAW,KAAK,GAAA,EAAI,EAAG,QAAA,EAAU,SAAA,CAAU,EAAE,CAAA,EAAG,KAAA,EAAO,MAAA,GAAS,KAAA,GAAQ,QAAW,CAAA;AAAA,IACjH,CAAA;AACA,IAAA,QAAA,CAAS,iBAAiB,OAAA,EAAS,OAAA,EAAS,EAAE,OAAA,EAAS,MAAM,CAAA;AAC7D,IAAA,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,MAAM,QAAA,CAAS,mBAAA,CAAoB,OAAA,EAAS,OAAA,EAAS,EAAE,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA;AAG1F,IAAA,IAAI,IAAA,CAAK,MAAM,aAAA,EAAe;AAC5B,MAAA,MAAM,WAAW,MAAM;AACrB,QAAA,IAAI,KAAK,YAAA,EAAc;AACvB,QAAA,IAAA,CAAK,YAAA,GAAe,WAAW,MAAM;AACnC,UAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AACpB,UAAA,IAAA,CAAK,MAAM,EAAE,IAAA,EAAM,QAAA,EAAU,SAAA,EAAW,KAAK,GAAA,EAAI,EAAG,IAAA,EAAM,EAAE,GAAG,MAAA,CAAO,OAAA,EAAS,GAAG,MAAA,CAAO,OAAA,IAAW,CAAA;AAAA,QACtG,GAAG,GAAG,CAAA;AAAA,MACR,CAAA;AACA,MAAA,MAAA,CAAO,iBAAiB,QAAA,EAAU,QAAA,EAAU,EAAE,OAAA,EAAS,MAAM,CAAA;AAC7D,MAAA,IAAA,CAAK,SAAS,IAAA,CAAK,MAAM,OAAO,mBAAA,CAAoB,QAAA,EAAU,QAAQ,CAAC,CAAA;AAAA,IACzE;AAGA,IAAA,IAAI,IAAA,CAAK,MAAM,aAAA,EAAe;AAC5B,MAAA,IAAI,WAAA,GAAoD,IAAA;AACxD,MAAA,MAAM,WAAW,MAAM;AACrB,QAAA,IAAI,WAAA,EAAa;AACjB,QAAA,WAAA,GAAc,WAAW,MAAM;AAC7B,UAAA,WAAA,GAAc,IAAA;AACd,UAAA,IAAA,CAAK,MAAM,EAAE,IAAA,EAAM,QAAA,EAAU,SAAA,EAAW,KAAK,GAAA,EAAI,EAAG,IAAA,EAAM,EAAE,GAAG,MAAA,CAAO,UAAA,EAAY,GAAG,MAAA,CAAO,WAAA,IAAe,CAAA;AAAA,QAC7G,GAAG,GAAG,CAAA;AAAA,MACR,CAAA;AACA,MAAA,MAAA,CAAO,iBAAiB,QAAA,EAAU,QAAA,EAAU,EAAE,OAAA,EAAS,MAAM,CAAA;AAC7D,MAAA,IAAA,CAAK,SAAS,IAAA,CAAK,MAAM,OAAO,mBAAA,CAAoB,QAAA,EAAU,QAAQ,CAAC,CAAA;AAAA,IACzE;AAGA,IAAA,MAAM,QAAQ,MAAM,IAAA,CAAK,KAAA,CAAM,EAAE,MAAM,YAAA,EAAc,SAAA,EAAW,IAAA,CAAK,GAAA,IAAO,IAAA,EAAM,EAAE,KAAK,QAAA,CAAS,IAAA,IAAQ,CAAA;AAC1G,IAAA,MAAA,CAAO,gBAAA,CAAiB,YAAY,KAAK,CAAA;AACzC,IAAA,IAAA,CAAK,SAAS,IAAA,CAAK,MAAM,OAAO,mBAAA,CAAoB,UAAA,EAAY,KAAK,CAAC,CAAA;AAAA,EACxE;AAAA,EAEQ,OAAA,GAAgB;AACtB,IAAA,IAAA,CAAK,mBAAmB,UAAA,EAAW;AAAG,IAAA,IAAA,CAAK,iBAAA,GAAoB,IAAA;AAC/D,IAAA,KAAA,MAAW,EAAA,IAAM,IAAA,CAAK,QAAA,EAAU,EAAA,EAAG;AACnC,IAAA,IAAA,CAAK,WAAW,EAAC;AAAA,EACnB;AAAA,EAEQ,cAAc,EAAA,EAA6B;AACjD,IAAA,IAAI,CAAC,IAAI,OAAO,KAAA;AAChB,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,eAAA,CAAgB,IAAA,CAAK,CAAA,CAAA,KAAK;AAAE,MAAA,IAAI;AAAE,QAAA,OAAO,EAAA,CAAG,UAAU,CAAC,CAAA;AAAA,MAAG,CAAA,CAAA,MAAQ;AAAE,QAAA,OAAO,KAAA;AAAA,MAAO;AAAA,IAAE,CAAC,CAAA;AAAA,EACzG;AACF;AAEA,SAAS,UAAU,EAAA,EAA4B;AAC7C,EAAA,IAAI,CAAC,IAAI,OAAO,EAAA;AAChB,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,IAAI,OAAA,GAA0B,EAAA;AAC9B,EAAA,OAAO,WAAW,OAAA,KAAY,QAAA,CAAS,IAAA,IAAQ,KAAA,CAAM,SAAS,CAAA,EAAG;AAC/D,IAAA,IAAI,IAAA,GAAO,OAAA,CAAQ,OAAA,CAAQ,WAAA,EAAY;AACvC,IAAA,IAAI,QAAQ,EAAA,EAAI;AAAE,MAAA,KAAA,CAAM,OAAA,CAAQ,CAAA,CAAA,EAAI,OAAA,CAAQ,EAAE,CAAA,CAAE,CAAA;AAAG,MAAA;AAAA,IAAO;AAC1D,IAAA,IAAI,OAAA,CAAQ,SAAA,EAAW,IAAA,IAAQ,GAAA,GAAM,MAAM,IAAA,CAAK,OAAA,CAAQ,SAAS,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CAAE,KAAK,GAAG,CAAA;AACvF,IAAA,KAAA,CAAM,QAAQ,IAAI,CAAA;AAClB,IAAA,OAAA,GAAU,OAAA,CAAQ,aAAA;AAAA,EACpB;AACA,EAAA,OAAO,KAAA,CAAM,KAAK,KAAK,CAAA;AACzB;;;AC7KO,IAAM,yBAAN,MAA6B;AAAA,EAC1B,cAAA,GAAiB,EAAA;AAAA,EACjB,UAAA,GAAa,EAAA;AAAA,EAErB,cAAA,GAAyB;AACvB,IAAA,IAAA,CAAK,cAAA,GAAiB,OAAO,UAAA,EAAW;AACxC,IAAA,OAAO,IAAA,CAAK,cAAA;AAAA,EACd;AAAA,EAEA,UAAA,GAAqB;AACnB,IAAA,IAAA,CAAK,UAAA,GAAa,OAAO,UAAA,EAAW;AACpC,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EACd;AAAA,EAEA,gBAAA,GAA2B;AAAE,IAAA,OAAO,IAAA,CAAK,cAAA;AAAA,EAAgB;AAAA,EACzD,YAAA,GAAuB;AAAE,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EAAY;AAAA,EAEjD,OAAA,GAAkC;AAChC,IAAA,MAAM,IAA4B,EAAC;AACnC,IAAA,IAAI,IAAA,CAAK,cAAA,EAAgB,CAAA,CAAE,kBAAkB,IAAI,IAAA,CAAK,cAAA;AACtD,IAAA,IAAI,IAAA,CAAK,UAAA,EAAY,CAAA,CAAE,cAAc,IAAI,IAAA,CAAK,UAAA;AAC9C,IAAA,OAAO,CAAA;AAAA,EACT;AAAA,EAEA,KAAA,GAAc;AAAE,IAAA,IAAA,CAAK,cAAA,GAAiB,EAAA;AAAI,IAAA,IAAA,CAAK,UAAA,GAAa,EAAA;AAAA,EAAI;AAClE;;;ACJO,IAAM,eAAN,MAAmB;AAAA,EAIxB,WAAA,CAAoB,cAAc,GAAA,EAAK;AAAnB,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AAAA,EAAoB;AAAA,EAApB,WAAA;AAAA,EAHZ,WAA6B,EAAC;AAAA,EAC9B,aAAkC,EAAC;AAAA,EAI3C,MAAA,CAAO,MAAA,EAAyB,OAAA,GAM5B,EAAC,EAAmB;AACtB,IAAA,MAAM,KAAA,GAAwB;AAAA,MAC5B,EAAA,EAAI,OAAO,UAAA,EAAW;AAAA,MACtB,MAAA;AAAA,MACA,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB,OAAA,EAAS,QAAQ,OAAA,IAAW,IAAA;AAAA,MAC5B,GAAG;AAAA,KACL;AACA,IAAA,IAAA,CAAK,QAAA,CAAS,KAAK,KAAK,CAAA;AACxB,IAAA,IAAI,IAAA,CAAK,QAAA,CAAS,MAAA,GAAS,IAAA,CAAK,WAAA,EAAa,IAAA,CAAK,QAAA,GAAW,IAAA,CAAK,QAAA,CAAS,KAAA,CAAM,CAAC,IAAA,CAAK,WAAW,CAAA;AAClG,IAAA,IAAA,CAAK,UAAA,CAAW,OAAA,CAAQ,CAAA,CAAA,KAAK,CAAA,CAAE,KAAK,CAAC,CAAA;AACrC,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,MAAA,GAA2B;AAAE,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,QAAQ,CAAA;AAAA,EAAG;AAAA,EACxD,YAAY,MAAA,EAA2C;AAAE,IAAA,OAAO,KAAK,QAAA,CAAS,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,WAAW,MAAM,CAAA;AAAA,EAAG;AAAA,EAChH,aAAa,SAAA,EAAqC;AAAE,IAAA,OAAO,KAAK,QAAA,CAAS,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,cAAc,SAAS,CAAA;AAAA,EAAG;AAAA,EACjH,UAAU,MAAA,EAAkC;AAAE,IAAA,OAAO,KAAK,QAAA,CAAS,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,WAAW,MAAM,CAAA;AAAA,EAAG;AAAA,EAErG,SAAS,QAAA,EAAyC;AAChD,IAAA,IAAA,CAAK,UAAA,CAAW,KAAK,QAAQ,CAAA;AAC7B,IAAA,OAAO,MAAM;AAAE,MAAA,IAAA,CAAK,aAAa,IAAA,CAAK,UAAA,CAAW,MAAA,CAAO,CAAA,CAAA,KAAK,MAAM,QAAQ,CAAA;AAAA,IAAG,CAAA;AAAA,EAChF;AAAA,EAEA,KAAA,GAAc;AAAE,IAAA,IAAA,CAAK,WAAW,EAAC;AAAA,EAAG;AAAA,EACpC,MAAA,GAAiB;AAAE,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,QAAA,EAAU,MAAM,CAAC,CAAA;AAAA,EAAG;AACpE;;;ACnDO,IAAM,yBAAN,MAA6B;AAAA,EAC1B,MAAA,uBAAa,GAAA,EAA0B;AAAA,EACvC,aAA6B,EAAC;AAAA,EAEtC,IAAA,CAAK,MAAc,QAAA,EAA0C;AAC3D,IAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,IAAA,EAAM,EAAE,IAAA,EAAM,WAAW,WAAA,CAAY,GAAA,EAAI,EAAG,QAAA,EAAU,CAAA;AAAA,EACxE;AAAA,EAEA,QAAQ,IAAA,EAAmC;AACzC,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,IAAI,CAAA;AACjC,IAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,IAAA,MAAM,OAAA,GAAU,YAAY,GAAA,EAAI;AAChC,IAAA,MAAM,KAAA,GAAsB,EAAE,GAAG,IAAA,EAAM,SAAS,QAAA,EAAU,OAAA,GAAU,KAAK,SAAA,EAAU;AACnF,IAAA,IAAA,CAAK,MAAA,CAAO,OAAO,IAAI,CAAA;AACvB,IAAA,IAAA,CAAK,UAAA,CAAW,KAAK,KAAK,CAAA;AAC1B,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,MAAM,SAAA,CAAa,IAAA,EAAc,EAAA,EAAkC;AACjE,IAAA,IAAA,CAAK,KAAK,IAAI,CAAA;AACd,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,EAAA,EAAG;AACxB,MAAA,IAAA,CAAK,QAAQ,IAAI,CAAA;AACjB,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,GAAA,EAAK;AACZ,MAAA,IAAA,CAAK,QAAQ,IAAI,CAAA;AACjB,MAAA,MAAM,GAAA;AAAA,IACR;AAAA,EACF;AAAA,EAEA,QAAA,CAAY,MAAc,EAAA,EAAgB;AACxC,IAAA,IAAA,CAAK,KAAK,IAAI,CAAA;AACd,IAAA,IAAI;AACF,MAAA,MAAM,SAAS,EAAA,EAAG;AAClB,MAAA,IAAA,CAAK,QAAQ,IAAI,CAAA;AACjB,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,GAAA,EAAK;AACZ,MAAA,IAAA,CAAK,QAAQ,IAAI,CAAA;AACjB,MAAA,MAAM,GAAA;AAAA,IACR;AAAA,EACF;AAAA,EAEA,YAAA,GAA+B;AAAE,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,UAAU,CAAA;AAAA,EAAG;AAAA,EAC9D,UAAU,IAAA,EAA8B;AAAE,IAAA,OAAO,KAAK,UAAA,CAAW,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,IAAI,CAAA;AAAA,EAAG;AAAA,EAE/F,WAAW,IAAA,EAA6B;AACtC,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,UAAA,CAAW,MAAA,CAAO,CAAA,CAAA,KAAK,EAAE,IAAA,KAAS,IAAA,IAAQ,CAAA,CAAE,QAAA,KAAa,MAAS,CAAA;AACvF,IAAA,IAAI,CAAC,OAAA,CAAQ,MAAA,EAAQ,OAAO,IAAA;AAC5B,IAAA,OAAO,OAAA,CAAQ,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,KAAM,MAAM,CAAA,CAAE,QAAA,EAAW,CAAC,CAAA,GAAI,OAAA,CAAQ,MAAA;AAAA,EACpE;AAAA,EAEA,KAAA,GAAc;AAAE,IAAA,IAAA,CAAK,OAAO,KAAA,EAAM;AAAG,IAAA,IAAA,CAAK,aAAa,EAAC;AAAA,EAAG;AAC7D;;;AChDO,IAAM,oBAAN,MAAwB;AAAA,EACrB,YAAgC,EAAC;AAAA,EACjC,OAAA,GAAU,EAAA;AAAA,EACV,UAAA,GAAa,EAAA;AAAA,EACb,WAAoC,EAAC;AAAA,EAE7C,QAAQ,MAAA,EAAsB;AAAE,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA;AAAA,EAAQ;AAAA,EACvD,WAAW,SAAA,EAAyB;AAAE,IAAA,IAAA,CAAK,UAAA,GAAa,SAAA;AAAA,EAAW;AAAA,EACnE,WAAW,GAAA,EAAoC;AAAE,IAAA,IAAA,CAAK,WAAW,EAAE,GAAG,IAAA,CAAK,QAAA,EAAU,GAAG,GAAA,EAAI;AAAA,EAAG;AAAA,EAE/F,WAAW,OAAA,EAAuC;AAChD,IAAA,IAAA,CAAK,SAAA,CAAU,KAAK,OAAO,CAAA;AAC3B,IAAA,OAAO,MAAM;AAAE,MAAA,IAAA,CAAK,YAAY,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,CAAA,CAAA,KAAK,MAAM,OAAO,CAAA;AAAA,IAAG,CAAA;AAAA,EAC7E;AAAA,EAEA,OAAA,CAAQ,OAAgB,KAAA,EAAkD;AACxE,IAAA,MAAM,GAAA,GAAM,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AACpE,IAAA,MAAM,MAAA,GAA0B;AAAA,MAC9B,EAAA,EAAI,OAAO,UAAA,EAAW;AAAA,MACtB,SAAS,GAAA,CAAI,OAAA;AAAA,MACb,OAAO,GAAA,CAAI,KAAA;AAAA,MACX,SAAS,EAAE,GAAG,IAAA,CAAK,QAAA,EAAU,GAAG,KAAA,EAAM;AAAA,MACtC,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB,GAAI,KAAK,OAAA,GAAU,EAAE,QAAQ,IAAA,CAAK,OAAA,KAAY,EAAC;AAAA,MAC/C,GAAI,KAAK,UAAA,GAAa,EAAE,WAAW,IAAA,CAAK,UAAA,KAAe;AAAC,KAC1D;AACA,IAAA,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,CAAA,CAAA,KAAK,OAAA,CAAQ,OAAA,CAAQ,EAAE,MAAM,CAAC,CAAA,CAAE,KAAA,CAAM,MAAM;AAAA,IAAC,CAAC,CAAC,CAAA;AACtE,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,cAAA,CAAe,SAAiB,KAAA,EAAkD;AAChF,IAAA,OAAO,KAAK,OAAA,CAAQ,IAAI,KAAA,CAAM,OAAO,GAAG,KAAK,CAAA;AAAA,EAC/C;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,YAAY,EAAC;AAClB,IAAA,IAAA,CAAK,OAAA,GAAU,EAAA;AACf,IAAA,IAAA,CAAK,UAAA,GAAa,EAAA;AAClB,IAAA,IAAA,CAAK,WAAW,EAAC;AAAA,EACnB;AACF","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, JoopSubject } from '../events';\n\nexport interface JoopVitalsSnapshot {\n lcp: number | null; // Largest Contentful Paint (ms)\n fid: number | null; // First Input Delay (ms) — deprecated, use INP\n inp: number | null; // Interaction to Next Paint (ms)\n cls: number | null; // Cumulative Layout Shift (score)\n ttfb: number | null; // Time to First Byte (ms)\n fcp: number | null; // First Contentful Paint (ms)\n capturedAt: number;\n}\n\nexport interface JoopVitalUpdate {\n metric: keyof Omit<JoopVitalsSnapshot, 'capturedAt'>;\n value: number;\n rating: 'good' | 'needs-improvement' | 'poor';\n}\n\n// Thresholds per https://web.dev/vitals/\nconst THRESHOLDS: Record<string, [number, number]> = {\n lcp: [2500, 4000],\n fid: [100, 300],\n inp: [200, 500],\n cls: [0.1, 0.25],\n ttfb: [800, 1800],\n fcp: [1800, 3000],\n};\n\nexport class JoopWebVitals {\n private _vitals: Partial<JoopVitalsSnapshot> = {};\n private _vitals$ = new JoopSubject<JoopVitalUpdate>();\n private _snapshot$ = new JoopBehaviorSubject<JoopVitalsSnapshot>(this._buildSnapshot());\n private _observers: PerformanceObserver[] = [];\n private _running = false;\n\n start(): void {\n if (this._running || typeof PerformanceObserver === 'undefined') return;\n this._running = true;\n this._observeLCP();\n this._observeFID();\n this._observeINP();\n this._observeCLS();\n this._observeTTFB();\n this._observeFCP();\n }\n\n stop(): void {\n this._running = false;\n for (const obs of this._observers) { try { obs.disconnect(); } catch {} }\n this._observers = [];\n }\n\n snapshot(): JoopVitalsSnapshot { return this._buildSnapshot(); }\n vitals$() { return this._vitals$.asObservable(); }\n snapshot$() { return this._snapshot$.asObservable(); }\n\n getLCP(): number | null { return this._vitals.lcp ?? null; }\n getCLS(): number | null { return this._vitals.cls ?? null; }\n getINP(): number | null { return this._vitals.inp ?? null; }\n getTTFB(): number | null { return this._vitals.ttfb ?? null; }\n getFCP(): number | null { return this._vitals.fcp ?? null; }\n getFID(): number | null { return this._vitals.fid ?? null; }\n\n getRating(metric: string): 'good' | 'needs-improvement' | 'poor' {\n const value = (this._vitals as Record<string, number | null>)[metric];\n return _rate(metric, value ?? null);\n }\n\n private _record(metric: keyof Omit<JoopVitalsSnapshot, 'capturedAt'>, value: number): void {\n (this._vitals as Record<string, number>)[metric] = value;\n const rating = _rate(metric as string, value);\n this._vitals$.next({ metric, value, rating });\n this._snapshot$.next(this._buildSnapshot());\n }\n\n private _observe(types: string[], callback: (list: PerformanceObserverEntryList) => void): void {\n try {\n const obs = new PerformanceObserver(callback);\n obs.observe({ type: types[0], buffered: true });\n this._observers.push(obs);\n } catch {}\n }\n\n private _observeLCP(): void {\n this._observe(['largest-contentful-paint'], list => {\n const entries = list.getEntries();\n if (entries.length) this._record('lcp', (entries[entries.length - 1] as PerformanceEntry & { renderTime?: number; loadTime?: number }).renderTime || (entries[entries.length - 1] as PerformanceEntry & { renderTime?: number; loadTime?: number }).loadTime || entries[entries.length - 1].startTime);\n });\n }\n\n private _observeFID(): void {\n this._observe(['first-input'], list => {\n const e = list.getEntries()[0] as PerformanceEntry & { processingStart?: number };\n if (e && e.processingStart) this._record('fid', e.processingStart - e.startTime);\n });\n }\n\n private _observeINP(): void {\n this._observe(['event'], list => {\n let max = this._vitals.inp ?? 0;\n for (const e of list.getEntries()) {\n const entry = e as PerformanceEntry & { processingEnd?: number };\n if (entry.processingEnd) max = Math.max(max, entry.processingEnd - entry.startTime);\n }\n if (max > 0) this._record('inp', max);\n });\n }\n\n private _observeCLS(): void {\n let clsValue = 0;\n let sessionStart = 0;\n let lastEntry = 0;\n this._observe(['layout-shift'], list => {\n for (const e of list.getEntries()) {\n const entry = e as PerformanceEntry & { hadRecentInput?: boolean; value?: number };\n if (entry.hadRecentInput) continue;\n if (lastEntry > 0 && (entry.startTime - lastEntry) > 1000) {\n if (entry.startTime - sessionStart > 5000) { clsValue = 0; sessionStart = entry.startTime; }\n }\n if (lastEntry === 0) sessionStart = entry.startTime;\n clsValue += entry.value ?? 0;\n lastEntry = entry.startTime;\n this._record('cls', clsValue);\n }\n });\n }\n\n private _observeTTFB(): void {\n const nav = performance.getEntriesByType?.('navigation')?.[0] as PerformanceEntry & { responseStart?: number };\n if (nav?.responseStart) this._record('ttfb', nav.responseStart);\n this._observe(['navigation'], list => {\n const e = list.getEntries()[0] as PerformanceEntry & { responseStart?: number };\n if (e?.responseStart) this._record('ttfb', e.responseStart);\n });\n }\n\n private _observeFCP(): void {\n this._observe(['paint'], list => {\n const e = list.getEntries().find(e => e.name === 'first-contentful-paint');\n if (e) this._record('fcp', e.startTime);\n });\n }\n\n private _buildSnapshot(): JoopVitalsSnapshot {\n return {\n lcp: this._vitals.lcp ?? null,\n fid: this._vitals.fid ?? null,\n inp: this._vitals.inp ?? null,\n cls: this._vitals.cls ?? null,\n ttfb: this._vitals.ttfb ?? null,\n fcp: this._vitals.fcp ?? null,\n capturedAt: Date.now(),\n };\n }\n}\n\nfunction _rate(metric: string, value: number | null): 'good' | 'needs-improvement' | 'poor' {\n if (value === null) return 'good';\n const [good, poor] = THRESHOLDS[metric] ?? [Infinity, Infinity];\n return value <= good ? 'good' : value <= poor ? 'needs-improvement' : 'poor';\n}\n","export type JoopRecordedEventType = 'dom-mutation' | 'click' | 'input' | 'scroll' | 'resize' | 'navigation' | 'custom';\n\nexport interface JoopRecordedEvent {\n type: JoopRecordedEventType;\n timestamp: number;\n selector?: string;\n value?: string;\n data?: Record<string, unknown>;\n}\n\nexport interface JoopSessionRecord {\n startedAt: number;\n stoppedAt: number;\n events: JoopRecordedEvent[];\n url: string;\n userAgent: string;\n}\n\nexport interface JoopSessionRecorderOptions {\n maskSelectors?: string[]; // CSS selectors to mask (replace with ***)\n ignoreSelectors?: string[]; // CSS selectors to ignore entirely\n redactInputs?: boolean; // auto-redact password + [data-pii] inputs\n maxEvents?: number;\n captureScroll?: boolean;\n captureResize?: boolean;\n}\n\nexport class JoopSessionRecorder {\n private _events: JoopRecordedEvent[] = [];\n private _running = false;\n private _paused = false;\n private _startedAt = 0;\n private _opts: Required<JoopSessionRecorderOptions> = {\n maskSelectors: [], ignoreSelectors: [],\n redactInputs: true, maxEvents: 10000,\n captureScroll: true, captureResize: true,\n };\n private _cleanup: Array<() => void> = [];\n private _mutationObserver: MutationObserver | null = null;\n private _scrollTimer: ReturnType<typeof setTimeout> | null = null;\n\n start(options: JoopSessionRecorderOptions = {}): void {\n if (this._running) return;\n this._opts = { ...this._opts, ...options };\n this._running = true; this._paused = false;\n this._events = []; this._startedAt = Date.now();\n this._attachListeners();\n }\n\n pause(): void { this._paused = true; }\n resume(): void { this._paused = false; }\n\n stop(): JoopSessionRecord {\n this._running = false; this._paused = false;\n this._detach();\n return {\n startedAt: this._startedAt, stoppedAt: Date.now(),\n events: [...this._events],\n url: typeof location !== 'undefined' ? location.href : '',\n userAgent: typeof navigator !== 'undefined' ? navigator.userAgent : '',\n };\n }\n\n events(): JoopRecordedEvent[] { return [...this._events]; }\n\n export(format: 'json' | 'compressed' = 'json'): string {\n const record: JoopSessionRecord = {\n startedAt: this._startedAt, stoppedAt: Date.now(),\n events: this._events, url: typeof location !== 'undefined' ? location.href : '', userAgent: typeof navigator !== 'undefined' ? navigator.userAgent : '',\n };\n const json = JSON.stringify(record);\n if (format === 'compressed') {\n try { return btoa(json); } catch { return json; }\n }\n return json;\n }\n\n addEvent(type: JoopRecordedEventType, data?: Record<string, unknown>): void {\n this._push({ type, timestamp: Date.now(), data });\n }\n\n private _push(event: JoopRecordedEvent): void {\n if (!this._running || this._paused) return;\n if (this._events.length >= this._opts.maxEvents) this._events.shift();\n this._events.push(event);\n }\n\n private _attachListeners(): void {\n // DOM mutations\n this._mutationObserver = new MutationObserver(mutations => {\n for (const m of mutations) {\n if (this._shouldIgnore(m.target as Element)) continue;\n this._push({ type: 'dom-mutation', timestamp: Date.now(), selector: _selector(m.target as Element), data: { addedNodes: m.addedNodes.length, removedNodes: m.removedNodes.length, type: m.type } });\n }\n });\n this._mutationObserver.observe(document.documentElement, { childList: true, subtree: true, attributes: true, characterData: false, attributeFilter: ['class', 'style', 'hidden', 'disabled'] });\n\n // Click\n const onClick = (e: MouseEvent) => {\n const el = e.target as Element;\n if (this._shouldIgnore(el)) return;\n this._push({ type: 'click', timestamp: Date.now(), selector: _selector(el) });\n };\n document.addEventListener('click', onClick, { capture: true });\n this._cleanup.push(() => document.removeEventListener('click', onClick, { capture: true }));\n\n // Input\n const onInput = (e: Event) => {\n const el = e.target as HTMLInputElement;\n if (this._shouldIgnore(el)) return;\n const redact = this._opts.redactInputs && (el.type === 'password' || el.dataset?.pii !== undefined || this._opts.maskSelectors.some(s => el.matches(s)));\n this._push({ type: 'input', timestamp: Date.now(), selector: _selector(el), value: redact ? '***' : undefined });\n };\n document.addEventListener('input', onInput, { capture: true });\n this._cleanup.push(() => document.removeEventListener('input', onInput, { capture: true }));\n\n // Scroll (throttled)\n if (this._opts.captureScroll) {\n const onScroll = () => {\n if (this._scrollTimer) return;\n this._scrollTimer = setTimeout(() => {\n this._scrollTimer = null;\n this._push({ type: 'scroll', timestamp: Date.now(), data: { x: window.scrollX, y: window.scrollY } });\n }, 250);\n };\n window.addEventListener('scroll', onScroll, { passive: true });\n this._cleanup.push(() => window.removeEventListener('scroll', onScroll));\n }\n\n // Resize (throttled)\n if (this._opts.captureResize) {\n let resizeTimer: ReturnType<typeof setTimeout> | null = null;\n const onResize = () => {\n if (resizeTimer) return;\n resizeTimer = setTimeout(() => {\n resizeTimer = null;\n this._push({ type: 'resize', timestamp: Date.now(), data: { w: window.innerWidth, h: window.innerHeight } });\n }, 250);\n };\n window.addEventListener('resize', onResize, { passive: true });\n this._cleanup.push(() => window.removeEventListener('resize', onResize));\n }\n\n // Navigation\n const onPop = () => this._push({ type: 'navigation', timestamp: Date.now(), data: { url: location.href } });\n window.addEventListener('popstate', onPop);\n this._cleanup.push(() => window.removeEventListener('popstate', onPop));\n }\n\n private _detach(): void {\n this._mutationObserver?.disconnect(); this._mutationObserver = null;\n for (const fn of this._cleanup) fn();\n this._cleanup = [];\n }\n\n private _shouldIgnore(el: Element | null): boolean {\n if (!el) return false;\n return this._opts.ignoreSelectors.some(s => { try { return el.matches?.(s); } catch { return false; } });\n }\n}\n\nfunction _selector(el: Element | null): string {\n if (!el) return '';\n const parts: string[] = [];\n let current: Element | null = el;\n while (current && current !== document.body && parts.length < 4) {\n let part = current.tagName.toLowerCase();\n if (current.id) { parts.unshift(`#${current.id}`); break; }\n if (current.className) part += '.' + Array.from(current.classList).slice(0, 2).join('.');\n parts.unshift(part);\n current = current.parentElement;\n }\n return parts.join(' > ');\n}\n","export class JoopCorrelationService {\n private _correlationId = '';\n private _requestId = '';\n\n newCorrelation(): string {\n this._correlationId = crypto.randomUUID();\n return this._correlationId;\n }\n\n newRequest(): string {\n this._requestId = crypto.randomUUID();\n return this._requestId;\n }\n\n getCorrelationId(): string { return this._correlationId; }\n getRequestId(): string { return this._requestId; }\n\n headers(): Record<string, string> {\n const h: Record<string, string> = {};\n if (this._correlationId) h['X-Correlation-ID'] = this._correlationId;\n if (this._requestId) h['X-Request-ID'] = this._requestId;\n return h;\n }\n\n clear(): void { this._correlationId = ''; this._requestId = ''; }\n}\n","export type JoopAuditAction =\n | 'login' | 'logout' | 'session-timeout' | 'session-extended'\n | 'transfer-initiated' | 'transfer-confirmed' | 'transfer-failed'\n | 'profile-updated' | 'password-changed' | 'settings-changed'\n | 'document-viewed' | 'statement-downloaded' | 'otp-sent' | 'otp-verified'\n | 'biometric-registered' | 'biometric-authenticated'\n | string;\n\nexport interface JoopAuditEntry {\n id: string;\n action: JoopAuditAction;\n timestamp: number;\n userId?: string;\n sessionId?: string;\n correlationId?: string;\n metadata?: Record<string, unknown>;\n success: boolean;\n}\n\nexport type JoopAuditListener = (entry: JoopAuditEntry) => void;\n\nexport class JoopAuditLog {\n private _entries: JoopAuditEntry[] = [];\n private _listeners: JoopAuditListener[] = [];\n\n constructor(private _maxEntries = 500) {}\n\n record(action: JoopAuditAction, options: {\n userId?: string;\n sessionId?: string;\n correlationId?: string;\n metadata?: Record<string, unknown>;\n success?: boolean;\n } = {}): JoopAuditEntry {\n const entry: JoopAuditEntry = {\n id: crypto.randomUUID(),\n action,\n timestamp: Date.now(),\n success: options.success ?? true,\n ...options,\n };\n this._entries.push(entry);\n if (this._entries.length > this._maxEntries) this._entries = this._entries.slice(-this._maxEntries);\n this._listeners.forEach(l => l(entry));\n return entry;\n }\n\n getAll(): JoopAuditEntry[] { return [...this._entries]; }\n getByAction(action: JoopAuditAction): JoopAuditEntry[] { return this._entries.filter(e => e.action === action); }\n getBySession(sessionId: string): JoopAuditEntry[] { return this._entries.filter(e => e.sessionId === sessionId); }\n getByUser(userId: string): JoopAuditEntry[] { return this._entries.filter(e => e.userId === userId); }\n\n onRecord(listener: JoopAuditListener): () => void {\n this._listeners.push(listener);\n return () => { this._listeners = this._listeners.filter(l => l !== listener); };\n }\n\n clear(): void { this._entries = []; }\n export(): string { return JSON.stringify(this._entries, null, 2); }\n}\n","export interface JoopPerfMark {\n name: string;\n startTime: number;\n endTime?: number;\n duration?: number;\n metadata?: Record<string, unknown>;\n}\n\nexport class JoopPerformanceService {\n private _marks = new Map<string, JoopPerfMark>();\n private _completed: JoopPerfMark[] = [];\n\n mark(name: string, metadata?: Record<string, unknown>): void {\n this._marks.set(name, { name, startTime: performance.now(), metadata });\n }\n\n measure(name: string): JoopPerfMark | null {\n const mark = this._marks.get(name);\n if (!mark) return null;\n const endTime = performance.now();\n const entry: JoopPerfMark = { ...mark, endTime, duration: endTime - mark.startTime };\n this._marks.delete(name);\n this._completed.push(entry);\n return entry;\n }\n\n async timeAsync<T>(name: string, fn: () => Promise<T>): Promise<T> {\n this.mark(name);\n try {\n const result = await fn();\n this.measure(name);\n return result;\n } catch (err) {\n this.measure(name);\n throw err;\n }\n }\n\n timeSync<T>(name: string, fn: () => T): T {\n this.mark(name);\n try {\n const result = fn();\n this.measure(name);\n return result;\n } catch (err) {\n this.measure(name);\n throw err;\n }\n }\n\n getCompleted(): JoopPerfMark[] { return [...this._completed]; }\n getByName(name: string): JoopPerfMark[] { return this._completed.filter(m => m.name === name); }\n\n getAverage(name: string): number | null {\n const entries = this._completed.filter(m => m.name === name && m.duration !== undefined);\n if (!entries.length) return null;\n return entries.reduce((sum, m) => sum + m.duration!, 0) / entries.length;\n }\n\n clear(): void { this._marks.clear(); this._completed = []; }\n}\n","export interface JoopErrorReport {\n id: string;\n message: string;\n stack?: string;\n context?: Record<string, unknown>;\n timestamp: number;\n userId?: string;\n sessionId?: string;\n}\n\nexport type JoopErrorHandler = (report: JoopErrorReport) => void | Promise<void>;\n\nexport class JoopErrorReporter {\n private _handlers: JoopErrorHandler[] = [];\n private _userId = '';\n private _sessionId = '';\n private _context: Record<string, unknown> = {};\n\n setUser(userId: string): void { this._userId = userId; }\n setSession(sessionId: string): void { this._sessionId = sessionId; }\n setContext(ctx: Record<string, unknown>): void { this._context = { ...this._context, ...ctx }; }\n\n addHandler(handler: JoopErrorHandler): () => void {\n this._handlers.push(handler);\n return () => { this._handlers = this._handlers.filter(h => h !== handler); };\n }\n\n capture(error: unknown, extra?: Record<string, unknown>): JoopErrorReport {\n const err = error instanceof Error ? error : new Error(String(error));\n const report: JoopErrorReport = {\n id: crypto.randomUUID(),\n message: err.message,\n stack: err.stack,\n context: { ...this._context, ...extra },\n timestamp: Date.now(),\n ...(this._userId ? { userId: this._userId } : {}),\n ...(this._sessionId ? { sessionId: this._sessionId } : {}),\n };\n this._handlers.forEach(h => Promise.resolve(h(report)).catch(() => {}));\n return report;\n }\n\n captureMessage(message: string, extra?: Record<string, unknown>): JoopErrorReport {\n return this.capture(new Error(message), extra);\n }\n\n clear(): void {\n this._handlers = [];\n this._userId = '';\n this._sessionId = '';\n this._context = {};\n }\n}\n"]}
1
+ {"version":3,"sources":["../../src/events/index.ts","../../src/observability/web-vitals.ts","../../src/observability/session-recorder.ts","../../src/observability/correlation.service.ts","../../src/observability/audit-log.service.ts","../../src/observability/performance.service.ts","../../src/observability/error-reporter.service.ts"],"names":["e"],"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, JoopSubject } from '../events';\n\nexport interface JoopVitalsSnapshot {\n lcp: number | null; // Largest Contentful Paint (ms)\n fid: number | null; // First Input Delay (ms) — deprecated, use INP\n inp: number | null; // Interaction to Next Paint (ms)\n cls: number | null; // Cumulative Layout Shift (score)\n ttfb: number | null; // Time to First Byte (ms)\n fcp: number | null; // First Contentful Paint (ms)\n capturedAt: number;\n}\n\nexport interface JoopVitalUpdate {\n metric: keyof Omit<JoopVitalsSnapshot, 'capturedAt'>;\n value: number;\n rating: 'good' | 'needs-improvement' | 'poor';\n}\n\n// Thresholds per https://web.dev/vitals/\nconst THRESHOLDS: Record<string, [number, number]> = {\n lcp: [2500, 4000],\n fid: [100, 300],\n inp: [200, 500],\n cls: [0.1, 0.25],\n ttfb: [800, 1800],\n fcp: [1800, 3000],\n};\n\nexport class JoopWebVitals {\n private _vitals: Partial<JoopVitalsSnapshot> = {};\n private _vitals$ = new JoopSubject<JoopVitalUpdate>();\n private _snapshot$ = new JoopBehaviorSubject<JoopVitalsSnapshot>(this._buildSnapshot());\n private _observers: PerformanceObserver[] = [];\n private _running = false;\n\n start(): void {\n if (this._running || typeof PerformanceObserver === 'undefined') return;\n this._running = true;\n this._observeLCP();\n this._observeFID();\n this._observeINP();\n this._observeCLS();\n this._observeTTFB();\n this._observeFCP();\n }\n\n stop(): void {\n this._running = false;\n for (const obs of this._observers) { try { obs.disconnect(); } catch {} }\n this._observers = [];\n }\n\n snapshot(): JoopVitalsSnapshot { return this._buildSnapshot(); }\n vitals$() { return this._vitals$.asObservable(); }\n snapshot$() { return this._snapshot$.asObservable(); }\n\n getLCP(): number | null { return this._vitals.lcp ?? null; }\n getCLS(): number | null { return this._vitals.cls ?? null; }\n getINP(): number | null { return this._vitals.inp ?? null; }\n getTTFB(): number | null { return this._vitals.ttfb ?? null; }\n getFCP(): number | null { return this._vitals.fcp ?? null; }\n getFID(): number | null { return this._vitals.fid ?? null; }\n\n getRating(metric: string): 'good' | 'needs-improvement' | 'poor' {\n const value = (this._vitals as Record<string, number | null>)[metric];\n return _rate(metric, value ?? null);\n }\n\n private _record(metric: keyof Omit<JoopVitalsSnapshot, 'capturedAt'>, value: number): void {\n (this._vitals as Record<string, number>)[metric] = value;\n const rating = _rate(metric as string, value);\n this._vitals$.next({ metric, value, rating });\n this._snapshot$.next(this._buildSnapshot());\n }\n\n private _observe(types: string[], callback: (list: PerformanceObserverEntryList) => void): void {\n try {\n const obs = new PerformanceObserver(callback);\n obs.observe({ type: types[0], buffered: true });\n this._observers.push(obs);\n } catch {}\n }\n\n private _observeLCP(): void {\n this._observe(['largest-contentful-paint'], list => {\n const entries = list.getEntries();\n if (entries.length) this._record('lcp', (entries[entries.length - 1] as PerformanceEntry & { renderTime?: number; loadTime?: number }).renderTime || (entries[entries.length - 1] as PerformanceEntry & { renderTime?: number; loadTime?: number }).loadTime || entries[entries.length - 1].startTime);\n });\n }\n\n private _observeFID(): void {\n this._observe(['first-input'], list => {\n const e = list.getEntries()[0] as PerformanceEntry & { processingStart?: number };\n if (e && e.processingStart) this._record('fid', e.processingStart - e.startTime);\n });\n }\n\n private _observeINP(): void {\n this._observe(['event'], list => {\n let max = this._vitals.inp ?? 0;\n for (const e of list.getEntries()) {\n const entry = e as PerformanceEntry & { processingEnd?: number };\n if (entry.processingEnd) max = Math.max(max, entry.processingEnd - entry.startTime);\n }\n if (max > 0) this._record('inp', max);\n });\n }\n\n private _observeCLS(): void {\n let clsValue = 0;\n let sessionStart = 0;\n let lastEntry = 0;\n this._observe(['layout-shift'], list => {\n for (const e of list.getEntries()) {\n const entry = e as PerformanceEntry & { hadRecentInput?: boolean; value?: number };\n if (entry.hadRecentInput) continue;\n if (lastEntry > 0 && (entry.startTime - lastEntry) > 1000) {\n if (entry.startTime - sessionStart > 5000) { clsValue = 0; sessionStart = entry.startTime; }\n }\n if (lastEntry === 0) sessionStart = entry.startTime;\n clsValue += entry.value ?? 0;\n lastEntry = entry.startTime;\n this._record('cls', clsValue);\n }\n });\n }\n\n private _observeTTFB(): void {\n const nav = performance.getEntriesByType?.('navigation')?.[0] as PerformanceEntry & { responseStart?: number };\n if (nav?.responseStart) this._record('ttfb', nav.responseStart);\n this._observe(['navigation'], list => {\n const e = list.getEntries()[0] as PerformanceEntry & { responseStart?: number };\n if (e?.responseStart) this._record('ttfb', e.responseStart);\n });\n }\n\n private _observeFCP(): void {\n this._observe(['paint'], list => {\n const e = list.getEntries().find(e => e.name === 'first-contentful-paint');\n if (e) this._record('fcp', e.startTime);\n });\n }\n\n private _buildSnapshot(): JoopVitalsSnapshot {\n return {\n lcp: this._vitals.lcp ?? null,\n fid: this._vitals.fid ?? null,\n inp: this._vitals.inp ?? null,\n cls: this._vitals.cls ?? null,\n ttfb: this._vitals.ttfb ?? null,\n fcp: this._vitals.fcp ?? null,\n capturedAt: Date.now(),\n };\n }\n}\n\nfunction _rate(metric: string, value: number | null): 'good' | 'needs-improvement' | 'poor' {\n if (value === null) return 'good';\n const [good, poor] = THRESHOLDS[metric] ?? [Infinity, Infinity];\n return value <= good ? 'good' : value <= poor ? 'needs-improvement' : 'poor';\n}\n","export type JoopRecordedEventType = 'dom-mutation' | 'click' | 'input' | 'scroll' | 'resize' | 'navigation' | 'custom';\n\nexport interface JoopRecordedEvent {\n type: JoopRecordedEventType;\n timestamp: number;\n selector?: string;\n value?: string;\n data?: Record<string, unknown>;\n}\n\nexport interface JoopSessionRecord {\n startedAt: number;\n stoppedAt: number;\n events: JoopRecordedEvent[];\n url: string;\n userAgent: string;\n}\n\nexport interface JoopSessionRecorderOptions {\n maskSelectors?: string[]; // CSS selectors to mask (replace with ***)\n ignoreSelectors?: string[]; // CSS selectors to ignore entirely\n redactInputs?: boolean; // auto-redact password + [data-pii] inputs\n maxEvents?: number;\n captureScroll?: boolean;\n captureResize?: boolean;\n}\n\nexport class JoopSessionRecorder {\n private _events: JoopRecordedEvent[] = [];\n private _running = false;\n private _paused = false;\n private _startedAt = 0;\n private _opts: Required<JoopSessionRecorderOptions> = {\n maskSelectors: [], ignoreSelectors: [],\n redactInputs: true, maxEvents: 10000,\n captureScroll: true, captureResize: true,\n };\n private _cleanup: Array<() => void> = [];\n private _mutationObserver: MutationObserver | null = null;\n private _scrollTimer: ReturnType<typeof setTimeout> | null = null;\n\n start(options: JoopSessionRecorderOptions = {}): void {\n if (this._running) return;\n this._opts = { ...this._opts, ...options };\n this._running = true; this._paused = false;\n this._events = []; this._startedAt = Date.now();\n this._attachListeners();\n }\n\n pause(): void { this._paused = true; }\n resume(): void { this._paused = false; }\n\n stop(): JoopSessionRecord {\n this._running = false; this._paused = false;\n this._detach();\n return {\n startedAt: this._startedAt, stoppedAt: Date.now(),\n events: [...this._events],\n url: typeof location !== 'undefined' ? location.href : '',\n userAgent: typeof navigator !== 'undefined' ? navigator.userAgent : '',\n };\n }\n\n events(): JoopRecordedEvent[] { return [...this._events]; }\n\n export(format: 'json' | 'compressed' = 'json'): string {\n const record: JoopSessionRecord = {\n startedAt: this._startedAt, stoppedAt: Date.now(),\n events: this._events, url: typeof location !== 'undefined' ? location.href : '', userAgent: typeof navigator !== 'undefined' ? navigator.userAgent : '',\n };\n const json = JSON.stringify(record);\n if (format === 'compressed') {\n try { return btoa(json); } catch { return json; }\n }\n return json;\n }\n\n addEvent(type: JoopRecordedEventType, data?: Record<string, unknown>): void {\n this._push({ type, timestamp: Date.now(), data });\n }\n\n private _push(event: JoopRecordedEvent): void {\n if (!this._running || this._paused) return;\n if (this._events.length >= this._opts.maxEvents) this._events.shift();\n this._events.push(event);\n }\n\n private _attachListeners(): void {\n // DOM mutations\n this._mutationObserver = new MutationObserver(mutations => {\n for (const m of mutations) {\n if (this._shouldIgnore(m.target as Element)) continue;\n this._push({ type: 'dom-mutation', timestamp: Date.now(), selector: _selector(m.target as Element), data: { addedNodes: m.addedNodes.length, removedNodes: m.removedNodes.length, type: m.type } });\n }\n });\n this._mutationObserver.observe(document.documentElement, { childList: true, subtree: true, attributes: true, characterData: false, attributeFilter: ['class', 'style', 'hidden', 'disabled'] });\n\n // Click\n const onClick = (e: MouseEvent) => {\n const el = e.target as Element;\n if (this._shouldIgnore(el)) return;\n this._push({ type: 'click', timestamp: Date.now(), selector: _selector(el) });\n };\n document.addEventListener('click', onClick, { capture: true });\n this._cleanup.push(() => document.removeEventListener('click', onClick, { capture: true }));\n\n // Input\n const onInput = (e: Event) => {\n const el = e.target as HTMLInputElement;\n if (this._shouldIgnore(el)) return;\n const redact = this._opts.redactInputs && (el.type === 'password' || el.dataset?.pii !== undefined || this._opts.maskSelectors.some(s => el.matches(s)));\n this._push({ type: 'input', timestamp: Date.now(), selector: _selector(el), value: redact ? '***' : undefined });\n };\n document.addEventListener('input', onInput, { capture: true });\n this._cleanup.push(() => document.removeEventListener('input', onInput, { capture: true }));\n\n // Scroll (throttled)\n if (this._opts.captureScroll) {\n const onScroll = () => {\n if (this._scrollTimer) return;\n this._scrollTimer = setTimeout(() => {\n this._scrollTimer = null;\n this._push({ type: 'scroll', timestamp: Date.now(), data: { x: window.scrollX, y: window.scrollY } });\n }, 250);\n };\n window.addEventListener('scroll', onScroll, { passive: true });\n this._cleanup.push(() => window.removeEventListener('scroll', onScroll));\n }\n\n // Resize (throttled)\n if (this._opts.captureResize) {\n let resizeTimer: ReturnType<typeof setTimeout> | null = null;\n const onResize = () => {\n if (resizeTimer) return;\n resizeTimer = setTimeout(() => {\n resizeTimer = null;\n this._push({ type: 'resize', timestamp: Date.now(), data: { w: window.innerWidth, h: window.innerHeight } });\n }, 250);\n };\n window.addEventListener('resize', onResize, { passive: true });\n this._cleanup.push(() => window.removeEventListener('resize', onResize));\n }\n\n // Navigation\n const onPop = () => this._push({ type: 'navigation', timestamp: Date.now(), data: { url: location.href } });\n window.addEventListener('popstate', onPop);\n this._cleanup.push(() => window.removeEventListener('popstate', onPop));\n }\n\n private _detach(): void {\n this._mutationObserver?.disconnect(); this._mutationObserver = null;\n for (const fn of this._cleanup) fn();\n this._cleanup = [];\n }\n\n private _shouldIgnore(el: Element | null): boolean {\n if (!el) return false;\n return this._opts.ignoreSelectors.some(s => { try { return el.matches?.(s); } catch { return false; } });\n }\n}\n\nfunction _selector(el: Element | null): string {\n if (!el) return '';\n const parts: string[] = [];\n let current: Element | null = el;\n while (current && current !== document.body && parts.length < 4) {\n let part = current.tagName.toLowerCase();\n if (current.id) { parts.unshift(`#${current.id}`); break; }\n if (current.className) part += '.' + Array.from(current.classList).slice(0, 2).join('.');\n parts.unshift(part);\n current = current.parentElement;\n }\n return parts.join(' > ');\n}\n","export class JoopCorrelationService {\n private _correlationId = '';\n private _requestId = '';\n\n newCorrelation(): string {\n this._correlationId = crypto.randomUUID();\n return this._correlationId;\n }\n\n newRequest(): string {\n this._requestId = crypto.randomUUID();\n return this._requestId;\n }\n\n getCorrelationId(): string { return this._correlationId; }\n getRequestId(): string { return this._requestId; }\n\n headers(): Record<string, string> {\n const h: Record<string, string> = {};\n if (this._correlationId) h['X-Correlation-ID'] = this._correlationId;\n if (this._requestId) h['X-Request-ID'] = this._requestId;\n return h;\n }\n\n clear(): void { this._correlationId = ''; this._requestId = ''; }\n}\n","export type JoopAuditAction =\n | 'login' | 'logout' | 'session-timeout' | 'session-extended'\n | 'transfer-initiated' | 'transfer-confirmed' | 'transfer-failed'\n | 'profile-updated' | 'password-changed' | 'settings-changed'\n | 'document-viewed' | 'statement-downloaded' | 'otp-sent' | 'otp-verified'\n | 'biometric-registered' | 'biometric-authenticated'\n | string;\n\nexport interface JoopAuditEntry {\n id: string;\n action: JoopAuditAction;\n timestamp: number;\n userId?: string;\n sessionId?: string;\n correlationId?: string;\n metadata?: Record<string, unknown>;\n success: boolean;\n}\n\nexport type JoopAuditListener = (entry: JoopAuditEntry) => void;\n\nexport class JoopAuditLog {\n private _entries: JoopAuditEntry[] = [];\n private _listeners: JoopAuditListener[] = [];\n\n constructor(private _maxEntries = 500) {}\n\n record(action: JoopAuditAction, options: {\n userId?: string;\n sessionId?: string;\n correlationId?: string;\n metadata?: Record<string, unknown>;\n success?: boolean;\n } = {}): JoopAuditEntry {\n const entry: JoopAuditEntry = {\n id: crypto.randomUUID(),\n action,\n timestamp: Date.now(),\n success: options.success ?? true,\n ...options,\n };\n this._entries.push(entry);\n if (this._entries.length > this._maxEntries) this._entries = this._entries.slice(-this._maxEntries);\n this._listeners.forEach(l => l(entry));\n return entry;\n }\n\n getAll(): JoopAuditEntry[] { return [...this._entries]; }\n getByAction(action: JoopAuditAction): JoopAuditEntry[] { return this._entries.filter(e => e.action === action); }\n getBySession(sessionId: string): JoopAuditEntry[] { return this._entries.filter(e => e.sessionId === sessionId); }\n getByUser(userId: string): JoopAuditEntry[] { return this._entries.filter(e => e.userId === userId); }\n\n onRecord(listener: JoopAuditListener): () => void {\n this._listeners.push(listener);\n return () => { this._listeners = this._listeners.filter(l => l !== listener); };\n }\n\n clear(): void { this._entries = []; }\n export(): string { return JSON.stringify(this._entries, null, 2); }\n}\n","export interface JoopPerfMark {\n name: string;\n startTime: number;\n endTime?: number;\n duration?: number;\n metadata?: Record<string, unknown>;\n}\n\nexport class JoopPerformanceService {\n private _marks = new Map<string, JoopPerfMark>();\n private _completed: JoopPerfMark[] = [];\n\n mark(name: string, metadata?: Record<string, unknown>): void {\n this._marks.set(name, { name, startTime: performance.now(), metadata });\n }\n\n measure(name: string): JoopPerfMark | null {\n const mark = this._marks.get(name);\n if (!mark) return null;\n const endTime = performance.now();\n const entry: JoopPerfMark = { ...mark, endTime, duration: endTime - mark.startTime };\n this._marks.delete(name);\n this._completed.push(entry);\n return entry;\n }\n\n async timeAsync<T>(name: string, fn: () => Promise<T>): Promise<T> {\n this.mark(name);\n try {\n const result = await fn();\n this.measure(name);\n return result;\n } catch (err) {\n this.measure(name);\n throw err;\n }\n }\n\n timeSync<T>(name: string, fn: () => T): T {\n this.mark(name);\n try {\n const result = fn();\n this.measure(name);\n return result;\n } catch (err) {\n this.measure(name);\n throw err;\n }\n }\n\n getCompleted(): JoopPerfMark[] { return [...this._completed]; }\n getByName(name: string): JoopPerfMark[] { return this._completed.filter(m => m.name === name); }\n\n getAverage(name: string): number | null {\n const entries = this._completed.filter(m => m.name === name && m.duration !== undefined);\n if (!entries.length) return null;\n return entries.reduce((sum, m) => sum + m.duration!, 0) / entries.length;\n }\n\n clear(): void { this._marks.clear(); this._completed = []; }\n}\n","export interface JoopErrorReport {\n id: string;\n message: string;\n stack?: string;\n context?: Record<string, unknown>;\n timestamp: number;\n userId?: string;\n sessionId?: string;\n}\n\nexport type JoopErrorHandler = (report: JoopErrorReport) => void | Promise<void>;\n\nexport class JoopErrorReporter {\n private _handlers: JoopErrorHandler[] = [];\n private _userId = '';\n private _sessionId = '';\n private _context: Record<string, unknown> = {};\n\n setUser(userId: string): void { this._userId = userId; }\n setSession(sessionId: string): void { this._sessionId = sessionId; }\n setContext(ctx: Record<string, unknown>): void { this._context = { ...this._context, ...ctx }; }\n\n addHandler(handler: JoopErrorHandler): () => void {\n this._handlers.push(handler);\n return () => { this._handlers = this._handlers.filter(h => h !== handler); };\n }\n\n capture(error: unknown, extra?: Record<string, unknown>): JoopErrorReport {\n const err = error instanceof Error ? error : new Error(String(error));\n const report: JoopErrorReport = {\n id: crypto.randomUUID(),\n message: err.message,\n stack: err.stack,\n context: { ...this._context, ...extra },\n timestamp: Date.now(),\n ...(this._userId ? { userId: this._userId } : {}),\n ...(this._sessionId ? { sessionId: this._sessionId } : {}),\n };\n this._handlers.forEach(h => Promise.resolve(h(report)).catch(() => {}));\n return report;\n }\n\n captureMessage(message: string, extra?: Record<string, unknown>): JoopErrorReport {\n return this.capture(new Error(message), extra);\n }\n\n clear(): void {\n this._handlers = [];\n this._userId = '';\n this._sessionId = '';\n this._context = {};\n }\n}\n"]}
package/dist/pwa/index.js CHANGED
@@ -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/pwa/service-worker.service.ts","../../src/utilities/notification.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 type JoopSwState = 'unregistered' | 'installing' | 'installed' | 'activating' | 'activated' | 'redundant';\n\nexport class JoopServiceWorkerService {\n private _reg: ServiceWorkerRegistration | null = null;\n private _state$ = new JoopBehaviorSubject<JoopSwState>('unregistered');\n private _updateHandlers: Array<() => void> = [];\n private _controllerHandlers: Array<() => void> = [];\n private _messageHandlers: Array<(data: unknown) => void> = [];\n private _swMessageListener: ((e: MessageEvent) => void) | null = null;\n private _controllerListener: (() => void) | null = null;\n\n isSupported(): boolean { return 'serviceWorker' in navigator; }\n isControlled(): boolean { return !!navigator.serviceWorker?.controller; }\n getRegistration(): ServiceWorkerRegistration | null { return this._reg; }\n state$() { return this._state$.asObservable(); }\n\n async register(scriptUrl: string, options?: RegistrationOptions): Promise<ServiceWorkerRegistration> {\n if (!this.isSupported()) throw new Error('ServiceWorker not supported');\n this._reg = await navigator.serviceWorker.register(scriptUrl, options);\n this._trackState(this._reg);\n this._listenForUpdates(this._reg);\n\n this._swMessageListener = (e: MessageEvent) => { this._messageHandlers.forEach(h => h(e.data)); };\n navigator.serviceWorker.addEventListener('message', this._swMessageListener);\n\n this._controllerListener = () => { this._controllerHandlers.forEach(h => h()); };\n navigator.serviceWorker.addEventListener('controllerchange', this._controllerListener);\n\n return this._reg;\n }\n\n async unregister(): Promise<boolean> {\n if (!this._reg) return false;\n const result = await this._reg.unregister();\n if (result) { this._reg = null; this._state$.next('unregistered'); }\n return result;\n }\n\n async update(): Promise<void> {\n if (!this._reg) throw new Error('No service worker registered');\n await this._reg.update();\n }\n\n async postMessage(data: unknown): Promise<void> {\n if (!this._reg?.active) throw new Error('No active service worker');\n this._reg.active.postMessage(data);\n }\n\n onUpdateAvailable(handler: () => void): () => void {\n this._updateHandlers.push(handler);\n return () => { this._updateHandlers = this._updateHandlers.filter(h => h !== handler); };\n }\n\n onControllerChange(handler: () => void): () => void {\n this._controllerHandlers.push(handler);\n return () => { this._controllerHandlers = this._controllerHandlers.filter(h => h !== handler); };\n }\n\n onMessage(handler: (data: unknown) => void): () => void {\n this._messageHandlers.push(handler);\n return () => { this._messageHandlers = this._messageHandlers.filter(h => h !== handler); };\n }\n\n isOnline(): boolean { return navigator.onLine; }\n\n onlineState$(): JoopBehaviorSubject<boolean> {\n const s$ = new JoopBehaviorSubject<boolean>(navigator.onLine);\n window.addEventListener('online', () => s$.next(true));\n window.addEventListener('offline', () => s$.next(false));\n return s$;\n }\n\n private _trackState(reg: ServiceWorkerRegistration): void {\n const sw = reg.installing ?? reg.waiting ?? reg.active;\n if (sw) this._state$.next(sw.state as JoopSwState);\n const track = (worker: ServiceWorker | null) => {\n if (!worker) return;\n worker.addEventListener('statechange', () => this._state$.next(worker.state as JoopSwState));\n };\n track(reg.installing); track(reg.waiting); track(reg.active);\n reg.addEventListener('updatefound', () => track(reg.installing));\n }\n\n private _listenForUpdates(reg: ServiceWorkerRegistration): void {\n reg.addEventListener('updatefound', () => {\n const newSw = reg.installing;\n if (!newSw) return;\n newSw.addEventListener('statechange', () => {\n if (newSw.state === 'installed' && navigator.serviceWorker.controller) {\n this._updateHandlers.forEach(h => h());\n }\n });\n });\n }\n\n destroy(): void {\n if (this._swMessageListener) navigator.serviceWorker?.removeEventListener('message', this._swMessageListener);\n if (this._controllerListener) navigator.serviceWorker?.removeEventListener('controllerchange', this._controllerListener);\n this._updateHandlers = []; this._controllerHandlers = []; this._messageHandlers = [];\n }\n}\n","import { JoopBehaviorSubject } from '../events';\n\nexport type JoopNotificationPermission = 'default' | 'granted' | 'denied';\n\nexport interface JoopNotificationOptions extends NotificationOptions {\n tag?: string;\n requireInteraction?: boolean;\n}\n\nexport class JoopNotificationService {\n private _permission$ = new JoopBehaviorSubject<JoopNotificationPermission>(\n typeof Notification !== 'undefined' ? Notification.permission as JoopNotificationPermission : 'default',\n );\n private _messageHandlers: Array<(event: MessageEvent) => void> = [];\n private _swReg: ServiceWorkerRegistration | null = null;\n\n isSupported(): boolean { return typeof Notification !== 'undefined'; }\n\n getPermission(): JoopNotificationPermission { return this._permission$.getValue(); }\n permission$() { return this._permission$.asObservable(); }\n\n async requestPermission(): Promise<JoopNotificationPermission> {\n if (!this.isSupported()) return 'denied';\n const result = await Notification.requestPermission() as JoopNotificationPermission;\n this._permission$.next(result);\n return result;\n }\n\n async show(title: string, options: JoopNotificationOptions = {}): Promise<Notification | null> {\n if (this._permission$.getValue() !== 'granted') {\n const p = await this.requestPermission();\n if (p !== 'granted') return null;\n }\n if (this._swReg) {\n await this._swReg.showNotification(title, options);\n return null;\n }\n return new Notification(title, options);\n }\n\n async setServiceWorker(reg: ServiceWorkerRegistration): Promise<void> {\n this._swReg = reg;\n }\n\n async subscribe(vapidPublicKey: string): Promise<PushSubscription | null> {\n if (!this._swReg) throw new Error('JoopNotification: ServiceWorkerRegistration required');\n const key = _urlBase64ToUint8Array(vapidPublicKey);\n return this._swReg.pushManager.subscribe({ userVisibleOnly: true, applicationServerKey: key });\n }\n\n async unsubscribe(): Promise<boolean> {\n if (!this._swReg) return false;\n const sub = await this._swReg.pushManager.getSubscription();\n if (!sub) return false;\n return sub.unsubscribe();\n }\n\n async getSubscription(): Promise<PushSubscription | null> {\n if (!this._swReg) return null;\n return this._swReg.pushManager.getSubscription();\n }\n\n onMessage(handler: (event: MessageEvent) => void): () => void {\n this._messageHandlers.push(handler);\n navigator.serviceWorker?.addEventListener('message', handler);\n return () => {\n this._messageHandlers = this._messageHandlers.filter(h => h !== handler);\n navigator.serviceWorker?.removeEventListener('message', handler);\n };\n }\n\n destroy(): void {\n for (const h of this._messageHandlers) navigator.serviceWorker?.removeEventListener('message', h);\n this._messageHandlers = [];\n }\n}\n\nfunction _urlBase64ToUint8Array(base64String: string): Uint8Array<ArrayBuffer> {\n const padding = '='.repeat((4 - (base64String.length % 4)) % 4);\n const base64 = (base64String + padding).replace(/-/g, '+').replace(/_/g, '/');\n const raw = atob(base64);\n return new Uint8Array(Array.from(raw, c => c.charCodeAt(0)));\n}\n"]}
1
+ {"version":3,"sources":["../../src/events/index.ts","../../src/pwa/service-worker.service.ts","../../src/utilities/notification.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 type JoopSwState = 'unregistered' | 'installing' | 'installed' | 'activating' | 'activated' | 'redundant';\n\nexport class JoopServiceWorkerService {\n private _reg: ServiceWorkerRegistration | null = null;\n private _state$ = new JoopBehaviorSubject<JoopSwState>('unregistered');\n private _updateHandlers: Array<() => void> = [];\n private _controllerHandlers: Array<() => void> = [];\n private _messageHandlers: Array<(data: unknown) => void> = [];\n private _swMessageListener: ((e: MessageEvent) => void) | null = null;\n private _controllerListener: (() => void) | null = null;\n\n isSupported(): boolean { return 'serviceWorker' in navigator; }\n isControlled(): boolean { return !!navigator.serviceWorker?.controller; }\n getRegistration(): ServiceWorkerRegistration | null { return this._reg; }\n state$() { return this._state$.asObservable(); }\n\n async register(scriptUrl: string, options?: RegistrationOptions): Promise<ServiceWorkerRegistration> {\n if (!this.isSupported()) throw new Error('ServiceWorker not supported');\n this._reg = await navigator.serviceWorker.register(scriptUrl, options);\n this._trackState(this._reg);\n this._listenForUpdates(this._reg);\n\n this._swMessageListener = (e: MessageEvent) => { this._messageHandlers.forEach(h => h(e.data)); };\n navigator.serviceWorker.addEventListener('message', this._swMessageListener);\n\n this._controllerListener = () => { this._controllerHandlers.forEach(h => h()); };\n navigator.serviceWorker.addEventListener('controllerchange', this._controllerListener);\n\n return this._reg;\n }\n\n async unregister(): Promise<boolean> {\n if (!this._reg) return false;\n const result = await this._reg.unregister();\n if (result) { this._reg = null; this._state$.next('unregistered'); }\n return result;\n }\n\n async update(): Promise<void> {\n if (!this._reg) throw new Error('No service worker registered');\n await this._reg.update();\n }\n\n async postMessage(data: unknown): Promise<void> {\n if (!this._reg?.active) throw new Error('No active service worker');\n this._reg.active.postMessage(data);\n }\n\n onUpdateAvailable(handler: () => void): () => void {\n this._updateHandlers.push(handler);\n return () => { this._updateHandlers = this._updateHandlers.filter(h => h !== handler); };\n }\n\n onControllerChange(handler: () => void): () => void {\n this._controllerHandlers.push(handler);\n return () => { this._controllerHandlers = this._controllerHandlers.filter(h => h !== handler); };\n }\n\n onMessage(handler: (data: unknown) => void): () => void {\n this._messageHandlers.push(handler);\n return () => { this._messageHandlers = this._messageHandlers.filter(h => h !== handler); };\n }\n\n isOnline(): boolean { return navigator.onLine; }\n\n onlineState$(): JoopBehaviorSubject<boolean> {\n const s$ = new JoopBehaviorSubject<boolean>(navigator.onLine);\n window.addEventListener('online', () => s$.next(true));\n window.addEventListener('offline', () => s$.next(false));\n return s$;\n }\n\n private _trackState(reg: ServiceWorkerRegistration): void {\n const sw = reg.installing ?? reg.waiting ?? reg.active;\n if (sw) this._state$.next(sw.state as JoopSwState);\n const track = (worker: ServiceWorker | null) => {\n if (!worker) return;\n worker.addEventListener('statechange', () => this._state$.next(worker.state as JoopSwState));\n };\n track(reg.installing); track(reg.waiting); track(reg.active);\n reg.addEventListener('updatefound', () => track(reg.installing));\n }\n\n private _listenForUpdates(reg: ServiceWorkerRegistration): void {\n reg.addEventListener('updatefound', () => {\n const newSw = reg.installing;\n if (!newSw) return;\n newSw.addEventListener('statechange', () => {\n if (newSw.state === 'installed' && navigator.serviceWorker.controller) {\n this._updateHandlers.forEach(h => h());\n }\n });\n });\n }\n\n destroy(): void {\n if (this._swMessageListener) navigator.serviceWorker?.removeEventListener('message', this._swMessageListener);\n if (this._controllerListener) navigator.serviceWorker?.removeEventListener('controllerchange', this._controllerListener);\n this._updateHandlers = []; this._controllerHandlers = []; this._messageHandlers = [];\n }\n}\n","import { JoopBehaviorSubject } from '../events';\n\nexport type JoopNotificationPermission = 'default' | 'granted' | 'denied';\n\nexport interface JoopNotificationOptions extends NotificationOptions {\n tag?: string;\n requireInteraction?: boolean;\n}\n\nexport class JoopNotificationService {\n private _permission$ = new JoopBehaviorSubject<JoopNotificationPermission>(\n typeof Notification !== 'undefined' ? Notification.permission as JoopNotificationPermission : 'default',\n );\n private _messageHandlers: Array<(event: MessageEvent) => void> = [];\n private _swReg: ServiceWorkerRegistration | null = null;\n\n isSupported(): boolean { return typeof Notification !== 'undefined'; }\n\n getPermission(): JoopNotificationPermission { return this._permission$.getValue(); }\n permission$() { return this._permission$.asObservable(); }\n\n async requestPermission(): Promise<JoopNotificationPermission> {\n if (!this.isSupported()) return 'denied';\n const result = await Notification.requestPermission() as JoopNotificationPermission;\n this._permission$.next(result);\n return result;\n }\n\n async show(title: string, options: JoopNotificationOptions = {}): Promise<Notification | null> {\n if (this._permission$.getValue() !== 'granted') {\n const p = await this.requestPermission();\n if (p !== 'granted') return null;\n }\n if (this._swReg) {\n await this._swReg.showNotification(title, options);\n return null;\n }\n return new Notification(title, options);\n }\n\n async setServiceWorker(reg: ServiceWorkerRegistration): Promise<void> {\n this._swReg = reg;\n }\n\n async subscribe(vapidPublicKey: string): Promise<PushSubscription | null> {\n if (!this._swReg) throw new Error('JoopNotification: ServiceWorkerRegistration required');\n const key = _urlBase64ToUint8Array(vapidPublicKey);\n return this._swReg.pushManager.subscribe({ userVisibleOnly: true, applicationServerKey: key });\n }\n\n async unsubscribe(): Promise<boolean> {\n if (!this._swReg) return false;\n const sub = await this._swReg.pushManager.getSubscription();\n if (!sub) return false;\n return sub.unsubscribe();\n }\n\n async getSubscription(): Promise<PushSubscription | null> {\n if (!this._swReg) return null;\n return this._swReg.pushManager.getSubscription();\n }\n\n onMessage(handler: (event: MessageEvent) => void): () => void {\n this._messageHandlers.push(handler);\n navigator.serviceWorker?.addEventListener('message', handler);\n return () => {\n this._messageHandlers = this._messageHandlers.filter(h => h !== handler);\n navigator.serviceWorker?.removeEventListener('message', handler);\n };\n }\n\n destroy(): void {\n for (const h of this._messageHandlers) navigator.serviceWorker?.removeEventListener('message', h);\n this._messageHandlers = [];\n }\n}\n\nfunction _urlBase64ToUint8Array(base64String: string): Uint8Array<ArrayBuffer> {\n const padding = '='.repeat((4 - (base64String.length % 4)) % 4);\n const base64 = (base64String + padding).replace(/-/g, '+').replace(/_/g, '/');\n const raw = atob(base64);\n return new Uint8Array(Array.from(raw, c => c.charCodeAt(0)));\n}\n"]}