Docker Compose with 24+ services: - PostgreSQL (PostGIS), Valkey, MinIO, Qdrant - Vault (PKI/TLS), Nginx (Reverse Proxy) - Backend Core API, Consent Service, Billing Service - RAG Service, Embedding Service - Gitea, Woodpecker CI/CD - Night Scheduler, Health Aggregator - Jitsi (Web/XMPP/JVB/Jicofo), Mailpit Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 line
75 KiB
Plaintext
1 line
75 KiB
Plaintext
{"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 * <ConsentProvider config={config}>\n * <ConsentBanner />\n * <MainContent />\n * </ConsentProvider>\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<void>;\n\n /** Alle ablehnen */\n rejectAll: () => Promise<void>;\n\n /** Auswahl speichern */\n saveSelection: (categories: Partial<ConsentCategories>) => Promise<void>;\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<ConsentContextValue | null>(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<ConsentProviderProps> = ({\n config,\n children,\n}) => {\n const [manager, setManager] = useState<ConsentManager | null>(null);\n const [consent, setConsent] = useState<ConsentState | null>(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<ConsentCategories>) => {\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<ConsentContextValue>(\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 <ConsentContext.Provider value={contextValue}>\n {children}\n </ConsentContext.Provider>\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 * <ConsentGate\n * category=\"analytics\"\n * placeholder={<ConsentPlaceholder category=\"analytics\" />}\n * >\n * <GoogleAnalytics />\n * </ConsentGate>\n * ```\n */\nexport const ConsentGate: FC<ConsentGateProps> = ({\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<ConsentPlaceholderProps> = ({\n category,\n message,\n buttonText,\n className = '',\n}) => {\n const { showSettings } = useConsent();\n\n const categoryNames: Record<ConsentCategory, string> = {\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 <div className={`bp-consent-placeholder ${className}`}>\n <p>{message || defaultMessage}</p>\n <button type=\"button\" onClick={showSettings}>\n {buttonText || 'Cookie-Einstellungen oeffnen'}\n </button>\n </div>\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<ConsentCategories>) => 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 * <ConsentBanner\n * render={({ isVisible, onAcceptAll, onRejectAll }) => (\n * isVisible && (\n * <div className=\"my-banner\">\n * <button onClick={onAcceptAll}>Accept</button>\n * <button onClick={onRejectAll}>Reject</button>\n * </div>\n * )\n * )}\n * />\n *\n * // Mit Default-UI\n * <ConsentBanner />\n * ```\n */\nexport const ConsentBanner: FC<ConsentBannerProps> = ({ 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 <div\n className={`bp-consent-banner ${className || ''}`}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Cookie-Einstellungen\"\n >\n <div className=\"bp-consent-banner-content\">\n <h2>Datenschutzeinstellungen</h2>\n <p>\n Wir nutzen Cookies und aehnliche Technologien, um Ihnen ein optimales\n Nutzererlebnis zu bieten.\n </p>\n\n <div className=\"bp-consent-banner-actions\">\n <button\n type=\"button\"\n className=\"bp-consent-btn bp-consent-btn-reject\"\n onClick={rejectAll}\n >\n Alle ablehnen\n </button>\n <button\n type=\"button\"\n className=\"bp-consent-btn bp-consent-btn-settings\"\n onClick={showSettings}\n >\n Einstellungen\n </button>\n <button\n type=\"button\"\n className=\"bp-consent-btn bp-consent-btn-accept\"\n onClick={acceptAll}\n >\n Alle akzeptieren\n </button>\n </div>\n </div>\n </div>\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 * <script data-consent=\"analytics\" data-src=\"...\" type=\"text/plain\"></script>\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<ConsentCategory> = new Set(['essential']);\n private processedElements: WeakSet<Element> = 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<ConsentScript>(\n 'script[data-consent]'\n );\n scripts.forEach((script) => this.processScript(script));\n\n // iFrames mit data-consent\n const iframes = document.querySelectorAll<ConsentIframe>(\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<ConsentScript>('script[data-consent]')\n .forEach((script) => this.processScript(script));\n element\n .querySelectorAll<ConsentIframe>('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 <div class=\"bp-consent-placeholder-content\">\n <p>Dieser Inhalt erfordert Ihre Zustimmung.</p>\n <button type=\"button\" class=\"bp-consent-placeholder-btn\">\n ${this.getCategoryName(category)} aktivieren\n </button>\n </div>\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<ConsentScript>(\n `script[data-consent=\"${category}\"]`\n );\n scripts.forEach((script) => this.activateScript(script));\n\n // iFrames\n const iframes = document.querySelectorAll<ConsentIframe>(\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<ConsentCategory, string> = {\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<ConsentAPIResponse> {\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<ConsentState | null> {\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<void> {\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<SiteConfigResponse> {\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<unknown> {\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<Response> {\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<string, string> {\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<T = unknown> = (data: T) => void;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport class EventEmitter<Events extends Record<string, any> = Record<string, unknown>> {\n private listeners: Map<keyof Events, Set<EventCallback<unknown>>> = new Map();\n\n /**\n * Event-Listener registrieren\n * @returns Unsubscribe-Funktion\n */\n on<K extends keyof Events>(\n event: K,\n callback: EventCallback<Events[K]>\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<unknown>);\n\n // Unsubscribe-Funktion zurueckgeben\n return () => this.off(event, callback);\n }\n\n /**\n * Event-Listener entfernen\n */\n off<K extends keyof Events>(\n event: K,\n callback: EventCallback<Events[K]>\n ): void {\n this.listeners.get(event)?.delete(callback as EventCallback<unknown>);\n }\n\n /**\n * Event emittieren\n */\n emit<K extends keyof Events>(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<K extends keyof Events>(\n event: K,\n callback: EventCallback<Events[K]>\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<K extends keyof Events>(event: K): void {\n this.listeners.delete(event);\n }\n\n /**\n * Anzahl Listener fuer ein Event\n */\n listenerCount<K extends keyof Events>(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<string> {\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<string> {\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<ConsentConfig> = {\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<ConsentEventData>;\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<void> {\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<void> {\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<void> {\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<void> {\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<void> {\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<string> {\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<T extends ConsentEventType>(\n event: T,\n callback: ConsentEventCallback<ConsentEventData[T]>\n ): () => void {\n return this.events.on(event, callback);\n }\n\n /**\n * Event-Listener entfernen\n */\n off<T extends ConsentEventType>(\n event: T,\n callback: ConsentEventCallback<ConsentEventData[T]>\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<ConsentCategories>) };\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<T extends ConsentEventType>(\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":[]} |