@weldsuite/helpdesk-widget-sdk 1.0.13 → 1.0.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.js","sources":["../../src/types/config.ts","../../src/utils/logger.ts","../../src/core/IframeManager.ts","../../src/types/messages.ts","../../src/utils/security.ts","../../src/core/MessageBroker.ts","../../src/types/state.ts","../../src/utils/validation.ts","../../src/core/StateCoordinator.ts","../../src/core/WeldSDK.ts"],"sourcesContent":["/**\r\n * Weld SDK - Configuration Types\r\n * Type definitions for SDK initialization and configuration\r\n */\r\n\r\n/**\r\n * Event types for widget events\r\n */\r\nexport type WidgetEventType = 'ready' | 'open' | 'close' | 'error' | 'message' | 'minimize' | 'maximize' | 'destroy';\r\n\r\n/**\r\n * Widget event structure\r\n */\r\nexport interface WidgetEvent {\r\n type: WidgetEventType;\r\n data?: any;\r\n timestamp: number;\r\n}\r\n\r\n/**\r\n * Event handler function type\r\n */\r\nexport type WidgetEventHandler = (event?: WidgetEvent | any) => void;\r\n\r\n/**\r\n * Position configuration\r\n */\r\nexport interface PositionConfig {\r\n bottom?: string;\r\n right?: string;\r\n left?: string;\r\n top?: string;\r\n}\r\n\r\n/**\r\n * Customization configuration\r\n */\r\nexport interface CustomizationConfig {\r\n primaryColor?: string;\r\n accentColor?: string;\r\n backgroundColor?: string;\r\n textColor?: string;\r\n fontFamily?: string;\r\n fontSize?: string;\r\n borderRadius?: string;\r\n}\r\n\r\n/**\r\n * Feature flags\r\n */\r\nexport interface FeatureConfig {\r\n attachments?: boolean;\r\n reactions?: boolean;\r\n typing?: boolean;\r\n readReceipts?: boolean;\r\n offlineMode?: boolean;\r\n fileUpload?: boolean;\r\n imageUpload?: boolean;\r\n voiceMessages?: boolean;\r\n videoMessages?: boolean;\r\n}\r\n\r\n/**\r\n * Mobile configuration\r\n */\r\nexport interface MobileConfig {\r\n fullScreen?: boolean;\r\n scrollLock?: boolean;\r\n keyboardHandling?: 'auto' | 'manual';\r\n safeAreaInsets?: boolean;\r\n}\r\n\r\n/**\r\n * Iframe configuration\r\n */\r\nexport interface IframeConfig {\r\n launcher: {\r\n url: string;\r\n name: string;\r\n position: PositionConfig;\r\n size: string;\r\n };\r\n widget: {\r\n url: string;\r\n name: string;\r\n position: PositionConfig;\r\n width: string;\r\n height: string;\r\n };\r\n backdrop?: {\r\n enabled: boolean;\r\n closeOnClick: boolean;\r\n };\r\n}\r\n\r\n/**\r\n * API configuration\r\n */\r\nexport interface ApiConfig {\r\n baseUrl: string;\r\n widgetId: string;\r\n endpoints?: {\r\n messages?: string;\r\n users?: string;\r\n conversations?: string;\r\n upload?: string;\r\n };\r\n timeout?: number;\r\n retries?: number;\r\n}\r\n\r\n/**\r\n * Authentication configuration\r\n */\r\nexport interface AuthConfig {\r\n enabled?: boolean;\r\n mode?: 'anonymous' | 'identified';\r\n userId?: string;\r\n email?: string;\r\n name?: string;\r\n avatar?: string;\r\n metadata?: Record<string, any>;\r\n token?: string;\r\n}\r\n\r\n/**\r\n * Locale configuration\r\n */\r\nexport interface LocaleConfig {\r\n locale?: string;\r\n translations?: Record<string, Record<string, string>>;\r\n dateFormat?: string;\r\n timeFormat?: string;\r\n timezone?: string;\r\n}\r\n\r\n/**\r\n * Logging configuration\r\n */\r\nexport interface LogConfig {\r\n enabled?: boolean;\r\n level?: 'debug' | 'info' | 'warn' | 'error';\r\n prefix?: string;\r\n includeTimestamp?: boolean;\r\n}\r\n\r\n/**\r\n * Performance configuration\r\n */\r\nexport interface PerformanceConfig {\r\n lazyLoad?: boolean;\r\n preload?: boolean;\r\n caching?: boolean;\r\n prefetch?: boolean;\r\n}\r\n\r\n/**\r\n * Security configuration\r\n */\r\nexport interface SecurityConfig {\r\n allowedOrigins?: string[];\r\n validateMessages?: boolean;\r\n sanitizeInput?: boolean;\r\n contentSecurityPolicy?: string;\r\n}\r\n\r\n/**\r\n * Main SDK configuration\r\n */\r\nexport interface WeldConfig {\r\n // Required\r\n widgetId: string;\r\n\r\n // Optional\r\n api?: Partial<ApiConfig>;\r\n iframes?: Partial<IframeConfig>;\r\n position?: {\r\n launcher?: PositionConfig;\r\n widget?: PositionConfig;\r\n };\r\n customization?: CustomizationConfig;\r\n features?: FeatureConfig;\r\n mobile?: MobileConfig;\r\n auth?: AuthConfig;\r\n locale?: LocaleConfig;\r\n logging?: LogConfig;\r\n performance?: PerformanceConfig;\r\n security?: SecurityConfig;\r\n\r\n // Callbacks\r\n onReady?: () => void;\r\n onError?: (error: Error) => void;\r\n onOpen?: () => void;\r\n onClose?: () => void;\r\n onMessage?: (message: any) => void;\r\n onMinimize?: () => void;\r\n onMaximize?: () => void;\r\n onDestroy?: () => void;\r\n}\r\n\r\n/**\r\n * Runtime configuration (resolved from WeldConfig)\r\n */\r\nexport interface ResolvedConfig {\r\n widgetId: string;\r\n api: ApiConfig;\r\n iframes: IframeConfig;\r\n customization: CustomizationConfig;\r\n features: FeatureConfig;\r\n mobile: MobileConfig;\r\n auth: AuthConfig;\r\n locale: LocaleConfig;\r\n logging: LogConfig;\r\n performance: PerformanceConfig;\r\n security: SecurityConfig;\r\n // Callbacks (passed through from WeldConfig)\r\n onReady?: () => void;\r\n onError?: (error: Error) => void;\r\n onOpen?: () => void;\r\n onClose?: () => void;\r\n onMessage?: (message: any) => void;\r\n onMinimize?: () => void;\r\n onMaximize?: () => void;\r\n onDestroy?: () => void;\r\n}\r\n\r\n/**\r\n * Device detection\r\n */\r\nexport type DeviceType = 'mobile' | 'tablet' | 'desktop';\r\n\r\nexport interface DeviceInfo {\r\n type: DeviceType;\r\n isMobile: boolean;\r\n isTablet: boolean;\r\n isDesktop: boolean;\r\n isTouchDevice: boolean;\r\n screenWidth: number;\r\n screenHeight: number;\r\n orientation: 'portrait' | 'landscape';\r\n userAgent: string;\r\n}\r\n\r\n/**\r\n * Default configuration values\r\n */\r\nexport const DEFAULT_CONFIG: Omit<ResolvedConfig, 'widgetId'> = {\r\n api: {\r\n baseUrl: 'https://widget.weldsuite.org',\r\n widgetId: '',\r\n timeout: 30000,\r\n retries: 3,\r\n },\r\n iframes: {\r\n launcher: {\r\n url: '?mode=launcher',\r\n name: 'weld-launcher-frame',\r\n position: { bottom: '24px', right: '24px' },\r\n size: '60px',\r\n },\r\n widget: {\r\n url: '?mode=widget',\r\n name: 'weld-widget-frame',\r\n position: { bottom: '100px', right: '24px' },\r\n width: '400px',\r\n height: 'min(680px, calc(100vh - 120px))',\r\n },\r\n backdrop: {\r\n enabled: true,\r\n closeOnClick: true,\r\n },\r\n },\r\n customization: {\r\n primaryColor: '#000000',\r\n accentColor: '#3b82f6',\r\n backgroundColor: '#ffffff',\r\n textColor: '#111827',\r\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\r\n fontSize: '14px',\r\n borderRadius: '12px',\r\n },\r\n features: {\r\n attachments: true,\r\n reactions: true,\r\n typing: true,\r\n readReceipts: true,\r\n offlineMode: false,\r\n fileUpload: true,\r\n imageUpload: true,\r\n voiceMessages: false,\r\n videoMessages: false,\r\n },\r\n mobile: {\r\n fullScreen: true,\r\n scrollLock: true,\r\n keyboardHandling: 'auto',\r\n safeAreaInsets: true,\r\n },\r\n auth: {\r\n enabled: true,\r\n mode: 'anonymous',\r\n },\r\n locale: {\r\n locale: 'en',\r\n dateFormat: 'MMM dd, yyyy',\r\n timeFormat: 'HH:mm',\r\n },\r\n logging: {\r\n enabled: true,\r\n level: 'warn',\r\n prefix: '[Weld]',\r\n includeTimestamp: true,\r\n },\r\n performance: {\r\n lazyLoad: true,\r\n preload: false,\r\n caching: true,\r\n prefetch: false,\r\n },\r\n security: {\r\n allowedOrigins: [],\r\n validateMessages: true,\r\n sanitizeInput: true,\r\n },\r\n};\r\n\r\n/**\r\n * Configuration validation\r\n */\r\nexport function validateConfig(config: Partial<WeldConfig>): boolean {\r\n if (!config.widgetId || typeof config.widgetId !== 'string') {\r\n throw new Error('WeldConfig: widgetId is required and must be a string');\r\n }\r\n\r\n return true;\r\n}\r\n\r\n/**\r\n * Merge configuration with defaults\r\n */\r\nexport function resolveConfig(config: WeldConfig): ResolvedConfig {\r\n validateConfig(config);\r\n\r\n return {\r\n widgetId: config.widgetId,\r\n api: {\r\n ...DEFAULT_CONFIG.api,\r\n widgetId: config.widgetId,\r\n ...config.api,\r\n },\r\n iframes: {\r\n launcher: {\r\n ...DEFAULT_CONFIG.iframes.launcher,\r\n ...config.iframes?.launcher,\r\n position: {\r\n ...DEFAULT_CONFIG.iframes.launcher.position,\r\n ...config.position?.launcher,\r\n ...config.iframes?.launcher?.position,\r\n },\r\n },\r\n widget: {\r\n ...DEFAULT_CONFIG.iframes.widget,\r\n ...config.iframes?.widget,\r\n position: {\r\n ...DEFAULT_CONFIG.iframes.widget.position,\r\n ...config.position?.widget,\r\n ...config.iframes?.widget?.position,\r\n },\r\n },\r\n backdrop: {\r\n ...DEFAULT_CONFIG.iframes.backdrop!,\r\n ...config.iframes?.backdrop,\r\n },\r\n },\r\n customization: {\r\n ...DEFAULT_CONFIG.customization,\r\n ...config.customization,\r\n },\r\n features: {\r\n ...DEFAULT_CONFIG.features,\r\n ...config.features,\r\n },\r\n mobile: {\r\n ...DEFAULT_CONFIG.mobile,\r\n ...config.mobile,\r\n },\r\n auth: {\r\n ...DEFAULT_CONFIG.auth,\r\n ...config.auth,\r\n },\r\n locale: {\r\n ...DEFAULT_CONFIG.locale,\r\n ...config.locale,\r\n },\r\n logging: {\r\n ...DEFAULT_CONFIG.logging,\r\n ...config.logging,\r\n },\r\n performance: {\r\n ...DEFAULT_CONFIG.performance,\r\n ...config.performance,\r\n },\r\n security: {\r\n ...DEFAULT_CONFIG.security,\r\n ...config.security,\r\n },\r\n // Pass through callbacks\r\n onReady: config.onReady,\r\n onError: config.onError,\r\n onOpen: config.onOpen,\r\n onClose: config.onClose,\r\n onMessage: config.onMessage,\r\n onMinimize: config.onMinimize,\r\n onMaximize: config.onMaximize,\r\n onDestroy: config.onDestroy,\r\n };\r\n}\r\n","/**\r\n * Weld SDK - Logger Utility\r\n * Centralized logging with configurable levels and formatting\r\n */\r\n\r\nimport type { LogConfig } from '../types/config';\r\n\r\n/**\r\n * Log levels\r\n */\r\nexport enum LogLevel {\r\n DEBUG = 0,\r\n INFO = 1,\r\n WARN = 2,\r\n ERROR = 3,\r\n SILENT = 4,\r\n}\r\n\r\n/**\r\n * Logger class\r\n */\r\nexport class Logger {\r\n private config: LogConfig;\r\n private level: LogLevel;\r\n\r\n constructor(config: LogConfig) {\r\n this.config = {\r\n enabled: true,\r\n level: 'warn',\r\n prefix: '[Weld]',\r\n includeTimestamp: true,\r\n ...config,\r\n };\r\n\r\n this.level = this.getLevelFromString(this.config.level!);\r\n }\r\n\r\n /**\r\n * Convert string level to LogLevel enum\r\n */\r\n private getLevelFromString(level: string): LogLevel {\r\n switch (level.toLowerCase()) {\r\n case 'debug':\r\n return LogLevel.DEBUG;\r\n case 'info':\r\n return LogLevel.INFO;\r\n case 'warn':\r\n return LogLevel.WARN;\r\n case 'error':\r\n return LogLevel.ERROR;\r\n default:\r\n return LogLevel.WARN;\r\n }\r\n }\r\n\r\n /**\r\n * Check if logging is enabled for level\r\n */\r\n private shouldLog(level: LogLevel): boolean {\r\n return (this.config.enabled ?? true) && level >= this.level;\r\n }\r\n\r\n /**\r\n * Format log message\r\n */\r\n private format(level: string, message: string, _data?: any): string[] {\r\n const parts: string[] = [];\r\n\r\n if (this.config.prefix) {\r\n parts.push(this.config.prefix);\r\n }\r\n\r\n if (this.config.includeTimestamp) {\r\n const timestamp = new Date().toISOString();\r\n parts.push(`[${timestamp}]`);\r\n }\r\n\r\n parts.push(`[${level.toUpperCase()}]`);\r\n parts.push(message);\r\n\r\n return parts;\r\n }\r\n\r\n /**\r\n * Log debug message\r\n */\r\n public debug(message: string, data?: any): void {\r\n if (!this.shouldLog(LogLevel.DEBUG)) return;\r\n\r\n const formatted = this.format('debug', message, data);\r\n if (data !== undefined) {\r\n console.debug(...formatted, data);\r\n } else {\r\n console.debug(...formatted);\r\n }\r\n }\r\n\r\n /**\r\n * Log info message\r\n */\r\n public info(message: string, data?: any): void {\r\n if (!this.shouldLog(LogLevel.INFO)) return;\r\n\r\n const formatted = this.format('info', message, data);\r\n if (data !== undefined) {\r\n console.info(...formatted, data);\r\n } else {\r\n console.info(...formatted);\r\n }\r\n }\r\n\r\n /**\r\n * Log warning message\r\n */\r\n public warn(message: string, data?: any): void {\r\n if (!this.shouldLog(LogLevel.WARN)) return;\r\n\r\n const formatted = this.format('warn', message, data);\r\n if (data !== undefined) {\r\n console.warn(...formatted, data);\r\n } else {\r\n console.warn(...formatted);\r\n }\r\n }\r\n\r\n /**\r\n * Log error message\r\n */\r\n public error(message: string, error?: Error | any): void {\r\n if (!this.shouldLog(LogLevel.ERROR)) return;\r\n\r\n const formatted = this.format('error', message);\r\n if (error !== undefined) {\r\n if (error instanceof Error) {\r\n console.error(...formatted, error.message, error.stack);\r\n } else {\r\n console.error(...formatted, error);\r\n }\r\n } else {\r\n console.error(...formatted);\r\n }\r\n }\r\n\r\n /**\r\n * Create child logger with prefix\r\n */\r\n public child(prefix: string): Logger {\r\n return new Logger({\r\n ...this.config,\r\n prefix: `${this.config.prefix} ${prefix}`,\r\n });\r\n }\r\n\r\n /**\r\n * Update log level at runtime\r\n */\r\n public setLevel(level: 'debug' | 'info' | 'warn' | 'error'): void {\r\n this.config.level = level;\r\n this.level = this.getLevelFromString(level);\r\n }\r\n\r\n /**\r\n * Enable/disable logging\r\n */\r\n public setEnabled(enabled: boolean): void {\r\n this.config.enabled = enabled;\r\n }\r\n}\r\n\r\n/**\r\n * Default logger instance\r\n */\r\nexport const defaultLogger = new Logger({\r\n enabled: true,\r\n level: 'warn',\r\n prefix: '[Weld]',\r\n includeTimestamp: true,\r\n});\r\n","/**\r\n * Weld SDK - Iframe Manager\r\n * Manages creation, lifecycle, and communication with multiple iframes\r\n */\r\n\r\nimport type { ResolvedConfig, DeviceInfo } from '../types/config';\r\nimport { Logger } from '../utils/logger';\r\n\r\n/**\r\n * Iframe types\r\n */\r\nexport enum IframeType {\r\n LAUNCHER = 'launcher',\r\n WIDGET = 'widget',\r\n BACKDROP = 'backdrop',\r\n}\r\n\r\n/**\r\n * Iframe metadata\r\n */\r\nexport interface IframeMetadata {\r\n type: IframeType;\r\n element: HTMLIFrameElement;\r\n container: HTMLDivElement;\r\n ready: boolean;\r\n visible: boolean;\r\n createdAt: number;\r\n}\r\n\r\n/**\r\n * Device detection result\r\n */\r\nfunction detectDevice(): DeviceInfo {\r\n const width = window.innerWidth;\r\n const height = window.innerHeight;\r\n const userAgent = navigator.userAgent;\r\n\r\n const isMobile = width < 768;\r\n const isTablet = width >= 768 && width <= 1024;\r\n const isDesktop = width > 1024;\r\n const isTouchDevice = 'ontouchstart' in window || navigator.maxTouchPoints > 0;\r\n\r\n return {\r\n type: isMobile ? 'mobile' : isTablet ? 'tablet' : 'desktop',\r\n isMobile,\r\n isTablet,\r\n isDesktop,\r\n isTouchDevice,\r\n screenWidth: width,\r\n screenHeight: height,\r\n orientation: width > height ? 'landscape' : 'portrait',\r\n userAgent,\r\n };\r\n}\r\n\r\n// Forward reference for MessageBroker to avoid circular imports\r\ninterface MessageBrokerInterface {\r\n setIframeDomLoaded(iframeType: IframeType): void;\r\n}\r\n\r\n/**\r\n * IframeManager class\r\n * Orchestrates multiple iframes for the widget system\r\n */\r\nexport class IframeManager {\r\n private config: ResolvedConfig;\r\n private logger: Logger;\r\n private iframes: Map<IframeType, IframeMetadata> = new Map();\r\n private rootContainer: HTMLDivElement | null = null;\r\n private appContainer: HTMLDivElement | null = null;\r\n private modalContainer: HTMLDivElement | null = null;\r\n private deviceInfo: DeviceInfo;\r\n private styleElement: HTMLStyleElement | null = null;\r\n private messageBroker: MessageBrokerInterface | null = null;\r\n\r\n // Bound handlers for proper cleanup\r\n private boundHandleResize: () => void;\r\n private boundHandleOrientationChange: () => void;\r\n private boundHandleVisualViewportResize: () => void;\r\n\r\n constructor(config: ResolvedConfig) {\r\n this.config = config;\r\n this.logger = new Logger(config.logging);\r\n this.deviceInfo = detectDevice();\r\n\r\n // Bind handlers once for proper cleanup\r\n this.boundHandleResize = this.handleResize.bind(this);\r\n this.boundHandleOrientationChange = this.handleOrientationChange.bind(this);\r\n this.boundHandleVisualViewportResize = this.handleVisualViewportResize.bind(this);\r\n\r\n this.logger.info('IframeManager initialized', {\r\n device: this.deviceInfo.type,\r\n mobile: this.deviceInfo.isMobile,\r\n });\r\n }\r\n\r\n /**\r\n * Initialize all containers and iframes\r\n * @param messageBroker - MessageBroker instance for coordinating ready state\r\n */\r\n public async init(messageBroker?: MessageBrokerInterface): Promise<void> {\r\n this.logger.debug('Initializing iframe manager');\r\n this.messageBroker = messageBroker || null;\r\n\r\n try {\r\n // Create root container structure\r\n this.createRootContainer();\r\n\r\n // Inject CSS\r\n this.injectCSS();\r\n\r\n // Create iframes\r\n await this.createLauncherIframe();\r\n await this.createBackdropIframe();\r\n await this.createWidgetIframe();\r\n\r\n // Setup event listeners\r\n this.setupEventListeners();\r\n\r\n this.logger.info('IframeManager initialized successfully');\r\n } catch (error) {\r\n this.logger.error('Failed to initialize IframeManager', error);\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Create root container structure\r\n */\r\n private createRootContainer(): void {\r\n // Check if already exists\r\n let existingContainer = document.getElementById('weld-container');\r\n if (existingContainer) {\r\n this.logger.warn('Weld container already exists, removing old instance');\r\n existingContainer.remove();\r\n }\r\n\r\n // Create root container\r\n this.rootContainer = document.createElement('div');\r\n this.rootContainer.id = 'weld-container';\r\n this.rootContainer.className = 'weld-namespace';\r\n\r\n // Create app container\r\n this.appContainer = document.createElement('div');\r\n this.appContainer.className = 'weld-app';\r\n this.appContainer.setAttribute('aria-live', 'polite');\r\n this.appContainer.setAttribute('role', 'complementary');\r\n this.appContainer.setAttribute('aria-label', 'Weld Helpdesk Widget');\r\n\r\n // Create modal container\r\n this.modalContainer = document.createElement('div');\r\n this.modalContainer.id = 'weld-modal-container';\r\n\r\n // Assemble structure\r\n this.rootContainer.appendChild(this.appContainer);\r\n this.rootContainer.appendChild(this.modalContainer);\r\n document.body.appendChild(this.rootContainer);\r\n\r\n this.logger.debug('Root container created');\r\n }\r\n\r\n /**\r\n * Inject CSS into the page\r\n */\r\n private injectCSS(): void {\r\n // Remove existing style if present\r\n const existingStyle = document.getElementById('weld-styles');\r\n if (existingStyle) {\r\n existingStyle.remove();\r\n }\r\n\r\n this.styleElement = document.createElement('style');\r\n this.styleElement.id = 'weld-styles';\r\n this.styleElement.textContent = this.generateCSS();\r\n document.head.appendChild(this.styleElement);\r\n\r\n this.logger.debug('CSS injected');\r\n }\r\n\r\n /**\r\n * Generate CSS for containers\r\n */\r\n private generateCSS(): string {\r\n const { customization } = this.config;\r\n\r\n return `\r\n /* Weld Container */\r\n #weld-container {\r\n --weld-color-primary: ${customization.primaryColor};\r\n --weld-color-accent: ${customization.accentColor};\r\n --weld-font-family: ${customization.fontFamily};\r\n --weld-font-size-base: ${customization.fontSize};\r\n --weld-radius-xl: ${customization.borderRadius};\r\n }\r\n\r\n /* Import main stylesheet */\r\n @import url('/styles/index.css');\r\n\r\n /* Prevent page scroll when mobile widget is open */\r\n body.weld-mobile-open {\r\n overflow: hidden !important;\r\n position: fixed !important;\r\n width: 100% !important;\r\n height: 100% !important;\r\n }\r\n\r\n /* High contrast mode support */\r\n @media (prefers-contrast: high) {\r\n .weld-namespace {\r\n --weld-color-border: currentColor;\r\n }\r\n }\r\n `;\r\n }\r\n\r\n /**\r\n * Create launcher iframe\r\n */\r\n private async createLauncherIframe(): Promise<void> {\r\n const { iframes } = this.config;\r\n const { launcher } = iframes;\r\n\r\n // Create container\r\n const container = document.createElement('div');\r\n container.className = 'weld-launcher-frame';\r\n container.setAttribute('data-state', 'visible');\r\n container.style.cssText = `\r\n position: fixed;\r\n bottom: ${launcher.position.bottom};\r\n right: ${launcher.position.right};\r\n width: ${launcher.size};\r\n height: ${launcher.size};\r\n z-index: 2147483003;\r\n pointer-events: auto;\r\n display: block;\r\n `;\r\n\r\n // Create iframe\r\n const iframe = document.createElement('iframe');\r\n iframe.name = launcher.name;\r\n iframe.title = 'Weld Launcher';\r\n iframe.src = this.buildIframeUrl(launcher.url);\r\n iframe.style.cssText = `\r\n width: 100%;\r\n height: 100%;\r\n border: none;\r\n background: transparent;\r\n display: block;\r\n `;\r\n iframe.setAttribute('allow', 'clipboard-write');\r\n iframe.setAttribute('sandbox', 'allow-scripts allow-same-origin allow-forms allow-popups');\r\n\r\n container.appendChild(iframe);\r\n this.appContainer?.appendChild(container);\r\n\r\n // Store metadata\r\n this.iframes.set(IframeType.LAUNCHER, {\r\n type: IframeType.LAUNCHER,\r\n element: iframe,\r\n container,\r\n ready: false,\r\n visible: true,\r\n createdAt: Date.now(),\r\n });\r\n\r\n // When DOM loads, notify MessageBroker to send weld:init\r\n iframe.onload = () => {\r\n const metadata = this.iframes.get(IframeType.LAUNCHER);\r\n if (metadata) {\r\n this.logger.debug('Launcher iframe DOM loaded');\r\n // Notify MessageBroker that DOM is loaded (triggers weld:init)\r\n this.messageBroker?.setIframeDomLoaded(IframeType.LAUNCHER);\r\n }\r\n };\r\n\r\n this.logger.debug('Launcher iframe created');\r\n }\r\n\r\n /**\r\n * Create widget iframe\r\n */\r\n private async createWidgetIframe(): Promise<void> {\r\n const { iframes } = this.config;\r\n const { widget } = iframes;\r\n\r\n // Create container\r\n const container = document.createElement('div');\r\n container.className = 'weld-widget-frame';\r\n container.setAttribute('data-state', 'closed');\r\n\r\n // Apply different styles for mobile vs desktop\r\n if (this.deviceInfo.isMobile) {\r\n // Mobile: full-screen with dynamic viewport height to handle URL bar\r\n container.style.cssText = `\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n right: 0;\r\n bottom: 0;\r\n width: 100vw;\r\n height: 100dvh;\r\n height: 100vh;\r\n z-index: 2147483001;\r\n pointer-events: none;\r\n display: none;\r\n border-radius: 0;\r\n overflow: hidden;\r\n background: transparent;\r\n `;\r\n // Use visualViewport API for accurate height on mobile browsers\r\n if (window.visualViewport) {\r\n container.style.height = `${window.visualViewport.height}px`;\r\n }\r\n } else {\r\n // Desktop: positioned widget with border, shadow and animation\r\n container.style.cssText = `\r\n position: fixed;\r\n bottom: ${widget.position.bottom};\r\n right: ${widget.position.right};\r\n width: ${widget.width};\r\n height: ${widget.height};\r\n max-width: 100vw;\r\n z-index: 2147483001;\r\n pointer-events: none;\r\n display: none;\r\n border-radius: 24px;\r\n overflow: hidden;\r\n background: #ffffff;\r\n box-shadow: rgba(9, 14, 21, 0.16) 0px 5px 40px 0px;\r\n border: 1px solid rgba(0, 0, 0, 0.1);\r\n opacity: 0;\r\n transform: scale(0.95) translateY(10px);\r\n transform-origin: bottom right;\r\n transition: opacity 0.2s cubic-bezier(0.4, 0, 0.2, 1), transform 0.2s cubic-bezier(0.4, 0, 0.2, 1);\r\n `;\r\n }\r\n\r\n // Create iframe\r\n const iframe = document.createElement('iframe');\r\n iframe.name = widget.name;\r\n iframe.title = 'Weld Widget';\r\n iframe.src = this.buildIframeUrl(widget.url);\r\n iframe.style.cssText = `\r\n width: 100%;\r\n height: 100%;\r\n border: none;\r\n background: transparent;\r\n display: block;\r\n border-radius: ${this.deviceInfo.isMobile ? '0' : '24px'};\r\n `;\r\n iframe.setAttribute('allow', 'clipboard-write; camera; microphone');\r\n iframe.setAttribute('sandbox', 'allow-scripts allow-same-origin allow-forms allow-popups allow-downloads');\r\n\r\n container.appendChild(iframe);\r\n this.appContainer?.appendChild(container);\r\n\r\n // Store metadata\r\n this.iframes.set(IframeType.WIDGET, {\r\n type: IframeType.WIDGET,\r\n element: iframe,\r\n container,\r\n ready: false,\r\n visible: false,\r\n createdAt: Date.now(),\r\n });\r\n\r\n // When DOM loads, notify MessageBroker to send weld:init\r\n iframe.onload = () => {\r\n const metadata = this.iframes.get(IframeType.WIDGET);\r\n if (metadata) {\r\n this.logger.debug('Widget iframe DOM loaded');\r\n // Notify MessageBroker that DOM is loaded (triggers weld:init)\r\n this.messageBroker?.setIframeDomLoaded(IframeType.WIDGET);\r\n }\r\n };\r\n\r\n this.logger.debug('Widget iframe created');\r\n }\r\n\r\n /**\r\n * Create backdrop iframe\r\n */\r\n private async createBackdropIframe(): Promise<void> {\r\n if (!this.config.iframes.backdrop?.enabled) {\r\n this.logger.debug('Backdrop disabled, skipping creation');\r\n return;\r\n }\r\n\r\n // Create container\r\n const container = document.createElement('div');\r\n container.className = 'weld-backdrop-frame';\r\n container.setAttribute('data-state', 'hidden');\r\n container.style.cssText = `\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n right: 0;\r\n bottom: 0;\r\n z-index: 2147483000;\r\n background: transparent;\r\n pointer-events: none;\r\n opacity: 0;\r\n transition: opacity 200ms ease;\r\n `;\r\n\r\n this.appContainer?.appendChild(container);\r\n\r\n // Store metadata (backdrop doesn't have an iframe, just a div)\r\n // We'll create a minimal \"iframe\" reference for consistency\r\n const dummyIframe = document.createElement('iframe');\r\n dummyIframe.style.display = 'none';\r\n\r\n this.iframes.set(IframeType.BACKDROP, {\r\n type: IframeType.BACKDROP,\r\n element: dummyIframe,\r\n container,\r\n ready: true, // Backdrop is always ready\r\n visible: false,\r\n createdAt: Date.now(),\r\n });\r\n\r\n this.logger.debug('Backdrop created');\r\n }\r\n\r\n /**\r\n * Build iframe URL with parameters\r\n */\r\n private buildIframeUrl(path: string): string {\r\n const { widgetId, api } = this.config;\r\n const baseUrl = api.baseUrl;\r\n\r\n // Handle paths that may already have query parameters\r\n const url = new URL(path, baseUrl);\r\n url.searchParams.set('widgetId', widgetId);\r\n url.searchParams.set('device', this.deviceInfo.type);\r\n url.searchParams.set('mobile', String(this.deviceInfo.isMobile));\r\n url.searchParams.set('parentOrigin', window.location.origin);\r\n\r\n return url.toString();\r\n }\r\n\r\n /**\r\n * Setup event listeners\r\n */\r\n private setupEventListeners(): void {\r\n // Window resize - use bound handler for proper cleanup\r\n window.addEventListener('resize', this.boundHandleResize);\r\n\r\n // Orientation change - use bound handler for proper cleanup\r\n window.addEventListener('orientationchange', this.boundHandleOrientationChange);\r\n\r\n // Visual viewport resize (handles mobile URL bar and keyboard)\r\n if (window.visualViewport) {\r\n window.visualViewport.addEventListener('resize', this.boundHandleVisualViewportResize);\r\n window.visualViewport.addEventListener('scroll', this.boundHandleVisualViewportResize);\r\n }\r\n\r\n this.logger.debug('Event listeners setup');\r\n }\r\n\r\n /**\r\n * Handle window resize\r\n */\r\n private handleResize(): void {\r\n this.deviceInfo = detectDevice();\r\n this.logger.debug('Window resized', { device: this.deviceInfo.type });\r\n }\r\n\r\n /**\r\n * Handle orientation change\r\n */\r\n private handleOrientationChange(): void {\r\n this.deviceInfo = detectDevice();\r\n this.logger.debug('Orientation changed', { orientation: this.deviceInfo.orientation });\r\n }\r\n\r\n /**\r\n * Handle visual viewport resize (mobile URL bar, keyboard)\r\n */\r\n private handleVisualViewportResize(): void {\r\n if (!this.deviceInfo.isMobile || !window.visualViewport) return;\r\n\r\n const widget = this.iframes.get(IframeType.WIDGET);\r\n if (widget && widget.visible) {\r\n const vh = window.visualViewport.height;\r\n const offsetTop = window.visualViewport.offsetTop;\r\n\r\n widget.container.style.height = `${vh}px`;\r\n widget.container.style.top = `${offsetTop}px`;\r\n\r\n this.logger.debug('Visual viewport resized', { height: vh, offsetTop });\r\n }\r\n }\r\n\r\n /**\r\n * Get iframe by type\r\n */\r\n public getIframe(type: IframeType): IframeMetadata | undefined {\r\n return this.iframes.get(type);\r\n }\r\n\r\n /**\r\n * Get iframe element\r\n */\r\n public getIframeElement(type: IframeType): HTMLIFrameElement | undefined {\r\n return this.iframes.get(type)?.element;\r\n }\r\n\r\n /**\r\n * Get iframe container\r\n */\r\n public getIframeContainer(type: IframeType): HTMLDivElement | undefined {\r\n return this.iframes.get(type)?.container;\r\n }\r\n\r\n /**\r\n * Mark iframe as ready\r\n */\r\n public setIframeReady(type: IframeType): void {\r\n const iframe = this.iframes.get(type);\r\n if (iframe) {\r\n iframe.ready = true;\r\n this.logger.debug(`Iframe ${type} marked as ready`);\r\n }\r\n }\r\n\r\n /**\r\n * Check if all iframes are ready\r\n */\r\n public areAllIframesReady(): boolean {\r\n for (const [type, iframe] of this.iframes) {\r\n if (type !== IframeType.BACKDROP && !iframe.ready) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * Show iframe\r\n */\r\n public showIframe(type: IframeType): void {\r\n const iframe = this.iframes.get(type);\r\n if (!iframe) {\r\n console.warn(`[Weld SDK] showIframe: iframe ${type} not found`);\r\n return;\r\n }\r\n\r\n console.log(`[Weld SDK] Showing iframe ${type}`, { currentDisplay: iframe.container.style.display });\r\n\r\n iframe.visible = true;\r\n iframe.container.setAttribute('data-state', type === IframeType.BACKDROP ? 'visible' : 'open');\r\n iframe.container.style.pointerEvents = 'auto';\r\n iframe.container.style.display = 'block';\r\n\r\n // Trigger open animation for widget on desktop\r\n if (type === IframeType.WIDGET && !this.deviceInfo.isMobile) {\r\n // Force reflow to ensure transition works\r\n iframe.container.offsetHeight;\r\n // Animate to visible state\r\n iframe.container.style.opacity = '1';\r\n iframe.container.style.transform = 'scale(1) translateY(0)';\r\n }\r\n\r\n // Handle mobile scroll lock\r\n if (this.deviceInfo.isMobile && type === IframeType.WIDGET && this.config.mobile.scrollLock) {\r\n document.body.classList.add('weld-mobile-open');\r\n }\r\n\r\n // Hide launcher on mobile when widget is open (full-screen mode)\r\n if (this.deviceInfo.isMobile && type === IframeType.WIDGET) {\r\n const launcher = this.iframes.get(IframeType.LAUNCHER);\r\n if (launcher) {\r\n launcher.container.style.display = 'none';\r\n }\r\n\r\n // Apply accurate viewport height using visualViewport API\r\n if (window.visualViewport) {\r\n iframe.container.style.height = `${window.visualViewport.height}px`;\r\n iframe.container.style.top = `${window.visualViewport.offsetTop}px`;\r\n }\r\n }\r\n\r\n console.log(`[Weld SDK] Iframe ${type} shown`, { newDisplay: iframe.container.style.display });\r\n }\r\n\r\n /**\r\n * Hide iframe\r\n */\r\n public hideIframe(type: IframeType): void {\r\n const iframe = this.iframes.get(type);\r\n if (!iframe) {\r\n console.warn(`[Weld SDK] hideIframe: iframe ${type} not found`);\r\n return;\r\n }\r\n\r\n console.log(`[Weld SDK] Hiding iframe ${type}`, { currentDisplay: iframe.container.style.display });\r\n\r\n iframe.visible = false;\r\n iframe.container.setAttribute('data-state', type === IframeType.BACKDROP ? 'hidden' : 'closed');\r\n iframe.container.style.pointerEvents = 'none';\r\n\r\n // Animate close for widget on desktop, then hide after animation\r\n if (type === IframeType.WIDGET && !this.deviceInfo.isMobile) {\r\n // Animate to hidden state\r\n iframe.container.style.opacity = '0';\r\n iframe.container.style.transform = 'scale(0.95) translateY(10px)';\r\n // Hide after transition completes\r\n setTimeout(() => {\r\n if (!iframe.visible) {\r\n iframe.container.style.display = 'none';\r\n }\r\n }, 200);\r\n } else {\r\n iframe.container.style.display = 'none';\r\n }\r\n\r\n // Remove mobile scroll lock\r\n if (this.deviceInfo.isMobile && type === IframeType.WIDGET) {\r\n document.body.classList.remove('weld-mobile-open');\r\n }\r\n\r\n // Show launcher again on mobile when widget is closed\r\n if (this.deviceInfo.isMobile && type === IframeType.WIDGET) {\r\n const launcher = this.iframes.get(IframeType.LAUNCHER);\r\n if (launcher) {\r\n launcher.container.style.display = 'block';\r\n }\r\n }\r\n\r\n console.log(`[Weld SDK] Iframe ${type} hidden`, { newDisplay: iframe.container.style.display });\r\n }\r\n\r\n /**\r\n * Get device info\r\n */\r\n public getDeviceInfo(): DeviceInfo {\r\n return this.deviceInfo;\r\n }\r\n\r\n /**\r\n * Get modal container\r\n */\r\n public getModalContainer(): HTMLDivElement | null {\r\n return this.modalContainer;\r\n }\r\n\r\n /**\r\n * Destroy all iframes and cleanup\r\n */\r\n public destroy(): void {\r\n this.logger.debug('Destroying iframe manager');\r\n\r\n // Remove event listeners using bound handlers\r\n window.removeEventListener('resize', this.boundHandleResize);\r\n window.removeEventListener('orientationchange', this.boundHandleOrientationChange);\r\n\r\n // Remove visual viewport listeners\r\n if (window.visualViewport) {\r\n window.visualViewport.removeEventListener('resize', this.boundHandleVisualViewportResize);\r\n window.visualViewport.removeEventListener('scroll', this.boundHandleVisualViewportResize);\r\n }\r\n\r\n // Remove mobile scroll lock\r\n document.body.classList.remove('weld-mobile-open');\r\n\r\n // Remove root container\r\n if (this.rootContainer) {\r\n this.rootContainer.remove();\r\n this.rootContainer = null;\r\n }\r\n\r\n // Remove style element\r\n if (this.styleElement) {\r\n this.styleElement.remove();\r\n this.styleElement = null;\r\n }\r\n\r\n // Clear iframe references\r\n this.iframes.clear();\r\n\r\n // Clear messageBroker reference\r\n this.messageBroker = null;\r\n\r\n this.logger.info('IframeManager destroyed');\r\n }\r\n}\r\n","/**\r\n * Weld SDK - Message Types\r\n * Type definitions for postMessage communication between parent and iframes\r\n */\r\n\r\n/**\r\n * Message origins for validation\r\n */\r\nexport enum MessageOrigin {\r\n LAUNCHER = 'launcher',\r\n WIDGET = 'widget',\r\n PARENT = 'parent',\r\n BACKDROP = 'backdrop',\r\n}\r\n\r\n/**\r\n * Message types for different communication patterns\r\n */\r\nexport enum MessageType {\r\n // Lifecycle\r\n READY = 'weld:ready',\r\n INIT = 'weld:init',\r\n DESTROY = 'weld:destroy',\r\n\r\n // State changes\r\n STATE_UPDATE = 'weld:state:update',\r\n STATE_REQUEST = 'weld:state:request',\r\n STATE_RESPONSE = 'weld:state:response',\r\n\r\n // Widget control\r\n WIDGET_OPEN = 'weld:widget:open',\r\n WIDGET_CLOSE = 'weld:widget:close',\r\n WIDGET_TOGGLE = 'weld:widget:toggle',\r\n WIDGET_MINIMIZE = 'weld:widget:minimize',\r\n WIDGET_MAXIMIZE = 'weld:widget:maximize',\r\n\r\n // Launcher control\r\n LAUNCHER_SHOW = 'weld:launcher:show',\r\n LAUNCHER_HIDE = 'weld:launcher:hide',\r\n LAUNCHER_UPDATE = 'weld:launcher:update',\r\n\r\n // Backdrop control\r\n BACKDROP_SHOW = 'weld:backdrop:show',\r\n BACKDROP_HIDE = 'weld:backdrop:hide',\r\n BACKDROP_CLICK = 'weld:backdrop:click',\r\n\r\n // User interactions\r\n MESSAGE_SEND = 'weld:message:send',\r\n MESSAGE_RECEIVE = 'weld:message:receive',\r\n TYPING_START = 'weld:typing:start',\r\n TYPING_STOP = 'weld:typing:stop',\r\n\r\n // Badge updates\r\n BADGE_UPDATE = 'weld:badge:update',\r\n BADGE_CLEAR = 'weld:badge:clear',\r\n\r\n // Mobile handling\r\n MOBILE_SCROLL_LOCK = 'weld:mobile:scroll:lock',\r\n MOBILE_SCROLL_UNLOCK = 'weld:mobile:scroll:unlock',\r\n\r\n // Configuration\r\n CONFIG_UPDATE = 'weld:config:update',\r\n THEME_UPDATE = 'weld:theme:update',\r\n LOCALE_UPDATE = 'weld:locale:update',\r\n\r\n // Authentication\r\n AUTH_LOGIN = 'weld:auth:login',\r\n AUTH_LOGOUT = 'weld:auth:logout',\r\n AUTH_TOKEN_UPDATE = 'weld:auth:token:update',\r\n\r\n // Events\r\n EVENT_TRACK = 'weld:event:track',\r\n ERROR_REPORT = 'weld:error:report',\r\n\r\n // API responses\r\n API_SUCCESS = 'weld:api:success',\r\n API_ERROR = 'weld:api:error',\r\n}\r\n\r\n/**\r\n * Base message structure\r\n */\r\nexport interface BaseMessage {\r\n type: MessageType;\r\n origin: MessageOrigin;\r\n timestamp: number;\r\n id: string;\r\n}\r\n\r\n/**\r\n * Message with payload\r\n */\r\nexport interface PayloadMessage<T = any> extends BaseMessage {\r\n payload: T;\r\n}\r\n\r\n/**\r\n * State update payload\r\n */\r\nexport interface StateUpdatePayload {\r\n path: string;\r\n value: any;\r\n merge?: boolean;\r\n}\r\n\r\n/**\r\n * Widget state payload\r\n */\r\nexport interface WidgetStatePayload {\r\n isOpen: boolean;\r\n isMinimized: boolean;\r\n view?: string;\r\n data?: any;\r\n}\r\n\r\n/**\r\n * Launcher state payload\r\n */\r\nexport interface LauncherStatePayload {\r\n isVisible: boolean;\r\n badgeCount?: number;\r\n badgeText?: string;\r\n customColor?: string;\r\n}\r\n\r\n/**\r\n * Backdrop state payload\r\n */\r\nexport interface BackdropStatePayload {\r\n isVisible: boolean;\r\n onClick?: 'close' | 'ignore';\r\n}\r\n\r\n/**\r\n * Message data payload\r\n */\r\nexport interface MessageDataPayload {\r\n id: string;\r\n text: string;\r\n sender: 'user' | 'agent' | 'bot';\r\n timestamp: number;\r\n attachments?: Array<{\r\n type: string;\r\n url: string;\r\n name?: string;\r\n }>;\r\n}\r\n\r\n/**\r\n * Configuration update payload\r\n */\r\nexport interface ConfigUpdatePayload {\r\n apiKey?: string;\r\n workspaceId?: string;\r\n position?: {\r\n launcher?: { bottom: string; right: string };\r\n widget?: { bottom: string; right: string };\r\n };\r\n customization?: {\r\n primaryColor?: string;\r\n accentColor?: string;\r\n fontFamily?: string;\r\n };\r\n features?: {\r\n attachments?: boolean;\r\n reactions?: boolean;\r\n typing?: boolean;\r\n };\r\n}\r\n\r\n/**\r\n * Theme update payload\r\n */\r\nexport interface ThemeUpdatePayload {\r\n mode: 'light' | 'dark' | 'auto';\r\n primaryColor?: string;\r\n accentColor?: string;\r\n customCSS?: string;\r\n}\r\n\r\n/**\r\n * Authentication payload\r\n */\r\nexport interface AuthPayload {\r\n userId?: string;\r\n email?: string;\r\n name?: string;\r\n avatar?: string;\r\n metadata?: Record<string, any>;\r\n token?: string;\r\n}\r\n\r\n/**\r\n * Error payload\r\n */\r\nexport interface ErrorPayload {\r\n code: string;\r\n message: string;\r\n stack?: string;\r\n context?: Record<string, any>;\r\n}\r\n\r\n/**\r\n * Event tracking payload\r\n */\r\nexport interface EventPayload {\r\n name: string;\r\n properties?: Record<string, any>;\r\n timestamp: number;\r\n}\r\n\r\n/**\r\n * Type guards\r\n */\r\nexport function isBaseMessage(message: any): message is BaseMessage {\r\n return (\r\n typeof message === 'object' &&\r\n message !== null &&\r\n 'type' in message &&\r\n 'origin' in message &&\r\n 'timestamp' in message &&\r\n 'id' in message\r\n );\r\n}\r\n\r\nexport function isPayloadMessage<T = any>(\r\n message: any\r\n): message is PayloadMessage<T> {\r\n return isBaseMessage(message) && 'payload' in message;\r\n}\r\n\r\n/**\r\n * Message creator utilities\r\n */\r\nexport function createMessage(\r\n type: MessageType,\r\n origin: MessageOrigin,\r\n payload?: any\r\n): PayloadMessage {\r\n return {\r\n type,\r\n origin,\r\n timestamp: Date.now(),\r\n id: `${type}_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,\r\n payload,\r\n };\r\n}\r\n\r\n/**\r\n * Specific message type definitions\r\n */\r\nexport type ReadyMessage = PayloadMessage<{ iframe: string; ready: true }>;\r\nexport type StateUpdateMessage = PayloadMessage<StateUpdatePayload>;\r\nexport type WidgetStateMessage = PayloadMessage<WidgetStatePayload>;\r\nexport type LauncherStateMessage = PayloadMessage<LauncherStatePayload>;\r\nexport type BackdropStateMessage = PayloadMessage<BackdropStatePayload>;\r\nexport type MessageDataMessage = PayloadMessage<MessageDataPayload>;\r\nexport type ConfigUpdateMessage = PayloadMessage<ConfigUpdatePayload>;\r\nexport type ThemeUpdateMessage = PayloadMessage<ThemeUpdatePayload>;\r\nexport type AuthMessage = PayloadMessage<AuthPayload>;\r\nexport type ErrorMessage = PayloadMessage<ErrorPayload>;\r\nexport type EventMessage = PayloadMessage<EventPayload>;\r\n\r\n/**\r\n * Union type for all messages\r\n */\r\nexport type WeldMessage =\r\n | BaseMessage\r\n | ReadyMessage\r\n | StateUpdateMessage\r\n | WidgetStateMessage\r\n | LauncherStateMessage\r\n | BackdropStateMessage\r\n | MessageDataMessage\r\n | ConfigUpdateMessage\r\n | ThemeUpdateMessage\r\n | AuthMessage\r\n | ErrorMessage\r\n | EventMessage;\r\n","/**\r\n * Weld SDK - Security Utilities\r\n * Security validation and origin checking for postMessage communication\r\n */\r\n\r\nimport type { SecurityConfig } from '../types/config';\r\nimport { Logger } from './logger';\r\n\r\n/**\r\n * SecurityManager class\r\n */\r\nexport class SecurityManager {\r\n private config: SecurityConfig;\r\n private logger: Logger;\r\n private allowedOrigins: Set<string>;\r\n\r\n constructor(config: SecurityConfig, logger: Logger) {\r\n this.config = config;\r\n this.logger = logger;\r\n this.allowedOrigins = new Set(config.allowedOrigins || []);\r\n\r\n // Always allow same origin\r\n this.allowedOrigins.add(window.location.origin);\r\n }\r\n\r\n /**\r\n * Validate message origin\r\n */\r\n public isOriginAllowed(origin: string): boolean {\r\n // If no allowed origins specified, only allow same origin\r\n if (this.config.allowedOrigins?.length === 0) {\r\n return origin === window.location.origin;\r\n }\r\n\r\n // Check if origin is in allowed list\r\n if (this.allowedOrigins.has(origin)) {\r\n return true;\r\n }\r\n\r\n // Check for wildcard patterns\r\n for (const allowed of this.allowedOrigins) {\r\n if (this.matchesPattern(origin, allowed)) {\r\n return true;\r\n }\r\n }\r\n\r\n this.logger.warn('Origin not allowed', { origin });\r\n return false;\r\n }\r\n\r\n /**\r\n * Match origin against pattern (supports wildcards)\r\n */\r\n private matchesPattern(origin: string, pattern: string): boolean {\r\n // Exact match\r\n if (origin === pattern) {\r\n return true;\r\n }\r\n\r\n // Wildcard pattern (e.g., \"https://*.example.com\")\r\n if (pattern.includes('*')) {\r\n const regex = new RegExp(\r\n '^' + pattern.replace(/\\./g, '\\\\.').replace(/\\*/g, '.*') + '$'\r\n );\r\n return regex.test(origin);\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Validate postMessage event\r\n */\r\n public validateMessageEvent(event: MessageEvent): boolean {\r\n // Check origin\r\n if (!this.isOriginAllowed(event.origin)) {\r\n this.logger.warn('Invalid message origin', { origin: event.origin });\r\n return false;\r\n }\r\n\r\n // Check if message has data\r\n if (!event.data) {\r\n this.logger.warn('Message has no data');\r\n return false;\r\n }\r\n\r\n // Check if message is an object\r\n if (typeof event.data !== 'object') {\r\n this.logger.warn('Message data is not an object');\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Sanitize message data\r\n */\r\n public sanitizeMessageData(data: any): any {\r\n if (!this.config.sanitizeInput) {\r\n return data;\r\n }\r\n\r\n // Deep clone to avoid modifying original\r\n const sanitized = JSON.parse(JSON.stringify(data));\r\n\r\n // Recursively sanitize strings\r\n this.sanitizeObject(sanitized);\r\n\r\n return sanitized;\r\n }\r\n\r\n /**\r\n * Recursively sanitize object properties\r\n */\r\n private sanitizeObject(obj: any): void {\r\n if (typeof obj !== 'object' || obj === null) {\r\n return;\r\n }\r\n\r\n for (const key in obj) {\r\n if (typeof obj[key] === 'string') {\r\n obj[key] = this.sanitizeString(obj[key]);\r\n } else if (typeof obj[key] === 'object') {\r\n this.sanitizeObject(obj[key]);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Sanitize string to prevent XSS\r\n */\r\n private sanitizeString(str: string): string {\r\n const div = document.createElement('div');\r\n div.textContent = str;\r\n return div.innerHTML\r\n .replace(/javascript:/gi, '')\r\n .replace(/on\\w+\\s*=/gi, '');\r\n }\r\n\r\n /**\r\n * Generate secure random ID\r\n */\r\n public generateSecureId(): string {\r\n const array = new Uint8Array(16);\r\n crypto.getRandomValues(array);\r\n return Array.from(array, (byte) => byte.toString(16).padStart(2, '0')).join('');\r\n }\r\n\r\n /**\r\n * Validate iframe source\r\n */\r\n public isValidIframeSource(src: string): boolean {\r\n try {\r\n const url = new URL(src, window.location.origin);\r\n\r\n // Check if URL is from allowed origin\r\n if (!this.isOriginAllowed(url.origin)) {\r\n this.logger.warn('Invalid iframe source origin', { src });\r\n return false;\r\n }\r\n\r\n // Prevent javascript: protocol\r\n if (url.protocol === 'javascript:') {\r\n this.logger.warn('Javascript protocol not allowed in iframe source');\r\n return false;\r\n }\r\n\r\n return true;\r\n } catch (error) {\r\n this.logger.warn('Invalid iframe source URL', { src, error });\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Create Content Security Policy\r\n */\r\n public createCSP(): string {\r\n const origins = Array.from(this.allowedOrigins).join(' ');\r\n\r\n return [\r\n `default-src 'self' ${origins}`,\r\n `script-src 'self' 'unsafe-inline' ${origins}`,\r\n `style-src 'self' 'unsafe-inline' ${origins}`,\r\n `img-src 'self' data: https: ${origins}`,\r\n `font-src 'self' data: ${origins}`,\r\n `connect-src 'self' ${origins}`,\r\n `frame-src 'self' ${origins}`,\r\n `media-src 'self' ${origins}`,\r\n ].join('; ');\r\n }\r\n\r\n /**\r\n * Add allowed origin\r\n */\r\n public addAllowedOrigin(origin: string): void {\r\n this.allowedOrigins.add(origin);\r\n this.logger.debug('Added allowed origin', { origin });\r\n }\r\n\r\n /**\r\n * Remove allowed origin\r\n */\r\n public removeAllowedOrigin(origin: string): void {\r\n this.allowedOrigins.delete(origin);\r\n this.logger.debug('Removed allowed origin', { origin });\r\n }\r\n\r\n /**\r\n * Get all allowed origins\r\n */\r\n public getAllowedOrigins(): string[] {\r\n return Array.from(this.allowedOrigins);\r\n }\r\n}\r\n\r\n/**\r\n * Rate limiting utility\r\n */\r\nexport class RateLimiter {\r\n private requests: Map<string, number[]> = new Map();\r\n private maxRequests: number;\r\n private windowMs: number;\r\n\r\n constructor(maxRequests: number = 100, windowMs: number = 60000) {\r\n this.maxRequests = maxRequests;\r\n this.windowMs = windowMs;\r\n }\r\n\r\n /**\r\n * Check if request is allowed\r\n */\r\n public isAllowed(key: string): boolean {\r\n const now = Date.now();\r\n const requests = this.requests.get(key) || [];\r\n\r\n // Remove old requests outside window\r\n const validRequests = requests.filter((time) => now - time < this.windowMs);\r\n\r\n // Check if limit exceeded\r\n if (validRequests.length >= this.maxRequests) {\r\n return false;\r\n }\r\n\r\n // Add current request\r\n validRequests.push(now);\r\n this.requests.set(key, validRequests);\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Reset rate limit for key\r\n */\r\n public reset(key: string): void {\r\n this.requests.delete(key);\r\n }\r\n\r\n /**\r\n * Clear all rate limits\r\n */\r\n public clearAll(): void {\r\n this.requests.clear();\r\n }\r\n}\r\n\r\n/**\r\n * Token validation utilities\r\n */\r\nexport class TokenValidator {\r\n private static readonly TOKEN_PATTERN = /^[A-Za-z0-9-_=]+\\.[A-Za-z0-9-_=]+\\.?[A-Za-z0-9-_.+/=]*$/;\r\n\r\n /**\r\n * Check if string looks like a JWT token\r\n */\r\n public static isJWT(token: string): boolean {\r\n return this.TOKEN_PATTERN.test(token);\r\n }\r\n\r\n /**\r\n * Decode JWT payload (without verification)\r\n */\r\n public static decodeJWT(token: string): any | null {\r\n try {\r\n const parts = token.split('.');\r\n if (parts.length !== 3) {\r\n return null;\r\n }\r\n\r\n const payload = parts[1];\r\n const decoded = atob(payload.replace(/-/g, '+').replace(/_/g, '/'));\r\n return JSON.parse(decoded);\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Check if JWT is expired\r\n */\r\n public static isExpired(token: string): boolean {\r\n const payload = this.decodeJWT(token);\r\n if (!payload || !payload.exp) {\r\n return true;\r\n }\r\n\r\n return Date.now() >= payload.exp * 1000;\r\n }\r\n}\r\n","/**\r\n * Weld SDK - Message Broker\r\n * Handles secure postMessage communication between parent and iframes\r\n */\r\n\r\nimport type {\r\n WeldMessage,\r\n MessageType,\r\n PayloadMessage,\r\n} from '../types/messages';\r\nimport {\r\n MessageOrigin,\r\n isBaseMessage,\r\n isPayloadMessage,\r\n createMessage,\r\n} from '../types/messages';\r\nimport type { ResolvedConfig } from '../types/config';\r\nimport { Logger } from '../utils/logger';\r\nimport { SecurityManager, RateLimiter } from '../utils/security';\r\nimport { IframeManager, IframeType } from './IframeManager';\r\n\r\n/**\r\n * Message handler callback\r\n */\r\nexport type MessageHandler<T = any> = (payload: T, message: PayloadMessage<T>) => void;\r\n\r\n/**\r\n * Message subscription\r\n */\r\ninterface MessageSubscription {\r\n id: string;\r\n type: MessageType | '*';\r\n origin?: MessageOrigin;\r\n handler: MessageHandler;\r\n}\r\n\r\n/**\r\n * Queued message with metadata\r\n */\r\ninterface QueuedMessage {\r\n message: PayloadMessage;\r\n queuedAt: number;\r\n targetIframe: IframeType;\r\n}\r\n\r\n/**\r\n * Iframe ready state tracking\r\n */\r\ninterface IframeReadyState {\r\n domLoaded: boolean; // iframe.onload fired\r\n jsReady: boolean; // weld:ready received\r\n initSent: boolean; // weld:init sent\r\n}\r\n\r\n/**\r\n * MessageBroker class\r\n * Central hub for all postMessage communication\r\n */\r\nexport class MessageBroker {\r\n private config: ResolvedConfig;\r\n private logger: Logger;\r\n private security: SecurityManager;\r\n private iframeManager: IframeManager;\r\n private subscriptions: Map<string, MessageSubscription> = new Map();\r\n private messageQueue: QueuedMessage[] = [];\r\n private isReady = false;\r\n private rateLimiter: RateLimiter;\r\n private responseHandlers: Map<string, (message: WeldMessage) => void> = new Map();\r\n\r\n // Iframe ready state tracking\r\n private iframeReadyStates: Map<IframeType, IframeReadyState> = new Map();\r\n\r\n // Queue timeout configuration\r\n private queueTimeout = 30000; // 30 seconds\r\n private queueWatcherInterval: ReturnType<typeof setInterval> | null = null;\r\n\r\n // Bound handlers for proper cleanup\r\n private boundHandleMessage: (event: MessageEvent) => void;\r\n\r\n constructor(\r\n config: ResolvedConfig,\r\n iframeManager: IframeManager,\r\n logger: Logger\r\n ) {\r\n this.config = config;\r\n this.logger = logger.child('[MessageBroker]');\r\n this.iframeManager = iframeManager;\r\n this.security = new SecurityManager(config.security, this.logger);\r\n this.rateLimiter = new RateLimiter(100, 60000); // 100 messages per minute\r\n\r\n // Bind handlers once for proper cleanup\r\n this.boundHandleMessage = this.handleMessage.bind(this);\r\n\r\n // Initialize ready states\r\n this.iframeReadyStates.set(IframeType.LAUNCHER, { domLoaded: false, jsReady: false, initSent: false });\r\n this.iframeReadyStates.set(IframeType.WIDGET, { domLoaded: false, jsReady: false, initSent: false });\r\n\r\n this.setupMessageListener();\r\n this.startQueueWatcher();\r\n this.logger.debug('MessageBroker initialized');\r\n }\r\n\r\n /**\r\n * Setup global message listener\r\n */\r\n private setupMessageListener(): void {\r\n window.addEventListener('message', this.boundHandleMessage);\r\n this.logger.debug('Message listener setup');\r\n }\r\n\r\n /**\r\n * Start queue watcher to clean up expired messages\r\n */\r\n private startQueueWatcher(): void {\r\n this.queueWatcherInterval = setInterval(() => {\r\n const now = Date.now();\r\n const expiredMessages = this.messageQueue.filter(\r\n item => now - item.queuedAt > this.queueTimeout\r\n );\r\n\r\n if (expiredMessages.length > 0) {\r\n this.messageQueue = this.messageQueue.filter(\r\n item => now - item.queuedAt <= this.queueTimeout\r\n );\r\n for (const item of expiredMessages) {\r\n this.logger.warn('Message expired in queue', {\r\n type: item.message.type,\r\n targetIframe: item.targetIframe,\r\n queuedFor: now - item.queuedAt,\r\n });\r\n }\r\n }\r\n }, 5000);\r\n }\r\n\r\n /**\r\n * Get target origin for postMessage (security improvement)\r\n */\r\n private getTargetOrigin(): string {\r\n if (this.config.api?.baseUrl) {\r\n try {\r\n return new URL(this.config.api.baseUrl).origin;\r\n } catch {\r\n // Invalid URL, fall back to wildcard\r\n }\r\n }\r\n // Fall back to wildcard if no valid baseUrl configured\r\n return '*';\r\n }\r\n\r\n /**\r\n * Handle incoming postMessage\r\n */\r\n private handleMessage(event: MessageEvent): void {\r\n // Validate message event\r\n if (!this.security.validateMessageEvent(event)) {\r\n return;\r\n }\r\n\r\n // Validate message structure\r\n if (!isBaseMessage(event.data)) {\r\n this.logger.warn('Invalid message structure', event.data);\r\n return;\r\n }\r\n\r\n const message = event.data as WeldMessage;\r\n\r\n // Rate limiting\r\n if (!this.rateLimiter.isAllowed(message.origin)) {\r\n this.logger.warn('Rate limit exceeded', { origin: message.origin });\r\n return;\r\n }\r\n\r\n // Sanitize message if enabled\r\n const sanitized = this.config.security.sanitizeInput\r\n ? this.security.sanitizeMessageData(message)\r\n : message;\r\n\r\n this.logger.debug('Message received', {\r\n type: sanitized.type,\r\n origin: sanitized.origin,\r\n id: sanitized.id,\r\n });\r\n\r\n // Check for response handlers\r\n if (this.responseHandlers.has(sanitized.id)) {\r\n const handler = this.responseHandlers.get(sanitized.id);\r\n handler?.(sanitized);\r\n this.responseHandlers.delete(sanitized.id);\r\n return;\r\n }\r\n\r\n // Dispatch to subscribers\r\n this.dispatchMessage(sanitized);\r\n }\r\n\r\n /**\r\n * Dispatch message to subscribers\r\n */\r\n private dispatchMessage(message: WeldMessage): void {\r\n const subscriptions = Array.from(this.subscriptions.values());\r\n\r\n for (const subscription of subscriptions) {\r\n // Check if type matches\r\n const typeMatches =\r\n subscription.type === '*' || subscription.type === message.type;\r\n\r\n // Check if origin matches (if specified)\r\n const originMatches =\r\n !subscription.origin || subscription.origin === message.origin;\r\n\r\n if (typeMatches && originMatches) {\r\n try {\r\n if (isPayloadMessage(message)) {\r\n subscription.handler(message.payload, message);\r\n } else {\r\n subscription.handler(undefined, message as unknown as PayloadMessage);\r\n }\r\n } catch (error) {\r\n this.logger.error('Error in message handler', error);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Subscribe to messages\r\n */\r\n public subscribe<T = any>(\r\n type: MessageType | '*',\r\n handler: MessageHandler<T>,\r\n origin?: MessageOrigin\r\n ): string {\r\n const id = this.security.generateSecureId();\r\n\r\n this.subscriptions.set(id, {\r\n id,\r\n type,\r\n origin,\r\n handler,\r\n });\r\n\r\n this.logger.debug('Subscribed to messages', { type, origin, id });\r\n return id;\r\n }\r\n\r\n /**\r\n * Unsubscribe from messages\r\n */\r\n public unsubscribe(subscriptionId: string): void {\r\n if (this.subscriptions.delete(subscriptionId)) {\r\n this.logger.debug('Unsubscribed from messages', { id: subscriptionId });\r\n }\r\n }\r\n\r\n /**\r\n * Send message to iframe\r\n */\r\n public sendToIframe(\r\n iframeType: IframeType,\r\n type: MessageType,\r\n payload?: any\r\n ): void {\r\n const iframe = this.iframeManager.getIframe(iframeType);\r\n\r\n if (!iframe) {\r\n this.logger.warn('Iframe not found', { iframeType });\r\n return;\r\n }\r\n\r\n // Check if iframe is truly ready (JS ready, not just DOM loaded)\r\n const readyState = this.iframeReadyStates.get(iframeType);\r\n const isJsReady = readyState?.jsReady ?? false;\r\n\r\n // Allow weld:init to be sent before JS is ready (it triggers the ready response)\r\n if (!isJsReady && type !== ('weld:init' as MessageType)) {\r\n // Queue message if iframe not ready\r\n const message = createMessage(type, MessageOrigin.PARENT, payload);\r\n this.messageQueue.push({\r\n message,\r\n queuedAt: Date.now(),\r\n targetIframe: iframeType,\r\n });\r\n this.logger.debug('Message queued (iframe JS not ready)', {\r\n iframeType,\r\n type,\r\n });\r\n return;\r\n }\r\n\r\n const message = createMessage(type, MessageOrigin.PARENT, payload);\r\n this.postMessage(iframe.element, message);\r\n }\r\n\r\n /**\r\n * Send message to all iframes\r\n */\r\n public broadcast(type: MessageType, payload?: any): void {\r\n const message = createMessage(type, MessageOrigin.PARENT, payload);\r\n\r\n const launcherIframe = this.iframeManager.getIframe(IframeType.LAUNCHER);\r\n const widgetIframe = this.iframeManager.getIframe(IframeType.WIDGET);\r\n const launcherReady = this.iframeReadyStates.get(IframeType.LAUNCHER)?.jsReady ?? false;\r\n const widgetReady = this.iframeReadyStates.get(IframeType.WIDGET)?.jsReady ?? false;\r\n\r\n if (launcherIframe && launcherReady) {\r\n this.postMessage(launcherIframe.element, message);\r\n }\r\n if (widgetIframe && widgetReady) {\r\n this.postMessage(widgetIframe.element, message);\r\n }\r\n\r\n this.logger.debug('Message broadcast', { type });\r\n }\r\n\r\n /**\r\n * Send message and wait for response\r\n */\r\n public async sendAndWaitForResponse<T = any>(\r\n iframeType: IframeType,\r\n type: MessageType,\r\n payload?: any,\r\n timeout = 5000\r\n ): Promise<T> {\r\n return new Promise((resolve, reject) => {\r\n const message = createMessage(type, MessageOrigin.PARENT, payload);\r\n\r\n // Setup response handler\r\n const timeoutId = setTimeout(() => {\r\n this.responseHandlers.delete(message.id);\r\n reject(new Error('Message response timeout'));\r\n }, timeout);\r\n\r\n this.responseHandlers.set(message.id, (response: WeldMessage) => {\r\n clearTimeout(timeoutId);\r\n if (isPayloadMessage(response)) {\r\n resolve(response.payload as T);\r\n } else {\r\n resolve(undefined as T);\r\n }\r\n });\r\n\r\n // Send message\r\n const iframe = this.iframeManager.getIframe(iframeType);\r\n if (!iframe) {\r\n reject(new Error('Iframe not found'));\r\n return;\r\n }\r\n\r\n this.postMessage(iframe.element, message);\r\n });\r\n }\r\n\r\n /**\r\n * Post message to iframe\r\n */\r\n private postMessage(iframe: HTMLIFrameElement, message: WeldMessage): void {\r\n try {\r\n if (!iframe.contentWindow) {\r\n this.logger.warn('Iframe contentWindow not available - cross-origin issue?');\r\n return;\r\n }\r\n\r\n const targetOrigin = this.getTargetOrigin();\r\n iframe.contentWindow.postMessage(message, targetOrigin);\r\n this.logger.debug('Message sent', {\r\n type: message.type,\r\n id: message.id,\r\n targetOrigin,\r\n });\r\n } catch (error) {\r\n this.logger.error('Failed to post message - cross-origin issue?', error);\r\n }\r\n }\r\n\r\n /**\r\n * Mark iframe DOM as loaded (called from onload callback)\r\n * This triggers sending weld:init to the iframe\r\n */\r\n public setIframeDomLoaded(iframeType: IframeType): void {\r\n const readyState = this.iframeReadyStates.get(iframeType);\r\n if (readyState) {\r\n readyState.domLoaded = true;\r\n this.logger.debug(`Iframe ${iframeType} DOM loaded`);\r\n\r\n // Send weld:init message if not already sent\r\n if (!readyState.initSent) {\r\n this.sendInitMessage(iframeType);\r\n readyState.initSent = true;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Send weld:init message to iframe\r\n */\r\n private sendInitMessage(iframeType: IframeType): void {\r\n const iframe = this.iframeManager.getIframe(iframeType);\r\n if (!iframe) return;\r\n\r\n const initPayload = {\r\n widgetId: this.config.widgetId,\r\n iframeType,\r\n config: {\r\n api: this.config.api,\r\n customization: this.config.customization,\r\n features: this.config.features,\r\n },\r\n };\r\n\r\n const message = createMessage('weld:init' as MessageType, MessageOrigin.PARENT, initPayload);\r\n this.postMessage(iframe.element, message);\r\n this.logger.debug(`Sent weld:init to ${iframeType}`, initPayload);\r\n }\r\n\r\n /**\r\n * Mark iframe JS as ready (called when weld:ready message is received)\r\n * This flushes queued messages\r\n */\r\n public setIframeReady(iframeType: IframeType): void {\r\n const readyState = this.iframeReadyStates.get(iframeType);\r\n if (readyState) {\r\n readyState.jsReady = true;\r\n this.logger.debug(`Iframe ${iframeType} JS ready`);\r\n }\r\n\r\n // Also update iframeManager for backwards compatibility\r\n this.iframeManager.setIframeReady(iframeType);\r\n\r\n // Flush queued messages for this iframe\r\n this.flushMessageQueue(iframeType);\r\n\r\n // Check if all iframes JS ready\r\n if (this.areAllIframesJsReady()) {\r\n this.isReady = true;\r\n this.logger.info('All iframes JS ready');\r\n }\r\n }\r\n\r\n /**\r\n * Check if all iframes have JS ready\r\n */\r\n public areAllIframesJsReady(): boolean {\r\n const launcherState = this.iframeReadyStates.get(IframeType.LAUNCHER);\r\n const widgetState = this.iframeReadyStates.get(IframeType.WIDGET);\r\n\r\n // Both launcher and widget must be JS ready\r\n return (launcherState?.jsReady ?? false) && (widgetState?.jsReady ?? false);\r\n }\r\n\r\n /**\r\n * Check if a specific iframe is JS ready\r\n */\r\n public isIframeJsReady(iframeType: IframeType): boolean {\r\n return this.iframeReadyStates.get(iframeType)?.jsReady ?? false;\r\n }\r\n\r\n /**\r\n * Flush queued messages to iframe\r\n */\r\n private flushMessageQueue(iframeType: IframeType): void {\r\n const iframe = this.iframeManager.getIframe(iframeType);\r\n if (!iframe) return;\r\n\r\n // Filter messages for this iframe and remove from queue\r\n const messagesToFlush = this.messageQueue.filter(\r\n item => item.targetIframe === iframeType\r\n );\r\n this.messageQueue = this.messageQueue.filter(\r\n item => item.targetIframe !== iframeType\r\n );\r\n\r\n for (const item of messagesToFlush) {\r\n this.postMessage(iframe.element, item.message);\r\n }\r\n\r\n if (messagesToFlush.length > 0) {\r\n this.logger.debug('Flushed queued messages', {\r\n count: messagesToFlush.length,\r\n iframeType,\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Check if broker is ready\r\n */\r\n public isMessageBrokerReady(): boolean {\r\n return this.isReady;\r\n }\r\n\r\n /**\r\n * Get queued message count\r\n */\r\n public getQueuedMessageCount(): number {\r\n return this.messageQueue.length;\r\n }\r\n\r\n /**\r\n * Clear message queue\r\n */\r\n public clearMessageQueue(): void {\r\n this.messageQueue = [];\r\n this.logger.debug('Message queue cleared');\r\n }\r\n\r\n /**\r\n * Get active subscription count\r\n */\r\n public getSubscriptionCount(): number {\r\n return this.subscriptions.size;\r\n }\r\n\r\n /**\r\n * Destroy broker and cleanup\r\n */\r\n public destroy(): void {\r\n this.logger.debug('Destroying message broker');\r\n\r\n // Remove event listener using bound handler\r\n window.removeEventListener('message', this.boundHandleMessage);\r\n\r\n // Clear queue watcher\r\n if (this.queueWatcherInterval) {\r\n clearInterval(this.queueWatcherInterval);\r\n this.queueWatcherInterval = null;\r\n }\r\n\r\n // Clear subscriptions\r\n this.subscriptions.clear();\r\n\r\n // Clear message queue\r\n this.messageQueue = [];\r\n\r\n // Clear response handlers\r\n this.responseHandlers.clear();\r\n\r\n // Reset rate limiter\r\n this.rateLimiter.clearAll();\r\n\r\n // Reset ready states\r\n this.iframeReadyStates.clear();\r\n\r\n this.isReady = false;\r\n this.logger.info('MessageBroker destroyed');\r\n }\r\n}\r\n","/**\r\n * Weld SDK - State Types\r\n * Type definitions for state management across iframes\r\n */\r\n\r\n/**\r\n * Widget visibility state\r\n */\r\nexport enum WidgetVisibility {\r\n HIDDEN = 'hidden',\r\n VISIBLE = 'visible',\r\n MINIMIZED = 'minimized',\r\n}\r\n\r\n/**\r\n * Widget view types\r\n */\r\nexport enum WidgetView {\r\n HOME = 'home',\r\n CONVERSATION = 'conversation',\r\n CONVERSATIONS = 'conversations',\r\n HELP = 'help',\r\n SETTINGS = 'settings',\r\n SEARCH = 'search',\r\n}\r\n\r\n/**\r\n * Connection status\r\n */\r\nexport enum ConnectionStatus {\r\n DISCONNECTED = 'disconnected',\r\n CONNECTING = 'connecting',\r\n CONNECTED = 'connected',\r\n RECONNECTING = 'reconnecting',\r\n ERROR = 'error',\r\n}\r\n\r\n/**\r\n * Message status\r\n */\r\nexport enum MessageStatus {\r\n SENDING = 'sending',\r\n SENT = 'sent',\r\n DELIVERED = 'delivered',\r\n READ = 'read',\r\n FAILED = 'failed',\r\n}\r\n\r\n/**\r\n * User state\r\n */\r\nexport interface UserState {\r\n id?: string;\r\n email?: string;\r\n name?: string;\r\n avatar?: string;\r\n metadata?: Record<string, any>;\r\n isAuthenticated: boolean;\r\n isAnonymous: boolean;\r\n}\r\n\r\n/**\r\n * Conversation state\r\n */\r\nexport interface ConversationState {\r\n id?: string;\r\n messages: Message[];\r\n participants: Participant[];\r\n unreadCount: number;\r\n lastMessageAt?: number;\r\n isTyping: boolean;\r\n typingUsers: string[];\r\n}\r\n\r\n/**\r\n * Message interface\r\n */\r\nexport interface Message {\r\n id: string;\r\n conversationId: string;\r\n text: string;\r\n sender: {\r\n id: string;\r\n name: string;\r\n avatar?: string;\r\n type: 'user' | 'agent' | 'bot';\r\n };\r\n status: MessageStatus;\r\n timestamp: number;\r\n createdAt: number;\r\n updatedAt?: number;\r\n attachments?: Attachment[];\r\n reactions?: Reaction[];\r\n metadata?: Record<string, any>;\r\n}\r\n\r\n/**\r\n * Attachment interface\r\n */\r\nexport interface Attachment {\r\n id: string;\r\n type: 'image' | 'file' | 'video' | 'audio';\r\n url: string;\r\n name: string;\r\n size: number;\r\n mimeType: string;\r\n thumbnail?: string;\r\n}\r\n\r\n/**\r\n * Reaction interface\r\n */\r\nexport interface Reaction {\r\n emoji: string;\r\n count: number;\r\n users: string[];\r\n}\r\n\r\n/**\r\n * Participant interface\r\n */\r\nexport interface Participant {\r\n id: string;\r\n name: string;\r\n avatar?: string;\r\n type: 'user' | 'agent' | 'bot';\r\n isOnline: boolean;\r\n lastSeenAt?: number;\r\n}\r\n\r\n/**\r\n * Widget state\r\n */\r\nexport interface WidgetState {\r\n visibility: WidgetVisibility;\r\n view: WidgetView;\r\n isOpen: boolean;\r\n isMinimized: boolean;\r\n dimensions: {\r\n width: string;\r\n height: string;\r\n };\r\n position: {\r\n bottom: string;\r\n right: string;\r\n };\r\n}\r\n\r\n/**\r\n * Launcher state\r\n */\r\nexport interface LauncherState {\r\n isVisible: boolean;\r\n badge: {\r\n count: number;\r\n text?: string;\r\n show: boolean;\r\n };\r\n customColor?: string;\r\n tooltip?: string;\r\n}\r\n\r\n/**\r\n * Backdrop state\r\n */\r\nexport interface BackdropState {\r\n isVisible: boolean;\r\n closeOnClick: boolean;\r\n opacity: number;\r\n}\r\n\r\n/**\r\n * Mobile state\r\n */\r\nexport interface MobileState {\r\n isFullScreen: boolean;\r\n isScrollLocked: boolean;\r\n keyboardHeight: number;\r\n orientation: 'portrait' | 'landscape';\r\n safeAreaInsets: {\r\n top: number;\r\n right: number;\r\n bottom: number;\r\n left: number;\r\n };\r\n}\r\n\r\n/**\r\n * Network state\r\n */\r\nexport interface NetworkState {\r\n status: ConnectionStatus;\r\n lastConnected?: number;\r\n retryCount: number;\r\n latency?: number;\r\n}\r\n\r\n/**\r\n * UI state\r\n */\r\nexport interface UIState {\r\n theme: 'light' | 'dark' | 'auto';\r\n locale: string;\r\n isLoading: boolean;\r\n error?: {\r\n code: string;\r\n message: string;\r\n recoverable: boolean;\r\n };\r\n}\r\n\r\n/**\r\n * Main application state\r\n */\r\nexport interface WeldState {\r\n user: UserState;\r\n conversation: ConversationState;\r\n widget: WidgetState;\r\n launcher: LauncherState;\r\n backdrop: BackdropState;\r\n mobile: MobileState;\r\n network: NetworkState;\r\n ui: UIState;\r\n initialized: boolean;\r\n lastUpdated: number;\r\n}\r\n\r\n/**\r\n * State update action\r\n */\r\nexport interface StateAction<T = any> {\r\n type: string;\r\n path: keyof WeldState | string;\r\n payload: T;\r\n merge?: boolean;\r\n timestamp: number;\r\n}\r\n\r\n/**\r\n * State listener callback\r\n */\r\nexport type StateListener<T = any> = (newState: T, oldState: T) => void;\r\n\r\n/**\r\n * State subscription\r\n */\r\nexport interface StateSubscription {\r\n id: string;\r\n path: string;\r\n listener: StateListener;\r\n immediate?: boolean;\r\n}\r\n\r\n/**\r\n * Initial state factory\r\n */\r\nexport function createInitialState(): WeldState {\r\n return {\r\n user: {\r\n isAuthenticated: false,\r\n isAnonymous: true,\r\n },\r\n conversation: {\r\n messages: [],\r\n participants: [],\r\n unreadCount: 0,\r\n isTyping: false,\r\n typingUsers: [],\r\n },\r\n widget: {\r\n visibility: WidgetVisibility.HIDDEN,\r\n view: WidgetView.HOME,\r\n isOpen: false,\r\n isMinimized: false,\r\n dimensions: {\r\n width: '400px',\r\n height: 'min(680px, 88vh)',\r\n },\r\n position: {\r\n bottom: '24px',\r\n right: '24px',\r\n },\r\n },\r\n launcher: {\r\n isVisible: true,\r\n badge: {\r\n count: 0,\r\n show: false,\r\n },\r\n },\r\n backdrop: {\r\n isVisible: false,\r\n closeOnClick: true,\r\n opacity: 0,\r\n },\r\n mobile: {\r\n isFullScreen: false,\r\n isScrollLocked: false,\r\n keyboardHeight: 0,\r\n orientation: 'portrait',\r\n safeAreaInsets: {\r\n top: 0,\r\n right: 0,\r\n bottom: 0,\r\n left: 0,\r\n },\r\n },\r\n network: {\r\n status: ConnectionStatus.DISCONNECTED,\r\n retryCount: 0,\r\n },\r\n ui: {\r\n theme: 'auto',\r\n locale: 'en',\r\n isLoading: false,\r\n },\r\n initialized: false,\r\n lastUpdated: Date.now(),\r\n };\r\n}\r\n\r\n/**\r\n * State path utility\r\n */\r\nexport function getStateValue<T = any>(state: WeldState, path: string): T {\r\n const keys = path.split('.');\r\n let value: any = state;\r\n\r\n for (const key of keys) {\r\n if (value && typeof value === 'object' && key in value) {\r\n value = value[key];\r\n } else {\r\n return undefined as T;\r\n }\r\n }\r\n\r\n return value as T;\r\n}\r\n\r\n/**\r\n * State update utility\r\n */\r\nexport function setStateValue(\r\n state: WeldState,\r\n path: string,\r\n value: any,\r\n merge = false\r\n): WeldState {\r\n const keys = path.split('.');\r\n const newState = JSON.parse(JSON.stringify(state));\r\n let current: any = newState;\r\n\r\n for (let i = 0; i < keys.length - 1; i++) {\r\n const key = keys[i];\r\n if (!(key in current)) {\r\n current[key] = {};\r\n }\r\n current = current[key];\r\n }\r\n\r\n const lastKey = keys[keys.length - 1];\r\n\r\n if (merge && typeof current[lastKey] === 'object' && typeof value === 'object') {\r\n current[lastKey] = { ...current[lastKey], ...value };\r\n } else {\r\n current[lastKey] = value;\r\n }\r\n\r\n newState.lastUpdated = Date.now();\r\n return newState;\r\n}\r\n","/**\r\n * Weld SDK - Validation Utilities\r\n * Input validation and sanitization functions\r\n */\r\n\r\n/**\r\n * Validate email format\r\n */\r\nexport function isValidEmail(email: string): boolean {\r\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\r\n return emailRegex.test(email);\r\n}\r\n\r\n/**\r\n * Validate URL format\r\n */\r\nexport function isValidUrl(url: string): boolean {\r\n try {\r\n new URL(url);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Validate API key format\r\n */\r\nexport function isValidApiKey(apiKey: string): boolean {\r\n return typeof apiKey === 'string' && apiKey.length > 0 && apiKey.length <= 256;\r\n}\r\n\r\n/**\r\n * Validate workspace ID format\r\n */\r\nexport function isValidWorkspaceId(workspaceId: string): boolean {\r\n return typeof workspaceId === 'string' && workspaceId.length > 0 && workspaceId.length <= 128;\r\n}\r\n\r\n/**\r\n * Validate color format (hex, rgb, rgba)\r\n */\r\nexport function isValidColor(color: string): boolean {\r\n const hexRegex = /^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/;\r\n const rgbRegex = /^rgb\\(\\s*\\d+\\s*,\\s*\\d+\\s*,\\s*\\d+\\s*\\)$/;\r\n const rgbaRegex = /^rgba\\(\\s*\\d+\\s*,\\s*\\d+\\s*,\\s*\\d+\\s*,\\s*(0|1|0?\\.\\d+)\\s*\\)$/;\r\n\r\n return hexRegex.test(color) || rgbRegex.test(color) || rgbaRegex.test(color);\r\n}\r\n\r\n/**\r\n * Validate message text\r\n */\r\nexport function isValidMessageText(text: string): boolean {\r\n return typeof text === 'string' && text.trim().length > 0 && text.length <= 10000;\r\n}\r\n\r\n/**\r\n * Sanitize HTML to prevent XSS\r\n */\r\nexport function sanitizeHtml(html: string): string {\r\n const div = document.createElement('div');\r\n div.textContent = html;\r\n return div.innerHTML;\r\n}\r\n\r\n/**\r\n * Sanitize user input\r\n */\r\nexport function sanitizeInput(input: string): string {\r\n if (typeof input !== 'string') {\r\n return '';\r\n }\r\n\r\n return input\r\n .trim()\r\n .replace(/[<>]/g, '') // Remove angle brackets\r\n .replace(/javascript:/gi, '') // Remove javascript: protocol\r\n .replace(/on\\w+\\s*=/gi, ''); // Remove event handlers\r\n}\r\n\r\n/**\r\n * Validate object has required properties\r\n */\r\nexport function hasRequiredProperties<T extends Record<string, any>>(\r\n obj: any,\r\n properties: (keyof T)[]\r\n): obj is T {\r\n if (typeof obj !== 'object' || obj === null) {\r\n return false;\r\n }\r\n\r\n return properties.every((prop) => prop in obj);\r\n}\r\n\r\n/**\r\n * Validate string length\r\n */\r\nexport function isValidLength(\r\n str: string,\r\n options: { min?: number; max?: number }\r\n): boolean {\r\n const length = str.length;\r\n\r\n if (options.min !== undefined && length < options.min) {\r\n return false;\r\n }\r\n\r\n if (options.max !== undefined && length > options.max) {\r\n return false;\r\n }\r\n\r\n return true;\r\n}\r\n\r\n/**\r\n * Validate number range\r\n */\r\nexport function isInRange(\r\n num: number,\r\n options: { min?: number; max?: number }\r\n): boolean {\r\n if (options.min !== undefined && num < options.min) {\r\n return false;\r\n }\r\n\r\n if (options.max !== undefined && num > options.max) {\r\n return false;\r\n }\r\n\r\n return true;\r\n}\r\n\r\n/**\r\n * Validate array length\r\n */\r\nexport function isValidArrayLength<T>(\r\n arr: T[],\r\n options: { min?: number; max?: number }\r\n): boolean {\r\n if (!Array.isArray(arr)) {\r\n return false;\r\n }\r\n\r\n return isInRange(arr.length, options);\r\n}\r\n\r\n/**\r\n * Deep clone object (safe for JSON-serializable objects)\r\n */\r\nexport function deepClone<T>(obj: T): T {\r\n if (obj === null || typeof obj !== 'object') {\r\n return obj;\r\n }\r\n\r\n if (obj instanceof Date) {\r\n return new Date(obj.getTime()) as any;\r\n }\r\n\r\n if (obj instanceof Array) {\r\n return obj.map((item) => deepClone(item)) as any;\r\n }\r\n\r\n if (obj instanceof Object) {\r\n const cloned: any = {};\r\n for (const key in obj) {\r\n if (obj.hasOwnProperty(key)) {\r\n cloned[key] = deepClone(obj[key]);\r\n }\r\n }\r\n return cloned;\r\n }\r\n\r\n return obj;\r\n}\r\n\r\n/**\r\n * Check if value is a plain object\r\n */\r\nexport function isPlainObject(value: any): value is Record<string, any> {\r\n if (typeof value !== 'object' || value === null) {\r\n return false;\r\n }\r\n\r\n const proto = Object.getPrototypeOf(value);\r\n return proto === null || proto === Object.prototype;\r\n}\r\n\r\n/**\r\n * Merge objects deeply\r\n */\r\nexport function deepMerge<T extends Record<string, any>>(\r\n target: T,\r\n ...sources: Partial<T>[]\r\n): T {\r\n if (!sources.length) return target;\r\n\r\n const source = sources.shift();\r\n if (!source) return target;\r\n\r\n if (isPlainObject(target) && isPlainObject(source)) {\r\n for (const key in source) {\r\n if (isPlainObject(source[key])) {\r\n if (!target[key]) {\r\n Object.assign(target, { [key]: {} });\r\n }\r\n deepMerge(target[key], source[key] as any);\r\n } else {\r\n Object.assign(target, { [key]: source[key] });\r\n }\r\n }\r\n }\r\n\r\n return deepMerge(target, ...sources);\r\n}\r\n\r\n/**\r\n * Validate file type\r\n */\r\nexport function isValidFileType(file: File, allowedTypes: string[]): boolean {\r\n return allowedTypes.some((type) => {\r\n if (type.endsWith('/*')) {\r\n const category = type.split('/')[0];\r\n return file.type.startsWith(category + '/');\r\n }\r\n return file.type === type;\r\n });\r\n}\r\n\r\n/**\r\n * Validate file size\r\n */\r\nexport function isValidFileSize(file: File, maxSizeBytes: number): boolean {\r\n return file.size <= maxSizeBytes;\r\n}\r\n\r\n/**\r\n * Format file size for display\r\n */\r\nexport function formatFileSize(bytes: number): string {\r\n if (bytes === 0) return '0 Bytes';\r\n\r\n const k = 1024;\r\n const sizes = ['Bytes', 'KB', 'MB', 'GB'];\r\n const i = Math.floor(Math.log(bytes) / Math.log(k));\r\n\r\n return Math.round(bytes / Math.pow(k, i) * 100) / 100 + ' ' + sizes[i];\r\n}\r\n","/**\r\n * Weld SDK - State Coordinator\r\n * Manages and synchronizes state across iframes\r\n */\r\n\r\nimport type {\r\n WeldState,\r\n StateAction,\r\n StateListener,\r\n StateSubscription,\r\n} from '../types/state';\r\nimport {\r\n createInitialState,\r\n getStateValue,\r\n setStateValue,\r\n} from '../types/state';\r\nimport type { MessageType } from '../types/messages';\r\nimport { Logger } from '../utils/logger';\r\nimport { MessageBroker } from './MessageBroker';\r\nimport { deepClone } from '../utils/validation';\r\n\r\n/**\r\n * StateCoordinator class\r\n * Central state management for multi-iframe architecture\r\n */\r\nexport class StateCoordinator {\r\n private state: WeldState;\r\n private logger: Logger;\r\n private messageBroker: MessageBroker;\r\n private subscriptions: Map<string, StateSubscription> = new Map();\r\n private stateHistory: StateAction[] = [];\r\n private maxHistorySize = 50;\r\n\r\n constructor(messageBroker: MessageBroker, logger: Logger) {\r\n this.messageBroker = messageBroker;\r\n this.logger = logger.child('[StateCoordinator]');\r\n this.state = createInitialState();\r\n\r\n this.setupMessageHandlers();\r\n this.logger.debug('StateCoordinator initialized');\r\n }\r\n\r\n /**\r\n * Setup message handlers for state updates\r\n */\r\n private setupMessageHandlers(): void {\r\n // Listen for state update requests from iframes\r\n this.messageBroker.subscribe(\r\n 'weld:state:update' as MessageType,\r\n this.handleStateUpdate.bind(this)\r\n );\r\n\r\n // Listen for state request messages\r\n this.messageBroker.subscribe(\r\n 'weld:state:request' as MessageType,\r\n this.handleStateRequest.bind(this)\r\n );\r\n\r\n this.logger.debug('Message handlers setup');\r\n }\r\n\r\n /**\r\n * Handle state update from iframe\r\n */\r\n private handleStateUpdate(payload: any): void {\r\n const { path, value, merge } = payload;\r\n\r\n if (!path) {\r\n this.logger.warn('State update missing path', payload);\r\n return;\r\n }\r\n\r\n this.updateState(path, value, merge);\r\n }\r\n\r\n /**\r\n * Handle state request from iframe\r\n */\r\n private handleStateRequest(payload: any): void {\r\n const { path } = payload;\r\n\r\n if (path) {\r\n const value = getStateValue(this.state, path);\r\n this.messageBroker.broadcast('weld:state:response' as MessageType, {\r\n path,\r\n value,\r\n });\r\n } else {\r\n // Send entire state\r\n this.messageBroker.broadcast('weld:state:response' as MessageType, {\r\n state: this.state,\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Get current state\r\n */\r\n public getState(): WeldState {\r\n return deepClone(this.state);\r\n }\r\n\r\n /**\r\n * Get state value by path\r\n */\r\n public getValue<T = any>(path: string): T {\r\n return getStateValue(this.state, path);\r\n }\r\n\r\n /**\r\n * Update state\r\n */\r\n public updateState(path: string, value: any, merge = false): void {\r\n const oldState = deepClone(this.state);\r\n this.state = setStateValue(this.state, path, value, merge);\r\n\r\n // Create state action\r\n const action: StateAction = {\r\n type: 'UPDATE',\r\n path,\r\n payload: value,\r\n merge,\r\n timestamp: Date.now(),\r\n };\r\n\r\n // Add to history\r\n this.addToHistory(action);\r\n\r\n // Notify subscribers\r\n this.notifySubscribers(path, value, getStateValue(oldState, path));\r\n\r\n // Broadcast to iframes\r\n this.messageBroker.broadcast('weld:state:update' as MessageType, {\r\n path,\r\n value,\r\n merge,\r\n });\r\n\r\n this.logger.debug('State updated', { path, merge });\r\n }\r\n\r\n /**\r\n * Batch update multiple state paths\r\n */\r\n public batchUpdate(updates: Array<{ path: string; value: any; merge?: boolean }>): void {\r\n const oldState = deepClone(this.state);\r\n\r\n for (const update of updates) {\r\n this.state = setStateValue(\r\n this.state,\r\n update.path,\r\n update.value,\r\n update.merge\r\n );\r\n }\r\n\r\n // Notify subscribers for each update\r\n for (const update of updates) {\r\n this.notifySubscribers(\r\n update.path,\r\n getStateValue(this.state, update.path),\r\n getStateValue(oldState, update.path)\r\n );\r\n }\r\n\r\n // Broadcast all updates\r\n this.messageBroker.broadcast('weld:state:update' as MessageType, {\r\n batch: updates,\r\n });\r\n\r\n this.logger.debug('Batch state update', { count: updates.length });\r\n }\r\n\r\n /**\r\n * Reset state to initial\r\n */\r\n public resetState(): void {\r\n const oldState = this.state;\r\n this.state = createInitialState();\r\n\r\n // Notify all subscribers\r\n for (const [_id, subscription] of this.subscriptions) {\r\n const oldValue = getStateValue(oldState, subscription.path);\r\n const newValue = getStateValue(this.state, subscription.path);\r\n subscription.listener(newValue, oldValue);\r\n }\r\n\r\n // Broadcast reset\r\n this.messageBroker.broadcast('weld:state:update' as MessageType, {\r\n reset: true,\r\n state: this.state,\r\n });\r\n\r\n this.logger.debug('State reset');\r\n }\r\n\r\n /**\r\n * Subscribe to state changes\r\n */\r\n public subscribe<T = any>(\r\n path: string,\r\n listener: StateListener<T>,\r\n immediate = false\r\n ): string {\r\n const id = `sub_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\r\n\r\n this.subscriptions.set(id, {\r\n id,\r\n path,\r\n listener,\r\n immediate,\r\n });\r\n\r\n // Call listener immediately if requested\r\n if (immediate) {\r\n const value = getStateValue(this.state, path);\r\n listener(value, value);\r\n }\r\n\r\n this.logger.debug('State subscription added', { id, path });\r\n return id;\r\n }\r\n\r\n /**\r\n * Unsubscribe from state changes\r\n */\r\n public unsubscribe(subscriptionId: string): void {\r\n if (this.subscriptions.delete(subscriptionId)) {\r\n this.logger.debug('State subscription removed', { id: subscriptionId });\r\n }\r\n }\r\n\r\n /**\r\n * Notify subscribers of state change\r\n */\r\n private notifySubscribers(path: string, newValue: any, oldValue: any): void {\r\n const subscriptions = Array.from(this.subscriptions.values());\r\n\r\n for (const subscription of subscriptions) {\r\n // Exact path match\r\n if (subscription.path === path) {\r\n try {\r\n subscription.listener(newValue, oldValue);\r\n } catch (error) {\r\n this.logger.error('Error in state listener', error);\r\n }\r\n continue;\r\n }\r\n\r\n // Parent path match (e.g., subscriber to \"user\" gets notified for \"user.name\")\r\n if (path.startsWith(subscription.path + '.')) {\r\n const subValue = getStateValue(this.state, subscription.path);\r\n try {\r\n subscription.listener(subValue, oldValue);\r\n } catch (error) {\r\n this.logger.error('Error in state listener', error);\r\n }\r\n continue;\r\n }\r\n\r\n // Child path match (e.g., subscriber to \"user.name\" gets notified for \"user\")\r\n if (subscription.path.startsWith(path + '.')) {\r\n const subValue = getStateValue(this.state, subscription.path);\r\n try {\r\n subscription.listener(subValue, undefined);\r\n } catch (error) {\r\n this.logger.error('Error in state listener', error);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Add action to history\r\n */\r\n private addToHistory(action: StateAction): void {\r\n this.stateHistory.push(action);\r\n\r\n // Trim history if too large\r\n if (this.stateHistory.length > this.maxHistorySize) {\r\n this.stateHistory.shift();\r\n }\r\n }\r\n\r\n /**\r\n * Get state history\r\n */\r\n public getHistory(): StateAction[] {\r\n return [...this.stateHistory];\r\n }\r\n\r\n /**\r\n * Clear state history\r\n */\r\n public clearHistory(): void {\r\n this.stateHistory = [];\r\n this.logger.debug('State history cleared');\r\n }\r\n\r\n /**\r\n * Get snapshot of state at specific time\r\n */\r\n public getSnapshot(timestamp: number): WeldState | null {\r\n // Find all actions before timestamp\r\n const actions = this.stateHistory.filter((a) => a.timestamp <= timestamp);\r\n\r\n if (actions.length === 0) {\r\n return null;\r\n }\r\n\r\n // Replay actions to reconstruct state\r\n let state = createInitialState();\r\n for (const action of actions) {\r\n state = setStateValue(state, action.path, action.payload, action.merge);\r\n }\r\n\r\n return state;\r\n }\r\n\r\n /**\r\n * Widget-specific state helpers\r\n */\r\n public openWidget(): void {\r\n this.batchUpdate([\r\n { path: 'widget.isOpen', value: true },\r\n { path: 'widget.visibility', value: 'visible' },\r\n { path: 'launcher.isVisible', value: false },\r\n { path: 'backdrop.isVisible', value: true },\r\n ]);\r\n }\r\n\r\n public closeWidget(): void {\r\n this.batchUpdate([\r\n { path: 'widget.isOpen', value: false },\r\n { path: 'widget.visibility', value: 'hidden' },\r\n { path: 'launcher.isVisible', value: true },\r\n { path: 'backdrop.isVisible', value: false },\r\n ]);\r\n }\r\n\r\n public minimizeWidget(): void {\r\n this.batchUpdate([\r\n { path: 'widget.isMinimized', value: true },\r\n { path: 'widget.visibility', value: 'minimized' },\r\n ]);\r\n }\r\n\r\n public maximizeWidget(): void {\r\n this.batchUpdate([\r\n { path: 'widget.isMinimized', value: false },\r\n { path: 'widget.visibility', value: 'visible' },\r\n ]);\r\n }\r\n\r\n public setBadgeCount(count: number): void {\r\n this.batchUpdate([\r\n { path: 'launcher.badge.count', value: count },\r\n { path: 'launcher.badge.show', value: count > 0 },\r\n ]);\r\n }\r\n\r\n public setUserAuth(userId: string, email?: string, name?: string): void {\r\n this.batchUpdate([\r\n { path: 'user.isAuthenticated', value: true },\r\n { path: 'user.isAnonymous', value: false },\r\n { path: 'user.id', value: userId },\r\n { path: 'user.email', value: email },\r\n { path: 'user.name', value: name },\r\n ]);\r\n }\r\n\r\n public setConnectionStatus(status: string): void {\r\n this.updateState('network.status', status);\r\n }\r\n\r\n public setLoading(isLoading: boolean): void {\r\n this.updateState('ui.isLoading', isLoading);\r\n }\r\n\r\n public setError(code: string, message: string, recoverable = true): void {\r\n this.updateState('ui.error', { code, message, recoverable });\r\n }\r\n\r\n public clearError(): void {\r\n this.updateState('ui.error', undefined);\r\n }\r\n\r\n /**\r\n * Get active subscription count\r\n */\r\n public getSubscriptionCount(): number {\r\n return this.subscriptions.size;\r\n }\r\n\r\n /**\r\n * Validate state integrity\r\n */\r\n public validateState(): boolean {\r\n try {\r\n // Check required properties exist\r\n const requiredPaths = [\r\n 'user',\r\n 'conversation',\r\n 'widget',\r\n 'launcher',\r\n 'backdrop',\r\n 'mobile',\r\n 'network',\r\n 'ui',\r\n ];\r\n\r\n for (const path of requiredPaths) {\r\n if (getStateValue(this.state, path) === undefined) {\r\n this.logger.error('Missing required state path', { path });\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n } catch (error) {\r\n this.logger.error('State validation failed', error);\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Export state as JSON\r\n */\r\n public exportState(): string {\r\n return JSON.stringify(this.state, null, 2);\r\n }\r\n\r\n /**\r\n * Import state from JSON\r\n */\r\n public importState(json: string): boolean {\r\n try {\r\n const imported = JSON.parse(json);\r\n this.state = { ...createInitialState(), ...imported };\r\n this.messageBroker.broadcast('weld:state:update' as MessageType, {\r\n reset: true,\r\n state: this.state,\r\n });\r\n this.logger.info('State imported');\r\n return true;\r\n } catch (error) {\r\n this.logger.error('Failed to import state', error);\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Destroy coordinator and cleanup\r\n */\r\n public destroy(): void {\r\n this.logger.debug('Destroying state coordinator');\r\n\r\n // Clear subscriptions\r\n this.subscriptions.clear();\r\n\r\n // Clear history\r\n this.stateHistory = [];\r\n\r\n // Reset state\r\n this.state = createInitialState();\r\n\r\n this.logger.info('StateCoordinator destroyed');\r\n }\r\n}\r\n","/**\r\n * Weld SDK - Main Entry Point\r\n * Public API for the Weld helpdesk widget\r\n */\r\n\r\nimport type { WeldConfig, ResolvedConfig } from '../types/config';\r\nimport { resolveConfig } from '../types/config';\r\nimport type { WeldState } from '../types/state';\r\nimport type { MessageType } from '../types/messages';\r\nimport { Logger } from '../utils/logger';\r\nimport { IframeManager, IframeType } from './IframeManager';\r\nimport { MessageBroker } from './MessageBroker';\r\nimport { StateCoordinator } from './StateCoordinator';\r\nimport packageJson from '../../package.json';\r\n\r\n/**\r\n * SDK initialization status\r\n */\r\nenum SDKStatus {\r\n UNINITIALIZED = 'uninitialized',\r\n INITIALIZING = 'initializing',\r\n READY = 'ready',\r\n ERROR = 'error',\r\n DESTROYED = 'destroyed',\r\n}\r\n\r\n/**\r\n * User identification data\r\n */\r\nexport interface UserIdentity {\r\n userId: string;\r\n email?: string;\r\n name?: string;\r\n avatar?: string;\r\n metadata?: Record<string, any>;\r\n}\r\n\r\n/**\r\n * WeldSDK class\r\n * Main SDK interface for embedding the widget\r\n */\r\nexport class WeldSDK {\r\n private config: ResolvedConfig;\r\n private logger: Logger;\r\n private iframeManager: IframeManager;\r\n private messageBroker: MessageBroker;\r\n private stateCoordinator: StateCoordinator;\r\n private status: SDKStatus = SDKStatus.UNINITIALIZED;\r\n private readyPromise: Promise<void> | null = null;\r\n private readyResolve: (() => void) | null = null;\r\n\r\n // Bound event handlers for proper cleanup\r\n private boundHandleLauncherClick: (event: MessageEvent) => void;\r\n\r\n // Subscription IDs for cleanup\r\n private subscriptionIds: string[] = [];\r\n\r\n constructor(config: WeldConfig) {\r\n // Resolve configuration\r\n this.config = resolveConfig(config);\r\n\r\n // Initialize logger\r\n this.logger = new Logger(this.config.logging);\r\n this.logger.info('WeldSDK created', {\r\n widgetId: this.config.widgetId,\r\n });\r\n\r\n // Create ready promise\r\n this.readyPromise = new Promise((resolve) => {\r\n this.readyResolve = resolve;\r\n });\r\n\r\n // Bind handlers once for proper cleanup\r\n this.boundHandleLauncherClick = this.handleLauncherClickMessage.bind(this);\r\n\r\n // Initialize managers\r\n this.iframeManager = new IframeManager(this.config);\r\n this.messageBroker = new MessageBroker(\r\n this.config,\r\n this.iframeManager,\r\n this.logger\r\n );\r\n this.stateCoordinator = new StateCoordinator(\r\n this.messageBroker,\r\n this.logger\r\n );\r\n }\r\n\r\n /**\r\n * Handle launcher click messages from iframe\r\n */\r\n private handleLauncherClickMessage(event: MessageEvent): void {\r\n // Log all messages from iframes for debugging\r\n if (event.data?.type) {\r\n console.log('[Weld SDK] Received message:', event.data.type);\r\n }\r\n\r\n if (event.data?.type === 'launcher:clicked') {\r\n // Toggle behavior - if widget is open, close it; if closed, open it\r\n const state = this.stateCoordinator.getState();\r\n if (state.widget.isOpen) {\r\n console.log('[Weld SDK] Launcher clicked - closing widget (toggle)');\r\n this.close();\r\n } else {\r\n console.log('[Weld SDK] Launcher clicked - opening widget');\r\n this.open();\r\n }\r\n }\r\n if (event.data?.type === 'weld:close') {\r\n console.log('[Weld SDK] Widget close requested');\r\n this.close();\r\n }\r\n }\r\n\r\n /**\r\n * Initialize the SDK and render widget\r\n */\r\n public async init(): Promise<void> {\r\n if (this.status !== SDKStatus.UNINITIALIZED) {\r\n this.logger.warn('SDK already initialized');\r\n return this.readyPromise!;\r\n }\r\n\r\n this.status = SDKStatus.INITIALIZING;\r\n this.logger.info('Initializing WeldSDK');\r\n\r\n try {\r\n // Setup ready handlers BEFORE initializing iframes\r\n // This ensures we catch the weld:ready messages\r\n this.setupReadyHandlers();\r\n\r\n // Initialize iframe manager (creates iframes, triggers onload -> weld:init)\r\n await this.iframeManager.init(this.messageBroker);\r\n\r\n // Wait for all iframes JS to be ready (weld:ready messages received)\r\n await this.waitForIframesReady();\r\n\r\n // Mark as ready\r\n this.status = SDKStatus.READY;\r\n this.readyResolve?.();\r\n this.logger.info('WeldSDK ready');\r\n\r\n // Call onReady callback\r\n this.config.onReady?.();\r\n } catch (error) {\r\n this.status = SDKStatus.ERROR;\r\n this.logger.error('Failed to initialize WeldSDK', error);\r\n this.config.onError?.(error as Error);\r\n throw error;\r\n }\r\n\r\n return this.readyPromise!;\r\n }\r\n\r\n /**\r\n * Setup ready message handlers\r\n */\r\n private setupReadyHandlers(): void {\r\n // Subscribe to weld:ready messages from iframes\r\n const readySubId = this.messageBroker.subscribe('weld:ready' as MessageType, (payload) => {\r\n const { iframe } = payload;\r\n this.logger.debug('Iframe JS ready signal received', { iframe });\r\n\r\n // Map iframe name to type\r\n const iframeType = this.mapIframeNameToType(iframe);\r\n if (iframeType) {\r\n this.messageBroker.setIframeReady(iframeType);\r\n }\r\n });\r\n this.subscriptionIds.push(readySubId);\r\n\r\n // Listen for launcher click events from the iframe using bound handler\r\n window.addEventListener('message', this.boundHandleLauncherClick);\r\n }\r\n\r\n /**\r\n * Map iframe name to type\r\n */\r\n private mapIframeNameToType(name: string): IframeType | null {\r\n if (name.includes('launcher')) return IframeType.LAUNCHER;\r\n if (name.includes('widget')) return IframeType.WIDGET;\r\n return null;\r\n }\r\n\r\n /**\r\n * Wait for all iframes JS to be ready (weld:ready messages received)\r\n */\r\n private async waitForIframesReady(timeout = 10000): Promise<void> {\r\n const startTime = Date.now();\r\n\r\n return new Promise((resolve, reject) => {\r\n const checkReady = () => {\r\n // Check for actual JS ready state (weld:ready received), not just DOM loaded\r\n if (this.messageBroker.areAllIframesJsReady()) {\r\n this.logger.debug('All iframes JS ready - initialization complete');\r\n resolve();\r\n return;\r\n }\r\n\r\n if (Date.now() - startTime > timeout) {\r\n // Log which iframes are not ready for debugging\r\n const launcherReady = this.messageBroker.isIframeJsReady(IframeType.LAUNCHER);\r\n const widgetReady = this.messageBroker.isIframeJsReady(IframeType.WIDGET);\r\n this.logger.error('Timeout waiting for iframes JS ready', {\r\n launcherReady,\r\n widgetReady,\r\n });\r\n reject(new Error(`Timeout waiting for iframes JS ready. Launcher: ${launcherReady}, Widget: ${widgetReady}`));\r\n return;\r\n }\r\n\r\n setTimeout(checkReady, 100);\r\n };\r\n\r\n checkReady();\r\n });\r\n }\r\n\r\n /**\r\n * Wait for SDK to be ready\r\n */\r\n public async ready(): Promise<void> {\r\n return this.readyPromise!;\r\n }\r\n\r\n /**\r\n * Check if SDK is ready\r\n */\r\n public isReady(): boolean {\r\n return this.status === SDKStatus.READY;\r\n }\r\n\r\n /**\r\n * Open the widget\r\n */\r\n public open(): void {\r\n this.ensureReady();\r\n console.log('[Weld SDK] Opening widget...');\r\n\r\n this.stateCoordinator.openWidget();\r\n this.iframeManager.showIframe(IframeType.WIDGET);\r\n this.iframeManager.showIframe(IframeType.BACKDROP);\r\n // Keep launcher visible so user can click it to close the widget\r\n\r\n // Send open message to the widget iframe\r\n const widgetIframe = this.iframeManager.getIframe(IframeType.WIDGET);\r\n if (widgetIframe?.element?.contentWindow) {\r\n widgetIframe.element.contentWindow.postMessage({ type: 'weld:open' }, '*');\r\n }\r\n\r\n // Notify launcher that widget is now open (so it can show X icon)\r\n const launcherIframe = this.iframeManager.getIframe(IframeType.LAUNCHER);\r\n if (launcherIframe?.element?.contentWindow) {\r\n launcherIframe.element.contentWindow.postMessage({ type: 'weld:widget-opened' }, '*');\r\n }\r\n\r\n this.config.onOpen?.();\r\n }\r\n\r\n /**\r\n * Close the widget\r\n */\r\n public close(): void {\r\n this.ensureReady();\r\n console.log('[Weld SDK] Closing widget...');\r\n\r\n this.stateCoordinator.closeWidget();\r\n this.iframeManager.hideIframe(IframeType.WIDGET);\r\n this.iframeManager.hideIframe(IframeType.BACKDROP);\r\n // Launcher stays visible\r\n\r\n // Send close message to the widget iframe\r\n const widgetIframe = this.iframeManager.getIframe(IframeType.WIDGET);\r\n if (widgetIframe?.element?.contentWindow) {\r\n widgetIframe.element.contentWindow.postMessage({ type: 'weld:close' }, '*');\r\n }\r\n\r\n // Notify launcher that widget is now closed (so it can show chat icon)\r\n const launcherIframe = this.iframeManager.getIframe(IframeType.LAUNCHER);\r\n if (launcherIframe?.element?.contentWindow) {\r\n launcherIframe.element.contentWindow.postMessage({ type: 'weld:widget-closed' }, '*');\r\n }\r\n\r\n this.config.onClose?.();\r\n }\r\n\r\n /**\r\n * Toggle widget open/close\r\n */\r\n public toggle(): void {\r\n const state = this.stateCoordinator.getState();\r\n if (state.widget.isOpen) {\r\n this.close();\r\n } else {\r\n this.open();\r\n }\r\n }\r\n\r\n /**\r\n * Minimize the widget\r\n */\r\n public minimize(): void {\r\n this.ensureReady();\r\n this.logger.debug('Minimizing widget');\r\n\r\n this.stateCoordinator.minimizeWidget();\r\n this.config.onMinimize?.();\r\n }\r\n\r\n /**\r\n * Maximize the widget\r\n */\r\n public maximize(): void {\r\n this.ensureReady();\r\n this.logger.debug('Maximizing widget');\r\n\r\n this.stateCoordinator.maximizeWidget();\r\n this.config.onMaximize?.();\r\n }\r\n\r\n /**\r\n * Show the launcher\r\n */\r\n public showLauncher(): void {\r\n this.ensureReady();\r\n this.logger.debug('Showing launcher');\r\n\r\n this.iframeManager.showIframe(IframeType.LAUNCHER);\r\n this.stateCoordinator.updateState('launcher.isVisible', true);\r\n }\r\n\r\n /**\r\n * Hide the launcher\r\n */\r\n public hideLauncher(): void {\r\n this.ensureReady();\r\n this.logger.debug('Hiding launcher');\r\n\r\n this.iframeManager.hideIframe(IframeType.LAUNCHER);\r\n this.stateCoordinator.updateState('launcher.isVisible', false);\r\n }\r\n\r\n /**\r\n * Set badge count\r\n */\r\n public setBadgeCount(count: number): void {\r\n this.ensureReady();\r\n this.logger.debug('Setting badge count', { count });\r\n\r\n this.stateCoordinator.setBadgeCount(count);\r\n }\r\n\r\n /**\r\n * Clear badge\r\n */\r\n public clearBadge(): void {\r\n this.setBadgeCount(0);\r\n }\r\n\r\n /**\r\n * Send a message\r\n */\r\n public sendMessage(text: string, metadata?: Record<string, any>): void {\r\n this.ensureReady();\r\n this.logger.debug('Sending message', { text });\r\n\r\n this.messageBroker.sendToIframe(IframeType.WIDGET, 'weld:message:send' as MessageType, {\r\n text,\r\n metadata,\r\n timestamp: Date.now(),\r\n });\r\n }\r\n\r\n /**\r\n * Identify user\r\n */\r\n public identify(identity: UserIdentity): void {\r\n this.ensureReady();\r\n this.logger.debug('Identifying user', { userId: identity.userId });\r\n\r\n this.stateCoordinator.setUserAuth(\r\n identity.userId,\r\n identity.email,\r\n identity.name\r\n );\r\n\r\n this.messageBroker.broadcast('weld:auth:login' as MessageType, identity);\r\n }\r\n\r\n /**\r\n * Logout user\r\n */\r\n public logout(): void {\r\n this.ensureReady();\r\n this.logger.debug('Logging out user');\r\n\r\n this.stateCoordinator.updateState('user', {\r\n isAuthenticated: false,\r\n isAnonymous: true,\r\n });\r\n\r\n this.messageBroker.broadcast('weld:auth:logout' as MessageType, {});\r\n }\r\n\r\n /**\r\n * Update configuration\r\n */\r\n public updateConfig(updates: Partial<WeldConfig>): void {\r\n this.ensureReady();\r\n this.logger.debug('Updating configuration');\r\n\r\n // Merge config\r\n this.config = resolveConfig({ ...this.config, ...updates });\r\n\r\n // Broadcast config update\r\n this.messageBroker.broadcast('weld:config:update' as MessageType, updates);\r\n }\r\n\r\n /**\r\n * Update theme\r\n */\r\n public setTheme(theme: 'light' | 'dark' | 'auto'): void {\r\n this.ensureReady();\r\n this.logger.debug('Setting theme', { theme });\r\n\r\n this.stateCoordinator.updateState('ui.theme', theme);\r\n this.messageBroker.broadcast('weld:theme:update' as MessageType, { mode: theme });\r\n }\r\n\r\n /**\r\n * Update locale\r\n */\r\n public setLocale(locale: string): void {\r\n this.ensureReady();\r\n this.logger.debug('Setting locale', { locale });\r\n\r\n this.stateCoordinator.updateState('ui.locale', locale);\r\n this.messageBroker.broadcast('weld:locale:update' as MessageType, { locale });\r\n }\r\n\r\n /**\r\n * Track custom event\r\n */\r\n public track(eventName: string, properties?: Record<string, any>): void {\r\n this.ensureReady();\r\n this.logger.debug('Tracking event', { eventName });\r\n\r\n this.messageBroker.broadcast('weld:event:track' as MessageType, {\r\n name: eventName,\r\n properties,\r\n timestamp: Date.now(),\r\n });\r\n }\r\n\r\n // ============================================================================\r\n // Intercom-style API Methods\r\n // ============================================================================\r\n\r\n /**\r\n * Boot the widget with user context (Intercom-style)\r\n * Use this after authentication to pass user information\r\n *\r\n * @example\r\n * ```typescript\r\n * weld.boot({\r\n * userId: 'user_123',\r\n * email: 'user@example.com',\r\n * name: 'John Doe',\r\n * createdAt: new Date('2024-01-01'),\r\n * customAttributes: { plan: 'pro', company: 'Acme Inc' }\r\n * });\r\n * ```\r\n */\r\n public boot(settings: {\r\n userId?: string;\r\n email?: string;\r\n name?: string;\r\n avatar?: string;\r\n createdAt?: Date;\r\n customAttributes?: Record<string, any>;\r\n }): void {\r\n this.ensureReady();\r\n this.logger.info('Booting widget with user context', { userId: settings.userId });\r\n\r\n // Update user state\r\n if (settings.userId || settings.email) {\r\n this.stateCoordinator.setUserAuth(\r\n settings.userId || '',\r\n settings.email,\r\n settings.name\r\n );\r\n }\r\n\r\n // Broadcast to iframes\r\n this.messageBroker.broadcast('weld:auth:login' as MessageType, {\r\n userId: settings.userId,\r\n email: settings.email,\r\n name: settings.name,\r\n avatar: settings.avatar,\r\n metadata: {\r\n createdAt: settings.createdAt?.toISOString(),\r\n ...settings.customAttributes,\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Shutdown the widget and clear session (Intercom-style)\r\n * Use this on logout to clear user data and session cookies\r\n */\r\n public shutdown(): void {\r\n this.logger.info('Shutting down widget');\r\n\r\n // Clear user state\r\n this.stateCoordinator.updateState('user', {\r\n isAuthenticated: false,\r\n isAnonymous: true,\r\n });\r\n\r\n // Broadcast logout to iframes\r\n this.messageBroker.broadcast('weld:auth:logout' as MessageType, {});\r\n\r\n // Clear any stored session data\r\n try {\r\n const prefix = 'weld-';\r\n const keysToRemove: string[] = [];\r\n for (let i = 0; i < localStorage.length; i++) {\r\n const key = localStorage.key(i);\r\n if (key?.startsWith(prefix)) {\r\n keysToRemove.push(key);\r\n }\r\n }\r\n keysToRemove.forEach(key => localStorage.removeItem(key));\r\n } catch (e) {\r\n // localStorage might not be available\r\n this.logger.debug('Could not clear localStorage', e);\r\n }\r\n\r\n this.logger.info('Widget shutdown complete');\r\n }\r\n\r\n /**\r\n * Update user attributes (Intercom-style, with rate limiting)\r\n * Limited to 20 calls per page load to prevent abuse\r\n *\r\n * @example\r\n * ```typescript\r\n * weld.update({ lastOrderDate: new Date(), orderCount: 5 });\r\n * ```\r\n */\r\n private updateCallCount = 0;\r\n private readonly updateRateLimit = 20;\r\n\r\n public update(data: Record<string, any>): void {\r\n this.ensureReady();\r\n\r\n // Rate limiting check\r\n if (this.updateCallCount >= this.updateRateLimit) {\r\n this.logger.warn('Update rate limit exceeded (max 20 per page load)');\r\n return;\r\n }\r\n this.updateCallCount++;\r\n\r\n this.logger.debug('Updating user attributes', data);\r\n\r\n // Broadcast update to iframes\r\n this.messageBroker.broadcast('weld:state:update' as MessageType, {\r\n path: 'user.metadata',\r\n value: data,\r\n merge: true,\r\n });\r\n }\r\n\r\n /**\r\n * Register callback for when widget is shown (Intercom-style)\r\n * @returns Unsubscribe function\r\n */\r\n public onShow(callback: () => void): () => void {\r\n this.ensureReady();\r\n\r\n const subscriptionId = this.stateCoordinator.subscribe('widget.isOpen', (isOpen: boolean) => {\r\n if (isOpen) {\r\n callback();\r\n }\r\n });\r\n\r\n return () => {\r\n this.stateCoordinator.unsubscribe(subscriptionId);\r\n };\r\n }\r\n\r\n /**\r\n * Register callback for when widget is hidden (Intercom-style)\r\n * @returns Unsubscribe function\r\n */\r\n public onHide(callback: () => void): () => void {\r\n this.ensureReady();\r\n\r\n const subscriptionId = this.stateCoordinator.subscribe('widget.isOpen', (isOpen: boolean) => {\r\n if (!isOpen) {\r\n callback();\r\n }\r\n });\r\n\r\n return () => {\r\n this.stateCoordinator.unsubscribe(subscriptionId);\r\n };\r\n }\r\n\r\n /**\r\n * Register callback for unread message count changes (Intercom-style)\r\n * @returns Unsubscribe function\r\n */\r\n public onUnreadCountChange(callback: (count: number) => void): () => void {\r\n this.ensureReady();\r\n\r\n const subscriptionId = this.stateCoordinator.subscribe('launcher.badgeCount', (count: number) => {\r\n callback(count || 0);\r\n });\r\n\r\n return () => {\r\n this.stateCoordinator.unsubscribe(subscriptionId);\r\n };\r\n }\r\n\r\n /**\r\n * Show the widget (alias for open, Intercom-style)\r\n */\r\n public show(): void {\r\n this.open();\r\n }\r\n\r\n /**\r\n * Hide the widget (alias for close, Intercom-style)\r\n */\r\n public hide(): void {\r\n this.close();\r\n }\r\n\r\n // ============================================================================\r\n // End Intercom-style API Methods\r\n // ============================================================================\r\n\r\n /**\r\n * Get current state\r\n */\r\n public getState(): WeldState {\r\n return this.stateCoordinator.getState();\r\n }\r\n\r\n /**\r\n * Subscribe to state changes\r\n */\r\n public onStateChange<T = any>(\r\n path: string,\r\n listener: (newValue: T, oldValue: T) => void\r\n ): () => void {\r\n this.ensureReady();\r\n\r\n const subscriptionId = this.stateCoordinator.subscribe(path, listener);\r\n\r\n // Return unsubscribe function\r\n return () => {\r\n this.stateCoordinator.unsubscribe(subscriptionId);\r\n };\r\n }\r\n\r\n /**\r\n * Get device info\r\n */\r\n public getDeviceInfo() {\r\n return this.iframeManager.getDeviceInfo();\r\n }\r\n\r\n /**\r\n * Get SDK status\r\n */\r\n public getStatus(): string {\r\n return this.status;\r\n }\r\n\r\n /**\r\n * Get SDK version\r\n */\r\n public getVersion(): string {\r\n return packageJson.version;\r\n }\r\n\r\n /**\r\n * Enable debug mode\r\n */\r\n public enableDebug(): void {\r\n this.logger.setLevel('debug');\r\n this.logger.info('Debug mode enabled');\r\n }\r\n\r\n /**\r\n * Disable debug mode\r\n */\r\n public disableDebug(): void {\r\n this.logger.setLevel('warn');\r\n this.logger.info('Debug mode disabled');\r\n }\r\n\r\n /**\r\n * Ensure SDK is ready before operation\r\n */\r\n private ensureReady(): void {\r\n if (this.status !== SDKStatus.READY) {\r\n throw new Error('SDK not ready. Call init() first.');\r\n }\r\n }\r\n\r\n /**\r\n * Destroy SDK and cleanup\r\n */\r\n public destroy(): void {\r\n this.logger.info('Destroying WeldSDK');\r\n\r\n // Remove event listener using bound handler\r\n window.removeEventListener('message', this.boundHandleLauncherClick);\r\n\r\n // Unsubscribe from all message broker subscriptions\r\n for (const subId of this.subscriptionIds) {\r\n this.messageBroker.unsubscribe(subId);\r\n }\r\n this.subscriptionIds = [];\r\n\r\n // Destroy modules\r\n this.stateCoordinator.destroy();\r\n this.messageBroker.destroy();\r\n this.iframeManager.destroy();\r\n\r\n // Reset status\r\n this.status = SDKStatus.DESTROYED;\r\n\r\n // Call onDestroy callback\r\n this.config.onDestroy?.();\r\n\r\n this.logger.info('WeldSDK destroyed');\r\n }\r\n}\r\n\r\n/**\r\n * Create and initialize WeldSDK instance\r\n */\r\nexport async function createWeldSDK(config: WeldConfig): Promise<WeldSDK> {\r\n const sdk = new WeldSDK(config);\r\n await sdk.init();\r\n return sdk;\r\n}\r\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.esm.js","sources":["../../src/types/config.ts","../../src/utils/logger.ts","../../src/core/IframeManager.ts","../../src/types/messages.ts","../../src/utils/security.ts","../../src/core/MessageBroker.ts","../../src/types/state.ts","../../src/utils/validation.ts","../../src/core/StateCoordinator.ts","../../src/core/WeldSDK.ts"],"sourcesContent":["/**\r\n * Weld SDK - Configuration Types\r\n * Type definitions for SDK initialization and configuration\r\n */\r\n\r\n/**\r\n * Event types for widget events\r\n */\r\nexport type WidgetEventType = 'ready' | 'open' | 'close' | 'error' | 'message' | 'minimize' | 'maximize' | 'destroy';\r\n\r\n/**\r\n * Widget event structure\r\n */\r\nexport interface WidgetEvent {\r\n type: WidgetEventType;\r\n data?: any;\r\n timestamp: number;\r\n}\r\n\r\n/**\r\n * Event handler function type\r\n */\r\nexport type WidgetEventHandler = (event?: WidgetEvent | any) => void;\r\n\r\n/**\r\n * Position configuration\r\n */\r\nexport interface PositionConfig {\r\n bottom?: string;\r\n right?: string;\r\n left?: string;\r\n top?: string;\r\n}\r\n\r\n/**\r\n * Customization configuration\r\n */\r\nexport interface CustomizationConfig {\r\n primaryColor?: string;\r\n accentColor?: string;\r\n backgroundColor?: string;\r\n textColor?: string;\r\n fontFamily?: string;\r\n fontSize?: string;\r\n borderRadius?: string;\r\n}\r\n\r\n/**\r\n * Feature flags\r\n */\r\nexport interface FeatureConfig {\r\n attachments?: boolean;\r\n reactions?: boolean;\r\n typing?: boolean;\r\n readReceipts?: boolean;\r\n offlineMode?: boolean;\r\n fileUpload?: boolean;\r\n imageUpload?: boolean;\r\n voiceMessages?: boolean;\r\n videoMessages?: boolean;\r\n}\r\n\r\n/**\r\n * Mobile configuration\r\n */\r\nexport interface MobileConfig {\r\n fullScreen?: boolean;\r\n scrollLock?: boolean;\r\n keyboardHandling?: 'auto' | 'manual';\r\n safeAreaInsets?: boolean;\r\n}\r\n\r\n/**\r\n * Iframe configuration\r\n */\r\nexport interface IframeConfig {\r\n launcher: {\r\n url: string;\r\n name: string;\r\n position: PositionConfig;\r\n size: string;\r\n };\r\n widget: {\r\n url: string;\r\n name: string;\r\n position: PositionConfig;\r\n width: string;\r\n height: string;\r\n };\r\n backdrop?: {\r\n enabled: boolean;\r\n closeOnClick: boolean;\r\n };\r\n}\r\n\r\n/**\r\n * API configuration\r\n */\r\nexport interface ApiConfig {\r\n baseUrl: string;\r\n widgetId: string;\r\n endpoints?: {\r\n messages?: string;\r\n users?: string;\r\n conversations?: string;\r\n upload?: string;\r\n };\r\n timeout?: number;\r\n retries?: number;\r\n}\r\n\r\n/**\r\n * Authentication configuration\r\n */\r\nexport interface AuthConfig {\r\n enabled?: boolean;\r\n mode?: 'anonymous' | 'identified';\r\n userId?: string;\r\n email?: string;\r\n name?: string;\r\n avatar?: string;\r\n metadata?: Record<string, any>;\r\n token?: string;\r\n}\r\n\r\n/**\r\n * Locale configuration\r\n */\r\nexport interface LocaleConfig {\r\n locale?: string;\r\n translations?: Record<string, Record<string, string>>;\r\n dateFormat?: string;\r\n timeFormat?: string;\r\n timezone?: string;\r\n}\r\n\r\n/**\r\n * Logging configuration\r\n */\r\nexport interface LogConfig {\r\n enabled?: boolean;\r\n level?: 'debug' | 'info' | 'warn' | 'error';\r\n prefix?: string;\r\n includeTimestamp?: boolean;\r\n}\r\n\r\n/**\r\n * Performance configuration\r\n */\r\nexport interface PerformanceConfig {\r\n lazyLoad?: boolean;\r\n preload?: boolean;\r\n caching?: boolean;\r\n prefetch?: boolean;\r\n}\r\n\r\n/**\r\n * Security configuration\r\n */\r\nexport interface SecurityConfig {\r\n allowedOrigins?: string[];\r\n validateMessages?: boolean;\r\n sanitizeInput?: boolean;\r\n contentSecurityPolicy?: string;\r\n}\r\n\r\n/**\r\n * Main SDK configuration\r\n */\r\nexport interface WeldConfig {\r\n // Required\r\n widgetId: string;\r\n\r\n // Optional\r\n api?: Partial<ApiConfig>;\r\n iframes?: Partial<IframeConfig>;\r\n position?: {\r\n launcher?: PositionConfig;\r\n widget?: PositionConfig;\r\n };\r\n customization?: CustomizationConfig;\r\n features?: FeatureConfig;\r\n mobile?: MobileConfig;\r\n auth?: AuthConfig;\r\n locale?: LocaleConfig;\r\n logging?: LogConfig;\r\n performance?: PerformanceConfig;\r\n security?: SecurityConfig;\r\n\r\n // Callbacks\r\n onReady?: () => void;\r\n onError?: (error: Error) => void;\r\n onOpen?: () => void;\r\n onClose?: () => void;\r\n onMessage?: (message: any) => void;\r\n onMinimize?: () => void;\r\n onMaximize?: () => void;\r\n onDestroy?: () => void;\r\n}\r\n\r\n/**\r\n * Runtime configuration (resolved from WeldConfig)\r\n */\r\nexport interface ResolvedConfig {\r\n widgetId: string;\r\n api: ApiConfig;\r\n iframes: IframeConfig;\r\n customization: CustomizationConfig;\r\n features: FeatureConfig;\r\n mobile: MobileConfig;\r\n auth: AuthConfig;\r\n locale: LocaleConfig;\r\n logging: LogConfig;\r\n performance: PerformanceConfig;\r\n security: SecurityConfig;\r\n // Callbacks (passed through from WeldConfig)\r\n onReady?: () => void;\r\n onError?: (error: Error) => void;\r\n onOpen?: () => void;\r\n onClose?: () => void;\r\n onMessage?: (message: any) => void;\r\n onMinimize?: () => void;\r\n onMaximize?: () => void;\r\n onDestroy?: () => void;\r\n}\r\n\r\n/**\r\n * Device detection\r\n */\r\nexport type DeviceType = 'mobile' | 'tablet' | 'desktop';\r\n\r\nexport interface DeviceInfo {\r\n type: DeviceType;\r\n isMobile: boolean;\r\n isTablet: boolean;\r\n isDesktop: boolean;\r\n isTouchDevice: boolean;\r\n screenWidth: number;\r\n screenHeight: number;\r\n orientation: 'portrait' | 'landscape';\r\n userAgent: string;\r\n}\r\n\r\n/**\r\n * Default configuration values\r\n */\r\nexport const DEFAULT_CONFIG: Omit<ResolvedConfig, 'widgetId'> = {\r\n api: {\r\n baseUrl: 'https://widget.weldsuite.org',\r\n widgetId: '',\r\n timeout: 30000,\r\n retries: 3,\r\n },\r\n iframes: {\r\n launcher: {\r\n url: '?mode=launcher',\r\n name: 'weld-launcher-frame',\r\n position: { bottom: '24px', right: '24px' },\r\n size: '60px',\r\n },\r\n widget: {\r\n url: '?mode=widget',\r\n name: 'weld-widget-frame',\r\n position: { bottom: '100px', right: '24px' },\r\n width: '400px',\r\n height: 'min(680px, calc(100vh - 120px))',\r\n },\r\n backdrop: {\r\n enabled: true,\r\n closeOnClick: true,\r\n },\r\n },\r\n customization: {\r\n primaryColor: '#000000',\r\n accentColor: '#3b82f6',\r\n backgroundColor: '#ffffff',\r\n textColor: '#111827',\r\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\r\n fontSize: '14px',\r\n borderRadius: '12px',\r\n },\r\n features: {\r\n attachments: true,\r\n reactions: true,\r\n typing: true,\r\n readReceipts: true,\r\n offlineMode: false,\r\n fileUpload: true,\r\n imageUpload: true,\r\n voiceMessages: false,\r\n videoMessages: false,\r\n },\r\n mobile: {\r\n fullScreen: true,\r\n scrollLock: true,\r\n keyboardHandling: 'auto',\r\n safeAreaInsets: true,\r\n },\r\n auth: {\r\n enabled: true,\r\n mode: 'anonymous',\r\n },\r\n locale: {\r\n locale: 'en',\r\n dateFormat: 'MMM dd, yyyy',\r\n timeFormat: 'HH:mm',\r\n },\r\n logging: {\r\n enabled: true,\r\n level: 'warn',\r\n prefix: '[Weld]',\r\n includeTimestamp: true,\r\n },\r\n performance: {\r\n lazyLoad: true,\r\n preload: false,\r\n caching: true,\r\n prefetch: false,\r\n },\r\n security: {\r\n allowedOrigins: [],\r\n validateMessages: true,\r\n sanitizeInput: true,\r\n },\r\n};\r\n\r\n/**\r\n * Configuration validation\r\n */\r\nexport function validateConfig(config: Partial<WeldConfig>): boolean {\r\n if (!config.widgetId || typeof config.widgetId !== 'string') {\r\n throw new Error('WeldConfig: widgetId is required and must be a string');\r\n }\r\n\r\n return true;\r\n}\r\n\r\n/**\r\n * Merge configuration with defaults\r\n */\r\nexport function resolveConfig(config: WeldConfig): ResolvedConfig {\r\n validateConfig(config);\r\n\r\n return {\r\n widgetId: config.widgetId,\r\n api: {\r\n ...DEFAULT_CONFIG.api,\r\n widgetId: config.widgetId,\r\n ...config.api,\r\n },\r\n iframes: {\r\n launcher: {\r\n ...DEFAULT_CONFIG.iframes.launcher,\r\n ...config.iframes?.launcher,\r\n position: {\r\n ...DEFAULT_CONFIG.iframes.launcher.position,\r\n ...config.position?.launcher,\r\n ...config.iframes?.launcher?.position,\r\n },\r\n },\r\n widget: {\r\n ...DEFAULT_CONFIG.iframes.widget,\r\n ...config.iframes?.widget,\r\n position: {\r\n ...DEFAULT_CONFIG.iframes.widget.position,\r\n ...config.position?.widget,\r\n ...config.iframes?.widget?.position,\r\n },\r\n },\r\n backdrop: {\r\n ...DEFAULT_CONFIG.iframes.backdrop!,\r\n ...config.iframes?.backdrop,\r\n },\r\n },\r\n customization: {\r\n ...DEFAULT_CONFIG.customization,\r\n ...config.customization,\r\n },\r\n features: {\r\n ...DEFAULT_CONFIG.features,\r\n ...config.features,\r\n },\r\n mobile: {\r\n ...DEFAULT_CONFIG.mobile,\r\n ...config.mobile,\r\n },\r\n auth: {\r\n ...DEFAULT_CONFIG.auth,\r\n ...config.auth,\r\n },\r\n locale: {\r\n ...DEFAULT_CONFIG.locale,\r\n ...config.locale,\r\n },\r\n logging: {\r\n ...DEFAULT_CONFIG.logging,\r\n ...config.logging,\r\n },\r\n performance: {\r\n ...DEFAULT_CONFIG.performance,\r\n ...config.performance,\r\n },\r\n security: {\r\n ...DEFAULT_CONFIG.security,\r\n ...config.security,\r\n },\r\n // Pass through callbacks\r\n onReady: config.onReady,\r\n onError: config.onError,\r\n onOpen: config.onOpen,\r\n onClose: config.onClose,\r\n onMessage: config.onMessage,\r\n onMinimize: config.onMinimize,\r\n onMaximize: config.onMaximize,\r\n onDestroy: config.onDestroy,\r\n };\r\n}\r\n","/**\r\n * Weld SDK - Logger Utility\r\n * Centralized logging with configurable levels and formatting\r\n */\r\n\r\nimport type { LogConfig } from '../types/config';\r\n\r\n/**\r\n * Log levels\r\n */\r\nexport enum LogLevel {\r\n DEBUG = 0,\r\n INFO = 1,\r\n WARN = 2,\r\n ERROR = 3,\r\n SILENT = 4,\r\n}\r\n\r\n/**\r\n * Logger class\r\n */\r\nexport class Logger {\r\n private config: LogConfig;\r\n private level: LogLevel;\r\n\r\n constructor(config: LogConfig) {\r\n this.config = {\r\n enabled: true,\r\n level: 'warn',\r\n prefix: '[Weld]',\r\n includeTimestamp: true,\r\n ...config,\r\n };\r\n\r\n this.level = this.getLevelFromString(this.config.level!);\r\n }\r\n\r\n /**\r\n * Convert string level to LogLevel enum\r\n */\r\n private getLevelFromString(level: string): LogLevel {\r\n switch (level.toLowerCase()) {\r\n case 'debug':\r\n return LogLevel.DEBUG;\r\n case 'info':\r\n return LogLevel.INFO;\r\n case 'warn':\r\n return LogLevel.WARN;\r\n case 'error':\r\n return LogLevel.ERROR;\r\n default:\r\n return LogLevel.WARN;\r\n }\r\n }\r\n\r\n /**\r\n * Check if logging is enabled for level\r\n */\r\n private shouldLog(level: LogLevel): boolean {\r\n return (this.config.enabled ?? true) && level >= this.level;\r\n }\r\n\r\n /**\r\n * Format log message\r\n */\r\n private format(level: string, message: string, _data?: any): string[] {\r\n const parts: string[] = [];\r\n\r\n if (this.config.prefix) {\r\n parts.push(this.config.prefix);\r\n }\r\n\r\n if (this.config.includeTimestamp) {\r\n const timestamp = new Date().toISOString();\r\n parts.push(`[${timestamp}]`);\r\n }\r\n\r\n parts.push(`[${level.toUpperCase()}]`);\r\n parts.push(message);\r\n\r\n return parts;\r\n }\r\n\r\n /**\r\n * Log debug message\r\n */\r\n public debug(message: string, data?: any): void {\r\n if (!this.shouldLog(LogLevel.DEBUG)) return;\r\n\r\n const formatted = this.format('debug', message, data);\r\n if (data !== undefined) {\r\n console.debug(...formatted, data);\r\n } else {\r\n console.debug(...formatted);\r\n }\r\n }\r\n\r\n /**\r\n * Log info message\r\n */\r\n public info(message: string, data?: any): void {\r\n if (!this.shouldLog(LogLevel.INFO)) return;\r\n\r\n const formatted = this.format('info', message, data);\r\n if (data !== undefined) {\r\n console.info(...formatted, data);\r\n } else {\r\n console.info(...formatted);\r\n }\r\n }\r\n\r\n /**\r\n * Log warning message\r\n */\r\n public warn(message: string, data?: any): void {\r\n if (!this.shouldLog(LogLevel.WARN)) return;\r\n\r\n const formatted = this.format('warn', message, data);\r\n if (data !== undefined) {\r\n console.warn(...formatted, data);\r\n } else {\r\n console.warn(...formatted);\r\n }\r\n }\r\n\r\n /**\r\n * Log error message\r\n */\r\n public error(message: string, error?: Error | any): void {\r\n if (!this.shouldLog(LogLevel.ERROR)) return;\r\n\r\n const formatted = this.format('error', message);\r\n if (error !== undefined) {\r\n if (error instanceof Error) {\r\n console.error(...formatted, error.message, error.stack);\r\n } else {\r\n console.error(...formatted, error);\r\n }\r\n } else {\r\n console.error(...formatted);\r\n }\r\n }\r\n\r\n /**\r\n * Create child logger with prefix\r\n */\r\n public child(prefix: string): Logger {\r\n return new Logger({\r\n ...this.config,\r\n prefix: `${this.config.prefix} ${prefix}`,\r\n });\r\n }\r\n\r\n /**\r\n * Update log level at runtime\r\n */\r\n public setLevel(level: 'debug' | 'info' | 'warn' | 'error'): void {\r\n this.config.level = level;\r\n this.level = this.getLevelFromString(level);\r\n }\r\n\r\n /**\r\n * Enable/disable logging\r\n */\r\n public setEnabled(enabled: boolean): void {\r\n this.config.enabled = enabled;\r\n }\r\n}\r\n\r\n/**\r\n * Default logger instance\r\n */\r\nexport const defaultLogger = new Logger({\r\n enabled: true,\r\n level: 'warn',\r\n prefix: '[Weld]',\r\n includeTimestamp: true,\r\n});\r\n","/**\r\n * Weld SDK - Iframe Manager\r\n * Manages creation, lifecycle, and communication with multiple iframes\r\n */\r\n\r\nimport type { ResolvedConfig, DeviceInfo } from '../types/config';\r\nimport { Logger } from '../utils/logger';\r\n\r\n/**\r\n * Iframe types\r\n */\r\nexport enum IframeType {\r\n LAUNCHER = 'launcher',\r\n WIDGET = 'widget',\r\n BACKDROP = 'backdrop',\r\n}\r\n\r\n/**\r\n * Iframe metadata\r\n */\r\nexport interface IframeMetadata {\r\n type: IframeType;\r\n element: HTMLIFrameElement;\r\n container: HTMLDivElement;\r\n ready: boolean;\r\n visible: boolean;\r\n createdAt: number;\r\n}\r\n\r\n/**\r\n * Device detection result\r\n */\r\nfunction detectDevice(): DeviceInfo {\r\n const width = window.innerWidth;\r\n const height = window.innerHeight;\r\n const userAgent = navigator.userAgent;\r\n\r\n const isMobile = width < 768;\r\n const isTablet = width >= 768 && width <= 1024;\r\n const isDesktop = width > 1024;\r\n const isTouchDevice = 'ontouchstart' in window || navigator.maxTouchPoints > 0;\r\n\r\n return {\r\n type: isMobile ? 'mobile' : isTablet ? 'tablet' : 'desktop',\r\n isMobile,\r\n isTablet,\r\n isDesktop,\r\n isTouchDevice,\r\n screenWidth: width,\r\n screenHeight: height,\r\n orientation: width > height ? 'landscape' : 'portrait',\r\n userAgent,\r\n };\r\n}\r\n\r\n// Forward reference for MessageBroker to avoid circular imports\r\ninterface MessageBrokerInterface {\r\n setIframeDomLoaded(iframeType: IframeType): void;\r\n}\r\n\r\n/**\r\n * IframeManager class\r\n * Orchestrates multiple iframes for the widget system\r\n */\r\nexport class IframeManager {\r\n private config: ResolvedConfig;\r\n private logger: Logger;\r\n private iframes: Map<IframeType, IframeMetadata> = new Map();\r\n private rootContainer: HTMLDivElement | null = null;\r\n private appContainer: HTMLDivElement | null = null;\r\n private modalContainer: HTMLDivElement | null = null;\r\n private deviceInfo: DeviceInfo;\r\n private styleElement: HTMLStyleElement | null = null;\r\n private messageBroker: MessageBrokerInterface | null = null;\r\n\r\n // Bound handlers for proper cleanup\r\n private boundHandleResize: () => void;\r\n private boundHandleOrientationChange: () => void;\r\n private boundHandleVisualViewportResize: () => void;\r\n\r\n constructor(config: ResolvedConfig) {\r\n this.config = config;\r\n this.logger = new Logger(config.logging);\r\n this.deviceInfo = detectDevice();\r\n\r\n // Bind handlers once for proper cleanup\r\n this.boundHandleResize = this.handleResize.bind(this);\r\n this.boundHandleOrientationChange = this.handleOrientationChange.bind(this);\r\n this.boundHandleVisualViewportResize = this.handleVisualViewportResize.bind(this);\r\n\r\n this.logger.info('IframeManager initialized', {\r\n device: this.deviceInfo.type,\r\n mobile: this.deviceInfo.isMobile,\r\n });\r\n }\r\n\r\n /**\r\n * Initialize all containers and iframes\r\n * @param messageBroker - MessageBroker instance for coordinating ready state\r\n */\r\n public async init(messageBroker?: MessageBrokerInterface): Promise<void> {\r\n this.logger.debug('Initializing iframe manager');\r\n this.messageBroker = messageBroker || null;\r\n\r\n try {\r\n // Create root container structure\r\n this.createRootContainer();\r\n\r\n // Inject CSS\r\n this.injectCSS();\r\n\r\n // Create iframes\r\n await this.createLauncherIframe();\r\n await this.createBackdropIframe();\r\n await this.createWidgetIframe();\r\n\r\n // Setup event listeners\r\n this.setupEventListeners();\r\n\r\n this.logger.info('IframeManager initialized successfully');\r\n } catch (error) {\r\n this.logger.error('Failed to initialize IframeManager', error);\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Create root container structure\r\n */\r\n private createRootContainer(): void {\r\n // Check if already exists\r\n let existingContainer = document.getElementById('weld-container');\r\n if (existingContainer) {\r\n this.logger.warn('Weld container already exists, removing old instance');\r\n existingContainer.remove();\r\n }\r\n\r\n // Create root container\r\n this.rootContainer = document.createElement('div');\r\n this.rootContainer.id = 'weld-container';\r\n this.rootContainer.className = 'weld-namespace';\r\n\r\n // Create app container\r\n this.appContainer = document.createElement('div');\r\n this.appContainer.className = 'weld-app';\r\n this.appContainer.setAttribute('aria-live', 'polite');\r\n this.appContainer.setAttribute('role', 'complementary');\r\n this.appContainer.setAttribute('aria-label', 'Weld Helpdesk Widget');\r\n\r\n // Create modal container\r\n this.modalContainer = document.createElement('div');\r\n this.modalContainer.id = 'weld-modal-container';\r\n\r\n // Assemble structure\r\n this.rootContainer.appendChild(this.appContainer);\r\n this.rootContainer.appendChild(this.modalContainer);\r\n document.body.appendChild(this.rootContainer);\r\n\r\n this.logger.debug('Root container created');\r\n }\r\n\r\n /**\r\n * Inject CSS into the page\r\n */\r\n private injectCSS(): void {\r\n // Remove existing style if present\r\n const existingStyle = document.getElementById('weld-styles');\r\n if (existingStyle) {\r\n existingStyle.remove();\r\n }\r\n\r\n this.styleElement = document.createElement('style');\r\n this.styleElement.id = 'weld-styles';\r\n this.styleElement.textContent = this.generateCSS();\r\n document.head.appendChild(this.styleElement);\r\n\r\n this.logger.debug('CSS injected');\r\n }\r\n\r\n /**\r\n * Generate CSS for containers\r\n */\r\n private generateCSS(): string {\r\n const { customization } = this.config;\r\n\r\n return `\r\n /* Weld Container */\r\n #weld-container {\r\n --weld-color-primary: ${customization.primaryColor};\r\n --weld-color-accent: ${customization.accentColor};\r\n --weld-font-family: ${customization.fontFamily};\r\n --weld-font-size-base: ${customization.fontSize};\r\n --weld-radius-xl: ${customization.borderRadius};\r\n }\r\n\r\n /* Import main stylesheet */\r\n @import url('/styles/index.css');\r\n\r\n /* Prevent page scroll when mobile widget is open */\r\n body.weld-mobile-open {\r\n overflow: hidden !important;\r\n position: fixed !important;\r\n width: 100% !important;\r\n height: 100% !important;\r\n }\r\n\r\n /* High contrast mode support */\r\n @media (prefers-contrast: high) {\r\n .weld-namespace {\r\n --weld-color-border: currentColor;\r\n }\r\n }\r\n `;\r\n }\r\n\r\n /**\r\n * Create launcher iframe\r\n */\r\n private async createLauncherIframe(): Promise<void> {\r\n const { iframes } = this.config;\r\n const { launcher } = iframes;\r\n\r\n // Create container\r\n const container = document.createElement('div');\r\n container.className = 'weld-launcher-frame';\r\n container.setAttribute('data-state', 'visible');\r\n container.style.cssText = `\r\n position: fixed;\r\n bottom: ${launcher.position.bottom};\r\n right: ${launcher.position.right};\r\n width: ${launcher.size};\r\n height: ${launcher.size};\r\n z-index: 2147483003;\r\n pointer-events: auto;\r\n display: block;\r\n `;\r\n\r\n // Create iframe\r\n const iframe = document.createElement('iframe');\r\n iframe.name = launcher.name;\r\n iframe.title = 'Weld Launcher';\r\n iframe.src = this.buildIframeUrl(launcher.url);\r\n iframe.style.cssText = `\r\n width: 100%;\r\n height: 100%;\r\n border: none;\r\n background: transparent;\r\n display: block;\r\n `;\r\n iframe.setAttribute('allow', 'clipboard-write');\r\n iframe.setAttribute('sandbox', 'allow-scripts allow-same-origin allow-forms allow-popups');\r\n\r\n container.appendChild(iframe);\r\n this.appContainer?.appendChild(container);\r\n\r\n // Store metadata\r\n this.iframes.set(IframeType.LAUNCHER, {\r\n type: IframeType.LAUNCHER,\r\n element: iframe,\r\n container,\r\n ready: false,\r\n visible: true,\r\n createdAt: Date.now(),\r\n });\r\n\r\n // When DOM loads, notify MessageBroker to send weld:init\r\n iframe.onload = () => {\r\n const metadata = this.iframes.get(IframeType.LAUNCHER);\r\n if (metadata) {\r\n this.logger.debug('Launcher iframe DOM loaded');\r\n // Notify MessageBroker that DOM is loaded (triggers weld:init)\r\n this.messageBroker?.setIframeDomLoaded(IframeType.LAUNCHER);\r\n }\r\n };\r\n\r\n this.logger.debug('Launcher iframe created');\r\n }\r\n\r\n /**\r\n * Create widget iframe\r\n */\r\n private async createWidgetIframe(): Promise<void> {\r\n const { iframes } = this.config;\r\n const { widget } = iframes;\r\n\r\n // Create container\r\n const container = document.createElement('div');\r\n container.className = 'weld-widget-frame';\r\n container.setAttribute('data-state', 'closed');\r\n\r\n // Apply different styles for mobile vs desktop\r\n if (this.deviceInfo.isMobile) {\r\n // Mobile: full-screen with dynamic viewport height to handle URL bar\r\n container.style.cssText = `\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n right: 0;\r\n bottom: 0;\r\n width: 100vw;\r\n height: 100dvh;\r\n height: 100vh;\r\n z-index: 2147483001;\r\n pointer-events: none;\r\n display: none;\r\n border-radius: 0;\r\n overflow: hidden;\r\n background: transparent;\r\n `;\r\n // Use visualViewport API for accurate height on mobile browsers\r\n if (window.visualViewport) {\r\n container.style.height = `${window.visualViewport.height}px`;\r\n }\r\n } else {\r\n // Desktop: positioned widget with border, shadow and animation\r\n container.style.cssText = `\r\n position: fixed;\r\n bottom: ${widget.position.bottom};\r\n right: ${widget.position.right};\r\n width: ${widget.width};\r\n height: ${widget.height};\r\n max-width: 100vw;\r\n z-index: 2147483001;\r\n pointer-events: none;\r\n display: none;\r\n border-radius: 24px;\r\n overflow: hidden;\r\n background: #ffffff;\r\n box-shadow: rgba(9, 14, 21, 0.16) 0px 5px 40px 0px;\r\n border: 1px solid rgba(0, 0, 0, 0.1);\r\n opacity: 0;\r\n transform: scale(0.95) translateY(10px);\r\n transform-origin: bottom right;\r\n transition: opacity 0.2s cubic-bezier(0.4, 0, 0.2, 1), transform 0.2s cubic-bezier(0.4, 0, 0.2, 1);\r\n `;\r\n }\r\n\r\n // Create iframe\r\n const iframe = document.createElement('iframe');\r\n iframe.name = widget.name;\r\n iframe.title = 'Weld Widget';\r\n iframe.src = this.buildIframeUrl(widget.url);\r\n iframe.style.cssText = `\r\n width: 100%;\r\n height: 100%;\r\n border: none;\r\n background: transparent;\r\n display: block;\r\n border-radius: ${this.deviceInfo.isMobile ? '0' : '24px'};\r\n `;\r\n iframe.setAttribute('allow', 'clipboard-write; camera; microphone');\r\n iframe.setAttribute('sandbox', 'allow-scripts allow-same-origin allow-forms allow-popups allow-downloads');\r\n\r\n container.appendChild(iframe);\r\n this.appContainer?.appendChild(container);\r\n\r\n // Store metadata\r\n this.iframes.set(IframeType.WIDGET, {\r\n type: IframeType.WIDGET,\r\n element: iframe,\r\n container,\r\n ready: false,\r\n visible: false,\r\n createdAt: Date.now(),\r\n });\r\n\r\n // When DOM loads, notify MessageBroker to send weld:init\r\n iframe.onload = () => {\r\n const metadata = this.iframes.get(IframeType.WIDGET);\r\n if (metadata) {\r\n this.logger.debug('Widget iframe DOM loaded');\r\n // Notify MessageBroker that DOM is loaded (triggers weld:init)\r\n this.messageBroker?.setIframeDomLoaded(IframeType.WIDGET);\r\n }\r\n };\r\n\r\n this.logger.debug('Widget iframe created');\r\n }\r\n\r\n /**\r\n * Create backdrop iframe\r\n */\r\n private async createBackdropIframe(): Promise<void> {\r\n if (!this.config.iframes.backdrop?.enabled) {\r\n this.logger.debug('Backdrop disabled, skipping creation');\r\n return;\r\n }\r\n\r\n // Create container\r\n const container = document.createElement('div');\r\n container.className = 'weld-backdrop-frame';\r\n container.setAttribute('data-state', 'hidden');\r\n container.style.cssText = `\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n right: 0;\r\n bottom: 0;\r\n z-index: 2147483000;\r\n background: transparent;\r\n pointer-events: none;\r\n opacity: 0;\r\n transition: opacity 200ms ease;\r\n `;\r\n\r\n this.appContainer?.appendChild(container);\r\n\r\n // Store metadata (backdrop doesn't have an iframe, just a div)\r\n // We'll create a minimal \"iframe\" reference for consistency\r\n const dummyIframe = document.createElement('iframe');\r\n dummyIframe.style.display = 'none';\r\n\r\n this.iframes.set(IframeType.BACKDROP, {\r\n type: IframeType.BACKDROP,\r\n element: dummyIframe,\r\n container,\r\n ready: true, // Backdrop is always ready\r\n visible: false,\r\n createdAt: Date.now(),\r\n });\r\n\r\n this.logger.debug('Backdrop created');\r\n }\r\n\r\n /**\r\n * Build iframe URL with parameters\r\n */\r\n private buildIframeUrl(path: string): string {\r\n const { widgetId, api } = this.config;\r\n const baseUrl = api.baseUrl;\r\n\r\n // Handle paths that may already have query parameters\r\n const url = new URL(path, baseUrl);\r\n url.searchParams.set('widgetId', widgetId);\r\n url.searchParams.set('device', this.deviceInfo.type);\r\n url.searchParams.set('mobile', String(this.deviceInfo.isMobile));\r\n url.searchParams.set('parentOrigin', window.location.origin);\r\n\r\n return url.toString();\r\n }\r\n\r\n /**\r\n * Setup event listeners\r\n */\r\n private setupEventListeners(): void {\r\n // Window resize - use bound handler for proper cleanup\r\n window.addEventListener('resize', this.boundHandleResize);\r\n\r\n // Orientation change - use bound handler for proper cleanup\r\n window.addEventListener('orientationchange', this.boundHandleOrientationChange);\r\n\r\n // Visual viewport resize (handles mobile URL bar and keyboard)\r\n if (window.visualViewport) {\r\n window.visualViewport.addEventListener('resize', this.boundHandleVisualViewportResize);\r\n window.visualViewport.addEventListener('scroll', this.boundHandleVisualViewportResize);\r\n }\r\n\r\n this.logger.debug('Event listeners setup');\r\n }\r\n\r\n /**\r\n * Handle window resize\r\n */\r\n private handleResize(): void {\r\n this.deviceInfo = detectDevice();\r\n this.logger.debug('Window resized', { device: this.deviceInfo.type });\r\n }\r\n\r\n /**\r\n * Handle orientation change\r\n */\r\n private handleOrientationChange(): void {\r\n this.deviceInfo = detectDevice();\r\n this.logger.debug('Orientation changed', { orientation: this.deviceInfo.orientation });\r\n }\r\n\r\n /**\r\n * Handle visual viewport resize (mobile URL bar, keyboard)\r\n */\r\n private handleVisualViewportResize(): void {\r\n if (!this.deviceInfo.isMobile || !window.visualViewport) return;\r\n\r\n const widget = this.iframes.get(IframeType.WIDGET);\r\n if (widget && widget.visible) {\r\n const vh = window.visualViewport.height;\r\n const offsetTop = window.visualViewport.offsetTop;\r\n\r\n widget.container.style.height = `${vh}px`;\r\n widget.container.style.top = `${offsetTop}px`;\r\n\r\n this.logger.debug('Visual viewport resized', { height: vh, offsetTop });\r\n }\r\n }\r\n\r\n /**\r\n * Get iframe by type\r\n */\r\n public getIframe(type: IframeType): IframeMetadata | undefined {\r\n return this.iframes.get(type);\r\n }\r\n\r\n /**\r\n * Get iframe element\r\n */\r\n public getIframeElement(type: IframeType): HTMLIFrameElement | undefined {\r\n return this.iframes.get(type)?.element;\r\n }\r\n\r\n /**\r\n * Get iframe container\r\n */\r\n public getIframeContainer(type: IframeType): HTMLDivElement | undefined {\r\n return this.iframes.get(type)?.container;\r\n }\r\n\r\n /**\r\n * Mark iframe as ready\r\n */\r\n public setIframeReady(type: IframeType): void {\r\n const iframe = this.iframes.get(type);\r\n if (iframe) {\r\n iframe.ready = true;\r\n this.logger.debug(`Iframe ${type} marked as ready`);\r\n }\r\n }\r\n\r\n /**\r\n * Check if all iframes are ready\r\n */\r\n public areAllIframesReady(): boolean {\r\n for (const [type, iframe] of this.iframes) {\r\n if (type !== IframeType.BACKDROP && !iframe.ready) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * Show iframe\r\n */\r\n public showIframe(type: IframeType): void {\r\n const iframe = this.iframes.get(type);\r\n if (!iframe) {\r\n console.warn(`[Weld SDK] showIframe: iframe ${type} not found`);\r\n return;\r\n }\r\n\r\n console.log(`[Weld SDK] Showing iframe ${type}`, { currentDisplay: iframe.container.style.display });\r\n\r\n iframe.visible = true;\r\n iframe.container.setAttribute('data-state', type === IframeType.BACKDROP ? 'visible' : 'open');\r\n iframe.container.style.pointerEvents = 'auto';\r\n iframe.container.style.display = 'block';\r\n\r\n // Trigger open animation for widget on desktop\r\n if (type === IframeType.WIDGET && !this.deviceInfo.isMobile) {\r\n // Force reflow to ensure transition works\r\n iframe.container.offsetHeight;\r\n // Animate to visible state\r\n iframe.container.style.opacity = '1';\r\n iframe.container.style.transform = 'scale(1) translateY(0)';\r\n }\r\n\r\n // Handle mobile scroll lock\r\n if (this.deviceInfo.isMobile && type === IframeType.WIDGET && this.config.mobile.scrollLock) {\r\n document.body.classList.add('weld-mobile-open');\r\n }\r\n\r\n // Hide launcher on mobile when widget is open (full-screen mode)\r\n if (this.deviceInfo.isMobile && type === IframeType.WIDGET) {\r\n const launcher = this.iframes.get(IframeType.LAUNCHER);\r\n if (launcher) {\r\n launcher.container.style.display = 'none';\r\n }\r\n\r\n // Apply accurate viewport height using visualViewport API\r\n if (window.visualViewport) {\r\n iframe.container.style.height = `${window.visualViewport.height}px`;\r\n iframe.container.style.top = `${window.visualViewport.offsetTop}px`;\r\n }\r\n }\r\n\r\n console.log(`[Weld SDK] Iframe ${type} shown`, { newDisplay: iframe.container.style.display });\r\n }\r\n\r\n /**\r\n * Hide iframe\r\n */\r\n public hideIframe(type: IframeType): void {\r\n const iframe = this.iframes.get(type);\r\n if (!iframe) {\r\n console.warn(`[Weld SDK] hideIframe: iframe ${type} not found`);\r\n return;\r\n }\r\n\r\n console.log(`[Weld SDK] Hiding iframe ${type}`, { currentDisplay: iframe.container.style.display });\r\n\r\n iframe.visible = false;\r\n iframe.container.setAttribute('data-state', type === IframeType.BACKDROP ? 'hidden' : 'closed');\r\n iframe.container.style.pointerEvents = 'none';\r\n\r\n // Animate close for widget on desktop, then hide after animation\r\n if (type === IframeType.WIDGET && !this.deviceInfo.isMobile) {\r\n // Animate to hidden state\r\n iframe.container.style.opacity = '0';\r\n iframe.container.style.transform = 'scale(0.95) translateY(10px)';\r\n // Hide after transition completes\r\n setTimeout(() => {\r\n if (!iframe.visible) {\r\n iframe.container.style.display = 'none';\r\n }\r\n }, 200);\r\n } else {\r\n iframe.container.style.display = 'none';\r\n }\r\n\r\n // Remove mobile scroll lock\r\n if (this.deviceInfo.isMobile && type === IframeType.WIDGET) {\r\n document.body.classList.remove('weld-mobile-open');\r\n }\r\n\r\n // Show launcher again on mobile when widget is closed\r\n if (this.deviceInfo.isMobile && type === IframeType.WIDGET) {\r\n const launcher = this.iframes.get(IframeType.LAUNCHER);\r\n if (launcher) {\r\n launcher.container.style.display = 'block';\r\n }\r\n }\r\n\r\n console.log(`[Weld SDK] Iframe ${type} hidden`, { newDisplay: iframe.container.style.display });\r\n }\r\n\r\n /**\r\n * Get device info\r\n */\r\n public getDeviceInfo(): DeviceInfo {\r\n return this.deviceInfo;\r\n }\r\n\r\n /**\r\n * Get modal container\r\n */\r\n public getModalContainer(): HTMLDivElement | null {\r\n return this.modalContainer;\r\n }\r\n\r\n /**\r\n * Destroy all iframes and cleanup\r\n */\r\n public destroy(): void {\r\n this.logger.debug('Destroying iframe manager');\r\n\r\n // Remove event listeners using bound handlers\r\n window.removeEventListener('resize', this.boundHandleResize);\r\n window.removeEventListener('orientationchange', this.boundHandleOrientationChange);\r\n\r\n // Remove visual viewport listeners\r\n if (window.visualViewport) {\r\n window.visualViewport.removeEventListener('resize', this.boundHandleVisualViewportResize);\r\n window.visualViewport.removeEventListener('scroll', this.boundHandleVisualViewportResize);\r\n }\r\n\r\n // Remove mobile scroll lock\r\n document.body.classList.remove('weld-mobile-open');\r\n\r\n // Remove root container\r\n if (this.rootContainer) {\r\n this.rootContainer.remove();\r\n this.rootContainer = null;\r\n }\r\n\r\n // Remove style element\r\n if (this.styleElement) {\r\n this.styleElement.remove();\r\n this.styleElement = null;\r\n }\r\n\r\n // Clear iframe references\r\n this.iframes.clear();\r\n\r\n // Clear messageBroker reference\r\n this.messageBroker = null;\r\n\r\n this.logger.info('IframeManager destroyed');\r\n }\r\n}\r\n","/**\r\n * Weld SDK - Message Types\r\n * Type definitions for postMessage communication between parent and iframes\r\n */\r\n\r\n/**\r\n * Message origins for validation\r\n */\r\nexport enum MessageOrigin {\r\n LAUNCHER = 'launcher',\r\n WIDGET = 'widget',\r\n PARENT = 'parent',\r\n BACKDROP = 'backdrop',\r\n}\r\n\r\n/**\r\n * Message types for different communication patterns\r\n */\r\nexport enum MessageType {\r\n // Lifecycle\r\n READY = 'weld:ready',\r\n INIT = 'weld:init',\r\n DESTROY = 'weld:destroy',\r\n\r\n // State changes\r\n STATE_UPDATE = 'weld:state:update',\r\n STATE_REQUEST = 'weld:state:request',\r\n STATE_RESPONSE = 'weld:state:response',\r\n\r\n // Widget control\r\n WIDGET_OPEN = 'weld:widget:open',\r\n WIDGET_CLOSE = 'weld:widget:close',\r\n WIDGET_TOGGLE = 'weld:widget:toggle',\r\n WIDGET_MINIMIZE = 'weld:widget:minimize',\r\n WIDGET_MAXIMIZE = 'weld:widget:maximize',\r\n\r\n // Launcher control\r\n LAUNCHER_SHOW = 'weld:launcher:show',\r\n LAUNCHER_HIDE = 'weld:launcher:hide',\r\n LAUNCHER_UPDATE = 'weld:launcher:update',\r\n\r\n // Backdrop control\r\n BACKDROP_SHOW = 'weld:backdrop:show',\r\n BACKDROP_HIDE = 'weld:backdrop:hide',\r\n BACKDROP_CLICK = 'weld:backdrop:click',\r\n\r\n // User interactions\r\n MESSAGE_SEND = 'weld:message:send',\r\n MESSAGE_RECEIVE = 'weld:message:receive',\r\n TYPING_START = 'weld:typing:start',\r\n TYPING_STOP = 'weld:typing:stop',\r\n\r\n // Badge updates\r\n BADGE_UPDATE = 'weld:badge:update',\r\n BADGE_CLEAR = 'weld:badge:clear',\r\n\r\n // Mobile handling\r\n MOBILE_SCROLL_LOCK = 'weld:mobile:scroll:lock',\r\n MOBILE_SCROLL_UNLOCK = 'weld:mobile:scroll:unlock',\r\n\r\n // Configuration\r\n CONFIG_UPDATE = 'weld:config:update',\r\n THEME_UPDATE = 'weld:theme:update',\r\n LOCALE_UPDATE = 'weld:locale:update',\r\n\r\n // Authentication\r\n AUTH_LOGIN = 'weld:auth:login',\r\n AUTH_LOGOUT = 'weld:auth:logout',\r\n AUTH_TOKEN_UPDATE = 'weld:auth:token:update',\r\n\r\n // Events\r\n EVENT_TRACK = 'weld:event:track',\r\n ERROR_REPORT = 'weld:error:report',\r\n\r\n // API responses\r\n API_SUCCESS = 'weld:api:success',\r\n API_ERROR = 'weld:api:error',\r\n}\r\n\r\n/**\r\n * Base message structure\r\n */\r\nexport interface BaseMessage {\r\n type: MessageType;\r\n origin: MessageOrigin;\r\n timestamp: number;\r\n id: string;\r\n}\r\n\r\n/**\r\n * Message with payload\r\n */\r\nexport interface PayloadMessage<T = any> extends BaseMessage {\r\n payload: T;\r\n}\r\n\r\n/**\r\n * State update payload\r\n */\r\nexport interface StateUpdatePayload {\r\n path: string;\r\n value: any;\r\n merge?: boolean;\r\n}\r\n\r\n/**\r\n * Widget state payload\r\n */\r\nexport interface WidgetStatePayload {\r\n isOpen: boolean;\r\n isMinimized: boolean;\r\n view?: string;\r\n data?: any;\r\n}\r\n\r\n/**\r\n * Launcher state payload\r\n */\r\nexport interface LauncherStatePayload {\r\n isVisible: boolean;\r\n badgeCount?: number;\r\n badgeText?: string;\r\n customColor?: string;\r\n}\r\n\r\n/**\r\n * Backdrop state payload\r\n */\r\nexport interface BackdropStatePayload {\r\n isVisible: boolean;\r\n onClick?: 'close' | 'ignore';\r\n}\r\n\r\n/**\r\n * Message data payload\r\n */\r\nexport interface MessageDataPayload {\r\n id: string;\r\n text: string;\r\n sender: 'user' | 'agent' | 'bot';\r\n timestamp: number;\r\n attachments?: Array<{\r\n type: string;\r\n url: string;\r\n name?: string;\r\n }>;\r\n}\r\n\r\n/**\r\n * Configuration update payload\r\n */\r\nexport interface ConfigUpdatePayload {\r\n apiKey?: string;\r\n workspaceId?: string;\r\n position?: {\r\n launcher?: { bottom: string; right: string };\r\n widget?: { bottom: string; right: string };\r\n };\r\n customization?: {\r\n primaryColor?: string;\r\n accentColor?: string;\r\n fontFamily?: string;\r\n };\r\n features?: {\r\n attachments?: boolean;\r\n reactions?: boolean;\r\n typing?: boolean;\r\n };\r\n}\r\n\r\n/**\r\n * Theme update payload\r\n */\r\nexport interface ThemeUpdatePayload {\r\n mode: 'light' | 'dark' | 'auto';\r\n primaryColor?: string;\r\n accentColor?: string;\r\n customCSS?: string;\r\n}\r\n\r\n/**\r\n * Authentication payload\r\n */\r\nexport interface AuthPayload {\r\n userId?: string;\r\n email?: string;\r\n name?: string;\r\n avatar?: string;\r\n metadata?: Record<string, any>;\r\n token?: string;\r\n}\r\n\r\n/**\r\n * Error payload\r\n */\r\nexport interface ErrorPayload {\r\n code: string;\r\n message: string;\r\n stack?: string;\r\n context?: Record<string, any>;\r\n}\r\n\r\n/**\r\n * Event tracking payload\r\n */\r\nexport interface EventPayload {\r\n name: string;\r\n properties?: Record<string, any>;\r\n timestamp: number;\r\n}\r\n\r\n/**\r\n * Type guards\r\n */\r\nexport function isBaseMessage(message: any): message is BaseMessage {\r\n return (\r\n typeof message === 'object' &&\r\n message !== null &&\r\n 'type' in message &&\r\n 'origin' in message &&\r\n 'timestamp' in message &&\r\n 'id' in message\r\n );\r\n}\r\n\r\nexport function isPayloadMessage<T = any>(\r\n message: any\r\n): message is PayloadMessage<T> {\r\n return isBaseMessage(message) && 'payload' in message;\r\n}\r\n\r\n/**\r\n * Message creator utilities\r\n */\r\nexport function createMessage(\r\n type: MessageType,\r\n origin: MessageOrigin,\r\n payload?: any\r\n): PayloadMessage {\r\n return {\r\n type,\r\n origin,\r\n timestamp: Date.now(),\r\n id: `${type}_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,\r\n payload,\r\n };\r\n}\r\n\r\n/**\r\n * Specific message type definitions\r\n */\r\nexport type ReadyMessage = PayloadMessage<{ iframe: string; ready: true }>;\r\nexport type StateUpdateMessage = PayloadMessage<StateUpdatePayload>;\r\nexport type WidgetStateMessage = PayloadMessage<WidgetStatePayload>;\r\nexport type LauncherStateMessage = PayloadMessage<LauncherStatePayload>;\r\nexport type BackdropStateMessage = PayloadMessage<BackdropStatePayload>;\r\nexport type MessageDataMessage = PayloadMessage<MessageDataPayload>;\r\nexport type ConfigUpdateMessage = PayloadMessage<ConfigUpdatePayload>;\r\nexport type ThemeUpdateMessage = PayloadMessage<ThemeUpdatePayload>;\r\nexport type AuthMessage = PayloadMessage<AuthPayload>;\r\nexport type ErrorMessage = PayloadMessage<ErrorPayload>;\r\nexport type EventMessage = PayloadMessage<EventPayload>;\r\n\r\n/**\r\n * Union type for all messages\r\n */\r\nexport type WeldMessage =\r\n | BaseMessage\r\n | ReadyMessage\r\n | StateUpdateMessage\r\n | WidgetStateMessage\r\n | LauncherStateMessage\r\n | BackdropStateMessage\r\n | MessageDataMessage\r\n | ConfigUpdateMessage\r\n | ThemeUpdateMessage\r\n | AuthMessage\r\n | ErrorMessage\r\n | EventMessage;\r\n","/**\r\n * Weld SDK - Security Utilities\r\n * Security validation and origin checking for postMessage communication\r\n */\r\n\r\nimport type { SecurityConfig } from '../types/config';\r\nimport { Logger } from './logger';\r\n\r\n/**\r\n * SecurityManager class\r\n */\r\nexport class SecurityManager {\r\n private config: SecurityConfig;\r\n private logger: Logger;\r\n private allowedOrigins: Set<string>;\r\n\r\n constructor(config: SecurityConfig, logger: Logger) {\r\n this.config = config;\r\n this.logger = logger;\r\n this.allowedOrigins = new Set(config.allowedOrigins || []);\r\n\r\n // Always allow same origin\r\n this.allowedOrigins.add(window.location.origin);\r\n }\r\n\r\n /**\r\n * Validate message origin\r\n */\r\n public isOriginAllowed(origin: string): boolean {\r\n // If no allowed origins specified, only allow same origin\r\n if (this.config.allowedOrigins?.length === 0) {\r\n return origin === window.location.origin;\r\n }\r\n\r\n // Check if origin is in allowed list\r\n if (this.allowedOrigins.has(origin)) {\r\n return true;\r\n }\r\n\r\n // Check for wildcard patterns\r\n for (const allowed of this.allowedOrigins) {\r\n if (this.matchesPattern(origin, allowed)) {\r\n return true;\r\n }\r\n }\r\n\r\n this.logger.warn('Origin not allowed', { origin });\r\n return false;\r\n }\r\n\r\n /**\r\n * Match origin against pattern (supports wildcards)\r\n */\r\n private matchesPattern(origin: string, pattern: string): boolean {\r\n // Exact match\r\n if (origin === pattern) {\r\n return true;\r\n }\r\n\r\n // Wildcard pattern (e.g., \"https://*.example.com\")\r\n if (pattern.includes('*')) {\r\n const regex = new RegExp(\r\n '^' + pattern.replace(/\\./g, '\\\\.').replace(/\\*/g, '.*') + '$'\r\n );\r\n return regex.test(origin);\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Validate postMessage event\r\n */\r\n public validateMessageEvent(event: MessageEvent): boolean {\r\n // Check origin\r\n if (!this.isOriginAllowed(event.origin)) {\r\n this.logger.warn('Invalid message origin', { origin: event.origin });\r\n return false;\r\n }\r\n\r\n // Check if message has data\r\n if (!event.data) {\r\n this.logger.warn('Message has no data');\r\n return false;\r\n }\r\n\r\n // Check if message is an object\r\n if (typeof event.data !== 'object') {\r\n this.logger.warn('Message data is not an object');\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Sanitize message data\r\n */\r\n public sanitizeMessageData(data: any): any {\r\n if (!this.config.sanitizeInput) {\r\n return data;\r\n }\r\n\r\n // Deep clone to avoid modifying original\r\n const sanitized = JSON.parse(JSON.stringify(data));\r\n\r\n // Recursively sanitize strings\r\n this.sanitizeObject(sanitized);\r\n\r\n return sanitized;\r\n }\r\n\r\n /**\r\n * Recursively sanitize object properties\r\n */\r\n private sanitizeObject(obj: any): void {\r\n if (typeof obj !== 'object' || obj === null) {\r\n return;\r\n }\r\n\r\n for (const key in obj) {\r\n if (typeof obj[key] === 'string') {\r\n obj[key] = this.sanitizeString(obj[key]);\r\n } else if (typeof obj[key] === 'object') {\r\n this.sanitizeObject(obj[key]);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Sanitize string to prevent XSS\r\n */\r\n private sanitizeString(str: string): string {\r\n const div = document.createElement('div');\r\n div.textContent = str;\r\n return div.innerHTML\r\n .replace(/javascript:/gi, '')\r\n .replace(/on\\w+\\s*=/gi, '');\r\n }\r\n\r\n /**\r\n * Generate secure random ID\r\n */\r\n public generateSecureId(): string {\r\n const array = new Uint8Array(16);\r\n crypto.getRandomValues(array);\r\n return Array.from(array, (byte) => byte.toString(16).padStart(2, '0')).join('');\r\n }\r\n\r\n /**\r\n * Validate iframe source\r\n */\r\n public isValidIframeSource(src: string): boolean {\r\n try {\r\n const url = new URL(src, window.location.origin);\r\n\r\n // Check if URL is from allowed origin\r\n if (!this.isOriginAllowed(url.origin)) {\r\n this.logger.warn('Invalid iframe source origin', { src });\r\n return false;\r\n }\r\n\r\n // Prevent javascript: protocol\r\n if (url.protocol === 'javascript:') {\r\n this.logger.warn('Javascript protocol not allowed in iframe source');\r\n return false;\r\n }\r\n\r\n return true;\r\n } catch (error) {\r\n this.logger.warn('Invalid iframe source URL', { src, error });\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Create Content Security Policy\r\n */\r\n public createCSP(): string {\r\n const origins = Array.from(this.allowedOrigins).join(' ');\r\n\r\n return [\r\n `default-src 'self' ${origins}`,\r\n `script-src 'self' 'unsafe-inline' ${origins}`,\r\n `style-src 'self' 'unsafe-inline' ${origins}`,\r\n `img-src 'self' data: https: ${origins}`,\r\n `font-src 'self' data: ${origins}`,\r\n `connect-src 'self' ${origins}`,\r\n `frame-src 'self' ${origins}`,\r\n `media-src 'self' ${origins}`,\r\n ].join('; ');\r\n }\r\n\r\n /**\r\n * Add allowed origin\r\n */\r\n public addAllowedOrigin(origin: string): void {\r\n this.allowedOrigins.add(origin);\r\n this.logger.debug('Added allowed origin', { origin });\r\n }\r\n\r\n /**\r\n * Remove allowed origin\r\n */\r\n public removeAllowedOrigin(origin: string): void {\r\n this.allowedOrigins.delete(origin);\r\n this.logger.debug('Removed allowed origin', { origin });\r\n }\r\n\r\n /**\r\n * Get all allowed origins\r\n */\r\n public getAllowedOrigins(): string[] {\r\n return Array.from(this.allowedOrigins);\r\n }\r\n}\r\n\r\n/**\r\n * Rate limiting utility\r\n */\r\nexport class RateLimiter {\r\n private requests: Map<string, number[]> = new Map();\r\n private maxRequests: number;\r\n private windowMs: number;\r\n\r\n constructor(maxRequests: number = 100, windowMs: number = 60000) {\r\n this.maxRequests = maxRequests;\r\n this.windowMs = windowMs;\r\n }\r\n\r\n /**\r\n * Check if request is allowed\r\n */\r\n public isAllowed(key: string): boolean {\r\n const now = Date.now();\r\n const requests = this.requests.get(key) || [];\r\n\r\n // Remove old requests outside window\r\n const validRequests = requests.filter((time) => now - time < this.windowMs);\r\n\r\n // Check if limit exceeded\r\n if (validRequests.length >= this.maxRequests) {\r\n return false;\r\n }\r\n\r\n // Add current request\r\n validRequests.push(now);\r\n this.requests.set(key, validRequests);\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Reset rate limit for key\r\n */\r\n public reset(key: string): void {\r\n this.requests.delete(key);\r\n }\r\n\r\n /**\r\n * Clear all rate limits\r\n */\r\n public clearAll(): void {\r\n this.requests.clear();\r\n }\r\n}\r\n\r\n/**\r\n * Token validation utilities\r\n */\r\nexport class TokenValidator {\r\n private static readonly TOKEN_PATTERN = /^[A-Za-z0-9-_=]+\\.[A-Za-z0-9-_=]+\\.?[A-Za-z0-9-_.+/=]*$/;\r\n\r\n /**\r\n * Check if string looks like a JWT token\r\n */\r\n public static isJWT(token: string): boolean {\r\n return this.TOKEN_PATTERN.test(token);\r\n }\r\n\r\n /**\r\n * Decode JWT payload (without verification)\r\n */\r\n public static decodeJWT(token: string): any | null {\r\n try {\r\n const parts = token.split('.');\r\n if (parts.length !== 3) {\r\n return null;\r\n }\r\n\r\n const payload = parts[1];\r\n const decoded = atob(payload.replace(/-/g, '+').replace(/_/g, '/'));\r\n return JSON.parse(decoded);\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Check if JWT is expired\r\n */\r\n public static isExpired(token: string): boolean {\r\n const payload = this.decodeJWT(token);\r\n if (!payload || !payload.exp) {\r\n return true;\r\n }\r\n\r\n return Date.now() >= payload.exp * 1000;\r\n }\r\n}\r\n","/**\r\n * Weld SDK - Message Broker\r\n * Handles secure postMessage communication between parent and iframes\r\n */\r\n\r\nimport type {\r\n WeldMessage,\r\n MessageType,\r\n PayloadMessage,\r\n} from '../types/messages';\r\nimport {\r\n MessageOrigin,\r\n isBaseMessage,\r\n isPayloadMessage,\r\n createMessage,\r\n} from '../types/messages';\r\nimport type { ResolvedConfig } from '../types/config';\r\nimport { Logger } from '../utils/logger';\r\nimport { SecurityManager, RateLimiter } from '../utils/security';\r\nimport { IframeManager, IframeType } from './IframeManager';\r\n\r\n/**\r\n * Message handler callback\r\n */\r\nexport type MessageHandler<T = any> = (payload: T, message: PayloadMessage<T>) => void;\r\n\r\n/**\r\n * Message subscription\r\n */\r\ninterface MessageSubscription {\r\n id: string;\r\n type: MessageType | '*';\r\n origin?: MessageOrigin;\r\n handler: MessageHandler;\r\n}\r\n\r\n/**\r\n * Queued message with metadata\r\n */\r\ninterface QueuedMessage {\r\n message: PayloadMessage;\r\n queuedAt: number;\r\n targetIframe: IframeType;\r\n}\r\n\r\n/**\r\n * Iframe ready state tracking\r\n */\r\ninterface IframeReadyState {\r\n domLoaded: boolean; // iframe.onload fired\r\n jsReady: boolean; // weld:ready received\r\n initSent: boolean; // weld:init sent\r\n}\r\n\r\n/**\r\n * MessageBroker class\r\n * Central hub for all postMessage communication\r\n */\r\nexport class MessageBroker {\r\n private config: ResolvedConfig;\r\n private logger: Logger;\r\n private security: SecurityManager;\r\n private iframeManager: IframeManager;\r\n private subscriptions: Map<string, MessageSubscription> = new Map();\r\n private messageQueue: QueuedMessage[] = [];\r\n private isReady = false;\r\n private rateLimiter: RateLimiter;\r\n private responseHandlers: Map<string, (message: WeldMessage) => void> = new Map();\r\n\r\n // Iframe ready state tracking\r\n private iframeReadyStates: Map<IframeType, IframeReadyState> = new Map();\r\n\r\n // Queue timeout configuration\r\n private queueTimeout = 30000; // 30 seconds\r\n private queueWatcherInterval: ReturnType<typeof setInterval> | null = null;\r\n\r\n // Bound handlers for proper cleanup\r\n private boundHandleMessage: (event: MessageEvent) => void;\r\n\r\n constructor(\r\n config: ResolvedConfig,\r\n iframeManager: IframeManager,\r\n logger: Logger\r\n ) {\r\n this.config = config;\r\n this.logger = logger.child('[MessageBroker]');\r\n this.iframeManager = iframeManager;\r\n this.security = new SecurityManager(config.security, this.logger);\r\n\r\n // Automatically trust messages from the widget's base URL\r\n // The iframes load from api.baseUrl, so we must accept their postMessages\r\n try {\r\n const widgetOrigin = new URL(config.api.baseUrl).origin;\r\n this.security.addAllowedOrigin(widgetOrigin);\r\n } catch {\r\n // Invalid URL, will rely on configured allowedOrigins\r\n }\r\n\r\n this.rateLimiter = new RateLimiter(100, 60000); // 100 messages per minute\r\n\r\n // Bind handlers once for proper cleanup\r\n this.boundHandleMessage = this.handleMessage.bind(this);\r\n\r\n // Initialize ready states\r\n this.iframeReadyStates.set(IframeType.LAUNCHER, { domLoaded: false, jsReady: false, initSent: false });\r\n this.iframeReadyStates.set(IframeType.WIDGET, { domLoaded: false, jsReady: false, initSent: false });\r\n\r\n this.setupMessageListener();\r\n this.startQueueWatcher();\r\n this.logger.debug('MessageBroker initialized');\r\n }\r\n\r\n /**\r\n * Setup global message listener\r\n */\r\n private setupMessageListener(): void {\r\n window.addEventListener('message', this.boundHandleMessage);\r\n this.logger.debug('Message listener setup');\r\n }\r\n\r\n /**\r\n * Start queue watcher to clean up expired messages\r\n */\r\n private startQueueWatcher(): void {\r\n this.queueWatcherInterval = setInterval(() => {\r\n const now = Date.now();\r\n const expiredMessages = this.messageQueue.filter(\r\n item => now - item.queuedAt > this.queueTimeout\r\n );\r\n\r\n if (expiredMessages.length > 0) {\r\n this.messageQueue = this.messageQueue.filter(\r\n item => now - item.queuedAt <= this.queueTimeout\r\n );\r\n for (const item of expiredMessages) {\r\n this.logger.warn('Message expired in queue', {\r\n type: item.message.type,\r\n targetIframe: item.targetIframe,\r\n queuedFor: now - item.queuedAt,\r\n });\r\n }\r\n }\r\n }, 5000);\r\n }\r\n\r\n /**\r\n * Get target origin for postMessage (security improvement)\r\n */\r\n private getTargetOrigin(): string {\r\n if (this.config.api?.baseUrl) {\r\n try {\r\n return new URL(this.config.api.baseUrl).origin;\r\n } catch {\r\n // Invalid URL, fall back to wildcard\r\n }\r\n }\r\n // Fall back to wildcard if no valid baseUrl configured\r\n return '*';\r\n }\r\n\r\n /**\r\n * Handle incoming postMessage\r\n */\r\n private handleMessage(event: MessageEvent): void {\r\n // Validate message event\r\n if (!this.security.validateMessageEvent(event)) {\r\n return;\r\n }\r\n\r\n // Validate message structure\r\n if (!isBaseMessage(event.data)) {\r\n this.logger.warn('Invalid message structure', event.data);\r\n return;\r\n }\r\n\r\n const message = event.data as WeldMessage;\r\n\r\n // Rate limiting\r\n if (!this.rateLimiter.isAllowed(message.origin)) {\r\n this.logger.warn('Rate limit exceeded', { origin: message.origin });\r\n return;\r\n }\r\n\r\n // Sanitize message if enabled\r\n const sanitized = this.config.security.sanitizeInput\r\n ? this.security.sanitizeMessageData(message)\r\n : message;\r\n\r\n this.logger.debug('Message received', {\r\n type: sanitized.type,\r\n origin: sanitized.origin,\r\n id: sanitized.id,\r\n });\r\n\r\n // Check for response handlers\r\n if (this.responseHandlers.has(sanitized.id)) {\r\n const handler = this.responseHandlers.get(sanitized.id);\r\n handler?.(sanitized);\r\n this.responseHandlers.delete(sanitized.id);\r\n return;\r\n }\r\n\r\n // Dispatch to subscribers\r\n this.dispatchMessage(sanitized);\r\n }\r\n\r\n /**\r\n * Dispatch message to subscribers\r\n */\r\n private dispatchMessage(message: WeldMessage): void {\r\n const subscriptions = Array.from(this.subscriptions.values());\r\n\r\n for (const subscription of subscriptions) {\r\n // Check if type matches\r\n const typeMatches =\r\n subscription.type === '*' || subscription.type === message.type;\r\n\r\n // Check if origin matches (if specified)\r\n const originMatches =\r\n !subscription.origin || subscription.origin === message.origin;\r\n\r\n if (typeMatches && originMatches) {\r\n try {\r\n if (isPayloadMessage(message)) {\r\n subscription.handler(message.payload, message);\r\n } else {\r\n subscription.handler(undefined, message as unknown as PayloadMessage);\r\n }\r\n } catch (error) {\r\n this.logger.error('Error in message handler', error);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Subscribe to messages\r\n */\r\n public subscribe<T = any>(\r\n type: MessageType | '*',\r\n handler: MessageHandler<T>,\r\n origin?: MessageOrigin\r\n ): string {\r\n const id = this.security.generateSecureId();\r\n\r\n this.subscriptions.set(id, {\r\n id,\r\n type,\r\n origin,\r\n handler,\r\n });\r\n\r\n this.logger.debug('Subscribed to messages', { type, origin, id });\r\n return id;\r\n }\r\n\r\n /**\r\n * Unsubscribe from messages\r\n */\r\n public unsubscribe(subscriptionId: string): void {\r\n if (this.subscriptions.delete(subscriptionId)) {\r\n this.logger.debug('Unsubscribed from messages', { id: subscriptionId });\r\n }\r\n }\r\n\r\n /**\r\n * Send message to iframe\r\n */\r\n public sendToIframe(\r\n iframeType: IframeType,\r\n type: MessageType,\r\n payload?: any\r\n ): void {\r\n const iframe = this.iframeManager.getIframe(iframeType);\r\n\r\n if (!iframe) {\r\n this.logger.warn('Iframe not found', { iframeType });\r\n return;\r\n }\r\n\r\n // Check if iframe is truly ready (JS ready, not just DOM loaded)\r\n const readyState = this.iframeReadyStates.get(iframeType);\r\n const isJsReady = readyState?.jsReady ?? false;\r\n\r\n // Allow weld:init to be sent before JS is ready (it triggers the ready response)\r\n if (!isJsReady && type !== ('weld:init' as MessageType)) {\r\n // Queue message if iframe not ready\r\n const message = createMessage(type, MessageOrigin.PARENT, payload);\r\n this.messageQueue.push({\r\n message,\r\n queuedAt: Date.now(),\r\n targetIframe: iframeType,\r\n });\r\n this.logger.debug('Message queued (iframe JS not ready)', {\r\n iframeType,\r\n type,\r\n });\r\n return;\r\n }\r\n\r\n const message = createMessage(type, MessageOrigin.PARENT, payload);\r\n this.postMessage(iframe.element, message);\r\n }\r\n\r\n /**\r\n * Send message to all iframes\r\n */\r\n public broadcast(type: MessageType, payload?: any): void {\r\n const message = createMessage(type, MessageOrigin.PARENT, payload);\r\n\r\n const launcherIframe = this.iframeManager.getIframe(IframeType.LAUNCHER);\r\n const widgetIframe = this.iframeManager.getIframe(IframeType.WIDGET);\r\n const launcherReady = this.iframeReadyStates.get(IframeType.LAUNCHER)?.jsReady ?? false;\r\n const widgetReady = this.iframeReadyStates.get(IframeType.WIDGET)?.jsReady ?? false;\r\n\r\n if (launcherIframe && launcherReady) {\r\n this.postMessage(launcherIframe.element, message);\r\n }\r\n if (widgetIframe && widgetReady) {\r\n this.postMessage(widgetIframe.element, message);\r\n }\r\n\r\n this.logger.debug('Message broadcast', { type });\r\n }\r\n\r\n /**\r\n * Send message and wait for response\r\n */\r\n public async sendAndWaitForResponse<T = any>(\r\n iframeType: IframeType,\r\n type: MessageType,\r\n payload?: any,\r\n timeout = 5000\r\n ): Promise<T> {\r\n return new Promise((resolve, reject) => {\r\n const message = createMessage(type, MessageOrigin.PARENT, payload);\r\n\r\n // Setup response handler\r\n const timeoutId = setTimeout(() => {\r\n this.responseHandlers.delete(message.id);\r\n reject(new Error('Message response timeout'));\r\n }, timeout);\r\n\r\n this.responseHandlers.set(message.id, (response: WeldMessage) => {\r\n clearTimeout(timeoutId);\r\n if (isPayloadMessage(response)) {\r\n resolve(response.payload as T);\r\n } else {\r\n resolve(undefined as T);\r\n }\r\n });\r\n\r\n // Send message\r\n const iframe = this.iframeManager.getIframe(iframeType);\r\n if (!iframe) {\r\n reject(new Error('Iframe not found'));\r\n return;\r\n }\r\n\r\n this.postMessage(iframe.element, message);\r\n });\r\n }\r\n\r\n /**\r\n * Post message to iframe\r\n */\r\n private postMessage(iframe: HTMLIFrameElement, message: WeldMessage): void {\r\n try {\r\n if (!iframe.contentWindow) {\r\n this.logger.warn('Iframe contentWindow not available - cross-origin issue?');\r\n return;\r\n }\r\n\r\n const targetOrigin = this.getTargetOrigin();\r\n iframe.contentWindow.postMessage(message, targetOrigin);\r\n this.logger.debug('Message sent', {\r\n type: message.type,\r\n id: message.id,\r\n targetOrigin,\r\n });\r\n } catch (error) {\r\n this.logger.error('Failed to post message - cross-origin issue?', error);\r\n }\r\n }\r\n\r\n /**\r\n * Mark iframe DOM as loaded (called from onload callback)\r\n * This triggers sending weld:init to the iframe\r\n */\r\n public setIframeDomLoaded(iframeType: IframeType): void {\r\n const readyState = this.iframeReadyStates.get(iframeType);\r\n if (readyState) {\r\n readyState.domLoaded = true;\r\n this.logger.debug(`Iframe ${iframeType} DOM loaded`);\r\n\r\n // Send weld:init message if not already sent\r\n if (!readyState.initSent) {\r\n this.sendInitMessage(iframeType);\r\n readyState.initSent = true;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Send weld:init message to iframe\r\n */\r\n private sendInitMessage(iframeType: IframeType): void {\r\n const iframe = this.iframeManager.getIframe(iframeType);\r\n if (!iframe) return;\r\n\r\n const initPayload = {\r\n widgetId: this.config.widgetId,\r\n iframeType,\r\n config: {\r\n api: this.config.api,\r\n customization: this.config.customization,\r\n features: this.config.features,\r\n },\r\n };\r\n\r\n const message = createMessage('weld:init' as MessageType, MessageOrigin.PARENT, initPayload);\r\n this.postMessage(iframe.element, message);\r\n this.logger.debug(`Sent weld:init to ${iframeType}`, initPayload);\r\n }\r\n\r\n /**\r\n * Mark iframe JS as ready (called when weld:ready message is received)\r\n * This flushes queued messages\r\n */\r\n public setIframeReady(iframeType: IframeType): void {\r\n const readyState = this.iframeReadyStates.get(iframeType);\r\n if (readyState) {\r\n readyState.jsReady = true;\r\n this.logger.debug(`Iframe ${iframeType} JS ready`);\r\n }\r\n\r\n // Also update iframeManager for backwards compatibility\r\n this.iframeManager.setIframeReady(iframeType);\r\n\r\n // Flush queued messages for this iframe\r\n this.flushMessageQueue(iframeType);\r\n\r\n // Check if all iframes JS ready\r\n if (this.areAllIframesJsReady()) {\r\n this.isReady = true;\r\n this.logger.info('All iframes JS ready');\r\n }\r\n }\r\n\r\n /**\r\n * Check if all iframes have JS ready\r\n */\r\n public areAllIframesJsReady(): boolean {\r\n const launcherState = this.iframeReadyStates.get(IframeType.LAUNCHER);\r\n const widgetState = this.iframeReadyStates.get(IframeType.WIDGET);\r\n\r\n // Both launcher and widget must be JS ready\r\n return (launcherState?.jsReady ?? false) && (widgetState?.jsReady ?? false);\r\n }\r\n\r\n /**\r\n * Check if a specific iframe is JS ready\r\n */\r\n public isIframeJsReady(iframeType: IframeType): boolean {\r\n return this.iframeReadyStates.get(iframeType)?.jsReady ?? false;\r\n }\r\n\r\n /**\r\n * Flush queued messages to iframe\r\n */\r\n private flushMessageQueue(iframeType: IframeType): void {\r\n const iframe = this.iframeManager.getIframe(iframeType);\r\n if (!iframe) return;\r\n\r\n // Filter messages for this iframe and remove from queue\r\n const messagesToFlush = this.messageQueue.filter(\r\n item => item.targetIframe === iframeType\r\n );\r\n this.messageQueue = this.messageQueue.filter(\r\n item => item.targetIframe !== iframeType\r\n );\r\n\r\n for (const item of messagesToFlush) {\r\n this.postMessage(iframe.element, item.message);\r\n }\r\n\r\n if (messagesToFlush.length > 0) {\r\n this.logger.debug('Flushed queued messages', {\r\n count: messagesToFlush.length,\r\n iframeType,\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Check if broker is ready\r\n */\r\n public isMessageBrokerReady(): boolean {\r\n return this.isReady;\r\n }\r\n\r\n /**\r\n * Get queued message count\r\n */\r\n public getQueuedMessageCount(): number {\r\n return this.messageQueue.length;\r\n }\r\n\r\n /**\r\n * Clear message queue\r\n */\r\n public clearMessageQueue(): void {\r\n this.messageQueue = [];\r\n this.logger.debug('Message queue cleared');\r\n }\r\n\r\n /**\r\n * Get active subscription count\r\n */\r\n public getSubscriptionCount(): number {\r\n return this.subscriptions.size;\r\n }\r\n\r\n /**\r\n * Destroy broker and cleanup\r\n */\r\n public destroy(): void {\r\n this.logger.debug('Destroying message broker');\r\n\r\n // Remove event listener using bound handler\r\n window.removeEventListener('message', this.boundHandleMessage);\r\n\r\n // Clear queue watcher\r\n if (this.queueWatcherInterval) {\r\n clearInterval(this.queueWatcherInterval);\r\n this.queueWatcherInterval = null;\r\n }\r\n\r\n // Clear subscriptions\r\n this.subscriptions.clear();\r\n\r\n // Clear message queue\r\n this.messageQueue = [];\r\n\r\n // Clear response handlers\r\n this.responseHandlers.clear();\r\n\r\n // Reset rate limiter\r\n this.rateLimiter.clearAll();\r\n\r\n // Reset ready states\r\n this.iframeReadyStates.clear();\r\n\r\n this.isReady = false;\r\n this.logger.info('MessageBroker destroyed');\r\n }\r\n}\r\n","/**\r\n * Weld SDK - State Types\r\n * Type definitions for state management across iframes\r\n */\r\n\r\n/**\r\n * Widget visibility state\r\n */\r\nexport enum WidgetVisibility {\r\n HIDDEN = 'hidden',\r\n VISIBLE = 'visible',\r\n MINIMIZED = 'minimized',\r\n}\r\n\r\n/**\r\n * Widget view types\r\n */\r\nexport enum WidgetView {\r\n HOME = 'home',\r\n CONVERSATION = 'conversation',\r\n CONVERSATIONS = 'conversations',\r\n HELP = 'help',\r\n SETTINGS = 'settings',\r\n SEARCH = 'search',\r\n}\r\n\r\n/**\r\n * Connection status\r\n */\r\nexport enum ConnectionStatus {\r\n DISCONNECTED = 'disconnected',\r\n CONNECTING = 'connecting',\r\n CONNECTED = 'connected',\r\n RECONNECTING = 'reconnecting',\r\n ERROR = 'error',\r\n}\r\n\r\n/**\r\n * Message status\r\n */\r\nexport enum MessageStatus {\r\n SENDING = 'sending',\r\n SENT = 'sent',\r\n DELIVERED = 'delivered',\r\n READ = 'read',\r\n FAILED = 'failed',\r\n}\r\n\r\n/**\r\n * User state\r\n */\r\nexport interface UserState {\r\n id?: string;\r\n email?: string;\r\n name?: string;\r\n avatar?: string;\r\n metadata?: Record<string, any>;\r\n isAuthenticated: boolean;\r\n isAnonymous: boolean;\r\n}\r\n\r\n/**\r\n * Conversation state\r\n */\r\nexport interface ConversationState {\r\n id?: string;\r\n messages: Message[];\r\n participants: Participant[];\r\n unreadCount: number;\r\n lastMessageAt?: number;\r\n isTyping: boolean;\r\n typingUsers: string[];\r\n}\r\n\r\n/**\r\n * Message interface\r\n */\r\nexport interface Message {\r\n id: string;\r\n conversationId: string;\r\n text: string;\r\n sender: {\r\n id: string;\r\n name: string;\r\n avatar?: string;\r\n type: 'user' | 'agent' | 'bot';\r\n };\r\n status: MessageStatus;\r\n timestamp: number;\r\n createdAt: number;\r\n updatedAt?: number;\r\n attachments?: Attachment[];\r\n reactions?: Reaction[];\r\n metadata?: Record<string, any>;\r\n}\r\n\r\n/**\r\n * Attachment interface\r\n */\r\nexport interface Attachment {\r\n id: string;\r\n type: 'image' | 'file' | 'video' | 'audio';\r\n url: string;\r\n name: string;\r\n size: number;\r\n mimeType: string;\r\n thumbnail?: string;\r\n}\r\n\r\n/**\r\n * Reaction interface\r\n */\r\nexport interface Reaction {\r\n emoji: string;\r\n count: number;\r\n users: string[];\r\n}\r\n\r\n/**\r\n * Participant interface\r\n */\r\nexport interface Participant {\r\n id: string;\r\n name: string;\r\n avatar?: string;\r\n type: 'user' | 'agent' | 'bot';\r\n isOnline: boolean;\r\n lastSeenAt?: number;\r\n}\r\n\r\n/**\r\n * Widget state\r\n */\r\nexport interface WidgetState {\r\n visibility: WidgetVisibility;\r\n view: WidgetView;\r\n isOpen: boolean;\r\n isMinimized: boolean;\r\n dimensions: {\r\n width: string;\r\n height: string;\r\n };\r\n position: {\r\n bottom: string;\r\n right: string;\r\n };\r\n}\r\n\r\n/**\r\n * Launcher state\r\n */\r\nexport interface LauncherState {\r\n isVisible: boolean;\r\n badge: {\r\n count: number;\r\n text?: string;\r\n show: boolean;\r\n };\r\n customColor?: string;\r\n tooltip?: string;\r\n}\r\n\r\n/**\r\n * Backdrop state\r\n */\r\nexport interface BackdropState {\r\n isVisible: boolean;\r\n closeOnClick: boolean;\r\n opacity: number;\r\n}\r\n\r\n/**\r\n * Mobile state\r\n */\r\nexport interface MobileState {\r\n isFullScreen: boolean;\r\n isScrollLocked: boolean;\r\n keyboardHeight: number;\r\n orientation: 'portrait' | 'landscape';\r\n safeAreaInsets: {\r\n top: number;\r\n right: number;\r\n bottom: number;\r\n left: number;\r\n };\r\n}\r\n\r\n/**\r\n * Network state\r\n */\r\nexport interface NetworkState {\r\n status: ConnectionStatus;\r\n lastConnected?: number;\r\n retryCount: number;\r\n latency?: number;\r\n}\r\n\r\n/**\r\n * UI state\r\n */\r\nexport interface UIState {\r\n theme: 'light' | 'dark' | 'auto';\r\n locale: string;\r\n isLoading: boolean;\r\n error?: {\r\n code: string;\r\n message: string;\r\n recoverable: boolean;\r\n };\r\n}\r\n\r\n/**\r\n * Main application state\r\n */\r\nexport interface WeldState {\r\n user: UserState;\r\n conversation: ConversationState;\r\n widget: WidgetState;\r\n launcher: LauncherState;\r\n backdrop: BackdropState;\r\n mobile: MobileState;\r\n network: NetworkState;\r\n ui: UIState;\r\n initialized: boolean;\r\n lastUpdated: number;\r\n}\r\n\r\n/**\r\n * State update action\r\n */\r\nexport interface StateAction<T = any> {\r\n type: string;\r\n path: keyof WeldState | string;\r\n payload: T;\r\n merge?: boolean;\r\n timestamp: number;\r\n}\r\n\r\n/**\r\n * State listener callback\r\n */\r\nexport type StateListener<T = any> = (newState: T, oldState: T) => void;\r\n\r\n/**\r\n * State subscription\r\n */\r\nexport interface StateSubscription {\r\n id: string;\r\n path: string;\r\n listener: StateListener;\r\n immediate?: boolean;\r\n}\r\n\r\n/**\r\n * Initial state factory\r\n */\r\nexport function createInitialState(): WeldState {\r\n return {\r\n user: {\r\n isAuthenticated: false,\r\n isAnonymous: true,\r\n },\r\n conversation: {\r\n messages: [],\r\n participants: [],\r\n unreadCount: 0,\r\n isTyping: false,\r\n typingUsers: [],\r\n },\r\n widget: {\r\n visibility: WidgetVisibility.HIDDEN,\r\n view: WidgetView.HOME,\r\n isOpen: false,\r\n isMinimized: false,\r\n dimensions: {\r\n width: '400px',\r\n height: 'min(680px, 88vh)',\r\n },\r\n position: {\r\n bottom: '24px',\r\n right: '24px',\r\n },\r\n },\r\n launcher: {\r\n isVisible: true,\r\n badge: {\r\n count: 0,\r\n show: false,\r\n },\r\n },\r\n backdrop: {\r\n isVisible: false,\r\n closeOnClick: true,\r\n opacity: 0,\r\n },\r\n mobile: {\r\n isFullScreen: false,\r\n isScrollLocked: false,\r\n keyboardHeight: 0,\r\n orientation: 'portrait',\r\n safeAreaInsets: {\r\n top: 0,\r\n right: 0,\r\n bottom: 0,\r\n left: 0,\r\n },\r\n },\r\n network: {\r\n status: ConnectionStatus.DISCONNECTED,\r\n retryCount: 0,\r\n },\r\n ui: {\r\n theme: 'auto',\r\n locale: 'en',\r\n isLoading: false,\r\n },\r\n initialized: false,\r\n lastUpdated: Date.now(),\r\n };\r\n}\r\n\r\n/**\r\n * State path utility\r\n */\r\nexport function getStateValue<T = any>(state: WeldState, path: string): T {\r\n const keys = path.split('.');\r\n let value: any = state;\r\n\r\n for (const key of keys) {\r\n if (value && typeof value === 'object' && key in value) {\r\n value = value[key];\r\n } else {\r\n return undefined as T;\r\n }\r\n }\r\n\r\n return value as T;\r\n}\r\n\r\n/**\r\n * State update utility\r\n */\r\nexport function setStateValue(\r\n state: WeldState,\r\n path: string,\r\n value: any,\r\n merge = false\r\n): WeldState {\r\n const keys = path.split('.');\r\n const newState = JSON.parse(JSON.stringify(state));\r\n let current: any = newState;\r\n\r\n for (let i = 0; i < keys.length - 1; i++) {\r\n const key = keys[i];\r\n if (!(key in current)) {\r\n current[key] = {};\r\n }\r\n current = current[key];\r\n }\r\n\r\n const lastKey = keys[keys.length - 1];\r\n\r\n if (merge && typeof current[lastKey] === 'object' && typeof value === 'object') {\r\n current[lastKey] = { ...current[lastKey], ...value };\r\n } else {\r\n current[lastKey] = value;\r\n }\r\n\r\n newState.lastUpdated = Date.now();\r\n return newState;\r\n}\r\n","/**\r\n * Weld SDK - Validation Utilities\r\n * Input validation and sanitization functions\r\n */\r\n\r\n/**\r\n * Validate email format\r\n */\r\nexport function isValidEmail(email: string): boolean {\r\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\r\n return emailRegex.test(email);\r\n}\r\n\r\n/**\r\n * Validate URL format\r\n */\r\nexport function isValidUrl(url: string): boolean {\r\n try {\r\n new URL(url);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Validate API key format\r\n */\r\nexport function isValidApiKey(apiKey: string): boolean {\r\n return typeof apiKey === 'string' && apiKey.length > 0 && apiKey.length <= 256;\r\n}\r\n\r\n/**\r\n * Validate workspace ID format\r\n */\r\nexport function isValidWorkspaceId(workspaceId: string): boolean {\r\n return typeof workspaceId === 'string' && workspaceId.length > 0 && workspaceId.length <= 128;\r\n}\r\n\r\n/**\r\n * Validate color format (hex, rgb, rgba)\r\n */\r\nexport function isValidColor(color: string): boolean {\r\n const hexRegex = /^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/;\r\n const rgbRegex = /^rgb\\(\\s*\\d+\\s*,\\s*\\d+\\s*,\\s*\\d+\\s*\\)$/;\r\n const rgbaRegex = /^rgba\\(\\s*\\d+\\s*,\\s*\\d+\\s*,\\s*\\d+\\s*,\\s*(0|1|0?\\.\\d+)\\s*\\)$/;\r\n\r\n return hexRegex.test(color) || rgbRegex.test(color) || rgbaRegex.test(color);\r\n}\r\n\r\n/**\r\n * Validate message text\r\n */\r\nexport function isValidMessageText(text: string): boolean {\r\n return typeof text === 'string' && text.trim().length > 0 && text.length <= 10000;\r\n}\r\n\r\n/**\r\n * Sanitize HTML to prevent XSS\r\n */\r\nexport function sanitizeHtml(html: string): string {\r\n const div = document.createElement('div');\r\n div.textContent = html;\r\n return div.innerHTML;\r\n}\r\n\r\n/**\r\n * Sanitize user input\r\n */\r\nexport function sanitizeInput(input: string): string {\r\n if (typeof input !== 'string') {\r\n return '';\r\n }\r\n\r\n return input\r\n .trim()\r\n .replace(/[<>]/g, '') // Remove angle brackets\r\n .replace(/javascript:/gi, '') // Remove javascript: protocol\r\n .replace(/on\\w+\\s*=/gi, ''); // Remove event handlers\r\n}\r\n\r\n/**\r\n * Validate object has required properties\r\n */\r\nexport function hasRequiredProperties<T extends Record<string, any>>(\r\n obj: any,\r\n properties: (keyof T)[]\r\n): obj is T {\r\n if (typeof obj !== 'object' || obj === null) {\r\n return false;\r\n }\r\n\r\n return properties.every((prop) => prop in obj);\r\n}\r\n\r\n/**\r\n * Validate string length\r\n */\r\nexport function isValidLength(\r\n str: string,\r\n options: { min?: number; max?: number }\r\n): boolean {\r\n const length = str.length;\r\n\r\n if (options.min !== undefined && length < options.min) {\r\n return false;\r\n }\r\n\r\n if (options.max !== undefined && length > options.max) {\r\n return false;\r\n }\r\n\r\n return true;\r\n}\r\n\r\n/**\r\n * Validate number range\r\n */\r\nexport function isInRange(\r\n num: number,\r\n options: { min?: number; max?: number }\r\n): boolean {\r\n if (options.min !== undefined && num < options.min) {\r\n return false;\r\n }\r\n\r\n if (options.max !== undefined && num > options.max) {\r\n return false;\r\n }\r\n\r\n return true;\r\n}\r\n\r\n/**\r\n * Validate array length\r\n */\r\nexport function isValidArrayLength<T>(\r\n arr: T[],\r\n options: { min?: number; max?: number }\r\n): boolean {\r\n if (!Array.isArray(arr)) {\r\n return false;\r\n }\r\n\r\n return isInRange(arr.length, options);\r\n}\r\n\r\n/**\r\n * Deep clone object (safe for JSON-serializable objects)\r\n */\r\nexport function deepClone<T>(obj: T): T {\r\n if (obj === null || typeof obj !== 'object') {\r\n return obj;\r\n }\r\n\r\n if (obj instanceof Date) {\r\n return new Date(obj.getTime()) as any;\r\n }\r\n\r\n if (obj instanceof Array) {\r\n return obj.map((item) => deepClone(item)) as any;\r\n }\r\n\r\n if (obj instanceof Object) {\r\n const cloned: any = {};\r\n for (const key in obj) {\r\n if (obj.hasOwnProperty(key)) {\r\n cloned[key] = deepClone(obj[key]);\r\n }\r\n }\r\n return cloned;\r\n }\r\n\r\n return obj;\r\n}\r\n\r\n/**\r\n * Check if value is a plain object\r\n */\r\nexport function isPlainObject(value: any): value is Record<string, any> {\r\n if (typeof value !== 'object' || value === null) {\r\n return false;\r\n }\r\n\r\n const proto = Object.getPrototypeOf(value);\r\n return proto === null || proto === Object.prototype;\r\n}\r\n\r\n/**\r\n * Merge objects deeply\r\n */\r\nexport function deepMerge<T extends Record<string, any>>(\r\n target: T,\r\n ...sources: Partial<T>[]\r\n): T {\r\n if (!sources.length) return target;\r\n\r\n const source = sources.shift();\r\n if (!source) return target;\r\n\r\n if (isPlainObject(target) && isPlainObject(source)) {\r\n for (const key in source) {\r\n if (isPlainObject(source[key])) {\r\n if (!target[key]) {\r\n Object.assign(target, { [key]: {} });\r\n }\r\n deepMerge(target[key], source[key] as any);\r\n } else {\r\n Object.assign(target, { [key]: source[key] });\r\n }\r\n }\r\n }\r\n\r\n return deepMerge(target, ...sources);\r\n}\r\n\r\n/**\r\n * Validate file type\r\n */\r\nexport function isValidFileType(file: File, allowedTypes: string[]): boolean {\r\n return allowedTypes.some((type) => {\r\n if (type.endsWith('/*')) {\r\n const category = type.split('/')[0];\r\n return file.type.startsWith(category + '/');\r\n }\r\n return file.type === type;\r\n });\r\n}\r\n\r\n/**\r\n * Validate file size\r\n */\r\nexport function isValidFileSize(file: File, maxSizeBytes: number): boolean {\r\n return file.size <= maxSizeBytes;\r\n}\r\n\r\n/**\r\n * Format file size for display\r\n */\r\nexport function formatFileSize(bytes: number): string {\r\n if (bytes === 0) return '0 Bytes';\r\n\r\n const k = 1024;\r\n const sizes = ['Bytes', 'KB', 'MB', 'GB'];\r\n const i = Math.floor(Math.log(bytes) / Math.log(k));\r\n\r\n return Math.round(bytes / Math.pow(k, i) * 100) / 100 + ' ' + sizes[i];\r\n}\r\n","/**\r\n * Weld SDK - State Coordinator\r\n * Manages and synchronizes state across iframes\r\n */\r\n\r\nimport type {\r\n WeldState,\r\n StateAction,\r\n StateListener,\r\n StateSubscription,\r\n} from '../types/state';\r\nimport {\r\n createInitialState,\r\n getStateValue,\r\n setStateValue,\r\n} from '../types/state';\r\nimport type { MessageType } from '../types/messages';\r\nimport { Logger } from '../utils/logger';\r\nimport { MessageBroker } from './MessageBroker';\r\nimport { deepClone } from '../utils/validation';\r\n\r\n/**\r\n * StateCoordinator class\r\n * Central state management for multi-iframe architecture\r\n */\r\nexport class StateCoordinator {\r\n private state: WeldState;\r\n private logger: Logger;\r\n private messageBroker: MessageBroker;\r\n private subscriptions: Map<string, StateSubscription> = new Map();\r\n private stateHistory: StateAction[] = [];\r\n private maxHistorySize = 50;\r\n\r\n constructor(messageBroker: MessageBroker, logger: Logger) {\r\n this.messageBroker = messageBroker;\r\n this.logger = logger.child('[StateCoordinator]');\r\n this.state = createInitialState();\r\n\r\n this.setupMessageHandlers();\r\n this.logger.debug('StateCoordinator initialized');\r\n }\r\n\r\n /**\r\n * Setup message handlers for state updates\r\n */\r\n private setupMessageHandlers(): void {\r\n // Listen for state update requests from iframes\r\n this.messageBroker.subscribe(\r\n 'weld:state:update' as MessageType,\r\n this.handleStateUpdate.bind(this)\r\n );\r\n\r\n // Listen for state request messages\r\n this.messageBroker.subscribe(\r\n 'weld:state:request' as MessageType,\r\n this.handleStateRequest.bind(this)\r\n );\r\n\r\n this.logger.debug('Message handlers setup');\r\n }\r\n\r\n /**\r\n * Handle state update from iframe\r\n */\r\n private handleStateUpdate(payload: any): void {\r\n const { path, value, merge } = payload;\r\n\r\n if (!path) {\r\n this.logger.warn('State update missing path', payload);\r\n return;\r\n }\r\n\r\n this.updateState(path, value, merge);\r\n }\r\n\r\n /**\r\n * Handle state request from iframe\r\n */\r\n private handleStateRequest(payload: any): void {\r\n const { path } = payload;\r\n\r\n if (path) {\r\n const value = getStateValue(this.state, path);\r\n this.messageBroker.broadcast('weld:state:response' as MessageType, {\r\n path,\r\n value,\r\n });\r\n } else {\r\n // Send entire state\r\n this.messageBroker.broadcast('weld:state:response' as MessageType, {\r\n state: this.state,\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Get current state\r\n */\r\n public getState(): WeldState {\r\n return deepClone(this.state);\r\n }\r\n\r\n /**\r\n * Get state value by path\r\n */\r\n public getValue<T = any>(path: string): T {\r\n return getStateValue(this.state, path);\r\n }\r\n\r\n /**\r\n * Update state\r\n */\r\n public updateState(path: string, value: any, merge = false): void {\r\n const oldState = deepClone(this.state);\r\n this.state = setStateValue(this.state, path, value, merge);\r\n\r\n // Create state action\r\n const action: StateAction = {\r\n type: 'UPDATE',\r\n path,\r\n payload: value,\r\n merge,\r\n timestamp: Date.now(),\r\n };\r\n\r\n // Add to history\r\n this.addToHistory(action);\r\n\r\n // Notify subscribers\r\n this.notifySubscribers(path, value, getStateValue(oldState, path));\r\n\r\n // Broadcast to iframes\r\n this.messageBroker.broadcast('weld:state:update' as MessageType, {\r\n path,\r\n value,\r\n merge,\r\n });\r\n\r\n this.logger.debug('State updated', { path, merge });\r\n }\r\n\r\n /**\r\n * Batch update multiple state paths\r\n */\r\n public batchUpdate(updates: Array<{ path: string; value: any; merge?: boolean }>): void {\r\n const oldState = deepClone(this.state);\r\n\r\n for (const update of updates) {\r\n this.state = setStateValue(\r\n this.state,\r\n update.path,\r\n update.value,\r\n update.merge\r\n );\r\n }\r\n\r\n // Notify subscribers for each update\r\n for (const update of updates) {\r\n this.notifySubscribers(\r\n update.path,\r\n getStateValue(this.state, update.path),\r\n getStateValue(oldState, update.path)\r\n );\r\n }\r\n\r\n // Broadcast all updates\r\n this.messageBroker.broadcast('weld:state:update' as MessageType, {\r\n batch: updates,\r\n });\r\n\r\n this.logger.debug('Batch state update', { count: updates.length });\r\n }\r\n\r\n /**\r\n * Reset state to initial\r\n */\r\n public resetState(): void {\r\n const oldState = this.state;\r\n this.state = createInitialState();\r\n\r\n // Notify all subscribers\r\n for (const [_id, subscription] of this.subscriptions) {\r\n const oldValue = getStateValue(oldState, subscription.path);\r\n const newValue = getStateValue(this.state, subscription.path);\r\n subscription.listener(newValue, oldValue);\r\n }\r\n\r\n // Broadcast reset\r\n this.messageBroker.broadcast('weld:state:update' as MessageType, {\r\n reset: true,\r\n state: this.state,\r\n });\r\n\r\n this.logger.debug('State reset');\r\n }\r\n\r\n /**\r\n * Subscribe to state changes\r\n */\r\n public subscribe<T = any>(\r\n path: string,\r\n listener: StateListener<T>,\r\n immediate = false\r\n ): string {\r\n const id = `sub_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\r\n\r\n this.subscriptions.set(id, {\r\n id,\r\n path,\r\n listener,\r\n immediate,\r\n });\r\n\r\n // Call listener immediately if requested\r\n if (immediate) {\r\n const value = getStateValue(this.state, path);\r\n listener(value, value);\r\n }\r\n\r\n this.logger.debug('State subscription added', { id, path });\r\n return id;\r\n }\r\n\r\n /**\r\n * Unsubscribe from state changes\r\n */\r\n public unsubscribe(subscriptionId: string): void {\r\n if (this.subscriptions.delete(subscriptionId)) {\r\n this.logger.debug('State subscription removed', { id: subscriptionId });\r\n }\r\n }\r\n\r\n /**\r\n * Notify subscribers of state change\r\n */\r\n private notifySubscribers(path: string, newValue: any, oldValue: any): void {\r\n const subscriptions = Array.from(this.subscriptions.values());\r\n\r\n for (const subscription of subscriptions) {\r\n // Exact path match\r\n if (subscription.path === path) {\r\n try {\r\n subscription.listener(newValue, oldValue);\r\n } catch (error) {\r\n this.logger.error('Error in state listener', error);\r\n }\r\n continue;\r\n }\r\n\r\n // Parent path match (e.g., subscriber to \"user\" gets notified for \"user.name\")\r\n if (path.startsWith(subscription.path + '.')) {\r\n const subValue = getStateValue(this.state, subscription.path);\r\n try {\r\n subscription.listener(subValue, oldValue);\r\n } catch (error) {\r\n this.logger.error('Error in state listener', error);\r\n }\r\n continue;\r\n }\r\n\r\n // Child path match (e.g., subscriber to \"user.name\" gets notified for \"user\")\r\n if (subscription.path.startsWith(path + '.')) {\r\n const subValue = getStateValue(this.state, subscription.path);\r\n try {\r\n subscription.listener(subValue, undefined);\r\n } catch (error) {\r\n this.logger.error('Error in state listener', error);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Add action to history\r\n */\r\n private addToHistory(action: StateAction): void {\r\n this.stateHistory.push(action);\r\n\r\n // Trim history if too large\r\n if (this.stateHistory.length > this.maxHistorySize) {\r\n this.stateHistory.shift();\r\n }\r\n }\r\n\r\n /**\r\n * Get state history\r\n */\r\n public getHistory(): StateAction[] {\r\n return [...this.stateHistory];\r\n }\r\n\r\n /**\r\n * Clear state history\r\n */\r\n public clearHistory(): void {\r\n this.stateHistory = [];\r\n this.logger.debug('State history cleared');\r\n }\r\n\r\n /**\r\n * Get snapshot of state at specific time\r\n */\r\n public getSnapshot(timestamp: number): WeldState | null {\r\n // Find all actions before timestamp\r\n const actions = this.stateHistory.filter((a) => a.timestamp <= timestamp);\r\n\r\n if (actions.length === 0) {\r\n return null;\r\n }\r\n\r\n // Replay actions to reconstruct state\r\n let state = createInitialState();\r\n for (const action of actions) {\r\n state = setStateValue(state, action.path, action.payload, action.merge);\r\n }\r\n\r\n return state;\r\n }\r\n\r\n /**\r\n * Widget-specific state helpers\r\n */\r\n public openWidget(): void {\r\n this.batchUpdate([\r\n { path: 'widget.isOpen', value: true },\r\n { path: 'widget.visibility', value: 'visible' },\r\n { path: 'launcher.isVisible', value: false },\r\n { path: 'backdrop.isVisible', value: true },\r\n ]);\r\n }\r\n\r\n public closeWidget(): void {\r\n this.batchUpdate([\r\n { path: 'widget.isOpen', value: false },\r\n { path: 'widget.visibility', value: 'hidden' },\r\n { path: 'launcher.isVisible', value: true },\r\n { path: 'backdrop.isVisible', value: false },\r\n ]);\r\n }\r\n\r\n public minimizeWidget(): void {\r\n this.batchUpdate([\r\n { path: 'widget.isMinimized', value: true },\r\n { path: 'widget.visibility', value: 'minimized' },\r\n ]);\r\n }\r\n\r\n public maximizeWidget(): void {\r\n this.batchUpdate([\r\n { path: 'widget.isMinimized', value: false },\r\n { path: 'widget.visibility', value: 'visible' },\r\n ]);\r\n }\r\n\r\n public setBadgeCount(count: number): void {\r\n this.batchUpdate([\r\n { path: 'launcher.badge.count', value: count },\r\n { path: 'launcher.badge.show', value: count > 0 },\r\n ]);\r\n }\r\n\r\n public setUserAuth(userId: string, email?: string, name?: string): void {\r\n this.batchUpdate([\r\n { path: 'user.isAuthenticated', value: true },\r\n { path: 'user.isAnonymous', value: false },\r\n { path: 'user.id', value: userId },\r\n { path: 'user.email', value: email },\r\n { path: 'user.name', value: name },\r\n ]);\r\n }\r\n\r\n public setConnectionStatus(status: string): void {\r\n this.updateState('network.status', status);\r\n }\r\n\r\n public setLoading(isLoading: boolean): void {\r\n this.updateState('ui.isLoading', isLoading);\r\n }\r\n\r\n public setError(code: string, message: string, recoverable = true): void {\r\n this.updateState('ui.error', { code, message, recoverable });\r\n }\r\n\r\n public clearError(): void {\r\n this.updateState('ui.error', undefined);\r\n }\r\n\r\n /**\r\n * Get active subscription count\r\n */\r\n public getSubscriptionCount(): number {\r\n return this.subscriptions.size;\r\n }\r\n\r\n /**\r\n * Validate state integrity\r\n */\r\n public validateState(): boolean {\r\n try {\r\n // Check required properties exist\r\n const requiredPaths = [\r\n 'user',\r\n 'conversation',\r\n 'widget',\r\n 'launcher',\r\n 'backdrop',\r\n 'mobile',\r\n 'network',\r\n 'ui',\r\n ];\r\n\r\n for (const path of requiredPaths) {\r\n if (getStateValue(this.state, path) === undefined) {\r\n this.logger.error('Missing required state path', { path });\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n } catch (error) {\r\n this.logger.error('State validation failed', error);\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Export state as JSON\r\n */\r\n public exportState(): string {\r\n return JSON.stringify(this.state, null, 2);\r\n }\r\n\r\n /**\r\n * Import state from JSON\r\n */\r\n public importState(json: string): boolean {\r\n try {\r\n const imported = JSON.parse(json);\r\n this.state = { ...createInitialState(), ...imported };\r\n this.messageBroker.broadcast('weld:state:update' as MessageType, {\r\n reset: true,\r\n state: this.state,\r\n });\r\n this.logger.info('State imported');\r\n return true;\r\n } catch (error) {\r\n this.logger.error('Failed to import state', error);\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Destroy coordinator and cleanup\r\n */\r\n public destroy(): void {\r\n this.logger.debug('Destroying state coordinator');\r\n\r\n // Clear subscriptions\r\n this.subscriptions.clear();\r\n\r\n // Clear history\r\n this.stateHistory = [];\r\n\r\n // Reset state\r\n this.state = createInitialState();\r\n\r\n this.logger.info('StateCoordinator destroyed');\r\n }\r\n}\r\n","/**\r\n * Weld SDK - Main Entry Point\r\n * Public API for the Weld helpdesk widget\r\n */\r\n\r\nimport type { WeldConfig, ResolvedConfig } from '../types/config';\r\nimport { resolveConfig } from '../types/config';\r\nimport type { WeldState } from '../types/state';\r\nimport type { MessageType } from '../types/messages';\r\nimport { Logger } from '../utils/logger';\r\nimport { IframeManager, IframeType } from './IframeManager';\r\nimport { MessageBroker } from './MessageBroker';\r\nimport { StateCoordinator } from './StateCoordinator';\r\nimport packageJson from '../../package.json';\r\n\r\n/**\r\n * SDK initialization status\r\n */\r\nenum SDKStatus {\r\n UNINITIALIZED = 'uninitialized',\r\n INITIALIZING = 'initializing',\r\n READY = 'ready',\r\n ERROR = 'error',\r\n DESTROYED = 'destroyed',\r\n}\r\n\r\n/**\r\n * User identification data\r\n */\r\nexport interface UserIdentity {\r\n userId: string;\r\n email?: string;\r\n name?: string;\r\n avatar?: string;\r\n metadata?: Record<string, any>;\r\n}\r\n\r\n/**\r\n * WeldSDK class\r\n * Main SDK interface for embedding the widget\r\n */\r\nexport class WeldSDK {\r\n private config: ResolvedConfig;\r\n private logger: Logger;\r\n private iframeManager: IframeManager;\r\n private messageBroker: MessageBroker;\r\n private stateCoordinator: StateCoordinator;\r\n private status: SDKStatus = SDKStatus.UNINITIALIZED;\r\n private readyPromise: Promise<void> | null = null;\r\n private readyResolve: (() => void) | null = null;\r\n\r\n // Bound event handlers for proper cleanup\r\n private boundHandleLauncherClick: (event: MessageEvent) => void;\r\n\r\n // Subscription IDs for cleanup\r\n private subscriptionIds: string[] = [];\r\n\r\n constructor(config: WeldConfig) {\r\n // Resolve configuration\r\n this.config = resolveConfig(config);\r\n\r\n // Initialize logger\r\n this.logger = new Logger(this.config.logging);\r\n this.logger.info('WeldSDK created', {\r\n widgetId: this.config.widgetId,\r\n });\r\n\r\n // Create ready promise\r\n this.readyPromise = new Promise((resolve) => {\r\n this.readyResolve = resolve;\r\n });\r\n\r\n // Bind handlers once for proper cleanup\r\n this.boundHandleLauncherClick = this.handleLauncherClickMessage.bind(this);\r\n\r\n // Initialize managers\r\n this.iframeManager = new IframeManager(this.config);\r\n this.messageBroker = new MessageBroker(\r\n this.config,\r\n this.iframeManager,\r\n this.logger\r\n );\r\n this.stateCoordinator = new StateCoordinator(\r\n this.messageBroker,\r\n this.logger\r\n );\r\n }\r\n\r\n /**\r\n * Handle launcher click messages from iframe\r\n */\r\n private handleLauncherClickMessage(event: MessageEvent): void {\r\n // Log all messages from iframes for debugging\r\n if (event.data?.type) {\r\n console.log('[Weld SDK] Received message:', event.data.type);\r\n }\r\n\r\n if (event.data?.type === 'launcher:clicked') {\r\n // Toggle behavior - if widget is open, close it; if closed, open it\r\n const state = this.stateCoordinator.getState();\r\n if (state.widget.isOpen) {\r\n console.log('[Weld SDK] Launcher clicked - closing widget (toggle)');\r\n this.close();\r\n } else {\r\n console.log('[Weld SDK] Launcher clicked - opening widget');\r\n this.open();\r\n }\r\n }\r\n if (event.data?.type === 'weld:close') {\r\n console.log('[Weld SDK] Widget close requested');\r\n this.close();\r\n }\r\n }\r\n\r\n /**\r\n * Initialize the SDK and render widget\r\n */\r\n public async init(): Promise<void> {\r\n if (this.status !== SDKStatus.UNINITIALIZED) {\r\n this.logger.warn('SDK already initialized');\r\n return this.readyPromise!;\r\n }\r\n\r\n this.status = SDKStatus.INITIALIZING;\r\n this.logger.info('Initializing WeldSDK');\r\n\r\n try {\r\n // Setup ready handlers BEFORE initializing iframes\r\n // This ensures we catch the weld:ready messages\r\n this.setupReadyHandlers();\r\n\r\n // Initialize iframe manager (creates iframes, triggers onload -> weld:init)\r\n await this.iframeManager.init(this.messageBroker);\r\n\r\n // Wait for all iframes JS to be ready (weld:ready messages received)\r\n await this.waitForIframesReady();\r\n\r\n // Mark as ready\r\n this.status = SDKStatus.READY;\r\n this.readyResolve?.();\r\n this.logger.info('WeldSDK ready');\r\n\r\n // Call onReady callback\r\n this.config.onReady?.();\r\n } catch (error) {\r\n this.status = SDKStatus.ERROR;\r\n this.logger.error('Failed to initialize WeldSDK', error);\r\n this.config.onError?.(error as Error);\r\n throw error;\r\n }\r\n\r\n return this.readyPromise!;\r\n }\r\n\r\n /**\r\n * Setup ready message handlers\r\n */\r\n private setupReadyHandlers(): void {\r\n // Subscribe to weld:ready messages from iframes\r\n const readySubId = this.messageBroker.subscribe('weld:ready' as MessageType, (payload) => {\r\n const { iframe } = payload;\r\n this.logger.debug('Iframe JS ready signal received', { iframe });\r\n\r\n // Map iframe name to type\r\n const iframeType = this.mapIframeNameToType(iframe);\r\n if (iframeType) {\r\n this.messageBroker.setIframeReady(iframeType);\r\n }\r\n });\r\n this.subscriptionIds.push(readySubId);\r\n\r\n // Listen for launcher click events from the iframe using bound handler\r\n window.addEventListener('message', this.boundHandleLauncherClick);\r\n }\r\n\r\n /**\r\n * Map iframe name to type\r\n */\r\n private mapIframeNameToType(name: string): IframeType | null {\r\n if (name.includes('launcher')) return IframeType.LAUNCHER;\r\n if (name.includes('widget')) return IframeType.WIDGET;\r\n return null;\r\n }\r\n\r\n /**\r\n * Wait for all iframes JS to be ready (weld:ready messages received)\r\n */\r\n private async waitForIframesReady(timeout = 10000): Promise<void> {\r\n const startTime = Date.now();\r\n\r\n return new Promise((resolve, reject) => {\r\n const checkReady = () => {\r\n // Check for actual JS ready state (weld:ready received), not just DOM loaded\r\n if (this.messageBroker.areAllIframesJsReady()) {\r\n this.logger.debug('All iframes JS ready - initialization complete');\r\n resolve();\r\n return;\r\n }\r\n\r\n if (Date.now() - startTime > timeout) {\r\n // Log which iframes are not ready for debugging\r\n const launcherReady = this.messageBroker.isIframeJsReady(IframeType.LAUNCHER);\r\n const widgetReady = this.messageBroker.isIframeJsReady(IframeType.WIDGET);\r\n this.logger.error('Timeout waiting for iframes JS ready', {\r\n launcherReady,\r\n widgetReady,\r\n });\r\n reject(new Error(`Timeout waiting for iframes JS ready. Launcher: ${launcherReady}, Widget: ${widgetReady}`));\r\n return;\r\n }\r\n\r\n setTimeout(checkReady, 100);\r\n };\r\n\r\n checkReady();\r\n });\r\n }\r\n\r\n /**\r\n * Wait for SDK to be ready\r\n */\r\n public async ready(): Promise<void> {\r\n return this.readyPromise!;\r\n }\r\n\r\n /**\r\n * Check if SDK is ready\r\n */\r\n public isReady(): boolean {\r\n return this.status === SDKStatus.READY;\r\n }\r\n\r\n /**\r\n * Open the widget\r\n */\r\n public open(): void {\r\n this.ensureReady();\r\n console.log('[Weld SDK] Opening widget...');\r\n\r\n this.stateCoordinator.openWidget();\r\n this.iframeManager.showIframe(IframeType.WIDGET);\r\n this.iframeManager.showIframe(IframeType.BACKDROP);\r\n // Keep launcher visible so user can click it to close the widget\r\n\r\n // Send open message to the widget iframe\r\n const widgetIframe = this.iframeManager.getIframe(IframeType.WIDGET);\r\n if (widgetIframe?.element?.contentWindow) {\r\n widgetIframe.element.contentWindow.postMessage({ type: 'weld:open' }, '*');\r\n }\r\n\r\n // Notify launcher that widget is now open (so it can show X icon)\r\n const launcherIframe = this.iframeManager.getIframe(IframeType.LAUNCHER);\r\n if (launcherIframe?.element?.contentWindow) {\r\n launcherIframe.element.contentWindow.postMessage({ type: 'weld:widget-opened' }, '*');\r\n }\r\n\r\n this.config.onOpen?.();\r\n }\r\n\r\n /**\r\n * Close the widget\r\n */\r\n public close(): void {\r\n this.ensureReady();\r\n console.log('[Weld SDK] Closing widget...');\r\n\r\n this.stateCoordinator.closeWidget();\r\n this.iframeManager.hideIframe(IframeType.WIDGET);\r\n this.iframeManager.hideIframe(IframeType.BACKDROP);\r\n // Launcher stays visible\r\n\r\n // Send close message to the widget iframe\r\n const widgetIframe = this.iframeManager.getIframe(IframeType.WIDGET);\r\n if (widgetIframe?.element?.contentWindow) {\r\n widgetIframe.element.contentWindow.postMessage({ type: 'weld:close' }, '*');\r\n }\r\n\r\n // Notify launcher that widget is now closed (so it can show chat icon)\r\n const launcherIframe = this.iframeManager.getIframe(IframeType.LAUNCHER);\r\n if (launcherIframe?.element?.contentWindow) {\r\n launcherIframe.element.contentWindow.postMessage({ type: 'weld:widget-closed' }, '*');\r\n }\r\n\r\n this.config.onClose?.();\r\n }\r\n\r\n /**\r\n * Toggle widget open/close\r\n */\r\n public toggle(): void {\r\n const state = this.stateCoordinator.getState();\r\n if (state.widget.isOpen) {\r\n this.close();\r\n } else {\r\n this.open();\r\n }\r\n }\r\n\r\n /**\r\n * Minimize the widget\r\n */\r\n public minimize(): void {\r\n this.ensureReady();\r\n this.logger.debug('Minimizing widget');\r\n\r\n this.stateCoordinator.minimizeWidget();\r\n this.config.onMinimize?.();\r\n }\r\n\r\n /**\r\n * Maximize the widget\r\n */\r\n public maximize(): void {\r\n this.ensureReady();\r\n this.logger.debug('Maximizing widget');\r\n\r\n this.stateCoordinator.maximizeWidget();\r\n this.config.onMaximize?.();\r\n }\r\n\r\n /**\r\n * Show the launcher\r\n */\r\n public showLauncher(): void {\r\n this.ensureReady();\r\n this.logger.debug('Showing launcher');\r\n\r\n this.iframeManager.showIframe(IframeType.LAUNCHER);\r\n this.stateCoordinator.updateState('launcher.isVisible', true);\r\n }\r\n\r\n /**\r\n * Hide the launcher\r\n */\r\n public hideLauncher(): void {\r\n this.ensureReady();\r\n this.logger.debug('Hiding launcher');\r\n\r\n this.iframeManager.hideIframe(IframeType.LAUNCHER);\r\n this.stateCoordinator.updateState('launcher.isVisible', false);\r\n }\r\n\r\n /**\r\n * Set badge count\r\n */\r\n public setBadgeCount(count: number): void {\r\n this.ensureReady();\r\n this.logger.debug('Setting badge count', { count });\r\n\r\n this.stateCoordinator.setBadgeCount(count);\r\n }\r\n\r\n /**\r\n * Clear badge\r\n */\r\n public clearBadge(): void {\r\n this.setBadgeCount(0);\r\n }\r\n\r\n /**\r\n * Send a message\r\n */\r\n public sendMessage(text: string, metadata?: Record<string, any>): void {\r\n this.ensureReady();\r\n this.logger.debug('Sending message', { text });\r\n\r\n this.messageBroker.sendToIframe(IframeType.WIDGET, 'weld:message:send' as MessageType, {\r\n text,\r\n metadata,\r\n timestamp: Date.now(),\r\n });\r\n }\r\n\r\n /**\r\n * Identify user\r\n */\r\n public identify(identity: UserIdentity): void {\r\n this.ensureReady();\r\n this.logger.debug('Identifying user', { userId: identity.userId });\r\n\r\n this.stateCoordinator.setUserAuth(\r\n identity.userId,\r\n identity.email,\r\n identity.name\r\n );\r\n\r\n this.messageBroker.broadcast('weld:auth:login' as MessageType, identity);\r\n }\r\n\r\n /**\r\n * Logout user\r\n */\r\n public logout(): void {\r\n this.ensureReady();\r\n this.logger.debug('Logging out user');\r\n\r\n this.stateCoordinator.updateState('user', {\r\n isAuthenticated: false,\r\n isAnonymous: true,\r\n });\r\n\r\n this.messageBroker.broadcast('weld:auth:logout' as MessageType, {});\r\n }\r\n\r\n /**\r\n * Update configuration\r\n */\r\n public updateConfig(updates: Partial<WeldConfig>): void {\r\n this.ensureReady();\r\n this.logger.debug('Updating configuration');\r\n\r\n // Merge config\r\n this.config = resolveConfig({ ...this.config, ...updates });\r\n\r\n // Broadcast config update\r\n this.messageBroker.broadcast('weld:config:update' as MessageType, updates);\r\n }\r\n\r\n /**\r\n * Update theme\r\n */\r\n public setTheme(theme: 'light' | 'dark' | 'auto'): void {\r\n this.ensureReady();\r\n this.logger.debug('Setting theme', { theme });\r\n\r\n this.stateCoordinator.updateState('ui.theme', theme);\r\n this.messageBroker.broadcast('weld:theme:update' as MessageType, { mode: theme });\r\n }\r\n\r\n /**\r\n * Update locale\r\n */\r\n public setLocale(locale: string): void {\r\n this.ensureReady();\r\n this.logger.debug('Setting locale', { locale });\r\n\r\n this.stateCoordinator.updateState('ui.locale', locale);\r\n this.messageBroker.broadcast('weld:locale:update' as MessageType, { locale });\r\n }\r\n\r\n /**\r\n * Track custom event\r\n */\r\n public track(eventName: string, properties?: Record<string, any>): void {\r\n this.ensureReady();\r\n this.logger.debug('Tracking event', { eventName });\r\n\r\n this.messageBroker.broadcast('weld:event:track' as MessageType, {\r\n name: eventName,\r\n properties,\r\n timestamp: Date.now(),\r\n });\r\n }\r\n\r\n // ============================================================================\r\n // Intercom-style API Methods\r\n // ============================================================================\r\n\r\n /**\r\n * Boot the widget with user context (Intercom-style)\r\n * Use this after authentication to pass user information\r\n *\r\n * @example\r\n * ```typescript\r\n * weld.boot({\r\n * userId: 'user_123',\r\n * email: 'user@example.com',\r\n * name: 'John Doe',\r\n * createdAt: new Date('2024-01-01'),\r\n * customAttributes: { plan: 'pro', company: 'Acme Inc' }\r\n * });\r\n * ```\r\n */\r\n public boot(settings: {\r\n userId?: string;\r\n email?: string;\r\n name?: string;\r\n avatar?: string;\r\n createdAt?: Date;\r\n customAttributes?: Record<string, any>;\r\n }): void {\r\n this.ensureReady();\r\n this.logger.info('Booting widget with user context', { userId: settings.userId });\r\n\r\n // Update user state\r\n if (settings.userId || settings.email) {\r\n this.stateCoordinator.setUserAuth(\r\n settings.userId || '',\r\n settings.email,\r\n settings.name\r\n );\r\n }\r\n\r\n // Broadcast to iframes\r\n this.messageBroker.broadcast('weld:auth:login' as MessageType, {\r\n userId: settings.userId,\r\n email: settings.email,\r\n name: settings.name,\r\n avatar: settings.avatar,\r\n metadata: {\r\n createdAt: settings.createdAt?.toISOString(),\r\n ...settings.customAttributes,\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Shutdown the widget and clear session (Intercom-style)\r\n * Use this on logout to clear user data and session cookies\r\n */\r\n public shutdown(): void {\r\n this.logger.info('Shutting down widget');\r\n\r\n // Clear user state\r\n this.stateCoordinator.updateState('user', {\r\n isAuthenticated: false,\r\n isAnonymous: true,\r\n });\r\n\r\n // Broadcast logout to iframes\r\n this.messageBroker.broadcast('weld:auth:logout' as MessageType, {});\r\n\r\n // Clear any stored session data\r\n try {\r\n const prefix = 'weld-';\r\n const keysToRemove: string[] = [];\r\n for (let i = 0; i < localStorage.length; i++) {\r\n const key = localStorage.key(i);\r\n if (key?.startsWith(prefix)) {\r\n keysToRemove.push(key);\r\n }\r\n }\r\n keysToRemove.forEach(key => localStorage.removeItem(key));\r\n } catch (e) {\r\n // localStorage might not be available\r\n this.logger.debug('Could not clear localStorage', e);\r\n }\r\n\r\n this.logger.info('Widget shutdown complete');\r\n }\r\n\r\n /**\r\n * Update user attributes (Intercom-style, with rate limiting)\r\n * Limited to 20 calls per page load to prevent abuse\r\n *\r\n * @example\r\n * ```typescript\r\n * weld.update({ lastOrderDate: new Date(), orderCount: 5 });\r\n * ```\r\n */\r\n private updateCallCount = 0;\r\n private readonly updateRateLimit = 20;\r\n\r\n public update(data: Record<string, any>): void {\r\n this.ensureReady();\r\n\r\n // Rate limiting check\r\n if (this.updateCallCount >= this.updateRateLimit) {\r\n this.logger.warn('Update rate limit exceeded (max 20 per page load)');\r\n return;\r\n }\r\n this.updateCallCount++;\r\n\r\n this.logger.debug('Updating user attributes', data);\r\n\r\n // Broadcast update to iframes\r\n this.messageBroker.broadcast('weld:state:update' as MessageType, {\r\n path: 'user.metadata',\r\n value: data,\r\n merge: true,\r\n });\r\n }\r\n\r\n /**\r\n * Register callback for when widget is shown (Intercom-style)\r\n * @returns Unsubscribe function\r\n */\r\n public onShow(callback: () => void): () => void {\r\n this.ensureReady();\r\n\r\n const subscriptionId = this.stateCoordinator.subscribe('widget.isOpen', (isOpen: boolean) => {\r\n if (isOpen) {\r\n callback();\r\n }\r\n });\r\n\r\n return () => {\r\n this.stateCoordinator.unsubscribe(subscriptionId);\r\n };\r\n }\r\n\r\n /**\r\n * Register callback for when widget is hidden (Intercom-style)\r\n * @returns Unsubscribe function\r\n */\r\n public onHide(callback: () => void): () => void {\r\n this.ensureReady();\r\n\r\n const subscriptionId = this.stateCoordinator.subscribe('widget.isOpen', (isOpen: boolean) => {\r\n if (!isOpen) {\r\n callback();\r\n }\r\n });\r\n\r\n return () => {\r\n this.stateCoordinator.unsubscribe(subscriptionId);\r\n };\r\n }\r\n\r\n /**\r\n * Register callback for unread message count changes (Intercom-style)\r\n * @returns Unsubscribe function\r\n */\r\n public onUnreadCountChange(callback: (count: number) => void): () => void {\r\n this.ensureReady();\r\n\r\n const subscriptionId = this.stateCoordinator.subscribe('launcher.badgeCount', (count: number) => {\r\n callback(count || 0);\r\n });\r\n\r\n return () => {\r\n this.stateCoordinator.unsubscribe(subscriptionId);\r\n };\r\n }\r\n\r\n /**\r\n * Show the widget (alias for open, Intercom-style)\r\n */\r\n public show(): void {\r\n this.open();\r\n }\r\n\r\n /**\r\n * Hide the widget (alias for close, Intercom-style)\r\n */\r\n public hide(): void {\r\n this.close();\r\n }\r\n\r\n // ============================================================================\r\n // End Intercom-style API Methods\r\n // ============================================================================\r\n\r\n /**\r\n * Get current state\r\n */\r\n public getState(): WeldState {\r\n return this.stateCoordinator.getState();\r\n }\r\n\r\n /**\r\n * Subscribe to state changes\r\n */\r\n public onStateChange<T = any>(\r\n path: string,\r\n listener: (newValue: T, oldValue: T) => void\r\n ): () => void {\r\n this.ensureReady();\r\n\r\n const subscriptionId = this.stateCoordinator.subscribe(path, listener);\r\n\r\n // Return unsubscribe function\r\n return () => {\r\n this.stateCoordinator.unsubscribe(subscriptionId);\r\n };\r\n }\r\n\r\n /**\r\n * Get device info\r\n */\r\n public getDeviceInfo() {\r\n return this.iframeManager.getDeviceInfo();\r\n }\r\n\r\n /**\r\n * Get SDK status\r\n */\r\n public getStatus(): string {\r\n return this.status;\r\n }\r\n\r\n /**\r\n * Get SDK version\r\n */\r\n public getVersion(): string {\r\n return packageJson.version;\r\n }\r\n\r\n /**\r\n * Enable debug mode\r\n */\r\n public enableDebug(): void {\r\n this.logger.setLevel('debug');\r\n this.logger.info('Debug mode enabled');\r\n }\r\n\r\n /**\r\n * Disable debug mode\r\n */\r\n public disableDebug(): void {\r\n this.logger.setLevel('warn');\r\n this.logger.info('Debug mode disabled');\r\n }\r\n\r\n /**\r\n * Ensure SDK is ready before operation\r\n */\r\n private ensureReady(): void {\r\n if (this.status !== SDKStatus.READY) {\r\n throw new Error('SDK not ready. Call init() first.');\r\n }\r\n }\r\n\r\n /**\r\n * Destroy SDK and cleanup\r\n */\r\n public destroy(): void {\r\n this.logger.info('Destroying WeldSDK');\r\n\r\n // Remove event listener using bound handler\r\n window.removeEventListener('message', this.boundHandleLauncherClick);\r\n\r\n // Unsubscribe from all message broker subscriptions\r\n for (const subId of this.subscriptionIds) {\r\n this.messageBroker.unsubscribe(subId);\r\n }\r\n this.subscriptionIds = [];\r\n\r\n // Destroy modules\r\n this.stateCoordinator.destroy();\r\n this.messageBroker.destroy();\r\n this.iframeManager.destroy();\r\n\r\n // Reset status\r\n this.status = SDKStatus.DESTROYED;\r\n\r\n // Call onDestroy callback\r\n this.config.onDestroy?.();\r\n\r\n this.logger.info('WeldSDK destroyed');\r\n }\r\n}\r\n\r\n/**\r\n * Create and initialize WeldSDK instance\r\n */\r\nexport async function createWeldSDK(config: WeldConfig): Promise<WeldSDK> {\r\n const sdk = new WeldSDK(config);\r\n await sdk.init();\r\n return sdk;\r\n}\r\n"],"names":[],"mappings":"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"}