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.
- package/.claude/skills/observables.md +28 -0
- package/.claude/skills/setup.md +14 -3
- package/.cursor/rules/joopjs.mdc +4 -5
- package/.github/copilot-instructions.md +3 -1
- package/.windsurf/rules/joopjs.md +4 -0
- package/CHANGELOG.md +31 -2
- package/README.md +19 -7
- package/ai-rules/AGENTS.md +21 -0
- package/ai-rules/GEMINI.md +17 -3
- package/dist/ai/index.js +15 -3
- package/dist/ai/index.js.map +1 -1
- package/dist/ai/index.mjs +15 -3
- package/dist/ai/index.mjs.map +1 -1
- package/dist/analytics/index.js +10 -2
- package/dist/analytics/index.js.map +1 -1
- package/dist/analytics/index.mjs +10 -2
- package/dist/analytics/index.mjs.map +1 -1
- package/dist/angular/index.d.mts +98 -27
- package/dist/angular/index.d.ts +98 -27
- package/dist/angular/index.js +44 -0
- package/dist/angular/index.js.map +1 -1
- package/dist/angular/index.mjs +39 -1
- package/dist/angular/index.mjs.map +1 -1
- package/dist/api/index.js +15 -3
- package/dist/api/index.js.map +1 -1
- package/dist/api/index.mjs +15 -3
- package/dist/api/index.mjs.map +1 -1
- package/dist/auth/index.js +15 -3
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/index.mjs +15 -3
- package/dist/auth/index.mjs.map +1 -1
- package/dist/banking/index.js +15 -3
- package/dist/banking/index.js.map +1 -1
- package/dist/banking/index.mjs +15 -3
- package/dist/banking/index.mjs.map +1 -1
- package/dist/cache/index.js +15 -3
- package/dist/cache/index.js.map +1 -1
- package/dist/cache/index.mjs +15 -3
- package/dist/cache/index.mjs.map +1 -1
- package/dist/{index-DFqEoX_l.d.ts → consent.service-CIHNtx9h.d.ts} +1 -2
- package/dist/{index-B_ksKpS1.d.mts → consent.service-DQ-JAEJx.d.mts} +1 -2
- package/dist/core/index.d.mts +34 -1
- package/dist/core/index.d.ts +34 -1
- package/dist/core/index.js +56 -5
- package/dist/core/index.js.map +1 -1
- package/dist/core/index.mjs +54 -6
- package/dist/core/index.mjs.map +1 -1
- package/dist/deeplink/index.js +15 -3
- package/dist/deeplink/index.js.map +1 -1
- package/dist/deeplink/index.mjs +15 -3
- package/dist/deeplink/index.mjs.map +1 -1
- package/dist/device/index.js +15 -3
- package/dist/device/index.js.map +1 -1
- package/dist/device/index.mjs +15 -3
- package/dist/device/index.mjs.map +1 -1
- package/dist/forms/index.js +15 -3
- package/dist/forms/index.js.map +1 -1
- package/dist/forms/index.mjs +15 -3
- package/dist/forms/index.mjs.map +1 -1
- package/dist/i18n/index.js +15 -3
- package/dist/i18n/index.js.map +1 -1
- package/dist/i18n/index.mjs +15 -3
- package/dist/i18n/index.mjs.map +1 -1
- package/dist/index.d.mts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +50 -8
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +50 -8
- package/dist/index.mjs.map +1 -1
- package/dist/{joop-CA3DMeOO.d.ts → joop-Dim2yEKG.d.ts} +1 -1
- package/dist/{joop-Bx7Iwj5p.d.mts → joop-GkQw13f9.d.mts} +1 -1
- package/dist/native-bridge/index.js +10 -2
- package/dist/native-bridge/index.js.map +1 -1
- package/dist/native-bridge/index.mjs +10 -2
- package/dist/native-bridge/index.mjs.map +1 -1
- package/dist/network/index.js +15 -3
- package/dist/network/index.js.map +1 -1
- package/dist/network/index.mjs +15 -3
- package/dist/network/index.mjs.map +1 -1
- package/dist/observability/index.js +15 -3
- package/dist/observability/index.js.map +1 -1
- package/dist/observability/index.mjs +15 -3
- package/dist/observability/index.mjs.map +1 -1
- package/dist/pwa/index.js +15 -3
- package/dist/pwa/index.js.map +1 -1
- package/dist/pwa/index.mjs +15 -3
- package/dist/pwa/index.mjs.map +1 -1
- package/dist/react/index.d.mts +2 -2
- package/dist/react/index.d.ts +2 -2
- package/dist/react/index.js +15 -3
- package/dist/react/index.js.map +1 -1
- package/dist/react/index.mjs +15 -3
- package/dist/react/index.mjs.map +1 -1
- package/dist/router/index.js +15 -3
- package/dist/router/index.js.map +1 -1
- package/dist/router/index.mjs +15 -3
- package/dist/router/index.mjs.map +1 -1
- package/dist/security/index.js +15 -3
- package/dist/security/index.js.map +1 -1
- package/dist/security/index.mjs +15 -3
- package/dist/security/index.mjs.map +1 -1
- package/dist/session/index.js +15 -3
- package/dist/session/index.js.map +1 -1
- package/dist/session/index.mjs +15 -3
- package/dist/session/index.mjs.map +1 -1
- package/dist/state/index.js +15 -3
- package/dist/state/index.js.map +1 -1
- package/dist/state/index.mjs +15 -3
- package/dist/state/index.mjs.map +1 -1
- package/dist/storage/index.js +15 -3
- package/dist/storage/index.js.map +1 -1
- package/dist/storage/index.mjs +15 -3
- package/dist/storage/index.mjs.map +1 -1
- package/dist/sync/index.js +15 -3
- package/dist/sync/index.js.map +1 -1
- package/dist/sync/index.mjs +15 -3
- package/dist/sync/index.mjs.map +1 -1
- package/dist/theme/index.js +15 -3
- package/dist/theme/index.js.map +1 -1
- package/dist/theme/index.mjs +15 -3
- package/dist/theme/index.mjs.map +1 -1
- package/dist/ui/index.js +15 -3
- package/dist/ui/index.js.map +1 -1
- package/dist/ui/index.mjs +15 -3
- package/dist/ui/index.mjs.map +1 -1
- package/dist/utilities/index.js +46 -4
- package/dist/utilities/index.js.map +1 -1
- package/dist/utilities/index.mjs +46 -4
- package/dist/utilities/index.mjs.map +1 -1
- package/dist/vue/index.d.mts +2 -2
- package/dist/vue/index.d.ts +2 -2
- package/dist/vue/index.js +15 -3
- package/dist/vue/index.js.map +1 -1
- package/dist/vue/index.mjs +15 -3
- package/dist/vue/index.mjs.map +1 -1
- package/dist/workflow/index.js +15 -3
- package/dist/workflow/index.js.map +1 -1
- package/dist/workflow/index.mjs +15 -3
- package/dist/workflow/index.mjs.map +1 -1
- package/package.json +16 -2
package/dist/device/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/device/device-fingerprint.service.ts","../../src/platform/platform.ts","../../src/device/key-vault.ts","../../src/device/biometric-auth.ts","../../src/device/push-service.ts","../../src/events/index.ts","../../src/device/app-lifecycle.ts","../../src/device/network-monitor.ts","../../src/device/card-scanner.ts","../../src/device/client-info.service.ts"],"names":["location"],"mappings":"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","file":"index.js","sourcesContent":["export interface JoopDeviceInfo {\n fingerprint: string;\n userAgent: string;\n language: string;\n timezone: string;\n screenResolution: string;\n colorDepth: number;\n platform: string;\n hardwareConcurrency: number;\n maxTouchPoints: number;\n}\n\nexport class JoopDeviceFingerprintService {\n collect(): Omit<JoopDeviceInfo, 'fingerprint'> {\n const nav = typeof navigator !== 'undefined' ? navigator : null;\n const scr = typeof screen !== 'undefined' ? screen : null;\n return {\n userAgent: nav?.userAgent ?? '',\n language: nav?.language ?? '',\n timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n screenResolution: scr ? `${scr.width}x${scr.height}` : '',\n colorDepth: scr?.colorDepth ?? 0,\n platform: nav?.platform ?? '',\n hardwareConcurrency: nav?.hardwareConcurrency ?? 0,\n maxTouchPoints: nav?.maxTouchPoints ?? 0,\n };\n }\n\n async generate(): Promise<string> {\n const info = this.collect();\n const raw = Object.values(info).join('|');\n const hashBuffer = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(raw));\n return Array.from(new Uint8Array(hashBuffer)).map(b => b.toString(16).padStart(2, '0')).join('');\n }\n\n async getStableId(): Promise<string> {\n const key = '__joop_did';\n const stored = typeof localStorage !== 'undefined' ? localStorage.getItem(key) : null;\n if (stored) return stored;\n const id = await this.generate();\n if (typeof localStorage !== 'undefined') localStorage.setItem(key, id);\n return id;\n }\n}\n","import type { JoopPlatformAdapterConfig, JoopStorageAdapter } from './adapters';\n\nexport type JoopPlatformType = 'web' | 'react-native' | 'node' | 'unknown';\n\nexport interface JoopCapabilities {\n compression: boolean;\n workers: boolean;\n cryptoSubtle: boolean;\n persistentStorage: boolean;\n dom: boolean;\n serviceWorker: boolean;\n}\n\nexport interface JoopPlatformConfig {\n adapter?: JoopPlatformAdapterConfig;\n /** Override auto-detection — useful in tests or SSR */\n platform?: JoopPlatformType;\n}\n\n// ---------------------------------------------------------------------------\n// Built-in storage adapters\n// ---------------------------------------------------------------------------\n\nconst _webStorage = (store: Storage): JoopStorageAdapter => ({\n getItem: (k) => store.getItem(k),\n setItem: (k, v) => store.setItem(k, v),\n removeItem: (k) => store.removeItem(k),\n clear: () => store.clear(),\n});\n\nclass _MemStorageImpl implements JoopStorageAdapter {\n private _m = new Map<string, string>();\n getItem(k: string) { return this._m.get(k) ?? null; }\n setItem(k: string, v: string) { this._m.set(k, v); }\n removeItem(k: string) { this._m.delete(k); }\n clear() { this._m.clear(); }\n}\n\n// ---------------------------------------------------------------------------\n// Platform detection\n// ---------------------------------------------------------------------------\n\nfunction _detect(): JoopPlatformType {\n // React Native sets navigator.product = 'ReactNative'\n if (typeof navigator !== 'undefined' && navigator.product === 'ReactNative') return 'react-native';\n // Node.js: no window, has globalThis.process.versions.node\n const _proc = (globalThis as Record<string, unknown>)['process'] as { versions?: { node?: string } } | undefined;\n if (typeof window === 'undefined' && _proc?.versions?.node) return 'node';\n // Browser\n if (typeof window !== 'undefined') return 'web';\n return 'unknown';\n}\n\n// ---------------------------------------------------------------------------\n// JoopPlatform\n// ---------------------------------------------------------------------------\n\nexport class JoopPlatform {\n private static _type: JoopPlatformType = _detect();\n private static _adapter: JoopPlatformAdapterConfig = {};\n private static _memStorage: JoopStorageAdapter | null = null;\n\n /**\n * Call once at app startup to configure adapters for your platform.\n *\n * Web (default — no call needed):\n * JoopPlatform.init();\n *\n * React Native with react-native-mmkv:\n * import { MMKV } from 'react-native-mmkv';\n * const mmkv = new MMKV();\n * JoopPlatform.init({ adapter: { storage: mmkv } });\n *\n * React Native with custom compression (fflate):\n * import { gzip, ungzip } from 'fflate';\n * JoopPlatform.init({\n * adapter: {\n * compression: {\n * compress: (d, fmt) => new Promise((res, rej) => gzip(d, (e, r) => e ? rej(e) : res(r))),\n * decompress: (d, fmt) => new Promise((res, rej) => ungzip(d, (e, r) => e ? rej(e) : res(r))),\n * },\n * },\n * });\n */\n static init(config: JoopPlatformConfig = {}): void {\n if (config.platform) this._type = config.platform;\n this._adapter = { ...this._adapter, ...(config.adapter ?? {}) };\n }\n\n /** Current detected or overridden platform type */\n static get type(): JoopPlatformType { return this._type; }\n\n static is(type: JoopPlatformType): boolean { return this._type === type; }\n static isMobile(): boolean { return this._type === 'react-native'; }\n static isWeb(): boolean { return this._type === 'web'; }\n static isNode(): boolean { return this._type === 'node'; }\n\n /** Raw adapter config registered via init() */\n static getAdapter(): JoopPlatformAdapterConfig { return this._adapter; }\n\n /**\n * Returns the best available storage adapter:\n * 1. Custom adapter registered via init()\n * 2. localStorage (web)\n * 3. In-memory fallback (Node / RN without adapter)\n */\n static getStorage(): JoopStorageAdapter {\n if (this._adapter.storage) return this._adapter.storage;\n if (typeof localStorage !== 'undefined') return _webStorage(localStorage);\n if (!this._memStorage) this._memStorage = new _MemStorageImpl();\n return this._memStorage;\n }\n\n /**\n * Returns the best available session-scoped storage:\n * 1. Custom adapter registered via init()\n * 2. sessionStorage (web)\n * 3. Shared in-memory fallback\n */\n static getSessionStorage(): JoopStorageAdapter {\n if (this._adapter.storage) return this._adapter.storage;\n if (typeof sessionStorage !== 'undefined') return _webStorage(sessionStorage);\n if (!this._memStorage) this._memStorage = new _MemStorageImpl();\n return this._memStorage;\n }\n\n /** What APIs are available in the current environment */\n static capabilities(): JoopCapabilities {\n return {\n compression: typeof CompressionStream !== 'undefined' || !!this._adapter.compression,\n workers: typeof Worker !== 'undefined' || !!this._adapter.worker,\n cryptoSubtle: !!(typeof globalThis !== 'undefined' && (globalThis as typeof globalThis & { crypto?: Crypto }).crypto?.subtle),\n persistentStorage: typeof localStorage !== 'undefined' || !!this._adapter.storage,\n dom: typeof document !== 'undefined',\n serviceWorker: typeof navigator !== 'undefined' && 'serviceWorker' in navigator,\n };\n }\n\n /** Reset to auto-detected defaults — useful between tests */\n static _reset(): void {\n this._type = _detect();\n this._adapter = {};\n this._memStorage = null;\n }\n}\n","import { JoopPlatform } from '../platform/platform';\nimport type { JoopKeyVaultAdapter } from '../platform/adapters';\n\nexport interface JoopKeyVaultConfig {\n /** AES-GCM encryption password. If omitted, values are base64-encoded only (no encryption). */\n encryptionKey?: string;\n /** localStorage key prefix. Default: 'joop_vault_' */\n prefix?: string;\n /** Override platform adapter (e.g. react-native-keychain wrapper) */\n adapter?: JoopKeyVaultAdapter;\n}\n\nexport class JoopKeyVault {\n private _prefix: string;\n private _encKey: string | undefined;\n private _adapter: JoopKeyVaultAdapter | null;\n private _cryptoKey: CryptoKey | null = null;\n\n constructor(config: JoopKeyVaultConfig = {}) {\n this._prefix = config.prefix ?? 'joop_vault_';\n this._encKey = config.encryptionKey;\n this._adapter = config.adapter ?? JoopPlatform.getAdapter().keyVault ?? null;\n }\n\n /** Store a secret. On web: AES-GCM encrypted if `encryptionKey` was provided. */\n async set(key: string, value: string): Promise<void> {\n if (this._adapter) return this._adapter.set(key, value);\n const stored = this._encKey\n ? await _encrypt(value, await this._key())\n : btoa(unescape(encodeURIComponent(value)));\n JoopPlatform.getStorage().setItem(this._prefix + key, stored);\n }\n\n /** Retrieve a secret, or null if not found. */\n async get(key: string): Promise<string | null> {\n if (this._adapter) return this._adapter.get(key);\n const raw = JoopPlatform.getStorage().getItem(this._prefix + key);\n if (!raw) return null;\n try {\n return this._encKey\n ? await _decrypt(raw, await this._key())\n : decodeURIComponent(escape(atob(raw)));\n } catch {\n return null;\n }\n }\n\n async remove(key: string): Promise<void> {\n if (this._adapter) return this._adapter.remove(key);\n JoopPlatform.getStorage().removeItem(this._prefix + key);\n }\n\n async clear(): Promise<void> {\n if (this._adapter) return this._adapter.clear();\n JoopPlatform.getStorage().clear?.();\n }\n\n async has(key: string): Promise<boolean> {\n return (await this.get(key)) !== null;\n }\n\n /** Rotate the encryption key: re-encrypts all known entries with a new key. */\n async rotateKey(newEncryptionKey: string, keys: string[]): Promise<void> {\n if (this._adapter) throw new Error('rotateKey not supported with native adapter');\n const values = await Promise.all(keys.map(k => this.get(k)));\n this._encKey = newEncryptionKey;\n this._cryptoKey = null;\n for (let i = 0; i < keys.length; i++) {\n if (values[i] !== null) await this.set(keys[i], values[i]!);\n }\n }\n\n private async _key(): Promise<CryptoKey> {\n if (!this._cryptoKey) this._cryptoKey = await _deriveKey(this._encKey!);\n return this._cryptoKey;\n }\n}\n\n// ── WebCrypto helpers ────────────────────────────────────────────────────────\n\nconst _SALT = new Uint8Array([\n 0x6a, 0x6f, 0x6f, 0x70, 0x2d, 0x76, 0x61, 0x75,\n 0x6c, 0x74, 0x2d, 0x76, 0x31, 0x00, 0x00, 0x00,\n]);\n\nasync function _deriveKey(password: string): Promise<CryptoKey> {\n const km = await crypto.subtle.importKey(\n 'raw', new TextEncoder().encode(password),\n { name: 'PBKDF2' }, false, ['deriveKey'],\n );\n return crypto.subtle.deriveKey(\n { name: 'PBKDF2', salt: _SALT, iterations: 100000, hash: 'SHA-256' },\n km,\n { name: 'AES-GCM', length: 256 },\n false,\n ['encrypt', 'decrypt'],\n );\n}\n\nasync function _encrypt(value: string, key: CryptoKey): Promise<string> {\n const iv = crypto.getRandomValues(new Uint8Array(12));\n const encrypted = await crypto.subtle.encrypt(\n { name: 'AES-GCM', iv },\n key,\n new TextEncoder().encode(value),\n );\n const combined = new Uint8Array(12 + encrypted.byteLength);\n combined.set(iv);\n combined.set(new Uint8Array(encrypted), 12);\n return btoa(String.fromCharCode(...combined));\n}\n\nasync function _decrypt(encoded: string, key: CryptoKey): Promise<string> {\n const combined = Uint8Array.from(atob(encoded), c => c.charCodeAt(0));\n const iv = combined.slice(0, 12);\n const data = combined.slice(12);\n const decrypted = await crypto.subtle.decrypt({ name: 'AES-GCM', iv }, key, data);\n return new TextDecoder().decode(decrypted);\n}\n","import { JoopPlatform } from '../platform/platform';\nimport type { JoopBiometricAdapter } from '../platform/adapters';\n\nexport interface JoopBiometricConfig {\n /** WebAuthn relying-party ID (default: current hostname) */\n rpId?: string;\n /** WebAuthn relying-party name */\n rpName?: string;\n /** Override platform adapter (e.g. react-native-biometrics wrapper) */\n adapter?: JoopBiometricAdapter;\n}\n\nexport interface JoopEnrollResult {\n credentialId: string; // base64url\n publicKey?: string; // base64url DER-encoded public key (web only)\n}\n\nexport interface JoopAuthenticateOptions {\n credentialId?: string; // restrict to this credential\n reason?: string; // shown to the user (RN / macOS)\n timeout?: number; // ms, default 60000\n}\n\nexport class JoopBiometricAuth {\n private _rpId: string;\n private _rpName: string;\n private _adapter: JoopBiometricAdapter | null;\n\n constructor(config: JoopBiometricConfig = {}) {\n this._rpId = config.rpId ?? (typeof location !== 'undefined' ? location.hostname : 'localhost');\n this._rpName = config.rpName ?? this._rpId;\n this._adapter = config.adapter ?? JoopPlatform.getAdapter().biometric ?? null;\n }\n\n /** True when a platform authenticator is available. */\n async isAvailable(): Promise<boolean> {\n if (this._adapter) return this._adapter.isAvailable();\n if (typeof window === 'undefined' || !window.PublicKeyCredential) return false;\n if (typeof PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable !== 'function') return false;\n return PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable();\n }\n\n /**\n * Enroll a new credential for the given user.\n * Web: creates a WebAuthn passkey via navigator.credentials.create().\n * React Native: delegates to the injected adapter.\n */\n async enroll(userId: string, displayName: string): Promise<JoopEnrollResult> {\n if (this._adapter) throw new Error('Enrollment must be handled by the native adapter');\n\n if (typeof navigator?.credentials?.create !== 'function') {\n throw new Error('WebAuthn not available in this environment');\n }\n\n const challenge = crypto.getRandomValues(new Uint8Array(32));\n const cred = (await navigator.credentials.create({\n publicKey: {\n challenge,\n rp: { id: this._rpId, name: this._rpName },\n user: { id: new TextEncoder().encode(userId), name: userId, displayName },\n pubKeyCredParams: [\n { type: 'public-key', alg: -7 }, // ES256\n { type: 'public-key', alg: -257 }, // RS256\n ],\n authenticatorSelection: {\n authenticatorAttachment: 'platform',\n userVerification: 'required',\n residentKey: 'preferred',\n },\n timeout: 60000,\n attestation: 'none',\n },\n })) as PublicKeyCredential;\n\n const response = cred.response as AuthenticatorAttestationResponse;\n const pubKey = response.getPublicKey?.();\n return {\n credentialId: _b64url(cred.rawId),\n publicKey: pubKey ? _b64url(pubKey) : undefined,\n };\n }\n\n /**\n * Verify identity against an existing credential.\n * Web: navigator.credentials.get() with WebAuthn assertion.\n * React Native: delegates to the injected adapter.\n */\n async authenticate(options: JoopAuthenticateOptions = {}): Promise<boolean> {\n if (this._adapter) return this._adapter.authenticate(options.reason);\n\n if (typeof navigator?.credentials?.get !== 'function') return false;\n\n const challenge = crypto.getRandomValues(new Uint8Array(32));\n const allowCredentials: PublicKeyCredentialDescriptor[] = options.credentialId\n ? [{ type: 'public-key', id: _b64urlToBytes(options.credentialId) as Uint8Array<ArrayBuffer> }]\n : [];\n\n try {\n const cred = await navigator.credentials.get({\n publicKey: {\n challenge,\n allowCredentials,\n userVerification: 'required',\n timeout: options.timeout ?? 60000,\n },\n });\n return !!cred;\n } catch {\n return false;\n }\n }\n\n /**\n * Quick check — asks the platform if biometrics can be used right now.\n * Does not prompt the user.\n */\n async canAuthenticate(): Promise<boolean> {\n if (this._adapter) return this._adapter.isAvailable();\n return this.isAvailable();\n }\n}\n\n// ── helpers ──────────────────────────────────────────────────────────────────\n\nfunction _b64url(buf: ArrayBuffer): string {\n return btoa(String.fromCharCode(...new Uint8Array(buf)))\n .replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=/g, '');\n}\n\nfunction _b64urlToBytes(s: string): Uint8Array {\n const padded = s.replace(/-/g, '+').replace(/_/g, '/').padEnd(\n s.length + ((4 - (s.length % 4)) % 4), '=',\n );\n return Uint8Array.from(atob(padded), c => c.charCodeAt(0));\n}\n","import { JoopPlatform } from '../platform/platform';\nimport type { JoopPushAdapter, JoopPushPayload } from '../platform/adapters';\n\nexport type { JoopPushPayload };\nexport type JoopPushPermission = 'granted' | 'denied' | 'default' | 'unsupported';\n\nexport interface JoopPushConfig {\n /** VAPID public key (base64url) for web push subscription */\n vapidPublicKey?: string;\n /** Path to the service worker file (default: '/sw.js') */\n serviceWorkerPath?: string;\n /** Override platform adapter (e.g. FCM / APNs wrapper) */\n adapter?: JoopPushAdapter;\n}\n\nexport interface JoopPushSubscriptionInfo {\n endpoint: string;\n p256dh: string; // base64url-encoded\n auth: string; // base64url-encoded\n}\n\nexport class JoopPushService {\n private _cfg: JoopPushConfig;\n private _adapter: JoopPushAdapter | null;\n private _messageHandlers: Array<(payload: JoopPushPayload) => void> = [];\n private _adapterUnsub: (() => void) | null = null;\n\n constructor(config: JoopPushConfig = {}) {\n this._cfg = config;\n this._adapter = config.adapter ?? JoopPlatform.getAdapter().push ?? null;\n if (this._adapter) {\n this._adapterUnsub = this._adapter.onMessage(p => this._emit(p));\n }\n }\n\n /** Request push notification permission from the user. */\n async requestPermission(): Promise<JoopPushPermission> {\n if (this._adapter) {\n const result = await this._adapter.requestPermission();\n return result;\n }\n if (typeof Notification === 'undefined') return 'unsupported';\n if (Notification.permission === 'granted') return 'granted';\n const perm = await Notification.requestPermission();\n return perm as JoopPushPermission;\n }\n\n /** Get the current permission status without prompting. */\n getPermission(): JoopPushPermission {\n if (this._adapter) return 'default'; // adapter manages its own state\n if (typeof Notification === 'undefined') return 'unsupported';\n return Notification.permission as JoopPushPermission;\n }\n\n /**\n * Subscribe to web push and return subscription info to send to your server.\n * Requires a service worker and a VAPID key.\n */\n async subscribe(options?: { vapidPublicKey?: string }): Promise<JoopPushSubscriptionInfo | null> {\n if (this._adapter) {\n const token = await this._adapter.getToken(options?.vapidPublicKey ?? this._cfg.vapidPublicKey);\n return token ? { endpoint: token, p256dh: '', auth: '' } : null;\n }\n\n if (typeof navigator?.serviceWorker === 'undefined') return null;\n if (Notification.permission !== 'granted') return null;\n\n const vapidKey = options?.vapidPublicKey ?? this._cfg.vapidPublicKey;\n if (!vapidKey) return null;\n\n const reg = await navigator.serviceWorker.register(this._cfg.serviceWorkerPath ?? '/sw.js');\n const sub = await reg.pushManager.subscribe({\n userVisibleOnly: true,\n applicationServerKey: _urlBase64ToUint8(vapidKey) as Uint8Array<ArrayBuffer>,\n });\n\n const keys = sub.getKey ? {\n p256dh: btoa(String.fromCharCode(...new Uint8Array(sub.getKey('p256dh')!))),\n auth: btoa(String.fromCharCode(...new Uint8Array(sub.getKey('auth')!))),\n } : { p256dh: '', auth: '' };\n\n return { endpoint: sub.endpoint, ...keys };\n }\n\n /** Unsubscribe from web push. */\n async unsubscribe(): Promise<boolean> {\n if (this._adapter) return false;\n if (typeof navigator?.serviceWorker === 'undefined') return false;\n try {\n const reg = await navigator.serviceWorker.ready;\n const sub = await reg.pushManager.getSubscription();\n return sub ? sub.unsubscribe() : false;\n } catch {\n return false;\n }\n }\n\n /** Display an immediate local notification (no server push required). */\n async show(payload: JoopPushPayload): Promise<void> {\n if (this._adapter) {\n this._emit(payload);\n return;\n }\n if (typeof Notification === 'undefined') return;\n if (Notification.permission !== 'granted') return;\n new Notification(payload.title ?? '', {\n body: payload.body,\n icon: payload.icon,\n badge: payload.icon,\n tag: payload.tag,\n data: payload.data,\n });\n }\n\n /** Set the app badge count (mobile only via adapter). */\n async setBadgeCount(count: number): Promise<void> {\n if (this._adapter?.setBadgeCount) await this._adapter.setBadgeCount(count);\n else if (typeof navigator?.setAppBadge === 'function') {\n await (navigator as Navigator & { setAppBadge(n: number): Promise<void> }).setAppBadge(count);\n }\n }\n\n /** Clear the app badge. */\n async clearBadge(): Promise<void> {\n if (typeof navigator?.clearAppBadge === 'function') {\n await (navigator as Navigator & { clearAppBadge(): Promise<void> }).clearAppBadge();\n }\n }\n\n /** Register a handler for incoming push payloads (foreground messages). */\n onMessage(handler: (payload: JoopPushPayload) => void): () => void {\n this._messageHandlers.push(handler);\n return () => { this._messageHandlers = this._messageHandlers.filter(h => h !== handler); };\n }\n\n destroy(): void {\n this._adapterUnsub?.();\n this._adapterUnsub = null;\n this._messageHandlers = [];\n }\n\n private _emit(payload: JoopPushPayload): void {\n for (const h of this._messageHandlers) h(payload);\n }\n}\n\n// ── helpers ──────────────────────────────────────────────────────────────────\n\nfunction _urlBase64ToUint8(base64String: string): Uint8Array {\n const padding = '='.repeat((4 - (base64String.length % 4)) % 4);\n const base64 = (base64String + padding).replace(/-/g, '+').replace(/_/g, '/');\n const raw = atob(base64);\n const out = new Uint8Array(raw.length);\n for (let i = 0; i < raw.length; i++) out[i] = raw.charCodeAt(i);\n return out;\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 } from '../events';\nimport { JoopPlatform } from '../platform/platform';\nimport type { JoopLifecycleAdapter, JoopAppState } from '../platform/adapters';\n\nexport type { JoopAppState };\n\nexport interface JoopLifecycleConfig {\n /** Override platform adapter (e.g. RN AppState wrapper) */\n adapter?: JoopLifecycleAdapter;\n}\n\nexport class JoopAppLifecycle {\n private _state$ = new JoopBehaviorSubject<JoopAppState>('unknown');\n private _cleanup: Array<() => void> = [];\n private _adapter: JoopLifecycleAdapter | null;\n\n constructor(config: JoopLifecycleConfig = {}) {\n this._adapter = config.adapter ?? JoopPlatform.getAdapter().lifecycle ?? null;\n this._init();\n }\n\n private _init(): void {\n if (this._adapter) {\n this._state$.next(this._adapter.getState());\n const unsub = this._adapter.onChange(s => this._state$.next(s));\n this._cleanup.push(unsub);\n return;\n }\n\n if (typeof document === 'undefined') { this._state$.next('unknown'); return; }\n\n this._state$.next(document.hidden ? 'background' : 'active');\n\n const onVisibility = () => this._state$.next(document.hidden ? 'background' : 'active');\n const onFocus = () => this._state$.next('active');\n const onBlur = () => this._state$.next('background');\n\n document.addEventListener('visibilitychange', onVisibility);\n window.addEventListener('focus', onFocus);\n window.addEventListener('blur', onBlur);\n\n this._cleanup.push(\n () => document.removeEventListener('visibilitychange', onVisibility),\n () => window.removeEventListener('focus', onFocus),\n () => window.removeEventListener('blur', onBlur),\n );\n }\n\n getState(): JoopAppState { return this._state$.getValue(); }\n state$() { return this._state$.asObservable(); }\n isActive(): boolean { return this.getState() === 'active'; }\n\n /** Call fn each time the app comes to the foreground (background → active). */\n onForeground(fn: () => void): () => void {\n let prev = this.getState();\n return this._state$.subscribe(s => {\n if (s === 'active' && prev !== 'active') fn();\n prev = s;\n });\n }\n\n /** Call fn each time the app goes to the background (active → background). */\n onBackground(fn: () => void): () => void {\n let prev = this.getState();\n return this._state$.subscribe(s => {\n if (s === 'background' && prev !== 'background') fn();\n prev = s;\n });\n }\n\n destroy(): void {\n for (const fn of this._cleanup) fn();\n this._cleanup = [];\n }\n}\n","import { JoopBehaviorSubject } from '../events';\nimport { JoopPlatform } from '../platform/platform';\nimport type { JoopNetworkAdapter, JoopNetworkState, JoopNetworkType, JoopEffectiveType } from '../platform/adapters';\n\nexport type { JoopNetworkState, JoopNetworkType, JoopEffectiveType };\n\nexport interface JoopNetworkMonitorConfig {\n /** Override platform adapter (e.g. RN NetInfo wrapper) */\n adapter?: JoopNetworkAdapter;\n}\n\ntype _NetInfoConnection = {\n type?: string;\n effectiveType?: string;\n downlink?: number;\n rtt?: number;\n saveData?: boolean;\n metered?: boolean;\n addEventListener(event: 'change', handler: () => void): void;\n removeEventListener(event: 'change', handler: () => void): void;\n};\n\nexport class JoopNetworkMonitor {\n private _adapter: JoopNetworkAdapter | null;\n private _state$: JoopBehaviorSubject<JoopNetworkState>;\n private _cleanup: Array<() => void> = [];\n\n constructor(config: JoopNetworkMonitorConfig = {}) {\n this._adapter = config.adapter ?? JoopPlatform.getAdapter().network ?? null;\n this._state$ = new JoopBehaviorSubject<JoopNetworkState>(this._read());\n this._init();\n }\n\n private _init(): void {\n if (this._adapter) {\n this._state$.next(this._adapter.getState());\n const unsub = this._adapter.onChange(s => this._state$.next(s));\n this._cleanup.push(unsub);\n return;\n }\n\n if (typeof window === 'undefined') return;\n\n const refresh = () => this._state$.next(this._read());\n\n window.addEventListener('online', refresh);\n window.addEventListener('offline', refresh);\n\n const conn = (navigator as unknown as { connection?: _NetInfoConnection }).connection;\n if (conn) {\n conn.addEventListener('change', refresh);\n this._cleanup.push(() => conn.removeEventListener('change', refresh));\n }\n\n this._cleanup.push(\n () => window.removeEventListener('online', refresh),\n () => window.removeEventListener('offline', refresh),\n );\n }\n\n private _read(): JoopNetworkState {\n if (this._adapter) return this._adapter.getState();\n if (typeof navigator === 'undefined') return { online: false, type: 'unknown' };\n\n const online = navigator.onLine;\n if (!online) return { online: false, type: 'offline' };\n\n const conn = (navigator as unknown as { connection?: _NetInfoConnection }).connection;\n const type = conn ? _mapType(conn.type) : 'unknown';\n\n return {\n online,\n type,\n effectiveType: conn?.effectiveType as JoopEffectiveType | undefined,\n downlink: conn?.downlink,\n rtt: conn?.rtt,\n saveData: conn?.saveData,\n metered: conn?.metered ?? type === 'cellular',\n };\n }\n\n getState(): JoopNetworkState { return this._state$.getValue(); }\n state$() { return this._state$.asObservable(); }\n isOnline(): boolean { return this.getState().online; }\n isMetered(): boolean { return this.getState().metered ?? this.getState().type === 'cellular'; }\n\n /** Call fn when connectivity is regained. */\n onOnline(fn: () => void): () => void {\n let prev = this.getState().online;\n return this._state$.subscribe(s => {\n if (s.online && !prev) fn();\n prev = s.online;\n });\n }\n\n /** Call fn when connectivity is lost. */\n onOffline(fn: () => void): () => void {\n let prev = this.getState().online;\n return this._state$.subscribe(s => {\n if (!s.online && prev) fn();\n prev = s.online;\n });\n }\n\n /** Call fn when the connection type changes (e.g. wifi → cellular). */\n onTypeChange(fn: (type: JoopNetworkType) => void): () => void {\n let prev = this.getState().type;\n return this._state$.subscribe(s => {\n if (s.type !== prev) { fn(s.type); prev = s.type; }\n });\n }\n\n destroy(): void {\n for (const fn of this._cleanup) fn();\n this._cleanup = [];\n }\n}\n\nfunction _mapType(raw?: string): JoopNetworkType {\n if (!raw) return 'unknown';\n if (raw === 'wifi' || raw === 'wimax') return 'wifi';\n if (raw === 'cellular' || raw === '2g' || raw === '3g' || raw === '4g' || raw === '5g') return 'cellular';\n if (raw === 'ethernet') return 'ethernet';\n if (raw === 'none' || raw === 'offline') return 'offline';\n return 'unknown';\n}\n","export interface JoopCardScanResult {\n number?: string;\n expiry?: string;\n holder?: string;\n cvv?: string;\n network?: string;\n}\n\nexport interface JoopCardScannerConfig {\n frameRate?: number; // default 5\n maxFrames?: number; // default 30\n facingMode?: 'user' | 'environment'; // default 'environment'\n}\n\nexport interface JoopCardForm {\n number?: { value: string } | HTMLInputElement;\n expiry?: { value: string } | HTMLInputElement;\n holder?: { value: string } | HTMLInputElement;\n cvv?: { value: string } | HTMLInputElement;\n}\n\nconst CARD_NUMBER_RE = /\\b(?:\\d[ -]?){13,19}\\b/g;\nconst EXPIRY_RE = /\\b(0[1-9]|1[0-2])\\s*[\\/\\-]\\s*(\\d{2}|\\d{4})\\b/g;\nconst HOLDER_RE = /\\b([A-Z]{2,}\\s+[A-Z]{2,}(?:\\s+[A-Z]{2,})?)\\b/g;\n\nfunction parseCardText(text: string): JoopCardScanResult {\n const result: JoopCardScanResult = {};\n\n const numMatch = text.replace(/\\s/g, '').match(/\\d{13,19}/);\n if (numMatch) result.number = numMatch[0];\n\n const expMatch = EXPIRY_RE.exec(text);\n if (expMatch) result.expiry = expMatch[1] + '/' + expMatch[2].slice(-2);\n\n const holderMatch = HOLDER_RE.exec(text.toUpperCase());\n if (holderMatch) result.holder = holderMatch[0];\n\n if (result.number) {\n const n = result.number[0];\n if (n === '4') result.network = 'Visa';\n else if (n === '5') result.network = 'Mastercard';\n else if (n === '3') result.network = result.number[1] === '4' || result.number[1] === '7' ? 'Amex' : 'Diners';\n else if (n === '6') result.network = 'Discover';\n }\n\n // Clean up regex state\n void CARD_NUMBER_RE;\n void HOLDER_RE;\n\n return result;\n}\n\nexport class JoopCardScanner {\n private _stream: MediaStream | null = null;\n private _video: HTMLVideoElement | null = null;\n private _canvas: HTMLCanvasElement | null = null;\n private _ctx: CanvasRenderingContext2D | null = null;\n private _frameInterval: ReturnType<typeof setInterval> | null = null;\n private _frameCount = 0;\n private _onResult: ((result: JoopCardScanResult) => void) | null = null;\n private _onError: ((err: Error) => void) | null = null;\n private readonly _config: Required<JoopCardScannerConfig>;\n\n constructor(config: JoopCardScannerConfig = {}) {\n this._config = {\n frameRate: config.frameRate ?? 5,\n maxFrames: config.maxFrames ?? 30,\n facingMode: config.facingMode ?? 'environment',\n };\n }\n\n async start(container?: HTMLElement): Promise<void> {\n if (!navigator.mediaDevices?.getUserMedia) {\n throw new Error('Camera not available');\n }\n\n this._stream = await navigator.mediaDevices.getUserMedia({\n video: { facingMode: this._config.facingMode, width: { ideal: 1280 }, height: { ideal: 720 } },\n });\n\n this._video = document.createElement('video');\n this._video.srcObject = this._stream;\n this._video.setAttribute('playsinline', 'true');\n this._video.setAttribute('autoplay', 'true');\n this._video.muted = true;\n\n if (container) {\n Object.assign(this._video.style, { width: '100%', height: '100%', objectFit: 'cover' });\n container.appendChild(this._video);\n }\n\n await new Promise<void>(resolve => {\n this._video!.onloadedmetadata = () => { this._video!.play(); resolve(); };\n });\n\n this._canvas = document.createElement('canvas');\n this._ctx = this._canvas.getContext('2d');\n this._startCapture();\n }\n\n stop(): void {\n if (this._frameInterval) { clearInterval(this._frameInterval); this._frameInterval = null; }\n if (this._stream) { this._stream.getTracks().forEach(t => t.stop()); this._stream = null; }\n if (this._video) { this._video.remove(); this._video = null; }\n }\n\n onResult(fn: (result: JoopCardScanResult) => void): this {\n this._onResult = fn;\n return this;\n }\n\n onError(fn: (err: Error) => void): this {\n this._onError = fn;\n return this;\n }\n\n static fillCard(form: JoopCardForm, result: JoopCardScanResult): void {\n if (result.number && form.number) (form.number as HTMLInputElement).value = result.number;\n if (result.expiry && form.expiry) (form.expiry as HTMLInputElement).value = result.expiry;\n if (result.holder && form.holder) (form.holder as HTMLInputElement).value = result.holder;\n }\n\n private _startCapture(): void {\n const interval = Math.round(1000 / this._config.frameRate);\n this._frameInterval = setInterval(() => {\n if (!this._video || !this._canvas || !this._ctx) return;\n if (this._frameCount >= this._config.maxFrames) {\n this.stop();\n return;\n }\n this._frameCount++;\n this._canvas.width = this._video.videoWidth;\n this._canvas.height = this._video.videoHeight;\n this._ctx.drawImage(this._video, 0, 0);\n\n // Basic OCR: extract image data as text via heuristic region analysis\n // In production, integrate Tesseract.js or similar; here we use a stub that\n // parses visible text from canvas data URL heuristics.\n this._processFrame();\n }, interval);\n }\n\n private _processFrame(): void {\n if (!this._canvas) return;\n try {\n // Extract text from image using a basic luminance-based approach\n // Replace with proper OCR engine (e.g. Tesseract.js) in production\n const dataUrl = this._canvas.toDataURL('image/jpeg', 0.7);\n const simulatedText = this._extractTextFromDataUrl(dataUrl);\n if (simulatedText) {\n const result = parseCardText(simulatedText);\n if (result.number) {\n this.stop();\n this._onResult?.(result);\n }\n }\n } catch (err) {\n this._onError?.(err instanceof Error ? err : new Error(String(err)));\n }\n }\n\n private _extractTextFromDataUrl(_dataUrl: string): string {\n // Stub: integrate Tesseract.js for real OCR\n // Example: const { data: { text } } = await Tesseract.recognize(dataUrl);\n return '';\n }\n}\n","export interface JoopClientInfo {\n ip: string | null;\n userAgent: string;\n browser: JoopBrowserInfo;\n os: JoopOsInfo;\n device: JoopDeviceKind;\n screen: JoopScreenInfo;\n network: JoopNetworkInfo;\n timezone: string;\n locale: string;\n location: JoopGeoInfo | null;\n timestamp: number;\n}\n\nexport interface JoopBrowserInfo {\n name: string;\n version: string;\n engine: string;\n}\n\nexport interface JoopOsInfo {\n name: string;\n version: string;\n arch: string;\n}\n\nexport type JoopDeviceKind = 'mobile' | 'tablet' | 'desktop';\n\nexport interface JoopScreenInfo {\n width: number;\n height: number;\n colorDepth: number;\n pixelRatio: number;\n}\n\nexport interface JoopNetworkInfo {\n online: boolean;\n type: string;\n effectiveType: string;\n downlink: number | null;\n}\n\nexport interface JoopGeoInfo {\n latitude: number;\n longitude: number;\n accuracy: number;\n}\n\nexport interface JoopClientInfoConfig {\n includeLocation?: boolean; // prompt for geolocation, default false\n ipApiUrl?: string; // URL returning { ip: string }, default https://api.ipify.org?format=json\n timeout?: number; // ms, default 5000\n}\n\n// Detect browser name + version from userAgent\nfunction _parseBrowser(ua: string): JoopBrowserInfo {\n if (/Edg\\//.test(ua)) return { name: 'Edge', version: (ua.match(/Edg\\/([\\d.]+)/) ?.[1] ?? ''), engine: 'Blink' };\n if (/OPR\\//.test(ua)) return { name: 'Opera', version: (ua.match(/OPR\\/([\\d.]+)/) ?.[1] ?? ''), engine: 'Blink' };\n if (/Chrome\\//.test(ua)) return { name: 'Chrome', version: (ua.match(/Chrome\\/([\\d.]+)/) ?.[1] ?? ''), engine: 'Blink' };\n if (/Firefox\\//.test(ua)) return { name: 'Firefox', version: (ua.match(/Firefox\\/([\\d.]+)/) ?.[1] ?? ''), engine: 'Gecko' };\n if (/Safari\\//.test(ua) && !/Chrome/.test(ua))\n return { name: 'Safari', version: (ua.match(/Version\\/([\\d.]+)/) ?.[1] ?? ''), engine: 'WebKit' };\n if (/MSIE|Trident/.test(ua)) return { name: 'IE', version: (ua.match(/(?:MSIE |rv:)([\\d.]+)/)?.[1] ?? ''), engine: 'Trident' };\n return { name: 'Unknown', version: '', engine: 'Unknown' };\n}\n\n// Detect OS name + version from userAgent + platform\nfunction _parseOs(ua: string): JoopOsInfo {\n if (/Windows NT 10/.test(ua)) return { name: 'Windows', version: '10/11', arch: ua.includes('x64') ? 'x64' : 'x86' };\n if (/Windows NT 6\\.3/.test(ua)) return { name: 'Windows', version: '8.1', arch: 'x86' };\n if (/Windows NT 6\\.1/.test(ua)) return { name: 'Windows', version: '7', arch: 'x86' };\n if (/Mac OS X ([\\d_]+)/.test(ua)) return { name: 'macOS', version: (ua.match(/Mac OS X ([\\d_]+)/)?.[1] ?? '').replace(/_/g, '.'), arch: 'x64' };\n if (/Android ([\\d.]+)/.test(ua)) return { name: 'Android', version: ua.match(/Android ([\\d.]+)/)?.[1] ?? '', arch: 'arm' };\n if (/iPhone OS ([\\d_]+)/.test(ua)) return { name: 'iOS', version: (ua.match(/iPhone OS ([\\d_]+)/)?.[1] ?? '').replace(/_/g, '.'), arch: 'arm' };\n if (/iPad.*OS ([\\d_]+)/.test(ua)) return { name: 'iPadOS', version: (ua.match(/OS ([\\d_]+)/)?.[1] ?? '').replace(/_/g, '.'), arch: 'arm' };\n if (/Linux/.test(ua)) return { name: 'Linux', version: '', arch: ua.includes('x86_64') ? 'x64' : 'x86' };\n return { name: 'Unknown', version: '', arch: 'Unknown' };\n}\n\nfunction _detectDevice(ua: string): JoopDeviceKind {\n if (/tablet|ipad|playbook|silk/i.test(ua)) return 'tablet';\n if (/mobile|android|iphone|ipod|blackberry|windows phone/i.test(ua)) return 'mobile';\n return 'desktop';\n}\n\nfunction _getNetwork(): JoopNetworkInfo {\n const conn = (navigator as any).connection ?? (navigator as any).mozConnection ?? (navigator as any).webkitConnection;\n return {\n online: navigator.onLine,\n type: conn?.type ?? 'unknown',\n effectiveType: conn?.effectiveType ?? 'unknown',\n downlink: conn?.downlink ?? null,\n };\n}\n\nexport class JoopClientInfoService {\n private readonly _config: Required<JoopClientInfoConfig>;\n\n constructor(config: JoopClientInfoConfig = {}) {\n this._config = {\n includeLocation: config.includeLocation ?? false,\n ipApiUrl: config.ipApiUrl ?? 'https://api.ipify.org?format=json',\n timeout: config.timeout ?? 5000,\n };\n }\n\n async collect(): Promise<JoopClientInfo> {\n const ua = navigator.userAgent;\n const [ip, location] = await Promise.all([\n this._fetchIp(),\n this._config.includeLocation ? this._fetchLocation() : Promise.resolve(null),\n ]);\n\n return {\n ip,\n userAgent: ua,\n browser: _parseBrowser(ua),\n os: _parseOs(ua),\n device: _detectDevice(ua),\n screen: {\n width: screen.width,\n height: screen.height,\n colorDepth: screen.colorDepth,\n pixelRatio: devicePixelRatio,\n },\n network: _getNetwork(),\n timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n locale: navigator.language,\n location,\n timestamp: Date.now(),\n };\n }\n\n /** Collect and return as a flat record safe for HTTP headers or analytics events */\n async collectFlat(): Promise<Record<string, string | number | boolean | null>> {\n const info = await this.collect();\n return {\n ip: info.ip,\n userAgent: info.userAgent,\n browser: `${info.browser.name} ${info.browser.version}`,\n browserEngine: info.browser.engine,\n os: `${info.os.name} ${info.os.version}`,\n osArch: info.os.arch,\n device: info.device,\n screenWidth: info.screen.width,\n screenHeight: info.screen.height,\n pixelRatio: info.screen.pixelRatio,\n online: info.network.online,\n networkType: info.network.type,\n effectiveType: info.network.effectiveType,\n timezone: info.timezone,\n locale: info.locale,\n lat: info.location?.latitude ?? null,\n lng: info.location?.longitude ?? null,\n timestamp: info.timestamp,\n };\n }\n\n private async _fetchIp(): Promise<string | null> {\n try {\n const controller = new AbortController();\n const tid = setTimeout(() => controller.abort(), this._config.timeout);\n const res = await fetch(this._config.ipApiUrl, { signal: controller.signal });\n clearTimeout(tid);\n const data = await res.json() as { ip?: string; query?: string };\n return data.ip ?? data.query ?? null;\n } catch {\n return null;\n }\n }\n\n private _fetchLocation(): Promise<JoopGeoInfo | null> {\n return new Promise(resolve => {\n if (!navigator.geolocation) { resolve(null); return; }\n navigator.geolocation.getCurrentPosition(\n pos => resolve({ latitude: pos.coords.latitude, longitude: pos.coords.longitude, accuracy: pos.coords.accuracy }),\n () => resolve(null),\n { timeout: this._config.timeout, maximumAge: 60000 },\n );\n });\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/device/device-fingerprint.service.ts","../../src/platform/platform.ts","../../src/device/key-vault.ts","../../src/device/biometric-auth.ts","../../src/device/push-service.ts","../../src/events/index.ts","../../src/device/app-lifecycle.ts","../../src/device/network-monitor.ts","../../src/device/card-scanner.ts","../../src/device/client-info.service.ts"],"names":["location"],"mappings":"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","file":"index.js","sourcesContent":["export interface JoopDeviceInfo {\n fingerprint: string;\n userAgent: string;\n language: string;\n timezone: string;\n screenResolution: string;\n colorDepth: number;\n platform: string;\n hardwareConcurrency: number;\n maxTouchPoints: number;\n}\n\nexport class JoopDeviceFingerprintService {\n collect(): Omit<JoopDeviceInfo, 'fingerprint'> {\n const nav = typeof navigator !== 'undefined' ? navigator : null;\n const scr = typeof screen !== 'undefined' ? screen : null;\n return {\n userAgent: nav?.userAgent ?? '',\n language: nav?.language ?? '',\n timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n screenResolution: scr ? `${scr.width}x${scr.height}` : '',\n colorDepth: scr?.colorDepth ?? 0,\n platform: nav?.platform ?? '',\n hardwareConcurrency: nav?.hardwareConcurrency ?? 0,\n maxTouchPoints: nav?.maxTouchPoints ?? 0,\n };\n }\n\n async generate(): Promise<string> {\n const info = this.collect();\n const raw = Object.values(info).join('|');\n const hashBuffer = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(raw));\n return Array.from(new Uint8Array(hashBuffer)).map(b => b.toString(16).padStart(2, '0')).join('');\n }\n\n async getStableId(): Promise<string> {\n const key = '__joop_did';\n const stored = typeof localStorage !== 'undefined' ? localStorage.getItem(key) : null;\n if (stored) return stored;\n const id = await this.generate();\n if (typeof localStorage !== 'undefined') localStorage.setItem(key, id);\n return id;\n }\n}\n","import type { JoopPlatformAdapterConfig, JoopStorageAdapter } from './adapters';\n\nexport type JoopPlatformType = 'web' | 'react-native' | 'node' | 'unknown';\n\nexport interface JoopCapabilities {\n compression: boolean;\n workers: boolean;\n cryptoSubtle: boolean;\n persistentStorage: boolean;\n dom: boolean;\n serviceWorker: boolean;\n}\n\nexport interface JoopPlatformConfig {\n adapter?: JoopPlatformAdapterConfig;\n /** Override auto-detection — useful in tests or SSR */\n platform?: JoopPlatformType;\n}\n\n// ---------------------------------------------------------------------------\n// Built-in storage adapters\n// ---------------------------------------------------------------------------\n\nconst _webStorage = (store: Storage): JoopStorageAdapter => ({\n getItem: (k) => store.getItem(k),\n setItem: (k, v) => store.setItem(k, v),\n removeItem: (k) => store.removeItem(k),\n clear: () => store.clear(),\n});\n\nclass _MemStorageImpl implements JoopStorageAdapter {\n private _m = new Map<string, string>();\n getItem(k: string) { return this._m.get(k) ?? null; }\n setItem(k: string, v: string) { this._m.set(k, v); }\n removeItem(k: string) { this._m.delete(k); }\n clear() { this._m.clear(); }\n}\n\n// ---------------------------------------------------------------------------\n// Platform detection\n// ---------------------------------------------------------------------------\n\nfunction _detect(): JoopPlatformType {\n // React Native sets navigator.product = 'ReactNative'\n if (typeof navigator !== 'undefined' && navigator.product === 'ReactNative') return 'react-native';\n // Node.js: no window, has globalThis.process.versions.node\n const _proc = (globalThis as Record<string, unknown>)['process'] as { versions?: { node?: string } } | undefined;\n if (typeof window === 'undefined' && _proc?.versions?.node) return 'node';\n // Browser\n if (typeof window !== 'undefined') return 'web';\n return 'unknown';\n}\n\n// ---------------------------------------------------------------------------\n// JoopPlatform\n// ---------------------------------------------------------------------------\n\nexport class JoopPlatform {\n private static _type: JoopPlatformType = _detect();\n private static _adapter: JoopPlatformAdapterConfig = {};\n private static _memStorage: JoopStorageAdapter | null = null;\n\n /**\n * Call once at app startup to configure adapters for your platform.\n *\n * Web (default — no call needed):\n * JoopPlatform.init();\n *\n * React Native with react-native-mmkv:\n * import { MMKV } from 'react-native-mmkv';\n * const mmkv = new MMKV();\n * JoopPlatform.init({ adapter: { storage: mmkv } });\n *\n * React Native with custom compression (fflate):\n * import { gzip, ungzip } from 'fflate';\n * JoopPlatform.init({\n * adapter: {\n * compression: {\n * compress: (d, fmt) => new Promise((res, rej) => gzip(d, (e, r) => e ? rej(e) : res(r))),\n * decompress: (d, fmt) => new Promise((res, rej) => ungzip(d, (e, r) => e ? rej(e) : res(r))),\n * },\n * },\n * });\n */\n static init(config: JoopPlatformConfig = {}): void {\n if (config.platform) this._type = config.platform;\n this._adapter = { ...this._adapter, ...(config.adapter ?? {}) };\n }\n\n /** Current detected or overridden platform type */\n static get type(): JoopPlatformType { return this._type; }\n\n static is(type: JoopPlatformType): boolean { return this._type === type; }\n static isMobile(): boolean { return this._type === 'react-native'; }\n static isWeb(): boolean { return this._type === 'web'; }\n static isNode(): boolean { return this._type === 'node'; }\n\n /** Raw adapter config registered via init() */\n static getAdapter(): JoopPlatformAdapterConfig { return this._adapter; }\n\n /**\n * Returns the best available storage adapter:\n * 1. Custom adapter registered via init()\n * 2. localStorage (web)\n * 3. In-memory fallback (Node / RN without adapter)\n */\n static getStorage(): JoopStorageAdapter {\n if (this._adapter.storage) return this._adapter.storage;\n if (typeof localStorage !== 'undefined') return _webStorage(localStorage);\n if (!this._memStorage) this._memStorage = new _MemStorageImpl();\n return this._memStorage;\n }\n\n /**\n * Returns the best available session-scoped storage:\n * 1. Custom adapter registered via init()\n * 2. sessionStorage (web)\n * 3. Shared in-memory fallback\n */\n static getSessionStorage(): JoopStorageAdapter {\n if (this._adapter.storage) return this._adapter.storage;\n if (typeof sessionStorage !== 'undefined') return _webStorage(sessionStorage);\n if (!this._memStorage) this._memStorage = new _MemStorageImpl();\n return this._memStorage;\n }\n\n /** What APIs are available in the current environment */\n static capabilities(): JoopCapabilities {\n return {\n compression: typeof CompressionStream !== 'undefined' || !!this._adapter.compression,\n workers: typeof Worker !== 'undefined' || !!this._adapter.worker,\n cryptoSubtle: !!(typeof globalThis !== 'undefined' && (globalThis as typeof globalThis & { crypto?: Crypto }).crypto?.subtle),\n persistentStorage: typeof localStorage !== 'undefined' || !!this._adapter.storage,\n dom: typeof document !== 'undefined',\n serviceWorker: typeof navigator !== 'undefined' && 'serviceWorker' in navigator,\n };\n }\n\n /** Reset to auto-detected defaults — useful between tests */\n static _reset(): void {\n this._type = _detect();\n this._adapter = {};\n this._memStorage = null;\n }\n}\n","import { JoopPlatform } from '../platform/platform';\nimport type { JoopKeyVaultAdapter } from '../platform/adapters';\n\nexport interface JoopKeyVaultConfig {\n /** AES-GCM encryption password. If omitted, values are base64-encoded only (no encryption). */\n encryptionKey?: string;\n /** localStorage key prefix. Default: 'joop_vault_' */\n prefix?: string;\n /** Override platform adapter (e.g. react-native-keychain wrapper) */\n adapter?: JoopKeyVaultAdapter;\n}\n\nexport class JoopKeyVault {\n private _prefix: string;\n private _encKey: string | undefined;\n private _adapter: JoopKeyVaultAdapter | null;\n private _cryptoKey: CryptoKey | null = null;\n\n constructor(config: JoopKeyVaultConfig = {}) {\n this._prefix = config.prefix ?? 'joop_vault_';\n this._encKey = config.encryptionKey;\n this._adapter = config.adapter ?? JoopPlatform.getAdapter().keyVault ?? null;\n }\n\n /** Store a secret. On web: AES-GCM encrypted if `encryptionKey` was provided. */\n async set(key: string, value: string): Promise<void> {\n if (this._adapter) return this._adapter.set(key, value);\n const stored = this._encKey\n ? await _encrypt(value, await this._key())\n : btoa(unescape(encodeURIComponent(value)));\n JoopPlatform.getStorage().setItem(this._prefix + key, stored);\n }\n\n /** Retrieve a secret, or null if not found. */\n async get(key: string): Promise<string | null> {\n if (this._adapter) return this._adapter.get(key);\n const raw = JoopPlatform.getStorage().getItem(this._prefix + key);\n if (!raw) return null;\n try {\n return this._encKey\n ? await _decrypt(raw, await this._key())\n : decodeURIComponent(escape(atob(raw)));\n } catch {\n return null;\n }\n }\n\n async remove(key: string): Promise<void> {\n if (this._adapter) return this._adapter.remove(key);\n JoopPlatform.getStorage().removeItem(this._prefix + key);\n }\n\n async clear(): Promise<void> {\n if (this._adapter) return this._adapter.clear();\n JoopPlatform.getStorage().clear?.();\n }\n\n async has(key: string): Promise<boolean> {\n return (await this.get(key)) !== null;\n }\n\n /** Rotate the encryption key: re-encrypts all known entries with a new key. */\n async rotateKey(newEncryptionKey: string, keys: string[]): Promise<void> {\n if (this._adapter) throw new Error('rotateKey not supported with native adapter');\n const values = await Promise.all(keys.map(k => this.get(k)));\n this._encKey = newEncryptionKey;\n this._cryptoKey = null;\n for (let i = 0; i < keys.length; i++) {\n if (values[i] !== null) await this.set(keys[i], values[i]!);\n }\n }\n\n private async _key(): Promise<CryptoKey> {\n if (!this._cryptoKey) this._cryptoKey = await _deriveKey(this._encKey!);\n return this._cryptoKey;\n }\n}\n\n// ── WebCrypto helpers ────────────────────────────────────────────────────────\n\nconst _SALT = new Uint8Array([\n 0x6a, 0x6f, 0x6f, 0x70, 0x2d, 0x76, 0x61, 0x75,\n 0x6c, 0x74, 0x2d, 0x76, 0x31, 0x00, 0x00, 0x00,\n]);\n\nasync function _deriveKey(password: string): Promise<CryptoKey> {\n const km = await crypto.subtle.importKey(\n 'raw', new TextEncoder().encode(password),\n { name: 'PBKDF2' }, false, ['deriveKey'],\n );\n return crypto.subtle.deriveKey(\n { name: 'PBKDF2', salt: _SALT, iterations: 100000, hash: 'SHA-256' },\n km,\n { name: 'AES-GCM', length: 256 },\n false,\n ['encrypt', 'decrypt'],\n );\n}\n\nasync function _encrypt(value: string, key: CryptoKey): Promise<string> {\n const iv = crypto.getRandomValues(new Uint8Array(12));\n const encrypted = await crypto.subtle.encrypt(\n { name: 'AES-GCM', iv },\n key,\n new TextEncoder().encode(value),\n );\n const combined = new Uint8Array(12 + encrypted.byteLength);\n combined.set(iv);\n combined.set(new Uint8Array(encrypted), 12);\n return btoa(String.fromCharCode(...combined));\n}\n\nasync function _decrypt(encoded: string, key: CryptoKey): Promise<string> {\n const combined = Uint8Array.from(atob(encoded), c => c.charCodeAt(0));\n const iv = combined.slice(0, 12);\n const data = combined.slice(12);\n const decrypted = await crypto.subtle.decrypt({ name: 'AES-GCM', iv }, key, data);\n return new TextDecoder().decode(decrypted);\n}\n","import { JoopPlatform } from '../platform/platform';\nimport type { JoopBiometricAdapter } from '../platform/adapters';\n\nexport interface JoopBiometricConfig {\n /** WebAuthn relying-party ID (default: current hostname) */\n rpId?: string;\n /** WebAuthn relying-party name */\n rpName?: string;\n /** Override platform adapter (e.g. react-native-biometrics wrapper) */\n adapter?: JoopBiometricAdapter;\n}\n\nexport interface JoopEnrollResult {\n credentialId: string; // base64url\n publicKey?: string; // base64url DER-encoded public key (web only)\n}\n\nexport interface JoopAuthenticateOptions {\n credentialId?: string; // restrict to this credential\n reason?: string; // shown to the user (RN / macOS)\n timeout?: number; // ms, default 60000\n}\n\nexport class JoopBiometricAuth {\n private _rpId: string;\n private _rpName: string;\n private _adapter: JoopBiometricAdapter | null;\n\n constructor(config: JoopBiometricConfig = {}) {\n this._rpId = config.rpId ?? (typeof location !== 'undefined' ? location.hostname : 'localhost');\n this._rpName = config.rpName ?? this._rpId;\n this._adapter = config.adapter ?? JoopPlatform.getAdapter().biometric ?? null;\n }\n\n /** True when a platform authenticator is available. */\n async isAvailable(): Promise<boolean> {\n if (this._adapter) return this._adapter.isAvailable();\n if (typeof window === 'undefined' || !window.PublicKeyCredential) return false;\n if (typeof PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable !== 'function') return false;\n return PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable();\n }\n\n /**\n * Enroll a new credential for the given user.\n * Web: creates a WebAuthn passkey via navigator.credentials.create().\n * React Native: delegates to the injected adapter.\n */\n async enroll(userId: string, displayName: string): Promise<JoopEnrollResult> {\n if (this._adapter) throw new Error('Enrollment must be handled by the native adapter');\n\n if (typeof navigator?.credentials?.create !== 'function') {\n throw new Error('WebAuthn not available in this environment');\n }\n\n const challenge = crypto.getRandomValues(new Uint8Array(32));\n const cred = (await navigator.credentials.create({\n publicKey: {\n challenge,\n rp: { id: this._rpId, name: this._rpName },\n user: { id: new TextEncoder().encode(userId), name: userId, displayName },\n pubKeyCredParams: [\n { type: 'public-key', alg: -7 }, // ES256\n { type: 'public-key', alg: -257 }, // RS256\n ],\n authenticatorSelection: {\n authenticatorAttachment: 'platform',\n userVerification: 'required',\n residentKey: 'preferred',\n },\n timeout: 60000,\n attestation: 'none',\n },\n })) as PublicKeyCredential;\n\n const response = cred.response as AuthenticatorAttestationResponse;\n const pubKey = response.getPublicKey?.();\n return {\n credentialId: _b64url(cred.rawId),\n publicKey: pubKey ? _b64url(pubKey) : undefined,\n };\n }\n\n /**\n * Verify identity against an existing credential.\n * Web: navigator.credentials.get() with WebAuthn assertion.\n * React Native: delegates to the injected adapter.\n */\n async authenticate(options: JoopAuthenticateOptions = {}): Promise<boolean> {\n if (this._adapter) return this._adapter.authenticate(options.reason);\n\n if (typeof navigator?.credentials?.get !== 'function') return false;\n\n const challenge = crypto.getRandomValues(new Uint8Array(32));\n const allowCredentials: PublicKeyCredentialDescriptor[] = options.credentialId\n ? [{ type: 'public-key', id: _b64urlToBytes(options.credentialId) as Uint8Array<ArrayBuffer> }]\n : [];\n\n try {\n const cred = await navigator.credentials.get({\n publicKey: {\n challenge,\n allowCredentials,\n userVerification: 'required',\n timeout: options.timeout ?? 60000,\n },\n });\n return !!cred;\n } catch {\n return false;\n }\n }\n\n /**\n * Quick check — asks the platform if biometrics can be used right now.\n * Does not prompt the user.\n */\n async canAuthenticate(): Promise<boolean> {\n if (this._adapter) return this._adapter.isAvailable();\n return this.isAvailable();\n }\n}\n\n// ── helpers ──────────────────────────────────────────────────────────────────\n\nfunction _b64url(buf: ArrayBuffer): string {\n return btoa(String.fromCharCode(...new Uint8Array(buf)))\n .replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=/g, '');\n}\n\nfunction _b64urlToBytes(s: string): Uint8Array {\n const padded = s.replace(/-/g, '+').replace(/_/g, '/').padEnd(\n s.length + ((4 - (s.length % 4)) % 4), '=',\n );\n return Uint8Array.from(atob(padded), c => c.charCodeAt(0));\n}\n","import { JoopPlatform } from '../platform/platform';\nimport type { JoopPushAdapter, JoopPushPayload } from '../platform/adapters';\n\nexport type { JoopPushPayload };\nexport type JoopPushPermission = 'granted' | 'denied' | 'default' | 'unsupported';\n\nexport interface JoopPushConfig {\n /** VAPID public key (base64url) for web push subscription */\n vapidPublicKey?: string;\n /** Path to the service worker file (default: '/sw.js') */\n serviceWorkerPath?: string;\n /** Override platform adapter (e.g. FCM / APNs wrapper) */\n adapter?: JoopPushAdapter;\n}\n\nexport interface JoopPushSubscriptionInfo {\n endpoint: string;\n p256dh: string; // base64url-encoded\n auth: string; // base64url-encoded\n}\n\nexport class JoopPushService {\n private _cfg: JoopPushConfig;\n private _adapter: JoopPushAdapter | null;\n private _messageHandlers: Array<(payload: JoopPushPayload) => void> = [];\n private _adapterUnsub: (() => void) | null = null;\n\n constructor(config: JoopPushConfig = {}) {\n this._cfg = config;\n this._adapter = config.adapter ?? JoopPlatform.getAdapter().push ?? null;\n if (this._adapter) {\n this._adapterUnsub = this._adapter.onMessage(p => this._emit(p));\n }\n }\n\n /** Request push notification permission from the user. */\n async requestPermission(): Promise<JoopPushPermission> {\n if (this._adapter) {\n const result = await this._adapter.requestPermission();\n return result;\n }\n if (typeof Notification === 'undefined') return 'unsupported';\n if (Notification.permission === 'granted') return 'granted';\n const perm = await Notification.requestPermission();\n return perm as JoopPushPermission;\n }\n\n /** Get the current permission status without prompting. */\n getPermission(): JoopPushPermission {\n if (this._adapter) return 'default'; // adapter manages its own state\n if (typeof Notification === 'undefined') return 'unsupported';\n return Notification.permission as JoopPushPermission;\n }\n\n /**\n * Subscribe to web push and return subscription info to send to your server.\n * Requires a service worker and a VAPID key.\n */\n async subscribe(options?: { vapidPublicKey?: string }): Promise<JoopPushSubscriptionInfo | null> {\n if (this._adapter) {\n const token = await this._adapter.getToken(options?.vapidPublicKey ?? this._cfg.vapidPublicKey);\n return token ? { endpoint: token, p256dh: '', auth: '' } : null;\n }\n\n if (typeof navigator?.serviceWorker === 'undefined') return null;\n if (Notification.permission !== 'granted') return null;\n\n const vapidKey = options?.vapidPublicKey ?? this._cfg.vapidPublicKey;\n if (!vapidKey) return null;\n\n const reg = await navigator.serviceWorker.register(this._cfg.serviceWorkerPath ?? '/sw.js');\n const sub = await reg.pushManager.subscribe({\n userVisibleOnly: true,\n applicationServerKey: _urlBase64ToUint8(vapidKey) as Uint8Array<ArrayBuffer>,\n });\n\n const keys = sub.getKey ? {\n p256dh: btoa(String.fromCharCode(...new Uint8Array(sub.getKey('p256dh')!))),\n auth: btoa(String.fromCharCode(...new Uint8Array(sub.getKey('auth')!))),\n } : { p256dh: '', auth: '' };\n\n return { endpoint: sub.endpoint, ...keys };\n }\n\n /** Unsubscribe from web push. */\n async unsubscribe(): Promise<boolean> {\n if (this._adapter) return false;\n if (typeof navigator?.serviceWorker === 'undefined') return false;\n try {\n const reg = await navigator.serviceWorker.ready;\n const sub = await reg.pushManager.getSubscription();\n return sub ? sub.unsubscribe() : false;\n } catch {\n return false;\n }\n }\n\n /** Display an immediate local notification (no server push required). */\n async show(payload: JoopPushPayload): Promise<void> {\n if (this._adapter) {\n this._emit(payload);\n return;\n }\n if (typeof Notification === 'undefined') return;\n if (Notification.permission !== 'granted') return;\n new Notification(payload.title ?? '', {\n body: payload.body,\n icon: payload.icon,\n badge: payload.icon,\n tag: payload.tag,\n data: payload.data,\n });\n }\n\n /** Set the app badge count (mobile only via adapter). */\n async setBadgeCount(count: number): Promise<void> {\n if (this._adapter?.setBadgeCount) await this._adapter.setBadgeCount(count);\n else if (typeof navigator?.setAppBadge === 'function') {\n await (navigator as Navigator & { setAppBadge(n: number): Promise<void> }).setAppBadge(count);\n }\n }\n\n /** Clear the app badge. */\n async clearBadge(): Promise<void> {\n if (typeof navigator?.clearAppBadge === 'function') {\n await (navigator as Navigator & { clearAppBadge(): Promise<void> }).clearAppBadge();\n }\n }\n\n /** Register a handler for incoming push payloads (foreground messages). */\n onMessage(handler: (payload: JoopPushPayload) => void): () => void {\n this._messageHandlers.push(handler);\n return () => { this._messageHandlers = this._messageHandlers.filter(h => h !== handler); };\n }\n\n destroy(): void {\n this._adapterUnsub?.();\n this._adapterUnsub = null;\n this._messageHandlers = [];\n }\n\n private _emit(payload: JoopPushPayload): void {\n for (const h of this._messageHandlers) h(payload);\n }\n}\n\n// ── helpers ──────────────────────────────────────────────────────────────────\n\nfunction _urlBase64ToUint8(base64String: string): Uint8Array {\n const padding = '='.repeat((4 - (base64String.length % 4)) % 4);\n const base64 = (base64String + padding).replace(/-/g, '+').replace(/_/g, '/');\n const raw = atob(base64);\n const out = new Uint8Array(raw.length);\n for (let i = 0; i < raw.length; i++) out[i] = raw.charCodeAt(i);\n return out;\n}\n","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';\nimport { JoopPlatform } from '../platform/platform';\nimport type { JoopLifecycleAdapter, JoopAppState } from '../platform/adapters';\n\nexport type { JoopAppState };\n\nexport interface JoopLifecycleConfig {\n /** Override platform adapter (e.g. RN AppState wrapper) */\n adapter?: JoopLifecycleAdapter;\n}\n\nexport class JoopAppLifecycle {\n private _state$ = new JoopBehaviorSubject<JoopAppState>('unknown');\n private _cleanup: Array<() => void> = [];\n private _adapter: JoopLifecycleAdapter | null;\n\n constructor(config: JoopLifecycleConfig = {}) {\n this._adapter = config.adapter ?? JoopPlatform.getAdapter().lifecycle ?? null;\n this._init();\n }\n\n private _init(): void {\n if (this._adapter) {\n this._state$.next(this._adapter.getState());\n const unsub = this._adapter.onChange(s => this._state$.next(s));\n this._cleanup.push(unsub);\n return;\n }\n\n if (typeof document === 'undefined') { this._state$.next('unknown'); return; }\n\n this._state$.next(document.hidden ? 'background' : 'active');\n\n const onVisibility = () => this._state$.next(document.hidden ? 'background' : 'active');\n const onFocus = () => this._state$.next('active');\n const onBlur = () => this._state$.next('background');\n\n document.addEventListener('visibilitychange', onVisibility);\n window.addEventListener('focus', onFocus);\n window.addEventListener('blur', onBlur);\n\n this._cleanup.push(\n () => document.removeEventListener('visibilitychange', onVisibility),\n () => window.removeEventListener('focus', onFocus),\n () => window.removeEventListener('blur', onBlur),\n );\n }\n\n getState(): JoopAppState { return this._state$.getValue(); }\n state$() { return this._state$.asObservable(); }\n isActive(): boolean { return this.getState() === 'active'; }\n\n /** Call fn each time the app comes to the foreground (background → active). */\n onForeground(fn: () => void): () => void {\n let prev = this.getState();\n return this._state$.subscribe(s => {\n if (s === 'active' && prev !== 'active') fn();\n prev = s;\n });\n }\n\n /** Call fn each time the app goes to the background (active → background). */\n onBackground(fn: () => void): () => void {\n let prev = this.getState();\n return this._state$.subscribe(s => {\n if (s === 'background' && prev !== 'background') fn();\n prev = s;\n });\n }\n\n destroy(): void {\n for (const fn of this._cleanup) fn();\n this._cleanup = [];\n }\n}\n","import { JoopBehaviorSubject } from '../events';\nimport { JoopPlatform } from '../platform/platform';\nimport type { JoopNetworkAdapter, JoopNetworkState, JoopNetworkType, JoopEffectiveType } from '../platform/adapters';\n\nexport type { JoopNetworkState, JoopNetworkType, JoopEffectiveType };\n\nexport interface JoopNetworkMonitorConfig {\n /** Override platform adapter (e.g. RN NetInfo wrapper) */\n adapter?: JoopNetworkAdapter;\n}\n\ntype _NetInfoConnection = {\n type?: string;\n effectiveType?: string;\n downlink?: number;\n rtt?: number;\n saveData?: boolean;\n metered?: boolean;\n addEventListener(event: 'change', handler: () => void): void;\n removeEventListener(event: 'change', handler: () => void): void;\n};\n\nexport class JoopNetworkMonitor {\n private _adapter: JoopNetworkAdapter | null;\n private _state$: JoopBehaviorSubject<JoopNetworkState>;\n private _cleanup: Array<() => void> = [];\n\n constructor(config: JoopNetworkMonitorConfig = {}) {\n this._adapter = config.adapter ?? JoopPlatform.getAdapter().network ?? null;\n this._state$ = new JoopBehaviorSubject<JoopNetworkState>(this._read());\n this._init();\n }\n\n private _init(): void {\n if (this._adapter) {\n this._state$.next(this._adapter.getState());\n const unsub = this._adapter.onChange(s => this._state$.next(s));\n this._cleanup.push(unsub);\n return;\n }\n\n if (typeof window === 'undefined') return;\n\n const refresh = () => this._state$.next(this._read());\n\n window.addEventListener('online', refresh);\n window.addEventListener('offline', refresh);\n\n const conn = (navigator as unknown as { connection?: _NetInfoConnection }).connection;\n if (conn) {\n conn.addEventListener('change', refresh);\n this._cleanup.push(() => conn.removeEventListener('change', refresh));\n }\n\n this._cleanup.push(\n () => window.removeEventListener('online', refresh),\n () => window.removeEventListener('offline', refresh),\n );\n }\n\n private _read(): JoopNetworkState {\n if (this._adapter) return this._adapter.getState();\n if (typeof navigator === 'undefined') return { online: false, type: 'unknown' };\n\n const online = navigator.onLine;\n if (!online) return { online: false, type: 'offline' };\n\n const conn = (navigator as unknown as { connection?: _NetInfoConnection }).connection;\n const type = conn ? _mapType(conn.type) : 'unknown';\n\n return {\n online,\n type,\n effectiveType: conn?.effectiveType as JoopEffectiveType | undefined,\n downlink: conn?.downlink,\n rtt: conn?.rtt,\n saveData: conn?.saveData,\n metered: conn?.metered ?? type === 'cellular',\n };\n }\n\n getState(): JoopNetworkState { return this._state$.getValue(); }\n state$() { return this._state$.asObservable(); }\n isOnline(): boolean { return this.getState().online; }\n isMetered(): boolean { return this.getState().metered ?? this.getState().type === 'cellular'; }\n\n /** Call fn when connectivity is regained. */\n onOnline(fn: () => void): () => void {\n let prev = this.getState().online;\n return this._state$.subscribe(s => {\n if (s.online && !prev) fn();\n prev = s.online;\n });\n }\n\n /** Call fn when connectivity is lost. */\n onOffline(fn: () => void): () => void {\n let prev = this.getState().online;\n return this._state$.subscribe(s => {\n if (!s.online && prev) fn();\n prev = s.online;\n });\n }\n\n /** Call fn when the connection type changes (e.g. wifi → cellular). */\n onTypeChange(fn: (type: JoopNetworkType) => void): () => void {\n let prev = this.getState().type;\n return this._state$.subscribe(s => {\n if (s.type !== prev) { fn(s.type); prev = s.type; }\n });\n }\n\n destroy(): void {\n for (const fn of this._cleanup) fn();\n this._cleanup = [];\n }\n}\n\nfunction _mapType(raw?: string): JoopNetworkType {\n if (!raw) return 'unknown';\n if (raw === 'wifi' || raw === 'wimax') return 'wifi';\n if (raw === 'cellular' || raw === '2g' || raw === '3g' || raw === '4g' || raw === '5g') return 'cellular';\n if (raw === 'ethernet') return 'ethernet';\n if (raw === 'none' || raw === 'offline') return 'offline';\n return 'unknown';\n}\n","export interface JoopCardScanResult {\n number?: string;\n expiry?: string;\n holder?: string;\n cvv?: string;\n network?: string;\n}\n\nexport interface JoopCardScannerConfig {\n frameRate?: number; // default 5\n maxFrames?: number; // default 30\n facingMode?: 'user' | 'environment'; // default 'environment'\n}\n\nexport interface JoopCardForm {\n number?: { value: string } | HTMLInputElement;\n expiry?: { value: string } | HTMLInputElement;\n holder?: { value: string } | HTMLInputElement;\n cvv?: { value: string } | HTMLInputElement;\n}\n\nconst CARD_NUMBER_RE = /\\b(?:\\d[ -]?){13,19}\\b/g;\nconst EXPIRY_RE = /\\b(0[1-9]|1[0-2])\\s*[\\/\\-]\\s*(\\d{2}|\\d{4})\\b/g;\nconst HOLDER_RE = /\\b([A-Z]{2,}\\s+[A-Z]{2,}(?:\\s+[A-Z]{2,})?)\\b/g;\n\nfunction parseCardText(text: string): JoopCardScanResult {\n const result: JoopCardScanResult = {};\n\n const numMatch = text.replace(/\\s/g, '').match(/\\d{13,19}/);\n if (numMatch) result.number = numMatch[0];\n\n const expMatch = EXPIRY_RE.exec(text);\n if (expMatch) result.expiry = expMatch[1] + '/' + expMatch[2].slice(-2);\n\n const holderMatch = HOLDER_RE.exec(text.toUpperCase());\n if (holderMatch) result.holder = holderMatch[0];\n\n if (result.number) {\n const n = result.number[0];\n if (n === '4') result.network = 'Visa';\n else if (n === '5') result.network = 'Mastercard';\n else if (n === '3') result.network = result.number[1] === '4' || result.number[1] === '7' ? 'Amex' : 'Diners';\n else if (n === '6') result.network = 'Discover';\n }\n\n // Clean up regex state\n void CARD_NUMBER_RE;\n void HOLDER_RE;\n\n return result;\n}\n\nexport class JoopCardScanner {\n private _stream: MediaStream | null = null;\n private _video: HTMLVideoElement | null = null;\n private _canvas: HTMLCanvasElement | null = null;\n private _ctx: CanvasRenderingContext2D | null = null;\n private _frameInterval: ReturnType<typeof setInterval> | null = null;\n private _frameCount = 0;\n private _onResult: ((result: JoopCardScanResult) => void) | null = null;\n private _onError: ((err: Error) => void) | null = null;\n private readonly _config: Required<JoopCardScannerConfig>;\n\n constructor(config: JoopCardScannerConfig = {}) {\n this._config = {\n frameRate: config.frameRate ?? 5,\n maxFrames: config.maxFrames ?? 30,\n facingMode: config.facingMode ?? 'environment',\n };\n }\n\n async start(container?: HTMLElement): Promise<void> {\n if (!navigator.mediaDevices?.getUserMedia) {\n throw new Error('Camera not available');\n }\n\n this._stream = await navigator.mediaDevices.getUserMedia({\n video: { facingMode: this._config.facingMode, width: { ideal: 1280 }, height: { ideal: 720 } },\n });\n\n this._video = document.createElement('video');\n this._video.srcObject = this._stream;\n this._video.setAttribute('playsinline', 'true');\n this._video.setAttribute('autoplay', 'true');\n this._video.muted = true;\n\n if (container) {\n Object.assign(this._video.style, { width: '100%', height: '100%', objectFit: 'cover' });\n container.appendChild(this._video);\n }\n\n await new Promise<void>(resolve => {\n this._video!.onloadedmetadata = () => { this._video!.play(); resolve(); };\n });\n\n this._canvas = document.createElement('canvas');\n this._ctx = this._canvas.getContext('2d');\n this._startCapture();\n }\n\n stop(): void {\n if (this._frameInterval) { clearInterval(this._frameInterval); this._frameInterval = null; }\n if (this._stream) { this._stream.getTracks().forEach(t => t.stop()); this._stream = null; }\n if (this._video) { this._video.remove(); this._video = null; }\n }\n\n onResult(fn: (result: JoopCardScanResult) => void): this {\n this._onResult = fn;\n return this;\n }\n\n onError(fn: (err: Error) => void): this {\n this._onError = fn;\n return this;\n }\n\n static fillCard(form: JoopCardForm, result: JoopCardScanResult): void {\n if (result.number && form.number) (form.number as HTMLInputElement).value = result.number;\n if (result.expiry && form.expiry) (form.expiry as HTMLInputElement).value = result.expiry;\n if (result.holder && form.holder) (form.holder as HTMLInputElement).value = result.holder;\n }\n\n private _startCapture(): void {\n const interval = Math.round(1000 / this._config.frameRate);\n this._frameInterval = setInterval(() => {\n if (!this._video || !this._canvas || !this._ctx) return;\n if (this._frameCount >= this._config.maxFrames) {\n this.stop();\n return;\n }\n this._frameCount++;\n this._canvas.width = this._video.videoWidth;\n this._canvas.height = this._video.videoHeight;\n this._ctx.drawImage(this._video, 0, 0);\n\n // Basic OCR: extract image data as text via heuristic region analysis\n // In production, integrate Tesseract.js or similar; here we use a stub that\n // parses visible text from canvas data URL heuristics.\n this._processFrame();\n }, interval);\n }\n\n private _processFrame(): void {\n if (!this._canvas) return;\n try {\n // Extract text from image using a basic luminance-based approach\n // Replace with proper OCR engine (e.g. Tesseract.js) in production\n const dataUrl = this._canvas.toDataURL('image/jpeg', 0.7);\n const simulatedText = this._extractTextFromDataUrl(dataUrl);\n if (simulatedText) {\n const result = parseCardText(simulatedText);\n if (result.number) {\n this.stop();\n this._onResult?.(result);\n }\n }\n } catch (err) {\n this._onError?.(err instanceof Error ? err : new Error(String(err)));\n }\n }\n\n private _extractTextFromDataUrl(_dataUrl: string): string {\n // Stub: integrate Tesseract.js for real OCR\n // Example: const { data: { text } } = await Tesseract.recognize(dataUrl);\n return '';\n }\n}\n","export interface JoopClientInfo {\n ip: string | null;\n userAgent: string;\n browser: JoopBrowserInfo;\n os: JoopOsInfo;\n device: JoopDeviceKind;\n screen: JoopScreenInfo;\n network: JoopNetworkInfo;\n timezone: string;\n locale: string;\n location: JoopGeoInfo | null;\n timestamp: number;\n}\n\nexport interface JoopBrowserInfo {\n name: string;\n version: string;\n engine: string;\n}\n\nexport interface JoopOsInfo {\n name: string;\n version: string;\n arch: string;\n}\n\nexport type JoopDeviceKind = 'mobile' | 'tablet' | 'desktop';\n\nexport interface JoopScreenInfo {\n width: number;\n height: number;\n colorDepth: number;\n pixelRatio: number;\n}\n\nexport interface JoopNetworkInfo {\n online: boolean;\n type: string;\n effectiveType: string;\n downlink: number | null;\n}\n\nexport interface JoopGeoInfo {\n latitude: number;\n longitude: number;\n accuracy: number;\n}\n\nexport interface JoopClientInfoConfig {\n includeLocation?: boolean; // prompt for geolocation, default false\n ipApiUrl?: string; // URL returning { ip: string }, default https://api.ipify.org?format=json\n timeout?: number; // ms, default 5000\n}\n\n// Detect browser name + version from userAgent\nfunction _parseBrowser(ua: string): JoopBrowserInfo {\n if (/Edg\\//.test(ua)) return { name: 'Edge', version: (ua.match(/Edg\\/([\\d.]+)/) ?.[1] ?? ''), engine: 'Blink' };\n if (/OPR\\//.test(ua)) return { name: 'Opera', version: (ua.match(/OPR\\/([\\d.]+)/) ?.[1] ?? ''), engine: 'Blink' };\n if (/Chrome\\//.test(ua)) return { name: 'Chrome', version: (ua.match(/Chrome\\/([\\d.]+)/) ?.[1] ?? ''), engine: 'Blink' };\n if (/Firefox\\//.test(ua)) return { name: 'Firefox', version: (ua.match(/Firefox\\/([\\d.]+)/) ?.[1] ?? ''), engine: 'Gecko' };\n if (/Safari\\//.test(ua) && !/Chrome/.test(ua))\n return { name: 'Safari', version: (ua.match(/Version\\/([\\d.]+)/) ?.[1] ?? ''), engine: 'WebKit' };\n if (/MSIE|Trident/.test(ua)) return { name: 'IE', version: (ua.match(/(?:MSIE |rv:)([\\d.]+)/)?.[1] ?? ''), engine: 'Trident' };\n return { name: 'Unknown', version: '', engine: 'Unknown' };\n}\n\n// Detect OS name + version from userAgent + platform\nfunction _parseOs(ua: string): JoopOsInfo {\n if (/Windows NT 10/.test(ua)) return { name: 'Windows', version: '10/11', arch: ua.includes('x64') ? 'x64' : 'x86' };\n if (/Windows NT 6\\.3/.test(ua)) return { name: 'Windows', version: '8.1', arch: 'x86' };\n if (/Windows NT 6\\.1/.test(ua)) return { name: 'Windows', version: '7', arch: 'x86' };\n if (/Mac OS X ([\\d_]+)/.test(ua)) return { name: 'macOS', version: (ua.match(/Mac OS X ([\\d_]+)/)?.[1] ?? '').replace(/_/g, '.'), arch: 'x64' };\n if (/Android ([\\d.]+)/.test(ua)) return { name: 'Android', version: ua.match(/Android ([\\d.]+)/)?.[1] ?? '', arch: 'arm' };\n if (/iPhone OS ([\\d_]+)/.test(ua)) return { name: 'iOS', version: (ua.match(/iPhone OS ([\\d_]+)/)?.[1] ?? '').replace(/_/g, '.'), arch: 'arm' };\n if (/iPad.*OS ([\\d_]+)/.test(ua)) return { name: 'iPadOS', version: (ua.match(/OS ([\\d_]+)/)?.[1] ?? '').replace(/_/g, '.'), arch: 'arm' };\n if (/Linux/.test(ua)) return { name: 'Linux', version: '', arch: ua.includes('x86_64') ? 'x64' : 'x86' };\n return { name: 'Unknown', version: '', arch: 'Unknown' };\n}\n\nfunction _detectDevice(ua: string): JoopDeviceKind {\n if (/tablet|ipad|playbook|silk/i.test(ua)) return 'tablet';\n if (/mobile|android|iphone|ipod|blackberry|windows phone/i.test(ua)) return 'mobile';\n return 'desktop';\n}\n\nfunction _getNetwork(): JoopNetworkInfo {\n const conn = (navigator as any).connection ?? (navigator as any).mozConnection ?? (navigator as any).webkitConnection;\n return {\n online: navigator.onLine,\n type: conn?.type ?? 'unknown',\n effectiveType: conn?.effectiveType ?? 'unknown',\n downlink: conn?.downlink ?? null,\n };\n}\n\nexport class JoopClientInfoService {\n private readonly _config: Required<JoopClientInfoConfig>;\n\n constructor(config: JoopClientInfoConfig = {}) {\n this._config = {\n includeLocation: config.includeLocation ?? false,\n ipApiUrl: config.ipApiUrl ?? 'https://api.ipify.org?format=json',\n timeout: config.timeout ?? 5000,\n };\n }\n\n async collect(): Promise<JoopClientInfo> {\n const ua = navigator.userAgent;\n const [ip, location] = await Promise.all([\n this._fetchIp(),\n this._config.includeLocation ? this._fetchLocation() : Promise.resolve(null),\n ]);\n\n return {\n ip,\n userAgent: ua,\n browser: _parseBrowser(ua),\n os: _parseOs(ua),\n device: _detectDevice(ua),\n screen: {\n width: screen.width,\n height: screen.height,\n colorDepth: screen.colorDepth,\n pixelRatio: devicePixelRatio,\n },\n network: _getNetwork(),\n timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n locale: navigator.language,\n location,\n timestamp: Date.now(),\n };\n }\n\n /** Collect and return as a flat record safe for HTTP headers or analytics events */\n async collectFlat(): Promise<Record<string, string | number | boolean | null>> {\n const info = await this.collect();\n return {\n ip: info.ip,\n userAgent: info.userAgent,\n browser: `${info.browser.name} ${info.browser.version}`,\n browserEngine: info.browser.engine,\n os: `${info.os.name} ${info.os.version}`,\n osArch: info.os.arch,\n device: info.device,\n screenWidth: info.screen.width,\n screenHeight: info.screen.height,\n pixelRatio: info.screen.pixelRatio,\n online: info.network.online,\n networkType: info.network.type,\n effectiveType: info.network.effectiveType,\n timezone: info.timezone,\n locale: info.locale,\n lat: info.location?.latitude ?? null,\n lng: info.location?.longitude ?? null,\n timestamp: info.timestamp,\n };\n }\n\n private async _fetchIp(): Promise<string | null> {\n try {\n const controller = new AbortController();\n const tid = setTimeout(() => controller.abort(), this._config.timeout);\n const res = await fetch(this._config.ipApiUrl, { signal: controller.signal });\n clearTimeout(tid);\n const data = await res.json() as { ip?: string; query?: string };\n return data.ip ?? data.query ?? null;\n } catch {\n return null;\n }\n }\n\n private _fetchLocation(): Promise<JoopGeoInfo | null> {\n return new Promise(resolve => {\n if (!navigator.geolocation) { resolve(null); return; }\n navigator.geolocation.getCurrentPosition(\n pos => resolve({ latitude: pos.coords.latitude, longitude: pos.coords.longitude, accuracy: pos.coords.accuracy }),\n () => resolve(null),\n { timeout: this._config.timeout, maximumAge: 60000 },\n );\n });\n }\n}\n"]}
|
package/dist/device/index.mjs
CHANGED
|
@@ -480,6 +480,9 @@ function _urlBase64ToUint8(base64String) {
|
|
|
480
480
|
}
|
|
481
481
|
|
|
482
482
|
// src/events/index.ts
|
|
483
|
+
var _onListenerError = (error) => {
|
|
484
|
+
console.error("[joopjs] a subject subscriber threw during emission:", error);
|
|
485
|
+
};
|
|
483
486
|
var JoopSubject = class {
|
|
484
487
|
_listeners = [];
|
|
485
488
|
subscribe(listener) {
|
|
@@ -489,8 +492,13 @@ var JoopSubject = class {
|
|
|
489
492
|
};
|
|
490
493
|
}
|
|
491
494
|
next(value) {
|
|
492
|
-
|
|
493
|
-
|
|
495
|
+
const listeners = this._listeners.slice();
|
|
496
|
+
for (const listener of listeners) {
|
|
497
|
+
try {
|
|
498
|
+
listener(value);
|
|
499
|
+
} catch (error) {
|
|
500
|
+
_onListenerError(error);
|
|
501
|
+
}
|
|
494
502
|
}
|
|
495
503
|
}
|
|
496
504
|
asObservable() {
|
|
@@ -511,7 +519,11 @@ var JoopBehaviorSubject = class extends JoopSubject {
|
|
|
511
519
|
super.next(value);
|
|
512
520
|
}
|
|
513
521
|
subscribe(listener) {
|
|
514
|
-
|
|
522
|
+
try {
|
|
523
|
+
listener(this._value);
|
|
524
|
+
} catch (error) {
|
|
525
|
+
_onListenerError(error);
|
|
526
|
+
}
|
|
515
527
|
return super.subscribe(listener);
|
|
516
528
|
}
|
|
517
529
|
asObservable() {
|