joopjs 2.0.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.
- package/CHANGELOG.md +678 -0
- package/README.md +583 -0
- package/dist/a11y.service-C-DQQfgO.d.mts +143 -0
- package/dist/a11y.service-CauEJrJe.d.ts +143 -0
- package/dist/adapters-B6slG6hQ.d.mts +84 -0
- package/dist/adapters-B6slG6hQ.d.ts +84 -0
- package/dist/aes.service-CkoupAww.d.mts +95 -0
- package/dist/aes.service-CkoupAww.d.ts +95 -0
- package/dist/ai/index.d.mts +99 -0
- package/dist/ai/index.d.ts +99 -0
- package/dist/ai/index.js +307 -0
- package/dist/ai/index.js.map +1 -0
- package/dist/ai/index.mjs +304 -0
- package/dist/ai/index.mjs.map +1 -0
- package/dist/analytics/index.d.mts +42 -0
- package/dist/analytics/index.d.ts +42 -0
- package/dist/analytics/index.js +139 -0
- package/dist/analytics/index.js.map +1 -0
- package/dist/analytics/index.mjs +136 -0
- package/dist/analytics/index.mjs.map +1 -0
- package/dist/angular/index.d.mts +148 -0
- package/dist/angular/index.d.ts +148 -0
- package/dist/angular/index.js +122 -0
- package/dist/angular/index.js.map +1 -0
- package/dist/angular/index.mjs +101 -0
- package/dist/angular/index.mjs.map +1 -0
- package/dist/api/index.d.mts +128 -0
- package/dist/api/index.d.ts +128 -0
- package/dist/api/index.js +1358 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/index.mjs +1332 -0
- package/dist/api/index.mjs.map +1 -0
- package/dist/auth/index.d.mts +105 -0
- package/dist/auth/index.d.ts +105 -0
- package/dist/auth/index.js +989 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/index.mjs +979 -0
- package/dist/auth/index.mjs.map +1 -0
- package/dist/auth.service-DNVB-L4U.d.mts +16 -0
- package/dist/auth.service-PjUUSUIt.d.ts +16 -0
- package/dist/banking/index.d.mts +1530 -0
- package/dist/banking/index.d.ts +1530 -0
- package/dist/banking/index.js +4739 -0
- package/dist/banking/index.js.map +1 -0
- package/dist/banking/index.mjs +4661 -0
- package/dist/banking/index.mjs.map +1 -0
- package/dist/cache/index.d.mts +40 -0
- package/dist/cache/index.d.ts +40 -0
- package/dist/cache/index.js +174 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/index.mjs +172 -0
- package/dist/cache/index.mjs.map +1 -0
- package/dist/client-profile.service-BuPeXVp5.d.mts +28 -0
- package/dist/client-profile.service-D5bRRYQp.d.ts +28 -0
- package/dist/config.models-Cqg04fAQ.d.mts +84 -0
- package/dist/config.models-Cqg04fAQ.d.ts +84 -0
- package/dist/config.service-CrCvI-JS.d.ts +31 -0
- package/dist/config.service-Cz4QQLlf.d.mts +31 -0
- package/dist/core/index.d.mts +4 -0
- package/dist/core/index.d.ts +4 -0
- package/dist/core/index.js +631 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/index.mjs +619 -0
- package/dist/core/index.mjs.map +1 -0
- package/dist/crypto-utils-DriNhLdx.d.mts +30 -0
- package/dist/crypto-utils-DriNhLdx.d.ts +30 -0
- package/dist/data-storage.service-DT6xaTxE.d.ts +51 -0
- package/dist/data-storage.service-LvhGRCmw.d.mts +51 -0
- package/dist/deeplink/index.d.mts +39 -0
- package/dist/deeplink/index.d.ts +39 -0
- package/dist/deeplink/index.js +268 -0
- package/dist/deeplink/index.js.map +1 -0
- package/dist/deeplink/index.mjs +265 -0
- package/dist/deeplink/index.mjs.map +1 -0
- package/dist/deeplink.service-Ctd5u243.d.mts +35 -0
- package/dist/deeplink.service-uUuTnY9_.d.ts +35 -0
- package/dist/dev/index.d.mts +20 -0
- package/dist/dev/index.d.ts +20 -0
- package/dist/dev/index.js +51 -0
- package/dist/dev/index.js.map +1 -0
- package/dist/dev/index.mjs +49 -0
- package/dist/dev/index.mjs.map +1 -0
- package/dist/device/index.d.mts +108 -0
- package/dist/device/index.d.ts +108 -0
- package/dist/device/index.js +960 -0
- package/dist/device/index.js.map +1 -0
- package/dist/device/index.mjs +951 -0
- package/dist/device/index.mjs.map +1 -0
- package/dist/differential-privacy-BcAv1G80.d.mts +210 -0
- package/dist/differential-privacy-C8mAUjZr.d.ts +210 -0
- package/dist/encryption/index.d.mts +75 -0
- package/dist/encryption/index.d.ts +75 -0
- package/dist/encryption/index.js +605 -0
- package/dist/encryption/index.js.map +1 -0
- package/dist/encryption/index.mjs +598 -0
- package/dist/encryption/index.mjs.map +1 -0
- package/dist/form-validator-3tkmzr_o.d.mts +72 -0
- package/dist/form-validator-3tkmzr_o.d.ts +72 -0
- package/dist/forms/index.d.mts +59 -0
- package/dist/forms/index.d.ts +59 -0
- package/dist/forms/index.js +446 -0
- package/dist/forms/index.js.map +1 -0
- package/dist/forms/index.mjs +442 -0
- package/dist/forms/index.mjs.map +1 -0
- package/dist/i18n/index.d.mts +37 -0
- package/dist/i18n/index.d.ts +37 -0
- package/dist/i18n/index.js +147 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/i18n/index.mjs +145 -0
- package/dist/i18n/index.mjs.map +1 -0
- package/dist/idempotency.service-_6LqhivP.d.mts +372 -0
- package/dist/idempotency.service-eOKoISRD.d.ts +372 -0
- package/dist/index-B_ksKpS1.d.mts +202 -0
- package/dist/index-CqDKWTUP.d.mts +28 -0
- package/dist/index-CqDKWTUP.d.ts +28 -0
- package/dist/index-DFqEoX_l.d.ts +202 -0
- package/dist/index-Dz0gOur2.d.mts +36 -0
- package/dist/index-Dz0gOur2.d.ts +36 -0
- package/dist/index.d.mts +1336 -0
- package/dist/index.d.ts +1336 -0
- package/dist/index.js +19464 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +19155 -0
- package/dist/index.mjs.map +1 -0
- package/dist/india/index.d.mts +75 -0
- package/dist/india/index.d.ts +75 -0
- package/dist/india/index.js +325 -0
- package/dist/india/index.js.map +1 -0
- package/dist/india/index.mjs +303 -0
- package/dist/india/index.mjs.map +1 -0
- package/dist/joop-Bx7Iwj5p.d.mts +155 -0
- package/dist/joop-CA3DMeOO.d.ts +155 -0
- package/dist/native-bridge/index.d.mts +27 -0
- package/dist/native-bridge/index.d.ts +27 -0
- package/dist/native-bridge/index.js +98 -0
- package/dist/native-bridge/index.js.map +1 -0
- package/dist/native-bridge/index.mjs +96 -0
- package/dist/native-bridge/index.mjs.map +1 -0
- package/dist/network/index.d.mts +85 -0
- package/dist/network/index.d.ts +85 -0
- package/dist/network/index.js +454 -0
- package/dist/network/index.js.map +1 -0
- package/dist/network/index.mjs +451 -0
- package/dist/network/index.mjs.map +1 -0
- package/dist/network-monitor-BIwPSXme.d.mts +179 -0
- package/dist/network-monitor-Bqp2hvZr.d.ts +179 -0
- package/dist/notification.service-Dm4fvfZf.d.mts +25 -0
- package/dist/notification.service-tEMKatWJ.d.ts +25 -0
- package/dist/observability/index.d.mts +179 -0
- package/dist/observability/index.d.ts +179 -0
- package/dist/observability/index.js +559 -0
- package/dist/observability/index.js.map +1 -0
- package/dist/observability/index.mjs +552 -0
- package/dist/observability/index.mjs.map +1 -0
- package/dist/oidc-client-DIJcClmB.d.mts +190 -0
- package/dist/oidc-client-DxhyE59t.d.ts +190 -0
- package/dist/platform/index.d.mts +73 -0
- package/dist/platform/index.d.ts +73 -0
- package/dist/platform/index.js +127 -0
- package/dist/platform/index.js.map +1 -0
- package/dist/platform/index.mjs +125 -0
- package/dist/platform/index.mjs.map +1 -0
- package/dist/pwa/index.d.mts +31 -0
- package/dist/pwa/index.d.ts +31 -0
- package/dist/pwa/index.js +247 -0
- package/dist/pwa/index.js.map +1 -0
- package/dist/pwa/index.mjs +244 -0
- package/dist/pwa/index.mjs.map +1 -0
- package/dist/react/index.d.mts +133 -0
- package/dist/react/index.d.ts +133 -0
- package/dist/react/index.js +632 -0
- package/dist/react/index.js.map +1 -0
- package/dist/react/index.mjs +630 -0
- package/dist/react/index.mjs.map +1 -0
- package/dist/router/index.d.mts +39 -0
- package/dist/router/index.d.ts +39 -0
- package/dist/router/index.js +168 -0
- package/dist/router/index.js.map +1 -0
- package/dist/router/index.mjs +166 -0
- package/dist/router/index.mjs.map +1 -0
- package/dist/security/index.d.mts +206 -0
- package/dist/security/index.d.ts +206 -0
- package/dist/security/index.js +1297 -0
- package/dist/security/index.js.map +1 -0
- package/dist/security/index.mjs +1285 -0
- package/dist/security/index.mjs.map +1 -0
- package/dist/session/index.d.mts +115 -0
- package/dist/session/index.d.ts +115 -0
- package/dist/session/index.js +297 -0
- package/dist/session/index.js.map +1 -0
- package/dist/session/index.mjs +292 -0
- package/dist/session/index.mjs.map +1 -0
- package/dist/state/index.d.mts +43 -0
- package/dist/state/index.d.ts +43 -0
- package/dist/state/index.js +156 -0
- package/dist/state/index.js.map +1 -0
- package/dist/state/index.mjs +152 -0
- package/dist/state/index.mjs.map +1 -0
- package/dist/statement-parser-BHQtXwCM.d.ts +260 -0
- package/dist/statement-parser-C2qNmb49.d.mts +260 -0
- package/dist/storage/index.d.mts +40 -0
- package/dist/storage/index.d.ts +40 -0
- package/dist/storage/index.js +256 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/index.mjs +252 -0
- package/dist/storage/index.mjs.map +1 -0
- package/dist/sync/index.d.mts +69 -0
- package/dist/sync/index.d.ts +69 -0
- package/dist/sync/index.js +330 -0
- package/dist/sync/index.js.map +1 -0
- package/dist/sync/index.mjs +323 -0
- package/dist/sync/index.mjs.map +1 -0
- package/dist/sync-engine-DCIMRG5s.d.ts +61 -0
- package/dist/sync-engine-DZqyKHkK.d.mts +61 -0
- package/dist/theme/index.d.mts +53 -0
- package/dist/theme/index.d.ts +53 -0
- package/dist/theme/index.js +169 -0
- package/dist/theme/index.js.map +1 -0
- package/dist/theme/index.mjs +167 -0
- package/dist/theme/index.mjs.map +1 -0
- package/dist/ui/index.d.mts +66 -0
- package/dist/ui/index.d.ts +66 -0
- package/dist/ui/index.js +811 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/ui/index.mjs +803 -0
- package/dist/ui/index.mjs.map +1 -0
- package/dist/utilities/index.d.mts +199 -0
- package/dist/utilities/index.d.ts +199 -0
- package/dist/utilities/index.js +1991 -0
- package/dist/utilities/index.js.map +1 -0
- package/dist/utilities/index.mjs +1923 -0
- package/dist/utilities/index.mjs.map +1 -0
- package/dist/validation/index.d.mts +60 -0
- package/dist/validation/index.d.ts +60 -0
- package/dist/validation/index.js +460 -0
- package/dist/validation/index.js.map +1 -0
- package/dist/validation/index.mjs +455 -0
- package/dist/validation/index.mjs.map +1 -0
- package/dist/vue/index.d.mts +135 -0
- package/dist/vue/index.d.ts +135 -0
- package/dist/vue/index.js +621 -0
- package/dist/vue/index.js.map +1 -0
- package/dist/vue/index.mjs +619 -0
- package/dist/vue/index.mjs.map +1 -0
- package/dist/watermark.service-Detur5tq.d.ts +235 -0
- package/dist/watermark.service-QNegMeQZ.d.mts +235 -0
- package/dist/workers/index.d.mts +42 -0
- package/dist/workers/index.d.ts +42 -0
- package/dist/workers/index.js +359 -0
- package/dist/workers/index.js.map +1 -0
- package/dist/workers/index.mjs +356 -0
- package/dist/workers/index.mjs.map +1 -0
- package/dist/workflow/index.d.mts +99 -0
- package/dist/workflow/index.d.ts +99 -0
- package/dist/workflow/index.js +282 -0
- package/dist/workflow/index.js.map +1 -0
- package/dist/workflow/index.mjs +279 -0
- package/dist/workflow/index.mjs.map +1 -0
- package/package.json +226 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/security/secure-storage.ts","../../src/events/index.ts","../../src/security/behavioral-biometrics.ts","../../src/security/risk-engine.ts","../../src/security/pii-scanner.ts","../../src/security/secret-sharing.ts","../../src/security/differential-privacy.ts","../../src/security/screen-security.ts","../../src/security/request-signing.service.ts","../../src/security/secure-clipboard.ts","../../src/security/anti-tamper.service.ts","../../src/security/cert-pinning.service.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["export interface JoopSecureStorageConfig {\n namespace?: string;\n backend?: 'localStorage' | 'sessionStorage' | 'memory';\n salt?: string;\n}\n\ninterface StorageBackend {\n getItem(key: string): string | null;\n setItem(key: string, value: string): void;\n removeItem(key: string): void;\n key(index: number): string | null;\n readonly length: number;\n}\n\nclass MemoryBackend implements StorageBackend {\n private readonly store = new Map<string, string>();\n getItem(key: string) { return this.store.get(key) ?? null; }\n setItem(key: string, value: string) { this.store.set(key, value); }\n removeItem(key: string) { this.store.delete(key); }\n key(index: number) { return Array.from(this.store.keys())[index] ?? null; }\n get length() { return this.store.size; }\n}\n\nfunction deviceFingerprint(): string {\n if (typeof window === 'undefined') return 'server-side';\n return [\n navigator.userAgent,\n String(screen.width),\n String(screen.height),\n String(screen.colorDepth),\n Intl.DateTimeFormat().resolvedOptions().timeZone,\n navigator.language,\n ].join('|');\n}\n\nasync function deriveKey(fingerprint: string, salt: string): Promise<CryptoKey> {\n const enc = new TextEncoder();\n const keyMat = await crypto.subtle.importKey('raw', enc.encode(fingerprint), 'PBKDF2', false, ['deriveKey']);\n return crypto.subtle.deriveKey(\n { name: 'PBKDF2', salt: enc.encode(salt), iterations: 100_000, hash: 'SHA-256' },\n keyMat,\n { name: 'AES-GCM', length: 256 },\n false,\n ['encrypt', 'decrypt'],\n );\n}\n\nasync function encryptValue(key: CryptoKey, plaintext: string): Promise<string> {\n const iv = crypto.getRandomValues(new Uint8Array(12));\n const encoded = new TextEncoder().encode(plaintext);\n const ciphertext = await crypto.subtle.encrypt({ name: 'AES-GCM', iv }, key, encoded);\n const combined = new Uint8Array(12 + ciphertext.byteLength);\n combined.set(iv);\n combined.set(new Uint8Array(ciphertext), 12);\n return btoa(String.fromCharCode(...combined));\n}\n\nasync function decryptValue(key: CryptoKey, data: string): Promise<string> {\n const combined = Uint8Array.from(atob(data), c => c.charCodeAt(0));\n const iv = combined.slice(0, 12);\n const ciphertext = combined.slice(12);\n const decrypted = await crypto.subtle.decrypt({ name: 'AES-GCM', iv }, key, ciphertext);\n return new TextDecoder().decode(decrypted);\n}\n\nexport class JoopSecureStorage {\n private readonly ns: string;\n private readonly salt: string;\n private readonly backend: StorageBackend;\n private _key?: CryptoKey;\n\n constructor(config: JoopSecureStorageConfig = {}) {\n this.ns = config.namespace ?? 'joop';\n this.salt = config.salt ?? (typeof location !== 'undefined' ? location.hostname : 'joopjs') + ':' + this.ns;\n const b = config.backend ?? 'localStorage';\n if (b === 'memory' || typeof window === 'undefined') {\n this.backend = new MemoryBackend();\n } else if (b === 'sessionStorage') {\n this.backend = sessionStorage;\n } else {\n this.backend = localStorage;\n }\n }\n\n private async cryptoKey(): Promise<CryptoKey> {\n if (!this._key) this._key = await deriveKey(deviceFingerprint(), this.salt);\n return this._key;\n }\n\n private storageKey(key: string): string { return `${this.ns}:${key}`; }\n\n async setItem(key: string, value: unknown): Promise<void> {\n const encrypted = await encryptValue(await this.cryptoKey(), JSON.stringify(value));\n this.backend.setItem(this.storageKey(key), encrypted);\n }\n\n async getItem<T>(key: string): Promise<T | null> {\n const raw = this.backend.getItem(this.storageKey(key));\n if (raw === null) return null;\n try {\n const decrypted = await decryptValue(await this.cryptoKey(), raw);\n return JSON.parse(decrypted) as T;\n } catch { return null; }\n }\n\n async removeItem(key: string): Promise<void> {\n this.backend.removeItem(this.storageKey(key));\n }\n\n async has(key: string): Promise<boolean> {\n return this.backend.getItem(this.storageKey(key)) !== null;\n }\n\n async keys(): Promise<string[]> {\n const prefix = `${this.ns}:`;\n const result: string[] = [];\n for (let i = 0; i < this.backend.length; i++) {\n const k = this.backend.key(i);\n if (k?.startsWith(prefix)) result.push(k.slice(prefix.length));\n }\n return result;\n }\n\n async clear(): Promise<void> {\n const ks = await this.keys();\n ks.forEach(k => this.backend.removeItem(this.storageKey(k)));\n }\n\n async setItems(entries: Record<string, unknown>): Promise<void> {\n await Promise.all(Object.entries(entries).map(([k, v]) => this.setItem(k, v)));\n }\n\n async getAll(): Promise<Record<string, unknown>> {\n const ks = await this.keys();\n const pairs = await Promise.all(ks.map(async k => [k, await this.getItem(k)] as const));\n return Object.fromEntries(pairs);\n }\n}\n","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 JoopBiometricProfile {\n avgTypingInterval: number; // ms between keystrokes\n avgDwellTime: number; // ms a key is held\n mouseSpeed: number; // px/ms average\n mouseAcceleration: number;\n scrollVelocity: number;\n touchPressureAvg: number;\n sampleCount: number;\n capturedAt: number;\n}\n\nexport interface JoopAnomalyEvent {\n type: 'typing' | 'mouse' | 'scroll' | 'touch';\n deviation: number; // standard deviations from baseline\n value: number;\n baseline: number;\n}\n\nexport interface JoopBiometricScore {\n human: number; // 0–1 probability\n bot: number; // 0–1 probability\n confidence: number; // 0–1 how confident we are\n}\n\nexport class JoopBehavioralBiometrics {\n private _running = false;\n private _profile$ = new JoopBehaviorSubject<JoopBiometricProfile | null>(null);\n private _anomaly$ = new JoopSubject<JoopAnomalyEvent>();\n private _listeners: Array<() => void> = [];\n\n // Raw samples\n private _keyIntervals: number[] = [];\n private _dwellTimes: number[] = [];\n private _mouseSpeeds: number[] = [];\n private _mouseAccels: number[] = [];\n private _scrollVelocities: number[] = [];\n private _pressures: number[] = [];\n\n // State\n private _lastKeyDown = 0;\n private _lastKeyDownMap = new Map<string, number>();\n private _lastMouse = { x: 0, y: 0, t: 0, speed: 0 };\n private _lastScroll = { y: 0, t: 0 };\n private _baseline: JoopBiometricProfile | null = null;\n\n start(): void {\n if (this._running) return;\n this._running = true;\n this._attach('keydown', this._onKeyDown.bind(this) as EventListener);\n this._attach('keyup', this._onKeyUp.bind(this) as EventListener);\n this._attach('mousemove', this._onMouseMove.bind(this) as EventListener);\n this._attach('scroll', this._onScroll.bind(this), { passive: true });\n this._attach('touchstart', this._onTouch.bind(this) as EventListener, { passive: true });\n }\n\n stop(): void {\n this._running = false;\n for (const remove of this._listeners) remove();\n this._listeners = [];\n }\n\n reset(): void { this._keyIntervals = []; this._dwellTimes = []; this._mouseSpeeds = []; this._mouseAccels = []; this._scrollVelocities = []; this._pressures = []; this._baseline = null; this._profile$.next(null); }\n\n setBaseline(profile?: JoopBiometricProfile): void { this._baseline = profile ?? this._profile$.getValue(); }\n\n getScore(): JoopBiometricScore {\n const p = this._profile$.getValue();\n if (!p || p.sampleCount < 20) return { human: 0.5, bot: 0.5, confidence: 0 };\n\n let humanScore = 0; let checks = 0;\n\n // Bots tend to have near-zero or perfectly constant typing intervals\n if (p.sampleCount >= 5) {\n const cv = _cv(this._keyIntervals);\n humanScore += cv > 0.15 ? 1 : cv > 0.05 ? 0.5 : 0;\n checks++;\n }\n // Bots move mouse in straight lines (low acceleration variance)\n if (this._mouseSpeeds.length >= 10) {\n const cv = _cv(this._mouseSpeeds);\n humanScore += cv > 0.2 ? 1 : cv > 0.08 ? 0.5 : 0;\n checks++;\n }\n // Humans have organic scroll patterns\n if (this._scrollVelocities.length >= 5) {\n const cv = _cv(this._scrollVelocities);\n humanScore += cv > 0.1 ? 1 : 0.3;\n checks++;\n }\n\n const confidence = Math.min(1, p.sampleCount / 100);\n const human = checks ? humanScore / checks : 0.5;\n return { human, bot: 1 - human, confidence };\n }\n\n getProfile(): JoopBiometricProfile | null { return this._profile$.getValue(); }\n profile$() { return this._profile$.asObservable(); }\n anomaly$() { return this._anomaly$.asObservable(); }\n\n /** Similarity to another profile (0=different, 1=identical) */\n compare(other: JoopBiometricProfile): number {\n const p = this._profile$.getValue();\n if (!p) return 0;\n const delta = (a: number, b: number) => 1 - Math.min(1, Math.abs(a - b) / (Math.max(a, b) || 1));\n return (delta(p.avgTypingInterval, other.avgTypingInterval) + delta(p.mouseSpeed, other.mouseSpeed) + delta(p.scrollVelocity, other.scrollVelocity)) / 3;\n }\n\n private _onKeyDown(e: KeyboardEvent): void {\n const now = Date.now();\n if (this._lastKeyDown > 0) this._keyIntervals.push(now - this._lastKeyDown);\n this._lastKeyDownMap.set(e.key, now);\n this._lastKeyDown = now;\n this._update();\n }\n\n private _onKeyUp(e: KeyboardEvent): void {\n const down = this._lastKeyDownMap.get(e.key);\n if (down) { this._dwellTimes.push(Date.now() - down); this._lastKeyDownMap.delete(e.key); }\n this._update();\n }\n\n private _onMouseMove(e: MouseEvent): void {\n const now = Date.now();\n const { x: lx, y: ly, t: lt, speed: ls } = this._lastMouse;\n if (lt > 0) {\n const dx = e.clientX - lx, dy = e.clientY - ly, dt = now - lt;\n if (dt > 0) {\n const speed = Math.sqrt(dx * dx + dy * dy) / dt;\n const accel = Math.abs(speed - ls) / dt;\n this._mouseSpeeds.push(speed);\n this._mouseAccels.push(accel);\n this._lastMouse = { x: e.clientX, y: e.clientY, t: now, speed };\n this._update();\n return;\n }\n }\n this._lastMouse = { x: e.clientX, y: e.clientY, t: now, speed: 0 };\n }\n\n private _onScroll(): void {\n const now = Date.now(); const y = window.scrollY;\n const { y: ly, t: lt } = this._lastScroll;\n if (lt > 0 && now - lt > 0) { this._scrollVelocities.push(Math.abs(y - ly) / (now - lt)); this._update(); }\n this._lastScroll = { y, t: now };\n }\n\n private _onTouch(e: TouchEvent): void {\n if (e.touches[0] && (e.touches[0] as unknown as { force?: number }).force !== undefined) {\n const f = (e.touches[0] as unknown as { force: number }).force;\n this._pressures.push(f);\n }\n this._update();\n }\n\n private _update(): void {\n const count = this._keyIntervals.length + this._mouseSpeeds.length;\n const profile: JoopBiometricProfile = {\n avgTypingInterval: _mean(this._keyIntervals),\n avgDwellTime: _mean(this._dwellTimes),\n mouseSpeed: _mean(this._mouseSpeeds),\n mouseAcceleration: _mean(this._mouseAccels),\n scrollVelocity: _mean(this._scrollVelocities),\n touchPressureAvg: _mean(this._pressures),\n sampleCount: count,\n capturedAt: Date.now(),\n };\n this._profile$.next(profile);\n\n // Check for anomaly against baseline\n if (this._baseline && count >= 30) {\n const { avgTypingInterval: bt } = this._baseline;\n const devs = _stddev(this._keyIntervals.slice(-20));\n if (bt > 0 && devs > 0) {\n const z = Math.abs(profile.avgTypingInterval - bt) / devs;\n if (z > 2.5) this._anomaly$.next({ type: 'typing', deviation: z, value: profile.avgTypingInterval, baseline: bt });\n }\n }\n }\n\n private _attach(event: string, handler: EventListenerOrEventListenerObject, opts?: AddEventListenerOptions): void {\n document.addEventListener(event, handler, opts);\n this._listeners.push(() => document.removeEventListener(event, handler));\n }\n}\n\nfunction _mean(arr: number[]): number { return arr.length ? arr.reduce((a, b) => a + b, 0) / arr.length : 0; }\nfunction _stddev(arr: number[]): number { if (arr.length < 2) return 0; const m = _mean(arr); return Math.sqrt(arr.reduce((s, v) => s + (v - m) ** 2, 0) / (arr.length - 1)); }\nfunction _cv(arr: number[]): number { const m = _mean(arr); return m ? _stddev(arr) / m : 0; }\n","import { JoopBehaviorSubject, JoopSubject } from '../events';\n\nexport interface JoopRiskFactor {\n name: string;\n weight: number; // 0–1 relative weight\n evaluate: (ctx: JoopRiskContext) => number; // returns 0–1 risk score for this factor\n}\n\nexport interface JoopRiskContext {\n userId?: string;\n ipAddress?: string;\n deviceId?: string;\n country?: string;\n latitude?: number;\n longitude?: number;\n userAgent?: string;\n hourOfDay?: number; // 0–23\n dayOfWeek?: number; // 0=Sun\n transactionAmount?: number;\n biometricScore?: number; // 0=bot, 1=human\n failedAttempts?: number;\n mfaVerified?: boolean;\n knownDevice?: boolean;\n vpnDetected?: boolean;\n [key: string]: unknown;\n}\n\nexport interface JoopRiskScore {\n total: number; // 0–100\n level: 'low' | 'medium' | 'high' | 'critical';\n factors: Record<string, number>;\n context: JoopRiskContext;\n timestamp: number;\n}\n\nconst BUILT_IN_FACTORS: JoopRiskFactor[] = [\n {\n name: 'failed_attempts',\n weight: 0.25,\n evaluate: ctx => Math.min(1, (ctx.failedAttempts ?? 0) / 5),\n },\n {\n name: 'biometrics',\n weight: 0.2,\n evaluate: ctx => {\n if (ctx.biometricScore === undefined) return 0.3;\n return 1 - ctx.biometricScore;\n },\n },\n {\n name: 'mfa',\n weight: 0.15,\n evaluate: ctx => ctx.mfaVerified ? 0 : 0.5,\n },\n {\n name: 'known_device',\n weight: 0.15,\n evaluate: ctx => ctx.knownDevice === false ? 0.7 : 0,\n },\n {\n name: 'vpn',\n weight: 0.1,\n evaluate: ctx => ctx.vpnDetected ? 0.6 : 0,\n },\n {\n name: 'time_anomaly',\n weight: 0.1,\n evaluate: ctx => {\n const h = ctx.hourOfDay ?? 12;\n // Unusual hours (midnight to 5am) increase risk\n return h >= 1 && h <= 5 ? 0.4 : 0;\n },\n },\n {\n name: 'transaction_amount',\n weight: 0.05,\n evaluate: ctx => {\n const amt = ctx.transactionAmount ?? 0;\n if (amt > 100000) return 0.9;\n if (amt > 10000) return 0.5;\n if (amt > 1000) return 0.2;\n return 0;\n },\n },\n];\n\nexport class JoopRiskEngine {\n private _factors: JoopRiskFactor[] = [...BUILT_IN_FACTORS];\n private _score$ = new JoopBehaviorSubject<JoopRiskScore | null>(null);\n private _highRiskHandlers: Array<{ threshold: number; handler: (s: JoopRiskScore) => void }> = [];\n private _stepUpHandler: ((score: JoopRiskScore) => void) | null = null;\n private _stepUpThreshold = 70;\n\n /** Replace all factors */\n configure(factors: JoopRiskFactor[]): void { this._factors = factors; }\n\n /** Add or update a single named factor */\n addFactor(name: string, weight: number, evaluate: (ctx: JoopRiskContext) => number): void {\n const idx = this._factors.findIndex(f => f.name === name);\n if (idx >= 0) this._factors[idx] = { name, weight, evaluate };\n else this._factors.push({ name, weight, evaluate });\n }\n\n removeFactor(name: string): void { this._factors = this._factors.filter(f => f.name !== name); }\n\n evaluate(ctx: JoopRiskContext): JoopRiskScore {\n const totalWeight = this._factors.reduce((s, f) => s + f.weight, 0) || 1;\n const factors: Record<string, number> = {};\n let weighted = 0;\n\n for (const f of this._factors) {\n const raw = Math.max(0, Math.min(1, f.evaluate(ctx)));\n factors[f.name] = raw;\n weighted += raw * (f.weight / totalWeight);\n }\n\n const total = Math.round(weighted * 100);\n const level: JoopRiskScore['level'] = total >= 75 ? 'critical' : total >= 50 ? 'high' : total >= 25 ? 'medium' : 'low';\n const score: JoopRiskScore = { total, level, factors, context: ctx, timestamp: Date.now() };\n this._score$.next(score);\n\n for (const { threshold, handler } of this._highRiskHandlers) {\n if (total >= threshold) handler(score);\n }\n if (this._stepUpHandler && total >= this._stepUpThreshold) this._stepUpHandler(score);\n\n return score;\n }\n\n score$() { return this._score$.asObservable(); }\n lastScore(): JoopRiskScore | null { return this._score$.getValue(); }\n\n /** Register a handler triggered when score ≥ threshold */\n onHighRisk(threshold: number, handler: (score: JoopRiskScore) => void): () => void {\n const entry = { threshold, handler };\n this._highRiskHandlers.push(entry);\n return () => { this._highRiskHandlers = this._highRiskHandlers.filter(h => h !== entry); };\n }\n\n /** Configure automatic step-up auth trigger */\n onStepUpRequired(threshold: number, handler: (score: JoopRiskScore) => void): void {\n this._stepUpThreshold = threshold;\n this._stepUpHandler = handler;\n }\n}\n","export interface JoopPIIFinding {\n type: string;\n value: string;\n start: number;\n end: number;\n}\n\nexport interface JoopPIIPattern {\n name: string;\n regex: RegExp;\n}\n\nconst BUILT_IN_PATTERNS: JoopPIIPattern[] = [\n { name: 'credit_card', regex: /\\b(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|3[47][0-9]{13}|6(?:011|5[0-9]{2})[0-9]{12})\\b/g },\n { name: 'ssn', regex: /\\b\\d{3}[-\\s]?\\d{2}[-\\s]?\\d{4}\\b/g },\n { name: 'email', regex: /\\b[A-Za-z0-9._%+\\-]+@[A-Za-z0-9.\\-]+\\.[A-Za-z]{2,}\\b/g },\n { name: 'phone_us', regex: /(?:\\+1[\\s-]?)?(?:\\(\\d{3}\\)|\\d{3})[-.\\s]?\\d{3}[-.\\s]?\\d{4}\\b/g },\n { name: 'iban', regex: /\\b[A-Z]{2}\\d{2}[A-Z0-9]{4}\\d{7}(?:[A-Z0-9]{0,16})?\\b/g },\n { name: 'passport', regex: /\\b[A-Z]{1,2}[0-9]{6,9}\\b/g },\n { name: 'ip_address', regex: /\\b(?:\\d{1,3}\\.){3}\\d{1,3}\\b/g },\n { name: 'jwt', regex: /eyJ[A-Za-z0-9_\\-]+\\.eyJ[A-Za-z0-9_\\-]+\\.[A-Za-z0-9_\\-]+/g },\n { name: 'api_key', regex: /\\b(?:sk|pk|api|key)[_\\-]?[a-zA-Z0-9]{20,}\\b/gi },\n];\n\nconst DEFAULT_REPLACER: Record<string, string> = {\n credit_card: '[CARD-REDACTED]',\n ssn: '[SSN-REDACTED]',\n email: '[EMAIL-REDACTED]',\n phone_us: '[PHONE-REDACTED]',\n iban: '[IBAN-REDACTED]',\n passport: '[PASSPORT-REDACTED]',\n ip_address: '[IP-REDACTED]',\n jwt: '[JWT-REDACTED]',\n api_key: '[KEY-REDACTED]',\n};\n\nexport class JoopPIIScanner {\n private _patterns: JoopPIIPattern[] = [...BUILT_IN_PATTERNS];\n\n /** Add or replace a custom pattern */\n addPattern(name: string, regex: RegExp): void {\n const idx = this._patterns.findIndex(p => p.name === name);\n if (idx >= 0) this._patterns[idx] = { name, regex };\n else this._patterns.push({ name, regex });\n }\n\n removePattern(name: string): void { this._patterns = this._patterns.filter(p => p.name !== name); }\n\n /** Return all PII findings in text */\n scan(text: string): JoopPIIFinding[] {\n const findings: JoopPIIFinding[] = [];\n for (const { name, regex } of this._patterns) {\n const r = new RegExp(regex.source, regex.flags.includes('g') ? regex.flags : regex.flags + 'g');\n r.lastIndex = 0;\n let m: RegExpExecArray | null;\n while ((m = r.exec(text)) !== null) {\n findings.push({ type: name, value: m[0], start: m.index, end: m.index + m[0].length });\n }\n }\n return findings.sort((a, b) => a.start - b.start);\n }\n\n /** Replace all PII in text. Replacement can be a string or function(type) */\n redact(text: string, replacement?: string | ((type: string) => string)): string {\n const findings = this.scan(text);\n if (findings.length === 0) return text;\n\n // Process from end to preserve indices\n let result = text;\n for (const f of [...findings].reverse()) {\n const repl = replacement\n ? (typeof replacement === 'string' ? replacement : replacement(f.type))\n : (DEFAULT_REPLACER[f.type] ?? `[${f.type.toUpperCase()}-REDACTED]`);\n result = result.slice(0, f.start) + repl + result.slice(f.end);\n }\n return result;\n }\n\n /** Returns true if the text contains any PII */\n contains(text: string): boolean { return this.scan(text).length > 0; }\n\n /** Hash PII values (SHA-256 truncated) — returns text with hashed placeholders */\n async pseudonymize(text: string): Promise<string> {\n const findings = this.scan(text);\n if (findings.length === 0) return text;\n\n const cache = new Map<string, string>();\n const hash = async (val: string) => {\n if (cache.has(val)) return cache.get(val)!;\n const buf = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(val));\n const h = Array.from(new Uint8Array(buf)).slice(0, 8).map(b => b.toString(16).padStart(2, '0')).join('');\n cache.set(val, h);\n return h;\n };\n\n let result = text;\n for (const f of [...findings].reverse()) {\n const h = await hash(f.value);\n result = result.slice(0, f.start) + `[${f.type}:${h}]` + result.slice(f.end);\n }\n return result;\n }\n}\n","export interface JoopShare {\n x: number;\n y: bigint;\n}\n\n// Shamir's Secret Sharing over a 256-bit prime field\n// p = 2^256 - 2^32 - 2^9 - 2^8 - 2^7 - 2^6 - 2^4 - 1 (secp256k1 field prime)\nconst PRIME = BigInt('0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F');\n\nexport class JoopSecretSharing {\n /**\n * Split a secret string into `n` shares, requiring `k` shares to reconstruct.\n * Uses Shamir's Secret Sharing over GF(PRIME).\n */\n split(secret: string, n: number, k: number): JoopShare[] {\n if (k > n) throw new Error('k must be ≤ n');\n if (k < 2) throw new Error('k must be at least 2');\n\n const secretBytes = new TextEncoder().encode(secret);\n const secretBig = _bytesToBigInt(secretBytes);\n if (secretBig >= PRIME) throw new Error('Secret too large for this field');\n\n const coefficients: bigint[] = [secretBig];\n for (let i = 1; i < k; i++) {\n coefficients.push(_randomBigInt(PRIME));\n }\n\n const shares: JoopShare[] = [];\n for (let x = 1; x <= n; x++) {\n let y = BigInt(0);\n const xBig = BigInt(x);\n for (let i = 0; i < coefficients.length; i++) {\n y = _modAdd(y, _modMul(coefficients[i], _modPow(xBig, BigInt(i), PRIME), PRIME), PRIME);\n }\n shares.push({ x, y });\n }\n return shares;\n }\n\n /**\n * Reconstruct the secret from k or more shares using Lagrange interpolation.\n */\n combine(shares: JoopShare[]): string {\n if (shares.length < 2) throw new Error('At least 2 shares required');\n\n let secret = BigInt(0);\n for (let i = 0; i < shares.length; i++) {\n const xi = BigInt(shares[i].x);\n let num = BigInt(1);\n let den = BigInt(1);\n for (let j = 0; j < shares.length; j++) {\n if (i === j) continue;\n const xj = BigInt(shares[j].x);\n num = _modMul(num, _modSub(BigInt(0), xj, PRIME), PRIME);\n den = _modMul(den, _modSub(xi, xj, PRIME), PRIME);\n }\n const lagrange = _modMul(num, _modPow(den, PRIME - BigInt(2), PRIME), PRIME);\n secret = _modAdd(secret, _modMul(shares[i].y, lagrange, PRIME), PRIME);\n }\n\n const bytes = _bigIntToBytes(secret);\n return new TextDecoder().decode(bytes);\n }\n\n /** Verify that a set of shares produces a consistent secret */\n verify(sharesA: JoopShare[], sharesB: JoopShare[]): boolean {\n try {\n return this.combine(sharesA) === this.combine(sharesB);\n } catch {\n return false;\n }\n }\n\n /** Serialize shares to base64 strings for transport */\n serializeShare(share: JoopShare): string {\n return btoa(JSON.stringify({ x: share.x, y: share.y.toString(16) }));\n }\n\n /** Deserialize a base64 share */\n deserializeShare(encoded: string): JoopShare {\n const { x, y } = JSON.parse(atob(encoded));\n return { x, y: BigInt(`0x${y}`) };\n }\n}\n\nfunction _modAdd(a: bigint, b: bigint, p: bigint): bigint { return ((a + b) % p + p) % p; }\nfunction _modSub(a: bigint, b: bigint, p: bigint): bigint { return ((a - b) % p + p) % p; }\nfunction _modMul(a: bigint, b: bigint, p: bigint): bigint { return (a * b) % p; }\n\nfunction _modPow(base: bigint, exp: bigint, mod: bigint): bigint {\n let result = BigInt(1);\n base = base % mod;\n while (exp > 0n) {\n if (exp % 2n === 1n) result = _modMul(result, base, mod);\n exp >>= 1n;\n base = _modMul(base, base, mod);\n }\n return result;\n}\n\nfunction _bytesToBigInt(bytes: Uint8Array): bigint {\n let result = 0n;\n for (const byte of bytes) result = (result << 8n) | BigInt(byte);\n return result;\n}\n\nfunction _bigIntToBytes(n: bigint): Uint8Array {\n if (n === 0n) return new Uint8Array([0]);\n const hex = n.toString(16).padStart(2, '0');\n const padded = hex.length % 2 ? '0' + hex : hex;\n const bytes = new Uint8Array(padded.length / 2);\n for (let i = 0; i < bytes.length; i++) bytes[i] = parseInt(padded.slice(i * 2, i * 2 + 2), 16);\n return bytes;\n}\n\nfunction _randomBigInt(max: bigint): bigint {\n const bytes = new Uint8Array(32);\n crypto.getRandomValues(bytes);\n return _bytesToBigInt(bytes) % max;\n}\n","/**\n * Differential Privacy utilities using the Laplace mechanism and randomized response.\n * Provides (epsilon, 0)-differential privacy guarantees.\n */\nexport class JoopDifferentialPrivacy {\n /**\n * Add Laplace noise to a numeric value.\n * @param value - the true value\n * @param sensitivity - L1 sensitivity (max change in output from one record change)\n * @param epsilon - privacy budget (smaller = more privacy)\n */\n addLaplaceNoise(value: number, sensitivity: number, epsilon: number): number {\n const b = sensitivity / epsilon;\n return value + _sampleLaplace(b);\n }\n\n /**\n * Privatize a count (integer ≥ 0).\n * Returns a rounded, non-negative noisy count.\n */\n privatizeCount(count: number, epsilon = 1.0): number {\n const noisy = this.addLaplaceNoise(count, 1, epsilon);\n return Math.max(0, Math.round(noisy));\n }\n\n /**\n * Privatize an average over an array of values.\n * @param values - the actual values\n * @param epsilon - privacy budget\n * @param valueRange - [min, max] of each value (for sensitivity calculation)\n */\n privatizeAverage(values: number[], epsilon = 1.0, valueRange: [number, number] = [0, 1]): number {\n if (values.length === 0) return 0;\n const sensitivity = (valueRange[1] - valueRange[0]) / values.length;\n const trueAvg = values.reduce((s, v) => s + v, 0) / values.length;\n return this.addLaplaceNoise(trueAvg, sensitivity, epsilon);\n }\n\n /**\n * Privatize a sum.\n */\n privatizeSum(values: number[], epsilon = 1.0, sensitivity = 1.0): number {\n const trueSum = values.reduce((s, v) => s + v, 0);\n return this.addLaplaceNoise(trueSum, sensitivity, epsilon);\n }\n\n /**\n * Randomized response for boolean values (local differential privacy).\n * Each individual flips their true value with probability p = 1/(1+e^epsilon).\n * @returns a potentially flipped boolean\n */\n randomizedResponse(value: boolean, epsilon = 1.0): boolean {\n const p = 1 / (1 + Math.exp(epsilon));\n return Math.random() < p ? !value : value;\n }\n\n /**\n * Randomized response for categorical values (k-ary randomized response).\n * Returns the true value with probability p, and a random other value with 1-p.\n */\n randomizedResponseCategorical<T>(value: T, domain: T[], epsilon = 1.0): T {\n const k = domain.length;\n if (k < 2) return value;\n const p = Math.exp(epsilon) / (Math.exp(epsilon) + k - 1);\n if (Math.random() < p) return value;\n // Pick uniformly from the other values\n const others = domain.filter(v => v !== value);\n return others[Math.floor(Math.random() * others.length)];\n }\n\n /**\n * Gaussian mechanism: add N(0, sigma^2) noise where sigma = sqrt(2*ln(1.25/delta)) * sensitivity / epsilon\n * Provides (epsilon, delta)-DP.\n */\n addGaussianNoise(value: number, sensitivity: number, epsilon: number, delta = 1e-5): number {\n const sigma = Math.sqrt(2 * Math.log(1.25 / delta)) * sensitivity / epsilon;\n return value + _sampleGaussian(sigma);\n }\n\n /**\n * Compute the epsilon required to achieve (epsilon)-DP for Laplace mechanism.\n */\n requiredEpsilon(sensitivity: number, targetNoise: number): number {\n return sensitivity / targetNoise;\n }\n\n /**\n * Privacy amplification: effective epsilon after subsampling fraction q of the data.\n */\n amplifiedEpsilon(epsilon: number, samplingRate: number): number {\n return Math.log(1 + samplingRate * (Math.exp(epsilon) - 1));\n }\n}\n\n/** Sample from Laplace(0, b) using inverse CDF method */\nfunction _sampleLaplace(b: number): number {\n const u = Math.random() - 0.5;\n return -b * Math.sign(u) * Math.log(1 - 2 * Math.abs(u));\n}\n\n/** Sample from N(0, sigma^2) using Box-Muller transform */\nfunction _sampleGaussian(sigma: number): number {\n const u1 = 1 - Math.random();\n const u2 = Math.random();\n return sigma * Math.sqrt(-2 * Math.log(u1)) * Math.cos(2 * Math.PI * u2);\n}\n","export interface JoopScreenSecurityConfig {\n blurOnTabSwitch?: boolean; // blur/hide sensitive content on tab hide, default true\n clipboardProtection?: boolean; // block copy of sensitive elements, default false\n devtoolsDetection?: boolean; // warn when devtools opened, default false\n screenshotWarning?: boolean; // show visual noise on PrintScreen key (best-effort), default false\n}\n\nexport type JoopScreenSecurityEvent =\n | 'devtools-open'\n | 'screenshot-attempt'\n | 'tab-hidden'\n | 'tab-visible'\n | 'clipboard-blocked';\n\nexport class JoopScreenSecurityService {\n private _config: Required<JoopScreenSecurityConfig>;\n private _listeners: Map<JoopScreenSecurityEvent, Set<() => void>> = new Map();\n private _active = false;\n private _devtoolsTimer: ReturnType<typeof setInterval> | null = null;\n\n // Elements registered as sensitive\n private _sensitiveElements: Set<Element> = new Set();\n private _blurOverlay: HTMLElement | null = null;\n\n constructor(config: JoopScreenSecurityConfig = {}) {\n this._config = {\n blurOnTabSwitch: config.blurOnTabSwitch ?? true,\n clipboardProtection: config.clipboardProtection ?? false,\n devtoolsDetection: config.devtoolsDetection ?? false,\n screenshotWarning: config.screenshotWarning ?? false,\n };\n }\n\n activate(): void {\n if (this._active) return;\n this._active = true;\n\n if (this._config.blurOnTabSwitch) {\n document.addEventListener('visibilitychange', this._onVisibilityChange);\n }\n if (this._config.screenshotWarning) {\n document.addEventListener('keyup', this._onKeyUp);\n }\n if (this._config.devtoolsDetection) {\n this._startDevtoolsDetection();\n }\n }\n\n deactivate(): void {\n if (!this._active) return;\n this._active = false;\n document.removeEventListener('visibilitychange', this._onVisibilityChange);\n document.removeEventListener('keyup', this._onKeyUp);\n if (this._devtoolsTimer) { clearInterval(this._devtoolsTimer); this._devtoolsTimer = null; }\n this._removeOverlay();\n }\n\n registerSensitive(element: Element): () => void {\n this._sensitiveElements.add(element);\n if (this._config.clipboardProtection) {\n element.addEventListener('copy', this._blockCopy as EventListener);\n element.addEventListener('cut', this._blockCopy as EventListener);\n }\n return () => this.unregisterSensitive(element);\n }\n\n unregisterSensitive(element: Element): void {\n this._sensitiveElements.delete(element);\n element.removeEventListener('copy', this._blockCopy as EventListener);\n element.removeEventListener('cut', this._blockCopy as EventListener);\n }\n\n on(event: JoopScreenSecurityEvent, handler: () => void): () => void {\n if (!this._listeners.has(event)) this._listeners.set(event, new Set());\n this._listeners.get(event)!.add(handler);\n return () => this._listeners.get(event)?.delete(handler);\n }\n\n isDevtoolsOpen(): boolean {\n // Heuristic: compare outer vs inner window size\n const threshold = 160;\n return (\n window.outerWidth - window.innerWidth > threshold ||\n window.outerHeight - window.innerHeight > threshold\n );\n }\n\n destroy(): void {\n this.deactivate();\n this._sensitiveElements.clear();\n this._listeners.clear();\n }\n\n private _onVisibilityChange = (): void => {\n if (document.hidden) {\n this._showOverlay();\n this._emit('tab-hidden');\n } else {\n this._removeOverlay();\n this._emit('tab-visible');\n }\n };\n\n private _onKeyUp = (e: KeyboardEvent): void => {\n // PrintScreen key\n if (e.key === 'PrintScreen' || e.code === 'PrintScreen') {\n this._emit('screenshot-attempt');\n // Flash overlay as best-effort deterrent\n this._showOverlay();\n setTimeout(() => this._removeOverlay(), 300);\n }\n };\n\n private _blockCopy = (e: ClipboardEvent): void => {\n e.preventDefault();\n this._emit('clipboard-blocked');\n };\n\n private _startDevtoolsDetection(): void {\n this._devtoolsTimer = setInterval(() => {\n if (this.isDevtoolsOpen()) this._emit('devtools-open');\n }, 1000);\n }\n\n private _showOverlay(): void {\n if (this._blurOverlay) return;\n const overlay = document.createElement('div');\n overlay.style.cssText = `\n position: fixed; inset: 0; z-index: 999999;\n backdrop-filter: blur(20px); -webkit-backdrop-filter: blur(20px);\n background: rgba(0,0,0,0.4); display: flex;\n align-items: center; justify-content: center;\n `;\n overlay.setAttribute('aria-hidden', 'true');\n const msg = document.createElement('div');\n msg.textContent = 'Switch back to continue';\n msg.style.cssText = 'color:#fff; font-size:18px; font-weight:600; pointer-events:none;';\n overlay.appendChild(msg);\n document.body.appendChild(overlay);\n this._blurOverlay = overlay;\n }\n\n private _removeOverlay(): void {\n if (this._blurOverlay) {\n this._blurOverlay.remove();\n this._blurOverlay = null;\n }\n }\n\n private _emit(event: JoopScreenSecurityEvent): void {\n this._listeners.get(event)?.forEach(fn => fn());\n }\n}\n","// Anti-replay request signing — HMAC-SHA256 + nonce + timestamp\n// Client signs each payload; server verifies signature and rejects replays.\n//\n// Server-side verification logic is included as a comment block at the bottom.\n\nexport interface JoopSignedPayload<T = unknown> {\n data: T;\n nonce: string; // unique per request (UUID v4)\n timestamp: number; // Unix ms\n signature: string; // HMAC-SHA256(nonce + \".\" + timestamp + \".\" + JSON.stringify(data), secret)\n}\n\nexport interface JoopRequestSigningConfig {\n /** Shared secret (ideally per-session key derived from server handshake) */\n secret: string;\n /** Max age of a request in milliseconds — server rejects older requests (default 30000 = 30s) */\n maxAgeMs?: number;\n /** Algorithm (only SHA-256 currently) */\n algorithm?: 'SHA-256';\n}\n\nasync function _hmac(secret: string, message: string): Promise<string> {\n const enc = new TextEncoder();\n const key = await crypto.subtle.importKey(\n 'raw', enc.encode(secret),\n { name: 'HMAC', hash: 'SHA-256' },\n false, ['sign'],\n );\n const sig = await crypto.subtle.sign('HMAC', key, enc.encode(message));\n return Array.from(new Uint8Array(sig)).map(b => b.toString(16).padStart(2, '0')).join('');\n}\n\nfunction _uuid(): string {\n if (typeof crypto.randomUUID === 'function') return crypto.randomUUID();\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => {\n const r = (Math.random() * 16) | 0;\n return (c === 'x' ? r : (r & 0x3) | 0x8).toString(16);\n });\n}\n\nexport class JoopRequestSigningService {\n private readonly _secret: string;\n private readonly _maxAgeMs: number;\n\n constructor(config: JoopRequestSigningConfig) {\n this._secret = config.secret;\n this._maxAgeMs = config.maxAgeMs ?? 30_000;\n }\n\n /** Sign a payload. Returns the signed envelope to send in the request body. */\n async sign<T>(data: T): Promise<JoopSignedPayload<T>> {\n const nonce = _uuid();\n const timestamp = Date.now();\n const message = `${nonce}.${timestamp}.${JSON.stringify(data)}`;\n const signature = await _hmac(this._secret, message);\n return { data, nonce, timestamp, signature };\n }\n\n /** Verify a signed payload (for testing/debugging — production verification runs server-side). */\n async verify<T>(payload: JoopSignedPayload<T>): Promise<{ valid: boolean; reason?: string }> {\n const age = Date.now() - payload.timestamp;\n if (age > this._maxAgeMs) return { valid: false, reason: `Request expired (${age}ms old)` };\n if (age < -5000) return { valid: false, reason: 'Timestamp in the future' };\n\n const message = `${payload.nonce}.${payload.timestamp}.${JSON.stringify(payload.data)}`;\n const expected = await _hmac(this._secret, message);\n if (expected !== payload.signature) return { valid: false, reason: 'Signature mismatch' };\n return { valid: true };\n }\n\n /** Add the signed envelope as the request body, returning updated fetch init. */\n async signRequest<T>(data: T, init: RequestInit = {}): Promise<RequestInit> {\n const signed = await this.sign(data);\n return {\n ...init,\n method: init.method ?? 'POST',\n headers: { 'Content-Type': 'application/json', ...(init.headers as Record<string, string> ?? {}) },\n body: JSON.stringify(signed),\n };\n }\n}\n\n/* ─────────────────────────────────────────────────────────────────────────────\n SERVER-SIDE VERIFICATION (Node.js / Express example)\n ─────────────────────────────────────────────────────────────────────────────\n\nimport crypto from 'node:crypto';\n\nconst SHARED_SECRET = process.env.REQUEST_SIGNING_SECRET!;\nconst MAX_AGE_MS = 30_000; // 30 seconds\nconst usedNonces = new Map<string, number>(); // nonce → timestamp; evict after MAX_AGE_MS\n\nfunction hmac(secret: string, message: string): string {\n return crypto.createHmac('sha256', secret).update(message).digest('hex');\n}\n\nfunction evictExpiredNonces() {\n const cutoff = Date.now() - MAX_AGE_MS;\n for (const [nonce, ts] of usedNonces) {\n if (ts < cutoff) usedNonces.delete(nonce);\n }\n}\n\nexport function verifySignedPayload(body: {\n data: unknown; nonce: string; timestamp: number; signature: string;\n}): { valid: boolean; reason?: string } {\n evictExpiredNonces();\n\n const age = Date.now() - body.timestamp;\n if (age > MAX_AGE_MS) return { valid: false, reason: 'Request expired' };\n if (age < -5000) return { valid: false, reason: 'Timestamp in the future' };\n if (usedNonces.has(body.nonce)) return { valid: false, reason: 'Replay detected' };\n\n const message = `${body.nonce}.${body.timestamp}.${JSON.stringify(body.data)}`;\n const expected = hmac(SHARED_SECRET, message);\n if (!crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(body.signature))) {\n return { valid: false, reason: 'Signature mismatch' };\n }\n\n usedNonces.set(body.nonce, body.timestamp);\n return { valid: true };\n}\n\n// Express middleware\nexport function replayGuard(req, res, next) {\n const result = verifySignedPayload(req.body);\n if (!result.valid) return res.status(401).json({ error: result.reason });\n req.verifiedPayload = req.body.data;\n next();\n}\n\n─────────────────────────────────────────────────────────────────────────────── */\n","import { JoopSubject } from '../events';\n\nexport interface JoopClipboardEntry {\n text: string;\n copiedAt: number;\n expiresAt: number;\n label?: string;\n isSensitive: boolean;\n}\n\nexport interface JoopClipboardEvent {\n type: 'copied' | 'cleared' | 'expired';\n entry?: JoopClipboardEntry;\n}\n\nexport interface JoopSecureClipboardConfig {\n defaultTtlMs?: number;\n sensitivePatterns?: RegExp[];\n autoClearOnHide?: boolean;\n}\n\nconst DEFAULT_SENSITIVE_PATTERNS: RegExp[] = [\n /\\b\\d{13,19}\\b/, // card numbers\n /\\b[A-Z]{2}\\d{2}[A-Z0-9]{11,30}\\b/, // IBAN\n /\\b\\d{3}-\\d{2}-\\d{4}\\b/, // SSN\n /^\\d{6,8}$/, // OTP / PIN\n /\\b\\d{4}\\s\\d{4}\\s\\d{4}\\s\\d{4}\\b/, // formatted card\n];\n\nexport class JoopSecureClipboard {\n private _config: Required<JoopSecureClipboardConfig>;\n private _current: JoopClipboardEntry | null = null;\n private _timer: ReturnType<typeof setTimeout> | null = null;\n private _event$ = new JoopSubject<JoopClipboardEvent>();\n private _visibilityHandler: (() => void) | null = null;\n\n constructor(config: JoopSecureClipboardConfig = {}) {\n this._config = {\n defaultTtlMs: config.defaultTtlMs ?? 30_000,\n sensitivePatterns: config.sensitivePatterns ?? DEFAULT_SENSITIVE_PATTERNS,\n autoClearOnHide: config.autoClearOnHide ?? true,\n };\n if (this._config.autoClearOnHide && typeof document !== 'undefined') {\n this._visibilityHandler = () => { if (document.visibilityState === 'hidden') this.clear('expired'); };\n document.addEventListener('visibilitychange', this._visibilityHandler);\n }\n }\n\n // ── Write ─────────────────────────────────────────────────────────────────\n\n async copy(text: string, options: { ttlMs?: number; label?: string } = {}): Promise<void> {\n const ttl = options.ttlMs ?? this._config.defaultTtlMs;\n const now = Date.now();\n const entry: JoopClipboardEntry = {\n text,\n copiedAt: now,\n expiresAt: now + ttl,\n label: options.label,\n isSensitive: this._detectSensitive(text),\n };\n\n if (typeof navigator !== 'undefined' && navigator.clipboard?.writeText) {\n await navigator.clipboard.writeText(text);\n }\n\n this._cancelTimer();\n this._current = entry;\n this._event$.next({ type: 'copied', entry: { ...entry } });\n\n this._timer = setTimeout(() => this.clear('expired'), ttl);\n }\n\n // ── Read ──────────────────────────────────────────────────────────────────\n\n async read(): Promise<string | null> {\n if (typeof navigator !== 'undefined' && navigator.clipboard?.readText) {\n try { return await navigator.clipboard.readText(); } catch { /* permission denied */ }\n }\n return this._current?.text ?? null;\n }\n\n // ── Clear ─────────────────────────────────────────────────────────────────\n\n async clear(reason: 'manual' | 'expired' = 'manual'): Promise<void> {\n this._cancelTimer();\n const entry = this._current;\n this._current = null;\n\n if (typeof navigator !== 'undefined' && navigator.clipboard?.writeText) {\n try { await navigator.clipboard.writeText(''); } catch { /* permission denied */ }\n }\n\n this._event$.next({ type: reason === 'expired' ? 'expired' : 'cleared', entry: entry ?? undefined });\n }\n\n // ── Introspection ─────────────────────────────────────────────────────────\n\n getCurrent(): JoopClipboardEntry | null {\n if (!this._current) return null;\n if (Date.now() > this._current.expiresAt) { this.clear('expired'); return null; }\n return { ...this._current };\n }\n\n isExpired(): boolean {\n return !this._current || Date.now() > this._current.expiresAt;\n }\n\n getRemainingMs(): number {\n if (!this._current) return 0;\n return Math.max(0, this._current.expiresAt - Date.now());\n }\n\n isSensitive(text: string): boolean { return this._detectSensitive(text); }\n\n // ── Observable ────────────────────────────────────────────────────────────\n\n events$() { return this._event$.asObservable(); }\n\n // ── Cleanup ───────────────────────────────────────────────────────────────\n\n destroy(): void {\n this._cancelTimer();\n if (this._visibilityHandler && typeof document !== 'undefined') {\n document.removeEventListener('visibilitychange', this._visibilityHandler);\n }\n }\n\n // ── Internals ─────────────────────────────────────────────────────────────\n\n private _detectSensitive(text: string): boolean {\n return this._config.sensitivePatterns.some(p => p.test(text.trim()));\n }\n\n private _cancelTimer(): void {\n if (this._timer !== null) { clearTimeout(this._timer); this._timer = null; }\n }\n}\n","import { JoopSubject } from '../events';\n\nexport type JoopTamperType =\n | 'devtools'\n | 'dom-injection'\n | 'prototype-pollution'\n | 'debugger-pause'\n | 'console-override'\n | 'function-override';\n\nexport type JoopTamperSeverity = 'low' | 'medium' | 'high' | 'critical';\n\nexport interface JoopTamperCheck {\n type: JoopTamperType;\n detected: boolean;\n severity: JoopTamperSeverity;\n detail?: string;\n}\n\nexport interface JoopTamperReport {\n timestamp: number;\n checks: JoopTamperCheck[];\n threatCount: number;\n highestSeverity: JoopTamperSeverity | null;\n}\n\nconst SEVERITY: Record<JoopTamperType, JoopTamperSeverity> = {\n 'devtools': 'medium',\n 'dom-injection': 'high',\n 'prototype-pollution': 'critical',\n 'debugger-pause': 'medium',\n 'console-override': 'medium',\n 'function-override': 'high',\n};\n\nconst SEVERITY_ORDER: JoopTamperSeverity[] = ['low', 'medium', 'high', 'critical'];\n\nexport class JoopAntiTamperService {\n private _monitor: ReturnType<typeof setInterval> | null = null;\n private _tamper$ = new JoopSubject<JoopTamperReport>();\n private _alertHandlers: Array<(report: JoopTamperReport) => void> = [];\n private _lastReport: JoopTamperReport | null = null;\n private _nativeFetch = typeof fetch !== 'undefined' ? fetch : null;\n private _nativeConsoleLog = typeof console !== 'undefined' ? console.log : null;\n\n // ── Checks ────────────────────────────────────────────────────────────────\n\n checkDevTools(): JoopTamperCheck {\n let detected = false;\n let detail: string | undefined;\n\n // Size heuristic (works in Chromium)\n if (typeof window !== 'undefined') {\n const threshold = 160;\n if (window.outerWidth - window.innerWidth > threshold || window.outerHeight - window.innerHeight > threshold) {\n detected = true; detail = 'Window size delta suggests DevTools panel is open';\n }\n }\n\n return { type: 'devtools', detected, severity: SEVERITY['devtools'], detail };\n }\n\n checkDomInjection(): JoopTamperCheck {\n let detected = false;\n let detail: string | undefined;\n\n if (typeof document !== 'undefined') {\n const scripts = document.querySelectorAll('script[src]');\n const suspicious = Array.from(scripts).filter(s => {\n const src = (s as HTMLScriptElement).src;\n return src && !src.startsWith(location.origin) && !src.startsWith('chrome-extension://');\n });\n if (suspicious.length > 0) {\n detected = true;\n detail = `${suspicious.length} external script(s) found: ${suspicious.map(s => (s as HTMLScriptElement).src.split('/')[2]).join(', ')}`;\n }\n }\n\n return { type: 'dom-injection', detected, severity: SEVERITY['dom-injection'], detail };\n }\n\n checkPrototypePollution(): JoopTamperCheck {\n const probes = ['__proto__', 'constructor', 'toString', 'valueOf', 'hasOwnProperty'];\n const polluted: string[] = [];\n\n for (const key of probes) {\n const obj = {} as any;\n if (typeof obj[key] !== (key === '__proto__' ? 'object' : 'function')) {\n polluted.push(key);\n }\n }\n\n // Check for extra enumerable properties on Object.prototype\n for (const key in {}) {\n polluted.push(key);\n break;\n }\n\n const detected = polluted.length > 0;\n return { type: 'prototype-pollution', detected, severity: SEVERITY['prototype-pollution'], detail: detected ? `Polluted keys: ${polluted.join(', ')}` : undefined };\n }\n\n checkConsoleOverride(): JoopTamperCheck {\n let detected = false;\n let detail: string | undefined;\n\n if (typeof console !== 'undefined' && this._nativeConsoleLog) {\n const isNative = Function.prototype.toString.call(console.log).includes('[native code]');\n // Also detect if console.log is a custom wrapper\n if (!isNative && console.log !== this._nativeConsoleLog) {\n detected = true;\n detail = 'console.log has been overridden';\n }\n }\n\n return { type: 'console-override', detected, severity: SEVERITY['console-override'], detail };\n }\n\n checkFunctionOverride(): JoopTamperCheck {\n let detected = false;\n let detail: string | undefined;\n const overridden: string[] = [];\n\n if (typeof fetch !== 'undefined' && this._nativeFetch && fetch !== this._nativeFetch) {\n overridden.push('fetch');\n }\n if (typeof XMLHttpRequest !== 'undefined') {\n const isNative = Function.prototype.toString.call(XMLHttpRequest.prototype.open).includes('[native code]');\n if (!isNative) overridden.push('XMLHttpRequest.open');\n }\n\n if (overridden.length > 0) {\n detected = true;\n detail = `Overridden: ${overridden.join(', ')}`;\n }\n\n return { type: 'function-override', detected, severity: SEVERITY['function-override'], detail };\n }\n\n // ── Integrity scan ────────────────────────────────────────────────────────\n\n checkIntegrity(): JoopTamperReport {\n const checks: JoopTamperCheck[] = [\n this.checkDevTools(),\n this.checkDomInjection(),\n this.checkPrototypePollution(),\n this.checkConsoleOverride(),\n this.checkFunctionOverride(),\n ];\n\n const threats = checks.filter(c => c.detected);\n const severities = threats.map(c => SEVERITY_ORDER.indexOf(c.severity));\n const highestIdx = severities.length > 0 ? Math.max(...severities) : -1;\n\n const report: JoopTamperReport = {\n timestamp: Date.now(),\n checks,\n threatCount: threats.length,\n highestSeverity: highestIdx >= 0 ? SEVERITY_ORDER[highestIdx] : null,\n };\n\n this._lastReport = report;\n\n if (report.threatCount > 0) {\n this._alertHandlers.forEach(h => h(report));\n this._tamper$.next(report);\n }\n\n return report;\n }\n\n isTampered(): boolean {\n return (this._lastReport?.threatCount ?? 0) > 0;\n }\n\n getLastReport(): JoopTamperReport | null { return this._lastReport; }\n\n // ── Monitoring ────────────────────────────────────────────────────────────\n\n startMonitoring(intervalMs = 10_000): void {\n if (this._monitor !== null) return;\n this.checkIntegrity();\n this._monitor = setInterval(() => this.checkIntegrity(), intervalMs);\n }\n\n stopMonitoring(): void {\n if (this._monitor !== null) { clearInterval(this._monitor); this._monitor = null; }\n }\n\n isMonitoring(): boolean { return this._monitor !== null; }\n\n // ── Events ────────────────────────────────────────────────────────────────\n\n onTamperDetected(handler: (report: JoopTamperReport) => void): () => void {\n this._alertHandlers.push(handler);\n return () => { this._alertHandlers = this._alertHandlers.filter(h => h !== handler); };\n }\n\n tamper$() { return this._tamper$.asObservable(); }\n\n destroy(): void { this.stopMonitoring(); }\n}\n","import { JoopSubject } from '../events';\n\nexport interface JoopCertPin {\n hostname: string;\n fingerprints: string[]; // SHA-256 hex fingerprints (lowercase, no colons)\n algorithm: 'sha256' | 'sha1';\n addedAt: number;\n expiresAt?: number;\n notes?: string;\n}\n\nexport interface JoopPinViolation {\n hostname: string;\n receivedFingerprint: string;\n expectedFingerprints: string[];\n timestamp: number;\n url: string;\n}\n\nexport interface JoopPinValidationResult {\n valid: boolean;\n pinned: boolean;\n violation?: JoopPinViolation;\n pin?: JoopCertPin;\n}\n\nexport class JoopCertPinningService {\n private _pins = new Map<string, JoopCertPin>();\n private _violations: JoopPinViolation[] = [];\n private _violation$ = new JoopSubject<JoopPinViolation>();\n private _violationHandlers: Array<(v: JoopPinViolation) => void> = [];\n\n // ── Pin management ────────────────────────────────────────────────────────\n\n addPin(pin: Omit<JoopCertPin, 'addedAt'>): void {\n const hostname = this._normalizeHostname(pin.hostname);\n this._pins.set(hostname, { ...pin, hostname, addedAt: Date.now(), fingerprints: pin.fingerprints.map(f => f.toLowerCase().replace(/:/g, '')) });\n }\n\n removePin(hostname: string): void {\n this._pins.delete(this._normalizeHostname(hostname));\n }\n\n getPin(hostname: string): JoopCertPin | undefined {\n return this._pins.get(this._normalizeHostname(hostname));\n }\n\n getAllPins(): JoopCertPin[] { return Array.from(this._pins.values()); }\n\n // ── Validation ────────────────────────────────────────────────────────────\n\n validate(url: string, fingerprint: string): JoopPinValidationResult {\n const hostname = this._hostnameFromUrl(url);\n const pin = this._findPin(hostname);\n\n if (!pin) return { valid: true, pinned: false };\n\n // Check expiry\n if (pin.expiresAt && Date.now() > pin.expiresAt) {\n return { valid: true, pinned: false }; // expired pins don't block, but warn\n }\n\n const normalized = fingerprint.toLowerCase().replace(/:/g, '');\n const matched = pin.fingerprints.includes(normalized);\n\n if (!matched) {\n const violation: JoopPinViolation = {\n hostname, receivedFingerprint: normalized,\n expectedFingerprints: pin.fingerprints,\n timestamp: Date.now(), url,\n };\n this._violations.push(violation);\n this._violationHandlers.forEach(h => h(violation));\n this._violation$.next(violation);\n return { valid: false, pinned: true, violation, pin };\n }\n\n return { valid: true, pinned: true, pin };\n }\n\n validateResponse(url: string, response: Response): JoopPinValidationResult {\n // In a browser, we can't directly access cert fingerprints from fetch Response.\n // This method is designed for environments where fingerprint is injected via headers\n // or a custom fetch wrapper that extracts TLS info (e.g. Node.js, React Native).\n const fingerprint = response.headers.get('x-cert-fingerprint') ?? '';\n if (!fingerprint) return { valid: true, pinned: false }; // no fingerprint provided\n return this.validate(url, fingerprint);\n }\n\n // ── Expiry ────────────────────────────────────────────────────────────────\n\n getExpiring(withinMs = 7 * 24 * 3_600_000): JoopCertPin[] {\n const now = Date.now();\n return this.getAllPins().filter(p => p.expiresAt && p.expiresAt - now <= withinMs && p.expiresAt > now);\n }\n\n isExpired(hostname: string): boolean {\n const pin = this.getPin(hostname);\n return !!(pin?.expiresAt && Date.now() > pin.expiresAt);\n }\n\n // ── Violations ────────────────────────────────────────────────────────────\n\n getViolations(): JoopPinViolation[] { return [...this._violations]; }\n\n clearViolations(): void { this._violations = []; }\n\n onViolation(handler: (v: JoopPinViolation) => void): () => void {\n this._violationHandlers.push(handler);\n return () => { this._violationHandlers = this._violationHandlers.filter(h => h !== handler); };\n }\n\n violations$() { return this._violation$.asObservable(); }\n\n // ── Internals ─────────────────────────────────────────────────────────────\n\n private _normalizeHostname(hostname: string): string {\n return hostname.toLowerCase().replace(/^https?:\\/\\//, '').split('/')[0].split('?')[0];\n }\n\n private _hostnameFromUrl(url: string): string {\n try { return new URL(url).hostname.toLowerCase(); }\n catch { return this._normalizeHostname(url); }\n }\n\n private _findPin(hostname: string): JoopCertPin | undefined {\n // exact match first, then wildcard\n return this._pins.get(hostname) ?? this._pins.get(`*.${hostname.split('.').slice(1).join('.')}`);\n }\n}\n"]}
|