joopjs 2.0.5 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/skills/auth.md +235 -0
- package/.claude/skills/banking.md +377 -0
- package/.claude/skills/encryption.md +265 -0
- package/.claude/skills/finance.md +248 -0
- package/.claude/skills/observables.md +270 -0
- package/.claude/skills/security.md +240 -0
- package/.claude/skills/setup.md +196 -0
- package/.cursor/rules/joopjs.mdc +150 -0
- package/.github/copilot-instructions.md +143 -0
- package/.windsurf/rules/joopjs.md +226 -0
- package/CHANGELOG.md +81 -0
- package/README.md +47 -7
- package/ai-rules/AGENTS.md +241 -0
- package/ai-rules/GEMINI.md +183 -0
- package/dist/ai/index.js +15 -3
- package/dist/ai/index.js.map +1 -1
- package/dist/ai/index.mjs +15 -3
- package/dist/ai/index.mjs.map +1 -1
- package/dist/analytics/index.js +10 -2
- package/dist/analytics/index.js.map +1 -1
- package/dist/analytics/index.mjs +10 -2
- package/dist/analytics/index.mjs.map +1 -1
- package/dist/angular/index.d.mts +98 -27
- package/dist/angular/index.d.ts +98 -27
- package/dist/angular/index.js +44 -0
- package/dist/angular/index.js.map +1 -1
- package/dist/angular/index.mjs +39 -1
- package/dist/angular/index.mjs.map +1 -1
- package/dist/api/index.js +15 -3
- package/dist/api/index.js.map +1 -1
- package/dist/api/index.mjs +15 -3
- package/dist/api/index.mjs.map +1 -1
- package/dist/auth/index.js +15 -3
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/index.mjs +15 -3
- package/dist/auth/index.mjs.map +1 -1
- package/dist/banking/index.js +15 -3
- package/dist/banking/index.js.map +1 -1
- package/dist/banking/index.mjs +15 -3
- package/dist/banking/index.mjs.map +1 -1
- package/dist/cache/index.js +15 -3
- package/dist/cache/index.js.map +1 -1
- package/dist/cache/index.mjs +15 -3
- package/dist/cache/index.mjs.map +1 -1
- package/dist/{index-DFqEoX_l.d.ts → consent.service-CIHNtx9h.d.ts} +1 -2
- package/dist/{index-B_ksKpS1.d.mts → consent.service-DQ-JAEJx.d.mts} +1 -2
- package/dist/core/index.d.mts +34 -1
- package/dist/core/index.d.ts +34 -1
- package/dist/core/index.js +56 -5
- package/dist/core/index.js.map +1 -1
- package/dist/core/index.mjs +54 -6
- package/dist/core/index.mjs.map +1 -1
- package/dist/deeplink/index.js +15 -3
- package/dist/deeplink/index.js.map +1 -1
- package/dist/deeplink/index.mjs +15 -3
- package/dist/deeplink/index.mjs.map +1 -1
- package/dist/device/index.js +15 -3
- package/dist/device/index.js.map +1 -1
- package/dist/device/index.mjs +15 -3
- package/dist/device/index.mjs.map +1 -1
- package/dist/forms/index.js +15 -3
- package/dist/forms/index.js.map +1 -1
- package/dist/forms/index.mjs +15 -3
- package/dist/forms/index.mjs.map +1 -1
- package/dist/i18n/index.js +15 -3
- package/dist/i18n/index.js.map +1 -1
- package/dist/i18n/index.mjs +15 -3
- package/dist/i18n/index.mjs.map +1 -1
- package/dist/index.d.mts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +50 -8
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +50 -8
- package/dist/index.mjs.map +1 -1
- package/dist/{joop-CA3DMeOO.d.ts → joop-Dim2yEKG.d.ts} +1 -1
- package/dist/{joop-Bx7Iwj5p.d.mts → joop-GkQw13f9.d.mts} +1 -1
- package/dist/native-bridge/index.js +10 -2
- package/dist/native-bridge/index.js.map +1 -1
- package/dist/native-bridge/index.mjs +10 -2
- package/dist/native-bridge/index.mjs.map +1 -1
- package/dist/network/index.js +15 -3
- package/dist/network/index.js.map +1 -1
- package/dist/network/index.mjs +15 -3
- package/dist/network/index.mjs.map +1 -1
- package/dist/observability/index.js +15 -3
- package/dist/observability/index.js.map +1 -1
- package/dist/observability/index.mjs +15 -3
- package/dist/observability/index.mjs.map +1 -1
- package/dist/pwa/index.js +15 -3
- package/dist/pwa/index.js.map +1 -1
- package/dist/pwa/index.mjs +15 -3
- package/dist/pwa/index.mjs.map +1 -1
- package/dist/react/index.d.mts +2 -2
- package/dist/react/index.d.ts +2 -2
- package/dist/react/index.js +15 -3
- package/dist/react/index.js.map +1 -1
- package/dist/react/index.mjs +15 -3
- package/dist/react/index.mjs.map +1 -1
- package/dist/router/index.js +15 -3
- package/dist/router/index.js.map +1 -1
- package/dist/router/index.mjs +15 -3
- package/dist/router/index.mjs.map +1 -1
- package/dist/security/index.js +15 -3
- package/dist/security/index.js.map +1 -1
- package/dist/security/index.mjs +15 -3
- package/dist/security/index.mjs.map +1 -1
- package/dist/session/index.js +15 -3
- package/dist/session/index.js.map +1 -1
- package/dist/session/index.mjs +15 -3
- package/dist/session/index.mjs.map +1 -1
- package/dist/state/index.js +15 -3
- package/dist/state/index.js.map +1 -1
- package/dist/state/index.mjs +15 -3
- package/dist/state/index.mjs.map +1 -1
- package/dist/storage/index.js +15 -3
- package/dist/storage/index.js.map +1 -1
- package/dist/storage/index.mjs +15 -3
- package/dist/storage/index.mjs.map +1 -1
- package/dist/sync/index.js +15 -3
- package/dist/sync/index.js.map +1 -1
- package/dist/sync/index.mjs +15 -3
- package/dist/sync/index.mjs.map +1 -1
- package/dist/theme/index.js +15 -3
- package/dist/theme/index.js.map +1 -1
- package/dist/theme/index.mjs +15 -3
- package/dist/theme/index.mjs.map +1 -1
- package/dist/ui/index.js +15 -3
- package/dist/ui/index.js.map +1 -1
- package/dist/ui/index.mjs +15 -3
- package/dist/ui/index.mjs.map +1 -1
- package/dist/utilities/index.js +46 -4
- package/dist/utilities/index.js.map +1 -1
- package/dist/utilities/index.mjs +46 -4
- package/dist/utilities/index.mjs.map +1 -1
- package/dist/vue/index.d.mts +2 -2
- package/dist/vue/index.d.ts +2 -2
- package/dist/vue/index.js +15 -3
- package/dist/vue/index.js.map +1 -1
- package/dist/vue/index.mjs +15 -3
- package/dist/vue/index.mjs.map +1 -1
- package/dist/workflow/index.js +15 -3
- package/dist/workflow/index.js.map +1 -1
- package/dist/workflow/index.mjs +15 -3
- package/dist/workflow/index.mjs.map +1 -1
- package/package.json +96 -32
- package/scripts/setup-ai.mjs +133 -0
package/dist/core/index.js.map
CHANGED
|
@@ -1 +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/core/feature-flag.service.ts","../../src/core/rate-limiter.service.ts","../../src/core/consent.service.ts"],"names":[],"mappings":"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","file":"index.js","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","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","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 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"]}
|
|
1
|
+
{"version":3,"sources":["../../src/constants/index.ts","../../src/utilities/common.utility.ts","../../src/core/global-singleton.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/core/feature-flag.service.ts","../../src/core/rate-limiter.service.ts","../../src/core/consent.service.ts"],"names":[],"mappings":"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","file":"index.js","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","/**\n * Federation-safe singletons.\n *\n * When joopjs is bundled into multiple micro-frontends (Module Federation,\n * import maps, or simply two npm copies at different versions) and is NOT\n * shared as a singleton, every copy creates its own logger / config / event\n * bus. The consequence is silent and nasty: an event emitted in MFE-A never\n * reaches a subscriber in MFE-B, and config loaded by the host is invisible\n * to a remote.\n *\n * Routing module-level singletons through a versioned `globalThis` registry\n * makes duplicate copies converge on the FIRST instance that registered, so\n * state stays shared even when the bytes are duplicated. The version is keyed\n * to the major version — copies across a major boundary intentionally do NOT\n * share, since their contracts may differ.\n *\n * This is a runtime safety net. The correct primary fix is still to share\n * joopjs as a federation singleton:\n * shared: { joopjs: { singleton: true, requiredVersion: '^2.0.0' } }\n */\n\nconst MAJOR = '2';\nconst REGISTRY_KEY = Symbol.for(`joopjs.singletons.v${MAJOR}`);\n\ninterface GlobalRegistry {\n major: string;\n instances: Map<string, unknown>;\n /** Number of distinct bundled copies of this module that have loaded. */\n copies: number;\n warned: boolean;\n warningsSilenced: boolean;\n}\n\ntype GlobalWithRegistry = typeof globalThis & {\n [REGISTRY_KEY]?: GlobalRegistry;\n};\n\nfunction getRegistry(): GlobalRegistry {\n const g = globalThis as GlobalWithRegistry;\n let reg = g[REGISTRY_KEY];\n if (!reg) {\n reg = { major: MAJOR, instances: new Map(), copies: 0, warned: false, warningsSilenced: false };\n g[REGISTRY_KEY] = reg;\n }\n return reg;\n}\n\n// Each distinct bundled copy of joopjs runs this module's top level exactly\n// once, so this increments per copy across the shared globalThis.\n(() => {\n const reg = getRegistry();\n reg.copies += 1;\n if (reg.copies > 1 && !reg.warned && !reg.warningsSilenced) {\n reg.warned = true;\n // eslint-disable-next-line no-console\n console.warn(\n `[joopjs] ${reg.copies} copies of joopjs detected in one runtime. ` +\n 'Singletons (logger, config, event bus, …) are being de-duplicated via globalThis so ' +\n 'state stays shared, but you are shipping duplicate bytes. Share joopjs as a federation ' +\n \"singleton: shared: { joopjs: { singleton: true, requiredVersion: '^2.0.0' } }. \" +\n 'Call silenceDuplicateCopyWarning() to suppress this.',\n );\n }\n})();\n\n/**\n * Returns the process-wide singleton for `key`, creating it via `factory` on\n * first use. Subsequent calls — including from other bundled copies of joopjs —\n * return the same instance.\n */\nexport function globalSingleton<T>(key: string, factory: () => T): T {\n const reg = getRegistry();\n if (!reg.instances.has(key)) {\n reg.instances.set(key, factory());\n }\n return reg.instances.get(key) as T;\n}\n\n/** How many distinct bundled copies of joopjs have loaded in this runtime (1 is healthy). */\nexport function joopCopyCount(): number {\n return getRegistry().copies;\n}\n\n/** Suppress the multiple-copies console warning (e.g. when duplication is intentional in dev). */\nexport function silenceDuplicateCopyWarning(): void {\n getRegistry().warningsSilenced = true;\n}\n","import { JoopConfig, JoopApp, JoopTimeout, JoopLocalization, JoopLoggerConfig } from '../../models/config.models';\nimport { DEFAULT_REQUEST_TIMEOUT } from '../../constants';\nimport { removeTrailingSlash } from '../../utilities/common.utility';\nimport { globalSingleton } from '../global-singleton';\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 = globalSingleton('config', () => new JoopConfigService());\n","export type Unsubscribe = () => void;\nexport type Listener<T> = (value: T) => void;\n\n/**\n * Reports a subscriber that threw during emission, without aborting delivery\n * to the remaining subscribers. Defaults to console.error; override to route\n * to your own logger (e.g. in a banking app where dropped events matter).\n */\nlet _onListenerError: (error: unknown) => void = (error) => {\n // eslint-disable-next-line no-console\n console.error('[joopjs] a subject subscriber threw during emission:', error);\n};\n\n/** Override how subscriber errors are reported during emission. */\nexport function setSubjectErrorHandler(handler: (error: unknown) => void): void {\n _onListenerError = handler;\n}\n\n/**\n * Lightweight pub/sub subject — emits to all current subscribers.\n * Replaces RxJS Subject without pulling in the full RxJS dependency.\n */\nexport class JoopSubject<T> {\n private _listeners: Listener<T>[] = [];\n\n subscribe(listener: Listener<T>): Unsubscribe {\n this._listeners.push(listener);\n return () => {\n this._listeners = this._listeners.filter(l => l !== listener);\n };\n }\n\n next(value: T): void {\n // Snapshot so a subscribe()/unsubscribe() triggered by a listener can't\n // disturb this emission, and isolate each listener so one that throws\n // doesn't deprive later subscribers of the value.\n const listeners = this._listeners.slice();\n for (const listener of listeners) {\n try {\n listener(value);\n } catch (error) {\n _onListenerError(error);\n }\n }\n }\n\n asObservable(): JoopObservable<T> {\n return new JoopObservable<T>(listener => this.subscribe(listener));\n }\n}\n\n/**\n * Stateful subject — replays the current value to any new subscriber immediately.\n * Replaces RxJS BehaviorSubject.\n */\nexport class JoopBehaviorSubject<T> extends JoopSubject<T> {\n private _value: T;\n\n constructor(initialValue: T) {\n super();\n this._value = initialValue;\n }\n\n getValue(): T {\n return this._value;\n }\n\n override next(value: T): void {\n this._value = value;\n super.next(value);\n }\n\n override subscribe(listener: Listener<T>): Unsubscribe {\n try {\n listener(this._value);\n } catch (error) {\n _onListenerError(error);\n }\n return super.subscribe(listener);\n }\n\n override asObservable(): JoopObservable<T> {\n return new JoopObservable<T>(listener => this.subscribe(listener));\n }\n}\n\n/**\n * Read-only observable handle returned from asObservable().\n */\nexport class JoopObservable<T> {\n constructor(private _subscribeFn: (listener: Listener<T>) => Unsubscribe) {}\n\n subscribe(listener: Listener<T>): Unsubscribe {\n return this._subscribeFn(listener);\n }\n\n /** Returns the current value without subscribing (only meaningful for BehaviorSubject-backed observables). */\n getOnce(): T | undefined {\n let result: T | undefined;\n const unsub = this.subscribe(v => { result = v; });\n unsub();\n return result;\n }\n}\n","import { JoopSubject } from '../../events';\nimport { JoopLogEntry, JoopLoggerOptions } from '../../models/logger.models';\nimport { JoopLoggerConfig, JoopLoggerTypeConfig } from '../../models/config.models';\nimport { globalSingleton } from '../global-singleton';\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 = globalSingleton('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","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","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 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"]}
|
package/dist/core/index.mjs
CHANGED
|
@@ -6,6 +6,42 @@ function removeTrailingSlash(url) {
|
|
|
6
6
|
return url?.endsWith("/") ? url.slice(0, -1) : url;
|
|
7
7
|
}
|
|
8
8
|
|
|
9
|
+
// src/core/global-singleton.ts
|
|
10
|
+
var MAJOR = "2";
|
|
11
|
+
var REGISTRY_KEY = /* @__PURE__ */ Symbol.for(`joopjs.singletons.v${MAJOR}`);
|
|
12
|
+
function getRegistry() {
|
|
13
|
+
const g = globalThis;
|
|
14
|
+
let reg = g[REGISTRY_KEY];
|
|
15
|
+
if (!reg) {
|
|
16
|
+
reg = { major: MAJOR, instances: /* @__PURE__ */ new Map(), copies: 0, warned: false, warningsSilenced: false };
|
|
17
|
+
g[REGISTRY_KEY] = reg;
|
|
18
|
+
}
|
|
19
|
+
return reg;
|
|
20
|
+
}
|
|
21
|
+
(() => {
|
|
22
|
+
const reg = getRegistry();
|
|
23
|
+
reg.copies += 1;
|
|
24
|
+
if (reg.copies > 1 && !reg.warned && !reg.warningsSilenced) {
|
|
25
|
+
reg.warned = true;
|
|
26
|
+
console.warn(
|
|
27
|
+
`[joopjs] ${reg.copies} copies of joopjs detected in one runtime. Singletons (logger, config, event bus, \u2026) are being de-duplicated via globalThis so state stays shared, but you are shipping duplicate bytes. Share joopjs as a federation singleton: shared: { joopjs: { singleton: true, requiredVersion: '^2.0.0' } }. Call silenceDuplicateCopyWarning() to suppress this.`
|
|
28
|
+
);
|
|
29
|
+
}
|
|
30
|
+
})();
|
|
31
|
+
function globalSingleton(key, factory) {
|
|
32
|
+
const reg = getRegistry();
|
|
33
|
+
if (!reg.instances.has(key)) {
|
|
34
|
+
reg.instances.set(key, factory());
|
|
35
|
+
}
|
|
36
|
+
return reg.instances.get(key);
|
|
37
|
+
}
|
|
38
|
+
function joopCopyCount() {
|
|
39
|
+
return getRegistry().copies;
|
|
40
|
+
}
|
|
41
|
+
function silenceDuplicateCopyWarning() {
|
|
42
|
+
getRegistry().warningsSilenced = true;
|
|
43
|
+
}
|
|
44
|
+
|
|
9
45
|
// src/core/config/config.service.ts
|
|
10
46
|
var JoopConfigService = class {
|
|
11
47
|
_config = null;
|
|
@@ -75,9 +111,12 @@ var JoopConfigService = class {
|
|
|
75
111
|
return this._config;
|
|
76
112
|
}
|
|
77
113
|
};
|
|
78
|
-
var configService = new JoopConfigService();
|
|
114
|
+
var configService = globalSingleton("config", () => new JoopConfigService());
|
|
79
115
|
|
|
80
116
|
// src/events/index.ts
|
|
117
|
+
var _onListenerError = (error) => {
|
|
118
|
+
console.error("[joopjs] a subject subscriber threw during emission:", error);
|
|
119
|
+
};
|
|
81
120
|
var JoopSubject = class {
|
|
82
121
|
_listeners = [];
|
|
83
122
|
subscribe(listener) {
|
|
@@ -87,8 +126,13 @@ var JoopSubject = class {
|
|
|
87
126
|
};
|
|
88
127
|
}
|
|
89
128
|
next(value) {
|
|
90
|
-
|
|
91
|
-
|
|
129
|
+
const listeners = this._listeners.slice();
|
|
130
|
+
for (const listener of listeners) {
|
|
131
|
+
try {
|
|
132
|
+
listener(value);
|
|
133
|
+
} catch (error) {
|
|
134
|
+
_onListenerError(error);
|
|
135
|
+
}
|
|
92
136
|
}
|
|
93
137
|
}
|
|
94
138
|
asObservable() {
|
|
@@ -109,7 +153,11 @@ var JoopBehaviorSubject = class extends JoopSubject {
|
|
|
109
153
|
super.next(value);
|
|
110
154
|
}
|
|
111
155
|
subscribe(listener) {
|
|
112
|
-
|
|
156
|
+
try {
|
|
157
|
+
listener(this._value);
|
|
158
|
+
} catch (error) {
|
|
159
|
+
_onListenerError(error);
|
|
160
|
+
}
|
|
113
161
|
return super.subscribe(listener);
|
|
114
162
|
}
|
|
115
163
|
asObservable() {
|
|
@@ -196,7 +244,7 @@ var JoopLogger = class {
|
|
|
196
244
|
}
|
|
197
245
|
}
|
|
198
246
|
};
|
|
199
|
-
var logger = new JoopLogger();
|
|
247
|
+
var logger = globalSingleton("logger", () => new JoopLogger());
|
|
200
248
|
|
|
201
249
|
// src/core/plugin.service.ts
|
|
202
250
|
var JoopPluginService = class {
|
|
@@ -614,6 +662,6 @@ var JoopConsentService = class {
|
|
|
614
662
|
}
|
|
615
663
|
};
|
|
616
664
|
|
|
617
|
-
export { JoopConfigService, JoopConsentService, JoopEnvironmentService, JoopFeatureFlagService, JoopHealthService, JoopLogger, JoopPluginService, JoopRateLimiter, JoopTokenBucket, configService, logger };
|
|
665
|
+
export { JoopConfigService, JoopConsentService, JoopEnvironmentService, JoopFeatureFlagService, JoopHealthService, JoopLogger, JoopPluginService, JoopRateLimiter, JoopTokenBucket, configService, globalSingleton, joopCopyCount, logger, silenceDuplicateCopyWarning };
|
|
618
666
|
//# sourceMappingURL=index.mjs.map
|
|
619
667
|
//# sourceMappingURL=index.mjs.map
|
package/dist/core/index.mjs.map
CHANGED
|
@@ -1 +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/core/feature-flag.service.ts","../../src/core/rate-limiter.service.ts","../../src/core/consent.service.ts"],"names":[],"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","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","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 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"]}
|
|
1
|
+
{"version":3,"sources":["../../src/constants/index.ts","../../src/utilities/common.utility.ts","../../src/core/global-singleton.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/core/feature-flag.service.ts","../../src/core/rate-limiter.service.ts","../../src/core/consent.service.ts"],"names":[],"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","/**\n * Federation-safe singletons.\n *\n * When joopjs is bundled into multiple micro-frontends (Module Federation,\n * import maps, or simply two npm copies at different versions) and is NOT\n * shared as a singleton, every copy creates its own logger / config / event\n * bus. The consequence is silent and nasty: an event emitted in MFE-A never\n * reaches a subscriber in MFE-B, and config loaded by the host is invisible\n * to a remote.\n *\n * Routing module-level singletons through a versioned `globalThis` registry\n * makes duplicate copies converge on the FIRST instance that registered, so\n * state stays shared even when the bytes are duplicated. The version is keyed\n * to the major version — copies across a major boundary intentionally do NOT\n * share, since their contracts may differ.\n *\n * This is a runtime safety net. The correct primary fix is still to share\n * joopjs as a federation singleton:\n * shared: { joopjs: { singleton: true, requiredVersion: '^2.0.0' } }\n */\n\nconst MAJOR = '2';\nconst REGISTRY_KEY = Symbol.for(`joopjs.singletons.v${MAJOR}`);\n\ninterface GlobalRegistry {\n major: string;\n instances: Map<string, unknown>;\n /** Number of distinct bundled copies of this module that have loaded. */\n copies: number;\n warned: boolean;\n warningsSilenced: boolean;\n}\n\ntype GlobalWithRegistry = typeof globalThis & {\n [REGISTRY_KEY]?: GlobalRegistry;\n};\n\nfunction getRegistry(): GlobalRegistry {\n const g = globalThis as GlobalWithRegistry;\n let reg = g[REGISTRY_KEY];\n if (!reg) {\n reg = { major: MAJOR, instances: new Map(), copies: 0, warned: false, warningsSilenced: false };\n g[REGISTRY_KEY] = reg;\n }\n return reg;\n}\n\n// Each distinct bundled copy of joopjs runs this module's top level exactly\n// once, so this increments per copy across the shared globalThis.\n(() => {\n const reg = getRegistry();\n reg.copies += 1;\n if (reg.copies > 1 && !reg.warned && !reg.warningsSilenced) {\n reg.warned = true;\n // eslint-disable-next-line no-console\n console.warn(\n `[joopjs] ${reg.copies} copies of joopjs detected in one runtime. ` +\n 'Singletons (logger, config, event bus, …) are being de-duplicated via globalThis so ' +\n 'state stays shared, but you are shipping duplicate bytes. Share joopjs as a federation ' +\n \"singleton: shared: { joopjs: { singleton: true, requiredVersion: '^2.0.0' } }. \" +\n 'Call silenceDuplicateCopyWarning() to suppress this.',\n );\n }\n})();\n\n/**\n * Returns the process-wide singleton for `key`, creating it via `factory` on\n * first use. Subsequent calls — including from other bundled copies of joopjs —\n * return the same instance.\n */\nexport function globalSingleton<T>(key: string, factory: () => T): T {\n const reg = getRegistry();\n if (!reg.instances.has(key)) {\n reg.instances.set(key, factory());\n }\n return reg.instances.get(key) as T;\n}\n\n/** How many distinct bundled copies of joopjs have loaded in this runtime (1 is healthy). */\nexport function joopCopyCount(): number {\n return getRegistry().copies;\n}\n\n/** Suppress the multiple-copies console warning (e.g. when duplication is intentional in dev). */\nexport function silenceDuplicateCopyWarning(): void {\n getRegistry().warningsSilenced = true;\n}\n","import { JoopConfig, JoopApp, JoopTimeout, JoopLocalization, JoopLoggerConfig } from '../../models/config.models';\nimport { DEFAULT_REQUEST_TIMEOUT } from '../../constants';\nimport { removeTrailingSlash } from '../../utilities/common.utility';\nimport { globalSingleton } from '../global-singleton';\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 = globalSingleton('config', () => new JoopConfigService());\n","export type Unsubscribe = () => void;\nexport type Listener<T> = (value: T) => void;\n\n/**\n * Reports a subscriber that threw during emission, without aborting delivery\n * to the remaining subscribers. Defaults to console.error; override to route\n * to your own logger (e.g. in a banking app where dropped events matter).\n */\nlet _onListenerError: (error: unknown) => void = (error) => {\n // eslint-disable-next-line no-console\n console.error('[joopjs] a subject subscriber threw during emission:', error);\n};\n\n/** Override how subscriber errors are reported during emission. */\nexport function setSubjectErrorHandler(handler: (error: unknown) => void): void {\n _onListenerError = handler;\n}\n\n/**\n * Lightweight pub/sub subject — emits to all current subscribers.\n * Replaces RxJS Subject without pulling in the full RxJS dependency.\n */\nexport class JoopSubject<T> {\n private _listeners: Listener<T>[] = [];\n\n subscribe(listener: Listener<T>): Unsubscribe {\n this._listeners.push(listener);\n return () => {\n this._listeners = this._listeners.filter(l => l !== listener);\n };\n }\n\n next(value: T): void {\n // Snapshot so a subscribe()/unsubscribe() triggered by a listener can't\n // disturb this emission, and isolate each listener so one that throws\n // doesn't deprive later subscribers of the value.\n const listeners = this._listeners.slice();\n for (const listener of listeners) {\n try {\n listener(value);\n } catch (error) {\n _onListenerError(error);\n }\n }\n }\n\n asObservable(): JoopObservable<T> {\n return new JoopObservable<T>(listener => this.subscribe(listener));\n }\n}\n\n/**\n * Stateful subject — replays the current value to any new subscriber immediately.\n * Replaces RxJS BehaviorSubject.\n */\nexport class JoopBehaviorSubject<T> extends JoopSubject<T> {\n private _value: T;\n\n constructor(initialValue: T) {\n super();\n this._value = initialValue;\n }\n\n getValue(): T {\n return this._value;\n }\n\n override next(value: T): void {\n this._value = value;\n super.next(value);\n }\n\n override subscribe(listener: Listener<T>): Unsubscribe {\n try {\n listener(this._value);\n } catch (error) {\n _onListenerError(error);\n }\n return super.subscribe(listener);\n }\n\n override asObservable(): JoopObservable<T> {\n return new JoopObservable<T>(listener => this.subscribe(listener));\n }\n}\n\n/**\n * Read-only observable handle returned from asObservable().\n */\nexport class JoopObservable<T> {\n constructor(private _subscribeFn: (listener: Listener<T>) => Unsubscribe) {}\n\n subscribe(listener: Listener<T>): Unsubscribe {\n return this._subscribeFn(listener);\n }\n\n /** Returns the current value without subscribing (only meaningful for BehaviorSubject-backed observables). */\n getOnce(): T | undefined {\n let result: T | undefined;\n const unsub = this.subscribe(v => { result = v; });\n unsub();\n return result;\n }\n}\n","import { JoopSubject } from '../../events';\nimport { JoopLogEntry, JoopLoggerOptions } from '../../models/logger.models';\nimport { JoopLoggerConfig, JoopLoggerTypeConfig } from '../../models/config.models';\nimport { globalSingleton } from '../global-singleton';\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 = globalSingleton('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","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","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 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"]}
|