joopjs 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +678 -0
- package/README.md +583 -0
- package/dist/a11y.service-C-DQQfgO.d.mts +143 -0
- package/dist/a11y.service-CauEJrJe.d.ts +143 -0
- package/dist/adapters-B6slG6hQ.d.mts +84 -0
- package/dist/adapters-B6slG6hQ.d.ts +84 -0
- package/dist/aes.service-CkoupAww.d.mts +95 -0
- package/dist/aes.service-CkoupAww.d.ts +95 -0
- package/dist/ai/index.d.mts +99 -0
- package/dist/ai/index.d.ts +99 -0
- package/dist/ai/index.js +307 -0
- package/dist/ai/index.js.map +1 -0
- package/dist/ai/index.mjs +304 -0
- package/dist/ai/index.mjs.map +1 -0
- package/dist/analytics/index.d.mts +42 -0
- package/dist/analytics/index.d.ts +42 -0
- package/dist/analytics/index.js +139 -0
- package/dist/analytics/index.js.map +1 -0
- package/dist/analytics/index.mjs +136 -0
- package/dist/analytics/index.mjs.map +1 -0
- package/dist/angular/index.d.mts +148 -0
- package/dist/angular/index.d.ts +148 -0
- package/dist/angular/index.js +122 -0
- package/dist/angular/index.js.map +1 -0
- package/dist/angular/index.mjs +101 -0
- package/dist/angular/index.mjs.map +1 -0
- package/dist/api/index.d.mts +128 -0
- package/dist/api/index.d.ts +128 -0
- package/dist/api/index.js +1358 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/index.mjs +1332 -0
- package/dist/api/index.mjs.map +1 -0
- package/dist/auth/index.d.mts +105 -0
- package/dist/auth/index.d.ts +105 -0
- package/dist/auth/index.js +989 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/index.mjs +979 -0
- package/dist/auth/index.mjs.map +1 -0
- package/dist/auth.service-DNVB-L4U.d.mts +16 -0
- package/dist/auth.service-PjUUSUIt.d.ts +16 -0
- package/dist/banking/index.d.mts +1530 -0
- package/dist/banking/index.d.ts +1530 -0
- package/dist/banking/index.js +4739 -0
- package/dist/banking/index.js.map +1 -0
- package/dist/banking/index.mjs +4661 -0
- package/dist/banking/index.mjs.map +1 -0
- package/dist/cache/index.d.mts +40 -0
- package/dist/cache/index.d.ts +40 -0
- package/dist/cache/index.js +174 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/index.mjs +172 -0
- package/dist/cache/index.mjs.map +1 -0
- package/dist/client-profile.service-BuPeXVp5.d.mts +28 -0
- package/dist/client-profile.service-D5bRRYQp.d.ts +28 -0
- package/dist/config.models-Cqg04fAQ.d.mts +84 -0
- package/dist/config.models-Cqg04fAQ.d.ts +84 -0
- package/dist/config.service-CrCvI-JS.d.ts +31 -0
- package/dist/config.service-Cz4QQLlf.d.mts +31 -0
- package/dist/core/index.d.mts +4 -0
- package/dist/core/index.d.ts +4 -0
- package/dist/core/index.js +631 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/index.mjs +619 -0
- package/dist/core/index.mjs.map +1 -0
- package/dist/crypto-utils-DriNhLdx.d.mts +30 -0
- package/dist/crypto-utils-DriNhLdx.d.ts +30 -0
- package/dist/data-storage.service-DT6xaTxE.d.ts +51 -0
- package/dist/data-storage.service-LvhGRCmw.d.mts +51 -0
- package/dist/deeplink/index.d.mts +39 -0
- package/dist/deeplink/index.d.ts +39 -0
- package/dist/deeplink/index.js +268 -0
- package/dist/deeplink/index.js.map +1 -0
- package/dist/deeplink/index.mjs +265 -0
- package/dist/deeplink/index.mjs.map +1 -0
- package/dist/deeplink.service-Ctd5u243.d.mts +35 -0
- package/dist/deeplink.service-uUuTnY9_.d.ts +35 -0
- package/dist/dev/index.d.mts +20 -0
- package/dist/dev/index.d.ts +20 -0
- package/dist/dev/index.js +51 -0
- package/dist/dev/index.js.map +1 -0
- package/dist/dev/index.mjs +49 -0
- package/dist/dev/index.mjs.map +1 -0
- package/dist/device/index.d.mts +108 -0
- package/dist/device/index.d.ts +108 -0
- package/dist/device/index.js +960 -0
- package/dist/device/index.js.map +1 -0
- package/dist/device/index.mjs +951 -0
- package/dist/device/index.mjs.map +1 -0
- package/dist/differential-privacy-BcAv1G80.d.mts +210 -0
- package/dist/differential-privacy-C8mAUjZr.d.ts +210 -0
- package/dist/encryption/index.d.mts +75 -0
- package/dist/encryption/index.d.ts +75 -0
- package/dist/encryption/index.js +605 -0
- package/dist/encryption/index.js.map +1 -0
- package/dist/encryption/index.mjs +598 -0
- package/dist/encryption/index.mjs.map +1 -0
- package/dist/form-validator-3tkmzr_o.d.mts +72 -0
- package/dist/form-validator-3tkmzr_o.d.ts +72 -0
- package/dist/forms/index.d.mts +59 -0
- package/dist/forms/index.d.ts +59 -0
- package/dist/forms/index.js +446 -0
- package/dist/forms/index.js.map +1 -0
- package/dist/forms/index.mjs +442 -0
- package/dist/forms/index.mjs.map +1 -0
- package/dist/i18n/index.d.mts +37 -0
- package/dist/i18n/index.d.ts +37 -0
- package/dist/i18n/index.js +147 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/i18n/index.mjs +145 -0
- package/dist/i18n/index.mjs.map +1 -0
- package/dist/idempotency.service-_6LqhivP.d.mts +372 -0
- package/dist/idempotency.service-eOKoISRD.d.ts +372 -0
- package/dist/index-B_ksKpS1.d.mts +202 -0
- package/dist/index-CqDKWTUP.d.mts +28 -0
- package/dist/index-CqDKWTUP.d.ts +28 -0
- package/dist/index-DFqEoX_l.d.ts +202 -0
- package/dist/index-Dz0gOur2.d.mts +36 -0
- package/dist/index-Dz0gOur2.d.ts +36 -0
- package/dist/index.d.mts +1336 -0
- package/dist/index.d.ts +1336 -0
- package/dist/index.js +19464 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +19155 -0
- package/dist/index.mjs.map +1 -0
- package/dist/india/index.d.mts +75 -0
- package/dist/india/index.d.ts +75 -0
- package/dist/india/index.js +325 -0
- package/dist/india/index.js.map +1 -0
- package/dist/india/index.mjs +303 -0
- package/dist/india/index.mjs.map +1 -0
- package/dist/joop-Bx7Iwj5p.d.mts +155 -0
- package/dist/joop-CA3DMeOO.d.ts +155 -0
- package/dist/native-bridge/index.d.mts +27 -0
- package/dist/native-bridge/index.d.ts +27 -0
- package/dist/native-bridge/index.js +98 -0
- package/dist/native-bridge/index.js.map +1 -0
- package/dist/native-bridge/index.mjs +96 -0
- package/dist/native-bridge/index.mjs.map +1 -0
- package/dist/network/index.d.mts +85 -0
- package/dist/network/index.d.ts +85 -0
- package/dist/network/index.js +454 -0
- package/dist/network/index.js.map +1 -0
- package/dist/network/index.mjs +451 -0
- package/dist/network/index.mjs.map +1 -0
- package/dist/network-monitor-BIwPSXme.d.mts +179 -0
- package/dist/network-monitor-Bqp2hvZr.d.ts +179 -0
- package/dist/notification.service-Dm4fvfZf.d.mts +25 -0
- package/dist/notification.service-tEMKatWJ.d.ts +25 -0
- package/dist/observability/index.d.mts +179 -0
- package/dist/observability/index.d.ts +179 -0
- package/dist/observability/index.js +559 -0
- package/dist/observability/index.js.map +1 -0
- package/dist/observability/index.mjs +552 -0
- package/dist/observability/index.mjs.map +1 -0
- package/dist/oidc-client-DIJcClmB.d.mts +190 -0
- package/dist/oidc-client-DxhyE59t.d.ts +190 -0
- package/dist/platform/index.d.mts +73 -0
- package/dist/platform/index.d.ts +73 -0
- package/dist/platform/index.js +127 -0
- package/dist/platform/index.js.map +1 -0
- package/dist/platform/index.mjs +125 -0
- package/dist/platform/index.mjs.map +1 -0
- package/dist/pwa/index.d.mts +31 -0
- package/dist/pwa/index.d.ts +31 -0
- package/dist/pwa/index.js +247 -0
- package/dist/pwa/index.js.map +1 -0
- package/dist/pwa/index.mjs +244 -0
- package/dist/pwa/index.mjs.map +1 -0
- package/dist/react/index.d.mts +133 -0
- package/dist/react/index.d.ts +133 -0
- package/dist/react/index.js +632 -0
- package/dist/react/index.js.map +1 -0
- package/dist/react/index.mjs +630 -0
- package/dist/react/index.mjs.map +1 -0
- package/dist/router/index.d.mts +39 -0
- package/dist/router/index.d.ts +39 -0
- package/dist/router/index.js +168 -0
- package/dist/router/index.js.map +1 -0
- package/dist/router/index.mjs +166 -0
- package/dist/router/index.mjs.map +1 -0
- package/dist/security/index.d.mts +206 -0
- package/dist/security/index.d.ts +206 -0
- package/dist/security/index.js +1297 -0
- package/dist/security/index.js.map +1 -0
- package/dist/security/index.mjs +1285 -0
- package/dist/security/index.mjs.map +1 -0
- package/dist/session/index.d.mts +115 -0
- package/dist/session/index.d.ts +115 -0
- package/dist/session/index.js +297 -0
- package/dist/session/index.js.map +1 -0
- package/dist/session/index.mjs +292 -0
- package/dist/session/index.mjs.map +1 -0
- package/dist/state/index.d.mts +43 -0
- package/dist/state/index.d.ts +43 -0
- package/dist/state/index.js +156 -0
- package/dist/state/index.js.map +1 -0
- package/dist/state/index.mjs +152 -0
- package/dist/state/index.mjs.map +1 -0
- package/dist/statement-parser-BHQtXwCM.d.ts +260 -0
- package/dist/statement-parser-C2qNmb49.d.mts +260 -0
- package/dist/storage/index.d.mts +40 -0
- package/dist/storage/index.d.ts +40 -0
- package/dist/storage/index.js +256 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/index.mjs +252 -0
- package/dist/storage/index.mjs.map +1 -0
- package/dist/sync/index.d.mts +69 -0
- package/dist/sync/index.d.ts +69 -0
- package/dist/sync/index.js +330 -0
- package/dist/sync/index.js.map +1 -0
- package/dist/sync/index.mjs +323 -0
- package/dist/sync/index.mjs.map +1 -0
- package/dist/sync-engine-DCIMRG5s.d.ts +61 -0
- package/dist/sync-engine-DZqyKHkK.d.mts +61 -0
- package/dist/theme/index.d.mts +53 -0
- package/dist/theme/index.d.ts +53 -0
- package/dist/theme/index.js +169 -0
- package/dist/theme/index.js.map +1 -0
- package/dist/theme/index.mjs +167 -0
- package/dist/theme/index.mjs.map +1 -0
- package/dist/ui/index.d.mts +66 -0
- package/dist/ui/index.d.ts +66 -0
- package/dist/ui/index.js +811 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/ui/index.mjs +803 -0
- package/dist/ui/index.mjs.map +1 -0
- package/dist/utilities/index.d.mts +199 -0
- package/dist/utilities/index.d.ts +199 -0
- package/dist/utilities/index.js +1991 -0
- package/dist/utilities/index.js.map +1 -0
- package/dist/utilities/index.mjs +1923 -0
- package/dist/utilities/index.mjs.map +1 -0
- package/dist/validation/index.d.mts +60 -0
- package/dist/validation/index.d.ts +60 -0
- package/dist/validation/index.js +460 -0
- package/dist/validation/index.js.map +1 -0
- package/dist/validation/index.mjs +455 -0
- package/dist/validation/index.mjs.map +1 -0
- package/dist/vue/index.d.mts +135 -0
- package/dist/vue/index.d.ts +135 -0
- package/dist/vue/index.js +621 -0
- package/dist/vue/index.js.map +1 -0
- package/dist/vue/index.mjs +619 -0
- package/dist/vue/index.mjs.map +1 -0
- package/dist/watermark.service-Detur5tq.d.ts +235 -0
- package/dist/watermark.service-QNegMeQZ.d.mts +235 -0
- package/dist/workers/index.d.mts +42 -0
- package/dist/workers/index.d.ts +42 -0
- package/dist/workers/index.js +359 -0
- package/dist/workers/index.js.map +1 -0
- package/dist/workers/index.mjs +356 -0
- package/dist/workers/index.mjs.map +1 -0
- package/dist/workflow/index.d.mts +99 -0
- package/dist/workflow/index.d.ts +99 -0
- package/dist/workflow/index.js +282 -0
- package/dist/workflow/index.js.map +1 -0
- package/dist/workflow/index.mjs +279 -0
- package/dist/workflow/index.mjs.map +1 -0
- package/package.json +226 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/constants/index.ts","../src/utilities/common.utility.ts","../src/core/config/config.service.ts","../src/events/index.ts","../src/core/logger/logger.service.ts","../src/core/plugin.service.ts","../src/core/environment.service.ts","../src/core/health.service.ts","../src/enums/index.ts","../src/storage/scope-map.service.ts","../src/storage/data-storage.service.ts","../src/models/error.models.ts","../src/encryption/gcm.service.ts","../src/security/secure-storage.service.ts","../src/auth/auth.service.ts","../src/auth/token.service.ts","../src/auth/pkce.service.ts","../src/auth/otp.service.ts","../src/auth/biometric.service.ts","../src/profile/client-profile.service.ts","../src/api/http/http-client.ts","../src/api/http/interceptor.ts","../src/api/http/circuit-breaker.ts","../src/api/http/offline-queue.service.ts","../src/api/http/polling.service.ts","../src/encryption/rsa.service.ts","../src/encryption/aes.service.ts","../src/encryption/x25519.service.ts","../src/api/request.service.ts","../src/session/session-timeout.service.ts","../src/session/multi-tab-sync.service.ts","../src/session/concurrent-session.service.ts","../src/observability/correlation.service.ts","../src/observability/audit-log.service.ts","../src/observability/performance.service.ts","../src/observability/error-reporter.service.ts","../src/device/device-fingerprint.service.ts","../src/dev/mock.service.ts","../src/banking/receipt.service.ts","../src/theme/theme.service.ts","../src/i18n/i18n.service.ts","../src/ui/loader.service.ts","../src/ui/alert.service.ts","../src/api/http/file-saver.service.ts","../src/native-bridge/native-bridge.service.ts","../src/deeplink/deeplink.service.ts","../src/api/response-mapper.ts","../src/cache/cache.service.ts","../src/network/websocket.service.ts","../src/analytics/analytics.service.ts","../src/banking/iban.utility.ts","../src/banking/luhn.utility.ts","../src/banking/amount.utility.ts","../src/validation/form-validator.ts","../src/core/feature-flag.service.ts","../src/auth/mfa.service.ts","../src/encryption/e2e.service.ts","../src/ui/pagination.service.ts","../src/ui/print.service.ts","../src/api/export.service.ts","../src/utilities/clipboard.utility.ts","../src/utilities/image.utility.ts","../src/storage/indexed-db.service.ts","../src/encryption/crypto-utils.ts","../src/forms/form-builder.ts","../src/core/rate-limiter.service.ts","../src/session/idle.service.ts","../src/core/consent.service.ts","../src/utilities/pdf.utility.ts","../src/utilities/notification.service.ts","../src/ui/a11y.service.ts","../src/router/router.service.ts","../src/pwa/service-worker.service.ts","../src/utilities/geo.service.ts","../src/utilities/media.service.ts","../src/ai/tool-registry.ts","../src/platform/platform.ts","../src/network/sse.service.ts","../src/security/behavioral-biometrics.ts","../src/security/risk-engine.ts","../src/workers/worker-pool.ts","../src/workers/compression.service.ts","../src/state/observable-store.ts","../src/sync/sync-engine.ts","../src/workflow/state-machine.ts","../src/workflow/workflow-engine.ts","../src/security/pii-scanner.ts","../src/security/secret-sharing.ts","../src/security/differential-privacy.ts","../src/utilities/watermark.service.ts","../src/observability/web-vitals.ts","../src/observability/session-recorder.ts","../src/api/webhook-verifier.ts","../src/api/idempotency.service.ts","../src/device/key-vault.ts","../src/device/biometric-auth.ts","../src/device/push-service.ts","../src/device/app-lifecycle.ts","../src/device/network-monitor.ts","../src/banking/fraud-detection.ts","../src/banking/open-banking.ts","../src/banking/payment-orchestrator.ts","../src/banking/statement-parser.ts","../src/joop.ts","../src/security/secure-storage.ts","../src/security/screen-security.ts","../src/security/request-signing.service.ts","../src/security/secure-clipboard.ts","../src/security/anti-tamper.service.ts","../src/security/cert-pinning.service.ts","../src/api/http/retry.ts","../src/api/http/http-client-extended.ts","../src/api/http/interceptors.ts","../src/banking/masking.utility.ts","../src/banking/custom-mask.utility.ts","../src/banking/currency.utility.ts","../src/banking/transaction.utility.ts","../src/banking/beneficiary.service.ts","../src/banking/scheduled-payment.service.ts","../src/banking/card-management.service.ts","../src/banking/statement-generator.service.ts","../src/banking/notification-center.service.ts","../src/banking/dispute.service.ts","../src/banking/bill-payment.service.ts","../src/banking/payment-uri.service.ts","../src/banking/mandate.service.ts","../src/banking/split-payment.service.ts","../src/banking/chequebook.service.ts","../src/banking/insurance.service.ts","../src/banking/remittance.service.ts","../src/banking/virtual-account.service.ts","../src/banking/ledger.service.ts","../src/banking/reconciliation.service.ts","../src/banking/limit-management.service.ts","../src/banking/standing-order.service.ts","../src/banking/loan-servicing.service.ts","../src/banking/digital-wallet.service.ts","../src/banking/fx-forward.service.ts","../src/device/card-scanner.ts","../src/ui/virtual-scroll.ts","../src/ui/banking-keyboard.ts","../src/deeplink/deeplink-router.ts","../src/validation/password-rules.ts","../src/auth/otp-timer.service.ts","../src/finance/budget.service.ts","../src/finance/savings-goal.service.ts","../src/finance/currency-exchange.service.ts","../src/finance/loan-eligibility.service.ts","../src/finance/loyalty.service.ts","../src/finance/portfolio.service.ts","../src/finance/tax-calculator.service.ts","../src/finance/interest-calculator.service.ts","../src/finance/credit-score.service.ts","../src/finance/net-worth.service.ts","../src/finance/cash-flow.service.ts","../src/utilities/device.utility.ts","../src/utilities/sanitizer.utility.ts","../src/utilities/connection.utility.ts","../src/utilities/date.utility.ts","../src/utilities/qr.utility.ts","../src/utilities/barcode.utility.ts","../src/utilities/chart-data.utility.ts","../src/utilities/qr-scanner.ts","../src/ai/ai-client.ts","../src/sync/crdt.ts","../src/auth/oidc-client.ts","../src/device/client-info.service.ts","../src/auth/sso.service.ts","../src/auth/jwt.service.ts","../src/finance/emi-calculator.ts","../src/banking/transaction-categorizer.ts","../src/events/event-bus.ts","../src/kyc/kyc-state-machine.ts","../src/security/aml.service.ts","../src/finance/mutual-fund.service.ts","../src/security/sanctions-screening.service.ts"],"names":["JoopScopeType","JoopHttpMethod","JoopLogLevel","window","encText","base64Encode","base64Decode","escape","STORAGE_KEY","e","x25519","deviceFingerprint","clipboard","crypto","JoopSecureStorage","_hmac","_uid","n","d","_round","_compilePattern","_parseQuery","_periodStart","_","MS","location","history","_advanceDate"],"mappings":"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","file":"index.mjs","sourcesContent":["export const DEFAULT_REQUEST_TIMEOUT = 30000;\nexport const DEFAULT_SESSION_TIMEOUT = 300000;\nexport const DEFAULT_SESSION_WAIT_TIMEOUT = 60000;\nexport const PAGE_TOKEN_KEY = 'pageToken';\nexport const DECRYPTION_FAILED = 'Response decryption failed';\nexport const SESSION_STORAGE_KEY = 'joopSession';\n","/** Remove a trailing slash from a URL string. */\nexport function removeTrailingSlash(url: string): string {\n return url?.endsWith('/') ? url.slice(0, -1) : url;\n}\n\n/** Serialize a plain object to a URL-encoded query string. */\nexport function objectToQueryString(obj: Record<string, any>): string {\n return Object.entries(obj)\n .filter(([, v]) => v !== undefined && v !== null)\n .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(String(v))}`)\n .join('&');\n}\n\n/** Deep-clone a JSON-serializable object. */\nexport function deepClone<T>(obj: T): T {\n return JSON.parse(JSON.stringify(obj));\n}\n\n/** Check if a value is a plain object (not an array, not null). */\nexport function isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/** Generate a random alphanumeric string of a given length. */\nexport function randomString(length: number, charset = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'): string {\n let result = '';\n for (let i = 0; i < length; i++) {\n result += charset[Math.floor(Math.random() * charset.length)];\n }\n return result;\n}\n\n/** Convert a string to its hex representation. */\nexport function stringToHex(input: string): string {\n let result = '';\n for (let i = 0; i < input.length; i++) {\n result += input.charCodeAt(i).toString(16).slice(-4);\n }\n return result;\n}\n\n/** Convert an ArrayBuffer to a lowercase hex string. */\nexport function bufferToHex(buffer: ArrayBuffer | Uint8Array): string {\n return [...new Uint8Array(buffer)]\n .map(b => b.toString(16).padStart(2, '0'))\n .join('');\n}\n\n/** Serialize a nested object into flat form-data-style string segments. */\nexport function flattenObject(obj: Record<string, any>, prefix = ''): Record<string, string> {\n const result: Record<string, string> = {};\n for (const [key, value] of Object.entries(obj)) {\n const fullKey = prefix ? `${prefix}.${key}` : key;\n if (isPlainObject(value)) {\n Object.assign(result, flattenObject(value as Record<string, any>, fullKey));\n } else {\n result[fullKey] = String(value);\n }\n }\n return result;\n}\n","import { JoopConfig, JoopApp, JoopTimeout, JoopLocalization, JoopLoggerConfig } from '../../models/config.models';\nimport { DEFAULT_REQUEST_TIMEOUT } from '../../constants';\nimport { removeTrailingSlash } from '../../utilities/common.utility';\n\nexport class JoopConfigService {\n private _config: JoopConfig | null = null;\n\n /**\n * Load config from a remote URL (e.g. config/settings.json) or use an already-resolved object.\n */\n async load(configOrUrl?: JoopConfig | string): Promise<JoopConfig> {\n if (configOrUrl && typeof configOrUrl === 'object') {\n this._config = configOrUrl;\n return this._config;\n }\n\n const url = typeof configOrUrl === 'string' ? configOrUrl : 'config/settings.json';\n const res = await fetch(url);\n if (!res.ok) throw new Error(`Failed to load config from ${url}: ${res.statusText}`);\n this._config = await res.json() as JoopConfig;\n return this._config;\n }\n\n /** Set config directly without fetching. */\n setConfig(config: JoopConfig): void {\n this._config = config;\n }\n\n /** Generic key access. */\n get<T = any>(key: string): T | undefined {\n return (this._raw as any)?.[key];\n }\n\n get app(): JoopApp {\n return this._raw.app;\n }\n\n get timeout(): JoopTimeout | undefined {\n return this._raw.timeout;\n }\n\n get requestTimeout(): number {\n return this._raw.timeout?.requestTimeout ?? DEFAULT_REQUEST_TIMEOUT;\n }\n\n get session() {\n return this._raw.timeout?.session;\n }\n\n get localization(): JoopLocalization | undefined {\n return this._raw.localization;\n }\n\n get loggerConfig(): JoopLoggerConfig | undefined {\n return this._raw.logger;\n }\n\n get isLoggerEnabled(): boolean {\n return this._raw.logger?.enable ?? false;\n }\n\n get isLoggerDateEnabled(): boolean {\n return this._raw.logger?.enableDate ?? false;\n }\n\n get loggerTypeConfig(): Record<string, boolean> {\n return (this._raw.logger?.typeConfig ?? {}) as Record<string, boolean>;\n }\n\n get logoutService(): string {\n return this._raw.app?.logoutService ?? '';\n }\n\n get ignoreServices(): string[] {\n return this._raw.timeout?.session?.ignoreServices ?? [];\n }\n\n get baseUrl(): string {\n return removeTrailingSlash(this._raw.app?.baseUrl ?? '');\n }\n\n get isDevMode(): boolean {\n return this._raw.isDevMode ?? false;\n }\n\n private get _raw(): JoopConfig {\n if (!this._config) throw new Error('JoopConfigService: config not loaded. Call load() first.');\n return this._config;\n }\n}\n\n/** Singleton config instance. */\nexport const configService = new JoopConfigService();\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 { JoopSubject } from '../../events';\nimport { JoopLogEntry, JoopLoggerOptions } from '../../models/logger.models';\nimport { JoopLoggerConfig, JoopLoggerTypeConfig } from '../../models/config.models';\n\ntype LogLevel = JoopLogEntry['level'];\n\nexport class JoopLogger {\n private readonly _logSubject = new JoopSubject<JoopLogEntry>();\n private _config: JoopLoggerConfig = { enable: false };\n\n configure(config: JoopLoggerConfig): void {\n this._config = config;\n }\n\n debug(message: any, options?: JoopLoggerOptions): void {\n this._emit('debug', message, options);\n }\n\n log(message: any, options?: JoopLoggerOptions): void {\n this._emit('log', message, options);\n }\n\n info(message: any, options?: JoopLoggerOptions): void {\n this._emit('info', message, options);\n }\n\n warn(message: any, options?: JoopLoggerOptions): void {\n this._emit('warn', message, options);\n }\n\n error(message: any, options?: JoopLoggerOptions): void {\n this._emit('error', message, options);\n }\n\n /** Subscribe to all log entries (useful for remote logging). */\n onLog(listener: (entry: JoopLogEntry) => void): () => void {\n return this._logSubject.subscribe(listener);\n }\n\n private _shouldLog(level: string): boolean {\n if (!this._config.enable) return false;\n const tc: JoopLoggerTypeConfig = this._config.typeConfig ?? {};\n return !!(tc['all'] || tc[level as keyof JoopLoggerTypeConfig]);\n }\n\n private _emit(level: LogLevel, message: any, options?: JoopLoggerOptions): void {\n if (!this._shouldLog(level)) return;\n\n const timestamp = (this._config.enableDate || options?.isDateEnabled) ? new Date().toISOString() : undefined;\n const entry: JoopLogEntry = { level, message, timestamp, component: options?.componentName };\n this._logSubject.next(entry);\n\n const prefix = [timestamp, options?.componentName].filter(Boolean).join(' ');\n const style = options?.color ? `color: ${options.color}` : '';\n const text = prefix ? `${prefix} ${this._serialize(message)}` : this._serialize(message);\n\n switch (level) {\n case 'debug': return void console.debug(`%c${text}`, style);\n case 'log': return void console.log(`%c${text}`, style);\n case 'info': return void console.info(`%c${text}`, style);\n case 'warn': return void console.warn(`%c${text}`, style);\n case 'error': return void console.error(`%c${text}`, style);\n }\n }\n\n private _serialize(message: any): string {\n if (typeof message === 'string') return message;\n try {\n return JSON.stringify(message);\n } catch {\n return String(message);\n }\n }\n}\n\n/** Singleton logger instance exported for direct use. */\nexport const logger = new JoopLogger();\n","export interface JoopPlugin {\n name: string;\n version?: string;\n install(context: Record<string, unknown>): void | Promise<void>;\n uninstall?(): void;\n}\n\nexport class JoopPluginService {\n private _plugins = new Map<string, JoopPlugin>();\n private _context: Record<string, unknown> = {};\n\n setContext(ctx: Record<string, unknown>): void {\n this._context = { ...this._context, ...ctx };\n }\n\n async use(plugin: JoopPlugin): Promise<void> {\n if (this._plugins.has(plugin.name)) {\n throw new Error(`Plugin \"${plugin.name}\" is already registered`);\n }\n await plugin.install(this._context);\n this._plugins.set(plugin.name, plugin);\n }\n\n unuse(name: string): void {\n const plugin = this._plugins.get(name);\n if (!plugin) return;\n plugin.uninstall?.();\n this._plugins.delete(name);\n }\n\n has(name: string): boolean { return this._plugins.has(name); }\n getAll(): JoopPlugin[] { return [...this._plugins.values()]; }\n\n unuseAll(): void {\n [...this._plugins.keys()].forEach(n => this.unuse(n));\n }\n}\n","export type JoopEnvironmentName = 'development' | 'staging' | 'production' | string;\n\nexport interface JoopEnvironmentProfile {\n name: JoopEnvironmentName;\n apiBaseUrl: string;\n features?: Record<string, boolean>;\n [key: string]: unknown;\n}\n\nexport class JoopEnvironmentService {\n private _current: JoopEnvironmentProfile | null = null;\n private _profiles = new Map<JoopEnvironmentName, JoopEnvironmentProfile>();\n\n register(profile: JoopEnvironmentProfile): void {\n this._profiles.set(profile.name, profile);\n }\n\n activate(name: JoopEnvironmentName): void {\n const profile = this._profiles.get(name);\n if (!profile) throw new Error(`Environment profile \"${name}\" not registered`);\n this._current = profile;\n }\n\n detect(): JoopEnvironmentName {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const nodeEnv = (typeof globalThis !== 'undefined' && (globalThis as any).process?.env?.NODE_ENV) as string | undefined;\n if (nodeEnv) return nodeEnv;\n if (typeof window !== 'undefined') {\n const host = window.location.hostname;\n if (host === 'localhost' || host === '127.0.0.1') return 'development';\n if (host.includes('staging') || host.includes('uat') || host.includes('test')) return 'staging';\n }\n return 'production';\n }\n\n get current(): JoopEnvironmentProfile {\n if (!this._current) throw new Error('No environment activated — call activate() first');\n return this._current;\n }\n\n get name(): JoopEnvironmentName { return this.current.name; }\n get apiBaseUrl(): string { return this.current.apiBaseUrl; }\n isDev(): boolean { return this.current.name === 'development'; }\n isStaging(): boolean { return this.current.name === 'staging'; }\n isProduction(): boolean { return this.current.name === 'production'; }\n isFeatureEnabled(feature: string): boolean { return this.current.features?.[feature] ?? false; }\n get<T>(key: string): T | undefined { return this.current[key] as T; }\n}\n","export interface JoopHealthCheckResult {\n name: string;\n healthy: boolean;\n latencyMs: number;\n error?: string;\n timestamp: number;\n}\n\nexport interface JoopHealthCheck {\n name: string;\n check: () => Promise<boolean>;\n timeoutMs?: number;\n}\n\nexport class JoopHealthService {\n private _checks: JoopHealthCheck[] = [];\n\n register(check: JoopHealthCheck): void { this._checks.push(check); }\n\n async runAll(): Promise<JoopHealthCheckResult[]> {\n return Promise.all(this._checks.map(c => this._run(c)));\n }\n\n async run(name: string): Promise<JoopHealthCheckResult | null> {\n const check = this._checks.find(c => c.name === name);\n return check ? this._run(check) : null;\n }\n\n async pingUrl(url: string, timeoutMs = 5_000): Promise<JoopHealthCheckResult> {\n const start = performance.now();\n try {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n const res = await fetch(url, { method: 'HEAD', signal: controller.signal });\n clearTimeout(timer);\n return { name: url, healthy: res.ok, latencyMs: Math.round(performance.now() - start), timestamp: Date.now() };\n } catch (err) {\n return {\n name: url,\n healthy: false,\n latencyMs: Math.round(performance.now() - start),\n error: err instanceof Error ? err.message : String(err),\n timestamp: Date.now(),\n };\n }\n }\n\n private async _run(check: JoopHealthCheck): Promise<JoopHealthCheckResult> {\n const start = performance.now();\n try {\n const result = await Promise.race([\n check.check(),\n new Promise<boolean>((_, reject) =>\n setTimeout(() => reject(new Error('Health check timeout')), check.timeoutMs ?? 5_000)\n ),\n ]);\n return { name: check.name, healthy: result, latencyMs: Math.round(performance.now() - start), timestamp: Date.now() };\n } catch (err) {\n return {\n name: check.name,\n healthy: false,\n latencyMs: Math.round(performance.now() - start),\n error: err instanceof Error ? err.message : String(err),\n timestamp: Date.now(),\n };\n }\n }\n}\n","export enum JoopScopeType {\n /** Application scope — lives for the lifetime of the app */\n App = 'app',\n /** Page/flow scope — cleared on page navigation */\n Page = 'page',\n /** Screen scope — cleared on screen change */\n Screen = 'screen',\n /** Session scope — maps to sessionStorage semantics */\n Session = 'session',\n}\n\nexport enum JoopHttpMethod {\n Get = 'GET',\n Post = 'POST',\n Put = 'PUT',\n Patch = 'PATCH',\n Delete = 'DELETE',\n}\n\nexport enum JoopLogLevel {\n Debug = 'debug',\n Log = 'log',\n Info = 'info',\n Warn = 'warn',\n Error = 'error',\n All = 'all',\n Off = 'off',\n}\n","import { JoopScopeType } from '../enums';\n\n/**\n * Four-scope in-memory store.\n *\n * | Scope | Lifetime |\n * |---------|--------------------------------|\n * | app | Entire app session |\n * | page | Current page / flow |\n * | screen | Current screen / component |\n * | session | Browser session (survives nav) |\n */\nexport class JoopScopeMapService {\n private _appMap: Record<string, any> = {};\n private _pageMap: Record<string, any> = {};\n private _screenMap: Record<string, any> = {};\n private _sessionMap: Record<string, any> = {};\n\n getMap(scope: JoopScopeType): Record<string, any> {\n switch (scope) {\n case JoopScopeType.App: return this._appMap;\n case JoopScopeType.Page: return this._pageMap;\n case JoopScopeType.Screen: return this._screenMap;\n case JoopScopeType.Session: return this._sessionMap;\n }\n }\n\n clearScreen(): void { this._screenMap = {}; }\n clearPage(): void { this._pageMap = {}; }\n clearSession(): void { this._sessionMap = {}; }\n clearApp(): void { this._appMap = {}; }\n\n clearAll(): void {\n this._appMap = {};\n this._pageMap = {};\n this._screenMap = {};\n this._sessionMap = {};\n }\n}\n","import { JoopBehaviorSubject, JoopObservable } from '../events';\nimport { JoopScopeType } from '../enums';\nimport { JoopScopeMapService } from './scope-map.service';\n\nexport class JoopDataStorage {\n private _menuSubject = new JoopBehaviorSubject<{ menuObj: any[] } | null>(null);\n\n constructor(private readonly _scopeMap: JoopScopeMapService) {}\n\n /** Store a value in the given scope under the given key. */\n set(scope: JoopScopeType, key: string, value: any): void {\n const map = this._scopeMap.getMap(scope);\n map[key] = value;\n }\n\n /** Retrieve a typed value from the given scope. Returns null if not found. */\n get<T>(scope: JoopScopeType, key: string): T | null {\n return this._scopeMap.getMap(scope)[key] ?? null;\n }\n\n /** Remove a single key from the given scope. */\n remove(scope: JoopScopeType, key: string): void {\n delete this._scopeMap.getMap(scope)[key];\n }\n\n /** Retrieve the entire map for a scope (reference, not clone). */\n getScope<T extends Record<string, any>>(scope: JoopScopeType): T {\n return this._scopeMap.getMap(scope) as T;\n }\n\n setMenuData(data: { menuObj: any[] }): void {\n this._menuSubject.next(data);\n }\n\n clearMenuData(): void {\n this._menuSubject.next(null);\n }\n\n menuData$(): JoopObservable<{ menuObj: any[] } | null> {\n return this._menuSubject.asObservable();\n }\n\n getMenuData(): { menuObj: any[] } | null {\n return this._menuSubject.getValue();\n }\n}\n","export type JoopErrorType = 'screen' | 'popup' | 'quiet' | 'inline';\n\nexport interface JoopError {\n status?: number;\n title?: string;\n message?: string;\n description?: string;\n icon?: string;\n style?: string;\n isTimeout?: boolean;\n type?: JoopErrorType;\n customData?: any;\n buttons?: JoopErrorButton[];\n}\n\nexport interface JoopErrorButton {\n label: string;\n action?: string;\n style?: string;\n actionData?: any;\n}\n\nexport class JoopHttpError extends Error {\n constructor(\n public readonly statusCode: number,\n public readonly statusText: string,\n public readonly body?: any\n ) {\n super(`HTTP ${statusCode}: ${statusText}`);\n this.name = 'JoopHttpError';\n }\n}\n\nexport class JoopEncryptionError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'JoopEncryptionError';\n }\n}\n","import { bufferToHex } from '../utilities/common.utility';\nimport { JoopEncryptionError } from '../models/error.models';\n\n/**\n * AES-GCM symmetric encryption / decryption.\n * Relies on the WebCrypto API (available in all modern browsers and Node 16+).\n */\nexport class JoopGcmService {\n\n async encrypt(data: string, aesKey: string): Promise<string> {\n const keyBuffer = this._keyToBuffer(aesKey);\n const iv = await this._deriveIV(aesKey, data);\n\n const cryptoKey = await crypto.subtle.importKey('raw', keyBuffer, { name: 'AES-GCM' }, false, ['encrypt']);\n const encrypted = await crypto.subtle.encrypt(\n { name: 'AES-GCM', iv: this._toSafeUint8Array(iv), tagLength: 128 },\n cryptoKey,\n new TextEncoder().encode(data)\n );\n\n const ivBytes = Array.from(iv);\n const encBytes = Array.from(new Uint8Array(encrypted));\n return bufferToHex(new Uint8Array([...ivBytes, ...encBytes]));\n }\n\n async decrypt(hexData: string, aesKey: string): Promise<string> {\n const parsedIV = hexData.substring(0, 24);\n const keyBuffer = this._keyToBuffer(aesKey);\n const iv = this._toSafeUint8Array(this._hexToUint8(parsedIV));\n const encrypted = this._toSafeUint8Array(this._hexToUint8(hexData.substring(24)));\n\n const importedKey = await crypto.subtle.importKey('raw', keyBuffer, 'AES-GCM', true, ['decrypt']);\n try {\n const plaintext = await crypto.subtle.decrypt({ name: 'AES-GCM', iv }, importedKey, encrypted);\n return new TextDecoder().decode(new Uint8Array(plaintext));\n } catch {\n throw new JoopEncryptionError('AES-GCM decryption failed — wrong key or corrupted data');\n }\n }\n\n private async _deriveIV(key: string, data: string): Promise<Uint8Array> {\n const randomData = btoa(String.fromCharCode(...Array.from(crypto.getRandomValues(new Uint8Array(12)))));\n return this._pbkdf2(key + randomData, data + Date.now().toString(), 1, 12, 'SHA-256');\n }\n\n private async _pbkdf2(message: string, salt: string, iterations: number, keyLen: number, algorithm: string): Promise<Uint8Array> {\n const enc = new TextEncoder();\n const keyMaterial = await crypto.subtle.importKey('raw', enc.encode(message), { name: 'PBKDF2' }, false, ['deriveBits']);\n const bits = await crypto.subtle.deriveBits(\n { name: 'PBKDF2', salt: enc.encode(salt), iterations, hash: algorithm },\n keyMaterial,\n keyLen * 8\n );\n return new Uint8Array(bits);\n }\n\n private _keyToBuffer(key: string): ArrayBuffer {\n const enc = new TextEncoder();\n const bytes = enc.encode(key);\n const hex = bufferToHex(bytes);\n return this._toSafeUint8Array(this._hexToUint8(hex)).buffer;\n }\n\n private _hexToUint8(hex: string): Uint8Array {\n hex = hex.replace(/^0x/, '');\n const pairs = hex.match(/[\\dA-F]{2}/gi) ?? [];\n return new Uint8Array(pairs.map(s => parseInt(s, 16)));\n }\n\n /** Copy Uint8Array into a fresh ArrayBuffer to satisfy TS5.3+ BufferSource constraints. */\n private _toSafeUint8Array(src: Uint8Array): Uint8Array<ArrayBuffer> {\n const buf = new ArrayBuffer(src.length);\n new Uint8Array(buf).set(src);\n return new Uint8Array(buf) as Uint8Array<ArrayBuffer>;\n }\n}\n","import { JoopGcmService } from '../encryption/gcm.service';\n\nexport type JoopStorageType = 'local' | 'session' | 'memory';\n\nexport class JoopSecureStorage {\n private _gcm = new JoopGcmService();\n private _mem = new Map<string, string>();\n private _key: string;\n private _type: JoopStorageType;\n\n constructor(encryptionKey: string, storageType: JoopStorageType = 'local') {\n this._key = encryptionKey;\n this._type = storageType;\n }\n\n async setItem(k: string, value: unknown): Promise<void> {\n const encrypted = await this._gcm.encrypt(JSON.stringify(value), this._key);\n this._write(k, encrypted);\n }\n\n async getItem<T>(k: string): Promise<T | null> {\n const raw = this._read(k);\n if (!raw) return null;\n try {\n const decrypted = await this._gcm.decrypt(raw, this._key);\n return JSON.parse(decrypted) as T;\n } catch {\n return null;\n }\n }\n\n removeItem(k: string): void {\n if (this._type === 'memory') { this._mem.delete(k); return; }\n this._getStorage()?.removeItem(k);\n }\n\n clear(): void {\n if (this._type === 'memory') { this._mem.clear(); return; }\n this._getStorage()?.clear();\n }\n\n private _write(k: string, val: string): void {\n if (this._type === 'memory') { this._mem.set(k, val); return; }\n this._getStorage()?.setItem(k, val);\n }\n\n private _read(k: string): string | null {\n if (this._type === 'memory') return this._mem.get(k) ?? null;\n return this._getStorage()?.getItem(k) ?? null;\n }\n\n private _getStorage(): Storage | null {\n if (this._type === 'local' && typeof localStorage !== 'undefined') return localStorage;\n if (this._type === 'session' && typeof sessionStorage !== 'undefined') return sessionStorage;\n return null;\n }\n}\n","import { JoopBehaviorSubject, JoopObservable } from '../events';\nimport { JoopDataStorage } from '../storage/data-storage.service';\n\nexport class JoopAuthService {\n private readonly _loggedIn$ = new JoopBehaviorSubject<boolean>(false);\n\n constructor(private readonly _storage: JoopDataStorage) {}\n\n setLoggedIn(isLoggedIn: boolean, menuData: { menuObj: any[] } = { menuObj: [] }): void {\n this._loggedIn$.next(isLoggedIn);\n if (isLoggedIn) {\n this._storage.setMenuData(menuData);\n } else {\n this._storage.clearMenuData();\n }\n }\n\n isLoggedIn(): boolean {\n return this._loggedIn$.getValue();\n }\n\n isLoggedIn$(): JoopObservable<boolean> {\n return this._loggedIn$.asObservable();\n }\n\n logout(): void {\n this.setLoggedIn(false);\n }\n}\n","export interface JoopTokenPayload {\n sub?: string;\n exp?: number;\n iat?: number;\n jti?: string;\n [key: string]: unknown;\n}\n\nexport class JoopTokenService {\n private _access = '';\n private _refresh = '';\n private _refreshCb: ((token: string) => Promise<string>) | null = null;\n private _timer: ReturnType<typeof setTimeout> | null = null;\n\n setTokens(accessToken: string, refreshToken: string): void {\n this._access = accessToken;\n this._refresh = refreshToken;\n this._scheduleRefresh();\n }\n\n getAccessToken(): string { return this._access; }\n getRefreshToken(): string { return this._refresh; }\n\n decode(token: string): JoopTokenPayload | null {\n try {\n const parts = token.split('.');\n if (parts.length !== 3) return null;\n const padded = parts[1].replace(/-/g, '+').replace(/_/g, '/');\n return JSON.parse(atob(padded)) as JoopTokenPayload;\n } catch {\n return null;\n }\n }\n\n isExpired(token?: string): boolean {\n const payload = this.decode(token ?? this._access);\n if (!payload?.exp) return true;\n return Date.now() >= payload.exp * 1000;\n }\n\n expiresInMs(token?: string): number {\n const payload = this.decode(token ?? this._access);\n if (!payload?.exp) return 0;\n return Math.max(0, payload.exp * 1000 - Date.now());\n }\n\n onRefreshNeeded(callback: (refreshToken: string) => Promise<string>): void {\n this._refreshCb = callback;\n }\n\n async refreshNow(): Promise<string> {\n if (!this._refreshCb) throw new Error('No refresh callback registered');\n const newToken = await this._refreshCb(this._refresh);\n this._access = newToken;\n this._scheduleRefresh();\n return newToken;\n }\n\n clear(): void {\n this._access = '';\n this._refresh = '';\n if (this._timer) clearTimeout(this._timer);\n this._timer = null;\n }\n\n private _scheduleRefresh(): void {\n if (this._timer) clearTimeout(this._timer);\n const ms = this.expiresInMs();\n const delay = ms > 30_000 ? ms - 30_000 : 0;\n if (delay > 0 && this._refreshCb) {\n this._timer = setTimeout(() => this.refreshNow().catch(() => {}), delay);\n }\n }\n}\n","export interface JoopPKCEParams {\n codeVerifier: string;\n codeChallenge: string;\n codeChallengeMethod: 'S256';\n}\n\nexport class JoopPKCEService {\n private _verifier = '';\n\n async generate(): Promise<JoopPKCEParams> {\n const array = new Uint8Array(32);\n crypto.getRandomValues(array);\n const verifier = this._base64url(array);\n this._verifier = verifier;\n\n const digest = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(verifier));\n const challenge = this._base64url(new Uint8Array(digest));\n\n return { codeVerifier: verifier, codeChallenge: challenge, codeChallengeMethod: 'S256' };\n }\n\n getVerifier(): string { return this._verifier; }\n\n generateState(): string {\n const arr = new Uint8Array(16);\n crypto.getRandomValues(arr);\n return this._base64url(arr);\n }\n\n buildAuthUrl(baseUrl: string, params: {\n clientId: string;\n redirectUri: string;\n scope: string;\n state: string;\n codeChallenge: string;\n }): string {\n const q = new URLSearchParams({\n response_type: 'code',\n client_id: params.clientId,\n redirect_uri: params.redirectUri,\n scope: params.scope,\n state: params.state,\n code_challenge: params.codeChallenge,\n code_challenge_method: 'S256',\n });\n return `${baseUrl}?${q.toString()}`;\n }\n\n private _base64url(buf: Uint8Array): string {\n return btoa(String.fromCharCode(...buf))\n .replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '');\n }\n}\n","export class JoopOtpService {\n private readonly _period = 30;\n private readonly _digits = 6;\n\n async generateTOTP(secretBase32: string, time?: number): Promise<string> {\n const key = this._base32Decode(secretBase32);\n const counter = Math.floor((time ?? Date.now()) / 1000 / this._period);\n return this._hotp(key, counter);\n }\n\n async verifyTOTP(token: string, secretBase32: string, window = 1): Promise<boolean> {\n const now = Math.floor(Date.now() / 1000 / this._period);\n for (let i = -window; i <= window; i++) {\n const expected = await this._hotp(this._base32Decode(secretBase32), now + i);\n if (expected === token) return true;\n }\n return false;\n }\n\n generateNumericOTP(length = 6): string {\n const arr = new Uint8Array(length);\n crypto.getRandomValues(arr);\n return Array.from(arr).map(b => b % 10).join('');\n }\n\n generateAlphanumericOTP(length = 8): string {\n const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';\n const arr = new Uint8Array(length);\n crypto.getRandomValues(arr);\n return Array.from(arr).map(b => chars[b % chars.length]).join('');\n }\n\n private async _hotp(key: Uint8Array, counter: number): Promise<string> {\n const buf = new ArrayBuffer(8);\n new DataView(buf).setUint32(4, counter, false);\n const safeKey = new Uint8Array(new ArrayBuffer(key.length));\n safeKey.set(key);\n const cryptoKey = await crypto.subtle.importKey('raw', safeKey, { name: 'HMAC', hash: 'SHA-1' }, false, ['sign']);\n const sig = new Uint8Array(await crypto.subtle.sign('HMAC', cryptoKey, buf));\n const offset = sig[19] & 0x0f;\n const code = ((sig[offset] & 0x7f) << 24) | (sig[offset + 1] << 16) | (sig[offset + 2] << 8) | sig[offset + 3];\n return String(code % Math.pow(10, this._digits)).padStart(this._digits, '0');\n }\n\n private _base32Decode(s: string): Uint8Array {\n const alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567';\n const clean = s.toUpperCase().replace(/=+$/, '');\n const bits = clean.split('').map(c => alphabet.indexOf(c).toString(2).padStart(5, '0')).join('');\n return new Uint8Array(bits.match(/.{8}/g)?.map(b => parseInt(b, 2)) ?? []);\n }\n}\n","export class JoopBiometricService {\n isSupported(): boolean {\n return typeof window !== 'undefined'\n && 'credentials' in navigator\n && 'PublicKeyCredential' in window;\n }\n\n async isAvailable(): Promise<boolean> {\n if (!this.isSupported()) return false;\n return PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable();\n }\n\n async register(options: {\n rpId: string;\n rpName: string;\n userId: string;\n userName: string;\n userDisplayName: string;\n challenge: ArrayBuffer;\n }): Promise<PublicKeyCredential> {\n const createOptions: PublicKeyCredentialCreationOptions = {\n challenge: options.challenge,\n rp: { id: options.rpId, name: options.rpName },\n user: {\n id: new TextEncoder().encode(options.userId),\n name: options.userName,\n displayName: options.userDisplayName,\n },\n pubKeyCredParams: [\n { alg: -7, type: 'public-key' }, // ES256\n { alg: -257, type: 'public-key' }, // RS256\n ],\n authenticatorSelection: {\n authenticatorAttachment: 'platform',\n userVerification: 'required',\n },\n timeout: 60_000,\n };\n return navigator.credentials.create({ publicKey: createOptions }) as Promise<PublicKeyCredential>;\n }\n\n async authenticate(options: {\n rpId: string;\n challenge: ArrayBuffer;\n allowCredentials?: PublicKeyCredentialDescriptor[];\n }): Promise<PublicKeyCredential> {\n const getOptions: PublicKeyCredentialRequestOptions = {\n challenge: options.challenge,\n rpId: options.rpId,\n allowCredentials: options.allowCredentials ?? [],\n userVerification: 'required',\n timeout: 60_000,\n };\n return navigator.credentials.get({ publicKey: getOptions }) as Promise<PublicKeyCredential>;\n }\n\n generateChallenge(): ArrayBuffer {\n const buf = new Uint8Array(32);\n crypto.getRandomValues(buf);\n return buf.buffer;\n }\n\n credentialIdToBase64(id: ArrayBuffer): string {\n return btoa(String.fromCharCode(...new Uint8Array(id)));\n }\n}\n","import { JoopTimeout } from '../models/config.models';\n\n/**\n * Holds runtime client-session state: language, theme, authorization tokens,\n * request metadata, and pagination state.\n * No framework coupling — instantiate directly or use the singleton.\n */\nexport class JoopClientProfile {\n language = '';\n theme = '';\n baseUrl = '';\n authToken = '';\n pageToken = '';\n isInitialRequest = true;\n currentAction = '';\n screenId = '';\n useExternalAPI = false;\n model = ''; // device model string, e.g. \"iOS 17.0\"\n\n /** Session timeout configuration, updated from server response. */\n timeoutInfo: JoopTimeout = {\n requestTimeout: 30000,\n session: {\n enable: false,\n timeout: 300000,\n waitTimeout: 60000,\n ignoreServices: [],\n },\n };\n\n /** Any extra fields the host app wants to stash on the profile. */\n extra: Record<string, any> = {};\n\n /** Reset transient per-session state (called on logout). */\n clearSession(): void {\n this.pageToken = '';\n this.isInitialRequest = true;\n this.currentAction = '';\n this.authToken = '';\n this.extra = {};\n }\n}\n\nexport const clientProfile = new JoopClientProfile();\n","import { JoopHttpError } from '../../models/error.models';\nimport { JoopHttpMethod } from '../../enums';\n\nexport interface JoopFetchOptions {\n headers?: Record<string, string>;\n body?: any;\n signal?: AbortSignal;\n timeout?: number;\n}\n\n/**\n * Thin fetch wrapper — no Angular, no RxJS.\n * Use directly or extend for request/response interceptors.\n */\nexport class JoopHttpClient {\n\n async request<T = any>(method: JoopHttpMethod, url: string, options: JoopFetchOptions = {}): Promise<T> {\n const { headers = {}, body, timeout } = options;\n\n let signal = options.signal;\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n\n if (timeout && !signal) {\n const controller = new AbortController();\n signal = controller.signal;\n timeoutId = setTimeout(() => controller.abort(), timeout);\n }\n\n const isFormData = body instanceof FormData;\n const fetchInit: RequestInit = {\n method,\n signal,\n headers: isFormData ? headers : { 'Content-Type': 'application/json', ...headers },\n body: body === undefined || body === null\n ? undefined\n : isFormData\n ? body\n : JSON.stringify(body),\n };\n\n try {\n const res = await fetch(url, fetchInit);\n if (!res.ok) {\n let errorBody: any;\n try { errorBody = await res.json(); } catch { /* ignore */ }\n throw new JoopHttpError(res.status, res.statusText, errorBody);\n }\n const text = await res.text();\n return text ? JSON.parse(text) as T : undefined as unknown as T;\n } finally {\n if (timeoutId !== undefined) clearTimeout(timeoutId);\n }\n }\n\n get<T = any>(url: string, options?: JoopFetchOptions): Promise<T> {\n return this.request<T>(JoopHttpMethod.Get, url, options);\n }\n\n post<T = any>(url: string, body?: any, options?: JoopFetchOptions): Promise<T> {\n return this.request<T>(JoopHttpMethod.Post, url, { ...options, body });\n }\n\n put<T = any>(url: string, body?: any, options?: JoopFetchOptions): Promise<T> {\n return this.request<T>(JoopHttpMethod.Put, url, { ...options, body });\n }\n\n patch<T = any>(url: string, body?: any, options?: JoopFetchOptions): Promise<T> {\n return this.request<T>(JoopHttpMethod.Patch, url, { ...options, body });\n }\n\n delete<T = any>(url: string, options?: JoopFetchOptions): Promise<T> {\n return this.request<T>(JoopHttpMethod.Delete, url, options);\n }\n\n /** Upload files with progress via XMLHttpRequest (fetch does not expose upload progress). */\n uploadWithProgress<T = any>(\n url: string,\n formData: FormData,\n onProgress: (percent: number) => void,\n headers: Record<string, string> = {}\n ): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n xhr.open('POST', url);\n Object.entries(headers).forEach(([k, v]) => xhr.setRequestHeader(k, v));\n xhr.upload.onprogress = (e) => {\n if (e.lengthComputable) onProgress(Math.round((e.loaded / e.total) * 100));\n };\n xhr.onload = () => {\n if (xhr.status >= 200 && xhr.status < 300) {\n resolve(xhr.responseText ? JSON.parse(xhr.responseText) : undefined);\n } else {\n reject(new JoopHttpError(xhr.status, xhr.statusText));\n }\n };\n xhr.onerror = () => reject(new JoopHttpError(0, 'Network error'));\n xhr.send(formData);\n });\n }\n}\n","export interface JoopRequest {\n url: string;\n method: string;\n headers: Record<string, string>;\n body?: unknown;\n [key: string]: unknown;\n}\n\nexport interface JoopResponse<T = unknown> {\n status: number;\n headers: Record<string, string>;\n data: T;\n url: string;\n}\n\nexport type JoopRequestInterceptor = (req: JoopRequest) => JoopRequest | Promise<JoopRequest>;\nexport type JoopResponseInterceptor = (res: JoopResponse) => JoopResponse | Promise<JoopResponse>;\nexport type JoopErrorInterceptor = (err: unknown) => unknown | Promise<unknown>;\n\nexport class JoopInterceptorPipeline {\n private _req: JoopRequestInterceptor[] = [];\n private _res: JoopResponseInterceptor[] = [];\n private _err: JoopErrorInterceptor[] = [];\n\n addRequestInterceptor(fn: JoopRequestInterceptor): () => void {\n this._req.push(fn);\n return () => { this._req = this._req.filter(i => i !== fn); };\n }\n\n addResponseInterceptor(fn: JoopResponseInterceptor): () => void {\n this._res.push(fn);\n return () => { this._res = this._res.filter(i => i !== fn); };\n }\n\n addErrorInterceptor(fn: JoopErrorInterceptor): () => void {\n this._err.push(fn);\n return () => { this._err = this._err.filter(i => i !== fn); };\n }\n\n async processRequest(req: JoopRequest): Promise<JoopRequest> {\n let cur = req;\n for (const fn of this._req) cur = await fn(cur);\n return cur;\n }\n\n async processResponse(res: JoopResponse): Promise<JoopResponse> {\n let cur = res;\n for (const fn of this._res) cur = await fn(cur);\n return cur;\n }\n\n async processError(err: unknown): Promise<unknown> {\n let cur = err;\n for (const fn of this._err) cur = await fn(cur);\n return cur;\n }\n\n clear(): void { this._req = []; this._res = []; this._err = []; }\n}\n","export type JoopCircuitState = 'closed' | 'open' | 'half-open';\n// Alias kept for back-compat\nexport type JoopCircuitBreakerState = JoopCircuitState;\n\nexport interface JoopCircuitBreakerConfig {\n name?: string;\n failureThreshold?: number;\n successThreshold?: number;\n timeoutMs?: number;\n volumeThreshold?: number;\n onStateChange?: (from: JoopCircuitState, to: JoopCircuitState, name: string) => void;\n}\n\nexport interface JoopCircuitBreakerStats {\n state: JoopCircuitState;\n failures: number;\n successes: number;\n totalCalls: number;\n lastFailureAt?: number;\n openedAt?: number;\n nextAttemptAt?: number;\n}\n\nexport class JoopCircuitBreakerOpenError extends Error {\n readonly nextAttemptAt: number;\n constructor(name: string, nextAttemptAt: number) {\n super(`Circuit \"${name}\" is OPEN. Retry after ${new Date(nextAttemptAt).toISOString()}`);\n this.name = 'JoopCircuitBreakerOpenError';\n this.nextAttemptAt = nextAttemptAt;\n }\n}\n\nexport class JoopCircuitBreaker {\n private readonly _name: string;\n private readonly failureThreshold: number;\n private readonly successThreshold: number;\n private readonly timeoutMs: number;\n private readonly volumeThreshold: number;\n private readonly onStateChangeFn?: JoopCircuitBreakerConfig['onStateChange'];\n\n private _state: JoopCircuitState = 'closed';\n private _failures = 0;\n private _successes = 0;\n private _totalCalls = 0;\n private _lastFailureAt?: number;\n private _openedAt?: number;\n\n constructor(nameOrConfig: string | (JoopCircuitBreakerConfig & { name: string }), config: JoopCircuitBreakerConfig = {}) {\n const merged = typeof nameOrConfig === 'string'\n ? { name: nameOrConfig, ...config }\n : { ...nameOrConfig, ...config };\n this._name = merged.name ?? 'default';\n this.failureThreshold = merged.failureThreshold ?? 5;\n this.successThreshold = merged.successThreshold ?? 2;\n this.timeoutMs = merged.timeoutMs ?? 30_000;\n this.volumeThreshold = merged.volumeThreshold ?? 1;\n this.onStateChangeFn = merged.onStateChange;\n }\n\n get state(): JoopCircuitState { return this._state; }\n get name(): string { return this._name; }\n\n private setState(to: JoopCircuitState): void {\n if (to === this._state) return;\n const from = this._state;\n this._state = to;\n if (to === 'open') this._openedAt = Date.now();\n this.onStateChangeFn?.(from, to, this._name);\n }\n\n private recordSuccess(): void {\n this._successes++;\n this._failures = 0;\n if (this._state === 'half-open' && this._successes >= this.successThreshold) {\n this._successes = 0;\n this.setState('closed');\n }\n }\n\n private recordFailure(): void {\n this._failures++;\n this._lastFailureAt = Date.now();\n this._successes = 0;\n if (this._state === 'half-open') {\n this.setState('open');\n } else if (\n this._state === 'closed' &&\n this._totalCalls >= this.volumeThreshold &&\n this._failures >= this.failureThreshold\n ) {\n this.setState('open');\n }\n }\n\n private canAttempt(): boolean {\n if (this._state !== 'open') return true;\n if (Date.now() - (this._openedAt ?? 0) >= this.timeoutMs) {\n this.setState('half-open');\n this._successes = 0;\n return true;\n }\n return false;\n }\n\n /** Primary execution method — throws JoopCircuitBreakerOpenError when open. */\n async execute<T>(fn: () => Promise<T>): Promise<T> {\n if (!this.canAttempt()) {\n throw new JoopCircuitBreakerOpenError(this._name, (this._openedAt ?? 0) + this.timeoutMs);\n }\n this._totalCalls++;\n try {\n const result = await fn();\n this.recordSuccess();\n return result;\n } catch (err) {\n this.recordFailure();\n throw err;\n }\n }\n\n /** Alias kept for back-compat with original `call()` interface. */\n async call<T>(fn: () => Promise<T>): Promise<T> { return this.execute(fn); }\n\n async executeWithFallback<T>(fn: () => Promise<T>, fallback: () => Promise<T> | T): Promise<T> {\n try { return await this.execute(fn); }\n catch { return fallback(); }\n }\n\n getState(): JoopCircuitState { return this._state; }\n\n getStats(): JoopCircuitBreakerStats {\n return {\n state: this._state,\n failures: this._failures,\n successes: this._successes,\n totalCalls: this._totalCalls,\n lastFailureAt: this._lastFailureAt,\n openedAt: this._openedAt,\n nextAttemptAt: this._openedAt ? this._openedAt + this.timeoutMs : undefined,\n };\n }\n\n reset(): void {\n this._state = 'closed';\n this._failures = 0;\n this._successes = 0;\n this._totalCalls = 0;\n this._lastFailureAt = undefined;\n this._openedAt = undefined;\n }\n\n forceOpen(): void { this.setState('open'); }\n forceClose(): void { this._failures = 0; this.setState('closed'); }\n}\n\nexport class JoopCircuitBreakerRegistry {\n private static readonly store = new Map<string, JoopCircuitBreaker>();\n\n static get(name: string, config?: JoopCircuitBreakerConfig): JoopCircuitBreaker {\n if (!this.store.has(name)) this.store.set(name, new JoopCircuitBreaker(name, config));\n return this.store.get(name)!;\n }\n\n static getAll(): Map<string, JoopCircuitBreaker> { return new Map(this.store); }\n\n static reset(name?: string): void {\n if (name) { this.store.get(name)?.reset(); }\n else { this.store.forEach(cb => cb.reset()); }\n }\n}\n","export interface JoopQueuedRequest {\n id: string;\n fn: () => Promise<unknown>;\n resolve: (v: unknown) => void;\n reject: (e: unknown) => void;\n timestamp: number;\n}\n\nexport class JoopOfflineQueue {\n private _queue: JoopQueuedRequest[] = [];\n private _online = typeof navigator !== 'undefined' ? navigator.onLine : true;\n private _draining = false;\n\n constructor() {\n if (typeof window !== 'undefined') {\n window.addEventListener('online', () => this._onOnline());\n window.addEventListener('offline', () => { this._online = false; });\n }\n }\n\n isOnline(): boolean { return this._online; }\n queueLength(): number { return this._queue.length; }\n\n enqueue<T>(fn: () => Promise<T>): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n this._queue.push({\n id: crypto.randomUUID(),\n fn: fn as () => Promise<unknown>,\n resolve: resolve as (v: unknown) => void,\n reject,\n timestamp: Date.now(),\n });\n });\n }\n\n async drainNow(): Promise<void> {\n if (this._draining) return;\n this._draining = true;\n while (this._queue.length > 0) {\n const entry = this._queue.shift()!;\n try { entry.resolve(await entry.fn()); } catch (err) { entry.reject(err); }\n }\n this._draining = false;\n }\n\n clear(): void {\n this._queue.forEach(e => e.reject(new Error('Queue cleared')));\n this._queue = [];\n }\n\n private _onOnline(): void {\n this._online = true;\n this.drainNow().catch(() => {});\n }\n}\n","import { JoopSubject } from '../../events';\n\nexport interface JoopPollConfig<T> {\n fn: () => Promise<T>;\n intervalMs: number;\n immediate?: boolean;\n stopWhen?: (result: T) => boolean;\n onError?: (err: unknown) => void;\n}\n\nexport class JoopPollingService {\n private _timers = new Map<string, ReturnType<typeof setInterval>>();\n private _subjects = new Map<string, JoopSubject<unknown>>();\n\n start<T>(id: string, config: JoopPollConfig<T>): JoopSubject<T> {\n this.stop(id);\n const subject = new JoopSubject<T>();\n this._subjects.set(id, subject as JoopSubject<unknown>);\n\n const run = async () => {\n try {\n const result = await config.fn();\n subject.next(result);\n if (config.stopWhen?.(result)) this.stop(id);\n } catch (err) {\n config.onError?.(err);\n }\n };\n\n if (config.immediate) run();\n this._timers.set(id, setInterval(run, config.intervalMs));\n return subject;\n }\n\n stop(id: string): void {\n const timer = this._timers.get(id);\n if (timer) { clearInterval(timer); this._timers.delete(id); }\n this._subjects.delete(id);\n }\n\n stopAll(): void { [...this._timers.keys()].forEach(id => this.stop(id)); }\n isPolling(id: string): boolean { return this._timers.has(id); }\n}\n","import { JoopRsaKeyPair } from '../models/api.models';\nimport { bufferToHex } from '../utilities/common.utility';\nimport { JoopEncryptionError } from '../models/error.models';\n\n/**\n * RSA-OAEP-256 encryption using the WebCrypto API.\n * Encrypts plaintext with a server-supplied public key (hex modulus + exponent).\n */\nexport class JoopRsaService {\n\n async encrypt(data: string, keys: JoopRsaKeyPair): Promise<string> {\n let { modulus, exponent } = keys;\n\n if (modulus.length === 514) {\n modulus = modulus.slice(2);\n }\n\n let encBuffer = '';\n\n try {\n const cryptoKey = await crypto.subtle.importKey(\n 'jwk',\n {\n kty: 'RSA',\n e: this._b64ToB64Url(this._hexToBase64(exponent)),\n n: this._b64ToB64Url(this._hexToBase64(modulus)),\n alg: 'RSA-OAEP-256',\n ext: true,\n },\n { name: 'RSA-OAEP', hash: { name: 'SHA-256' } },\n true,\n ['encrypt']\n );\n\n const encoded = new TextEncoder().encode(data);\n const encData = await crypto.subtle.encrypt({ name: 'RSA-OAEP' }, cryptoKey, encoded);\n encBuffer = bufferToHex(encData);\n } catch (err) {\n throw new JoopEncryptionError(`RSA-OAEP encryption failed: ${err}`);\n }\n\n return encBuffer;\n }\n\n private _hexToBase64(hex: string): string {\n return btoa(\n (hex.match(/\\w{2}/g) ?? [])\n .map(a => String.fromCodePoint(parseInt(a, 16) || 0))\n .join('')\n );\n }\n\n private _b64ToB64Url(b64: string): string {\n return b64.replaceAll('=', '').replaceAll('+', '-').replaceAll('/', '_');\n }\n}\n","import { JoopRsaKeyPair } from '../models/api.models';\nimport { randomString, stringToHex } from '../utilities/common.utility';\nimport { JoopGcmService } from './gcm.service';\nimport { JoopRsaService } from './rsa.service';\n\n/**\n * AES end-to-end encryption orchestrator.\n *\n * Supports two modes:\n * - Session mode (e2eRsaStatus = '1'): one AES key per session\n * - Request mode (e2eRsaStatus = '0'): new AES key per request\n */\nexport class JoopAesService {\n private _e2eRsaStatus = '';\n private _e2eStatus = '';\n private _modulus = '';\n private _exponent = '';\n private _random = '';\n private _genKey = '';\n private _genKeyHex = '';\n\n constructor(\n private readonly _gcm: JoopGcmService,\n private readonly _rsa: JoopRsaService\n ) {}\n\n get e2eRsaStatus(): string { return this._e2eRsaStatus; }\n set e2eRsaStatus(v: string) { this._e2eRsaStatus = v; }\n\n get e2eStatus(): string { return this._e2eStatus; }\n set e2eStatus(v: string) { this._e2eStatus = v; }\n\n get modulus(): string { return this._modulus; }\n set modulus(v: string) { this._modulus = v; }\n\n get exponent(): string { return this._exponent; }\n set exponent(v: string) { this._exponent = v; }\n\n get random(): string { return this._random; }\n set random(v: string) { this._random = v; }\n\n get genKey(): string { return this._genKey; }\n set genKey(v: string) { this._genKey = v; }\n\n /** Returns true when E2E encryption is active (not on the initial request). */\n isE2EEnabled(isInitialRequest: boolean): boolean {\n return !isInitialRequest && this._e2eStatus === '1';\n }\n\n /**\n * Encrypt serialised request data.\n * Returns an object with `encryptedText` (and optionally `pageToken` already embedded in data).\n */\n async processEncryption(serializedData: string, pageToken: string): Promise<Record<string, string>> {\n if (serializedData && pageToken) {\n serializedData = `${serializedData}&pageToken=${pageToken}`;\n }\n\n const isSessionMode = this._e2eRsaStatus === '1';\n\n if (isSessionMode) {\n if (!serializedData) return {};\n const encText = await this._gcm.encrypt(serializedData, this._genKey);\n return { encryptedText: encText };\n }\n\n // Request mode — generate a fresh AES key per request\n this._generateKey();\n const rsaEncryptedKey = await this._encryptAesKey();\n\n if (!serializedData) return { encryptedText: rsaEncryptedKey };\n const encText = await this._gcm.encrypt(serializedData, this._genKey);\n return { encryptedText: rsaEncryptedKey + encText };\n }\n\n /** Decrypt an encrypted response payload. */\n async decryptResponse(encryptedData: string): Promise<string> {\n return this._gcm.decrypt(encryptedData, this._genKey);\n }\n\n clearKeys(): void {\n this._e2eStatus = '';\n this._e2eRsaStatus = '';\n this._genKey = '';\n this._genKeyHex = '';\n this._modulus = '';\n this._exponent = '';\n this._random = '';\n }\n\n private _generateKey(): void {\n this._genKey = randomString(16, '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ');\n this._genKeyHex = stringToHex(this._genKey);\n }\n\n private _encryptAesKey(): Promise<string> {\n const keys: JoopRsaKeyPair = {\n modulus: this._modulus,\n exponent: this._exponent,\n randomNumber: this._random,\n };\n return this._rsa.encrypt(this._genKeyHex, keys);\n }\n}\n","import { encode as base64Encode, decode as base64Decode } from 'base64-arraybuffer';\nimport { x25519 } from '@noble/curves/ed25519.js';\nimport { chacha20poly1305 } from '@noble/ciphers/chacha.js';\nimport { JoopEncryptionError } from '../models/error.models';\n\n/**\n * X25519 + ChaCha20-Poly1305 end-to-end encryption.\n *\n * Protocol:\n * 1. `init()` — generates a local X25519 key pair; returns X.509 public key (base64)\n * 2. `keyExchange()`— DH with server public key + HKDF-SHA512 key derivation\n * 3. `encrypt()` — ChaCha20-Poly1305 encrypt\n * 4. `decrypt()` — ChaCha20-Poly1305 decrypt\n */\nexport class JoopX25519Service {\n private static readonly INFO_ENC_KEY = 'enc-key';\n private static readonly INFO_ENC_IV = 'enc-iv';\n private static readonly INFO_MAC_KEY = 'mac-iv';\n\n private _privateKey: Uint8Array | null = null;\n private _publicKey: Uint8Array | null = null;\n private _encKey: Uint8Array | null = null;\n private _nonce: Uint8Array | null = null;\n private _macKey: Uint8Array | null = null;\n private _ready = false;\n\n /** Generate key pair; returns base64-encoded X.509 public key to send to the server. */\n async init(): Promise<string> {\n try {\n const priv = x25519.utils.randomSecretKey();\n const pub = x25519.getPublicKey(priv);\n this._privateKey = priv;\n this._publicKey = pub;\n const x509 = this._encodeX509(pub);\n const buf = new ArrayBuffer(x509.byteLength);\n new Uint8Array(buf).set(x509);\n this._ready = true;\n return base64Encode(buf);\n } catch (err) {\n this._reset();\n throw new JoopEncryptionError(`X25519 init failed: ${err}`);\n }\n }\n\n /** Perform DH key exchange and derive ChaCha20-Poly1305 keys. */\n async keyExchange(serverPublicKeyBase64: string, serverRandomBase64: string): Promise<void> {\n this._assertReady();\n try {\n const serverPubRaw = this._base64UrlDecode(serverPublicKeyBase64);\n const serverPub = this._decodeX509(serverPubRaw);\n const salt = this._base64UrlDecode(serverRandomBase64);\n const shared = x25519.getSharedSecret(this._privateKey!, serverPub);\n\n const prk = await this._hkdfExtract(salt, shared);\n this._nonce = await this._hkdfExpand(prk, JoopX25519Service.INFO_ENC_IV, 12);\n this._encKey = await this._hkdfExpand(prk, JoopX25519Service.INFO_ENC_KEY, 32);\n this._macKey = await this._hkdfExpand(prk, JoopX25519Service.INFO_MAC_KEY, 16);\n } catch (err) {\n this._reset();\n throw new JoopEncryptionError(`Key exchange failed: ${err}`);\n }\n }\n\n async encrypt(plainText: string): Promise<string> {\n this._assertReady();\n this._assertKeysReady();\n try {\n const data = new TextEncoder().encode(plainText);\n const cipher = chacha20poly1305(this._encKey!, this._nonce!);\n const ct = cipher.encrypt(data);\n const buf = new ArrayBuffer(ct.byteLength);\n new Uint8Array(buf).set(ct);\n return base64Encode(buf);\n } catch (err) {\n throw new JoopEncryptionError(`Encryption failed: ${err}`);\n }\n }\n\n async decrypt(cipherBase64: string): Promise<string> {\n this._assertReady();\n this._assertKeysReady();\n try {\n const ct = new Uint8Array(base64Decode(cipherBase64));\n const cipher = chacha20poly1305(this._encKey!, this._nonce!);\n return new TextDecoder().decode(cipher.decrypt(ct));\n } catch (err) {\n throw new JoopEncryptionError(`Decryption failed: ${err}`);\n }\n }\n\n reset(): void { this._reset(); }\n\n // ──────────────── private helpers ────────────────\n\n private _assertReady(): void {\n if (!this._ready || !this._privateKey || !this._publicKey) {\n throw new JoopEncryptionError('X25519Service not initialised — call init() first.');\n }\n }\n\n private _assertKeysReady(): void {\n if (!this._encKey || !this._nonce || !this._macKey) {\n throw new JoopEncryptionError('X25519Service keys not derived — call keyExchange() first.');\n }\n }\n\n private _reset(): void {\n this._privateKey = this._publicKey = this._encKey = this._nonce = this._macKey = null;\n this._ready = false;\n }\n\n private _encodeX509(raw: Uint8Array): Uint8Array {\n if (raw.length !== 32) throw new JoopEncryptionError('Invalid X25519 public key length');\n const prefix = new Uint8Array([0x30, 0x2A, 0x30, 0x05, 0x06, 0x03, 0x2B, 0x65, 0x6E, 0x03, 0x21, 0x00]);\n return new Uint8Array([...prefix, ...raw]);\n }\n\n private _decodeX509(x509: Uint8Array): Uint8Array {\n if (x509.length < 44) throw new JoopEncryptionError('Invalid X.509 key format');\n return x509.slice(12);\n }\n\n private _base64UrlDecode(s: string): Uint8Array {\n let b64 = s.replaceAll('-', '+').replaceAll('_', '/');\n while (b64.length % 4 !== 0) b64 += '=';\n return new Uint8Array(base64Decode(b64));\n }\n\n private async _hkdfExtract(salt: Uint8Array, ikm: Uint8Array): Promise<Uint8Array> {\n const saltBuf = new ArrayBuffer(salt.byteLength);\n new Uint8Array(saltBuf).set(salt);\n const key = await crypto.subtle.importKey('raw', saltBuf, { name: 'HMAC', hash: 'SHA-512' }, false, ['sign']);\n const ikmBuf = new ArrayBuffer(ikm.byteLength);\n new Uint8Array(ikmBuf).set(ikm);\n return new Uint8Array(await crypto.subtle.sign('HMAC', key, ikmBuf));\n }\n\n private async _hkdfExpand(prk: Uint8Array, info: string, length: number): Promise<Uint8Array> {\n const enc = new TextEncoder();\n const infoBytes = enc.encode(info);\n const prkBuf = new ArrayBuffer(prk.byteLength);\n new Uint8Array(prkBuf).set(prk);\n const key = await crypto.subtle.importKey('raw', prkBuf, { name: 'HMAC', hash: 'SHA-512' }, false, ['sign']);\n\n let T = new Uint8Array(0);\n let output = new Uint8Array(0);\n let counter = 0;\n\n while (output.length < length) {\n counter++;\n const input = new Uint8Array([...T, ...infoBytes, counter]);\n T = new Uint8Array(await crypto.subtle.sign('HMAC', key, input));\n output = new Uint8Array([...output, ...T]);\n }\n return output.slice(0, length);\n }\n}\n","import { JoopHttpClient, JoopFetchOptions } from './http/http-client';\nimport { JoopClientProfile } from '../profile/client-profile.service';\nimport { JoopAesService } from '../encryption/aes.service';\nimport { JoopConfigService } from '../core/config/config.service';\nimport { JoopBehaviorSubject, JoopObservable } from '../events';\nimport { JoopRequestOptions } from '../models/api.models';\nimport { JoopHttpError, JoopEncryptionError } from '../models/error.models';\nimport { DECRYPTION_FAILED } from '../constants';\nimport { objectToQueryString, removeTrailingSlash } from '../utilities/common.utility';\nimport { JoopHttpMethod } from '../enums';\n\nexport type JoopLoadingState = { active: boolean; count: number };\n\n/**\n * High-level service request dispatcher.\n *\n * - Serialises request data\n * - Optionally encrypts (AES E2E)\n * - Tracks concurrent requests for loader visibility\n * - Decrypts encrypted responses\n */\nexport class JoopRequestService {\n private readonly _loading$ = new JoopBehaviorSubject<JoopLoadingState>({ active: false, count: 0 });\n private _requestCount = 0;\n\n constructor(\n private readonly _http: JoopHttpClient,\n private readonly _config: JoopConfigService,\n private readonly _profile: JoopClientProfile,\n private readonly _aes: JoopAesService\n ) {}\n\n /** Observable loading state — subscribe in any framework to drive a spinner. */\n loading$(): JoopObservable<JoopLoadingState> {\n return this._loading$.asObservable();\n }\n\n isLoading(): boolean {\n return this._loading$.getValue().active;\n }\n\n /**\n * Send a service request to the configured base URL.\n * @param serviceId Service/endpoint identifier appended to the base URL\n * @param data Request payload\n * @param options Loader, error, method overrides\n */\n async send<T = any>(serviceId: string, data: Record<string, any> = {}, options: JoopRequestOptions = {}): Promise<T> {\n const { useLoader = true, method = JoopHttpMethod.Post, headers = {} } = options;\n\n if (useLoader) this._incrementLoader();\n\n try {\n const url = this._buildUrl(serviceId);\n const body = await this._prepareBody(data);\n const fetchOpts: JoopFetchOptions = {\n headers,\n timeout: this._config.requestTimeout,\n };\n\n let response: any;\n if (method === JoopHttpMethod.Get) {\n const qs = objectToQueryString(body);\n response = await this._http.get<any>(`${url}?${qs}`, fetchOpts);\n } else {\n response = await this._http.post<any>(url, body, fetchOpts);\n }\n\n return await this._handleResponse<T>(response);\n } finally {\n if (useLoader) this._decrementLoader();\n }\n }\n\n /** Upload a file with progress. */\n async upload<T = any>(serviceId: string, formData: FormData, onProgress: (pct: number) => void): Promise<T> {\n const url = this._buildUrl(serviceId);\n this._incrementLoader();\n try {\n const res = await this._http.uploadWithProgress<any>(url, formData, onProgress);\n return await this._handleResponse<T>(res);\n } finally {\n this._decrementLoader();\n }\n }\n\n private _buildUrl(serviceId: string): string {\n const base = removeTrailingSlash(this._config.baseUrl);\n return `${base}/${serviceId}`;\n }\n\n private async _prepareBody(data: Record<string, any>): Promise<Record<string, any>> {\n if (!this._aes.isE2EEnabled(this._profile.isInitialRequest)) {\n return data;\n }\n const serialized = objectToQueryString(data);\n const encrypted = await this._aes.processEncryption(serialized, this._profile.pageToken);\n return encrypted;\n }\n\n private async _handleResponse<T>(response: any): Promise<T> {\n if (response?.encrypted && response?.encryptedData) {\n try {\n const decrypted = await this._aes.decryptResponse(response.encryptedData);\n return JSON.parse(decrypted) as T;\n } catch {\n throw new JoopEncryptionError(DECRYPTION_FAILED);\n }\n }\n return response as T;\n }\n\n private _incrementLoader(): void {\n this._requestCount++;\n this._loading$.next({ active: true, count: this._requestCount });\n }\n\n private _decrementLoader(): void {\n this._requestCount = Math.max(0, this._requestCount - 1);\n this._loading$.next({ active: this._requestCount > 0, count: this._requestCount });\n }\n}\n\n/** Convenience: catch JoopHttpError by status code. */\nexport function isHttpError(err: unknown, status?: number): err is JoopHttpError {\n return err instanceof JoopHttpError && (status === undefined || err.statusCode === status);\n}\n","import { JoopSubject, JoopObservable } from '../events';\nimport { JoopAuthService } from '../auth/auth.service';\nimport { JoopClientProfile } from '../profile/client-profile.service';\nimport { JoopAesService } from '../encryption/aes.service';\nimport { JoopScopeMapService } from '../storage/scope-map.service';\nimport { JoopScopeType } from '../enums';\nimport { SESSION_STORAGE_KEY } from '../constants';\n\ntype SessionPhase = 'idle' | 'waiting' | 'expired';\n\nexport interface JoopSessionEvent {\n type: 'warning' | 'logout';\n}\n\n/**\n * Framework-agnostic session timeout manager.\n *\n * Two-stage model:\n * 1. After `timeout` ms of inactivity → emits 'warning' event (show a dialog)\n * 2. After an additional `waitTimeout` ms → emits 'logout' event (force logout)\n *\n * The host app is responsible for showing the warning UI and calling\n * `extendSession()` if the user responds. When 'logout' fires, call `clearSession()`.\n */\nexport class JoopSessionTimeoutService {\n private readonly _event$ = new JoopSubject<JoopSessionEvent>();\n private _mainTimer: ReturnType<typeof setTimeout> | undefined;\n private _waitTimer: ReturnType<typeof setTimeout> | undefined;\n private _phase: SessionPhase = 'idle';\n private _isSessionExtended = false;\n\n constructor(\n private readonly _auth: JoopAuthService,\n private readonly _profile: JoopClientProfile,\n private readonly _aes: JoopAesService,\n private readonly _scope: JoopScopeMapService\n ) {}\n\n /** Subscribe to session events (warning / logout). */\n events$(): JoopObservable<JoopSessionEvent> {\n return this._event$.asObservable();\n }\n\n /**\n * Called after each API response to reset / start the countdown.\n * Pass the set of service IDs that should NOT reset the timer.\n */\n tick(currentServiceId: string, ignoreServices: string[] = []): void {\n const session = this._profile.timeoutInfo?.session;\n if (!session?.enable) return;\n if (!this._auth.isLoggedIn()) return;\n\n const allIgnored = [...ignoreServices];\n const shouldIgnore = allIgnored.includes(currentServiceId) && !this._isSessionExtended;\n if (shouldIgnore) return;\n\n this._isSessionExtended = false;\n this._startMainTimer(session.timeout, session.waitTimeout);\n }\n\n /** User clicked \"stay logged in\" — reset timer without counting as a new request. */\n extendSession(): void {\n this._isSessionExtended = true;\n const session = this._profile.timeoutInfo?.session;\n if (session) this._startMainTimer(session.timeout, session.waitTimeout);\n }\n\n /** Clear all timers and fully reset session state. */\n clearSession(): void {\n this._stop();\n this._profile.clearSession();\n this._aes.clearKeys();\n this._scope.clearPage();\n this._scope.clearSession();\n this._auth.logout();\n this._phase = 'idle';\n if (typeof localStorage !== 'undefined') {\n localStorage.removeItem(SESSION_STORAGE_KEY);\n }\n }\n\n // ─────────── private ───────────\n\n private _startMainTimer(timeout: number, waitTimeout: number): void {\n this._stop();\n this._phase = 'idle';\n this._mainTimer = setTimeout(() => {\n this._phase = 'waiting';\n this._event$.next({ type: 'warning' });\n this._waitTimer = setTimeout(() => {\n this._phase = 'expired';\n this._event$.next({ type: 'logout' });\n }, waitTimeout);\n }, timeout);\n }\n\n private _stop(): void {\n clearTimeout(this._mainTimer);\n clearTimeout(this._waitTimer);\n this._mainTimer = undefined;\n this._waitTimer = undefined;\n }\n\n get phase(): SessionPhase { return this._phase; }\n}\n","import { JoopSubject } from '../events';\n\nexport type JoopTabEventType = 'logout' | 'login' | 'session-warning' | 'token-refresh' | 'custom';\n\nexport interface JoopTabEvent {\n type: JoopTabEventType;\n payload?: unknown;\n sourceTabId: string;\n}\n\nexport class JoopMultiTabSync {\n private _channel: BroadcastChannel | null = null;\n private _tabId = crypto.randomUUID();\n private _subject = new JoopSubject<JoopTabEvent>();\n\n constructor(channelName = 'joop-session-sync') {\n if (typeof BroadcastChannel !== 'undefined') {\n this._channel = new BroadcastChannel(channelName);\n this._channel.onmessage = (e: MessageEvent<JoopTabEvent>) => {\n if (e.data.sourceTabId !== this._tabId) this._subject.next(e.data);\n };\n }\n }\n\n events$() { return this._subject.asObservable(); }\n get tabId(): string { return this._tabId; }\n isSupported(): boolean { return this._channel !== null; }\n\n broadcast(type: JoopTabEventType, payload?: unknown): void {\n this._channel?.postMessage({ type, payload, sourceTabId: this._tabId } satisfies JoopTabEvent);\n }\n\n destroy(): void { this._channel?.close(); this._channel = null; }\n}\n","import { JoopSubject } from '../events';\n\nexport interface JoopConcurrentSessionEvent {\n type: 'duplicate-detected' | 'heartbeat';\n sessionId: string;\n timestamp: number;\n}\n\nexport class JoopConcurrentSessionService {\n private _sessionId = crypto.randomUUID();\n private _channel: BroadcastChannel | null = null;\n private _heartbeatTimer: ReturnType<typeof setInterval> | null = null;\n private _subject = new JoopSubject<JoopConcurrentSessionEvent>();\n\n constructor(\n private readonly _channelName = 'joop-concurrent-session',\n private readonly _heartbeatMs = 5_000\n ) {}\n\n events$() { return this._subject.asObservable(); }\n get sessionId(): string { return this._sessionId; }\n\n start(): void {\n if (typeof BroadcastChannel === 'undefined') return;\n this._channel = new BroadcastChannel(this._channelName);\n this._channel.onmessage = (e: MessageEvent<JoopConcurrentSessionEvent>) => {\n if (e.data.sessionId !== this._sessionId) {\n this._subject.next({ type: 'duplicate-detected', sessionId: e.data.sessionId, timestamp: Date.now() });\n }\n };\n this._heartbeatTimer = setInterval(() => {\n this._channel?.postMessage({ type: 'heartbeat', sessionId: this._sessionId, timestamp: Date.now() });\n }, this._heartbeatMs);\n }\n\n stop(): void {\n if (this._heartbeatTimer) { clearInterval(this._heartbeatTimer); this._heartbeatTimer = null; }\n this._channel?.close();\n this._channel = null;\n }\n}\n","export class JoopCorrelationService {\n private _correlationId = '';\n private _requestId = '';\n\n newCorrelation(): string {\n this._correlationId = crypto.randomUUID();\n return this._correlationId;\n }\n\n newRequest(): string {\n this._requestId = crypto.randomUUID();\n return this._requestId;\n }\n\n getCorrelationId(): string { return this._correlationId; }\n getRequestId(): string { return this._requestId; }\n\n headers(): Record<string, string> {\n const h: Record<string, string> = {};\n if (this._correlationId) h['X-Correlation-ID'] = this._correlationId;\n if (this._requestId) h['X-Request-ID'] = this._requestId;\n return h;\n }\n\n clear(): void { this._correlationId = ''; this._requestId = ''; }\n}\n","export type JoopAuditAction =\n | 'login' | 'logout' | 'session-timeout' | 'session-extended'\n | 'transfer-initiated' | 'transfer-confirmed' | 'transfer-failed'\n | 'profile-updated' | 'password-changed' | 'settings-changed'\n | 'document-viewed' | 'statement-downloaded' | 'otp-sent' | 'otp-verified'\n | 'biometric-registered' | 'biometric-authenticated'\n | string;\n\nexport interface JoopAuditEntry {\n id: string;\n action: JoopAuditAction;\n timestamp: number;\n userId?: string;\n sessionId?: string;\n correlationId?: string;\n metadata?: Record<string, unknown>;\n success: boolean;\n}\n\nexport type JoopAuditListener = (entry: JoopAuditEntry) => void;\n\nexport class JoopAuditLog {\n private _entries: JoopAuditEntry[] = [];\n private _listeners: JoopAuditListener[] = [];\n\n constructor(private _maxEntries = 500) {}\n\n record(action: JoopAuditAction, options: {\n userId?: string;\n sessionId?: string;\n correlationId?: string;\n metadata?: Record<string, unknown>;\n success?: boolean;\n } = {}): JoopAuditEntry {\n const entry: JoopAuditEntry = {\n id: crypto.randomUUID(),\n action,\n timestamp: Date.now(),\n success: options.success ?? true,\n ...options,\n };\n this._entries.push(entry);\n if (this._entries.length > this._maxEntries) this._entries = this._entries.slice(-this._maxEntries);\n this._listeners.forEach(l => l(entry));\n return entry;\n }\n\n getAll(): JoopAuditEntry[] { return [...this._entries]; }\n getByAction(action: JoopAuditAction): JoopAuditEntry[] { return this._entries.filter(e => e.action === action); }\n getBySession(sessionId: string): JoopAuditEntry[] { return this._entries.filter(e => e.sessionId === sessionId); }\n getByUser(userId: string): JoopAuditEntry[] { return this._entries.filter(e => e.userId === userId); }\n\n onRecord(listener: JoopAuditListener): () => void {\n this._listeners.push(listener);\n return () => { this._listeners = this._listeners.filter(l => l !== listener); };\n }\n\n clear(): void { this._entries = []; }\n export(): string { return JSON.stringify(this._entries, null, 2); }\n}\n","export interface JoopPerfMark {\n name: string;\n startTime: number;\n endTime?: number;\n duration?: number;\n metadata?: Record<string, unknown>;\n}\n\nexport class JoopPerformanceService {\n private _marks = new Map<string, JoopPerfMark>();\n private _completed: JoopPerfMark[] = [];\n\n mark(name: string, metadata?: Record<string, unknown>): void {\n this._marks.set(name, { name, startTime: performance.now(), metadata });\n }\n\n measure(name: string): JoopPerfMark | null {\n const mark = this._marks.get(name);\n if (!mark) return null;\n const endTime = performance.now();\n const entry: JoopPerfMark = { ...mark, endTime, duration: endTime - mark.startTime };\n this._marks.delete(name);\n this._completed.push(entry);\n return entry;\n }\n\n async timeAsync<T>(name: string, fn: () => Promise<T>): Promise<T> {\n this.mark(name);\n try {\n const result = await fn();\n this.measure(name);\n return result;\n } catch (err) {\n this.measure(name);\n throw err;\n }\n }\n\n timeSync<T>(name: string, fn: () => T): T {\n this.mark(name);\n try {\n const result = fn();\n this.measure(name);\n return result;\n } catch (err) {\n this.measure(name);\n throw err;\n }\n }\n\n getCompleted(): JoopPerfMark[] { return [...this._completed]; }\n getByName(name: string): JoopPerfMark[] { return this._completed.filter(m => m.name === name); }\n\n getAverage(name: string): number | null {\n const entries = this._completed.filter(m => m.name === name && m.duration !== undefined);\n if (!entries.length) return null;\n return entries.reduce((sum, m) => sum + m.duration!, 0) / entries.length;\n }\n\n clear(): void { this._marks.clear(); this._completed = []; }\n}\n","export interface JoopErrorReport {\n id: string;\n message: string;\n stack?: string;\n context?: Record<string, unknown>;\n timestamp: number;\n userId?: string;\n sessionId?: string;\n}\n\nexport type JoopErrorHandler = (report: JoopErrorReport) => void | Promise<void>;\n\nexport class JoopErrorReporter {\n private _handlers: JoopErrorHandler[] = [];\n private _userId = '';\n private _sessionId = '';\n private _context: Record<string, unknown> = {};\n\n setUser(userId: string): void { this._userId = userId; }\n setSession(sessionId: string): void { this._sessionId = sessionId; }\n setContext(ctx: Record<string, unknown>): void { this._context = { ...this._context, ...ctx }; }\n\n addHandler(handler: JoopErrorHandler): () => void {\n this._handlers.push(handler);\n return () => { this._handlers = this._handlers.filter(h => h !== handler); };\n }\n\n capture(error: unknown, extra?: Record<string, unknown>): JoopErrorReport {\n const err = error instanceof Error ? error : new Error(String(error));\n const report: JoopErrorReport = {\n id: crypto.randomUUID(),\n message: err.message,\n stack: err.stack,\n context: { ...this._context, ...extra },\n timestamp: Date.now(),\n ...(this._userId ? { userId: this._userId } : {}),\n ...(this._sessionId ? { sessionId: this._sessionId } : {}),\n };\n this._handlers.forEach(h => Promise.resolve(h(report)).catch(() => {}));\n return report;\n }\n\n captureMessage(message: string, extra?: Record<string, unknown>): JoopErrorReport {\n return this.capture(new Error(message), extra);\n }\n\n clear(): void {\n this._handlers = [];\n this._userId = '';\n this._sessionId = '';\n this._context = {};\n }\n}\n","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","export interface JoopMockRoute {\n method?: string;\n url: string | RegExp;\n response: unknown;\n status?: number;\n delayMs?: number;\n}\n\nexport class JoopMockService {\n private _routes: JoopMockRoute[] = [];\n private _enabled = false;\n private _originalFetch: typeof fetch | null = null;\n\n enable(): void {\n if (this._enabled) return;\n this._enabled = true;\n this._originalFetch = globalThis.fetch;\n globalThis.fetch = this._intercept.bind(this) as typeof fetch;\n }\n\n disable(): void {\n if (!this._enabled) return;\n this._enabled = false;\n if (this._originalFetch) globalThis.fetch = this._originalFetch;\n this._originalFetch = null;\n }\n\n isEnabled(): boolean { return this._enabled; }\n\n addRoute(route: JoopMockRoute): () => void {\n this._routes.push(route);\n return () => { this._routes = this._routes.filter(r => r !== route); };\n }\n\n clearRoutes(): void { this._routes = []; }\n\n private async _intercept(input: RequestInfo | URL, init?: RequestInit): Promise<Response> {\n const url = input instanceof URL\n ? input.toString()\n : typeof input === 'string' ? input : (input as Request).url;\n const method = (init?.method ?? (input instanceof Request ? input.method : 'GET')).toUpperCase();\n\n const route = this._routes.find(r => {\n const urlMatch = r.url instanceof RegExp ? r.url.test(url) : url.includes(r.url as string);\n const methodMatch = !r.method || r.method.toUpperCase() === method;\n return urlMatch && methodMatch;\n });\n\n if (!route) return this._originalFetch!(input, init);\n if (route.delayMs) await new Promise(r => setTimeout(r, route.delayMs));\n\n return new Response(JSON.stringify(route.response), {\n status: route.status ?? 200,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n}\n","export interface JoopReceiptLine {\n label: string;\n value: string;\n bold?: boolean;\n}\n\nexport interface JoopReceiptData {\n title: string;\n referenceNumber: string;\n timestamp: string;\n lines: JoopReceiptLine[];\n footer?: string;\n}\n\nexport class JoopReceiptService {\n build(data: JoopReceiptData): JoopReceiptData { return data; }\n\n toText(data: JoopReceiptData): string {\n const div = '─'.repeat(40);\n return [\n div,\n data.title.toUpperCase().padStart(Math.ceil((40 + data.title.length) / 2)),\n div,\n `Ref : ${data.referenceNumber}`,\n `Date: ${data.timestamp}`,\n div,\n ...data.lines.map(l => l.label.padEnd(22) + l.value),\n div,\n ...(data.footer ? [data.footer] : []),\n ].join('\\n');\n }\n\n toJson(data: JoopReceiptData): string {\n return JSON.stringify(data, null, 2);\n }\n\n toHtml(data: JoopReceiptData): string {\n const rows = data.lines.map(l =>\n `<tr><td>${l.label}</td><td${l.bold ? ' style=\"font-weight:bold\"' : ''}>${l.value}</td></tr>`\n ).join('');\n return `<div class=\"joop-receipt\">\n <h2>${data.title}</h2>\n <p>Ref: ${data.referenceNumber} | ${data.timestamp}</p>\n <table>${rows}</table>${data.footer ? `\\n <p class=\"footer\">${data.footer}</p>` : ''}\n</div>`;\n }\n}\n","import { JoopBehaviorSubject } from '../events';\n\nexport interface JoopThemeColor {\n name: string;\n value: string;\n contrastText?: string;\n}\n\nexport interface JoopThemePalette {\n name: string;\n prefix: string;\n contrastPrefix?: string;\n baseColor?: string;\n colors: JoopThemeColor[];\n}\n\nexport interface JoopTheme {\n id: number;\n themeName: string;\n palettes: JoopThemePalette[];\n isDefault?: boolean;\n fontFamily?: string;\n fontSize?: string;\n}\n\nexport interface JoopThemeInfo {\n id: number;\n themeName: string;\n primary: string;\n}\n\nconst STYLE_TAG_ID = '__joop_theme__';\n\nexport class JoopThemeService {\n private _themes: JoopTheme[] = [];\n private _active$ = new JoopBehaviorSubject<string>('');\n private _id$ = new JoopBehaviorSubject<number>(0);\n\n async load(themesOrUrl: JoopTheme[] | string): Promise<JoopTheme[]> {\n if (Array.isArray(themesOrUrl)) {\n this._themes = themesOrUrl;\n } else {\n const res = await fetch(themesOrUrl);\n this._themes = await res.json();\n }\n return this._themes;\n }\n\n getAll(): JoopTheme[] { return this._themes; }\n\n getDefault(): JoopTheme | undefined {\n return this._themes.find(t => t.isDefault) ?? this._themes[0];\n }\n\n getByName(name: string): JoopTheme | undefined {\n return this._themes.find(t => t.themeName === name);\n }\n\n getById(id: number): JoopTheme | undefined {\n return this._themes.find(t => t.id === id);\n }\n\n getMapped(): JoopThemeInfo[] {\n return this._themes.map(t => ({\n id: t.id,\n themeName: t.themeName,\n primary: t.palettes.find(p => p.name === 'Primary')?.baseColor ?? '',\n }));\n }\n\n /** Inject a theme's palette as CSS custom properties on :root */\n apply(theme: JoopTheme | string): void {\n const resolved = typeof theme === 'string' ? this.getByName(theme) : theme;\n if (!resolved) return;\n\n const vars = this._buildCssVars(resolved);\n this._injectStyles(vars);\n this._active$.next(resolved.themeName);\n this._id$.next(resolved.id);\n }\n\n applyById(id: number): void {\n const theme = this.getById(id);\n if (theme) this.apply(theme);\n }\n\n applyDefault(): void {\n const theme = this.getDefault();\n if (theme) this.apply(theme);\n }\n\n /** Apply arbitrary CSS custom properties to :root */\n applyVars(vars: Record<string, string>): void {\n const css = Object.entries(vars).map(([k, v]) => ` ${k}: ${v};`).join('\\n');\n this._injectStyles(`\\n${css}\\n`);\n }\n\n getActiveName(): string { return this._active$.getValue(); }\n getActiveId(): number { return this._id$.getValue(); }\n active$() { return this._active$.asObservable(); }\n activeId$() { return this._id$.asObservable(); }\n\n clearStyles(): void {\n document.getElementById(STYLE_TAG_ID)?.remove();\n }\n\n private _buildCssVars(theme: JoopTheme): string {\n const lines: string[] = [];\n for (const palette of theme.palettes) {\n const p = palette.prefix ?? palette.name.toLowerCase().slice(0, 2);\n if (palette.baseColor) {\n lines.push(` --joop-${p}: ${palette.baseColor};`);\n }\n for (const color of palette.colors) {\n lines.push(` --joop-${p}-${color.name}: ${color.value};`);\n if (color.contrastText) {\n const cp = palette.contrastPrefix ?? `${p}-c`;\n lines.push(` --joop-${cp}-${color.name}: ${color.contrastText};`);\n }\n }\n }\n if (theme.fontFamily) lines.push(` --joop-font-family: ${theme.fontFamily};`);\n if (theme.fontSize) lines.push(` --joop-font-size: ${theme.fontSize};`);\n return lines.join('\\n');\n }\n\n private _injectStyles(vars: string): void {\n if (typeof document === 'undefined') return;\n let tag = document.getElementById(STYLE_TAG_ID) as HTMLStyleElement | null;\n if (!tag) {\n tag = document.createElement('style');\n tag.id = STYLE_TAG_ID;\n document.head.appendChild(tag);\n }\n tag.textContent = `:root {\\n${vars}\\n}`;\n }\n}\n","import { JoopBehaviorSubject } from '../events';\n\nexport type JoopDirection = 'ltr' | 'rtl';\nexport type JoopTranslations = Record<string, unknown>;\n\nexport interface JoopLanguageDetail {\n code: string;\n culture: string;\n direction: JoopDirection;\n}\n\nconst RTL_LANGUAGES = ['ar', 'arc', 'ckb', 'dv', 'fa', 'ha', 'he', 'khw', 'ks', 'ps', 'sd', 'ur', 'uz_AF', 'yi'];\n\nexport class JoopI18nService {\n private _lang$ = new JoopBehaviorSubject<string>('');\n private _culture$ = new JoopBehaviorSubject<string>('');\n private _translations: Record<string, JoopTranslations> = {};\n private _fallback = 'en';\n\n setFallback(lang: string): void { this._fallback = lang; }\n\n setLanguage(lang: string): void { this._lang$.next(lang); }\n setLanguageCulture(culture: string): void { this._culture$.next(culture); }\n\n getLanguage(): string { return this._lang$.getValue(); }\n getLanguageCulture(): string { return this._culture$.getValue(); }\n\n language$() { return this._lang$.asObservable(); }\n culture$() { return this._culture$.asObservable(); }\n\n getDirection(): JoopDirection {\n return RTL_LANGUAGES.includes(this._lang$.getValue()) ? 'rtl' : 'ltr';\n }\n\n isRtl(): boolean { return this.getDirection() === 'rtl'; }\n\n getDetails(): JoopLanguageDetail {\n return { code: this.getLanguage(), culture: this.getLanguageCulture(), direction: this.getDirection() };\n }\n\n /** Load translations for a language — merges if called multiple times */\n async loadFromUrl(lang: string, url: string): Promise<void> {\n const res = await fetch(url);\n const data = await res.json();\n this.loadFromObject(lang, data);\n }\n\n loadFromObject(lang: string, translations: JoopTranslations): void {\n this._translations[lang] = { ...(this._translations[lang] ?? {}), ...translations };\n }\n\n /** Get a translated string. Supports dot-notation keys: 'ERRORS.TITLE' */\n t(key: string, params?: Record<string, string>): string {\n const lang = this.getLanguage();\n let result = this._resolve(lang, key) ?? this._resolve(this._fallback, key) ?? key;\n if (params) {\n Object.entries(params).forEach(([k, v]) => {\n result = result.replace(new RegExp(`\\\\{\\\\{\\\\s*${k}\\\\s*\\\\}\\\\}`, 'g'), v);\n });\n }\n return result;\n }\n\n has(key: string): boolean {\n return this._resolve(this.getLanguage(), key) !== null;\n }\n\n /** Apply direction to a DOM element (defaults to document.documentElement) */\n applyDirection(el?: HTMLElement): void {\n if (typeof document === 'undefined') return;\n const target = el ?? document.documentElement;\n const dir = this.getDirection();\n target.setAttribute('dir', dir);\n target.setAttribute('lang', this.getLanguage());\n }\n\n getRtlLanguages(): string[] { return [...RTL_LANGUAGES]; }\n\n private _resolve(lang: string, key: string): string | null {\n const translations = this._translations[lang];\n if (!translations) return null;\n const parts = key.split('.');\n let current: unknown = translations;\n for (const part of parts) {\n if (current == null || typeof current !== 'object') return null;\n current = (current as Record<string, unknown>)[part];\n }\n return typeof current === 'string' ? current : null;\n }\n}\n","import { JoopBehaviorSubject } from '../events';\n\nexport interface JoopLoaderConfig {\n delayMs?: number;\n}\n\nexport class JoopLoaderService {\n private _count = 0;\n private _loading$ = new JoopBehaviorSubject<boolean>(false);\n private _delayTimer: ReturnType<typeof setTimeout> | null = null;\n private _cfg: JoopLoaderConfig;\n\n constructor(config: JoopLoaderConfig = {}) {\n this._cfg = config;\n }\n\n /** Increment loader counter — shows loader when count goes 0 → 1 */\n show(): void {\n this._count++;\n if (this._count === 1) {\n if (this._cfg.delayMs && this._cfg.delayMs > 0) {\n this._delayTimer = setTimeout(() => this._loading$.next(true), this._cfg.delayMs);\n } else {\n this._loading$.next(true);\n }\n }\n }\n\n /** Decrement loader counter — hides loader when count reaches 0 */\n hide(): void {\n if (this._count > 0) this._count--;\n if (this._count === 0) {\n if (this._delayTimer) { clearTimeout(this._delayTimer); this._delayTimer = null; }\n this._loading$.next(false);\n }\n }\n\n /** Force-show regardless of count */\n forceShow(): void {\n this._count = Math.max(this._count, 1);\n this._loading$.next(true);\n }\n\n /** Force-hide and reset counter */\n reset(): void {\n this._count = 0;\n if (this._delayTimer) { clearTimeout(this._delayTimer); this._delayTimer = null; }\n this._loading$.next(false);\n }\n\n isLoading(): boolean { return this._loading$.getValue(); }\n isLoading$() { return this._loading$.asObservable(); }\n get pendingCount(): number { return this._count; }\n}\n","import { JoopSubject, JoopBehaviorSubject } from '../events';\n\nexport type JoopAlertType = 'success' | 'error' | 'warning' | 'info';\n\nexport interface JoopToastOptions {\n type?: JoopAlertType;\n duration?: number;\n position?: 'top' | 'bottom' | 'top-right' | 'bottom-right';\n closeable?: boolean;\n}\n\nexport interface JoopDialogButton {\n label: string;\n action: string;\n style?: 'primary' | 'secondary' | 'danger';\n}\n\nexport interface JoopDialogOptions {\n title?: string;\n message: string;\n type?: JoopAlertType;\n buttons?: JoopDialogButton[];\n closeable?: boolean;\n htmlContent?: boolean;\n}\n\nexport interface JoopInlineAlert {\n message: string;\n type: JoopAlertType;\n closeable?: boolean;\n}\n\nconst COLORS: Record<JoopAlertType, { bg: string; border: string; icon: string }> = {\n success: { bg: '#d4edda', border: '#28a745', icon: '✓' },\n error: { bg: '#f8d7da', border: '#dc3545', icon: '✕' },\n warning: { bg: '#fff3cd', border: '#ffc107', icon: '⚠' },\n info: { bg: '#d1ecf1', border: '#17a2b8', icon: 'ℹ' },\n};\n\nconst TOAST_CONTAINER_ID = '__joop_toast_container__';\nconst OVERLAY_ID = '__joop_dialog_overlay__';\n\nexport class JoopAlertService {\n private _inline$ = new JoopBehaviorSubject<JoopInlineAlert | null>(null);\n private _open$ = new JoopSubject<string>();\n\n inline$() { return this._inline$.asObservable(); }\n open$() { return this._open$.asObservable(); }\n\n showInline(data: JoopInlineAlert): void { this._inline$.next(data); }\n hideInline(): void { this._inline$.next(null); }\n\n toast(message: string, options: JoopToastOptions = {}): void {\n if (typeof document === 'undefined') return;\n const { type = 'info', duration = 3000, position = 'bottom', closeable = false } = options;\n const c = COLORS[type];\n\n const container = this._getToastContainer(position);\n const toast = document.createElement('div');\n toast.setAttribute('role', 'alert');\n Object.assign(toast.style, {\n background: c.bg,\n borderLeft: `4px solid ${c.border}`,\n padding: '12px 16px',\n marginBottom: '8px',\n borderRadius: '4px',\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n boxShadow: '0 2px 8px rgba(0,0,0,0.15)',\n fontSize: '14px',\n maxWidth: '320px',\n opacity: '0',\n transition: 'opacity 0.2s ease',\n cursor: closeable ? 'pointer' : 'default',\n });\n\n const icon = document.createElement('span');\n icon.textContent = c.icon;\n icon.style.fontWeight = 'bold';\n\n const text = document.createElement('span');\n text.textContent = message;\n text.style.flex = '1';\n\n toast.appendChild(icon);\n toast.appendChild(text);\n\n if (closeable) {\n const btn = document.createElement('button');\n btn.textContent = '×';\n Object.assign(btn.style, { background: 'none', border: 'none', cursor: 'pointer', fontSize: '16px', padding: '0 4px' });\n btn.onclick = () => this._removeToast(toast);\n toast.appendChild(btn);\n }\n\n container.appendChild(toast);\n requestAnimationFrame(() => { toast.style.opacity = '1'; });\n\n if (duration > 0) {\n setTimeout(() => this._removeToast(toast), duration);\n }\n\n this._open$.next('toast');\n }\n\n dialog(options: JoopDialogOptions): Promise<string> {\n return new Promise(resolve => {\n if (typeof document === 'undefined') { resolve('close'); return; }\n\n const { title, message, type = 'info', closeable = true, htmlContent = false } = options;\n const buttons: JoopDialogButton[] = options.buttons ?? [{ label: 'OK', action: 'ok', style: 'primary' }];\n const c = COLORS[type];\n\n const overlay = document.createElement('div');\n overlay.id = OVERLAY_ID;\n Object.assign(overlay.style, {\n position: 'fixed', inset: '0', background: 'rgba(0,0,0,0.5)',\n display: 'flex', alignItems: 'center', justifyContent: 'center', zIndex: '99999',\n });\n\n const dialog = document.createElement('div');\n Object.assign(dialog.style, {\n background: '#fff', borderRadius: '8px', padding: '24px', minWidth: '280px', maxWidth: '480px',\n boxShadow: '0 8px 24px rgba(0,0,0,0.2)', position: 'relative',\n });\n\n if (title) {\n const h = document.createElement('h3');\n h.textContent = title;\n Object.assign(h.style, { margin: '0 0 12px', fontSize: '18px', color: c.border });\n dialog.appendChild(h);\n }\n\n const msg = document.createElement('div');\n if (htmlContent) { msg.innerHTML = message; } else { msg.textContent = message; }\n Object.assign(msg.style, { marginBottom: '20px', fontSize: '14px', lineHeight: '1.5' });\n dialog.appendChild(msg);\n\n const btnRow = document.createElement('div');\n Object.assign(btnRow.style, { display: 'flex', gap: '8px', justifyContent: 'flex-end' });\n\n const finish = (action: string) => { overlay.remove(); resolve(action); };\n\n for (const btn of buttons) {\n const el = document.createElement('button');\n el.textContent = btn.label;\n const isPrimary = btn.style === 'primary';\n const isDanger = btn.style === 'danger';\n Object.assign(el.style, {\n padding: '8px 16px', borderRadius: '4px', cursor: 'pointer', fontSize: '14px',\n border: 'none',\n background: isDanger ? '#dc3545' : isPrimary ? c.border : '#e9ecef',\n color: isPrimary || isDanger ? '#fff' : '#333',\n });\n el.onclick = () => finish(btn.action);\n btnRow.appendChild(el);\n }\n dialog.appendChild(btnRow);\n\n if (closeable) {\n const closeBtn = document.createElement('button');\n closeBtn.textContent = '×';\n Object.assign(closeBtn.style, {\n position: 'absolute', top: '12px', right: '16px', background: 'none', border: 'none',\n cursor: 'pointer', fontSize: '20px', color: '#666',\n });\n closeBtn.onclick = () => finish('close');\n overlay.addEventListener('click', (e) => { if (e.target === overlay) finish('close'); });\n dialog.appendChild(closeBtn);\n }\n\n overlay.appendChild(dialog);\n document.body.appendChild(overlay);\n this._open$.next('dialog');\n });\n }\n\n dismiss(): void {\n document.getElementById(OVERLAY_ID)?.remove();\n document.getElementById(TOAST_CONTAINER_ID)?.remove();\n this._inline$.next(null);\n }\n\n private _getToastContainer(position: string): HTMLElement {\n const existing = document.getElementById(TOAST_CONTAINER_ID);\n if (existing) return existing;\n const container = document.createElement('div');\n container.id = TOAST_CONTAINER_ID;\n const top = position.startsWith('top');\n const right = position.endsWith('right');\n Object.assign(container.style, {\n position: 'fixed',\n [top ? 'top' : 'bottom']: '16px',\n [right ? 'right' : 'left']: right ? '16px' : '50%',\n transform: right ? 'none' : 'translateX(-50%)',\n zIndex: '99998',\n display: 'flex',\n flexDirection: top ? 'column' : 'column-reverse',\n alignItems: right ? 'flex-end' : 'center',\n });\n document.body.appendChild(container);\n return container;\n }\n\n private _removeToast(el: HTMLElement): void {\n el.style.opacity = '0';\n setTimeout(() => el.remove(), 200);\n }\n}\n","export interface JoopDownloadOptions {\n method?: 'GET' | 'POST';\n headers?: Record<string, string>;\n body?: string | FormData;\n iosHandlerName?: string;\n}\n\nexport const IOS_WEBVIEW_MIME: Record<string, string> = {\n xls: 'data:application/xls;base64,',\n csv: 'data:text/xml;base64,',\n pdf: 'data:application/pdf;base64,',\n xlsx: 'data:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;base64,',\n doc: 'data:application/msword;base64,',\n docx: 'data:application/vnd.openxmlformats-officedocument.wordprocessingml.document;base64,',\n};\n\nconst MIME_TYPES: Record<string, string> = {\n txt: 'text/plain', pdf: 'application/pdf', csv: 'text/csv',\n xls: 'application/vnd.ms-excel',\n xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n doc: 'application/msword',\n docx: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n png: 'image/png', jpg: 'image/jpeg', jpeg: 'image/jpeg', gif: 'image/gif',\n};\n\nexport class JoopFileSaverService {\n isIosWebView(handlerName = 'mxDownloadPdf'): boolean {\n return !!(window as Record<string, any>)?.['webkit']?.['messageHandlers']?.[handlerName];\n }\n\n async download(url: string, options: JoopDownloadOptions = {}): Promise<void> {\n const res = await fetch(url, {\n method: options.method ?? 'GET',\n headers: options.headers,\n body: options.body,\n });\n\n if (!res.ok) throw new Error(`Download failed: ${res.status}`);\n\n const blob = await res.blob();\n const fileName = this._fileNameFromHeaders(res.headers) ?? 'download';\n\n if (options.iosHandlerName && this.isIosWebView(options.iosHandlerName)) {\n await this._sendToIos(blob, fileName, options.iosHandlerName);\n } else {\n this.saveBlob(blob, fileName);\n }\n }\n\n saveBlob(blob: Blob, fileName: string): void {\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = fileName;\n a.style.display = 'none';\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n setTimeout(() => URL.revokeObjectURL(url), 5000);\n }\n\n blobToBase64(blob: Blob): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => resolve(reader.result as string);\n reader.onerror = reject;\n reader.readAsDataURL(blob);\n });\n }\n\n getMimeType(fileName: string): string {\n const ext = fileName.split('.').pop()?.toLowerCase() ?? '';\n return MIME_TYPES[ext] ?? 'application/octet-stream';\n }\n\n typedBlob(blob: Blob, fileName: string): Blob {\n return new Blob([blob], { type: this.getMimeType(fileName) });\n }\n\n private async _sendToIos(blob: Blob, fileName: string, handlerName: string): Promise<void> {\n const ext = fileName.split('.').pop()?.toLowerCase() ?? '';\n const prefix = IOS_WEBVIEW_MIME[ext] ?? '';\n const base64 = await this.blobToBase64(blob);\n const parts = base64.split('base64,');\n const payload = prefix + (parts.length > 1 ? parts[1] : parts[0]);\n (window as Record<string, any>)['webkit']['messageHandlers'][handlerName].postMessage(payload);\n }\n\n private _fileNameFromHeaders(headers: Headers): string | null {\n const cd = headers.get('Content-Disposition') ?? '';\n const match = /filename=([^;]+)/i.exec(cd);\n return match ? match[1].trim().replace(/['\"]/g, '') : null;\n }\n}\n","import { JoopSubject } from '../events';\n\nexport interface JoopNativeMessage {\n type: string;\n data?: unknown;\n}\n\nexport type JoopNativeMessageHandler = (data: unknown) => void;\n\nexport class JoopNativeBridgeService {\n private _subject = new JoopSubject<JoopNativeMessage>();\n private _allowedOrigins: string[] = [];\n\n constructor(allowedOrigins: string[] = []) {\n this._allowedOrigins = allowedOrigins;\n }\n\n /** Subscribe to native messages of a specific type */\n onMessage(type: string): { subscribe: (handler: JoopNativeMessageHandler) => () => void } {\n return {\n subscribe: (handler) =>\n this._subject.subscribe(msg => {\n if (msg.type === type) handler(msg.data);\n }),\n };\n }\n\n /** Send a message to native iOS/Android via WebView bridge */\n sendToNative(target: string, method: string, data: unknown): void {\n const win = window as Record<string, any>;\n // iOS webkit message handler\n if (win['webkit']?.['messageHandlers']?.[target]) {\n win['webkit']['messageHandlers'][target].postMessage({ method, data });\n return;\n }\n // Android JS interface\n if (typeof win[target]?.[method] === 'function') {\n win[target][method](typeof data === 'string' ? data : JSON.stringify(data));\n return;\n }\n // Fallback: document.location.href for older Android bridges\n if (typeof document !== 'undefined') {\n document.location.href = `${target}://${method}?data=${encodeURIComponent(JSON.stringify(data))}`;\n }\n }\n\n /** Dispatch an incoming message from native to all subscribers */\n dispatch(message: JoopNativeMessage): void {\n this._subject.next(message);\n }\n\n /** Set up a window.postMessage listener with origin validation */\n startListening(): () => void {\n const handler = (event: MessageEvent) => {\n if (this._allowedOrigins.length > 0 && !this._allowedOrigins.includes(event.origin)) return;\n try {\n const msg: JoopNativeMessage = typeof event.data === 'string' ? JSON.parse(event.data) : event.data;\n if (msg?.type) this._subject.next(msg);\n } catch { /* ignore malformed messages */ }\n };\n window.addEventListener('message', handler);\n return () => window.removeEventListener('message', handler);\n }\n\n /** Observable stream of all native messages */\n allMessages$() { return this._subject.asObservable(); }\n\n destroy(): void { this._subject['_listeners'] = []; }\n}\n","import { JoopSubject, JoopBehaviorSubject } from '../events';\n\nexport interface JoopDeeplinkData {\n module: string;\n data?: string;\n timestamp: number;\n}\n\nconst STORAGE_KEY = '__joop_deeplink__';\n\nexport class JoopDeeplinkService {\n private _close$ = new JoopSubject<boolean>();\n private _incoming$ = new JoopSubject<JoopDeeplinkData>();\n private _module$ = new JoopBehaviorSubject<string>('');\n private _unlisten: (() => void) | null = null;\n\n getModule(): string { return this._module$.getValue(); }\n module$() { return this._module$.asObservable(); }\n close$() { return this._close$.asObservable(); }\n incoming$() { return this._incoming$.asObservable(); }\n\n /**\n * Set the deeplink module + data, broadcast via localStorage, then signal tab close.\n * Returns a Promise that resolves when the current tab is done.\n */\n setModule(module: string, data?: string): Promise<JoopDeeplinkData> {\n const payload: JoopDeeplinkData = { module, data, timestamp: Date.now() };\n this._module$.next(module);\n\n if (typeof localStorage !== 'undefined') {\n localStorage.setItem(STORAGE_KEY, JSON.stringify(payload));\n // remove immediately so storage event fires on every call\n localStorage.removeItem(STORAGE_KEY);\n }\n\n this._close$.next(true);\n\n return new Promise(resolve => {\n const unsub = this._incoming$.subscribe(d => {\n unsub();\n resolve(d);\n });\n setTimeout(() => { unsub(); resolve(payload); }, 2000);\n });\n }\n\n /**\n * Start listening for deeplink data from another tab via storage events.\n * Returns a cleanup function.\n */\n startListening(storageKey = STORAGE_KEY): () => void {\n if (typeof window === 'undefined') return () => {};\n const handler = (event: StorageEvent) => {\n if (event.key !== storageKey || !event.newValue) return;\n try {\n const data: JoopDeeplinkData = JSON.parse(event.newValue);\n this._module$.next(data.module);\n this._incoming$.next(data);\n } catch { /* ignore */ }\n };\n window.addEventListener('storage', handler);\n this._unlisten = () => window.removeEventListener('storage', handler);\n return this._unlisten;\n }\n\n stopListening(): void {\n this._unlisten?.();\n this._unlisten = null;\n }\n\n /** Signal this tab should close (without deeplink) */\n requestClose(): void { this._close$.next(false); }\n\n /** Read deeplink payload written by another tab on this page load */\n readIncoming(storageKey = STORAGE_KEY): JoopDeeplinkData | null {\n if (typeof localStorage === 'undefined') return null;\n try {\n const raw = localStorage.getItem(storageKey);\n return raw ? JSON.parse(raw) : null;\n } catch { return null; }\n }\n\n clearStored(storageKey = STORAGE_KEY): void {\n if (typeof localStorage !== 'undefined') localStorage.removeItem(storageKey);\n }\n}\n","export interface JoopRawComponent6 {\n compKey: string;\n compValue: string;\n}\n\nexport interface JoopRawResponse6 {\n scrId?: string;\n scrid?: string;\n compDet?: JoopRawComponent6[];\n segments?: string;\n mxenc?: string;\n mxencres?: string;\n errorCode?: string;\n errorDesc?: string;\n}\n\nexport interface JoopRawResponse {\n scrid?: string;\n segments?: string;\n mxenc?: string;\n mxencres?: string;\n components?: Record<string, string>;\n errorCode?: string;\n errorDesc?: string;\n}\n\nexport interface JoopMappedComponent {\n key: string;\n value: string;\n scope: string;\n dataKey: string;\n}\n\nexport interface JoopMappedResponse {\n scrid: string;\n segments: string;\n mxenc: string;\n mxencres: string;\n components: Record<string, string>;\n componentList: JoopMappedComponent[];\n errorCode?: string;\n errorDesc?: string;\n hasError: boolean;\n}\n\nconst SCOPE_PREFIXES: Record<string, string> = {\n M: 'M', O: 'O', N: 'N', S: 'S',\n};\n\nexport class JoopResponseMapper {\n /** Normalize a v6 or v7+ raw API response into a typed mapped response */\n map(raw: JoopRawResponse | JoopRawResponse6): JoopMappedResponse {\n const v7 = this._isV7(raw) ? raw as JoopRawResponse : this._convertV6ToV7(raw as JoopRawResponse6);\n\n const components = v7.components ?? {};\n const componentList = Object.entries(components).map(([key, value]) => ({\n key,\n value,\n scope: this.extractScope(key),\n dataKey: this.extractDataKey(key),\n }));\n\n return {\n scrid: v7.scrid ?? '',\n segments: v7.segments ?? '',\n mxenc: v7.mxenc ?? '',\n mxencres: v7.mxencres ?? '',\n components,\n componentList,\n errorCode: v7.errorCode,\n errorDesc: v7.errorDesc,\n hasError: !!(v7.errorCode && v7.errorCode !== '0' && v7.errorCode !== ''),\n };\n }\n\n /** Extract scope prefix from a component key (first char: M/O/N/S) */\n extractScope(key: string): string {\n const first = key.charAt(0).toUpperCase();\n return SCOPE_PREFIXES[first] ?? 'M';\n }\n\n /** Extract data key portion (everything after the first character) */\n extractDataKey(key: string): string {\n return key.length > 1 ? key.slice(1) : key;\n }\n\n /**\n * Build a property map from component list — groups by scope prefix.\n * e.g. \"MUserName\" → { scope: 'M', dataKey: 'UserName', value: '...' }\n */\n buildScopedMap(response: JoopMappedResponse): Record<string, Record<string, string>> {\n const result: Record<string, Record<string, string>> = {};\n for (const comp of response.componentList) {\n if (!result[comp.scope]) result[comp.scope] = {};\n result[comp.scope][comp.dataKey] = comp.value;\n }\n return result;\n }\n\n /** Get a single component value from a mapped response */\n getComponent(response: JoopMappedResponse, key: string): string | null {\n return response.components[key] ?? null;\n }\n\n /** Check if the raw payload looks like a v7+ response (has 'components' key) */\n private _isV7(raw: JoopRawResponse | JoopRawResponse6): boolean {\n return 'components' in raw && raw.components != null;\n }\n\n private _convertV6ToV7(raw: JoopRawResponse6): JoopRawResponse {\n const components: Record<string, string> = {};\n for (const item of raw.compDet ?? []) {\n if (item.compKey) components[item.compKey] = item.compValue ?? '';\n }\n return {\n scrid: raw.scrid ?? raw.scrId,\n segments: raw.segments,\n mxenc: raw.mxenc,\n mxencres: raw.mxencres,\n components,\n errorCode: raw.errorCode,\n errorDesc: raw.errorDesc,\n };\n }\n}\n","import { JoopBehaviorSubject } from '../events';\n\nexport interface JoopCacheOptions {\n ttlMs?: number;\n maxSize?: number;\n}\n\ninterface CacheEntry<T> {\n value: T;\n expiresAt: number;\n createdAt: number;\n hits: number;\n}\n\nexport class JoopCacheService {\n private _store = new Map<string, CacheEntry<unknown>>();\n private _defaultTtl: number;\n private _maxSize: number;\n private _hits$ = new JoopBehaviorSubject<number>(0);\n private _totalHits = 0;\n\n constructor(options: JoopCacheOptions = {}) {\n this._defaultTtl = options.ttlMs ?? 5 * 60 * 1000; // 5 min default\n this._maxSize = options.maxSize ?? 500;\n }\n\n set<T>(key: string, value: T, ttlMs?: number): void {\n if (this._store.size >= this._maxSize && !this._store.has(key)) {\n this._evictOldest();\n }\n this._store.set(key, {\n value,\n expiresAt: Date.now() + (ttlMs ?? this._defaultTtl),\n createdAt: Date.now(),\n hits: 0,\n });\n }\n\n get<T>(key: string): T | null {\n const entry = this._store.get(key) as CacheEntry<T> | undefined;\n if (!entry) return null;\n if (Date.now() > entry.expiresAt) { this._store.delete(key); return null; }\n entry.hits++;\n this._totalHits++;\n this._hits$.next(this._totalHits);\n return entry.value;\n }\n\n has(key: string): boolean {\n const entry = this._store.get(key);\n if (!entry) return false;\n if (Date.now() > entry.expiresAt) { this._store.delete(key); return false; }\n return true;\n }\n\n delete(key: string): boolean { return this._store.delete(key); }\n\n clear(): void { this._store.clear(); }\n\n /** Return cached value or compute+store it */\n async getOrSet<T>(key: string, factory: () => T | Promise<T>, ttlMs?: number): Promise<T> {\n const cached = this.get<T>(key);\n if (cached !== null) return cached;\n const value = await factory();\n this.set(key, value, ttlMs);\n return value;\n }\n\n /** Remove all expired entries and return count removed */\n prune(): number {\n const now = Date.now();\n let removed = 0;\n for (const [k, v] of this._store) {\n if (now > v.expiresAt) { this._store.delete(k); removed++; }\n }\n return removed;\n }\n\n /** Return remaining TTL in ms for a key, or -1 if missing/expired */\n ttl(key: string): number {\n const entry = this._store.get(key);\n if (!entry) return -1;\n const remaining = entry.expiresAt - Date.now();\n return remaining > 0 ? remaining : -1;\n }\n\n /** Extend TTL of an existing entry */\n extend(key: string, ttlMs: number): boolean {\n const entry = this._store.get(key);\n if (!entry || Date.now() > entry.expiresAt) return false;\n entry.expiresAt = Date.now() + ttlMs;\n return true;\n }\n\n size(): number { return this._store.size; }\n keys(): string[] { return [...this._store.keys()]; }\n hits$() { return this._hits$.asObservable(); }\n totalHits(): number { return this._totalHits; }\n\n stats(): { size: number; maxSize: number; totalHits: number; defaultTtlMs: number } {\n return { size: this._store.size, maxSize: this._maxSize, totalHits: this._totalHits, defaultTtlMs: this._defaultTtl };\n }\n\n private _evictOldest(): void {\n let oldestKey = '';\n let oldestTime = Infinity;\n for (const [k, v] of this._store) {\n if (v.createdAt < oldestTime) { oldestTime = v.createdAt; oldestKey = k; }\n }\n if (oldestKey) this._store.delete(oldestKey);\n }\n}\n","import { JoopSubject, JoopBehaviorSubject } from '../events';\n\nexport type JoopWsState = 'connecting' | 'open' | 'closing' | 'closed';\n\nexport interface JoopWsMessage {\n type?: string;\n data?: unknown;\n raw?: unknown;\n}\n\nexport interface JoopWsConfig {\n reconnectMs?: number;\n maxReconnects?: number;\n pingIntervalMs?: number;\n pingMessage?: string;\n}\n\nexport class JoopWebSocketService {\n private _ws: WebSocket | null = null;\n private _url = '';\n private _protocols?: string | string[];\n private _state$ = new JoopBehaviorSubject<JoopWsState>('closed');\n private _message$ = new JoopSubject<JoopWsMessage>();\n private _error$ = new JoopSubject<Event>();\n private _reconnects = 0;\n private _reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private _pingTimer: ReturnType<typeof setInterval> | null = null;\n private _queue: string[] = [];\n private _cfg: Required<JoopWsConfig>;\n\n constructor(config: JoopWsConfig = {}) {\n this._cfg = {\n reconnectMs: config.reconnectMs ?? 3000,\n maxReconnects: config.maxReconnects ?? 5,\n pingIntervalMs: config.pingIntervalMs ?? 0,\n pingMessage: config.pingMessage ?? '{\"type\":\"ping\"}',\n };\n }\n\n connect(url: string, protocols?: string | string[]): void {\n this._url = url;\n this._protocols = protocols;\n this._reconnects = 0;\n this._open();\n }\n\n private _open(): void {\n if (typeof WebSocket === 'undefined') return;\n this._state$.next('connecting');\n try {\n this._ws = this._protocols ? new WebSocket(this._url, this._protocols) : new WebSocket(this._url);\n } catch {\n this._state$.next('closed');\n return;\n }\n\n this._ws.onopen = () => {\n this._state$.next('open');\n this._reconnects = 0;\n if (this._queue.length) {\n for (const msg of this._queue) this._ws!.send(msg);\n this._queue = [];\n }\n if (this._cfg.pingIntervalMs > 0) {\n this._pingTimer = setInterval(() => this.send(this._cfg.pingMessage), this._cfg.pingIntervalMs);\n }\n };\n\n this._ws.onmessage = (event) => {\n try {\n const parsed = JSON.parse(event.data as string);\n this._message$.next({ type: parsed?.type, data: parsed?.data ?? parsed, raw: event.data });\n } catch {\n this._message$.next({ raw: event.data });\n }\n };\n\n this._ws.onerror = (event) => {\n this._error$.next(event);\n };\n\n this._ws.onclose = () => {\n this._state$.next('closed');\n this._clearPing();\n if (this._reconnects < this._cfg.maxReconnects) {\n this._reconnects++;\n this._reconnectTimer = setTimeout(() => this._open(), this._cfg.reconnectMs);\n }\n };\n }\n\n disconnect(): void {\n if (this._reconnectTimer) { clearTimeout(this._reconnectTimer); this._reconnectTimer = null; }\n this._clearPing();\n this._reconnects = this._cfg.maxReconnects; // prevent auto-reconnect\n if (this._ws) {\n this._state$.next('closing');\n this._ws.close();\n this._ws = null;\n }\n }\n\n send(data: string | Record<string, unknown>): void {\n const payload = typeof data === 'string' ? data : JSON.stringify(data);\n if (this._ws?.readyState === WebSocket.OPEN) {\n this._ws.send(payload);\n } else {\n this._queue.push(payload);\n }\n }\n\n /** Subscribe to messages of a specific type */\n on(type: string): { subscribe: (fn: (data: unknown) => void) => () => void } {\n return {\n subscribe: (fn) => this._message$.subscribe(msg => { if (msg.type === type) fn(msg.data); }),\n };\n }\n\n state$() { return this._state$.asObservable(); }\n message$() { return this._message$.asObservable(); }\n error$() { return this._error$.asObservable(); }\n isConnected(): boolean { return this._ws?.readyState === WebSocket.OPEN; }\n getState(): JoopWsState { return this._state$.getValue(); }\n\n private _clearPing(): void {\n if (this._pingTimer) { clearInterval(this._pingTimer); this._pingTimer = null; }\n }\n}\n","import { JoopSubject } from '../events';\n\nexport interface JoopAnalyticsEvent {\n name: string;\n properties?: Record<string, unknown>;\n timestamp: number;\n sessionId?: string;\n userId?: string;\n}\n\nexport interface JoopAnalyticsAdapter {\n name: string;\n track?(event: JoopAnalyticsEvent): void;\n page?(name: string, properties?: Record<string, unknown>): void;\n identify?(userId: string, traits?: Record<string, unknown>): void;\n}\n\nexport class JoopAnalyticsService {\n private _adapters: JoopAnalyticsAdapter[] = [];\n private _context: Record<string, unknown> = {};\n private _userId = '';\n private _sessionId = '';\n private _event$ = new JoopSubject<JoopAnalyticsEvent>();\n private _queue: JoopAnalyticsEvent[] = [];\n private _enabled = true;\n\n addAdapter(adapter: JoopAnalyticsAdapter): void {\n if (!this._adapters.find(a => a.name === adapter.name)) {\n this._adapters.push(adapter);\n // drain queued events to new adapter\n for (const ev of this._queue) adapter.track?.(ev);\n }\n }\n\n removeAdapter(name: string): void {\n this._adapters = this._adapters.filter(a => a.name !== name);\n }\n\n enable(): void { this._enabled = true; }\n disable(): void { this._enabled = false; }\n\n setContext(ctx: Record<string, unknown>): void {\n this._context = { ...this._context, ...ctx };\n }\n\n setUser(userId: string, traits?: Record<string, unknown>): void {\n this._userId = userId;\n this._adapters.forEach(a => a.identify?.(userId, traits));\n }\n\n setSession(sessionId: string): void { this._sessionId = sessionId; }\n\n track(name: string, properties?: Record<string, unknown>): void {\n if (!this._enabled) return;\n const event: JoopAnalyticsEvent = {\n name,\n properties: { ...this._context, ...properties },\n timestamp: Date.now(),\n userId: this._userId || undefined,\n sessionId: this._sessionId || undefined,\n };\n this._event$.next(event);\n if (this._adapters.length === 0) { this._queue.push(event); return; }\n this._adapters.forEach(a => { try { a.track?.(event); } catch { /* isolate adapter errors */ } });\n }\n\n page(name: string, properties?: Record<string, unknown>): void {\n if (!this._enabled) return;\n const merged = { ...this._context, ...properties };\n this._adapters.forEach(a => { try { a.page?.(name, merged); } catch { /* */ } });\n this.track(`page:${name}`, merged);\n }\n\n identify(userId: string, traits?: Record<string, unknown>): void {\n this.setUser(userId, traits);\n }\n\n /** Subscribe to all tracked events (useful for debugging) */\n events$() { return this._event$.asObservable(); }\n\n /** Flush the pre-adapter queue (e.g. after lazy-loading analytics) */\n flush(): void {\n for (const ev of this._queue) {\n this._adapters.forEach(a => { try { a.track?.(ev); } catch { /* */ } });\n }\n this._queue = [];\n }\n\n getQueueSize(): number { return this._queue.length; }\n}\n\n// ── Built-in console adapter (for development) ────────────────────────────\nexport const consoleAnalyticsAdapter: JoopAnalyticsAdapter = {\n name: 'console',\n track: (e) => console.log(`[analytics:track] ${e.name}`, e.properties),\n page: (name) => console.log(`[analytics:page] ${name}`),\n identify: (id) => console.log(`[analytics:identify] ${id}`),\n};\n","const IBAN_LENGTHS: Record<string, number> = {\n AL: 28, AD: 24, AE: 23, AT: 20, AZ: 28, BA: 20, BE: 16, BG: 22, BH: 22,\n BR: 29, BY: 28, CH: 21, CR: 22, CY: 28, CZ: 24, DE: 22, DK: 18, DO: 28,\n EE: 20, EG: 29, ES: 24, FI: 18, FO: 18, FR: 27, GB: 22, GE: 22, GI: 23,\n GL: 18, GR: 27, GT: 28, HR: 21, HU: 28, IE: 22, IL: 23, IQ: 23, IS: 26,\n IT: 27, JO: 30, KW: 30, KZ: 20, LB: 28, LC: 32, LI: 21, LT: 20, LU: 20,\n LV: 21, LY: 25, MC: 27, MD: 24, ME: 22, MK: 19, MR: 27, MT: 31, MU: 30,\n NL: 18, NO: 15, PK: 24, PL: 28, PS: 29, PT: 25, QA: 29, RO: 24, RS: 22,\n SA: 24, SC: 31, SD: 18, SE: 24, SI: 19, SK: 24, SM: 27, ST: 25, SV: 28,\n TL: 23, TN: 24, TR: 26, UA: 29, VA: 22, VG: 24, XK: 20,\n};\n\nexport function validateIban(iban: string): boolean {\n const clean = iban.replace(/\\s/g, '').toUpperCase();\n const country = clean.slice(0, 2);\n if (!IBAN_LENGTHS[country] || clean.length !== IBAN_LENGTHS[country]) return false;\n\n const numeric = (clean.slice(4) + clean.slice(0, 4))\n .split('')\n .map(c => c.charCodeAt(0) >= 65 ? (c.charCodeAt(0) - 55).toString() : c)\n .join('');\n\n let remainder = 0;\n for (const ch of numeric) remainder = (remainder * 10 + parseInt(ch)) % 97;\n return remainder === 1;\n}\n\nexport function formatIban(iban: string): string {\n return iban.replace(/\\s/g, '').toUpperCase().replace(/(.{4})/g, '$1 ').trim();\n}\n\nexport function getIbanCountry(iban: string): string {\n return iban.replace(/\\s/g, '').toUpperCase().slice(0, 2);\n}\n\nexport function parseIban(iban: string): { country: string; checkDigits: string; bban: string } | null {\n const clean = iban.replace(/\\s/g, '').toUpperCase();\n if (!validateIban(clean)) return null;\n return { country: clean.slice(0, 2), checkDigits: clean.slice(2, 4), bban: clean.slice(4) };\n}\n\nexport function getSupportedIbanCountries(): string[] {\n return Object.keys(IBAN_LENGTHS).sort();\n}\n","// ── Luhn algorithm & card type detection ──────────────────────────────────\n\nexport type JoopCardNetwork = 'visa' | 'mastercard' | 'amex' | 'discover' | 'unionpay' | 'jcb' | 'diners' | 'maestro' | 'unknown';\n\nexport interface JoopCardInfo {\n network: JoopCardNetwork;\n valid: boolean;\n lengths: number[];\n cvvLength: number;\n formatted: string;\n}\n\nconst CARD_PATTERNS: Array<{ network: JoopCardNetwork; pattern: RegExp; lengths: number[]; cvvLength: number }> = [\n { network: 'amex', pattern: /^3[47]/, lengths: [15], cvvLength: 4 },\n { network: 'diners', pattern: /^3(?:0[0-5]|[68])/, lengths: [14], cvvLength: 3 },\n { network: 'discover', pattern: /^6(?:011|5[0-9]{2})/, lengths: [16], cvvLength: 3 },\n { network: 'jcb', pattern: /^(?:2131|1800|35)/, lengths: [16], cvvLength: 3 },\n { network: 'maestro', pattern: /^(?:5018|5020|5038|6304|6759|676[1-3])/, lengths: [12,13,14,15,16,17,18,19], cvvLength: 3 },\n { network: 'mastercard', pattern: /^5[1-5]|^2[2-7]/, lengths: [16], cvvLength: 3 },\n { network: 'unionpay', pattern: /^62/, lengths: [16,17,18,19], cvvLength: 3 },\n { network: 'visa', pattern: /^4/, lengths: [13,16,19], cvvLength: 3 },\n];\n\n/** Validate a card number using the Luhn algorithm */\nexport function validateLuhn(cardNumber: string): boolean {\n const digits = cardNumber.replace(/\\D/g, '');\n if (digits.length < 8) return false;\n let sum = 0;\n let double = false;\n for (let i = digits.length - 1; i >= 0; i--) {\n let d = parseInt(digits[i], 10);\n if (double) { d *= 2; if (d > 9) d -= 9; }\n sum += d;\n double = !double;\n }\n return sum % 10 === 0;\n}\n\n/** Compute the Luhn check digit for a partial card number */\nexport function luhnCheckDigit(partial: string): number {\n const digits = partial.replace(/\\D/g, '');\n let sum = 0;\n let double = true;\n for (let i = digits.length - 1; i >= 0; i--) {\n let d = parseInt(digits[i], 10);\n if (double) { d *= 2; if (d > 9) d -= 9; }\n sum += d;\n double = !double;\n }\n return (10 - (sum % 10)) % 10;\n}\n\n/** Detect the card network from the card number prefix */\nexport function getCardNetwork(cardNumber: string): JoopCardNetwork {\n const digits = cardNumber.replace(/\\D/g, '');\n for (const card of CARD_PATTERNS) {\n if (card.pattern.test(digits)) return card.network;\n }\n return 'unknown';\n}\n\n/** Get full card validation info */\nexport function getCardInfo(cardNumber: string): JoopCardInfo {\n const digits = cardNumber.replace(/\\D/g, '');\n const match = CARD_PATTERNS.find(c => c.pattern.test(digits));\n const network = match?.network ?? 'unknown';\n const lengths = match?.lengths ?? [13, 14, 15, 16, 19];\n const cvvLength = match?.cvvLength ?? 3;\n const valid = lengths.includes(digits.length) && validateLuhn(digits);\n const formatted = formatCardNumber(digits);\n return { network, valid, lengths, cvvLength, formatted };\n}\n\n/** Format card number with spaces (e.g. 4111 1111 1111 1111 or 3714 496353 98431 for Amex) */\nexport function formatCardNumber(cardNumber: string): string {\n const digits = cardNumber.replace(/\\D/g, '');\n const network = getCardNetwork(digits);\n if (network === 'amex') {\n return digits.replace(/^(\\d{4})(\\d{6})(\\d{5})$/, '$1 $2 $3');\n }\n if (network === 'diners') {\n return digits.replace(/^(\\d{4})(\\d{6})(\\d{4})$/, '$1 $2 $3');\n }\n return digits.replace(/(\\d{4})(?=\\d)/g, '$1 ');\n}\n\n/** Validate card expiry (MM/YY or MM/YYYY) */\nexport function isCardExpired(month: number | string, year: number | string): boolean {\n const m = parseInt(String(month), 10);\n let y = parseInt(String(year), 10);\n if (y < 100) y += 2000;\n const now = new Date();\n const expiry = new Date(y, m - 1, 1);\n expiry.setMonth(expiry.getMonth() + 1); // expire at end of month\n return expiry <= now;\n}\n\n/** Validate a CVV/CVC value */\nexport function validateCvv(cvv: string, network: JoopCardNetwork = 'unknown'): boolean {\n const digits = cvv.replace(/\\D/g, '');\n const expectedLength = network === 'amex' ? 4 : 3;\n return digits.length === expectedLength;\n}\n","export function safeAdd(a: number, b: number, decimals = 2): number {\n const f = Math.pow(10, decimals);\n return (Math.round(a * f) + Math.round(b * f)) / f;\n}\n\nexport function safeSubtract(a: number, b: number, decimals = 2): number {\n const f = Math.pow(10, decimals);\n return (Math.round(a * f) - Math.round(b * f)) / f;\n}\n\nexport function safeMultiply(a: number, b: number, decimals = 2): number {\n return parseFloat((a * b).toFixed(decimals));\n}\n\nexport function safeDivide(a: number, b: number, decimals = 2): number {\n if (b === 0) throw new Error('Division by zero');\n return parseFloat((a / b).toFixed(decimals));\n}\n\nexport function roundAmount(amount: number, decimals = 2): number {\n const f = Math.pow(10, decimals);\n return Math.round(amount * f) / f;\n}\n\nexport function isValidAmount(value: unknown): boolean {\n if (typeof value === 'string') {\n const clean = value.replace(/[,\\s]/g, '');\n return /^-?\\d+(\\.\\d+)?$/.test(clean) && isFinite(parseFloat(clean));\n }\n return typeof value === 'number' && isFinite(value);\n}\n\nexport function clampAmount(amount: number, min: number, max: number): number {\n return Math.min(Math.max(amount, min), max);\n}\n\nexport function toMinorUnits(amount: number, decimalPlaces = 2): number {\n return Math.round(amount * Math.pow(10, decimalPlaces));\n}\n\nexport function fromMinorUnits(amount: number, decimalPlaces = 2): number {\n return amount / Math.pow(10, decimalPlaces);\n}\n\nexport function sumAmounts(...amounts: number[]): number {\n const f = 100;\n return amounts.reduce((acc, a) => acc + Math.round(a * f), 0) / f;\n}\n","import { validateIban } from '../banking/iban.utility';\nimport { validateLuhn, getCardNetwork } from '../banking/luhn.utility';\nimport { isValidAmount } from '../banking/amount.utility';\n\nexport type JoopValidationRule =\n | { type: 'required' }\n | { type: 'minLength'; min: number }\n | { type: 'maxLength'; max: number }\n | { type: 'min'; min: number }\n | { type: 'max'; max: number }\n | { type: 'pattern'; regex: RegExp; message?: string }\n | { type: 'email' }\n | { type: 'phone' }\n | { type: 'iban' }\n | { type: 'luhn' }\n | { type: 'amount'; min?: number; max?: number }\n | { type: 'dateRange'; maxDays?: number; minDate?: Date; maxDate?: Date }\n | { type: 'custom'; validate: (v: unknown) => string | null };\n\nexport interface JoopValidationResult { valid: boolean; errors: string[]; }\nexport type JoopFormErrors = Record<string, string[]>;\nexport type JoopFormSchema = Record<string, JoopValidationRule[]>;\n\nexport interface JoopPasswordStrength {\n score: number; // 0–4\n label: 'very-weak' | 'weak' | 'fair' | 'strong' | 'very-strong';\n suggestions: string[];\n}\n\nconst EMAIL_RE = /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*\\.[a-zA-Z]{2,}$/;\nconst PHONE_RE = /^\\+?[\\d\\s\\-().]{7,20}$/;\n\nexport class JoopFormValidator {\n\n required(value: unknown): string | null {\n if (value == null || value === '' || (Array.isArray(value) && value.length === 0)) return 'This field is required';\n return null;\n }\n\n minLength(value: string, min: number): string | null {\n if (String(value ?? '').length < min) return `Minimum ${min} characters required`;\n return null;\n }\n\n maxLength(value: string, max: number): string | null {\n if (String(value ?? '').length > max) return `Maximum ${max} characters allowed`;\n return null;\n }\n\n min(value: number | string, min: number): string | null {\n if (Number(value) < min) return `Minimum value is ${min}`;\n return null;\n }\n\n max(value: number | string, max: number): string | null {\n if (Number(value) > max) return `Maximum value is ${max}`;\n return null;\n }\n\n email(value: string): string | null {\n if (!EMAIL_RE.test(String(value ?? ''))) return 'Invalid email address';\n return null;\n }\n\n phone(value: string): string | null {\n if (!PHONE_RE.test(String(value ?? ''))) return 'Invalid phone number';\n return null;\n }\n\n iban(value: string): string | null {\n if (!validateIban(String(value ?? ''))) return 'Invalid IBAN';\n return null;\n }\n\n luhn(value: string): string | null {\n const digits = String(value ?? '').replace(/\\D/g, '');\n if (!validateLuhn(digits)) return 'Invalid card number';\n const network = getCardNetwork(digits);\n if (network === 'unknown') return 'Unrecognised card type';\n return null;\n }\n\n amount(value: string | number, min?: number, max?: number): string | null {\n if (!isValidAmount(value)) return 'Invalid amount';\n const n = Number(value);\n if (min !== undefined && n < min) return `Minimum amount is ${min}`;\n if (max !== undefined && n > max) return `Maximum amount is ${max}`;\n return null;\n }\n\n pattern(value: string, regex: RegExp, message?: string): string | null {\n if (!regex.test(String(value ?? ''))) return message ?? 'Invalid format';\n return null;\n }\n\n dateRange(start: Date, end: Date, maxDays?: number, minDate?: Date, maxDate?: Date): string | null {\n if (start > end) return 'Start date must be before end date';\n if (minDate && start < minDate) return `Start date cannot be before ${minDate.toLocaleDateString()}`;\n if (maxDate && end > maxDate) return `End date cannot be after ${maxDate.toLocaleDateString()}`;\n if (maxDays) {\n const days = Math.ceil((end.getTime() - start.getTime()) / 86_400_000);\n if (days > maxDays) return `Date range cannot exceed ${maxDays} days`;\n }\n return null;\n }\n\n passwordStrength(password: string): JoopPasswordStrength {\n const suggestions: string[] = [];\n let score = 0;\n if (password.length >= 8) score++; else suggestions.push('Use at least 8 characters');\n if (password.length >= 12) score++;\n if (/[A-Z]/.test(password)) score++; else suggestions.push('Add uppercase letters');\n if (/[0-9]/.test(password)) score++; else suggestions.push('Add numbers');\n if (/[^A-Za-z0-9]/.test(password)) score++; else suggestions.push('Add special characters');\n if (/(.)\\1{2,}/.test(password)) { score--; suggestions.push('Avoid repeating characters'); }\n score = Math.max(0, Math.min(4, score));\n const labels: JoopPasswordStrength['label'][] = ['very-weak', 'weak', 'fair', 'strong', 'very-strong'];\n return { score, label: labels[score], suggestions };\n }\n\n /** Validate a single value against multiple rules */\n validate(value: unknown, rules: JoopValidationRule[]): JoopValidationResult {\n const errors: string[] = [];\n for (const rule of rules) {\n let err: string | null = null;\n switch (rule.type) {\n case 'required': err = this.required(value); break;\n case 'minLength': err = this.minLength(String(value ?? ''), rule.min); break;\n case 'maxLength': err = this.maxLength(String(value ?? ''), rule.max); break;\n case 'min': err = this.min(value as number, rule.min); break;\n case 'max': err = this.max(value as number, rule.max); break;\n case 'email': err = this.email(String(value ?? '')); break;\n case 'phone': err = this.phone(String(value ?? '')); break;\n case 'iban': err = this.iban(String(value ?? '')); break;\n case 'luhn': err = this.luhn(String(value ?? '')); break;\n case 'amount': err = this.amount(value as string, rule.min, rule.max); break;\n case 'pattern': err = this.pattern(String(value ?? ''), rule.regex, rule.message); break;\n case 'custom': err = rule.validate(value); break;\n }\n if (err) errors.push(err);\n }\n return { valid: errors.length === 0, errors };\n }\n\n /** Validate an entire form object against a schema */\n validateForm(form: Record<string, unknown>, schema: JoopFormSchema): JoopFormErrors {\n const errors: JoopFormErrors = {};\n for (const field of Object.keys(schema)) {\n const result = this.validate(form[field], schema[field]);\n if (!result.valid) errors[field] = result.errors;\n }\n return errors;\n }\n\n isFormValid(errors: JoopFormErrors): boolean {\n return Object.keys(errors).length === 0;\n }\n}\n","import { JoopBehaviorSubject } from '../events';\n\nexport interface JoopFlagDefinition {\n key: string;\n enabled: boolean;\n variant?: string;\n description?: string;\n /** Percentage rollout 0–100 — compared against a stable user hash */\n rolloutPercent?: number;\n /** Only enable for specific user IDs */\n allowedUsers?: string[];\n /** Only enable for specific environments */\n environments?: string[];\n}\n\nexport interface JoopFlagContext {\n userId?: string;\n environment?: string;\n attributes?: Record<string, unknown>;\n}\n\nexport class JoopFeatureFlagService {\n private _flags = new Map<string, JoopFlagDefinition>();\n private _overrides = new Map<string, boolean>();\n private _context: JoopFlagContext = {};\n private _flags$ = new JoopBehaviorSubject<Map<string, JoopFlagDefinition>>(new Map());\n\n /** Register flag definitions */\n define(flags: JoopFlagDefinition[]): void {\n for (const f of flags) this._flags.set(f.key, f);\n this._flags$.next(new Map(this._flags));\n }\n\n /** Load flags from a remote JSON endpoint */\n async loadFromUrl(url: string): Promise<void> {\n const res = await fetch(url);\n const flags: JoopFlagDefinition[] = await res.json();\n this.define(flags);\n }\n\n /** Set user/environment context for targeting */\n setContext(ctx: JoopFlagContext): void { this._context = { ...this._context, ...ctx }; }\n\n /** Check if a feature flag is enabled for the current context */\n isEnabled(key: string, context?: JoopFlagContext): boolean {\n if (this._overrides.has(key)) return this._overrides.get(key)!;\n const flag = this._flags.get(key);\n if (!flag) return false;\n if (!flag.enabled) return false;\n\n const ctx = { ...this._context, ...context };\n\n if (flag.environments?.length && ctx.environment && !flag.environments.includes(ctx.environment)) return false;\n if (flag.allowedUsers?.length && ctx.userId && !flag.allowedUsers.includes(ctx.userId)) return false;\n\n if (flag.rolloutPercent !== undefined && ctx.userId) {\n const hash = this._hash(`${key}:${ctx.userId}`);\n if (hash % 100 >= flag.rolloutPercent) return false;\n }\n\n return true;\n }\n\n /** Get the variant string for a flag */\n getVariant(key: string, context?: JoopFlagContext): string | null {\n if (!this.isEnabled(key, context)) return null;\n return this._flags.get(key)?.variant ?? null;\n }\n\n /** Override a flag locally (for testing) */\n setOverride(key: string, value: boolean): void {\n this._overrides.set(key, value);\n this._flags$.next(new Map(this._flags));\n }\n\n clearOverrides(): void {\n this._overrides.clear();\n this._flags$.next(new Map(this._flags));\n }\n\n getAllFlags(): JoopFlagDefinition[] { return [...this._flags.values()]; }\n getFlag(key: string): JoopFlagDefinition | undefined { return this._flags.get(key); }\n flags$() { return this._flags$.asObservable(); }\n\n /** Simple deterministic hash for percentage rollouts */\n private _hash(str: string): number {\n let h = 0x811c9dc5;\n for (let i = 0; i < str.length; i++) {\n h ^= str.charCodeAt(i);\n h = (h * 0x01000193) >>> 0;\n }\n return h;\n }\n}\n","import { JoopOtpService } from './otp.service';\nimport { JoopBiometricService } from './biometric.service';\nimport { JoopSubject } from '../events';\n\nexport type JoopMfaChannel = 'totp' | 'sms' | 'email' | 'biometric' | 'backup';\n\nexport interface JoopMfaChallenge {\n id: string;\n channel: JoopMfaChannel;\n destination?: string;\n expiresAt: number;\n attempts: number;\n maxAttempts: number;\n verified: boolean;\n}\n\nexport interface JoopMfaVerifyResult {\n success: boolean;\n reason?: string;\n attemptsLeft?: number;\n}\n\nexport interface JoopMfaTotpSetup {\n secret: string; // base32 secret for authenticator app\n uri: string; // otpauth:// URI for QR code\n backupCodes: string[]; // plaintext backup codes (show once)\n}\n\nconst BASE32_CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567';\n\nexport class JoopMfaService {\n private _otp = new JoopOtpService();\n private _bio = new JoopBiometricService();\n private _challenges = new Map<string, JoopMfaChallenge & { _code?: string }>();\n private _expired$ = new JoopSubject<string>();\n\n // ── TOTP ──────────────────────────────────────────────────────────────────\n\n generateTotpSecret(length = 20): string {\n const bytes = crypto.getRandomValues(new Uint8Array(length));\n let result = '';\n for (const byte of bytes) result += BASE32_CHARS[byte % 32];\n return result;\n }\n\n getTotpUri(secret: string, account: string, issuer = 'JoopApp'): string {\n const label = encodeURIComponent(`${issuer}:${account}`);\n return `otpauth://totp/${label}?secret=${secret}&issuer=${encodeURIComponent(issuer)}&algorithm=SHA1&digits=6&period=30`;\n }\n\n async setupTotp(account: string, issuer?: string): Promise<JoopMfaTotpSetup> {\n const secret = this.generateTotpSecret();\n const uri = this.getTotpUri(secret, account, issuer);\n const backupCodes = this.generateBackupCodes();\n return { secret, uri, backupCodes };\n }\n\n async verifyTotp(token: string, secret: string, window = 1): Promise<boolean> {\n return this._otp.verifyTOTP(token, secret, window);\n }\n\n // ── OTP Challenge (SMS/Email) ──────────────────────────────────────────────\n\n createChallenge(\n destination: string,\n channel: 'sms' | 'email',\n ttlMs = 5 * 60 * 1000,\n maxAttempts = 3,\n ): JoopMfaChallenge & { _code: string } {\n const code = this._otp.generateNumericOTP(6);\n const challenge = {\n id: crypto.randomUUID(),\n channel: channel as JoopMfaChannel,\n destination,\n expiresAt: Date.now() + ttlMs,\n attempts: 0,\n maxAttempts,\n verified: false,\n _code: code,\n };\n this._challenges.set(challenge.id, challenge);\n setTimeout(() => {\n if (!this._challenges.get(challenge.id)?.verified) {\n this._challenges.delete(challenge.id);\n this._expired$.next(challenge.id);\n }\n }, ttlMs);\n return challenge;\n }\n\n /** Get the OTP code for a challenge (pass to your SMS/email sendFn) */\n getChallengeOtp(challengeId: string): string | null {\n return this._challenges.get(challengeId)?._code ?? null;\n }\n\n verifyChallenge(challengeId: string, token: string): JoopMfaVerifyResult {\n const ch = this._challenges.get(challengeId);\n if (!ch) return { success: false, reason: 'challenge_not_found' };\n if (Date.now() > ch.expiresAt) { this._challenges.delete(challengeId); return { success: false, reason: 'expired' }; }\n if (ch.verified) return { success: false, reason: 'already_verified' };\n ch.attempts++;\n if (ch._code !== token) {\n const attemptsLeft = ch.maxAttempts - ch.attempts;\n if (attemptsLeft <= 0) this._challenges.delete(challengeId);\n return { success: false, reason: 'invalid_code', attemptsLeft };\n }\n ch.verified = true;\n return { success: true };\n }\n\n // ── Backup Codes ──────────────────────────────────────────────────────────\n\n generateBackupCodes(count = 10, length = 8): string[] {\n return Array.from({ length: count }, () => this._otp.generateAlphanumericOTP(length));\n }\n\n async hashBackupCodes(codes: string[]): Promise<string[]> {\n const hashed: string[] = [];\n for (const code of codes) {\n const buf = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(code));\n hashed.push(Array.from(new Uint8Array(buf)).map(b => b.toString(16).padStart(2, '0')).join(''));\n }\n return hashed;\n }\n\n async verifyBackupCode(\n code: string,\n hashedCodes: string[],\n ): Promise<{ valid: boolean; remaining: string[] }> {\n const hash = Array.from(\n new Uint8Array(await crypto.subtle.digest('SHA-256', new TextEncoder().encode(code))),\n ).map(b => b.toString(16).padStart(2, '0')).join('');\n const idx = hashedCodes.indexOf(hash);\n if (idx === -1) return { valid: false, remaining: hashedCodes };\n return { valid: true, remaining: hashedCodes.filter((_, i) => i !== idx) };\n }\n\n // ── Biometric ─────────────────────────────────────────────────────────────\n\n async isBiometricAvailable(): Promise<boolean> { return this._bio.isAvailable(); }\n\n async registerBiometric(userId: string, displayName?: string): Promise<PublicKeyCredential> {\n const challengeBytes = crypto.getRandomValues(new Uint8Array(32));\n return this._bio.register({\n challenge: challengeBytes.buffer as ArrayBuffer,\n rpId: window.location.hostname,\n rpName: document.title || 'JoopApp',\n userId,\n userName: userId,\n userDisplayName: displayName ?? userId,\n });\n }\n\n async verifyBiometric(credentialId: string): Promise<boolean> {\n try {\n const challengeBytes = crypto.getRandomValues(new Uint8Array(32));\n const result = await this._bio.authenticate({\n challenge: challengeBytes.buffer as ArrayBuffer,\n rpId: window.location.hostname,\n allowCredentials: [{ id: new TextEncoder().encode(credentialId), type: 'public-key' }],\n });\n return !!result;\n } catch { return false; }\n }\n\n // ── Challenge state ────────────────────────────────────────────────────────\n\n onChallengeExpired(handler: (id: string) => void): () => void {\n return this._expired$.subscribe(handler);\n }\n\n clearExpiredChallenges(): number {\n const now = Date.now();\n let removed = 0;\n for (const [id, ch] of this._challenges) {\n if (now > ch.expiresAt) { this._challenges.delete(id); removed++; }\n }\n return removed;\n }\n\n getChallenge(id: string): JoopMfaChallenge | null {\n const ch = this._challenges.get(id);\n if (!ch) return null;\n const { _code: _, ...safe } = ch;\n return safe;\n }\n}\n","// JoopE2EService — RSA key pair management, hybrid encryption, and digital signatures\n// Uses WebCrypto API: RSA-OAEP for key wrapping, AES-GCM for data, RSA-PSS for signatures\n\nexport interface JoopRsaKeyPair {\n publicKey: CryptoKey;\n privateKey: CryptoKey;\n}\n\nexport interface JoopE2EPayload {\n wrappedKey: string; // base64 AES key wrapped with RSA public key\n iv: string; // base64 AES-GCM IV\n ciphertext: string; // base64 AES-GCM encrypted data\n algorithm: 'RSA-OAEP+AES-GCM';\n}\n\n// Key generation params (hash as string is valid for RsaHashedKeyGenParams)\nconst _oaepGen = (bits: number): RsaHashedKeyGenParams => ({\n name: 'RSA-OAEP', modulusLength: bits, publicExponent: new Uint8Array([1, 0, 1]), hash: 'SHA-256',\n});\nconst _pssGen = (bits: number): RsaHashedKeyGenParams => ({\n name: 'RSA-PSS', modulusLength: bits, publicExponent: new Uint8Array([1, 0, 1]), hash: 'SHA-256',\n});\n// Import params (hash as KeyAlgorithm object required by importKey overload)\nconst OAEP_IMP = { name: 'RSA-OAEP', hash: { name: 'SHA-256' } };\nconst PSS_IMP = { name: 'RSA-PSS', hash: { name: 'SHA-256' } };\n\nfunction _b64(buf: ArrayBuffer | ArrayBufferView): string {\n const bytes = ArrayBuffer.isView(buf) ? new Uint8Array(buf.buffer as ArrayBuffer, buf.byteOffset, buf.byteLength) : new Uint8Array(buf);\n return btoa(String.fromCharCode(...bytes));\n}\nfunction _unb64(s: string): Uint8Array<ArrayBuffer> {\n return new Uint8Array(Array.from(atob(s), c => c.charCodeAt(0)));\n}\nfunction _pemToBytes(pem: string): Uint8Array<ArrayBuffer> {\n return _unb64(pem.replace(/-----[^-]+-----/g, '').replace(/\\s/g, ''));\n}\nfunction _bytesToPem(bytes: ArrayBuffer, type: string): string {\n const b64 = _b64(bytes);\n const lines = b64.match(/.{1,64}/g)?.join('\\n') ?? b64;\n return `-----BEGIN ${type}-----\\n${lines}\\n-----END ${type}-----`;\n}\n\nexport class JoopE2EService {\n\n // ── Key generation ─────────────────────────────────────────────────────────\n\n async generateKeyPair(bits: 2048 | 4096 = 2048): Promise<JoopRsaKeyPair> {\n const pair = await crypto.subtle.generateKey(_oaepGen(bits), true, ['encrypt', 'decrypt']);\n return pair as JoopRsaKeyPair;\n }\n\n async generateSigningKeyPair(bits: 2048 | 4096 = 2048): Promise<JoopRsaKeyPair> {\n const pair = await crypto.subtle.generateKey(_pssGen(bits), true, ['sign', 'verify']);\n return pair as JoopRsaKeyPair;\n }\n\n // ── PEM export/import ──────────────────────────────────────────────────────\n\n async exportPublicKeyPem(key: CryptoKey): Promise<string> {\n return _bytesToPem(await crypto.subtle.exportKey('spki', key), 'PUBLIC KEY');\n }\n\n async exportPrivateKeyPem(key: CryptoKey): Promise<string> {\n return _bytesToPem(await crypto.subtle.exportKey('pkcs8', key), 'PRIVATE KEY');\n }\n\n async importPublicKeyPem(pem: string, usage: 'encrypt' | 'verify' = 'encrypt'): Promise<CryptoKey> {\n const algo = usage === 'encrypt' ? OAEP_IMP : PSS_IMP;\n return crypto.subtle.importKey('spki', _pemToBytes(pem), algo, true, [usage]);\n }\n\n async importPrivateKeyPem(pem: string, usage: 'decrypt' | 'sign' = 'decrypt'): Promise<CryptoKey> {\n const algo = usage === 'decrypt' ? OAEP_IMP : PSS_IMP;\n return crypto.subtle.importKey('pkcs8', _pemToBytes(pem), algo, true, [usage]);\n }\n\n // ── JWK export/import ──────────────────────────────────────────────────────\n\n async exportPublicKeyJwk(key: CryptoKey): Promise<JsonWebKey> {\n return crypto.subtle.exportKey('jwk', key);\n }\n\n async importPublicKeyJwk(jwk: JsonWebKey, usage: 'encrypt' | 'verify' = 'encrypt'): Promise<CryptoKey> {\n const algo = usage === 'encrypt' ? OAEP_IMP : PSS_IMP;\n return crypto.subtle.importKey('jwk', jwk, algo, true, [usage]);\n }\n\n async exportPrivateKeyJwk(key: CryptoKey): Promise<JsonWebKey> {\n return crypto.subtle.exportKey('jwk', key);\n }\n\n // ── Hybrid encryption (RSA wraps AES key) ─────────────────────────────────\n\n async encryptForRecipient(plaintext: string, publicKey: CryptoKey | string): Promise<JoopE2EPayload> {\n const pk = typeof publicKey === 'string' ? await this.importPublicKeyPem(publicKey, 'encrypt') : publicKey;\n\n const aesKey = await crypto.subtle.generateKey({ name: 'AES-GCM', length: 256 }, true, ['encrypt']);\n const iv = crypto.getRandomValues(new Uint8Array(12));\n\n const cipherBuf = await crypto.subtle.encrypt({ name: 'AES-GCM', iv }, aesKey, new TextEncoder().encode(plaintext));\n const rawAes = await crypto.subtle.exportKey('raw', aesKey);\n const wrappedBuf = await crypto.subtle.encrypt({ name: 'RSA-OAEP' }, pk, rawAes);\n\n return { wrappedKey: _b64(wrappedBuf), iv: _b64(iv), ciphertext: _b64(cipherBuf), algorithm: 'RSA-OAEP+AES-GCM' };\n }\n\n async decryptFromSender(payload: JoopE2EPayload, privateKey: CryptoKey | string): Promise<string> {\n const sk = typeof privateKey === 'string' ? await this.importPrivateKeyPem(privateKey, 'decrypt') : privateKey;\n const rawAes = await crypto.subtle.decrypt({ name: 'RSA-OAEP' }, sk, _unb64(payload.wrappedKey));\n const aesKey = await crypto.subtle.importKey('raw', rawAes, 'AES-GCM', false, ['decrypt']);\n const plainBuf = await crypto.subtle.decrypt({ name: 'AES-GCM', iv: _unb64(payload.iv) }, aesKey, _unb64(payload.ciphertext));\n return new TextDecoder().decode(plainBuf);\n }\n\n // ── Digital signatures (RSA-PSS) ──────────────────────────────────────────\n\n async sign(data: string, privateKey: CryptoKey | string): Promise<string> {\n const sk = typeof privateKey === 'string' ? await this.importPrivateKeyPem(privateKey, 'sign') : privateKey;\n const buf = await crypto.subtle.sign({ name: 'RSA-PSS', saltLength: 32 }, sk, new TextEncoder().encode(data));\n return _b64(buf);\n }\n\n async verify(data: string, signature: string, publicKey: CryptoKey | string): Promise<boolean> {\n try {\n const pk = typeof publicKey === 'string' ? await this.importPublicKeyPem(publicKey, 'verify') : publicKey;\n return crypto.subtle.verify({ name: 'RSA-PSS', saltLength: 32 }, pk, _unb64(signature), new TextEncoder().encode(data));\n } catch { return false; }\n }\n\n // ── Session key utilities ─────────────────────────────────────────────────\n\n async generateSessionKey(): Promise<{ key: CryptoKey; exported: string }> {\n const key = await crypto.subtle.generateKey({ name: 'AES-GCM', length: 256 }, true, ['encrypt', 'decrypt']);\n return { key, exported: _b64(await crypto.subtle.exportKey('raw', key)) };\n }\n\n async wrapSessionKey(sessionKey: CryptoKey, recipientPublicKey: CryptoKey): Promise<string> {\n const raw = await crypto.subtle.exportKey('raw', sessionKey);\n return _b64(await crypto.subtle.encrypt({ name: 'RSA-OAEP' }, recipientPublicKey, raw));\n }\n\n async unwrapSessionKey(wrappedKey: string, privateKey: CryptoKey): Promise<CryptoKey> {\n const raw = await crypto.subtle.decrypt({ name: 'RSA-OAEP' }, privateKey, _unb64(wrappedKey));\n return crypto.subtle.importKey('raw', raw, 'AES-GCM', false, ['encrypt', 'decrypt']);\n }\n\n // ── Direct RSA encrypt/decrypt (small payloads only, <190 bytes for 2048-bit key) ──\n\n async encryptRaw(data: string, publicKey: CryptoKey | string): Promise<string> {\n const pk = typeof publicKey === 'string' ? await this.importPublicKeyPem(publicKey, 'encrypt') : publicKey;\n return _b64(await crypto.subtle.encrypt({ name: 'RSA-OAEP' }, pk, new TextEncoder().encode(data)));\n }\n\n async decryptRaw(ciphertext: string, privateKey: CryptoKey | string): Promise<string> {\n const sk = typeof privateKey === 'string' ? await this.importPrivateKeyPem(privateKey, 'decrypt') : privateKey;\n return new TextDecoder().decode(await crypto.subtle.decrypt({ name: 'RSA-OAEP' }, sk, _unb64(ciphertext)));\n }\n\n // ── Key fingerprint ───────────────────────────────────────────────────────\n\n async fingerprint(publicKey: CryptoKey): Promise<string> {\n const spki = await crypto.subtle.exportKey('spki', publicKey);\n const hash = await crypto.subtle.digest('SHA-256', spki);\n return Array.from(new Uint8Array(hash)).map(b => b.toString(16).padStart(2, '0')).join(':');\n }\n}\n","import { JoopBehaviorSubject } from '../events';\n\nexport interface JoopPageState {\n page: number;\n pageSize: number;\n total: number;\n totalPages: number;\n hasPrev: boolean;\n hasNext: boolean;\n from: number;\n to: number;\n}\n\nexport class JoopPaginationService {\n private _state$ = new JoopBehaviorSubject<JoopPageState>(this._compute(1, 10, 0));\n\n private _compute(page: number, pageSize: number, total: number): JoopPageState {\n const totalPages = Math.max(1, Math.ceil(total / pageSize));\n const clamped = Math.min(Math.max(1, page), totalPages);\n const from = total === 0 ? 0 : (clamped - 1) * pageSize + 1;\n const to = Math.min(clamped * pageSize, total);\n return { page: clamped, pageSize, total, totalPages, hasPrev: clamped > 1, hasNext: clamped < totalPages, from, to };\n }\n\n private _update(patch: Partial<{ page: number; pageSize: number; total: number }>): void {\n const { page, pageSize, total } = this._state$.getValue();\n const next = { page, pageSize, total, ...patch };\n this._state$.next(this._compute(next.page, next.pageSize, next.total));\n }\n\n setTotal(total: number): void { this._update({ total, page: 1 }); }\n setPage(page: number): void { this._update({ page }); }\n setPageSize(size: number): void { this._update({ pageSize: size, page: 1 }); }\n\n nextPage(): void { const s = this._state$.getValue(); if (s.hasNext) this._update({ page: s.page + 1 }); }\n prevPage(): void { const s = this._state$.getValue(); if (s.hasPrev) this._update({ page: s.page - 1 }); }\n firstPage(): void { this._update({ page: 1 }); }\n lastPage(): void { this._update({ page: this._state$.getValue().totalPages }); }\n\n getState(): JoopPageState { return this._state$.getValue(); }\n state$() { return this._state$.asObservable(); }\n\n /** Returns page numbers for pagination UI — with ellipsis as -1 */\n getPages(maxVisible = 7): number[] {\n const { page, totalPages } = this._state$.getValue();\n if (totalPages <= maxVisible) return Array.from({ length: totalPages }, (_, i) => i + 1);\n\n const pages: number[] = [];\n const half = Math.floor(maxVisible / 2);\n let start = Math.max(2, page - half);\n let end = Math.min(totalPages - 1, page + half);\n\n if (page - half < 2) end = Math.min(totalPages - 1, maxVisible - 1);\n if (page + half > totalPages - 1) start = Math.max(2, totalPages - maxVisible + 2);\n\n pages.push(1);\n if (start > 2) pages.push(-1); // ellipsis\n for (let i = start; i <= end; i++) pages.push(i);\n if (end < totalPages - 1) pages.push(-1); // ellipsis\n pages.push(totalPages);\n return pages;\n }\n\n reset(): void { this._state$.next(this._compute(1, this._state$.getValue().pageSize, 0)); }\n}\n","export interface JoopPrintOptions {\n styles?: string;\n title?: string;\n bodyClass?: string;\n}\n\nexport class JoopPrintService {\n /** Print the current page */\n print(): void { window.print(); }\n\n /** Print a specific element by ID or reference */\n printElement(elementOrId: HTMLElement | string, options: JoopPrintOptions = {}): void {\n const el = typeof elementOrId === 'string' ? document.getElementById(elementOrId) : elementOrId;\n if (!el) return;\n this.printHtml(el.outerHTML, options);\n }\n\n /** Open a new window with custom HTML and print it */\n printHtml(html: string, options: JoopPrintOptions = {}): void {\n const win = window.open('', '_blank', 'width=800,height=600');\n if (!win) return;\n\n const { styles = '', title = document.title, bodyClass = '' } = options;\n const defaultStyles = `\n body { font-family: Arial, sans-serif; font-size: 12pt; margin: 20mm; }\n @media print { body { margin: 0; } }\n table { border-collapse: collapse; width: 100%; }\n th, td { border: 1px solid #ccc; padding: 6px 10px; text-align: left; }\n th { background: #f5f5f5; font-weight: bold; }\n `;\n\n win.document.write(`<!DOCTYPE html>\n<html>\n<head>\n <meta charset=\"utf-8\">\n <title>${title}</title>\n <style>${defaultStyles}${styles}</style>\n</head>\n<body class=\"${bodyClass}\">${html}</body>\n</html>`);\n win.document.close();\n win.focus();\n setTimeout(() => { win.print(); win.close(); }, 300);\n }\n\n /** Print a plain-text receipt in a monospace layout */\n printReceipt(lines: string[], options: JoopPrintOptions = {}): void {\n const html = `<pre style=\"font-family:monospace;font-size:11pt;white-space:pre-wrap\">${lines.join('\\n')}</pre>`;\n this.printHtml(html, { ...options, styles: `${options.styles ?? ''}body{margin:10mm;}` });\n }\n\n /** Build a receipt-style text block for printing */\n buildReceiptText(\n title: string,\n rows: Array<[label: string, value: string]>,\n width = 42,\n ): string[] {\n const line = '─'.repeat(width);\n const center = (s: string) => s.padStart(Math.floor((width + s.length) / 2)).padEnd(width);\n const row = ([l, v]: [string, string]) => `${l.padEnd(width - v.length - 2)} ${v}`;\n return [center(title), line, ...rows.map(row), line];\n }\n}\n","export interface JoopCsvOptions {\n delimiter?: string;\n headers?: string[];\n includeHeaders?: boolean;\n bom?: boolean; // Excel BOM (UTF-8 with BOM)\n nullValue?: string;\n}\n\nexport class JoopExportService {\n /** Convert an array of objects to a CSV string */\n toCsv(data: Record<string, unknown>[], options: JoopCsvOptions = {}): string {\n if (!data.length) return '';\n const {\n delimiter = ',',\n headers,\n includeHeaders = true,\n bom = false,\n nullValue = '',\n } = options;\n\n const cols = headers ?? Object.keys(data[0]);\n const escape = (v: unknown): string => {\n const s = v == null ? nullValue : String(v);\n return s.includes(delimiter) || s.includes('\"') || s.includes('\\n')\n ? `\"${s.replace(/\"/g, '\"\"')}\"`\n : s;\n };\n\n const rows: string[] = [];\n if (includeHeaders) rows.push(cols.map(escape).join(delimiter));\n for (const row of data) rows.push(cols.map(k => escape(row[k])).join(delimiter));\n const csv = rows.join('\\r\\n');\n return bom ? '' + csv : csv;\n }\n\n /** Trigger browser download of a CSV string */\n downloadCsv(data: Record<string, unknown>[], filename: string, options: JoopCsvOptions = {}): void {\n const csv = this.toCsv(data, options);\n this._download(csv, filename.endsWith('.csv') ? filename : `${filename}.csv`, 'text/csv;charset=utf-8;');\n }\n\n /** Download Excel-compatible CSV (with BOM so Excel reads UTF-8 correctly) */\n downloadExcel(data: Record<string, unknown>[], filename: string, options: JoopCsvOptions = {}): void {\n const csv = this.toCsv(data, { ...options, bom: true, delimiter: ',' });\n this._download(csv, filename.endsWith('.csv') ? filename : `${filename}.csv`, 'text/csv;charset=utf-8;');\n }\n\n /** Convert data to a JSON string and download */\n downloadJson(data: unknown, filename: string, indent = 2): void {\n const json = JSON.stringify(data, null, indent);\n this._download(json, filename.endsWith('.json') ? filename : `${filename}.json`, 'application/json');\n }\n\n /** Download a plain-text file */\n downloadText(content: string, filename: string): void {\n this._download(content, filename, 'text/plain;charset=utf-8;');\n }\n\n /** Convert a 2D array (table) to CSV */\n tableToCsv(rows: unknown[][], headers?: string[], delimiter = ','): string {\n const esc = (v: unknown) => {\n const s = v == null ? '' : String(v);\n return s.includes(delimiter) || s.includes('\"') ? `\"${s.replace(/\"/g, '\"\"')}\"` : s;\n };\n const lines: string[] = [];\n if (headers) lines.push(headers.map(esc).join(delimiter));\n for (const row of rows) lines.push(row.map(esc).join(delimiter));\n return lines.join('\\r\\n');\n }\n\n private _download(content: string, filename: string, mimeType: string): void {\n const blob = new Blob([content], { type: mimeType });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n a.style.display = 'none';\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n setTimeout(() => URL.revokeObjectURL(url), 5000);\n }\n}\n","import { JoopSubject } from '../events';\n\nexport type JoopClipboardEvent = { type: 'copy' | 'paste'; text: string };\n\nexport class JoopClipboardService {\n private _events$ = new JoopSubject<JoopClipboardEvent>();\n\n /** Copy text to clipboard. Falls back to execCommand for older browsers. */\n async copy(text: string): Promise<boolean> {\n try {\n if (navigator?.clipboard?.writeText) {\n await navigator.clipboard.writeText(text);\n this._events$.next({ type: 'copy', text });\n return true;\n }\n return this._execCopy(text);\n } catch {\n return this._execCopy(text);\n }\n }\n\n /** Read text from clipboard */\n async paste(): Promise<string | null> {\n try {\n if (navigator?.clipboard?.readText) {\n const text = await navigator.clipboard.readText();\n this._events$.next({ type: 'paste', text });\n return text;\n }\n return null;\n } catch { return null; }\n }\n\n /** Copy a DOM element's innerText */\n async copyElement(elementOrId: HTMLElement | string): Promise<boolean> {\n const el = typeof elementOrId === 'string'\n ? document.getElementById(elementOrId)\n : elementOrId;\n return el ? this.copy(el.innerText ?? el.textContent ?? '') : false;\n }\n\n /** Observe copy/paste events */\n events$() { return this._events$.asObservable(); }\n\n private _execCopy(text: string): boolean {\n if (typeof document === 'undefined') return false;\n const ta = document.createElement('textarea');\n ta.value = text;\n ta.style.cssText = 'position:fixed;top:-9999px;left:-9999px;opacity:0';\n document.body.appendChild(ta);\n ta.focus();\n ta.select();\n try {\n const ok = document.execCommand('copy');\n if (ok) this._events$.next({ type: 'copy', text });\n return ok;\n } finally {\n document.body.removeChild(ta);\n }\n }\n}\n\n/** Module-level singleton for quick use without instantiation */\nexport const clipboard = new JoopClipboardService();\n","export interface JoopImageInfo {\n width: number;\n height: number;\n size: number;\n type: string;\n name: string;\n aspectRatio: number;\n}\n\nexport interface JoopImageValidation {\n valid: boolean;\n errors: string[];\n}\n\nexport interface JoopCompressOptions {\n maxWidthOrHeight?: number;\n quality?: number; // 0–1, default 0.8\n outputType?: string; // e.g. 'image/jpeg'\n maxSizeBytes?: number;\n}\n\nexport class JoopImageService {\n /** Compress and optionally resize an image file */\n compress(file: File | Blob, options: JoopCompressOptions = {}): Promise<Blob> {\n const { maxWidthOrHeight = 1920, quality = 0.8, outputType = 'image/jpeg' } = options;\n return new Promise((resolve, reject) => {\n const url = URL.createObjectURL(file);\n const img = new Image();\n img.onload = () => {\n URL.revokeObjectURL(url);\n const canvas = document.createElement('canvas');\n let { width, height } = img;\n if (width > maxWidthOrHeight || height > maxWidthOrHeight) {\n if (width > height) { height = Math.round(height * maxWidthOrHeight / width); width = maxWidthOrHeight; }\n else { width = Math.round(width * maxWidthOrHeight / height); height = maxWidthOrHeight; }\n }\n canvas.width = width;\n canvas.height = height;\n canvas.getContext('2d')!.drawImage(img, 0, 0, width, height);\n canvas.toBlob(b => b ? resolve(b) : reject(new Error('compression failed')), outputType, quality);\n };\n img.onerror = reject;\n img.src = url;\n });\n }\n\n /** Resize to exact dimensions */\n resize(file: File | Blob, width: number, height: number, outputType = 'image/jpeg'): Promise<Blob> {\n return new Promise((resolve, reject) => {\n const url = URL.createObjectURL(file);\n const img = new Image();\n img.onload = () => {\n URL.revokeObjectURL(url);\n const canvas = document.createElement('canvas');\n canvas.width = width; canvas.height = height;\n canvas.getContext('2d')!.drawImage(img, 0, 0, width, height);\n canvas.toBlob(b => b ? resolve(b) : reject(new Error('resize failed')), outputType, 0.9);\n };\n img.onerror = reject;\n img.src = url;\n });\n }\n\n /** Convert a blob to base64 data URL */\n toBase64(file: File | Blob): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => resolve(reader.result as string);\n reader.onerror = reject;\n reader.readAsDataURL(file);\n });\n }\n\n /** Get image dimensions and metadata */\n getInfo(file: File): Promise<JoopImageInfo> {\n return new Promise((resolve, reject) => {\n const url = URL.createObjectURL(file);\n const img = new Image();\n img.onload = () => {\n URL.revokeObjectURL(url);\n resolve({\n width: img.naturalWidth,\n height: img.naturalHeight,\n size: file.size,\n type: file.type,\n name: file instanceof File ? file.name : '',\n aspectRatio: parseFloat((img.naturalWidth / img.naturalHeight).toFixed(4)),\n });\n };\n img.onerror = reject;\n img.src = url;\n });\n }\n\n /** Validate an image against size/type/dimension constraints */\n async validate(\n file: File,\n options: { maxSizeBytes?: number; allowedTypes?: string[]; maxWidth?: number; maxHeight?: number; minWidth?: number; minHeight?: number } = {},\n ): Promise<JoopImageValidation> {\n const errors: string[] = [];\n if (options.maxSizeBytes && file.size > options.maxSizeBytes) {\n errors.push(`File too large: ${(file.size / 1024).toFixed(1)} KB exceeds ${(options.maxSizeBytes / 1024).toFixed(1)} KB`);\n }\n if (options.allowedTypes && !options.allowedTypes.includes(file.type)) {\n errors.push(`Invalid type: ${file.type}. Allowed: ${options.allowedTypes.join(', ')}`);\n }\n if (options.maxWidth || options.maxHeight || options.minWidth || options.minHeight) {\n try {\n const info = await this.getInfo(file);\n if (options.maxWidth && info.width > options.maxWidth) errors.push(`Width ${info.width}px exceeds max ${options.maxWidth}px`);\n if (options.maxHeight && info.height > options.maxHeight) errors.push(`Height ${info.height}px exceeds max ${options.maxHeight}px`);\n if (options.minWidth && info.width < options.minWidth) errors.push(`Width ${info.width}px below min ${options.minWidth}px`);\n if (options.minHeight && info.height < options.minHeight) errors.push(`Height ${info.height}px below min ${options.minHeight}px`);\n } catch { errors.push('Could not read image dimensions'); }\n }\n return { valid: errors.length === 0, errors };\n }\n\n /** Create thumbnail as data URL */\n async thumbnail(file: File | Blob, size = 128): Promise<string> {\n const thumb = await this.compress(file, { maxWidthOrHeight: size, quality: 0.7 });\n return this.toBase64(thumb);\n }\n}\n","import { JoopBehaviorSubject } from '../events';\n\nexport interface JoopIdbStoreSchema {\n name: string;\n keyPath?: string;\n autoIncrement?: boolean;\n indexes?: Array<{ name: string; keyPath: string | string[]; unique?: boolean }>;\n}\n\nexport interface JoopIdbConfig {\n name: string;\n version: number;\n stores: JoopIdbStoreSchema[];\n}\n\nexport class JoopIndexedDbService {\n private _db: IDBDatabase | null = null;\n private _ready$ = new JoopBehaviorSubject<boolean>(false);\n\n async open(config: JoopIdbConfig): Promise<void> {\n return new Promise((resolve, reject) => {\n const req = indexedDB.open(config.name, config.version);\n req.onupgradeneeded = (e) => {\n const db = (e.target as IDBOpenDBRequest).result;\n for (const store of config.stores) {\n if (!db.objectStoreNames.contains(store.name)) {\n const os = db.createObjectStore(store.name, { keyPath: store.keyPath, autoIncrement: store.autoIncrement });\n for (const idx of store.indexes ?? []) os.createIndex(idx.name, idx.keyPath, { unique: idx.unique ?? false });\n }\n }\n };\n req.onsuccess = (e) => { this._db = (e.target as IDBOpenDBRequest).result; this._ready$.next(true); resolve(); };\n req.onerror = () => reject(req.error);\n });\n }\n\n close(): void { this._db?.close(); this._db = null; this._ready$.next(false); }\n isOpen(): boolean { return this._db !== null; }\n ready$() { return this._ready$.asObservable(); }\n\n private _store(storeName: string, mode: IDBTransactionMode): IDBObjectStore {\n if (!this._db) throw new Error('JoopIndexedDb: not open');\n return this._db.transaction(storeName, mode).objectStore(storeName);\n }\n\n async get<T>(store: string, key: IDBValidKey): Promise<T | null> {\n return new Promise((res, rej) => {\n const req = this._store(store, 'readonly').get(key);\n req.onsuccess = () => res((req.result as T) ?? null);\n req.onerror = () => rej(req.error);\n });\n }\n\n async set(store: string, value: unknown, key?: IDBValidKey): Promise<IDBValidKey> {\n return new Promise((res, rej) => {\n const req = key !== undefined ? this._store(store, 'readwrite').put(value, key) : this._store(store, 'readwrite').put(value);\n req.onsuccess = () => res(req.result);\n req.onerror = () => rej(req.error);\n });\n }\n\n async delete(store: string, key: IDBValidKey): Promise<void> {\n return new Promise((res, rej) => {\n const req = this._store(store, 'readwrite').delete(key);\n req.onsuccess = () => res();\n req.onerror = () => rej(req.error);\n });\n }\n\n async getAll<T>(store: string): Promise<T[]> {\n return new Promise((res, rej) => {\n const req = this._store(store, 'readonly').getAll();\n req.onsuccess = () => res(req.result as T[]);\n req.onerror = () => rej(req.error);\n });\n }\n\n async getAllKeys(store: string): Promise<IDBValidKey[]> {\n return new Promise((res, rej) => {\n const req = this._store(store, 'readonly').getAllKeys();\n req.onsuccess = () => res(req.result);\n req.onerror = () => rej(req.error);\n });\n }\n\n async query<T>(store: string, indexName: string, range: IDBKeyRange): Promise<T[]> {\n return new Promise((res, rej) => {\n const req = this._store(store, 'readonly').index(indexName).getAll(range);\n req.onsuccess = () => res(req.result as T[]);\n req.onerror = () => rej(req.error);\n });\n }\n\n async count(store: string, range?: IDBKeyRange): Promise<number> {\n return new Promise((res, rej) => {\n const req = range ? this._store(store, 'readonly').count(range) : this._store(store, 'readonly').count();\n req.onsuccess = () => res(req.result);\n req.onerror = () => rej(req.error);\n });\n }\n\n async clear(store: string): Promise<void> {\n return new Promise((res, rej) => {\n const req = this._store(store, 'readwrite').clear();\n req.onsuccess = () => res();\n req.onerror = () => rej(req.error);\n });\n }\n\n async bulkSet(store: string, items: unknown[]): Promise<void> {\n if (!this._db) throw new Error('JoopIndexedDb: not open');\n return new Promise((res, rej) => {\n const tx = this._db!.transaction(store, 'readwrite');\n const os = tx.objectStore(store);\n for (const item of items) os.put(item);\n tx.oncomplete = () => res();\n tx.onerror = () => rej(tx.error);\n });\n }\n\n async deleteDatabase(name: string): Promise<void> {\n this.close();\n return new Promise((res, rej) => {\n const req = indexedDB.deleteDatabase(name);\n req.onsuccess = () => res();\n req.onerror = () => rej(req.error);\n });\n }\n}\n","// Framework-agnostic cryptographic utilities built on WebCrypto\n\nexport interface JoopPasswordHash {\n hash: string; // hex\n salt: string; // hex\n iterations: number;\n keyLen: number;\n}\n\nfunction _hex(buf: ArrayBuffer): string {\n return Array.from(new Uint8Array(buf)).map(b => b.toString(16).padStart(2, '0')).join('');\n}\nfunction _hexToBytes(hex: string): Uint8Array<ArrayBuffer> {\n return new Uint8Array(hex.match(/.{2}/g)!.map(h => parseInt(h, 16)));\n}\n\nexport class JoopCryptoUtils {\n\n // ── Hashing ──────────────────────────────────────────────────────────────\n\n async sha256(data: string | ArrayBuffer): Promise<string> {\n const buf = typeof data === 'string' ? new TextEncoder().encode(data) : data;\n return _hex(await crypto.subtle.digest('SHA-256', buf));\n }\n\n async sha512(data: string | ArrayBuffer): Promise<string> {\n const buf = typeof data === 'string' ? new TextEncoder().encode(data) : data;\n return _hex(await crypto.subtle.digest('SHA-512', buf));\n }\n\n async sha1(data: string | ArrayBuffer): Promise<string> {\n const buf = typeof data === 'string' ? new TextEncoder().encode(data) : data;\n return _hex(await crypto.subtle.digest('SHA-1', buf));\n }\n\n // ── HMAC ─────────────────────────────────────────────────────────────────\n\n async hmac(data: string, secret: string, algo: 'SHA-256' | 'SHA-512' | 'SHA-1' = 'SHA-256'): Promise<string> {\n const key = await crypto.subtle.importKey(\n 'raw', new TextEncoder().encode(secret),\n { name: 'HMAC', hash: algo }, false, ['sign'],\n );\n return _hex(await crypto.subtle.sign('HMAC', key, new TextEncoder().encode(data)));\n }\n\n async hmacVerify(data: string, secret: string, signature: string, algo: 'SHA-256' | 'SHA-512' | 'SHA-1' = 'SHA-256'): Promise<boolean> {\n const expected = await this.hmac(data, secret, algo);\n return this.timingSafeEqual(expected, signature);\n }\n\n // ── PBKDF2 ───────────────────────────────────────────────────────────────\n\n async pbkdf2(\n password: string,\n salt: string,\n iterations = 100_000,\n keyLen = 32,\n hash: 'SHA-256' | 'SHA-512' = 'SHA-256',\n ): Promise<string> {\n const key = await crypto.subtle.importKey('raw', new TextEncoder().encode(password), 'PBKDF2', false, ['deriveBits']);\n const bits = await crypto.subtle.deriveBits(\n { name: 'PBKDF2', salt: new TextEncoder().encode(salt), iterations, hash },\n key, keyLen * 8,\n );\n return _hex(bits);\n }\n\n // ── Password hashing ──────────────────────────────────────────────────────\n\n async hashPassword(password: string, salt?: string, iterations = 100_000): Promise<JoopPasswordHash> {\n const s = salt ?? this.generateSalt();\n const hash = await this.pbkdf2(password, s, iterations);\n return { hash, salt: s, iterations, keyLen: 32 };\n }\n\n async verifyPassword(password: string, record: JoopPasswordHash): Promise<boolean> {\n const { hash } = await this.hashPassword(password, record.salt, record.iterations);\n return this.timingSafeEqual(hash, record.hash);\n }\n\n // ── Utilities ──────────────────────────────────────────────────────────────\n\n generateSalt(bytes = 32): string { return _hex(crypto.getRandomValues(new Uint8Array(bytes)).buffer as ArrayBuffer); }\n\n randomBytes(length: number): Uint8Array<ArrayBuffer> {\n return new Uint8Array(crypto.getRandomValues(new Uint8Array(length)));\n }\n\n randomHex(bytes = 16): string { return _hex(this.randomBytes(bytes).buffer as ArrayBuffer); }\n\n uuid(): string {\n const bytes = crypto.getRandomValues(new Uint8Array(16));\n bytes[6] = (bytes[6] & 0x0f) | 0x40;\n bytes[8] = (bytes[8] & 0x3f) | 0x80;\n const hex = _hex(bytes.buffer as ArrayBuffer);\n return `${hex.slice(0,8)}-${hex.slice(8,12)}-${hex.slice(12,16)}-${hex.slice(16,20)}-${hex.slice(20)}`;\n }\n\n /** Constant-time string comparison to prevent timing attacks */\n timingSafeEqual(a: string, b: string): boolean {\n if (a.length !== b.length) return false;\n let diff = 0;\n for (let i = 0; i < a.length; i++) diff |= a.charCodeAt(i) ^ b.charCodeAt(i);\n return diff === 0;\n }\n\n hexToBytes(hex: string): Uint8Array<ArrayBuffer> { return _hexToBytes(hex); }\n bytesToHex(bytes: Uint8Array): string { return _hex(bytes.buffer as ArrayBuffer); }\n\n base64ToHex(b64: string): string { return this.bytesToHex(new Uint8Array(Array.from(atob(b64), c => c.charCodeAt(0)))); }\n hexToBase64(hex: string): string { return btoa(String.fromCharCode(..._hexToBytes(hex))); }\n\n /** Derive an AES-GCM key from a password via PBKDF2 */\n async deriveKey(password: string, salt: string, iterations = 100_000): Promise<CryptoKey> {\n const base = await crypto.subtle.importKey('raw', new TextEncoder().encode(password), 'PBKDF2', false, ['deriveKey']);\n return crypto.subtle.deriveKey(\n { name: 'PBKDF2', salt: new TextEncoder().encode(salt), iterations, hash: 'SHA-256' },\n base, { name: 'AES-GCM', length: 256 }, false, ['encrypt', 'decrypt'],\n );\n }\n}\n","import { JoopBehaviorSubject } from '../events';\nimport { JoopFormValidator, JoopValidationRule, JoopValidationResult } from '../validation/form-validator';\n\nexport interface JoopFieldConfig<T = unknown> {\n value: T;\n validators?: JoopValidationRule[];\n label?: string;\n}\n\nexport interface JoopFieldState<T = unknown> {\n value: T;\n dirty: boolean;\n touched: boolean;\n valid: boolean;\n errors: string[];\n}\n\nexport class JoopField<T = unknown> {\n private _v = new JoopFormValidator();\n private _state$: JoopBehaviorSubject<JoopFieldState<T>>;\n readonly label: string;\n private _initial: T;\n private _validators: JoopValidationRule[];\n\n constructor(config: JoopFieldConfig<T>) {\n this._initial = config.value;\n this._validators = config.validators ?? [];\n this.label = config.label ?? '';\n this._state$ = new JoopBehaviorSubject<JoopFieldState<T>>(this._build(config.value, false, false));\n }\n\n private _build(value: T, dirty: boolean, touched: boolean): JoopFieldState<T> {\n const result: JoopValidationResult = this._validators.length\n ? this._v.validate(value, this._validators)\n : { valid: true, errors: [] };\n return { value, dirty, touched, valid: result.valid, errors: result.errors };\n }\n\n get value(): T { return this._state$.getValue().value; }\n get dirty(): boolean { return this._state$.getValue().dirty; }\n get touched(): boolean { return this._state$.getValue().touched; }\n get valid(): boolean { return this._state$.getValue().valid; }\n get errors(): string[] { return this._state$.getValue().errors; }\n\n setValue(value: T): void {\n const s = this._state$.getValue();\n this._state$.next(this._build(value, s.value !== value || s.dirty, s.touched));\n }\n\n markTouched(): void {\n const s = this._state$.getValue();\n this._state$.next({ ...s, touched: true });\n }\n\n reset(): void { this._state$.next(this._build(this._initial, false, false)); }\n\n state$() { return this._state$.asObservable(); }\n}\n\nexport interface JoopFormState {\n valid: boolean;\n dirty: boolean;\n touched: boolean;\n value: Record<string, unknown>;\n}\n\nexport class JoopForm {\n private _fields: Record<string, JoopField>;\n private _state$: JoopBehaviorSubject<JoopFormState>;\n\n constructor(fields: Record<string, JoopField>) {\n this._fields = fields;\n this._state$ = new JoopBehaviorSubject<JoopFormState>(this._compute());\n for (const f of Object.values(fields)) {\n f.state$().subscribe(() => this._state$.next(this._compute()));\n }\n }\n\n private _compute(): JoopFormState {\n const entries = Object.entries(this._fields);\n return {\n valid: entries.every(([, f]) => f.valid),\n dirty: entries.some(([, f]) => f.dirty),\n touched: entries.some(([, f]) => f.touched),\n value: Object.fromEntries(entries.map(([k, f]) => [k, f.value])),\n };\n }\n\n field<T = unknown>(name: string): JoopField<T> { return this._fields[name] as JoopField<T>; }\n get valid(): boolean { return this._state$.getValue().valid; }\n get dirty(): boolean { return this._state$.getValue().dirty; }\n getValue(): Record<string, unknown> { return this._state$.getValue().value; }\n errors(): Record<string, string[]> {\n return Object.fromEntries(Object.entries(this._fields).filter(([, f]) => !f.valid).map(([k, f]) => [k, f.errors]));\n }\n reset(): void { Object.values(this._fields).forEach(f => f.reset()); }\n markAllTouched(): void { Object.values(this._fields).forEach(f => f.markTouched()); }\n state$() { return this._state$.asObservable(); }\n}\n\nexport class JoopFormBuilder {\n field<T = unknown>(value: T, validators?: JoopValidationRule[], label?: string): JoopField<T> {\n return new JoopField<T>({ value, validators, label });\n }\n\n create(schema: Record<string, JoopField>): JoopForm {\n return new JoopForm(schema);\n }\n}\n","export interface JoopTokenBucketConfig {\n capacity: number; // max tokens\n refillRate: number; // tokens per second\n}\n\nexport class JoopTokenBucket {\n private _tokens: number;\n private _lastRefill: number;\n private readonly _cap: number;\n private readonly _rate: number;\n\n constructor(config: JoopTokenBucketConfig) {\n this._cap = config.capacity;\n this._rate = config.refillRate;\n this._tokens = config.capacity;\n this._lastRefill = Date.now();\n }\n\n private _refill(): void {\n const now = Date.now();\n const elapsed = (now - this._lastRefill) / 1000;\n this._tokens = Math.min(this._cap, this._tokens + elapsed * this._rate);\n this._lastRefill = now;\n }\n\n /** Returns true if tokens were available and consumed */\n consume(tokens = 1): boolean {\n this._refill();\n if (this._tokens < tokens) return false;\n this._tokens -= tokens;\n return true;\n }\n\n /** Waits until enough tokens are available, then consumes */\n tryConsume(tokens = 1): Promise<void> {\n return new Promise(resolve => {\n const attempt = () => {\n if (this.consume(tokens)) { resolve(); return; }\n const wait = Math.ceil((tokens - this._tokens) / this._rate * 1000);\n setTimeout(attempt, wait);\n };\n attempt();\n });\n }\n\n available(): number { this._refill(); return Math.floor(this._tokens); }\n reset(): void { this._tokens = this._cap; this._lastRefill = Date.now(); }\n}\n\nexport class JoopRateLimiter {\n private _buckets = new Map<string, JoopTokenBucket>();\n private _timers = new Map<string, ReturnType<typeof setTimeout>>();\n\n /** Create or get a token bucket by key */\n bucket(key: string, config?: JoopTokenBucketConfig): JoopTokenBucket {\n if (!this._buckets.has(key)) {\n this._buckets.set(key, new JoopTokenBucket(config ?? { capacity: 10, refillRate: 1 }));\n }\n return this._buckets.get(key)!;\n }\n\n deleteBucket(key: string): void { this._buckets.delete(key); }\n\n /** Returns a throttled version — at most once per delayMs */\n throttle<T extends unknown[]>(fn: (...args: T) => void, delayMs: number): (...args: T) => void {\n let lastCall = 0;\n return (...args: T) => {\n const now = Date.now();\n if (now - lastCall >= delayMs) { lastCall = now; fn(...args); }\n };\n }\n\n /** Returns a debounced version — fires after delayMs of silence */\n debounce<T extends unknown[]>(fn: (...args: T) => void, delayMs: number, immediate = false): (...args: T) => void {\n let timer: ReturnType<typeof setTimeout> | null = null;\n return (...args: T) => {\n if (timer) clearTimeout(timer);\n if (immediate && !timer) fn(...args);\n timer = setTimeout(() => { timer = null; if (!immediate) fn(...args); }, delayMs);\n };\n }\n\n /** Promise-based debounce — resolves when the debounced call fires */\n debounceAsync<T>(fn: () => Promise<T>, delayMs: number): () => Promise<T> {\n let timer: ReturnType<typeof setTimeout> | null = null;\n let resolve: ((v: T) => void) | null = null;\n let reject: ((e: unknown) => void) | null = null;\n let pending: Promise<T> | null = null;\n return () => {\n if (!pending) pending = new Promise<T>((res, rej) => { resolve = res; reject = rej; });\n if (timer) clearTimeout(timer);\n timer = setTimeout(async () => {\n timer = null; pending = null;\n try { const v = await fn(); resolve?.(v); } catch (e) { reject?.(e); }\n resolve = null; reject = null;\n }, delayMs);\n return pending;\n };\n }\n\n /** Ensure a function is called at most once per key in the given window */\n once(key: string, fn: () => void, windowMs: number): boolean {\n if (this._timers.has(key)) return false;\n fn();\n this._timers.set(key, setTimeout(() => this._timers.delete(key), windowMs));\n return true;\n }\n}\n","import { JoopBehaviorSubject } from '../events';\n\nexport type JoopIdleState = 'active' | 'idle' | 'expired';\n\nexport interface JoopIdleConfig {\n idleMs: number; // ms of inactivity before idle\n expiredMs?: number; // ms after idle before expired (optional)\n events?: string[]; // DOM events to reset the timer\n}\n\nconst DEFAULT_EVENTS = ['mousemove', 'keydown', 'mousedown', 'scroll', 'touchstart', 'wheel'];\n\nexport class JoopIdleService {\n private _state$ = new JoopBehaviorSubject<JoopIdleState>('active');\n private _idleTimer: ReturnType<typeof setTimeout> | null = null;\n private _expiredTimer: ReturnType<typeof setTimeout> | null = null;\n private _listeners: Array<() => void> = [];\n private _cfg: JoopIdleConfig | null = null;\n private _lastActivity = Date.now();\n\n start(config: JoopIdleConfig): void {\n this.stop();\n this._cfg = config;\n this._state$.next('active');\n const events = config.events ?? DEFAULT_EVENTS;\n const reset = () => this._reset();\n for (const ev of events) {\n document.addEventListener(ev, reset, { passive: true });\n this._listeners.push(() => document.removeEventListener(ev, reset));\n }\n this._scheduleIdle();\n }\n\n stop(): void {\n this._clearTimers();\n for (const remove of this._listeners) remove();\n this._listeners = [];\n this._cfg = null;\n this._state$.next('active');\n }\n\n reset(): void { this._reset(); }\n isIdle(): boolean { return this._state$.getValue() !== 'active'; }\n getState(): JoopIdleState { return this._state$.getValue(); }\n idleMs(): number { return Date.now() - this._lastActivity; }\n state$() { return this._state$.asObservable(); }\n\n onIdle(handler: () => void): () => void {\n return this._state$.subscribe(s => s === 'idle' && handler());\n }\n\n onActive(handler: () => void): () => void {\n return this._state$.subscribe(s => s === 'active' && handler());\n }\n\n onExpired(handler: () => void): () => void {\n return this._state$.subscribe(s => s === 'expired' && handler());\n }\n\n private _reset(): void {\n this._lastActivity = Date.now();\n if (this._state$.getValue() !== 'active') this._state$.next('active');\n this._clearTimers();\n this._scheduleIdle();\n }\n\n private _scheduleIdle(): void {\n if (!this._cfg) return;\n this._idleTimer = setTimeout(() => {\n this._state$.next('idle');\n if (this._cfg?.expiredMs) {\n this._expiredTimer = setTimeout(() => this._state$.next('expired'), this._cfg.expiredMs);\n }\n }, this._cfg.idleMs);\n }\n\n private _clearTimers(): void {\n if (this._idleTimer) { clearTimeout(this._idleTimer); this._idleTimer = null; }\n if (this._expiredTimer) { clearTimeout(this._expiredTimer); this._expiredTimer = null; }\n }\n}\n","import { JoopBehaviorSubject } from '../events';\n\nexport type JoopConsentCategory = 'necessary' | 'analytics' | 'marketing' | 'functional' | 'personalization';\n\nexport interface JoopConsentState {\n decided: boolean;\n categories: Record<JoopConsentCategory, boolean>;\n timestamp: number | null;\n}\n\nconst STORAGE_KEY = 'joop_consent';\nconst ALL: JoopConsentCategory[] = ['necessary', 'analytics', 'marketing', 'functional', 'personalization'];\n\nconst DEFAULT_STATE: JoopConsentState = {\n decided: false,\n categories: { necessary: true, analytics: false, marketing: false, functional: false, personalization: false },\n timestamp: null,\n};\n\nexport class JoopConsentService {\n private _state$: JoopBehaviorSubject<JoopConsentState>;\n\n constructor(storageKey = STORAGE_KEY) {\n this._state$ = new JoopBehaviorSubject<JoopConsentState>(this._loadFrom(storageKey));\n this._key = storageKey;\n }\n\n private _key: string;\n\n private _loadFrom(key: string): JoopConsentState {\n try {\n const raw = localStorage.getItem(key);\n if (raw) return { ...DEFAULT_STATE, ...JSON.parse(raw) };\n } catch {}\n return { ...DEFAULT_STATE, categories: { ...DEFAULT_STATE.categories } };\n }\n\n /** Grant one or more categories */\n grant(categories: JoopConsentCategory | JoopConsentCategory[]): void {\n const cats = Array.isArray(categories) ? categories : [categories];\n const s = this._state$.getValue();\n const next = { ...s, decided: true, timestamp: Date.now(), categories: { ...s.categories } };\n for (const c of cats) next.categories[c] = true;\n this._state$.next(next);\n this._persist(next);\n }\n\n /** Revoke one or more categories (cannot revoke 'necessary') */\n revoke(categories: JoopConsentCategory | JoopConsentCategory[]): void {\n const cats = (Array.isArray(categories) ? categories : [categories]).filter(c => c !== 'necessary');\n const s = this._state$.getValue();\n const next = { ...s, decided: true, timestamp: Date.now(), categories: { ...s.categories } };\n for (const c of cats) next.categories[c] = false;\n this._state$.next(next);\n this._persist(next);\n }\n\n /** Grant all categories at once */\n acceptAll(): void { this.grant(ALL); }\n\n /** Reject all non-necessary categories */\n rejectAll(): void { this.revoke(ALL.filter(c => c !== 'necessary')); }\n\n isGranted(category: JoopConsentCategory): boolean { return this._state$.getValue().categories[category] ?? false; }\n hasDecided(): boolean { return this._state$.getValue().decided; }\n getAll(): Record<JoopConsentCategory, boolean> { return { ...this._state$.getValue().categories }; }\n getState(): JoopConsentState { return this._state$.getValue(); }\n state$() { return this._state$.asObservable(); }\n\n reset(): void {\n const fresh = { ...DEFAULT_STATE, categories: { ...DEFAULT_STATE.categories } };\n this._state$.next(fresh);\n try { localStorage.removeItem(this._key); } catch {}\n }\n\n onChange(handler: (state: JoopConsentState) => void): () => void {\n return this._state$.subscribe(handler);\n }\n\n onCategoryChange(category: JoopConsentCategory, handler: (granted: boolean) => void): () => void {\n let prev = this.isGranted(category);\n return this._state$.subscribe(s => {\n const cur = s.categories[category] ?? false;\n if (cur !== prev) { prev = cur; handler(cur); }\n });\n }\n\n private _persist(state: JoopConsentState): void {\n try { localStorage.setItem(this._key, JSON.stringify(state)); } catch {}\n }\n}\n","// Minimal PDF 1.4 writer — generates valid PDFs with text, lines, and tables.\n// No external dependencies. Coordinate origin: top-left (Y increases downward).\n\nexport interface JoopPdfTextOptions {\n font?: 'Helvetica' | 'Helvetica-Bold' | 'Times-Roman' | 'Courier';\n size?: number;\n color?: [number, number, number]; // RGB 0-1\n}\n\nexport interface JoopPdfLineOptions {\n width?: number;\n color?: [number, number, number];\n dash?: [number, number];\n}\n\nexport interface JoopPdfTableColumn {\n header: string;\n key: string;\n width: number;\n align?: 'left' | 'right' | 'center';\n}\n\nexport interface JoopPdfOptions {\n pageWidth?: number;\n pageHeight?: number;\n margin?: number;\n}\n\nexport interface JoopReceiptLine {\n label: string;\n value: string;\n bold?: boolean;\n}\n\nconst PT = { W: 595.28, H: 841.89 }; // A4 in points\n\nclass _PdfBuilder {\n private _objs: string[] = [];\n private _offsets: number[] = [];\n private _stream = '';\n private _pw: number;\n private _ph: number;\n private _fonts = new Set<string>();\n\n constructor(w = PT.W, h = PT.H) { this._pw = w; this._ph = h; }\n\n private _addObj(body: string): number {\n const id = this._objs.length + 1;\n this._objs.push(body);\n return id;\n }\n\n private _y(y: number): number { return this._ph - y; } // flip Y axis\n\n text(x: number, y: number, content: string, opts: JoopPdfTextOptions = {}): this {\n const font = opts.font ?? 'Helvetica';\n const size = opts.size ?? 10;\n const [r, g, b] = opts.color ?? [0, 0, 0];\n this._fonts.add(font);\n const safe = content.replace(/\\\\/g, '\\\\\\\\').replace(/\\(/g, '\\\\(').replace(/\\)/g, '\\\\)');\n this._stream += `BT\\n/${font.replace('-', '')} ${size} Tf\\n${r} ${g} ${b} rg\\n${x} ${this._y(y) - size} Td\\n(${safe}) Tj\\nET\\n`;\n return this;\n }\n\n line(x1: number, y1: number, x2: number, y2: number, opts: JoopPdfLineOptions = {}): this {\n const [r, g, b] = opts.color ?? [0, 0, 0];\n const w = opts.width ?? 0.5;\n const dash = opts.dash ? `[${opts.dash[0]} ${opts.dash[1]}] 0 d\\n` : '[] 0 d\\n';\n this._stream += `${r} ${g} ${b} RG\\n${w} w\\n${dash}${x1} ${this._y(y1)} m\\n${x2} ${this._y(y2)} l\\nS\\n`;\n return this;\n }\n\n rect(x: number, y: number, w: number, h: number, fill?: [number, number, number], stroke?: [number, number, number]): this {\n if (fill) this._stream += `${fill[0]} ${fill[1]} ${fill[2]} rg\\n${x} ${this._y(y) - h} ${w} ${h} re\\nf\\n`;\n if (stroke) this._stream += `${stroke[0]} ${stroke[1]} ${stroke[2]} RG\\n${x} ${this._y(y) - h} ${w} ${h} re\\nS\\n`;\n return this;\n }\n\n table(x: number, y: number, cols: JoopPdfTableColumn[], rows: Record<string, string>[], opts: { rowHeight?: number; headerBg?: [number, number, number]; fontSize?: number } = {}): number {\n const rh = opts.rowHeight ?? 18;\n const fs = opts.fontSize ?? 9;\n const hbg = opts.headerBg ?? [0.2, 0.4, 0.7];\n const totalW = cols.reduce((s, c) => s + c.width, 0);\n\n // Header background\n this.rect(x, y, totalW, rh, hbg);\n let cx = x;\n for (const col of cols) {\n this.text(cx + 3, y + 4, col.header, { font: 'Helvetica-Bold', size: fs, color: [1, 1, 1] });\n cx += col.width;\n }\n y += rh;\n\n for (let i = 0; i < rows.length; i++) {\n if (i % 2 === 1) this.rect(x, y, totalW, rh, [0.95, 0.95, 0.95]);\n cx = x;\n for (const col of cols) {\n const val = String(rows[i][col.key] ?? '');\n const textX = col.align === 'right' ? cx + col.width - 3 - val.length * fs * 0.5\n : col.align === 'center' ? cx + col.width / 2 - val.length * fs * 0.25\n : cx + 3;\n this.text(textX, y + 4, val, { size: fs });\n cx += col.width;\n }\n this.line(x, y + rh, x + totalW, y + rh, { width: 0.3, color: [0.8, 0.8, 0.8] });\n y += rh;\n }\n return y;\n }\n\n build(): Uint8Array {\n // Font dictionary entries\n const fontNames = ['Helvetica', 'HelveticaBold', 'TimesRoman', 'Courier'];\n const fontObjs: number[] = [];\n for (const fn of fontNames) {\n const baseName = fn === 'HelveticaBold' ? 'Helvetica-Bold' : fn === 'TimesRoman' ? 'Times-Roman' : fn;\n fontObjs.push(this._addObj(`<< /Type /Font /Subtype /Type1 /BaseFont /${baseName} /Encoding /WinAnsiEncoding >>`));\n }\n\n const fontDict = fontNames.map((n, i) => `/${n} ${fontObjs[i]} 0 R`).join('\\n');\n const resources = this._addObj(`<< /Font << ${fontDict} >> >>`);\n\n const streamBytes = new TextEncoder().encode(this._stream);\n const contentObj = this._addObj(`<< /Length ${streamBytes.length} >>\\nstream\\n${this._stream}endstream`);\n const pageObj = this._addObj(`<< /Type /Page /Parent 2 0 R /MediaBox [0 0 ${this._pw} ${this._ph}] /Contents ${contentObj} 0 R /Resources ${resources} 0 R >>`);\n const pagesObj = 2; // reserved slot\n const catalogObj = 1; // reserved slot\n\n // Rebuild in order: catalog=1, pages=2, then all others\n const ordered = [\n `<< /Type /Catalog /Pages 2 0 R >>`,\n `<< /Type /Pages /Kids [${pageObj} 0 R] /Count 1 >>`,\n ...this._objs.slice(2),\n ];\n\n let body = '%PDF-1.4\\n';\n const offsets: number[] = [];\n for (let i = 0; i < ordered.length; i++) {\n offsets.push(body.length);\n body += `${i + 1} 0 obj\\n${ordered[i]}\\nendobj\\n`;\n }\n\n const xrefOffset = body.length;\n body += `xref\\n0 ${ordered.length + 1}\\n0000000000 65535 f \\n`;\n for (const off of offsets) body += `${String(off).padStart(10, '0')} 00000 n \\n`;\n body += `trailer\\n<< /Size ${ordered.length + 1} /Root 1 0 R >>\\nstartxref\\n${xrefOffset}\\n%%EOF`;\n\n return new TextEncoder().encode(body);\n }\n}\n\nexport class JoopPdfService {\n private _opts: JoopPdfOptions;\n\n constructor(opts: JoopPdfOptions = {}) { this._opts = opts; }\n\n private _builder(): _PdfBuilder {\n return new _PdfBuilder(this._opts.pageWidth ?? PT.W, this._opts.pageHeight ?? PT.H);\n }\n\n /** Generate a basic receipt PDF */\n receipt(title: string, lines: JoopReceiptLine[], footer?: string): Uint8Array {\n const m = this._opts.margin ?? 60;\n const pw = this._opts.pageWidth ?? PT.W;\n const doc = this._builder();\n let y = m;\n\n doc.text(m, y, title, { font: 'Helvetica-Bold', size: 16 });\n y += 30;\n doc.line(m, y, pw - m, y);\n y += 12;\n\n for (const line of lines) {\n const font = line.bold ? 'Helvetica-Bold' : 'Helvetica';\n doc.text(m, y, line.label, { font, size: 10 });\n doc.text(pw - m - line.value.length * 6, y, line.value, { font, size: 10 });\n y += 16;\n }\n\n doc.line(m, y, pw - m, y);\n y += 14;\n if (footer) doc.text(m, y, footer, { size: 8, color: [0.5, 0.5, 0.5] });\n\n return doc.build();\n }\n\n /** Generate a statement with a table */\n statement(\n title: string,\n subtitle: string,\n columns: JoopPdfTableColumn[],\n rows: Record<string, string>[],\n summary?: JoopReceiptLine[],\n ): Uint8Array {\n const m = this._opts.margin ?? 40;\n const pw = this._opts.pageWidth ?? PT.W;\n const doc = this._builder();\n let y = m;\n\n doc.text(m, y, title, { font: 'Helvetica-Bold', size: 14 });\n y += 20;\n doc.text(m, y, subtitle, { size: 9, color: [0.4, 0.4, 0.4] });\n y += 16;\n doc.line(m, y, pw - m, y);\n y += 12;\n\n y = doc.table(m, y, columns, rows) + 10;\n\n if (summary) {\n for (const line of summary) {\n const font = line.bold ? 'Helvetica-Bold' : 'Helvetica';\n doc.text(m, y, line.label, { font, size: 10 });\n doc.text(pw - m - line.value.length * 6, y, line.value, { font, size: 10 });\n y += 16;\n }\n }\n\n return doc.build();\n }\n\n /** Wrap raw bytes as a base64 data URL */\n toDataUrl(bytes: Uint8Array): string {\n let bin = '';\n for (const b of bytes) bin += String.fromCharCode(b);\n return `data:application/pdf;base64,${btoa(bin)}`;\n }\n\n /** Trigger browser download */\n download(bytes: Uint8Array, filename = 'document.pdf'): void {\n const blob = new Blob([new Uint8Array(bytes)], { type: 'application/pdf' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url; a.download = filename; a.click();\n URL.revokeObjectURL(url);\n }\n\n /** Low-level builder for custom documents */\n builder(): _PdfBuilder { return this._builder(); }\n}\n","import { JoopBehaviorSubject } from '../events';\n\nexport type JoopNotificationPermission = 'default' | 'granted' | 'denied';\n\nexport interface JoopNotificationOptions extends NotificationOptions {\n tag?: string;\n requireInteraction?: boolean;\n}\n\nexport class JoopNotificationService {\n private _permission$ = new JoopBehaviorSubject<JoopNotificationPermission>(\n typeof Notification !== 'undefined' ? Notification.permission as JoopNotificationPermission : 'default',\n );\n private _messageHandlers: Array<(event: MessageEvent) => void> = [];\n private _swReg: ServiceWorkerRegistration | null = null;\n\n isSupported(): boolean { return typeof Notification !== 'undefined'; }\n\n getPermission(): JoopNotificationPermission { return this._permission$.getValue(); }\n permission$() { return this._permission$.asObservable(); }\n\n async requestPermission(): Promise<JoopNotificationPermission> {\n if (!this.isSupported()) return 'denied';\n const result = await Notification.requestPermission() as JoopNotificationPermission;\n this._permission$.next(result);\n return result;\n }\n\n async show(title: string, options: JoopNotificationOptions = {}): Promise<Notification | null> {\n if (this._permission$.getValue() !== 'granted') {\n const p = await this.requestPermission();\n if (p !== 'granted') return null;\n }\n if (this._swReg) {\n await this._swReg.showNotification(title, options);\n return null;\n }\n return new Notification(title, options);\n }\n\n async setServiceWorker(reg: ServiceWorkerRegistration): Promise<void> {\n this._swReg = reg;\n }\n\n async subscribe(vapidPublicKey: string): Promise<PushSubscription | null> {\n if (!this._swReg) throw new Error('JoopNotification: ServiceWorkerRegistration required');\n const key = _urlBase64ToUint8Array(vapidPublicKey);\n return this._swReg.pushManager.subscribe({ userVisibleOnly: true, applicationServerKey: key });\n }\n\n async unsubscribe(): Promise<boolean> {\n if (!this._swReg) return false;\n const sub = await this._swReg.pushManager.getSubscription();\n if (!sub) return false;\n return sub.unsubscribe();\n }\n\n async getSubscription(): Promise<PushSubscription | null> {\n if (!this._swReg) return null;\n return this._swReg.pushManager.getSubscription();\n }\n\n onMessage(handler: (event: MessageEvent) => void): () => void {\n this._messageHandlers.push(handler);\n navigator.serviceWorker?.addEventListener('message', handler);\n return () => {\n this._messageHandlers = this._messageHandlers.filter(h => h !== handler);\n navigator.serviceWorker?.removeEventListener('message', handler);\n };\n }\n\n destroy(): void {\n for (const h of this._messageHandlers) navigator.serviceWorker?.removeEventListener('message', h);\n this._messageHandlers = [];\n }\n}\n\nfunction _urlBase64ToUint8Array(base64String: string): Uint8Array<ArrayBuffer> {\n const padding = '='.repeat((4 - (base64String.length % 4)) % 4);\n const base64 = (base64String + padding).replace(/-/g, '+').replace(/_/g, '/');\n const raw = atob(base64);\n return new Uint8Array(Array.from(raw, c => c.charCodeAt(0)));\n}\n","export type JoopAriaLivePoliteness = 'assertive' | 'polite' | 'off';\n\nexport interface JoopFocusTrapOptions {\n initialFocus?: string; // CSS selector\n returnFocusOnDeactivate?: boolean;\n}\n\nexport class JoopA11yService {\n private _liveRegions = new Map<JoopAriaLivePoliteness, HTMLElement>();\n private _trapStack: Array<{ el: HTMLElement; prev: Element | null; release: () => void }> = [];\n private _skipLink: HTMLElement | null = null;\n private _focusHandlers: Array<(el: Element) => void> = [];\n private _focusListener: ((e: FocusEvent) => void) | null = null;\n\n // ── ARIA Live Regions ────────────────────────────────────────────────────\n\n announce(message: string, politeness: JoopAriaLivePoliteness = 'polite'): void {\n const region = this._getOrCreateLiveRegion(politeness);\n // Clear and re-set to force screen reader re-announcement\n region.textContent = '';\n setTimeout(() => { region.textContent = message; }, 50);\n }\n\n private _getOrCreateLiveRegion(politeness: JoopAriaLivePoliteness): HTMLElement {\n if (!this._liveRegions.has(politeness)) {\n const el = document.createElement('div');\n el.setAttribute('aria-live', politeness);\n el.setAttribute('aria-atomic', 'true');\n el.setAttribute('aria-relevant', 'additions text');\n Object.assign(el.style, { position: 'absolute', width: '1px', height: '1px', padding: '0', overflow: 'hidden', clip: 'rect(0,0,0,0)', whiteSpace: 'nowrap', border: '0' });\n document.body.appendChild(el);\n this._liveRegions.set(politeness, el);\n }\n return this._liveRegions.get(politeness)!;\n }\n\n clearAnnouncements(): void {\n for (const el of this._liveRegions.values()) el.textContent = '';\n }\n\n // ── Focus Trap ───────────────────────────────────────────────────────────\n\n trapFocus(container: HTMLElement, opts: JoopFocusTrapOptions = {}): () => void {\n const prev = document.activeElement;\n const focusable = (): NodeListOf<HTMLElement> =>\n container.querySelectorAll<HTMLElement>('a[href],button:not([disabled]),input:not([disabled]),select:not([disabled]),textarea:not([disabled]),[tabindex]:not([tabindex=\"-1\"])');\n\n const handleKeydown = (e: KeyboardEvent) => {\n if (e.key !== 'Tab') return;\n const elements = Array.from(focusable());\n if (!elements.length) { e.preventDefault(); return; }\n const first = elements[0], last = elements[elements.length - 1];\n if (e.shiftKey && document.activeElement === first) { e.preventDefault(); last.focus(); }\n else if (!e.shiftKey && document.activeElement === last) { e.preventDefault(); first.focus(); }\n };\n\n container.addEventListener('keydown', handleKeydown);\n\n const initialEl = opts.initialFocus\n ? container.querySelector<HTMLElement>(opts.initialFocus)\n : focusable()[0];\n initialEl?.focus();\n\n const release = () => {\n container.removeEventListener('keydown', handleKeydown);\n if (opts.returnFocusOnDeactivate !== false && prev instanceof HTMLElement) prev.focus();\n };\n\n this._trapStack.push({ el: container, prev, release });\n return release;\n }\n\n releaseFocus(): void {\n const entry = this._trapStack.pop();\n entry?.release();\n }\n\n releaseAllTraps(): void {\n while (this._trapStack.length) this.releaseFocus();\n }\n\n // ── Skip Link ────────────────────────────────────────────────────────────\n\n createSkipLink(targetId: string, label = 'Skip to main content'): HTMLElement {\n const link = document.createElement('a');\n link.href = `#${targetId}`;\n link.textContent = label;\n link.className = 'joop-skip-link';\n Object.assign(link.style, {\n position: 'absolute', top: '-9999px', left: '0',\n zIndex: '9999', padding: '8px 16px',\n background: '#fff', color: '#000', textDecoration: 'underline',\n });\n link.addEventListener('focus', () => { link.style.top = '0'; });\n link.addEventListener('blur', () => { link.style.top = '-9999px'; });\n document.body.insertBefore(link, document.body.firstChild);\n this._skipLink = link;\n return link;\n }\n\n removeSkipLink(): void { this._skipLink?.remove(); this._skipLink = null; }\n\n // ── Keyboard helpers ─────────────────────────────────────────────────────\n\n /** Start tracking focus changes */\n trackFocus(): () => void {\n const handler = (e: FocusEvent) => {\n if (e.target instanceof Element) this._focusHandlers.forEach(h => h(e.target as Element));\n };\n document.addEventListener('focusin', handler);\n this._focusListener = handler;\n return () => { document.removeEventListener('focusin', handler); this._focusListener = null; };\n }\n\n onFocusChange(handler: (el: Element) => void): () => void {\n this._focusHandlers.push(handler);\n return () => { this._focusHandlers = this._focusHandlers.filter(h => h !== handler); };\n }\n\n /** Set visible page title + meta description */\n setPageTitle(title: string, suffix?: string): void {\n document.title = suffix ? `${title} — ${suffix}` : title;\n }\n\n /** Make an element visually hidden but accessible */\n visuallyHide(el: HTMLElement): void {\n Object.assign(el.style, { position: 'absolute', width: '1px', height: '1px', padding: '0', overflow: 'hidden', clip: 'rect(0,0,0,0)', whiteSpace: 'nowrap', border: '0' });\n }\n\n /** Get all focusable elements within a container */\n getFocusable(container: HTMLElement = document.body): HTMLElement[] {\n return Array.from(container.querySelectorAll<HTMLElement>(\n 'a[href],button:not([disabled]),input:not([disabled]),select:not([disabled]),textarea:not([disabled]),[tabindex]:not([tabindex=\"-1\"])',\n ));\n }\n\n /** Check whether an element is visible and not hidden from accessibility */\n isAccessible(el: HTMLElement): boolean {\n const style = window.getComputedStyle(el);\n return style.display !== 'none' && style.visibility !== 'hidden' && el.getAttribute('aria-hidden') !== 'true';\n }\n\n destroy(): void {\n for (const el of this._liveRegions.values()) el.remove();\n this._liveRegions.clear();\n this.releaseAllTraps();\n this.removeSkipLink();\n if (this._focusListener) document.removeEventListener('focusin', this._focusListener);\n }\n}\n","import { JoopBehaviorSubject } from '../events';\n\nexport interface JoopRoute {\n path: string;\n params: Record<string, string>;\n query: Record<string, string>;\n hash: string;\n state: unknown;\n}\n\nexport type JoopRouteGuard = (from: JoopRoute, to: JoopRoute) => boolean | Promise<boolean>;\n\nexport interface JoopRoutePattern {\n pattern: string;\n keys: string[];\n regex: RegExp;\n}\n\nfunction _parseQuery(search: string): Record<string, string> {\n const out: Record<string, string> = {};\n for (const [k, v] of new URLSearchParams(search)) out[k] = v;\n return out;\n}\n\nfunction _compilePattern(pattern: string): JoopRoutePattern {\n const keys: string[] = [];\n const regex = new RegExp(\n '^' + pattern.replace(/:([^/]+)/g, (_, k) => { keys.push(k); return '([^/]+)'; }) + '/?$',\n );\n return { pattern, keys, regex };\n}\n\nfunction _matchRoute(pattern: JoopRoutePattern, path: string): Record<string, string> | null {\n const m = pattern.regex.exec(path);\n if (!m) return null;\n const params: Record<string, string> = {};\n pattern.keys.forEach((k, i) => { params[k] = decodeURIComponent(m[i + 1]); });\n return params;\n}\n\nexport class JoopRouterService {\n private _route$ = new JoopBehaviorSubject<JoopRoute>(this._current());\n private _guards: JoopRouteGuard[] = [];\n private _popHandler: (() => void) | null = null;\n\n constructor() {\n const handler = () => this._route$.next(this._current());\n window.addEventListener('popstate', handler);\n this._popHandler = () => window.removeEventListener('popstate', handler);\n }\n\n private _current(): JoopRoute {\n const { pathname, search, hash } = window.location;\n return { path: pathname, params: {}, query: _parseQuery(search), hash: hash.slice(1), state: history.state };\n }\n\n async navigate(path: string, state?: unknown, replace = false): Promise<boolean> {\n const from = this._route$.getValue();\n const to = this._parse(path, state);\n for (const guard of this._guards) {\n if (!await guard(from, to)) return false;\n }\n if (replace) history.replaceState(state ?? null, '', path);\n else history.pushState(state ?? null, '', path);\n this._route$.next(to);\n return true;\n }\n\n async replace(path: string, state?: unknown): Promise<boolean> { return this.navigate(path, state, true); }\n back(): void { history.back(); }\n forward(): void { history.forward(); }\n go(delta: number): void { history.go(delta); }\n\n currentRoute(): JoopRoute { return this._route$.getValue(); }\n currentPath(): string { return this._route$.getValue().path; }\n route$() { return this._route$.asObservable(); }\n\n addGuard(guard: JoopRouteGuard): () => void {\n this._guards.push(guard);\n return () => { this._guards = this._guards.filter(g => g !== guard); };\n }\n\n /** Match current path against a pattern like '/users/:id' */\n match(pattern: string): Record<string, string> | null {\n return _matchRoute(_compilePattern(pattern), this.currentPath());\n }\n\n buildUrl(path: string, params?: Record<string, string>, query?: Record<string, string>): string {\n let url = path;\n if (params) for (const [k, v] of Object.entries(params)) url = url.replace(`:${k}`, encodeURIComponent(v));\n if (query && Object.keys(query).length) url += '?' + new URLSearchParams(query).toString();\n return url;\n }\n\n parseUrl(url: string): JoopRoute {\n const a = document.createElement('a');\n a.href = url;\n return { path: a.pathname, params: {}, query: _parseQuery(a.search), hash: a.hash.slice(1), state: null };\n }\n\n private _parse(path: string, state: unknown): JoopRoute {\n const idx = path.indexOf('?');\n const hashIdx = path.indexOf('#');\n const bare = idx !== -1 ? path.slice(0, idx) : hashIdx !== -1 ? path.slice(0, hashIdx) : path;\n const search = idx !== -1 ? path.slice(idx, hashIdx !== -1 ? hashIdx : undefined) : '';\n const hash = hashIdx !== -1 ? path.slice(hashIdx + 1) : '';\n return { path: bare, params: {}, query: _parseQuery(search), hash, state };\n }\n\n destroy(): void { this._popHandler?.(); this._guards = []; }\n}\n","import { JoopBehaviorSubject } from '../events';\n\nexport type JoopSwState = 'unregistered' | 'installing' | 'installed' | 'activating' | 'activated' | 'redundant';\n\nexport class JoopServiceWorkerService {\n private _reg: ServiceWorkerRegistration | null = null;\n private _state$ = new JoopBehaviorSubject<JoopSwState>('unregistered');\n private _updateHandlers: Array<() => void> = [];\n private _controllerHandlers: Array<() => void> = [];\n private _messageHandlers: Array<(data: unknown) => void> = [];\n private _swMessageListener: ((e: MessageEvent) => void) | null = null;\n private _controllerListener: (() => void) | null = null;\n\n isSupported(): boolean { return 'serviceWorker' in navigator; }\n isControlled(): boolean { return !!navigator.serviceWorker?.controller; }\n getRegistration(): ServiceWorkerRegistration | null { return this._reg; }\n state$() { return this._state$.asObservable(); }\n\n async register(scriptUrl: string, options?: RegistrationOptions): Promise<ServiceWorkerRegistration> {\n if (!this.isSupported()) throw new Error('ServiceWorker not supported');\n this._reg = await navigator.serviceWorker.register(scriptUrl, options);\n this._trackState(this._reg);\n this._listenForUpdates(this._reg);\n\n this._swMessageListener = (e: MessageEvent) => { this._messageHandlers.forEach(h => h(e.data)); };\n navigator.serviceWorker.addEventListener('message', this._swMessageListener);\n\n this._controllerListener = () => { this._controllerHandlers.forEach(h => h()); };\n navigator.serviceWorker.addEventListener('controllerchange', this._controllerListener);\n\n return this._reg;\n }\n\n async unregister(): Promise<boolean> {\n if (!this._reg) return false;\n const result = await this._reg.unregister();\n if (result) { this._reg = null; this._state$.next('unregistered'); }\n return result;\n }\n\n async update(): Promise<void> {\n if (!this._reg) throw new Error('No service worker registered');\n await this._reg.update();\n }\n\n async postMessage(data: unknown): Promise<void> {\n if (!this._reg?.active) throw new Error('No active service worker');\n this._reg.active.postMessage(data);\n }\n\n onUpdateAvailable(handler: () => void): () => void {\n this._updateHandlers.push(handler);\n return () => { this._updateHandlers = this._updateHandlers.filter(h => h !== handler); };\n }\n\n onControllerChange(handler: () => void): () => void {\n this._controllerHandlers.push(handler);\n return () => { this._controllerHandlers = this._controllerHandlers.filter(h => h !== handler); };\n }\n\n onMessage(handler: (data: unknown) => void): () => void {\n this._messageHandlers.push(handler);\n return () => { this._messageHandlers = this._messageHandlers.filter(h => h !== handler); };\n }\n\n isOnline(): boolean { return navigator.onLine; }\n\n onlineState$(): JoopBehaviorSubject<boolean> {\n const s$ = new JoopBehaviorSubject<boolean>(navigator.onLine);\n window.addEventListener('online', () => s$.next(true));\n window.addEventListener('offline', () => s$.next(false));\n return s$;\n }\n\n private _trackState(reg: ServiceWorkerRegistration): void {\n const sw = reg.installing ?? reg.waiting ?? reg.active;\n if (sw) this._state$.next(sw.state as JoopSwState);\n const track = (worker: ServiceWorker | null) => {\n if (!worker) return;\n worker.addEventListener('statechange', () => this._state$.next(worker.state as JoopSwState));\n };\n track(reg.installing); track(reg.waiting); track(reg.active);\n reg.addEventListener('updatefound', () => track(reg.installing));\n }\n\n private _listenForUpdates(reg: ServiceWorkerRegistration): void {\n reg.addEventListener('updatefound', () => {\n const newSw = reg.installing;\n if (!newSw) return;\n newSw.addEventListener('statechange', () => {\n if (newSw.state === 'installed' && navigator.serviceWorker.controller) {\n this._updateHandlers.forEach(h => h());\n }\n });\n });\n }\n\n destroy(): void {\n if (this._swMessageListener) navigator.serviceWorker?.removeEventListener('message', this._swMessageListener);\n if (this._controllerListener) navigator.serviceWorker?.removeEventListener('controllerchange', this._controllerListener);\n this._updateHandlers = []; this._controllerHandlers = []; this._messageHandlers = [];\n }\n}\n","export interface JoopGeoPosition {\n latitude: number;\n longitude: number;\n accuracy: number;\n altitude: number | null;\n speed: number | null;\n heading: number | null;\n timestamp: number;\n}\n\nexport interface JoopGeoOptions extends PositionOptions {\n timeout?: number;\n maximumAge?: number;\n enableHighAccuracy?: boolean;\n}\n\nexport class JoopGeoService {\n isSupported(): boolean { return 'geolocation' in navigator; }\n\n async getPosition(opts: JoopGeoOptions = {}): Promise<JoopGeoPosition> {\n return new Promise((resolve, reject) => {\n if (!this.isSupported()) { reject(new Error('Geolocation not supported')); return; }\n navigator.geolocation.getCurrentPosition(\n (p) => resolve(this._map(p)),\n (e) => reject(e),\n opts,\n );\n });\n }\n\n watchPosition(\n onSuccess: (pos: JoopGeoPosition) => void,\n onError?: (err: GeolocationPositionError) => void,\n opts: JoopGeoOptions = {},\n ): number {\n return navigator.geolocation.watchPosition(\n (p) => onSuccess(this._map(p)),\n onError,\n opts,\n );\n }\n\n clearWatch(id: number): void { navigator.geolocation.clearWatch(id); }\n\n async getPermissionState(): Promise<PermissionState> {\n if (!('permissions' in navigator)) return 'prompt';\n const status = await navigator.permissions.query({ name: 'geolocation' });\n return status.state;\n }\n\n /** Haversine distance in kilometers */\n distance(from: { latitude: number; longitude: number }, to: { latitude: number; longitude: number }): number {\n const R = 6371;\n const dLat = _rad(to.latitude - from.latitude);\n const dLon = _rad(to.longitude - from.longitude);\n const a = Math.sin(dLat / 2) ** 2 +\n Math.cos(_rad(from.latitude)) * Math.cos(_rad(to.latitude)) * Math.sin(dLon / 2) ** 2;\n return R * 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));\n }\n\n isInRadius(\n point: { latitude: number; longitude: number },\n center: { latitude: number; longitude: number },\n radiusKm: number,\n ): boolean { return this.distance(point, center) <= radiusKm; }\n\n /** Compute compass bearing from `from` to `to` in degrees (0–360) */\n bearing(from: { latitude: number; longitude: number }, to: { latitude: number; longitude: number }): number {\n const dLon = _rad(to.longitude - from.longitude);\n const lat1 = _rad(from.latitude), lat2 = _rad(to.latitude);\n const y = Math.sin(dLon) * Math.cos(lat2);\n const x = Math.cos(lat1) * Math.sin(lat2) - Math.sin(lat1) * Math.cos(lat2) * Math.cos(dLon);\n return (_deg(Math.atan2(y, x)) + 360) % 360;\n }\n\n formatCoords(lat: number, lon: number, format: 'dms' | 'decimal' = 'decimal'): string {\n if (format === 'decimal') return `${lat.toFixed(6)}, ${lon.toFixed(6)}`;\n const fmt = (d: number, posLabel: string, negLabel: string) => {\n const abs = Math.abs(d);\n const deg = Math.floor(abs), min = Math.floor((abs - deg) * 60);\n const sec = ((abs - deg - min / 60) * 3600).toFixed(2);\n return `${deg}° ${min}' ${sec}\" ${d >= 0 ? posLabel : negLabel}`;\n };\n return `${fmt(lat, 'N', 'S')}, ${fmt(lon, 'E', 'W')}`;\n }\n\n private _map(p: GeolocationPosition): JoopGeoPosition {\n return {\n latitude: p.coords.latitude,\n longitude: p.coords.longitude,\n accuracy: p.coords.accuracy,\n altitude: p.coords.altitude,\n speed: p.coords.speed,\n heading: p.coords.heading,\n timestamp: p.timestamp,\n };\n }\n}\n\nfunction _rad(d: number): number { return d * Math.PI / 180; }\nfunction _deg(r: number): number { return r * 180 / Math.PI; }\n","export interface JoopMediaConstraints {\n video?: boolean | MediaTrackConstraints;\n audio?: boolean | MediaTrackConstraints;\n}\n\nexport interface JoopRecorderOptions {\n mimeType?: string;\n audioBitsPerSecond?: number;\n videoBitsPerSecond?: number;\n timeslice?: number;\n}\n\nexport class JoopMediaRecorder {\n private _recorder: MediaRecorder;\n private _chunks: Blob[] = [];\n\n constructor(stream: MediaStream, opts: JoopRecorderOptions = {}) {\n const mimeType = opts.mimeType ?? (MediaRecorder.isTypeSupported('video/webm') ? 'video/webm' : '');\n this._recorder = new MediaRecorder(stream, { mimeType, audioBitsPerSecond: opts.audioBitsPerSecond, videoBitsPerSecond: opts.videoBitsPerSecond });\n this._recorder.ondataavailable = (e) => { if (e.data.size > 0) this._chunks.push(e.data); };\n }\n\n start(timeslice?: number): void { this._recorder.start(timeslice); }\n\n stop(): Promise<Blob> {\n return new Promise((resolve) => {\n this._recorder.onstop = () => {\n const mimeType = this._recorder.mimeType || 'video/webm';\n resolve(new Blob(this._chunks, { type: mimeType }));\n };\n this._recorder.stop();\n });\n }\n\n pause(): void { this._recorder.pause(); }\n resume(): void { this._recorder.resume(); }\n getState(): RecordingState { return this._recorder.state; }\n}\n\nexport class JoopMediaService {\n isSupported(): boolean { return 'mediaDevices' in navigator; }\n\n async requestStream(constraints: JoopMediaConstraints): Promise<MediaStream> {\n if (!this.isSupported()) throw new Error('MediaDevices not supported');\n return navigator.mediaDevices.getUserMedia(constraints);\n }\n\n async requestCamera(constraints: MediaTrackConstraints = {}): Promise<MediaStream> {\n return this.requestStream({ video: Object.keys(constraints).length ? constraints : true });\n }\n\n async requestMicrophone(constraints: MediaTrackConstraints = {}): Promise<MediaStream> {\n return this.requestStream({ audio: Object.keys(constraints).length ? constraints : true });\n }\n\n async requestScreenShare(withAudio = false): Promise<MediaStream> {\n if (!('getDisplayMedia' in navigator.mediaDevices)) throw new Error('Screen capture not supported');\n return navigator.mediaDevices.getDisplayMedia({ video: true, audio: withAudio });\n }\n\n stopStream(stream: MediaStream): void { stream.getTracks().forEach(t => t.stop()); }\n\n async capturePhoto(stream: MediaStream, quality = 0.92): Promise<Blob> {\n const video = document.createElement('video');\n video.srcObject = stream;\n video.muted = true;\n await video.play();\n const canvas = document.createElement('canvas');\n canvas.width = video.videoWidth;\n canvas.height = video.videoHeight;\n canvas.getContext('2d')!.drawImage(video, 0, 0);\n return new Promise((resolve, reject) => canvas.toBlob(b => b ? resolve(b) : reject(new Error('Capture failed')), 'image/jpeg', quality));\n }\n\n createRecorder(stream: MediaStream, opts?: JoopRecorderOptions): JoopMediaRecorder {\n return new JoopMediaRecorder(stream, opts);\n }\n\n async getDevices(kind?: MediaDeviceKind): Promise<MediaDeviceInfo[]> {\n const devices = await navigator.mediaDevices.enumerateDevices();\n return kind ? devices.filter(d => d.kind === kind) : devices;\n }\n\n async checkPermission(kind: 'camera' | 'microphone'): Promise<PermissionState> {\n if (!('permissions' in navigator)) return 'prompt';\n const name = kind === 'camera' ? 'camera' : 'microphone';\n const status = await navigator.permissions.query({ name: name as PermissionName });\n return status.state;\n }\n\n /** Attach a stream to a <video> element */\n attachStream(stream: MediaStream, videoEl: HTMLVideoElement, muted = true): void {\n videoEl.srcObject = stream;\n videoEl.muted = muted;\n videoEl.play().catch(() => {});\n }\n}\n","export interface JoopToolParameter {\n type: 'string' | 'number' | 'boolean' | 'object' | 'array';\n description?: string;\n enum?: unknown[];\n items?: JoopToolParameter;\n properties?: Record<string, JoopToolParameter>;\n required?: string[];\n}\n\nexport interface JoopToolDefinition {\n name: string;\n description: string;\n parameters: Record<string, JoopToolParameter>;\n required?: string[];\n handler: (args: Record<string, unknown>) => Promise<unknown>;\n}\n\nexport interface JoopToolCall {\n name: string;\n arguments: string | Record<string, unknown>;\n}\n\nexport interface JoopToolResult {\n name: string;\n result: unknown;\n error?: string;\n durationMs: number;\n}\n\nexport class JoopToolRegistry {\n private _tools = new Map<string, JoopToolDefinition>();\n\n register(tool: JoopToolDefinition): void {\n if (this._tools.has(tool.name)) throw new Error(`Tool '${tool.name}' already registered. Use update() to replace.`);\n this._tools.set(tool.name, tool);\n }\n\n update(tool: JoopToolDefinition): void { this._tools.set(tool.name, tool); }\n unregister(name: string): void { this._tools.delete(name); }\n has(name: string): boolean { return this._tools.has(name); }\n list(): string[] { return Array.from(this._tools.keys()); }\n get(name: string): JoopToolDefinition | undefined { return this._tools.get(name); }\n clear(): void { this._tools.clear(); }\n\n async dispatch(call: JoopToolCall): Promise<JoopToolResult> {\n const tool = this._tools.get(call.name);\n if (!tool) return { name: call.name, result: null, error: `Unknown tool: ${call.name}`, durationMs: 0 };\n\n const args = typeof call.arguments === 'string' ? JSON.parse(call.arguments) : call.arguments;\n const t0 = Date.now();\n try {\n const result = await tool.handler(args as Record<string, unknown>);\n return { name: call.name, result, durationMs: Date.now() - t0 };\n } catch (e) {\n return { name: call.name, result: null, error: String(e), durationMs: Date.now() - t0 };\n }\n }\n\n /** Dispatch multiple tool calls in parallel */\n async dispatchAll(calls: JoopToolCall[]): Promise<JoopToolResult[]> {\n return Promise.all(calls.map(c => this.dispatch(c)));\n }\n\n /** Format for OpenAI function-calling */\n toOpenAiFormat(): object[] {\n return Array.from(this._tools.values()).map(t => ({\n type: 'function',\n function: {\n name: t.name,\n description: t.description,\n parameters: {\n type: 'object',\n properties: t.parameters,\n required: t.required ?? [],\n },\n },\n }));\n }\n\n /** Format for Anthropic tool-use */\n toAnthropicFormat(): object[] {\n return Array.from(this._tools.values()).map(t => ({\n name: t.name,\n description: t.description,\n input_schema: {\n type: 'object',\n properties: t.parameters,\n required: t.required ?? [],\n },\n }));\n }\n\n /** Format for Google Gemini function declarations */\n toGeminiFormat(): object[] {\n return [{\n function_declarations: Array.from(this._tools.values()).map(t => ({\n name: t.name,\n description: t.description,\n parameters: { type: 'object', properties: t.parameters, required: t.required ?? [] },\n })),\n }];\n }\n}\n","import type { JoopPlatformAdapterConfig, JoopStorageAdapter } from './adapters';\n\nexport type JoopPlatformType = 'web' | 'react-native' | 'node' | 'unknown';\n\nexport interface JoopCapabilities {\n compression: boolean;\n workers: boolean;\n cryptoSubtle: boolean;\n persistentStorage: boolean;\n dom: boolean;\n serviceWorker: boolean;\n}\n\nexport interface JoopPlatformConfig {\n adapter?: JoopPlatformAdapterConfig;\n /** Override auto-detection — useful in tests or SSR */\n platform?: JoopPlatformType;\n}\n\n// ---------------------------------------------------------------------------\n// Built-in storage adapters\n// ---------------------------------------------------------------------------\n\nconst _webStorage = (store: Storage): JoopStorageAdapter => ({\n getItem: (k) => store.getItem(k),\n setItem: (k, v) => store.setItem(k, v),\n removeItem: (k) => store.removeItem(k),\n clear: () => store.clear(),\n});\n\nclass _MemStorageImpl implements JoopStorageAdapter {\n private _m = new Map<string, string>();\n getItem(k: string) { return this._m.get(k) ?? null; }\n setItem(k: string, v: string) { this._m.set(k, v); }\n removeItem(k: string) { this._m.delete(k); }\n clear() { this._m.clear(); }\n}\n\n// ---------------------------------------------------------------------------\n// Platform detection\n// ---------------------------------------------------------------------------\n\nfunction _detect(): JoopPlatformType {\n // React Native sets navigator.product = 'ReactNative'\n if (typeof navigator !== 'undefined' && navigator.product === 'ReactNative') return 'react-native';\n // Node.js: no window, has globalThis.process.versions.node\n const _proc = (globalThis as Record<string, unknown>)['process'] as { versions?: { node?: string } } | undefined;\n if (typeof window === 'undefined' && _proc?.versions?.node) return 'node';\n // Browser\n if (typeof window !== 'undefined') return 'web';\n return 'unknown';\n}\n\n// ---------------------------------------------------------------------------\n// JoopPlatform\n// ---------------------------------------------------------------------------\n\nexport class JoopPlatform {\n private static _type: JoopPlatformType = _detect();\n private static _adapter: JoopPlatformAdapterConfig = {};\n private static _memStorage: JoopStorageAdapter | null = null;\n\n /**\n * Call once at app startup to configure adapters for your platform.\n *\n * Web (default — no call needed):\n * JoopPlatform.init();\n *\n * React Native with react-native-mmkv:\n * import { MMKV } from 'react-native-mmkv';\n * const mmkv = new MMKV();\n * JoopPlatform.init({ adapter: { storage: mmkv } });\n *\n * React Native with custom compression (fflate):\n * import { gzip, ungzip } from 'fflate';\n * JoopPlatform.init({\n * adapter: {\n * compression: {\n * compress: (d, fmt) => new Promise((res, rej) => gzip(d, (e, r) => e ? rej(e) : res(r))),\n * decompress: (d, fmt) => new Promise((res, rej) => ungzip(d, (e, r) => e ? rej(e) : res(r))),\n * },\n * },\n * });\n */\n static init(config: JoopPlatformConfig = {}): void {\n if (config.platform) this._type = config.platform;\n this._adapter = { ...this._adapter, ...(config.adapter ?? {}) };\n }\n\n /** Current detected or overridden platform type */\n static get type(): JoopPlatformType { return this._type; }\n\n static is(type: JoopPlatformType): boolean { return this._type === type; }\n static isMobile(): boolean { return this._type === 'react-native'; }\n static isWeb(): boolean { return this._type === 'web'; }\n static isNode(): boolean { return this._type === 'node'; }\n\n /** Raw adapter config registered via init() */\n static getAdapter(): JoopPlatformAdapterConfig { return this._adapter; }\n\n /**\n * Returns the best available storage adapter:\n * 1. Custom adapter registered via init()\n * 2. localStorage (web)\n * 3. In-memory fallback (Node / RN without adapter)\n */\n static getStorage(): JoopStorageAdapter {\n if (this._adapter.storage) return this._adapter.storage;\n if (typeof localStorage !== 'undefined') return _webStorage(localStorage);\n if (!this._memStorage) this._memStorage = new _MemStorageImpl();\n return this._memStorage;\n }\n\n /**\n * Returns the best available session-scoped storage:\n * 1. Custom adapter registered via init()\n * 2. sessionStorage (web)\n * 3. Shared in-memory fallback\n */\n static getSessionStorage(): JoopStorageAdapter {\n if (this._adapter.storage) return this._adapter.storage;\n if (typeof sessionStorage !== 'undefined') return _webStorage(sessionStorage);\n if (!this._memStorage) this._memStorage = new _MemStorageImpl();\n return this._memStorage;\n }\n\n /** What APIs are available in the current environment */\n static capabilities(): JoopCapabilities {\n return {\n compression: typeof CompressionStream !== 'undefined' || !!this._adapter.compression,\n workers: typeof Worker !== 'undefined' || !!this._adapter.worker,\n cryptoSubtle: !!(typeof globalThis !== 'undefined' && (globalThis as typeof globalThis & { crypto?: Crypto }).crypto?.subtle),\n persistentStorage: typeof localStorage !== 'undefined' || !!this._adapter.storage,\n dom: typeof document !== 'undefined',\n serviceWorker: typeof navigator !== 'undefined' && 'serviceWorker' in navigator,\n };\n }\n\n /** Reset to auto-detected defaults — useful between tests */\n static _reset(): void {\n this._type = _detect();\n this._adapter = {};\n this._memStorage = null;\n }\n}\n","import { JoopBehaviorSubject, JoopSubject } from '../events';\nimport { JoopPlatform } from '../platform/platform';\n\nexport type JoopSSEState = 'connecting' | 'open' | 'closed' | 'error';\n\nexport interface JoopSSEConfig {\n url: string;\n headers?: Record<string, string>;\n body?: unknown; // if set, uses fetch POST (EventSource only supports GET)\n method?: 'GET' | 'POST';\n reconnectMs?: number;\n maxReconnects?: number;\n withCredentials?: boolean;\n lastEventId?: string;\n}\n\nexport interface JoopSSEMessage {\n id?: string;\n type: string;\n data: string;\n}\n\nexport class JoopStreamingService {\n private _state$ = new JoopBehaviorSubject<JoopSSEState>('closed');\n private _message$ = new JoopSubject<JoopSSEMessage>();\n private _error$ = new JoopSubject<Error>();\n private _es: EventSource | null = null;\n private _abortCtrl: AbortController | null = null;\n private _cfg: JoopSSEConfig | null = null;\n private _reconnects = 0;\n private _reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private _lastEventId = '';\n\n connect(config: JoopSSEConfig): void {\n this.disconnect();\n this._cfg = config;\n this._reconnects = 0;\n this._lastEventId = config.lastEventId ?? '';\n this._open();\n }\n\n disconnect(): void {\n if (this._reconnectTimer) { clearTimeout(this._reconnectTimer); this._reconnectTimer = null; }\n this._es?.close(); this._es = null;\n this._abortCtrl?.abort(); this._abortCtrl = null;\n this._state$.next('closed');\n }\n\n state$() { return this._state$.asObservable(); }\n getState(): JoopSSEState { return this._state$.getValue(); }\n message$() { return this._message$.asObservable(); }\n error$() { return this._error$.asObservable(); }\n\n /** Filter messages by event type */\n on(type: string) {\n const sub = new JoopSubject<string>();\n this._message$.subscribe(m => { if (m.type === type || (type === 'message' && !m.type)) sub.next(m.data); });\n return sub.asObservable();\n }\n\n private _open(): void {\n if (!this._cfg) return;\n this._state$.next('connecting');\n const { url, headers, body, method = body ? 'POST' : 'GET', withCredentials, reconnectMs = 3000, maxReconnects = 10 } = this._cfg;\n\n // Use native EventSource only on web with a plain GET (no custom headers/body).\n // React Native does not have EventSource — always use the fetch-based path there.\n const canUseNative = method === 'GET' && !headers && typeof EventSource !== 'undefined' && !JoopPlatform.isMobile();\n if (canUseNative) {\n this._openNative(url, withCredentials ?? false, reconnectMs, maxReconnects);\n } else {\n this._openFetch(url, method, headers, body, reconnectMs, maxReconnects);\n }\n }\n\n private _openNative(url: string, withCredentials: boolean, reconnectMs: number, maxReconnects: number): void {\n const es = new EventSource(url, { withCredentials });\n this._es = es;\n es.onopen = () => { this._state$.next('open'); this._reconnects = 0; };\n es.onmessage = (e) => { this._lastEventId = e.lastEventId ?? this._lastEventId; this._message$.next({ id: e.lastEventId, type: 'message', data: e.data }); };\n es.onerror = () => {\n this._state$.next('error');\n this._error$.next(new Error('SSE connection error'));\n es.close();\n this._scheduleReconnect(reconnectMs, maxReconnects);\n };\n // Custom event types\n const origAddEventListener = es.addEventListener.bind(es);\n origAddEventListener('*', (e: Event) => {\n const me = e as MessageEvent;\n if (me.type !== 'message') this._message$.next({ id: me.lastEventId, type: me.type, data: me.data });\n });\n }\n\n private async _openFetch(url: string, method: string, headers: Record<string, string> | undefined, body: unknown, reconnectMs: number, maxReconnects: number): Promise<void> {\n this._abortCtrl = new AbortController();\n try {\n const fetchHeaders: Record<string, string> = { Accept: 'text/event-stream', 'Cache-Control': 'no-cache', ...headers };\n if (this._lastEventId) fetchHeaders['Last-Event-ID'] = this._lastEventId;\n const res = await fetch(url, {\n method, headers: fetchHeaders,\n body: body !== undefined ? JSON.stringify(body) : undefined,\n signal: this._abortCtrl.signal,\n });\n if (!res.ok || !res.body) throw new Error(`SSE: ${res.status}`);\n this._state$.next('open'); this._reconnects = 0;\n await this._readStream(res.body, reconnectMs, maxReconnects);\n } catch (e) {\n if ((e as Error)?.name !== 'AbortError') {\n this._state$.next('error');\n this._error$.next(e instanceof Error ? e : new Error(String(e)));\n this._scheduleReconnect(reconnectMs, maxReconnects);\n }\n }\n }\n\n private async _readStream(body: ReadableStream<Uint8Array>, reconnectMs: number, maxReconnects: number): Promise<void> {\n const reader = body.getReader();\n const dec = new TextDecoder();\n let buf = '';\n let currentEvent = { id: '', type: 'message', data: '' };\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) { this._scheduleReconnect(reconnectMs, maxReconnects); break; }\n buf += dec.decode(value, { stream: true });\n const lines = buf.split('\\n');\n buf = lines.pop() ?? '';\n for (const line of lines) {\n if (!line) {\n // Dispatch event\n if (currentEvent.data) {\n if (currentEvent.id) this._lastEventId = currentEvent.id;\n this._message$.next({ ...currentEvent });\n }\n currentEvent = { id: '', type: 'message', data: '' };\n } else if (line.startsWith('id:')) { currentEvent.id = line.slice(3).trim(); }\n else if (line.startsWith('event:')) { currentEvent.type = line.slice(6).trim(); }\n else if (line.startsWith('data:')) { currentEvent.data += (currentEvent.data ? '\\n' : '') + line.slice(5).trim(); }\n }\n }\n }\n\n private _scheduleReconnect(reconnectMs: number, maxReconnects: number): void {\n if (this._reconnects >= maxReconnects) { this._state$.next('closed'); return; }\n this._reconnects++;\n this._reconnectTimer = setTimeout(() => { if (this._cfg) this._open(); }, reconnectMs);\n }\n}\n","import { JoopBehaviorSubject, JoopSubject } from '../events';\n\nexport interface JoopBiometricProfile {\n avgTypingInterval: number; // ms between keystrokes\n avgDwellTime: number; // ms a key is held\n mouseSpeed: number; // px/ms average\n mouseAcceleration: number;\n scrollVelocity: number;\n touchPressureAvg: number;\n sampleCount: number;\n capturedAt: number;\n}\n\nexport interface JoopAnomalyEvent {\n type: 'typing' | 'mouse' | 'scroll' | 'touch';\n deviation: number; // standard deviations from baseline\n value: number;\n baseline: number;\n}\n\nexport interface JoopBiometricScore {\n human: number; // 0–1 probability\n bot: number; // 0–1 probability\n confidence: number; // 0–1 how confident we are\n}\n\nexport class JoopBehavioralBiometrics {\n private _running = false;\n private _profile$ = new JoopBehaviorSubject<JoopBiometricProfile | null>(null);\n private _anomaly$ = new JoopSubject<JoopAnomalyEvent>();\n private _listeners: Array<() => void> = [];\n\n // Raw samples\n private _keyIntervals: number[] = [];\n private _dwellTimes: number[] = [];\n private _mouseSpeeds: number[] = [];\n private _mouseAccels: number[] = [];\n private _scrollVelocities: number[] = [];\n private _pressures: number[] = [];\n\n // State\n private _lastKeyDown = 0;\n private _lastKeyDownMap = new Map<string, number>();\n private _lastMouse = { x: 0, y: 0, t: 0, speed: 0 };\n private _lastScroll = { y: 0, t: 0 };\n private _baseline: JoopBiometricProfile | null = null;\n\n start(): void {\n if (this._running) return;\n this._running = true;\n this._attach('keydown', this._onKeyDown.bind(this) as EventListener);\n this._attach('keyup', this._onKeyUp.bind(this) as EventListener);\n this._attach('mousemove', this._onMouseMove.bind(this) as EventListener);\n this._attach('scroll', this._onScroll.bind(this), { passive: true });\n this._attach('touchstart', this._onTouch.bind(this) as EventListener, { passive: true });\n }\n\n stop(): void {\n this._running = false;\n for (const remove of this._listeners) remove();\n this._listeners = [];\n }\n\n reset(): void { this._keyIntervals = []; this._dwellTimes = []; this._mouseSpeeds = []; this._mouseAccels = []; this._scrollVelocities = []; this._pressures = []; this._baseline = null; this._profile$.next(null); }\n\n setBaseline(profile?: JoopBiometricProfile): void { this._baseline = profile ?? this._profile$.getValue(); }\n\n getScore(): JoopBiometricScore {\n const p = this._profile$.getValue();\n if (!p || p.sampleCount < 20) return { human: 0.5, bot: 0.5, confidence: 0 };\n\n let humanScore = 0; let checks = 0;\n\n // Bots tend to have near-zero or perfectly constant typing intervals\n if (p.sampleCount >= 5) {\n const cv = _cv(this._keyIntervals);\n humanScore += cv > 0.15 ? 1 : cv > 0.05 ? 0.5 : 0;\n checks++;\n }\n // Bots move mouse in straight lines (low acceleration variance)\n if (this._mouseSpeeds.length >= 10) {\n const cv = _cv(this._mouseSpeeds);\n humanScore += cv > 0.2 ? 1 : cv > 0.08 ? 0.5 : 0;\n checks++;\n }\n // Humans have organic scroll patterns\n if (this._scrollVelocities.length >= 5) {\n const cv = _cv(this._scrollVelocities);\n humanScore += cv > 0.1 ? 1 : 0.3;\n checks++;\n }\n\n const confidence = Math.min(1, p.sampleCount / 100);\n const human = checks ? humanScore / checks : 0.5;\n return { human, bot: 1 - human, confidence };\n }\n\n getProfile(): JoopBiometricProfile | null { return this._profile$.getValue(); }\n profile$() { return this._profile$.asObservable(); }\n anomaly$() { return this._anomaly$.asObservable(); }\n\n /** Similarity to another profile (0=different, 1=identical) */\n compare(other: JoopBiometricProfile): number {\n const p = this._profile$.getValue();\n if (!p) return 0;\n const delta = (a: number, b: number) => 1 - Math.min(1, Math.abs(a - b) / (Math.max(a, b) || 1));\n return (delta(p.avgTypingInterval, other.avgTypingInterval) + delta(p.mouseSpeed, other.mouseSpeed) + delta(p.scrollVelocity, other.scrollVelocity)) / 3;\n }\n\n private _onKeyDown(e: KeyboardEvent): void {\n const now = Date.now();\n if (this._lastKeyDown > 0) this._keyIntervals.push(now - this._lastKeyDown);\n this._lastKeyDownMap.set(e.key, now);\n this._lastKeyDown = now;\n this._update();\n }\n\n private _onKeyUp(e: KeyboardEvent): void {\n const down = this._lastKeyDownMap.get(e.key);\n if (down) { this._dwellTimes.push(Date.now() - down); this._lastKeyDownMap.delete(e.key); }\n this._update();\n }\n\n private _onMouseMove(e: MouseEvent): void {\n const now = Date.now();\n const { x: lx, y: ly, t: lt, speed: ls } = this._lastMouse;\n if (lt > 0) {\n const dx = e.clientX - lx, dy = e.clientY - ly, dt = now - lt;\n if (dt > 0) {\n const speed = Math.sqrt(dx * dx + dy * dy) / dt;\n const accel = Math.abs(speed - ls) / dt;\n this._mouseSpeeds.push(speed);\n this._mouseAccels.push(accel);\n this._lastMouse = { x: e.clientX, y: e.clientY, t: now, speed };\n this._update();\n return;\n }\n }\n this._lastMouse = { x: e.clientX, y: e.clientY, t: now, speed: 0 };\n }\n\n private _onScroll(): void {\n const now = Date.now(); const y = window.scrollY;\n const { y: ly, t: lt } = this._lastScroll;\n if (lt > 0 && now - lt > 0) { this._scrollVelocities.push(Math.abs(y - ly) / (now - lt)); this._update(); }\n this._lastScroll = { y, t: now };\n }\n\n private _onTouch(e: TouchEvent): void {\n if (e.touches[0] && (e.touches[0] as unknown as { force?: number }).force !== undefined) {\n const f = (e.touches[0] as unknown as { force: number }).force;\n this._pressures.push(f);\n }\n this._update();\n }\n\n private _update(): void {\n const count = this._keyIntervals.length + this._mouseSpeeds.length;\n const profile: JoopBiometricProfile = {\n avgTypingInterval: _mean(this._keyIntervals),\n avgDwellTime: _mean(this._dwellTimes),\n mouseSpeed: _mean(this._mouseSpeeds),\n mouseAcceleration: _mean(this._mouseAccels),\n scrollVelocity: _mean(this._scrollVelocities),\n touchPressureAvg: _mean(this._pressures),\n sampleCount: count,\n capturedAt: Date.now(),\n };\n this._profile$.next(profile);\n\n // Check for anomaly against baseline\n if (this._baseline && count >= 30) {\n const { avgTypingInterval: bt } = this._baseline;\n const devs = _stddev(this._keyIntervals.slice(-20));\n if (bt > 0 && devs > 0) {\n const z = Math.abs(profile.avgTypingInterval - bt) / devs;\n if (z > 2.5) this._anomaly$.next({ type: 'typing', deviation: z, value: profile.avgTypingInterval, baseline: bt });\n }\n }\n }\n\n private _attach(event: string, handler: EventListenerOrEventListenerObject, opts?: AddEventListenerOptions): void {\n document.addEventListener(event, handler, opts);\n this._listeners.push(() => document.removeEventListener(event, handler));\n }\n}\n\nfunction _mean(arr: number[]): number { return arr.length ? arr.reduce((a, b) => a + b, 0) / arr.length : 0; }\nfunction _stddev(arr: number[]): number { if (arr.length < 2) return 0; const m = _mean(arr); return Math.sqrt(arr.reduce((s, v) => s + (v - m) ** 2, 0) / (arr.length - 1)); }\nfunction _cv(arr: number[]): number { const m = _mean(arr); return m ? _stddev(arr) / m : 0; }\n","import { JoopBehaviorSubject, JoopSubject } from '../events';\n\nexport interface JoopRiskFactor {\n name: string;\n weight: number; // 0–1 relative weight\n evaluate: (ctx: JoopRiskContext) => number; // returns 0–1 risk score for this factor\n}\n\nexport interface JoopRiskContext {\n userId?: string;\n ipAddress?: string;\n deviceId?: string;\n country?: string;\n latitude?: number;\n longitude?: number;\n userAgent?: string;\n hourOfDay?: number; // 0–23\n dayOfWeek?: number; // 0=Sun\n transactionAmount?: number;\n biometricScore?: number; // 0=bot, 1=human\n failedAttempts?: number;\n mfaVerified?: boolean;\n knownDevice?: boolean;\n vpnDetected?: boolean;\n [key: string]: unknown;\n}\n\nexport interface JoopRiskScore {\n total: number; // 0–100\n level: 'low' | 'medium' | 'high' | 'critical';\n factors: Record<string, number>;\n context: JoopRiskContext;\n timestamp: number;\n}\n\nconst BUILT_IN_FACTORS: JoopRiskFactor[] = [\n {\n name: 'failed_attempts',\n weight: 0.25,\n evaluate: ctx => Math.min(1, (ctx.failedAttempts ?? 0) / 5),\n },\n {\n name: 'biometrics',\n weight: 0.2,\n evaluate: ctx => {\n if (ctx.biometricScore === undefined) return 0.3;\n return 1 - ctx.biometricScore;\n },\n },\n {\n name: 'mfa',\n weight: 0.15,\n evaluate: ctx => ctx.mfaVerified ? 0 : 0.5,\n },\n {\n name: 'known_device',\n weight: 0.15,\n evaluate: ctx => ctx.knownDevice === false ? 0.7 : 0,\n },\n {\n name: 'vpn',\n weight: 0.1,\n evaluate: ctx => ctx.vpnDetected ? 0.6 : 0,\n },\n {\n name: 'time_anomaly',\n weight: 0.1,\n evaluate: ctx => {\n const h = ctx.hourOfDay ?? 12;\n // Unusual hours (midnight to 5am) increase risk\n return h >= 1 && h <= 5 ? 0.4 : 0;\n },\n },\n {\n name: 'transaction_amount',\n weight: 0.05,\n evaluate: ctx => {\n const amt = ctx.transactionAmount ?? 0;\n if (amt > 100000) return 0.9;\n if (amt > 10000) return 0.5;\n if (amt > 1000) return 0.2;\n return 0;\n },\n },\n];\n\nexport class JoopRiskEngine {\n private _factors: JoopRiskFactor[] = [...BUILT_IN_FACTORS];\n private _score$ = new JoopBehaviorSubject<JoopRiskScore | null>(null);\n private _highRiskHandlers: Array<{ threshold: number; handler: (s: JoopRiskScore) => void }> = [];\n private _stepUpHandler: ((score: JoopRiskScore) => void) | null = null;\n private _stepUpThreshold = 70;\n\n /** Replace all factors */\n configure(factors: JoopRiskFactor[]): void { this._factors = factors; }\n\n /** Add or update a single named factor */\n addFactor(name: string, weight: number, evaluate: (ctx: JoopRiskContext) => number): void {\n const idx = this._factors.findIndex(f => f.name === name);\n if (idx >= 0) this._factors[idx] = { name, weight, evaluate };\n else this._factors.push({ name, weight, evaluate });\n }\n\n removeFactor(name: string): void { this._factors = this._factors.filter(f => f.name !== name); }\n\n evaluate(ctx: JoopRiskContext): JoopRiskScore {\n const totalWeight = this._factors.reduce((s, f) => s + f.weight, 0) || 1;\n const factors: Record<string, number> = {};\n let weighted = 0;\n\n for (const f of this._factors) {\n const raw = Math.max(0, Math.min(1, f.evaluate(ctx)));\n factors[f.name] = raw;\n weighted += raw * (f.weight / totalWeight);\n }\n\n const total = Math.round(weighted * 100);\n const level: JoopRiskScore['level'] = total >= 75 ? 'critical' : total >= 50 ? 'high' : total >= 25 ? 'medium' : 'low';\n const score: JoopRiskScore = { total, level, factors, context: ctx, timestamp: Date.now() };\n this._score$.next(score);\n\n for (const { threshold, handler } of this._highRiskHandlers) {\n if (total >= threshold) handler(score);\n }\n if (this._stepUpHandler && total >= this._stepUpThreshold) this._stepUpHandler(score);\n\n return score;\n }\n\n score$() { return this._score$.asObservable(); }\n lastScore(): JoopRiskScore | null { return this._score$.getValue(); }\n\n /** Register a handler triggered when score ≥ threshold */\n onHighRisk(threshold: number, handler: (score: JoopRiskScore) => void): () => void {\n const entry = { threshold, handler };\n this._highRiskHandlers.push(entry);\n return () => { this._highRiskHandlers = this._highRiskHandlers.filter(h => h !== entry); };\n }\n\n /** Configure automatic step-up auth trigger */\n onStepUpRequired(threshold: number, handler: (score: JoopRiskScore) => void): void {\n this._stepUpThreshold = threshold;\n this._stepUpHandler = handler;\n }\n}\n","import { JoopPlatform } from '../platform/platform';\n\nexport interface JoopWorkerPoolConfig {\n size?: number;\n timeout?: number; // ms per task before rejecting\n}\n\ninterface _Task {\n fn: string;\n args: unknown[];\n resolve: (value: unknown) => void;\n reject: (reason: unknown) => void;\n timer?: ReturnType<typeof setTimeout>;\n}\n\ninterface _WorkerSlot {\n worker: Worker;\n busy: boolean;\n}\n\nexport class JoopWorkerPool {\n private _slots: _WorkerSlot[] = [];\n private _queue: _Task[] = [];\n private _size: number;\n private _timeout: number;\n private _terminated = false;\n /** True when native Web Workers are unavailable (React Native, Node) */\n private _fallback: boolean;\n\n constructor(config: JoopWorkerPoolConfig = {}) {\n const cores = typeof navigator !== 'undefined' ? (navigator.hardwareConcurrency ?? 4) : 4;\n this._size = config.size ?? Math.max(1, cores - 1);\n this._timeout = config.timeout ?? 30000;\n this._fallback = !_workersAvailable();\n if (!this._fallback) this._init();\n }\n\n get size(): number { return this._size; }\n get idle(): number { return this._fallback ? this._size : this._slots.filter(s => !s.busy).length; }\n get queueDepth(): number { return this._queue.length; }\n\n /**\n * Run a serializable function in a worker thread (or main-thread fallback on RN/Node).\n * The fn MUST be a pure, self-contained function (no closures over outer scope).\n */\n run<T, R>(fn: (arg: T) => R, arg: T): Promise<R> {\n if (this._terminated) return Promise.reject(new Error('WorkerPool terminated'));\n\n if (this._fallback) return this._runFallback(fn, arg);\n\n return new Promise<R>((resolve, reject) => {\n const task: _Task = {\n fn: fn.toString(),\n args: [arg],\n resolve: resolve as (v: unknown) => void,\n reject,\n };\n const slot = this._slots.find(s => !s.busy);\n if (slot) this._runTask(slot, task);\n else this._queue.push(task);\n });\n }\n\n async map<T, R>(items: T[], fn: (item: T) => R): Promise<R[]> {\n return Promise.all(items.map(item => this.run(fn, item)));\n }\n\n terminate(): void {\n this._terminated = true;\n if (!this._fallback) {\n for (const { worker } of this._slots) worker.terminate();\n this._slots = [];\n }\n for (const task of this._queue) task.reject(new Error('WorkerPool terminated'));\n this._queue = [];\n }\n\n // ---------------------------------------------------------------------------\n // Fallback: main-thread async execution (React Native / Node)\n // ---------------------------------------------------------------------------\n\n private _runFallback<T, R>(fn: (arg: T) => R, arg: T): Promise<R> {\n // Check for an injected worker adapter (e.g. react-native-threads)\n const adapter = JoopPlatform.getAdapter().worker;\n if (adapter) return adapter.run(fn, arg, this._timeout) as Promise<R>;\n\n // Last resort: run on main thread inside a macrotask (no true parallelism)\n return new Promise<R>((resolve, reject) => {\n const timer = this._timeout > 0\n ? setTimeout(() => reject(new Error('JoopWorkerPool: task timed out')), this._timeout)\n : null;\n setTimeout(() => {\n try {\n const result = fn(arg);\n if (timer !== null) clearTimeout(timer);\n if (result && typeof (result as unknown as Promise<R>).then === 'function') {\n (result as unknown as Promise<R>).then(v => resolve(v)).catch(e => reject(e));\n } else {\n resolve(result);\n }\n } catch (e) {\n if (timer !== null) clearTimeout(timer);\n reject(e);\n }\n }, 0);\n });\n }\n\n // ---------------------------------------------------------------------------\n // Native Web Worker implementation\n // ---------------------------------------------------------------------------\n\n private _init(): void {\n for (let i = 0; i < this._size; i++) {\n this._slots.push({ worker: this._createWorker(), busy: false });\n }\n }\n\n private _createWorker(): Worker {\n const script = `\nself.onmessage = function(e) {\n var id = e.data.id;\n try {\n var fn = new Function('return (' + e.data.fn + ')')();\n var result = fn.apply(null, e.data.args);\n if (result && typeof result.then === 'function') {\n result.then(function(v) { self.postMessage({ id: id, result: v }); })\n .catch(function(err) { self.postMessage({ id: id, error: String(err) }); });\n } else {\n self.postMessage({ id: id, result: result });\n }\n } catch(err) {\n self.postMessage({ id: id, error: String(err) });\n }\n};`;\n const blob = new Blob([script], { type: 'application/javascript' });\n const url = URL.createObjectURL(blob);\n const worker = new Worker(url);\n URL.revokeObjectURL(url);\n return worker;\n }\n\n private _runTask(slot: _WorkerSlot, task: _Task): void {\n slot.busy = true;\n const id = `${Date.now()}_${Math.random()}`;\n\n if (this._timeout > 0) {\n task.timer = setTimeout(() => {\n slot.worker.terminate();\n slot.worker = this._createWorker();\n slot.busy = false;\n task.reject(new Error('JoopWorkerPool: task timed out'));\n this._drain();\n }, this._timeout);\n }\n\n const onMessage = (e: MessageEvent) => {\n if (e.data?.id !== id) return;\n clearTimeout(task.timer);\n slot.worker.removeEventListener('message', onMessage);\n slot.busy = false;\n if (e.data.error) task.reject(new Error(e.data.error));\n else task.resolve(e.data.result);\n this._drain();\n };\n\n slot.worker.addEventListener('message', onMessage);\n slot.worker.postMessage({ id, fn: task.fn, args: task.args });\n }\n\n private _drain(): void {\n if (this._queue.length === 0) return;\n const slot = this._slots.find(s => !s.busy);\n if (slot) this._runTask(slot, this._queue.shift()!);\n }\n}\n\nfunction _workersAvailable(): boolean {\n return (\n typeof Worker !== 'undefined' &&\n typeof URL !== 'undefined' &&\n typeof Blob !== 'undefined' &&\n typeof URL.createObjectURL === 'function'\n );\n}\n","import { JoopPlatform } from '../platform/platform';\n\nexport type JoopCompressionFormat = 'gzip' | 'deflate' | 'deflate-raw';\n\nexport class JoopCompressionService {\n /** True when compression is available (native API or injected adapter) */\n isSupported(): boolean {\n return typeof CompressionStream !== 'undefined' || !!JoopPlatform.getAdapter().compression;\n }\n\n async compress(data: string | Uint8Array, format: JoopCompressionFormat = 'gzip'): Promise<Uint8Array> {\n const input = typeof data === 'string' ? new TextEncoder().encode(data) : data;\n\n const adapter = JoopPlatform.getAdapter().compression;\n if (adapter) return adapter.compress(input, format);\n\n if (typeof CompressionStream === 'undefined') {\n throw new Error(\n 'CompressionStream is not available in this environment. ' +\n 'Provide a JoopCompressionAdapter via JoopPlatform.init() ' +\n '(e.g. wrap fflate for React Native).'\n );\n }\n\n return _nativeCompress(input, format);\n }\n\n async decompress(data: Uint8Array, format: JoopCompressionFormat = 'gzip'): Promise<Uint8Array> {\n const adapter = JoopPlatform.getAdapter().compression;\n if (adapter) return adapter.decompress(data, format);\n\n if (typeof DecompressionStream === 'undefined') {\n throw new Error(\n 'DecompressionStream is not available in this environment. ' +\n 'Provide a JoopCompressionAdapter via JoopPlatform.init().'\n );\n }\n\n return _nativeDecompress(data, format);\n }\n\n async compressString(text: string, format: JoopCompressionFormat = 'gzip'): Promise<string> {\n const bytes = await this.compress(text, format);\n return _uint8ToBase64(bytes);\n }\n\n async decompressString(b64: string, format: JoopCompressionFormat = 'gzip'): Promise<string> {\n const bytes = _base64ToUint8(b64);\n const decompressed = await this.decompress(bytes, format);\n return new TextDecoder().decode(decompressed);\n }\n\n async ratio(data: string | Uint8Array, format: JoopCompressionFormat = 'gzip'): Promise<number> {\n const originalLen = typeof data === 'string' ? new TextEncoder().encode(data).length : data.length;\n const compressed = await this.compress(data, format);\n return originalLen ? compressed.length / originalLen : 1;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Native CompressionStream helpers\n// ---------------------------------------------------------------------------\n\nasync function _nativeCompress(input: Uint8Array, format: JoopCompressionFormat): Promise<Uint8Array> {\n const cs = new CompressionStream(format);\n const writer = cs.writable.getWriter();\n const reader = cs.readable.getReader();\n writer.write(input as Uint8Array<ArrayBuffer>);\n writer.close();\n return _readAll(reader);\n}\n\nasync function _nativeDecompress(input: Uint8Array, format: JoopCompressionFormat): Promise<Uint8Array> {\n const ds = new DecompressionStream(format);\n const writer = ds.writable.getWriter();\n const reader = ds.readable.getReader();\n writer.write(input as Uint8Array<ArrayBuffer>);\n writer.close();\n return _readAll(reader);\n}\n\nasync function _readAll(reader: ReadableStreamDefaultReader<Uint8Array>): Promise<Uint8Array> {\n const chunks: Uint8Array[] = [];\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n }\n const total = chunks.reduce((s, c) => s + c.length, 0);\n const out = new Uint8Array(total);\n let offset = 0;\n for (const c of chunks) { out.set(c, offset); offset += c.length; }\n return out;\n}\n\nfunction _uint8ToBase64(buf: Uint8Array): string {\n let bin = '';\n for (let i = 0; i < buf.length; i++) bin += String.fromCharCode(buf[i]);\n return btoa(bin);\n}\n\nfunction _base64ToUint8(b64: string): Uint8Array {\n const bin = atob(b64);\n const out = new Uint8Array(bin.length);\n for (let i = 0; i < bin.length; i++) out[i] = bin.charCodeAt(i);\n return out;\n}\n","import { JoopBehaviorSubject } from '../events';\n\nexport type JoopReducer<S> = (state: S, payload: unknown) => S;\n\nexport interface JoopStoreConfig<S> {\n state: S;\n reducers?: Record<string, JoopReducer<S>>;\n maxHistory?: number;\n}\n\nexport interface JoopAction {\n type: string;\n payload?: unknown;\n}\n\nexport class JoopStore<S extends Record<string, unknown>> {\n private _state$: JoopBehaviorSubject<S>;\n private _reducers: Record<string, JoopReducer<S>>;\n private _history: S[];\n private _future: S[] = [];\n private _maxHistory: number;\n\n constructor(config: JoopStoreConfig<S>) {\n this._state$ = new JoopBehaviorSubject<S>(config.state);\n this._reducers = config.reducers ?? {};\n this._maxHistory = config.maxHistory ?? 50;\n this._history = [config.state];\n }\n\n getState(): S { return this._state$.getValue(); }\n\n dispatch(type: string, payload?: unknown): void {\n const reducer = this._reducers[type];\n if (!reducer) throw new Error(`JoopStore: no reducer for action '${type}'`);\n\n const current = this._state$.getValue();\n const next = reducer(current, payload);\n if (next === current) return;\n\n this._history.push(current);\n if (this._history.length > this._maxHistory) this._history.shift();\n this._future = [];\n this._state$.next(next);\n }\n\n /** Add a reducer after construction */\n addReducer(type: string, reducer: JoopReducer<S>): void { this._reducers[type] = reducer; }\n\n /** Observable of the entire state */\n state$() { return this._state$.asObservable(); }\n\n /** Observable of a derived slice — only emits when the selected value changes */\n select<T>(selector: (state: S) => T) {\n let lastValue: T | typeof _UNSET = _UNSET;\n const subject = new JoopBehaviorSubject<T>(selector(this.getState()));\n this._state$.subscribe(s => {\n const v = selector(s);\n if (v !== lastValue) { lastValue = v; subject.next(v); }\n });\n return subject.asObservable();\n }\n\n subscribe(handler: (state: S) => void): () => void {\n return this._state$.subscribe(handler);\n }\n\n undo(): void {\n if (!this.canUndo()) return;\n const prev = this._history.pop()!;\n this._future.push(this._state$.getValue());\n this._state$.next(prev);\n }\n\n redo(): void {\n if (!this.canRedo()) return;\n const next = this._future.pop()!;\n this._history.push(this._state$.getValue());\n this._state$.next(next);\n }\n\n canUndo(): boolean { return this._history.length > 1; }\n canRedo(): boolean { return this._future.length > 0; }\n\n reset(): void {\n const initial = this._history[0];\n this._history = [initial];\n this._future = [];\n this._state$.next(initial);\n }\n}\n\nconst _UNSET = Symbol('unset');\n\nexport function createStore<S extends Record<string, unknown>>(config: JoopStoreConfig<S>): JoopStore<S> {\n return new JoopStore(config);\n}\n\n// ─── Slice helper ───────────────────────────────────────────────────────────\n\nexport interface JoopSliceConfig<S, K extends keyof S> {\n key: K;\n reducers: Record<string, (slice: S[K], payload: unknown) => S[K]>;\n}\n\n/** Creates reducers scoped to a sub-key of the store state */\nexport function createSlice<S extends Record<string, unknown>, K extends keyof S>(\n cfg: JoopSliceConfig<S, K>\n): Record<string, JoopReducer<S>> {\n const out: Record<string, JoopReducer<S>> = {};\n for (const [type, reducer] of Object.entries(cfg.reducers)) {\n out[`${String(cfg.key)}/${type}`] = (state, payload) => ({\n ...state,\n [cfg.key]: reducer(state[cfg.key] as S[K], payload),\n });\n }\n return out;\n}\n","import { JoopBehaviorSubject, JoopSubject } from '../events';\n\nexport type JoopSyncConflictStrategy = 'local-wins' | 'remote-wins' | 'merge';\n\nexport interface JoopSyncConfig {\n syncUrl: string;\n headers?: Record<string, string>;\n retryMs?: number;\n maxRetries?: number;\n conflictStrategy?: JoopSyncConflictStrategy;\n batchSize?: number;\n}\n\nexport interface JoopMutation {\n id: string;\n type: string;\n payload: unknown;\n status: 'pending' | 'syncing' | 'synced' | 'failed';\n timestamp: number;\n retries: number;\n}\n\nexport interface JoopSyncConflict {\n id: string;\n mutationId: string;\n local: unknown;\n remote: unknown;\n resolvedAt?: number;\n resolution?: 'local' | 'remote' | 'merged';\n}\n\nexport interface JoopSyncStatus {\n online: boolean;\n pendingCount: number;\n syncedCount: number;\n failedCount: number;\n lastSyncAt: number | null;\n syncing: boolean;\n}\n\nexport class JoopSyncEngine {\n private _cfg: JoopSyncConfig | null = null;\n private _mutations: JoopMutation[] = [];\n private _conflicts: JoopSyncConflict[] = [];\n private _syncing = false;\n private _syncedCount = 0;\n private _lastSyncAt: number | null = null;\n private _online = typeof navigator !== 'undefined' ? navigator.onLine : true;\n private _status$ = new JoopBehaviorSubject<JoopSyncStatus>(this._buildStatus());\n private _conflict$ = new JoopSubject<JoopSyncConflict>();\n private _onlineHandlers: Array<() => void> = [];\n\n configure(config: JoopSyncConfig): void {\n this._cfg = config;\n if (typeof window !== 'undefined') {\n const onOnline = () => { this._online = true; this._updateStatus(); this.sync(); };\n const onOffline = () => { this._online = false; this._updateStatus(); };\n window.addEventListener('online', onOnline);\n window.addEventListener('offline', onOffline);\n this._onlineHandlers.push(\n () => window.removeEventListener('online', onOnline),\n () => window.removeEventListener('offline', onOffline),\n );\n }\n }\n\n destroy(): void { for (const rm of this._onlineHandlers) rm(); this._onlineHandlers = []; }\n\n mutate(type: string, payload: unknown): JoopMutation {\n const m: JoopMutation = { id: _uid(), type, payload, status: 'pending', timestamp: Date.now(), retries: 0 };\n this._mutations.push(m);\n this._updateStatus();\n if (this._online && !this._syncing) this.sync();\n return m;\n }\n\n pending(): JoopMutation[] { return this._mutations.filter(m => m.status === 'pending' || m.status === 'failed'); }\n conflicts(): JoopSyncConflict[] { return [...this._conflicts]; }\n status$() { return this._status$.asObservable(); }\n conflict$() { return this._conflict$.asObservable(); }\n\n async sync(): Promise<void> {\n if (!this._cfg || this._syncing || !this._online) return;\n const pending = this.pending();\n if (pending.length === 0) return;\n\n this._syncing = true;\n this._updateStatus();\n\n const { syncUrl, headers = {}, maxRetries = 3, batchSize = 50 } = this._cfg;\n const batch = pending.slice(0, batchSize);\n\n try {\n for (const m of batch) m.status = 'syncing';\n const res = await fetch(syncUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...headers },\n body: JSON.stringify({ mutations: batch.map(m => ({ id: m.id, type: m.type, payload: m.payload, timestamp: m.timestamp })) }),\n });\n\n if (!res.ok) throw new Error(`Sync failed: ${res.status}`);\n const data = (await res.json()) as { results: Array<{ id: string; status: 'ok' | 'conflict'; remote?: unknown }> };\n\n for (const result of data.results ?? []) {\n const m = this._mutations.find(x => x.id === result.id);\n if (!m) continue;\n if (result.status === 'ok') {\n m.status = 'synced'; this._syncedCount++;\n } else if (result.status === 'conflict') {\n m.status = 'failed';\n const conflict: JoopSyncConflict = { id: _uid(), mutationId: m.id, local: m.payload, remote: result.remote };\n this._conflicts.push(conflict);\n this._conflict$.next(conflict);\n }\n }\n } catch {\n for (const m of batch) {\n m.retries++; m.status = m.retries >= maxRetries ? 'failed' : 'pending';\n }\n } finally {\n this._syncing = false;\n this._lastSyncAt = Date.now();\n this._updateStatus();\n }\n }\n\n resolve(conflictId: string, strategy: 'local' | 'remote' | 'merge', mergeFn?: (local: unknown, remote: unknown) => unknown): void {\n const conflict = this._conflicts.find(c => c.id === conflictId);\n if (!conflict) return;\n const m = this._mutations.find(x => x.id === conflict.mutationId);\n if (m) {\n if (strategy === 'remote') m.payload = conflict.remote;\n else if (strategy === 'merge' && mergeFn) m.payload = mergeFn(conflict.local, conflict.remote);\n m.status = 'pending'; m.retries = 0;\n }\n conflict.resolvedAt = Date.now();\n conflict.resolution = strategy === 'merge' ? 'merged' : strategy;\n this._conflicts = this._conflicts.filter(c => c.id !== conflictId);\n if (this._online) this.sync();\n }\n\n clearSynced(): void { this._mutations = this._mutations.filter(m => m.status !== 'synced'); this._updateStatus(); }\n\n private _buildStatus(): JoopSyncStatus {\n return {\n online: this._online,\n pendingCount: this._mutations.filter(m => m.status === 'pending').length,\n syncedCount: this._syncedCount,\n failedCount: this._mutations.filter(m => m.status === 'failed').length,\n lastSyncAt: this._lastSyncAt,\n syncing: this._syncing,\n };\n }\n\n private _updateStatus(): void { this._status$.next(this._buildStatus()); }\n}\n\nfunction _uid(): string { return `${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`; }\n","import { JoopBehaviorSubject, JoopSubject } from '../events';\n\nexport interface JoopTransition<S extends string, E extends string> {\n target: S;\n guard?: (context?: unknown) => boolean;\n action?: (context?: unknown) => void;\n}\n\nexport interface JoopStateConfig<S extends string, E extends string> {\n on?: Partial<Record<E, JoopTransition<S, E> | S>>;\n onEnter?: (context?: unknown) => void;\n onExit?: (context?: unknown) => void;\n type?: 'final' | 'normal';\n}\n\nexport interface JoopMachineConfig<S extends string, E extends string> {\n id?: string;\n initial: S;\n context?: unknown;\n states: Record<S, JoopStateConfig<S, E>>;\n}\n\nexport interface JoopStateTransition<S extends string, E extends string> {\n from: S;\n event: E;\n to: S;\n timestamp: number;\n}\n\nexport class JoopStateMachine<S extends string, E extends string> {\n private _state$: JoopBehaviorSubject<S>;\n private _transition$ = new JoopSubject<JoopStateTransition<S, E>>();\n private _cfg: JoopMachineConfig<S, E>;\n private _history: JoopStateTransition<S, E>[] = [];\n private _context: unknown;\n\n constructor(config: JoopMachineConfig<S, E>) {\n this._cfg = config;\n this._context = config.context;\n this._state$ = new JoopBehaviorSubject<S>(config.initial);\n this._cfg.states[config.initial]?.onEnter?.(this._context);\n }\n\n getState(): S { return this._state$.getValue(); }\n getContext(): unknown { return this._context; }\n state$() { return this._state$.asObservable(); }\n transition$() { return this._transition$.asObservable(); }\n history(): JoopStateTransition<S, E>[] { return [...this._history]; }\n\n matches(state: S): boolean { return this._state$.getValue() === state; }\n isFinal(): boolean { return this._cfg.states[this.getState()]?.type === 'final'; }\n\n /** Returns true if the event can be sent from current state */\n can(event: E): boolean {\n const cfg = this._cfg.states[this.getState()]?.on;\n if (!cfg || !(event in cfg)) return false;\n const t = this._resolveTransition(this.getState(), event);\n return t !== null;\n }\n\n /** Send an event; returns true if a transition occurred */\n send(event: E, context?: unknown): boolean {\n const from = this.getState();\n const stateCfg = this._cfg.states[from];\n if (!stateCfg?.on || !(event in stateCfg.on)) return false;\n\n const t = this._resolveTransition(from, event, context);\n if (!t) return false;\n\n const to = t.target;\n stateCfg.onExit?.(this._context);\n t.action?.(this._context);\n if (context !== undefined) this._context = context;\n\n const record: JoopStateTransition<S, E> = { from, event, to, timestamp: Date.now() };\n this._history.push(record);\n this._state$.next(to);\n this._transition$.next(record);\n\n this._cfg.states[to]?.onEnter?.(this._context);\n return true;\n }\n\n /** Update context without triggering a transition */\n setContext(ctx: unknown): void { this._context = ctx; }\n\n reset(): void {\n const initial = this._cfg.initial;\n this._state$.next(initial);\n this._history = [];\n this._cfg.states[initial]?.onEnter?.(this._context);\n }\n\n /** Export as Mermaid state diagram */\n toMermaid(): string {\n const lines = ['stateDiagram-v2'];\n lines.push(` [*] --> ${this._cfg.initial}`);\n for (const [state, cfg] of Object.entries(this._cfg.states) as Array<[S, JoopStateConfig<S,E>]>) {\n if (cfg.type === 'final') lines.push(` ${state} --> [*]`);\n if (cfg.on) {\n for (const [event, trans] of Object.entries(cfg.on)) {\n const target = typeof trans === 'string' ? trans : (trans as JoopTransition<S,E>).target;\n lines.push(` ${state} --> ${target} : ${event}`);\n }\n }\n }\n return lines.join('\\n');\n }\n\n private _resolveTransition(from: S, event: E, context?: unknown): JoopTransition<S, E> | null {\n const rawTrans = this._cfg.states[from]?.on?.[event];\n if (!rawTrans) return null;\n const t: JoopTransition<S, E> = typeof rawTrans === 'string' ? { target: rawTrans as S } : rawTrans;\n if (t.guard && !t.guard(context ?? this._context)) return null;\n return t;\n }\n}\n","import { JoopBehaviorSubject, JoopSubject } from '../events';\n\nexport interface JoopWorkflowStep {\n id: string;\n name?: string;\n after?: string[]; // step IDs this depends on\n execute: (context: unknown) => Promise<unknown>;\n compensate?: (context: unknown) => Promise<void>; // saga rollback\n timeout?: number;\n retries?: number;\n}\n\nexport interface JoopWorkflowDefinition {\n id: string;\n steps: JoopWorkflowStep[];\n}\n\nexport type JoopWorkflowRunStatus = 'pending' | 'running' | 'completed' | 'failed' | 'cancelled' | 'compensating';\n\nexport interface JoopWorkflowRun {\n runId: string;\n workflowId: string;\n status: JoopWorkflowRunStatus;\n input: unknown;\n outputs: Record<string, unknown>;\n errors: Record<string, string>;\n startedAt: number;\n completedAt?: number;\n}\n\nexport interface JoopWorkflowResult {\n runId: string;\n status: 'completed' | 'failed';\n outputs: Record<string, unknown>;\n errors: Record<string, string>;\n durationMs: number;\n}\n\nexport class JoopWorkflowEngine {\n private _definitions = new Map<string, JoopWorkflowDefinition>();\n private _runs = new Map<string, JoopWorkflowRun>();\n private _runStatus$ = new JoopSubject<JoopWorkflowRun>();\n private _cancellations = new Set<string>();\n\n define(workflow: JoopWorkflowDefinition): void { this._definitions.set(workflow.id, workflow); }\n undefine(id: string): void { this._definitions.delete(id); }\n\n async run(workflowId: string, input: unknown = null): Promise<JoopWorkflowResult> {\n const def = this._definitions.get(workflowId);\n if (!def) throw new Error(`JoopWorkflowEngine: unknown workflow '${workflowId}'`);\n\n const runId = `${workflowId}_${Date.now()}_${Math.floor(Math.random() * 1000)}`;\n const run: JoopWorkflowRun = {\n runId, workflowId, status: 'running',\n input, outputs: {}, errors: {}, startedAt: Date.now(),\n };\n this._runs.set(runId, run);\n this._emit(run);\n\n const completed = new Set<string>();\n const context = { input, outputs: run.outputs };\n\n // Build execution order respecting `after` dependencies\n const remaining = [...def.steps];\n const executedSteps: JoopWorkflowStep[] = [];\n\n while (remaining.length > 0) {\n if (this._cancellations.has(runId)) {\n run.status = 'cancelled'; this._emit(run); break;\n }\n\n // Find steps whose dependencies are all satisfied\n const ready = remaining.filter(s => (s.after ?? []).every(dep => completed.has(dep)));\n if (ready.length === 0 && remaining.length > 0) throw new Error(`Workflow deadlock in '${workflowId}': circular/missing dependencies`);\n\n // Run ready steps in parallel\n const results = await Promise.allSettled(ready.map(s => this._runStep(s, context, runId)));\n for (let i = 0; i < ready.length; i++) {\n const step = ready[i];\n const result = results[i];\n remaining.splice(remaining.indexOf(step), 1);\n if (result.status === 'fulfilled') {\n run.outputs[step.id] = result.value;\n (context as Record<string, unknown>).outputs = run.outputs;\n completed.add(step.id);\n executedSteps.push(step);\n } else {\n run.errors[step.id] = String(result.reason);\n run.status = 'failed';\n break;\n }\n }\n if (run.status === 'failed') break;\n }\n\n if (run.status === 'failed') {\n // Saga: compensate in reverse order\n run.status = 'compensating'; this._emit(run);\n for (const step of [...executedSteps].reverse()) {\n if (step.compensate) { try { await step.compensate(context); } catch { /* best effort */ } }\n }\n } else if (run.status === 'running') {\n run.status = 'completed';\n }\n\n run.completedAt = Date.now();\n this._emit(run);\n this._cancellations.delete(runId);\n\n return {\n runId,\n status: run.status === 'completed' ? 'completed' : 'failed',\n outputs: run.outputs,\n errors: run.errors,\n durationMs: run.completedAt - run.startedAt,\n };\n }\n\n cancel(runId: string): void { this._cancellations.add(runId); }\n\n status(runId: string): JoopWorkflowRun | undefined { return this._runs.get(runId); }\n history(): JoopWorkflowRun[] { return Array.from(this._runs.values()); }\n runStatus$() { return this._runStatus$.asObservable(); }\n\n private async _runStep(step: JoopWorkflowStep, context: unknown, runId: string): Promise<unknown> {\n const maxAttempts = (step.retries ?? 0) + 1;\n let lastErr: unknown;\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n if (this._cancellations.has(runId)) throw new Error('Cancelled');\n try {\n const run = step.timeout\n ? await _withTimeout(step.execute(context), step.timeout, step.id)\n : await step.execute(context);\n return run;\n } catch (e) { lastErr = e; }\n }\n throw lastErr;\n }\n\n private _emit(run: JoopWorkflowRun): void { this._runStatus$.next({ ...run }); }\n}\n\nfunction _withTimeout<T>(promise: Promise<T>, ms: number, id: string): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n const timer = setTimeout(() => reject(new Error(`Step '${id}' timed out after ${ms}ms`)), ms);\n promise.then(v => { clearTimeout(timer); resolve(v); }, e => { clearTimeout(timer); reject(e); });\n });\n}\n","export interface JoopPIIFinding {\n type: string;\n value: string;\n start: number;\n end: number;\n}\n\nexport interface JoopPIIPattern {\n name: string;\n regex: RegExp;\n}\n\nconst BUILT_IN_PATTERNS: JoopPIIPattern[] = [\n { name: 'credit_card', regex: /\\b(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|3[47][0-9]{13}|6(?:011|5[0-9]{2})[0-9]{12})\\b/g },\n { name: 'ssn', regex: /\\b\\d{3}[-\\s]?\\d{2}[-\\s]?\\d{4}\\b/g },\n { name: 'email', regex: /\\b[A-Za-z0-9._%+\\-]+@[A-Za-z0-9.\\-]+\\.[A-Za-z]{2,}\\b/g },\n { name: 'phone_us', regex: /(?:\\+1[\\s-]?)?(?:\\(\\d{3}\\)|\\d{3})[-.\\s]?\\d{3}[-.\\s]?\\d{4}\\b/g },\n { name: 'iban', regex: /\\b[A-Z]{2}\\d{2}[A-Z0-9]{4}\\d{7}(?:[A-Z0-9]{0,16})?\\b/g },\n { name: 'passport', regex: /\\b[A-Z]{1,2}[0-9]{6,9}\\b/g },\n { name: 'ip_address', regex: /\\b(?:\\d{1,3}\\.){3}\\d{1,3}\\b/g },\n { name: 'jwt', regex: /eyJ[A-Za-z0-9_\\-]+\\.eyJ[A-Za-z0-9_\\-]+\\.[A-Za-z0-9_\\-]+/g },\n { name: 'api_key', regex: /\\b(?:sk|pk|api|key)[_\\-]?[a-zA-Z0-9]{20,}\\b/gi },\n];\n\nconst DEFAULT_REPLACER: Record<string, string> = {\n credit_card: '[CARD-REDACTED]',\n ssn: '[SSN-REDACTED]',\n email: '[EMAIL-REDACTED]',\n phone_us: '[PHONE-REDACTED]',\n iban: '[IBAN-REDACTED]',\n passport: '[PASSPORT-REDACTED]',\n ip_address: '[IP-REDACTED]',\n jwt: '[JWT-REDACTED]',\n api_key: '[KEY-REDACTED]',\n};\n\nexport class JoopPIIScanner {\n private _patterns: JoopPIIPattern[] = [...BUILT_IN_PATTERNS];\n\n /** Add or replace a custom pattern */\n addPattern(name: string, regex: RegExp): void {\n const idx = this._patterns.findIndex(p => p.name === name);\n if (idx >= 0) this._patterns[idx] = { name, regex };\n else this._patterns.push({ name, regex });\n }\n\n removePattern(name: string): void { this._patterns = this._patterns.filter(p => p.name !== name); }\n\n /** Return all PII findings in text */\n scan(text: string): JoopPIIFinding[] {\n const findings: JoopPIIFinding[] = [];\n for (const { name, regex } of this._patterns) {\n const r = new RegExp(regex.source, regex.flags.includes('g') ? regex.flags : regex.flags + 'g');\n r.lastIndex = 0;\n let m: RegExpExecArray | null;\n while ((m = r.exec(text)) !== null) {\n findings.push({ type: name, value: m[0], start: m.index, end: m.index + m[0].length });\n }\n }\n return findings.sort((a, b) => a.start - b.start);\n }\n\n /** Replace all PII in text. Replacement can be a string or function(type) */\n redact(text: string, replacement?: string | ((type: string) => string)): string {\n const findings = this.scan(text);\n if (findings.length === 0) return text;\n\n // Process from end to preserve indices\n let result = text;\n for (const f of [...findings].reverse()) {\n const repl = replacement\n ? (typeof replacement === 'string' ? replacement : replacement(f.type))\n : (DEFAULT_REPLACER[f.type] ?? `[${f.type.toUpperCase()}-REDACTED]`);\n result = result.slice(0, f.start) + repl + result.slice(f.end);\n }\n return result;\n }\n\n /** Returns true if the text contains any PII */\n contains(text: string): boolean { return this.scan(text).length > 0; }\n\n /** Hash PII values (SHA-256 truncated) — returns text with hashed placeholders */\n async pseudonymize(text: string): Promise<string> {\n const findings = this.scan(text);\n if (findings.length === 0) return text;\n\n const cache = new Map<string, string>();\n const hash = async (val: string) => {\n if (cache.has(val)) return cache.get(val)!;\n const buf = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(val));\n const h = Array.from(new Uint8Array(buf)).slice(0, 8).map(b => b.toString(16).padStart(2, '0')).join('');\n cache.set(val, h);\n return h;\n };\n\n let result = text;\n for (const f of [...findings].reverse()) {\n const h = await hash(f.value);\n result = result.slice(0, f.start) + `[${f.type}:${h}]` + result.slice(f.end);\n }\n return result;\n }\n}\n","export interface JoopShare {\n x: number;\n y: bigint;\n}\n\n// Shamir's Secret Sharing over a 256-bit prime field\n// p = 2^256 - 2^32 - 2^9 - 2^8 - 2^7 - 2^6 - 2^4 - 1 (secp256k1 field prime)\nconst PRIME = BigInt('0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F');\n\nexport class JoopSecretSharing {\n /**\n * Split a secret string into `n` shares, requiring `k` shares to reconstruct.\n * Uses Shamir's Secret Sharing over GF(PRIME).\n */\n split(secret: string, n: number, k: number): JoopShare[] {\n if (k > n) throw new Error('k must be ≤ n');\n if (k < 2) throw new Error('k must be at least 2');\n\n const secretBytes = new TextEncoder().encode(secret);\n const secretBig = _bytesToBigInt(secretBytes);\n if (secretBig >= PRIME) throw new Error('Secret too large for this field');\n\n const coefficients: bigint[] = [secretBig];\n for (let i = 1; i < k; i++) {\n coefficients.push(_randomBigInt(PRIME));\n }\n\n const shares: JoopShare[] = [];\n for (let x = 1; x <= n; x++) {\n let y = BigInt(0);\n const xBig = BigInt(x);\n for (let i = 0; i < coefficients.length; i++) {\n y = _modAdd(y, _modMul(coefficients[i], _modPow(xBig, BigInt(i), PRIME), PRIME), PRIME);\n }\n shares.push({ x, y });\n }\n return shares;\n }\n\n /**\n * Reconstruct the secret from k or more shares using Lagrange interpolation.\n */\n combine(shares: JoopShare[]): string {\n if (shares.length < 2) throw new Error('At least 2 shares required');\n\n let secret = BigInt(0);\n for (let i = 0; i < shares.length; i++) {\n const xi = BigInt(shares[i].x);\n let num = BigInt(1);\n let den = BigInt(1);\n for (let j = 0; j < shares.length; j++) {\n if (i === j) continue;\n const xj = BigInt(shares[j].x);\n num = _modMul(num, _modSub(BigInt(0), xj, PRIME), PRIME);\n den = _modMul(den, _modSub(xi, xj, PRIME), PRIME);\n }\n const lagrange = _modMul(num, _modPow(den, PRIME - BigInt(2), PRIME), PRIME);\n secret = _modAdd(secret, _modMul(shares[i].y, lagrange, PRIME), PRIME);\n }\n\n const bytes = _bigIntToBytes(secret);\n return new TextDecoder().decode(bytes);\n }\n\n /** Verify that a set of shares produces a consistent secret */\n verify(sharesA: JoopShare[], sharesB: JoopShare[]): boolean {\n try {\n return this.combine(sharesA) === this.combine(sharesB);\n } catch {\n return false;\n }\n }\n\n /** Serialize shares to base64 strings for transport */\n serializeShare(share: JoopShare): string {\n return btoa(JSON.stringify({ x: share.x, y: share.y.toString(16) }));\n }\n\n /** Deserialize a base64 share */\n deserializeShare(encoded: string): JoopShare {\n const { x, y } = JSON.parse(atob(encoded));\n return { x, y: BigInt(`0x${y}`) };\n }\n}\n\nfunction _modAdd(a: bigint, b: bigint, p: bigint): bigint { return ((a + b) % p + p) % p; }\nfunction _modSub(a: bigint, b: bigint, p: bigint): bigint { return ((a - b) % p + p) % p; }\nfunction _modMul(a: bigint, b: bigint, p: bigint): bigint { return (a * b) % p; }\n\nfunction _modPow(base: bigint, exp: bigint, mod: bigint): bigint {\n let result = BigInt(1);\n base = base % mod;\n while (exp > 0n) {\n if (exp % 2n === 1n) result = _modMul(result, base, mod);\n exp >>= 1n;\n base = _modMul(base, base, mod);\n }\n return result;\n}\n\nfunction _bytesToBigInt(bytes: Uint8Array): bigint {\n let result = 0n;\n for (const byte of bytes) result = (result << 8n) | BigInt(byte);\n return result;\n}\n\nfunction _bigIntToBytes(n: bigint): Uint8Array {\n if (n === 0n) return new Uint8Array([0]);\n const hex = n.toString(16).padStart(2, '0');\n const padded = hex.length % 2 ? '0' + hex : hex;\n const bytes = new Uint8Array(padded.length / 2);\n for (let i = 0; i < bytes.length; i++) bytes[i] = parseInt(padded.slice(i * 2, i * 2 + 2), 16);\n return bytes;\n}\n\nfunction _randomBigInt(max: bigint): bigint {\n const bytes = new Uint8Array(32);\n crypto.getRandomValues(bytes);\n return _bytesToBigInt(bytes) % max;\n}\n","/**\n * Differential Privacy utilities using the Laplace mechanism and randomized response.\n * Provides (epsilon, 0)-differential privacy guarantees.\n */\nexport class JoopDifferentialPrivacy {\n /**\n * Add Laplace noise to a numeric value.\n * @param value - the true value\n * @param sensitivity - L1 sensitivity (max change in output from one record change)\n * @param epsilon - privacy budget (smaller = more privacy)\n */\n addLaplaceNoise(value: number, sensitivity: number, epsilon: number): number {\n const b = sensitivity / epsilon;\n return value + _sampleLaplace(b);\n }\n\n /**\n * Privatize a count (integer ≥ 0).\n * Returns a rounded, non-negative noisy count.\n */\n privatizeCount(count: number, epsilon = 1.0): number {\n const noisy = this.addLaplaceNoise(count, 1, epsilon);\n return Math.max(0, Math.round(noisy));\n }\n\n /**\n * Privatize an average over an array of values.\n * @param values - the actual values\n * @param epsilon - privacy budget\n * @param valueRange - [min, max] of each value (for sensitivity calculation)\n */\n privatizeAverage(values: number[], epsilon = 1.0, valueRange: [number, number] = [0, 1]): number {\n if (values.length === 0) return 0;\n const sensitivity = (valueRange[1] - valueRange[0]) / values.length;\n const trueAvg = values.reduce((s, v) => s + v, 0) / values.length;\n return this.addLaplaceNoise(trueAvg, sensitivity, epsilon);\n }\n\n /**\n * Privatize a sum.\n */\n privatizeSum(values: number[], epsilon = 1.0, sensitivity = 1.0): number {\n const trueSum = values.reduce((s, v) => s + v, 0);\n return this.addLaplaceNoise(trueSum, sensitivity, epsilon);\n }\n\n /**\n * Randomized response for boolean values (local differential privacy).\n * Each individual flips their true value with probability p = 1/(1+e^epsilon).\n * @returns a potentially flipped boolean\n */\n randomizedResponse(value: boolean, epsilon = 1.0): boolean {\n const p = 1 / (1 + Math.exp(epsilon));\n return Math.random() < p ? !value : value;\n }\n\n /**\n * Randomized response for categorical values (k-ary randomized response).\n * Returns the true value with probability p, and a random other value with 1-p.\n */\n randomizedResponseCategorical<T>(value: T, domain: T[], epsilon = 1.0): T {\n const k = domain.length;\n if (k < 2) return value;\n const p = Math.exp(epsilon) / (Math.exp(epsilon) + k - 1);\n if (Math.random() < p) return value;\n // Pick uniformly from the other values\n const others = domain.filter(v => v !== value);\n return others[Math.floor(Math.random() * others.length)];\n }\n\n /**\n * Gaussian mechanism: add N(0, sigma^2) noise where sigma = sqrt(2*ln(1.25/delta)) * sensitivity / epsilon\n * Provides (epsilon, delta)-DP.\n */\n addGaussianNoise(value: number, sensitivity: number, epsilon: number, delta = 1e-5): number {\n const sigma = Math.sqrt(2 * Math.log(1.25 / delta)) * sensitivity / epsilon;\n return value + _sampleGaussian(sigma);\n }\n\n /**\n * Compute the epsilon required to achieve (epsilon)-DP for Laplace mechanism.\n */\n requiredEpsilon(sensitivity: number, targetNoise: number): number {\n return sensitivity / targetNoise;\n }\n\n /**\n * Privacy amplification: effective epsilon after subsampling fraction q of the data.\n */\n amplifiedEpsilon(epsilon: number, samplingRate: number): number {\n return Math.log(1 + samplingRate * (Math.exp(epsilon) - 1));\n }\n}\n\n/** Sample from Laplace(0, b) using inverse CDF method */\nfunction _sampleLaplace(b: number): number {\n const u = Math.random() - 0.5;\n return -b * Math.sign(u) * Math.log(1 - 2 * Math.abs(u));\n}\n\n/** Sample from N(0, sigma^2) using Box-Muller transform */\nfunction _sampleGaussian(sigma: number): number {\n const u1 = 1 - Math.random();\n const u2 = Math.random();\n return sigma * Math.sqrt(-2 * Math.log(u1)) * Math.cos(2 * Math.PI * u2);\n}\n","export interface JoopWatermarkOptions {\n opacity?: number; // 0–1 for visual watermark\n fontSize?: number;\n color?: string;\n rotation?: number; // degrees\n repeat?: boolean;\n lsb?: boolean; // use LSB steganography (invisible)\n}\n\nexport class JoopWatermarkService {\n private _watermarkedElements = new WeakMap<HTMLElement, HTMLElement>();\n\n /**\n * Apply a visible tiled watermark overlay to an element.\n */\n apply(element: HTMLElement, text: string, opts: JoopWatermarkOptions = {}): void {\n this.remove(element);\n const { opacity = 0.08, fontSize = 16, color = '#000000', rotation = -30, repeat = true } = opts;\n\n const overlay = document.createElement('div');\n Object.assign(overlay.style, {\n position: 'absolute', top: '0', left: '0', width: '100%', height: '100%',\n pointerEvents: 'none', zIndex: '9999', overflow: 'hidden',\n opacity: String(opacity),\n });\n\n if (repeat) {\n const canvas = document.createElement('canvas');\n canvas.width = 200; canvas.height = 100;\n const ctx = canvas.getContext('2d')!;\n ctx.clearRect(0, 0, 200, 100);\n ctx.save();\n ctx.translate(100, 50);\n ctx.rotate((rotation * Math.PI) / 180);\n ctx.font = `${fontSize}px sans-serif`;\n ctx.fillStyle = color;\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n ctx.fillText(text, 0, 0);\n ctx.restore();\n overlay.style.backgroundImage = `url(${canvas.toDataURL()})`;\n overlay.style.backgroundRepeat = 'repeat';\n } else {\n overlay.style.display = 'flex';\n overlay.style.alignItems = 'center';\n overlay.style.justifyContent = 'center';\n const span = document.createElement('span');\n span.textContent = text;\n span.style.transform = `rotate(${rotation}deg)`;\n span.style.fontSize = `${fontSize}px`;\n span.style.color = color;\n span.style.whiteSpace = 'nowrap';\n overlay.appendChild(span);\n }\n\n if (getComputedStyle(element).position === 'static') element.style.position = 'relative';\n element.appendChild(overlay);\n this._watermarkedElements.set(element, overlay);\n }\n\n remove(element: HTMLElement): void {\n const overlay = this._watermarkedElements.get(element);\n if (overlay && overlay.parentNode === element) element.removeChild(overlay);\n this._watermarkedElements.delete(element);\n }\n\n /**\n * Embed a payload invisibly into an ImageData using LSB steganography.\n * Modifies the least significant bit of the R channel of each pixel.\n */\n embedInImage(imageData: ImageData, payload: string): ImageData {\n const bytes = new TextEncoder().encode(payload + '\\0'); // null-terminated\n const bits = _toBits(bytes);\n const data = new Uint8ClampedArray(imageData.data);\n\n // First 32 pixels encode the length as 32 bits\n const lenBits = _uint32ToBits(bytes.length);\n for (let i = 0; i < 32 && i < data.length / 4; i++) {\n data[i * 4] = (data[i * 4] & 0xfe) | lenBits[i]; // LSB of R channel\n }\n\n for (let i = 0; i < bits.length; i++) {\n const pixelIdx = (i + 32) * 4;\n if (pixelIdx >= data.length) break;\n data[pixelIdx] = (data[pixelIdx] & 0xfe) | bits[i];\n }\n\n return new ImageData(data, imageData.width, imageData.height);\n }\n\n /**\n * Extract a payload from an ImageData that was embedded with embedInImage.\n * Returns null if no valid payload is found.\n */\n extractFromImage(imageData: ImageData): string | null {\n const data = imageData.data;\n\n // Read length from first 32 pixels\n const lenBits: number[] = [];\n for (let i = 0; i < 32; i++) lenBits.push(data[i * 4] & 1);\n const len = _bitsToUint32(lenBits);\n if (len <= 0 || len > (data.length / 4 - 32) / 8) return null;\n\n const totalBits = len * 8;\n const bits: number[] = [];\n for (let i = 0; i < totalBits; i++) {\n const pixelIdx = (i + 32) * 4;\n if (pixelIdx >= data.length) break;\n bits.push(data[pixelIdx] & 1);\n }\n\n const bytes = _fromBits(bits);\n try {\n const text = new TextDecoder().decode(bytes);\n const nullIdx = text.indexOf('\\0');\n return nullIdx >= 0 ? text.slice(0, nullIdx) : text;\n } catch {\n return null;\n }\n }\n\n /** Apply invisible LSB watermark to a canvas element */\n applyToCanvas(canvas: HTMLCanvasElement, payload: string): void {\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n const imgData = ctx.getImageData(0, 0, canvas.width, canvas.height);\n const modified = this.embedInImage(imgData, payload);\n ctx.putImageData(modified, 0, 0);\n }\n}\n\nfunction _toBits(bytes: Uint8Array): number[] {\n const bits: number[] = [];\n for (const byte of bytes) for (let i = 7; i >= 0; i--) bits.push((byte >> i) & 1);\n return bits;\n}\n\nfunction _fromBits(bits: number[]): Uint8Array {\n const bytes = new Uint8Array(Math.ceil(bits.length / 8));\n for (let i = 0; i < bytes.length; i++) {\n let val = 0;\n for (let j = 0; j < 8 && i * 8 + j < bits.length; j++) val = (val << 1) | bits[i * 8 + j];\n bytes[i] = val;\n }\n return bytes;\n}\n\nfunction _uint32ToBits(n: number): number[] {\n const bits: number[] = [];\n for (let i = 31; i >= 0; i--) bits.push((n >> i) & 1);\n return bits;\n}\n\nfunction _bitsToUint32(bits: number[]): number {\n let n = 0;\n for (const b of bits) n = (n << 1) | b;\n return n >>> 0;\n}\n","import { JoopBehaviorSubject, JoopSubject } from '../events';\n\nexport interface JoopVitalsSnapshot {\n lcp: number | null; // Largest Contentful Paint (ms)\n fid: number | null; // First Input Delay (ms) — deprecated, use INP\n inp: number | null; // Interaction to Next Paint (ms)\n cls: number | null; // Cumulative Layout Shift (score)\n ttfb: number | null; // Time to First Byte (ms)\n fcp: number | null; // First Contentful Paint (ms)\n capturedAt: number;\n}\n\nexport interface JoopVitalUpdate {\n metric: keyof Omit<JoopVitalsSnapshot, 'capturedAt'>;\n value: number;\n rating: 'good' | 'needs-improvement' | 'poor';\n}\n\n// Thresholds per https://web.dev/vitals/\nconst THRESHOLDS: Record<string, [number, number]> = {\n lcp: [2500, 4000],\n fid: [100, 300],\n inp: [200, 500],\n cls: [0.1, 0.25],\n ttfb: [800, 1800],\n fcp: [1800, 3000],\n};\n\nexport class JoopWebVitals {\n private _vitals: Partial<JoopVitalsSnapshot> = {};\n private _vitals$ = new JoopSubject<JoopVitalUpdate>();\n private _snapshot$ = new JoopBehaviorSubject<JoopVitalsSnapshot>(this._buildSnapshot());\n private _observers: PerformanceObserver[] = [];\n private _running = false;\n\n start(): void {\n if (this._running || typeof PerformanceObserver === 'undefined') return;\n this._running = true;\n this._observeLCP();\n this._observeFID();\n this._observeINP();\n this._observeCLS();\n this._observeTTFB();\n this._observeFCP();\n }\n\n stop(): void {\n this._running = false;\n for (const obs of this._observers) { try { obs.disconnect(); } catch {} }\n this._observers = [];\n }\n\n snapshot(): JoopVitalsSnapshot { return this._buildSnapshot(); }\n vitals$() { return this._vitals$.asObservable(); }\n snapshot$() { return this._snapshot$.asObservable(); }\n\n getLCP(): number | null { return this._vitals.lcp ?? null; }\n getCLS(): number | null { return this._vitals.cls ?? null; }\n getINP(): number | null { return this._vitals.inp ?? null; }\n getTTFB(): number | null { return this._vitals.ttfb ?? null; }\n getFCP(): number | null { return this._vitals.fcp ?? null; }\n getFID(): number | null { return this._vitals.fid ?? null; }\n\n getRating(metric: string): 'good' | 'needs-improvement' | 'poor' {\n const value = (this._vitals as Record<string, number | null>)[metric];\n return _rate(metric, value ?? null);\n }\n\n private _record(metric: keyof Omit<JoopVitalsSnapshot, 'capturedAt'>, value: number): void {\n (this._vitals as Record<string, number>)[metric] = value;\n const rating = _rate(metric as string, value);\n this._vitals$.next({ metric, value, rating });\n this._snapshot$.next(this._buildSnapshot());\n }\n\n private _observe(types: string[], callback: (list: PerformanceObserverEntryList) => void): void {\n try {\n const obs = new PerformanceObserver(callback);\n obs.observe({ type: types[0], buffered: true });\n this._observers.push(obs);\n } catch {}\n }\n\n private _observeLCP(): void {\n this._observe(['largest-contentful-paint'], list => {\n const entries = list.getEntries();\n if (entries.length) this._record('lcp', (entries[entries.length - 1] as PerformanceEntry & { renderTime?: number; loadTime?: number }).renderTime || (entries[entries.length - 1] as PerformanceEntry & { renderTime?: number; loadTime?: number }).loadTime || entries[entries.length - 1].startTime);\n });\n }\n\n private _observeFID(): void {\n this._observe(['first-input'], list => {\n const e = list.getEntries()[0] as PerformanceEntry & { processingStart?: number };\n if (e && e.processingStart) this._record('fid', e.processingStart - e.startTime);\n });\n }\n\n private _observeINP(): void {\n this._observe(['event'], list => {\n let max = this._vitals.inp ?? 0;\n for (const e of list.getEntries()) {\n const entry = e as PerformanceEntry & { processingEnd?: number };\n if (entry.processingEnd) max = Math.max(max, entry.processingEnd - entry.startTime);\n }\n if (max > 0) this._record('inp', max);\n });\n }\n\n private _observeCLS(): void {\n let clsValue = 0;\n let sessionStart = 0;\n let lastEntry = 0;\n this._observe(['layout-shift'], list => {\n for (const e of list.getEntries()) {\n const entry = e as PerformanceEntry & { hadRecentInput?: boolean; value?: number };\n if (entry.hadRecentInput) continue;\n if (lastEntry > 0 && (entry.startTime - lastEntry) > 1000) {\n if (entry.startTime - sessionStart > 5000) { clsValue = 0; sessionStart = entry.startTime; }\n }\n if (lastEntry === 0) sessionStart = entry.startTime;\n clsValue += entry.value ?? 0;\n lastEntry = entry.startTime;\n this._record('cls', clsValue);\n }\n });\n }\n\n private _observeTTFB(): void {\n const nav = performance.getEntriesByType?.('navigation')?.[0] as PerformanceEntry & { responseStart?: number };\n if (nav?.responseStart) this._record('ttfb', nav.responseStart);\n this._observe(['navigation'], list => {\n const e = list.getEntries()[0] as PerformanceEntry & { responseStart?: number };\n if (e?.responseStart) this._record('ttfb', e.responseStart);\n });\n }\n\n private _observeFCP(): void {\n this._observe(['paint'], list => {\n const e = list.getEntries().find(e => e.name === 'first-contentful-paint');\n if (e) this._record('fcp', e.startTime);\n });\n }\n\n private _buildSnapshot(): JoopVitalsSnapshot {\n return {\n lcp: this._vitals.lcp ?? null,\n fid: this._vitals.fid ?? null,\n inp: this._vitals.inp ?? null,\n cls: this._vitals.cls ?? null,\n ttfb: this._vitals.ttfb ?? null,\n fcp: this._vitals.fcp ?? null,\n capturedAt: Date.now(),\n };\n }\n}\n\nfunction _rate(metric: string, value: number | null): 'good' | 'needs-improvement' | 'poor' {\n if (value === null) return 'good';\n const [good, poor] = THRESHOLDS[metric] ?? [Infinity, Infinity];\n return value <= good ? 'good' : value <= poor ? 'needs-improvement' : 'poor';\n}\n","export type JoopRecordedEventType = 'dom-mutation' | 'click' | 'input' | 'scroll' | 'resize' | 'navigation' | 'custom';\n\nexport interface JoopRecordedEvent {\n type: JoopRecordedEventType;\n timestamp: number;\n selector?: string;\n value?: string;\n data?: Record<string, unknown>;\n}\n\nexport interface JoopSessionRecord {\n startedAt: number;\n stoppedAt: number;\n events: JoopRecordedEvent[];\n url: string;\n userAgent: string;\n}\n\nexport interface JoopSessionRecorderOptions {\n maskSelectors?: string[]; // CSS selectors to mask (replace with ***)\n ignoreSelectors?: string[]; // CSS selectors to ignore entirely\n redactInputs?: boolean; // auto-redact password + [data-pii] inputs\n maxEvents?: number;\n captureScroll?: boolean;\n captureResize?: boolean;\n}\n\nexport class JoopSessionRecorder {\n private _events: JoopRecordedEvent[] = [];\n private _running = false;\n private _paused = false;\n private _startedAt = 0;\n private _opts: Required<JoopSessionRecorderOptions> = {\n maskSelectors: [], ignoreSelectors: [],\n redactInputs: true, maxEvents: 10000,\n captureScroll: true, captureResize: true,\n };\n private _cleanup: Array<() => void> = [];\n private _mutationObserver: MutationObserver | null = null;\n private _scrollTimer: ReturnType<typeof setTimeout> | null = null;\n\n start(options: JoopSessionRecorderOptions = {}): void {\n if (this._running) return;\n this._opts = { ...this._opts, ...options };\n this._running = true; this._paused = false;\n this._events = []; this._startedAt = Date.now();\n this._attachListeners();\n }\n\n pause(): void { this._paused = true; }\n resume(): void { this._paused = false; }\n\n stop(): JoopSessionRecord {\n this._running = false; this._paused = false;\n this._detach();\n return {\n startedAt: this._startedAt, stoppedAt: Date.now(),\n events: [...this._events],\n url: typeof location !== 'undefined' ? location.href : '',\n userAgent: typeof navigator !== 'undefined' ? navigator.userAgent : '',\n };\n }\n\n events(): JoopRecordedEvent[] { return [...this._events]; }\n\n export(format: 'json' | 'compressed' = 'json'): string {\n const record: JoopSessionRecord = {\n startedAt: this._startedAt, stoppedAt: Date.now(),\n events: this._events, url: typeof location !== 'undefined' ? location.href : '', userAgent: typeof navigator !== 'undefined' ? navigator.userAgent : '',\n };\n const json = JSON.stringify(record);\n if (format === 'compressed') {\n try { return btoa(json); } catch { return json; }\n }\n return json;\n }\n\n addEvent(type: JoopRecordedEventType, data?: Record<string, unknown>): void {\n this._push({ type, timestamp: Date.now(), data });\n }\n\n private _push(event: JoopRecordedEvent): void {\n if (!this._running || this._paused) return;\n if (this._events.length >= this._opts.maxEvents) this._events.shift();\n this._events.push(event);\n }\n\n private _attachListeners(): void {\n // DOM mutations\n this._mutationObserver = new MutationObserver(mutations => {\n for (const m of mutations) {\n if (this._shouldIgnore(m.target as Element)) continue;\n this._push({ type: 'dom-mutation', timestamp: Date.now(), selector: _selector(m.target as Element), data: { addedNodes: m.addedNodes.length, removedNodes: m.removedNodes.length, type: m.type } });\n }\n });\n this._mutationObserver.observe(document.documentElement, { childList: true, subtree: true, attributes: true, characterData: false, attributeFilter: ['class', 'style', 'hidden', 'disabled'] });\n\n // Click\n const onClick = (e: MouseEvent) => {\n const el = e.target as Element;\n if (this._shouldIgnore(el)) return;\n this._push({ type: 'click', timestamp: Date.now(), selector: _selector(el) });\n };\n document.addEventListener('click', onClick, { capture: true });\n this._cleanup.push(() => document.removeEventListener('click', onClick, { capture: true }));\n\n // Input\n const onInput = (e: Event) => {\n const el = e.target as HTMLInputElement;\n if (this._shouldIgnore(el)) return;\n const redact = this._opts.redactInputs && (el.type === 'password' || el.dataset?.pii !== undefined || this._opts.maskSelectors.some(s => el.matches(s)));\n this._push({ type: 'input', timestamp: Date.now(), selector: _selector(el), value: redact ? '***' : undefined });\n };\n document.addEventListener('input', onInput, { capture: true });\n this._cleanup.push(() => document.removeEventListener('input', onInput, { capture: true }));\n\n // Scroll (throttled)\n if (this._opts.captureScroll) {\n const onScroll = () => {\n if (this._scrollTimer) return;\n this._scrollTimer = setTimeout(() => {\n this._scrollTimer = null;\n this._push({ type: 'scroll', timestamp: Date.now(), data: { x: window.scrollX, y: window.scrollY } });\n }, 250);\n };\n window.addEventListener('scroll', onScroll, { passive: true });\n this._cleanup.push(() => window.removeEventListener('scroll', onScroll));\n }\n\n // Resize (throttled)\n if (this._opts.captureResize) {\n let resizeTimer: ReturnType<typeof setTimeout> | null = null;\n const onResize = () => {\n if (resizeTimer) return;\n resizeTimer = setTimeout(() => {\n resizeTimer = null;\n this._push({ type: 'resize', timestamp: Date.now(), data: { w: window.innerWidth, h: window.innerHeight } });\n }, 250);\n };\n window.addEventListener('resize', onResize, { passive: true });\n this._cleanup.push(() => window.removeEventListener('resize', onResize));\n }\n\n // Navigation\n const onPop = () => this._push({ type: 'navigation', timestamp: Date.now(), data: { url: location.href } });\n window.addEventListener('popstate', onPop);\n this._cleanup.push(() => window.removeEventListener('popstate', onPop));\n }\n\n private _detach(): void {\n this._mutationObserver?.disconnect(); this._mutationObserver = null;\n for (const fn of this._cleanup) fn();\n this._cleanup = [];\n }\n\n private _shouldIgnore(el: Element | null): boolean {\n if (!el) return false;\n return this._opts.ignoreSelectors.some(s => { try { return el.matches?.(s); } catch { return false; } });\n }\n}\n\nfunction _selector(el: Element | null): string {\n if (!el) return '';\n const parts: string[] = [];\n let current: Element | null = el;\n while (current && current !== document.body && parts.length < 4) {\n let part = current.tagName.toLowerCase();\n if (current.id) { parts.unshift(`#${current.id}`); break; }\n if (current.className) part += '.' + Array.from(current.classList).slice(0, 2).join('.');\n parts.unshift(part);\n current = current.parentElement;\n }\n return parts.join(' > ');\n}\n","export type JoopWebhookProvider = 'stripe' | 'github' | 'generic';\n\nexport interface JoopWebhookOptions {\n toleranceSeconds?: number; // default: 300 (5 min)\n algorithm?: 'SHA-256' | 'SHA-1' | 'SHA-512';\n}\n\nexport class JoopWebhookVerifier {\n private _provider: JoopWebhookProvider = 'generic';\n\n for(provider: JoopWebhookProvider): JoopWebhookVerifier {\n const clone = new JoopWebhookVerifier();\n clone._provider = provider;\n return clone;\n }\n\n async verify(payload: string, signature: string, secret: string, opts: JoopWebhookOptions = {}): Promise<boolean> {\n switch (this._provider) {\n case 'stripe': return this.verifyStripe(payload, signature, secret, opts);\n case 'github': return this.verifyGitHub(payload, signature, secret, opts);\n default: return this.verifyGeneric(payload, signature, secret, opts);\n }\n }\n\n /** Stripe: `Stripe-Signature: t=...,v1=...` */\n async verifyStripe(payload: string, header: string, secret: string, opts: JoopWebhookOptions = {}): Promise<boolean> {\n const parts = Object.fromEntries(header.split(',').map(p => p.split('=')));\n const t = parts['t'];\n const v1 = parts['v1'];\n if (!t || !v1) return false;\n\n if (!this.verifyTimestamp(parseInt(t, 10), opts.toleranceSeconds ?? 300)) return false;\n\n const signed = `${t}.${payload}`;\n const expected = await _hmac('SHA-256', secret, signed);\n return _safeEqual(expected, v1);\n }\n\n /** GitHub: `X-Hub-Signature-256: sha256=...` */\n async verifyGitHub(payload: string, header: string, secret: string, opts: JoopWebhookOptions = {}): Promise<boolean> {\n const prefix = 'sha256=';\n if (!header.startsWith(prefix)) return false;\n const provided = header.slice(prefix.length);\n const expected = await _hmac('SHA-256', secret, payload);\n return _safeEqual(expected, provided);\n }\n\n /** Generic HMAC verification. signature is a hex string. */\n async verifyGeneric(payload: string, signature: string, secret: string, opts: JoopWebhookOptions = {}): Promise<boolean> {\n const algo = opts.algorithm ?? 'SHA-256';\n const expected = await _hmac(algo as AlgorithmIdentifier, secret, payload);\n return _safeEqual(expected, signature);\n }\n\n /** Returns true if the timestamp is within tolerance of now */\n verifyTimestamp(timestamp: number, toleranceSeconds = 300): boolean {\n const diff = Math.abs(Math.floor(Date.now() / 1000) - timestamp);\n return diff <= toleranceSeconds;\n }\n\n /** Compute the expected HMAC for a payload (for testing) */\n async sign(payload: string, secret: string, algo: AlgorithmIdentifier = 'SHA-256'): Promise<string> {\n return _hmac(algo, secret, payload);\n }\n}\n\nasync function _hmac(algorithm: AlgorithmIdentifier, secret: string, payload: string): Promise<string> {\n const enc = new TextEncoder();\n const key = await crypto.subtle.importKey(\n 'raw', enc.encode(secret),\n { name: 'HMAC', hash: algorithm },\n false, ['sign'],\n );\n const sig = await crypto.subtle.sign('HMAC', key, enc.encode(payload));\n return Array.from(new Uint8Array(sig)).map(b => b.toString(16).padStart(2, '0')).join('');\n}\n\nfunction _safeEqual(a: string, b: string): boolean {\n if (a.length !== b.length) return false;\n let diff = 0;\n for (let i = 0; i < a.length; i++) diff |= a.charCodeAt(i) ^ b.charCodeAt(i);\n return diff === 0;\n}\n","import { JoopPlatform } from '../platform/platform';\nimport type { JoopStorageAdapter } from '../platform/adapters';\n\nexport interface JoopIdempotencyConfig {\n storage?: JoopStorageAdapter;\n ttlMs?: number; // default: 24 hours\n prefix?: string;\n}\n\ninterface _IdempotencyEntry {\n key: string;\n createdAt: number;\n expiresAt: number;\n}\n\nexport class JoopIdempotencyService {\n private _storage: JoopStorageAdapter;\n private _ttlMs: number;\n private _prefix: string;\n /** Internal key registry used for clearAll() and gc() (avoids requiring Storage.length/key()) */\n private _keys = new Set<string>();\n\n constructor(config: JoopIdempotencyConfig = {}) {\n this._ttlMs = config.ttlMs ?? 24 * 60 * 60 * 1000;\n this._prefix = config.prefix ?? 'joop_idem_';\n this._storage = config.storage ?? JoopPlatform.getStorage();\n }\n\n /**\n * Generate and store an idempotency key for the given operation.\n * Returns an existing (non-expired) key if one already exists.\n */\n generate(operationKey: string): string {\n const storageKey = this._prefix + operationKey;\n const existing = this.get(operationKey);\n if (existing) {\n this._keys.add(storageKey); // ensure clearAll() covers pre-existing keys\n return existing;\n }\n\n const key = _generateKey();\n const entry: _IdempotencyEntry = { key, createdAt: Date.now(), expiresAt: Date.now() + this._ttlMs };\n this._storage.setItem(storageKey, JSON.stringify(entry));\n this._keys.add(storageKey);\n return key;\n }\n\n /** Get the stored key for an operation, or null if expired/not found */\n get(operationKey: string): string | null {\n const storageKey = this._prefix + operationKey;\n const raw = this._storage.getItem(storageKey);\n if (!raw) return null;\n try {\n const entry: _IdempotencyEntry = JSON.parse(raw);\n if (Date.now() > entry.expiresAt) {\n this._storage.removeItem(storageKey);\n this._keys.delete(storageKey);\n return null;\n }\n return entry.key;\n } catch {\n return null;\n }\n }\n\n /** Remove the key for an operation (e.g. after successful completion) */\n clear(operationKey: string): void {\n const storageKey = this._prefix + operationKey;\n this._storage.removeItem(storageKey);\n this._keys.delete(storageKey);\n }\n\n /** Clear all idempotency keys managed by this instance */\n clearAll(): void {\n for (const k of this._keys) this._storage.removeItem(k);\n this._keys.clear();\n }\n\n /**\n * Wrap a fetch-based function with automatic idempotency key injection.\n * Clears the key on success; keeps it on failure so retries reuse the same key.\n */\n async wrap<T>(operationKey: string, fn: (idempotencyKey: string) => Promise<T>): Promise<T> {\n const key = this.generate(operationKey);\n try {\n const result = await fn(key);\n this.clear(operationKey);\n return result;\n } catch (e) {\n throw e;\n }\n }\n\n /** Remove all expired entries */\n gc(): void {\n const now = Date.now();\n for (const k of [...this._keys]) {\n const raw = this._storage.getItem(k);\n if (!raw) { this._keys.delete(k); continue; }\n try {\n const e: _IdempotencyEntry = JSON.parse(raw);\n if (now > e.expiresAt) { this._storage.removeItem(k); this._keys.delete(k); }\n } catch { this._storage.removeItem(k); this._keys.delete(k); }\n }\n }\n}\n\nfunction _generateKey(): string {\n const buf = new Uint8Array(16);\n crypto.getRandomValues(buf);\n return Array.from(buf).map(b => b.toString(16).padStart(2, '0')).join('');\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","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","import { JoopBehaviorSubject } from '../events';\n\nexport interface JoopTransactionSignal {\n transactionId: string;\n amount: number;\n currency: string;\n timestamp: number;\n deviceId?: string;\n ipAddress?: string;\n latitude?: number;\n longitude?: number;\n cardBin?: string;\n merchantCategory?: string;\n channel?: 'web' | 'mobile' | 'atm' | 'pos';\n userId?: string;\n}\n\nexport interface JoopFraudSignalResult {\n name: string;\n score: number;\n triggered: boolean;\n detail?: string;\n}\n\nexport type JoopFraudLevel = 'low' | 'medium' | 'high' | 'critical';\n\nexport interface JoopFraudResult {\n transactionId: string;\n score: number;\n level: JoopFraudLevel;\n signals: JoopFraudSignalResult[];\n recommendation: 'allow' | 'review' | 'challenge' | 'block';\n timestamp: number;\n}\n\nexport interface JoopFraudConfig {\n velocityWindowMs?: number;\n velocityCountThreshold?: number;\n velocityAmountThreshold?: number;\n largeAmountThreshold?: number;\n geoDistanceThresholdKm?: number;\n alertThreshold?: number;\n maxHistorySize?: number;\n}\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\nfunction _haversine(lat1: number, lon1: number, lat2: number, lon2: number): number {\n const R = 6371;\n const dLat = (lat2 - lat1) * Math.PI / 180;\n const dLon = (lon2 - lon1) * Math.PI / 180;\n const a =\n Math.sin(dLat / 2) ** 2 +\n Math.cos(lat1 * Math.PI / 180) * Math.cos(lat2 * Math.PI / 180) * Math.sin(dLon / 2) ** 2;\n return R * 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));\n}\n\nfunction _scoreToLevel(score: number): JoopFraudLevel {\n if (score <= 30) return 'low';\n if (score <= 60) return 'medium';\n if (score <= 80) return 'high';\n return 'critical';\n}\n\nfunction _levelToRecommendation(level: JoopFraudLevel): 'allow' | 'review' | 'challenge' | 'block' {\n switch (level) {\n case 'low': return 'allow';\n case 'medium': return 'review';\n case 'high': return 'challenge';\n case 'critical': return 'block';\n }\n}\n\n// ---------------------------------------------------------------------------\n// JoopFraudDetection\n// ---------------------------------------------------------------------------\n\nexport class JoopFraudDetection {\n private readonly _cfg: Required<JoopFraudConfig>;\n private _history: JoopTransactionSignal[] = [];\n private _alertHandlers: Array<(result: JoopFraudResult) => void> = [];\n\n // Expose a reactive subject so callers can subscribe to every evaluation result\n readonly result$: JoopBehaviorSubject<JoopFraudResult | null>;\n\n constructor(config: JoopFraudConfig = {}) {\n this._cfg = {\n velocityWindowMs: config.velocityWindowMs ?? 3_600_000,\n velocityCountThreshold: config.velocityCountThreshold ?? 10,\n velocityAmountThreshold: config.velocityAmountThreshold ?? 5_000,\n largeAmountThreshold: config.largeAmountThreshold ?? 10_000,\n geoDistanceThresholdKm: config.geoDistanceThresholdKm ?? 500,\n alertThreshold: config.alertThreshold ?? 70,\n maxHistorySize: config.maxHistorySize ?? 1_000,\n };\n this.result$ = new JoopBehaviorSubject<JoopFraudResult | null>(null);\n }\n\n // -------------------------------------------------------------------------\n // Public API\n // -------------------------------------------------------------------------\n\n evaluate(signal: JoopTransactionSignal): JoopFraudResult {\n const signals: JoopFraudSignalResult[] = [\n this._velocityCount(signal),\n this._velocityAmount(signal),\n this._largeAmount(signal),\n this._geoDistance(signal),\n this._timeAnomaly(signal),\n ];\n\n const raw = signals.reduce((sum, s) => sum + s.score, 0);\n const score = Math.min(100, Math.round(raw));\n const level = _scoreToLevel(score);\n\n const result: JoopFraudResult = {\n transactionId: signal.transactionId,\n score,\n level,\n signals,\n recommendation: _levelToRecommendation(level),\n timestamp: Date.now(),\n };\n\n this.result$.next(result);\n return result;\n }\n\n addSignal(signal: JoopTransactionSignal): void {\n this._history.push(signal);\n if (this._history.length > this._cfg.maxHistorySize) {\n this._history.shift();\n }\n\n const result = this.evaluate(signal);\n if (result.score >= this._cfg.alertThreshold) {\n for (const handler of this._alertHandlers) {\n try { handler(result); } catch { /* swallow handler errors */ }\n }\n }\n }\n\n clearHistory(userId?: string): void {\n if (userId === undefined) {\n this._history = [];\n } else {\n this._history = this._history.filter(s => s.userId !== userId);\n }\n }\n\n onAlert(handler: (result: JoopFraudResult) => void): () => void {\n this._alertHandlers.push(handler);\n return () => {\n this._alertHandlers = this._alertHandlers.filter(h => h !== handler);\n };\n }\n\n // -------------------------------------------------------------------------\n // Signal evaluators\n // -------------------------------------------------------------------------\n\n /** Velocity: count of transactions by same user/device in window — max 30 pts */\n private _velocityCount(signal: JoopTransactionSignal): JoopFraudSignalResult {\n const windowStart = signal.timestamp - this._cfg.velocityWindowMs;\n const recent = this._history.filter(s =>\n s.timestamp >= windowStart &&\n (signal.userId ? s.userId === signal.userId : s.deviceId === signal.deviceId)\n );\n const count = recent.length;\n const threshold = this._cfg.velocityCountThreshold;\n\n if (count === 0) {\n return { name: 'velocity_count', score: 0, triggered: false };\n }\n\n const ratio = Math.min(count / threshold, 1);\n const score = Math.round(ratio * 30);\n return {\n name: 'velocity_count',\n score,\n triggered: count >= threshold,\n detail: `${count} transactions in window (threshold ${threshold})`,\n };\n }\n\n /** Velocity: total amount by same user/device in window — max 25 pts */\n private _velocityAmount(signal: JoopTransactionSignal): JoopFraudSignalResult {\n const windowStart = signal.timestamp - this._cfg.velocityWindowMs;\n const recent = this._history.filter(s =>\n s.timestamp >= windowStart &&\n s.currency === signal.currency &&\n (signal.userId ? s.userId === signal.userId : s.deviceId === signal.deviceId)\n );\n const total = recent.reduce((sum, s) => sum + s.amount, 0) + signal.amount;\n const threshold = this._cfg.velocityAmountThreshold;\n\n if (total <= 0) {\n return { name: 'velocity_amount', score: 0, triggered: false };\n }\n\n const ratio = Math.min(total / threshold, 1);\n const score = Math.round(ratio * 25);\n return {\n name: 'velocity_amount',\n score,\n triggered: total >= threshold,\n detail: `${total.toFixed(2)} ${signal.currency} in window (threshold ${threshold})`,\n };\n }\n\n /** Large single amount — max 20 pts */\n private _largeAmount(signal: JoopTransactionSignal): JoopFraudSignalResult {\n const threshold = this._cfg.largeAmountThreshold;\n if (signal.amount < threshold) {\n return { name: 'large_amount', score: 0, triggered: false };\n }\n const ratio = Math.min(signal.amount / (threshold * 3), 1);\n const score = Math.round(10 + ratio * 10); // 10–20 pts once over threshold\n return {\n name: 'large_amount',\n score,\n triggered: true,\n detail: `Amount ${signal.amount} ${signal.currency} exceeds threshold ${threshold}`,\n };\n }\n\n /** Geo distance from last transaction by same user — max 15 pts */\n private _geoDistance(signal: JoopTransactionSignal): JoopFraudSignalResult {\n if (signal.latitude === undefined || signal.longitude === undefined) {\n return { name: 'geo_distance', score: 0, triggered: false };\n }\n\n const previous = [...this._history]\n .reverse()\n .find(s =>\n s.latitude !== undefined &&\n s.longitude !== undefined &&\n (signal.userId ? s.userId === signal.userId : s.deviceId === signal.deviceId)\n );\n\n if (!previous || previous.latitude === undefined || previous.longitude === undefined) {\n return { name: 'geo_distance', score: 0, triggered: false };\n }\n\n const km = _haversine(previous.latitude, previous.longitude, signal.latitude, signal.longitude);\n const threshold = this._cfg.geoDistanceThresholdKm;\n\n if (km < threshold) {\n return { name: 'geo_distance', score: 0, triggered: false };\n }\n\n const ratio = Math.min(km / (threshold * 4), 1);\n const score = Math.round(ratio * 15);\n return {\n name: 'geo_distance',\n score,\n triggered: true,\n detail: `${km.toFixed(0)} km from last transaction (threshold ${threshold} km)`,\n };\n }\n\n /** Time anomaly: unusual hours 02:00–05:00 local time — max 10 pts */\n private _timeAnomaly(signal: JoopTransactionSignal): JoopFraudSignalResult {\n const hour = new Date(signal.timestamp).getHours();\n if (hour >= 2 && hour < 5) {\n return {\n name: 'time_anomaly',\n score: 10,\n triggered: true,\n detail: `Transaction at unusual hour ${hour}:xx (02–05 local)`,\n };\n }\n return { name: 'time_anomaly', score: 0, triggered: false };\n }\n}\n","import { JoopBehaviorSubject } from '../events';\n\n// ---------------------------------------------------------------------------\n// Interfaces and types\n// ---------------------------------------------------------------------------\n\nexport interface JoopOBCredentials {\n clientId: string;\n clientSecret: string;\n baseUrl: string;\n tokenUrl: string;\n}\n\nexport type JoopOBConsentStatus =\n | 'AwaitingAuthorisation'\n | 'Authorised'\n | 'Rejected'\n | 'Consumed'\n | 'Expired';\n\nexport type JoopOBPaymentStatus =\n | 'Pending'\n | 'AcceptedSettlementInProcess'\n | 'AcceptedSettlementCompleted'\n | 'Rejected'\n | 'Cancelled';\n\nexport type JoopOBAccountType = 'Personal' | 'Business';\n\nexport interface JoopOBAccount {\n accountId: string;\n iban?: string;\n currency: string;\n accountType: JoopOBAccountType;\n nickname?: string;\n balance?: {\n amount: number;\n currency: string;\n creditDebitIndicator: 'Credit' | 'Debit';\n };\n}\n\nexport interface JoopOBTransaction {\n transactionId: string;\n accountId: string;\n amount: number;\n currency: string;\n creditDebitIndicator: 'Credit' | 'Debit';\n status: 'Booked' | 'Pending';\n bookingDateTime: string;\n description?: string;\n merchantName?: string;\n reference?: string;\n}\n\nexport interface JoopOBPaymentRequest {\n reference: string;\n amount: number;\n currency: string;\n creditorName: string;\n creditorIban: string;\n debtorIban?: string;\n remittanceInfo?: string;\n}\n\nexport interface JoopOBConsentRequest {\n scopes: Array<\n | 'ReadAccountsBasic'\n | 'ReadAccountsDetail'\n | 'ReadBalances'\n | 'ReadTransactionsDetail'\n | 'ReadTransactionsCredits'\n | 'ReadTransactionsDebits'\n >;\n expirationDateTime?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Internal token state\n// ---------------------------------------------------------------------------\n\ninterface _TokenState {\n accessToken: string;\n expiresAt: number; // epoch ms\n}\n\n// ---------------------------------------------------------------------------\n// OBIE-spec raw response shapes (minimal subset)\n// ---------------------------------------------------------------------------\n\ninterface _OBIEAccountsResponse {\n Data: {\n Account: Array<{\n AccountId: string;\n Currency: string;\n AccountType: string;\n Nickname?: string;\n Account?: Array<{ Identification?: string }>;\n }>;\n };\n}\n\ninterface _OBIETransactionsResponse {\n Data: {\n Transaction: Array<{\n TransactionId: string;\n AccountId: string;\n Amount: { Amount: string; Currency: string };\n CreditDebitIndicator: string;\n Status: string;\n BookingDateTime: string;\n TransactionInformation?: string;\n MerchantDetails?: { MerchantName?: string };\n Reference?: string;\n }>;\n };\n}\n\ninterface _OBIEConsentResponse {\n Data: {\n ConsentId: string;\n Status: string;\n };\n Links?: { Self?: string };\n Risk?: Record<string, unknown>;\n}\n\ninterface _OBIEPaymentConsentResponse {\n Data: {\n ConsentId: string;\n Status: string;\n };\n}\n\ninterface _OBIEPaymentResponse {\n Data: {\n DomesticPaymentId: string;\n Status: string;\n ConsentId: string;\n };\n}\n\ninterface _OBIEPaymentStatusResponse {\n Data: { Status: string };\n}\n\ninterface _OBIEConsentStatusResponse {\n Data: { Status: string };\n}\n\n// ---------------------------------------------------------------------------\n// JoopOpenBankingClient\n// ---------------------------------------------------------------------------\n\nexport class JoopOpenBankingClient {\n private readonly _credentials: JoopOBCredentials;\n private _token: _TokenState | null = null;\n\n /** Reactive authentication state — true once a valid token is held */\n readonly authenticated$: JoopBehaviorSubject<boolean>;\n\n constructor(credentials: JoopOBCredentials) {\n this._credentials = credentials;\n this.authenticated$ = new JoopBehaviorSubject<boolean>(false);\n }\n\n // -------------------------------------------------------------------------\n // Authentication\n // -------------------------------------------------------------------------\n\n async authenticate(): Promise<void> {\n const token = await this._fetchToken();\n this._token = token;\n this.authenticated$.next(true);\n }\n\n // -------------------------------------------------------------------------\n // Accounts & balances\n // -------------------------------------------------------------------------\n\n async getAccounts(consentId: string): Promise<JoopOBAccount[]> {\n const raw = await this._request<_OBIEAccountsResponse>('GET', '/accounts', undefined, consentId);\n return (raw.Data.Account ?? []).map(a => ({\n accountId: a.AccountId,\n iban: a.Account?.[0]?.Identification,\n currency: a.Currency,\n accountType: (a.AccountType as JoopOBAccountType) ?? 'Personal',\n nickname: a.Nickname,\n }));\n }\n\n // -------------------------------------------------------------------------\n // Transactions\n // -------------------------------------------------------------------------\n\n async getTransactions(\n accountId: string,\n consentId: string,\n fromDate?: string,\n toDate?: string,\n ): Promise<JoopOBTransaction[]> {\n const params = new URLSearchParams();\n if (fromDate) params.set('fromBookingDateTime', fromDate);\n if (toDate) params.set('toBookingDateTime', toDate);\n const query = params.toString() ? `?${params.toString()}` : '';\n const raw = await this._request<_OBIETransactionsResponse>(\n 'GET',\n `/accounts/${accountId}/transactions${query}`,\n undefined,\n consentId,\n );\n return (raw.Data.Transaction ?? []).map(t => ({\n transactionId: t.TransactionId,\n accountId: t.AccountId,\n amount: parseFloat(t.Amount.Amount),\n currency: t.Amount.Currency,\n creditDebitIndicator: t.CreditDebitIndicator as 'Credit' | 'Debit',\n status: t.Status as 'Booked' | 'Pending',\n bookingDateTime: t.BookingDateTime,\n description: t.TransactionInformation,\n merchantName: t.MerchantDetails?.MerchantName,\n reference: t.Reference,\n }));\n }\n\n // -------------------------------------------------------------------------\n // Consents\n // -------------------------------------------------------------------------\n\n async createConsent(\n request: JoopOBConsentRequest,\n ): Promise<{ consentId: string; authorisationUrl: string; status: JoopOBConsentStatus }> {\n const body = {\n Data: {\n Permissions: request.scopes,\n ...(request.expirationDateTime ? { ExpirationDateTime: request.expirationDateTime } : {}),\n },\n Risk: {},\n };\n const raw = await this._request<_OBIEConsentResponse>('POST', '/account-access-consents', body);\n const consentId = raw.Data.ConsentId;\n // Build OBIE authorisation URL (redirect-based)\n const authorisationUrl =\n `${this._credentials.baseUrl.replace(/\\/open-banking.*$/, '')}/oauth2/authorize` +\n `?response_type=code%20id_token` +\n `&client_id=${encodeURIComponent(this._credentials.clientId)}` +\n `&request=${encodeURIComponent(consentId)}`;\n return {\n consentId,\n authorisationUrl,\n status: raw.Data.Status as JoopOBConsentStatus,\n };\n }\n\n async getConsentStatus(consentId: string): Promise<JoopOBConsentStatus> {\n const raw = await this._request<_OBIEConsentStatusResponse>(\n 'GET',\n `/account-access-consents/${consentId}`,\n );\n return raw.Data.Status as JoopOBConsentStatus;\n }\n\n async revokeConsent(consentId: string): Promise<void> {\n await this._request<unknown>('DELETE', `/account-access-consents/${consentId}`);\n }\n\n // -------------------------------------------------------------------------\n // Payments\n // -------------------------------------------------------------------------\n\n async initiatePayment(\n request: JoopOBPaymentRequest,\n ): Promise<{ paymentId: string; status: JoopOBPaymentStatus; consentId: string }> {\n // Step 1: create payment consent\n const consentBody = {\n Data: {\n Initiation: _buildInitiation(request),\n },\n Risk: { PaymentContextCode: 'TransferToThirdParty' },\n };\n const consentRaw = await this._request<_OBIEPaymentConsentResponse>(\n 'POST',\n '/domestic-payment-consents',\n consentBody,\n );\n const consentId = consentRaw.Data.ConsentId;\n\n // Step 2: submit payment using the consent\n const paymentBody = {\n Data: {\n ConsentId: consentId,\n Initiation: _buildInitiation(request),\n },\n Risk: { PaymentContextCode: 'TransferToThirdParty' },\n };\n const paymentRaw = await this._request<_OBIEPaymentResponse>(\n 'POST',\n '/domestic-payments',\n paymentBody,\n );\n return {\n paymentId: paymentRaw.Data.DomesticPaymentId,\n status: paymentRaw.Data.Status as JoopOBPaymentStatus,\n consentId,\n };\n }\n\n async getPaymentStatus(paymentId: string): Promise<JoopOBPaymentStatus> {\n const raw = await this._request<_OBIEPaymentStatusResponse>(\n 'GET',\n `/domestic-payments/${paymentId}`,\n );\n return raw.Data.Status as JoopOBPaymentStatus;\n }\n\n async cancelPayment(paymentId: string): Promise<void> {\n await this._request<unknown>('DELETE', `/domestic-payments/${paymentId}`);\n }\n\n // -------------------------------------------------------------------------\n // Private helpers\n // -------------------------------------------------------------------------\n\n private async _getToken(): Promise<string> {\n if (this._token && Date.now() < this._token.expiresAt - 30_000) {\n return this._token.accessToken;\n }\n const state = await this._fetchToken();\n this._token = state;\n this.authenticated$.next(true);\n return state.accessToken;\n }\n\n private async _fetchToken(): Promise<_TokenState> {\n const body = new URLSearchParams({\n grant_type: 'client_credentials',\n client_id: this._credentials.clientId,\n client_secret: this._credentials.clientSecret,\n scope: 'accounts payments',\n });\n\n const res = await fetch(this._credentials.tokenUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body: body.toString(),\n });\n\n if (!res.ok) {\n throw new Error(`[JoopOpenBankingClient] Token request failed: ${res.status} ${res.statusText}`);\n }\n\n const json = await res.json() as { access_token: string; expires_in: number };\n return {\n accessToken: json.access_token,\n expiresAt: Date.now() + json.expires_in * 1_000,\n };\n }\n\n private async _request<T>(\n method: string,\n path: string,\n body?: unknown,\n consentId?: string,\n ): Promise<T> {\n const token = await this._getToken();\n const url = `${this._credentials.baseUrl}${path}`;\n const headers: Record<string, string> = {\n 'Authorization': `Bearer ${token}`,\n 'Content-Type': 'application/json',\n 'x-fapi-interaction-id': _generateInteractionId(),\n 'x-fapi-financial-id': this._credentials.clientId,\n };\n if (consentId) {\n headers['x-ob-consent-id'] = consentId;\n }\n\n const res = await fetch(url, {\n method,\n headers,\n ...(body !== undefined ? { body: JSON.stringify(body) } : {}),\n });\n\n if (!res.ok) {\n const errorText = await res.text().catch(() => '');\n throw new Error(\n `[JoopOpenBankingClient] ${method} ${path} failed: ${res.status} ${res.statusText} — ${errorText}`,\n );\n }\n\n if (res.status === 204) return undefined as unknown as T;\n return res.json() as Promise<T>;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Module-level helpers\n// ---------------------------------------------------------------------------\n\nfunction _buildInitiation(req: JoopOBPaymentRequest): Record<string, unknown> {\n return {\n InstructionIdentification: req.reference,\n EndToEndIdentification: req.reference,\n InstructedAmount: {\n Amount: req.amount.toFixed(2),\n Currency: req.currency,\n },\n CreditorAccount: {\n SchemeName: 'UK.OBIE.IBAN',\n Identification: req.creditorIban,\n Name: req.creditorName,\n },\n ...(req.debtorIban\n ? {\n DebtorAccount: {\n SchemeName: 'UK.OBIE.IBAN',\n Identification: req.debtorIban,\n },\n }\n : {}),\n ...(req.remittanceInfo\n ? { RemittanceInformation: { Unstructured: req.remittanceInfo } }\n : {}),\n };\n}\n\nfunction _generateInteractionId(): string {\n const bytes = new Uint8Array(16);\n crypto.getRandomValues(bytes);\n // Format as UUID v4-like string\n const hex = Array.from(bytes).map(b => b.toString(16).padStart(2, '0')).join('');\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-4${hex.slice(13, 16)}-${hex.slice(16, 20)}-${hex.slice(20, 32)}`;\n}\n","import { JoopBehaviorSubject, JoopObservable } from '../events';\n\n// ---------------------------------------------------------------------------\n// Types and interfaces\n// ---------------------------------------------------------------------------\n\nexport type JoopPaymentStep =\n | 'idle'\n | 'initiating'\n | 'awaiting_3ds'\n | 'processing_3ds'\n | 'authorised'\n | 'settled'\n | 'failed'\n | 'cancelled';\n\nexport interface JoopPaymentSession {\n sessionId: string;\n paymentId: string;\n amount: number;\n currency: string;\n step: JoopPaymentStep;\n threeDsUrl?: string;\n threeDsData?: string;\n errorCode?: string;\n errorMessage?: string;\n createdAt: number;\n updatedAt: number;\n}\n\nexport interface JoopPaymentRequest {\n amount: number;\n currency: string;\n cardNumber: string;\n cardExpiry: string;\n cvv: string;\n merchantId: string;\n reference: string;\n returnUrl?: string;\n notifyUrl?: string;\n metadata?: Record<string, string>;\n}\n\nexport interface JoopThreeDsResult {\n transactionId: string;\n status: 'Y' | 'N' | 'U' | 'A';\n eci: string;\n cavv?: string;\n}\n\nexport interface JoopPaymentOrchestratorConfig {\n gatewayUrl: string;\n merchantId: string;\n apiKey: string;\n timeoutMs?: number;\n pollIntervalMs?: number;\n}\n\n// ---------------------------------------------------------------------------\n// Internal gateway response shapes\n// ---------------------------------------------------------------------------\n\ninterface _GatewayInitiateResponse {\n paymentId: string;\n status: string;\n requires3ds?: boolean;\n threeDsUrl?: string;\n threeDsData?: string;\n errorCode?: string;\n errorMessage?: string;\n}\n\ninterface _GatewayStatusResponse {\n paymentId: string;\n status: string;\n errorCode?: string;\n errorMessage?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Step → terminal/error checks\n// ---------------------------------------------------------------------------\n\nconst _TERMINAL_STEPS = new Set<JoopPaymentStep>(['authorised', 'settled', 'failed', 'cancelled']);\n\n// ---------------------------------------------------------------------------\n// JoopPaymentOrchestrator\n// ---------------------------------------------------------------------------\n\nexport class JoopPaymentOrchestrator {\n private readonly _cfg: Required<JoopPaymentOrchestratorConfig>;\n private readonly _sessions = new Map<string, JoopBehaviorSubject<JoopPaymentSession>>();\n\n constructor(config: JoopPaymentOrchestratorConfig) {\n this._cfg = {\n gatewayUrl: config.gatewayUrl,\n merchantId: config.merchantId,\n apiKey: config.apiKey,\n timeoutMs: config.timeoutMs ?? 30_000,\n pollIntervalMs: config.pollIntervalMs ?? 2_000,\n };\n }\n\n // -------------------------------------------------------------------------\n // Public API\n // -------------------------------------------------------------------------\n\n async initiate(request: JoopPaymentRequest): Promise<JoopPaymentSession> {\n const sessionId = this._generateSessionId();\n const now = Date.now();\n\n // Mask card number — keep only last 4 digits in session\n const maskedCard = `****${request.cardNumber.replace(/\\s/g, '').slice(-4)}`;\n\n const session: JoopPaymentSession = {\n sessionId,\n paymentId: '',\n amount: request.amount,\n currency: request.currency,\n step: 'initiating',\n createdAt: now,\n updatedAt: now,\n };\n\n const subject = new JoopBehaviorSubject<JoopPaymentSession>(session);\n this._sessions.set(sessionId, subject);\n\n try {\n const raw = await this._fetch<_GatewayInitiateResponse>('POST', '/payments', {\n amount: request.amount,\n currency: request.currency,\n cardNumber: maskedCard, // send masked to gateway after capture\n cardExpiry: request.cardExpiry,\n cvv: request.cvv,\n merchantId: request.merchantId,\n reference: request.reference,\n returnUrl: request.returnUrl,\n notifyUrl: request.notifyUrl,\n metadata: request.metadata,\n });\n\n const updated = this._updateSession(subject, {\n paymentId: raw.paymentId,\n step: raw.requires3ds ? 'awaiting_3ds' : 'authorised',\n threeDsUrl: raw.threeDsUrl,\n threeDsData: raw.threeDsData,\n errorCode: raw.errorCode,\n errorMessage: raw.errorMessage,\n });\n\n return updated;\n } catch (err) {\n const errMsg = err instanceof Error ? err.message : String(err);\n return this._updateSession(subject, {\n step: 'failed',\n errorMessage: errMsg,\n });\n }\n }\n\n async handle3ds(sessionId: string, result: JoopThreeDsResult): Promise<JoopPaymentSession> {\n const subject = this._requireSession(sessionId);\n const current = subject.getValue();\n\n if (result.status === 'N') {\n return this._updateSession(subject, {\n step: 'failed',\n errorCode: 'AUTH_FAILED_3DS',\n errorMessage: '3DS authentication was declined by the card issuer.',\n });\n }\n\n this._updateSession(subject, { step: 'processing_3ds' });\n\n try {\n const raw = await this._fetch<_GatewayStatusResponse>(\n 'POST',\n `/payments/${current.paymentId}/3ds`,\n {\n transactionId: result.transactionId,\n status: result.status,\n eci: result.eci,\n cavv: result.cavv,\n },\n );\n return this._updateSession(subject, {\n step: _mapGatewayStatus(raw.status),\n errorCode: raw.errorCode,\n errorMessage: raw.errorMessage,\n });\n } catch (err) {\n const errMsg = err instanceof Error ? err.message : String(err);\n return this._updateSession(subject, { step: 'failed', errorMessage: errMsg });\n }\n }\n\n async poll(sessionId: string): Promise<JoopPaymentSession> {\n const subject = this._requireSession(sessionId);\n const current = subject.getValue();\n\n if (_TERMINAL_STEPS.has(current.step)) {\n return current;\n }\n\n try {\n const raw = await this._fetch<_GatewayStatusResponse>(\n 'GET',\n `/payments/${current.paymentId}`,\n );\n return this._updateSession(subject, {\n step: _mapGatewayStatus(raw.status),\n errorCode: raw.errorCode,\n errorMessage: raw.errorMessage,\n });\n } catch (err) {\n const errMsg = err instanceof Error ? err.message : String(err);\n return this._updateSession(subject, { step: 'failed', errorMessage: errMsg });\n }\n }\n\n async confirm(sessionId: string): Promise<JoopPaymentSession> {\n const subject = this._requireSession(sessionId);\n const current = subject.getValue();\n\n if (_TERMINAL_STEPS.has(current.step)) {\n return current;\n }\n\n try {\n const raw = await this._fetch<_GatewayStatusResponse>(\n 'POST',\n `/payments/${current.paymentId}/confirm`,\n );\n return this._updateSession(subject, {\n step: _mapGatewayStatus(raw.status),\n errorCode: raw.errorCode,\n errorMessage: raw.errorMessage,\n });\n } catch (err) {\n const errMsg = err instanceof Error ? err.message : String(err);\n return this._updateSession(subject, { step: 'failed', errorMessage: errMsg });\n }\n }\n\n async cancel(sessionId: string): Promise<JoopPaymentSession> {\n const subject = this._requireSession(sessionId);\n const current = subject.getValue();\n\n if (_TERMINAL_STEPS.has(current.step)) {\n return current;\n }\n\n try {\n await this._fetch<unknown>('DELETE', `/payments/${current.paymentId}`);\n return this._updateSession(subject, { step: 'cancelled' });\n } catch (err) {\n const errMsg = err instanceof Error ? err.message : String(err);\n return this._updateSession(subject, { step: 'failed', errorMessage: errMsg });\n }\n }\n\n getSession(sessionId: string): JoopPaymentSession | null {\n return this._sessions.get(sessionId)?.getValue() ?? null;\n }\n\n session$(sessionId: string): JoopObservable<JoopPaymentSession> {\n const existing = this._sessions.get(sessionId);\n if (existing) return existing.asObservable();\n\n // Return an observable that never emits if session doesn't exist yet;\n // callers should call initiate() first.\n return new JoopObservable<JoopPaymentSession>(() => () => { /* no-op unsubscribe */ });\n }\n\n destroy(): void {\n this._sessions.clear();\n }\n\n // -------------------------------------------------------------------------\n // Private helpers\n // -------------------------------------------------------------------------\n\n private _requireSession(sessionId: string): JoopBehaviorSubject<JoopPaymentSession> {\n const subject = this._sessions.get(sessionId);\n if (!subject) throw new Error(`[JoopPaymentOrchestrator] Unknown sessionId: ${sessionId}`);\n return subject;\n }\n\n private _updateSession(\n subject: JoopBehaviorSubject<JoopPaymentSession>,\n patch: Partial<JoopPaymentSession>,\n ): JoopPaymentSession {\n const next: JoopPaymentSession = { ...subject.getValue(), ...patch, updatedAt: Date.now() };\n subject.next(next);\n return next;\n }\n\n private _generateSessionId(): string {\n const bytes = new Uint8Array(18);\n crypto.getRandomValues(bytes);\n // Base64url encode (no +, /, =)\n return btoa(String.fromCharCode(...bytes))\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=/g, '');\n }\n\n private async _fetch<T>(method: string, path: string, body?: unknown): Promise<T> {\n const url = `${this._cfg.gatewayUrl}${path}`;\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this._cfg.timeoutMs);\n\n try {\n const res = await fetch(url, {\n method,\n headers: {\n 'Authorization': `Bearer ${this._cfg.apiKey}`,\n 'Content-Type': 'application/json',\n 'X-Merchant-Id': this._cfg.merchantId,\n },\n signal: controller.signal,\n ...(body !== undefined ? { body: JSON.stringify(body) } : {}),\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => '');\n throw new Error(`[JoopPaymentOrchestrator] ${method} ${path}: ${res.status} — ${text}`);\n }\n\n if (res.status === 204) return undefined as unknown as T;\n return res.json() as Promise<T>;\n } finally {\n clearTimeout(timer);\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Module-level helpers\n// ---------------------------------------------------------------------------\n\nfunction _mapGatewayStatus(status: string): JoopPaymentStep {\n switch (status?.toLowerCase()) {\n case 'authorised':\n case 'authorized':\n return 'authorised';\n case 'settled':\n case 'captured':\n return 'settled';\n case 'failed':\n case 'declined':\n case 'error':\n return 'failed';\n case 'cancelled':\n case 'canceled':\n case 'voided':\n return 'cancelled';\n case 'pending':\n case 'processing':\n return 'processing_3ds';\n default:\n return 'processing_3ds';\n }\n}\n","// ---------------------------------------------------------------------------\n// Types and interfaces\n// ---------------------------------------------------------------------------\n\nexport type JoopTxnType = 'credit' | 'debit' | 'fee' | 'interest' | 'transfer' | 'unknown';\n\nexport interface JoopTransaction {\n id: string;\n date: string;\n valueDate?: string;\n amount: number;\n type: JoopTxnType;\n currency: string;\n description: string;\n reference?: string;\n balance?: number;\n counterpartyName?: string;\n counterpartyIban?: string;\n category?: string;\n raw?: string;\n}\n\nexport interface JoopStatementResult {\n format: 'MT940' | 'OFX' | 'QIF' | 'CSV' | 'unknown';\n accountId?: string;\n currency?: string;\n openingBalance?: number;\n closingBalance?: number;\n transactions: JoopTransaction[];\n parseErrors: string[];\n}\n\nexport interface JoopCsvStatementConfig {\n delimiter?: string;\n dateColumn?: string | number;\n amountColumn?: string | number;\n creditColumn?: string | number;\n debitColumn?: string | number;\n descriptionColumn?: string | number;\n referenceColumn?: string | number;\n balanceColumn?: string | number;\n dateFormat?: string;\n hasHeader?: boolean;\n skipRows?: number;\n}\n\n// ---------------------------------------------------------------------------\n// JoopStatementParser\n// ---------------------------------------------------------------------------\n\nexport class JoopStatementParser {\n\n // -------------------------------------------------------------------------\n // Auto-detect and dispatch\n // -------------------------------------------------------------------------\n\n parse(text: string, csvConfig?: JoopCsvStatementConfig): JoopStatementResult {\n const format = JoopStatementParser.detectFormat(text);\n switch (format) {\n case 'MT940': return this.parseMT940(text);\n case 'OFX': return this.parseOFX(text);\n case 'QIF': return this.parseQIF(text);\n case 'CSV': return this.parseCsv(text, csvConfig);\n default:\n return {\n format: 'unknown',\n transactions: [],\n parseErrors: ['Unable to detect statement format.'],\n };\n }\n }\n\n static detectFormat(text: string): 'MT940' | 'OFX' | 'QIF' | 'CSV' | 'unknown' {\n const trimmed = text.trimStart();\n if (trimmed.startsWith(':20:') || trimmed.includes('\\n:20:')) return 'MT940';\n if (trimmed.includes('OFXHEADER:') || trimmed.includes('<OFX>')) return 'OFX';\n if (/^[DTPMNLC!\\^]/m.test(trimmed) && trimmed.includes('^')) return 'QIF';\n // Heuristic: at least one line contains delimiter-separated fields\n const firstLines = trimmed.split('\\n').slice(0, 5).join('\\n');\n if (/[,;\\t]/.test(firstLines)) return 'CSV';\n return 'unknown';\n }\n\n // -------------------------------------------------------------------------\n // MT940\n // -------------------------------------------------------------------------\n\n parseMT940(text: string): JoopStatementResult {\n const result: JoopStatementResult = {\n format: 'MT940',\n transactions: [],\n parseErrors: [],\n };\n\n // Normalise line endings\n const lines = text.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n');\n\n // Extract individual fields using tag markers\n const fieldRegex = /:(\\d{2}[A-Z]?):([\\s\\S]*?)(?=\\n:\\d{2}[A-Z]?:|$)/g;\n const fields = new Map<string, string[]>();\n let m: RegExpExecArray | null;\n while ((m = fieldRegex.exec(lines)) !== null) {\n const tag = m[1];\n const value = m[2].trim();\n const existing = fields.get(tag) ?? [];\n existing.push(value);\n fields.set(tag, existing);\n }\n\n // :25: account\n const acct = fields.get('25')?.[0];\n if (acct) {\n result.accountId = acct.includes('/') ? acct.split('/')[1] : acct;\n }\n\n // :60F: or :60M: opening balance — format: C/DYYMMDDCUR,Amount\n const ob = fields.get('60F')?.[0] ?? fields.get('60M')?.[0];\n if (ob) {\n const parsed = _parseMT940Balance(ob);\n if (parsed) {\n result.currency = parsed.currency;\n result.openingBalance = parsed.amount;\n }\n }\n\n // :62F: or :62M: closing balance\n const cb = fields.get('62F')?.[0] ?? fields.get('62M')?.[0];\n if (cb) {\n const parsed = _parseMT940Balance(cb);\n if (parsed) result.closingBalance = parsed.amount;\n }\n\n // :61: / :86: pairs\n const tag61 = fields.get('61') ?? [];\n const tag86 = fields.get('86') ?? [];\n\n tag61.forEach((line61, idx) => {\n const narrative = tag86[idx] ?? '';\n try {\n const txn = _parseMT940Transaction(line61, narrative, result.accountId, result.currency, idx);\n if (txn) result.transactions.push(txn);\n } catch (e) {\n result.parseErrors.push(`MT940 :61: index ${idx}: ${String(e)}`);\n }\n });\n\n return result;\n }\n\n // -------------------------------------------------------------------------\n // OFX / QFX (SGML format)\n // -------------------------------------------------------------------------\n\n parseOFX(text: string): JoopStatementResult {\n const result: JoopStatementResult = {\n format: 'OFX',\n transactions: [],\n parseErrors: [],\n };\n\n const tag = (name: string): string | undefined => {\n const re = new RegExp(`<${name}>([^<\\\\n\\\\r]*)`, 'i');\n return re.exec(text)?.[1]?.trim();\n };\n\n result.accountId = tag('ACCTID') ?? tag('BANKID');\n result.currency = tag('CURDEF') ?? tag('CURRENCY');\n\n const ledgerBal = tag('BALAMT');\n if (ledgerBal !== undefined) result.closingBalance = parseFloat(ledgerBal);\n\n // Extract all STMTTRN blocks\n const txnBlockRe = /<STMTTRN>([\\s\\S]*?)<\\/STMTTRN>/gi;\n let blockMatch: RegExpExecArray | null;\n let idx = 0;\n\n while ((blockMatch = txnBlockRe.exec(text)) !== null) {\n const block = blockMatch[1];\n const bTag = (name: string): string | undefined => {\n const re = new RegExp(`<${name}>([^<\\\\n\\\\r]*)`, 'i');\n return re.exec(block)?.[1]?.trim();\n };\n\n try {\n const trnType = bTag('TRNTYPE') ?? '';\n const dtPosted = bTag('DTPOSTED') ?? '';\n const dtAvail = bTag('DTAVAIL');\n const amtStr = bTag('TRNAMT') ?? '0';\n const fitId = bTag('FITID') ?? String(idx);\n const name = bTag('NAME');\n const memo = bTag('MEMO');\n const refNum = bTag('REFNUM') ?? bTag('CHECKNUM');\n\n const rawAmount = parseFloat(amtStr);\n const amount = Math.abs(rawAmount);\n const type = _ofxTrnType(trnType, rawAmount);\n\n const date = _parseOFXDate(dtPosted);\n const valueDate = dtAvail ? _parseOFXDate(dtAvail) : undefined;\n\n const txn: JoopTransaction = {\n id: _stableId(result.accountId, date, amount, idx),\n date,\n valueDate,\n amount,\n type,\n currency: result.currency ?? 'USD',\n description: memo ?? name ?? '',\n reference: refNum,\n counterpartyName: name,\n raw: block,\n };\n\n result.transactions.push(txn);\n } catch (e) {\n result.parseErrors.push(`OFX STMTTRN index ${idx}: ${String(e)}`);\n }\n idx++;\n }\n\n return result;\n }\n\n // -------------------------------------------------------------------------\n // QIF (Quicken Interchange Format)\n // -------------------------------------------------------------------------\n\n parseQIF(text: string): JoopStatementResult {\n const result: JoopStatementResult = {\n format: 'QIF',\n transactions: [],\n parseErrors: [],\n };\n\n const lines = text.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n').split('\\n');\n let current: Partial<{\n date: string;\n amount: number;\n payee: string;\n memo: string;\n ref: string;\n cleared: string;\n }> = {};\n let idx = 0;\n\n for (const line of lines) {\n if (line.startsWith('!')) continue; // header / account type line\n if (line === '^') {\n // End of record — commit\n if (current.date !== undefined && current.amount !== undefined) {\n try {\n const amount = Math.abs(current.amount);\n const type: JoopTxnType = current.amount < 0 ? 'debit' : 'credit';\n const txn: JoopTransaction = {\n id: _stableId(undefined, current.date, amount, idx),\n date: current.date,\n amount,\n type,\n currency: 'USD', // QIF doesn't carry currency\n description: current.memo ?? current.payee ?? '',\n reference: current.ref,\n counterpartyName: current.payee,\n raw: undefined,\n };\n result.transactions.push(txn);\n } catch (e) {\n result.parseErrors.push(`QIF record ${idx}: ${String(e)}`);\n }\n idx++;\n }\n current = {};\n continue;\n }\n\n const code = line[0];\n const value = line.slice(1).trim();\n\n switch (code) {\n case 'D': current.date = _parseQIFDate(value); break;\n case 'T': current.amount = parseFloat(value.replace(/,/g, '')); break;\n case 'P': current.payee = value; break;\n case 'M': current.memo = value; break;\n case 'N': current.ref = value; break;\n case 'L': /* category — skip for now */ break;\n case 'C': current.cleared = value; break;\n }\n }\n\n return result;\n }\n\n // -------------------------------------------------------------------------\n // CSV\n // -------------------------------------------------------------------------\n\n parseCsv(text: string, config: JoopCsvStatementConfig = {}): JoopStatementResult {\n const result: JoopStatementResult = {\n format: 'CSV',\n transactions: [],\n parseErrors: [],\n };\n\n const delimiter = config.delimiter ?? _detectDelimiter(text);\n const hasHeader = config.hasHeader ?? true;\n const skipRows = config.skipRows ?? 0;\n\n const rawRows = text\n .replace(/\\r\\n/g, '\\n')\n .replace(/\\r/g, '\\n')\n .split('\\n')\n .filter(l => l.trim().length > 0);\n\n const allRows = rawRows.slice(skipRows);\n if (allRows.length === 0) {\n result.parseErrors.push('CSV: no data rows found.');\n return result;\n }\n\n const headerRow: string[] | undefined = hasHeader ? _splitCsvRow(allRows[0], delimiter) : undefined;\n const dataRows = hasHeader ? allRows.slice(1) : allRows;\n\n const resolve = (col: string | number | undefined): number => {\n if (col === undefined) return -1;\n if (typeof col === 'number') return col;\n return headerRow ? headerRow.findIndex(h => h.toLowerCase() === col.toLowerCase()) : -1;\n };\n\n const dateIdx = resolve(config.dateColumn ?? _guessColumn(headerRow, ['date', 'transaction date', 'txn date']));\n const amtIdx = resolve(config.amountColumn ?? _guessColumn(headerRow, ['amount', 'value']));\n const crIdx = resolve(config.creditColumn ?? _guessColumn(headerRow, ['credit', 'credits']));\n const drIdx = resolve(config.debitColumn ?? _guessColumn(headerRow, ['debit', 'debits']));\n const descIdx = resolve(config.descriptionColumn ?? _guessColumn(headerRow, ['description', 'details', 'narrative', 'memo']));\n const refIdx = resolve(config.referenceColumn ?? _guessColumn(headerRow, ['reference', 'ref', 'cheque no', 'check no']));\n const balIdx = resolve(config.balanceColumn ?? _guessColumn(headerRow, ['balance', 'running balance']));\n\n dataRows.forEach((row, idx) => {\n if (!row.trim()) return;\n const cols = _splitCsvRow(row, delimiter);\n try {\n const rawDate = dateIdx >= 0 ? cols[dateIdx] ?? '' : '';\n const rawDesc = descIdx >= 0 ? cols[descIdx] ?? '' : '';\n const rawRef = refIdx >= 0 ? cols[refIdx] ?? '' : undefined;\n const rawBal = balIdx >= 0 ? cols[balIdx] ?? '' : undefined;\n\n const date = _parseCsvDate(rawDate.trim(), config.dateFormat);\n\n // Determine amount and type\n let amount: number;\n let type: JoopTxnType;\n\n if (crIdx >= 0 || drIdx >= 0) {\n const crAmt = crIdx >= 0 ? _parseAmount(cols[crIdx] ?? '') : 0;\n const drAmt = drIdx >= 0 ? _parseAmount(cols[drIdx] ?? '') : 0;\n if (crAmt > 0) { amount = crAmt; type = 'credit'; }\n else if (drAmt > 0) { amount = drAmt; type = 'debit'; }\n else { amount = 0; type = 'unknown'; }\n } else if (amtIdx >= 0) {\n const raw = _parseAmount(cols[amtIdx] ?? '');\n amount = Math.abs(raw);\n type = raw < 0 ? 'debit' : (raw > 0 ? 'credit' : 'unknown');\n } else {\n result.parseErrors.push(`CSV row ${idx}: no amount column found.`);\n return;\n }\n\n const txn: JoopTransaction = {\n id: _stableId(undefined, date, amount, idx),\n date,\n amount,\n type,\n currency: 'USD',\n description: rawDesc.replace(/^\"|\"$/g, ''),\n reference: rawRef?.replace(/^\"|\"$/g, ''),\n balance: rawBal ? _parseAmount(rawBal) : undefined,\n raw: row,\n };\n\n result.transactions.push(txn);\n } catch (e) {\n result.parseErrors.push(`CSV row ${idx}: ${String(e)}`);\n }\n });\n\n return result;\n }\n}\n\n// ---------------------------------------------------------------------------\n// MT940 helpers\n// ---------------------------------------------------------------------------\n\nfunction _parseMT940Balance(value: string): { currency: string; amount: number } | null {\n // Format: C|D YYMMDD CUR AMOUNT (comma as decimal separator)\n const m = /^[CD](\\d{6})([A-Z]{3})([\\d,]+)/.exec(value.replace(/\\s/g, ''));\n if (!m) return null;\n const indicator = value[0] === 'D' ? -1 : 1;\n return {\n currency: m[2],\n amount: indicator * parseFloat(m[3].replace(',', '.')),\n };\n}\n\nfunction _parseMT940Transaction(\n line61: string,\n narrative: string,\n accountId: string | undefined,\n currency: string | undefined,\n idx: number,\n): JoopTransaction | null {\n // :61: format: YYMMDD[MMDD]C|D[Rd]Amount[FReference//BankRef]\n // Example: 2301151216CR500,00NTRFREF123//BANKREF\n const re = /^(\\d{6})(\\d{4})?([CD])(R?)([A-Z]?)(\\d[\\d,]+)(.*)$/;\n const m = re.exec(line61.replace(/\\s/g, ''));\n if (!m) return null;\n\n const yymmdd = m[1];\n const mmddOpt = m[2]; // optional value date\n const cdFlag = m[3]; // C or D\n const _reversal = m[4]; // R prefix means reversal\n // m[5] is the swift funds code (single letter), not needed\n const amtStr = m[6];\n const rest = m[7] ?? '';\n\n const year = parseInt(yymmdd.slice(0, 2)) + 2000;\n const month = yymmdd.slice(2, 4);\n const day = yymmdd.slice(4, 6);\n const date = `${year}-${month}-${day}`;\n\n let valueDate: string | undefined;\n if (mmddOpt) {\n const vmm = mmddOpt.slice(0, 2);\n const vdd = mmddOpt.slice(2, 4);\n valueDate = `${year}-${vmm}-${vdd}`;\n }\n\n const amount = parseFloat(amtStr.replace(',', '.'));\n const type: JoopTxnType = cdFlag === 'C' ? 'credit' : 'debit';\n\n // Reference extraction: after the swift code letter, up to // or end\n const refMatch = /^([^/]{1,16})(?:\\/\\/(.+))?$/.exec(rest);\n const reference = refMatch?.[1]?.trim() || undefined;\n\n // Narrative from :86: tag — use entire content as description\n const description = narrative.replace(/\\n/g, ' ').trim() || reference || '';\n\n return {\n id: _stableId(accountId, date, amount, idx),\n date,\n valueDate,\n amount,\n type,\n currency: currency ?? 'USD',\n description,\n reference,\n raw: line61 + (narrative ? '\\n' + narrative : ''),\n };\n}\n\n// ---------------------------------------------------------------------------\n// OFX helpers\n// ---------------------------------------------------------------------------\n\nfunction _ofxTrnType(trnType: string, rawAmount: number): JoopTxnType {\n switch (trnType.toUpperCase()) {\n case 'CREDIT': return 'credit';\n case 'DEBIT': return 'debit';\n case 'FEE': return 'fee';\n case 'INT': return 'interest';\n case 'XFER': return 'transfer';\n case 'DEP': return 'credit';\n case 'PAYMENT': return 'debit';\n case 'ATM':\n case 'POS': return rawAmount < 0 ? 'debit' : 'credit';\n default: return rawAmount < 0 ? 'debit' : 'credit';\n }\n}\n\nfunction _parseOFXDate(value: string): string {\n // OFX date: YYYYMMDDHHMMSS[.mmm][TZ] — we only need YYYYMMDD\n const clean = value.slice(0, 8);\n if (clean.length < 8) return value;\n return `${clean.slice(0, 4)}-${clean.slice(4, 6)}-${clean.slice(6, 8)}`;\n}\n\n// ---------------------------------------------------------------------------\n// QIF helpers\n// ---------------------------------------------------------------------------\n\nfunction _parseQIFDate(value: string): string {\n // Common QIF date formats: M/D/YY, M/D/YYYY, D-M-YY, D.M.YYYY, MM/DD/YYYY\n const clean = value.replace(/'/g, ''); // QIF sometimes uses ' as year separator\n const parts = clean.split(/[\\-\\.\\/]/);\n if (parts.length < 3) return clean;\n\n let y = parseInt(parts[2]);\n const a = parseInt(parts[0]);\n const b = parseInt(parts[1]);\n\n if (y < 100) y += y < 30 ? 2000 : 1900;\n\n // Heuristic: if first part > 12 it must be day (D-M-Y)\n if (a > 12) {\n return `${y}-${String(b).padStart(2, '0')}-${String(a).padStart(2, '0')}`;\n }\n // Otherwise assume M/D/Y (US format)\n return `${y}-${String(a).padStart(2, '0')}-${String(b).padStart(2, '0')}`;\n}\n\n// ---------------------------------------------------------------------------\n// CSV helpers\n// ---------------------------------------------------------------------------\n\nfunction _detectDelimiter(text: string): string {\n const sample = text.slice(0, 2000);\n const counts: Record<string, number> = { ',': 0, ';': 0, '\\t': 0, '|': 0 };\n for (const ch of sample) {\n if (ch in counts) counts[ch]++;\n }\n return Object.entries(counts).sort((a, b) => b[1] - a[1])[0][0];\n}\n\nfunction _splitCsvRow(row: string, delimiter: string): string[] {\n const result: string[] = [];\n let current = '';\n let inQuotes = false;\n\n for (let i = 0; i < row.length; i++) {\n const ch = row[i];\n if (ch === '\"') {\n if (inQuotes && row[i + 1] === '\"') {\n current += '\"';\n i++;\n } else {\n inQuotes = !inQuotes;\n }\n } else if (ch === delimiter && !inQuotes) {\n result.push(current);\n current = '';\n } else {\n current += ch;\n }\n }\n result.push(current);\n return result;\n}\n\nfunction _guessColumn(header: string[] | undefined, candidates: string[]): number {\n if (!header) return -1;\n for (const c of candidates) {\n const idx = header.findIndex(h => h.toLowerCase().trim() === c.toLowerCase());\n if (idx >= 0) return idx;\n }\n return -1;\n}\n\nfunction _parseAmount(raw: string): number {\n if (!raw || !raw.trim()) return 0;\n // Strip currency symbols, spaces, parentheses-based negatives\n const negative = raw.includes('(') || raw.trimStart().startsWith('-');\n const clean = raw.replace(/[^0-9.,]/g, '');\n if (!clean) return 0;\n // Handle European format: 1.234,56 → 1234.56\n const hasEuropean = /\\d{1,3}(\\.\\d{3})+,\\d{2}$/.test(clean);\n const normalised = hasEuropean\n ? clean.replace(/\\./g, '').replace(',', '.')\n : clean.replace(/,/g, '');\n const val = parseFloat(normalised);\n return negative ? -Math.abs(val) : val;\n}\n\nfunction _parseCsvDate(raw: string, fmt?: string): string {\n if (!raw) return '';\n const format = fmt ?? _detectDateFormat(raw);\n\n const clean = raw.replace(/[^\\d]/g, '-').replace(/--+/g, '-');\n const parts = clean.split('-').filter(Boolean);\n if (parts.length < 3) return raw;\n\n let day: string, month: string, year: string;\n\n switch (format) {\n case 'DD/MM/YYYY':\n [day, month, year] = parts;\n break;\n case 'MM/DD/YYYY':\n [month, day, year] = parts;\n break;\n case 'YYYY-MM-DD':\n default:\n [year, month, day] = parts;\n }\n\n const y = parseInt(year);\n const fullYear = y < 100 ? (y < 30 ? 2000 + y : 1900 + y) : y;\n return `${fullYear}-${month.padStart(2, '0')}-${day.padStart(2, '0')}`;\n}\n\nfunction _detectDateFormat(sample: string): string {\n // YYYY-MM-DD or YYYY/MM/DD\n if (/^\\d{4}[^\\d]\\d{2}[^\\d]\\d{2}$/.test(sample)) return 'YYYY-MM-DD';\n // DD/MM/YYYY — day <= 12 is ambiguous; assume if separator is /\n if (/^\\d{1,2}\\/\\d{1,2}\\/\\d{4}$/.test(sample)) {\n const parts = sample.split('/');\n if (parseInt(parts[0]) > 12) return 'DD/MM/YYYY';\n return 'MM/DD/YYYY'; // default to US\n }\n if (/^\\d{1,2}-\\d{1,2}-\\d{4}$/.test(sample)) return 'DD/MM/YYYY';\n return 'YYYY-MM-DD';\n}\n\n// ---------------------------------------------------------------------------\n// Shared helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Generate a deterministic but collision-resistant transaction ID.\n * Uses a simple djb2-style hash over the concatenated key fields + index.\n */\nfunction _stableId(accountId: string | undefined, date: string, amount: number, index: number): string {\n const key = `${accountId ?? ''}|${date}|${amount.toFixed(2)}|${index}`;\n let hash = 5381;\n for (let i = 0; i < key.length; i++) {\n hash = ((hash << 5) + hash) ^ key.charCodeAt(i);\n hash = hash >>> 0; // keep unsigned 32-bit\n }\n return `TXN-${hash.toString(16).toUpperCase().padStart(8, '0')}-${index}`;\n}\n","import { JoopConfigService } from './core/config/config.service';\nimport { JoopLogger } from './core/logger/logger.service';\nimport { JoopPluginService } from './core/plugin.service';\nimport { JoopEnvironmentService } from './core/environment.service';\nimport { JoopHealthService } from './core/health.service';\nimport { JoopScopeMapService } from './storage/scope-map.service';\nimport { JoopDataStorage } from './storage/data-storage.service';\nimport { JoopSecureStorage } from './security/secure-storage.service';\nimport { JoopAuthService } from './auth/auth.service';\nimport { JoopTokenService } from './auth/token.service';\nimport { JoopPKCEService } from './auth/pkce.service';\nimport { JoopOtpService } from './auth/otp.service';\nimport { JoopBiometricService } from './auth/biometric.service';\nimport { JoopClientProfile } from './profile/client-profile.service';\nimport { JoopHttpClient } from './api/http/http-client';\nimport { JoopInterceptorPipeline } from './api/http/interceptor';\nimport { JoopCircuitBreaker } from './api/http/circuit-breaker';\nimport { JoopOfflineQueue } from './api/http/offline-queue.service';\nimport { JoopPollingService } from './api/http/polling.service';\nimport { JoopGcmService } from './encryption/gcm.service';\nimport { JoopRsaService } from './encryption/rsa.service';\nimport { JoopAesService } from './encryption/aes.service';\nimport { JoopX25519Service } from './encryption/x25519.service';\nimport { JoopRequestService } from './api/request.service';\nimport { JoopSessionTimeoutService } from './session/session-timeout.service';\nimport { JoopMultiTabSync } from './session/multi-tab-sync.service';\nimport { JoopConcurrentSessionService } from './session/concurrent-session.service';\nimport { JoopCorrelationService } from './observability/correlation.service';\nimport { JoopAuditLog } from './observability/audit-log.service';\nimport { JoopPerformanceService } from './observability/performance.service';\nimport { JoopErrorReporter } from './observability/error-reporter.service';\nimport { JoopDeviceFingerprintService } from './device/device-fingerprint.service';\nimport { JoopMockService } from './dev/mock.service';\nimport { JoopReceiptService } from './banking/receipt.service';\nimport { JoopThemeService } from './theme/theme.service';\nimport { JoopI18nService } from './i18n/i18n.service';\nimport { JoopLoaderService } from './ui/loader.service';\nimport { JoopAlertService } from './ui/alert.service';\nimport { JoopFileSaverService } from './api/http/file-saver.service';\nimport { JoopNativeBridgeService } from './native-bridge/native-bridge.service';\nimport { JoopDeeplinkService } from './deeplink/deeplink.service';\nimport { JoopResponseMapper } from './api/response-mapper';\nimport { JoopCacheService } from './cache/cache.service';\nimport { JoopWebSocketService } from './network/websocket.service';\nimport { JoopAnalyticsService } from './analytics/analytics.service';\nimport { JoopFormValidator } from './validation/form-validator';\nimport { JoopFeatureFlagService } from './core/feature-flag.service';\nimport { JoopMfaService } from './auth/mfa.service';\nimport { JoopE2EService } from './encryption/e2e.service';\nimport { JoopPaginationService } from './ui/pagination.service';\nimport { JoopPrintService } from './ui/print.service';\nimport { JoopExportService } from './api/export.service';\nimport { JoopClipboardService } from './utilities/clipboard.utility';\nimport { JoopImageService } from './utilities/image.utility';\nimport { JoopIndexedDbService } from './storage/indexed-db.service';\nimport { JoopCryptoUtils } from './encryption/crypto-utils';\nimport { JoopFormBuilder } from './forms/form-builder';\nimport { JoopRateLimiter } from './core/rate-limiter.service';\nimport { JoopIdleService } from './session/idle.service';\nimport { JoopConsentService } from './core/consent.service';\nimport { JoopPdfService } from './utilities/pdf.utility';\nimport { JoopNotificationService } from './utilities/notification.service';\nimport { JoopA11yService } from './ui/a11y.service';\nimport { JoopRouterService } from './router/router.service';\nimport { JoopServiceWorkerService } from './pwa/service-worker.service';\nimport { JoopGeoService } from './utilities/geo.service';\nimport { JoopMediaService } from './utilities/media.service';\nimport { JoopConfig } from './models/config.models';\nimport { JoopAiClient } from './ai/ai-client';\nimport { JoopToolRegistry } from './ai/tool-registry';\nimport { JoopStreamingService } from './network/sse.service';\nimport { JoopBehavioralBiometrics } from './security/behavioral-biometrics';\nimport { JoopRiskEngine } from './security/risk-engine';\nimport { JoopWorkerPool } from './workers/worker-pool';\nimport { JoopCompressionService } from './workers/compression.service';\nimport { JoopStore, createStore } from './state/observable-store';\nimport { JoopSyncEngine } from './sync/sync-engine';\nimport { JoopStateMachine } from './workflow/state-machine';\nimport { JoopWorkflowEngine } from './workflow/workflow-engine';\nimport { JoopPIIScanner } from './security/pii-scanner';\nimport { JoopSecretSharing } from './security/secret-sharing';\nimport { JoopDifferentialPrivacy } from './security/differential-privacy';\nimport { JoopWatermarkService } from './utilities/watermark.service';\nimport { JoopWebVitals } from './observability/web-vitals';\nimport { JoopSessionRecorder } from './observability/session-recorder';\nimport { JoopOIDCClient } from './auth/oidc-client';\nimport { JoopWebhookVerifier } from './api/webhook-verifier';\nimport { JoopIdempotencyService } from './api/idempotency.service';\nimport { JoopKeyVault } from './device/key-vault';\nimport { JoopBiometricAuth } from './device/biometric-auth';\nimport { JoopPushService } from './device/push-service';\nimport { JoopAppLifecycle } from './device/app-lifecycle';\nimport { JoopNetworkMonitor } from './device/network-monitor';\nimport { JoopFraudDetection } from './banking/fraud-detection';\nimport { JoopOpenBankingClient } from './banking/open-banking';\nimport { JoopPaymentOrchestrator } from './banking/payment-orchestrator';\nimport { JoopStatementParser } from './banking/statement-parser';\nimport type { JoopOpenBankingConfig, JoopPaymentGatewayConfig } from './models/config.models';\n\nexport interface JoopInstance {\n // Core\n config: JoopConfigService;\n logger: JoopLogger;\n plugins: JoopPluginService;\n env: JoopEnvironmentService;\n health: JoopHealthService;\n\n // Storage\n scopeMap: JoopScopeMapService;\n storage: JoopDataStorage;\n secureStorage: JoopSecureStorage;\n\n // Auth\n auth: JoopAuthService;\n token: JoopTokenService;\n pkce: JoopPKCEService;\n otp: JoopOtpService;\n biometric: JoopBiometricService;\n\n // Profile\n profile: JoopClientProfile;\n\n // API / Network\n http: JoopHttpClient;\n interceptors: JoopInterceptorPipeline;\n circuitBreaker: JoopCircuitBreaker;\n offlineQueue: JoopOfflineQueue;\n polling: JoopPollingService;\n request: JoopRequestService;\n\n // Encryption\n gcm: JoopGcmService;\n rsa: JoopRsaService;\n aes: JoopAesService;\n x25519: JoopX25519Service;\n\n // Session\n session: JoopSessionTimeoutService;\n multiTab: JoopMultiTabSync;\n concurrentSession: JoopConcurrentSessionService;\n\n // Observability\n correlation: JoopCorrelationService;\n auditLog: JoopAuditLog;\n perf: JoopPerformanceService;\n errorReporter: JoopErrorReporter;\n\n // Device\n deviceFingerprint: JoopDeviceFingerprintService;\n\n // Banking\n receipt: JoopReceiptService;\n fraud: JoopFraudDetection;\n openBanking: JoopOpenBankingClient | null; // null until configured via createJoop config.openBanking\n payment: JoopPaymentOrchestrator | null; // null until configured via createJoop config.payment\n statementParser: JoopStatementParser;\n\n // Theme / I18n / UI\n theme: JoopThemeService;\n i18n: JoopI18nService;\n loader: JoopLoaderService;\n alert: JoopAlertService;\n\n // Native / Deeplink\n nativeBridge: JoopNativeBridgeService;\n deeplink: JoopDeeplinkService;\n\n // API extras\n fileSaver: JoopFileSaverService;\n responseMapper: JoopResponseMapper;\n\n // Cache / Network\n cache: JoopCacheService;\n ws: JoopWebSocketService;\n\n // Analytics / Feature Flags\n analytics: JoopAnalyticsService;\n featureFlags: JoopFeatureFlagService;\n\n // MFA / E2E\n mfa: JoopMfaService;\n e2e: JoopE2EService;\n\n // Validation\n formValidator: JoopFormValidator;\n\n // UI extras\n pagination: JoopPaginationService;\n print: JoopPrintService;\n\n // Export / Clipboard / Image\n exporter: JoopExportService;\n clipboard: JoopClipboardService;\n image: JoopImageService;\n\n // v1.4.0 — Extended services\n indexedDb: JoopIndexedDbService;\n crypto: JoopCryptoUtils;\n formBuilder: JoopFormBuilder;\n rateLimiter: JoopRateLimiter;\n idle: JoopIdleService;\n consent: JoopConsentService;\n pdf: JoopPdfService;\n notification: JoopNotificationService;\n a11y: JoopA11yService;\n router: JoopRouterService;\n sw: JoopServiceWorkerService;\n geo: JoopGeoService;\n media: JoopMediaService;\n\n // v1.5.0 — AI & Enterprise services\n ai: JoopAiClient | null; // null until configured via createJoop config.ai\n tools: JoopToolRegistry;\n sse: JoopStreamingService;\n biometrics: JoopBehavioralBiometrics;\n risk: JoopRiskEngine;\n workerPool: JoopWorkerPool;\n compression: JoopCompressionService;\n store: JoopStore<Record<string, unknown>>;\n sync: JoopSyncEngine;\n stateMachine: typeof JoopStateMachine;\n workflow: JoopWorkflowEngine;\n piiScanner: JoopPIIScanner;\n secretSharing: JoopSecretSharing;\n dp: JoopDifferentialPrivacy;\n watermark: JoopWatermarkService;\n webVitals: JoopWebVitals;\n recorder: JoopSessionRecorder;\n oidc: JoopOIDCClient | null; // null until configured via createJoop config.oidc\n webhookVerifier: JoopWebhookVerifier;\n idempotency: JoopIdempotencyService;\n\n // v1.7.0 Mobile Core\n keyVault: JoopKeyVault;\n biometricAuth: JoopBiometricAuth;\n push: JoopPushService;\n lifecycle: JoopAppLifecycle;\n network: JoopNetworkMonitor;\n\n // Dev\n mock: JoopMockService;\n}\n\nexport async function createJoop(configOrUrl?: JoopConfig | string): Promise<JoopInstance> {\n const config = new JoopConfigService();\n const log = new JoopLogger();\n\n await config.load(configOrUrl);\n if (config.loggerConfig) log.configure(config.loggerConfig);\n\n const scopeMap = new JoopScopeMapService();\n const storage = new JoopDataStorage(scopeMap);\n const secureStorage = new JoopSecureStorage(config.get<string>('secureStorageKey') ?? 'joop-default-key');\n const auth = new JoopAuthService(storage);\n const token = new JoopTokenService();\n const pkce = new JoopPKCEService();\n const otp = new JoopOtpService();\n const biometric = new JoopBiometricService();\n const profile = new JoopClientProfile();\n\n const http = new JoopHttpClient();\n const interceptors = new JoopInterceptorPipeline();\n const circuitBreaker = new JoopCircuitBreaker({ name: 'default' });\n const offlineQueue = new JoopOfflineQueue();\n const polling = new JoopPollingService();\n const gcm = new JoopGcmService();\n const rsa = new JoopRsaService();\n const aes = new JoopAesService(gcm, rsa);\n const x25519 = new JoopX25519Service();\n const request = new JoopRequestService(http, config, profile, aes);\n const session = new JoopSessionTimeoutService(auth, profile, aes, scopeMap);\n const multiTab = new JoopMultiTabSync();\n const concurrentSession = new JoopConcurrentSessionService();\n\n const correlation = new JoopCorrelationService();\n const auditLog = new JoopAuditLog();\n const perf = new JoopPerformanceService();\n const errorReporter = new JoopErrorReporter();\n const deviceFingerprint = new JoopDeviceFingerprintService();\n const receipt = new JoopReceiptService();\n const theme = new JoopThemeService();\n const i18n = new JoopI18nService();\n const loader = new JoopLoaderService();\n const alert = new JoopAlertService();\n const nativeBridge = new JoopNativeBridgeService();\n const deeplink = new JoopDeeplinkService();\n const fileSaver = new JoopFileSaverService();\n const responseMapper = new JoopResponseMapper();\n const mock = new JoopMockService();\n const cache = new JoopCacheService();\n const ws = new JoopWebSocketService();\n const analytics = new JoopAnalyticsService();\n const featureFlags = new JoopFeatureFlagService();\n const mfa = new JoopMfaService();\n const e2e = new JoopE2EService();\n const formValidator = new JoopFormValidator();\n const pagination = new JoopPaginationService();\n const print = new JoopPrintService();\n const exporter = new JoopExportService();\n const clipboard = new JoopClipboardService();\n const image = new JoopImageService();\n const indexedDb = new JoopIndexedDbService();\n const crypto = new JoopCryptoUtils();\n const formBuilder = new JoopFormBuilder();\n const rateLimiter = new JoopRateLimiter();\n const idle = new JoopIdleService();\n const consent = new JoopConsentService();\n const pdf = new JoopPdfService();\n const notification = new JoopNotificationService();\n const a11y = new JoopA11yService();\n const router = new JoopRouterService();\n const sw = new JoopServiceWorkerService();\n const geo = new JoopGeoService();\n const media = new JoopMediaService();\n\n // v1.5.0 services\n const tools = new JoopToolRegistry();\n const sse = new JoopStreamingService();\n const biometrics = new JoopBehavioralBiometrics();\n const risk = new JoopRiskEngine();\n const workerPool = new JoopWorkerPool();\n const compression = new JoopCompressionService();\n const store = createStore({ state: {} as Record<string, unknown> });\n const sync = new JoopSyncEngine();\n const workflow = new JoopWorkflowEngine();\n const piiScanner = new JoopPIIScanner();\n const secretSharing = new JoopSecretSharing();\n const dp = new JoopDifferentialPrivacy();\n const watermark = new JoopWatermarkService();\n const webVitals = new JoopWebVitals();\n const recorder = new JoopSessionRecorder();\n const webhookVerifier = new JoopWebhookVerifier();\n const idempotency = new JoopIdempotencyService();\n\n // v1.7.0 Mobile Core\n const keyVault = new JoopKeyVault();\n const biometricAuth = new JoopBiometricAuth();\n const push = new JoopPushService();\n const lifecycle = new JoopAppLifecycle();\n const network = new JoopNetworkMonitor();\n\n // v1.9.0 Banking Depth\n const fraud = new JoopFraudDetection();\n const statementParser = new JoopStatementParser();\n const obCfg = config.get<JoopOpenBankingConfig>('openBanking');\n const openBanking = obCfg ? new JoopOpenBankingClient(obCfg) : null;\n const pmtCfg = config.get<JoopPaymentGatewayConfig>('payment');\n const payment = pmtCfg ? new JoopPaymentOrchestrator(pmtCfg) : null;\n\n const plugins = new JoopPluginService();\n const env = new JoopEnvironmentService();\n const health = new JoopHealthService();\n\n return {\n config, logger: log, plugins, env, health,\n scopeMap, storage, secureStorage,\n auth, token, pkce, otp, biometric,\n profile,\n http, interceptors, circuitBreaker, offlineQueue, polling, request,\n gcm, rsa, aes, x25519,\n session, multiTab, concurrentSession,\n correlation, auditLog, perf, errorReporter,\n deviceFingerprint,\n receipt,\n theme, i18n, loader, alert,\n nativeBridge, deeplink,\n fileSaver, responseMapper,\n cache, ws,\n analytics, featureFlags,\n mfa, e2e,\n formValidator,\n pagination, print,\n exporter, clipboard, image,\n indexedDb, crypto, formBuilder, rateLimiter, idle, consent, pdf, notification, a11y, router, sw, geo, media,\n ai: null,\n tools, sse, biometrics, risk, workerPool, compression, store, sync,\n stateMachine: JoopStateMachine,\n workflow, piiScanner, secretSharing, dp, watermark, webVitals, recorder,\n oidc: null,\n webhookVerifier, idempotency,\n keyVault, biometricAuth, push, lifecycle, network,\n fraud, openBanking, payment, statementParser,\n mock,\n };\n}\n","export interface JoopSecureStorageConfig {\n namespace?: string;\n backend?: 'localStorage' | 'sessionStorage' | 'memory';\n salt?: string;\n}\n\ninterface StorageBackend {\n getItem(key: string): string | null;\n setItem(key: string, value: string): void;\n removeItem(key: string): void;\n key(index: number): string | null;\n readonly length: number;\n}\n\nclass MemoryBackend implements StorageBackend {\n private readonly store = new Map<string, string>();\n getItem(key: string) { return this.store.get(key) ?? null; }\n setItem(key: string, value: string) { this.store.set(key, value); }\n removeItem(key: string) { this.store.delete(key); }\n key(index: number) { return Array.from(this.store.keys())[index] ?? null; }\n get length() { return this.store.size; }\n}\n\nfunction deviceFingerprint(): string {\n if (typeof window === 'undefined') return 'server-side';\n return [\n navigator.userAgent,\n String(screen.width),\n String(screen.height),\n String(screen.colorDepth),\n Intl.DateTimeFormat().resolvedOptions().timeZone,\n navigator.language,\n ].join('|');\n}\n\nasync function deriveKey(fingerprint: string, salt: string): Promise<CryptoKey> {\n const enc = new TextEncoder();\n const keyMat = await crypto.subtle.importKey('raw', enc.encode(fingerprint), 'PBKDF2', false, ['deriveKey']);\n return crypto.subtle.deriveKey(\n { name: 'PBKDF2', salt: enc.encode(salt), iterations: 100_000, hash: 'SHA-256' },\n keyMat,\n { name: 'AES-GCM', length: 256 },\n false,\n ['encrypt', 'decrypt'],\n );\n}\n\nasync function encryptValue(key: CryptoKey, plaintext: string): Promise<string> {\n const iv = crypto.getRandomValues(new Uint8Array(12));\n const encoded = new TextEncoder().encode(plaintext);\n const ciphertext = await crypto.subtle.encrypt({ name: 'AES-GCM', iv }, key, encoded);\n const combined = new Uint8Array(12 + ciphertext.byteLength);\n combined.set(iv);\n combined.set(new Uint8Array(ciphertext), 12);\n return btoa(String.fromCharCode(...combined));\n}\n\nasync function decryptValue(key: CryptoKey, data: string): Promise<string> {\n const combined = Uint8Array.from(atob(data), c => c.charCodeAt(0));\n const iv = combined.slice(0, 12);\n const ciphertext = combined.slice(12);\n const decrypted = await crypto.subtle.decrypt({ name: 'AES-GCM', iv }, key, ciphertext);\n return new TextDecoder().decode(decrypted);\n}\n\nexport class JoopSecureStorage {\n private readonly ns: string;\n private readonly salt: string;\n private readonly backend: StorageBackend;\n private _key?: CryptoKey;\n\n constructor(config: JoopSecureStorageConfig = {}) {\n this.ns = config.namespace ?? 'joop';\n this.salt = config.salt ?? (typeof location !== 'undefined' ? location.hostname : 'joopjs') + ':' + this.ns;\n const b = config.backend ?? 'localStorage';\n if (b === 'memory' || typeof window === 'undefined') {\n this.backend = new MemoryBackend();\n } else if (b === 'sessionStorage') {\n this.backend = sessionStorage;\n } else {\n this.backend = localStorage;\n }\n }\n\n private async cryptoKey(): Promise<CryptoKey> {\n if (!this._key) this._key = await deriveKey(deviceFingerprint(), this.salt);\n return this._key;\n }\n\n private storageKey(key: string): string { return `${this.ns}:${key}`; }\n\n async setItem(key: string, value: unknown): Promise<void> {\n const encrypted = await encryptValue(await this.cryptoKey(), JSON.stringify(value));\n this.backend.setItem(this.storageKey(key), encrypted);\n }\n\n async getItem<T>(key: string): Promise<T | null> {\n const raw = this.backend.getItem(this.storageKey(key));\n if (raw === null) return null;\n try {\n const decrypted = await decryptValue(await this.cryptoKey(), raw);\n return JSON.parse(decrypted) as T;\n } catch { return null; }\n }\n\n async removeItem(key: string): Promise<void> {\n this.backend.removeItem(this.storageKey(key));\n }\n\n async has(key: string): Promise<boolean> {\n return this.backend.getItem(this.storageKey(key)) !== null;\n }\n\n async keys(): Promise<string[]> {\n const prefix = `${this.ns}:`;\n const result: string[] = [];\n for (let i = 0; i < this.backend.length; i++) {\n const k = this.backend.key(i);\n if (k?.startsWith(prefix)) result.push(k.slice(prefix.length));\n }\n return result;\n }\n\n async clear(): Promise<void> {\n const ks = await this.keys();\n ks.forEach(k => this.backend.removeItem(this.storageKey(k)));\n }\n\n async setItems(entries: Record<string, unknown>): Promise<void> {\n await Promise.all(Object.entries(entries).map(([k, v]) => this.setItem(k, v)));\n }\n\n async getAll(): Promise<Record<string, unknown>> {\n const ks = await this.keys();\n const pairs = await Promise.all(ks.map(async k => [k, await this.getItem(k)] as const));\n return Object.fromEntries(pairs);\n }\n}\n","export interface JoopScreenSecurityConfig {\n blurOnTabSwitch?: boolean; // blur/hide sensitive content on tab hide, default true\n clipboardProtection?: boolean; // block copy of sensitive elements, default false\n devtoolsDetection?: boolean; // warn when devtools opened, default false\n screenshotWarning?: boolean; // show visual noise on PrintScreen key (best-effort), default false\n}\n\nexport type JoopScreenSecurityEvent =\n | 'devtools-open'\n | 'screenshot-attempt'\n | 'tab-hidden'\n | 'tab-visible'\n | 'clipboard-blocked';\n\nexport class JoopScreenSecurityService {\n private _config: Required<JoopScreenSecurityConfig>;\n private _listeners: Map<JoopScreenSecurityEvent, Set<() => void>> = new Map();\n private _active = false;\n private _devtoolsTimer: ReturnType<typeof setInterval> | null = null;\n\n // Elements registered as sensitive\n private _sensitiveElements: Set<Element> = new Set();\n private _blurOverlay: HTMLElement | null = null;\n\n constructor(config: JoopScreenSecurityConfig = {}) {\n this._config = {\n blurOnTabSwitch: config.blurOnTabSwitch ?? true,\n clipboardProtection: config.clipboardProtection ?? false,\n devtoolsDetection: config.devtoolsDetection ?? false,\n screenshotWarning: config.screenshotWarning ?? false,\n };\n }\n\n activate(): void {\n if (this._active) return;\n this._active = true;\n\n if (this._config.blurOnTabSwitch) {\n document.addEventListener('visibilitychange', this._onVisibilityChange);\n }\n if (this._config.screenshotWarning) {\n document.addEventListener('keyup', this._onKeyUp);\n }\n if (this._config.devtoolsDetection) {\n this._startDevtoolsDetection();\n }\n }\n\n deactivate(): void {\n if (!this._active) return;\n this._active = false;\n document.removeEventListener('visibilitychange', this._onVisibilityChange);\n document.removeEventListener('keyup', this._onKeyUp);\n if (this._devtoolsTimer) { clearInterval(this._devtoolsTimer); this._devtoolsTimer = null; }\n this._removeOverlay();\n }\n\n registerSensitive(element: Element): () => void {\n this._sensitiveElements.add(element);\n if (this._config.clipboardProtection) {\n element.addEventListener('copy', this._blockCopy as EventListener);\n element.addEventListener('cut', this._blockCopy as EventListener);\n }\n return () => this.unregisterSensitive(element);\n }\n\n unregisterSensitive(element: Element): void {\n this._sensitiveElements.delete(element);\n element.removeEventListener('copy', this._blockCopy as EventListener);\n element.removeEventListener('cut', this._blockCopy as EventListener);\n }\n\n on(event: JoopScreenSecurityEvent, handler: () => void): () => void {\n if (!this._listeners.has(event)) this._listeners.set(event, new Set());\n this._listeners.get(event)!.add(handler);\n return () => this._listeners.get(event)?.delete(handler);\n }\n\n isDevtoolsOpen(): boolean {\n // Heuristic: compare outer vs inner window size\n const threshold = 160;\n return (\n window.outerWidth - window.innerWidth > threshold ||\n window.outerHeight - window.innerHeight > threshold\n );\n }\n\n destroy(): void {\n this.deactivate();\n this._sensitiveElements.clear();\n this._listeners.clear();\n }\n\n private _onVisibilityChange = (): void => {\n if (document.hidden) {\n this._showOverlay();\n this._emit('tab-hidden');\n } else {\n this._removeOverlay();\n this._emit('tab-visible');\n }\n };\n\n private _onKeyUp = (e: KeyboardEvent): void => {\n // PrintScreen key\n if (e.key === 'PrintScreen' || e.code === 'PrintScreen') {\n this._emit('screenshot-attempt');\n // Flash overlay as best-effort deterrent\n this._showOverlay();\n setTimeout(() => this._removeOverlay(), 300);\n }\n };\n\n private _blockCopy = (e: ClipboardEvent): void => {\n e.preventDefault();\n this._emit('clipboard-blocked');\n };\n\n private _startDevtoolsDetection(): void {\n this._devtoolsTimer = setInterval(() => {\n if (this.isDevtoolsOpen()) this._emit('devtools-open');\n }, 1000);\n }\n\n private _showOverlay(): void {\n if (this._blurOverlay) return;\n const overlay = document.createElement('div');\n overlay.style.cssText = `\n position: fixed; inset: 0; z-index: 999999;\n backdrop-filter: blur(20px); -webkit-backdrop-filter: blur(20px);\n background: rgba(0,0,0,0.4); display: flex;\n align-items: center; justify-content: center;\n `;\n overlay.setAttribute('aria-hidden', 'true');\n const msg = document.createElement('div');\n msg.textContent = 'Switch back to continue';\n msg.style.cssText = 'color:#fff; font-size:18px; font-weight:600; pointer-events:none;';\n overlay.appendChild(msg);\n document.body.appendChild(overlay);\n this._blurOverlay = overlay;\n }\n\n private _removeOverlay(): void {\n if (this._blurOverlay) {\n this._blurOverlay.remove();\n this._blurOverlay = null;\n }\n }\n\n private _emit(event: JoopScreenSecurityEvent): void {\n this._listeners.get(event)?.forEach(fn => fn());\n }\n}\n","// Anti-replay request signing — HMAC-SHA256 + nonce + timestamp\n// Client signs each payload; server verifies signature and rejects replays.\n//\n// Server-side verification logic is included as a comment block at the bottom.\n\nexport interface JoopSignedPayload<T = unknown> {\n data: T;\n nonce: string; // unique per request (UUID v4)\n timestamp: number; // Unix ms\n signature: string; // HMAC-SHA256(nonce + \".\" + timestamp + \".\" + JSON.stringify(data), secret)\n}\n\nexport interface JoopRequestSigningConfig {\n /** Shared secret (ideally per-session key derived from server handshake) */\n secret: string;\n /** Max age of a request in milliseconds — server rejects older requests (default 30000 = 30s) */\n maxAgeMs?: number;\n /** Algorithm (only SHA-256 currently) */\n algorithm?: 'SHA-256';\n}\n\nasync function _hmac(secret: string, message: string): Promise<string> {\n const enc = new TextEncoder();\n const key = await crypto.subtle.importKey(\n 'raw', enc.encode(secret),\n { name: 'HMAC', hash: 'SHA-256' },\n false, ['sign'],\n );\n const sig = await crypto.subtle.sign('HMAC', key, enc.encode(message));\n return Array.from(new Uint8Array(sig)).map(b => b.toString(16).padStart(2, '0')).join('');\n}\n\nfunction _uuid(): string {\n if (typeof crypto.randomUUID === 'function') return crypto.randomUUID();\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => {\n const r = (Math.random() * 16) | 0;\n return (c === 'x' ? r : (r & 0x3) | 0x8).toString(16);\n });\n}\n\nexport class JoopRequestSigningService {\n private readonly _secret: string;\n private readonly _maxAgeMs: number;\n\n constructor(config: JoopRequestSigningConfig) {\n this._secret = config.secret;\n this._maxAgeMs = config.maxAgeMs ?? 30_000;\n }\n\n /** Sign a payload. Returns the signed envelope to send in the request body. */\n async sign<T>(data: T): Promise<JoopSignedPayload<T>> {\n const nonce = _uuid();\n const timestamp = Date.now();\n const message = `${nonce}.${timestamp}.${JSON.stringify(data)}`;\n const signature = await _hmac(this._secret, message);\n return { data, nonce, timestamp, signature };\n }\n\n /** Verify a signed payload (for testing/debugging — production verification runs server-side). */\n async verify<T>(payload: JoopSignedPayload<T>): Promise<{ valid: boolean; reason?: string }> {\n const age = Date.now() - payload.timestamp;\n if (age > this._maxAgeMs) return { valid: false, reason: `Request expired (${age}ms old)` };\n if (age < -5000) return { valid: false, reason: 'Timestamp in the future' };\n\n const message = `${payload.nonce}.${payload.timestamp}.${JSON.stringify(payload.data)}`;\n const expected = await _hmac(this._secret, message);\n if (expected !== payload.signature) return { valid: false, reason: 'Signature mismatch' };\n return { valid: true };\n }\n\n /** Add the signed envelope as the request body, returning updated fetch init. */\n async signRequest<T>(data: T, init: RequestInit = {}): Promise<RequestInit> {\n const signed = await this.sign(data);\n return {\n ...init,\n method: init.method ?? 'POST',\n headers: { 'Content-Type': 'application/json', ...(init.headers as Record<string, string> ?? {}) },\n body: JSON.stringify(signed),\n };\n }\n}\n\n/* ─────────────────────────────────────────────────────────────────────────────\n SERVER-SIDE VERIFICATION (Node.js / Express example)\n ─────────────────────────────────────────────────────────────────────────────\n\nimport crypto from 'node:crypto';\n\nconst SHARED_SECRET = process.env.REQUEST_SIGNING_SECRET!;\nconst MAX_AGE_MS = 30_000; // 30 seconds\nconst usedNonces = new Map<string, number>(); // nonce → timestamp; evict after MAX_AGE_MS\n\nfunction hmac(secret: string, message: string): string {\n return crypto.createHmac('sha256', secret).update(message).digest('hex');\n}\n\nfunction evictExpiredNonces() {\n const cutoff = Date.now() - MAX_AGE_MS;\n for (const [nonce, ts] of usedNonces) {\n if (ts < cutoff) usedNonces.delete(nonce);\n }\n}\n\nexport function verifySignedPayload(body: {\n data: unknown; nonce: string; timestamp: number; signature: string;\n}): { valid: boolean; reason?: string } {\n evictExpiredNonces();\n\n const age = Date.now() - body.timestamp;\n if (age > MAX_AGE_MS) return { valid: false, reason: 'Request expired' };\n if (age < -5000) return { valid: false, reason: 'Timestamp in the future' };\n if (usedNonces.has(body.nonce)) return { valid: false, reason: 'Replay detected' };\n\n const message = `${body.nonce}.${body.timestamp}.${JSON.stringify(body.data)}`;\n const expected = hmac(SHARED_SECRET, message);\n if (!crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(body.signature))) {\n return { valid: false, reason: 'Signature mismatch' };\n }\n\n usedNonces.set(body.nonce, body.timestamp);\n return { valid: true };\n}\n\n// Express middleware\nexport function replayGuard(req, res, next) {\n const result = verifySignedPayload(req.body);\n if (!result.valid) return res.status(401).json({ error: result.reason });\n req.verifiedPayload = req.body.data;\n next();\n}\n\n─────────────────────────────────────────────────────────────────────────────── */\n","import { JoopSubject } from '../events';\n\nexport interface JoopClipboardEntry {\n text: string;\n copiedAt: number;\n expiresAt: number;\n label?: string;\n isSensitive: boolean;\n}\n\nexport interface JoopClipboardEvent {\n type: 'copied' | 'cleared' | 'expired';\n entry?: JoopClipboardEntry;\n}\n\nexport interface JoopSecureClipboardConfig {\n defaultTtlMs?: number;\n sensitivePatterns?: RegExp[];\n autoClearOnHide?: boolean;\n}\n\nconst DEFAULT_SENSITIVE_PATTERNS: RegExp[] = [\n /\\b\\d{13,19}\\b/, // card numbers\n /\\b[A-Z]{2}\\d{2}[A-Z0-9]{11,30}\\b/, // IBAN\n /\\b\\d{3}-\\d{2}-\\d{4}\\b/, // SSN\n /^\\d{6,8}$/, // OTP / PIN\n /\\b\\d{4}\\s\\d{4}\\s\\d{4}\\s\\d{4}\\b/, // formatted card\n];\n\nexport class JoopSecureClipboard {\n private _config: Required<JoopSecureClipboardConfig>;\n private _current: JoopClipboardEntry | null = null;\n private _timer: ReturnType<typeof setTimeout> | null = null;\n private _event$ = new JoopSubject<JoopClipboardEvent>();\n private _visibilityHandler: (() => void) | null = null;\n\n constructor(config: JoopSecureClipboardConfig = {}) {\n this._config = {\n defaultTtlMs: config.defaultTtlMs ?? 30_000,\n sensitivePatterns: config.sensitivePatterns ?? DEFAULT_SENSITIVE_PATTERNS,\n autoClearOnHide: config.autoClearOnHide ?? true,\n };\n if (this._config.autoClearOnHide && typeof document !== 'undefined') {\n this._visibilityHandler = () => { if (document.visibilityState === 'hidden') this.clear('expired'); };\n document.addEventListener('visibilitychange', this._visibilityHandler);\n }\n }\n\n // ── Write ─────────────────────────────────────────────────────────────────\n\n async copy(text: string, options: { ttlMs?: number; label?: string } = {}): Promise<void> {\n const ttl = options.ttlMs ?? this._config.defaultTtlMs;\n const now = Date.now();\n const entry: JoopClipboardEntry = {\n text,\n copiedAt: now,\n expiresAt: now + ttl,\n label: options.label,\n isSensitive: this._detectSensitive(text),\n };\n\n if (typeof navigator !== 'undefined' && navigator.clipboard?.writeText) {\n await navigator.clipboard.writeText(text);\n }\n\n this._cancelTimer();\n this._current = entry;\n this._event$.next({ type: 'copied', entry: { ...entry } });\n\n this._timer = setTimeout(() => this.clear('expired'), ttl);\n }\n\n // ── Read ──────────────────────────────────────────────────────────────────\n\n async read(): Promise<string | null> {\n if (typeof navigator !== 'undefined' && navigator.clipboard?.readText) {\n try { return await navigator.clipboard.readText(); } catch { /* permission denied */ }\n }\n return this._current?.text ?? null;\n }\n\n // ── Clear ─────────────────────────────────────────────────────────────────\n\n async clear(reason: 'manual' | 'expired' = 'manual'): Promise<void> {\n this._cancelTimer();\n const entry = this._current;\n this._current = null;\n\n if (typeof navigator !== 'undefined' && navigator.clipboard?.writeText) {\n try { await navigator.clipboard.writeText(''); } catch { /* permission denied */ }\n }\n\n this._event$.next({ type: reason === 'expired' ? 'expired' : 'cleared', entry: entry ?? undefined });\n }\n\n // ── Introspection ─────────────────────────────────────────────────────────\n\n getCurrent(): JoopClipboardEntry | null {\n if (!this._current) return null;\n if (Date.now() > this._current.expiresAt) { this.clear('expired'); return null; }\n return { ...this._current };\n }\n\n isExpired(): boolean {\n return !this._current || Date.now() > this._current.expiresAt;\n }\n\n getRemainingMs(): number {\n if (!this._current) return 0;\n return Math.max(0, this._current.expiresAt - Date.now());\n }\n\n isSensitive(text: string): boolean { return this._detectSensitive(text); }\n\n // ── Observable ────────────────────────────────────────────────────────────\n\n events$() { return this._event$.asObservable(); }\n\n // ── Cleanup ───────────────────────────────────────────────────────────────\n\n destroy(): void {\n this._cancelTimer();\n if (this._visibilityHandler && typeof document !== 'undefined') {\n document.removeEventListener('visibilitychange', this._visibilityHandler);\n }\n }\n\n // ── Internals ─────────────────────────────────────────────────────────────\n\n private _detectSensitive(text: string): boolean {\n return this._config.sensitivePatterns.some(p => p.test(text.trim()));\n }\n\n private _cancelTimer(): void {\n if (this._timer !== null) { clearTimeout(this._timer); this._timer = null; }\n }\n}\n","import { JoopSubject } from '../events';\n\nexport type JoopTamperType =\n | 'devtools'\n | 'dom-injection'\n | 'prototype-pollution'\n | 'debugger-pause'\n | 'console-override'\n | 'function-override';\n\nexport type JoopTamperSeverity = 'low' | 'medium' | 'high' | 'critical';\n\nexport interface JoopTamperCheck {\n type: JoopTamperType;\n detected: boolean;\n severity: JoopTamperSeverity;\n detail?: string;\n}\n\nexport interface JoopTamperReport {\n timestamp: number;\n checks: JoopTamperCheck[];\n threatCount: number;\n highestSeverity: JoopTamperSeverity | null;\n}\n\nconst SEVERITY: Record<JoopTamperType, JoopTamperSeverity> = {\n 'devtools': 'medium',\n 'dom-injection': 'high',\n 'prototype-pollution': 'critical',\n 'debugger-pause': 'medium',\n 'console-override': 'medium',\n 'function-override': 'high',\n};\n\nconst SEVERITY_ORDER: JoopTamperSeverity[] = ['low', 'medium', 'high', 'critical'];\n\nexport class JoopAntiTamperService {\n private _monitor: ReturnType<typeof setInterval> | null = null;\n private _tamper$ = new JoopSubject<JoopTamperReport>();\n private _alertHandlers: Array<(report: JoopTamperReport) => void> = [];\n private _lastReport: JoopTamperReport | null = null;\n private _nativeFetch = typeof fetch !== 'undefined' ? fetch : null;\n private _nativeConsoleLog = typeof console !== 'undefined' ? console.log : null;\n\n // ── Checks ────────────────────────────────────────────────────────────────\n\n checkDevTools(): JoopTamperCheck {\n let detected = false;\n let detail: string | undefined;\n\n // Size heuristic (works in Chromium)\n if (typeof window !== 'undefined') {\n const threshold = 160;\n if (window.outerWidth - window.innerWidth > threshold || window.outerHeight - window.innerHeight > threshold) {\n detected = true; detail = 'Window size delta suggests DevTools panel is open';\n }\n }\n\n return { type: 'devtools', detected, severity: SEVERITY['devtools'], detail };\n }\n\n checkDomInjection(): JoopTamperCheck {\n let detected = false;\n let detail: string | undefined;\n\n if (typeof document !== 'undefined') {\n const scripts = document.querySelectorAll('script[src]');\n const suspicious = Array.from(scripts).filter(s => {\n const src = (s as HTMLScriptElement).src;\n return src && !src.startsWith(location.origin) && !src.startsWith('chrome-extension://');\n });\n if (suspicious.length > 0) {\n detected = true;\n detail = `${suspicious.length} external script(s) found: ${suspicious.map(s => (s as HTMLScriptElement).src.split('/')[2]).join(', ')}`;\n }\n }\n\n return { type: 'dom-injection', detected, severity: SEVERITY['dom-injection'], detail };\n }\n\n checkPrototypePollution(): JoopTamperCheck {\n const probes = ['__proto__', 'constructor', 'toString', 'valueOf', 'hasOwnProperty'];\n const polluted: string[] = [];\n\n for (const key of probes) {\n const obj = {} as any;\n if (typeof obj[key] !== (key === '__proto__' ? 'object' : 'function')) {\n polluted.push(key);\n }\n }\n\n // Check for extra enumerable properties on Object.prototype\n for (const key in {}) {\n polluted.push(key);\n break;\n }\n\n const detected = polluted.length > 0;\n return { type: 'prototype-pollution', detected, severity: SEVERITY['prototype-pollution'], detail: detected ? `Polluted keys: ${polluted.join(', ')}` : undefined };\n }\n\n checkConsoleOverride(): JoopTamperCheck {\n let detected = false;\n let detail: string | undefined;\n\n if (typeof console !== 'undefined' && this._nativeConsoleLog) {\n const isNative = Function.prototype.toString.call(console.log).includes('[native code]');\n // Also detect if console.log is a custom wrapper\n if (!isNative && console.log !== this._nativeConsoleLog) {\n detected = true;\n detail = 'console.log has been overridden';\n }\n }\n\n return { type: 'console-override', detected, severity: SEVERITY['console-override'], detail };\n }\n\n checkFunctionOverride(): JoopTamperCheck {\n let detected = false;\n let detail: string | undefined;\n const overridden: string[] = [];\n\n if (typeof fetch !== 'undefined' && this._nativeFetch && fetch !== this._nativeFetch) {\n overridden.push('fetch');\n }\n if (typeof XMLHttpRequest !== 'undefined') {\n const isNative = Function.prototype.toString.call(XMLHttpRequest.prototype.open).includes('[native code]');\n if (!isNative) overridden.push('XMLHttpRequest.open');\n }\n\n if (overridden.length > 0) {\n detected = true;\n detail = `Overridden: ${overridden.join(', ')}`;\n }\n\n return { type: 'function-override', detected, severity: SEVERITY['function-override'], detail };\n }\n\n // ── Integrity scan ────────────────────────────────────────────────────────\n\n checkIntegrity(): JoopTamperReport {\n const checks: JoopTamperCheck[] = [\n this.checkDevTools(),\n this.checkDomInjection(),\n this.checkPrototypePollution(),\n this.checkConsoleOverride(),\n this.checkFunctionOverride(),\n ];\n\n const threats = checks.filter(c => c.detected);\n const severities = threats.map(c => SEVERITY_ORDER.indexOf(c.severity));\n const highestIdx = severities.length > 0 ? Math.max(...severities) : -1;\n\n const report: JoopTamperReport = {\n timestamp: Date.now(),\n checks,\n threatCount: threats.length,\n highestSeverity: highestIdx >= 0 ? SEVERITY_ORDER[highestIdx] : null,\n };\n\n this._lastReport = report;\n\n if (report.threatCount > 0) {\n this._alertHandlers.forEach(h => h(report));\n this._tamper$.next(report);\n }\n\n return report;\n }\n\n isTampered(): boolean {\n return (this._lastReport?.threatCount ?? 0) > 0;\n }\n\n getLastReport(): JoopTamperReport | null { return this._lastReport; }\n\n // ── Monitoring ────────────────────────────────────────────────────────────\n\n startMonitoring(intervalMs = 10_000): void {\n if (this._monitor !== null) return;\n this.checkIntegrity();\n this._monitor = setInterval(() => this.checkIntegrity(), intervalMs);\n }\n\n stopMonitoring(): void {\n if (this._monitor !== null) { clearInterval(this._monitor); this._monitor = null; }\n }\n\n isMonitoring(): boolean { return this._monitor !== null; }\n\n // ── Events ────────────────────────────────────────────────────────────────\n\n onTamperDetected(handler: (report: JoopTamperReport) => void): () => void {\n this._alertHandlers.push(handler);\n return () => { this._alertHandlers = this._alertHandlers.filter(h => h !== handler); };\n }\n\n tamper$() { return this._tamper$.asObservable(); }\n\n destroy(): void { this.stopMonitoring(); }\n}\n","import { JoopSubject } from '../events';\n\nexport interface JoopCertPin {\n hostname: string;\n fingerprints: string[]; // SHA-256 hex fingerprints (lowercase, no colons)\n algorithm: 'sha256' | 'sha1';\n addedAt: number;\n expiresAt?: number;\n notes?: string;\n}\n\nexport interface JoopPinViolation {\n hostname: string;\n receivedFingerprint: string;\n expectedFingerprints: string[];\n timestamp: number;\n url: string;\n}\n\nexport interface JoopPinValidationResult {\n valid: boolean;\n pinned: boolean;\n violation?: JoopPinViolation;\n pin?: JoopCertPin;\n}\n\nexport class JoopCertPinningService {\n private _pins = new Map<string, JoopCertPin>();\n private _violations: JoopPinViolation[] = [];\n private _violation$ = new JoopSubject<JoopPinViolation>();\n private _violationHandlers: Array<(v: JoopPinViolation) => void> = [];\n\n // ── Pin management ────────────────────────────────────────────────────────\n\n addPin(pin: Omit<JoopCertPin, 'addedAt'>): void {\n const hostname = this._normalizeHostname(pin.hostname);\n this._pins.set(hostname, { ...pin, hostname, addedAt: Date.now(), fingerprints: pin.fingerprints.map(f => f.toLowerCase().replace(/:/g, '')) });\n }\n\n removePin(hostname: string): void {\n this._pins.delete(this._normalizeHostname(hostname));\n }\n\n getPin(hostname: string): JoopCertPin | undefined {\n return this._pins.get(this._normalizeHostname(hostname));\n }\n\n getAllPins(): JoopCertPin[] { return Array.from(this._pins.values()); }\n\n // ── Validation ────────────────────────────────────────────────────────────\n\n validate(url: string, fingerprint: string): JoopPinValidationResult {\n const hostname = this._hostnameFromUrl(url);\n const pin = this._findPin(hostname);\n\n if (!pin) return { valid: true, pinned: false };\n\n // Check expiry\n if (pin.expiresAt && Date.now() > pin.expiresAt) {\n return { valid: true, pinned: false }; // expired pins don't block, but warn\n }\n\n const normalized = fingerprint.toLowerCase().replace(/:/g, '');\n const matched = pin.fingerprints.includes(normalized);\n\n if (!matched) {\n const violation: JoopPinViolation = {\n hostname, receivedFingerprint: normalized,\n expectedFingerprints: pin.fingerprints,\n timestamp: Date.now(), url,\n };\n this._violations.push(violation);\n this._violationHandlers.forEach(h => h(violation));\n this._violation$.next(violation);\n return { valid: false, pinned: true, violation, pin };\n }\n\n return { valid: true, pinned: true, pin };\n }\n\n validateResponse(url: string, response: Response): JoopPinValidationResult {\n // In a browser, we can't directly access cert fingerprints from fetch Response.\n // This method is designed for environments where fingerprint is injected via headers\n // or a custom fetch wrapper that extracts TLS info (e.g. Node.js, React Native).\n const fingerprint = response.headers.get('x-cert-fingerprint') ?? '';\n if (!fingerprint) return { valid: true, pinned: false }; // no fingerprint provided\n return this.validate(url, fingerprint);\n }\n\n // ── Expiry ────────────────────────────────────────────────────────────────\n\n getExpiring(withinMs = 7 * 24 * 3_600_000): JoopCertPin[] {\n const now = Date.now();\n return this.getAllPins().filter(p => p.expiresAt && p.expiresAt - now <= withinMs && p.expiresAt > now);\n }\n\n isExpired(hostname: string): boolean {\n const pin = this.getPin(hostname);\n return !!(pin?.expiresAt && Date.now() > pin.expiresAt);\n }\n\n // ── Violations ────────────────────────────────────────────────────────────\n\n getViolations(): JoopPinViolation[] { return [...this._violations]; }\n\n clearViolations(): void { this._violations = []; }\n\n onViolation(handler: (v: JoopPinViolation) => void): () => void {\n this._violationHandlers.push(handler);\n return () => { this._violationHandlers = this._violationHandlers.filter(h => h !== handler); };\n }\n\n violations$() { return this._violation$.asObservable(); }\n\n // ── Internals ─────────────────────────────────────────────────────────────\n\n private _normalizeHostname(hostname: string): string {\n return hostname.toLowerCase().replace(/^https?:\\/\\//, '').split('/')[0].split('?')[0];\n }\n\n private _hostnameFromUrl(url: string): string {\n try { return new URL(url).hostname.toLowerCase(); }\n catch { return this._normalizeHostname(url); }\n }\n\n private _findPin(hostname: string): JoopCertPin | undefined {\n // exact match first, then wildcard\n return this._pins.get(hostname) ?? this._pins.get(`*.${hostname.split('.').slice(1).join('.')}`);\n }\n}\n","export interface JoopRetryConfig {\n maxAttempts: number;\n baseDelayMs: number;\n maxDelayMs: number;\n jitter: boolean;\n retryOn?: (error: unknown, attempt: number) => boolean;\n}\n\nconst DEFAULTS: JoopRetryConfig = {\n maxAttempts: 3,\n baseDelayMs: 500,\n maxDelayMs: 30_000,\n jitter: true,\n};\n\nexport async function withRetry<T>(\n fn: () => Promise<T>,\n config: Partial<JoopRetryConfig> = {}\n): Promise<T> {\n const cfg = { ...DEFAULTS, ...config };\n let lastError: unknown;\n\n for (let attempt = 1; attempt <= cfg.maxAttempts; attempt++) {\n try {\n return await fn();\n } catch (err) {\n lastError = err;\n if (attempt === cfg.maxAttempts) break;\n if (cfg.retryOn && !cfg.retryOn(err, attempt)) break;\n await _sleep(_calcDelay(attempt, cfg));\n }\n }\n throw lastError;\n}\n\nfunction _calcDelay(attempt: number, cfg: JoopRetryConfig): number {\n const exp = Math.min(cfg.baseDelayMs * Math.pow(2, attempt - 1), cfg.maxDelayMs);\n return cfg.jitter ? Math.floor(Math.random() * exp) : exp;\n}\n\nfunction _sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n","// Extended HTTP client — parallel, race, deduplication, queue, typed wrappers\n// Builds on top of JoopHttpClient (no duplication of base logic)\n\nimport { JoopHttpClient, type JoopFetchOptions } from './http-client';\nimport { withRetry, type JoopRetryConfig } from './retry';\n\nexport interface JoopParallelResult<T> {\n index: number;\n url: string;\n data?: T;\n error?: Error;\n ok: boolean;\n ms: number;\n}\n\nexport interface JoopRequestQueueConfig {\n concurrency: number; // max parallel inflight, default 4\n onDrain?: () => void;\n}\n\ntype QueueEntry = { fn: () => Promise<any>; resolve: (v: any) => void; reject: (e: any) => void };\n\n/** Request deduplication cache — ongoing identical GET requests share one fetch */\nconst _inFlight = new Map<string, Promise<any>>();\n\nexport class JoopHttpClientExtended extends JoopHttpClient {\n // ── Parallel requests ───────────────────────────────────────────────────────\n\n /** Fire multiple GETs at once, collect all results (never throws). */\n async getAll<T = any>(\n urls: string[],\n options?: JoopFetchOptions,\n ): Promise<JoopParallelResult<T>[]> {\n return Promise.all(\n urls.map(async (url, index) => {\n const t0 = Date.now();\n try {\n const data = await this.get<T>(url, options);\n return { index, url, data, ok: true, ms: Date.now() - t0 };\n } catch (e: any) {\n return { index, url, error: e, ok: false, ms: Date.now() - t0 };\n }\n }),\n );\n }\n\n /** Post to multiple URLs in parallel (fire-and-collect). */\n async postAll<T = any>(\n requests: Array<{ url: string; body?: any; options?: JoopFetchOptions }>,\n ): Promise<JoopParallelResult<T>[]> {\n return Promise.all(\n requests.map(async (req, index) => {\n const t0 = Date.now();\n try {\n const data = await this.post<T>(req.url, req.body, req.options);\n return { index, url: req.url, data, ok: true, ms: Date.now() - t0 };\n } catch (e: any) {\n return { index, url: req.url, error: e, ok: false, ms: Date.now() - t0 };\n }\n }),\n );\n }\n\n /** Race multiple GET requests — resolves with the first successful response. */\n async race<T = any>(urls: string[], options?: JoopFetchOptions): Promise<{ data: T; url: string; ms: number }> {\n return new Promise((resolve, reject) => {\n let settled = false;\n const errors: Error[] = [];\n urls.forEach(url => {\n const t0 = Date.now();\n this.get<T>(url, options).then(data => {\n if (!settled) { settled = true; resolve({ data, url, ms: Date.now() - t0 }); }\n }).catch(err => {\n errors.push(err);\n if (errors.length === urls.length) reject(errors[0]);\n });\n });\n });\n }\n\n /** Sequential requests — each result fed to a mapper for the next URL. */\n async chain<T = any>(\n steps: Array<(prevResult: T | undefined) => { url: string; body?: any; method?: 'GET' | 'POST' }>,\n options?: JoopFetchOptions,\n ): Promise<T[]> {\n const results: T[] = [];\n let prev: T | undefined;\n for (const step of steps) {\n const { url, body, method = 'GET' } = step(prev);\n prev = method === 'POST' ? await this.post<T>(url, body, options) : await this.get<T>(url, options);\n results.push(prev);\n }\n return results;\n }\n\n // ── Deduplication ─────────────────────────────────────────────────────────\n\n /** GET with request deduplication — concurrent identical URLs share one network call. */\n getDedup<T = any>(url: string, options?: JoopFetchOptions): Promise<T> {\n const key = url + JSON.stringify(options?.headers ?? {});\n if (_inFlight.has(key)) return _inFlight.get(key) as Promise<T>;\n const promise = this.get<T>(url, options).finally(() => _inFlight.delete(key));\n _inFlight.set(key, promise);\n return promise;\n }\n\n // ── Retry wrapper ─────────────────────────────────────────────────────────\n\n /** GET with automatic retry on failure. */\n getWithRetry<T = any>(url: string, retry?: Partial<JoopRetryConfig>, options?: JoopFetchOptions): Promise<T> {\n return withRetry(() => this.get<T>(url, options), retry);\n }\n\n postWithRetry<T = any>(url: string, body?: any, retry?: Partial<JoopRetryConfig>, options?: JoopFetchOptions): Promise<T> {\n return withRetry(() => this.post<T>(url, body, options), retry);\n }\n\n // ── Request queue ──────────────────────────────────────────────────────────\n\n createQueue(config: JoopRequestQueueConfig = { concurrency: 4 }): JoopRequestQueue {\n return new JoopRequestQueue(config);\n }\n\n // ── Typed response helpers ────────────────────────────────────────────────\n\n /** GET that throws if the response does not pass a validator. */\n async getValidated<T>(\n url: string,\n validate: (data: unknown) => data is T,\n options?: JoopFetchOptions,\n ): Promise<T> {\n const data = await this.get<unknown>(url, options);\n if (!validate(data)) throw new TypeError(`JoopHttp: response from ${url} failed type validation`);\n return data;\n }\n\n /** GET with fallback value on error (never throws). */\n async getSafe<T>(url: string, fallback: T, options?: JoopFetchOptions): Promise<T> {\n try { return await this.get<T>(url, options); } catch { return fallback; }\n }\n\n /** POST with fallback on error. */\n async postSafe<T>(url: string, body?: any, fallback?: T, options?: JoopFetchOptions): Promise<T | undefined> {\n try { return await this.post<T>(url, body, options); } catch { return fallback; }\n }\n\n // ── Timeout helper ────────────────────────────────────────────────────────\n\n /** Set a default timeout on all subsequent requests. */\n withTimeout(ms: number): JoopHttpClientExtended {\n const child = new JoopHttpClientExtended();\n const orig = child.request.bind(child);\n child.request = (method, url, opts = {}) => orig(method, url, { timeout: ms, ...opts });\n return child;\n }\n\n // ── Sync-style callback wrapper ───────────────────────────────────────────\n\n /** \"Sync-style\" GET — callback-based wrapper (JS is single-threaded; true sync fetch doesn't exist).\n * Use only in contexts where you cannot use async/await (e.g., legacy callbacks). */\n getCallback<T = any>(\n url: string,\n onSuccess: (data: T) => void,\n onError: (err: Error) => void,\n options?: JoopFetchOptions,\n ): void {\n this.get<T>(url, options).then(onSuccess).catch(onError);\n }\n\n /** Batch multiple operations with concurrency limit. */\n async batch<T, R>(\n items: T[],\n fn: (item: T, index: number) => Promise<R>,\n concurrency = 4,\n ): Promise<Array<{ item: T; result?: R; error?: Error; ok: boolean }>> {\n const results: Array<{ item: T; result?: R; error?: Error; ok: boolean }> = [];\n for (let i = 0; i < items.length; i += concurrency) {\n const slice = items.slice(i, i + concurrency);\n const batch = await Promise.all(\n slice.map(async (item, idx) => {\n try {\n const result = await fn(item, i + idx);\n return { item, result, ok: true };\n } catch (e: any) {\n return { item, error: e, ok: false };\n }\n }),\n );\n results.push(...batch);\n }\n return results;\n }\n}\n\n// ── Request Queue ──────────────────────────────────────────────────────────────\n\nexport class JoopRequestQueue {\n private _queue: QueueEntry[] = [];\n private _running = 0;\n private readonly _config: JoopRequestQueueConfig;\n\n constructor(config: JoopRequestQueueConfig) {\n this._config = { concurrency: config.concurrency ?? 4, onDrain: config.onDrain };\n }\n\n enqueue<T>(fn: () => Promise<T>): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n this._queue.push({ fn, resolve, reject });\n this._tick();\n });\n }\n\n get size(): number { return this._queue.length; }\n get inflight(): number { return this._running; }\n\n private _tick(): void {\n while (this._running < this._config.concurrency && this._queue.length > 0) {\n const entry = this._queue.shift()!;\n this._running++;\n entry.fn().then(entry.resolve, entry.reject).finally(() => {\n this._running--;\n this._tick();\n if (this._running === 0 && this._queue.length === 0) this._config.onDrain?.();\n });\n }\n }\n}\n","// Pre-built interceptors — attach to JoopInterceptorPipeline\nimport type { JoopRequestInterceptor, JoopResponseInterceptor, JoopErrorInterceptor } from './interceptor';\n\n// ── Auth Bearer interceptor ───────────────────────────────────────────────────\n\n/** Injects Authorization: Bearer <token> from a synchronous token getter. */\nexport function bearerAuthInterceptor(getToken: () => string | null | undefined): JoopRequestInterceptor {\n return req => {\n const token = getToken();\n if (token) {\n return { ...req, headers: { ...req.headers, Authorization: `Bearer ${token}` } };\n }\n return req;\n };\n}\n\n// ── Logging interceptor ───────────────────────────────────────────────────────\n\nexport interface JoopLogInterceptorOptions {\n logRequest?: boolean;\n logResponse?: boolean;\n logErrors?: boolean;\n logger?: { log: (...a: any[]) => void; warn: (...a: any[]) => void; error: (...a: any[]) => void };\n}\n\nexport function loggingRequestInterceptor(opts: JoopLogInterceptorOptions = {}): JoopRequestInterceptor {\n const log = opts.logger ?? console;\n return req => {\n if (opts.logRequest !== false) {\n log.log(`[JoopHTTP] ➜ ${req.method} ${req.url}`, req.body ? { body: req.body } : '');\n }\n return req;\n };\n}\n\nexport function loggingResponseInterceptor(opts: JoopLogInterceptorOptions = {}): JoopResponseInterceptor {\n const log = opts.logger ?? console;\n return res => {\n if (opts.logResponse !== false) {\n log.log(`[JoopHTTP] ✓ ${res.status}`, res.data);\n }\n return res;\n };\n}\n\nexport function loggingErrorInterceptor(opts: JoopLogInterceptorOptions = {}): JoopErrorInterceptor {\n const log = opts.logger ?? console;\n return err => {\n if (opts.logErrors !== false) {\n const e = err as any;\n log.error(`[JoopHTTP] ✗ ${e?.status ?? 0} ${e?.message}`, err);\n }\n return err;\n };\n}\n\n// ── Correlation ID interceptor ────────────────────────────────────────────────\n\n/** Injects X-Correlation-ID / X-Request-ID headers for distributed tracing. */\nexport function correlationInterceptor(\n getCorrelationId?: () => string,\n): JoopRequestInterceptor {\n const getId = getCorrelationId ?? (() => crypto.randomUUID?.() ?? Math.random().toString(36).slice(2));\n return req => ({\n ...req,\n headers: {\n ...req.headers,\n 'X-Correlation-ID': getId(),\n 'X-Request-ID': getId(),\n },\n });\n}\n\n// ── Base URL interceptor ──────────────────────────────────────────────────────\n\n/** Prepends a base URL to all relative request URLs. */\nexport function baseUrlInterceptor(baseUrl: string): JoopRequestInterceptor {\n const base = baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl;\n return req => ({\n ...req,\n url: req.url.startsWith('http') ? req.url : `${base}${req.url.startsWith('/') ? '' : '/'}${req.url}`,\n });\n}\n\n// ── Retry-on-error interceptor ────────────────────────────────────────────────\n\nexport interface JoopRetryInterceptorOptions {\n maxRetries?: number; // default 2\n retryOn?: number[]; // HTTP status codes to retry, default [429, 502, 503, 504]\n backoffMs?: number; // base delay ms, default 300\n onRetry?: (attempt: number, err: any) => void;\n}\n\n/** Returns a JoopErrorInterceptor that re-throws after exponential back-off retries.\n * Wire this into JoopInterceptorPipeline.addErrorInterceptor().\n * Note: the interceptor itself can't retry transparently — callers use withRetry() wrapper instead.\n * This interceptor adds retry metadata to errors for upstream use.\n */\nexport function retryErrorInterceptor(opts: JoopRetryInterceptorOptions = {}): JoopErrorInterceptor {\n const maxRetries = opts.maxRetries ?? 2;\n const retryOn = opts.retryOn ?? [429, 502, 503, 504];\n return err => {\n const e = err as any;\n const shouldRetry = retryOn.includes(e?.status ?? 0);\n return Object.assign(e ?? {}, { _joopShouldRetry: shouldRetry, _joopMaxRetries: maxRetries });\n };\n}\n\n// ── Cache interceptor ─────────────────────────────────────────────────────────\n\nconst _cache = new Map<string, { data: any; expiresAt: number }>();\n\nexport interface JoopCacheInterceptorOptions {\n ttlMs?: number; // default 60_000 (1 minute)\n methods?: string[]; // default ['GET']\n}\n\nexport function cacheResponseInterceptor(opts: JoopCacheInterceptorOptions = {}): JoopResponseInterceptor {\n const ttl = opts.ttlMs ?? 60_000;\n const methods = (opts.methods ?? ['GET']).map(m => m.toUpperCase());\n return res => {\n if (methods.includes((res as any)._requestMethod?.toUpperCase() ?? 'GET')) {\n _cache.set((res as any)._requestUrl ?? '', { data: res.data, expiresAt: Date.now() + ttl });\n }\n return res;\n };\n}\n\nexport function cacheRequestInterceptor(): JoopRequestInterceptor {\n return req => {\n const cached = _cache.get(req.url);\n if (cached && cached.expiresAt > Date.now()) {\n // Signal to skip the real request by attaching pre-resolved data\n return Object.assign(req, { _cacheHit: true, _cachedData: cached.data });\n }\n return req;\n };\n}\n\nexport function clearCache(url?: string): void {\n url ? _cache.delete(url) : _cache.clear();\n}\n","export function maskCard(cardNumber: string, showLast = 4): string {\n const digits = cardNumber.replace(/\\D/g, '');\n if (digits.length < showLast) return cardNumber;\n const masked = '*'.repeat(digits.length - showLast) + digits.slice(-showLast);\n return masked.replace(/(.{4})/g, '$1 ').trim();\n}\n\nexport function formatCard(cardNumber: string): string {\n return cardNumber.replace(/\\D/g, '').replace(/(.{4})/g, '$1 ').trim();\n}\n\nexport function maskIban(iban: string, showChars = 8): string {\n const clean = iban.replace(/\\s/g, '');\n if (clean.length <= showChars) return iban;\n return clean.slice(0, 4) + '*'.repeat(clean.length - showChars) + clean.slice(-4);\n}\n\nexport function maskAccountNumber(account: string, showLast = 4): string {\n const clean = account.replace(/\\D/g, '');\n if (clean.length <= showLast) return clean;\n return '*'.repeat(clean.length - showLast) + clean.slice(-showLast);\n}\n\nexport function maskEmail(email: string): string {\n const [user, domain] = email.split('@');\n if (!domain || user.length < 3) return '***@' + (domain ?? '');\n return user[0] + '*'.repeat(user.length - 2) + user[user.length - 1] + '@' + domain;\n}\n\nexport function maskPhone(phone: string, showLast = 4): string {\n const digits = phone.replace(/\\D/g, '');\n if (digits.length <= showLast) return phone;\n return '*'.repeat(digits.length - showLast) + digits.slice(-showLast);\n}\n\nexport function maskName(name: string): string {\n const parts = name.trim().split(/\\s+/);\n return parts.map((p, i) => i === 0 ? p : p[0] + '*'.repeat(p.length - 1)).join(' ');\n}\n\n// ── Singapore / Malaysia NRIC ───────────────────────────────────────────────\n\nconst NRIC_SG_REGEX = /^[STFGM]\\d{7}[A-Z]$/i;\n// Singapore checksum weights and checksums\nconst NRIC_WEIGHTS = [2, 7, 6, 5, 4, 3, 2];\nconst NRIC_SG_ST = ['J','Z','I','H','G','F','E','D','C','B','A'];\nconst NRIC_SG_FG = ['X','W','U','T','R','Q','P','N','M','L','K'];\nconst NRIC_SG_M = ['K','L','J','N','P','Q','R','T','U','W','X'];\n\nexport function validateNric(nric: string): boolean {\n const clean = nric.trim().toUpperCase();\n if (!NRIC_SG_REGEX.test(clean)) return false;\n const prefix = clean[0];\n const digits = clean.slice(1, 8).split('').map(Number);\n const suffix = clean[8];\n const sum = digits.reduce((acc, d, i) => acc + d * NRIC_WEIGHTS[i], 0);\n const offset = (prefix === 'G' || prefix === 'T' || prefix === 'S') ? 0 : (prefix === 'F' ? 0 : 0);\n const mod = (sum + (prefix === 'G' || prefix === 'T' ? 4 : prefix === 'M' ? 3 : 0)) % 11;\n let table: string[];\n if (prefix === 'S' || prefix === 'T') table = NRIC_SG_ST;\n else if (prefix === 'F' || prefix === 'G') table = NRIC_SG_FG;\n else table = NRIC_SG_M;\n void offset;\n return table[mod] === suffix;\n}\n\nexport function maskNric(nric: string): string {\n const clean = nric.trim().toUpperCase();\n if (clean.length < 5) return nric;\n return clean[0] + '*'.repeat(clean.length - 4) + clean.slice(-3);\n}\n\n// Malaysia MyKad (IC): YYMMDD-PB-NNNG\nconst MYKAD_REGEX = /^\\d{12}$|^\\d{6}-\\d{2}-\\d{4}$/;\n\nexport function validateMyKad(ic: string): boolean {\n return MYKAD_REGEX.test(ic.replace(/\\s/g, ''));\n}\n\nexport function maskMyKad(ic: string): string {\n const clean = ic.replace(/[-\\s]/g, '');\n if (clean.length !== 12) return ic;\n // Show birth year (first 2) + state code (pos 6-7), mask the rest → always 12 chars\n return clean.slice(0, 2) + '****' + clean.slice(6, 8) + '****';\n}\n\nexport function formatMyKad(ic: string): string {\n const clean = ic.replace(/\\D/g, '');\n if (clean.length !== 12) return ic;\n return `${clean.slice(0, 6)}-${clean.slice(6, 8)}-${clean.slice(8)}`;\n}\n","// Custom masking — flexible pattern-based masking for any string value\n\n/** Mask a string showing the first N and last M characters, masking everything in between.\n * maskRange('1234567890', 2, 4) → '12****7890'\n * maskRange('1234567890', 0, 4) → '******7890'\n * maskRange('1234567890', 2, 0) → '12********'\n */\nexport function maskRange(\n value: string,\n firstVisible: number,\n lastVisible: number,\n maskChar = '*',\n): string {\n const len = value.length;\n const first = Math.max(0, Math.min(firstVisible, len));\n const last = Math.max(0, Math.min(lastVisible, len - first));\n const midLen = Math.max(0, len - first - last);\n return value.slice(0, first) + maskChar.repeat(midLen) + value.slice(len - last || len);\n}\n\n/** Show only the last N characters.\n * maskShowLast('1234567890', 4) → '******7890'\n */\nexport function maskShowLast(value: string, n: number, maskChar = '*'): string {\n return maskRange(value, 0, n, maskChar);\n}\n\n/** Show only the first N characters.\n * maskShowFirst('1234567890', 3) → '123*******'\n */\nexport function maskShowFirst(value: string, n: number, maskChar = '*'): string {\n return maskRange(value, n, 0, maskChar);\n}\n\n/** Pattern-based masking using a format string.\n * '#' = reveal original character, 'X' = mask.\n * maskPattern('4532015112830366', '####XXXXXXXX####') → '4532********0366'\n * maskPattern('ABCPG1234C', 'XX*****XX*') → 'AB*****34*' (any non-# char = mask)\n *\n * Pattern characters:\n * '#' — show original character\n * '*' / 'X' / 'x' — replace with maskChar\n * Any other char is passed through as-is (separator)\n */\nexport function maskPattern(value: string, pattern: string, maskChar = '*'): string {\n let result = '';\n let vi = 0;\n for (let i = 0; i < pattern.length; i++) {\n const pc = pattern[i];\n if (pc === '#') {\n result += vi < value.length ? value[vi++] : '';\n } else if (pc === '*' || pc === 'X' || pc === 'x') {\n result += vi < value.length ? maskChar : '';\n vi++;\n } else {\n // separator / literal — pass through (skip one source char if aligned)\n result += pc;\n }\n }\n return result;\n}\n\n/** Keep middle characters visible, mask the edges.\n * maskKeepMiddle('1234567890', 4) → '***4567***'\n */\nexport function maskKeepMiddle(value: string, visibleCount: number, maskChar = '*'): string {\n const len = value.length;\n const half = Math.floor(visibleCount / 2);\n const start = Math.max(0, Math.floor((len - visibleCount) / 2));\n const end = start + visibleCount;\n return maskChar.repeat(start) + value.slice(start, end) + maskChar.repeat(Math.max(0, len - end));\n}\n\n/** Mask every other character (interleaved masking).\n * maskInterleaved('1234567890') → '1*3*5*7*9*'\n */\nexport function maskInterleaved(value: string, maskChar = '*'): string {\n return value.split('').map((c, i) => i % 2 === 0 ? c : maskChar).join('');\n}\n\n/** Mask all but keep separators in place (useful for formatted IBANs, phones etc).\n * maskKeepSeparators('GB29 NWBK 6016 1331', 4) → 'GB29 **** **** 1331'\n */\nexport function maskKeepSeparators(value: string, lastVisible: number, separators = ' -', maskChar = '*'): string {\n const stripped = value.split('').filter(c => !separators.includes(c)).join('');\n const maskedStripped = maskShowLast(stripped, lastVisible, maskChar);\n let mi = 0;\n return value.split('').map(c => separators.includes(c) ? c : maskedStripped[mi++] ?? '').join('');\n}\n","export interface JoopCurrencyFormatOptions {\n currency: string;\n locale?: string;\n showSymbol?: boolean;\n minimumFractionDigits?: number;\n maximumFractionDigits?: number;\n}\n\nexport function formatCurrency(amount: number | string, options: JoopCurrencyFormatOptions): string {\n const num = typeof amount === 'string' ? parseFloat(amount.replace(/[,\\s]/g, '')) : amount;\n if (!isFinite(num)) return '—';\n\n return new Intl.NumberFormat(options.locale ?? 'en-US', {\n style: options.showSymbol === false ? 'decimal' : 'currency',\n currency: options.showSymbol === false ? undefined : options.currency,\n minimumFractionDigits: options.minimumFractionDigits ?? 2,\n maximumFractionDigits: options.maximumFractionDigits ?? 2,\n }).format(num);\n}\n\nexport function parseCurrencyString(value: string): number {\n const cleaned = value.replace(/[^0-9.\\-]/g, '');\n const num = parseFloat(cleaned);\n return isNaN(num) ? 0 : num;\n}\n\nexport function convertCurrency(amount: number, rate: number, decimals = 2): number {\n return parseFloat((amount * rate).toFixed(decimals));\n}\n\nexport function getCurrencySymbol(currency: string, locale = 'en-US'): string {\n const formatted = new Intl.NumberFormat(locale, { style: 'currency', currency }).format(0);\n return formatted.replace(/[\\d\\s.,]/g, '').trim();\n}\n\nexport function formatAmount(amount: number, decimals = 2, locale = 'en-US'): string {\n return new Intl.NumberFormat(locale, {\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n }).format(amount);\n}\n","export interface JoopTransactionRef {\n id: string;\n timestamp: number;\n prefix: string;\n full: string;\n}\n\nexport function generateTransactionId(prefix = 'TXN'): JoopTransactionRef {\n const timestamp = Date.now();\n const randomBytes = new Uint8Array(8);\n crypto.getRandomValues(randomBytes);\n const randomHex = Array.from(randomBytes).map(b => b.toString(16).padStart(2, '0')).join('').toUpperCase();\n return { id: randomHex, timestamp, prefix, full: `${prefix}-${timestamp}-${randomHex}` };\n}\n\nexport function generateReferenceNumber(length = 12): string {\n const chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';\n const arr = new Uint8Array(length);\n crypto.getRandomValues(arr);\n return Array.from(arr).map(b => chars[b % chars.length]).join('');\n}\n\nexport function parseTransactionId(id: string): { prefix: string; timestamp: number; random: string } | null {\n const parts = id.split('-');\n if (parts.length < 3) return null;\n const timestamp = parseInt(parts[1]);\n if (isNaN(timestamp)) return null;\n return { prefix: parts[0], timestamp, random: parts.slice(2).join('-') };\n}\n\nexport function isValidTransactionId(id: string): boolean {\n return parseTransactionId(id) !== null;\n}\n\nexport function generateBatchId(): string {\n const arr = new Uint8Array(12);\n crypto.getRandomValues(arr);\n return 'BATCH-' + Array.from(arr).map(b => b.toString(16).padStart(2, '0')).join('').toUpperCase();\n}\n","import { JoopBehaviorSubject } from '../events';\n\nexport type JoopBeneficiaryType = 'domestic' | 'international' | 'upi' | 'mobile' | 'wallet' | 'crypto';\n\nexport interface JoopBeneficiary {\n id: string;\n name: string;\n nickname?: string;\n type: JoopBeneficiaryType;\n // Bank account details\n accountNumber?: string;\n iban?: string;\n bic?: string;\n routingNumber?: string;\n sortCode?: string;\n bankName?: string;\n bankCode?: string;\n branchCode?: string;\n // Alternative identifiers\n upiId?: string;\n mobile?: string;\n email?: string;\n walletId?: string;\n // Meta\n currency?: string;\n country?: string;\n group?: string;\n isFavorite: boolean;\n isVerified: boolean;\n transferLimit?: number;\n notes?: string;\n createdAt: number;\n updatedAt: number;\n lastUsedAt?: number;\n useCount: number;\n}\n\nexport interface JoopBeneficiaryValidation {\n valid: boolean;\n errors: string[];\n}\n\nexport class JoopBeneficiaryService {\n private _beneficiaries = new Map<string, JoopBeneficiary>();\n private _list$ = new JoopBehaviorSubject<JoopBeneficiary[]>([]);\n\n // ── CRUD ─────────────────────────────────────────────────────────────────\n\n add(data: Omit<JoopBeneficiary, 'id' | 'createdAt' | 'updatedAt' | 'useCount'>): JoopBeneficiary {\n const validation = this.validate(data);\n if (!validation.valid) throw new Error(`Invalid beneficiary: ${validation.errors.join(', ')}`);\n const b: JoopBeneficiary = { ...data, id: _uid(), createdAt: Date.now(), updatedAt: Date.now(), useCount: 0 };\n this._beneficiaries.set(b.id, b);\n this._emit();\n return { ...b };\n }\n\n update(id: string, patch: Partial<Omit<JoopBeneficiary, 'id' | 'createdAt'>>): JoopBeneficiary {\n const b = this._get(id);\n const updated = { ...b, ...patch, id, updatedAt: Date.now() };\n this._beneficiaries.set(id, updated);\n this._emit();\n return { ...updated };\n }\n\n remove(id: string): void {\n this._beneficiaries.delete(id);\n this._emit();\n }\n\n get(id: string): JoopBeneficiary | undefined {\n const b = this._beneficiaries.get(id);\n return b ? { ...b } : undefined;\n }\n\n getAll(): JoopBeneficiary[] {\n return Array.from(this._beneficiaries.values()).map(b => ({ ...b }));\n }\n\n // ── Filtering ────────────────────────────────────────────────────────────\n\n getByType(type: JoopBeneficiaryType): JoopBeneficiary[] {\n return this.getAll().filter(b => b.type === type);\n }\n\n getByGroup(group: string): JoopBeneficiary[] {\n return this.getAll().filter(b => b.group === group);\n }\n\n getFavorites(): JoopBeneficiary[] {\n return this.getAll().filter(b => b.isFavorite);\n }\n\n getRecent(limit = 5): JoopBeneficiary[] {\n return this.getAll()\n .filter(b => b.lastUsedAt)\n .sort((a, b) => (b.lastUsedAt ?? 0) - (a.lastUsedAt ?? 0))\n .slice(0, limit);\n }\n\n getFrequent(limit = 5): JoopBeneficiary[] {\n return this.getAll()\n .sort((a, b) => b.useCount - a.useCount)\n .slice(0, limit);\n }\n\n search(query: string): JoopBeneficiary[] {\n const q = query.toLowerCase();\n return this.getAll().filter(b =>\n b.name.toLowerCase().includes(q) ||\n b.nickname?.toLowerCase().includes(q) ||\n b.accountNumber?.includes(q) ||\n b.iban?.toLowerCase().includes(q) ||\n b.upiId?.toLowerCase().includes(q) ||\n b.mobile?.includes(q) ||\n b.bankName?.toLowerCase().includes(q),\n );\n }\n\n // ── Actions ───────────────────────────────────────────────────────────────\n\n toggleFavorite(id: string): JoopBeneficiary {\n const b = this._get(id);\n return this.update(id, { isFavorite: !b.isFavorite });\n }\n\n verify(id: string): JoopBeneficiary {\n return this.update(id, { isVerified: true });\n }\n\n markUsed(id: string): void {\n const b = this._get(id);\n this.update(id, { lastUsedAt: Date.now(), useCount: b.useCount + 1 });\n }\n\n // ── Meta ──────────────────────────────────────────────────────────────────\n\n getGroups(): string[] {\n return [...new Set(this.getAll().map(b => b.group).filter(Boolean) as string[])].sort();\n }\n\n count(): number { return this._beneficiaries.size; }\n\n // ── Validation ────────────────────────────────────────────────────────────\n\n validate(b: Partial<JoopBeneficiary>): JoopBeneficiaryValidation {\n const errors: string[] = [];\n if (!b.name?.trim()) errors.push('name is required');\n if (!b.type) errors.push('type is required');\n\n if (b.type === 'domestic' || b.type === 'international') {\n if (!b.accountNumber && !b.iban) errors.push('accountNumber or iban required for bank transfers');\n }\n if (b.type === 'upi') {\n if (!b.upiId) errors.push('upiId required for UPI beneficiaries');\n else if (!/^[\\w.\\-]+@[\\w]+$/.test(b.upiId)) errors.push('upiId format invalid (expected user@bank)');\n }\n if (b.type === 'mobile') {\n if (!b.mobile) errors.push('mobile required for mobile transfers');\n }\n if (b.iban && !/^[A-Z]{2}\\d{2}[A-Z0-9]{4,}$/.test(b.iban.replace(/\\s/g, ''))) {\n errors.push('IBAN format invalid');\n }\n\n return { valid: errors.length === 0, errors };\n }\n\n // ── Observable ───────────────────────────────────────────────────────────\n\n beneficiaries$() { return this._list$.asObservable(); }\n\n // ── Internals ─────────────────────────────────────────────────────────────\n\n private _get(id: string): JoopBeneficiary {\n const b = this._beneficiaries.get(id);\n if (!b) throw new Error(`Beneficiary '${id}' not found`);\n return b;\n }\n\n private _emit(): void {\n this._list$.next(this.getAll());\n }\n}\n\nfunction _uid(): string { return `${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`; }\n","import { JoopBehaviorSubject, JoopSubject } from '../events';\n\nexport type JoopRecurrenceFrequency = 'once' | 'daily' | 'weekly' | 'biweekly' | 'monthly' | 'quarterly' | 'annually';\nexport type JoopScheduledPaymentStatus = 'active' | 'paused' | 'completed' | 'cancelled' | 'failed';\n\nexport interface JoopScheduledPayment {\n id: string;\n name: string;\n fromAccount: string;\n toAccount: string;\n beneficiaryId?: string;\n amount: number;\n currency: string;\n frequency: JoopRecurrenceFrequency;\n startDate: number;\n endDate?: number;\n nextExecutionDate: number;\n lastExecutionDate?: number;\n executionCount: number;\n maxExecutions?: number;\n status: JoopScheduledPaymentStatus;\n reference?: string;\n description?: string;\n createdAt: number;\n updatedAt: number;\n}\n\nexport interface JoopPaymentExecution {\n id: string;\n paymentId: string;\n executedAt: number;\n amount: number;\n currency: string;\n status: 'success' | 'failed';\n reference: string;\n error?: string;\n}\n\nconst MS: Record<JoopRecurrenceFrequency, number | null> = {\n once: null,\n daily: 86_400_000,\n weekly: 7 * 86_400_000,\n biweekly: 14 * 86_400_000,\n monthly: null, // computed via Date logic\n quarterly: null,\n annually: null,\n};\n\nexport class JoopScheduledPaymentService {\n private _payments = new Map<string, JoopScheduledPayment>();\n private _executions: JoopPaymentExecution[] = [];\n private _payments$ = new JoopBehaviorSubject<JoopScheduledPayment[]>([]);\n private _due$ = new JoopSubject<JoopScheduledPayment>();\n\n // ── Schedule ──────────────────────────────────────────────────────────────\n\n schedule(data: Omit<JoopScheduledPayment, 'id' | 'nextExecutionDate' | 'executionCount' | 'createdAt' | 'updatedAt' | 'status'>): JoopScheduledPayment {\n const p: JoopScheduledPayment = {\n ...data,\n id: _uid(),\n nextExecutionDate: data.startDate,\n executionCount: 0,\n status: 'active',\n createdAt: Date.now(),\n updatedAt: Date.now(),\n };\n this._payments.set(p.id, p);\n this._emit();\n return { ...p };\n }\n\n update(id: string, patch: Partial<Omit<JoopScheduledPayment, 'id' | 'createdAt'>>): JoopScheduledPayment {\n const p = this._get(id);\n const updated = { ...p, ...patch, updatedAt: Date.now() };\n this._payments.set(id, updated);\n this._emit();\n return { ...updated };\n }\n\n cancel(id: string): void { this.update(id, { status: 'cancelled' }); }\n pause(id: string): void { this.update(id, { status: 'paused' }); }\n resume(id: string): void { this.update(id, { status: 'active' }); }\n\n // ── Query ─────────────────────────────────────────────────────────────────\n\n get(id: string): JoopScheduledPayment | undefined {\n const p = this._payments.get(id);\n return p ? { ...p } : undefined;\n }\n\n getAll(): JoopScheduledPayment[] {\n return Array.from(this._payments.values()).map(p => ({ ...p }));\n }\n\n getActive(): JoopScheduledPayment[] {\n return this.getAll().filter(p => p.status === 'active');\n }\n\n getDue(asOf: Date = new Date()): JoopScheduledPayment[] {\n return this.getActive().filter(p => p.nextExecutionDate <= asOf.getTime());\n }\n\n getUpcoming(days = 30, asOf: Date = new Date()): JoopScheduledPayment[] {\n const cutoff = asOf.getTime() + days * 86_400_000;\n return this.getActive().filter(p => p.nextExecutionDate <= cutoff);\n }\n\n // ── Execution ────────────────────────────────────────────────────────────\n\n recordExecution(paymentId: string, status: 'success' | 'failed', error?: string): JoopPaymentExecution {\n const p = this._get(paymentId);\n const exec: JoopPaymentExecution = {\n id: _uid(),\n paymentId,\n executedAt: Date.now(),\n amount: p.amount,\n currency: p.currency,\n status,\n reference: `REF${Date.now().toString(36).toUpperCase()}`,\n error,\n };\n this._executions.push(exec);\n\n p.executionCount++;\n p.lastExecutionDate = exec.executedAt;\n\n if (status === 'failed') {\n p.status = 'failed';\n } else if (p.frequency === 'once' || (p.maxExecutions && p.executionCount >= p.maxExecutions)) {\n p.status = 'completed';\n } else {\n p.nextExecutionDate = this.computeNextDate(p.nextExecutionDate, p.frequency);\n if (p.endDate && p.nextExecutionDate > p.endDate) p.status = 'completed';\n }\n\n this._payments.set(paymentId, p);\n this._emit();\n return exec;\n }\n\n getExecutionHistory(paymentId: string): JoopPaymentExecution[] {\n return this._executions.filter(e => e.paymentId === paymentId);\n }\n\n // ── Date computation ──────────────────────────────────────────────────────\n\n computeNextDate(current: number, frequency: JoopRecurrenceFrequency): number {\n const ms = MS[frequency];\n if (ms !== null && ms !== undefined) return current + ms;\n\n const d = new Date(current);\n switch (frequency) {\n case 'monthly':\n d.setMonth(d.getMonth() + 1);\n break;\n case 'quarterly':\n d.setMonth(d.getMonth() + 3);\n break;\n case 'annually':\n d.setFullYear(d.getFullYear() + 1);\n break;\n case 'once':\n return current;\n }\n return d.getTime();\n }\n\n getSchedulePreview(startDate: number, frequency: JoopRecurrenceFrequency, count = 5, endDate?: number): number[] {\n const dates: number[] = [];\n let next = startDate;\n while (dates.length < count) {\n if (endDate && next > endDate) break;\n dates.push(next);\n if (frequency === 'once') break;\n next = this.computeNextDate(next, frequency);\n }\n return dates;\n }\n\n // ── Observables ───────────────────────────────────────────────────────────\n\n payments$() { return this._payments$.asObservable(); }\n due$() { return this._due$.asObservable(); }\n\n // ── Internals ─────────────────────────────────────────────────────────────\n\n private _get(id: string): JoopScheduledPayment {\n const p = this._payments.get(id);\n if (!p) throw new Error(`Scheduled payment '${id}' not found`);\n return p;\n }\n\n private _emit(): void { this._payments$.next(this.getAll()); }\n}\n\nfunction _uid(): string { return `${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`; }\n","import { JoopBehaviorSubject } from '../events';\n\nexport type JoopCardStatus = 'active' | 'frozen' | 'blocked' | 'expired' | 'pending';\nexport type JoopCardType = 'physical' | 'virtual';\nexport type JoopManagedCardNetwork = 'visa' | 'mastercard' | 'amex' | 'discover' | 'unknown';\n\nexport interface JoopCardSpendingLimits {\n daily?: number;\n weekly?: number;\n monthly?: number;\n perTransaction?: number;\n}\n\nexport interface JoopCardControls {\n onlinePayments: boolean;\n internationalPayments: boolean;\n contactlessPayments: boolean;\n atmWithdrawals: boolean;\n ecommercePayments: boolean;\n}\n\nexport interface JoopManagedCard {\n id: string;\n cardNumber: string; // masked, e.g. **** **** **** 1234\n last4: string;\n network: JoopManagedCardNetwork;\n type: JoopCardType;\n holderName: string;\n expiryMonth: number; // 1-12\n expiryYear: number; // full year, e.g. 2027\n status: JoopCardStatus;\n accountId: string;\n spendingLimits: JoopCardSpendingLimits;\n controls: JoopCardControls;\n currency?: string;\n createdAt: number;\n updatedAt: number;\n frozenAt?: number;\n frozenReason?: string;\n blockedAt?: number;\n}\n\nexport interface JoopCardTransactionCheck {\n allowed: boolean;\n reason?: string;\n}\n\nconst DEFAULT_CONTROLS: JoopCardControls = {\n onlinePayments: true,\n internationalPayments: false,\n contactlessPayments: true,\n atmWithdrawals: true,\n ecommercePayments: true,\n};\n\nexport class JoopCardManagementService {\n private _cards = new Map<string, JoopManagedCard>();\n private _cards$ = new JoopBehaviorSubject<JoopManagedCard[]>([]);\n\n // ── CRUD ─────────────────────────────────────────────────────────────────\n\n add(data: Omit<JoopManagedCard, 'id' | 'createdAt' | 'updatedAt'>): JoopManagedCard {\n const card: JoopManagedCard = { ...data, id: _uid(), createdAt: Date.now(), updatedAt: Date.now() };\n this._cards.set(card.id, card);\n this._emit();\n return { ...card };\n }\n\n get(id: string): JoopManagedCard | undefined {\n const c = this._cards.get(id);\n return c ? { ...c } : undefined;\n }\n\n getAll(): JoopManagedCard[] {\n return Array.from(this._cards.values()).map(c => ({ ...c }));\n }\n\n getByAccount(accountId: string): JoopManagedCard[] {\n return this.getAll().filter(c => c.accountId === accountId);\n }\n\n getActive(): JoopManagedCard[] {\n return this.getAll().filter(c => c.status === 'active');\n }\n\n remove(id: string): void {\n this._cards.delete(id);\n this._emit();\n }\n\n // ── Card Controls ──────────────────────────────────────────────────────────\n\n freeze(id: string, reason?: string): JoopManagedCard {\n const c = this._require(id);\n if (c.status === 'blocked') throw new Error('Cannot freeze a blocked card');\n return this._update(id, { status: 'frozen', frozenAt: Date.now(), frozenReason: reason });\n }\n\n unfreeze(id: string): JoopManagedCard {\n const c = this._require(id);\n if (c.status !== 'frozen') throw new Error('Card is not frozen');\n return this._update(id, { status: 'active', frozenAt: undefined, frozenReason: undefined });\n }\n\n block(id: string): JoopManagedCard {\n return this._update(id, { status: 'blocked', blockedAt: Date.now() });\n }\n\n // ── Limits & Controls ─────────────────────────────────────────────────────\n\n setSpendingLimits(id: string, limits: JoopCardSpendingLimits): JoopManagedCard {\n const c = this._require(id);\n return this._update(id, { spendingLimits: { ...c.spendingLimits, ...limits } });\n }\n\n setControls(id: string, controls: Partial<JoopCardControls>): JoopManagedCard {\n const c = this._require(id);\n return this._update(id, { controls: { ...c.controls, ...controls } });\n }\n\n // ── Virtual Card ──────────────────────────────────────────────────────────\n\n generateVirtual(accountId: string, holderName: string, options: { expiryMonths?: number; currency?: string } = {}): JoopManagedCard {\n const expiryMonths = options.expiryMonths ?? 12;\n const now = new Date();\n const expiry = new Date(now.getFullYear(), now.getMonth() + expiryMonths, 1);\n const last4 = String(Math.floor(1000 + Math.random() * 9000));\n const bin = '4' + Array.from({ length: 11 }, () => Math.floor(Math.random() * 10)).join('');\n const cardNumber = `**** **** **** ${last4}`;\n\n return this.add({\n cardNumber,\n last4,\n network: 'visa',\n type: 'virtual',\n holderName: holderName.toUpperCase(),\n expiryMonth: expiry.getMonth() + 1,\n expiryYear: expiry.getFullYear(),\n status: 'active',\n accountId,\n currency: options.currency ?? 'USD',\n spendingLimits: {},\n controls: { ...DEFAULT_CONTROLS, internationalPayments: true },\n });\n }\n\n // ── Validation ────────────────────────────────────────────────────────────\n\n isExpired(id: string): boolean {\n const c = this._require(id);\n const now = new Date();\n const expiry = new Date(c.expiryYear, c.expiryMonth - 1, 1);\n return expiry <= new Date(now.getFullYear(), now.getMonth(), 1);\n }\n\n canTransact(id: string, amount: number, type: keyof Omit<JoopCardControls, 'ecommercePayments'> | 'ecommerce'): JoopCardTransactionCheck {\n const c = this._require(id);\n\n if (c.status !== 'active') return { allowed: false, reason: `Card is ${c.status}` };\n if (this.isExpired(id)) return { allowed: false, reason: 'Card is expired' };\n\n const controlMap: Record<string, keyof JoopCardControls> = {\n onlinePayments: 'onlinePayments',\n internationalPayments: 'internationalPayments',\n contactlessPayments: 'contactlessPayments',\n atmWithdrawals: 'atmWithdrawals',\n ecommerce: 'ecommercePayments',\n };\n const controlKey = controlMap[type];\n if (controlKey && !c.controls[controlKey]) return { allowed: false, reason: `${type} is disabled on this card` };\n\n if (c.spendingLimits.perTransaction && amount > c.spendingLimits.perTransaction) {\n return { allowed: false, reason: `Amount exceeds per-transaction limit of ${c.spendingLimits.perTransaction}` };\n }\n\n return { allowed: true };\n }\n\n validatePin(pin: string): boolean {\n return /^\\d{4,6}$/.test(pin);\n }\n\n // ── Observables ───────────────────────────────────────────────────────────\n\n cards$() { return this._cards$.asObservable(); }\n\n // ── Internals ─────────────────────────────────────────────────────────────\n\n private _require(id: string): JoopManagedCard {\n const c = this._cards.get(id);\n if (!c) throw new Error(`Card '${id}' not found`);\n return c;\n }\n\n private _update(id: string, patch: Partial<JoopManagedCard>): JoopManagedCard {\n const c = this._require(id);\n const updated = { ...c, ...patch, updatedAt: Date.now() };\n this._cards.set(id, updated);\n this._emit();\n return { ...updated };\n }\n\n private _emit(): void {\n this._cards$.next(this.getAll());\n }\n}\n\nfunction _uid(): string { return `${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`; }\n","export type JoopStatementFormat = 'text' | 'csv' | 'html';\nexport type JoopTransactionType = 'credit' | 'debit';\n\nexport interface JoopStatementTransaction {\n id: string;\n date: number;\n description: string;\n type: JoopTransactionType;\n amount: number;\n currency: string;\n reference?: string;\n category?: string;\n}\n\nexport interface JoopStatementEntry extends JoopStatementTransaction {\n runningBalance: number;\n}\n\nexport interface JoopStatementOptions {\n accountId: string;\n accountName?: string;\n accountNumber?: string;\n currency: string;\n openingBalance: number;\n fromDate: number;\n toDate: number;\n transactions: JoopStatementTransaction[];\n}\n\nexport interface JoopStatement {\n accountId: string;\n accountName: string;\n accountNumber: string;\n currency: string;\n fromDate: number;\n toDate: number;\n openingBalance: number;\n closingBalance: number;\n totalCredits: number;\n totalDebits: number;\n transactionCount: number;\n entries: JoopStatementEntry[];\n generatedAt: number;\n}\n\nexport class JoopStatementGeneratorService {\n\n generate(options: JoopStatementOptions): JoopStatement {\n const sorted = [...options.transactions]\n .filter(t => t.date >= options.fromDate && t.date <= options.toDate)\n .sort((a, b) => a.date - b.date);\n\n let balance = options.openingBalance;\n let totalCredits = 0;\n let totalDebits = 0;\n\n const entries: JoopStatementEntry[] = sorted.map(tx => {\n if (tx.type === 'credit') {\n balance += tx.amount;\n totalCredits += tx.amount;\n } else {\n balance -= tx.amount;\n totalDebits += tx.amount;\n }\n return { ...tx, runningBalance: parseFloat(balance.toFixed(2)) };\n });\n\n return {\n accountId: options.accountId,\n accountName: options.accountName ?? '',\n accountNumber: options.accountNumber ?? '',\n currency: options.currency,\n fromDate: options.fromDate,\n toDate: options.toDate,\n openingBalance: options.openingBalance,\n closingBalance: parseFloat(balance.toFixed(2)),\n totalCredits: parseFloat(totalCredits.toFixed(2)),\n totalDebits: parseFloat(totalDebits.toFixed(2)),\n transactionCount: entries.length,\n entries,\n generatedAt: Date.now(),\n };\n }\n\n render(statement: JoopStatement, format: JoopStatementFormat = 'text'): string {\n switch (format) {\n case 'csv': return this._renderCsv(statement);\n case 'html': return this._renderHtml(statement);\n default: return this._renderText(statement);\n }\n }\n\n // ── Summary ────────────────────────────────────────────────────────────────\n\n getSummary(statement: JoopStatement): Record<string, number> {\n const summary: Record<string, number> = {};\n for (const entry of statement.entries) {\n const cat = entry.category ?? 'Uncategorized';\n summary[cat] = (summary[cat] ?? 0) + entry.amount;\n }\n return summary;\n }\n\n getTopCategories(statement: JoopStatement, limit = 5): Array<{ category: string; total: number }> {\n const summary = this.getSummary(statement);\n return Object.entries(summary)\n .sort(([, a], [, b]) => b - a)\n .slice(0, limit)\n .map(([category, total]) => ({ category, total: parseFloat(total.toFixed(2)) }));\n }\n\n // ── Renderers ─────────────────────────────────────────────────────────────\n\n private _renderText(s: JoopStatement): string {\n const lines: string[] = [];\n const sep = '─'.repeat(70);\n const fmt = (n: number) => `${s.currency} ${n.toFixed(2)}`;\n const fmtDate = (ms: number) => new Date(ms).toISOString().slice(0, 10);\n\n lines.push(sep);\n lines.push(`ACCOUNT STATEMENT`);\n lines.push(`Account: ${s.accountName} (${s.accountNumber})`);\n lines.push(`Period: ${fmtDate(s.fromDate)} to ${fmtDate(s.toDate)}`);\n lines.push(`Generated: ${new Date(s.generatedAt).toISOString()}`);\n lines.push(sep);\n lines.push(`Opening Balance: ${fmt(s.openingBalance)}`);\n lines.push('');\n lines.push(`${'Date'.padEnd(12)}${'Description'.padEnd(32)}${'Debit'.padStart(12)}${'Credit'.padStart(12)}${'Balance'.padStart(14)}`);\n lines.push('─'.repeat(70));\n\n for (const e of s.entries) {\n const d = e.type === 'debit' ? e.amount.toFixed(2) : '';\n const c = e.type === 'credit' ? e.amount.toFixed(2) : '';\n lines.push(`${fmtDate(e.date).padEnd(12)}${e.description.slice(0, 30).padEnd(32)}${d.padStart(12)}${c.padStart(12)}${e.runningBalance.toFixed(2).padStart(14)}`);\n }\n\n lines.push('─'.repeat(70));\n lines.push(`${''.padEnd(44)}${'Total Debits:'.padStart(12)} ${fmt(s.totalDebits)}`);\n lines.push(`${''.padEnd(44)}${'Total Credits:'.padStart(12)} ${fmt(s.totalCredits)}`);\n lines.push(`${''.padEnd(44)}${'Closing Balance:'.padStart(12)} ${fmt(s.closingBalance)}`);\n lines.push(sep);\n\n return lines.join('\\n');\n }\n\n private _renderCsv(s: JoopStatement): string {\n const fmtDate = (ms: number) => new Date(ms).toISOString().slice(0, 10);\n const rows: string[] = [\n `Account ID,${s.accountId}`,\n `Account Name,${s.accountName}`,\n `Account Number,${s.accountNumber}`,\n `Currency,${s.currency}`,\n `Period,${fmtDate(s.fromDate)} to ${fmtDate(s.toDate)}`,\n `Opening Balance,${s.openingBalance}`,\n `Closing Balance,${s.closingBalance}`,\n '',\n 'Date,Description,Type,Amount,Currency,Reference,Category,Running Balance',\n ...s.entries.map(e =>\n [fmtDate(e.date), _csvEscape(e.description), e.type, e.amount, e.currency, e.reference ?? '', e.category ?? '', e.runningBalance].join(',')\n ),\n ];\n return rows.join('\\n');\n }\n\n private _renderHtml(s: JoopStatement): string {\n const fmtDate = (ms: number) => new Date(ms).toISOString().slice(0, 10);\n const fmt = (n: number) => `${s.currency} ${n.toFixed(2)}`;\n\n const rows = s.entries.map(e => `\n <tr>\n <td>${fmtDate(e.date)}</td>\n <td>${_htmlEscape(e.description)}</td>\n <td>${e.type === 'debit' ? fmt(e.amount) : ''}</td>\n <td>${e.type === 'credit' ? fmt(e.amount) : ''}</td>\n <td>${fmt(e.runningBalance)}</td>\n <td>${e.category ?? ''}</td>\n </tr>`).join('');\n\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head><meta charset=\"UTF-8\"><title>Account Statement</title>\n<style>\n body { font-family: Arial, sans-serif; font-size: 13px; margin: 20px; }\n h2 { margin-bottom: 4px; }\n .meta { color: #555; margin-bottom: 16px; }\n table { width: 100%; border-collapse: collapse; }\n th, td { padding: 6px 10px; border: 1px solid #ddd; text-align: left; }\n th { background: #f5f5f5; font-weight: 600; }\n .summary { margin-top: 16px; font-weight: bold; }\n tr:nth-child(even) { background: #fafafa; }\n</style>\n</head>\n<body>\n<h2>Account Statement</h2>\n<div class=\"meta\">\n <div>Account: ${_htmlEscape(s.accountName)} (${_htmlEscape(s.accountNumber)})</div>\n <div>Period: ${fmtDate(s.fromDate)} to ${fmtDate(s.toDate)}</div>\n <div>Generated: ${new Date(s.generatedAt).toISOString()}</div>\n</div>\n<table>\n <thead>\n <tr><th>Date</th><th>Description</th><th>Debit</th><th>Credit</th><th>Balance</th><th>Category</th></tr>\n </thead>\n <tbody>\n <tr><td colspan=\"4\"><strong>Opening Balance</strong></td><td><strong>${fmt(s.openingBalance)}</strong></td><td></td></tr>\n ${rows}\n <tr class=\"summary\">\n <td colspan=\"2\">Totals</td>\n <td>${fmt(s.totalDebits)}</td>\n <td>${fmt(s.totalCredits)}</td>\n <td>${fmt(s.closingBalance)}</td>\n <td></td>\n </tr>\n </tbody>\n</table>\n</body>\n</html>`;\n }\n}\n\nfunction _csvEscape(v: string): string {\n if (v.includes(',') || v.includes('\"') || v.includes('\\n')) return `\"${v.replace(/\"/g, '\"\"')}\"`;\n return v;\n}\n\nfunction _htmlEscape(v: string): string {\n return v.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/\"/g, '"');\n}\n","import { JoopBehaviorSubject } from '../events';\n\nexport type JoopNotificationType = 'info' | 'success' | 'warning' | 'error' | 'transfer' | 'security' | 'promo' | 'system';\nexport type JoopNotificationPriority = 'low' | 'normal' | 'high' | 'urgent';\n\nexport interface JoopNotification {\n id: string;\n type: JoopNotificationType;\n title: string;\n body: string;\n priority: JoopNotificationPriority;\n category?: string;\n imageUrl?: string;\n actionUrl?: string;\n actionLabel?: string;\n metadata?: Record<string, unknown>;\n isRead: boolean;\n isDismissed: boolean;\n createdAt: number;\n readAt?: number;\n expiresAt?: number;\n}\n\nexport interface JoopNotificationSummary {\n total: number;\n unread: number;\n byType: Record<JoopNotificationType, number>;\n byPriority: Record<JoopNotificationPriority, number>;\n}\n\nexport class JoopNotificationCenterService {\n private _notifications: JoopNotification[] = [];\n private _notifications$ = new JoopBehaviorSubject<JoopNotification[]>([]);\n private _maxItems: number;\n\n constructor(maxItems = 500) {\n this._maxItems = maxItems;\n }\n\n // ── Add ───────────────────────────────────────────────────────────────────\n\n add(data: Omit<JoopNotification, 'id' | 'isRead' | 'isDismissed' | 'createdAt'>): JoopNotification {\n const n: JoopNotification = {\n ...data,\n id: _uid(),\n isRead: false,\n isDismissed: false,\n createdAt: Date.now(),\n };\n this._notifications.unshift(n); // newest first\n if (this._notifications.length > this._maxItems) this._notifications.pop();\n this._emit();\n return { ...n };\n }\n\n // ── Read ──────────────────────────────────────────────────────────────────\n\n get(id: string): JoopNotification | undefined {\n return this._notifications.find(n => n.id === id);\n }\n\n getAll(includeExpired = false): JoopNotification[] {\n const now = Date.now();\n return this._notifications\n .filter(n => !n.isDismissed && (includeExpired || !n.expiresAt || n.expiresAt > now))\n .map(n => ({ ...n }));\n }\n\n getUnread(): JoopNotification[] {\n return this.getAll().filter(n => !n.isRead);\n }\n\n getByType(type: JoopNotificationType): JoopNotification[] {\n return this.getAll().filter(n => n.type === type);\n }\n\n getByCategory(category: string): JoopNotification[] {\n return this.getAll().filter(n => n.category === category);\n }\n\n getByPriority(priority: JoopNotificationPriority): JoopNotification[] {\n return this.getAll().filter(n => n.priority === priority);\n }\n\n // ── Mark read ─────────────────────────────────────────────────────────────\n\n markRead(id: string): void {\n const n = this._notifications.find(n => n.id === id);\n if (!n || n.isRead) return;\n n.isRead = true;\n n.readAt = Date.now();\n this._emit();\n }\n\n markAllRead(): void {\n const now = Date.now();\n let changed = false;\n for (const n of this._notifications) {\n if (!n.isRead) { n.isRead = true; n.readAt = now; changed = true; }\n }\n if (changed) this._emit();\n }\n\n // ── Dismiss ───────────────────────────────────────────────────────────────\n\n dismiss(id: string): void {\n const n = this._notifications.find(n => n.id === id);\n if (!n || n.isDismissed) return;\n n.isDismissed = true;\n this._emit();\n }\n\n dismissAll(): void {\n let changed = false;\n for (const n of this._notifications) {\n if (!n.isDismissed) { n.isDismissed = true; changed = true; }\n }\n if (changed) this._emit();\n }\n\n // ── Counts ────────────────────────────────────────────────────────────────\n\n unreadCount(): number { return this.getUnread().length; }\n\n getSummary(): JoopNotificationSummary {\n const all = this.getAll();\n const byType = {} as Record<JoopNotificationType, number>;\n const byPriority = {} as Record<JoopNotificationPriority, number>;\n\n for (const n of all) {\n byType[n.type] = (byType[n.type] ?? 0) + 1;\n byPriority[n.priority] = (byPriority[n.priority] ?? 0) + 1;\n }\n\n return { total: all.length, unread: this.unreadCount(), byType, byPriority };\n }\n\n // ── Cleanup ───────────────────────────────────────────────────────────────\n\n purgeExpired(): number {\n const before = this._notifications.length;\n const now = Date.now();\n this._notifications = this._notifications.filter(n => !n.expiresAt || n.expiresAt > now);\n const removed = before - this._notifications.length;\n if (removed > 0) this._emit();\n return removed;\n }\n\n clear(): void {\n this._notifications = [];\n this._emit();\n }\n\n // ── Observable ───────────────────────────────────────────────────────────\n\n notifications$() { return this._notifications$.asObservable(); }\n\n // ── Internals ─────────────────────────────────────────────────────────────\n\n private _emit(): void { this._notifications$.next(this.getAll()); }\n}\n\nfunction _uid(): string { return `${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`; }\n","import { JoopBehaviorSubject } from '../events';\n\nexport type JoopDisputeStatus = 'open' | 'under-review' | 'resolved' | 'rejected' | 'escalated' | 'closed';\nexport type JoopDisputeReason =\n | 'unauthorized-transaction'\n | 'duplicate-charge'\n | 'goods-not-received'\n | 'goods-not-as-described'\n | 'amount-mismatch'\n | 'cancelled-subscription'\n | 'atm-withdrawal-discrepancy'\n | 'other';\n\nexport interface JoopDisputeEvidence {\n id: string;\n type: 'screenshot' | 'receipt' | 'email' | 'document' | 'photo' | 'other';\n name: string;\n url?: string;\n base64?: string;\n uploadedAt: number;\n}\n\nexport interface JoopDispute {\n id: string;\n referenceNumber: string;\n transactionId?: string;\n transactionDate?: number;\n amount: number;\n currency: string;\n merchantName?: string;\n reason: JoopDisputeReason;\n description: string;\n status: JoopDisputeStatus;\n evidence: JoopDisputeEvidence[];\n resolution?: string;\n rejectionReason?: string;\n escalationReason?: string;\n assignedTo?: string;\n createdAt: number;\n updatedAt: number;\n resolvedAt?: number;\n}\n\nexport interface JoopDisputeStats {\n total: number;\n open: number;\n underReview: number;\n resolved: number;\n rejected: number;\n escalated: number;\n totalAmount: number;\n}\n\nexport class JoopDisputeService {\n private _disputes = new Map<string, JoopDispute>();\n private _disputes$ = new JoopBehaviorSubject<JoopDispute[]>([]);\n private _counter = 1;\n\n // ── CRUD ─────────────────────────────────────────────────────────────────\n\n create(data: Omit<JoopDispute, 'id' | 'referenceNumber' | 'status' | 'evidence' | 'createdAt' | 'updatedAt'>): JoopDispute {\n const dispute: JoopDispute = {\n ...data,\n id: _uid(),\n referenceNumber: this._generateRef(),\n status: 'open',\n evidence: [],\n createdAt: Date.now(),\n updatedAt: Date.now(),\n };\n this._disputes.set(dispute.id, dispute);\n this._emit();\n return { ...dispute };\n }\n\n update(id: string, patch: Partial<Pick<JoopDispute, 'description' | 'reason' | 'merchantName' | 'assignedTo'>>): JoopDispute {\n const d = this._require(id);\n Object.assign(d, patch, { updatedAt: Date.now() });\n this._emit();\n return { ...d };\n }\n\n get(id: string): JoopDispute | undefined {\n const d = this._disputes.get(id);\n return d ? { ...d, evidence: [...d.evidence] } : undefined;\n }\n\n getByRef(ref: string): JoopDispute | undefined {\n const d = Array.from(this._disputes.values()).find(d => d.referenceNumber === ref);\n return d ? { ...d } : undefined;\n }\n\n getAll(): JoopDispute[] {\n return Array.from(this._disputes.values()).map(d => ({ ...d, evidence: [...d.evidence] }));\n }\n\n getByStatus(status: JoopDisputeStatus): JoopDispute[] {\n return this.getAll().filter(d => d.status === status);\n }\n\n // ── Lifecycle ────────────────────────────────────────────────────────────\n\n startReview(id: string, assignedTo?: string): JoopDispute {\n return this._transition(id, 'under-review', d => { if (assignedTo) d.assignedTo = assignedTo; });\n }\n\n resolve(id: string, resolution: string): JoopDispute {\n return this._transition(id, 'resolved', d => { d.resolution = resolution; d.resolvedAt = Date.now(); });\n }\n\n reject(id: string, reason: string): JoopDispute {\n return this._transition(id, 'rejected', d => { d.rejectionReason = reason; d.resolvedAt = Date.now(); });\n }\n\n escalate(id: string, reason: string): JoopDispute {\n return this._transition(id, 'escalated', d => { d.escalationReason = reason; });\n }\n\n close(id: string): JoopDispute {\n return this._transition(id, 'closed');\n }\n\n // ── Evidence ─────────────────────────────────────────────────────────────\n\n addEvidence(disputeId: string, evidence: Omit<JoopDisputeEvidence, 'id' | 'uploadedAt'>): JoopDisputeEvidence {\n const d = this._require(disputeId);\n if (d.status === 'resolved' || d.status === 'rejected' || d.status === 'closed') {\n throw new Error(`Cannot add evidence to a ${d.status} dispute`);\n }\n const e: JoopDisputeEvidence = { ...evidence, id: _uid(), uploadedAt: Date.now() };\n d.evidence.push(e);\n d.updatedAt = Date.now();\n this._emit();\n return { ...e };\n }\n\n removeEvidence(disputeId: string, evidenceId: string): void {\n const d = this._require(disputeId);\n const before = d.evidence.length;\n d.evidence = d.evidence.filter(e => e.id !== evidenceId);\n if (d.evidence.length < before) { d.updatedAt = Date.now(); this._emit(); }\n }\n\n // ── Stats ────────────────────────────────────────────────────────────────\n\n getStats(): JoopDisputeStats {\n const all = this.getAll();\n return {\n total: all.length,\n open: all.filter(d => d.status === 'open').length,\n underReview: all.filter(d => d.status === 'under-review').length,\n resolved: all.filter(d => d.status === 'resolved').length,\n rejected: all.filter(d => d.status === 'rejected').length,\n escalated: all.filter(d => d.status === 'escalated').length,\n totalAmount: all.reduce((s, d) => s + d.amount, 0),\n };\n }\n\n // ── Observable ───────────────────────────────────────────────────────────\n\n disputes$() { return this._disputes$.asObservable(); }\n\n // ── Internals ────────────────────────────────────────────────────────────\n\n private _require(id: string): JoopDispute {\n const d = this._disputes.get(id);\n if (!d) throw new Error(`Dispute '${id}' not found`);\n return d;\n }\n\n private _transition(id: string, status: JoopDisputeStatus, mutate?: (d: JoopDispute) => void): JoopDispute {\n const d = this._require(id);\n d.status = status;\n d.updatedAt = Date.now();\n if (mutate) mutate(d);\n this._emit();\n return { ...d };\n }\n\n private _generateRef(): string {\n const n = String(this._counter++).padStart(6, '0');\n return `DSP-${new Date().getFullYear()}-${n}`;\n }\n\n private _emit(): void {\n this._disputes$.next(this.getAll());\n }\n}\n\nfunction _uid(): string { return `${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`; }\n","import { JoopBehaviorSubject } from '../events';\n\nexport type JoopBillerCategory =\n | 'electricity'\n | 'water'\n | 'gas'\n | 'internet'\n | 'mobile'\n | 'insurance'\n | 'tax'\n | 'subscription'\n | 'rent'\n | 'loan'\n | 'other';\n\nexport type JoopBillStatus = 'pending' | 'paid' | 'overdue' | 'cancelled';\nexport type JoopBillPaymentStatus = 'success' | 'failed' | 'pending' | 'reversed';\n\nexport interface JoopBiller {\n id: string;\n name: string;\n category: JoopBillerCategory;\n accountNumber?: string;\n reference?: string;\n currency: string;\n defaultAmount?: number;\n dueDayOfMonth?: number; // 1-28\n logoUrl?: string;\n notes?: string;\n isActive: boolean;\n createdAt: number;\n}\n\nexport interface JoopBill {\n id: string;\n billerId: string;\n billerName: string;\n amount: number;\n currency: string;\n dueDate: number;\n status: JoopBillStatus;\n reference?: string;\n createdAt: number;\n}\n\nexport interface JoopBillPayment {\n id: string;\n billerId: string;\n billId?: string;\n billerName: string;\n amount: number;\n currency: string;\n status: JoopBillPaymentStatus;\n reference: string;\n fromAccount?: string;\n paidAt: number;\n errorMessage?: string;\n}\n\nexport interface JoopBillPaymentSummary {\n totalPaidThisMonth: number;\n totalPaidThisYear: number;\n paymentCount: number;\n billerCount: number;\n currency: string;\n}\n\nexport class JoopBillPaymentService {\n private _billers = new Map<string, JoopBiller>();\n private _bills = new Map<string, JoopBill>();\n private _payments: JoopBillPayment[] = [];\n private _payments$ = new JoopBehaviorSubject<JoopBillPayment[]>([]);\n\n // ── Billers ───────────────────────────────────────────────────────────────\n\n addBiller(data: Omit<JoopBiller, 'id' | 'createdAt' | 'isActive'>): JoopBiller {\n const biller: JoopBiller = { ...data, id: _uid(), isActive: true, createdAt: Date.now() };\n this._billers.set(biller.id, biller);\n return { ...biller };\n }\n\n updateBiller(id: string, patch: Partial<Omit<JoopBiller, 'id' | 'createdAt'>>): JoopBiller {\n const b = this._requireBiller(id);\n Object.assign(b, patch);\n return { ...b };\n }\n\n removeBiller(id: string): void { this._billers.delete(id); }\n\n getBiller(id: string): JoopBiller | undefined {\n const b = this._billers.get(id);\n return b ? { ...b } : undefined;\n }\n\n getBillers(category?: JoopBillerCategory): JoopBiller[] {\n const all = Array.from(this._billers.values()).filter(b => b.isActive).map(b => ({ ...b }));\n return category ? all.filter(b => b.category === category) : all;\n }\n\n // ── Bills ─────────────────────────────────────────────────────────────────\n\n addBill(data: Omit<JoopBill, 'id' | 'createdAt' | 'status'>): JoopBill {\n const biller = this._billers.get(data.billerId);\n const bill: JoopBill = { ...data, id: _uid(), billerName: biller?.name ?? data.billerName, status: 'pending', createdAt: Date.now() };\n this._bills.set(bill.id, bill);\n return { ...bill };\n }\n\n getBills(billerId?: string): JoopBill[] {\n const all = Array.from(this._bills.values()).map(b => ({ ...b }));\n return billerId ? all.filter(b => b.billerId === billerId) : all;\n }\n\n getOverdueBills(asOf: number = Date.now()): JoopBill[] {\n return this.getBills().filter(b => b.status === 'pending' && b.dueDate < asOf);\n }\n\n getUpcomingBills(days = 7, asOf: number = Date.now()): JoopBill[] {\n const cutoff = asOf + days * 86_400_000;\n return this.getBills().filter(b => b.status === 'pending' && b.dueDate >= asOf && b.dueDate <= cutoff);\n }\n\n // ── Payments ─────────────────────────────────────────────────────────────\n\n pay(billerId: string, amount: number, options: { fromAccount?: string; billId?: string; reference?: string } = {}): JoopBillPayment {\n const biller = this._requireBiller(billerId);\n const payment: JoopBillPayment = {\n id: _uid(),\n billerId,\n billId: options.billId,\n billerName: biller.name,\n amount,\n currency: biller.currency,\n status: 'success',\n reference: options.reference ?? `PAY${Date.now().toString(36).toUpperCase()}`,\n fromAccount: options.fromAccount,\n paidAt: Date.now(),\n };\n this._payments.push(payment);\n\n // Mark bill as paid if billId given\n if (options.billId) {\n const bill = this._bills.get(options.billId);\n if (bill) bill.status = 'paid';\n }\n\n this._payments$.next([...this._payments]);\n return { ...payment };\n }\n\n getPaymentHistory(billerId?: string): JoopBillPayment[] {\n return billerId ? this._payments.filter(p => p.billerId === billerId).map(p => ({ ...p })) : this._payments.map(p => ({ ...p }));\n }\n\n // ── Summary ───────────────────────────────────────────────────────────────\n\n getSummary(): JoopBillPaymentSummary {\n const now = new Date();\n const monthStart = new Date(now.getFullYear(), now.getMonth(), 1).getTime();\n const yearStart = new Date(now.getFullYear(), 0, 1).getTime();\n const successful = this._payments.filter(p => p.status === 'success');\n\n return {\n totalPaidThisMonth: successful.filter(p => p.paidAt >= monthStart).reduce((s, p) => s + p.amount, 0),\n totalPaidThisYear: successful.filter(p => p.paidAt >= yearStart).reduce((s, p) => s + p.amount, 0),\n paymentCount: successful.length,\n billerCount: this._billers.size,\n currency: 'MIXED',\n };\n }\n\n // ── Observable ───────────────────────────────────────────────────────────\n\n payments$() { return this._payments$.asObservable(); }\n\n // ── Internals ────────────────────────────────────────────────────────────\n\n private _requireBiller(id: string): JoopBiller {\n const b = this._billers.get(id);\n if (!b) throw new Error(`Biller '${id}' not found`);\n return b;\n }\n}\n\nfunction _uid(): string { return `${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`; }\n","export type JoopPaymentUriScheme = 'upi' | 'bitcoin' | 'ethereum' | 'payto' | 'sepa' | 'generic';\n\nexport interface JoopUpiParams {\n pa: string; // payee VPA\n pn?: string; // payee name\n am?: number; // amount\n cu?: string; // currency (default INR)\n tn?: string; // transaction note\n tr?: string; // transaction reference\n mc?: string; // merchant code\n}\n\nexport interface JoopBitcoinParams {\n address: string;\n amount?: number; // BTC\n label?: string;\n message?: string;\n}\n\nexport interface JoopEthereumParams {\n address: string;\n value?: number; // ETH in wei or ETH depending on unit\n gas?: number;\n data?: string;\n}\n\nexport interface JoopPayToParams {\n payId: string; // PayID or BSB+account\n amount?: number;\n currency?: string;\n description?: string;\n}\n\nexport interface JoopSepaParams {\n iban: string;\n bic?: string;\n name?: string;\n amount?: number;\n currency?: string;\n reference?: string;\n purpose?: string;\n}\n\nexport interface JoopPaymentUri {\n scheme: JoopPaymentUriScheme;\n raw: string;\n isValid: boolean;\n errors: string[];\n upi?: JoopUpiParams;\n bitcoin?: JoopBitcoinParams;\n ethereum?: JoopEthereumParams;\n payto?: JoopPayToParams;\n sepa?: JoopSepaParams;\n generic?: { recipient?: string; amount?: number; currency?: string; reference?: string };\n}\n\nexport class JoopPaymentUriService {\n\n // ── Parse ─────────────────────────────────────────────────────────────────\n\n parse(uri: string): JoopPaymentUri {\n const raw = uri.trim();\n\n if (raw.toLowerCase().startsWith('upi://')) return this._parseUpi(raw);\n if (raw.toLowerCase().startsWith('bitcoin:')) return this._parseBitcoin(raw);\n if (raw.toLowerCase().startsWith('ethereum:')) return this._parseEthereum(raw);\n if (raw.toLowerCase().startsWith('payto:')) return this._parsePayTo(raw);\n if (raw.toLowerCase().startsWith('sepa:')) return this._parseSepa(raw);\n\n return { scheme: 'generic', raw, isValid: false, errors: [`Unknown URI scheme: \"${raw.split(':')[0]}\"`] };\n }\n\n // ── Generate ─────────────────────────────────────────────────────────────\n\n generateUpi(params: JoopUpiParams): string {\n if (!params.pa) throw new Error('pa (payee VPA) is required');\n const q = new URLSearchParams();\n q.set('pa', params.pa);\n if (params.pn) q.set('pn', params.pn);\n if (params.am !== undefined) q.set('am', String(params.am));\n if (params.cu) q.set('cu', params.cu);\n if (params.tn) q.set('tn', params.tn);\n if (params.tr) q.set('tr', params.tr);\n if (params.mc) q.set('mc', params.mc);\n return `upi://pay?${q.toString()}`;\n }\n\n generateBitcoin(params: JoopBitcoinParams): string {\n if (!params.address) throw new Error('address is required');\n const q = new URLSearchParams();\n if (params.amount !== undefined) q.set('amount', String(params.amount));\n if (params.label) q.set('label', params.label);\n if (params.message) q.set('message', params.message);\n const qs = q.toString();\n return `bitcoin:${params.address}${qs ? `?${qs}` : ''}`;\n }\n\n generateEthereum(params: JoopEthereumParams): string {\n if (!params.address) throw new Error('address is required');\n const q = new URLSearchParams();\n if (params.value !== undefined) q.set('value', String(params.value));\n if (params.gas !== undefined) q.set('gas', String(params.gas));\n if (params.data) q.set('data', params.data);\n const qs = q.toString();\n return `ethereum:${params.address}${qs ? `?${qs}` : ''}`;\n }\n\n generatePayTo(params: JoopPayToParams): string {\n const q = new URLSearchParams();\n if (params.amount !== undefined) q.set('amount', `${params.currency ?? 'AUD'}:${params.amount}`);\n if (params.description) q.set('message', params.description);\n const qs = q.toString();\n return `payto://${params.payId}${qs ? `?${qs}` : ''}`;\n }\n\n generateSepa(params: JoopSepaParams): string {\n const fields = [\n 'BCD', '002', '1', 'SCT',\n params.bic ?? '',\n params.name ?? '',\n params.iban,\n params.amount ? `${params.currency ?? 'EUR'}${params.amount.toFixed(2)}` : '',\n params.purpose ?? '',\n params.reference ?? '',\n ].join('\\n');\n return fields; // EPC QR code payload (not a URI scheme but standard for SEPA)\n }\n\n // ── Validate ─────────────────────────────────────────────────────────────\n\n isValid(uri: string): boolean { return this.parse(uri).isValid; }\n\n getScheme(uri: string): JoopPaymentUriScheme | null {\n const parsed = this.parse(uri);\n return parsed.isValid ? parsed.scheme : null;\n }\n\n // ── Parsers ──────────────────────────────────────────────────────────────\n\n private _parseUpi(raw: string): JoopPaymentUri {\n const errors: string[] = [];\n try {\n // upi://pay?pa=vpa&pn=Name&am=100&cu=INR\n const url = new URL(raw);\n if (url.pathname !== 'pay' && url.host !== 'pay') {\n const path = (url.pathname || url.host || '').replace(/^\\//, '');\n if (path && path !== 'pay') errors.push(`Unknown UPI action: ${path}`);\n }\n const pa = url.searchParams.get('pa');\n if (!pa) errors.push('pa (payee VPA) is required');\n else if (!/^[\\w.\\-+]+@[\\w]+$/.test(pa)) errors.push('Invalid VPA format');\n\n const am = url.searchParams.get('am');\n if (am && isNaN(Number(am))) errors.push('am (amount) must be a number');\n\n const params: JoopUpiParams = {\n pa: pa ?? '',\n pn: url.searchParams.get('pn') ?? undefined,\n am: am ? Number(am) : undefined,\n cu: url.searchParams.get('cu') ?? 'INR',\n tn: url.searchParams.get('tn') ?? undefined,\n tr: url.searchParams.get('tr') ?? undefined,\n mc: url.searchParams.get('mc') ?? undefined,\n };\n return { scheme: 'upi', raw, isValid: errors.length === 0, errors, upi: params };\n } catch (e) {\n return { scheme: 'upi', raw, isValid: false, errors: ['Invalid UPI URI'] };\n }\n }\n\n private _parseBitcoin(raw: string): JoopPaymentUri {\n const errors: string[] = [];\n const [addressPart, queryPart] = raw.slice('bitcoin:'.length).split('?');\n const address = addressPart.trim();\n if (!address) errors.push('Bitcoin address is required');\n else if (!/^(bc1|[13])[a-zA-Z0-9]{25,62}$/.test(address)) errors.push('Invalid Bitcoin address format');\n\n const q = queryPart ? new URLSearchParams(queryPart) : new URLSearchParams();\n const amount = q.get('amount') ? Number(q.get('amount')) : undefined;\n if (amount !== undefined && isNaN(amount)) errors.push('amount must be a number');\n\n const params: JoopBitcoinParams = { address, amount, label: q.get('label') ?? undefined, message: q.get('message') ?? undefined };\n return { scheme: 'bitcoin', raw, isValid: errors.length === 0, errors, bitcoin: params };\n }\n\n private _parseEthereum(raw: string): JoopPaymentUri {\n const errors: string[] = [];\n const [addressPart, queryPart] = raw.slice('ethereum:'.length).split('?');\n const address = addressPart.trim();\n if (!address) errors.push('Ethereum address is required');\n else if (!/^0x[0-9a-fA-F]{40}$/.test(address)) errors.push('Invalid Ethereum address (expected 0x + 40 hex chars)');\n\n const q = queryPart ? new URLSearchParams(queryPart) : new URLSearchParams();\n const value = q.get('value') ? Number(q.get('value')) : undefined;\n const params: JoopEthereumParams = { address, value, gas: q.get('gas') ? Number(q.get('gas')) : undefined, data: q.get('data') ?? undefined };\n return { scheme: 'ethereum', raw, isValid: errors.length === 0, errors, ethereum: params };\n }\n\n private _parsePayTo(raw: string): JoopPaymentUri {\n const errors: string[] = [];\n try {\n const url = new URL(raw);\n const payId = url.hostname + (url.pathname || '');\n if (!payId) errors.push('PayID is required');\n\n const amountParam = url.searchParams.get('amount');\n let amount: number | undefined;\n let currency: string | undefined;\n if (amountParam) {\n const match = amountParam.match(/^([A-Z]{3}):?([\\d.]+)$/);\n if (match) { currency = match[1]; amount = Number(match[2]); }\n else errors.push('amount format: CCY:amount (e.g. AUD:50.00)');\n }\n const params: JoopPayToParams = { payId, amount, currency, description: url.searchParams.get('message') ?? undefined };\n return { scheme: 'payto', raw, isValid: errors.length === 0, errors, payto: params };\n } catch {\n return { scheme: 'payto', raw, isValid: false, errors: ['Invalid PayTo URI'] };\n }\n }\n\n private _parseSepa(raw: string): JoopPaymentUri {\n const errors: string[] = [];\n // SEPA \"sepa:IBAN?name=X&amount=100¤cy=EUR&reference=Y\"\n const [ibanPart, queryPart] = raw.slice('sepa:'.length).split('?');\n const iban = ibanPart.trim().replace(/\\s/g, '');\n if (!iban) errors.push('IBAN is required');\n else if (!/^[A-Z]{2}\\d{2}[A-Z0-9]{11,30}$/.test(iban)) errors.push('Invalid IBAN format');\n\n const q = queryPart ? new URLSearchParams(queryPart) : new URLSearchParams();\n const amount = q.get('amount') ? Number(q.get('amount')) : undefined;\n const params: JoopSepaParams = {\n iban, bic: q.get('bic') ?? undefined, name: q.get('name') ?? undefined,\n amount, currency: q.get('currency') ?? 'EUR',\n reference: q.get('reference') ?? undefined, purpose: q.get('purpose') ?? undefined,\n };\n return { scheme: 'sepa', raw, isValid: errors.length === 0, errors, sepa: params };\n }\n}\n","import { JoopSubject } from '../events';\n\nexport type JoopMandateType = 'nach' | 'upi-autopay' | 'standing-instruction' | 'direct-debit';\nexport type JoopMandateStatus = 'pending' | 'active' | 'paused' | 'cancelled' | 'expired' | 'failed';\nexport type JoopMandateFrequency = 'daily' | 'weekly' | 'biweekly' | 'monthly' | 'quarterly' | 'half-yearly' | 'yearly' | 'as-presented';\nexport type JoopMandateExecutionStatus = 'success' | 'failed' | 'pending';\n\nexport interface JoopMandate {\n id: string;\n ref: string;\n type: JoopMandateType;\n status: JoopMandateStatus;\n accountId: string;\n payeeName: string;\n payeeRef: string;\n maxAmount: number;\n frequency: JoopMandateFrequency;\n startDate: number;\n endDate?: number;\n description?: string;\n executionCount: number;\n lastExecutedAt?: number;\n nextExecutionAt?: number;\n createdAt: number;\n updatedAt: number;\n}\n\nexport interface JoopMandateExecution {\n id: string;\n mandateId: string;\n amount: number;\n status: JoopMandateExecutionStatus;\n date: number;\n failureReason?: string;\n}\n\nexport class JoopMandateService {\n private _mandates = new Map<string, JoopMandate>();\n private _executions = new Map<string, JoopMandateExecution[]>();\n private _counter = 0;\n private _change$ = new JoopSubject<JoopMandate>();\n\n // ── CRUD ─────────────────────────────────────────────────────────────────\n\n create(data: {\n type: JoopMandateType;\n accountId: string;\n payeeName: string;\n payeeRef: string;\n maxAmount: number;\n frequency: JoopMandateFrequency;\n startDate: number;\n endDate?: number;\n description?: string;\n }): JoopMandate {\n if (data.maxAmount <= 0) throw new Error('maxAmount must be positive');\n const now = Date.now();\n const mandate: JoopMandate = {\n id: _uid(),\n ref: this._generateRef(),\n status: 'pending',\n executionCount: 0,\n createdAt: now,\n updatedAt: now,\n nextExecutionAt: this._computeNextDate({ frequency: data.frequency, startDate: data.startDate } as JoopMandate, data.startDate),\n ...data,\n };\n this._mandates.set(mandate.id, mandate);\n this._executions.set(mandate.id, []);\n return { ...mandate };\n }\n\n get(id: string): JoopMandate | undefined {\n const m = this._mandates.get(id);\n return m ? { ...m } : undefined;\n }\n\n getAll(): JoopMandate[] {\n return Array.from(this._mandates.values()).map(m => ({ ...m }));\n }\n\n // ── State transitions ─────────────────────────────────────────────────────\n\n activate(id: string): JoopMandate { return this._transition(id, 'active'); }\n cancel(id: string): JoopMandate { return this._transition(id, 'cancelled'); }\n pause(id: string): JoopMandate { return this._transition(id, 'paused', m => { if (m.status !== 'active') throw new Error('Only active mandates can be paused'); }); }\n resume(id: string): JoopMandate { return this._transition(id, 'active', m => { if (m.status !== 'paused') throw new Error('Only paused mandates can be resumed'); }); }\n fail(id: string): JoopMandate { return this._transition(id, 'failed'); }\n\n // ── Queries ───────────────────────────────────────────────────────────────\n\n getActive(): JoopMandate[] { return this._byStatus('active'); }\n\n getByAccount(accountId: string): JoopMandate[] {\n return this.getAll().filter(m => m.accountId === accountId);\n }\n\n getByStatus(status: JoopMandateStatus): JoopMandate[] { return this._byStatus(status); }\n\n getDue(asOf: number = Date.now()): JoopMandate[] {\n return this.getActive().filter(m => m.nextExecutionAt !== undefined && m.nextExecutionAt <= asOf && !this.isExpired(m));\n }\n\n isExpired(mandate: JoopMandate): boolean {\n return mandate.endDate !== undefined && Date.now() > mandate.endDate;\n }\n\n // ── Execution ─────────────────────────────────────────────────────────────\n\n recordExecution(mandateId: string, amount: number, status: JoopMandateExecutionStatus, failureReason?: string): JoopMandateExecution {\n const m = this._require(mandateId);\n if (amount > m.maxAmount) throw new Error(`Execution amount ${amount} exceeds mandate max ${m.maxAmount}`);\n\n const exec: JoopMandateExecution = { id: _uid(), mandateId, amount, status, date: Date.now(), failureReason };\n this._executions.get(mandateId)!.push(exec);\n\n if (status === 'success') {\n m.executionCount++;\n m.lastExecutedAt = exec.date;\n m.nextExecutionAt = this.computeNextDate(m, exec.date);\n }\n if (status === 'failed' && !failureReason) exec.failureReason = 'Unknown';\n m.updatedAt = Date.now();\n this._change$.next({ ...m });\n return { ...exec };\n }\n\n getExecutions(mandateId: string): JoopMandateExecution[] {\n return [...(this._executions.get(mandateId) ?? [])];\n }\n\n // ── Date computation ──────────────────────────────────────────────────────\n\n computeNextDate(mandate: JoopMandate, fromDate: number = Date.now()): number | undefined {\n return this._computeNextDate(mandate, fromDate);\n }\n\n // ── Observable ────────────────────────────────────────────────────────────\n\n change$() { return this._change$.asObservable(); }\n\n // ── Internals ─────────────────────────────────────────────────────────────\n\n private _require(id: string): JoopMandate {\n const m = this._mandates.get(id);\n if (!m) throw new Error(`Mandate '${id}' not found`);\n return m;\n }\n\n private _transition(id: string, status: JoopMandateStatus, validate?: (m: JoopMandate) => void): JoopMandate {\n const m = this._require(id);\n if (validate) validate(m);\n m.status = status;\n m.updatedAt = Date.now();\n this._change$.next({ ...m });\n return { ...m };\n }\n\n private _byStatus(status: JoopMandateStatus): JoopMandate[] {\n return this.getAll().filter(m => m.status === status);\n }\n\n private _computeNextDate(mandate: Pick<JoopMandate, 'frequency' | 'startDate'>, from: number): number | undefined {\n const d = new Date(from);\n switch (mandate.frequency) {\n case 'daily': d.setDate(d.getDate() + 1); break;\n case 'weekly': d.setDate(d.getDate() + 7); break;\n case 'biweekly': d.setDate(d.getDate() + 14); break;\n case 'monthly': d.setMonth(d.getMonth() + 1); break;\n case 'quarterly': d.setMonth(d.getMonth() + 3); break;\n case 'half-yearly': d.setMonth(d.getMonth() + 6); break;\n case 'yearly': d.setFullYear(d.getFullYear() + 1); break;\n case 'as-presented': return undefined;\n }\n return d.getTime();\n }\n\n private _generateRef(): string {\n this._counter++;\n return `MND-${new Date().getFullYear()}-${String(this._counter).padStart(6, '0')}`;\n }\n}\n\nfunction _uid(): string { return `${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`; }\n","import { JoopSubject } from '../events';\n\nexport type JoopSplitMethod = 'equal' | 'percentage' | 'exact' | 'shares';\nexport type JoopSplitStatus = 'open' | 'partial' | 'settled' | 'cancelled';\nexport type JoopSplitParticipantStatus = 'pending' | 'paid' | 'partial';\n\nexport interface JoopSplitParticipant {\n id: string;\n name: string;\n share: number; // amount owed\n paid: number; // amount paid so far\n status: JoopSplitParticipantStatus;\n}\n\nexport interface JoopSplitExpense {\n id: string;\n title: string;\n totalAmount: number;\n currency: string;\n paidBy: string; // name of person who fronted the expense\n method: JoopSplitMethod;\n participants: JoopSplitParticipant[];\n status: JoopSplitStatus;\n notes?: string;\n createdAt: number;\n settledAt?: number;\n}\n\nexport interface JoopSplitSettlement {\n from: string;\n to: string;\n amount: number;\n}\n\nexport interface JoopSplitBalance {\n name: string;\n owes: number; // total owed to others\n owed: number; // total others owe you\n net: number; // positive = you are owed, negative = you owe\n}\n\nexport class JoopSplitPaymentService {\n private _expenses = new Map<string, JoopSplitExpense>();\n private _change$ = new JoopSubject<JoopSplitExpense>();\n\n // ── Create ────────────────────────────────────────────────────────────────\n\n create(\n title: string,\n totalAmount: number,\n paidBy: string,\n participantNames: string[],\n options: {\n method?: JoopSplitMethod;\n currency?: string;\n notes?: string;\n amounts?: number[]; // for 'exact'\n percentages?: number[]; // for 'percentage'\n shares?: number[]; // for 'shares'\n } = {},\n ): JoopSplitExpense {\n if (totalAmount <= 0) throw new Error('totalAmount must be positive');\n if (participantNames.length === 0) throw new Error('At least one participant required');\n\n const method = options.method ?? 'equal';\n const shares = this._computeShares(totalAmount, participantNames.length, method, options);\n\n const participants: JoopSplitParticipant[] = participantNames.map((name, i) => ({\n id: _uid(), name, share: shares[i], paid: 0, status: 'pending',\n }));\n\n const expense: JoopSplitExpense = {\n id: _uid(), title, totalAmount, currency: options.currency ?? 'USD',\n paidBy, method, participants, status: 'open',\n notes: options.notes, createdAt: Date.now(),\n };\n this._expenses.set(expense.id, expense);\n return this._snapshot(expense);\n }\n\n // ── Payment recording ─────────────────────────────────────────────────────\n\n recordPayment(expenseId: string, participantId: string, amount: number): JoopSplitExpense {\n const e = this._require(expenseId);\n if (e.status === 'settled' || e.status === 'cancelled') throw new Error(`Expense is ${e.status}`);\n const p = e.participants.find(x => x.id === participantId);\n if (!p) throw new Error(`Participant '${participantId}' not found`);\n if (amount <= 0) throw new Error('Payment amount must be positive');\n\n p.paid = _round(p.paid + amount);\n p.paid = Math.min(p.paid, p.share); // cap at share\n p.status = p.paid >= p.share ? 'paid' : 'partial';\n\n this._updateStatus(e);\n this._change$.next(this._snapshot(e));\n return this._snapshot(e);\n }\n\n // ── Status ────────────────────────────────────────────────────────────────\n\n settle(expenseId: string): void {\n const e = this._require(expenseId);\n e.status = 'settled';\n e.settledAt = Date.now();\n this._change$.next(this._snapshot(e));\n }\n\n cancel(expenseId: string): void {\n const e = this._require(expenseId);\n e.status = 'cancelled';\n this._change$.next(this._snapshot(e));\n }\n\n // ── Queries ───────────────────────────────────────────────────────────────\n\n get(id: string): JoopSplitExpense | undefined {\n const e = this._expenses.get(id);\n return e ? this._snapshot(e) : undefined;\n }\n\n getAll(): JoopSplitExpense[] {\n return Array.from(this._expenses.values()).map(e => this._snapshot(e));\n }\n\n getOpen(): JoopSplitExpense[] {\n return this.getAll().filter(e => e.status === 'open' || e.status === 'partial');\n }\n\n // ── Settlements ───────────────────────────────────────────────────────────\n\n getSettlements(expenseId: string): JoopSplitSettlement[] {\n const e = this._require(expenseId);\n // Each participant who hasn't fully paid owes the difference to paidBy\n return e.participants\n .filter(p => p.paid < p.share && p.name !== e.paidBy)\n .map(p => ({ from: p.name, to: e.paidBy, amount: _round(p.share - p.paid) }));\n }\n\n getSimplifiedSettlements(expenseId: string): JoopSplitSettlement[] {\n return this.getSettlements(expenseId);\n }\n\n // ── Balance ───────────────────────────────────────────────────────────────\n\n getBalance(name: string): JoopSplitBalance {\n let owes = 0;\n let owed = 0;\n\n for (const e of this.getOpen()) {\n const p = e.participants.find(x => x.name === name);\n if (p && e.paidBy !== name) owes += Math.max(0, p.share - p.paid);\n if (e.paidBy === name) {\n for (const other of e.participants) {\n if (other.name !== name) owed += Math.max(0, other.share - other.paid);\n }\n }\n }\n\n return { name, owes: _round(owes), owed: _round(owed), net: _round(owed - owes) };\n }\n\n // ── Summary ───────────────────────────────────────────────────────────────\n\n getSummary(expenseId: string): { total: number; paid: number; remaining: number; participantCount: number; status: JoopSplitStatus } {\n const e = this._require(expenseId);\n const paid = e.participants.reduce((s, p) => s + p.paid, 0);\n return {\n total: e.totalAmount,\n paid: _round(paid),\n remaining: _round(e.totalAmount - paid),\n participantCount: e.participants.length,\n status: e.status,\n };\n }\n\n change$() { return this._change$.asObservable(); }\n\n // ── Internals ─────────────────────────────────────────────────────────────\n\n private _computeShares(total: number, n: number, method: JoopSplitMethod, opts: { amounts?: number[]; percentages?: number[]; shares?: number[] }): number[] {\n switch (method) {\n case 'equal': {\n const each = _round(total / n);\n const arr = Array(n).fill(each);\n // Fix rounding: add/subtract diff on first participant\n const diff = _round(total - arr.reduce((s, x) => s + x, 0));\n arr[0] = _round(arr[0] + diff);\n return arr;\n }\n case 'exact': {\n const amounts = opts.amounts ?? [];\n if (amounts.length !== n) throw new Error('amounts length must match participant count');\n const sum = amounts.reduce((s, x) => s + x, 0);\n if (Math.abs(sum - total) > 0.01) throw new Error('Exact amounts must sum to totalAmount');\n return amounts.map(a => _round(a));\n }\n case 'percentage': {\n const pcts = opts.percentages ?? [];\n if (pcts.length !== n) throw new Error('percentages length must match participant count');\n const sum = pcts.reduce((s, x) => s + x, 0);\n if (Math.abs(sum - 100) > 0.01) throw new Error('Percentages must sum to 100');\n return pcts.map(p => _round((p / 100) * total));\n }\n case 'shares': {\n const sh = opts.shares ?? Array(n).fill(1);\n if (sh.length !== n) throw new Error('shares length must match participant count');\n const totalShares = sh.reduce((s, x) => s + x, 0);\n return sh.map(s => _round((s / totalShares) * total));\n }\n }\n }\n\n private _updateStatus(e: JoopSplitExpense): void {\n const allPaid = e.participants.every(p => p.status === 'paid');\n const nonePaid = e.participants.every(p => p.paid === 0);\n if (allPaid) { e.status = 'settled'; e.settledAt = Date.now(); }\n else if (nonePaid) e.status = 'open';\n else e.status = 'partial';\n }\n\n private _require(id: string): JoopSplitExpense {\n const e = this._expenses.get(id);\n if (!e) throw new Error(`Expense '${id}' not found`);\n return e;\n }\n\n private _snapshot(e: JoopSplitExpense): JoopSplitExpense {\n return { ...e, participants: e.participants.map(p => ({ ...p })) };\n }\n}\n\nfunction _uid(): string { return `${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`; }\nfunction _round(n: number): number { return parseFloat(n.toFixed(2)); }\n","import { JoopSubject } from '../events';\n\nexport type JoopChequeStatus =\n | 'available' | 'issued' | 'presented' | 'cleared' | 'bounced' | 'stopped' | 'cancelled' | 'expired';\n\nexport interface JoopChequeLeaf {\n chequeNumber: string;\n chequebookId: string;\n accountId: string;\n status: JoopChequeStatus;\n issuedTo?: string;\n amount?: number;\n issuedAt?: number;\n presentedAt?: number;\n clearedAt?: number;\n stoppedAt?: number;\n stopReason?: string;\n bounceReason?: string;\n expiresAt?: number;\n notes?: string;\n}\n\nexport interface JoopChequebook {\n id: string;\n accountId: string;\n seriesStart: string;\n seriesEnd: string;\n leaves: JoopChequeLeaf[];\n issuedAt: number;\n isActive: boolean;\n}\n\nexport interface JoopChequebookStats {\n total: number;\n available: number;\n issued: number;\n presented: number;\n cleared: number;\n bounced: number;\n stopped: number;\n cancelled: number;\n expired: number;\n}\n\nexport class JoopChequebookService {\n private _books = new Map<string, JoopChequebook>();\n private _leafIndex = new Map<string, JoopChequeLeaf>(); // chequeNumber → leaf\n private _change$ = new JoopSubject<JoopChequeLeaf>();\n\n // ── Chequebook management ─────────────────────────────────────────────────\n\n addChequebook(accountId: string, seriesStart: string, seriesEnd: string): JoopChequebook {\n const leaves = this._generateLeaves(accountId, 'pending-id', seriesStart, seriesEnd);\n const book: JoopChequebook = {\n id: _uid(), accountId, seriesStart, seriesEnd,\n leaves: [], issuedAt: Date.now(), isActive: true,\n };\n // patch chequebookId\n leaves.forEach(l => { l.chequebookId = book.id; book.leaves.push(l); this._leafIndex.set(l.chequeNumber, l); });\n this._books.set(book.id, book);\n return this._snapshotBook(book);\n }\n\n getChequebook(id: string): JoopChequebook | undefined {\n const b = this._books.get(id);\n return b ? this._snapshotBook(b) : undefined;\n }\n\n getByAccount(accountId: string): JoopChequebook[] {\n return Array.from(this._books.values()).filter(b => b.accountId === accountId).map(b => this._snapshotBook(b));\n }\n\n deactivateChequebook(id: string): void {\n const b = this._books.get(id);\n if (!b) throw new Error(`Chequebook '${id}' not found`);\n b.isActive = false;\n }\n\n // ── Leaf operations ───────────────────────────────────────────────────────\n\n issueCheque(chequeNumber: string, issuedTo: string, amount: number, options: { expiresAt?: number; notes?: string } = {}): JoopChequeLeaf {\n const leaf = this._requireLeaf(chequeNumber);\n if (leaf.status !== 'available') throw new Error(`Cheque ${chequeNumber} is not available (status: ${leaf.status})`);\n if (amount <= 0) throw new Error('Amount must be positive');\n leaf.status = 'issued';\n leaf.issuedTo = issuedTo;\n leaf.amount = amount;\n leaf.issuedAt = Date.now();\n leaf.expiresAt = options.expiresAt;\n leaf.notes = options.notes;\n this._change$.next({ ...leaf });\n return { ...leaf };\n }\n\n stopPayment(chequeNumber: string, reason: string): JoopChequeLeaf {\n const leaf = this._requireLeaf(chequeNumber);\n if (leaf.status === 'cleared') throw new Error('Cannot stop a cleared cheque');\n if (leaf.status === 'stopped') throw new Error('Cheque is already stopped');\n leaf.status = 'stopped';\n leaf.stoppedAt = Date.now();\n leaf.stopReason = reason;\n this._change$.next({ ...leaf });\n return { ...leaf };\n }\n\n markPresented(chequeNumber: string, presentedAt?: number): JoopChequeLeaf {\n const leaf = this._requireLeaf(chequeNumber);\n if (leaf.status !== 'issued') throw new Error(`Cheque must be in 'issued' status to present (current: ${leaf.status})`);\n leaf.status = 'presented';\n leaf.presentedAt = presentedAt ?? Date.now();\n this._change$.next({ ...leaf });\n return { ...leaf };\n }\n\n markCleared(chequeNumber: string, clearedAt?: number): JoopChequeLeaf {\n const leaf = this._requireLeaf(chequeNumber);\n if (leaf.status !== 'presented') throw new Error(`Cheque must be in 'presented' status to clear (current: ${leaf.status})`);\n leaf.status = 'cleared';\n leaf.clearedAt = clearedAt ?? Date.now();\n this._change$.next({ ...leaf });\n return { ...leaf };\n }\n\n markBounced(chequeNumber: string, reason = 'Insufficient funds'): JoopChequeLeaf {\n const leaf = this._requireLeaf(chequeNumber);\n if (leaf.status !== 'presented' && leaf.status !== 'issued') throw new Error(`Cannot bounce cheque in status '${leaf.status}'`);\n leaf.status = 'bounced';\n leaf.bounceReason = reason;\n this._change$.next({ ...leaf });\n return { ...leaf };\n }\n\n cancelCheque(chequeNumber: string): JoopChequeLeaf {\n const leaf = this._requireLeaf(chequeNumber);\n if (leaf.status === 'cleared') throw new Error('Cannot cancel a cleared cheque');\n leaf.status = 'cancelled';\n this._change$.next({ ...leaf });\n return { ...leaf };\n }\n\n // ── Queries ───────────────────────────────────────────────────────────────\n\n getLeaf(chequeNumber: string): JoopChequeLeaf | undefined {\n const l = this._leafIndex.get(chequeNumber);\n return l ? { ...l } : undefined;\n }\n\n getByStatus(status: JoopChequeStatus, accountId?: string): JoopChequeLeaf[] {\n let leaves = Array.from(this._leafIndex.values()).filter(l => l.status === status);\n if (accountId) leaves = leaves.filter(l => l.accountId === accountId);\n return leaves.map(l => ({ ...l }));\n }\n\n getAvailableLeaves(accountId?: string): JoopChequeLeaf[] {\n return this.getByStatus('available', accountId);\n }\n\n isValid(chequeNumber: string): boolean {\n const leaf = this._leafIndex.get(chequeNumber);\n if (!leaf) return false;\n if (!['available', 'issued'].includes(leaf.status)) return false;\n if (leaf.expiresAt && Date.now() > leaf.expiresAt) return false;\n return true;\n }\n\n getStats(accountId?: string): JoopChequebookStats {\n let leaves = Array.from(this._leafIndex.values());\n if (accountId) leaves = leaves.filter(l => l.accountId === accountId);\n const count = (s: JoopChequeStatus) => leaves.filter(l => l.status === s).length;\n return {\n total: leaves.length,\n available: count('available'), issued: count('issued'), presented: count('presented'),\n cleared: count('cleared'), bounced: count('bounced'), stopped: count('stopped'),\n cancelled: count('cancelled'), expired: count('expired'),\n };\n }\n\n change$() { return this._change$.asObservable(); }\n\n // ── Internals ─────────────────────────────────────────────────────────────\n\n private _requireLeaf(chequeNumber: string): JoopChequeLeaf {\n const l = this._leafIndex.get(chequeNumber);\n if (!l) throw new Error(`Cheque '${chequeNumber}' not found`);\n return l;\n }\n\n private _generateLeaves(accountId: string, chequebookId: string, start: string, end: string): JoopChequeLeaf[] {\n const startNum = parseInt(start, 10);\n const endNum = parseInt(end, 10);\n if (isNaN(startNum) || isNaN(endNum) || endNum < startNum) throw new Error('Invalid cheque series range');\n const padLen = start.length;\n const leaves: JoopChequeLeaf[] = [];\n for (let n = startNum; n <= endNum; n++) {\n leaves.push({ chequeNumber: String(n).padStart(padLen, '0'), chequebookId, accountId, status: 'available' });\n }\n return leaves;\n }\n\n private _snapshotBook(b: JoopChequebook): JoopChequebook {\n return { ...b, leaves: b.leaves.map(l => ({ ...l })) };\n }\n}\n\nfunction _uid(): string { return `${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`; }\n","import { JoopSubject } from '../events';\n\nexport type JoopInsuranceType = 'life' | 'health' | 'auto' | 'home' | 'travel' | 'business' | 'other';\nexport type JoopPolicyStatus = 'active' | 'expired' | 'cancelled' | 'lapsed' | 'pending';\nexport type JoopClaimStatus = 'submitted' | 'under-review' | 'approved' | 'rejected' | 'paid' | 'withdrawn';\nexport type JoopPremiumFrequency = 'monthly' | 'quarterly' | 'half-yearly' | 'yearly';\n\nexport interface JoopInsurancePolicy {\n id: string;\n type: JoopInsuranceType;\n policyNumber: string;\n insurer: string;\n holderName: string;\n coverageAmount: number;\n premiumAmount: number;\n premiumFrequency: JoopPremiumFrequency;\n status: JoopPolicyStatus;\n startDate: number;\n endDate: number;\n nextPremiumDate?: number;\n deductible?: number;\n notes?: string;\n createdAt: number;\n updatedAt: number;\n}\n\nexport interface JoopInsuranceClaim {\n id: string;\n claimNumber: string;\n policyId: string;\n amount: number;\n status: JoopClaimStatus;\n description: string;\n documents: string[];\n submittedAt: number;\n resolvedAt?: number;\n paidAmount?: number;\n rejectionReason?: string;\n}\n\nexport interface JoopPremiumPayment {\n id: string;\n policyId: string;\n amount: number;\n date: number;\n method?: string;\n}\n\nconst FREQ_MONTHS: Record<JoopPremiumFrequency, number> = {\n monthly: 1, quarterly: 3, 'half-yearly': 6, yearly: 12,\n};\n\nexport class JoopInsuranceService {\n private _policies = new Map<string, JoopInsurancePolicy>();\n private _claims = new Map<string, JoopInsuranceClaim>();\n private _payments = new Map<string, JoopPremiumPayment[]>(); // policyId → payments\n private _claimCounter = 0;\n private _change$ = new JoopSubject<JoopInsurancePolicy>();\n\n // ── Policies ──────────────────────────────────────────────────────────────\n\n addPolicy(data: Omit<JoopInsurancePolicy, 'id' | 'createdAt' | 'updatedAt'>): JoopInsurancePolicy {\n if (data.coverageAmount <= 0) throw new Error('coverageAmount must be positive');\n if (data.premiumAmount <= 0) throw new Error('premiumAmount must be positive');\n if (data.endDate <= data.startDate) throw new Error('endDate must be after startDate');\n const now = Date.now();\n const policy: JoopInsurancePolicy = { ...data, id: _uid(), createdAt: now, updatedAt: now };\n this._policies.set(policy.id, policy);\n this._payments.set(policy.id, []);\n this._change$.next({ ...policy });\n return { ...policy };\n }\n\n updatePolicy(id: string, patch: Partial<Omit<JoopInsurancePolicy, 'id' | 'createdAt'>>): JoopInsurancePolicy {\n const p = this._require(id);\n Object.assign(p, patch, { updatedAt: Date.now() });\n this._change$.next({ ...p });\n return { ...p };\n }\n\n cancelPolicy(id: string, reason?: string): JoopInsurancePolicy {\n const p = this._require(id);\n if (p.status === 'cancelled') throw new Error('Policy is already cancelled');\n p.status = 'cancelled';\n if (reason) p.notes = reason;\n p.updatedAt = Date.now();\n this._change$.next({ ...p });\n return { ...p };\n }\n\n renewPolicy(id: string, newEndDate: number): JoopInsurancePolicy {\n const p = this._require(id);\n if (newEndDate <= p.endDate) throw new Error('newEndDate must be after current endDate');\n p.endDate = newEndDate;\n p.status = 'active';\n p.updatedAt = Date.now();\n this._change$.next({ ...p });\n return { ...p };\n }\n\n getPolicy(id: string): JoopInsurancePolicy | undefined {\n const p = this._policies.get(id);\n return p ? { ...p } : undefined;\n }\n\n getAll(): JoopInsurancePolicy[] {\n return Array.from(this._policies.values()).map(p => ({ ...p }));\n }\n\n getActive(): JoopInsurancePolicy[] {\n return this.getAll().filter(p => p.status === 'active');\n }\n\n getByType(type: JoopInsuranceType): JoopInsurancePolicy[] {\n return this.getAll().filter(p => p.type === type);\n }\n\n getExpiring(withinDays: number, asOf = Date.now()): JoopInsurancePolicy[] {\n const cutoff = asOf + withinDays * 86_400_000;\n return this.getActive().filter(p => p.endDate <= cutoff && p.endDate > asOf);\n }\n\n // ── Claims ────────────────────────────────────────────────────────────────\n\n fileClaim(policyId: string, amount: number, description: string, documents: string[] = []): JoopInsuranceClaim {\n const p = this._require(policyId);\n if (p.status !== 'active') throw new Error(`Cannot file claim on a ${p.status} policy`);\n if (amount <= 0) throw new Error('Claim amount must be positive');\n if (amount > p.coverageAmount) throw new Error(`Claim amount exceeds coverage (${p.coverageAmount})`);\n this._claimCounter++;\n const claim: JoopInsuranceClaim = {\n id: _uid(),\n claimNumber: `CLM-${new Date().getFullYear()}-${String(this._claimCounter).padStart(6, '0')}`,\n policyId, amount, description, documents,\n status: 'submitted', submittedAt: Date.now(),\n };\n this._claims.set(claim.id, claim);\n return { ...claim };\n }\n\n updateClaim(id: string, status: JoopClaimStatus, options: { paidAmount?: number; rejectionReason?: string } = {}): JoopInsuranceClaim {\n const c = this._requireClaim(id);\n c.status = status;\n if (status === 'paid' || status === 'rejected' || status === 'withdrawn') c.resolvedAt = Date.now();\n if (options.paidAmount !== undefined) c.paidAmount = options.paidAmount;\n if (options.rejectionReason) c.rejectionReason = options.rejectionReason;\n return { ...c };\n }\n\n getClaims(policyId?: string): JoopInsuranceClaim[] {\n const all = Array.from(this._claims.values()).map(c => ({ ...c }));\n return policyId ? all.filter(c => c.policyId === policyId) : all;\n }\n\n // ── Premium payments ──────────────────────────────────────────────────────\n\n recordPremiumPayment(policyId: string, amount: number, method?: string): JoopPremiumPayment {\n this._require(policyId);\n const payment: JoopPremiumPayment = { id: _uid(), policyId, amount, date: Date.now(), method };\n this._payments.get(policyId)!.push(payment);\n // Advance nextPremiumDate\n const p = this._policies.get(policyId)!;\n const base = p.nextPremiumDate ?? Date.now();\n const d = new Date(base);\n d.setMonth(d.getMonth() + FREQ_MONTHS[p.premiumFrequency]);\n p.nextPremiumDate = d.getTime();\n p.updatedAt = Date.now();\n return { ...payment };\n }\n\n getPremiumHistory(policyId: string): JoopPremiumPayment[] {\n return [...(this._payments.get(policyId) ?? [])];\n }\n\n // ── Aggregates ────────────────────────────────────────────────────────────\n\n getTotalCoverage(): number {\n return this.getActive().reduce((s, p) => s + p.coverageAmount, 0);\n }\n\n getTotalAnnualPremium(): number {\n const YEARLY_FACTOR: Record<JoopPremiumFrequency, number> = {\n monthly: 12, quarterly: 4, 'half-yearly': 2, yearly: 1,\n };\n return this.getActive().reduce((s, p) => s + p.premiumAmount * YEARLY_FACTOR[p.premiumFrequency], 0);\n }\n\n change$() { return this._change$.asObservable(); }\n\n // ── Internals ─────────────────────────────────────────────────────────────\n\n private _require(id: string): JoopInsurancePolicy {\n const p = this._policies.get(id);\n if (!p) throw new Error(`Policy '${id}' not found`);\n return p;\n }\n\n private _requireClaim(id: string): JoopInsuranceClaim {\n const c = this._claims.get(id);\n if (!c) throw new Error(`Claim '${id}' not found`);\n return c;\n }\n}\n\nfunction _uid(): string { return `${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`; }\n","import { JoopSubject } from '../events';\n\nexport type JoopRemittanceStatus = 'initiated' | 'processing' | 'completed' | 'failed' | 'cancelled' | 'returned';\nexport type JoopRemittanceChannel = 'swift' | 'sepa' | 'ach' | 'wire' | 'crypto' | 'mobile-money' | 'cash-pickup';\n\nexport interface JoopRemittanceQuote {\n sendAmount: number;\n sendCurrency: string;\n receiveAmount: number;\n receiveCurrency: string;\n exchangeRate: number;\n fee: number;\n totalDebit: number;\n estimatedArrivalMs: number;\n channel: JoopRemittanceChannel;\n}\n\nexport interface JoopRemittance {\n id: string;\n ref: string;\n sendAmount: number;\n sendCurrency: string;\n receiveAmount: number;\n receiveCurrency: string;\n exchangeRate: number;\n fee: number;\n totalDebit: number;\n status: JoopRemittanceStatus;\n channel: JoopRemittanceChannel;\n senderName: string;\n senderAccount: string;\n recipientName: string;\n recipientAccount: string;\n recipientBankCode?: string;\n recipientCountry: string;\n purposeCode?: string;\n notes?: string;\n initiatedAt: number;\n completedAt?: number;\n estimatedArrival?: number;\n}\n\nconst DEFAULT_FEES: Record<JoopRemittanceChannel, number> = {\n swift: 25, sepa: 0.5, ach: 0.25, wire: 20, crypto: 1, 'mobile-money': 2, 'cash-pickup': 5,\n};\n\nconst ARRIVAL_MS: Record<JoopRemittanceChannel, number> = {\n swift: 3 * 86_400_000, sepa: 86_400_000, ach: 2 * 86_400_000, wire: 86_400_000,\n crypto: 30 * 60_000, 'mobile-money': 10 * 60_000, 'cash-pickup': 2 * 60_000,\n};\n\nexport class JoopRemittanceService {\n private _remittances = new Map<string, JoopRemittance>();\n private _rates = new Map<string, number>(); // \"USD:EUR\" → rate\n private _fees = new Map<string, number>(); // channel → flat fee override\n private _counter = 0;\n private _change$ = new JoopSubject<JoopRemittance>();\n\n // ── FX rates & fees ───────────────────────────────────────────────────────\n\n setExchangeRate(from: string, to: string, rate: number): void {\n this._rates.set(_rateKey(from, to), rate);\n this._rates.set(_rateKey(to, from), parseFloat((1 / rate).toFixed(6)));\n }\n\n getExchangeRate(from: string, to: string): number | null {\n return this._rates.get(_rateKey(from, to)) ?? null;\n }\n\n setChannelFee(channel: JoopRemittanceChannel, fee: number): void {\n this._fees.set(channel, fee);\n }\n\n getFee(channel: JoopRemittanceChannel): number {\n return this._fees.get(channel) ?? DEFAULT_FEES[channel];\n }\n\n // ── Quote ─────────────────────────────────────────────────────────────────\n\n getQuote(\n sendAmount: number,\n sendCurrency: string,\n receiveCurrency: string,\n channel: JoopRemittanceChannel = 'swift',\n ): JoopRemittanceQuote {\n if (sendAmount <= 0) throw new Error('sendAmount must be positive');\n const rate = sendCurrency === receiveCurrency ? 1 : (this._rates.get(_rateKey(sendCurrency, receiveCurrency)) ?? null);\n if (rate === null) throw new Error(`No exchange rate set for ${sendCurrency} → ${receiveCurrency}`);\n const fee = this.getFee(channel);\n const receiveAmount = parseFloat(((sendAmount - fee) * rate).toFixed(2));\n if (receiveAmount <= 0) throw new Error('Send amount is too small to cover the fee');\n return {\n sendAmount, sendCurrency, receiveAmount, receiveCurrency,\n exchangeRate: rate, fee,\n totalDebit: parseFloat((sendAmount + fee).toFixed(2)),\n estimatedArrivalMs: ARRIVAL_MS[channel],\n channel,\n };\n }\n\n // ── Initiate ──────────────────────────────────────────────────────────────\n\n initiate(data: {\n sendAmount: number;\n sendCurrency: string;\n receiveCurrency: string;\n channel: JoopRemittanceChannel;\n senderName: string;\n senderAccount: string;\n recipientName: string;\n recipientAccount: string;\n recipientCountry: string;\n recipientBankCode?: string;\n purposeCode?: string;\n notes?: string;\n }): JoopRemittance {\n const quote = this.getQuote(data.sendAmount, data.sendCurrency, data.receiveCurrency, data.channel);\n const now = Date.now();\n const remittance: JoopRemittance = {\n id: _uid(),\n ref: this._generateRef(),\n status: 'initiated',\n ...quote,\n senderName: data.senderName,\n senderAccount: data.senderAccount,\n recipientName: data.recipientName,\n recipientAccount: data.recipientAccount,\n recipientBankCode: data.recipientBankCode,\n recipientCountry: data.recipientCountry,\n purposeCode: data.purposeCode,\n notes: data.notes,\n initiatedAt: now,\n estimatedArrival: now + quote.estimatedArrivalMs,\n };\n this._remittances.set(remittance.id, remittance);\n this._change$.next({ ...remittance });\n return { ...remittance };\n }\n\n // ── Status management ─────────────────────────────────────────────────────\n\n cancel(id: string): JoopRemittance {\n return this._transition(id, 'cancelled', r => {\n if (!['initiated', 'processing'].includes(r.status)) throw new Error(`Cannot cancel remittance in '${r.status}' status`);\n });\n }\n\n updateStatus(id: string, status: JoopRemittanceStatus, options: { notes?: string } = {}): JoopRemittance {\n return this._transition(id, status, r => {\n if (options.notes) r.notes = options.notes;\n if (status === 'completed') r.completedAt = Date.now();\n });\n }\n\n // ── Queries ───────────────────────────────────────────────────────────────\n\n getById(id: string): JoopRemittance | undefined {\n const r = this._remittances.get(id);\n return r ? { ...r } : undefined;\n }\n\n getByRef(ref: string): JoopRemittance | undefined {\n return Array.from(this._remittances.values()).find(r => r.ref === ref);\n }\n\n getByStatus(status: JoopRemittanceStatus): JoopRemittance[] {\n return Array.from(this._remittances.values()).filter(r => r.status === status).map(r => ({ ...r }));\n }\n\n getHistory(limit?: number): JoopRemittance[] {\n const all = Array.from(this._remittances.values()).sort((a, b) => b.initiatedAt - a.initiatedAt);\n return (limit ? all.slice(0, limit) : all).map(r => ({ ...r }));\n }\n\n getTotalSent(currency?: string): number {\n return Array.from(this._remittances.values())\n .filter(r => r.status === 'completed' && (!currency || r.sendCurrency === currency))\n .reduce((s, r) => s + r.sendAmount, 0);\n }\n\n change$() { return this._change$.asObservable(); }\n\n // ── Internals ─────────────────────────────────────────────────────────────\n\n private _transition(id: string, status: JoopRemittanceStatus, mutate?: (r: JoopRemittance) => void): JoopRemittance {\n const r = this._remittances.get(id);\n if (!r) throw new Error(`Remittance '${id}' not found`);\n if (mutate) mutate(r);\n r.status = status;\n this._change$.next({ ...r });\n return { ...r };\n }\n\n private _generateRef(): string {\n this._counter++;\n return `RMT-${new Date().getFullYear()}-${String(this._counter).padStart(6, '0')}`;\n }\n}\n\nfunction _rateKey(from: string, to: string): string { return `${from.toUpperCase()}:${to.toUpperCase()}`; }\nfunction _uid(): string { return `${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`; }\n","import { JoopSubject } from '../events';\n\nexport type JoopVirtualAccountStatus = 'active' | 'inactive' | 'closed';\nexport type JoopVirtualAccountPurpose = 'collection' | 'escrow' | 'payroll' | 'vendor' | 'customer' | 'project' | 'other';\n\nexport interface JoopVirtualAccount {\n id: string;\n accountNumber: string;\n iban?: string;\n parentAccountId: string;\n label: string;\n purpose: JoopVirtualAccountPurpose;\n status: JoopVirtualAccountStatus;\n currency: string;\n collectedAmount: number;\n expectedAmount?: number;\n reference?: string;\n expiresAt?: number;\n metadata?: Record<string, string>;\n createdAt: number;\n updatedAt: number;\n}\n\nexport interface JoopVirtualCredit {\n id: string;\n virtualAccountId: string;\n amount: number;\n currency: string;\n senderName?: string;\n senderRef?: string;\n receivedAt: number;\n notes?: string;\n}\n\nexport class JoopVirtualAccountService {\n private _accounts = new Map<string, JoopVirtualAccount>();\n private _credits = new Map<string, JoopVirtualCredit[]>(); // vaId → credits\n private _counter = 0;\n private _change$ = new JoopSubject<JoopVirtualAccount>();\n\n // ── Create / manage ───────────────────────────────────────────────────────\n\n create(data: {\n parentAccountId: string;\n label: string;\n purpose: JoopVirtualAccountPurpose;\n currency?: string;\n expectedAmount?: number;\n reference?: string;\n expiresAt?: number;\n metadata?: Record<string, string>;\n ibanPrefix?: string;\n }): JoopVirtualAccount {\n const now = Date.now();\n const accountNumber = this.generateAccountNumber();\n const va: JoopVirtualAccount = {\n id: _uid(),\n accountNumber,\n iban: data.ibanPrefix ? `${data.ibanPrefix}${accountNumber}` : undefined,\n parentAccountId: data.parentAccountId,\n label: data.label,\n purpose: data.purpose,\n status: 'active',\n currency: data.currency ?? 'USD',\n collectedAmount: 0,\n expectedAmount: data.expectedAmount,\n reference: data.reference,\n expiresAt: data.expiresAt,\n metadata: data.metadata,\n createdAt: now,\n updatedAt: now,\n };\n this._accounts.set(va.id, va);\n this._credits.set(va.id, []);\n this._change$.next({ ...va });\n return { ...va };\n }\n\n close(id: string): JoopVirtualAccount {\n return this._setStatus(id, 'closed');\n }\n\n deactivate(id: string): JoopVirtualAccount {\n return this._setStatus(id, 'inactive');\n }\n\n activate(id: string): JoopVirtualAccount {\n const va = this._require(id);\n if (va.status === 'closed') throw new Error('Cannot activate a closed virtual account');\n return this._setStatus(id, 'active');\n }\n\n update(id: string, patch: Partial<Pick<JoopVirtualAccount, 'label' | 'expectedAmount' | 'reference' | 'expiresAt' | 'metadata'>>): JoopVirtualAccount {\n const va = this._require(id);\n Object.assign(va, patch, { updatedAt: Date.now() });\n this._change$.next({ ...va });\n return { ...va };\n }\n\n // ── Queries ───────────────────────────────────────────────────────────────\n\n get(id: string): JoopVirtualAccount | undefined {\n const va = this._accounts.get(id);\n return va ? { ...va } : undefined;\n }\n\n getAll(): JoopVirtualAccount[] {\n return Array.from(this._accounts.values()).map(va => ({ ...va }));\n }\n\n getActive(parentAccountId?: string): JoopVirtualAccount[] {\n let list = this.getAll().filter(va => va.status === 'active');\n if (parentAccountId) list = list.filter(va => va.parentAccountId === parentAccountId);\n return list;\n }\n\n getByReference(reference: string): JoopVirtualAccount | undefined {\n return Array.from(this._accounts.values()).find(va => va.reference === reference);\n }\n\n getByPurpose(purpose: JoopVirtualAccountPurpose): JoopVirtualAccount[] {\n return this.getAll().filter(va => va.purpose === purpose);\n }\n\n getExpiring(withinMs: number, asOf = Date.now()): JoopVirtualAccount[] {\n const cutoff = asOf + withinMs;\n return this.getActive().filter(va => va.expiresAt !== undefined && va.expiresAt <= cutoff && va.expiresAt > asOf);\n }\n\n // ── Credits ───────────────────────────────────────────────────────────────\n\n recordCredit(virtualAccountId: string, amount: number, options: { currency?: string; senderName?: string; senderRef?: string; notes?: string } = {}): JoopVirtualCredit {\n const va = this._require(virtualAccountId);\n if (va.status !== 'active') throw new Error(`Virtual account is ${va.status}`);\n if (amount <= 0) throw new Error('Credit amount must be positive');\n\n const credit: JoopVirtualCredit = {\n id: _uid(), virtualAccountId, amount,\n currency: options.currency ?? va.currency,\n senderName: options.senderName,\n senderRef: options.senderRef,\n receivedAt: Date.now(),\n notes: options.notes,\n };\n this._credits.get(virtualAccountId)!.push(credit);\n va.collectedAmount = parseFloat((va.collectedAmount + amount).toFixed(2));\n va.updatedAt = Date.now();\n this._change$.next({ ...va });\n return { ...credit };\n }\n\n getCredits(virtualAccountId: string): JoopVirtualCredit[] {\n return [...(this._credits.get(virtualAccountId) ?? [])];\n }\n\n getTotalCollected(virtualAccountId: string): number {\n const va = this._require(virtualAccountId);\n return va.collectedAmount;\n }\n\n isFullyCollected(virtualAccountId: string): boolean {\n const va = this._require(virtualAccountId);\n return va.expectedAmount !== undefined && va.collectedAmount >= va.expectedAmount;\n }\n\n // ── Utilities ─────────────────────────────────────────────────────────────\n\n generateAccountNumber(prefix = 'VA'): string {\n this._counter++;\n return `${prefix}${String(Date.now()).slice(-8)}${String(this._counter).padStart(4, '0')}`;\n }\n\n change$() { return this._change$.asObservable(); }\n\n // ── Internals ─────────────────────────────────────────────────────────────\n\n private _require(id: string): JoopVirtualAccount {\n const va = this._accounts.get(id);\n if (!va) throw new Error(`Virtual account '${id}' not found`);\n return va;\n }\n\n private _setStatus(id: string, status: JoopVirtualAccountStatus): JoopVirtualAccount {\n const va = this._require(id);\n va.status = status;\n va.updatedAt = Date.now();\n this._change$.next({ ...va });\n return { ...va };\n }\n}\n\nfunction _uid(): string { return `${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`; }\n","import { JoopSubject } from '../events';\n\nexport type JoopAccountType = 'asset' | 'liability' | 'equity' | 'revenue' | 'expense';\n\nexport interface JoopLedgerAccount {\n code: string;\n name: string;\n type: JoopAccountType;\n description?: string;\n createdAt: number;\n}\n\nexport interface JoopJournalLine {\n accountCode: string;\n debit: number;\n credit: number;\n description?: string;\n}\n\nexport interface JoopJournalEntry {\n id: string;\n ref: string;\n description: string;\n date: number;\n lines: JoopJournalLine[];\n postedAt: number;\n postedBy?: string;\n tags?: string[];\n}\n\nexport interface JoopTrialBalanceRow {\n code: string;\n name: string;\n type: JoopAccountType;\n totalDebits: number;\n totalCredits: number;\n balance: number;\n}\n\nexport interface JoopTrialBalance {\n asOf: number;\n rows: JoopTrialBalanceRow[];\n totalDebits: number;\n totalCredits: number;\n isBalanced: boolean;\n}\n\nfunction _uid(): string {\n return `${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;\n}\n\nfunction _round(n: number, dp = 2): number {\n return Math.round(n * 10 ** dp) / 10 ** dp;\n}\n\n/** Debit-normal account types (debits increase balance). */\nconst DEBIT_NORMAL = new Set<JoopAccountType>(['asset', 'expense']);\n\nexport class JoopLedgerService {\n private _accounts = new Map<string, JoopLedgerAccount>();\n private _entries: JoopJournalEntry[] = [];\n private _seq = 0;\n private _change$ = new JoopSubject<JoopJournalEntry>();\n\n // ── Accounts ─────────────────────────────────────────────────────────────\n\n addAccount(code: string, name: string, type: JoopAccountType, description?: string): JoopLedgerAccount {\n if (!code.trim()) throw new Error('Account code required');\n if (this._accounts.has(code)) throw new Error(`Account ${code} already exists`);\n const account: JoopLedgerAccount = { code, name, type, description, createdAt: Date.now() };\n this._accounts.set(code, account);\n return account;\n }\n\n getAccount(code: string): JoopLedgerAccount | undefined {\n return this._accounts.get(code);\n }\n\n getAccounts(): JoopLedgerAccount[] {\n return Array.from(this._accounts.values());\n }\n\n removeAccount(code: string): void {\n if (!this._accounts.has(code)) throw new Error(`Account ${code} not found`);\n const hasEntries = this._entries.some(e => e.lines.some(l => l.accountCode === code));\n if (hasEntries) throw new Error(`Cannot remove account ${code} — it has journal entries`);\n this._accounts.delete(code);\n }\n\n // ── Journal ───────────────────────────────────────────────────────────────\n\n postEntry(\n description: string,\n lines: JoopJournalLine[],\n opts: { date?: number; postedBy?: string; tags?: string[] } = {}\n ): JoopJournalEntry {\n if (lines.length < 2) throw new Error('A journal entry requires at least 2 lines');\n\n for (const l of lines) {\n if (!this._accounts.has(l.accountCode)) throw new Error(`Unknown account: ${l.accountCode}`);\n if (l.debit < 0 || l.credit < 0) throw new Error('Debit/credit amounts must be non-negative');\n }\n\n const totalDebits = _round(lines.reduce((s, l) => s + l.debit, 0));\n const totalCredits = _round(lines.reduce((s, l) => s + l.credit, 0));\n if (totalDebits !== totalCredits) {\n throw new Error(`Journal entry does not balance — debits ${totalDebits} ≠ credits ${totalCredits}`);\n }\n\n this._seq += 1;\n const year = new Date().getFullYear();\n const ref = `JE-${year}-${String(this._seq).padStart(6, '0')}`;\n\n const entry: JoopJournalEntry = {\n id: _uid(),\n ref,\n description,\n date: opts.date ?? Date.now(),\n lines: lines.map(l => ({ ...l, debit: _round(l.debit), credit: _round(l.credit) })),\n postedAt: Date.now(),\n postedBy: opts.postedBy,\n tags: opts.tags,\n };\n\n this._entries.push(entry);\n this._change$.next(entry);\n return entry;\n }\n\n getEntry(id: string): JoopJournalEntry | undefined {\n return this._entries.find(e => e.id === id);\n }\n\n getJournal(from?: number, to?: number): JoopJournalEntry[] {\n return this._entries\n .filter(e => (from === undefined || e.date >= from) && (to === undefined || e.date <= to))\n .sort((a, b) => a.date - b.date);\n }\n\n // ── Balances ──────────────────────────────────────────────────────────────\n\n getBalance(code: string): number {\n const acct = this._accounts.get(code);\n if (!acct) throw new Error(`Account ${code} not found`);\n\n let debits = 0;\n let credits = 0;\n for (const entry of this._entries) {\n for (const line of entry.lines) {\n if (line.accountCode === code) {\n debits += line.debit;\n credits += line.credit;\n }\n }\n }\n\n // Debit-normal accounts: balance = debits - credits\n // Credit-normal accounts: balance = credits - debits\n return _round(DEBIT_NORMAL.has(acct.type) ? debits - credits : credits - debits);\n }\n\n getTrialBalance(): JoopTrialBalance {\n const rows: JoopTrialBalanceRow[] = [];\n let totalDebits = 0;\n let totalCredits = 0;\n\n for (const acct of this._accounts.values()) {\n let d = 0, c = 0;\n for (const entry of this._entries) {\n for (const line of entry.lines) {\n if (line.accountCode === acct.code) {\n d += line.debit;\n c += line.credit;\n }\n }\n }\n const balance = _round(DEBIT_NORMAL.has(acct.type) ? d - c : c - d);\n rows.push({ code: acct.code, name: acct.name, type: acct.type, totalDebits: _round(d), totalCredits: _round(c), balance });\n totalDebits += d;\n totalCredits += c;\n }\n\n totalDebits = _round(totalDebits);\n totalCredits = _round(totalCredits);\n\n return { asOf: Date.now(), rows, totalDebits, totalCredits, isBalanced: totalDebits === totalCredits };\n }\n\n getBalancesByType(type: JoopAccountType): Record<string, number> {\n const result: Record<string, number> = {};\n for (const acct of this._accounts.values()) {\n if (acct.type === type) result[acct.code] = this.getBalance(acct.code);\n }\n return result;\n }\n\n // ── Observable ───────────────────────────────────────────────────────────\n\n change$() { return this._change$; }\n}\n","import { JoopSubject } from '../events';\n\nexport type JoopReconItemSource = 'internal' | 'bank';\nexport type JoopReconMatchStatus = 'matched' | 'unmatched' | 'disputed';\n\nexport interface JoopReconItem {\n id: string;\n source: JoopReconItemSource;\n date: number;\n amount: number;\n description: string;\n reference?: string;\n}\n\nexport interface JoopReconMatch {\n id: string;\n internalId: string;\n bankId: string;\n matchedAt: number;\n isManual: boolean;\n difference: number;\n}\n\nexport interface JoopReconSession {\n id: string;\n accountId: string;\n startedAt: number;\n closedAt?: number;\n internalItems: JoopReconItem[];\n bankItems: JoopReconItem[];\n matches: JoopReconMatch[];\n}\n\nexport interface JoopReconSummary {\n sessionId: string;\n totalInternal: number;\n totalBank: number;\n matchedPairs: number;\n unmatchedInternal: number;\n unmatchedBank: number;\n totalDifference: number;\n isReconciled: boolean;\n}\n\nfunction _uid(): string {\n return `${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;\n}\n\nexport class JoopReconciliationService {\n private _sessions = new Map<string, JoopReconSession>();\n private _change$ = new JoopSubject<JoopReconSession>();\n\n // ── Sessions ──────────────────────────────────────────────────────────────\n\n createSession(\n accountId: string,\n bankItems: Omit<JoopReconItem, 'id' | 'source'>[],\n internalItems: Omit<JoopReconItem, 'id' | 'source'>[] = []\n ): JoopReconSession {\n const session: JoopReconSession = {\n id: _uid(),\n accountId,\n startedAt: Date.now(),\n internalItems: internalItems.map(i => ({ ...i, id: _uid(), source: 'internal' as const })),\n bankItems: bankItems.map(i => ({ ...i, id: _uid(), source: 'bank' as const })),\n matches: [],\n };\n this._sessions.set(session.id, session);\n return session;\n }\n\n getSession(id: string): JoopReconSession | undefined {\n return this._sessions.get(id);\n }\n\n closeSession(id: string): JoopReconSession {\n const s = this._get(id);\n s.closedAt = Date.now();\n this._change$.next(s);\n return s;\n }\n\n addInternalItems(sessionId: string, items: Omit<JoopReconItem, 'id' | 'source'>[]): JoopReconSession {\n const s = this._get(sessionId);\n for (const item of items) s.internalItems.push({ ...item, id: _uid(), source: 'internal' });\n this._change$.next(s);\n return s;\n }\n\n // ── Matching ──────────────────────────────────────────────────────────────\n\n autoMatch(sessionId: string, toleranceAmount = 0, toleranceDays = 3): JoopReconMatch[] {\n const s = this._get(sessionId);\n const matchedInternalIds = new Set(s.matches.map(m => m.internalId));\n const matchedBankIds = new Set(s.matches.map(m => m.bankId));\n const newMatches: JoopReconMatch[] = [];\n const dayMs = 86_400_000;\n\n for (const intItem of s.internalItems) {\n if (matchedInternalIds.has(intItem.id)) continue;\n for (const bankItem of s.bankItems) {\n if (matchedBankIds.has(bankItem.id)) continue;\n const amountDiff = Math.abs(intItem.amount - bankItem.amount);\n const daysDiff = Math.abs(intItem.date - bankItem.date) / dayMs;\n if (amountDiff <= toleranceAmount && daysDiff <= toleranceDays) {\n const match: JoopReconMatch = {\n id: _uid(),\n internalId: intItem.id,\n bankId: bankItem.id,\n matchedAt: Date.now(),\n isManual: false,\n difference: intItem.amount - bankItem.amount,\n };\n s.matches.push(match);\n matchedInternalIds.add(intItem.id);\n matchedBankIds.add(bankItem.id);\n newMatches.push(match);\n break;\n }\n }\n }\n\n if (newMatches.length) this._change$.next(s);\n return newMatches;\n }\n\n manualMatch(sessionId: string, internalId: string, bankId: string): JoopReconMatch {\n const s = this._get(sessionId);\n const intItem = s.internalItems.find(i => i.id === internalId);\n const bankItem = s.bankItems.find(i => i.id === bankId);\n if (!intItem) throw new Error(`Internal item ${internalId} not found`);\n if (!bankItem) throw new Error(`Bank item ${bankId} not found`);\n if (s.matches.some(m => m.internalId === internalId || m.bankId === bankId)) {\n throw new Error('One or both items are already matched');\n }\n const match: JoopReconMatch = {\n id: _uid(),\n internalId,\n bankId,\n matchedAt: Date.now(),\n isManual: true,\n difference: intItem.amount - bankItem.amount,\n };\n s.matches.push(match);\n this._change$.next(s);\n return match;\n }\n\n unmatch(sessionId: string, matchId: string): void {\n const s = this._get(sessionId);\n const idx = s.matches.findIndex(m => m.id === matchId);\n if (idx === -1) throw new Error(`Match ${matchId} not found`);\n s.matches.splice(idx, 1);\n this._change$.next(s);\n }\n\n // ── Queries ───────────────────────────────────────────────────────────────\n\n getUnmatched(sessionId: string): { internal: JoopReconItem[]; bank: JoopReconItem[] } {\n const s = this._get(sessionId);\n const matchedInternalIds = new Set(s.matches.map(m => m.internalId));\n const matchedBankIds = new Set(s.matches.map(m => m.bankId));\n return {\n internal: s.internalItems.filter(i => !matchedInternalIds.has(i.id)),\n bank: s.bankItems.filter(i => !matchedBankIds.has(i.id)),\n };\n }\n\n getSummary(sessionId: string): JoopReconSummary {\n const s = this._get(sessionId);\n const unmatched = this.getUnmatched(sessionId);\n const totalDifference = s.matches.reduce((sum, m) => sum + m.difference, 0);\n return {\n sessionId,\n totalInternal: s.internalItems.length,\n totalBank: s.bankItems.length,\n matchedPairs: s.matches.length,\n unmatchedInternal: unmatched.internal.length,\n unmatchedBank: unmatched.bank.length,\n totalDifference: Math.round(totalDifference * 100) / 100,\n isReconciled: unmatched.internal.length === 0 && unmatched.bank.length === 0,\n };\n }\n\n // ── Observable ───────────────────────────────────────────────────────────\n\n change$() { return this._change$; }\n\n private _get(id: string): JoopReconSession {\n const s = this._sessions.get(id);\n if (!s) throw new Error(`Reconciliation session ${id} not found`);\n return s;\n }\n}\n","import { JoopSubject } from '../events';\n\nexport type JoopLimitType = 'per-transaction' | 'daily' | 'weekly' | 'monthly' | 'yearly';\nexport type JoopLimitScope = 'account' | 'user' | 'card' | 'channel';\n\nexport interface JoopLimit {\n id: string;\n scope: JoopLimitScope;\n scopeId: string;\n type: JoopLimitType;\n maxAmount: number;\n currency: string;\n enabled: boolean;\n createdAt: number;\n notes?: string;\n}\n\nexport interface JoopLimitCheckResult {\n allowed: boolean;\n limit: JoopLimit;\n currentUsage: number;\n remaining: number;\n requestedAmount: number;\n reason?: string;\n}\n\nexport interface JoopUsageRecord {\n limitId: string;\n amount: number;\n recordedAt: number;\n reference?: string;\n}\n\nexport interface JoopUsageSummary {\n scope: JoopLimitScope;\n scopeId: string;\n limits: Array<{\n limitId: string;\n type: JoopLimitType;\n maxAmount: number;\n used: number;\n remaining: number;\n utilizationPercent: number;\n }>;\n}\n\nfunction _uid(): string {\n return `${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;\n}\n\nfunction _periodStart(type: JoopLimitType, now: number): number {\n const d = new Date(now);\n switch (type) {\n case 'per-transaction': return 0; // always fresh\n case 'daily': return new Date(d.getFullYear(), d.getMonth(), d.getDate()).getTime();\n case 'weekly': {\n const day = d.getDay(); // 0=Sun\n const mon = new Date(d.getFullYear(), d.getMonth(), d.getDate() - ((day + 6) % 7));\n return mon.getTime();\n }\n case 'monthly': return new Date(d.getFullYear(), d.getMonth(), 1).getTime();\n case 'yearly': return new Date(d.getFullYear(), 0, 1).getTime();\n }\n}\n\nexport class JoopLimitManagementService {\n private _limits = new Map<string, JoopLimit>();\n private _usage: JoopUsageRecord[] = [];\n private _change$ = new JoopSubject<JoopLimit>();\n\n // ── Limit CRUD ────────────────────────────────────────────────────────────\n\n setLimit(\n scope: JoopLimitScope,\n scopeId: string,\n type: JoopLimitType,\n maxAmount: number,\n currency = 'USD',\n notes?: string\n ): JoopLimit {\n if (maxAmount <= 0) throw new Error('maxAmount must be positive');\n const existing = this._findLimit(scope, scopeId, type, currency);\n if (existing) {\n existing.maxAmount = maxAmount;\n existing.notes = notes;\n this._change$.next(existing);\n return existing;\n }\n const limit: JoopLimit = {\n id: _uid(), scope, scopeId, type, maxAmount, currency, enabled: true, createdAt: Date.now(), notes,\n };\n this._limits.set(limit.id, limit);\n this._change$.next(limit);\n return limit;\n }\n\n getLimit(id: string): JoopLimit | undefined {\n return this._limits.get(id);\n }\n\n getLimits(scope?: JoopLimitScope, scopeId?: string): JoopLimit[] {\n return Array.from(this._limits.values()).filter(l =>\n (scope === undefined || l.scope === scope) &&\n (scopeId === undefined || l.scopeId === scopeId)\n );\n }\n\n removeLimit(limitId: string): void {\n if (!this._limits.has(limitId)) throw new Error(`Limit ${limitId} not found`);\n this._limits.delete(limitId);\n this._usage = this._usage.filter(u => u.limitId !== limitId);\n }\n\n enableLimit(limitId: string): void { this._toggle(limitId, true); }\n disableLimit(limitId: string): void { this._toggle(limitId, false); }\n\n // ── Check & Record ────────────────────────────────────────────────────────\n\n checkLimit(scope: JoopLimitScope, scopeId: string, type: JoopLimitType, amount: number, currency = 'USD'): JoopLimitCheckResult | null {\n const limit = this._findLimit(scope, scopeId, type, currency);\n if (!limit || !limit.enabled) return null;\n\n const usage = this._currentUsage(limit, Date.now());\n const remaining = Math.max(0, limit.maxAmount - usage);\n const allowed = amount <= remaining;\n\n return {\n allowed,\n limit,\n currentUsage: usage,\n remaining,\n requestedAmount: amount,\n reason: allowed ? undefined : `${type} limit of ${limit.maxAmount} ${currency} exceeded (used: ${usage})`,\n };\n }\n\n checkAllLimits(scope: JoopLimitScope, scopeId: string, amount: number, currency = 'USD'): JoopLimitCheckResult[] {\n const results: JoopLimitCheckResult[] = [];\n for (const limit of this._limits.values()) {\n if (limit.scope === scope && limit.scopeId === scopeId && limit.currency === currency && limit.enabled) {\n const check = this.checkLimit(scope, scopeId, limit.type, amount, currency);\n if (check) results.push(check);\n }\n }\n return results;\n }\n\n recordUsage(scope: JoopLimitScope, scopeId: string, type: JoopLimitType, amount: number, currency = 'USD', reference?: string): void {\n const limit = this._findLimit(scope, scopeId, type, currency);\n if (!limit) return;\n this._usage.push({ limitId: limit.id, amount, recordedAt: Date.now(), reference });\n }\n\n resetUsage(limitId: string): void {\n this._usage = this._usage.filter(u => u.limitId !== limitId);\n }\n\n getUsageSummary(scope: JoopLimitScope, scopeId: string): JoopUsageSummary {\n const limits = this.getLimits(scope, scopeId);\n const now = Date.now();\n return {\n scope,\n scopeId,\n limits: limits.map(l => {\n const used = this._currentUsage(l, now);\n const remaining = Math.max(0, l.maxAmount - used);\n return {\n limitId: l.id,\n type: l.type,\n maxAmount: l.maxAmount,\n used,\n remaining,\n utilizationPercent: Math.round((used / l.maxAmount) * 100 * 100) / 100,\n };\n }),\n };\n }\n\n // ── Observable ───────────────────────────────────────────────────────────\n\n change$() { return this._change$; }\n\n private _findLimit(scope: JoopLimitScope, scopeId: string, type: JoopLimitType, currency: string): JoopLimit | undefined {\n for (const l of this._limits.values()) {\n if (l.scope === scope && l.scopeId === scopeId && l.type === type && l.currency === currency) return l;\n }\n return undefined;\n }\n\n private _currentUsage(limit: JoopLimit, now: number): number {\n if (limit.type === 'per-transaction') return 0;\n const periodStart = _periodStart(limit.type, now);\n return this._usage\n .filter(u => u.limitId === limit.id && u.recordedAt >= periodStart)\n .reduce((s, u) => s + u.amount, 0);\n }\n\n private _toggle(limitId: string, enabled: boolean): void {\n const l = this._limits.get(limitId);\n if (!l) throw new Error(`Limit ${limitId} not found`);\n l.enabled = enabled;\n this._change$.next(l);\n }\n}\n","import { JoopSubject } from '../events';\n\nexport type JoopStandingOrderStatus = 'active' | 'paused' | 'cancelled' | 'completed';\nexport type JoopStandingOrderFrequency = 'daily' | 'weekly' | 'biweekly' | 'monthly' | 'quarterly' | 'half-yearly' | 'yearly';\nexport type JoopExecutionStatus = 'success' | 'failed' | 'skipped';\n\nexport interface JoopStandingOrder {\n id: string;\n ref: string;\n fromAccount: string;\n toAccount: string;\n toBeneficiaryName: string;\n amount: number;\n currency: string;\n frequency: JoopStandingOrderFrequency;\n startDate: number;\n endDate?: number;\n status: JoopStandingOrderStatus;\n nextExecutionAt?: number;\n executionCount: number;\n maxExecutions?: number;\n reference?: string;\n notes?: string;\n createdAt: number;\n}\n\nexport interface JoopStandingOrderExecution {\n id: string;\n orderId: string;\n executedAt: number;\n amount: number;\n currency: string;\n status: JoopExecutionStatus;\n failureReason?: string;\n transactionRef?: string;\n}\n\nfunction _uid(): string {\n return `${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;\n}\n\nfunction _computeNextDate(current: number, frequency: JoopStandingOrderFrequency): number {\n const d = new Date(current);\n switch (frequency) {\n case 'daily': d.setDate(d.getDate() + 1); break;\n case 'weekly': d.setDate(d.getDate() + 7); break;\n case 'biweekly': d.setDate(d.getDate() + 14); break;\n case 'monthly': d.setMonth(d.getMonth() + 1); break;\n case 'quarterly': d.setMonth(d.getMonth() + 3); break;\n case 'half-yearly': d.setMonth(d.getMonth() + 6); break;\n case 'yearly': d.setFullYear(d.getFullYear() + 1); break;\n }\n return d.getTime();\n}\n\nexport class JoopStandingOrderService {\n private _orders: JoopStandingOrder[] = [];\n private _executions: JoopStandingOrderExecution[] = [];\n private _seq = 0;\n private _change$ = new JoopSubject<JoopStandingOrder>();\n\n // ── CRUD ──────────────────────────────────────────────────────────────────\n\n create(params: {\n fromAccount: string;\n toAccount: string;\n toBeneficiaryName: string;\n amount: number;\n currency?: string;\n frequency: JoopStandingOrderFrequency;\n startDate: number;\n endDate?: number;\n maxExecutions?: number;\n reference?: string;\n notes?: string;\n }): JoopStandingOrder {\n if (params.amount <= 0) throw new Error('amount must be positive');\n if (!params.fromAccount.trim()) throw new Error('fromAccount required');\n if (!params.toAccount.trim()) throw new Error('toAccount required');\n if (params.endDate !== undefined && params.endDate <= params.startDate) {\n throw new Error('endDate must be after startDate');\n }\n\n this._seq += 1;\n const year = new Date().getFullYear();\n const ref = `SO-${year}-${String(this._seq).padStart(6, '0')}`;\n\n const order: JoopStandingOrder = {\n id: _uid(),\n ref,\n fromAccount: params.fromAccount,\n toAccount: params.toAccount,\n toBeneficiaryName: params.toBeneficiaryName,\n amount: params.amount,\n currency: params.currency ?? 'USD',\n frequency: params.frequency,\n startDate: params.startDate,\n endDate: params.endDate,\n status: 'active',\n nextExecutionAt: params.startDate,\n executionCount: 0,\n maxExecutions: params.maxExecutions,\n reference: params.reference,\n notes: params.notes,\n createdAt: Date.now(),\n };\n\n this._orders.push(order);\n this._change$.next(order);\n return order;\n }\n\n update(id: string, patch: Partial<Pick<JoopStandingOrder, 'amount' | 'toBeneficiaryName' | 'endDate' | 'maxExecutions' | 'reference' | 'notes'>>): JoopStandingOrder {\n const o = this._get(id);\n if (patch.amount !== undefined && patch.amount <= 0) throw new Error('amount must be positive');\n Object.assign(o, patch);\n this._change$.next(o);\n return o;\n }\n\n // ── Lifecycle ─────────────────────────────────────────────────────────────\n\n pause(id: string): JoopStandingOrder {\n const o = this._get(id);\n if (o.status !== 'active') throw new Error(`Cannot pause order with status ${o.status}`);\n o.status = 'paused';\n this._change$.next(o);\n return o;\n }\n\n resume(id: string): JoopStandingOrder {\n const o = this._get(id);\n if (o.status !== 'paused') throw new Error(`Cannot resume order with status ${o.status}`);\n o.status = 'active';\n this._change$.next(o);\n return o;\n }\n\n cancel(id: string): JoopStandingOrder {\n const o = this._get(id);\n if (o.status === 'cancelled') throw new Error('Order is already cancelled');\n o.status = 'cancelled';\n this._change$.next(o);\n return o;\n }\n\n // ── Execution ─────────────────────────────────────────────────────────────\n\n execute(id: string, status: JoopExecutionStatus = 'success', opts: { failureReason?: string; transactionRef?: string } = {}): JoopStandingOrderExecution {\n const o = this._get(id);\n if (o.status !== 'active') throw new Error(`Cannot execute order with status ${o.status}`);\n\n const exec: JoopStandingOrderExecution = {\n id: _uid(),\n orderId: id,\n executedAt: Date.now(),\n amount: o.amount,\n currency: o.currency,\n status,\n failureReason: opts.failureReason,\n transactionRef: opts.transactionRef,\n };\n\n this._executions.push(exec);\n\n if (status === 'success') {\n o.executionCount += 1;\n const next = _computeNextDate(o.nextExecutionAt ?? Date.now(), o.frequency);\n if ((o.endDate && next > o.endDate) || (o.maxExecutions && o.executionCount >= o.maxExecutions)) {\n o.status = 'completed';\n o.nextExecutionAt = undefined;\n } else {\n o.nextExecutionAt = next;\n }\n }\n\n this._change$.next(o);\n return exec;\n }\n\n // ── Queries ───────────────────────────────────────────────────────────────\n\n get(id: string): JoopStandingOrder | undefined {\n return this._orders.find(o => o.id === id);\n }\n\n getAll(): JoopStandingOrder[] {\n return [...this._orders];\n }\n\n getActive(): JoopStandingOrder[] {\n return this._orders.filter(o => o.status === 'active');\n }\n\n getByAccount(accountId: string): JoopStandingOrder[] {\n return this._orders.filter(o => o.fromAccount === accountId || o.toAccount === accountId);\n }\n\n getDue(asOf = Date.now()): JoopStandingOrder[] {\n return this._orders.filter(o => o.status === 'active' && o.nextExecutionAt !== undefined && o.nextExecutionAt <= asOf);\n }\n\n getExecutions(orderId: string): JoopStandingOrderExecution[] {\n return this._executions.filter(e => e.orderId === orderId);\n }\n\n // ── Observable ───────────────────────────────────────────────────────────\n\n change$() { return this._change$; }\n\n private _get(id: string): JoopStandingOrder {\n const o = this._orders.find(x => x.id === id);\n if (!o) throw new Error(`Standing order ${id} not found`);\n return o;\n }\n}\n","import { JoopSubject } from '../events';\n\nexport type JoopLoanAccountStatus = 'active' | 'closed' | 'defaulted' | 'written-off';\nexport type JoopRepaymentStatus = 'pending' | 'paid' | 'partial' | 'overdue' | 'waived';\nexport type JoopLoanPaymentAllocation = 'interest' | 'principal' | 'penalty';\n\nexport interface JoopLoanAccount {\n id: string;\n ref: string;\n borrowerName: string;\n borrowerId: string;\n principalAmount: number;\n outstandingPrincipal: number;\n annualInterestRatePercent: number;\n tenureMonths: number;\n disbursedAt: number;\n status: JoopLoanAccountStatus;\n emiAmount: number;\n currency: string;\n nextDueDate: number;\n totalPaid: number;\n penaltyRatePercent: number;\n notes?: string;\n}\n\nexport interface JoopInstallment {\n installmentNumber: number;\n dueDate: number;\n principalComponent: number;\n interestComponent: number;\n totalDue: number;\n outstandingAfter: number;\n status: JoopRepaymentStatus;\n paidAmount: number;\n paidAt?: number;\n}\n\nexport interface JoopLoanPayment {\n id: string;\n loanId: string;\n amount: number;\n paidAt: number;\n interestPaid: number;\n principalPaid: number;\n penaltyPaid: number;\n reference?: string;\n}\n\nexport interface JoopLoanStatement {\n loan: JoopLoanAccount;\n schedule: JoopInstallment[];\n payments: JoopLoanPayment[];\n outstandingPrincipal: number;\n accruedInterest: number;\n totalOverdue: number;\n}\n\nfunction _uid(): string {\n return `${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;\n}\n\nfunction _round(n: number, dp = 2): number {\n return Math.round(n * 10 ** dp) / 10 ** dp;\n}\n\nfunction _addMonths(ts: number, months: number): number {\n const d = new Date(ts);\n d.setMonth(d.getMonth() + months);\n return d.getTime();\n}\n\nfunction _calcEmi(principal: number, annualRate: number, tenureMonths: number): number {\n if (annualRate === 0) return _round(principal / tenureMonths);\n const r = annualRate / 100 / 12;\n return _round(principal * r * Math.pow(1 + r, tenureMonths) / (Math.pow(1 + r, tenureMonths) - 1));\n}\n\nfunction _buildSchedule(loanId: string, principal: number, annualRate: number, tenureMonths: number, startDate: number, emi: number): JoopInstallment[] {\n const schedule: JoopInstallment[] = [];\n let outstanding = principal;\n const r = annualRate / 100 / 12;\n for (let i = 1; i <= tenureMonths; i++) {\n const interest = _round(outstanding * r);\n const principalC = i < tenureMonths ? _round(emi - interest) : _round(outstanding); // last EMI clears balance\n const total = _round(interest + principalC);\n outstanding = _round(outstanding - principalC);\n if (outstanding < 0) outstanding = 0;\n schedule.push({\n installmentNumber: i,\n dueDate: _addMonths(startDate, i),\n principalComponent: principalC,\n interestComponent: interest,\n totalDue: total,\n outstandingAfter: outstanding,\n status: 'pending',\n paidAmount: 0,\n });\n }\n return schedule;\n}\n\nexport class JoopLoanServicingService {\n private _loans: JoopLoanAccount[] = [];\n private _schedules = new Map<string, JoopInstallment[]>();\n private _payments = new Map<string, JoopLoanPayment[]>();\n private _seq = 0;\n private _change$ = new JoopSubject<JoopLoanAccount>();\n\n // ── Create ────────────────────────────────────────────────────────────────\n\n createLoan(params: {\n borrowerName: string;\n borrowerId: string;\n principalAmount: number;\n annualInterestRatePercent: number;\n tenureMonths: number;\n disbursedAt?: number;\n currency?: string;\n penaltyRatePercent?: number;\n notes?: string;\n }): JoopLoanAccount {\n if (params.principalAmount <= 0) throw new Error('principalAmount must be positive');\n if (params.annualInterestRatePercent < 0) throw new Error('annualInterestRatePercent must be non-negative');\n if (params.tenureMonths <= 0) throw new Error('tenureMonths must be positive');\n\n this._seq += 1;\n const year = new Date().getFullYear();\n const ref = `LN-${year}-${String(this._seq).padStart(6, '0')}`;\n const disbursedAt = params.disbursedAt ?? Date.now();\n const emi = _calcEmi(params.principalAmount, params.annualInterestRatePercent, params.tenureMonths);\n\n const loan: JoopLoanAccount = {\n id: _uid(),\n ref,\n borrowerName: params.borrowerName,\n borrowerId: params.borrowerId,\n principalAmount: params.principalAmount,\n outstandingPrincipal: params.principalAmount,\n annualInterestRatePercent: params.annualInterestRatePercent,\n tenureMonths: params.tenureMonths,\n disbursedAt,\n status: 'active',\n emiAmount: emi,\n currency: params.currency ?? 'USD',\n nextDueDate: _addMonths(disbursedAt, 1),\n totalPaid: 0,\n penaltyRatePercent: params.penaltyRatePercent ?? 2,\n notes: params.notes,\n };\n\n this._loans.push(loan);\n this._schedules.set(loan.id, _buildSchedule(loan.id, params.principalAmount, params.annualInterestRatePercent, params.tenureMonths, disbursedAt, emi));\n this._payments.set(loan.id, []);\n this._change$.next(loan);\n return loan;\n }\n\n // ── Payments ──────────────────────────────────────────────────────────────\n\n recordPayment(loanId: string, amount: number, opts: { paidAt?: number; reference?: string } = {}): JoopLoanPayment {\n const loan = this._get(loanId);\n if (loan.status !== 'active') throw new Error(`Cannot record payment on loan with status ${loan.status}`);\n if (amount <= 0) throw new Error('amount must be positive');\n\n const schedule = this._schedules.get(loanId)!;\n const paidAt = opts.paidAt ?? Date.now();\n let remaining = amount;\n let interestPaid = 0;\n let principalPaid = 0;\n\n // Apply to oldest pending/overdue/partial installments first\n for (const inst of schedule) {\n if (remaining <= 0) break;\n if (inst.status === 'paid' || inst.status === 'waived') continue;\n\n const owed = _round(inst.totalDue - inst.paidAmount);\n const apply = Math.min(remaining, owed);\n\n // Split apply into interest vs principal proportionally\n const instTotal = inst.interestComponent + inst.principalComponent;\n const intShare = instTotal > 0 ? _round(apply * (inst.interestComponent / instTotal)) : 0;\n const priShare = _round(apply - intShare);\n\n interestPaid += intShare;\n principalPaid += priShare;\n\n inst.paidAmount = _round(inst.paidAmount + apply);\n remaining = _round(remaining - apply);\n\n if (Math.abs(inst.paidAmount - inst.totalDue) < 0.01) {\n inst.status = 'paid';\n inst.paidAt = paidAt;\n } else {\n inst.status = 'partial';\n }\n }\n\n // Any remaining amount goes directly to principal (prepayment)\n if (remaining > 0) {\n principalPaid += remaining;\n remaining = 0;\n }\n\n interestPaid = _round(interestPaid);\n principalPaid = _round(principalPaid);\n\n loan.outstandingPrincipal = _round(loan.outstandingPrincipal - principalPaid);\n if (loan.outstandingPrincipal < 0) loan.outstandingPrincipal = 0;\n loan.totalPaid = _round(loan.totalPaid + amount);\n\n // Advance nextDueDate\n const nextPending = schedule.find(i => i.status !== 'paid' && i.status !== 'waived');\n loan.nextDueDate = nextPending?.dueDate ?? loan.nextDueDate;\n\n if (loan.outstandingPrincipal === 0) {\n loan.status = 'closed';\n }\n\n const payment: JoopLoanPayment = {\n id: _uid(),\n loanId,\n amount,\n paidAt,\n interestPaid,\n principalPaid,\n penaltyPaid: 0,\n reference: opts.reference,\n };\n\n this._payments.get(loanId)!.push(payment);\n this._change$.next(loan);\n return payment;\n }\n\n waveInstallment(loanId: string, installmentNumber: number): void {\n const schedule = this._schedules.get(loanId);\n if (!schedule) throw new Error(`Loan ${loanId} not found`);\n const inst = schedule.find(i => i.installmentNumber === installmentNumber);\n if (!inst) throw new Error(`Installment ${installmentNumber} not found`);\n inst.status = 'waived';\n inst.paidAt = Date.now();\n }\n\n markDefaulted(loanId: string): JoopLoanAccount {\n const loan = this._get(loanId);\n if (loan.status !== 'active') throw new Error(`Loan is not active`);\n loan.status = 'defaulted';\n this._change$.next(loan);\n return loan;\n }\n\n // ── Queries ───────────────────────────────────────────────────────────────\n\n getLoan(id: string): JoopLoanAccount | undefined {\n return this._loans.find(l => l.id === id);\n }\n\n getAll(): JoopLoanAccount[] { return [...this._loans]; }\n\n getActive(): JoopLoanAccount[] { return this._loans.filter(l => l.status === 'active'); }\n\n getByBorrower(borrowerId: string): JoopLoanAccount[] {\n return this._loans.filter(l => l.borrowerId === borrowerId);\n }\n\n getSchedule(loanId: string): JoopInstallment[] {\n return this._schedules.get(loanId) ?? [];\n }\n\n getPendingInstallments(loanId: string): JoopInstallment[] {\n this._markOverdue(loanId);\n return (this._schedules.get(loanId) ?? []).filter(i => i.status !== 'paid' && i.status !== 'waived');\n }\n\n getOverdueInstallments(loanId: string): JoopInstallment[] {\n this._markOverdue(loanId);\n return (this._schedules.get(loanId) ?? []).filter(i => i.status === 'overdue');\n }\n\n getOutstandingBalance(loanId: string): number {\n return this._get(loanId).outstandingPrincipal;\n }\n\n getAccruedInterest(loanId: string, asOf = Date.now()): number {\n const loan = this._get(loanId);\n const daysSinceDue = Math.max(0, (asOf - loan.nextDueDate) / 86_400_000);\n if (daysSinceDue <= 0) return 0;\n return _round(loan.outstandingPrincipal * (loan.annualInterestRatePercent / 100 / 365) * daysSinceDue);\n }\n\n getLoanStatement(loanId: string): JoopLoanStatement {\n const loan = this._get(loanId);\n const schedule = this._schedules.get(loanId)!;\n const payments = this._payments.get(loanId)!;\n this._markOverdue(loanId);\n const totalOverdue = schedule\n .filter(i => i.status === 'overdue')\n .reduce((s, i) => s + _round(i.totalDue - i.paidAmount), 0);\n return {\n loan,\n schedule,\n payments,\n outstandingPrincipal: loan.outstandingPrincipal,\n accruedInterest: this.getAccruedInterest(loanId),\n totalOverdue: _round(totalOverdue),\n };\n }\n\n // ── Observable ───────────────────────────────────────────────────────────\n\n change$() { return this._change$; }\n\n private _get(id: string): JoopLoanAccount {\n const l = this._loans.find(x => x.id === id);\n if (!l) throw new Error(`Loan ${id} not found`);\n return l;\n }\n\n private _markOverdue(loanId: string): void {\n const now = Date.now();\n const schedule = this._schedules.get(loanId);\n if (!schedule) return;\n for (const inst of schedule) {\n if ((inst.status === 'pending' || inst.status === 'partial') && inst.dueDate < now) {\n inst.status = 'overdue';\n }\n }\n }\n}\n","import { JoopBehaviorSubject } from '../events';\n\nexport type JoopWalletStatus = 'active' | 'frozen' | 'closed';\nexport type JoopWalletTxnType = 'topup' | 'transfer-out' | 'transfer-in' | 'payment' | 'refund' | 'cashback' | 'withdrawal' | 'fee';\n\nexport interface JoopWallet {\n id: string;\n userId: string;\n label?: string;\n currency: string;\n balance: number;\n status: JoopWalletStatus;\n createdAt: number;\n dailyLimit?: number;\n monthlyLimit?: number;\n}\n\nexport interface JoopWalletTransaction {\n id: string;\n walletId: string;\n type: JoopWalletTxnType;\n amount: number;\n balanceBefore: number;\n balanceAfter: number;\n description: string;\n reference?: string;\n counterpartyId?: string;\n counterpartyName?: string;\n createdAt: number;\n metadata?: Record<string, unknown>;\n}\n\nexport interface JoopTransferResult {\n fromTxn: JoopWalletTransaction;\n toTxn: JoopWalletTransaction;\n}\n\nfunction _uid(): string {\n return `${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;\n}\n\nfunction _round(n: number): number {\n return Math.round(n * 100) / 100;\n}\n\nexport class JoopDigitalWalletService {\n private _wallets = new Map<string, JoopWallet>();\n private _transactions: JoopWalletTransaction[] = [];\n private _balance$ = new JoopBehaviorSubject<{ walletId: string; balance: number } | null>(null);\n\n // ── Wallet lifecycle ──────────────────────────────────────────────────────\n\n createWallet(userId: string, opts: { label?: string; currency?: string; dailyLimit?: number; monthlyLimit?: number } = {}): JoopWallet {\n const wallet: JoopWallet = {\n id: _uid(),\n userId,\n label: opts.label,\n currency: opts.currency ?? 'USD',\n balance: 0,\n status: 'active',\n createdAt: Date.now(),\n dailyLimit: opts.dailyLimit,\n monthlyLimit: opts.monthlyLimit,\n };\n this._wallets.set(wallet.id, wallet);\n return wallet;\n }\n\n freeze(walletId: string): JoopWallet {\n const w = this._getActive(walletId);\n w.status = 'frozen';\n return w;\n }\n\n unfreeze(walletId: string): JoopWallet {\n const w = this._get(walletId);\n if (w.status === 'closed') throw new Error('Cannot unfreeze a closed wallet');\n w.status = 'active';\n return w;\n }\n\n close(walletId: string): JoopWallet {\n const w = this._get(walletId);\n if (w.status === 'closed') throw new Error('Wallet already closed');\n if (w.balance > 0) throw new Error('Cannot close wallet with positive balance — withdraw funds first');\n w.status = 'closed';\n return w;\n }\n\n updateLimits(walletId: string, limits: { dailyLimit?: number; monthlyLimit?: number }): JoopWallet {\n const w = this._get(walletId);\n if (limits.dailyLimit !== undefined) w.dailyLimit = limits.dailyLimit;\n if (limits.monthlyLimit !== undefined) w.monthlyLimit = limits.monthlyLimit;\n return w;\n }\n\n // ── Funds ─────────────────────────────────────────────────────────────────\n\n topUp(walletId: string, amount: number, opts: { reference?: string; description?: string } = {}): JoopWalletTransaction {\n if (amount <= 0) throw new Error('amount must be positive');\n const w = this._getActive(walletId);\n return this._record(w, 'topup', amount, opts.description ?? 'Top-up', opts.reference);\n }\n\n withdraw(walletId: string, amount: number, opts: { reference?: string; description?: string } = {}): JoopWalletTransaction {\n if (amount <= 0) throw new Error('amount must be positive');\n const w = this._getActive(walletId);\n this._assertSufficientBalance(w, amount);\n return this._record(w, 'withdrawal', -amount, opts.description ?? 'Withdrawal', opts.reference);\n }\n\n pay(walletId: string, amount: number, merchantId: string, merchantName: string, opts: { reference?: string; metadata?: Record<string, unknown> } = {}): JoopWalletTransaction {\n if (amount <= 0) throw new Error('amount must be positive');\n const w = this._getActive(walletId);\n this._assertSufficientBalance(w, amount);\n const txn = this._record(w, 'payment', -amount, `Payment to ${merchantName}`, opts.reference);\n txn.counterpartyId = merchantId;\n txn.counterpartyName = merchantName;\n if (opts.metadata) txn.metadata = opts.metadata;\n return txn;\n }\n\n transfer(fromWalletId: string, toWalletId: string, amount: number, opts: { note?: string; reference?: string } = {}): JoopTransferResult {\n if (amount <= 0) throw new Error('amount must be positive');\n if (fromWalletId === toWalletId) throw new Error('Cannot transfer to the same wallet');\n const from = this._getActive(fromWalletId);\n const to = this._getActive(toWalletId);\n this._assertSufficientBalance(from, amount);\n if (from.currency !== to.currency) throw new Error('Cross-currency transfers not supported — use FX service');\n\n const fromTxn = this._record(from, 'transfer-out', -amount, opts.note ?? `Transfer to ${to.userId}`, opts.reference);\n fromTxn.counterpartyId = toWalletId;\n const toTxn = this._record(to, 'transfer-in', amount, opts.note ?? `Transfer from ${from.userId}`, opts.reference);\n toTxn.counterpartyId = fromWalletId;\n return { fromTxn, toTxn };\n }\n\n refund(originalTxnId: string, opts: { amount?: number; reason?: string } = {}): JoopWalletTransaction {\n const original = this._transactions.find(t => t.id === originalTxnId);\n if (!original) throw new Error(`Transaction ${originalTxnId} not found`);\n if (original.type !== 'payment') throw new Error('Can only refund payment transactions');\n const w = this._getActive(original.walletId);\n const amount = opts.amount ?? Math.abs(original.amount);\n if (amount > Math.abs(original.amount)) throw new Error('Refund exceeds original payment amount');\n return this._record(w, 'refund', amount, opts.reason ?? `Refund for ${originalTxnId}`, originalTxnId);\n }\n\n // ── Queries ───────────────────────────────────────────────────────────────\n\n getWallet(id: string): JoopWallet | undefined {\n return this._wallets.get(id);\n }\n\n getWalletsByUser(userId: string): JoopWallet[] {\n return Array.from(this._wallets.values()).filter(w => w.userId === userId);\n }\n\n getBalance(walletId: string): number {\n return this._get(walletId).balance;\n }\n\n getTransactions(walletId: string, limit?: number): JoopWalletTransaction[] {\n const all = this._transactions.filter(t => t.walletId === walletId).sort((a, b) => b.createdAt - a.createdAt);\n return limit ? all.slice(0, limit) : all;\n }\n\n getTotalSpent(walletId: string, from?: number, to?: number): number {\n return _round(\n this._transactions\n .filter(t => t.walletId === walletId && t.type === 'payment' &&\n (from === undefined || t.createdAt >= from) &&\n (to === undefined || t.createdAt <= to))\n .reduce((s, t) => s + Math.abs(t.amount), 0)\n );\n }\n\n getTotalTopUp(walletId: string): number {\n return _round(\n this._transactions\n .filter(t => t.walletId === walletId && t.type === 'topup')\n .reduce((s, t) => s + t.amount, 0)\n );\n }\n\n // ── Observable ───────────────────────────────────────────────────────────\n\n balance$() { return this._balance$; }\n\n // ── Private ───────────────────────────────────────────────────────────────\n\n private _get(id: string): JoopWallet {\n const w = this._wallets.get(id);\n if (!w) throw new Error(`Wallet ${id} not found`);\n return w;\n }\n\n private _getActive(id: string): JoopWallet {\n const w = this._get(id);\n if (w.status !== 'active') throw new Error(`Wallet is ${w.status}`);\n return w;\n }\n\n private _assertSufficientBalance(w: JoopWallet, amount: number): void {\n if (w.balance < amount) throw new Error(`Insufficient balance — available: ${w.balance}, requested: ${amount}`);\n }\n\n private _record(w: JoopWallet, type: JoopWalletTxnType, amount: number, description: string, reference?: string): JoopWalletTransaction {\n const balanceBefore = w.balance;\n w.balance = _round(w.balance + amount);\n const txn: JoopWalletTransaction = {\n id: _uid(),\n walletId: w.id,\n type,\n amount,\n balanceBefore,\n balanceAfter: w.balance,\n description,\n reference,\n createdAt: Date.now(),\n };\n this._transactions.push(txn);\n this._balance$.next({ walletId: w.id, balance: w.balance });\n return txn;\n }\n}\n","import { JoopSubject } from '../events';\n\nexport type JoopForwardType = 'buy' | 'sell';\nexport type JoopForwardStatus = 'open' | 'settled' | 'cancelled' | 'expired';\n\nexport interface JoopFxForward {\n id: string;\n ref: string;\n type: JoopForwardType;\n baseCurrency: string;\n quoteCurrency: string;\n notionalAmount: number;\n contractRate: number;\n spotRateAtCreation: number;\n maturityDate: number;\n status: JoopForwardStatus;\n counterpartyId?: string;\n counterpartyName?: string;\n createdAt: number;\n settledAt?: number;\n settlementSpotRate?: number;\n pnl?: number;\n notes?: string;\n}\n\nexport interface JoopForwardSettlement {\n forwardId: string;\n ref: string;\n settledAt: number;\n contractRate: number;\n spotRate: number;\n notionalAmount: number;\n baseCurrency: string;\n quoteCurrency: string;\n pnl: number;\n}\n\nexport interface JoopFxExposure {\n currency: string;\n type: JoopForwardType;\n totalNotional: number;\n contractCount: number;\n}\n\nfunction _uid(): string {\n return `${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;\n}\n\nfunction _round(n: number, dp = 4): number {\n return Math.round(n * 10 ** dp) / 10 ** dp;\n}\n\nexport class JoopFxForwardService {\n private _forwards: JoopFxForward[] = [];\n private _settlements: JoopForwardSettlement[] = [];\n private _spotRates = new Map<string, number>();\n private _seq = 0;\n private _change$ = new JoopSubject<JoopFxForward>();\n\n // ── Spot rates ────────────────────────────────────────────────────────────\n\n setSpotRate(baseCurrency: string, quoteCurrency: string, rate: number): void {\n if (rate <= 0) throw new Error('rate must be positive');\n this._spotRates.set(`${baseCurrency}:${quoteCurrency}`, rate);\n this._spotRates.set(`${quoteCurrency}:${baseCurrency}`, _round(1 / rate));\n }\n\n getSpotRate(baseCurrency: string, quoteCurrency: string): number | undefined {\n if (baseCurrency === quoteCurrency) return 1;\n return this._spotRates.get(`${baseCurrency}:${quoteCurrency}`);\n }\n\n // ── Forward contracts ─────────────────────────────────────────────────────\n\n createForward(params: {\n type: JoopForwardType;\n baseCurrency: string;\n quoteCurrency: string;\n notionalAmount: number;\n contractRate: number;\n maturityDate: number;\n counterpartyId?: string;\n counterpartyName?: string;\n notes?: string;\n }): JoopFxForward {\n if (params.notionalAmount <= 0) throw new Error('notionalAmount must be positive');\n if (params.contractRate <= 0) throw new Error('contractRate must be positive');\n if (params.maturityDate <= Date.now()) throw new Error('maturityDate must be in the future');\n\n const spotRate = this.getSpotRate(params.baseCurrency, params.quoteCurrency) ?? params.contractRate;\n\n this._seq += 1;\n const year = new Date().getFullYear();\n const ref = `FWD-${year}-${String(this._seq).padStart(6, '0')}`;\n\n const forward: JoopFxForward = {\n id: _uid(),\n ref,\n type: params.type,\n baseCurrency: params.baseCurrency,\n quoteCurrency: params.quoteCurrency,\n notionalAmount: params.notionalAmount,\n contractRate: params.contractRate,\n spotRateAtCreation: spotRate,\n maturityDate: params.maturityDate,\n status: 'open',\n counterpartyId: params.counterpartyId,\n counterpartyName: params.counterpartyName,\n createdAt: Date.now(),\n notes: params.notes,\n };\n\n this._forwards.push(forward);\n this._change$.next(forward);\n return forward;\n }\n\n settleForward(id: string, spotRate?: number): JoopForwardSettlement {\n const fwd = this._get(id);\n if (fwd.status !== 'open') throw new Error(`Cannot settle forward with status ${fwd.status}`);\n\n const rate = spotRate ?? this.getSpotRate(fwd.baseCurrency, fwd.quoteCurrency) ?? fwd.contractRate;\n\n // PnL = (contractRate - spotRate) * notional for a sell forward\n // (spotRate - contractRate) * notional for a buy forward\n const pnl = fwd.type === 'sell'\n ? _round((fwd.contractRate - rate) * fwd.notionalAmount, 2)\n : _round((rate - fwd.contractRate) * fwd.notionalAmount, 2);\n\n fwd.status = 'settled';\n fwd.settledAt = Date.now();\n fwd.settlementSpotRate = rate;\n fwd.pnl = pnl;\n\n const settlement: JoopForwardSettlement = {\n forwardId: id,\n ref: fwd.ref,\n settledAt: fwd.settledAt,\n contractRate: fwd.contractRate,\n spotRate: rate,\n notionalAmount: fwd.notionalAmount,\n baseCurrency: fwd.baseCurrency,\n quoteCurrency: fwd.quoteCurrency,\n pnl,\n };\n\n this._settlements.push(settlement);\n this._change$.next(fwd);\n return settlement;\n }\n\n cancelForward(id: string, notes?: string): JoopFxForward {\n const fwd = this._get(id);\n if (fwd.status !== 'open') throw new Error(`Cannot cancel forward with status ${fwd.status}`);\n fwd.status = 'cancelled';\n if (notes) fwd.notes = notes;\n this._change$.next(fwd);\n return fwd;\n }\n\n expireForward(id: string): JoopFxForward {\n const fwd = this._get(id);\n if (fwd.status !== 'open') throw new Error(`Cannot expire forward with status ${fwd.status}`);\n if (fwd.maturityDate > Date.now()) throw new Error('Forward has not yet matured');\n fwd.status = 'expired';\n this._change$.next(fwd);\n return fwd;\n }\n\n // ── Queries ───────────────────────────────────────────────────────────────\n\n get(id: string): JoopFxForward | undefined {\n return this._forwards.find(f => f.id === id);\n }\n\n getAll(status?: JoopForwardStatus): JoopFxForward[] {\n return status ? this._forwards.filter(f => f.status === status) : [...this._forwards];\n }\n\n getExpiring(withinMs: number, asOf = Date.now()): JoopFxForward[] {\n return this._forwards.filter(f => f.status === 'open' && f.maturityDate <= asOf + withinMs && f.maturityDate > asOf);\n }\n\n getSettlements(): JoopForwardSettlement[] { return [...this._settlements]; }\n\n getSettlement(forwardId: string): JoopForwardSettlement | undefined {\n return this._settlements.find(s => s.forwardId === forwardId);\n }\n\n getExposure(currency: string, type?: JoopForwardType): JoopFxExposure[] {\n const open = this._forwards.filter(f =>\n f.status === 'open' &&\n (f.baseCurrency === currency || f.quoteCurrency === currency) &&\n (type === undefined || f.type === type)\n );\n\n const map = new Map<string, JoopFxExposure>();\n for (const f of open) {\n const key = `${currency}:${f.type}`;\n const cur = map.get(key) ?? { currency, type: f.type, totalNotional: 0, contractCount: 0 };\n cur.totalNotional += f.notionalAmount;\n cur.contractCount += 1;\n map.set(key, cur);\n }\n return Array.from(map.values());\n }\n\n getTotalPnL(): number {\n return _round(this._settlements.reduce((s, settlement) => s + settlement.pnl, 0), 2);\n }\n\n getMarkToMarket(id: string): number {\n const fwd = this._get(id);\n if (fwd.status !== 'open') return fwd.pnl ?? 0;\n const spot = this.getSpotRate(fwd.baseCurrency, fwd.quoteCurrency) ?? fwd.contractRate;\n return fwd.type === 'sell'\n ? _round((fwd.contractRate - spot) * fwd.notionalAmount, 2)\n : _round((spot - fwd.contractRate) * fwd.notionalAmount, 2);\n }\n\n // ── Observable ───────────────────────────────────────────────────────────\n\n change$() { return this._change$; }\n\n private _get(id: string): JoopFxForward {\n const f = this._forwards.find(x => x.id === id);\n if (!f) throw new Error(`Forward ${id} not found`);\n return f;\n }\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 JoopVirtualScrollOptions {\n itemHeight: number;\n overscan?: number; // extra rows to render above/below visible area\n}\n\nexport interface JoopVirtualRange {\n start: number;\n end: number;\n offsetTop: number;\n}\n\nexport type JoopRenderFn<T> = (item: T, index: number) => HTMLElement;\n\nexport class JoopVirtualScroll<T = unknown> {\n private _container: HTMLElement | null = null;\n private _items: T[] = [];\n private _renderFn: JoopRenderFn<T> | null = null;\n private _opts: Required<JoopVirtualScrollOptions> = { itemHeight: 40, overscan: 3 };\n private _scrollListener: (() => void) | null = null;\n private _rangeHandlers: Array<(range: JoopVirtualRange) => void> = [];\n private _innerEl: HTMLElement | null = null;\n private _spacerTop: HTMLElement | null = null;\n private _spacerBottom: HTMLElement | null = null;\n private _rendered: HTMLElement[] = [];\n private _lastRange: JoopVirtualRange = { start: 0, end: 0, offsetTop: 0 };\n\n attach(container: HTMLElement, items: T[], renderFn: JoopRenderFn<T>, opts?: Partial<JoopVirtualScrollOptions>): void {\n this.detach();\n this._container = container;\n this._items = items;\n this._renderFn = renderFn;\n if (opts) Object.assign(this._opts, opts);\n\n container.style.overflow = 'auto';\n container.style.position = 'relative';\n\n this._spacerTop = _spacer();\n this._innerEl = document.createElement('div');\n this._spacerBottom = _spacer();\n\n container.appendChild(this._spacerTop);\n container.appendChild(this._innerEl);\n container.appendChild(this._spacerBottom);\n\n const render = () => this._render();\n container.addEventListener('scroll', render);\n this._scrollListener = () => container.removeEventListener('scroll', render);\n this._render();\n }\n\n detach(): void {\n this._scrollListener?.();\n this._spacerTop?.remove();\n this._innerEl?.remove();\n this._spacerBottom?.remove();\n this._scrollListener = null;\n this._container = null;\n this._rendered = [];\n }\n\n updateItems(items: T[]): void {\n this._items = items;\n this._render();\n }\n\n scrollTo(index: number): void {\n if (!this._container) return;\n this._container.scrollTop = index * this._opts.itemHeight;\n }\n\n getVisibleRange(): JoopVirtualRange { return { ...this._lastRange }; }\n\n onRangeChange(handler: (range: JoopVirtualRange) => void): () => void {\n this._rangeHandlers.push(handler);\n return () => { this._rangeHandlers = this._rangeHandlers.filter(h => h !== handler); };\n }\n\n private _render(): void {\n if (!this._container || !this._innerEl || !this._spacerTop || !this._spacerBottom || !this._renderFn) return;\n\n const scrollTop = this._container.scrollTop;\n const viewHeight = this._container.clientHeight;\n const { itemHeight, overscan } = this._opts;\n const total = this._items.length;\n\n const start = Math.max(0, Math.floor(scrollTop / itemHeight) - overscan);\n const end = Math.min(total, Math.ceil((scrollTop + viewHeight) / itemHeight) + overscan);\n\n this._lastRange = { start, end, offsetTop: start * itemHeight };\n this._rangeHandlers.forEach(h => h(this._lastRange));\n\n this._spacerTop.style.height = `${start * itemHeight}px`;\n this._spacerBottom.style.height = `${(total - end) * itemHeight}px`;\n\n this._innerEl.innerHTML = '';\n this._rendered = [];\n for (let i = start; i < end; i++) {\n const el = this._renderFn(this._items[i], i);\n el.style.height = `${itemHeight}px`;\n this._innerEl.appendChild(el);\n this._rendered.push(el);\n }\n }\n}\n\nfunction _spacer(): HTMLElement {\n const el = document.createElement('div');\n el.style.height = '0';\n el.style.pointerEvents = 'none';\n return el;\n}\n","export type JoopKeyboardMode = 'pin' | 'amount' | 'otp' | 'numeric';\n\nexport interface JoopBankingKeyboardConfig {\n mode?: JoopKeyboardMode;\n scramble?: boolean; // shuffle key layout on each render, default true\n haptic?: boolean; // trigger vibration on key press, default true\n maskInput?: boolean; // show dots instead of digits, default true for pin/otp\n maxLength?: number;\n theme?: 'light' | 'dark';\n}\n\nexport interface JoopBankingKeyboardOptions extends JoopBankingKeyboardConfig {\n onInput?: (value: string) => void;\n onSubmit?: (value: string) => void;\n onClear?: () => void;\n}\n\nfunction shuffle<T>(arr: T[]): T[] {\n const a = [...arr];\n for (let i = a.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [a[i], a[j]] = [a[j], a[i]];\n }\n return a;\n}\n\nexport class JoopBankingKeyboard {\n private _container: HTMLElement | null = null;\n private _value = '';\n private readonly _config: Required<Omit<JoopBankingKeyboardConfig, 'maxLength'>> & { maxLength?: number };\n private readonly _opts: JoopBankingKeyboardOptions;\n\n constructor(opts: JoopBankingKeyboardOptions = {}) {\n this._opts = opts;\n this._config = {\n mode: opts.mode ?? 'pin',\n scramble: opts.scramble ?? true,\n haptic: opts.haptic ?? true,\n maskInput: opts.maskInput ?? (opts.mode === 'amount' ? false : true),\n maxLength: opts.maxLength,\n theme: opts.theme ?? 'light',\n };\n }\n\n render(container: HTMLElement): void {\n this._container = container;\n this._container.innerHTML = '';\n this._container.setAttribute('role', 'application');\n this._container.setAttribute('aria-label', 'Secure keyboard');\n this._container.style.cssText = `\n display: grid; gap: 8px; padding: 12px;\n background: ${this._config.theme === 'dark' ? '#1a1a2e' : '#f8f9fa'};\n border-radius: 12px; user-select: none; touch-action: manipulation;\n `;\n this._renderDisplay();\n this._renderKeys();\n }\n\n getValue(): string { return this._value; }\n\n clear(): void {\n this._value = '';\n this._opts.onClear?.();\n this._opts.onInput?.('');\n this._refresh();\n }\n\n destroy(): void {\n if (this._container) { this._container.innerHTML = ''; this._container = null; }\n }\n\n private _renderDisplay(): void {\n if (!this._container) return;\n const display = document.createElement('div');\n const maxLen = this._config.maxLength ?? (this._config.mode === 'pin' ? 6 : 16);\n const dots = this._config.maskInput\n ? Array.from({ length: maxLen }, (_, i) => `<span style=\"\n display:inline-block; width:12px; height:12px; border-radius:50%; margin:0 4px;\n background:${i < this._value.length ? '#2563eb' : '#d1d5db'};\n transition:background .15s;\n \"></span>`).join('')\n : `<span style=\"font-size:24px;font-weight:700;letter-spacing:4px;color:${this._config.theme === 'dark' ? '#fff' : '#111'}\">${this._value || ' '}</span>`;\n\n display.style.cssText = 'text-align:center; padding:12px 0; min-height:40px;';\n display.innerHTML = dots;\n this._container.appendChild(display);\n }\n\n private _renderKeys(): void {\n if (!this._container) return;\n let digits = ['1','2','3','4','5','6','7','8','9','0'];\n if (this._config.scramble) {\n const numericPart = shuffle(['1','2','3','4','5','6','7','8','9']);\n digits = [...numericPart, '0'];\n }\n\n const grid = document.createElement('div');\n grid.style.cssText = 'display:grid; grid-template-columns: repeat(3,1fr); gap:8px;';\n\n const btnStyle = (bg: string, color: string) =>\n `background:${bg}; color:${color}; border:none; border-radius:10px; font-size:22px;\n font-weight:600; padding:16px; cursor:pointer; transition:opacity .1s;\n -webkit-tap-highlight-color:transparent;`;\n\n const keyColor = this._config.theme === 'dark' ? '#2a2a3e' : '#ffffff';\n const textColor = this._config.theme === 'dark' ? '#e2e8f0' : '#1a202c';\n\n // Render digit keys\n digits.slice(0, 9).forEach(d => {\n const btn = this._makeKey(d, btnStyle(keyColor, textColor));\n grid.appendChild(btn);\n });\n\n // Bottom row: clear | 0 | backspace\n if (this._config.mode === 'amount' || this._config.mode === 'numeric') {\n const decBtn = this._makeKey('.', btnStyle(keyColor, textColor));\n grid.appendChild(decBtn);\n } else {\n grid.appendChild(this._makeSpacer());\n }\n\n const zeroBtn = this._makeKey('0', btnStyle(keyColor, textColor));\n grid.appendChild(zeroBtn);\n\n const backBtn = this._makeKey('⌫', btnStyle('#ef4444', '#fff'));\n backBtn.setAttribute('aria-label', 'Backspace');\n backBtn.addEventListener('click', () => {\n this._value = this._value.slice(0, -1);\n this._opts.onInput?.(this._value);\n this._refresh();\n });\n grid.appendChild(backBtn);\n\n this._container.appendChild(grid);\n\n // Submit / clear row\n const actionRow = document.createElement('div');\n actionRow.style.cssText = 'display:flex; gap:8px; margin-top:4px;';\n\n const clearBtn = document.createElement('button');\n clearBtn.textContent = 'Clear';\n clearBtn.style.cssText = btnStyle('#6b7280', '#fff') + 'flex:1; font-size:14px; padding:12px;';\n clearBtn.addEventListener('click', () => this.clear());\n\n const submitBtn = document.createElement('button');\n submitBtn.textContent = 'Submit';\n submitBtn.style.cssText = btnStyle('#2563eb', '#fff') + 'flex:2; font-size:14px; padding:12px;';\n submitBtn.addEventListener('click', () => {\n this._opts.onSubmit?.(this._value);\n });\n\n actionRow.appendChild(clearBtn);\n actionRow.appendChild(submitBtn);\n this._container.appendChild(actionRow);\n }\n\n private _makeKey(label: string, style: string): HTMLButtonElement {\n const btn = document.createElement('button');\n btn.textContent = label;\n btn.style.cssText = style;\n btn.addEventListener('click', () => {\n const maxLen = this._config.maxLength ?? (this._config.mode === 'pin' ? 6 : (this._config.mode === 'otp' ? 6 : 16));\n if (this._value.length >= maxLen) return;\n if (this._config.haptic && navigator.vibrate) navigator.vibrate(10);\n this._value += label;\n this._opts.onInput?.(this._value);\n this._refresh();\n });\n return btn;\n }\n\n private _makeSpacer(): HTMLDivElement {\n const el = document.createElement('div');\n return el;\n }\n\n private _refresh(): void {\n if (!this._container) return;\n this.render(this._container);\n }\n}\n","// URL-pattern deeplink router — distinct from the cross-tab JoopDeeplinkService.\n// Handles incoming URLs with :param and *wildcard patterns.\n\nexport interface JoopRouteParams {\n params: Record<string, string>;\n query: Record<string, string>;\n hash: string;\n url: string;\n pattern: string;\n}\n\nexport type JoopRouteHandler = (match: JoopRouteParams) => void | Promise<void>;\n\ninterface RegisteredRoute {\n pattern: string;\n regex: RegExp;\n keys: string[];\n handler: JoopRouteHandler;\n priority: number;\n}\n\nfunction _compilePattern(pattern: string): { regex: RegExp; keys: string[] } {\n const keys: string[] = [];\n const escaped = pattern\n .replace(/\\//g, '\\\\/')\n .replace(/:([a-zA-Z_][a-zA-Z0-9_]*)/g, (_, key) => { keys.push(key); return '([^/]+)'; })\n .replace(/\\*/g, '(.*)');\n return { regex: new RegExp(`^${escaped}$`), keys };\n}\n\nfunction _parseQuery(search: string): Record<string, string> {\n const params: Record<string, string> = {};\n if (!search) return params;\n new URLSearchParams(search.startsWith('?') ? search.slice(1) : search)\n .forEach((v, k) => { params[k] = v; });\n return params;\n}\n\nexport class JoopDeeplinkRouter {\n private _routes: RegisteredRoute[] = [];\n private _fallback: JoopRouteHandler | null = null;\n private _history: string[] = [];\n private _maxHistory = 50;\n\n /** Register a URL-pattern handler. Returns an unsubscribe function. */\n on(pattern: string, handler: JoopRouteHandler, priority = 0): () => void {\n const { regex, keys } = _compilePattern(pattern);\n const route: RegisteredRoute = { pattern, regex, keys, handler, priority };\n this._routes.push(route);\n this._routes.sort((a, b) => b.priority - a.priority);\n return () => { this._routes = this._routes.filter(r => r !== route); };\n }\n\n /** Register a fallback handler for unmatched URLs. */\n fallback(handler: JoopRouteHandler): void {\n this._fallback = handler;\n }\n\n /** Dispatch a URL, return true if a handler matched. */\n async dispatch(url: string): Promise<boolean> {\n this._history.push(url);\n if (this._history.length > this._maxHistory) this._history.shift();\n\n let path: string, search: string, hash: string;\n try {\n const parsed = new URL(url, 'http://x');\n path = parsed.pathname;\n search = parsed.search;\n hash = parsed.hash;\n } catch {\n path = url; search = ''; hash = '';\n }\n\n for (const route of this._routes) {\n const match = route.regex.exec(path);\n if (!match) continue;\n const params: Record<string, string> = {};\n route.keys.forEach((k, i) => { params[k] = decodeURIComponent(match[i + 1] ?? ''); });\n await route.handler({ params, query: _parseQuery(search), hash, url, pattern: route.pattern });\n return true;\n }\n\n if (this._fallback) {\n await this._fallback({ params: {}, query: _parseQuery(search), hash, url, pattern: '' });\n }\n return false;\n }\n\n /** Parse a URL into parts without dispatching. */\n parse(url: string): Omit<JoopRouteParams, 'pattern'> & { matchedPattern: string | null } {\n let path: string, search: string, hash: string;\n try {\n const p = new URL(url, 'http://x');\n path = p.pathname; search = p.search; hash = p.hash;\n } catch { path = url; search = ''; hash = ''; }\n\n for (const route of this._routes) {\n const match = route.regex.exec(path);\n if (!match) continue;\n const params: Record<string, string> = {};\n route.keys.forEach((k, i) => { params[k] = decodeURIComponent(match[i + 1] ?? ''); });\n return { params, query: _parseQuery(search), hash, url, matchedPattern: route.pattern };\n }\n return { params: {}, query: _parseQuery(search), hash, url, matchedPattern: null };\n }\n\n /** Build a URL from a pattern and param values. */\n buildUrl(pattern: string, params: Record<string, string> = {}, query: Record<string, string> = {}): string {\n let path = pattern;\n for (const [k, v] of Object.entries(params)) {\n path = path.replace(`:${k}`, encodeURIComponent(v));\n }\n const qs = new URLSearchParams(query).toString();\n return qs ? `${path}?${qs}` : path;\n }\n\n /** List all registered patterns. */\n routes(): string[] {\n return this._routes.map(r => r.pattern);\n }\n\n /** Navigation history (last N dispatched URLs). */\n history(): readonly string[] {\n return this._history;\n }\n\n /** Remove all registered handlers. */\n clear(): void {\n this._routes = [];\n this._fallback = null;\n }\n\n /** Dispatch the current window.location.href. */\n dispatchCurrent(): Promise<boolean> {\n if (typeof window === 'undefined') return Promise.resolve(false);\n return this.dispatch(window.location.href);\n }\n}\n","// Configurable password rule engine with named rule sets\n\nexport interface JoopPasswordRule {\n id: string;\n label: string;\n test: (password: string) => boolean;\n required?: boolean;\n}\n\nexport interface JoopPasswordRuleSet {\n name: string;\n rules: JoopPasswordRule[];\n minScore?: number; // minimum rules that must pass (default: all required rules)\n}\n\nexport interface JoopPasswordValidationResult {\n valid: boolean;\n score: number; // 0–100\n strength: 'weak' | 'fair' | 'strong' | 'very-strong';\n passed: string[]; // rule IDs that passed\n failed: string[]; // rule IDs that failed\n failedLabels: string[]; // human-readable failure messages\n}\n\n// ── Built-in rules ────────────────────────────────────────────────────────────\n\nexport const passwordRules = {\n minLength: (n: number): JoopPasswordRule => ({\n id: `minLength:${n}`, label: `At least ${n} characters`, required: true,\n test: pw => pw.length >= n,\n }),\n maxLength: (n: number): JoopPasswordRule => ({\n id: `maxLength:${n}`, label: `No more than ${n} characters`, required: true,\n test: pw => pw.length <= n,\n }),\n uppercase: (n = 1): JoopPasswordRule => ({\n id: `uppercase:${n}`, label: `At least ${n} uppercase letter${n>1?'s':''}`, required: true,\n test: pw => (pw.match(/[A-Z]/g)?.length ?? 0) >= n,\n }),\n lowercase: (n = 1): JoopPasswordRule => ({\n id: `lowercase:${n}`, label: `At least ${n} lowercase letter${n>1?'s':''}`, required: true,\n test: pw => (pw.match(/[a-z]/g)?.length ?? 0) >= n,\n }),\n digit: (n = 1): JoopPasswordRule => ({\n id: `digit:${n}`, label: `At least ${n} digit${n>1?'s':''}`, required: true,\n test: pw => (pw.match(/[0-9]/g)?.length ?? 0) >= n,\n }),\n special: (n = 1, chars = '!@#$%^&*()_+-=[]{}|;\\':\",.<>?/`~\\\\'): JoopPasswordRule => ({\n id: `special:${n}`, label: `At least ${n} special character${n>1?'s':''}`, required: true,\n test: pw => pw.split('').filter(c => chars.includes(c)).length >= n,\n }),\n noSpaces: (): JoopPasswordRule => ({\n id: 'noSpaces', label: 'No spaces allowed', required: true,\n test: pw => !/\\s/.test(pw),\n }),\n noRepeatingChars: (n = 3): JoopPasswordRule => ({\n id: `noRepeating:${n}`, label: `No ${n}+ consecutive identical characters`, required: false,\n test: pw => !new RegExp(`(.)\\\\1{${n-1},}`).test(pw),\n }),\n noSequential: (): JoopPasswordRule => ({\n id: 'noSequential', label: 'No sequential characters (abc, 123)', required: false,\n test: pw => {\n const s = pw.toLowerCase();\n for (let i = 0; i < s.length - 2; i++) {\n const a = s.charCodeAt(i), b = s.charCodeAt(i+1), c = s.charCodeAt(i+2);\n if (b === a+1 && c === a+2) return false;\n }\n return true;\n },\n }),\n noCommonWords: (list?: string[]): JoopPasswordRule => {\n const common = list ?? ['password','123456','qwerty','letmein','admin','welcome','monkey','dragon'];\n return {\n id: 'noCommonWords', label: 'Not a common password', required: false,\n test: pw => !common.includes(pw.toLowerCase()),\n };\n },\n matchesPattern: (pattern: RegExp, label: string): JoopPasswordRule => ({\n id: `pattern:${pattern.source}`, label, required: true,\n test: pw => pattern.test(pw),\n }),\n};\n\n// ── Pre-defined rule sets ─────────────────────────────────────────────────────\n\nexport const passwordRuleSets = {\n /** Basic: 8+ chars, 1 uppercase, 1 digit */\n basic: (): JoopPasswordRuleSet => ({\n name: 'basic',\n rules: [\n passwordRules.minLength(8),\n passwordRules.uppercase(),\n passwordRules.digit(),\n ],\n }),\n\n /** Standard: 10+ chars, upper, lower, digit, special */\n standard: (): JoopPasswordRuleSet => ({\n name: 'standard',\n rules: [\n passwordRules.minLength(10),\n passwordRules.uppercase(),\n passwordRules.lowercase(),\n passwordRules.digit(),\n passwordRules.special(),\n passwordRules.noSpaces(),\n ],\n }),\n\n /** Banking: strict 12+ chars, 2 uppercase, 2 digits, 2 special, no repeats */\n banking: (): JoopPasswordRuleSet => ({\n name: 'banking',\n rules: [\n passwordRules.minLength(12),\n passwordRules.maxLength(64),\n passwordRules.uppercase(2),\n passwordRules.lowercase(2),\n passwordRules.digit(2),\n passwordRules.special(2),\n passwordRules.noSpaces(),\n passwordRules.noRepeatingChars(3),\n passwordRules.noSequential(),\n passwordRules.noCommonWords(),\n ],\n }),\n\n /** PIN: exactly N digits */\n pin: (length = 6): JoopPasswordRuleSet => ({\n name: 'pin',\n rules: [\n passwordRules.matchesPattern(new RegExp(`^\\\\d{${length}}$`), `Exactly ${length} digits`),\n passwordRules.noRepeatingChars(length),\n ],\n }),\n};\n\n// ── Validator ─────────────────────────────────────────────────────────────────\n\nexport class JoopPasswordRulesValidator {\n private _ruleSet: JoopPasswordRuleSet;\n\n constructor(ruleSet: JoopPasswordRuleSet) {\n this._ruleSet = ruleSet;\n }\n\n validate(password: string): JoopPasswordValidationResult {\n const passed: string[] = [];\n const failed: string[] = [];\n const failedLabels: string[] = [];\n\n for (const rule of this._ruleSet.rules) {\n if (rule.test(password)) {\n passed.push(rule.id);\n } else {\n failed.push(rule.id);\n failedLabels.push(rule.label);\n }\n }\n\n const requiredFailed = this._ruleSet.rules\n .filter(r => r.required !== false && !passed.includes(r.id));\n\n const valid = requiredFailed.length === 0;\n const total = this._ruleSet.rules.length;\n const score = total > 0 ? Math.round((passed.length / total) * 100) : 0;\n\n return {\n valid,\n score,\n strength: score < 40 ? 'weak' : score < 65 ? 'fair' : score < 85 ? 'strong' : 'very-strong',\n passed,\n failed,\n failedLabels,\n };\n }\n\n /** Check a single rule by ID */\n checkRule(password: string, ruleId: string): boolean {\n const rule = this._ruleSet.rules.find(r => r.id === ruleId);\n return rule ? rule.test(password) : false;\n }\n\n /** Get all rules with their current pass/fail state */\n getRuleStates(password: string): Array<{ rule: JoopPasswordRule; passed: boolean }> {\n return this._ruleSet.rules.map(rule => ({ rule, passed: rule.test(password) }));\n }\n\n /** Swap the rule set at runtime */\n setRuleSet(ruleSet: JoopPasswordRuleSet): void {\n this._ruleSet = ruleSet;\n }\n}\n","import { JoopBehaviorSubject } from '../events';\n\nexport interface JoopOtpTimerConfig {\n duration?: number; // seconds, default 60\n resendCooldown?: number; // seconds, default 30\n autoStart?: boolean;\n}\n\nexport interface JoopOtpTimerState {\n remaining: number;\n phase: 'idle' | 'counting' | 'expired' | 'cooldown';\n canResend: boolean;\n cooldownRemaining: number;\n}\n\nexport class JoopOtpTimer {\n private readonly _duration: number;\n private readonly _resendCooldown: number;\n\n private _remaining = 0;\n private _cooldownRemaining = 0;\n private _phase: JoopOtpTimerState['phase'] = 'idle';\n private _ticker: ReturnType<typeof setInterval> | null = null;\n private _cooldownTicker: ReturnType<typeof setInterval> | null = null;\n\n private readonly _state$: JoopBehaviorSubject<JoopOtpTimerState>;\n\n private _onExpire: (() => void) | null = null;\n private _onTick: ((remaining: number) => void) | null = null;\n\n constructor(config: JoopOtpTimerConfig = {}) {\n this._duration = config.duration ?? 60;\n this._resendCooldown = config.resendCooldown ?? 30;\n this._state$ = new JoopBehaviorSubject<JoopOtpTimerState>(this._snapshot());\n if (config.autoStart) this.start();\n }\n\n start(): void {\n this._clearTickers();\n this._remaining = this._duration;\n this._phase = 'counting';\n this._emit();\n\n this._ticker = setInterval(() => {\n this._remaining--;\n this._onTick?.(this._remaining);\n if (this._remaining <= 0) {\n this._clearTickers();\n this._phase = 'expired';\n this._remaining = 0;\n this._onExpire?.();\n }\n this._emit();\n }, 1000);\n }\n\n resend(): boolean {\n if (!this.canResend) return false;\n this._startCooldown();\n this.start();\n return true;\n }\n\n stop(): void {\n this._clearTickers();\n this._phase = 'idle';\n this._remaining = 0;\n this._emit();\n }\n\n reset(): void {\n this.stop();\n }\n\n onExpire(fn: () => void): this {\n this._onExpire = fn;\n return this;\n }\n\n onTick(fn: (remaining: number) => void): this {\n this._onTick = fn;\n return this;\n }\n\n get remaining(): number { return this._remaining; }\n get phase(): JoopOtpTimerState['phase'] { return this._phase; }\n get isExpired(): boolean { return this._phase === 'expired'; }\n get isCounting(): boolean { return this._phase === 'counting'; }\n get canResend(): boolean { return this._phase !== 'cooldown' && this._cooldownRemaining === 0; }\n\n remaining$(): JoopBehaviorSubject<JoopOtpTimerState> { return this._state$; }\n\n progress(): number {\n if (this._duration === 0) return 0;\n return Math.max(0, Math.min(1, this._remaining / this._duration));\n }\n\n destroy(): void {\n this._clearTickers();\n }\n\n private _startCooldown(): void {\n this._cooldownRemaining = this._resendCooldown;\n this._cooldownTicker = setInterval(() => {\n this._cooldownRemaining--;\n if (this._cooldownRemaining <= 0) {\n this._cooldownRemaining = 0;\n clearInterval(this._cooldownTicker!);\n this._cooldownTicker = null;\n }\n this._emit();\n }, 1000);\n }\n\n private _clearTickers(): void {\n if (this._ticker) { clearInterval(this._ticker); this._ticker = null; }\n }\n\n private _snapshot(): JoopOtpTimerState {\n return {\n remaining: this._remaining,\n phase: this._phase,\n canResend: this.canResend,\n cooldownRemaining: this._cooldownRemaining,\n };\n }\n\n private _emit(): void {\n this._state$.next(this._snapshot());\n }\n}\n","import { JoopBehaviorSubject, JoopSubject } from '../events';\n\nexport type JoopBudgetPeriod = 'daily' | 'weekly' | 'monthly';\n\nexport interface JoopBudgetCategory {\n category: string;\n limitAmount: number;\n period: JoopBudgetPeriod;\n currency?: string;\n color?: string;\n}\n\nexport interface JoopBudgetEntry {\n id: string;\n category: string;\n amount: number;\n date: number;\n description?: string;\n}\n\nexport interface JoopBudgetStatus {\n category: string;\n limitAmount: number;\n spentAmount: number;\n remainingAmount: number;\n percentUsed: number;\n isOverBudget: boolean;\n isNearLimit: boolean;\n period: JoopBudgetPeriod;\n currency: string;\n}\n\nexport interface JoopBudgetSummary {\n totalLimit: number;\n totalSpent: number;\n totalRemaining: number;\n overBudgetCount: number;\n nearLimitCount: number;\n currency: string;\n}\n\nfunction _periodStart(period: JoopBudgetPeriod, asOf: Date): Date {\n const d = new Date(asOf);\n if (period === 'daily') {\n d.setHours(0, 0, 0, 0);\n } else if (period === 'weekly') {\n const day = d.getDay();\n d.setDate(d.getDate() - day);\n d.setHours(0, 0, 0, 0);\n } else {\n d.setDate(1);\n d.setHours(0, 0, 0, 0);\n }\n return d;\n}\n\nexport class JoopBudgetService {\n private _categories = new Map<string, JoopBudgetCategory>();\n private _entries: JoopBudgetEntry[] = [];\n private _alertThreshold = 0.8;\n private _alertHandlers: Array<(status: JoopBudgetStatus) => void> = [];\n private _status$ = new JoopSubject<JoopBudgetStatus>();\n\n // ── Budgets ──────────────────────────────────────────────────────────────\n\n setBudget(budget: JoopBudgetCategory): void {\n this._categories.set(budget.category, budget);\n }\n\n removeBudget(category: string): void {\n this._categories.delete(category);\n }\n\n getBudget(category: string): JoopBudgetCategory | undefined {\n return this._categories.get(category);\n }\n\n getAllBudgets(): JoopBudgetCategory[] {\n return Array.from(this._categories.values());\n }\n\n // ── Spending entries ─────────────────────────────────────────────────────\n\n addSpending(entry: Omit<JoopBudgetEntry, 'id'>): JoopBudgetEntry {\n const e: JoopBudgetEntry = { ...entry, id: _uid() };\n this._entries.push(e);\n const budget = this._categories.get(e.category);\n if (budget) {\n const status = this._computeStatus(budget, new Date(e.date));\n if (status.isOverBudget || status.isNearLimit) {\n this._alertHandlers.forEach(h => h(status));\n this._status$.next(status);\n }\n }\n return e;\n }\n\n removeSpending(id: string): void {\n this._entries = this._entries.filter(e => e.id !== id);\n }\n\n getSpending(category?: string): JoopBudgetEntry[] {\n return category ? this._entries.filter(e => e.category === category) : [...this._entries];\n }\n\n // ── Status ───────────────────────────────────────────────────────────────\n\n getStatus(category: string, asOf: Date = new Date()): JoopBudgetStatus | null {\n const budget = this._categories.get(category);\n if (!budget) return null;\n return this._computeStatus(budget, asOf);\n }\n\n getAllStatus(asOf: Date = new Date()): JoopBudgetStatus[] {\n return Array.from(this._categories.values()).map(b => this._computeStatus(b, asOf));\n }\n\n getOverBudget(asOf: Date = new Date()): JoopBudgetStatus[] {\n return this.getAllStatus(asOf).filter(s => s.isOverBudget);\n }\n\n getNearLimit(asOf: Date = new Date()): JoopBudgetStatus[] {\n return this.getAllStatus(asOf).filter(s => s.isNearLimit && !s.isOverBudget);\n }\n\n // ── Summary ──────────────────────────────────────────────────────────────\n\n getSummary(asOf: Date = new Date()): JoopBudgetSummary {\n const statuses = this.getAllStatus(asOf);\n const currencies = new Set(this.getAllBudgets().map(b => b.currency ?? 'USD'));\n return {\n totalLimit: statuses.reduce((s, st) => s + st.limitAmount, 0),\n totalSpent: statuses.reduce((s, st) => s + st.spentAmount, 0),\n totalRemaining: statuses.reduce((s, st) => s + Math.max(0, st.remainingAmount), 0),\n overBudgetCount: statuses.filter(s => s.isOverBudget).length,\n nearLimitCount: statuses.filter(s => s.isNearLimit && !s.isOverBudget).length,\n currency: currencies.size === 1 ? [...currencies][0] : 'MIXED',\n };\n }\n\n // ── Alerts ───────────────────────────────────────────────────────────────\n\n setAlertThreshold(threshold: number): void {\n this._alertThreshold = Math.max(0, Math.min(1, threshold));\n }\n\n getAlertThreshold(): number { return this._alertThreshold; }\n\n onAlert(handler: (status: JoopBudgetStatus) => void): () => void {\n this._alertHandlers.push(handler);\n return () => { this._alertHandlers = this._alertHandlers.filter(h => h !== handler); };\n }\n\n status$() { return this._status$.asObservable(); }\n\n reset(category?: string): void {\n if (category) {\n this._entries = this._entries.filter(e => e.category !== category);\n } else {\n this._entries = [];\n }\n }\n\n // ── Internal ─────────────────────────────────────────────────────────────\n\n private _computeStatus(budget: JoopBudgetCategory, asOf: Date): JoopBudgetStatus {\n const start = _periodStart(budget.period, asOf).getTime();\n const spent = this._entries\n .filter(e => e.category === budget.category && e.date >= start && e.date <= asOf.getTime())\n .reduce((s, e) => s + e.amount, 0);\n\n const remaining = budget.limitAmount - spent;\n const percentUsed = budget.limitAmount > 0 ? spent / budget.limitAmount : 0;\n\n return {\n category: budget.category,\n limitAmount: budget.limitAmount,\n spentAmount: spent,\n remainingAmount: remaining,\n percentUsed: Math.round(percentUsed * 10000) / 10000,\n isOverBudget: spent > budget.limitAmount,\n isNearLimit: percentUsed >= this._alertThreshold && spent <= budget.limitAmount,\n period: budget.period,\n currency: budget.currency ?? 'USD',\n };\n }\n}\n\nfunction _uid(): string { return `${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`; }\n","import { JoopBehaviorSubject, JoopSubject } from '../events';\n\nexport type JoopGoalStatus = 'active' | 'completed' | 'paused' | 'cancelled';\nexport type JoopAutoDebitFrequency = 'daily' | 'weekly' | 'monthly';\n\nexport interface JoopSavingsGoal {\n id: string;\n name: string;\n targetAmount: number;\n currentAmount: number;\n currency: string;\n targetDate?: number;\n autoDebitAmount?: number;\n autoDebitFrequency?: JoopAutoDebitFrequency;\n icon?: string;\n notes?: string;\n createdAt: number;\n completedAt?: number;\n status: JoopGoalStatus;\n}\n\nexport interface JoopSavingsTransaction {\n id: string;\n goalId: string;\n amount: number; // positive = deposit, negative = withdrawal\n type: 'deposit' | 'withdrawal';\n note?: string;\n date: number;\n}\n\nexport interface JoopSavingsProgress {\n goal: JoopSavingsGoal;\n progressPercent: number;\n remainingAmount: number;\n daysRemaining: number | null;\n isOnTrack: boolean;\n projectedCompletionDate: number | null;\n requiredMonthlyAmount: number | null;\n dailyTargetAmount: number | null;\n}\n\nexport class JoopSavingsGoalService {\n private _goals = new Map<string, JoopSavingsGoal>();\n private _transactions: JoopSavingsTransaction[] = [];\n private _completedHandlers: Array<(goal: JoopSavingsGoal) => void> = [];\n private _goals$ = new JoopBehaviorSubject<JoopSavingsGoal[]>([]);\n\n // ── CRUD ─────────────────────────────────────────────────────────────────\n\n create(data: Omit<JoopSavingsGoal, 'id' | 'createdAt' | 'status' | 'currentAmount'> & { currentAmount?: number }): JoopSavingsGoal {\n const goal: JoopSavingsGoal = {\n ...data,\n id: _uid(),\n currentAmount: data.currentAmount ?? 0,\n createdAt: Date.now(),\n status: 'active',\n };\n this._goals.set(goal.id, goal);\n this._emit();\n return { ...goal };\n }\n\n update(id: string, patch: Partial<Omit<JoopSavingsGoal, 'id' | 'createdAt'>>): JoopSavingsGoal {\n const goal = this._get(id);\n const updated = { ...goal, ...patch };\n this._goals.set(id, updated);\n this._emit();\n return { ...updated };\n }\n\n delete(id: string): void {\n this._goals.delete(id);\n this._transactions = this._transactions.filter(t => t.goalId !== id);\n this._emit();\n }\n\n get(id: string): JoopSavingsGoal | undefined {\n const g = this._goals.get(id);\n return g ? { ...g } : undefined;\n }\n\n getAll(): JoopSavingsGoal[] { return Array.from(this._goals.values()).map(g => ({ ...g })); }\n getActive(): JoopSavingsGoal[] { return this.getAll().filter(g => g.status === 'active'); }\n getCompleted(): JoopSavingsGoal[] { return this.getAll().filter(g => g.status === 'completed'); }\n\n // ── Transactions ─────────────────────────────────────────────────────────\n\n deposit(id: string, amount: number, note?: string): JoopSavingsGoal {\n if (amount <= 0) throw new Error('Deposit amount must be positive');\n const goal = this._get(id);\n if (goal.status !== 'active') throw new Error(`Cannot deposit into a ${goal.status} goal`);\n\n const tx: JoopSavingsTransaction = { id: _uid(), goalId: id, amount, type: 'deposit', note, date: Date.now() };\n this._transactions.push(tx);\n\n goal.currentAmount += amount;\n if (goal.currentAmount >= goal.targetAmount) {\n goal.status = 'completed';\n goal.completedAt = Date.now();\n this._completedHandlers.forEach(h => h({ ...goal }));\n }\n this._goals.set(id, goal);\n this._emit();\n return { ...goal };\n }\n\n withdraw(id: string, amount: number, note?: string): JoopSavingsGoal {\n if (amount <= 0) throw new Error('Withdrawal amount must be positive');\n const goal = this._get(id);\n if (goal.currentAmount < amount) throw new Error('Insufficient savings balance');\n\n const tx: JoopSavingsTransaction = { id: _uid(), goalId: id, amount: -amount, type: 'withdrawal', note, date: Date.now() };\n this._transactions.push(tx);\n goal.currentAmount -= amount;\n if (goal.status === 'completed') goal.status = 'active';\n this._goals.set(id, goal);\n this._emit();\n return { ...goal };\n }\n\n getTransactions(goalId: string): JoopSavingsTransaction[] {\n return this._transactions.filter(t => t.goalId === goalId);\n }\n\n // ── Progress ─────────────────────────────────────────────────────────────\n\n getProgress(id: string, asOf: number = Date.now()): JoopSavingsProgress | null {\n const goal = this.get(id);\n if (!goal) return null;\n return this._computeProgress(goal, asOf);\n }\n\n getAllProgress(asOf: number = Date.now()): JoopSavingsProgress[] {\n return this.getAll().map(g => this._computeProgress(g, asOf));\n }\n\n // ── Lifecycle ────────────────────────────────────────────────────────────\n\n complete(id: string): void { this.update(id, { status: 'completed', completedAt: Date.now() }); }\n pause(id: string): void { this.update(id, { status: 'paused' }); }\n resume(id: string): void { this.update(id, { status: 'active' }); }\n cancel(id: string): void { this.update(id, { status: 'cancelled' }); }\n\n // ── Aggregates ───────────────────────────────────────────────────────────\n\n totalSaved(): number { return this.getActive().reduce((s, g) => s + g.currentAmount, 0); }\n totalTarget(): number { return this.getActive().reduce((s, g) => s + g.targetAmount, 0); }\n overallProgress(): number {\n const target = this.totalTarget();\n return target > 0 ? Math.min(1, this.totalSaved() / target) : 0;\n }\n\n // ── Events ───────────────────────────────────────────────────────────────\n\n onGoalCompleted(handler: (goal: JoopSavingsGoal) => void): () => void {\n this._completedHandlers.push(handler);\n return () => { this._completedHandlers = this._completedHandlers.filter(h => h !== handler); };\n }\n\n goals$() { return this._goals$.asObservable(); }\n\n // ── Internals ────────────────────────────────────────────────────────────\n\n private _get(id: string): JoopSavingsGoal {\n const g = this._goals.get(id);\n if (!g) throw new Error(`Savings goal '${id}' not found`);\n return g;\n }\n\n private _emit(): void { this._goals$.next(this.getAll()); }\n\n private _computeProgress(goal: JoopSavingsGoal, asOf: number): JoopSavingsProgress {\n const remaining = Math.max(0, goal.targetAmount - goal.currentAmount);\n const progressPercent = goal.targetAmount > 0 ? Math.min(1, goal.currentAmount / goal.targetAmount) : 0;\n\n let daysRemaining: number | null = null;\n let isOnTrack = false;\n let projectedCompletionDate: number | null = null;\n let requiredMonthlyAmount: number | null = null;\n let dailyTargetAmount: number | null = null;\n\n if (goal.targetDate) {\n const msLeft = goal.targetDate - asOf;\n daysRemaining = Math.max(0, Math.ceil(msLeft / 86_400_000));\n requiredMonthlyAmount = daysRemaining > 0 ? (remaining / daysRemaining) * 30 : null;\n dailyTargetAmount = daysRemaining > 0 ? remaining / daysRemaining : 0;\n\n // On-track: current progress >= expected linear progress\n const totalDays = (goal.targetDate - goal.createdAt) / 86_400_000;\n const elapsedDays = (asOf - goal.createdAt) / 86_400_000;\n const expectedProgress = totalDays > 0 ? elapsedDays / totalDays : 0;\n isOnTrack = progressPercent >= expectedProgress;\n }\n\n if (goal.autoDebitAmount && goal.autoDebitAmount > 0 && remaining > 0) {\n const periodsNeeded = Math.ceil(remaining / goal.autoDebitAmount);\n const msPerPeriod = goal.autoDebitFrequency === 'daily' ? 86_400_000 : goal.autoDebitFrequency === 'weekly' ? 604_800_000 : 2_592_000_000;\n projectedCompletionDate = asOf + periodsNeeded * msPerPeriod;\n }\n\n return { goal: { ...goal }, progressPercent, remainingAmount: remaining, daysRemaining, isOnTrack, projectedCompletionDate, requiredMonthlyAmount, dailyTargetAmount };\n }\n}\n\nfunction _uid(): string { return `${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`; }\n","import { JoopBehaviorSubject } from '../events';\n\nexport interface JoopExchangeRate {\n from: string;\n to: string;\n rate: number;\n timestamp: number;\n source?: string;\n}\n\nexport interface JoopConversionResult {\n from: string;\n to: string;\n amount: number;\n convertedAmount: number;\n rate: number;\n inverseRate: number;\n spread: number;\n fee: number;\n grossAmount: number;\n netAmount: number;\n timestamp: number;\n}\n\nexport interface JoopExchangeRateProvider {\n name: string;\n fetch(base: string, targets: string[]): Promise<Record<string, number>>;\n}\n\nexport class JoopCurrencyExchangeService {\n private _rates = new Map<string, JoopExchangeRate>(); // key: \"FROM_TO\"\n private _history = new Map<string, JoopExchangeRate[]>(); // key: \"FROM_TO\"\n private _provider: JoopExchangeRateProvider | null = null;\n private _rates$ = new JoopBehaviorSubject<JoopExchangeRate[]>([]);\n\n // ── Provider ─────────────────────────────────────────────────────────────\n\n setProvider(provider: JoopExchangeRateProvider): void {\n this._provider = provider;\n }\n\n // ── Manual rate management ────────────────────────────────────────────────\n\n setRate(from: string, to: string, rate: number, source?: string): void {\n const key = _key(from, to);\n const entry: JoopExchangeRate = { from: from.toUpperCase(), to: to.toUpperCase(), rate, timestamp: Date.now(), source };\n this._rates.set(key, entry);\n // also store inverse\n const invKey = _key(to, from);\n this._rates.set(invKey, { from: to.toUpperCase(), to: from.toUpperCase(), rate: 1 / rate, timestamp: entry.timestamp, source });\n this._pushHistory(key, entry);\n this._pushHistory(invKey, this._rates.get(invKey)!);\n this._emitRates();\n }\n\n setRates(rates: JoopExchangeRate[]): void {\n for (const r of rates) this.setRate(r.from, r.to, r.rate, r.source);\n }\n\n // ── Fetch from provider ───────────────────────────────────────────────────\n\n async fetchRates(base: string, targets: string[] = []): Promise<void> {\n if (!this._provider) throw new Error('JoopCurrencyExchangeService: no provider set. Call setProvider() first.');\n const result = await this._provider.fetch(base.toUpperCase(), targets.map(t => t.toUpperCase()));\n for (const [to, rate] of Object.entries(result)) {\n this.setRate(base, to, rate, this._provider.name);\n }\n }\n\n // ── Query ─────────────────────────────────────────────────────────────────\n\n getRate(from: string, to: string): number | null {\n if (from.toUpperCase() === to.toUpperCase()) return 1;\n const direct = this._rates.get(_key(from, to));\n if (direct) return direct.rate;\n // try cross-rate via USD\n const toUsd = this._rates.get(_key(from, 'USD'));\n const fromUsd = this._rates.get(_key('USD', to));\n if (toUsd && fromUsd) return toUsd.rate * fromUsd.rate;\n return null;\n }\n\n getRateEntry(from: string, to: string): JoopExchangeRate | null {\n return this._rates.get(_key(from, to)) ?? null;\n }\n\n // ── Conversion ────────────────────────────────────────────────────────────\n\n convert(amount: number, from: string, to: string, spreadPercent = 0, fixedFee = 0): JoopConversionResult {\n from = from.toUpperCase(); to = to.toUpperCase();\n const rate = this.getRate(from, to);\n if (rate === null) throw new Error(`JoopCurrencyExchangeService: no rate for ${from} → ${to}`);\n\n const spread = amount * (spreadPercent / 100);\n const grossAmount = (amount - spread) * rate;\n const netAmount = grossAmount - fixedFee;\n\n return {\n from, to, amount,\n convertedAmount: parseFloat(grossAmount.toFixed(6)),\n rate,\n inverseRate: parseFloat((1 / rate).toFixed(6)),\n spread: parseFloat(spread.toFixed(6)),\n fee: fixedFee,\n grossAmount: parseFloat(grossAmount.toFixed(6)),\n netAmount: parseFloat(netAmount.toFixed(6)),\n timestamp: Date.now(),\n };\n }\n\n // ── History ───────────────────────────────────────────────────────────────\n\n getHistory(from: string, to: string): JoopExchangeRate[] {\n return [...(this._history.get(_key(from, to)) ?? [])];\n }\n\n // ── Meta ──────────────────────────────────────────────────────────────────\n\n getSupportedCurrencies(): string[] {\n const set = new Set<string>();\n for (const r of this._rates.values()) { set.add(r.from); set.add(r.to); }\n return Array.from(set).sort();\n }\n\n isSupported(currency: string): boolean {\n return this.getSupportedCurrencies().includes(currency.toUpperCase());\n }\n\n getAllRates(): JoopExchangeRate[] { return Array.from(this._rates.values()); }\n\n rates$() { return this._rates$.asObservable(); }\n\n // ── Internals ─────────────────────────────────────────────────────────────\n\n private _pushHistory(key: string, entry: JoopExchangeRate): void {\n const hist = this._history.get(key) ?? [];\n hist.push(entry);\n if (hist.length > 500) hist.shift();\n this._history.set(key, hist);\n }\n\n private _emitRates(): void {\n this._rates$.next(Array.from(this._rates.values()));\n }\n}\n\nfunction _key(from: string, to: string): string {\n return `${from.toUpperCase()}_${to.toUpperCase()}`;\n}\n","export type JoopCreditScoreRating = 'excellent' | 'good' | 'fair' | 'poor' | 'bad';\nexport type JoopLoanType = 'personal' | 'mortgage' | 'auto' | 'student' | 'business';\n\nexport interface JoopLoanApplicant {\n grossMonthlyIncome: number;\n netMonthlyIncome: number;\n monthlyDebts: number; // existing EMI/debt payments\n creditScore: number; // 300-850\n employmentMonths: number;\n assets?: number;\n currency?: string;\n}\n\nexport interface JoopLoanParams {\n requestedAmount: number;\n interestRatePercent: number; // annual\n termMonths: number;\n loanType?: JoopLoanType;\n currency?: string;\n}\n\nexport interface JoopEmiBreakdown {\n emi: number;\n totalPayment: number;\n totalInterest: number;\n principal: number;\n interestRatePercent: number;\n termMonths: number;\n schedule: JoopEmiScheduleEntry[];\n}\n\nexport interface JoopEmiScheduleEntry {\n month: number;\n emi: number;\n principal: number;\n interest: number;\n remainingBalance: number;\n}\n\nexport interface JoopLoanEligibilityResult {\n isEligible: boolean;\n reasons: string[];\n dtiRatio: number; // debt-to-income ratio (0-1)\n maxEligibleAmount: number;\n repaymentCapacity: number; // max monthly EMI the applicant can service\n creditRating: JoopCreditScoreRating;\n requestedEmi?: number; // EMI for requested loan\n emiBreakdown?: JoopEmiBreakdown;\n currency: string;\n}\n\nexport interface JoopLoanProduct {\n name: string;\n type: JoopLoanType;\n minAmount: number;\n maxAmount: number;\n minTermMonths: number;\n maxTermMonths: number;\n baseRatePercent: number;\n maxDtiPercent: number;\n minCreditScore: number;\n}\n\n// DTI thresholds by lender category\nconst DTI_LIMITS: Record<JoopLoanType, number> = {\n personal: 0.43,\n mortgage: 0.36,\n auto: 0.40,\n student: 0.45,\n business: 0.50,\n};\n\nexport class JoopLoanEligibilityService {\n private _products: JoopLoanProduct[] = [];\n\n // ── Products ──────────────────────────────────────────────────────────────\n\n addProduct(product: JoopLoanProduct): void {\n this._products.push(product);\n }\n\n removeProduct(name: string): void {\n this._products = this._products.filter(p => p.name !== name);\n }\n\n getProducts(): JoopLoanProduct[] { return [...this._products]; }\n\n getProductsByType(type: JoopLoanType): JoopLoanProduct[] {\n return this._products.filter(p => p.type === type);\n }\n\n // ── Core eligibility ──────────────────────────────────────────────────────\n\n assess(applicant: JoopLoanApplicant, params: JoopLoanParams): JoopLoanEligibilityResult {\n const currency = params.currency ?? applicant.currency ?? 'USD';\n const loanType = params.loanType ?? 'personal';\n const reasons: string[] = [];\n\n const creditRating = this.creditScoreRating(applicant.creditScore);\n const dtiLimit = DTI_LIMITS[loanType];\n\n // Compute repayment capacity: max allowable monthly debt = dtiLimit * gross income\n const maxTotalDebt = applicant.grossMonthlyIncome * dtiLimit;\n const repaymentCapacity = Math.max(0, maxTotalDebt - applicant.monthlyDebts);\n\n // DTI ratio with proposed EMI\n const proposedEmi = this.computeEmi(params.requestedAmount, params.interestRatePercent, params.termMonths);\n const totalDebtWithLoan = applicant.monthlyDebts + proposedEmi;\n const dtiRatio = applicant.grossMonthlyIncome > 0 ? totalDebtWithLoan / applicant.grossMonthlyIncome : 1;\n\n // Maximum loan based on repayment capacity\n const maxEligibleAmount = this.maxLoanAmount(repaymentCapacity, params.interestRatePercent, params.termMonths);\n\n // Eligibility checks\n let isEligible = true;\n\n if (applicant.creditScore < 580) {\n isEligible = false;\n reasons.push(`Credit score ${applicant.creditScore} is below minimum threshold of 580`);\n }\n if (dtiRatio > dtiLimit) {\n isEligible = false;\n reasons.push(`DTI ratio ${(dtiRatio * 100).toFixed(1)}% exceeds ${(dtiLimit * 100).toFixed(0)}% limit for ${loanType} loans`);\n }\n if (params.requestedAmount > maxEligibleAmount) {\n isEligible = false;\n reasons.push(`Requested amount ${params.requestedAmount.toFixed(2)} exceeds max eligible ${maxEligibleAmount.toFixed(2)}`);\n }\n if (applicant.employmentMonths < 6) {\n isEligible = false;\n reasons.push(`Employment duration ${applicant.employmentMonths} months is below 6-month minimum`);\n }\n if (applicant.netMonthlyIncome <= 0) {\n isEligible = false;\n reasons.push('Net monthly income must be positive');\n }\n\n const emiBreakdown = this.computeEmiBreakdown(params.requestedAmount, params.interestRatePercent, params.termMonths);\n\n return {\n isEligible,\n reasons,\n dtiRatio: parseFloat(dtiRatio.toFixed(4)),\n maxEligibleAmount: parseFloat(maxEligibleAmount.toFixed(2)),\n repaymentCapacity: parseFloat(repaymentCapacity.toFixed(2)),\n creditRating,\n requestedEmi: parseFloat(proposedEmi.toFixed(2)),\n emiBreakdown,\n currency,\n };\n }\n\n compareProducts(applicant: JoopLoanApplicant, requestedAmount: number, termMonths: number): Array<{ product: JoopLoanProduct; result: JoopLoanEligibilityResult }> {\n return this._products.map(p => ({\n product: p,\n result: this.assess(applicant, {\n requestedAmount,\n interestRatePercent: p.baseRatePercent,\n termMonths,\n loanType: p.type,\n }),\n }));\n }\n\n // ── EMI calculation ───────────────────────────────────────────────────────\n\n computeEmi(principal: number, annualRatePercent: number, termMonths: number): number {\n if (annualRatePercent === 0) return principal / termMonths;\n const r = annualRatePercent / 100 / 12;\n const n = termMonths;\n return principal * r * Math.pow(1 + r, n) / (Math.pow(1 + r, n) - 1);\n }\n\n computeEmiBreakdown(principal: number, annualRatePercent: number, termMonths: number): JoopEmiBreakdown {\n const emi = this.computeEmi(principal, annualRatePercent, termMonths);\n const r = annualRatePercent / 100 / 12;\n const schedule: JoopEmiScheduleEntry[] = [];\n\n let balance = principal;\n let totalInterest = 0;\n\n for (let month = 1; month <= termMonths; month++) {\n const interestPart = balance * r;\n const principalPart = emi - interestPart;\n balance = Math.max(0, balance - principalPart);\n totalInterest += interestPart;\n schedule.push({\n month,\n emi: parseFloat(emi.toFixed(2)),\n principal: parseFloat(principalPart.toFixed(2)),\n interest: parseFloat(interestPart.toFixed(2)),\n remainingBalance: parseFloat(balance.toFixed(2)),\n });\n }\n\n return {\n emi: parseFloat(emi.toFixed(2)),\n totalPayment: parseFloat((emi * termMonths).toFixed(2)),\n totalInterest: parseFloat(totalInterest.toFixed(2)),\n principal,\n interestRatePercent: annualRatePercent,\n termMonths,\n schedule,\n };\n }\n\n maxLoanAmount(monthlyPaymentCapacity: number, annualRatePercent: number, termMonths: number): number {\n if (monthlyPaymentCapacity <= 0) return 0;\n if (annualRatePercent === 0) return monthlyPaymentCapacity * termMonths;\n const r = annualRatePercent / 100 / 12;\n const n = termMonths;\n return monthlyPaymentCapacity * (Math.pow(1 + r, n) - 1) / (r * Math.pow(1 + r, n));\n }\n\n // ── Credit score ──────────────────────────────────────────────────────────\n\n creditScoreRating(score: number): JoopCreditScoreRating {\n if (score >= 750) return 'excellent';\n if (score >= 700) return 'good';\n if (score >= 650) return 'fair';\n if (score >= 580) return 'poor';\n return 'bad';\n }\n\n // ── DTI ───────────────────────────────────────────────────────────────────\n\n computeDti(monthlyDebts: number, grossMonthlyIncome: number): number {\n if (grossMonthlyIncome <= 0) return 1;\n return parseFloat((monthlyDebts / grossMonthlyIncome).toFixed(4));\n }\n}\n","import { JoopBehaviorSubject } from '../events';\n\nexport type JoopLoyaltyTier = 'bronze' | 'silver' | 'gold' | 'platinum';\nexport type JoopLoyaltyTxnType = 'earn' | 'redeem' | 'expire' | 'adjust' | 'bonus';\n\nexport interface JoopLoyaltyTierDef {\n tier: JoopLoyaltyTier;\n minPoints: number;\n earnMultiplier: number; // bonus multiplier on base earn rate\n label: string;\n}\n\nexport interface JoopLoyaltyEarnRule {\n category: string;\n pointsPerUnit: number; // points per 1 currency unit\n currency?: string;\n multiplier?: number;\n maxPerTxn?: number;\n}\n\nexport interface JoopLoyaltyTransaction {\n id: string;\n type: JoopLoyaltyTxnType;\n points: number; // positive = credit, negative = debit\n balance: number; // running balance after this txn\n description: string;\n category?: string;\n reference?: string;\n expiresAt?: number;\n date: number;\n}\n\nexport interface JoopLoyaltySummary {\n balance: number;\n lifetimeEarned: number;\n lifetimeRedeemed: number;\n lifetimeExpired: number;\n tier: JoopLoyaltyTier;\n nextTier: JoopLoyaltyTier | null;\n pointsToNextTier: number | null;\n tierMultiplier: number;\n}\n\nconst DEFAULT_TIERS: JoopLoyaltyTierDef[] = [\n { tier: 'bronze', minPoints: 0, earnMultiplier: 1.0, label: 'Bronze' },\n { tier: 'silver', minPoints: 1000, earnMultiplier: 1.25, label: 'Silver' },\n { tier: 'gold', minPoints: 5000, earnMultiplier: 1.5, label: 'Gold' },\n { tier: 'platinum', minPoints: 15000, earnMultiplier: 2.0, label: 'Platinum' },\n];\n\nexport class JoopLoyaltyService {\n private _balance = 0;\n private _lifetimeEarned = 0;\n private _lifetimeRedeemed = 0;\n private _lifetimeExpired = 0;\n private _transactions: JoopLoyaltyTransaction[] = [];\n private _tiers: JoopLoyaltyTierDef[];\n private _baseEarnRate: number; // default points per 1 currency unit\n private _earnRules = new Map<string, JoopLoyaltyEarnRule>();\n private _pointValue: number; // currency value of 1 point (for redemption)\n private _summary$ = new JoopBehaviorSubject<JoopLoyaltySummary>(null as any);\n\n constructor(options: { baseEarnRate?: number; pointValue?: number; tiers?: JoopLoyaltyTierDef[] } = {}) {\n this._baseEarnRate = options.baseEarnRate ?? 1; // 1 point per $1 by default\n this._pointValue = options.pointValue ?? 0.01; // 1 point = $0.01\n this._tiers = options.tiers ?? DEFAULT_TIERS;\n this._emitSummary();\n }\n\n // ── Earn rules ────────────────────────────────────────────────────────────\n\n setEarnRule(rule: JoopLoyaltyEarnRule): void {\n this._earnRules.set(rule.category.toLowerCase(), rule);\n }\n\n removeEarnRule(category: string): void {\n this._earnRules.delete(category.toLowerCase());\n }\n\n getEarnRate(amount: number, category?: string): number {\n const rule = category ? this._earnRules.get(category.toLowerCase()) : undefined;\n const rate = rule ? rule.pointsPerUnit * (rule.multiplier ?? 1) : this._baseEarnRate;\n const tierMult = this._getTierDef(this._currentTier()).earnMultiplier;\n let pts = Math.floor(amount * rate * tierMult);\n if (rule?.maxPerTxn) pts = Math.min(pts, rule.maxPerTxn);\n return pts;\n }\n\n // ── Earn / Redeem / Adjust ────────────────────────────────────────────────\n\n earn(amount: number, options: { category?: string; description?: string; reference?: string; ttlDays?: number; bonus?: number } = {}): JoopLoyaltyTransaction {\n if (amount < 0) throw new Error('earn amount must be non-negative');\n let pts = this.getEarnRate(amount, options.category);\n if (options.bonus) pts += options.bonus;\n\n return this._record({\n type: 'earn',\n points: pts,\n description: options.description ?? `Earned from ${options.category ?? 'purchase'} of ${amount}`,\n category: options.category,\n reference: options.reference,\n expiresAt: options.ttlDays ? Date.now() + options.ttlDays * 86_400_000 : undefined,\n });\n }\n\n redeem(points: number, options: { description?: string; reference?: string } = {}): JoopLoyaltyTransaction {\n if (points <= 0) throw new Error('redeem points must be positive');\n const available = this.getAvailableBalance();\n if (points > available) throw new Error(`Insufficient points: ${available} available, ${points} requested`);\n\n return this._record({\n type: 'redeem',\n points: -points,\n description: options.description ?? `Redeemed ${points} points`,\n reference: options.reference,\n });\n }\n\n adjust(points: number, description: string): JoopLoyaltyTransaction {\n return this._record({ type: 'adjust', points, description });\n }\n\n // ── Balance ───────────────────────────────────────────────────────────────\n\n getBalance(): number { return this._balance; }\n\n getAvailableBalance(asOf: number = Date.now()): number {\n // Balance minus expired-but-not-yet-processed points\n const expiredUnprocessed = this._transactions\n .filter(t => t.type === 'earn' && t.expiresAt && t.expiresAt <= asOf)\n .reduce((s, t) => s + t.points, 0);\n return Math.max(0, this._balance - expiredUnprocessed);\n }\n\n pointsToValue(points: number): number {\n return parseFloat((points * this._pointValue).toFixed(2));\n }\n\n currencyToPoints(amount: number, category?: string): number {\n return this.getEarnRate(amount, category);\n }\n\n // ── Expiry ────────────────────────────────────────────────────────────────\n\n expirePoints(asOf: number = Date.now()): number {\n const toExpire = this._transactions.filter(t => t.type === 'earn' && t.expiresAt && t.expiresAt <= asOf && t.points > 0);\n let total = 0;\n for (const t of toExpire) {\n total += t.points;\n t.points = 0; // mark as expired inline to avoid double-expiry\n }\n if (total > 0) {\n this._record({ type: 'expire', points: -total, description: `${total} points expired` });\n }\n return total;\n }\n\n // ── Tier ─────────────────────────────────────────────────────────────────\n\n getCurrentTier(): JoopLoyaltyTier { return this._currentTier(); }\n\n getTierDef(tier: JoopLoyaltyTier): JoopLoyaltyTierDef {\n return this._tiers.find(t => t.tier === tier) ?? DEFAULT_TIERS[0];\n }\n\n getNextTier(): JoopLoyaltyTier | null {\n const sorted = [...this._tiers].sort((a, b) => a.minPoints - b.minPoints);\n const current = this._currentTier();\n const idx = sorted.findIndex(t => t.tier === current);\n return idx < sorted.length - 1 ? sorted[idx + 1].tier : null;\n }\n\n getPointsToNextTier(): number | null {\n const next = this.getNextTier();\n if (!next) return null;\n const nextDef = this.getTierDef(next);\n return Math.max(0, nextDef.minPoints - this._lifetimeEarned);\n }\n\n // ── Transactions ─────────────────────────────────────────────────────────\n\n getTransactions(): JoopLoyaltyTransaction[] { return [...this._transactions]; }\n\n getTransactionsByType(type: JoopLoyaltyTxnType): JoopLoyaltyTransaction[] {\n return this._transactions.filter(t => t.type === type);\n }\n\n // ── Summary ───────────────────────────────────────────────────────────────\n\n getSummary(): JoopLoyaltySummary {\n const tier = this._currentTier();\n return {\n balance: this._balance,\n lifetimeEarned: this._lifetimeEarned,\n lifetimeRedeemed: this._lifetimeRedeemed,\n lifetimeExpired: this._lifetimeExpired,\n tier,\n nextTier: this.getNextTier(),\n pointsToNextTier: this.getPointsToNextTier(),\n tierMultiplier: this._getTierDef(tier).earnMultiplier,\n };\n }\n\n summary$() { return this._summary$.asObservable(); }\n\n // ── Internals ─────────────────────────────────────────────────────────────\n\n private _record(data: Omit<JoopLoyaltyTransaction, 'id' | 'balance' | 'date'>): JoopLoyaltyTransaction {\n this._balance += data.points;\n\n if (data.type === 'earn' || data.type === 'bonus') this._lifetimeEarned += Math.max(0, data.points);\n if (data.type === 'redeem') this._lifetimeRedeemed += Math.abs(data.points);\n if (data.type === 'expire') this._lifetimeExpired += Math.abs(data.points);\n\n const txn: JoopLoyaltyTransaction = { ...data, id: _uid(), balance: this._balance, date: Date.now() };\n this._transactions.push(txn);\n this._emitSummary();\n return { ...txn };\n }\n\n private _currentTier(): JoopLoyaltyTier {\n const sorted = [...this._tiers].sort((a, b) => b.minPoints - a.minPoints);\n return (sorted.find(t => this._lifetimeEarned >= t.minPoints) ?? sorted[sorted.length - 1]).tier;\n }\n\n private _getTierDef(tier: JoopLoyaltyTier): JoopLoyaltyTierDef {\n return this._tiers.find(t => t.tier === tier) ?? DEFAULT_TIERS[0];\n }\n\n private _emitSummary(): void { this._summary$.next(this.getSummary()); }\n}\n\nfunction _uid(): string { return `${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`; }\n","import { JoopBehaviorSubject } from '../events';\n\nexport type JoopAssetType = 'stock' | 'bond' | 'etf' | 'crypto' | 'mutual-fund' | 'real-estate' | 'commodity' | 'cash' | 'other';\n\nexport interface JoopHolding {\n id: string;\n symbol: string;\n name: string;\n assetType: JoopAssetType;\n quantity: number;\n purchasePrice: number; // cost per unit\n currentPrice: number; // latest market price per unit\n currency: string;\n purchaseDate?: number;\n exchange?: string;\n sector?: string;\n notes?: string;\n createdAt: number;\n updatedAt: number;\n}\n\nexport interface JoopHoldingPerformance {\n holding: JoopHolding;\n costBasis: number; // purchasePrice * quantity\n marketValue: number; // currentPrice * quantity\n unrealizedGain: number; // marketValue - costBasis\n unrealizedGainPercent: number;\n allocationPercent: number; // portion of total portfolio value\n daysSinceEntry: number | null;\n annualizedReturnPercent: number | null;\n}\n\nexport interface JoopPortfolioSummary {\n totalCost: number;\n totalValue: number;\n totalUnrealizedGain: number;\n totalUnrealizedGainPercent: number;\n holdingCount: number;\n allocationByType: Record<JoopAssetType, number>; // % of total value\n topHolding: JoopHoldingPerformance | null;\n worstHolding: JoopHoldingPerformance | null;\n currency: string;\n}\n\nexport class JoopPortfolioService {\n private _holdings = new Map<string, JoopHolding>();\n private _portfolio$ = new JoopBehaviorSubject<JoopHolding[]>([]);\n\n // ── CRUD ─────────────────────────────────────────────────────────────────\n\n add(data: Omit<JoopHolding, 'id' | 'createdAt' | 'updatedAt'>): JoopHolding {\n const existing = this._bySymbol(data.symbol);\n if (existing) throw new Error(`Holding '${data.symbol}' already exists — use update() or addToPosition()`);\n\n const holding: JoopHolding = { ...data, id: _uid(), createdAt: Date.now(), updatedAt: Date.now() };\n this._holdings.set(holding.id, holding);\n this._emit();\n return { ...holding };\n }\n\n update(idOrSymbol: string, patch: Partial<Omit<JoopHolding, 'id' | 'createdAt'>>): JoopHolding {\n const h = this._require(idOrSymbol);\n Object.assign(h, patch, { updatedAt: Date.now() });\n this._emit();\n return { ...h };\n }\n\n remove(idOrSymbol: string): void {\n const h = this._require(idOrSymbol);\n this._holdings.delete(h.id);\n this._emit();\n }\n\n get(idOrSymbol: string): JoopHolding | undefined {\n const h = this._holdings.get(idOrSymbol) ?? this._bySymbol(idOrSymbol);\n return h ? { ...h } : undefined;\n }\n\n getAll(): JoopHolding[] {\n return Array.from(this._holdings.values()).map(h => ({ ...h }));\n }\n\n getByType(type: JoopAssetType): JoopHolding[] {\n return this.getAll().filter(h => h.assetType === type);\n }\n\n // ── Position management ───────────────────────────────────────────────────\n\n addToPosition(symbol: string, quantity: number, price: number): JoopHolding {\n const h = this._requireBySymbol(symbol);\n // Weighted average cost\n const totalCost = h.purchasePrice * h.quantity + price * quantity;\n const totalQty = h.quantity + quantity;\n return this.update(h.id, {\n quantity: totalQty,\n purchasePrice: parseFloat((totalCost / totalQty).toFixed(6)),\n currentPrice: price,\n });\n }\n\n reducePosition(symbol: string, quantity: number): JoopHolding {\n const h = this._requireBySymbol(symbol);\n if (quantity > h.quantity) throw new Error(`Cannot reduce by ${quantity}: only ${h.quantity} held`);\n return this.update(h.id, { quantity: h.quantity - quantity });\n }\n\n // ── Price updates ─────────────────────────────────────────────────────────\n\n updatePrice(symbol: string, price: number): JoopHolding {\n if (price < 0) throw new Error('Price must be non-negative');\n return this.update(symbol, { currentPrice: price });\n }\n\n updatePrices(prices: Record<string, number>): void {\n for (const [symbol, price] of Object.entries(prices)) {\n try { this.updatePrice(symbol, price); } catch { /* skip unknown symbols */ }\n }\n }\n\n // ── Performance ───────────────────────────────────────────────────────────\n\n getPerformance(idOrSymbol: string): JoopHoldingPerformance | null {\n const h = this.get(idOrSymbol);\n if (!h) return null;\n const totalValue = this._totalValue();\n return this._computePerf(h, totalValue);\n }\n\n getAllPerformance(): JoopHoldingPerformance[] {\n const total = this._totalValue();\n return this.getAll().map(h => this._computePerf(h, total));\n }\n\n // ── Aggregates ────────────────────────────────────────────────────────────\n\n getTotalValue(): number { return this._totalValue(); }\n getTotalCost(): number { return this.getAll().reduce((s, h) => s + h.purchasePrice * h.quantity, 0); }\n getTotalGain(): number { return this.getTotalValue() - this.getTotalCost(); }\n getTotalGainPercent(): number {\n const cost = this.getTotalCost();\n return cost > 0 ? (this.getTotalGain() / cost) * 100 : 0;\n }\n\n getAllocation(): Array<{ symbol: string; percent: number }> {\n const total = this._totalValue();\n if (total === 0) return [];\n return this.getAll()\n .map(h => ({ symbol: h.symbol, percent: parseFloat(((h.currentPrice * h.quantity / total) * 100).toFixed(2)) }))\n .sort((a, b) => b.percent - a.percent);\n }\n\n getAllocationByType(): Record<JoopAssetType, number> {\n const total = this._totalValue();\n const result = {} as Record<JoopAssetType, number>;\n if (total === 0) return result;\n for (const h of this.getAll()) {\n const val = h.currentPrice * h.quantity;\n result[h.assetType] = parseFloat(((result[h.assetType] ?? 0) + (val / total) * 100).toFixed(2));\n }\n return result;\n }\n\n getSummary(): JoopPortfolioSummary {\n const perfs = this.getAllPerformance();\n const totalCost = this.getTotalCost();\n const totalValue = this.getTotalValue();\n const totalGain = totalValue - totalCost;\n\n const sorted = [...perfs].sort((a, b) => b.unrealizedGainPercent - a.unrealizedGainPercent);\n\n return {\n totalCost: parseFloat(totalCost.toFixed(2)),\n totalValue: parseFloat(totalValue.toFixed(2)),\n totalUnrealizedGain: parseFloat(totalGain.toFixed(2)),\n totalUnrealizedGainPercent: parseFloat((totalCost > 0 ? (totalGain / totalCost) * 100 : 0).toFixed(2)),\n holdingCount: this._holdings.size,\n allocationByType: this.getAllocationByType(),\n topHolding: sorted[0] ?? null,\n worstHolding: sorted[sorted.length - 1] ?? null,\n currency: 'USD',\n };\n }\n\n portfolio$() { return this._portfolio$.asObservable(); }\n\n // ── Internals ─────────────────────────────────────────────────────────────\n\n private _bySymbol(symbol: string): JoopHolding | undefined {\n return Array.from(this._holdings.values()).find(h => h.symbol.toUpperCase() === symbol.toUpperCase());\n }\n\n private _require(idOrSymbol: string): JoopHolding {\n const h = this._holdings.get(idOrSymbol) ?? this._bySymbol(idOrSymbol);\n if (!h) throw new Error(`Holding '${idOrSymbol}' not found`);\n return h;\n }\n\n private _requireBySymbol(symbol: string): JoopHolding {\n const h = this._bySymbol(symbol);\n if (!h) throw new Error(`Holding '${symbol}' not found`);\n return h;\n }\n\n private _totalValue(): number {\n return this.getAll().reduce((s, h) => s + h.currentPrice * h.quantity, 0);\n }\n\n private _computePerf(h: JoopHolding, totalPortfolioValue: number): JoopHoldingPerformance {\n const costBasis = h.purchasePrice * h.quantity;\n const marketValue = h.currentPrice * h.quantity;\n const gain = marketValue - costBasis;\n const gainPct = costBasis > 0 ? (gain / costBasis) * 100 : 0;\n const allocPct = totalPortfolioValue > 0 ? (marketValue / totalPortfolioValue) * 100 : 0;\n\n let daysSince: number | null = null;\n let annualized: number | null = null;\n if (h.purchaseDate) {\n daysSince = Math.max(1, Math.floor((Date.now() - h.purchaseDate) / 86_400_000));\n if (costBasis > 0 && daysSince > 0) {\n annualized = parseFloat(((Math.pow(marketValue / costBasis, 365 / daysSince) - 1) * 100).toFixed(2));\n }\n }\n\n return {\n holding: { ...h },\n costBasis: parseFloat(costBasis.toFixed(2)),\n marketValue: parseFloat(marketValue.toFixed(2)),\n unrealizedGain: parseFloat(gain.toFixed(2)),\n unrealizedGainPercent: parseFloat(gainPct.toFixed(2)),\n allocationPercent: parseFloat(allocPct.toFixed(2)),\n daysSinceEntry: daysSince,\n annualizedReturnPercent: annualized,\n };\n }\n\n private _emit(): void { this._portfolio$.next(this.getAll()); }\n}\n\nfunction _uid(): string { return `${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`; }\n","export interface JoopTaxBracket {\n from: number;\n to: number | null; // null = no upper bound\n rate: number; // decimal, e.g. 0.22 = 22%\n label?: string;\n}\n\nexport interface JoopTaxDeduction {\n name: string;\n amount: number;\n}\n\nexport interface JoopIncomeTaxResult {\n grossIncome: number;\n totalDeductions: number;\n taxableIncome: number;\n tax: number;\n effectiveRate: number; // tax / grossIncome\n marginalRate: number; // rate of highest bracket hit\n netIncome: number;\n bracketBreakdown: Array<{ bracket: JoopTaxBracket; taxableInBracket: number; tax: number }>;\n currency: string;\n}\n\nexport interface JoopCapitalGainsTaxResult {\n gain: number;\n holdingDays: number;\n isLongTerm: boolean;\n rate: number;\n tax: number;\n netGain: number;\n}\n\nexport interface JoopGstResult {\n baseAmount: number;\n rate: number;\n gstAmount: number;\n totalAmount: number;\n isInclusive: boolean;\n}\n\nexport interface JoopTaxSummary {\n grossIncome: number;\n incomeTax: number;\n capitalGainsTax: number;\n withholdingTax: number;\n totalTax: number;\n netIncome: number;\n effectiveOverallRate: number;\n currency: string;\n}\n\n// ── Jurisdiction presets ──────────────────────────────────────────────────────\n\nexport const JoopTaxBrackets = {\n US_2024: [\n { from: 0, to: 11600, rate: 0.10, label: '10%' },\n { from: 11600, to: 47150, rate: 0.12, label: '12%' },\n { from: 47150, to: 100525, rate: 0.22, label: '22%' },\n { from: 100525, to: 191950, rate: 0.24, label: '24%' },\n { from: 191950, to: 243725, rate: 0.32, label: '32%' },\n { from: 243725, to: 609350, rate: 0.35, label: '35%' },\n { from: 609350, to: null, rate: 0.37, label: '37%' },\n ] as JoopTaxBracket[],\n\n UK_2024: [\n { from: 0, to: 12570, rate: 0.00, label: 'Personal Allowance' },\n { from: 12570, to: 50270, rate: 0.20, label: 'Basic Rate' },\n { from: 50270, to: 125140, rate: 0.40, label: 'Higher Rate' },\n { from: 125140, to: null, rate: 0.45, label: 'Additional Rate' },\n ] as JoopTaxBracket[],\n\n IN_FY2024: [\n { from: 0, to: 300000, rate: 0.00, label: 'Nil' },\n { from: 300000, to: 600000, rate: 0.05, label: '5%' },\n { from: 600000, to: 900000, rate: 0.10, label: '10%' },\n { from: 900000, to: 1200000, rate: 0.15, label: '15%' },\n { from: 1200000, to: 1500000, rate: 0.20, label: '20%' },\n { from: 1500000, to: null, rate: 0.30, label: '30%' },\n ] as JoopTaxBracket[],\n\n AU_FY2024: [\n { from: 0, to: 18200, rate: 0.00, label: 'Nil' },\n { from: 18200, to: 45000, rate: 0.19, label: '19%' },\n { from: 45000, to: 120000, rate: 0.325, label: '32.5%' },\n { from: 120000, to: 180000, rate: 0.37, label: '37%' },\n { from: 180000, to: null, rate: 0.45, label: '45%' },\n ] as JoopTaxBracket[],\n};\n\nexport class JoopTaxCalculatorService {\n private _brackets: JoopTaxBracket[];\n private _currency: string;\n private _longTermThresholdDays: number;\n private _shortTermCgtRate: number;\n private _longTermCgtRate: number;\n private _defaultGstRate: number;\n\n constructor(options: {\n brackets?: JoopTaxBracket[];\n currency?: string;\n longTermThresholdDays?: number;\n shortTermCgtRate?: number;\n longTermCgtRate?: number;\n defaultGstRate?: number;\n } = {}) {\n this._brackets = options.brackets ?? JoopTaxBrackets.US_2024;\n this._currency = options.currency ?? 'USD';\n this._longTermThresholdDays = options.longTermThresholdDays ?? 365;\n this._shortTermCgtRate = options.shortTermCgtRate ?? 0.22;\n this._longTermCgtRate = options.longTermCgtRate ?? 0.15;\n this._defaultGstRate = options.defaultGstRate ?? 0.10;\n }\n\n // ── Configuration ─────────────────────────────────────────────────────────\n\n setBrackets(brackets: JoopTaxBracket[]): void { this._brackets = brackets; }\n getBrackets(): JoopTaxBracket[] { return [...this._brackets]; }\n\n // ── Income Tax ────────────────────────────────────────────────────────────\n\n calculateIncomeTax(\n grossIncome: number,\n deductions: JoopTaxDeduction[] = [],\n brackets?: JoopTaxBracket[],\n ): JoopIncomeTaxResult {\n const activeBrackets = brackets ?? this._brackets;\n const totalDeductions = deductions.reduce((s, d) => s + d.amount, 0);\n const taxableIncome = Math.max(0, grossIncome - totalDeductions);\n\n let totalTax = 0;\n let marginalRate = 0;\n const breakdown: JoopIncomeTaxResult['bracketBreakdown'] = [];\n\n for (const bracket of activeBrackets) {\n if (taxableIncome <= bracket.from) break;\n const upper = bracket.to !== null ? Math.min(taxableIncome, bracket.to) : taxableIncome;\n const taxableInBracket = upper - bracket.from;\n const tax = parseFloat((taxableInBracket * bracket.rate).toFixed(2));\n totalTax += tax;\n if (tax > 0 || bracket.rate > 0) marginalRate = bracket.rate;\n breakdown.push({ bracket, taxableInBracket: parseFloat(taxableInBracket.toFixed(2)), tax });\n }\n\n totalTax = parseFloat(totalTax.toFixed(2));\n\n return {\n grossIncome,\n totalDeductions: parseFloat(totalDeductions.toFixed(2)),\n taxableIncome: parseFloat(taxableIncome.toFixed(2)),\n tax: totalTax,\n effectiveRate: grossIncome > 0 ? parseFloat((totalTax / grossIncome).toFixed(4)) : 0,\n marginalRate,\n netIncome: parseFloat((grossIncome - totalTax).toFixed(2)),\n bracketBreakdown: breakdown,\n currency: this._currency,\n };\n }\n\n // ── Capital Gains Tax ─────────────────────────────────────────────────────\n\n calculateCapitalGains(\n gain: number,\n holdingDays: number,\n options: { shortTermRate?: number; longTermRate?: number } = {},\n ): JoopCapitalGainsTaxResult {\n const isLongTerm = holdingDays >= this._longTermThresholdDays;\n const rate = isLongTerm\n ? (options.longTermRate ?? this._longTermCgtRate)\n : (options.shortTermRate ?? this._shortTermCgtRate);\n const tax = parseFloat((Math.max(0, gain) * rate).toFixed(2));\n\n return {\n gain: parseFloat(gain.toFixed(2)),\n holdingDays,\n isLongTerm,\n rate,\n tax,\n netGain: parseFloat((gain - tax).toFixed(2)),\n };\n }\n\n // ── GST / VAT ─────────────────────────────────────────────────────────────\n\n calculateGst(amount: number, options: { rate?: number; inclusive?: boolean } = {}): JoopGstResult {\n const rate = options.rate ?? this._defaultGstRate;\n const isInclusive = options.inclusive ?? false;\n\n let baseAmount: number;\n let gstAmount: number;\n\n if (isInclusive) {\n baseAmount = parseFloat((amount / (1 + rate)).toFixed(2));\n gstAmount = parseFloat((amount - baseAmount).toFixed(2));\n } else {\n baseAmount = amount;\n gstAmount = parseFloat((amount * rate).toFixed(2));\n }\n\n return {\n baseAmount,\n rate,\n gstAmount,\n totalAmount: parseFloat((baseAmount + gstAmount).toFixed(2)),\n isInclusive,\n };\n }\n\n calculateVat = this.calculateGst; // alias\n\n // ── Withholding Tax ───────────────────────────────────────────────────────\n\n calculateWithholding(amount: number, rate: number): { gross: number; withheld: number; net: number; rate: number } {\n const withheld = parseFloat((amount * rate).toFixed(2));\n return { gross: amount, withheld, net: parseFloat((amount - withheld).toFixed(2)), rate };\n }\n\n // ── Summary ───────────────────────────────────────────────────────────────\n\n getTaxSummary(options: {\n grossIncome: number;\n deductions?: JoopTaxDeduction[];\n capitalGain?: number;\n capitalGainHoldingDays?: number;\n withholdingAmount?: number;\n withholdingRate?: number;\n }): JoopTaxSummary {\n const incomeResult = this.calculateIncomeTax(options.grossIncome, options.deductions ?? []);\n\n let cgtTax = 0;\n if (options.capitalGain !== undefined) {\n const cgt = this.calculateCapitalGains(options.capitalGain, options.capitalGainHoldingDays ?? 0);\n cgtTax = cgt.tax;\n }\n\n const withholdingTax = options.withholdingAmount && options.withholdingRate\n ? this.calculateWithholding(options.withholdingAmount, options.withholdingRate).withheld\n : 0;\n\n const totalTax = parseFloat((incomeResult.tax + cgtTax + withholdingTax).toFixed(2));\n\n return {\n grossIncome: options.grossIncome,\n incomeTax: incomeResult.tax,\n capitalGainsTax: parseFloat(cgtTax.toFixed(2)),\n withholdingTax: parseFloat(withholdingTax.toFixed(2)),\n totalTax,\n netIncome: parseFloat((options.grossIncome - totalTax).toFixed(2)),\n effectiveOverallRate: options.grossIncome > 0 ? parseFloat((totalTax / options.grossIncome).toFixed(4)) : 0,\n currency: this._currency,\n };\n }\n\n // ── Utilities ─────────────────────────────────────────────────────────────\n\n getMarginalRate(income: number, brackets?: JoopTaxBracket[]): number {\n const active = brackets ?? this._brackets;\n let rate = 0;\n for (const b of active) {\n if (income > b.from) rate = b.rate;\n }\n return rate;\n }\n\n getEffectiveRate(income: number, brackets?: JoopTaxBracket[]): number {\n if (income <= 0) return 0;\n return this.calculateIncomeTax(income, [], brackets).effectiveRate;\n }\n}\n","export type JoopCompoundFrequency = 'daily' | 'monthly' | 'quarterly' | 'half-yearly' | 'yearly';\n\nexport interface JoopSimpleInterestResult {\n principal: number;\n rate: number;\n years: number;\n interest: number;\n amount: number;\n}\n\nexport interface JoopCompoundInterestResult {\n principal: number;\n rate: number;\n years: number;\n frequency: JoopCompoundFrequency;\n compoundsPerYear: number;\n interest: number;\n amount: number;\n effectiveAnnualRate: number;\n}\n\nexport interface JoopFixedDepositResult {\n principal: number;\n ratePercent: number;\n termDays: number;\n frequency: JoopCompoundFrequency;\n maturityAmount: number;\n totalInterest: number;\n effectiveAnnualRate: number;\n}\n\nexport interface JoopRecurringDepositResult {\n monthlyDeposit: number;\n ratePercent: number;\n termMonths: number;\n maturityAmount: number;\n totalDeposited: number;\n totalInterest: number;\n}\n\nexport interface JoopSavingsProjectionEntry {\n year: number;\n openingBalance: number;\n deposits: number;\n interest: number;\n closingBalance: number;\n}\n\nexport interface JoopSavingsProjection {\n startBalance: number;\n monthlyDeposit: number;\n annualRatePercent: number;\n years: number;\n finalBalance: number;\n totalDeposited: number;\n totalInterest: number;\n schedule: JoopSavingsProjectionEntry[];\n}\n\nconst COMPOUNDS: Record<JoopCompoundFrequency, number> = {\n daily: 365, monthly: 12, quarterly: 4, 'half-yearly': 2, yearly: 1,\n};\n\nexport class JoopInterestCalculatorService {\n\n // ── Simple Interest ───────────────────────────────────────────────────────\n\n simpleInterest(principal: number, ratePercent: number, years: number): JoopSimpleInterestResult {\n const interest = _round(principal * (ratePercent / 100) * years);\n return { principal, rate: ratePercent, years, interest, amount: _round(principal + interest) };\n }\n\n // ── Compound Interest ─────────────────────────────────────────────────────\n\n compoundInterest(\n principal: number,\n ratePercent: number,\n years: number,\n frequency: JoopCompoundFrequency = 'yearly',\n ): JoopCompoundInterestResult {\n const n = COMPOUNDS[frequency];\n const r = ratePercent / 100;\n const amount = _round(principal * Math.pow(1 + r / n, n * years));\n const interest = _round(amount - principal);\n const ear = _round((Math.pow(1 + r / n, n) - 1) * 100, 4);\n return { principal, rate: ratePercent, years, frequency, compoundsPerYear: n, interest, amount, effectiveAnnualRate: ear };\n }\n\n // ── Fixed Deposit ─────────────────────────────────────────────────────────\n\n fixedDeposit(\n principal: number,\n ratePercent: number,\n termDays: number,\n frequency: JoopCompoundFrequency = 'quarterly',\n ): JoopFixedDepositResult {\n const years = termDays / 365;\n const n = COMPOUNDS[frequency];\n const r = ratePercent / 100;\n const maturity = _round(principal * Math.pow(1 + r / n, n * years));\n const ear = _round((Math.pow(1 + r / n, n) - 1) * 100, 4);\n return {\n principal, ratePercent, termDays, frequency,\n maturityAmount: maturity,\n totalInterest: _round(maturity - principal),\n effectiveAnnualRate: ear,\n };\n }\n\n // ── Recurring Deposit ─────────────────────────────────────────────────────\n\n recurringDeposit(\n monthlyDeposit: number,\n ratePercent: number,\n termMonths: number,\n ): JoopRecurringDepositResult {\n const r = ratePercent / 100 / 12;\n let maturity = 0;\n for (let m = termMonths; m >= 1; m--) {\n maturity += monthlyDeposit * Math.pow(1 + r, m);\n }\n maturity = _round(maturity);\n const totalDeposited = _round(monthlyDeposit * termMonths);\n return { monthlyDeposit, ratePercent, termMonths, maturityAmount: maturity, totalDeposited, totalInterest: _round(maturity - totalDeposited) };\n }\n\n // ── Savings Projection ────────────────────────────────────────────────────\n\n projectSavings(\n startBalance: number,\n monthlyDeposit: number,\n annualRatePercent: number,\n years: number,\n ): JoopSavingsProjection {\n const monthlyRate = annualRatePercent / 100 / 12;\n let balance = startBalance;\n let totalDeposited = 0;\n let totalInterest = 0;\n const schedule: JoopSavingsProjectionEntry[] = [];\n\n for (let y = 1; y <= years; y++) {\n const opening = balance;\n let yearInterest = 0;\n for (let m = 0; m < 12; m++) {\n const interest = balance * monthlyRate;\n yearInterest += interest;\n balance += interest + monthlyDeposit;\n }\n const deposits = monthlyDeposit * 12;\n totalDeposited += deposits;\n totalInterest += yearInterest;\n schedule.push({ year: y, openingBalance: _round(opening), deposits: _round(deposits), interest: _round(yearInterest), closingBalance: _round(balance) });\n }\n\n return {\n startBalance, monthlyDeposit, annualRatePercent, years,\n finalBalance: _round(balance),\n totalDeposited: _round(totalDeposited),\n totalInterest: _round(totalInterest),\n schedule,\n };\n }\n\n // ── Utilities ─────────────────────────────────────────────────────────────\n\n effectiveAnnualRate(nominalRatePercent: number, compoundsPerYear: number): number {\n const r = nominalRatePercent / 100;\n return _round((Math.pow(1 + r / compoundsPerYear, compoundsPerYear) - 1) * 100, 4);\n }\n\n ruleOf72(ratePercent: number): number {\n if (ratePercent <= 0) throw new Error('Rate must be positive');\n return _round(72 / ratePercent, 2);\n }\n\n breakEven(fixedCost: number, pricePerUnit: number, variableCostPerUnit: number): number {\n const margin = pricePerUnit - variableCostPerUnit;\n if (margin <= 0) throw new Error('Price must exceed variable cost');\n return Math.ceil(fixedCost / margin);\n }\n\n presentValue(futureValue: number, ratePercent: number, years: number): number {\n return _round(futureValue / Math.pow(1 + ratePercent / 100, years));\n }\n\n futureValue(presentValue: number, ratePercent: number, years: number): number {\n return _round(presentValue * Math.pow(1 + ratePercent / 100, years));\n }\n\n cagr(startValue: number, endValue: number, years: number): number {\n if (startValue <= 0 || years <= 0) throw new Error('startValue and years must be positive');\n return _round((Math.pow(endValue / startValue, 1 / years) - 1) * 100, 4);\n }\n}\n\nfunction _round(n: number, dp = 2): number {\n return parseFloat(n.toFixed(dp));\n}\n","import { JoopBehaviorSubject } from '../events';\n\nexport type JoopCreditBand = 'exceptional' | 'very-good' | 'good' | 'fair' | 'poor';\nexport type JoopCreditFactor = 'payment-history' | 'utilization' | 'age-of-credit' | 'credit-mix' | 'new-inquiries';\nexport type JoopCreditTrend = 'improving' | 'declining' | 'stable';\nexport type JoopCreditAlertSeverity = 'info' | 'warning' | 'critical';\n\nexport interface JoopCreditEntry {\n id: string;\n score: number;\n date: number;\n source: string;\n note?: string;\n}\n\nexport interface JoopCreditFactorScore {\n factor: JoopCreditFactor;\n score: number; // 0–100 (factor health score)\n weight: number; // FICO-like weight in %\n impact: 'positive' | 'negative' | 'neutral';\n description: string;\n}\n\nexport interface JoopCreditAlert {\n id: string;\n type: string;\n severity: JoopCreditAlertSeverity;\n message: string;\n date: number;\n acknowledged: boolean;\n}\n\nexport interface JoopCreditReport {\n currentScore: number | null;\n band: JoopCreditBand | null;\n trend: JoopCreditTrend;\n change30d: number | null;\n change90d: number | null;\n entries: JoopCreditEntry[];\n factors: JoopCreditFactorScore[];\n alerts: JoopCreditAlert[];\n}\n\nexport interface JoopCreditSimulation {\n action: string;\n currentScore: number;\n estimatedChange: number;\n estimatedScore: number;\n confidence: 'low' | 'medium' | 'high';\n}\n\nconst BAND_RANGES: Array<{ band: JoopCreditBand; min: number; max: number }> = [\n { band: 'exceptional', min: 800, max: 850 },\n { band: 'very-good', min: 740, max: 799 },\n { band: 'good', min: 670, max: 739 },\n { band: 'fair', min: 580, max: 669 },\n { band: 'poor', min: 300, max: 579 },\n];\n\nconst SIMULATION_IMPACTS: Record<string, { change: number; confidence: 'low' | 'medium' | 'high' }> = {\n 'new-inquiry': { change: -7, confidence: 'high' },\n 'payoff-card': { change: +30, confidence: 'medium' },\n 'close-account': { change: -12, confidence: 'medium' },\n 'late-payment': { change: -80, confidence: 'high' },\n 'open-account': { change: -10, confidence: 'medium' },\n 'debt-payoff': { change: +50, confidence: 'low' },\n};\n\nexport class JoopCreditScoreService {\n private _entries: JoopCreditEntry[] = [];\n private _factors: JoopCreditFactorScore[] = [];\n private _alerts: JoopCreditAlert[] = [];\n private _score$ = new JoopBehaviorSubject<number | null>(null);\n\n // ── Entries ───────────────────────────────────────────────────────────────\n\n addEntry(score: number, source = 'manual', note?: string): JoopCreditEntry {\n if (score < 300 || score > 850) throw new Error('Credit score must be between 300 and 850');\n const entry: JoopCreditEntry = { id: _uid(), score, date: Date.now(), source, note };\n this._entries.push(entry);\n this._score$.next(score);\n return { ...entry };\n }\n\n getCurrentScore(): number | null {\n if (this._entries.length === 0) return null;\n return this._entries[this._entries.length - 1].score;\n }\n\n getHistory(limit?: number): JoopCreditEntry[] {\n const all = [...this._entries].reverse();\n return limit ? all.slice(0, limit) : all;\n }\n\n // ── Band ──────────────────────────────────────────────────────────────────\n\n getBand(score?: number): JoopCreditBand | null {\n const s = score ?? this.getCurrentScore();\n if (s === null) return null;\n return BAND_RANGES.find(b => s >= b.min && s <= b.max)?.band ?? 'poor';\n }\n\n // ── Trend ─────────────────────────────────────────────────────────────────\n\n getTrend(): JoopCreditTrend {\n if (this._entries.length < 2) return 'stable';\n const latest = this._entries[this._entries.length - 1].score;\n const prev = this._entries[this._entries.length - 2].score;\n const delta = latest - prev;\n if (delta >= 5) return 'improving';\n if (delta <= -5) return 'declining';\n return 'stable';\n }\n\n private _changeOver(ms: number): number | null {\n const now = Date.now();\n const cutoff = now - ms;\n const recent = this._entries.filter(e => e.date >= cutoff);\n if (recent.length < 1 || this._entries.length < 2) return null;\n const current = this.getCurrentScore()!;\n const oldest = recent[0].score;\n return current - oldest;\n }\n\n // ── Factors ───────────────────────────────────────────────────────────────\n\n setFactors(factors: JoopCreditFactorScore[]): void { this._factors = factors.map(f => ({ ...f })); }\n\n getFactors(): JoopCreditFactorScore[] { return [...this._factors]; }\n\n setDefaultFactors(options: {\n paymentHistoryScore?: number;\n utilizationScore?: number;\n ageScore?: number;\n mixScore?: number;\n inquiriesScore?: number;\n } = {}): void {\n const s = options;\n this._factors = [\n { factor: 'payment-history', score: s.paymentHistoryScore ?? 80, weight: 35, impact: (s.paymentHistoryScore ?? 80) >= 70 ? 'positive' : 'negative', description: 'On-time payment history' },\n { factor: 'utilization', score: s.utilizationScore ?? 60, weight: 30, impact: (s.utilizationScore ?? 60) >= 50 ? 'positive' : 'negative', description: 'Credit utilization ratio' },\n { factor: 'age-of-credit', score: s.ageScore ?? 70, weight: 15, impact: 'neutral', description: 'Average age of accounts' },\n { factor: 'credit-mix', score: s.mixScore ?? 75, weight: 10, impact: 'positive', description: 'Variety of credit types' },\n { factor: 'new-inquiries', score: s.inquiriesScore ?? 90, weight: 10, impact: (s.inquiriesScore ?? 90) >= 70 ? 'positive' : 'negative', description: 'Recent credit inquiries' },\n ];\n }\n\n // ── Alerts ────────────────────────────────────────────────────────────────\n\n addAlert(type: string, severity: JoopCreditAlertSeverity, message: string): JoopCreditAlert {\n const alert: JoopCreditAlert = { id: _uid(), type, severity, message, date: Date.now(), acknowledged: false };\n this._alerts.push(alert);\n return { ...alert };\n }\n\n acknowledgeAlert(id: string): void {\n const a = this._alerts.find(x => x.id === id);\n if (!a) throw new Error(`Alert '${id}' not found`);\n a.acknowledged = true;\n }\n\n getAlerts(unacknowledgedOnly = false): JoopCreditAlert[] {\n const list = [...this._alerts].sort((a, b) => b.date - a.date);\n return unacknowledgedOnly ? list.filter(a => !a.acknowledged) : list;\n }\n\n // ── Simulation ────────────────────────────────────────────────────────────\n\n simulateImpact(action: string): JoopCreditSimulation {\n const current = this.getCurrentScore();\n if (current === null) throw new Error('No credit score recorded yet');\n const impact = SIMULATION_IMPACTS[action] ?? { change: 0, confidence: 'low' as const };\n const estimated = Math.max(300, Math.min(850, current + impact.change));\n return {\n action,\n currentScore: current,\n estimatedChange: impact.change,\n estimatedScore: estimated,\n confidence: impact.confidence,\n };\n }\n\n // ── Report ────────────────────────────────────────────────────────────────\n\n getReport(): JoopCreditReport {\n return {\n currentScore: this.getCurrentScore(),\n band: this.getBand(),\n trend: this.getTrend(),\n change30d: this._changeOver(30 * 86_400_000),\n change90d: this._changeOver(90 * 86_400_000),\n entries: [...this._entries],\n factors: this.getFactors(),\n alerts: this.getAlerts(),\n };\n }\n\n score$() { return this._score$.asObservable(); }\n}\n\nfunction _uid(): string { return `${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`; }\n","import { JoopBehaviorSubject } from '../events';\n\nexport type JoopAssetCategory =\n | 'cash' | 'investment' | 'real-estate' | 'vehicle' | 'retirement' | 'business' | 'personal-property' | 'other-asset';\n\nexport type JoopLiabilityCategory =\n | 'mortgage' | 'auto-loan' | 'student-loan' | 'credit-card' | 'personal-loan' | 'business-loan' | 'other-liability';\n\nexport interface JoopFinancialAsset {\n id: string;\n name: string;\n category: JoopAssetCategory;\n value: number;\n currency: string;\n notes?: string;\n asOf: number;\n}\n\nexport interface JoopFinancialLiability {\n id: string;\n name: string;\n category: JoopLiabilityCategory;\n balance: number;\n interestRate?: number;\n currency: string;\n notes?: string;\n asOf: number;\n}\n\nexport interface JoopNetWorthSnapshot {\n id: string;\n date: number;\n totalAssets: number;\n totalLiabilities: number;\n netWorth: number;\n assetsByCategory: Record<string, number>;\n liabilitiesByCategory: Record<string, number>;\n}\n\nexport interface JoopNetWorthTrend {\n snapshots: JoopNetWorthSnapshot[];\n change: number;\n changePercent: number;\n direction: 'up' | 'down' | 'flat';\n}\n\nexport class JoopNetWorthService {\n private _assets = new Map<string, JoopFinancialAsset>();\n private _liabilities = new Map<string, JoopFinancialLiability>();\n private _snapshots: JoopNetWorthSnapshot[] = [];\n private _netWorth$ = new JoopBehaviorSubject<number>(0);\n\n // ── Assets ────────────────────────────────────────────────────────────────\n\n addAsset(data: Omit<JoopFinancialAsset, 'id'>): JoopFinancialAsset {\n if (data.value < 0) throw new Error('Asset value cannot be negative');\n const asset: JoopFinancialAsset = { ...data, id: _uid() };\n this._assets.set(asset.id, asset);\n this._emit();\n return { ...asset };\n }\n\n updateAsset(id: string, patch: Partial<Omit<JoopFinancialAsset, 'id'>>): JoopFinancialAsset {\n const a = this._requireAsset(id);\n Object.assign(a, patch);\n this._emit();\n return { ...a };\n }\n\n removeAsset(id: string): void {\n if (!this._assets.has(id)) throw new Error(`Asset '${id}' not found`);\n this._assets.delete(id);\n this._emit();\n }\n\n getAsset(id: string): JoopFinancialAsset | undefined {\n const a = this._assets.get(id);\n return a ? { ...a } : undefined;\n }\n\n getAssets(): JoopFinancialAsset[] {\n return Array.from(this._assets.values()).map(a => ({ ...a }));\n }\n\n // ── Liabilities ───────────────────────────────────────────────────────────\n\n addLiability(data: Omit<JoopFinancialLiability, 'id'>): JoopFinancialLiability {\n if (data.balance < 0) throw new Error('Liability balance cannot be negative');\n const liability: JoopFinancialLiability = { ...data, id: _uid() };\n this._liabilities.set(liability.id, liability);\n this._emit();\n return { ...liability };\n }\n\n updateLiability(id: string, patch: Partial<Omit<JoopFinancialLiability, 'id'>>): JoopFinancialLiability {\n const l = this._requireLiability(id);\n Object.assign(l, patch);\n this._emit();\n return { ...l };\n }\n\n removeLiability(id: string): void {\n if (!this._liabilities.has(id)) throw new Error(`Liability '${id}' not found`);\n this._liabilities.delete(id);\n this._emit();\n }\n\n getLiability(id: string): JoopFinancialLiability | undefined {\n const l = this._liabilities.get(id);\n return l ? { ...l } : undefined;\n }\n\n getLiabilities(): JoopFinancialLiability[] {\n return Array.from(this._liabilities.values()).map(l => ({ ...l }));\n }\n\n // ── Aggregates ────────────────────────────────────────────────────────────\n\n getTotalAssets(): number {\n return _round(Array.from(this._assets.values()).reduce((s, a) => s + a.value, 0));\n }\n\n getTotalLiabilities(): number {\n return _round(Array.from(this._liabilities.values()).reduce((s, l) => s + l.balance, 0));\n }\n\n getNetWorth(): number {\n return _round(this.getTotalAssets() - this.getTotalLiabilities());\n }\n\n getAssetsByCategory(): Record<JoopAssetCategory, number> {\n const result = {} as Record<JoopAssetCategory, number>;\n for (const a of this._assets.values()) {\n result[a.category] = _round((result[a.category] ?? 0) + a.value);\n }\n return result;\n }\n\n getLiabilitiesByCategory(): Record<JoopLiabilityCategory, number> {\n const result = {} as Record<JoopLiabilityCategory, number>;\n for (const l of this._liabilities.values()) {\n result[l.category] = _round((result[l.category] ?? 0) + l.balance);\n }\n return result;\n }\n\n getDebtToAssetRatio(): number {\n const assets = this.getTotalAssets();\n return assets > 0 ? _round(this.getTotalLiabilities() / assets, 4) : 0;\n }\n\n // ── Snapshots ─────────────────────────────────────────────────────────────\n\n snapshot(): JoopNetWorthSnapshot {\n const snap: JoopNetWorthSnapshot = {\n id: _uid(),\n date: Date.now(),\n totalAssets: this.getTotalAssets(),\n totalLiabilities: this.getTotalLiabilities(),\n netWorth: this.getNetWorth(),\n assetsByCategory: this.getAssetsByCategory() as Record<string, number>,\n liabilitiesByCategory: this.getLiabilitiesByCategory() as Record<string, number>,\n };\n this._snapshots.push(snap);\n return { ...snap };\n }\n\n getHistory(): JoopNetWorthSnapshot[] {\n return this._snapshots.map(s => ({ ...s }));\n }\n\n getTrend(periods = 2): JoopNetWorthTrend {\n const snaps = this._snapshots.slice(-periods);\n if (snaps.length < 2) {\n return { snapshots: snaps, change: 0, changePercent: 0, direction: 'flat' };\n }\n const first = snaps[0].netWorth;\n const last = snaps[snaps.length - 1].netWorth;\n const change = _round(last - first);\n const changePct = first !== 0 ? _round((change / Math.abs(first)) * 100, 2) : 0;\n return {\n snapshots: snaps,\n change,\n changePercent: changePct,\n direction: change > 0 ? 'up' : change < 0 ? 'down' : 'flat',\n };\n }\n\n netWorth$() { return this._netWorth$.asObservable(); }\n\n // ── Internals ─────────────────────────────────────────────────────────────\n\n private _emit(): void { this._netWorth$.next(this.getNetWorth()); }\n\n private _requireAsset(id: string): JoopFinancialAsset {\n const a = this._assets.get(id);\n if (!a) throw new Error(`Asset '${id}' not found`);\n return a;\n }\n\n private _requireLiability(id: string): JoopFinancialLiability {\n const l = this._liabilities.get(id);\n if (!l) throw new Error(`Liability '${id}' not found`);\n return l;\n }\n}\n\nfunction _uid(): string { return `${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`; }\nfunction _round(n: number, dp = 2): number { return parseFloat(n.toFixed(dp)); }\n","import { JoopBehaviorSubject } from '../events';\n\nexport type JoopCashFlowCategory = 'income' | 'expense' | 'transfer' | 'tax' | 'investment';\nexport type JoopCashFlowFrequency = 'daily' | 'weekly' | 'biweekly' | 'monthly' | 'quarterly' | 'yearly';\nexport type JoopCashFlowDirection = 'inflow' | 'outflow';\n\nexport interface JoopCashFlowEntry {\n id: string;\n direction: JoopCashFlowDirection;\n amount: number;\n category: JoopCashFlowCategory;\n description: string;\n date: number;\n currency: string;\n isRecurring: boolean;\n frequency?: JoopCashFlowFrequency;\n endDate?: number;\n tags?: string[];\n}\n\nexport interface JoopCashFlowPeriod {\n from: number;\n to: number;\n totalInflow: number;\n totalOutflow: number;\n netCashFlow: number;\n entries: JoopCashFlowEntry[];\n}\n\nexport interface JoopCashFlowForecast {\n from: number;\n to: number;\n periods: JoopCashFlowPeriod[];\n projectedInflow: number;\n projectedOutflow: number;\n projectedNet: number;\n}\n\nexport interface JoopBurnRateResult {\n dailyBurnRate: number;\n monthlyBurnRate: number;\n periodDays: number;\n}\n\nexport interface JoopRunwayResult {\n runwayDays: number;\n runwayMonths: number;\n currentBalance: number;\n monthlyBurnRate: number;\n}\n\nexport interface JoopCategoryBreakdown {\n category: JoopCashFlowCategory;\n inflow: number;\n outflow: number;\n net: number;\n}\n\nfunction _uid(): string {\n return `${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;\n}\n\nconst FREQ_DAYS: Record<JoopCashFlowFrequency, number> = {\n daily: 1, weekly: 7, biweekly: 14, monthly: 30, quarterly: 91, yearly: 365,\n};\n\nfunction _advanceDate(date: number, freq: JoopCashFlowFrequency): number {\n const d = new Date(date);\n switch (freq) {\n case 'daily': d.setDate(d.getDate() + 1); break;\n case 'weekly': d.setDate(d.getDate() + 7); break;\n case 'biweekly': d.setDate(d.getDate() + 14); break;\n case 'monthly': d.setMonth(d.getMonth() + 1); break;\n case 'quarterly': d.setMonth(d.getMonth() + 3); break;\n case 'yearly': d.setFullYear(d.getFullYear() + 1); break;\n }\n return d.getTime();\n}\n\nexport class JoopCashFlowService {\n private _entries: JoopCashFlowEntry[] = [];\n private _netCash$ = new JoopBehaviorSubject<number>(0);\n\n // ── Entries ───────────────────────────────────────────────────────────────\n\n addEntry(\n direction: JoopCashFlowDirection,\n amount: number,\n category: JoopCashFlowCategory,\n description: string,\n date: number,\n opts: { currency?: string; isRecurring?: boolean; frequency?: JoopCashFlowFrequency; endDate?: number; tags?: string[] } = {}\n ): JoopCashFlowEntry {\n if (amount <= 0) throw new Error('Amount must be positive');\n const entry: JoopCashFlowEntry = {\n id: _uid(),\n direction,\n amount,\n category,\n description,\n date,\n currency: opts.currency ?? 'USD',\n isRecurring: opts.isRecurring ?? false,\n frequency: opts.frequency,\n endDate: opts.endDate,\n tags: opts.tags,\n };\n this._entries.push(entry);\n this._emit();\n return entry;\n }\n\n updateEntry(id: string, patch: Partial<Omit<JoopCashFlowEntry, 'id'>>): JoopCashFlowEntry {\n const e = this._getEntry(id);\n Object.assign(e, patch);\n this._emit();\n return e;\n }\n\n removeEntry(id: string): void {\n const idx = this._entries.findIndex(e => e.id === id);\n if (idx === -1) throw new Error(`Entry ${id} not found`);\n this._entries.splice(idx, 1);\n this._emit();\n }\n\n getEntry(id: string): JoopCashFlowEntry | undefined {\n return this._entries.find(e => e.id === id);\n }\n\n getEntries(from?: number, to?: number): JoopCashFlowEntry[] {\n return this._expandRecurring(from, to);\n }\n\n // ── Aggregates ────────────────────────────────────────────────────────────\n\n getInflow(from: number, to: number): number {\n return this._expandRecurring(from, to)\n .filter(e => e.direction === 'inflow')\n .reduce((s, e) => s + e.amount, 0);\n }\n\n getOutflow(from: number, to: number): number {\n return this._expandRecurring(from, to)\n .filter(e => e.direction === 'outflow')\n .reduce((s, e) => s + e.amount, 0);\n }\n\n getNetCashFlow(from: number, to: number): number {\n return Math.round((this.getInflow(from, to) - this.getOutflow(from, to)) * 100) / 100;\n }\n\n getCategoryBreakdown(from: number, to: number): JoopCategoryBreakdown[] {\n const map = new Map<JoopCashFlowCategory, { inflow: number; outflow: number }>();\n for (const e of this._expandRecurring(from, to)) {\n const cur = map.get(e.category) ?? { inflow: 0, outflow: 0 };\n if (e.direction === 'inflow') cur.inflow += e.amount;\n else cur.outflow += e.amount;\n map.set(e.category, cur);\n }\n return Array.from(map.entries()).map(([category, v]) => ({\n category,\n inflow: Math.round(v.inflow * 100) / 100,\n outflow: Math.round(v.outflow * 100) / 100,\n net: Math.round((v.inflow - v.outflow) * 100) / 100,\n }));\n }\n\n // ── Burn Rate & Runway ────────────────────────────────────────────────────\n\n getBurnRate(periodDays = 30): JoopBurnRateResult {\n if (periodDays <= 0) throw new Error('periodDays must be positive');\n const to = Date.now();\n const from = to - periodDays * 86_400_000;\n const totalOutflow = this.getOutflow(from, to);\n const dailyBurnRate = Math.round((totalOutflow / periodDays) * 100) / 100;\n const monthlyBurnRate = Math.round(dailyBurnRate * 30 * 100) / 100;\n return { dailyBurnRate, monthlyBurnRate, periodDays };\n }\n\n getRunway(currentBalance: number, periodDays = 30): JoopRunwayResult {\n if (currentBalance < 0) throw new Error('currentBalance must be non-negative');\n const { monthlyBurnRate } = this.getBurnRate(periodDays);\n if (monthlyBurnRate <= 0) return { runwayDays: Infinity, runwayMonths: Infinity, currentBalance, monthlyBurnRate: 0 };\n const runwayMonths = currentBalance / monthlyBurnRate;\n const runwayDays = Math.round(runwayMonths * 30);\n return { runwayDays, runwayMonths: Math.round(runwayMonths * 100) / 100, currentBalance, monthlyBurnRate };\n }\n\n // ── Forecast ──────────────────────────────────────────────────────────────\n\n forecast(from: number, to: number, granularityDays = 30): JoopCashFlowForecast {\n const periods: JoopCashFlowPeriod[] = [];\n let cursor = from;\n while (cursor < to) {\n const periodEnd = Math.min(cursor + granularityDays * 86_400_000, to);\n const entries = this._expandRecurring(cursor, periodEnd);\n const totalInflow = entries.filter(e => e.direction === 'inflow').reduce((s, e) => s + e.amount, 0);\n const totalOutflow = entries.filter(e => e.direction === 'outflow').reduce((s, e) => s + e.amount, 0);\n periods.push({\n from: cursor,\n to: periodEnd,\n totalInflow: Math.round(totalInflow * 100) / 100,\n totalOutflow: Math.round(totalOutflow * 100) / 100,\n netCashFlow: Math.round((totalInflow - totalOutflow) * 100) / 100,\n entries,\n });\n cursor = periodEnd;\n }\n const projectedInflow = Math.round(periods.reduce((s, p) => s + p.totalInflow, 0) * 100) / 100;\n const projectedOutflow = Math.round(periods.reduce((s, p) => s + p.totalOutflow, 0) * 100) / 100;\n return { from, to, periods, projectedInflow, projectedOutflow, projectedNet: Math.round((projectedInflow - projectedOutflow) * 100) / 100 };\n }\n\n // ── Observable ───────────────────────────────────────────────────────────\n\n cashFlow$() { return this._netCash$; }\n\n // ── Private ───────────────────────────────────────────────────────────────\n\n private _getEntry(id: string): JoopCashFlowEntry {\n const e = this._entries.find(x => x.id === id);\n if (!e) throw new Error(`Entry ${id} not found`);\n return e;\n }\n\n private _emit(): void {\n const now = Date.now();\n const thirtyDaysAgo = now - 30 * 86_400_000;\n this._netCash$.next(this.getNetCashFlow(thirtyDaysAgo, now));\n }\n\n /** Expand recurring entries into concrete occurrences within [from, to]. */\n private _expandRecurring(from?: number, to?: number): JoopCashFlowEntry[] {\n const result: JoopCashFlowEntry[] = [];\n for (const e of this._entries) {\n if (!e.isRecurring || !e.frequency) {\n if ((from === undefined || e.date >= from) && (to === undefined || e.date <= to)) {\n result.push(e);\n }\n continue;\n }\n let cursor = e.date;\n const end = Math.min(to ?? Infinity, e.endDate ?? Infinity);\n while (cursor <= end) {\n if ((from === undefined || cursor >= from) && (to === undefined || cursor <= to)) {\n result.push({ ...e, id: `${e.id}_${cursor}`, date: cursor, isRecurring: false });\n }\n if (cursor > end) break;\n const next = _advanceDate(cursor, e.frequency);\n if (next <= cursor) break; // guard infinite loop\n cursor = next;\n }\n }\n return result;\n }\n}\n","export interface JoopDeviceInfo {\n userAgent: string;\n platform: string;\n isIOS: boolean;\n isAndroid: boolean;\n isMobile: boolean;\n isDesktop: boolean;\n language: string;\n}\n\nexport function getDeviceInfo(): JoopDeviceInfo {\n const ua = typeof navigator !== 'undefined' ? navigator.userAgent : '';\n const platform = typeof navigator !== 'undefined' ? navigator.platform ?? '' : '';\n const language = typeof navigator !== 'undefined' ? navigator.language ?? 'en' : 'en';\n\n const isIOS = /iphone|ipad|ipod/i.test(ua);\n const isAndroid = /android/i.test(ua);\n const isMobile = isIOS || isAndroid || /mobi/i.test(ua);\n\n return {\n userAgent: ua,\n platform,\n isIOS,\n isAndroid,\n isMobile,\n isDesktop: !isMobile,\n language,\n };\n}\n\nexport function isBrowser(): boolean {\n return typeof window !== 'undefined' && typeof document !== 'undefined';\n}\n\nexport function isSSR(): boolean {\n return !isBrowser();\n}\n","const SQL_KEYWORDS = /\\b(SELECT|INSERT|UPDATE|DELETE|DROP|TRUNCATE|ALTER|EXEC|UNION|SCRIPT)\\b/gi;\n\nexport function escapeHtml(input: string): string {\n return input\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\n\nexport function stripHtml(input: string): string {\n return input.replace(/<[^>]*>/g, '');\n}\n\nexport function sanitizeInput(input: string): string {\n return escapeHtml(input.trim());\n}\n\nexport function stripSqlKeywords(input: string): string {\n return input.replace(/['\";\\\\]/g, '').replace(SQL_KEYWORDS, '');\n}\n\nexport function sanitizeFileName(name: string): string {\n return name.replace(/[^a-zA-Z0-9._\\-]/g, '_').replace(/_{2,}/g, '_');\n}\n\nexport function isValidUrl(url: string): boolean {\n try {\n const { protocol } = new URL(url);\n return protocol === 'http:' || protocol === 'https:';\n } catch {\n return false;\n }\n}\n\nexport function isValidEmail(email: string): boolean {\n return /^[^\\s@]+@[^\\s@]+\\.[^\\s@]{2,}$/.test(email);\n}\n\nexport function isValidPhone(phone: string): boolean {\n return /^\\+?[\\d\\s\\-()]{7,20}$/.test(phone);\n}\n\nexport function isAlphanumeric(value: string): boolean {\n return /^[a-zA-Z0-9]+$/.test(value);\n}\n\nexport function truncate(value: string, maxLength: number, suffix = '…'): string {\n return value.length > maxLength ? value.slice(0, maxLength - suffix.length) + suffix : value;\n}\n","/** Recursively flatten a nested object — { a: { b: 1 } } → { 'a.b': 1 } */\nexport function flattenObj(\n obj: Record<string, unknown>,\n prefix = '',\n result: Record<string, string> = {},\n): Record<string, string> {\n for (const key of Object.keys(obj)) {\n const fullKey = prefix ? `${prefix}.${key}` : key;\n const val = obj[key];\n if (val !== null && typeof val === 'object' && !Array.isArray(val)) {\n flattenObj(val as Record<string, unknown>, fullKey, result);\n } else {\n result[fullKey] = val == null ? '' : String(val);\n }\n }\n return result;\n}\n\n/** Build a URL query string from a flat or nested object */\nexport function buildQueryString(\n params: Record<string, unknown>,\n encode = true,\n): string {\n const flat = flattenObj(params as Record<string, unknown>);\n return Object.entries(flat)\n .filter(([, v]) => v !== '')\n .map(([k, v]) => `${encode ? encodeURIComponent(k) : k}=${encode ? encodeURIComponent(v) : v}`)\n .join('&');\n}\n\n/** Build a FormData object from a flat or nested object, with optional file attachments */\nexport function buildFormData(\n params: Record<string, unknown>,\n files?: { field: string; file: File | Blob; name?: string }[],\n): FormData {\n const flat = flattenObj(params as Record<string, unknown>);\n const fd = new FormData();\n for (const [k, v] of Object.entries(flat)) {\n fd.append(k, v);\n }\n if (files) {\n for (const { field, file, name } of files) {\n if (name) {\n fd.append(field, file, name);\n } else {\n fd.append(field, file);\n }\n }\n }\n return fd;\n}\n\n/** Encode query params using encodeURIComponent — replaces space with %20 (not +) */\nexport function urlEncode(params: Record<string, string>): string {\n return Object.entries(params)\n .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(v)}`)\n .join('&');\n}\n\n/** Generate a random integer in [min, max] inclusive */\nexport function getRandomNum(min: number, max: number): number {\n return Math.floor(Math.random() * (max - min + 1)) + min;\n}\n","// ── Gregorian / Business-day utilities ─────────────────────────────────────\n\nconst WEEKDAYS = [0, 6]; // Sunday, Saturday — override to [5, 6] for Fri/Sat (Gulf)\n\nexport interface JoopDateRangeResult { days: number; businessDays: number; }\n\nexport type JoopWeekend = [number, number]; // day-of-week indices (0=Sun, 6=Sat)\n\nexport function isBusinessDay(date: Date, holidays: Date[] = [], weekend: JoopWeekend = [0, 6]): boolean {\n const dow = date.getDay();\n if (weekend.includes(dow)) return false;\n const iso = _toIso(date);\n return !holidays.some(h => _toIso(h) === iso);\n}\n\nexport function addBusinessDays(date: Date, days: number, holidays: Date[] = [], weekend: JoopWeekend = [0, 6]): Date {\n const d = new Date(date);\n let remaining = Math.abs(days);\n const step = days >= 0 ? 1 : -1;\n while (remaining > 0) {\n d.setDate(d.getDate() + step);\n if (isBusinessDay(d, holidays, weekend)) remaining--;\n }\n return d;\n}\n\nexport function getBusinessDaysBetween(start: Date, end: Date, holidays: Date[] = [], weekend: JoopWeekend = [0, 6]): number {\n const s = new Date(Math.min(start.getTime(), end.getTime()));\n const e = new Date(Math.max(start.getTime(), end.getTime()));\n let count = 0;\n const cur = new Date(s);\n cur.setDate(cur.getDate() + 1);\n while (cur <= e) {\n if (isBusinessDay(cur, holidays, weekend)) count++;\n cur.setDate(cur.getDate() + 1);\n }\n return count;\n}\n\nexport function daysBetween(a: Date, b: Date): number {\n return Math.round(Math.abs(b.getTime() - a.getTime()) / 86_400_000);\n}\n\nexport function isDateInRange(date: Date, start: Date, end: Date): boolean {\n return date >= start && date <= end;\n}\n\nexport function isExpired(date: Date): boolean { return date < new Date(); }\n\nexport function startOfDay(date: Date): Date {\n const d = new Date(date); d.setHours(0, 0, 0, 0); return d;\n}\nexport function endOfDay(date: Date): Date {\n const d = new Date(date); d.setHours(23, 59, 59, 999); return d;\n}\nexport function startOfMonth(date: Date): Date { return new Date(date.getFullYear(), date.getMonth(), 1); }\nexport function endOfMonth(date: Date): Date { return new Date(date.getFullYear(), date.getMonth() + 1, 0, 23, 59, 59, 999); }\n\nexport function parseDate(value: string | number): Date | null {\n if (!value) return null;\n const d = new Date(value);\n return isNaN(d.getTime()) ? null : d;\n}\n\nexport function formatDate(date: Date, format: string, locale = 'en-US'): string {\n const p: Record<string, string> = {\n YYYY: String(date.getFullYear()),\n MM: String(date.getMonth() + 1).padStart(2, '0'),\n DD: String(date.getDate()).padStart(2, '0'),\n HH: String(date.getHours()).padStart(2, '0'),\n mm: String(date.getMinutes()).padStart(2, '0'),\n ss: String(date.getSeconds()).padStart(2, '0'),\n M: String(date.getMonth() + 1),\n D: String(date.getDate()),\n // locale-aware month name\n MMM: date.toLocaleDateString(locale, { month: 'short' }),\n MMMM: date.toLocaleDateString(locale, { month: 'long' }),\n };\n return format.replace(/MMMM|MMM|YYYY|MM|DD|HH|mm|ss|M|D/g, k => p[k] ?? k);\n}\n\n// ── Hijri (Islamic / Umm Al-Qura approximation) ────────────────────────────\n\nexport interface JoopHijriDate { year: number; month: number; day: number; monthName: string; }\n\nconst HIJRI_MONTHS = [\n 'Muharram','Safar','Rabi al-Awwal','Rabi al-Thani',\n 'Jumada al-Awwal','Jumada al-Thani','Rajab','Sha\\'ban',\n 'Ramadan','Shawwal','Dhu al-Qi\\'dah','Dhu al-Hijjah',\n];\n\n/** Convert Gregorian date to Hijri (algorithmic approximation — accurate ±1 day) */\nexport function toHijri(date: Date): JoopHijriDate {\n const jd = _toJulian(date.getFullYear(), date.getMonth() + 1, date.getDate());\n let l = jd - 1948440 + 10632;\n const n = Math.floor((l - 1) / 10631);\n l = l - 10631 * n + 354;\n const j = Math.floor((10985 - l) / 5316) * Math.floor((50 * l) / 17719) +\n Math.floor(l / 5670) * Math.floor((43 * l) / 15238);\n l = l - Math.floor((30 - j) / 15) * Math.floor((17719 * j) / 50) -\n Math.floor(j / 16) * Math.floor((15238 * j) / 43) + 29;\n const month = Math.floor((24 * l) / 709);\n const day = l - Math.floor((709 * month) / 24);\n const year = 30 * n + j - 30;\n return { year, month, day, monthName: HIJRI_MONTHS[month - 1] ?? '' };\n}\n\n/** Convert Hijri date back to Gregorian */\nexport function fromHijri(year: number, month: number, day: number): Date {\n const jd = Math.floor((11 * year + 3) / 30) + 354 * year + 30 * month -\n Math.floor((month - 1) / 2) + day + 1948440 - 385;\n return _fromJulian(jd);\n}\n\nexport function formatHijri(date: JoopHijriDate, includeMonthName = true): string {\n const d = String(date.day).padStart(2, '0');\n const m = String(date.month).padStart(2, '0');\n return includeMonthName\n ? `${d} ${date.monthName} ${date.year} AH`\n : `${d}/${m}/${date.year}`;\n}\n\nexport function getHijriMonthName(month: number): string { return HIJRI_MONTHS[month - 1] ?? ''; }\n\n// ── Relative time ─────────────────────────────────────────────────────────\n\nexport function timeAgo(date: Date, locale = 'en'): string {\n const diff = Date.now() - date.getTime();\n const abs = Math.abs(diff);\n const future = diff < 0;\n const pre = future ? 'in ' : '';\n const suf = future ? '' : ' ago';\n if (abs < 60_000) return 'just now';\n if (abs < 3_600_000) return `${pre}${Math.floor(abs / 60_000)}m${suf}`;\n if (abs < 86_400_000) return `${pre}${Math.floor(abs / 3_600_000)}h${suf}`;\n if (abs < 2_592_000_000) return `${pre}${Math.floor(abs / 86_400_000)}d${suf}`;\n return formatDate(date, 'DD MMM YYYY', locale);\n}\n\n// ── Private helpers ─────────────────────────────────────────────────────────\n\nfunction _toIso(date: Date): string { return date.toISOString().slice(0, 10); }\n\nfunction _toJulian(y: number, m: number, d: number): number {\n if (m <= 2) { y--; m += 12; }\n const A = Math.floor(y / 100);\n const B = 2 - A + Math.floor(A / 4);\n return Math.floor(365.25 * (y + 4716)) + Math.floor(30.6001 * (m + 1)) + d + B - 1524;\n}\n\nfunction _fromJulian(jd: number): Date {\n const z = Math.floor(jd + 0.5);\n const a = Math.floor((z - 1867216.25) / 36524.25);\n const A = z + 1 + a - Math.floor(a / 4);\n const B = A + 1524;\n const C = Math.floor((B - 122.1) / 365.25);\n const D = Math.floor(365.25 * C);\n const E = Math.floor((B - D) / 30.6001);\n const day = B - D - Math.floor(30.6001 * E);\n const month = E < 14 ? E - 1 : E - 13;\n const year = month > 2 ? C - 4716 : C - 4715;\n return new Date(year, month - 1, day);\n}\n","// QR code generator — ISO 18004, versions 1-10, byte encoding\n// Pure TypeScript/SVG — no DOM required for generation\n\nexport type JoopQrEcLevel = 'L' | 'M' | 'Q' | 'H';\n\nexport interface JoopQrOptions {\n ecLevel?: JoopQrEcLevel;\n size?: number;\n margin?: number;\n foreground?: string;\n background?: string;\n}\n\n// ── GF(256) ─────────────────────────────────────────────────────────────────\nconst _GFe = new Uint8Array(512), _GFl = new Uint8Array(256);\n(function () {\n let x = 1;\n for (let i = 0; i < 255; i++) { _GFe[i] = x; _GFl[x] = i; x = x << 1; if (x & 0x100) x ^= 0x11d; }\n for (let i = 255; i < 512; i++) _GFe[i] = _GFe[i - 255];\n})();\nconst _gm = (a: number, b: number) => a && b ? _GFe[(_GFl[a] + _GFl[b]) % 255] : 0;\n\nfunction _gen(n: number): number[] {\n let g = [1];\n for (let i = 0; i < n; i++) {\n const next = new Array(g.length + 1).fill(0);\n for (let j = 0; j < g.length; j++) { next[j] ^= g[j]; next[j + 1] ^= _gm(g[j], _GFe[i]); }\n g = next;\n }\n return g;\n}\n\nfunction _rsEnc(data: number[], nec: number): number[] {\n const g = _gen(nec);\n const msg = [...data, ...new Array(nec).fill(0)];\n for (let i = 0; i < data.length; i++) {\n const c = msg[i];\n if (c) for (let j = 0; j < g.length; j++) msg[i + j] ^= _gm(g[j], c);\n }\n return msg.slice(data.length);\n}\n\n// ── Version tables ───────────────────────────────────────────────────────────\n// [ecPerBlock, [[count, dataPerBlock], ...]]\ntype ECD = [number, Array<[number, number]>];\ninterface VD { aln: number[]; L: ECD; M: ECD; Q: ECD; H: ECD; }\n\nconst VT: VD[] = [\n { aln:[], L:[7,[[1,19]]], M:[10,[[1,16]]], Q:[13,[[1,13]]], H:[17,[[1,9]]] },\n { aln:[6,18], L:[10,[[1,34]]], M:[16,[[1,28]]], Q:[22,[[1,22]]], H:[28,[[1,16]]] },\n { aln:[6,22], L:[15,[[1,55]]], M:[26,[[1,44]]], Q:[18,[[2,17]]], H:[22,[[2,13]]] },\n { aln:[6,26], L:[20,[[1,80]]], M:[18,[[2,32]]], Q:[26,[[2,24]]], H:[16,[[4,9]]] },\n { aln:[6,30], L:[26,[[1,108]]], M:[24,[[2,43]]], Q:[18,[[2,15],[2,16]]], H:[22,[[2,11],[2,12]]] },\n { aln:[6,34], L:[18,[[2,68]]], M:[16,[[4,27]]], Q:[24,[[4,19]]], H:[28,[[4,15]]] },\n { aln:[6,22,38],L:[20,[[2,78]]], M:[18,[[4,31]]], Q:[18,[[2,14],[4,15]]], H:[26,[[4,13],[1,14]]] },\n { aln:[6,24,42],L:[24,[[2,97]]], M:[22,[[2,38],[2,39]]], Q:[22,[[4,18],[2,19]]], H:[26,[[4,14],[2,15]]] },\n { aln:[6,26,46],L:[30,[[2,116]]],M:[22,[[3,36],[2,37]]], Q:[20,[[4,16],[4,17]]], H:[24,[[4,12],[4,13]]] },\n { aln:[6,28,50],L:[18,[[2,68],[2,69]]],M:[26,[[4,43],[1,44]]],Q:[24,[[6,19],[2,20]]],H:[28,[[6,15],[2,16]]] },\n];\nconst ECI: Record<JoopQrEcLevel, number> = { L:1, M:0, Q:3, H:2 };\n\nfunction _cap(v: number, ec: JoopQrEcLevel) { return VT[v-1][ec][1].reduce((s,[c,d]) => s + c*d, 0); }\n\nfunction _bestV(len: number, ec: JoopQrEcLevel): number {\n for (let v = 1; v <= 10; v++) if (_cap(v, ec) >= len + 3) return v;\n throw new Error(`JoopQr: text too long (${len} bytes) for versions 1-10`);\n}\n\n// ── Encode data ──────────────────────────────────────────────────────────────\nfunction _encData(text: string, ver: number, ec: JoopQrEcLevel): number[] {\n const bytes = new TextEncoder().encode(text);\n const total = _cap(ver, ec);\n const bits: number[] = [];\n const push = (v: number, n: number) => { for (let i = n-1; i >= 0; i--) bits.push((v >> i) & 1); };\n push(0b0100, 4);\n push(bytes.length, 8);\n for (const b of bytes) push(b, 8);\n push(0, Math.min(4, total * 8 - bits.length));\n while (bits.length % 8) bits.push(0);\n const cw: number[] = [];\n for (let i = 0; i < bits.length; i += 8) { let b = 0; for (let j = 0; j < 8; j++) b = (b << 1) | (bits[i+j] ?? 0); cw.push(b); }\n const pad = [0xec, 0x11];\n while (cw.length < total) cw.push(pad[cw.length % 2]);\n return cw;\n}\n\n// ── Interleave + RS ──────────────────────────────────────────────────────────\nfunction _buildCW(data: number[], ver: number, ec: JoopQrEcLevel): number[] {\n const [ecpb, groups] = VT[ver-1][ec];\n const db: number[][] = [], eb: number[][] = [];\n let di = 0;\n for (const [cnt, dpb] of groups) for (let b = 0; b < cnt; b++) { const bl = data.slice(di, di+dpb); di += dpb; db.push(bl); eb.push(_rsEnc(bl, ecpb)); }\n const r: number[] = [];\n const md = Math.max(...db.map(b => b.length));\n for (let i = 0; i < md; i++) for (const b of db) if (i < b.length) r.push(b[i]);\n for (let i = 0; i < ecpb; i++) for (const b of eb) r.push(b[i]);\n return r;\n}\n\n// ── Matrix ───────────────────────────────────────────────────────────────────\ntype Mat = Int8Array[];\nfunction _mat(sz: number): Mat { return Array.from({length:sz}, () => new Int8Array(sz).fill(-1)); }\n\nfunction _finder(m: Mat, r: number, c: number): void {\n for (let dr = -1; dr <= 7; dr++) for (let dc = -1; dc <= 7; dc++) {\n const row = r+dr, col = c+dc;\n if (row < 0 || col < 0 || row >= m.length || col >= m.length) continue;\n const inF = dr>=0&&dr<=6&&dc>=0&&dc<=6;\n m[row][col] = inF ? ((dr===0||dr===6||dc===0||dc===6||( dr>=2&&dr<=4&&dc>=2&&dc<=4))?1:0) : 0;\n }\n}\n\nfunction _align(m: Mat, r: number, c: number): void {\n for (let dr = -2; dr <= 2; dr++) for (let dc = -2; dc <= 2; dc++) {\n m[r+dr][c+dc] = (Math.abs(dr)===2||Math.abs(dc)===2||(dr===0&&dc===0)) ? 1 : 0;\n }\n}\n\nfunction _funcPat(m: Mat, ver: number): void {\n const sz = m.length;\n _finder(m, 0, 0); _finder(m, 0, sz-7); _finder(m, sz-7, 0);\n for (let i = 8; i < sz-8; i++) { if (m[6][i]===-1) m[6][i]=i%2?0:1; if (m[i][6]===-1) m[i][6]=i%2?0:1; }\n const aln = VT[ver-1].aln;\n for (const r of aln) for (const c of aln) if (m[r][c]===-1) _align(m, r, c);\n m[4*ver+9][8] = 1;\n for (let i = 0; i <= 8; i++) { if (m[8][i]===-1) m[8][i]=0; if (m[i][8]===-1) m[i][8]=0; }\n for (let i = sz-8; i < sz; i++) { if (m[8][i]===-1) m[8][i]=0; if (m[i][8]===-1) m[i][8]=0; }\n}\n\nfunction _placeData(m: Mat, cw: number[]): void {\n const sz = m.length;\n const bits: number[] = [];\n for (const b of cw) for (let i = 7; i >= 0; i--) bits.push((b>>i)&1);\n let bi = 0, up = true;\n for (let col = sz-1; col >= 1; col -= 2) {\n if (col===6) col--;\n for (let ri = 0; ri < sz; ri++) {\n const row = up ? sz-1-ri : ri;\n for (let dc = 0; dc < 2; dc++) { const c = col-dc; if (m[row][c]===-1) m[row][c] = bi < bits.length ? bits[bi++] : 0; }\n }\n up = !up;\n }\n}\n\n// ── Masking ──────────────────────────────────────────────────────────────────\nconst MFN: Array<(r:number,c:number)=>boolean> = [\n (r,c)=>(r+c)%2===0, (r)=>r%2===0, (_,c)=>c%3===0, (r,c)=>(r+c)%3===0,\n (r,c)=>(Math.floor(r/2)+Math.floor(c/3))%2===0,\n (r,c)=>(r*c)%2+(r*c)%3===0, (r,c)=>((r*c)%2+(r*c)%3)%2===0, (r,c)=>((r+c)%2+(r*c)%3)%2===0,\n];\n\nfunction _mask(m: Mat, pat: number, isF: boolean[][]): Mat {\n const sz = m.length;\n const copy: Mat = m.map(r => new Int8Array(r));\n const fn = MFN[pat];\n for (let r = 0; r < sz; r++) for (let c = 0; c < sz; c++) if (!isF[r][c] && copy[r][c]!==-1) if (fn(r,c)) copy[r][c] ^= 1;\n return copy;\n}\n\nfunction _pen(m: Mat): number {\n const sz = m.length; let p = 0;\n for (let r = 0; r < sz; r++) for (const hor of [true,false]) {\n let run=1, prev = hor?m[r][0]:m[0][r];\n for (let i = 1; i < sz; i++) { const cur=hor?m[r][i]:m[i][r]; if(cur===prev){run++;if(run===5)p+=3;else if(run>5)p++;}else{run=1;prev=cur;} }\n }\n for (let r = 0; r < sz-1; r++) for (let c = 0; c < sz-1; c++) { const v=m[r][c]; if(v===m[r][c+1]&&v===m[r+1][c]&&v===m[r+1][c+1])p+=3; }\n let dark=0; for (let r=0;r<sz;r++) for (let c=0;c<sz;c++) if(m[r][c]) dark++;\n p += Math.abs(Math.floor(dark/(sz*sz)*20)-10)*10;\n return p;\n}\n\n// ── Format info ──────────────────────────────────────────────────────────────\nfunction _fmtBits(ec: JoopQrEcLevel, mask: number): number {\n const data = (ECI[ec] << 3) | mask;\n let rem = data << 10;\n for (let i = 14; i >= 10; i--) if (rem & (1<<i)) rem ^= (0x537 << (i-10));\n return ((data << 10) | rem) ^ 0x5412;\n}\n\nfunction _placeFmt(m: Mat, fmt: number): void {\n const sz = m.length;\n const bits: number[] = [];\n for (let i = 14; i >= 0; i--) bits.push((fmt>>i)&1);\n let bi = 0;\n for (let c = 0; c <= 5; c++) m[8][c]=bits[bi++];\n m[8][7]=bits[bi++]; m[8][8]=bits[bi++]; m[7][8]=bits[bi++];\n for (let r = 5; r >= 0; r--) m[r][8]=bits[bi++];\n bi = 0;\n for (let r = sz-1; r >= sz-7; r--) m[r][8]=bits[bi++];\n m[8][sz-8]=bits[bi++];\n for (let c = sz-7; c < sz; c++) m[8][c]=bits[bi++];\n}\n\n// ── SVG output ───────────────────────────────────────────────────────────────\nfunction _svg(m: Mat, o: Required<JoopQrOptions>): string {\n const sz = m.length, tot = sz + 2*o.margin, mod = o.size / tot;\n let rects = '';\n for (let r = 0; r < sz; r++) for (let c = 0; c < sz; c++) {\n if (m[r][c]===1) {\n const x = ((c+o.margin)*mod).toFixed(2), y = ((r+o.margin)*mod).toFixed(2), s = (mod+0.1).toFixed(2);\n rects += `<rect x=\"${x}\" y=\"${y}\" width=\"${s}\" height=\"${s}\"/>`;\n }\n }\n return `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 ${o.size} ${o.size}\" shape-rendering=\"crispEdges\"><rect width=\"${o.size}\" height=\"${o.size}\" fill=\"${o.background}\"/><g fill=\"${o.foreground}\">${rects}</g></svg>`;\n}\n\n// ── Public API ───────────────────────────────────────────────────────────────\n\n/** Generate a QR code SVG string */\nexport function generateQr(text: string, options: JoopQrOptions = {}): string {\n const ec = options.ecLevel ?? 'M';\n const opts: Required<JoopQrOptions> = {\n ecLevel: ec, size: options.size ?? 300, margin: options.margin ?? 4,\n foreground: options.foreground ?? '#000000', background: options.background ?? '#ffffff',\n };\n const bytes = new TextEncoder().encode(text);\n const ver = _bestV(bytes.length, ec);\n const sz = 4*ver + 17;\n\n const dataCW = _encData(text, ver, ec);\n const allCW = _buildCW(dataCW, ver, ec);\n const m = _mat(sz);\n _funcPat(m, ver);\n\n const isF = Array.from({length:sz}, (_, r) => Array.from({length:sz}, (_, c) => m[r][c] !== -1));\n _placeData(m, allCW);\n\n let bm = 0, bp = Infinity;\n for (let mp = 0; mp < 8; mp++) {\n const masked = _mask(m, mp, isF);\n _placeFmt(masked, _fmtBits(ec, mp));\n const pen = _pen(masked);\n if (pen < bp) { bp = pen; bm = mp; }\n }\n\n const final = _mask(m, bm, isF);\n _placeFmt(final, _fmtBits(ec, bm));\n return _svg(final, opts);\n}\n\n/** Generate a QR code as a base64 SVG data URL */\nexport function generateQrDataUrl(text: string, options: JoopQrOptions = {}): string {\n const svg = generateQr(text, options);\n return 'data:image/svg+xml;base64,' + btoa(unescape(encodeURIComponent(svg)));\n}\n\n/** Generate QR for a payment (wraps text with standard payment URI) */\nexport function generatePaymentQr(amount: number, currency: string, reference: string, options?: JoopQrOptions): string {\n const uri = `payment:${currency}:${amount}:${reference}`;\n return generateQr(uri, options);\n}\n","// Code 128B and EAN-13 SVG barcode generators — zero dependencies\n\nexport interface JoopBarcodeOptions {\n width?: number;\n height?: number;\n margin?: number;\n foreground?: string;\n background?: string;\n showText?: boolean;\n fontSize?: number;\n}\n\n// ── Code 128B ────────────────────────────────────────────────────────────────\n\n// Each symbol: 6 elements (3 bars + 3 spaces) of widths 1–4 modules, encoded as a string\n// Quiet zone: 10 modules each side. Start: 11010000100. Stop: 1100011101011.\nconst C128_SYMBOLS = [\n '11011001100','11001101100','11001100110','10010011000','10010001100',\n '10001001100','10011001000','10011000100','10001100100','11001001000',\n '11001000100','11000100100','10110011100','10011011100','10011001110',\n '10111001100','10011101100','10011100110','11001110010','11001011100',\n '11001001110','11011100100','11001110100','11101101110','11101001100',\n '11100101100','11100100110','11101100100','11100110100','11100110010',\n '11011011000','11011000110','11000110110','10100011000','10001011000',\n '10001000110','10110001000','10001101000','10001100010','11010001000',\n '11000101000','11000100010','10110111000','10110001110','10001101110',\n '10111011000','10111000110','10001110110','11101110110','11010001110',\n '11000101110','11011101000','11011100010','11011101110','11101011000',\n '11101000110','11100010110','11101101000','11101100010','11100011010',\n '11101111010','11001000010','11110001010','10100110000','10100001100',\n '10010110000','10010000110','10000101100','10000100110','10110010000',\n '10110000100','10011010000','10011000010','10000110100','10000110010',\n '11000010010','11001010000','11110111010','11000010100','10001111010',\n '10100111100','10010111100','10010011110','10111100100','10011110100',\n '10011110010','11110100100','11110010100','11110010010','11011011110',\n '11011110110','11110110110','10101111000','10100011110','10001011110',\n '10111101000','10111100010','11110101000','11110100010','10111011110',\n '10111101110','11101011110','11110101110','11010000100','11010010000',\n '11010011100','11000111010',\n];\nconst C128_START_B = '11010010000';\nconst C128_STOP = '11000111010';\n\nfunction _code128Bars(text: string): string {\n const codes: number[] = [];\n let checksum = 104; // START B value\n for (let i = 0; i < text.length; i++) {\n const v = text.charCodeAt(i) - 32;\n if (v < 0 || v > 95) throw new Error(`Code128: unsupported char '${text[i]}'`);\n codes.push(v);\n checksum += v * (i + 1);\n }\n codes.push(checksum % 103);\n return C128_START_B + codes.map(c => C128_SYMBOLS[c]).join('') + C128_STOP + '11';\n}\n\nexport function generateCode128(text: string, opts: JoopBarcodeOptions = {}): string {\n const bars = _code128Bars(text);\n const mw = opts.width ? Math.floor((opts.width - 2 * (opts.margin ?? 10)) / bars.length) : 2;\n const margin = opts.margin ?? 10;\n const barH = (opts.height ?? 80) - (opts.showText !== false ? (opts.fontSize ?? 12) + 4 : 0) - margin;\n const totalW = bars.length * mw + margin * 2;\n const totalH = opts.height ?? 80;\n const fg = opts.foreground ?? '#000000';\n const bg = opts.background ?? '#ffffff';\n\n let rects = '';\n for (let i = 0; i < bars.length; i++) {\n if (bars[i] === '1') rects += `<rect x=\"${margin + i * mw}\" y=\"${margin}\" width=\"${mw}\" height=\"${barH}\" fill=\"${fg}\"/>`;\n }\n\n const label = opts.showText !== false\n ? `<text x=\"${totalW / 2}\" y=\"${totalH - 2}\" text-anchor=\"middle\" font-family=\"monospace\" font-size=\"${opts.fontSize ?? 12}\" fill=\"${fg}\">${text}</text>`\n : '';\n\n return `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${totalW}\" height=\"${totalH}\" viewBox=\"0 0 ${totalW} ${totalH}\"><rect width=\"${totalW}\" height=\"${totalH}\" fill=\"${bg}\"/>${rects}${label}</svg>`;\n}\n\n// ── EAN-13 ────────────────────────────────────────────────────────────────────\n\nconst EAN_L = ['0001101','0011001','0010011','0111101','0100011','0110001','0101111','0111011','0110111','0001011'];\nconst EAN_G = ['0100111','0110011','0011011','0100001','0011101','0111001','0000101','0010001','0001001','0010111'];\nconst EAN_R = ['1110010','1100110','1101100','1000010','1011100','1001110','1010000','1000100','1001000','1110100'];\n// Parity table: 0=L, 1=G for left side digits 1-6 based on first digit\nconst EAN_PARITY = ['LLLLLL','LLGLGG','LLGGLG','LLGGGL','LGLLGG','LGGLLG','LGGGLL','LGLGLG','LGLGGL','LGGLGL'];\n\nfunction _ean13Bars(digits: string): string {\n if (!/^\\d{13}$/.test(digits)) throw new Error('EAN-13: need exactly 13 digits');\n const d = digits.split('').map(Number);\n const parity = EAN_PARITY[d[0]];\n let bars = '101'; // left guard\n for (let i = 0; i < 6; i++) bars += parity[i] === 'G' ? EAN_G[d[i+1]] : EAN_L[d[i+1]];\n bars += '01010'; // center guard\n for (let i = 7; i < 13; i++) bars += EAN_R[d[i]];\n bars += '101'; // right guard\n return bars;\n}\n\nexport function validateEan13(digits: string): boolean {\n if (!/^\\d{12,13}$/.test(digits)) return false;\n const d = digits.slice(0, 12).split('').map(Number);\n const check = (10 - ((d.reduce((s, v, i) => s + (i % 2 === 0 ? v : v * 3), 0)) % 10)) % 10;\n return digits.length === 12 ? true : check === Number(digits[12]);\n}\n\nexport function generateEan13(digits: string, opts: JoopBarcodeOptions = {}): string {\n const bars = _ean13Bars(digits);\n const mw = 2;\n const margin = opts.margin ?? 10;\n const barH = (opts.height ?? 70) - (opts.showText !== false ? (opts.fontSize ?? 12) + 4 : 0) - margin;\n const totalW = bars.length * mw + margin * 2 + 8; // +8 for first-digit label\n const totalH = opts.height ?? 70;\n const fg = opts.foreground ?? '#000000';\n const bg = opts.background ?? '#ffffff';\n\n let rects = '';\n const xOff = margin + 8;\n for (let i = 0; i < bars.length; i++) {\n if (bars[i] === '1') rects += `<rect x=\"${xOff + i * mw}\" y=\"${margin}\" width=\"${mw}\" height=\"${barH}\" fill=\"${fg}\"/>`;\n }\n\n const label = opts.showText !== false\n ? `<text x=\"${margin}\" y=\"${margin + barH - 2}\" font-family=\"monospace\" font-size=\"${opts.fontSize ?? 10}\" fill=\"${fg}\">${digits[0]}</text><text x=\"${totalW / 2}\" y=\"${totalH - 2}\" text-anchor=\"middle\" font-family=\"monospace\" font-size=\"${opts.fontSize ?? 10}\" fill=\"${fg}\">${digits.slice(1, 7)} ${digits.slice(7)}</text>`\n : '';\n\n return `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${totalW}\" height=\"${totalH}\" viewBox=\"0 0 ${totalW} ${totalH}\"><rect width=\"${totalW}\" height=\"${totalH}\" fill=\"${bg}\"/>${rects}${label}</svg>`;\n}\n\n// ── Code 39 (alphanumeric, simpler) ──────────────────────────────────────────\n\nconst C39_MAP: Record<string, string> = {\n '0':'101001101101','1':'110100101011','2':'101100101011','3':'110110010101',\n '4':'101001101011','5':'110100110101','6':'101100110101','7':'101001011011',\n '8':'110100101101','9':'101100101101','A':'110101001011','B':'101101001011',\n 'C':'110110100101','D':'101011001011','E':'110101100101','F':'101101100101',\n 'G':'101010011011','H':'110101001101','I':'101101001101','J':'101011001101',\n 'K':'110101010011','L':'101101010011','M':'110110101001','N':'101011010011',\n 'O':'110101101001','P':'101101101001','Q':'101010110011','R':'110101011001',\n 'S':'101101011001','T':'101011011001','U':'110010101011','V':'100110101011',\n 'W':'110011010101','X':'100101101011','Y':'110010110101','Z':'100110110101',\n '-':'100101011011','.':'110010101101',' ':'100110101101','*':'100101101101',\n};\n\nexport function generateCode39(text: string, opts: JoopBarcodeOptions = {}): string {\n const upper = text.toUpperCase();\n const barsStr = ['*', ...upper.split(''), '*'].map(c => {\n if (!C39_MAP[c]) throw new Error(`Code39: unsupported char '${c}'`);\n return C39_MAP[c];\n }).join('0'); // narrow space between symbols\n\n const mw = 2;\n const margin = opts.margin ?? 10;\n const barH = (opts.height ?? 70) - (opts.showText !== false ? (opts.fontSize ?? 12) + 4 : 0) - margin;\n const totalW = barsStr.length * mw + margin * 2;\n const totalH = opts.height ?? 70;\n const fg = opts.foreground ?? '#000000';\n const bg = opts.background ?? '#ffffff';\n\n let rects = '';\n for (let i = 0; i < barsStr.length; i++) {\n if (barsStr[i] === '1') rects += `<rect x=\"${margin + i * mw}\" y=\"${margin}\" width=\"${mw}\" height=\"${barH}\" fill=\"${fg}\"/>`;\n }\n const label = opts.showText !== false\n ? `<text x=\"${totalW / 2}\" y=\"${totalH - 2}\" text-anchor=\"middle\" font-family=\"monospace\" font-size=\"${opts.fontSize ?? 12}\" fill=\"${fg}\">${text}</text>`\n : '';\n\n return `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${totalW}\" height=\"${totalH}\" viewBox=\"0 0 ${totalW} ${totalH}\"><rect width=\"${totalW}\" height=\"${totalH}\" fill=\"${bg}\"/>${rects}${label}</svg>`;\n}\n\nexport function generateBarcodeDataUrl(svg: string): string {\n return `data:image/svg+xml;base64,${btoa(svg)}`;\n}\n","export interface JoopChartBucket {\n label: string;\n value: number;\n count: number;\n start: number;\n end: number;\n}\n\nexport interface JoopCategoryAgg {\n category: string;\n total: number;\n count: number;\n average: number;\n min: number;\n max: number;\n}\n\nexport type JoopTimeInterval = 'hour' | 'day' | 'week' | 'month' | 'year';\n\nfunction _intervalMs(interval: JoopTimeInterval): number {\n const MS = { hour: 3600000, day: 86400000, week: 604800000, month: 2592000000, year: 31536000000 };\n return MS[interval];\n}\n\nfunction _bucketLabel(ts: number, interval: JoopTimeInterval): string {\n const d = new Date(ts);\n if (interval === 'hour') return `${d.toLocaleDateString()} ${d.getHours().toString().padStart(2,'0')}:00`;\n if (interval === 'day') return d.toLocaleDateString();\n if (interval === 'week') return `W${_isoWeek(d)} ${d.getFullYear()}`;\n if (interval === 'month') return `${d.toLocaleString('default', { month: 'short' })} ${d.getFullYear()}`;\n return String(d.getFullYear());\n}\n\nfunction _isoWeek(d: Date): number {\n const jan4 = new Date(d.getFullYear(), 0, 4);\n return Math.ceil((((d.getTime() - jan4.getTime()) / 86400000) + jan4.getDay() + 1) / 7);\n}\n\n/** Aggregate time-series data into fixed-width time buckets */\nexport function bucketByTime(\n data: Record<string, unknown>[],\n interval: JoopTimeInterval,\n valueKey: string,\n dateKey = 'date',\n): JoopChartBucket[] {\n if (!data.length) return [];\n const ms = _intervalMs(interval);\n const buckets = new Map<number, { sum: number; count: number }>();\n\n for (const row of data) {\n const ts = new Date(row[dateKey] as string).getTime();\n const key = Math.floor(ts / ms) * ms;\n const b = buckets.get(key) ?? { sum: 0, count: 0 };\n b.sum += Number(row[valueKey] ?? 0);\n b.count++;\n buckets.set(key, b);\n }\n\n return Array.from(buckets.entries()).sort(([a], [b]) => a - b).map(([key, b]) => ({\n label: _bucketLabel(key, interval),\n value: b.sum,\n count: b.count,\n start: key,\n end: key + ms,\n }));\n}\n\n/** Rolling/moving average over an array of numbers */\nexport function rollingAverage(data: number[], window: number): number[] {\n return data.map((_, i) => {\n const slice = data.slice(Math.max(0, i - window + 1), i + 1);\n return slice.reduce((a, b) => a + b, 0) / slice.length;\n });\n}\n\n/** Normalize values to [0,1] range */\nexport function normalize(data: number[], min?: number, max?: number): number[] {\n const mn = min ?? Math.min(...data);\n const mx = max ?? Math.max(...data);\n const range = mx - mn || 1;\n return data.map(v => (v - mn) / range);\n}\n\n/** Cumulative sum */\nexport function cumulative(data: number[]): number[] {\n let sum = 0;\n return data.map(v => (sum += v));\n}\n\n/** Moving sum over a window */\nexport function movingSum(data: number[], window: number): number[] {\n return data.map((_, i) => data.slice(Math.max(0, i - window + 1), i + 1).reduce((a, b) => a + b, 0));\n}\n\n/** Group by category and compute aggregates */\nexport function aggregateByCategory(\n data: Record<string, unknown>[],\n categoryKey: string,\n valueKey: string,\n): JoopCategoryAgg[] {\n const map = new Map<string, number[]>();\n for (const row of data) {\n const cat = String(row[categoryKey] ?? '');\n const val = Number(row[valueKey] ?? 0);\n if (!map.has(cat)) map.set(cat, []);\n map.get(cat)!.push(val);\n }\n return Array.from(map.entries()).map(([category, vals]) => ({\n category,\n total: vals.reduce((a, b) => a + b, 0),\n count: vals.length,\n average: vals.reduce((a, b) => a + b, 0) / vals.length,\n min: Math.min(...vals),\n max: Math.max(...vals),\n }));\n}\n\n/** Percent change between consecutive values */\nexport function percentChange(values: number[]): number[] {\n return values.map((v, i) => i === 0 ? 0 : ((v - values[i - 1]) / (Math.abs(values[i - 1]) || 1)) * 100);\n}\n\n/** Simple linear trend: 'up' | 'down' | 'flat' */\nexport function detectTrend(data: number[], threshold = 0.05): 'up' | 'down' | 'flat' {\n if (data.length < 2) return 'flat';\n const n = data.length;\n const xMean = (n - 1) / 2;\n const yMean = data.reduce((a, b) => a + b, 0) / n;\n let num = 0, den = 0;\n data.forEach((y, x) => { num += (x - xMean) * (y - yMean); den += (x - xMean) ** 2; });\n const slope = den ? num / den : 0;\n const relativeSlope = Math.abs(slope) / (Math.abs(yMean) || 1);\n return relativeSlope < threshold ? 'flat' : slope > 0 ? 'up' : 'down';\n}\n\n/** Generate SVG polyline points for a sparkline */\nexport function sparklinePoints(data: number[], width: number, height: number): string {\n if (!data.length) return '';\n const mn = Math.min(...data), mx = Math.max(...data), range = mx - mn || 1;\n return data.map((v, i) => {\n const x = (i / (data.length - 1 || 1)) * width;\n const y = height - ((v - mn) / range) * height;\n return `${x.toFixed(2)},${y.toFixed(2)}`;\n }).join(' ');\n}\n\n/** Generate a full sparkline SVG element */\nexport function sparklineSvg(data: number[], width = 100, height = 30, color = '#2563eb'): string {\n if (!data.length) return `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${width}\" height=\"${height}\"/>`;\n const pts = sparklinePoints(data, width, height);\n return `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${width}\" height=\"${height}\" viewBox=\"0 0 ${width} ${height}\"><polyline points=\"${pts}\" fill=\"none\" stroke=\"${color}\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>`;\n}\n","// QR code scanner using camera (getUserMedia) + canvas frame capture.\n// Integrates with the jsQR-compatible pattern — calls an injected decode function,\n// allowing callers to swap in jsQR, ZXing, or any other WASM decoder.\n\nexport type JoopQrDecoder = (\n data: Uint8ClampedArray,\n width: number,\n height: number\n) => string | null | undefined;\n\nexport interface JoopQrScannerConfig {\n /** Canvas-based QR decoder function. Inject jsQR or a similar library. */\n decoder: JoopQrDecoder;\n /** Camera facing mode, default 'environment' (rear camera) */\n facingMode?: 'environment' | 'user';\n /** Scan frequency in Hz (frames per second), default 10 */\n fps?: number;\n /** If true, stop scanning after first successful decode, default true */\n stopOnScan?: boolean;\n /** Video element constraints */\n width?: number;\n height?: number;\n}\n\nexport interface JoopQrScanResult {\n text: string;\n timestamp: number;\n}\n\nexport class JoopQrScanner {\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 _timer: ReturnType<typeof setInterval> | null = null;\n private _active = false;\n\n private _onResult: ((r: JoopQrScanResult) => void) | null = null;\n private _onError: ((e: Error) => void) | null = null;\n\n private readonly _cfg: Required<JoopQrScannerConfig>;\n\n constructor(config: JoopQrScannerConfig) {\n this._cfg = {\n decoder: config.decoder,\n facingMode: config.facingMode ?? 'environment',\n fps: config.fps ?? 10,\n stopOnScan: config.stopOnScan ?? true,\n width: config.width ?? 1280,\n height: config.height ?? 720,\n };\n }\n\n onResult(fn: (r: JoopQrScanResult) => void): this { this._onResult = fn; return this; }\n onError(fn: (e: Error) => void): this { this._onError = fn; return this; }\n\n async start(container?: HTMLElement): Promise<void> {\n if (this._active) return;\n if (!navigator.mediaDevices?.getUserMedia) throw new Error('Camera not available');\n\n this._stream = await navigator.mediaDevices.getUserMedia({\n video: {\n facingMode: this._cfg.facingMode,\n width: { ideal: this._cfg.width },\n height: { ideal: this._cfg.height },\n },\n });\n\n this._video = document.createElement('video');\n this._video.setAttribute('playsinline', 'true');\n this._video.muted = true;\n this._video.srcObject = this._stream;\n\n if (container) {\n Object.assign(this._video.style, { width: '100%', height: '100%', objectFit: 'cover', display: 'block' });\n container.appendChild(this._video);\n }\n\n await new Promise<void>(res => { this._video!.onloadedmetadata = () => { this._video!.play(); res(); }; });\n\n this._canvas = document.createElement('canvas');\n this._ctx = this._canvas.getContext('2d');\n this._active = true;\n this._scheduleFrames();\n }\n\n stop(): void {\n this._active = false;\n if (this._timer) { clearInterval(this._timer); this._timer = null; }\n this._stream?.getTracks().forEach(t => t.stop());\n this._stream = null;\n this._video?.remove();\n this._video = null;\n }\n\n isActive(): boolean { return this._active; }\n\n /** Scan a static image File / Blob instead of the camera. */\n async scanFile(file: File | Blob): Promise<JoopQrScanResult | null> {\n return new Promise(resolve => {\n const img = new Image();\n const url = URL.createObjectURL(file);\n img.onload = () => {\n const canvas = document.createElement('canvas');\n canvas.width = img.width;\n canvas.height = img.height;\n const ctx = canvas.getContext('2d')!;\n ctx.drawImage(img, 0, 0);\n const { data } = ctx.getImageData(0, 0, canvas.width, canvas.height);\n const text = this._cfg.decoder(data, canvas.width, canvas.height);\n URL.revokeObjectURL(url);\n resolve(text ? { text, timestamp: Date.now() } : null);\n };\n img.src = url;\n });\n }\n\n private _scheduleFrames(): void {\n const interval = Math.round(1000 / this._cfg.fps);\n this._timer = setInterval(() => this._processFrame(), interval);\n }\n\n private _processFrame(): void {\n if (!this._active || !this._video || !this._canvas || !this._ctx) return;\n if (this._video.readyState < 2) return;\n\n this._canvas.width = this._video.videoWidth;\n this._canvas.height = this._video.videoHeight;\n this._ctx.drawImage(this._video, 0, 0);\n\n try {\n const imageData = this._ctx.getImageData(0, 0, this._canvas.width, this._canvas.height);\n const text = this._cfg.decoder(imageData.data, this._canvas.width, this._canvas.height);\n if (text) {\n if (this._cfg.stopOnScan) this.stop();\n this._onResult?.({ text, timestamp: Date.now() });\n }\n } catch (err) {\n this._onError?.(err instanceof Error ? err : new Error(String(err)));\n }\n }\n}\n\n/** Generate an otpauth:// TOTP enrollment URI (for authenticator app QR codes) */\nexport function generateTotpUri(options: {\n secret: string;\n account: string;\n issuer: string;\n period?: number;\n digits?: number;\n algorithm?: 'SHA1' | 'SHA256' | 'SHA512';\n}): string {\n const { secret, account, issuer, period = 30, digits = 6, algorithm = 'SHA1' } = options;\n const params = new URLSearchParams({\n secret,\n issuer,\n algorithm,\n digits: String(digits),\n period: String(period),\n });\n return `otpauth://totp/${encodeURIComponent(issuer)}:${encodeURIComponent(account)}?${params}`;\n}\n","import { JoopBehaviorSubject } from '../events';\n\nexport type JoopAiProvider = 'openai' | 'anthropic' | 'gemini' | 'ollama' | 'custom';\n\nexport interface JoopAiMessage {\n role: 'system' | 'user' | 'assistant';\n content: string;\n}\n\nexport interface JoopAiConfig {\n provider: JoopAiProvider;\n apiKey?: string;\n baseUrl?: string;\n model: string;\n maxTokens?: number;\n temperature?: number;\n systemPrompt?: string;\n timeout?: number;\n}\n\nexport interface JoopAiStreamOptions {\n stream?: boolean;\n onChunk?: (token: string) => void;\n onComplete?: (full: string) => void;\n signal?: AbortSignal;\n maxTokens?: number;\n temperature?: number;\n}\n\nexport interface JoopAiUsage {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n}\n\nconst PROVIDER_DEFAULTS: Record<JoopAiProvider, { baseUrl: string }> = {\n openai: { baseUrl: 'https://api.openai.com' },\n anthropic: { baseUrl: 'https://api.anthropic.com' },\n gemini: { baseUrl: 'https://generativelanguage.googleapis.com' },\n ollama: { baseUrl: 'http://localhost:11434' },\n custom: { baseUrl: '' },\n};\n\nexport class JoopAiClient {\n private _cfg: JoopAiConfig;\n private _usage$ = new JoopBehaviorSubject<JoopAiUsage>({ promptTokens: 0, completionTokens: 0, totalTokens: 0 });\n private _abort: AbortController | null = null;\n private _history: JoopAiMessage[] = [];\n\n constructor(config: JoopAiConfig) { this._cfg = config; }\n\n configure(patch: Partial<JoopAiConfig>): void { this._cfg = { ...this._cfg, ...patch }; }\n lastUsage(): JoopAiUsage { return this._usage$.getValue(); }\n usage$() { return this._usage$.asObservable(); }\n getHistory(): JoopAiMessage[] { return [...this._history]; }\n clearHistory(): void { this._history = []; }\n\n abort(): void { this._abort?.abort(); this._abort = null; }\n\n /** Approximate token count (4 chars ≈ 1 token) */\n estimateTokens(text: string): number { return Math.ceil(text.length / 4); }\n\n async complete(prompt: string, opts: JoopAiStreamOptions = {}): Promise<string> {\n return this.chat([{ role: 'user', content: prompt }], opts);\n }\n\n async chat(messages: JoopAiMessage[], opts: JoopAiStreamOptions = {}): Promise<string> {\n this._abort = new AbortController();\n const signal = opts.signal\n ? _combineSignals(opts.signal, this._abort.signal)\n : this._abort.signal;\n\n const allMessages: JoopAiMessage[] = [];\n if (this._cfg.systemPrompt) allMessages.push({ role: 'system', content: this._cfg.systemPrompt });\n allMessages.push(...this._history, ...messages);\n\n const result = opts.stream !== false\n ? await this._streamChat(allMessages, opts, signal)\n : await this._fetchChat(allMessages, opts, signal);\n\n // Append to history\n for (const m of messages) this._history.push(m);\n this._history.push({ role: 'assistant', content: result });\n\n opts.onComplete?.(result);\n return result;\n }\n\n private async _fetchChat(messages: JoopAiMessage[], opts: JoopAiStreamOptions, signal: AbortSignal): Promise<string> {\n const { url, headers, body } = this._buildRequest(messages, opts, false);\n const res = await fetch(url, { method: 'POST', headers, body: JSON.stringify(body), signal });\n if (!res.ok) throw new Error(`JoopAiClient: ${res.status} ${await res.text()}`);\n const json = await res.json();\n return this._extractContent(json);\n }\n\n private async _streamChat(messages: JoopAiMessage[], opts: JoopAiStreamOptions, signal: AbortSignal): Promise<string> {\n const { url, headers, body } = this._buildRequest(messages, opts, true);\n const res = await fetch(url, { method: 'POST', headers, body: JSON.stringify(body), signal });\n if (!res.ok) throw new Error(`JoopAiClient: ${res.status} ${await res.text()}`);\n\n const reader = res.body!.getReader();\n const decoder = new TextDecoder();\n let full = '';\n let buf = '';\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n buf += decoder.decode(value, { stream: true });\n const lines = buf.split('\\n');\n buf = lines.pop() ?? '';\n for (const line of lines) {\n const token = this._parseStreamLine(line.trim());\n if (token) { full += token; opts.onChunk?.(token); }\n }\n }\n return full;\n }\n\n private _buildRequest(messages: JoopAiMessage[], opts: JoopAiStreamOptions, stream: boolean): { url: string; headers: Record<string, string>; body: unknown } {\n const { provider, apiKey, model, maxTokens, temperature } = this._cfg;\n const baseUrl = this._cfg.baseUrl ?? PROVIDER_DEFAULTS[provider].baseUrl;\n const mt = opts.maxTokens ?? maxTokens ?? 1024;\n const temp = opts.temperature ?? temperature ?? 0.7;\n\n switch (provider) {\n case 'openai':\n case 'custom':\n return {\n url: `${baseUrl}/v1/chat/completions`,\n headers: { 'Content-Type': 'application/json', ...(apiKey ? { Authorization: `Bearer ${apiKey}` } : {}) },\n body: { model, messages, stream, max_tokens: mt, temperature: temp },\n };\n case 'anthropic':\n return {\n url: `${baseUrl}/v1/messages`,\n headers: { 'Content-Type': 'application/json', 'x-api-key': apiKey ?? '', 'anthropic-version': '2023-06-01' },\n body: {\n model, stream, max_tokens: mt, temperature: temp,\n system: messages.find(m => m.role === 'system')?.content,\n messages: messages.filter(m => m.role !== 'system'),\n },\n };\n case 'gemini': {\n const contents = messages.filter(m => m.role !== 'system').map(m => ({ role: m.role === 'assistant' ? 'model' : 'user', parts: [{ text: m.content }] }));\n const path = stream ? 'streamGenerateContent?alt=sse' : 'generateContent';\n return {\n url: `${baseUrl}/v1beta/models/${model}:${path}${apiKey ? `&key=${apiKey}` : ''}`,\n headers: { 'Content-Type': 'application/json' },\n body: { contents, generationConfig: { maxOutputTokens: mt, temperature: temp } },\n };\n }\n case 'ollama':\n return {\n url: `${baseUrl}/api/chat`,\n headers: { 'Content-Type': 'application/json' },\n body: { model, messages, stream, options: { num_predict: mt, temperature: temp } },\n };\n }\n }\n\n private _parseStreamLine(line: string): string {\n if (!line.startsWith('data: ') && !line.startsWith('{')) return '';\n const raw = line.startsWith('data: ') ? line.slice(6) : line;\n if (raw === '[DONE]') return '';\n try {\n const json = JSON.parse(raw);\n // OpenAI\n const oaChoice = json?.choices?.[0];\n if (oaChoice?.delta?.content) return oaChoice.delta.content;\n // Anthropic\n if (json?.type === 'content_block_delta') return json?.delta?.text ?? '';\n // Gemini\n const gmPart = json?.candidates?.[0]?.content?.parts?.[0];\n if (gmPart?.text) return gmPart.text;\n // Ollama\n if (json?.message?.content) return json.message.content;\n } catch {}\n return '';\n }\n\n private _extractContent(json: unknown): string {\n const j = json as Record<string, unknown>;\n // OpenAI\n const oa = (j?.choices as Array<{message:{content:string}}>)?.[0]?.message?.content;\n if (oa) return oa;\n // Anthropic\n const an = (j?.content as Array<{text:string}>)?.[0]?.text;\n if (an) return an;\n // Gemini\n const gm = ((j?.candidates as Array<{content:{parts:Array<{text:string}>}}>)?.[0]?.content?.parts)?.[0]?.text;\n if (gm) return gm;\n // Ollama\n const ol = (j?.message as {content:string})?.content;\n if (ol) return ol;\n return '';\n }\n}\n\nfunction _combineSignals(...signals: AbortSignal[]): AbortSignal {\n const ctrl = new AbortController();\n for (const s of signals) s.addEventListener('abort', () => ctrl.abort(), { once: true });\n return ctrl.signal;\n}\n","// ─── G-Counter (grow-only) ───────────────────────────────────────────────────\n\nexport class CRDTCounter {\n private _inc: Record<string, number> = {};\n private _dec: Record<string, number> = {};\n\n increment(nodeId: string, by = 1): void { this._inc[nodeId] = (this._inc[nodeId] ?? 0) + by; }\n decrement(nodeId: string, by = 1): void { this._dec[nodeId] = (this._dec[nodeId] ?? 0) + by; }\n\n value(): number {\n const inc = Object.values(this._inc).reduce((s, v) => s + v, 0);\n const dec = Object.values(this._dec).reduce((s, v) => s + v, 0);\n return inc - dec;\n }\n\n merge(remote: CRDTCounter): void {\n for (const [id, v] of Object.entries(remote._inc)) this._inc[id] = Math.max(this._inc[id] ?? 0, v);\n for (const [id, v] of Object.entries(remote._dec)) this._dec[id] = Math.max(this._dec[id] ?? 0, v);\n }\n\n state(): { inc: Record<string, number>; dec: Record<string, number> } { return { inc: { ...this._inc }, dec: { ...this._dec } }; }\n\n static fromState(s: { inc: Record<string, number>; dec: Record<string, number> }): CRDTCounter {\n const c = new CRDTCounter(); c._inc = { ...s.inc }; c._dec = { ...s.dec }; return c;\n }\n}\n\n// ─── Add-Wins Set ────────────────────────────────────────────────────────────\n\nexport class CRDTSet<T> {\n private _added = new Map<string, T>();\n private _removed = new Set<string>();\n\n add(uniqueId: string, item: T): void { this._added.set(uniqueId, item); this._removed.delete(uniqueId); }\n remove(uniqueId: string): void { this._removed.add(uniqueId); }\n has(uniqueId: string): boolean { return this._added.has(uniqueId) && !this._removed.has(uniqueId); }\n values(): T[] { return Array.from(this._added.entries()).filter(([id]) => !this._removed.has(id)).map(([, v]) => v); }\n size(): number { return this.values().length; }\n\n merge(remote: CRDTSet<T>): void {\n for (const [id, item] of remote._added) if (!this._added.has(id)) this._added.set(id, item);\n for (const id of remote._removed) this._removed.add(id);\n }\n\n state(): { added: [string, T][]; removed: string[] } {\n return { added: Array.from(this._added.entries()), removed: Array.from(this._removed) };\n }\n}\n\n// ─── LWW Register (Last-Write-Wins) ─────────────────────────────────────────\n\nexport class CRDTRegister<T> {\n private _value: T;\n private _timestamp: number;\n private _nodeId: string;\n\n constructor(initial: T, nodeId = 'default', timestamp = 0) {\n this._value = initial; this._timestamp = timestamp; this._nodeId = nodeId;\n }\n\n set(value: T, nodeId: string, timestamp?: number): void {\n const ts = timestamp ?? Date.now();\n if (ts > this._timestamp || (ts === this._timestamp && nodeId > this._nodeId)) {\n this._value = value; this._timestamp = ts; this._nodeId = nodeId;\n }\n }\n\n get(): T { return this._value; }\n timestamp(): number { return this._timestamp; }\n\n merge(remote: CRDTRegister<T>): void {\n this.set(remote._value, remote._nodeId, remote._timestamp);\n }\n\n state(): { value: T; timestamp: number; nodeId: string } {\n return { value: this._value, timestamp: this._timestamp, nodeId: this._nodeId };\n }\n}\n\n// ─── CRDT Text (basic sequence CRDT — simplified RGA) ────────────────────────\n\ninterface _Char {\n id: string; // nodeId:seqNo\n char: string;\n after: string | null; // id of predecessor (null = beginning)\n deleted: boolean;\n}\n\nexport class CRDTText {\n private _chars: _Char[] = [];\n private _index = new Map<string, _Char>();\n\n insert(after: string | null, char: string, nodeId: string, seq: number): string {\n const id = `${nodeId}:${seq}`;\n const c: _Char = { id, char, after, deleted: false };\n const pos = after === null ? 0 : this._chars.findIndex(ch => ch.id === after) + 1;\n this._chars.splice(pos, 0, c);\n this._index.set(id, c);\n return id;\n }\n\n delete(id: string): void {\n const c = this._index.get(id);\n if (c) c.deleted = true;\n }\n\n toString(): string { return this._chars.filter(c => !c.deleted).map(c => c.char).join(''); }\n length(): number { return this._chars.filter(c => !c.deleted).length; }\n\n merge(remote: CRDTText): void {\n for (const rc of remote._chars) {\n if (!this._index.has(rc.id)) {\n const c: _Char = { ...rc };\n const pos = rc.after === null ? 0 : this._chars.findIndex(ch => ch.id === rc.after) + 1;\n this._chars.splice(pos, 0, c);\n this._index.set(c.id, c);\n } else if (rc.deleted) {\n const existing = this._index.get(rc.id)!;\n existing.deleted = true;\n }\n }\n }\n\n state(): _Char[] { return this._chars.map(c => ({ ...c })); }\n}\n\n// ─── Merge helper ────────────────────────────────────────────────────────────\n\nexport function mergeCRDT<T extends { merge(remote: T): void }>(local: T, remote: T): T {\n local.merge(remote);\n return local;\n}\n","import { JoopBehaviorSubject } from '../events';\nimport { JoopPlatform } from '../platform/platform';\nimport type { JoopStorageAdapter } from '../platform/adapters';\n\nexport interface JoopOIDCConfig {\n issuer: string; // e.g. https://accounts.google.com\n clientId: string;\n redirectUri: string;\n scope?: string; // default: 'openid profile email'\n responseType?: string; // default: 'code'\n /**\n * Storage for PKCE verifier, state, and tokens.\n * Accepts any JoopStorageAdapter (localStorage, sessionStorage, MMKV, custom).\n * Default: sessionStorage on web, JoopPlatform.getSessionStorage() on other platforms.\n */\n storage?: JoopStorageAdapter;\n}\n\nexport interface JoopOIDCMetadata {\n authorizationEndpoint: string;\n tokenEndpoint: string;\n jwksUri: string;\n userInfoEndpoint?: string;\n endSessionEndpoint?: string;\n}\n\nexport interface JoopOIDCTokens {\n accessToken: string;\n idToken?: string;\n refreshToken?: string;\n expiresAt: number; // Unix ms\n tokenType: string;\n scope?: string;\n}\n\nexport interface JoopLoginOptions {\n prompt?: 'none' | 'login' | 'consent' | 'select_account';\n loginHint?: string;\n state?: string;\n nonce?: string;\n extraParams?: Record<string, string>;\n}\n\nexport class JoopOIDCClient {\n private _cfg: JoopOIDCConfig;\n private _metadata: JoopOIDCMetadata | null = null;\n private _tokens$ = new JoopBehaviorSubject<JoopOIDCTokens | null>(null);\n private _storage: JoopStorageAdapter;\n private _renewTimer: ReturnType<typeof setTimeout> | null = null;\n private readonly _KEY = 'joop_oidc_tokens';\n private readonly _VER_KEY = 'joop_oidc_verifier';\n private readonly _STATE_KEY = 'joop_oidc_state';\n\n constructor(config: JoopOIDCConfig) {\n this._cfg = { scope: 'openid profile email', responseType: 'code', ...config };\n // Use explicit storage → sessionStorage → platform adapter (RN: MMKV or mem)\n this._storage = config.storage ?? JoopPlatform.getSessionStorage();\n const stored = this._storage.getItem(this._KEY);\n if (stored) { try { this._tokens$.next(JSON.parse(stored)); } catch {} }\n }\n\n async discover(): Promise<JoopOIDCMetadata> {\n if (this._metadata) return this._metadata;\n const url = `${this._cfg.issuer}/.well-known/openid-configuration`;\n const res = await fetch(url);\n if (!res.ok) throw new Error(`OIDC discovery failed: ${res.status}`);\n const json = await res.json();\n this._metadata = {\n authorizationEndpoint: json.authorization_endpoint,\n tokenEndpoint: json.token_endpoint,\n jwksUri: json.jwks_uri,\n userInfoEndpoint: json.userinfo_endpoint,\n endSessionEndpoint: json.end_session_endpoint,\n };\n return this._metadata;\n }\n\n async login(options: JoopLoginOptions = {}): Promise<void> {\n const meta = await this.discover();\n const { verifier, challenge } = await _generatePKCE();\n const state = options.state ?? _randomBase64(16);\n\n this._storage.setItem(this._VER_KEY, verifier);\n this._storage.setItem(this._STATE_KEY, state);\n\n const params = new URLSearchParams({\n response_type: this._cfg.responseType!,\n client_id: this._cfg.clientId,\n redirect_uri: this._cfg.redirectUri,\n scope: this._cfg.scope!,\n state,\n code_challenge: challenge,\n code_challenge_method: 'S256',\n nonce: options.nonce ?? _randomBase64(16),\n ...(options.prompt ? { prompt: options.prompt } : {}),\n ...(options.loginHint ? { login_hint: options.loginHint } : {}),\n ...options.extraParams,\n });\n\n // Web: redirect. React Native: caller handles the URL (deep link).\n if (typeof window !== 'undefined') {\n window.location.href = `${meta.authorizationEndpoint}?${params}`;\n } else {\n // Return the URL so RN callers can open it in a browser/WebView\n return Promise.resolve() as unknown as void;\n }\n }\n\n /** Returns the authorization URL without redirecting (useful for React Native) */\n async buildLoginUrl(options: JoopLoginOptions = {}): Promise<string> {\n const meta = await this.discover();\n const { verifier, challenge } = await _generatePKCE();\n const state = options.state ?? _randomBase64(16);\n this._storage.setItem(this._VER_KEY, verifier);\n this._storage.setItem(this._STATE_KEY, state);\n const params = new URLSearchParams({\n response_type: this._cfg.responseType!,\n client_id: this._cfg.clientId,\n redirect_uri: this._cfg.redirectUri,\n scope: this._cfg.scope!,\n state,\n code_challenge: challenge,\n code_challenge_method: 'S256',\n nonce: options.nonce ?? _randomBase64(16),\n ...(options.prompt ? { prompt: options.prompt } : {}),\n ...(options.loginHint ? { login_hint: options.loginHint } : {}),\n ...options.extraParams,\n });\n return `${meta.authorizationEndpoint}?${params}`;\n }\n\n async handleCallback(url = typeof location !== 'undefined' ? location.href : ''): Promise<JoopOIDCTokens> {\n const params = new URLSearchParams(url.split('?')[1] ?? '');\n const code = params.get('code');\n const state = params.get('state');\n const error = params.get('error');\n\n if (error) throw new Error(`OIDC error: ${error} — ${params.get('error_description') ?? ''}`);\n if (!code) throw new Error('OIDC callback: missing code');\n\n const storedState = this._storage.getItem(this._STATE_KEY);\n if (storedState && state !== storedState) throw new Error('OIDC callback: state mismatch (CSRF?)');\n const verifier = this._storage.getItem(this._VER_KEY) ?? '';\n this._storage.removeItem(this._VER_KEY);\n this._storage.removeItem(this._STATE_KEY);\n\n const meta = await this.discover();\n const res = await fetch(meta.tokenEndpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body: new URLSearchParams({ grant_type: 'authorization_code', code, redirect_uri: this._cfg.redirectUri, client_id: this._cfg.clientId, code_verifier: verifier }),\n });\n if (!res.ok) throw new Error(`OIDC token exchange failed: ${await res.text()}`);\n return this._storeTokens(await res.json());\n }\n\n async refreshToken(): Promise<JoopOIDCTokens> {\n const tokens = this._tokens$.getValue();\n if (!tokens?.refreshToken) throw new Error('No refresh token available');\n const meta = await this.discover();\n const res = await fetch(meta.tokenEndpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body: new URLSearchParams({ grant_type: 'refresh_token', refresh_token: tokens.refreshToken, client_id: this._cfg.clientId }),\n });\n if (!res.ok) { this.logout(); throw new Error(`Token refresh failed: ${res.status}`); }\n return this._storeTokens(await res.json());\n }\n\n async getUserInfo(): Promise<Record<string, unknown>> {\n const meta = await this.discover();\n if (!meta.userInfoEndpoint) throw new Error('No userInfo endpoint in OIDC metadata');\n const tokens = this._tokens$.getValue();\n if (!tokens) throw new Error('Not authenticated');\n const res = await fetch(meta.userInfoEndpoint, { headers: { Authorization: `Bearer ${tokens.accessToken}` } });\n if (!res.ok) throw new Error(`UserInfo failed: ${res.status}`);\n return res.json();\n }\n\n async logout(options: { redirectUri?: string } = {}): Promise<void> {\n this._tokens$.next(null);\n this._storage.removeItem(this._KEY);\n if (this._renewTimer) { clearTimeout(this._renewTimer); this._renewTimer = null; }\n if (this._metadata?.endSessionEndpoint && typeof window !== 'undefined') {\n const params = new URLSearchParams({ client_id: this._cfg.clientId, ...(options.redirectUri ? { post_logout_redirect_uri: options.redirectUri } : {}) });\n window.location.href = `${this._metadata.endSessionEndpoint}?${params}`;\n }\n }\n\n silentRenew(renewBeforeMs = 60000): void {\n const tokens = this._tokens$.getValue();\n if (!tokens?.refreshToken) return;\n const delay = Math.max(0, tokens.expiresAt - Date.now() - renewBeforeMs);\n if (this._renewTimer) clearTimeout(this._renewTimer);\n this._renewTimer = setTimeout(async () => {\n try { await this.refreshToken(); this.silentRenew(renewBeforeMs); }\n catch { this._tokens$.next(null); }\n }, delay);\n }\n\n isAuthenticated(): boolean {\n const t = this._tokens$.getValue();\n return !!t && t.expiresAt > Date.now();\n }\n\n getTokens(): JoopOIDCTokens | null { return this._tokens$.getValue(); }\n tokens$() { return this._tokens$.asObservable(); }\n\n private _storeTokens(json: Record<string, unknown>): JoopOIDCTokens {\n const tokens: JoopOIDCTokens = {\n accessToken: json.access_token as string,\n idToken: json.id_token as string | undefined,\n refreshToken: json.refresh_token as string | undefined,\n expiresAt: Date.now() + ((json.expires_in as number ?? 3600) * 1000),\n tokenType: (json.token_type as string) ?? 'Bearer',\n scope: json.scope as string | undefined,\n };\n this._tokens$.next(tokens);\n this._storage.setItem(this._KEY, JSON.stringify(tokens));\n return tokens;\n }\n}\n\nasync function _generatePKCE(): Promise<{ verifier: string; challenge: string }> {\n const verifier = _randomBase64(32);\n const hash = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(verifier));\n const challenge = btoa(String.fromCharCode(...new Uint8Array(hash)))\n .replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=/g, '');\n return { verifier, challenge };\n}\n\nfunction _randomBase64(bytes: number): string {\n const buf = new Uint8Array(bytes);\n crypto.getRandomValues(buf);\n return btoa(String.fromCharCode(...buf)).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=/g, '');\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","// SSO: Single Sign-On service\n// Handles external URL whitelisting, token exchange, and internal API passthrough\n\nexport interface JoopSsoConfig {\n /** Allowed external origins for SSO redirects */\n allowedOrigins: string[];\n /** Allowed internal API base URLs */\n internalBases?: string[];\n /** Token exchange endpoint */\n tokenEndpoint?: string;\n /** SSO logout URL */\n logoutUrl?: string;\n /** Store token key in sessionStorage */\n storageKey?: string;\n}\n\nexport interface JoopSsoToken {\n accessToken: string;\n refreshToken?: string;\n idToken?: string;\n expiresAt: number;\n scopes: string[];\n}\n\nexport interface JoopSsoExchangeRequest {\n code: string;\n redirectUri: string;\n codeVerifier?: string;\n}\n\nexport type JoopSsoLinkTarget = 'self' | 'blank' | 'parent';\n\nexport class JoopSsoService {\n private readonly _config: JoopSsoConfig;\n private _token: JoopSsoToken | null = null;\n private readonly _storageKey: string;\n\n constructor(config: JoopSsoConfig) {\n this._config = config;\n this._storageKey = config.storageKey ?? '__joop_sso_token';\n this._loadFromStorage();\n }\n\n // ── Token management ────────────────────────────────────────────────────────\n\n setToken(token: JoopSsoToken): void {\n this._token = token;\n sessionStorage.setItem(this._storageKey, JSON.stringify(token));\n }\n\n getToken(): JoopSsoToken | null { return this._token; }\n\n isAuthenticated(): boolean {\n return !!this._token && this._token.expiresAt > Date.now();\n }\n\n clearToken(): void {\n this._token = null;\n sessionStorage.removeItem(this._storageKey);\n }\n\n // ── Token exchange (Authorization Code → Access Token) ─────────────────────\n\n async exchange(req: JoopSsoExchangeRequest): Promise<JoopSsoToken> {\n if (!this._config.tokenEndpoint) throw new Error('JoopSso: tokenEndpoint not configured');\n const body: Record<string, string> = {\n grant_type: 'authorization_code',\n code: req.code,\n redirect_uri: req.redirectUri,\n };\n if (req.codeVerifier) body['code_verifier'] = req.codeVerifier;\n\n const res = await fetch(this._config.tokenEndpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body: new URLSearchParams(body).toString(),\n });\n if (!res.ok) throw new Error(`JoopSso: token exchange failed (${res.status})`);\n const data = await res.json() as {\n access_token: string; refresh_token?: string; id_token?: string;\n expires_in?: number; scope?: string;\n };\n const token: JoopSsoToken = {\n accessToken: data.access_token,\n refreshToken: data.refresh_token,\n idToken: data.id_token,\n expiresAt: Date.now() + (data.expires_in ?? 3600) * 1000,\n scopes: (data.scope ?? '').split(' ').filter(Boolean),\n };\n this.setToken(token);\n return token;\n }\n\n // ── Whitelist-based external link opening ───────────────────────────────────\n\n /**\n * Open an external URL only if its origin is in allowedOrigins.\n * Prevents open-redirect attacks.\n */\n openExternal(url: string, target: JoopSsoLinkTarget = 'blank'): boolean {\n if (!this._isOriginAllowed(url)) {\n console.warn(`JoopSso: blocked external link to ${url} — origin not in allowedOrigins`);\n return false;\n }\n const anchor = document.createElement('a');\n anchor.href = url;\n anchor.target = target === 'self' ? '_self' : target === 'parent' ? '_parent' : '_blank';\n anchor.rel = 'noopener noreferrer';\n document.body.appendChild(anchor);\n anchor.click();\n anchor.remove();\n return true;\n }\n\n /** Check whether a URL's origin is whitelisted. */\n isOriginAllowed(url: string): boolean {\n return this._isOriginAllowed(url);\n }\n\n // ── Internal API passthrough ────────────────────────────────────────────────\n\n /**\n * Make an authenticated internal API call.\n * Automatically attaches the SSO bearer token.\n * Rejects if the URL does not match internalBases.\n */\n async callInternal<T = any>(url: string, init: RequestInit = {}): Promise<T> {\n if (!this._isInternalUrl(url)) {\n throw new Error(`JoopSso: URL \"${url}\" is not in internalBases`);\n }\n const token = this.getToken();\n const headers = new Headers(init.headers);\n if (token?.accessToken) headers.set('Authorization', `Bearer ${token.accessToken}`);\n const res = await fetch(url, { ...init, headers });\n if (!res.ok) throw new Error(`JoopSso: internal API error ${res.status}`);\n const text = await res.text();\n return text ? JSON.parse(text) as T : undefined as unknown as T;\n }\n\n // ── SSO Logout ──────────────────────────────────────────────────────────────\n\n logout(redirectUri?: string): void {\n this.clearToken();\n if (this._config.logoutUrl) {\n const url = redirectUri\n ? `${this._config.logoutUrl}?post_logout_redirect_uri=${encodeURIComponent(redirectUri)}`\n : this._config.logoutUrl;\n window.location.href = url;\n }\n }\n\n // ── Helpers ─────────────────────────────────────────────────────────────────\n\n private _isOriginAllowed(url: string): boolean {\n try {\n const origin = new URL(url).origin;\n return this._config.allowedOrigins.some(allowed => {\n const aOrigin = allowed.endsWith('/') ? allowed.slice(0, -1) : allowed;\n return origin === aOrigin || origin.endsWith('.' + aOrigin);\n });\n } catch { return false; }\n }\n\n private _isInternalUrl(url: string): boolean {\n if (!this._config.internalBases?.length) return true;\n return this._config.internalBases.some(base => url.startsWith(base));\n }\n\n private _loadFromStorage(): void {\n try {\n const raw = sessionStorage.getItem(this._storageKey);\n if (raw) this._token = JSON.parse(raw) as JoopSsoToken;\n } catch { /* ignore */ }\n }\n}\n","export interface JoopJwtHeader {\n alg: string;\n typ?: string;\n kid?: string;\n [key: string]: unknown;\n}\n\nexport interface JoopJwtClaims {\n sub?: string;\n iss?: string;\n aud?: string | string[];\n exp?: number;\n iat?: number;\n nbf?: number;\n jti?: string;\n [key: string]: unknown;\n}\n\nexport interface JoopJwtParseResult {\n header: JoopJwtHeader;\n claims: JoopJwtClaims;\n signature: string;\n raw: string;\n}\n\nexport interface JoopJwtValidationResult {\n valid: boolean;\n expired: boolean;\n claims?: JoopJwtClaims;\n reason?: string;\n}\n\nexport interface JoopJwtConfig {\n issuer?: string;\n audience?: string | string[];\n clockSkewMs?: number;\n}\n\nexport interface JoopJwtRefreshConfig {\n refreshThresholdMs?: number;\n refreshFn: (token: string) => Promise<{ accessToken: string; refreshToken?: string }>;\n onRefreshed?: (tokens: { accessToken: string; refreshToken?: string }) => void;\n onError?: (err: Error) => void;\n}\n\nfunction b64urlDecode(s: string): string {\n const base64 = s.replace(/-/g, '+').replace(/_/g, '/').padEnd(s.length + (4 - (s.length % 4)) % 4, '=');\n return atob(base64);\n}\n\nfunction safeParse(s: string): unknown {\n try { return JSON.parse(s); } catch { return null; }\n}\n\nexport class JoopJwtService {\n private readonly clockSkewMs: number;\n private readonly issuer?: string;\n private readonly audience?: string | string[];\n private _refreshTimer?: ReturnType<typeof setTimeout>;\n\n constructor(config: JoopJwtConfig = {}) {\n this.clockSkewMs = config.clockSkewMs ?? 30_000;\n this.issuer = config.issuer;\n this.audience = config.audience;\n }\n\n parse(token: string): JoopJwtParseResult {\n const parts = token.split('.');\n if (parts.length !== 3) throw new Error('Invalid JWT: expected 3 parts');\n const header = safeParse(b64urlDecode(parts[0])) as JoopJwtHeader;\n const claims = safeParse(b64urlDecode(parts[1])) as JoopJwtClaims;\n if (!header || !claims) throw new Error('Invalid JWT: malformed header or payload');\n return { header, claims, signature: parts[2], raw: token };\n }\n\n validate(token: string): JoopJwtValidationResult {\n let parsed: JoopJwtParseResult;\n try { parsed = this.parse(token); } catch (e: any) {\n return { valid: false, expired: false, reason: e.message };\n }\n const { claims } = parsed;\n const now = Date.now();\n\n if (claims.exp !== undefined && now > claims.exp * 1000 + this.clockSkewMs) {\n return { valid: false, expired: true, claims, reason: 'Token expired' };\n }\n if (claims.nbf !== undefined && now < claims.nbf * 1000 - this.clockSkewMs) {\n return { valid: false, expired: false, claims, reason: 'Token not yet valid (nbf)' };\n }\n if (this.issuer && claims.iss !== this.issuer) {\n return { valid: false, expired: false, claims, reason: `Issuer mismatch: expected \"${this.issuer}\"` };\n }\n if (this.audience) {\n const expected = Array.isArray(this.audience) ? this.audience : [this.audience];\n const actual = Array.isArray(claims.aud) ? claims.aud : (claims.aud ? [claims.aud] : []);\n if (!expected.some(e => actual.includes(e))) {\n return { valid: false, expired: false, claims, reason: 'Audience mismatch' };\n }\n }\n return { valid: true, expired: false, claims };\n }\n\n isExpired(token: string): boolean {\n try {\n const { claims } = this.parse(token);\n if (claims.exp === undefined) return false;\n return Date.now() > claims.exp * 1000 + this.clockSkewMs;\n } catch { return true; }\n }\n\n getExpiry(token: string): Date | null {\n try {\n const { claims } = this.parse(token);\n return claims.exp ? new Date(claims.exp * 1000) : null;\n } catch { return null; }\n }\n\n getTimeToExpiry(token: string): number {\n const expiry = this.getExpiry(token);\n if (!expiry) return Infinity;\n return Math.max(0, expiry.getTime() - Date.now());\n }\n\n getClaim<T>(token: string, key: string): T | undefined {\n try { return this.parse(token).claims[key] as T; }\n catch { return undefined; }\n }\n\n startAutoRefresh(\n token: string,\n config: JoopJwtRefreshConfig,\n ): (newToken: string) => void {\n const threshold = config.refreshThresholdMs ?? 60_000;\n this.stopAutoRefresh();\n\n const schedule = (t: string): void => {\n const tte = this.getTimeToExpiry(t);\n if (tte === Infinity || tte <= 0) return;\n const delay = Math.max(0, tte - threshold);\n this._refreshTimer = setTimeout(async () => {\n try {\n const tokens = await config.refreshFn(t);\n config.onRefreshed?.(tokens);\n schedule(tokens.accessToken);\n } catch (e: any) {\n config.onError?.(e instanceof Error ? e : new Error(String(e)));\n }\n }, delay);\n };\n\n schedule(token);\n return (newToken: string) => schedule(newToken);\n }\n\n stopAutoRefresh(): void {\n if (this._refreshTimer !== undefined) {\n clearTimeout(this._refreshTimer);\n this._refreshTimer = undefined;\n }\n }\n\n static decode(token: string): JoopJwtParseResult {\n return new JoopJwtService().parse(token);\n }\n}\n","export interface JoopEmiScheduleEntry {\n month: number;\n instalment: number;\n principal: number;\n interest: number;\n balance: number;\n}\n\nexport interface JoopEmiResult {\n monthlyInstalment: number;\n totalAmount: number;\n totalInterest: number;\n effectiveAnnualRate: number;\n schedule: JoopEmiScheduleEntry[];\n}\n\nexport interface JoopPrepaymentResult {\n mode: 'reduce-tenure' | 'reduce-emi';\n savedInterest: number;\n newTenureMonths?: number;\n newMonthlyInstalment?: number;\n originalTotalInterest: number;\n newTotalInterest: number;\n}\n\nexport interface JoopAffordabilityResult {\n maxLoan: number;\n maxEmi: number;\n dtiRatio: number;\n}\n\nfunction r2(n: number): number { return Math.round(n * 100) / 100; }\n\nexport class JoopEmiCalculator {\n /** Reducing-balance EMI (standard bank method). */\n calculate(principal: number, annualRate: number, tenureMonths: number): JoopEmiResult {\n if (principal <= 0) throw new Error('Principal must be positive');\n if (tenureMonths <= 0) throw new Error('Tenure must be positive');\n if (annualRate < 0) throw new Error('Annual rate cannot be negative');\n\n const rate = annualRate / 12 / 100;\n let emi: number;\n\n if (rate === 0) {\n emi = r2(principal / tenureMonths);\n } else {\n const pow = Math.pow(1 + rate, tenureMonths);\n emi = r2(principal * rate * pow / (pow - 1));\n }\n\n const schedule: JoopEmiScheduleEntry[] = [];\n let balance = principal;\n\n for (let m = 1; m <= tenureMonths; m++) {\n const interest = r2(balance * rate);\n const principalPart = r2(Math.min(emi - interest, balance));\n balance = r2(Math.max(0, balance - principalPart));\n schedule.push({ month: m, instalment: emi, principal: principalPart, interest, balance });\n }\n\n const totalAmount = r2(emi * tenureMonths);\n const totalInterest = r2(totalAmount - principal);\n return { monthlyInstalment: emi, totalAmount, totalInterest, effectiveAnnualRate: annualRate, schedule };\n }\n\n /** Flat-rate EMI — interest computed on original principal throughout. */\n calculateFlat(principal: number, annualRate: number, tenureMonths: number): JoopEmiResult {\n if (principal <= 0 || tenureMonths <= 0 || annualRate < 0) throw new Error('Invalid inputs');\n\n const totalInterest = r2(principal * annualRate / 100 * tenureMonths / 12);\n const totalAmount = r2(principal + totalInterest);\n const emi = r2(totalAmount / tenureMonths);\n const monthlyInterest = r2(totalInterest / tenureMonths);\n const monthlyPrincipal = r2(principal / tenureMonths);\n\n const schedule: JoopEmiScheduleEntry[] = Array.from({ length: tenureMonths }, (_, i) => ({\n month: i + 1,\n instalment: emi,\n principal: monthlyPrincipal,\n interest: monthlyInterest,\n balance: r2(Math.max(0, principal - monthlyPrincipal * (i + 1))),\n }));\n\n // Standard approximation: effective rate ≈ 2 × flat rate × n / (n+1)\n const effectiveAnnualRate = r2(2 * annualRate * tenureMonths / (tenureMonths + 1));\n return { monthlyInstalment: emi, totalAmount, totalInterest, effectiveAnnualRate, schedule };\n }\n\n /** Impact of a lump-sum prepayment — either shorten tenure or reduce EMI. */\n prepayment(\n principal: number,\n annualRate: number,\n tenureMonths: number,\n prepayAmount: number,\n prepayAtMonth: number,\n mode: 'reduce-tenure' | 'reduce-emi',\n ): JoopPrepaymentResult {\n const original = this.calculate(principal, annualRate, tenureMonths);\n const rate = annualRate / 12 / 100;\n\n // Simulate balance at prepayAtMonth\n let balance = principal;\n let interestPaid = 0;\n for (let m = 1; m < prepayAtMonth; m++) {\n const interest = balance * rate;\n const principalPart = original.monthlyInstalment - interest;\n interestPaid += interest;\n balance -= principalPart;\n }\n\n const newPrincipal = r2(Math.max(0, balance - prepayAmount));\n const remainingMonths = tenureMonths - prepayAtMonth;\n\n if (mode === 'reduce-tenure') {\n // Keep original EMI; simulate how many months to clear reduced balance\n let simBalance = newPrincipal;\n let months = 0;\n let newInterest = 0;\n while (simBalance > 0.01 && months < remainingMonths) {\n const interest = r2(simBalance * rate);\n const principalPart = r2(original.monthlyInstalment - interest);\n if (principalPart <= 0) break;\n simBalance = r2(Math.max(0, simBalance - principalPart));\n newInterest += interest;\n months++;\n }\n const newTotalInterest = r2(interestPaid + newInterest);\n return {\n mode,\n savedInterest: r2(original.totalInterest - newTotalInterest),\n newTenureMonths: prepayAtMonth + months,\n originalTotalInterest: original.totalInterest,\n newTotalInterest,\n };\n } else {\n const newResult = this.calculate(newPrincipal, annualRate, remainingMonths || 1);\n const newTotalInterest = r2(interestPaid + newResult.totalInterest);\n return {\n mode,\n savedInterest: r2(original.totalInterest - newTotalInterest),\n newMonthlyInstalment: newResult.monthlyInstalment,\n originalTotalInterest: original.totalInterest,\n newTotalInterest,\n };\n }\n }\n\n /** Maximum loan a borrower can afford given income, obligations, and a DTI cap. */\n affordability(\n monthlyIncome: number,\n existingObligations: number,\n annualRate: number,\n tenureMonths: number,\n maxDtiRatio = 0.40,\n ): JoopAffordabilityResult {\n const maxEmi = r2(monthlyIncome * maxDtiRatio - existingObligations);\n const rate = annualRate / 12 / 100;\n let maxLoan: number;\n if (rate === 0) {\n maxLoan = r2(maxEmi * tenureMonths);\n } else {\n const pow = Math.pow(1 + rate, tenureMonths);\n maxLoan = r2(maxEmi * (pow - 1) / (rate * pow));\n }\n return { maxLoan: Math.max(0, maxLoan), maxEmi: Math.max(0, maxEmi), dtiRatio: maxDtiRatio };\n }\n}\n","export type JoopTransactionCategory =\n | 'groceries' | 'utilities' | 'salary' | 'transfer' | 'entertainment'\n | 'dining' | 'travel' | 'healthcare' | 'education' | 'shopping'\n | 'fuel' | 'insurance' | 'emi' | 'tax' | 'fees' | 'atm' | 'other';\n\nexport interface JoopTransaction {\n description: string;\n amount: number;\n type?: 'credit' | 'debit';\n merchantCode?: string;\n}\n\nexport interface JoopCategoryRule {\n category: JoopTransactionCategory;\n keywords?: string[];\n patterns?: RegExp[];\n merchantCodes?: string[];\n amountRange?: { min?: number; max?: number };\n type?: 'credit' | 'debit';\n priority?: number;\n label?: string;\n}\n\nexport interface JoopCategorizationResult {\n category: JoopTransactionCategory;\n confidence: number;\n matchedRule?: string;\n}\n\nconst BUILT_IN_RULES: JoopCategoryRule[] = [\n {\n category: 'salary', priority: 10, type: 'credit', label: 'salary',\n keywords: ['salary', 'payroll', 'pay credit', 'wages', 'monthly pay', 'employer pay', 'payslip', 'pay-in'],\n },\n {\n category: 'atm', priority: 9, label: 'atm',\n keywords: ['atm', 'cash withdrawal', 'cash advance', 'atw', 'cash disp'],\n },\n {\n category: 'emi', priority: 9, label: 'emi',\n keywords: ['loan repay', 'instalment', 'mortgage', 'equated monthly', 'home loan', 'car loan', 'auto loan', 'personal loan'],\n patterns: [/\\bemi\\b/i, /instalment/i, /loan\\s*ded/i],\n },\n {\n category: 'transfer', priority: 8, label: 'transfer',\n keywords: ['transfer', 'remittance', 'neft', 'rtgs', 'imps', 'upi', 'sepa', 'swift', 'wire trf', 'trf to', 'beneficiary', 'send money', 'p2p pay'],\n },\n {\n category: 'tax', priority: 7, label: 'tax',\n keywords: ['income tax', 'vat payment', 'tds', 'gst payment', 'zakat', 'government levy', 'customs duty', 'tax deducted'],\n },\n {\n category: 'utilities', priority: 7, label: 'utilities',\n keywords: [\n 'dewa', 'sewa', 'addc', 'fewa', 'electricity bill', 'water bill', 'gas bill',\n 'etisalat', 'du telecom', 'broadband bill', 'internet bill', 'phone bill',\n 'utility', 'power bill', 'municipality fee',\n ],\n merchantCodes: ['4911', '4941', '4813', '4814'],\n },\n {\n category: 'fuel', priority: 7, label: 'fuel',\n keywords: ['adnoc', 'enoc', 'eppco', 'total petrol', 'shell petrol', 'petrol station', 'filling station', 'fuel station', 'petroleum'],\n merchantCodes: ['5541', '5542', '5172'],\n },\n {\n category: 'groceries', priority: 6, label: 'groceries',\n keywords: [\n 'lulu hypermarket', 'carrefour', 'spinneys', 'waitrose', 'choithrams', 'geant',\n 'safestway', 'baqala', 'hypermarket', 'supermarket', 'grocery', 'food mart',\n 'fresh market', 'co-op store', 'asda', 'tesco', 'walmart', 'costco',\n 'whole foods', 'lidl', 'aldi', 'spar supermarket',\n ],\n merchantCodes: ['5411', '5412'],\n },\n {\n category: 'dining', priority: 6, label: 'dining',\n keywords: [\n 'restaurant', 'cafe ', 'coffee shop', 'starbucks', 'mcdonalds', 'burger king', 'kfc',\n 'pizza hut', 'dominos', 'subway restaurant', 'food delivery', 'zomato', 'talabat',\n 'deliveroo', 'swiggy', 'dining', 'bistro', 'grill house', 'kebab', 'sushi bar',\n 'bakery', 'fast food', 'takeaway', 'costa coffee', 'tim hortons', 'dunkin',\n ],\n merchantCodes: ['5812', '5814', '5813'],\n },\n {\n category: 'entertainment', priority: 6, label: 'entertainment',\n keywords: [\n 'netflix', 'spotify', 'apple music', 'youtube premium', 'disney plus', 'hulu',\n 'amazon prime', 'vox cinema', 'reel cinemas', 'playstation', 'xbox live', 'steam',\n 'twitch', 'deezer', 'tidal', 'audible', 'movie ticket', 'theatre', 'concert ticket',\n ],\n merchantCodes: ['7832', '7922', '7941', '7993', '7994'],\n },\n {\n category: 'travel', priority: 6, label: 'travel',\n keywords: [\n 'emirates airline', 'etihad airways', 'flydubai', 'air arabia', 'british airways',\n 'hotel booking', 'booking.com', 'airbnb', 'expedia', 'agoda',\n 'uber ride', 'careem', 'taxi fare', 'metro card', 'bus fare', 'train ticket',\n 'airport', 'car rental', 'hertz', 'avis rent',\n ],\n merchantCodes: ['4112', '4111', '4411', '4511', '7011', '7512'],\n },\n {\n category: 'healthcare', priority: 6, label: 'healthcare',\n keywords: [\n 'hospital', 'clinic', 'pharmacy', 'medical centre', 'doctor fee', 'dentist',\n 'prescription', 'health centre', 'lab test', 'diagnostic', 'optician',\n 'physiotherapy', 'radiology', 'pathology',\n ],\n merchantCodes: ['5122', '5912', '8011', '8021', '8031', '8049', '8099'],\n },\n {\n category: 'education', priority: 6, label: 'education',\n keywords: [\n 'school fee', 'university fee', 'college fee', 'tuition fee', 'course fee',\n 'exam fee', 'certification fee', 'training fee', 'udemy', 'coursera', 'edx',\n 'linkedin learning', 'textbook', 'library fee', 'institute',\n ],\n merchantCodes: ['8211', '8220', '8241', '8249', '8299'],\n },\n {\n category: 'shopping', priority: 5, label: 'shopping',\n keywords: [\n 'amazon', 'noon.com', 'namshi', 'zara', 'h&m', 'primark', 'gap store',\n 'shopping mall', 'outlet store', 'fashion boutique', 'retail store',\n 'apple store', 'electronics store', 'clothing store',\n ],\n merchantCodes: ['5311', '5331', '5651', '5699', '5732', '5734'],\n },\n {\n category: 'insurance', priority: 6, label: 'insurance',\n keywords: [\n 'insurance premium', 'takaful', 'policy renewal', 'allianz', 'aia insurance',\n 'axa insurance', 'prudential', 'zurich', 'metlife', 'life insurance premium',\n 'health insurance', 'car insurance',\n ],\n merchantCodes: ['6300', '6321', '6411'],\n },\n {\n category: 'fees', priority: 5, label: 'fees',\n keywords: ['service charge', 'processing fee', 'annual fee', 'bank charge', 'late fee', 'admin fee', 'penalty charge'],\n },\n];\n\nexport class JoopTransactionCategorizer {\n private rules: JoopCategoryRule[];\n\n constructor(customRules: JoopCategoryRule[] = []) {\n this.rules = [\n ...customRules.map(r => ({ ...r, priority: (r.priority ?? 5) + 100 })),\n ...BUILT_IN_RULES,\n ].sort((a, b) => (b.priority ?? 5) - (a.priority ?? 5));\n }\n\n categorize(tx: JoopTransaction): JoopCategorizationResult {\n const desc = tx.description.toLowerCase();\n\n for (const rule of this.rules) {\n if (rule.type && tx.type && rule.type !== tx.type) continue;\n\n if (rule.amountRange) {\n if (rule.amountRange.min !== undefined && tx.amount < rule.amountRange.min) continue;\n if (rule.amountRange.max !== undefined && tx.amount > rule.amountRange.max) continue;\n }\n\n if (rule.merchantCodes?.length && tx.merchantCode) {\n if (rule.merchantCodes.includes(tx.merchantCode)) {\n return { category: rule.category, confidence: 0.95, matchedRule: rule.label };\n }\n }\n\n if (rule.patterns?.length) {\n if (rule.patterns.some(p => p.test(desc))) {\n return { category: rule.category, confidence: 0.90, matchedRule: rule.label };\n }\n }\n\n if (rule.keywords?.length) {\n const matches = rule.keywords.filter(kw => desc.includes(kw.toLowerCase()));\n if (matches.length > 0) {\n const confidence = Math.min(0.95, 0.70 + matches.length * 0.05);\n return { category: rule.category, confidence, matchedRule: rule.label ?? matches[0] };\n }\n }\n }\n\n return { category: 'other', confidence: 0.50 };\n }\n\n categorizeBatch(txs: JoopTransaction[]): JoopCategorizationResult[] {\n return txs.map(tx => this.categorize(tx));\n }\n\n addRule(rule: JoopCategoryRule): void {\n this.rules.unshift({ ...rule, priority: (rule.priority ?? 5) + 100 });\n this.rules.sort((a, b) => (b.priority ?? 5) - (a.priority ?? 5));\n }\n\n removeRule(label: string): void {\n this.rules = this.rules.filter(r => r.label !== label);\n }\n\n getRules(): JoopCategoryRule[] { return [...this.rules]; }\n\n getCategories(): JoopTransactionCategory[] {\n return [...new Set(this.rules.map(r => r.category)), 'other'];\n }\n}\n","// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type JoopEventMap = Record<string, any>;\n\nexport interface JoopEventBusOptions {\n replayLast?: boolean;\n maxHistory?: number;\n maxListeners?: number;\n}\n\nexport interface JoopEventMeta {\n event: string;\n timestamp: number;\n id: string;\n}\n\nexport type JoopEventHandler<T = unknown> = (payload: T, meta: JoopEventMeta) => void;\nexport type JoopAnyHandler = (event: string, payload: unknown, meta: JoopEventMeta) => void;\n\nexport interface JoopEventHistoryEntry {\n event: string;\n payload: unknown;\n meta: JoopEventMeta;\n}\n\nlet _seq = 0;\nfunction nextId(): string { return `ev_${Date.now()}_${++_seq}`; }\n\nexport class JoopEventBus<TMap extends JoopEventMap = JoopEventMap> {\n private readonly listeners = new Map<string, Set<JoopEventHandler>>();\n private readonly onceMarked = new WeakSet<JoopEventHandler>();\n private readonly wildcards = new Map<RegExp, JoopEventHandler>();\n private readonly anyHandlers = new Set<JoopAnyHandler>();\n private readonly lastEmitted = new Map<string, { payload: unknown; meta: JoopEventMeta }>();\n private readonly _history: JoopEventHistoryEntry[] = [];\n private readonly opts: Required<JoopEventBusOptions>;\n\n constructor(options: JoopEventBusOptions = {}) {\n this.opts = {\n replayLast: options.replayLast ?? false,\n maxHistory: options.maxHistory ?? 100,\n maxListeners: options.maxListeners ?? 50,\n };\n }\n\n on<K extends keyof TMap>(event: K, handler: JoopEventHandler<TMap[K]>): () => void {\n const key = String(event);\n if (!this.listeners.has(key)) this.listeners.set(key, new Set());\n const set = this.listeners.get(key)!;\n if (set.size >= this.opts.maxListeners) {\n console.warn(`[JoopEventBus] maxListeners (${this.opts.maxListeners}) reached for \"${key}\"`);\n }\n set.add(handler as JoopEventHandler);\n\n if (this.opts.replayLast && this.lastEmitted.has(key)) {\n const { payload, meta } = this.lastEmitted.get(key)!;\n queueMicrotask(() => (handler as JoopEventHandler)(payload, meta));\n }\n return () => this.off(event, handler);\n }\n\n once<K extends keyof TMap>(event: K, handler: JoopEventHandler<TMap[K]>): () => void {\n this.onceMarked.add(handler as JoopEventHandler);\n return this.on(event, handler);\n }\n\n off<K extends keyof TMap>(event: K, handler: JoopEventHandler<TMap[K]>): void {\n this.listeners.get(String(event))?.delete(handler as JoopEventHandler);\n }\n\n emit<K extends keyof TMap>(event: K, payload: TMap[K]): void {\n const key = String(event);\n const meta: JoopEventMeta = { event: key, timestamp: Date.now(), id: nextId() };\n this.lastEmitted.set(key, { payload, meta });\n this._history.push({ event: key, payload, meta });\n if (this._history.length > this.opts.maxHistory) this._history.shift();\n\n const set = this.listeners.get(key);\n if (set) {\n for (const handler of [...set]) {\n handler(payload, meta);\n if (this.onceMarked.has(handler)) {\n set.delete(handler);\n this.onceMarked.delete(handler);\n }\n }\n }\n\n for (const [pattern, handler] of this.wildcards) {\n if (pattern.test(key)) handler(payload, meta);\n }\n\n for (const handler of this.anyHandlers) {\n handler(key, payload, meta);\n }\n }\n\n onWildcard(pattern: string | RegExp, handler: JoopEventHandler<unknown>): () => void {\n const re = typeof pattern === 'string'\n ? new RegExp('^' + pattern.replace(/\\./g, '\\\\.').replace(/\\*/g, '.*') + '$')\n : pattern;\n this.wildcards.set(re, handler);\n return () => this.wildcards.delete(re);\n }\n\n onAny(handler: JoopAnyHandler): () => void {\n this.anyHandlers.add(handler);\n return () => this.anyHandlers.delete(handler);\n }\n\n waitFor<K extends keyof TMap>(event: K, timeoutMs = 10_000): Promise<TMap[K]> {\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n unsub();\n reject(new Error(`[JoopEventBus] Timeout waiting for \"${String(event)}\" (${timeoutMs}ms)`));\n }, timeoutMs);\n const unsub = this.once(event, (payload) => { clearTimeout(timer); resolve(payload); });\n });\n }\n\n history(event?: keyof TMap, limit = 50): JoopEventHistoryEntry[] {\n const filtered = event ? this._history.filter(e => e.event === String(event)) : this._history;\n return filtered.slice(-limit);\n }\n\n listenerCount(event?: keyof TMap): number {\n if (event !== undefined) return this.listeners.get(String(event))?.size ?? 0;\n let total = 0;\n for (const set of this.listeners.values()) total += set.size;\n return total + this.wildcards.size + this.anyHandlers.size;\n }\n\n clear(event?: keyof TMap): void {\n if (event !== undefined) {\n this.listeners.delete(String(event));\n } else {\n this.listeners.clear();\n this.wildcards.clear();\n this.anyHandlers.clear();\n }\n }\n}\n\nexport const joopEventBus = new JoopEventBus();\n","export type JoopKycStatus =\n | 'unverified'\n | 'started'\n | 'docs_submitted'\n | 'under_review'\n | 'additional_info_required'\n | 'verified'\n | 'rejected'\n | 'expired';\n\nexport type JoopKycDocumentType =\n | 'passport'\n | 'national_id'\n | 'driving_license'\n | 'utility_bill'\n | 'bank_statement'\n | 'selfie'\n | 'proof_of_address';\n\nexport interface JoopKycDocument {\n type: JoopKycDocumentType;\n status: 'pending' | 'accepted' | 'rejected';\n submittedAt: number;\n url?: string;\n rejectionReason?: string;\n}\n\nexport interface JoopKycContext {\n userId: string;\n status: JoopKycStatus;\n documents: JoopKycDocument[];\n reviewNotes: string[];\n startedAt?: number;\n submittedAt?: number;\n completedAt?: number;\n rejectionReason?: string;\n metadata: Record<string, unknown>;\n}\n\nexport interface JoopKycHistoryEntry {\n from: JoopKycStatus;\n to: JoopKycStatus;\n event: string;\n timestamp: number;\n}\n\n// Valid event → next-status map per state\nconst TRANSITIONS: Partial<Record<JoopKycStatus, Partial<Record<string, JoopKycStatus>>>> = {\n unverified: { start: 'started' },\n started: { submit: 'docs_submitted' },\n docs_submitted: { review: 'under_review' },\n under_review: {\n approve: 'verified',\n reject: 'rejected',\n info_required: 'additional_info_required',\n },\n additional_info_required: { resubmit: 'docs_submitted' },\n verified: { expire: 'expired' },\n rejected: { restart: 'started' },\n expired: { restart: 'started' },\n};\n\ntype TransitionFn = (from: JoopKycStatus, to: JoopKycStatus, ctx: JoopKycContext) => void;\ntype EnterFn = (ctx: JoopKycContext) => void;\n\nexport class JoopKycStateMachine {\n private ctx: JoopKycContext;\n private readonly _history: JoopKycHistoryEntry[] = [];\n private readonly transitionListeners = new Set<TransitionFn>();\n private readonly enterListeners = new Map<JoopKycStatus, Set<EnterFn>>();\n\n constructor(userId: string, initialStatus: JoopKycStatus = 'unverified') {\n this.ctx = { userId, status: initialStatus, documents: [], reviewNotes: [], metadata: {} };\n }\n\n private async transition(event: string, mutate?: (ctx: JoopKycContext) => void): Promise<void> {\n const to = TRANSITIONS[this.ctx.status]?.[event];\n if (!to) throw new Error(`Invalid KYC transition: \"${event}\" from \"${this.ctx.status}\"`);\n const from = this.ctx.status;\n mutate?.(this.ctx);\n this.ctx.status = to;\n this._history.push({ from, to, event, timestamp: Date.now() });\n this.transitionListeners.forEach(fn => fn(from, to, this.ctx));\n this.enterListeners.get(to)?.forEach(fn => fn(this.ctx));\n }\n\n async start(): Promise<void> {\n await this.transition('start', ctx => { ctx.startedAt = Date.now(); });\n }\n\n async submitDocuments(docs: Omit<JoopKycDocument, 'submittedAt'>[]): Promise<void> {\n await this.transition('submit', ctx => {\n ctx.documents.push(...docs.map(d => ({ ...d, submittedAt: Date.now() })));\n ctx.submittedAt = Date.now();\n });\n }\n\n async beginReview(): Promise<void> {\n await this.transition('review');\n }\n\n async requestMoreInfo(reason: string): Promise<void> {\n await this.transition('info_required', ctx => { ctx.reviewNotes.push(reason); });\n }\n\n async approve(): Promise<void> {\n await this.transition('approve', ctx => { ctx.completedAt = Date.now(); });\n }\n\n async reject(reason: string): Promise<void> {\n await this.transition('reject', ctx => { ctx.rejectionReason = reason; ctx.completedAt = Date.now(); });\n }\n\n async expire(): Promise<void> {\n await this.transition('expire', ctx => { ctx.completedAt = Date.now(); });\n }\n\n async resubmit(docs: Omit<JoopKycDocument, 'submittedAt'>[]): Promise<void> {\n await this.transition('resubmit', ctx => {\n ctx.documents.push(...docs.map(d => ({ ...d, submittedAt: Date.now() })));\n ctx.submittedAt = Date.now();\n });\n }\n\n async restart(): Promise<void> {\n await this.transition('restart', ctx => {\n ctx.documents = [];\n ctx.reviewNotes = [];\n ctx.rejectionReason = undefined;\n ctx.completedAt = undefined;\n ctx.startedAt = Date.now();\n });\n }\n\n getContext(): JoopKycContext {\n return { ...this.ctx, documents: [...this.ctx.documents], metadata: { ...this.ctx.metadata } };\n }\n\n getStatus(): JoopKycStatus { return this.ctx.status; }\n\n canTransitionTo(status: JoopKycStatus): boolean {\n return Object.values(TRANSITIONS[this.ctx.status] ?? {}).includes(status);\n }\n\n getAvailableTransitions(): string[] {\n return Object.keys(TRANSITIONS[this.ctx.status] ?? {});\n }\n\n getHistory(): readonly JoopKycHistoryEntry[] { return this._history; }\n\n onTransition(fn: TransitionFn): () => void {\n this.transitionListeners.add(fn);\n return () => this.transitionListeners.delete(fn);\n }\n\n onEnter(status: JoopKycStatus, fn: EnterFn): () => void {\n if (!this.enterListeners.has(status)) this.enterListeners.set(status, new Set());\n this.enterListeners.get(status)!.add(fn);\n return () => this.enterListeners.get(status)?.delete(fn);\n }\n\n setMetadata(key: string, value: unknown): void { this.ctx.metadata[key] = value; }\n\n serialize(): string { return JSON.stringify({ ctx: this.ctx, history: this._history }); }\n\n static deserialize(data: string): JoopKycStateMachine {\n const { ctx, history } = JSON.parse(data) as { ctx: JoopKycContext; history: JoopKycHistoryEntry[] };\n const machine = new JoopKycStateMachine(ctx.userId, ctx.status);\n machine.ctx = ctx;\n machine._history.push(...history);\n return machine;\n }\n}\n","import { JoopSubject } from '../events';\n\nexport type JoopAmlRuleType = 'velocity' | 'threshold' | 'structuring' | 'geographic' | 'watchlist' | 'pattern';\nexport type JoopAmlAlertSeverity = 'low' | 'medium' | 'high' | 'critical';\nexport type JoopAmlDisposition = 'true-positive' | 'false-positive' | 'pending';\nexport type JoopAmlTxnType = 'credit' | 'debit';\n\nexport interface JoopAmlTransaction {\n id: string;\n entityId: string;\n entityName?: string;\n amount: number;\n currency: string;\n type: JoopAmlTxnType;\n country?: string;\n date: number;\n description?: string;\n}\n\nexport interface JoopAmlRule {\n id: string;\n name: string;\n type: JoopAmlRuleType;\n enabled: boolean;\n severity: JoopAmlAlertSeverity;\n params: Record<string, unknown>;\n}\n\nexport interface JoopAmlAlert {\n id: string;\n ruleId: string;\n ruleName: string;\n severity: JoopAmlAlertSeverity;\n entityId: string;\n transactionIds: string[];\n description: string;\n raisedAt: number;\n disposition: JoopAmlDisposition;\n reviewedAt?: number;\n reviewedBy?: string;\n}\n\nexport interface JoopAmlStats {\n total: number;\n pending: number;\n truePositive: number;\n falsePositive: number;\n bySeverity: Record<JoopAmlAlertSeverity, number>;\n byRule: Record<string, number>;\n}\n\nconst DEFAULT_RULES: Array<Omit<JoopAmlRule, 'id'>> = [\n { name: 'Large Transaction', type: 'threshold', enabled: true, severity: 'high', params: { thresholdAmount: 10000 } },\n { name: 'High Velocity', type: 'velocity', enabled: true, severity: 'medium', params: { maxCount: 5, windowMs: 3_600_000 } },\n { name: 'Structuring', type: 'structuring', enabled: true, severity: 'critical', params: { structureThreshold: 10000, windowMs: 86_400_000, minCount: 2 } },\n { name: 'High-Risk Country', type: 'geographic', enabled: true, severity: 'high', params: {} },\n { name: 'Watchlist Match', type: 'watchlist', enabled: true, severity: 'critical', params: {} },\n];\n\nexport class JoopAmlService {\n private _rules = new Map<string, JoopAmlRule>();\n private _alerts = new Map<string, JoopAmlAlert>();\n private _txnHistory = new Map<string, JoopAmlTransaction[]>(); // entityId → txns\n private _watchlist = new Set<string>();\n private _highRisk = new Set<string>();\n private _alert$ = new JoopSubject<JoopAmlAlert>();\n\n constructor() {\n for (const def of DEFAULT_RULES) {\n const rule: JoopAmlRule = { ...def, id: _uid() };\n this._rules.set(rule.id, rule);\n }\n // Common high-risk countries (FATF grey/black list examples)\n ['IR', 'KP', 'MM', 'SY', 'YE', 'LY', 'SS'].forEach(c => this._highRisk.add(c));\n }\n\n // ── Rules ─────────────────────────────────────────────────────────────────\n\n addRule(data: Omit<JoopAmlRule, 'id'>): JoopAmlRule {\n const rule: JoopAmlRule = { ...data, id: _uid() };\n this._rules.set(rule.id, rule);\n return { ...rule };\n }\n\n enableRule(id: string): void { this._getRule(id).enabled = true; }\n disableRule(id: string): void { this._getRule(id).enabled = false; }\n\n getRules(): JoopAmlRule[] {\n return Array.from(this._rules.values()).map(r => ({ ...r }));\n }\n\n // ── Watchlist ─────────────────────────────────────────────────────────────\n\n addToWatchlist(name: string): void { this._watchlist.add(name.toLowerCase()); }\n removeFromWatchlist(name: string): void { this._watchlist.delete(name.toLowerCase()); }\n isOnWatchlist(name: string): boolean { return this._watchlist.has(name.toLowerCase()); }\n\n // ── High-risk countries ───────────────────────────────────────────────────\n\n addHighRiskCountry(code: string): void { this._highRisk.add(code.toUpperCase()); }\n removeHighRiskCountry(code: string): void { this._highRisk.delete(code.toUpperCase()); }\n isHighRisk(countryCode: string): boolean { return this._highRisk.has(countryCode.toUpperCase()); }\n\n // ── Screening ─────────────────────────────────────────────────────────────\n\n screenTransaction(txn: JoopAmlTransaction): JoopAmlAlert[] {\n // Store transaction history\n if (!this._txnHistory.has(txn.entityId)) this._txnHistory.set(txn.entityId, []);\n this._txnHistory.get(txn.entityId)!.push(txn);\n\n const raised: JoopAmlAlert[] = [];\n for (const rule of this._rules.values()) {\n if (!rule.enabled) continue;\n const alert = this._applyRule(rule, txn);\n if (alert) {\n this._alerts.set(alert.id, alert);\n this._alert$.next({ ...alert });\n raised.push({ ...alert });\n }\n }\n return raised;\n }\n\n // ── Alerts ────────────────────────────────────────────────────────────────\n\n getAlerts(disposition?: JoopAmlDisposition): JoopAmlAlert[] {\n let list = Array.from(this._alerts.values()).map(a => ({ ...a }));\n if (disposition) list = list.filter(a => a.disposition === disposition);\n return list.sort((a, b) => b.raisedAt - a.raisedAt);\n }\n\n getEntityAlerts(entityId: string): JoopAmlAlert[] {\n return this.getAlerts().filter(a => a.entityId === entityId);\n }\n\n reviewAlert(id: string, disposition: 'true-positive' | 'false-positive', reviewedBy?: string): JoopAmlAlert {\n const a = this._alerts.get(id);\n if (!a) throw new Error(`Alert '${id}' not found`);\n a.disposition = disposition;\n a.reviewedAt = Date.now();\n a.reviewedBy = reviewedBy;\n return { ...a };\n }\n\n getStats(): JoopAmlStats {\n const all = Array.from(this._alerts.values());\n const bySeverity = { low: 0, medium: 0, high: 0, critical: 0 } as Record<JoopAmlAlertSeverity, number>;\n const byRule: Record<string, number> = {};\n for (const a of all) {\n bySeverity[a.severity]++;\n byRule[a.ruleName] = (byRule[a.ruleName] ?? 0) + 1;\n }\n return {\n total: all.length,\n pending: all.filter(a => a.disposition === 'pending').length,\n truePositive: all.filter(a => a.disposition === 'true-positive').length,\n falsePositive: all.filter(a => a.disposition === 'false-positive').length,\n bySeverity, byRule,\n };\n }\n\n alert$() { return this._alert$.asObservable(); }\n\n // ── Internals ─────────────────────────────────────────────────────────────\n\n private _applyRule(rule: JoopAmlRule, txn: JoopAmlTransaction): JoopAmlAlert | null {\n const p = rule.params;\n const history = this._txnHistory.get(txn.entityId) ?? [];\n\n switch (rule.type) {\n case 'threshold': {\n if (txn.amount >= (p.thresholdAmount as number)) {\n return this._makeAlert(rule, txn.entityId, [txn.id], `Transaction of ${txn.amount} ${txn.currency} exceeds threshold ${p.thresholdAmount}`);\n }\n break;\n }\n case 'velocity': {\n const windowMs = p.windowMs as number;\n const maxCount = p.maxCount as number;\n const cutoff = txn.date - windowMs;\n const recent = history.filter(t => t.date >= cutoff);\n if (recent.length > maxCount) {\n return this._makeAlert(rule, txn.entityId, recent.map(t => t.id), `${recent.length} transactions in ${windowMs / 60_000} min window (limit: ${maxCount})`);\n }\n break;\n }\n case 'structuring': {\n const threshold = p.structureThreshold as number;\n const windowMs = p.windowMs as number;\n const minCount = p.minCount as number;\n const cutoff = txn.date - windowMs;\n const inWindow = history.filter(t => t.date >= cutoff && t.amount < threshold && t.amount > threshold * 0.7);\n if (inWindow.length >= minCount) {\n return this._makeAlert(rule, txn.entityId, inWindow.map(t => t.id), `Possible structuring: ${inWindow.length} transactions below ${threshold} within window`);\n }\n break;\n }\n case 'geographic': {\n if (txn.country && this._highRisk.has(txn.country.toUpperCase())) {\n return this._makeAlert(rule, txn.entityId, [txn.id], `Transaction involves high-risk country: ${txn.country}`);\n }\n break;\n }\n case 'watchlist': {\n const name = txn.entityName?.toLowerCase() ?? '';\n if (name && this._watchlist.has(name)) {\n return this._makeAlert(rule, txn.entityId, [txn.id], `Entity '${txn.entityName}' matches watchlist entry`);\n }\n break;\n }\n }\n return null;\n }\n\n private _makeAlert(rule: JoopAmlRule, entityId: string, txnIds: string[], description: string): JoopAmlAlert {\n return {\n id: _uid(), ruleId: rule.id, ruleName: rule.name,\n severity: rule.severity, entityId,\n transactionIds: txnIds, description,\n raisedAt: Date.now(), disposition: 'pending',\n };\n }\n\n private _getRule(id: string): JoopAmlRule {\n const r = this._rules.get(id);\n if (!r) throw new Error(`Rule '${id}' not found`);\n return r;\n }\n}\n\nfunction _uid(): string { return `${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`; }\n","import { JoopSubject } from '../events';\n\nexport type JoopFundCategory = 'equity' | 'debt' | 'hybrid' | 'money-market' | 'index' | 'etf';\nexport type JoopSipStatus = 'active' | 'paused' | 'cancelled' | 'completed';\nexport type JoopFundTxnType = 'invest' | 'redeem' | 'sip' | 'dividend';\n\nexport interface JoopMutualFund {\n symbol: string;\n name: string;\n category: JoopFundCategory;\n currentNav: number;\n currency: string;\n navUpdatedAt: number;\n isinCode?: string;\n expenseRatio?: number;\n}\n\nexport interface JoopFundHolding {\n id: string;\n symbol: string;\n investorId: string;\n units: number;\n averageNav: number;\n totalInvested: number;\n currentValue: number;\n unrealizedGain: number;\n returnPercent: number;\n createdAt: number;\n lastUpdatedAt: number;\n}\n\nexport interface JoopSip {\n id: string;\n symbol: string;\n investorId: string;\n amount: number;\n currency: string;\n frequency: 'weekly' | 'monthly' | 'quarterly';\n startDate: number;\n nextExecutionDate: number;\n endDate?: number;\n status: JoopSipStatus;\n executionCount: number;\n totalInvested: number;\n}\n\nexport interface JoopFundTransaction {\n id: string;\n holdingId: string;\n symbol: string;\n investorId: string;\n type: JoopFundTxnType;\n units: number;\n nav: number;\n amount: number;\n executedAt: number;\n sipId?: string;\n}\n\nexport interface JoopFundPortfolioSummary {\n investorId: string;\n totalInvested: number;\n currentValue: number;\n totalUnrealizedGain: number;\n totalReturnPercent: number;\n holdings: JoopFundHolding[];\n}\n\nfunction _uid(): string {\n return `${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;\n}\n\nfunction _round(n: number, dp = 4): number {\n return Math.round(n * 10 ** dp) / 10 ** dp;\n}\n\nfunction _advanceDate(ts: number, freq: 'weekly' | 'monthly' | 'quarterly'): number {\n const d = new Date(ts);\n if (freq === 'weekly') d.setDate(d.getDate() + 7);\n else if (freq === 'monthly') d.setMonth(d.getMonth() + 1);\n else if (freq === 'quarterly') d.setMonth(d.getMonth() + 3);\n return d.getTime();\n}\n\nexport class JoopMutualFundService {\n private _funds = new Map<string, JoopMutualFund>();\n private _holdings = new Map<string, JoopFundHolding>();\n private _sips = new Map<string, JoopSip>();\n private _txns : JoopFundTransaction[] = [];\n private _change$ = new JoopSubject<JoopFundHolding>();\n\n // ── Fund registry ─────────────────────────────────────────────────────────\n\n addFund(symbol: string, name: string, category: JoopFundCategory, currentNav: number, opts: { currency?: string; isinCode?: string; expenseRatio?: number } = {}): JoopMutualFund {\n if (currentNav <= 0) throw new Error('currentNav must be positive');\n if (this._funds.has(symbol)) throw new Error(`Fund ${symbol} already exists`);\n const fund: JoopMutualFund = { symbol, name, category, currentNav, currency: opts.currency ?? 'USD', navUpdatedAt: Date.now(), isinCode: opts.isinCode, expenseRatio: opts.expenseRatio };\n this._funds.set(symbol, fund);\n return fund;\n }\n\n updateNav(symbol: string, newNav: number): JoopMutualFund {\n const fund = this._getFund(symbol);\n if (newNav <= 0) throw new Error('newNav must be positive');\n fund.currentNav = newNav;\n fund.navUpdatedAt = Date.now();\n // Refresh all holding valuations for this fund\n for (const h of this._holdings.values()) {\n if (h.symbol === symbol) this._refreshHolding(h, fund.currentNav);\n }\n return fund;\n }\n\n getFund(symbol: string): JoopMutualFund | undefined { return this._funds.get(symbol); }\n getFunds(): JoopMutualFund[] { return Array.from(this._funds.values()); }\n\n // ── Invest / Redeem ───────────────────────────────────────────────────────\n\n invest(symbol: string, investorId: string, amount: number, opts: { sipId?: string } = {}): JoopFundHolding {\n const fund = this._getFund(symbol);\n if (amount <= 0) throw new Error('amount must be positive');\n const units = _round(amount / fund.currentNav);\n\n const existing = this._findHolding(symbol, investorId);\n if (existing) {\n // Weighted average nav\n const totalUnits = _round(existing.units + units);\n existing.averageNav = _round((existing.totalInvested + amount) / totalUnits);\n existing.units = totalUnits;\n existing.totalInvested = _round(existing.totalInvested + amount);\n this._refreshHolding(existing, fund.currentNav);\n this._recordTxn(existing.id, symbol, investorId, opts.sipId ? 'sip' : 'invest', units, fund.currentNav, amount, opts.sipId);\n this._change$.next(existing);\n return existing;\n }\n\n const holding: JoopFundHolding = {\n id: _uid(),\n symbol,\n investorId,\n units,\n averageNav: fund.currentNav,\n totalInvested: amount,\n currentValue: amount,\n unrealizedGain: 0,\n returnPercent: 0,\n createdAt: Date.now(),\n lastUpdatedAt: Date.now(),\n };\n this._holdings.set(holding.id, holding);\n this._recordTxn(holding.id, symbol, investorId, opts.sipId ? 'sip' : 'invest', units, fund.currentNav, amount, opts.sipId);\n this._change$.next(holding);\n return holding;\n }\n\n redeem(holdingId: string, units: number): JoopFundTransaction {\n const holding = this._getHolding(holdingId);\n const fund = this._getFund(holding.symbol);\n if (units <= 0) throw new Error('units must be positive');\n if (units > holding.units) throw new Error(`Insufficient units — available: ${holding.units}`);\n const amount = _round(units * fund.currentNav);\n holding.units = _round(holding.units - units);\n holding.totalInvested = _round(holding.totalInvested - units * holding.averageNav);\n if (holding.totalInvested < 0) holding.totalInvested = 0;\n this._refreshHolding(holding, fund.currentNav);\n const txn = this._recordTxn(holdingId, holding.symbol, holding.investorId, 'redeem', units, fund.currentNav, amount);\n this._change$.next(holding);\n return txn;\n }\n\n // ── SIP ───────────────────────────────────────────────────────────────────\n\n createSip(symbol: string, investorId: string, amount: number, frequency: JoopSip['frequency'], startDate: number, opts: { endDate?: number } = {}): JoopSip {\n this._getFund(symbol); // validate fund exists\n if (amount <= 0) throw new Error('SIP amount must be positive');\n const sip: JoopSip = {\n id: _uid(),\n symbol,\n investorId,\n amount,\n currency: this._funds.get(symbol)!.currency,\n frequency,\n startDate,\n nextExecutionDate: startDate,\n endDate: opts.endDate,\n status: 'active',\n executionCount: 0,\n totalInvested: 0,\n };\n this._sips.set(sip.id, sip);\n return sip;\n }\n\n executeSip(sipId: string): JoopFundHolding {\n const sip = this._getSip(sipId);\n if (sip.status !== 'active') throw new Error(`SIP is ${sip.status}`);\n const holding = this.invest(sip.symbol, sip.investorId, sip.amount, { sipId });\n sip.executionCount += 1;\n sip.totalInvested = _round(sip.totalInvested + sip.amount);\n const next = _advanceDate(sip.nextExecutionDate, sip.frequency);\n if (sip.endDate && next > sip.endDate) {\n sip.status = 'completed';\n } else {\n sip.nextExecutionDate = next;\n }\n return holding;\n }\n\n pauseSip(sipId: string): JoopSip { return this._setSipStatus(sipId, 'paused', 'active'); }\n resumeSip(sipId: string): JoopSip { return this._setSipStatus(sipId, 'active', 'paused'); }\n cancelSip(sipId: string): JoopSip { return this._setSipStat(sipId, 'cancelled'); }\n\n getSip(id: string): JoopSip | undefined { return this._sips.get(id); }\n getSipsByInvestor(investorId: string): JoopSip[] { return Array.from(this._sips.values()).filter(s => s.investorId === investorId); }\n\n // ── Portfolio ─────────────────────────────────────────────────────────────\n\n getHolding(id: string): JoopFundHolding | undefined { return this._holdings.get(id); }\n\n getHoldingsByInvestor(investorId: string): JoopFundHolding[] {\n return Array.from(this._holdings.values()).filter(h => h.investorId === investorId);\n }\n\n getPortfolioSummary(investorId: string): JoopFundPortfolioSummary {\n const holdings = this.getHoldingsByInvestor(investorId);\n const totalInvested = _round(holdings.reduce((s, h) => s + h.totalInvested, 0), 2);\n const currentValue = _round(holdings.reduce((s, h) => s + h.currentValue, 0), 2);\n const totalUnrealizedGain = _round(currentValue - totalInvested, 2);\n const totalReturnPercent = totalInvested > 0 ? _round((totalUnrealizedGain / totalInvested) * 100, 2) : 0;\n return { investorId, totalInvested, currentValue, totalUnrealizedGain, totalReturnPercent, holdings };\n }\n\n getTransactions(investorId?: string): JoopFundTransaction[] {\n return investorId ? this._txns.filter(t => t.investorId === investorId) : [...this._txns];\n }\n\n // ── Observable ───────────────────────────────────────────────────────────\n\n change$() { return this._change$; }\n\n // ── Private ───────────────────────────────────────────────────────────────\n\n private _getFund(symbol: string): JoopMutualFund {\n const f = this._funds.get(symbol);\n if (!f) throw new Error(`Fund ${symbol} not found`);\n return f;\n }\n\n private _getHolding(id: string): JoopFundHolding {\n const h = this._holdings.get(id);\n if (!h) throw new Error(`Holding ${id} not found`);\n return h;\n }\n\n private _getSip(id: string): JoopSip {\n const s = this._sips.get(id);\n if (!s) throw new Error(`SIP ${id} not found`);\n return s;\n }\n\n private _findHolding(symbol: string, investorId: string): JoopFundHolding | undefined {\n for (const h of this._holdings.values()) {\n if (h.symbol === symbol && h.investorId === investorId) return h;\n }\n return undefined;\n }\n\n private _refreshHolding(h: JoopFundHolding, currentNav: number): void {\n h.currentValue = _round(h.units * currentNav, 2);\n h.unrealizedGain = _round(h.currentValue - h.totalInvested, 2);\n h.returnPercent = h.totalInvested > 0 ? _round((h.unrealizedGain / h.totalInvested) * 100, 2) : 0;\n h.lastUpdatedAt = Date.now();\n }\n\n private _recordTxn(holdingId: string, symbol: string, investorId: string, type: JoopFundTxnType, units: number, nav: number, amount: number, sipId?: string): JoopFundTransaction {\n const txn: JoopFundTransaction = { id: _uid(), holdingId, symbol, investorId, type, units, nav, amount, executedAt: Date.now(), sipId };\n this._txns.push(txn);\n return txn;\n }\n\n private _setSipStatus(id: string, to: JoopSipStatus, requiredFrom: JoopSipStatus): JoopSip {\n const sip = this._getSip(id);\n if (sip.status !== requiredFrom) throw new Error(`SIP must be ${requiredFrom} to transition to ${to}`);\n sip.status = to;\n return sip;\n }\n\n private _setSipStat(id: string, to: JoopSipStatus): JoopSip {\n const sip = this._getSip(id);\n if (sip.status === 'cancelled') throw new Error('SIP already cancelled');\n sip.status = to;\n return sip;\n }\n}\n","import { JoopSubject } from '../events';\n\nexport type JoopSanctionsList = 'ofac' | 'un' | 'eu' | 'uk' | 'custom';\nexport type JoopSanctionEntityType = 'individual' | 'entity' | 'vessel' | 'aircraft';\nexport type JoopSanctionMatchType = 'exact' | 'alias' | 'fuzzy';\n\nexport interface JoopSanctionEntry {\n id: string;\n list: JoopSanctionsList;\n name: string;\n normalizedName: string;\n entityType: JoopSanctionEntityType;\n country?: string;\n aliases: string[];\n normalizedAliases: string[];\n reference?: string;\n addedAt: number;\n notes?: string;\n}\n\nexport interface JoopSanctionHit {\n entryId: string;\n list: JoopSanctionsList;\n matchedName: string;\n matchType: JoopSanctionMatchType;\n score: number;\n entry: JoopSanctionEntry;\n}\n\nexport interface JoopScreenResult {\n id: string;\n screenedName: string;\n normalizedInput: string;\n screenedAt: number;\n hits: JoopSanctionHit[];\n isClear: boolean;\n threshold: number;\n}\n\nexport interface JoopScreeningStats {\n totalEntries: number;\n entriesByList: Record<string, number>;\n totalScreened: number;\n totalHits: number;\n}\n\nfunction _uid(): string {\n return `${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;\n}\n\nfunction _normalize(name: string): string {\n return name.toLowerCase().replace(/[^a-z0-9\\s]/g, '').replace(/\\s+/g, ' ').trim();\n}\n\n/** Simple Levenshtein-based similarity score in [0, 1]. */\nfunction _similarity(a: string, b: string): number {\n if (a === b) return 1;\n const la = a.length, lb = b.length;\n if (la === 0 || lb === 0) return 0;\n const dp: number[][] = Array.from({ length: la + 1 }, (_, i) =>\n Array.from({ length: lb + 1 }, (_, j) => (i === 0 ? j : j === 0 ? i : 0))\n );\n for (let i = 1; i <= la; i++) {\n for (let j = 1; j <= lb; j++) {\n dp[i][j] = a[i - 1] === b[j - 1]\n ? dp[i - 1][j - 1]\n : 1 + Math.min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]);\n }\n }\n return 1 - dp[la][lb] / Math.max(la, lb);\n}\n\nexport class JoopSanctionsScreeningService {\n private _entries: JoopSanctionEntry[] = [];\n private _results: JoopScreenResult[] = [];\n private _disabledLists = new Set<JoopSanctionsList>();\n private _hit$ = new JoopSubject<JoopScreenResult>();\n\n // ── Entry management ──────────────────────────────────────────────────────\n\n addEntry(\n list: JoopSanctionsList,\n name: string,\n entityType: JoopSanctionEntityType,\n opts: { country?: string; aliases?: string[]; reference?: string; notes?: string } = {}\n ): JoopSanctionEntry {\n const entry: JoopSanctionEntry = {\n id: _uid(),\n list,\n name,\n normalizedName: _normalize(name),\n entityType,\n country: opts.country,\n aliases: opts.aliases ?? [],\n normalizedAliases: (opts.aliases ?? []).map(_normalize),\n reference: opts.reference,\n addedAt: Date.now(),\n notes: opts.notes,\n };\n this._entries.push(entry);\n return entry;\n }\n\n addBulk(entries: Omit<Parameters<JoopSanctionsScreeningService['addEntry']>[0 | 1 | 2 | 3], never>[]): JoopSanctionEntry[] {\n return entries.map(e => this.addEntry((e as any).list, (e as any).name, (e as any).entityType, e as any));\n }\n\n removeEntry(id: string): void {\n const idx = this._entries.findIndex(e => e.id === id);\n if (idx === -1) throw new Error(`Entry ${id} not found`);\n this._entries.splice(idx, 1);\n }\n\n updateEntry(id: string, patch: Partial<Pick<JoopSanctionEntry, 'name' | 'aliases' | 'country' | 'notes'>>): JoopSanctionEntry {\n const entry = this._entries.find(e => e.id === id);\n if (!entry) throw new Error(`Entry ${id} not found`);\n if (patch.name) {\n entry.name = patch.name;\n entry.normalizedName = _normalize(patch.name);\n }\n if (patch.aliases) {\n entry.aliases = patch.aliases;\n entry.normalizedAliases = patch.aliases.map(_normalize);\n }\n if (patch.country !== undefined) entry.country = patch.country;\n if (patch.notes !== undefined) entry.notes = patch.notes;\n return entry;\n }\n\n getEntries(list?: JoopSanctionsList): JoopSanctionEntry[] {\n return list ? this._entries.filter(e => e.list === list) : [...this._entries];\n }\n\n // ── List enable/disable ───────────────────────────────────────────────────\n\n disableList(list: JoopSanctionsList): void { this._disabledLists.add(list); }\n enableList(list: JoopSanctionsList): void { this._disabledLists.delete(list); }\n isListEnabled(list: JoopSanctionsList): boolean { return !this._disabledLists.has(list); }\n\n // ── Screening ─────────────────────────────────────────────────────────────\n\n screen(name: string, opts: { threshold?: number; lists?: JoopSanctionsList[] } = {}): JoopScreenResult {\n const threshold = opts.threshold ?? 0.85;\n const input = _normalize(name);\n const activeEntries = this._entries.filter(e =>\n !this._disabledLists.has(e.list) &&\n (opts.lists === undefined || opts.lists.includes(e.list))\n );\n\n const hits: JoopSanctionHit[] = [];\n\n for (const entry of activeEntries) {\n // Exact\n if (input === entry.normalizedName) {\n hits.push({ entryId: entry.id, list: entry.list, matchedName: entry.name, matchType: 'exact', score: 1, entry });\n continue;\n }\n // Alias exact\n const aliasIdx = entry.normalizedAliases.indexOf(input);\n if (aliasIdx !== -1) {\n hits.push({ entryId: entry.id, list: entry.list, matchedName: entry.aliases[aliasIdx], matchType: 'alias', score: 1, entry });\n continue;\n }\n // Fuzzy on name\n const nameScore = _similarity(input, entry.normalizedName);\n if (nameScore >= threshold) {\n hits.push({ entryId: entry.id, list: entry.list, matchedName: entry.name, matchType: 'fuzzy', score: Math.round(nameScore * 1000) / 1000, entry });\n continue;\n }\n // Fuzzy on aliases\n for (let i = 0; i < entry.normalizedAliases.length; i++) {\n const s = _similarity(input, entry.normalizedAliases[i]);\n if (s >= threshold) {\n hits.push({ entryId: entry.id, list: entry.list, matchedName: entry.aliases[i], matchType: 'fuzzy', score: Math.round(s * 1000) / 1000, entry });\n break;\n }\n }\n }\n\n // Deduplicate — keep highest score per entry\n const dedupedMap = new Map<string, JoopSanctionHit>();\n for (const h of hits) {\n const existing = dedupedMap.get(h.entryId);\n if (!existing || h.score > existing.score) dedupedMap.set(h.entryId, h);\n }\n const deduped = Array.from(dedupedMap.values()).sort((a, b) => b.score - a.score);\n\n const result: JoopScreenResult = {\n id: _uid(),\n screenedName: name,\n normalizedInput: input,\n screenedAt: Date.now(),\n hits: deduped,\n isClear: deduped.length === 0,\n threshold,\n };\n\n this._results.push(result);\n if (!result.isClear) this._hit$.next(result);\n return result;\n }\n\n screenBatch(names: string[], opts: { threshold?: number; lists?: JoopSanctionsList[] } = {}): JoopScreenResult[] {\n return names.map(n => this.screen(n, opts));\n }\n\n // ── Queries ───────────────────────────────────────────────────────────────\n\n getResult(id: string): JoopScreenResult | undefined { return this._results.find(r => r.id === id); }\n\n getResults(hitOnly = false): JoopScreenResult[] {\n return hitOnly ? this._results.filter(r => !r.isClear) : [...this._results];\n }\n\n isClear(resultId: string): boolean {\n const r = this.getResult(resultId);\n if (!r) throw new Error(`Result ${resultId} not found`);\n return r.isClear;\n }\n\n getStats(): JoopScreeningStats {\n const entriesByList: Record<string, number> = {};\n for (const e of this._entries) {\n entriesByList[e.list] = (entriesByList[e.list] ?? 0) + 1;\n }\n return {\n totalEntries: this._entries.length,\n entriesByList,\n totalScreened: this._results.length,\n totalHits: this._results.filter(r => !r.isClear).length,\n };\n }\n\n // ── Observable ───────────────────────────────────────────────────────────\n\n hit$() { return this._hit$; }\n}\n"]}
|