{"version":3,"sources":["../../src/react/index.tsx","../../src/core/ConsentStorage.ts","../../src/core/ScriptBlocker.ts","../../src/core/ConsentAPI.ts","../../src/utils/EventEmitter.ts","../../src/utils/fingerprint.ts","../../src/version.ts","../../src/core/ConsentManager.ts"],"sourcesContent":["/**\n * React Integration fuer @breakpilot/consent-sdk\n *\n * @example\n * ```tsx\n * import { ConsentProvider, useConsent, ConsentBanner } from '@breakpilot/consent-sdk/react';\n *\n * function App() {\n * return (\n * \n * \n * \n * \n * );\n * }\n * ```\n */\n\nimport {\n createContext,\n useContext,\n useEffect,\n useState,\n useCallback,\n useMemo,\n type ReactNode,\n type FC,\n} from 'react';\nimport { ConsentManager } from '../core/ConsentManager';\nimport type {\n ConsentConfig,\n ConsentState,\n ConsentCategory,\n ConsentCategories,\n} from '../types';\n\n// =============================================================================\n// Context\n// =============================================================================\n\ninterface ConsentContextValue {\n /** ConsentManager Instanz */\n manager: ConsentManager | null;\n\n /** Aktueller Consent-State */\n consent: ConsentState | null;\n\n /** Ist SDK initialisiert? */\n isInitialized: boolean;\n\n /** Wird geladen? */\n isLoading: boolean;\n\n /** Ist Banner sichtbar? */\n isBannerVisible: boolean;\n\n /** Wird Consent benoetigt? */\n needsConsent: boolean;\n\n /** Consent fuer Kategorie pruefen */\n hasConsent: (category: ConsentCategory) => boolean;\n\n /** Alle akzeptieren */\n acceptAll: () => Promise;\n\n /** Alle ablehnen */\n rejectAll: () => Promise;\n\n /** Auswahl speichern */\n saveSelection: (categories: Partial) => Promise;\n\n /** Banner anzeigen */\n showBanner: () => void;\n\n /** Banner verstecken */\n hideBanner: () => void;\n\n /** Einstellungen oeffnen */\n showSettings: () => void;\n}\n\nconst ConsentContext = createContext(null);\n\n// =============================================================================\n// Provider\n// =============================================================================\n\ninterface ConsentProviderProps {\n /** SDK-Konfiguration */\n config: ConsentConfig;\n\n /** Kinder-Komponenten */\n children: ReactNode;\n}\n\n/**\n * ConsentProvider - Stellt Consent-Kontext bereit\n */\nexport const ConsentProvider: FC = ({\n config,\n children,\n}) => {\n const [manager, setManager] = useState(null);\n const [consent, setConsent] = useState(null);\n const [isInitialized, setIsInitialized] = useState(false);\n const [isLoading, setIsLoading] = useState(true);\n const [isBannerVisible, setIsBannerVisible] = useState(false);\n\n // Manager erstellen und initialisieren\n useEffect(() => {\n const consentManager = new ConsentManager(config);\n setManager(consentManager);\n\n // Events abonnieren\n const unsubChange = consentManager.on('change', (newConsent) => {\n setConsent(newConsent);\n });\n\n const unsubBannerShow = consentManager.on('banner_show', () => {\n setIsBannerVisible(true);\n });\n\n const unsubBannerHide = consentManager.on('banner_hide', () => {\n setIsBannerVisible(false);\n });\n\n // Initialisieren\n consentManager\n .init()\n .then(() => {\n setConsent(consentManager.getConsent());\n setIsInitialized(true);\n setIsLoading(false);\n setIsBannerVisible(consentManager.isBannerVisible());\n })\n .catch((error) => {\n console.error('Failed to initialize ConsentManager:', error);\n setIsLoading(false);\n });\n\n // Cleanup\n return () => {\n unsubChange();\n unsubBannerShow();\n unsubBannerHide();\n };\n }, [config]);\n\n // Callback-Funktionen\n const hasConsent = useCallback(\n (category: ConsentCategory): boolean => {\n return manager?.hasConsent(category) ?? category === 'essential';\n },\n [manager]\n );\n\n const acceptAll = useCallback(async () => {\n await manager?.acceptAll();\n }, [manager]);\n\n const rejectAll = useCallback(async () => {\n await manager?.rejectAll();\n }, [manager]);\n\n const saveSelection = useCallback(\n async (categories: Partial) => {\n await manager?.setConsent(categories);\n manager?.hideBanner();\n },\n [manager]\n );\n\n const showBanner = useCallback(() => {\n manager?.showBanner();\n }, [manager]);\n\n const hideBanner = useCallback(() => {\n manager?.hideBanner();\n }, [manager]);\n\n const showSettings = useCallback(() => {\n manager?.showSettings();\n }, [manager]);\n\n const needsConsent = useMemo(() => {\n return manager?.needsConsent() ?? true;\n }, [manager, consent]);\n\n // Context-Wert\n const contextValue = useMemo(\n () => ({\n manager,\n consent,\n isInitialized,\n isLoading,\n isBannerVisible,\n needsConsent,\n hasConsent,\n acceptAll,\n rejectAll,\n saveSelection,\n showBanner,\n hideBanner,\n showSettings,\n }),\n [\n manager,\n consent,\n isInitialized,\n isLoading,\n isBannerVisible,\n needsConsent,\n hasConsent,\n acceptAll,\n rejectAll,\n saveSelection,\n showBanner,\n hideBanner,\n showSettings,\n ]\n );\n\n return (\n \n {children}\n \n );\n};\n\n// =============================================================================\n// Hooks\n// =============================================================================\n\n/**\n * useConsent - Hook fuer Consent-Zugriff\n *\n * @example\n * ```tsx\n * const { hasConsent, acceptAll, rejectAll } = useConsent();\n *\n * if (hasConsent('analytics')) {\n * // Analytics laden\n * }\n * ```\n */\nexport function useConsent(): ConsentContextValue;\nexport function useConsent(\n category: ConsentCategory\n): ConsentContextValue & { allowed: boolean };\nexport function useConsent(category?: ConsentCategory) {\n const context = useContext(ConsentContext);\n\n if (!context) {\n throw new Error('useConsent must be used within a ConsentProvider');\n }\n\n if (category) {\n return {\n ...context,\n allowed: context.hasConsent(category),\n };\n }\n\n return context;\n}\n\n/**\n * useConsentManager - Direkter Zugriff auf ConsentManager\n */\nexport function useConsentManager(): ConsentManager | null {\n const context = useContext(ConsentContext);\n return context?.manager ?? null;\n}\n\n// =============================================================================\n// Components\n// =============================================================================\n\ninterface ConsentGateProps {\n /** Erforderliche Kategorie */\n category: ConsentCategory;\n\n /** Inhalt bei Consent */\n children: ReactNode;\n\n /** Inhalt ohne Consent */\n placeholder?: ReactNode;\n\n /** Fallback waehrend Laden */\n fallback?: ReactNode;\n}\n\n/**\n * ConsentGate - Zeigt Inhalt nur bei Consent\n *\n * @example\n * ```tsx\n * }\n * >\n * \n * \n * ```\n */\nexport const ConsentGate: FC = ({\n category,\n children,\n placeholder = null,\n fallback = null,\n}) => {\n const { hasConsent, isLoading } = useConsent();\n\n if (isLoading) {\n return <>{fallback};\n }\n\n if (!hasConsent(category)) {\n return <>{placeholder};\n }\n\n return <>{children};\n};\n\ninterface ConsentPlaceholderProps {\n /** Kategorie */\n category: ConsentCategory;\n\n /** Custom Nachricht */\n message?: string;\n\n /** Custom Button-Text */\n buttonText?: string;\n\n /** Custom Styling */\n className?: string;\n}\n\n/**\n * ConsentPlaceholder - Placeholder fuer blockierten Inhalt\n */\nexport const ConsentPlaceholder: FC = ({\n category,\n message,\n buttonText,\n className = '',\n}) => {\n const { showSettings } = useConsent();\n\n const categoryNames: Record = {\n essential: 'Essentielle Cookies',\n functional: 'Funktionale Cookies',\n analytics: 'Statistik-Cookies',\n marketing: 'Marketing-Cookies',\n social: 'Social Media-Cookies',\n };\n\n const defaultMessage = `Dieser Inhalt erfordert ${categoryNames[category]}.`;\n\n return (\n
\n

{message || defaultMessage}

\n \n
\n );\n};\n\n// =============================================================================\n// Banner Component (Headless)\n// =============================================================================\n\ninterface ConsentBannerRenderProps {\n /** Ist Banner sichtbar? */\n isVisible: boolean;\n\n /** Aktueller Consent */\n consent: ConsentState | null;\n\n /** Wird Consent benoetigt? */\n needsConsent: boolean;\n\n /** Alle akzeptieren */\n onAcceptAll: () => void;\n\n /** Alle ablehnen */\n onRejectAll: () => void;\n\n /** Auswahl speichern */\n onSaveSelection: (categories: Partial) => void;\n\n /** Einstellungen oeffnen */\n onShowSettings: () => void;\n\n /** Banner schliessen */\n onClose: () => void;\n}\n\ninterface ConsentBannerProps {\n /** Render-Funktion fuer Custom UI */\n render?: (props: ConsentBannerRenderProps) => ReactNode;\n\n /** Custom Styling */\n className?: string;\n}\n\n/**\n * ConsentBanner - Headless Banner-Komponente\n *\n * Kann mit eigener UI gerendert werden oder nutzt Default-UI.\n *\n * @example\n * ```tsx\n * // Mit eigener UI\n * (\n * isVisible && (\n *
\n * \n * \n *
\n * )\n * )}\n * />\n *\n * // Mit Default-UI\n * \n * ```\n */\nexport const ConsentBanner: FC = ({ render, className }) => {\n const {\n consent,\n isBannerVisible,\n needsConsent,\n acceptAll,\n rejectAll,\n saveSelection,\n showSettings,\n hideBanner,\n } = useConsent();\n\n const renderProps: ConsentBannerRenderProps = {\n isVisible: isBannerVisible,\n consent,\n needsConsent,\n onAcceptAll: acceptAll,\n onRejectAll: rejectAll,\n onSaveSelection: saveSelection,\n onShowSettings: showSettings,\n onClose: hideBanner,\n };\n\n // Custom Render\n if (render) {\n return <>{render(renderProps)};\n }\n\n // Default UI\n if (!isBannerVisible) {\n return null;\n }\n\n return (\n \n
\n

Datenschutzeinstellungen

\n

\n Wir nutzen Cookies und aehnliche Technologien, um Ihnen ein optimales\n Nutzererlebnis zu bieten.\n

\n\n
\n \n Alle ablehnen\n \n \n Einstellungen\n \n \n Alle akzeptieren\n \n
\n
\n \n );\n};\n\n// =============================================================================\n// Exports\n// =============================================================================\n\nexport { ConsentContext };\nexport type { ConsentContextValue, ConsentBannerRenderProps };\n","/**\n * ConsentStorage - Lokale Speicherung des Consent-Status\n *\n * Speichert Consent-Daten im localStorage mit HMAC-Signatur\n * zur Manipulationserkennung.\n */\n\nimport type { ConsentConfig, ConsentState } from '../types';\n\nconst STORAGE_KEY = 'bp_consent';\nconst STORAGE_VERSION = '1';\n\n/**\n * Gespeichertes Format\n */\ninterface StoredConsent {\n version: string;\n consent: ConsentState;\n signature: string;\n}\n\n/**\n * ConsentStorage - Persistente Speicherung\n */\nexport class ConsentStorage {\n private config: ConsentConfig;\n private storageKey: string;\n\n constructor(config: ConsentConfig) {\n this.config = config;\n // Pro Site ein separater Key\n this.storageKey = `${STORAGE_KEY}_${config.siteId}`;\n }\n\n /**\n * Consent laden\n */\n get(): ConsentState | null {\n if (typeof window === 'undefined') {\n return null;\n }\n\n try {\n const raw = localStorage.getItem(this.storageKey);\n if (!raw) {\n return null;\n }\n\n const stored: StoredConsent = JSON.parse(raw);\n\n // Version pruefen\n if (stored.version !== STORAGE_VERSION) {\n this.log('Storage version mismatch, clearing');\n this.clear();\n return null;\n }\n\n // Signatur pruefen\n if (!this.verifySignature(stored.consent, stored.signature)) {\n this.log('Invalid signature, clearing');\n this.clear();\n return null;\n }\n\n return stored.consent;\n } catch (error) {\n this.log('Failed to load consent:', error);\n return null;\n }\n }\n\n /**\n * Consent speichern\n */\n set(consent: ConsentState): void {\n if (typeof window === 'undefined') {\n return;\n }\n\n try {\n const signature = this.generateSignature(consent);\n\n const stored: StoredConsent = {\n version: STORAGE_VERSION,\n consent,\n signature,\n };\n\n localStorage.setItem(this.storageKey, JSON.stringify(stored));\n\n // Auch als Cookie setzen (fuer Server-Side Rendering)\n this.setCookie(consent);\n\n this.log('Consent saved to storage');\n } catch (error) {\n this.log('Failed to save consent:', error);\n }\n }\n\n /**\n * Consent loeschen\n */\n clear(): void {\n if (typeof window === 'undefined') {\n return;\n }\n\n try {\n localStorage.removeItem(this.storageKey);\n this.clearCookie();\n this.log('Consent cleared from storage');\n } catch (error) {\n this.log('Failed to clear consent:', error);\n }\n }\n\n /**\n * Pruefen ob Consent existiert\n */\n exists(): boolean {\n return this.get() !== null;\n }\n\n // ===========================================================================\n // Cookie Management\n // ===========================================================================\n\n /**\n * Consent als Cookie setzen\n */\n private setCookie(consent: ConsentState): void {\n const days = this.config.consent?.rememberDays ?? 365;\n const expires = new Date();\n expires.setDate(expires.getDate() + days);\n\n // Nur Kategorien als Cookie (fuer SSR)\n const cookieValue = JSON.stringify(consent.categories);\n const encoded = encodeURIComponent(cookieValue);\n\n document.cookie = [\n `${this.storageKey}=${encoded}`,\n `expires=${expires.toUTCString()}`,\n 'path=/',\n 'SameSite=Lax',\n location.protocol === 'https:' ? 'Secure' : '',\n ]\n .filter(Boolean)\n .join('; ');\n }\n\n /**\n * Cookie loeschen\n */\n private clearCookie(): void {\n document.cookie = `${this.storageKey}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;`;\n }\n\n // ===========================================================================\n // Signature (Simple HMAC-like)\n // ===========================================================================\n\n /**\n * Signatur generieren\n */\n private generateSignature(consent: ConsentState): string {\n const data = JSON.stringify(consent);\n const key = this.config.siteId;\n\n // Einfache Hash-Funktion (fuer Client-Side)\n // In Produktion wuerde man SubtleCrypto verwenden\n return this.simpleHash(data + key);\n }\n\n /**\n * Signatur verifizieren\n */\n private verifySignature(consent: ConsentState, signature: string): boolean {\n const expected = this.generateSignature(consent);\n return expected === signature;\n }\n\n /**\n * Einfache Hash-Funktion (djb2)\n */\n private simpleHash(str: string): string {\n let hash = 5381;\n for (let i = 0; i < str.length; i++) {\n hash = (hash * 33) ^ str.charCodeAt(i);\n }\n return (hash >>> 0).toString(16);\n }\n\n /**\n * Debug-Logging\n */\n private log(...args: unknown[]): void {\n if (this.config.debug) {\n console.log('[ConsentStorage]', ...args);\n }\n }\n}\n\nexport default ConsentStorage;\n","/**\n * ScriptBlocker - Blockiert Skripte bis Consent erteilt wird\n *\n * Verwendet das data-consent Attribut zur Identifikation von\n * Skripten, die erst nach Consent geladen werden duerfen.\n *\n * Beispiel:\n * \n */\n\nimport type { ConsentConfig, ConsentCategory } from '../types';\n\n/**\n * Script-Element mit Consent-Attributen\n */\ninterface ConsentScript extends HTMLScriptElement {\n dataset: DOMStringMap & {\n consent?: string;\n src?: string;\n };\n}\n\n/**\n * iFrame-Element mit Consent-Attributen\n */\ninterface ConsentIframe extends HTMLIFrameElement {\n dataset: DOMStringMap & {\n consent?: string;\n src?: string;\n };\n}\n\n/**\n * ScriptBlocker - Verwaltet Script-Blocking\n */\nexport class ScriptBlocker {\n private config: ConsentConfig;\n private observer: MutationObserver | null = null;\n private enabledCategories: Set = new Set(['essential']);\n private processedElements: WeakSet = new WeakSet();\n\n constructor(config: ConsentConfig) {\n this.config = config;\n }\n\n /**\n * Initialisieren und Observer starten\n */\n init(): void {\n if (typeof window === 'undefined') {\n return;\n }\n\n // Bestehende Elemente verarbeiten\n this.processExistingElements();\n\n // MutationObserver fuer neue Elemente\n this.observer = new MutationObserver((mutations) => {\n for (const mutation of mutations) {\n for (const node of mutation.addedNodes) {\n if (node.nodeType === Node.ELEMENT_NODE) {\n this.processElement(node as Element);\n }\n }\n }\n });\n\n this.observer.observe(document.documentElement, {\n childList: true,\n subtree: true,\n });\n\n this.log('ScriptBlocker initialized');\n }\n\n /**\n * Kategorie aktivieren\n */\n enableCategory(category: ConsentCategory): void {\n if (this.enabledCategories.has(category)) {\n return;\n }\n\n this.enabledCategories.add(category);\n this.log('Category enabled:', category);\n\n // Blockierte Elemente dieser Kategorie aktivieren\n this.activateCategory(category);\n }\n\n /**\n * Kategorie deaktivieren\n */\n disableCategory(category: ConsentCategory): void {\n if (category === 'essential') {\n // Essential kann nicht deaktiviert werden\n return;\n }\n\n this.enabledCategories.delete(category);\n this.log('Category disabled:', category);\n\n // Hinweis: Bereits geladene Skripte koennen nicht entladen werden\n // Page-Reload noetig fuer vollstaendige Deaktivierung\n }\n\n /**\n * Alle Kategorien blockieren (ausser Essential)\n */\n blockAll(): void {\n this.enabledCategories.clear();\n this.enabledCategories.add('essential');\n this.log('All categories blocked');\n }\n\n /**\n * Pruefen ob Kategorie aktiviert\n */\n isCategoryEnabled(category: ConsentCategory): boolean {\n return this.enabledCategories.has(category);\n }\n\n /**\n * Observer stoppen\n */\n destroy(): void {\n this.observer?.disconnect();\n this.observer = null;\n this.log('ScriptBlocker destroyed');\n }\n\n // ===========================================================================\n // Internal Methods\n // ===========================================================================\n\n /**\n * Bestehende Elemente verarbeiten\n */\n private processExistingElements(): void {\n // Scripts mit data-consent\n const scripts = document.querySelectorAll(\n 'script[data-consent]'\n );\n scripts.forEach((script) => this.processScript(script));\n\n // iFrames mit data-consent\n const iframes = document.querySelectorAll(\n 'iframe[data-consent]'\n );\n iframes.forEach((iframe) => this.processIframe(iframe));\n\n this.log(`Processed ${scripts.length} scripts, ${iframes.length} iframes`);\n }\n\n /**\n * Element verarbeiten\n */\n private processElement(element: Element): void {\n if (element.tagName === 'SCRIPT') {\n this.processScript(element as ConsentScript);\n } else if (element.tagName === 'IFRAME') {\n this.processIframe(element as ConsentIframe);\n }\n\n // Auch Kinder verarbeiten\n element\n .querySelectorAll('script[data-consent]')\n .forEach((script) => this.processScript(script));\n element\n .querySelectorAll('iframe[data-consent]')\n .forEach((iframe) => this.processIframe(iframe));\n }\n\n /**\n * Script-Element verarbeiten\n */\n private processScript(script: ConsentScript): void {\n if (this.processedElements.has(script)) {\n return;\n }\n\n const category = script.dataset.consent as ConsentCategory | undefined;\n if (!category) {\n return;\n }\n\n this.processedElements.add(script);\n\n if (this.enabledCategories.has(category)) {\n this.activateScript(script);\n } else {\n this.log(`Script blocked (${category}):`, script.dataset.src || 'inline');\n }\n }\n\n /**\n * iFrame-Element verarbeiten\n */\n private processIframe(iframe: ConsentIframe): void {\n if (this.processedElements.has(iframe)) {\n return;\n }\n\n const category = iframe.dataset.consent as ConsentCategory | undefined;\n if (!category) {\n return;\n }\n\n this.processedElements.add(iframe);\n\n if (this.enabledCategories.has(category)) {\n this.activateIframe(iframe);\n } else {\n this.log(`iFrame blocked (${category}):`, iframe.dataset.src);\n // Placeholder anzeigen\n this.showPlaceholder(iframe, category);\n }\n }\n\n /**\n * Script aktivieren\n */\n private activateScript(script: ConsentScript): void {\n const src = script.dataset.src;\n\n if (src) {\n // Externes Script: neues Element erstellen\n const newScript = document.createElement('script');\n\n // Attribute kopieren\n for (const attr of script.attributes) {\n if (attr.name !== 'type' && attr.name !== 'data-src') {\n newScript.setAttribute(attr.name, attr.value);\n }\n }\n\n newScript.src = src;\n newScript.removeAttribute('data-consent');\n\n // Altes Element ersetzen\n script.parentNode?.replaceChild(newScript, script);\n\n this.log('External script activated:', src);\n } else {\n // Inline-Script: type aendern\n const newScript = document.createElement('script');\n\n for (const attr of script.attributes) {\n if (attr.name !== 'type') {\n newScript.setAttribute(attr.name, attr.value);\n }\n }\n\n newScript.textContent = script.textContent;\n newScript.removeAttribute('data-consent');\n\n script.parentNode?.replaceChild(newScript, script);\n\n this.log('Inline script activated');\n }\n }\n\n /**\n * iFrame aktivieren\n */\n private activateIframe(iframe: ConsentIframe): void {\n const src = iframe.dataset.src;\n if (!src) {\n return;\n }\n\n // Placeholder entfernen falls vorhanden\n const placeholder = iframe.parentElement?.querySelector(\n '.bp-consent-placeholder'\n );\n placeholder?.remove();\n\n // src setzen\n iframe.src = src;\n iframe.removeAttribute('data-src');\n iframe.removeAttribute('data-consent');\n iframe.style.display = '';\n\n this.log('iFrame activated:', src);\n }\n\n /**\n * Placeholder fuer blockierten iFrame anzeigen\n */\n private showPlaceholder(iframe: ConsentIframe, category: ConsentCategory): void {\n // iFrame verstecken\n iframe.style.display = 'none';\n\n // Placeholder erstellen\n const placeholder = document.createElement('div');\n placeholder.className = 'bp-consent-placeholder';\n placeholder.setAttribute('data-category', category);\n placeholder.innerHTML = `\n \n `;\n\n // Click-Handler\n const btn = placeholder.querySelector('button');\n btn?.addEventListener('click', () => {\n // Event dispatchen damit ConsentManager reagieren kann\n window.dispatchEvent(\n new CustomEvent('bp-consent-request', {\n detail: { category },\n })\n );\n });\n\n // Nach iFrame einfuegen\n iframe.parentNode?.insertBefore(placeholder, iframe.nextSibling);\n }\n\n /**\n * Alle Elemente einer Kategorie aktivieren\n */\n private activateCategory(category: ConsentCategory): void {\n // Scripts\n const scripts = document.querySelectorAll(\n `script[data-consent=\"${category}\"]`\n );\n scripts.forEach((script) => this.activateScript(script));\n\n // iFrames\n const iframes = document.querySelectorAll(\n `iframe[data-consent=\"${category}\"]`\n );\n iframes.forEach((iframe) => this.activateIframe(iframe));\n\n this.log(\n `Activated ${scripts.length} scripts, ${iframes.length} iframes for ${category}`\n );\n }\n\n /**\n * Kategorie-Name fuer UI\n */\n private getCategoryName(category: ConsentCategory): string {\n const names: Record = {\n essential: 'Essentielle Cookies',\n functional: 'Funktionale Cookies',\n analytics: 'Statistik-Cookies',\n marketing: 'Marketing-Cookies',\n social: 'Social Media-Cookies',\n };\n return names[category] ?? category;\n }\n\n /**\n * Debug-Logging\n */\n private log(...args: unknown[]): void {\n if (this.config.debug) {\n console.log('[ScriptBlocker]', ...args);\n }\n }\n}\n\nexport default ScriptBlocker;\n","/**\n * ConsentAPI - Kommunikation mit dem Consent-Backend\n *\n * Sendet Consent-Entscheidungen an das Backend zur\n * revisionssicheren Speicherung.\n */\n\nimport type {\n ConsentConfig,\n ConsentState,\n ConsentAPIResponse,\n SiteConfigResponse,\n} from '../types';\n\n/**\n * Request-Payload fuer Consent-Speicherung\n */\ninterface SaveConsentRequest {\n siteId: string;\n userId?: string;\n deviceFingerprint: string;\n consent: ConsentState;\n metadata?: {\n userAgent?: string;\n language?: string;\n screenResolution?: string;\n platform?: string;\n appVersion?: string;\n };\n}\n\n/**\n * ConsentAPI - Backend-Kommunikation\n */\nexport class ConsentAPI {\n private config: ConsentConfig;\n private baseUrl: string;\n\n constructor(config: ConsentConfig) {\n this.config = config;\n this.baseUrl = config.apiEndpoint.replace(/\\/$/, '');\n }\n\n /**\n * Consent speichern\n */\n async saveConsent(request: SaveConsentRequest): Promise {\n const payload = {\n ...request,\n metadata: {\n userAgent: typeof navigator !== 'undefined' ? navigator.userAgent : '',\n language: typeof navigator !== 'undefined' ? navigator.language : '',\n screenResolution:\n typeof window !== 'undefined'\n ? `${window.screen.width}x${window.screen.height}`\n : '',\n platform: 'web',\n ...request.metadata,\n },\n };\n\n const response = await this.fetch('/consent', {\n method: 'POST',\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to save consent: ${response.status}`);\n }\n\n return response.json();\n }\n\n /**\n * Consent abrufen\n */\n async getConsent(\n siteId: string,\n deviceFingerprint: string\n ): Promise {\n const params = new URLSearchParams({\n siteId,\n deviceFingerprint,\n });\n\n const response = await this.fetch(`/consent?${params}`);\n\n if (response.status === 404) {\n return null;\n }\n\n if (!response.ok) {\n throw new Error(`Failed to get consent: ${response.status}`);\n }\n\n const data = await response.json();\n return data.consent;\n }\n\n /**\n * Consent widerrufen\n */\n async revokeConsent(consentId: string): Promise {\n const response = await this.fetch(`/consent/${consentId}`, {\n method: 'DELETE',\n });\n\n if (!response.ok) {\n throw new Error(`Failed to revoke consent: ${response.status}`);\n }\n }\n\n /**\n * Site-Konfiguration abrufen\n */\n async getSiteConfig(siteId: string): Promise {\n const response = await this.fetch(`/config/${siteId}`);\n\n if (!response.ok) {\n throw new Error(`Failed to get site config: ${response.status}`);\n }\n\n return response.json();\n }\n\n /**\n * Consent-Historie exportieren (DSGVO Art. 20)\n */\n async exportConsent(userId: string): Promise {\n const params = new URLSearchParams({ userId });\n const response = await this.fetch(`/consent/export?${params}`);\n\n if (!response.ok) {\n throw new Error(`Failed to export consent: ${response.status}`);\n }\n\n return response.json();\n }\n\n // ===========================================================================\n // Internal Methods\n // ===========================================================================\n\n /**\n * Fetch mit Standard-Headers\n */\n private async fetch(\n path: string,\n options: RequestInit = {}\n ): Promise {\n const url = `${this.baseUrl}${path}`;\n\n const headers: HeadersInit = {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n ...this.getSignatureHeaders(),\n ...(options.headers || {}),\n };\n\n try {\n const response = await fetch(url, {\n ...options,\n headers,\n credentials: 'include',\n });\n\n this.log(`${options.method || 'GET'} ${path}:`, response.status);\n return response;\n } catch (error) {\n this.log('Fetch error:', error);\n throw error;\n }\n }\n\n /**\n * Signatur-Headers generieren (HMAC)\n */\n private getSignatureHeaders(): Record {\n const timestamp = Math.floor(Date.now() / 1000).toString();\n\n // Einfache Signatur fuer Client-Side\n // In Produktion: Server-seitige Validierung mit echtem HMAC\n const signature = this.simpleHash(`${this.config.siteId}:${timestamp}`);\n\n return {\n 'X-Consent-Timestamp': timestamp,\n 'X-Consent-Signature': `sha256=${signature}`,\n };\n }\n\n /**\n * Einfache Hash-Funktion (djb2)\n */\n private simpleHash(str: string): string {\n let hash = 5381;\n for (let i = 0; i < str.length; i++) {\n hash = (hash * 33) ^ str.charCodeAt(i);\n }\n return (hash >>> 0).toString(16);\n }\n\n /**\n * Debug-Logging\n */\n private log(...args: unknown[]): void {\n if (this.config.debug) {\n console.log('[ConsentAPI]', ...args);\n }\n }\n}\n\nexport default ConsentAPI;\n","/**\n * EventEmitter - Typsicherer Event-Handler\n */\n\ntype EventCallback = (data: T) => void;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport class EventEmitter = Record> {\n private listeners: Map>> = new Map();\n\n /**\n * Event-Listener registrieren\n * @returns Unsubscribe-Funktion\n */\n on(\n event: K,\n callback: EventCallback\n ): () => void {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set());\n }\n\n this.listeners.get(event)!.add(callback as EventCallback);\n\n // Unsubscribe-Funktion zurueckgeben\n return () => this.off(event, callback);\n }\n\n /**\n * Event-Listener entfernen\n */\n off(\n event: K,\n callback: EventCallback\n ): void {\n this.listeners.get(event)?.delete(callback as EventCallback);\n }\n\n /**\n * Event emittieren\n */\n emit(event: K, data: Events[K]): void {\n this.listeners.get(event)?.forEach((callback) => {\n try {\n callback(data);\n } catch (error) {\n console.error(`Error in event handler for ${String(event)}:`, error);\n }\n });\n }\n\n /**\n * Einmaligen Listener registrieren\n */\n once(\n event: K,\n callback: EventCallback\n ): () => void {\n const wrapper = (data: Events[K]) => {\n this.off(event, wrapper);\n callback(data);\n };\n\n return this.on(event, wrapper);\n }\n\n /**\n * Alle Listener entfernen\n */\n clear(): void {\n this.listeners.clear();\n }\n\n /**\n * Alle Listener fuer ein Event entfernen\n */\n clearEvent(event: K): void {\n this.listeners.delete(event);\n }\n\n /**\n * Anzahl Listener fuer ein Event\n */\n listenerCount(event: K): number {\n return this.listeners.get(event)?.size ?? 0;\n }\n}\n\nexport default EventEmitter;\n","/**\n * Device Fingerprinting - Datenschutzkonform\n *\n * Generiert einen anonymen Fingerprint OHNE:\n * - Canvas Fingerprinting\n * - WebGL Fingerprinting\n * - Audio Fingerprinting\n * - Hardware-spezifische IDs\n *\n * Verwendet nur:\n * - User Agent\n * - Sprache\n * - Bildschirmaufloesung\n * - Zeitzone\n * - Platform\n */\n\n/**\n * Fingerprint-Komponenten sammeln\n */\nfunction getComponents(): string[] {\n if (typeof window === 'undefined') {\n return ['server'];\n }\n\n const components: string[] = [];\n\n // User Agent (anonymisiert)\n try {\n // Nur Browser-Familie, nicht vollstaendiger UA\n const ua = navigator.userAgent;\n if (ua.includes('Chrome')) components.push('chrome');\n else if (ua.includes('Firefox')) components.push('firefox');\n else if (ua.includes('Safari')) components.push('safari');\n else if (ua.includes('Edge')) components.push('edge');\n else components.push('other');\n } catch {\n components.push('unknown-browser');\n }\n\n // Sprache\n try {\n components.push(navigator.language || 'unknown-lang');\n } catch {\n components.push('unknown-lang');\n }\n\n // Bildschirm-Kategorie (nicht exakte Aufloesung)\n try {\n const width = window.screen.width;\n if (width >= 2560) components.push('4k');\n else if (width >= 1920) components.push('fhd');\n else if (width >= 1366) components.push('hd');\n else if (width >= 768) components.push('tablet');\n else components.push('mobile');\n } catch {\n components.push('unknown-screen');\n }\n\n // Farbtiefe (grob)\n try {\n const depth = window.screen.colorDepth;\n if (depth >= 24) components.push('deep-color');\n else components.push('standard-color');\n } catch {\n components.push('unknown-color');\n }\n\n // Zeitzone (nur Offset, nicht Name)\n try {\n const offset = new Date().getTimezoneOffset();\n const hours = Math.floor(Math.abs(offset) / 60);\n const sign = offset <= 0 ? '+' : '-';\n components.push(`tz${sign}${hours}`);\n } catch {\n components.push('unknown-tz');\n }\n\n // Platform-Kategorie\n try {\n const platform = navigator.platform?.toLowerCase() || '';\n if (platform.includes('mac')) components.push('mac');\n else if (platform.includes('win')) components.push('win');\n else if (platform.includes('linux')) components.push('linux');\n else if (platform.includes('iphone') || platform.includes('ipad'))\n components.push('ios');\n else if (platform.includes('android')) components.push('android');\n else components.push('other-platform');\n } catch {\n components.push('unknown-platform');\n }\n\n // Touch-Faehigkeit\n try {\n if ('ontouchstart' in window || navigator.maxTouchPoints > 0) {\n components.push('touch');\n } else {\n components.push('no-touch');\n }\n } catch {\n components.push('unknown-touch');\n }\n\n // Do Not Track (als Datenschutz-Signal)\n try {\n if (navigator.doNotTrack === '1') {\n components.push('dnt');\n }\n } catch {\n // Ignorieren\n }\n\n return components;\n}\n\n/**\n * SHA-256 Hash (async, nutzt SubtleCrypto)\n */\nasync function sha256(message: string): Promise {\n if (typeof window === 'undefined' || !window.crypto?.subtle) {\n // Fallback fuer Server/alte Browser\n return simpleHash(message);\n }\n\n try {\n const encoder = new TextEncoder();\n const data = encoder.encode(message);\n const hashBuffer = await crypto.subtle.digest('SHA-256', data);\n const hashArray = Array.from(new Uint8Array(hashBuffer));\n return hashArray.map((b) => b.toString(16).padStart(2, '0')).join('');\n } catch {\n return simpleHash(message);\n }\n}\n\n/**\n * Fallback Hash-Funktion (djb2)\n */\nfunction simpleHash(str: string): string {\n let hash = 5381;\n for (let i = 0; i < str.length; i++) {\n hash = (hash * 33) ^ str.charCodeAt(i);\n }\n return (hash >>> 0).toString(16).padStart(8, '0');\n}\n\n/**\n * Datenschutzkonformen Fingerprint generieren\n *\n * Der Fingerprint ist:\n * - Nicht eindeutig (viele Nutzer teilen sich denselben)\n * - Nicht persistent (aendert sich bei Browser-Updates)\n * - Nicht invasiv (keine Canvas/WebGL/Audio)\n * - Anonymisiert (SHA-256 Hash)\n */\nexport async function generateFingerprint(): Promise {\n const components = getComponents();\n const combined = components.join('|');\n const hash = await sha256(combined);\n\n // Prefix fuer Identifikation\n return `fp_${hash.substring(0, 32)}`;\n}\n\n/**\n * Synchrone Version (mit einfachem Hash)\n */\nexport function generateFingerprintSync(): string {\n const components = getComponents();\n const combined = components.join('|');\n const hash = simpleHash(combined);\n\n return `fp_${hash}`;\n}\n\nexport default generateFingerprint;\n","/**\n * SDK Version\n */\nexport const SDK_VERSION = '1.0.0';\n\nexport default SDK_VERSION;\n","/**\n * ConsentManager - Hauptklasse fuer das Consent Management\n *\n * DSGVO/TTDSG-konformes Consent Management fuer Web, PWA und Mobile.\n */\n\nimport type {\n ConsentConfig,\n ConsentState,\n ConsentCategory,\n ConsentCategories,\n ConsentInput,\n ConsentEventType,\n ConsentEventCallback,\n ConsentEventData,\n} from '../types';\nimport { ConsentStorage } from './ConsentStorage';\nimport { ScriptBlocker } from './ScriptBlocker';\nimport { ConsentAPI } from './ConsentAPI';\nimport { EventEmitter } from '../utils/EventEmitter';\nimport { generateFingerprint } from '../utils/fingerprint';\nimport { SDK_VERSION } from '../version';\n\n/**\n * Default-Konfiguration\n */\nconst DEFAULT_CONFIG: Partial = {\n language: 'de',\n fallbackLanguage: 'en',\n ui: {\n position: 'bottom',\n layout: 'modal',\n theme: 'auto',\n zIndex: 999999,\n blockScrollOnModal: true,\n },\n consent: {\n required: true,\n rejectAllVisible: true,\n acceptAllVisible: true,\n granularControl: true,\n vendorControl: false,\n rememberChoice: true,\n rememberDays: 365,\n geoTargeting: false,\n recheckAfterDays: 180,\n },\n categories: ['essential', 'functional', 'analytics', 'marketing', 'social'],\n debug: false,\n};\n\n/**\n * Default Consent-State (nur Essential aktiv)\n */\nconst DEFAULT_CONSENT: ConsentCategories = {\n essential: true,\n functional: false,\n analytics: false,\n marketing: false,\n social: false,\n};\n\n/**\n * ConsentManager - Zentrale Klasse fuer Consent-Verwaltung\n */\nexport class ConsentManager {\n private config: ConsentConfig;\n private storage: ConsentStorage;\n private scriptBlocker: ScriptBlocker;\n private api: ConsentAPI;\n private events: EventEmitter;\n private currentConsent: ConsentState | null = null;\n private initialized = false;\n private bannerVisible = false;\n private deviceFingerprint: string = '';\n\n constructor(config: ConsentConfig) {\n this.config = this.mergeConfig(config);\n this.storage = new ConsentStorage(this.config);\n this.scriptBlocker = new ScriptBlocker(this.config);\n this.api = new ConsentAPI(this.config);\n this.events = new EventEmitter();\n\n this.log('ConsentManager created with config:', this.config);\n }\n\n /**\n * SDK initialisieren\n */\n async init(): Promise {\n if (this.initialized) {\n this.log('Already initialized, skipping');\n return;\n }\n\n try {\n this.log('Initializing ConsentManager...');\n\n // Device Fingerprint generieren\n this.deviceFingerprint = await generateFingerprint();\n\n // Consent aus Storage laden\n this.currentConsent = this.storage.get();\n\n if (this.currentConsent) {\n this.log('Loaded consent from storage:', this.currentConsent);\n\n // Pruefen ob Consent abgelaufen\n if (this.isConsentExpired()) {\n this.log('Consent expired, clearing');\n this.storage.clear();\n this.currentConsent = null;\n } else {\n // Consent anwenden\n this.applyConsent();\n }\n }\n\n // Script-Blocker initialisieren\n this.scriptBlocker.init();\n\n this.initialized = true;\n this.emit('init', this.currentConsent);\n\n // Banner anzeigen falls noetig\n if (this.needsConsent()) {\n this.showBanner();\n }\n\n this.log('ConsentManager initialized successfully');\n } catch (error) {\n this.handleError(error as Error);\n throw error;\n }\n }\n\n // ===========================================================================\n // Public API\n // ===========================================================================\n\n /**\n * Pruefen ob Consent fuer Kategorie vorhanden\n */\n hasConsent(category: ConsentCategory): boolean {\n if (!this.currentConsent) {\n return category === 'essential';\n }\n return this.currentConsent.categories[category] ?? false;\n }\n\n /**\n * Pruefen ob Consent fuer Vendor vorhanden\n */\n hasVendorConsent(vendorId: string): boolean {\n if (!this.currentConsent) {\n return false;\n }\n return this.currentConsent.vendors[vendorId] ?? false;\n }\n\n /**\n * Aktuellen Consent-State abrufen\n */\n getConsent(): ConsentState | null {\n return this.currentConsent ? { ...this.currentConsent } : null;\n }\n\n /**\n * Consent setzen\n */\n async setConsent(input: ConsentInput): Promise {\n const categories = this.normalizeConsentInput(input);\n\n // Essential ist immer aktiv\n categories.essential = true;\n\n const newConsent: ConsentState = {\n categories,\n vendors: 'vendors' in input && input.vendors ? input.vendors : {},\n timestamp: new Date().toISOString(),\n version: SDK_VERSION,\n };\n\n try {\n // An Backend senden\n const response = await this.api.saveConsent({\n siteId: this.config.siteId,\n deviceFingerprint: this.deviceFingerprint,\n consent: newConsent,\n });\n\n newConsent.consentId = response.consentId;\n newConsent.expiresAt = response.expiresAt;\n\n // Lokal speichern\n this.storage.set(newConsent);\n this.currentConsent = newConsent;\n\n // Consent anwenden\n this.applyConsent();\n\n // Event emittieren\n this.emit('change', newConsent);\n this.config.onConsentChange?.(newConsent);\n\n this.log('Consent saved:', newConsent);\n } catch (error) {\n // Bei Netzwerkfehler trotzdem lokal speichern\n this.log('API error, saving locally:', error);\n this.storage.set(newConsent);\n this.currentConsent = newConsent;\n this.applyConsent();\n this.emit('change', newConsent);\n }\n }\n\n /**\n * Alle Kategorien akzeptieren\n */\n async acceptAll(): Promise {\n const allCategories: ConsentCategories = {\n essential: true,\n functional: true,\n analytics: true,\n marketing: true,\n social: true,\n };\n\n await this.setConsent(allCategories);\n this.emit('accept_all', this.currentConsent!);\n this.hideBanner();\n }\n\n /**\n * Alle nicht-essentiellen Kategorien ablehnen\n */\n async rejectAll(): Promise {\n const minimalCategories: ConsentCategories = {\n essential: true,\n functional: false,\n analytics: false,\n marketing: false,\n social: false,\n };\n\n await this.setConsent(minimalCategories);\n this.emit('reject_all', this.currentConsent!);\n this.hideBanner();\n }\n\n /**\n * Alle Einwilligungen widerrufen\n */\n async revokeAll(): Promise {\n if (this.currentConsent?.consentId) {\n try {\n await this.api.revokeConsent(this.currentConsent.consentId);\n } catch (error) {\n this.log('Failed to revoke on server:', error);\n }\n }\n\n this.storage.clear();\n this.currentConsent = null;\n this.scriptBlocker.blockAll();\n\n this.log('All consents revoked');\n }\n\n /**\n * Consent-Daten exportieren (DSGVO Art. 20)\n */\n async exportConsent(): Promise {\n const exportData = {\n currentConsent: this.currentConsent,\n exportedAt: new Date().toISOString(),\n siteId: this.config.siteId,\n deviceFingerprint: this.deviceFingerprint,\n };\n\n return JSON.stringify(exportData, null, 2);\n }\n\n // ===========================================================================\n // Banner Control\n // ===========================================================================\n\n /**\n * Pruefen ob Consent-Abfrage noetig\n */\n needsConsent(): boolean {\n if (!this.currentConsent) {\n return true;\n }\n\n if (this.isConsentExpired()) {\n return true;\n }\n\n // Recheck nach X Tagen\n if (this.config.consent?.recheckAfterDays) {\n const consentDate = new Date(this.currentConsent.timestamp);\n const recheckDate = new Date(consentDate);\n recheckDate.setDate(\n recheckDate.getDate() + this.config.consent.recheckAfterDays\n );\n\n if (new Date() > recheckDate) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * Banner anzeigen\n */\n showBanner(): void {\n if (this.bannerVisible) {\n return;\n }\n\n this.bannerVisible = true;\n this.emit('banner_show', undefined);\n this.config.onBannerShow?.();\n\n // Banner wird von UI-Komponente gerendert\n // Hier nur Status setzen\n this.log('Banner shown');\n }\n\n /**\n * Banner verstecken\n */\n hideBanner(): void {\n if (!this.bannerVisible) {\n return;\n }\n\n this.bannerVisible = false;\n this.emit('banner_hide', undefined);\n this.config.onBannerHide?.();\n\n this.log('Banner hidden');\n }\n\n /**\n * Einstellungs-Modal oeffnen\n */\n showSettings(): void {\n this.emit('settings_open', undefined);\n this.log('Settings opened');\n }\n\n /**\n * Pruefen ob Banner sichtbar\n */\n isBannerVisible(): boolean {\n return this.bannerVisible;\n }\n\n // ===========================================================================\n // Event Handling\n // ===========================================================================\n\n /**\n * Event-Listener registrieren\n */\n on(\n event: T,\n callback: ConsentEventCallback\n ): () => void {\n return this.events.on(event, callback);\n }\n\n /**\n * Event-Listener entfernen\n */\n off(\n event: T,\n callback: ConsentEventCallback\n ): void {\n this.events.off(event, callback);\n }\n\n // ===========================================================================\n // Internal Methods\n // ===========================================================================\n\n /**\n * Konfiguration zusammenfuehren\n */\n private mergeConfig(config: ConsentConfig): ConsentConfig {\n return {\n ...DEFAULT_CONFIG,\n ...config,\n ui: { ...DEFAULT_CONFIG.ui, ...config.ui },\n consent: { ...DEFAULT_CONFIG.consent, ...config.consent },\n } as ConsentConfig;\n }\n\n /**\n * Consent-Input normalisieren\n */\n private normalizeConsentInput(input: ConsentInput): ConsentCategories {\n if ('categories' in input && input.categories) {\n return { ...DEFAULT_CONSENT, ...input.categories };\n }\n\n return { ...DEFAULT_CONSENT, ...(input as Partial) };\n }\n\n /**\n * Consent anwenden (Skripte aktivieren/blockieren)\n */\n private applyConsent(): void {\n if (!this.currentConsent) {\n return;\n }\n\n for (const [category, allowed] of Object.entries(\n this.currentConsent.categories\n )) {\n if (allowed) {\n this.scriptBlocker.enableCategory(category as ConsentCategory);\n } else {\n this.scriptBlocker.disableCategory(category as ConsentCategory);\n }\n }\n\n // Google Consent Mode aktualisieren\n this.updateGoogleConsentMode();\n }\n\n /**\n * Google Consent Mode v2 aktualisieren\n */\n private updateGoogleConsentMode(): void {\n if (typeof window === 'undefined' || !this.currentConsent) {\n return;\n }\n\n const gtag = (window as unknown as { gtag?: (...args: unknown[]) => void }).gtag;\n if (typeof gtag !== 'function') {\n return;\n }\n\n const { categories } = this.currentConsent;\n\n gtag('consent', 'update', {\n ad_storage: categories.marketing ? 'granted' : 'denied',\n ad_user_data: categories.marketing ? 'granted' : 'denied',\n ad_personalization: categories.marketing ? 'granted' : 'denied',\n analytics_storage: categories.analytics ? 'granted' : 'denied',\n functionality_storage: categories.functional ? 'granted' : 'denied',\n personalization_storage: categories.functional ? 'granted' : 'denied',\n security_storage: 'granted',\n });\n\n this.log('Google Consent Mode updated');\n }\n\n /**\n * Pruefen ob Consent abgelaufen\n */\n private isConsentExpired(): boolean {\n if (!this.currentConsent?.expiresAt) {\n // Fallback: Nach rememberDays ablaufen\n if (this.currentConsent?.timestamp && this.config.consent?.rememberDays) {\n const consentDate = new Date(this.currentConsent.timestamp);\n const expiryDate = new Date(consentDate);\n expiryDate.setDate(\n expiryDate.getDate() + this.config.consent.rememberDays\n );\n return new Date() > expiryDate;\n }\n return false;\n }\n\n return new Date() > new Date(this.currentConsent.expiresAt);\n }\n\n /**\n * Event emittieren\n */\n private emit(\n event: T,\n data: ConsentEventData[T]\n ): void {\n this.events.emit(event, data);\n }\n\n /**\n * Fehler behandeln\n */\n private handleError(error: Error): void {\n this.log('Error:', error);\n this.emit('error', error);\n this.config.onError?.(error);\n }\n\n /**\n * Debug-Logging\n */\n private log(...args: unknown[]): void {\n if (this.config.debug) {\n console.log('[ConsentSDK]', ...args);\n }\n }\n\n // ===========================================================================\n // Static Methods\n // ===========================================================================\n\n /**\n * SDK-Version abrufen\n */\n static getVersion(): string {\n return SDK_VERSION;\n }\n}\n\n// Default-Export\nexport default ConsentManager;\n"],"mappings":"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","names":[]}