sitepong 0.2.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cdn/sitepong.min.js +5 -5
- package/dist/cdn/sitepong.min.js.map +1 -1
- package/dist/entries/node.d.mts +2 -2
- package/dist/entries/node.d.ts +2 -2
- package/dist/entries/rn.js +62 -6
- package/dist/entries/rn.js.map +1 -1
- package/dist/entries/web.d.mts +1 -1
- package/dist/entries/web.d.ts +1 -1
- package/dist/entries/web.js +72 -16
- package/dist/entries/web.js.map +1 -1
- package/dist/entries/web.mjs +72 -16
- package/dist/entries/web.mjs.map +1 -1
- package/dist/index.d.mts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +69 -13
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +69 -13
- package/dist/index.mjs.map +1 -1
- package/dist/nextjs/index.d.mts +2 -2
- package/dist/nextjs/index.d.ts +2 -2
- package/dist/react/index.d.mts +3 -3
- package/dist/react/index.d.ts +3 -3
- package/dist/react/index.js +69 -13
- package/dist/react/index.js.map +1 -1
- package/dist/react/index.mjs +69 -13
- package/dist/react/index.mjs.map +1 -1
- package/dist/server/index.d.mts +3 -3
- package/dist/server/index.d.ts +3 -3
- package/dist/{types-DQSv7JAE.d.ts → types-BTA43eyz.d.ts} +1 -1
- package/dist/{types-Cms9VXx9.d.mts → types-CphqOTfm.d.mts} +1 -1
- package/dist/{types-BEqbz0tw.d.mts → types-DPINdOQW.d.mts} +2 -0
- package/dist/{types-BEqbz0tw.d.ts → types-DPINdOQW.d.ts} +2 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/platforms/web/environment.ts","../../src/utils/platform.ts","../../src/flags/anonymous-id.ts","../../src/flags/context.ts","../../src/flags/evaluator.ts","../../src/flags/manager.ts","../../src/analytics/session.ts","../../src/analytics/autocapture.ts","../../src/analytics/manager.ts","../../src/crons.ts","../../src/metrics.ts","../../src/database.ts","../../src/profiling.ts","../../src/remote-config/defaults.ts","../../src/remote-config/manager.ts","../../../../node_modules/web-vitals/dist/web-vitals.js","../../src/performance/manager.ts","../../src/performance/tracing.ts","../../src/superlink/client.ts","../../src/superlink/parse.ts","../../src/superlink/deferred.ts","../../src/superlink/web.ts","../../src/superlink/index.ts","../../src/index.ts","../../src/replay/serializer.ts","../../src/replay/network.ts","../../src/replay/console.ts","../../src/replay/manager.ts","../../src/fingerprint/tampering.ts","../../src/fingerprint/signals.ts","../../src/fingerprint/behavior.ts","../../src/fingerprint/vpn-detection.ts","../../src/fingerprint/manager.ts","../../src/entries/web.ts"],"names":["makeLocalStorageAdapter","key","value","createWebEnvironment","info","handler","listener","event","url","body","blob","currentEnv","setEnvironment","env","getEnvironment","detectPlatform","g","isReactNative","legacyNativeDeviceId","asMutableRN","setRNGetCurrentScreen","fn","rn","getNativeDeviceId","getStorageAdapter","STORAGE_KEY","generateUUID","c","r","memoryId","getAnonymousId","id","clearAnonymousId","setAnonymousId","detectDeviceType","userAgent","ua","detectBrowser","detectOS","getEvaluationContext","djb2Hash","str","hash","i","evaluatePercentageRollout","config","evaluateUserbasePercentage","context","flagKey","hashInput","parseTime","timeStr","hours","minutes","evaluateTimeBased","now","parts","dayOfWeek","p","hour","minute","currentMinutes","startMinutes","endMinutes","evaluateDeviceType","evaluateBrowser","evaluateOS","evaluateRule","ruleType","evaluateFlag","flag","rule","evaluateVariant","totalWeight","sum","v","bucket","cumulative","variant","getVariantPayload","variantKey","DEFAULT_ENDPOINT","FlagManager","err","response","data","result","defaultValue","args","SESSION_KEY","SESSION_TIMESTAMP_KEY","memorySessionId","memorySessionTs","generateSessionId","isSessionExpired","lastActivity","getSessionId","existingId","lastTs","newId","getMemorySession","clearSession","DEFAULT_BLOCK_SELECTORS","AutocaptureModule","callback","target","properties","form","elemProps","element","blockSelectors","selector","sel","text","ariaLabel","role","node","names","input","current","depth","parent","siblings","index","max","DEFAULT_BATCH_SIZE","DEFAULT_FLUSH_INTERVAL","MAX_FLUSH_FAILURES","AnalyticsManager","ac","clicksEnabled","formsEnabled","captureClicks","captureForms","allowSelectors","name","eventName","pageUrl","userId","traits","groupId","events","endpoint","type","options","currentUrl","originalPushState","originalReplaceState","CronMonitorManager","slug","environment","startTime","message","duration_ms","handle","MetricsManager","start","metrics","DatabaseTracker","query","source","patterns","count","queries","q","pattern","existing","entries","a","b","Profiler","metadata","profileId","rootFrame","startMs","frame","profiles","countFrames","frames","DEFAULT_REMOTE_CONFIG","STORAGE_TS_KEY","RemoteConfigManager","l","storage","cached","cachedTs","age","ttlMs","parsed","platform","params","pa","pb","na","nb","e","o","n","u","f","s","d","m","h","T","y","E","C","S","L","w","t","A","I","P","M","k","F","D","x","R","B","H","O","N","j","_","z","G","J","K","Q","MAX_RESOURCES_PER_FLUSH","PAGE_TIMING_POLL_INTERVAL","PAGE_TIMING_TIMEOUT","getPaintBlocks","resources","paintBlocks","elements","styleURL","src","backgroundImage","matches","time","rect","top","left","bottom","right","area","calculateSpeedIndex","firstContentfulPaint","PerformanceManager","list","entry","excluded","stalled","responseStatus","failed","breakdown","entryName","firstPaint","sent","nav","timedOut","navigationStart","visuallyComplete","interactiveWindowStartTime","interactiveWindowTickTime","times","speedIndex","domContentLoadedEnd","timeToInteractive","timestamp","transaction","status","span","transactionId","spanId","unit","metric","randomHex","byteLength","bytes","hex","generateTraceId","generateSpanId","createTraceContext","propagateTrace","sampledFlag","extractTrace","headers","traceparent","version","traceId","parentSpanId","flags","sampled","TracePropagator","targets","escaped","traceHeaders","self","init","existingHeaders","mergedHeaders","patchedInit","DEFAULT_SUPERLINK_ENDPOINT","SuperLinkClient","stripTrailingSlash","payload","res","superlinkClient","UTM_KEYS","parseUniversalLink","utm","queryKey","referral","deep_link_data","handlers","lastMatched","toDeepLink","emitDeferredDeepLink","link","onDeferredDeepLink","getMatchedDeepLink","captured","didCapture","readStored","raw","writeStored","hasPayload","writeClipboardToken","clickId","extractIdentityMetadata","href","loc","email","phone","customRaw","identity","custom","captureWebDeepLink","stored","getDeepLink","webFingerprint","fp","lang","identify","completeFromScan","scanned","initSuperLink","installFallbackEnvironment","hasBrowser","hasNode","reason","webManagerFactories","registerWebManagerFactories","factories","SitePongClient","hook","idx","user","tags","breadcrumb","error","additionalContext","capturedError","level","errors","isError","stack","errorType","normalizedMsg","topFrame","lines","line","sitepong","initRN","captureError","captureMessage","setContext","setUser","setTags","flush","isInitialized","clearUser","addBreadcrumb","setCurrentScreen","getFlag","getAllFlags","getVariant","waitForFlags","areFlagsReady","refreshFlags","track","trackPageView","group","resetAnalytics","getVisitorId","getDeviceSignals","getFraudCheck","startReplay","stopReplay","isReplayRecording","getReplaySessionId","startTransaction","endTransaction","startSpan","endSpan","getWebVitals","dbTrack","dbTrackSync","getDbQueryCount","resetDbQueryCount","getDbNPlusOnePatterns","cronCheckin","cronStart","cronWrap","metricIncrement","metricGauge","metricHistogram","metricDistribution","metricTime","metricStartTimer","flushMetrics","profile","startProfileSpan","getProfiles","getLatestProfile","flushProfiles","getRemoteConfig","isRemoteConfigFeatureEnabled","onRemoteConfigChange","registerIdentifyHook","src_default","nodeIdCounter","nodeIdMap","resetNodeIds","getNodeId","SKIP_TAGS","ABSOLUTE_URL_ATTRS","COMPUTED_STYLE_PROPERTIES","defaultStyleCache","defaultStyleIframe","getDefaultStyles","tagName","iframeDoc","el","computed","defaults","prop","captureComputedStyle","crossOriginCache","fetchCrossOriginStylesheet","css","absolutified","absolutifyUrls","getCachedCrossOriginStylesheet","cleanupStyleDefaults","toAbsoluteUrl","base","baseUrl","_match","quote","rawUrl","trimmed","abs","stringifyStylesheet","sheet","rules","buildCssTextForNode","styleEl","linkEl","sheetBase","absolutifySrcset","srcset","serializeNode","parentIsSVG","textContent","htmlEl","isSVG","attributes","attr","cssText","computedStyle","inputType","val","textarea","select","dataUrl","children","child","serialized","takeSnapshot","html","REDACTED_HEADERS","NetworkRecorder","method","requestSize","duration","xhr","onLoadEnd","responseSize","path","ConsoleRecorder","serializedArgs","arg","trace","seen","_key","DEFAULT_BUFFER_DURATION","DEFAULT_MAX_SESSION_DURATION","TRIM_INTERVAL","ReplayManager","snapshot","cleanup","eventsToSend","newSnapshot","cutoff","trimIndex","mutations","mutation","attrName","attrs","elTag","textValue","onMouseMove","onClick","onContextMenu","onMouseLeave","onTouchStart","touch","scrollTimer","onScroll","onInput","onResize","onFocus","onBlur","sdkEndpoint","storageKey","links","detectTampering","signals","confidence","browserResult","detectBrowserTampering","canvasResult","detectCanvasTampering","webglResult","detectWebGLTampering","vmResult","detectVM","geoResult","detectGeolocationSpoofing","mitmResult","detectMitM","score","isWindowsUA","isMacUA","isLinuxUA","isWindowsPlatform","isMacPlatform","isLinuxPlatform","claimsChrome","brands","cores","memory","canvas","ctx","draw1","draw2","pixels","allZero","allSame","firstPixel","toDataURLDesc","gl","debugInfo","vendor","renderer","spoofedVendors","isMobile","isDesktopGPU","getParamDesc","indicators","vmRenderers","vmVendors","vm","vw","vh","connection","geoDesc","getCurrentPositionDesc","navProto","geoGetter","scripts","iframes","style","registrations","reg","swUrl","connectTime","tlsTime","resource","collectCoreSignals","hasSessionStorage","hasLocalStorage","collectExtendedSignals","getCanvasFingerprint","webgl","getWebGLInfo","getAudioFingerprint","getFontFingerprint","getMathFingerprint","getWebGLRenderHash","getCssFeatureHash","getLocalIps","collectDeviceSignals","includeExtended","smart","collectSmartSignals","getStableFingerprint","stable","detectIncognito","detectBot","detectPrivacyBrowser","detectDevTools","getConnectionType","getDoNotTrack","getNotificationsPermission","deviceAge","getDeviceAge","tampering","hashString","oscillator","compressor","testKey","db","detected","perf","heapLimit","widthThreshold","heightThreshold","dnt","baseFonts","testFonts","testString","testSize","baseWidths","font","results","vs","fs","prog","buf","supported","ips","pc","offer","resolve","timeout","match","char","BehaviorAnalyzer","downTime","mouse","keyboard","scroll","clicks","speeds","accelerations","straightSegments","totalSegments","jitterSum","prev","curr","dt","dx","dy","distance","speed","pp","expectedX","expectedY","deviation","prevSpeed","avgSpeed","maxSpeed","avgAccel","avgInterval","intervalVar","avgHold","holdVar","speedVar","smoothness","intervals","doubleClicks","interval","factors","mouseScore","keyScore","scrollScore","clickScore","values","mean","detectVPN","vpnDetected","proxyDetected","torDetected","detectTorBrowser","detectWebRTCLeak","detectVPNExtensions","tz","tzCountry","getTimezoneCountry","langCountry","checks","localIPs","ipMatch","vpnIndicators","CACHE_KEY","CACHE_TTL_MS","COOKIE_NAME","COOKIE_MAX_AGE","FingerprintManager","visitorResult","vpnResult","behaviorMetrics","stableFingerprint","previousVisitorId","cachedAt","visitorId","cfg"],"mappings":"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","file":"sitepong.min.js","sourcesContent":["/**\n * Web (browser) EnvironmentAdapter implementation.\n * This is the ONLY place in the SDK that touches `window`, `document`,\n * `navigator`, and `localStorage` on the web side.\n */\n\nimport type {\n EnvironmentAdapter,\n DeviceInfo,\n Unsubscribe,\n} from '../../adapters/environment';\nimport type { StorageAdapter } from '../../adapters/storage';\n\nfunction makeLocalStorageAdapter(): StorageAdapter | null {\n try {\n if (typeof localStorage === 'undefined') return null;\n return {\n getItem: async (key) => localStorage.getItem(key),\n setItem: async (key, value) => {\n localStorage.setItem(key, value);\n },\n removeItem: async (key) => {\n localStorage.removeItem(key);\n },\n };\n } catch {\n return null;\n }\n}\n\nexport function createWebEnvironment(): EnvironmentAdapter {\n const storage = makeLocalStorageAdapter();\n\n return {\n platform: 'browser',\n storage,\n\n getDeviceInfo(): DeviceInfo {\n const info: DeviceInfo = { platform: 'browser' };\n if (typeof navigator !== 'undefined') {\n info.userAgent = navigator.userAgent;\n }\n if (typeof window !== 'undefined' && window.screen) {\n info.screenWidth = window.screen.width;\n info.screenHeight = window.screen.height;\n }\n return info;\n },\n\n getCurrentUrl(): string | undefined {\n if (typeof window === 'undefined' || !window.location) return undefined;\n return window.location.href;\n },\n\n getReferrer(): string | undefined {\n if (typeof document === 'undefined') return undefined;\n return document.referrer || undefined;\n },\n\n getUserAgent(): string | undefined {\n if (typeof navigator === 'undefined') return undefined;\n return navigator.userAgent;\n },\n\n onUncaughtError(handler: (err: unknown) => void): Unsubscribe {\n if (typeof window === 'undefined' || !window.addEventListener) {\n return () => {};\n }\n const listener = (event: ErrorEvent) => {\n handler(event.error || event.message);\n };\n window.addEventListener('error', listener);\n return () => window.removeEventListener('error', listener);\n },\n\n onUnhandledRejection(handler: (reason: unknown) => void): Unsubscribe {\n if (typeof window === 'undefined' || !window.addEventListener) {\n return () => {};\n }\n const listener = (event: PromiseRejectionEvent) => {\n handler(event.reason);\n };\n window.addEventListener('unhandledrejection', listener);\n return () => window.removeEventListener('unhandledrejection', listener);\n },\n\n onBeforeTerminate(handler: () => void): Unsubscribe {\n if (typeof window === 'undefined' || !window.addEventListener) {\n return () => {};\n }\n window.addEventListener('beforeunload', handler);\n return () => window.removeEventListener('beforeunload', handler);\n },\n\n onVisibilityHidden(handler: () => void): Unsubscribe {\n if (typeof document === 'undefined' || !document.addEventListener) {\n return () => {};\n }\n const listener = () => {\n if (document.visibilityState === 'hidden') handler();\n };\n document.addEventListener('visibilitychange', listener);\n return () => document.removeEventListener('visibilitychange', listener);\n },\n\n sendBeacon(url: string, body: string): boolean {\n if (\n typeof navigator === 'undefined' ||\n typeof navigator.sendBeacon !== 'function'\n ) {\n return false;\n }\n try {\n const blob = new Blob([body], { type: 'application/json' });\n return navigator.sendBeacon(url, blob);\n } catch {\n return false;\n }\n },\n };\n}\n","/**\n * Platform detection + environment access.\n *\n * At runtime, shared SDK code calls these helpers. They delegate to an\n * `EnvironmentAdapter` that is installed by the platform entry point\n * (src/entries/{web,rn,node}.ts). This keeps shared code free of raw\n * `window`/`document`/`navigator`/`process` access.\n *\n * Back-compat: this file preserves the pre-refactor API shape\n * (StorageAdapter, getDeviceInfo, getStorageAdapter, getCurrentUrl, etc.)\n * so existing call sites continue to work.\n */\n\nimport type {\n EnvironmentAdapter,\n MutableRNEnvironmentAdapter,\n DeviceInfo,\n} from '../adapters/environment';\nimport type { StorageAdapter } from '../adapters/storage';\n\nexport type { StorageAdapter } from '../adapters/storage';\nexport type Platform = 'browser' | 'react-native' | 'node' | 'unknown';\n\n/** The currently installed environment. Set by platform entry points. */\nlet currentEnv: EnvironmentAdapter | null = null;\n\n/** Install the environment adapter. Called exactly once per platform entry. */\nexport function setEnvironment(env: EnvironmentAdapter): void {\n currentEnv = env;\n}\n\nexport function getEnvironment(): EnvironmentAdapter | null {\n return currentEnv;\n}\n\n/**\n * Auto-detect platform WITHOUT touching DOM/process globals at module load.\n * Only runs when called.\n */\nexport function detectPlatform(): Platform {\n if (currentEnv) return currentEnv.platform;\n const g = globalThis as {\n navigator?: { product?: string };\n process?: { versions?: { node?: string } };\n window?: unknown;\n document?: unknown;\n };\n if (g.navigator && g.navigator.product === 'ReactNative') return 'react-native';\n if (g.process && g.process.versions && g.process.versions.node) return 'node';\n if (g.window && g.document) return 'browser';\n return 'unknown';\n}\n\nexport function isBrowser(): boolean {\n return detectPlatform() === 'browser';\n}\n\nexport function isReactNative(): boolean {\n return detectPlatform() === 'react-native';\n}\n\nexport function isNode(): boolean {\n return detectPlatform() === 'node';\n}\n\n// Back-compat alias for what used to be a module-const.\nexport const currentPlatform: Platform = 'unknown';\n\n/**\n * Device info structure (back-compat name).\n */\nexport type DeviceInfoResult = DeviceInfo;\n\n/**\n * Get device info from the installed environment adapter.\n */\nexport function getDeviceInfo(): DeviceInfoResult {\n if (currentEnv) return currentEnv.getDeviceInfo();\n return { platform: detectPlatform() === 'unknown' ? 'browser' : (detectPlatform() as DeviceInfo['platform']) };\n}\n\n// --- RN-specific injection hooks (back-compat shims) ---\n\nlet legacyNativeDeviceId: string | null = null;\n\n/** Narrow the env to MutableRNEnvironmentAdapter if we're on RN. */\nfunction asMutableRN(): MutableRNEnvironmentAdapter | null {\n if (currentEnv && currentEnv.platform === 'react-native') {\n return currentEnv as MutableRNEnvironmentAdapter;\n }\n return null;\n}\n\nexport function setRNDeviceInfo(info: DeviceInfoResult): void {\n const rn = asMutableRN();\n if (rn) rn._setDeviceInfo(info);\n}\n\n/** Set the current-screen getter on the RN env (React Navigation ref, etc.). */\nexport function setRNGetCurrentScreen(\n fn: (() => string | undefined) | undefined\n): void {\n const rn = asMutableRN();\n if (rn) rn._setGetCurrentScreen(fn);\n}\n\nexport function setNativeDeviceId(id: string): void {\n legacyNativeDeviceId = id;\n}\n\nexport function getNativeDeviceId(): string | null {\n return legacyNativeDeviceId;\n}\n\n/**\n * Get the storage adapter from the installed environment.\n * Returns null if running before env install, or on a platform with no storage.\n */\nexport function getStorageAdapter(): StorageAdapter | null {\n return currentEnv ? currentEnv.storage : null;\n}\n\n/**\n * Platform-agnostic fetch — simply delegates to the global fetch which is\n * guaranteed to exist on all three platforms (Node 18+, RN, browser).\n */\nexport async function platformFetch(\n url: string,\n options: RequestInit\n): Promise<Response> {\n if (typeof fetch !== 'undefined') {\n return fetch(url, options);\n }\n throw new Error('No fetch implementation available');\n}\n\n/** Current URL / route name from the installed environment. */\nexport function getCurrentUrl(): string | null {\n if (!currentEnv) return null;\n return currentEnv.getCurrentUrl() ?? null;\n}\n\n/** Referrer from the installed environment. */\nexport function getReferrer(): string | null {\n if (!currentEnv) return null;\n return currentEnv.getReferrer() ?? null;\n}\n","/**\n * Anonymous ID Management\n * Generates and persists a unique ID for consistent flag evaluation\n */\n\nconst STORAGE_KEY = 'sitepong_anonymous_id';\n\n/**\n * Generate a UUID v4\n */\nfunction generateUUID(): string {\n // Use crypto.randomUUID if available (modern browsers and Node.js 19+)\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\n return crypto.randomUUID();\n }\n\n // Fallback UUID v4 generation\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\n/**\n * Get or create an anonymous ID\n * ID is persisted in localStorage (browser) or memory (Node.js)\n */\nlet memoryId: string | null = null;\n\nexport function getAnonymousId(): string {\n // Browser environment with localStorage\n if (typeof window !== 'undefined' && typeof localStorage !== 'undefined') {\n try {\n let id = localStorage.getItem(STORAGE_KEY);\n if (!id) {\n id = generateUUID();\n localStorage.setItem(STORAGE_KEY, id);\n }\n return id;\n } catch {\n // localStorage might be disabled or quota exceeded\n if (!memoryId) {\n memoryId = generateUUID();\n }\n return memoryId;\n }\n }\n\n // Node.js or environments without localStorage\n if (!memoryId) {\n memoryId = generateUUID();\n }\n return memoryId;\n}\n\n/**\n * Clear the anonymous ID\n * Useful for testing or when user wants to reset their identity\n */\nexport function clearAnonymousId(): void {\n if (typeof window !== 'undefined' && typeof localStorage !== 'undefined') {\n try {\n localStorage.removeItem(STORAGE_KEY);\n } catch {\n // Ignore errors\n }\n }\n memoryId = null;\n}\n\n/**\n * Set a custom anonymous ID\n * Useful when you want to use your own user identifier\n */\nexport function setAnonymousId(id: string): void {\n if (typeof window !== 'undefined' && typeof localStorage !== 'undefined') {\n try {\n localStorage.setItem(STORAGE_KEY, id);\n } catch {\n memoryId = id;\n }\n } else {\n memoryId = id;\n }\n}\n","/**\n * Context Detection\n * Detects device type, browser, and OS from user agent\n */\n\nimport type { DeviceType, BrowserType, OSType, FlagEvaluationContext } from '../types';\nimport { getAnonymousId } from './anonymous-id';\nimport { getEnvironment } from '../utils/platform';\n\n/**\n * Detect device type from user agent\n */\nexport function detectDeviceType(userAgent: string): DeviceType {\n const ua = userAgent.toLowerCase();\n\n // Check for tablets first (before mobile, as some tablets have \"mobile\" in UA)\n if (\n /ipad/.test(ua) ||\n (/android/.test(ua) && !/mobile/.test(ua)) ||\n /tablet/.test(ua)\n ) {\n return 'tablet';\n }\n\n // Check for mobile devices\n if (\n /mobile/.test(ua) ||\n /iphone/.test(ua) ||\n /ipod/.test(ua) ||\n /android/.test(ua) ||\n /blackberry/.test(ua) ||\n /windows phone/.test(ua)\n ) {\n return 'mobile';\n }\n\n // Default to desktop\n return 'desktop';\n}\n\n/**\n * Detect browser from user agent\n */\nexport function detectBrowser(userAgent: string): BrowserType {\n const ua = userAgent.toLowerCase();\n\n // Order matters - check more specific browsers first\n if (/edg/.test(ua)) return 'edge';\n if (/opr|opera/.test(ua)) return 'opera';\n if (/samsungbrowser/.test(ua)) return 'samsung';\n if (/chrome|chromium|crios/.test(ua)) return 'chrome';\n if (/safari/.test(ua) && !/chrome/.test(ua)) return 'safari';\n if (/firefox|fxios/.test(ua)) return 'firefox';\n if (/msie|trident/.test(ua)) return 'ie';\n\n return 'other';\n}\n\n/**\n * Detect OS from user agent\n */\nexport function detectOS(userAgent: string): OSType {\n const ua = userAgent.toLowerCase();\n\n if (/iphone|ipad|ipod/.test(ua)) return 'ios';\n if (/android/.test(ua)) return 'android';\n if (/mac os|macos|macintosh/.test(ua)) return 'macos';\n if (/windows/.test(ua)) return 'windows';\n if (/linux/.test(ua)) return 'linux';\n\n return 'other';\n}\n\n/**\n * Get full evaluation context\n */\nexport function getEvaluationContext(): FlagEvaluationContext {\n const userAgent = getEnvironment()?.getUserAgent() ?? '';\n\n return {\n anonymous_id: getAnonymousId(),\n device_type: userAgent ? detectDeviceType(userAgent) : undefined,\n browser: userAgent ? detectBrowser(userAgent) : undefined,\n os: userAgent ? detectOS(userAgent) : undefined,\n user_agent: userAgent || undefined,\n timestamp: new Date(),\n };\n}\n\n/**\n * Create context with custom overrides\n */\nexport function createContext(\n overrides?: Partial<FlagEvaluationContext>\n): FlagEvaluationContext {\n const baseContext = getEvaluationContext();\n return {\n ...baseContext,\n ...overrides,\n };\n}\n","/**\n * Flag Evaluator\n * Evaluates flag rules using AND logic\n */\n\nimport type {\n FlagDefinition,\n FlagEvaluationContext,\n FlagRuleType,\n PercentageRolloutConfig,\n UserbasePercentageConfig,\n TimeBasedConfig,\n DeviceTypeConfig,\n BrowserConfig,\n OSConfig,\n} from '../types';\n\n/**\n * DJB2 hash function for consistent percentage-based evaluation\n */\nfunction djb2Hash(str: string): number {\n let hash = 5381;\n for (let i = 0; i < str.length; i++) {\n hash = ((hash << 5) + hash) ^ str.charCodeAt(i);\n }\n return hash >>> 0; // Convert to unsigned 32-bit integer\n}\n\n/**\n * Evaluate a percentage rollout rule\n * Random evaluation based on percentage\n */\nfunction evaluatePercentageRollout(config: PercentageRolloutConfig): boolean {\n return Math.random() * 100 < config.percentage;\n}\n\n/**\n * Evaluate a userbase percentage rule\n * Consistent evaluation based on anonymous_id + flag_key\n */\nfunction evaluateUserbasePercentage(\n config: UserbasePercentageConfig,\n context: FlagEvaluationContext,\n flagKey: string\n): boolean {\n const hashInput = `${context.anonymous_id}:${flagKey}`;\n const hash = djb2Hash(hashInput);\n const bucket = hash % 100;\n return bucket < config.percentage;\n}\n\n/**\n * Parse time string (HH:mm) to minutes since midnight\n */\nfunction parseTime(timeStr: string): number {\n const [hours, minutes] = timeStr.split(':').map(Number);\n return hours * 60 + minutes;\n}\n\n/**\n * Evaluate a time-based rule\n */\nfunction evaluateTimeBased(\n config: TimeBasedConfig,\n context: FlagEvaluationContext\n): boolean {\n const now = context.timestamp || new Date();\n\n // Get current time in the specified timezone\n const formatter = new Intl.DateTimeFormat('en-US', {\n timeZone: config.timezone,\n weekday: 'short',\n hour: '2-digit',\n minute: '2-digit',\n hour12: false,\n });\n\n const parts = formatter.formatToParts(now);\n const dayOfWeek = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'].indexOf(\n parts.find((p) => p.type === 'weekday')?.value || ''\n );\n const hour = parseInt(parts.find((p) => p.type === 'hour')?.value || '0', 10);\n const minute = parseInt(parts.find((p) => p.type === 'minute')?.value || '0', 10);\n const currentMinutes = hour * 60 + minute;\n\n // Check day of week\n if (config.days_of_week && config.days_of_week.length > 0) {\n if (!config.days_of_week.includes(dayOfWeek)) {\n return false;\n }\n }\n\n // Check time range\n if (config.start_time && config.end_time) {\n const startMinutes = parseTime(config.start_time);\n const endMinutes = parseTime(config.end_time);\n\n // Handle overnight ranges (e.g., 22:00 - 06:00)\n if (startMinutes > endMinutes) {\n // Overnight range\n if (currentMinutes < startMinutes && currentMinutes >= endMinutes) {\n return false;\n }\n } else {\n // Normal range\n if (currentMinutes < startMinutes || currentMinutes >= endMinutes) {\n return false;\n }\n }\n } else if (config.start_time) {\n const startMinutes = parseTime(config.start_time);\n if (currentMinutes < startMinutes) {\n return false;\n }\n } else if (config.end_time) {\n const endMinutes = parseTime(config.end_time);\n if (currentMinutes >= endMinutes) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Evaluate a device type rule\n */\nfunction evaluateDeviceType(\n config: DeviceTypeConfig,\n context: FlagEvaluationContext\n): boolean {\n if (!context.device_type) {\n return false;\n }\n return config.types.includes(context.device_type);\n}\n\n/**\n * Evaluate a browser rule\n */\nfunction evaluateBrowser(\n config: BrowserConfig,\n context: FlagEvaluationContext\n): boolean {\n if (!context.browser) {\n return false;\n }\n return config.browsers.includes(context.browser);\n}\n\n/**\n * Evaluate an OS rule\n */\nfunction evaluateOS(\n config: OSConfig,\n context: FlagEvaluationContext\n): boolean {\n if (!context.os) {\n return false;\n }\n return config.operating_systems.includes(context.os);\n}\n\n/**\n * Evaluate a single rule\n */\nfunction evaluateRule(\n ruleType: FlagRuleType,\n config: unknown,\n context: FlagEvaluationContext,\n flagKey: string\n): boolean {\n switch (ruleType) {\n case 'percentage_rollout':\n return evaluatePercentageRollout(config as PercentageRolloutConfig);\n\n case 'userbase_percentage':\n return evaluateUserbasePercentage(\n config as UserbasePercentageConfig,\n context,\n flagKey\n );\n\n case 'time_based':\n return evaluateTimeBased(config as TimeBasedConfig, context);\n\n case 'device_type':\n return evaluateDeviceType(config as DeviceTypeConfig, context);\n\n case 'browser':\n return evaluateBrowser(config as BrowserConfig, context);\n\n case 'os':\n return evaluateOS(config as OSConfig, context);\n\n default:\n // Unknown rule type - fail closed\n return false;\n }\n}\n\n/**\n * Evaluate a flag definition against context\n */\nexport function evaluateFlag(\n flag: FlagDefinition,\n context: FlagEvaluationContext\n): boolean {\n // 1. Check override first\n if (flag.override === 'force_on') {\n return true;\n }\n if (flag.override === 'force_off') {\n return false;\n }\n\n // 2. Check if enabled\n if (!flag.enabled) {\n return false;\n }\n\n // 3. If no rules, flag is enabled\n if (!flag.rules || flag.rules.length === 0) {\n return true;\n }\n\n // 4. Evaluate all rules with AND logic\n for (const rule of flag.rules) {\n const result = evaluateRule(rule.rule_type, rule.config, context, flag.key);\n if (!result) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Evaluate a multivariate flag and return the variant key\n * Uses consistent hashing based on anonymous_id + flag_key\n */\nexport function evaluateVariant(\n flag: FlagDefinition,\n context: FlagEvaluationContext\n): string | null {\n // Check basic eligibility first\n if (!evaluateFlag(flag, context)) {\n return null;\n }\n\n // If not multivariate or no variants, return null (treated as boolean)\n if (flag.flag_type !== 'multivariate' || !flag.variants || flag.variants.length === 0) {\n return null;\n }\n\n // Use consistent hashing to assign variant\n const hashInput = `${context.anonymous_id}:${flag.key}:variant`;\n const hash = djb2Hash(hashInput);\n const totalWeight = flag.variants.reduce((sum, v) => sum + v.weight, 0);\n const bucket = hash % totalWeight;\n\n let cumulative = 0;\n for (const variant of flag.variants) {\n cumulative += variant.weight;\n if (bucket < cumulative) {\n return variant.key;\n }\n }\n\n // Fallback to first variant\n return flag.variants[0].key;\n}\n\n/**\n * Get payload for a specific variant\n */\nexport function getVariantPayload(\n flag: FlagDefinition,\n variantKey: string\n): unknown | null {\n if (flag.variant_payloads && flag.variant_payloads[variantKey] !== undefined) {\n return flag.variant_payloads[variantKey];\n }\n\n // Check variant-level payload\n const variant = flag.variants?.find(v => v.key === variantKey);\n return variant?.payload || null;\n}\n\n/**\n * Evaluate multiple flags\n */\nexport function evaluateFlags(\n flags: FlagDefinition[],\n context: FlagEvaluationContext\n): Map<string, boolean> {\n const results = new Map<string, boolean>();\n for (const flag of flags) {\n results.set(flag.key, evaluateFlag(flag, context));\n }\n return results;\n}\n","/**\n * Flag Manager\n * Manages flag fetching, caching, and evaluation\n */\n\nimport type { FlagDefinition, SDKFlagsResponse, FlagEvaluationContext } from '../types';\nimport { getEvaluationContext } from './context';\nimport { evaluateFlag, evaluateVariant, getVariantPayload } from './evaluator';\n\nexport interface FlagManagerConfig {\n apiKey: string;\n endpoint?: string;\n debug?: boolean;\n}\n\nconst DEFAULT_ENDPOINT = 'https://api.sitepong.com';\n\nexport class FlagManager {\n private config: FlagManagerConfig;\n private flags: Map<string, FlagDefinition> = new Map();\n private evaluatedFlags: Map<string, boolean> = new Map();\n private evaluatedVariants: Map<string, string | null> = new Map();\n private context: FlagEvaluationContext | null = null;\n private initialized = false;\n private initPromise: Promise<void> | null = null;\n\n constructor(config: FlagManagerConfig) {\n this.config = {\n endpoint: DEFAULT_ENDPOINT,\n debug: false,\n ...config,\n };\n }\n\n /**\n * Initialize the flag manager by fetching flags\n * Flags are evaluated once on init and cached\n */\n async init(): Promise<void> {\n // If already initialized, return immediately\n if (this.initialized) {\n return;\n }\n\n // If initialization is in progress, wait for it\n if (this.initPromise) {\n return this.initPromise;\n }\n\n // Start initialization\n this.initPromise = this.fetchAndEvaluateFlags();\n\n try {\n await this.initPromise;\n this.initialized = true;\n } catch (err) {\n this.log('Failed to initialize flags:', err);\n // Even on error, mark as initialized to prevent retries\n this.initialized = true;\n } finally {\n this.initPromise = null;\n }\n }\n\n /**\n * Fetch flags from the API and evaluate them\n */\n private async fetchAndEvaluateFlags(): Promise<void> {\n try {\n const response = await fetch(`${this.config.endpoint}/api/sdk/flags`, {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n 'X-API-Key': this.config.apiKey,\n },\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n const data: SDKFlagsResponse = await response.json();\n this.log('Fetched flags:', data.flags.length);\n\n // Get evaluation context once\n this.context = getEvaluationContext();\n this.log('Evaluation context:', this.context);\n\n // Store flags and evaluate them\n this.flags.clear();\n this.evaluatedFlags.clear();\n this.evaluatedVariants.clear();\n\n for (const flag of data.flags) {\n this.flags.set(flag.key, flag);\n const result = evaluateFlag(flag, this.context);\n this.evaluatedFlags.set(flag.key, result);\n\n // Evaluate variant for multivariate flags\n if (flag.flag_type === 'multivariate' && flag.variants) {\n const variant = evaluateVariant(flag, this.context);\n this.evaluatedVariants.set(flag.key, variant);\n this.log(`Flag \"${flag.key}\": ${result}, variant: ${variant}`);\n } else {\n this.log(`Flag \"${flag.key}\": ${result}`);\n }\n }\n } catch (err) {\n this.log('Error fetching flags:', err);\n throw err;\n }\n }\n\n /**\n * Get a flag value\n * Returns the cached evaluated result or default value\n */\n getFlag(key: string, defaultValue = false): boolean {\n if (!this.initialized) {\n this.log(`Flag \"${key}\" requested before init, returning default:`, defaultValue);\n return defaultValue;\n }\n\n const value = this.evaluatedFlags.get(key);\n if (value === undefined) {\n this.log(`Flag \"${key}\" not found, returning default:`, defaultValue);\n return defaultValue;\n }\n\n return value;\n }\n\n /**\n * Get a multivariate flag variant\n * Returns the assigned variant key or the default value\n */\n getVariant(key: string, defaultValue: string | null = null): string | null {\n if (!this.initialized) {\n this.log(`Variant \"${key}\" requested before init, returning default:`, defaultValue);\n return defaultValue;\n }\n\n const variant = this.evaluatedVariants.get(key);\n if (variant === undefined) {\n this.log(`Variant \"${key}\" not found, returning default:`, defaultValue);\n return defaultValue;\n }\n\n return variant;\n }\n\n /**\n * Get the payload for a multivariate flag's assigned variant\n */\n getVariantPayload<T = unknown>(key: string, defaultValue: T | null = null): T | null {\n const variant = this.getVariant(key);\n if (!variant) return defaultValue;\n\n const flag = this.flags.get(key);\n if (!flag) return defaultValue;\n\n const payload = getVariantPayload(flag, variant);\n return (payload as T) ?? defaultValue;\n }\n\n /**\n * Get all flag values\n */\n getAllFlags(): Record<string, boolean> {\n const result: Record<string, boolean> = {};\n for (const [key, value] of this.evaluatedFlags) {\n result[key] = value;\n }\n return result;\n }\n\n /**\n * Check if a flag exists\n */\n hasFlag(key: string): boolean {\n return this.flags.has(key);\n }\n\n /**\n * Check if flags are initialized\n */\n isInitialized(): boolean {\n return this.initialized;\n }\n\n /**\n * Wait for initialization to complete\n */\n async waitForInit(): Promise<void> {\n if (this.initialized) {\n return;\n }\n await this.init();\n }\n\n /**\n * Force re-fetch and re-evaluate flags\n * Call this if you need to refresh flags (e.g., on explicit user action)\n */\n async refresh(): Promise<void> {\n this.initialized = false;\n await this.init();\n }\n\n /**\n * Get the current evaluation context\n */\n getContext(): FlagEvaluationContext | null {\n return this.context;\n }\n\n private log(...args: unknown[]): void {\n if (this.config.debug) {\n console.log('[SitePong Flags]', ...args);\n }\n }\n}\n\n// Singleton instance for convenience\nlet defaultManager: FlagManager | null = null;\n\nexport function initFlagManager(config: FlagManagerConfig): FlagManager {\n defaultManager = new FlagManager(config);\n return defaultManager;\n}\n\nexport function getFlagManager(): FlagManager | null {\n return defaultManager;\n}\n","/**\n * Session Management\n * Manages session IDs with sessionStorage and 30-min inactivity timeout\n */\n\nconst SESSION_KEY = 'sitepong_session_id';\nconst SESSION_TIMESTAMP_KEY = 'sitepong_session_ts';\nconst SESSION_TIMEOUT_MS = 30 * 60 * 1000; // 30 minutes\n\nlet memorySessionId: string | null = null;\nlet memorySessionTs: number | null = null;\n\nfunction generateSessionId(): string {\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\n return crypto.randomUUID();\n }\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\nfunction isSessionExpired(lastActivity: number): boolean {\n return Date.now() - lastActivity > SESSION_TIMEOUT_MS;\n}\n\nexport function getSessionId(): string {\n if (typeof window !== 'undefined' && typeof sessionStorage !== 'undefined') {\n try {\n const existingId = sessionStorage.getItem(SESSION_KEY);\n const lastTs = sessionStorage.getItem(SESSION_TIMESTAMP_KEY);\n\n if (existingId && lastTs && !isSessionExpired(parseInt(lastTs, 10))) {\n // Update timestamp on activity\n sessionStorage.setItem(SESSION_TIMESTAMP_KEY, String(Date.now()));\n return existingId;\n }\n\n // Create new session\n const newId = generateSessionId();\n sessionStorage.setItem(SESSION_KEY, newId);\n sessionStorage.setItem(SESSION_TIMESTAMP_KEY, String(Date.now()));\n return newId;\n } catch {\n // sessionStorage might be disabled\n return getMemorySession();\n }\n }\n\n return getMemorySession();\n}\n\nfunction getMemorySession(): string {\n if (memorySessionId && memorySessionTs && !isSessionExpired(memorySessionTs)) {\n memorySessionTs = Date.now();\n return memorySessionId;\n }\n\n memorySessionId = generateSessionId();\n memorySessionTs = Date.now();\n return memorySessionId;\n}\n\nexport function clearSession(): void {\n if (typeof window !== 'undefined' && typeof sessionStorage !== 'undefined') {\n try {\n sessionStorage.removeItem(SESSION_KEY);\n sessionStorage.removeItem(SESSION_TIMESTAMP_KEY);\n } catch {\n // Ignore errors\n }\n }\n memorySessionId = null;\n memorySessionTs = null;\n}\n","/**\n * Autocapture Module\n * Automatically captures click events, form submissions, and page views\n * without requiring manual instrumentation.\n */\n\nexport interface AutocaptureConfig {\n /** Enable autocapture of click events */\n clicks: boolean;\n /** Enable autocapture of form submissions */\n forms: boolean;\n /** Enable autocapture of page views (SPA-aware) */\n pageviews: boolean;\n /** CSS selectors to exclude from autocapture */\n blockSelectors?: string[];\n /** Only capture clicks on elements matching these selectors (if set) */\n allowSelectors?: string[];\n /** Maximum text content length to capture */\n maxTextLength?: number;\n /** Debug logging */\n debug?: boolean;\n}\n\nexport interface AutocaptureEvent {\n type: 'click' | 'form_submit' | 'page_view';\n timestamp: string;\n properties: Record<string, unknown>;\n}\n\ntype EventCallback = (event: AutocaptureEvent) => void;\n\nconst DEFAULT_BLOCK_SELECTORS = [\n '[data-sp-no-capture]',\n '.sp-no-capture',\n];\n\nconst MAX_TEXT_LENGTH = 255;\n\nexport class AutocaptureModule {\n private config: AutocaptureConfig;\n private callback: EventCallback;\n private clickHandler: ((e: MouseEvent) => void) | null = null;\n private submitHandler: ((e: SubmitEvent) => void) | null = null;\n private active = false;\n\n constructor(config: Partial<AutocaptureConfig>, callback: EventCallback) {\n this.config = {\n clicks: true,\n forms: true,\n pageviews: true,\n blockSelectors: DEFAULT_BLOCK_SELECTORS,\n maxTextLength: MAX_TEXT_LENGTH,\n debug: false,\n ...config,\n };\n this.callback = callback;\n }\n\n start(): void {\n if (this.active || typeof document === 'undefined' || typeof document.addEventListener !== 'function') return;\n this.active = true;\n\n if (this.config.clicks) {\n this.setupClickCapture();\n }\n\n if (this.config.forms) {\n this.setupFormCapture();\n }\n\n this.log('Autocapture started');\n }\n\n stop(): void {\n if (!this.active) return;\n this.active = false;\n\n if (this.clickHandler) {\n document.removeEventListener('click', this.clickHandler, true);\n this.clickHandler = null;\n }\n\n if (this.submitHandler) {\n document.removeEventListener('submit', this.submitHandler, true);\n this.submitHandler = null;\n }\n\n this.log('Autocapture stopped');\n }\n\n private setupClickCapture(): void {\n this.clickHandler = (e: MouseEvent) => {\n const target = e.target as HTMLElement;\n if (!target || !this.shouldCapture(target)) return;\n\n const properties = this.getElementProperties(target);\n properties.$event_type = 'click';\n properties.$x = e.clientX;\n properties.$y = e.clientY;\n\n this.callback({\n type: 'click',\n timestamp: new Date().toISOString(),\n properties,\n });\n };\n\n document.addEventListener('click', this.clickHandler, true);\n }\n\n private setupFormCapture(): void {\n this.submitHandler = (e: SubmitEvent) => {\n const form = e.target as HTMLFormElement;\n if (!form || !this.shouldCapture(form)) return;\n\n const properties: Record<string, unknown> = {\n $event_type: 'form_submit',\n $form_action: form.action || undefined,\n $form_method: form.method || 'get',\n $form_name: form.name || form.id || undefined,\n $field_names: this.getFormFieldNames(form),\n $field_count: form.elements.length,\n };\n\n // Add element properties\n const elemProps = this.getElementProperties(form);\n Object.assign(properties, elemProps);\n\n this.callback({\n type: 'form_submit',\n timestamp: new Date().toISOString(),\n properties,\n });\n };\n\n document.addEventListener('submit', this.submitHandler, true);\n }\n\n private shouldCapture(element: HTMLElement): boolean {\n // Check block selectors\n const blockSelectors = this.config.blockSelectors || DEFAULT_BLOCK_SELECTORS;\n for (const selector of blockSelectors) {\n if (element.matches(selector) || element.closest(selector)) {\n return false;\n }\n }\n\n // Check allow selectors (if specified, element must match)\n if (this.config.allowSelectors && this.config.allowSelectors.length > 0) {\n const matches = this.config.allowSelectors.some(\n (sel) => element.matches(sel) || element.closest(sel) !== null\n );\n if (!matches) return false;\n }\n\n // Skip invisible elements\n if (element.offsetParent === null && element.tagName !== 'BODY') {\n return false;\n }\n\n return true;\n }\n\n private getElementProperties(element: HTMLElement): Record<string, unknown> {\n const properties: Record<string, unknown> = {};\n\n // Tag info\n properties.$tag_name = element.tagName.toLowerCase();\n properties.$el_id = element.id || undefined;\n\n // Classes (limit to first 5)\n if (element.classList.length > 0) {\n properties.$el_classes = Array.from(element.classList).slice(0, 5);\n }\n\n // Text content (truncated)\n const text = this.getElementText(element);\n if (text) {\n properties.$el_text = text;\n }\n\n // Href for links\n if (element instanceof HTMLAnchorElement) {\n properties.$href = element.href || undefined;\n properties.$target = element.target || undefined;\n }\n\n // Type for inputs/buttons\n if (element instanceof HTMLInputElement || element instanceof HTMLButtonElement) {\n properties.$el_type = element.type || undefined;\n properties.$el_name = element.name || undefined;\n }\n\n // ARIA attributes\n const ariaLabel = element.getAttribute('aria-label');\n if (ariaLabel) {\n properties.$aria_label = this.truncate(ariaLabel);\n }\n\n // Role\n const role = element.getAttribute('role');\n if (role) {\n properties.$el_role = role;\n }\n\n // CSS selector path (simplified)\n properties.$selector = this.getSelector(element);\n\n // Page context\n if (typeof window !== 'undefined' && window.location) {\n properties.$current_url = window.location.href;\n properties.$pathname = window.location.pathname;\n }\n\n return properties;\n }\n\n private getElementText(element: HTMLElement): string | undefined {\n // Don't capture text from inputs (could be sensitive)\n if (element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement) {\n return undefined;\n }\n\n // For buttons and links, get direct text\n let text = '';\n if (element instanceof HTMLButtonElement || element instanceof HTMLAnchorElement) {\n text = element.innerText || element.textContent || '';\n } else {\n // Get direct text content (not from children)\n for (const node of Array.from(element.childNodes)) {\n if (node.nodeType === Node.TEXT_NODE) {\n text += node.textContent || '';\n }\n }\n }\n\n text = text.trim().replace(/\\s+/g, ' ');\n return text ? this.truncate(text) : undefined;\n }\n\n private getFormFieldNames(form: HTMLFormElement): string[] {\n const names: string[] = [];\n for (const element of Array.from(form.elements)) {\n const input = element as HTMLInputElement;\n if (input.name && input.type !== 'password' && input.type !== 'hidden') {\n names.push(input.name);\n }\n }\n return names.slice(0, 20); // Limit to 20 field names\n }\n\n private getSelector(element: HTMLElement): string {\n const parts: string[] = [];\n let current: HTMLElement | null = element;\n let depth = 0;\n\n while (current && current !== document.body && depth < 5) {\n let selector = current.tagName.toLowerCase();\n\n if (current.id) {\n selector = `#${current.id}`;\n parts.unshift(selector);\n break;\n }\n\n if (current.classList.length > 0) {\n selector += `.${Array.from(current.classList).slice(0, 2).join('.')}`;\n }\n\n // Add nth-child for disambiguation\n const parent = current.parentElement;\n if (parent) {\n const siblings = Array.from(parent.children).filter(\n (c) => c.tagName === current!.tagName\n );\n if (siblings.length > 1) {\n const index = siblings.indexOf(current) + 1;\n selector += `:nth-of-type(${index})`;\n }\n }\n\n parts.unshift(selector);\n current = current.parentElement;\n depth++;\n }\n\n return parts.join(' > ');\n }\n\n private truncate(text: string): string {\n const max = this.config.maxTextLength || MAX_TEXT_LENGTH;\n return text.length > max ? text.slice(0, max) + '...' : text;\n }\n\n private log(...args: unknown[]): void {\n if (this.config.debug) {\n console.log('[SitePong Autocapture]', ...args);\n }\n }\n}\n","/**\n * Analytics Manager\n * Manages event queue, batch flushing, identify/group state, and SPA page view tracking\n */\n\nimport type { AnalyticsConfig, AnalyticsEvent, TrackProperties, UserTraits, GroupTraits } from './types';\nimport { getSessionId, clearSession } from './session';\nimport { getAnonymousId } from '../flags/anonymous-id';\nimport { AutocaptureModule } from './autocapture';\nimport { isReactNative, getNativeDeviceId } from '../utils/platform';\n\nconst DEFAULT_ENDPOINT = 'https://ingest.sitepong.com';\nconst DEFAULT_BATCH_SIZE = 20;\nconst DEFAULT_FLUSH_INTERVAL = 10000;\nconst MAX_FLUSH_FAILURES = 3;\n\nexport class AnalyticsManager {\n private config: Required<Omit<AnalyticsConfig, 'apiKey' | 'eventsEndpoint' | 'autocaptureClicks' | 'autocaptureForms' | 'autocapture'>> & {\n apiKey: string;\n eventsEndpoint?: string;\n autocaptureClicks?: boolean;\n autocaptureForms?: boolean;\n autocapture?: AnalyticsConfig['autocapture'];\n };\n private eventQueue: AnalyticsEvent[] = [];\n private flushTimer: ReturnType<typeof setInterval> | null = null;\n private flushFailures = 0;\n private disabled = false;\n private userId: string | null = null;\n private groupId: string | null = null;\n private userTraits: UserTraits | null = null;\n private groupTraits: GroupTraits | null = null;\n private lastUrl: string | null = null;\n private popstateHandler: (() => void) | null = null;\n private autocaptureModule: AutocaptureModule | null = null;\n\n constructor(config: AnalyticsConfig) {\n this.config = {\n endpoint: DEFAULT_ENDPOINT,\n enabled: true,\n autocapturePageviews: false,\n maxBatchSize: DEFAULT_BATCH_SIZE,\n flushInterval: DEFAULT_FLUSH_INTERVAL,\n debug: false,\n ...config,\n };\n }\n\n init(): void {\n if (!this.config.enabled) {\n return;\n }\n\n this.startFlushTimer();\n this.setupPageHideListener();\n\n if (this.config.autocapturePageviews) {\n this.setupSPATracking();\n }\n\n this.setupAutocapture();\n this.log('Analytics initialized');\n }\n\n /**\n * Headless init for React Native — starts only the flush timer.\n * No page-hide listener, SPA tracking, or DOM autocapture.\n */\n initHeadless(): void {\n if (!this.config.enabled) {\n return;\n }\n\n this.startFlushTimer();\n this.log('Analytics initialized (headless)');\n }\n\n private setupAutocapture(): void {\n const ac = this.config.autocapture;\n const clicksEnabled = this.config.autocaptureClicks;\n const formsEnabled = this.config.autocaptureForms;\n\n // Determine autocapture configuration\n let captureClicks = clicksEnabled || false;\n let captureForms = formsEnabled || false;\n let blockSelectors: string[] | undefined;\n let allowSelectors: string[] | undefined;\n\n if (ac === true) {\n captureClicks = true;\n captureForms = true;\n } else if (ac && typeof ac === 'object') {\n captureClicks = ac.clicks !== false;\n captureForms = ac.forms !== false;\n blockSelectors = ac.blockSelectors;\n allowSelectors = ac.allowSelectors;\n if (ac.pageviews !== false && !this.config.autocapturePageviews) {\n this.setupSPATracking();\n }\n }\n\n if (!captureClicks && !captureForms) return;\n\n this.autocaptureModule = new AutocaptureModule(\n {\n clicks: captureClicks,\n forms: captureForms,\n pageviews: false, // Handled by SPA tracking above\n blockSelectors,\n allowSelectors,\n debug: this.config.debug,\n },\n (event) => {\n // Convert autocapture event to analytics event\n const name = event.type === 'click'\n ? '$autocapture_click'\n : event.type === 'form_submit'\n ? '$autocapture_form_submit'\n : '$autocapture';\n\n this.track(name, event.properties);\n }\n );\n\n this.autocaptureModule.start();\n }\n\n track(eventName: string, properties?: TrackProperties): void {\n if (!this.config.enabled) return;\n\n const event = this.createEvent('track', { name: eventName, properties });\n this.enqueue(event);\n this.log('Track:', eventName, properties);\n }\n\n trackPageView(url?: string, properties?: TrackProperties): void {\n if (!this.config.enabled) return;\n\n const pageUrl = url || (typeof window !== 'undefined' && window.location ? window.location.href : undefined);\n const event = this.createEvent('page', {\n properties: {\n url: pageUrl,\n referrer: typeof document !== 'undefined' ? document.referrer : undefined,\n title: typeof document !== 'undefined' ? document.title : undefined,\n ...properties,\n },\n });\n this.enqueue(event);\n this.log('Page view:', pageUrl);\n }\n\n identify(userId: string, traits?: UserTraits): void {\n if (!this.config.enabled) return;\n\n this.userId = userId;\n if (traits) {\n this.userTraits = { ...this.userTraits, ...traits };\n }\n\n const event = this.createEvent('identify', { traits: this.userTraits || undefined });\n this.enqueue(event);\n this.log('Identify:', userId, traits);\n }\n\n group(groupId: string, traits?: GroupTraits): void {\n if (!this.config.enabled) return;\n\n this.groupId = groupId;\n if (traits) {\n this.groupTraits = { ...this.groupTraits, ...traits };\n }\n\n const event = this.createEvent('group', { traits: this.groupTraits || undefined });\n this.enqueue(event);\n this.log('Group:', groupId, traits);\n }\n\n reset(): void {\n this.userId = null;\n this.groupId = null;\n this.userTraits = null;\n this.groupTraits = null;\n clearSession();\n this.log('Analytics state reset');\n }\n\n async flush(): Promise<void> {\n if (this.eventQueue.length === 0) return;\n\n if (this.disabled) {\n this.eventQueue = [];\n return;\n }\n\n const events = [...this.eventQueue];\n this.eventQueue = [];\n\n const endpoint = this.config.eventsEndpoint || `${this.config.endpoint}/api/events`;\n\n try {\n const response = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-API-Key': this.config.apiKey,\n },\n body: JSON.stringify({ events }),\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}`);\n }\n\n this.flushFailures = 0;\n this.log(`Flushed ${events.length} events`);\n } catch (err) {\n this.flushFailures++;\n\n if (this.flushFailures >= MAX_FLUSH_FAILURES) {\n this.disabled = true;\n console.warn(\n `[SitePong Analytics] Disabled after ${MAX_FLUSH_FAILURES} consecutive failures. ` +\n `Check that ${endpoint} is accessible and has proper CORS headers.`\n );\n return;\n }\n\n this.eventQueue.unshift(...events);\n this.log(`Failed to flush events (attempt ${this.flushFailures}/${MAX_FLUSH_FAILURES}):`, err);\n }\n }\n\n destroy(): void {\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n this.flushTimer = null;\n }\n\n if (this.popstateHandler && typeof window !== 'undefined') {\n window.removeEventListener('popstate', this.popstateHandler);\n this.popstateHandler = null;\n }\n\n if (this.autocaptureModule) {\n this.autocaptureModule.stop();\n this.autocaptureModule = null;\n }\n\n // Final flush\n this.flushWithBeacon();\n }\n\n private createEvent(\n type: AnalyticsEvent['type'],\n options: { name?: string; properties?: TrackProperties; traits?: Record<string, unknown> }\n ): AnalyticsEvent {\n return {\n type,\n name: options.name,\n properties: options.properties,\n userId: this.userId || undefined,\n anonymousId: getAnonymousId(),\n deviceId: getNativeDeviceId() || undefined,\n groupId: this.groupId || undefined,\n traits: options.traits,\n sessionId: getSessionId(),\n timestamp: new Date().toISOString(),\n url: typeof window !== 'undefined' && window.location ? window.location.href : undefined,\n referrer: typeof document !== 'undefined' && typeof document.referrer === 'string' ? document.referrer : undefined,\n userAgent: typeof navigator !== 'undefined' ? navigator.userAgent : undefined,\n };\n }\n\n private enqueue(event: AnalyticsEvent): void {\n this.eventQueue.push(event);\n\n if (this.eventQueue.length >= this.config.maxBatchSize) {\n this.flush();\n }\n }\n\n private startFlushTimer(): void {\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n }\n\n this.flushTimer = setInterval(() => {\n this.flush();\n }, this.config.flushInterval);\n }\n\n private setupPageHideListener(): void {\n if (typeof window === 'undefined' || isReactNative() || typeof window.addEventListener !== 'function') return;\n\n window.addEventListener('visibilitychange', () => {\n if (document.visibilityState === 'hidden') {\n this.flushWithBeacon();\n }\n });\n }\n\n private flushWithBeacon(): void {\n if (this.eventQueue.length === 0 || isReactNative() || typeof navigator?.sendBeacon !== 'function') {\n return;\n }\n\n const events = [...this.eventQueue];\n this.eventQueue = [];\n\n const endpoint = this.config.eventsEndpoint || `${this.config.endpoint}/api/events`;\n const blob = new Blob(\n [JSON.stringify({ events, apiKey: this.config.apiKey })],\n { type: 'application/json' }\n );\n\n navigator.sendBeacon(endpoint, blob);\n this.log(`Flushed ${events.length} events via beacon`);\n }\n\n private setupSPATracking(): void {\n if (\n typeof window === 'undefined' ||\n isReactNative() ||\n !window.location ||\n typeof window.addEventListener !== 'function'\n ) return;\n\n this.lastUrl = window.location.href;\n\n // Track initial page view\n this.trackPageView();\n\n // Listen for popstate (back/forward navigation)\n this.popstateHandler = () => {\n if (!window.location) return;\n const currentUrl = window.location.href;\n if (currentUrl !== this.lastUrl) {\n this.lastUrl = currentUrl;\n this.trackPageView(currentUrl);\n }\n };\n window.addEventListener('popstate', this.popstateHandler);\n\n // Monkey-patch pushState and replaceState for SPA navigation\n const originalPushState = history.pushState.bind(history);\n const originalReplaceState = history.replaceState.bind(history);\n\n history.pushState = (...args: Parameters<typeof history.pushState>) => {\n originalPushState(...args);\n this.handleUrlChange();\n };\n\n history.replaceState = (...args: Parameters<typeof history.replaceState>) => {\n originalReplaceState(...args);\n this.handleUrlChange();\n };\n }\n\n private handleUrlChange(): void {\n if (typeof window === 'undefined' || !window.location) return;\n\n const currentUrl = window.location.href;\n if (currentUrl !== this.lastUrl) {\n this.lastUrl = currentUrl;\n this.trackPageView(currentUrl);\n }\n }\n\n private log(...args: unknown[]): void {\n if (this.config.debug) {\n console.log('[SitePong Analytics]', ...args);\n }\n }\n}\n","/**\n * Cron Job Monitoring SDK Module\n *\n * Usage:\n * import { cronMonitor } from '@sitepong/sdk';\n *\n * // Simple check-in\n * await cronMonitor.checkin('my-job-slug');\n *\n * // With duration tracking\n * const done = cronMonitor.start('my-job-slug');\n * try { await doWork(); done.ok(); }\n * catch (e) { done.error(e.message); }\n */\n\nexport interface CronCheckinOptions {\n status?: 'ok' | 'error' | 'in_progress';\n duration_ms?: number;\n message?: string;\n environment?: string;\n}\n\nexport interface CronHandle {\n ok: (message?: string) => Promise<void>;\n error: (message?: string) => Promise<void>;\n}\n\nexport class CronMonitorManager {\n private apiKey: string;\n private endpoint: string;\n private debug: boolean;\n\n constructor(config: { apiKey: string; endpoint: string; debug?: boolean }) {\n this.apiKey = config.apiKey;\n this.endpoint = config.endpoint;\n this.debug = config.debug || false;\n }\n\n /**\n * Send a check-in for a cron monitor\n */\n async checkin(slug: string, options: CronCheckinOptions = {}): Promise<void> {\n try {\n const response = await fetch(`${this.endpoint}/api/sdk/crons`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-API-Key': this.apiKey,\n },\n body: JSON.stringify({\n slug,\n status: options.status || 'ok',\n duration_ms: options.duration_ms,\n message: options.message,\n environment: options.environment,\n }),\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}`);\n }\n\n this.log(`Check-in sent for \"${slug}\" (${options.status || 'ok'})`);\n } catch (err) {\n this.log('Failed to send check-in:', err);\n }\n }\n\n /**\n * Start tracking a cron job execution.\n * Returns a handle with ok() and error() methods to complete the check-in.\n */\n start(slug: string, environment?: string): CronHandle {\n const startTime = Date.now();\n\n // Send in_progress check-in\n this.checkin(slug, { status: 'in_progress', environment });\n\n return {\n ok: async (message?: string) => {\n const duration_ms = Date.now() - startTime;\n await this.checkin(slug, { status: 'ok', duration_ms, message, environment });\n },\n error: async (message?: string) => {\n const duration_ms = Date.now() - startTime;\n await this.checkin(slug, { status: 'error', duration_ms, message, environment });\n },\n };\n }\n\n /**\n * Wrap an async function with automatic cron monitoring.\n * Sends 'in_progress' on start, 'ok' on success, 'error' on failure.\n */\n wrap<T>(slug: string, fn: () => Promise<T>, environment?: string): Promise<T> {\n const handle = this.start(slug, environment);\n return fn().then(\n async (result) => { await handle.ok(); return result; },\n async (err) => { await handle.error(err?.message || String(err)); throw err; }\n );\n }\n\n private log(...args: unknown[]): void {\n if (this.debug) {\n console.log('[SitePong:Cron]', ...args);\n }\n }\n}\n","/**\n * Custom Metrics SDK Module\n *\n * Usage:\n * import { metrics } from '@sitepong/sdk';\n *\n * // Counter\n * metrics.increment('api.requests', 1, { endpoint: '/users' });\n *\n * // Gauge\n * metrics.gauge('memory.usage', process.memoryUsage().heapUsed, { unit: 'bytes' });\n *\n * // Distribution (for percentile calculations)\n * metrics.distribution('api.latency', responseTime, { unit: 'ms' });\n *\n * // Histogram\n * metrics.histogram('request.size', bodySize, { unit: 'bytes' });\n */\n\nimport { getEnvironment } from './utils/platform';\n\nexport interface MetricOptions {\n tags?: Record<string, string>;\n unit?: string;\n timestamp?: string;\n}\n\ninterface QueuedMetric {\n name: string;\n value: number;\n type: string;\n unit?: string;\n tags?: Record<string, string>;\n timestamp: string;\n}\n\nexport class MetricsManager {\n private apiKey: string;\n private endpoint: string;\n private debug: boolean;\n private queue: QueuedMetric[] = [];\n private flushInterval: number;\n private flushTimer: ReturnType<typeof setTimeout> | null = null;\n private maxBatchSize: number;\n\n constructor(config: {\n apiKey: string;\n endpoint: string;\n debug?: boolean;\n flushInterval?: number;\n maxBatchSize?: number;\n }) {\n this.apiKey = config.apiKey;\n this.endpoint = config.endpoint;\n this.debug = config.debug || false;\n this.flushInterval = config.flushInterval || 10000;\n this.maxBatchSize = config.maxBatchSize || 100;\n this.startFlushTimer();\n }\n\n /**\n * Increment a counter metric\n */\n increment(name: string, value: number = 1, options?: MetricOptions): void {\n this.enqueue(name, value, 'counter', options);\n }\n\n /**\n * Decrement a counter metric\n */\n decrement(name: string, value: number = 1, options?: MetricOptions): void {\n this.enqueue(name, -value, 'counter', options);\n }\n\n /**\n * Set a gauge metric (instantaneous value)\n */\n gauge(name: string, value: number, options?: MetricOptions): void {\n this.enqueue(name, value, 'gauge', options);\n }\n\n /**\n * Record a histogram value (for aggregation server-side)\n */\n histogram(name: string, value: number, options?: MetricOptions): void {\n this.enqueue(name, value, 'histogram', options);\n }\n\n /**\n * Record a distribution value (for percentile calculations)\n */\n distribution(name: string, value: number, options?: MetricOptions): void {\n this.enqueue(name, value, 'distribution', options);\n }\n\n /**\n * Time a function execution and record as distribution\n */\n async time<T>(name: string, fn: () => Promise<T>, options?: MetricOptions): Promise<T> {\n const start = Date.now();\n try {\n const result = await fn();\n this.distribution(name, Date.now() - start, { ...options, unit: options?.unit || 'ms' });\n return result;\n } catch (err) {\n this.distribution(name, Date.now() - start, {\n ...options,\n unit: options?.unit || 'ms',\n tags: { ...options?.tags, error: 'true' },\n });\n throw err;\n }\n }\n\n /**\n * Create a timer that records on stop\n */\n startTimer(name: string, options?: MetricOptions): { stop: () => void } {\n const start = Date.now();\n return {\n stop: () => {\n this.distribution(name, Date.now() - start, { ...options, unit: options?.unit || 'ms' });\n },\n };\n }\n\n /**\n * Force flush all queued metrics\n */\n async flush(): Promise<void> {\n if (this.queue.length === 0) return;\n\n const metrics = [...this.queue];\n this.queue = [];\n\n try {\n const response = await fetch(`${this.endpoint}/api/sdk/metrics`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-API-Key': this.apiKey,\n },\n body: JSON.stringify({ metrics }),\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}`);\n }\n\n this.log(`Flushed ${metrics.length} metrics`);\n } catch (err) {\n // Re-queue on failure\n this.queue.unshift(...metrics);\n this.log('Failed to flush metrics:', err);\n }\n }\n\n /**\n * Stop the flush timer and flush remaining metrics\n */\n async destroy(): Promise<void> {\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n this.flushTimer = null;\n }\n await this.flush();\n }\n\n private enqueue(name: string, value: number, type: string, options?: MetricOptions): void {\n this.queue.push({\n name,\n value,\n type,\n unit: options?.unit,\n tags: options?.tags,\n timestamp: options?.timestamp || new Date().toISOString(),\n });\n\n if (this.queue.length >= this.maxBatchSize) {\n this.flush();\n }\n }\n\n private startFlushTimer(): void {\n this.flushTimer = setInterval(() => {\n this.flush();\n }, this.flushInterval);\n\n // Beacon-flush on visibility hidden if the platform supports it\n const env = getEnvironment();\n if (env) {\n env.onVisibilityHidden(() => this.flushWithBeacon());\n }\n }\n\n private flushWithBeacon(): void {\n if (this.queue.length === 0) return;\n const env = getEnvironment();\n if (!env || !env.sendBeacon) return;\n\n const metrics = [...this.queue];\n this.queue = [];\n\n const body = JSON.stringify({ metrics, apiKey: this.apiKey });\n const ok = env.sendBeacon(`${this.endpoint}/api/sdk/metrics`, body);\n if (ok) {\n this.log(`Flushed ${metrics.length} metrics via beacon`);\n } else {\n this.queue.unshift(...metrics);\n }\n }\n\n private log(...args: unknown[]): void {\n if (this.debug) {\n console.log('[SitePong:Metrics]', ...args);\n }\n }\n}\n","/**\n * Database Query Tracking SDK Module\n *\n * Usage (Node.js):\n * import { dbTracker } from '@sitepong/sdk';\n *\n * // Wrap a database query\n * const result = await dbTracker.track('SELECT * FROM users WHERE id = ?', async () => {\n * return await db.query('SELECT * FROM users WHERE id = ?', [userId]);\n * });\n *\n * // Integration with ORMs\n * dbTracker.patchKnex(knex); // Auto-tracks all Knex queries\n */\n\nexport interface DatabaseQueryEvent {\n query: string;\n duration_ms: number;\n timestamp: string;\n source?: string;\n rows_affected?: number;\n error?: string;\n is_slow?: boolean;\n}\n\nexport interface DatabaseTrackerConfig {\n apiKey: string;\n endpoint: string;\n debug?: boolean;\n slowQueryThreshold?: number; // ms, default 1000\n maxBatchSize?: number;\n flushInterval?: number;\n /** Redact query parameters for security */\n redactParams?: boolean;\n}\n\nexport class DatabaseTracker {\n private config: DatabaseTrackerConfig;\n private queue: DatabaseQueryEvent[] = [];\n private flushTimer: ReturnType<typeof setTimeout> | null = null;\n private queryCounter = 0;\n private nPlusOneDetector: Map<string, { count: number; since: number }> = new Map();\n\n constructor(config: DatabaseTrackerConfig) {\n this.config = {\n slowQueryThreshold: 1000,\n maxBatchSize: 50,\n flushInterval: 10000,\n redactParams: true,\n ...config,\n };\n this.startFlushTimer();\n }\n\n /**\n * Track a database query execution\n */\n async track<T>(query: string, fn: () => Promise<T>, source?: string): Promise<T> {\n const start = Date.now();\n this.queryCounter++;\n\n try {\n const result = await fn();\n const duration_ms = Date.now() - start;\n\n this.recordQuery({\n query: this.config.redactParams ? this.redactQuery(query) : query,\n duration_ms,\n timestamp: new Date().toISOString(),\n source,\n is_slow: duration_ms >= (this.config.slowQueryThreshold || 1000),\n });\n\n // N+1 detection\n this.detectNPlusOne(query);\n\n return result;\n } catch (err) {\n const duration_ms = Date.now() - start;\n this.recordQuery({\n query: this.config.redactParams ? this.redactQuery(query) : query,\n duration_ms,\n timestamp: new Date().toISOString(),\n source,\n error: err instanceof Error ? err.message : String(err),\n });\n throw err;\n }\n }\n\n /**\n * Track a synchronous database query\n */\n trackSync<T>(query: string, fn: () => T, source?: string): T {\n const start = Date.now();\n this.queryCounter++;\n\n try {\n const result = fn();\n const duration_ms = Date.now() - start;\n\n this.recordQuery({\n query: this.config.redactParams ? this.redactQuery(query) : query,\n duration_ms,\n timestamp: new Date().toISOString(),\n source,\n is_slow: duration_ms >= (this.config.slowQueryThreshold || 1000),\n });\n\n return result;\n } catch (err) {\n const duration_ms = Date.now() - start;\n this.recordQuery({\n query: this.config.redactParams ? this.redactQuery(query) : query,\n duration_ms,\n timestamp: new Date().toISOString(),\n source,\n error: err instanceof Error ? err.message : String(err),\n });\n throw err;\n }\n }\n\n /**\n * Get current query count (useful for N+1 detection in tests)\n */\n getQueryCount(): number {\n return this.queryCounter;\n }\n\n /**\n * Reset the query counter\n */\n resetQueryCount(): void {\n this.queryCounter = 0;\n this.nPlusOneDetector.clear();\n }\n\n /**\n * Get detected N+1 patterns\n */\n getNPlusOnePatterns(): Array<{ query: string; count: number }> {\n const patterns: Array<{ query: string; count: number }> = [];\n for (const [query, { count }] of this.nPlusOneDetector.entries()) {\n if (count >= 5) {\n patterns.push({ query, count });\n }\n }\n return patterns;\n }\n\n /**\n * Force flush queued query events\n */\n async flush(): Promise<void> {\n if (this.queue.length === 0) return;\n\n const queries = [...this.queue];\n this.queue = [];\n\n try {\n const response = await fetch(`${this.config.endpoint}/api/sdk/metrics`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-API-Key': this.config.apiKey,\n },\n body: JSON.stringify({\n metrics: queries.map((q) => ({\n name: 'db.query',\n value: q.duration_ms,\n type: 'distribution',\n unit: 'ms',\n tags: {\n query: q.query.substring(0, 200),\n source: q.source || 'unknown',\n is_slow: String(q.is_slow || false),\n ...(q.error ? { error: 'true' } : {}),\n },\n timestamp: q.timestamp,\n })),\n }),\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}`);\n }\n\n this.log(`Flushed ${queries.length} query events`);\n } catch (err) {\n this.queue.unshift(...queries);\n this.log('Failed to flush query events:', err);\n }\n }\n\n /**\n * Destroy the tracker and flush remaining events\n */\n async destroy(): Promise<void> {\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n this.flushTimer = null;\n }\n await this.flush();\n }\n\n private recordQuery(event: DatabaseQueryEvent): void {\n this.queue.push(event);\n\n if (this.queue.length >= (this.config.maxBatchSize || 50)) {\n this.flush();\n }\n\n if (event.is_slow) {\n this.log(`Slow query (${event.duration_ms}ms):`, event.query.substring(0, 100));\n }\n }\n\n private detectNPlusOne(query: string): void {\n // Normalize query for pattern matching\n const pattern = this.normalizeQuery(query);\n const now = Date.now();\n\n const existing = this.nPlusOneDetector.get(pattern);\n if (existing) {\n // If same pattern repeated within 1 second\n if (now - existing.since < 1000) {\n existing.count++;\n if (existing.count === 5) {\n this.log(`N+1 query detected! Pattern repeated ${existing.count} times:`, pattern.substring(0, 100));\n }\n } else {\n // Reset window\n this.nPlusOneDetector.set(pattern, { count: 1, since: now });\n }\n } else {\n this.nPlusOneDetector.set(pattern, { count: 1, since: now });\n }\n\n // Cleanup old patterns\n if (this.nPlusOneDetector.size > 100) {\n const entries = [...this.nPlusOneDetector.entries()];\n entries.sort((a, b) => a[1].since - b[1].since);\n for (let i = 0; i < 50; i++) {\n this.nPlusOneDetector.delete(entries[i][0]);\n }\n }\n }\n\n private normalizeQuery(query: string): string {\n return query\n .replace(/\\s+/g, ' ')\n .replace(/'[^']*'/g, '?')\n .replace(/\\b\\d+\\b/g, '?')\n .trim()\n .substring(0, 300);\n }\n\n private redactQuery(query: string): string {\n return query\n .replace(/'[^']*'/g, \"'***'\")\n .replace(/\\b\\d{4,}\\b/g, '***');\n }\n\n private startFlushTimer(): void {\n this.flushTimer = setInterval(() => {\n this.flush();\n }, this.config.flushInterval || 10000);\n }\n\n private log(...args: unknown[]): void {\n if (this.config.debug) {\n console.log('[SitePong:DB]', ...args);\n }\n }\n}\n","/**\n * Production Profiling SDK Module\n *\n * Usage:\n * import { profiler } from '@sitepong/sdk';\n *\n * // Profile a function\n * const result = await profiler.profile('processOrder', async () => {\n * return await processOrder(orderId);\n * });\n *\n * // Get flame graph data\n * const profile = profiler.getProfile();\n */\n\nexport interface ProfileFrame {\n name: string;\n duration_ms: number;\n start_ms: number;\n children: ProfileFrame[];\n metadata?: Record<string, unknown>;\n}\n\nexport interface ProfileData {\n id: string;\n name: string;\n startTime: number;\n duration_ms: number;\n frames: ProfileFrame[];\n metadata?: Record<string, unknown>;\n}\n\nexport interface ProfilerConfig {\n apiKey: string;\n endpoint: string;\n debug?: boolean;\n /** Sample rate for profiling (0-1, default 0.1 = 10%) */\n sampleRate?: number;\n /** Maximum profile duration in ms (default 30000) */\n maxDuration?: number;\n /** Flush interval for sending profiles (default 30000) */\n flushInterval?: number;\n}\n\nexport class Profiler {\n private config: ProfilerConfig;\n private profiles: ProfileData[] = [];\n private activeProfile: ProfileData | null = null;\n private frameStack: ProfileFrame[] = [];\n private flushTimer: ReturnType<typeof setTimeout> | null = null;\n\n constructor(config: ProfilerConfig) {\n this.config = {\n sampleRate: 0.1,\n maxDuration: 30000,\n flushInterval: 30000,\n ...config,\n };\n this.startFlushTimer();\n }\n\n /**\n * Profile an async function execution\n */\n async profile<T>(name: string, fn: () => Promise<T>, metadata?: Record<string, unknown>): Promise<T> {\n // Sample rate check\n if (Math.random() > (this.config.sampleRate || 0.1)) {\n return fn();\n }\n\n const profileId = this.generateId();\n const startTime = performance.now();\n\n this.activeProfile = {\n id: profileId,\n name,\n startTime,\n duration_ms: 0,\n frames: [],\n metadata,\n };\n this.frameStack = [];\n\n const rootFrame: ProfileFrame = {\n name,\n start_ms: 0,\n duration_ms: 0,\n children: [],\n metadata,\n };\n this.frameStack.push(rootFrame);\n\n try {\n const result = await fn();\n\n rootFrame.duration_ms = performance.now() - startTime;\n this.activeProfile.duration_ms = rootFrame.duration_ms;\n this.activeProfile.frames = [rootFrame];\n\n // Only record if under max duration\n if (rootFrame.duration_ms <= (this.config.maxDuration || 30000)) {\n this.profiles.push(this.activeProfile);\n }\n\n this.activeProfile = null;\n this.frameStack = [];\n\n return result;\n } catch (err) {\n rootFrame.duration_ms = performance.now() - startTime;\n rootFrame.metadata = { ...rootFrame.metadata, error: true };\n if (this.activeProfile) {\n this.activeProfile.duration_ms = rootFrame.duration_ms;\n this.activeProfile.frames = [rootFrame];\n this.profiles.push(this.activeProfile);\n }\n this.activeProfile = null;\n this.frameStack = [];\n throw err;\n }\n }\n\n /**\n * Start a profiling span within an active profile\n */\n startSpan(name: string, metadata?: Record<string, unknown>): () => void {\n if (!this.activeProfile) return () => {};\n\n const startMs = performance.now() - this.activeProfile.startTime;\n const frame: ProfileFrame = {\n name,\n start_ms: startMs,\n duration_ms: 0,\n children: [],\n metadata,\n };\n\n // Add as child of current frame\n const parent = this.frameStack[this.frameStack.length - 1];\n if (parent) {\n parent.children.push(frame);\n }\n this.frameStack.push(frame);\n\n return () => {\n frame.duration_ms = (performance.now() - this.activeProfile!.startTime) - frame.start_ms;\n this.frameStack.pop();\n };\n }\n\n /**\n * Get all collected profiles\n */\n getProfiles(): ProfileData[] {\n return [...this.profiles];\n }\n\n /**\n * Get the latest profile\n */\n getLatestProfile(): ProfileData | null {\n return this.profiles.length > 0 ? this.profiles[this.profiles.length - 1] : null;\n }\n\n /**\n * Flush profiles to the server\n */\n async flush(): Promise<void> {\n if (this.profiles.length === 0) return;\n\n const profiles = [...this.profiles];\n this.profiles = [];\n\n try {\n const response = await fetch(`${this.config.endpoint}/api/sdk/metrics`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-API-Key': this.config.apiKey,\n },\n body: JSON.stringify({\n metrics: profiles.map((p) => ({\n name: `profile.${p.name}`,\n value: p.duration_ms,\n type: 'distribution',\n unit: 'ms',\n tags: {\n profile_id: p.id,\n frame_count: String(countFrames(p.frames)),\n ...(p.metadata as Record<string, string> || {}),\n },\n timestamp: new Date(Date.now() - p.duration_ms).toISOString(),\n })),\n }),\n });\n\n if (!response.ok) throw new Error(`HTTP ${response.status}`);\n this.log(`Flushed ${profiles.length} profiles`);\n } catch (err) {\n this.profiles.unshift(...profiles);\n this.log('Failed to flush profiles:', err);\n }\n }\n\n /**\n * Destroy the profiler\n */\n async destroy(): Promise<void> {\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n this.flushTimer = null;\n }\n await this.flush();\n }\n\n private startFlushTimer(): void {\n this.flushTimer = setInterval(() => {\n this.flush();\n }, this.config.flushInterval || 30000);\n }\n\n private generateId(): string {\n return `prof_${Date.now().toString(36)}_${Math.random().toString(36).substring(2, 8)}`;\n }\n\n private log(...args: unknown[]): void {\n if (this.config.debug) {\n console.log('[SitePong:Profiler]', ...args);\n }\n }\n}\n\nfunction countFrames(frames: ProfileFrame[]): number {\n let count = frames.length;\n for (const frame of frames) {\n count += countFrames(frame.children);\n }\n return count;\n}\n","/**\n * Remote Config Defaults\n *\n * Hardcoded defaults used when no remote config is available.\n */\n\nimport type { RemoteConfig } from './types';\n\nexport const DEFAULT_REMOTE_CONFIG: RemoteConfig = {\n features: {},\n sampling: {\n errors: 1,\n analytics: 1,\n replay: 1,\n performance: 1,\n },\n transport: {\n flushInterval: 10000,\n maxBatchSize: 20,\n maxRetries: 3,\n },\n autocapture: {\n clicks: true,\n forms: true,\n pageviews: true,\n appState: true,\n screenViews: true,\n },\n ttl: 300, // 5 minutes\n};\n","/**\n * Remote Config Manager\n *\n * Fetches SDK behavior config from SitePong servers on init.\n * Caches in StorageAdapter with TTL. Auto-refreshes in background.\n * User's explicit config always wins over remote config.\n */\n\nimport type { RemoteConfig, RemoteConfigResponse, RemoteConfigListener } from './types';\nimport type { StorageAdapter } from '../utils/platform';\nimport { DEFAULT_REMOTE_CONFIG } from './defaults';\nimport { detectPlatform } from '../utils/platform';\n\nconst STORAGE_KEY = 'sitepong_remote_config';\nconst STORAGE_TS_KEY = 'sitepong_remote_config_ts';\n\nexport interface RemoteConfigManagerOptions {\n apiKey: string;\n endpoint: string;\n storage?: StorageAdapter | null;\n sdkVersion?: string;\n debug?: boolean;\n}\n\nexport class RemoteConfigManager {\n private config: RemoteConfig;\n private options: RemoteConfigManagerOptions;\n private listeners: RemoteConfigListener[] = [];\n private refreshTimer: ReturnType<typeof setTimeout> | null = null;\n private initialized = false;\n\n constructor(options: RemoteConfigManagerOptions) {\n this.options = options;\n this.config = { ...DEFAULT_REMOTE_CONFIG };\n }\n\n async init(): Promise<void> {\n // 1. Load cached config instantly\n await this.loadFromCache();\n this.initialized = true;\n\n // 2. Fetch fresh config in background\n this.fetchAndApply().catch((err) => {\n this.log('Failed to fetch remote config:', err);\n });\n }\n\n getConfig(): RemoteConfig {\n return this.config;\n }\n\n isFeatureEnabled(key: string, defaultValue = true): boolean {\n return this.config.features[key] ?? defaultValue;\n }\n\n onChange(listener: RemoteConfigListener): () => void {\n this.listeners.push(listener);\n return () => {\n this.listeners = this.listeners.filter((l) => l !== listener);\n };\n }\n\n isInitialized(): boolean {\n return this.initialized;\n }\n\n destroy(): void {\n if (this.refreshTimer) {\n clearTimeout(this.refreshTimer);\n this.refreshTimer = null;\n }\n this.listeners = [];\n }\n\n private async loadFromCache(): Promise<void> {\n const storage = this.options.storage;\n if (!storage) return;\n\n try {\n const cached = await storage.getItem(STORAGE_KEY);\n const cachedTs = await storage.getItem(STORAGE_TS_KEY);\n\n if (cached && cachedTs) {\n const age = Date.now() - parseInt(cachedTs, 10);\n const ttlMs = this.config.ttl * 1000;\n\n if (age < ttlMs) {\n const parsed = JSON.parse(cached) as RemoteConfig;\n this.config = parsed;\n this.log('Loaded config from cache (age:', Math.round(age / 1000), 's)');\n }\n }\n } catch {\n this.log('Failed to load cached config');\n }\n }\n\n private async fetchAndApply(): Promise<void> {\n try {\n const platform = detectPlatform();\n const params = new URLSearchParams({\n platform,\n ...(this.options.sdkVersion ? { sdkVersion: this.options.sdkVersion } : {}),\n });\n\n const response = await fetch(\n `${this.options.endpoint}/api/sdk/config?${params}`,\n {\n method: 'GET',\n headers: {\n 'X-API-Key': this.options.apiKey,\n },\n }\n );\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}`);\n }\n\n const data = (await response.json()) as RemoteConfigResponse;\n this.config = data.config;\n\n // Notify listeners\n for (const listener of this.listeners) {\n try {\n listener(this.config);\n } catch {\n // Ignore listener errors\n }\n }\n\n // Cache\n await this.saveToCache();\n\n // Schedule refresh\n this.scheduleRefresh();\n\n // Check SDK version\n if (data.config.minSdkVersion && this.options.sdkVersion) {\n if (this.compareVersions(this.options.sdkVersion, data.config.minSdkVersion) < 0) {\n console.warn(\n `[SitePong] SDK version ${this.options.sdkVersion} is outdated. ` +\n `Minimum recommended: ${data.config.minSdkVersion}. Please update.`\n );\n }\n }\n\n this.log('Remote config fetched successfully');\n } catch (err) {\n // Schedule retry even on failure\n this.scheduleRefresh();\n throw err;\n }\n }\n\n private async saveToCache(): Promise<void> {\n const storage = this.options.storage;\n if (!storage) return;\n\n try {\n await storage.setItem(STORAGE_KEY, JSON.stringify(this.config));\n await storage.setItem(STORAGE_TS_KEY, String(Date.now()));\n } catch {\n this.log('Failed to cache remote config');\n }\n }\n\n private scheduleRefresh(): void {\n if (this.refreshTimer) {\n clearTimeout(this.refreshTimer);\n }\n\n const ttlMs = this.config.ttl * 1000;\n this.refreshTimer = setTimeout(() => {\n this.fetchAndApply().catch((err) => {\n this.log('Refresh failed:', err);\n });\n }, ttlMs);\n }\n\n private compareVersions(a: string, b: string): number {\n const pa = a.split('.').map(Number);\n const pb = b.split('.').map(Number);\n for (let i = 0; i < 3; i++) {\n const na = pa[i] || 0;\n const nb = pb[i] || 0;\n if (na > nb) return 1;\n if (na < nb) return -1;\n }\n return 0;\n }\n\n private log(...args: unknown[]): void {\n if (this.options.debug) {\n console.log('[SitePong RemoteConfig]', ...args);\n }\n }\n}\n","var e,n,t,r,i,o=-1,a=function(e){addEventListener(\"pageshow\",(function(n){n.persisted&&(o=n.timeStamp,e(n))}),!0)},c=function(){var e=self.performance&&performance.getEntriesByType&&performance.getEntriesByType(\"navigation\")[0];if(e&&e.responseStart>0&&e.responseStart<performance.now())return e},u=function(){var e=c();return e&&e.activationStart||0},f=function(e,n){var t=c(),r=\"navigate\";o>=0?r=\"back-forward-cache\":t&&(document.prerendering||u()>0?r=\"prerender\":document.wasDiscarded?r=\"restore\":t.type&&(r=t.type.replace(/_/g,\"-\")));return{name:e,value:void 0===n?-1:n,rating:\"good\",delta:0,entries:[],id:\"v4-\".concat(Date.now(),\"-\").concat(Math.floor(8999999999999*Math.random())+1e12),navigationType:r}},s=function(e,n,t){try{if(PerformanceObserver.supportedEntryTypes.includes(e)){var r=new PerformanceObserver((function(e){Promise.resolve().then((function(){n(e.getEntries())}))}));return r.observe(Object.assign({type:e,buffered:!0},t||{})),r}}catch(e){}},d=function(e,n,t,r){var i,o;return function(a){n.value>=0&&(a||r)&&((o=n.value-(i||0))||void 0===i)&&(i=n.value,n.delta=o,n.rating=function(e,n){return e>n[1]?\"poor\":e>n[0]?\"needs-improvement\":\"good\"}(n.value,t),e(n))}},l=function(e){requestAnimationFrame((function(){return requestAnimationFrame((function(){return e()}))}))},p=function(e){document.addEventListener(\"visibilitychange\",(function(){\"hidden\"===document.visibilityState&&e()}))},v=function(e){var n=!1;return function(){n||(e(),n=!0)}},m=-1,h=function(){return\"hidden\"!==document.visibilityState||document.prerendering?1/0:0},g=function(e){\"hidden\"===document.visibilityState&&m>-1&&(m=\"visibilitychange\"===e.type?e.timeStamp:0,T())},y=function(){addEventListener(\"visibilitychange\",g,!0),addEventListener(\"prerenderingchange\",g,!0)},T=function(){removeEventListener(\"visibilitychange\",g,!0),removeEventListener(\"prerenderingchange\",g,!0)},E=function(){return m<0&&(m=h(),y(),a((function(){setTimeout((function(){m=h(),y()}),0)}))),{get firstHiddenTime(){return m}}},C=function(e){document.prerendering?addEventListener(\"prerenderingchange\",(function(){return e()}),!0):e()},b=[1800,3e3],S=function(e,n){n=n||{},C((function(){var t,r=E(),i=f(\"FCP\"),o=s(\"paint\",(function(e){e.forEach((function(e){\"first-contentful-paint\"===e.name&&(o.disconnect(),e.startTime<r.firstHiddenTime&&(i.value=Math.max(e.startTime-u(),0),i.entries.push(e),t(!0)))}))}));o&&(t=d(e,i,b,n.reportAllChanges),a((function(r){i=f(\"FCP\"),t=d(e,i,b,n.reportAllChanges),l((function(){i.value=performance.now()-r.timeStamp,t(!0)}))})))}))},L=[.1,.25],w=function(e,n){n=n||{},S(v((function(){var t,r=f(\"CLS\",0),i=0,o=[],c=function(e){e.forEach((function(e){if(!e.hadRecentInput){var n=o[0],t=o[o.length-1];i&&e.startTime-t.startTime<1e3&&e.startTime-n.startTime<5e3?(i+=e.value,o.push(e)):(i=e.value,o=[e])}})),i>r.value&&(r.value=i,r.entries=o,t())},u=s(\"layout-shift\",c);u&&(t=d(e,r,L,n.reportAllChanges),p((function(){c(u.takeRecords()),t(!0)})),a((function(){i=0,r=f(\"CLS\",0),t=d(e,r,L,n.reportAllChanges),l((function(){return t()}))})),setTimeout(t,0))})))},A=0,I=1/0,P=0,M=function(e){e.forEach((function(e){e.interactionId&&(I=Math.min(I,e.interactionId),P=Math.max(P,e.interactionId),A=P?(P-I)/7+1:0)}))},k=function(){return e?A:performance.interactionCount||0},F=function(){\"interactionCount\"in performance||e||(e=s(\"event\",M,{type:\"event\",buffered:!0,durationThreshold:0}))},D=[],x=new Map,R=0,B=function(){var e=Math.min(D.length-1,Math.floor((k()-R)/50));return D[e]},H=[],q=function(e){if(H.forEach((function(n){return n(e)})),e.interactionId||\"first-input\"===e.entryType){var n=D[D.length-1],t=x.get(e.interactionId);if(t||D.length<10||e.duration>n.latency){if(t)e.duration>t.latency?(t.entries=[e],t.latency=e.duration):e.duration===t.latency&&e.startTime===t.entries[0].startTime&&t.entries.push(e);else{var r={id:e.interactionId,latency:e.duration,entries:[e]};x.set(r.id,r),D.push(r)}D.sort((function(e,n){return n.latency-e.latency})),D.length>10&&D.splice(10).forEach((function(e){return x.delete(e.id)}))}}},O=function(e){var n=self.requestIdleCallback||self.setTimeout,t=-1;return e=v(e),\"hidden\"===document.visibilityState?e():(t=n(e),p(e)),t},N=[200,500],j=function(e,n){\"PerformanceEventTiming\"in self&&\"interactionId\"in PerformanceEventTiming.prototype&&(n=n||{},C((function(){var t;F();var r,i=f(\"INP\"),o=function(e){O((function(){e.forEach(q);var n=B();n&&n.latency!==i.value&&(i.value=n.latency,i.entries=n.entries,r())}))},c=s(\"event\",o,{durationThreshold:null!==(t=n.durationThreshold)&&void 0!==t?t:40});r=d(e,i,N,n.reportAllChanges),c&&(c.observe({type:\"first-input\",buffered:!0}),p((function(){o(c.takeRecords()),r(!0)})),a((function(){R=k(),D.length=0,x.clear(),i=f(\"INP\"),r=d(e,i,N,n.reportAllChanges)})))})))},_=[2500,4e3],z={},G=function(e,n){n=n||{},C((function(){var t,r=E(),i=f(\"LCP\"),o=function(e){n.reportAllChanges||(e=e.slice(-1)),e.forEach((function(e){e.startTime<r.firstHiddenTime&&(i.value=Math.max(e.startTime-u(),0),i.entries=[e],t())}))},c=s(\"largest-contentful-paint\",o);if(c){t=d(e,i,_,n.reportAllChanges);var m=v((function(){z[i.id]||(o(c.takeRecords()),c.disconnect(),z[i.id]=!0,t(!0))}));[\"keydown\",\"click\"].forEach((function(e){addEventListener(e,(function(){return O(m)}),{once:!0,capture:!0})})),p(m),a((function(r){i=f(\"LCP\"),t=d(e,i,_,n.reportAllChanges),l((function(){i.value=performance.now()-r.timeStamp,z[i.id]=!0,t(!0)}))}))}}))},J=[800,1800],K=function e(n){document.prerendering?C((function(){return e(n)})):\"complete\"!==document.readyState?addEventListener(\"load\",(function(){return e(n)}),!0):setTimeout(n,0)},Q=function(e,n){n=n||{};var t=f(\"TTFB\"),r=d(e,t,J,n.reportAllChanges);K((function(){var i=c();i&&(t.value=Math.max(i.responseStart-u(),0),t.entries=[i],r(!0),a((function(){t=f(\"TTFB\",0),(r=d(e,t,J,n.reportAllChanges))(!0)})))}))},U={passive:!0,capture:!0},V=new Date,W=function(e,i){n||(n=i,t=e,r=new Date,Z(removeEventListener),X())},X=function(){if(t>=0&&t<r-V){var e={entryType:\"first-input\",name:n.type,target:n.target,cancelable:n.cancelable,startTime:n.timeStamp,processingStart:n.timeStamp+t};i.forEach((function(n){n(e)})),i=[]}},Y=function(e){if(e.cancelable){var n=(e.timeStamp>1e12?new Date:performance.now())-e.timeStamp;\"pointerdown\"==e.type?function(e,n){var t=function(){W(e,n),i()},r=function(){i()},i=function(){removeEventListener(\"pointerup\",t,U),removeEventListener(\"pointercancel\",r,U)};addEventListener(\"pointerup\",t,U),addEventListener(\"pointercancel\",r,U)}(n,e):W(n,e)}},Z=function(e){[\"mousedown\",\"keydown\",\"touchstart\",\"pointerdown\"].forEach((function(n){return e(n,Y,U)}))},$=[100,300],ee=function(e,r){r=r||{},C((function(){var o,c=E(),u=f(\"FID\"),l=function(e){e.startTime<c.firstHiddenTime&&(u.value=e.processingStart-e.startTime,u.entries.push(e),o(!0))},m=function(e){e.forEach(l)},h=s(\"first-input\",m);o=d(e,u,$,r.reportAllChanges),h&&(p(v((function(){m(h.takeRecords()),h.disconnect()}))),a((function(){var a;u=f(\"FID\"),o=d(e,u,$,r.reportAllChanges),i=[],t=-1,n=null,Z(addEventListener),a=l,i.push(a),X()})))}))};export{L as CLSThresholds,b as FCPThresholds,$ as FIDThresholds,N as INPThresholds,_ as LCPThresholds,J as TTFBThresholds,w as onCLS,S as onFCP,ee as onFID,j as onINP,G as onLCP,Q as onTTFB};\n","import { onCLS, onINP, onLCP, onTTFB, onFCP } from 'web-vitals';\nimport type {\n PerformanceConfig,\n PerformanceMetric,\n PerformanceTransaction,\n PerformanceSpan,\n WebVitals,\n ResourceTimingBreakdown,\n} from './types';\n\nconst DEFAULT_ENDPOINT = 'https://ingest.sitepong.com';\nconst DEFAULT_FLUSH_INTERVAL = 10000;\nconst MAX_FLUSH_FAILURES = 3;\nconst MAX_RESOURCES_PER_FLUSH = 200;\nconst PAGE_TIMING_POLL_INTERVAL = 200;\nconst PAGE_TIMING_TIMEOUT = 30000;\n\n// --- Speed Index helpers (adapted from OpenReplay / RUM-SpeedIndex) ---\n\ninterface ResourcesTimeMap {\n [url: string]: number;\n}\n\ninterface PaintBlock {\n time: number;\n area: number;\n}\n\nfunction getPaintBlocks(resources: ResourcesTimeMap): PaintBlock[] {\n const paintBlocks: PaintBlock[] = [];\n const elements = document.getElementsByTagName('*');\n const styleURL = /url\\((\"[^\"]*\"|'[^']*'|[^)]*)\\)/i;\n\n for (let i = 0; i < elements.length; i++) {\n const element = elements[i];\n let src = '';\n\n if (element.tagName === 'IMG') {\n src = (element as HTMLImageElement).currentSrc || (element as HTMLImageElement).src;\n }\n\n if (!src) {\n const backgroundImage = getComputedStyle(element).getPropertyValue('background-image');\n if (backgroundImage) {\n const matches = styleURL.exec(backgroundImage);\n if (matches !== null) {\n src = matches[1];\n if (src.startsWith('\"') || src.startsWith(\"'\")) {\n src = src.substr(1, src.length - 2);\n }\n }\n }\n }\n\n if (!src) continue;\n const time = src.substr(0, 10) === 'data:image' ? 0 : resources[src];\n if (time === undefined) continue;\n\n const rect = element.getBoundingClientRect();\n const top = Math.max(rect.top, 0);\n const left = Math.max(rect.left, 0);\n const bottom = Math.min(\n rect.bottom,\n window.innerHeight || (document.documentElement && document.documentElement.clientHeight) || 0,\n );\n const right = Math.min(\n rect.right,\n window.innerWidth || (document.documentElement && document.documentElement.clientWidth) || 0,\n );\n\n if (bottom <= top || right <= left) continue;\n const area = (bottom - top) * (right - left);\n paintBlocks.push({ time, area });\n }\n\n return paintBlocks;\n}\n\nfunction calculateSpeedIndex(firstContentfulPaint: number, paintBlocks: PaintBlock[]): number {\n let a =\n (Math.max(\n (document.documentElement && document.documentElement.clientWidth) || 0,\n window.innerWidth || 0,\n ) *\n Math.max(\n (document.documentElement && document.documentElement.clientHeight) || 0,\n window.innerHeight || 0,\n )) /\n 10;\n let s = a * firstContentfulPaint;\n\n for (let i = 0; i < paintBlocks.length; i++) {\n const { time, area } = paintBlocks[i];\n a += area;\n s += area * (time > firstContentfulPaint ? time : firstContentfulPaint);\n }\n\n return a === 0 ? 0 : s / a;\n}\n\n// --- PerformanceManager ---\n\nexport class PerformanceManager {\n private config: Required<\n Omit<\n PerformanceConfig,\n | 'apiKey'\n | 'performanceEndpoint'\n | 'excludedResourceUrls'\n | 'resourceNameSanitizer'\n >\n > & {\n apiKey: string;\n performanceEndpoint?: string;\n excludedResourceUrls: string[];\n resourceNameSanitizer?: (url: string) => string;\n };\n private metrics: PerformanceMetric[] = [];\n private flushTimer: ReturnType<typeof setInterval> | null = null;\n private flushFailures = 0;\n private disabled = false;\n private vitals: WebVitals = {};\n private activeTransactions: Map<string, PerformanceTransaction> = new Map();\n private sampled: boolean;\n\n // Resource timing state for Speed Index\n private resourceObserver: PerformanceObserver | null = null;\n private resourceTimeMap: ResourcesTimeMap | null = {};\n private resourceCount = 0;\n\n // Page timing polling timers\n private pageLoadTimer: ReturnType<typeof setInterval> | null = null;\n private pageRenderTimer: ReturnType<typeof setInterval> | null = null;\n\n constructor(config: PerformanceConfig) {\n this.config = {\n endpoint: DEFAULT_ENDPOINT,\n enabled: true,\n webVitals: true,\n navigationTiming: true,\n resourceTiming: true,\n capturePageLoadTimings: true,\n capturePageRenderTimings: true,\n excludedResourceUrls: [],\n flushInterval: DEFAULT_FLUSH_INTERVAL,\n sampleRate: 1.0,\n debug: false,\n ...config,\n };\n this.sampled = Math.random() <= this.config.sampleRate;\n }\n\n init(): void {\n if (!this.config.enabled || !this.sampled) return;\n if (typeof window === 'undefined' || typeof window.addEventListener !== 'function') return;\n\n if (this.config.webVitals !== false) {\n this.initWebVitals();\n }\n\n if (this.config.resourceTiming !== false) {\n this.initResourceTiming();\n }\n\n if (this.config.capturePageLoadTimings !== false) {\n this.initPageLoadTiming();\n }\n\n if (this.config.capturePageRenderTimings !== false) {\n this.initPageRenderTiming();\n }\n\n this.startFlushTimer();\n this.log('Performance monitoring initialized');\n }\n\n // ---- Web Vitals (via web-vitals library) ----\n\n private initWebVitals(): void {\n onCLS((m) => {\n this.vitals.cls = m.value;\n this.reportVital('CLS', m.value, 'score');\n });\n onINP((m) => {\n this.vitals.inp = m.value;\n this.reportVital('INP', m.value);\n });\n onLCP((m) => {\n this.vitals.lcp = m.value;\n this.reportVital('LCP', m.value);\n });\n onTTFB((m) => {\n this.vitals.ttfb = m.value;\n this.reportVital('TTFB', m.value);\n });\n onFCP((m) => {\n this.vitals.fcp = m.value;\n this.reportVital('FCP', m.value);\n });\n }\n\n // ---- Resource Timing (adapted from OpenReplay timing.ts) ----\n\n private initResourceTiming(): void {\n if (typeof PerformanceObserver === 'undefined') return;\n\n try {\n this.resourceObserver = new PerformanceObserver((list) => {\n for (const entry of list.getEntries()) {\n this.processResourceEntry(entry as PerformanceResourceTiming);\n }\n });\n this.resourceObserver.observe({ type: 'resource', buffered: true });\n } catch {\n this.log('PerformanceObserver for resource timing not supported');\n }\n }\n\n private isServiceURL(url: string): boolean {\n const endpoint = this.config.performanceEndpoint || this.config.endpoint;\n return url.startsWith(endpoint);\n }\n\n private processResourceEntry(entry: PerformanceResourceTiming): void {\n if (entry.duration < 0 || !entry.name.startsWith('http')) return;\n if (this.isServiceURL(entry.name)) return;\n\n // Track for Speed Index calculation\n if (this.resourceTimeMap !== null) {\n this.resourceTimeMap[entry.name] = entry.startTime + entry.duration;\n }\n\n // Check excluded URLs\n for (const excluded of this.config.excludedResourceUrls) {\n if (entry.name.startsWith(excluded)) return;\n }\n\n // Cap resources per flush\n if (this.resourceCount >= MAX_RESOURCES_PER_FLUSH) return;\n this.resourceCount++;\n\n // Stalled time calculation (from OpenReplay)\n let stalled = 0;\n if (entry.connectEnd && entry.connectEnd > entry.domainLookupEnd) {\n stalled = Math.max(0, entry.requestStart - entry.connectEnd);\n } else {\n stalled = Math.max(0, entry.requestStart - entry.domainLookupEnd);\n }\n\n const cached: boolean =\n ((entry as any).responseStatus && (entry as any).responseStatus === 304) ||\n ((entry as any).deliveryType && (entry as any).deliveryType === 'cache') ||\n (entry.transferSize === 0 && entry.decodedBodySize > 0);\n\n const responseStatus = (entry as any).responseStatus || 0;\n const failed = responseStatus >= 400;\n\n const breakdown: ResourceTimingBreakdown = {\n queueing: entry.requestStart - entry.fetchStart,\n dnsLookup: entry.domainLookupEnd - entry.domainLookupStart,\n initialConnection: entry.connectEnd - entry.connectStart,\n ssl: entry.secureConnectionStart > 0 ? entry.connectEnd - entry.secureConnectionStart : 0,\n ttfb: entry.responseStart - entry.requestStart,\n contentDownload: entry.responseEnd - entry.responseStart,\n total: entry.duration ?? entry.responseEnd - entry.startTime,\n stalled,\n cached,\n failed,\n responseStatus,\n headerSize: entry.transferSize > entry.encodedBodySize ? entry.transferSize - entry.encodedBodySize : 0,\n encodedBodySize: entry.encodedBodySize || 0,\n decodedBodySize: failed ? -111 : entry.decodedBodySize || 0,\n transferSize: entry.transferSize,\n initiatorType: entry.initiatorType,\n };\n\n const entryName = this.config.resourceNameSanitizer\n ? this.config.resourceNameSanitizer(entry.name)\n : entry.name;\n\n this.addMetric({\n type: 'resource',\n name: entryName,\n value: entry.duration,\n unit: 'ms',\n timestamp: new Date().toISOString(),\n url: typeof window !== 'undefined' && window.location ? window.location.href : undefined,\n data: breakdown as unknown as Record<string, unknown>,\n });\n }\n\n // ---- Page Load Timing (adapted from OpenReplay timing.ts) ----\n\n private initPageLoadTiming(): void {\n if (typeof window === 'undefined' || !window.performance) return;\n\n let firstPaint = 0;\n let firstContentfulPaint = 0;\n let sent = false;\n const startTime = performance.now();\n\n this.pageLoadTimer = setInterval(() => {\n if (sent) {\n if (this.pageLoadTimer) clearInterval(this.pageLoadTimer);\n return;\n }\n\n // Collect paint entries\n if (firstPaint === 0 || firstContentfulPaint === 0) {\n for (const entry of performance.getEntriesByType('paint')) {\n if (entry.name === 'first-paint') firstPaint = entry.startTime;\n if (entry.name === 'first-contentful-paint') firstContentfulPaint = entry.startTime;\n }\n }\n\n const nav = performance.getEntriesByType('navigation')[0] as PerformanceNavigationTiming | undefined;\n const timedOut = performance.now() - startTime > PAGE_TIMING_TIMEOUT;\n\n if ((nav && nav.loadEventEnd > 0) || timedOut) {\n sent = true;\n if (this.pageLoadTimer) clearInterval(this.pageLoadTimer);\n\n if (nav) {\n const navigationStart = nav.startTime;\n\n this.addMetric({\n type: 'navigation',\n name: 'page_load',\n value: nav.loadEventEnd - navigationStart,\n unit: 'ms',\n timestamp: new Date().toISOString(),\n url: window.location.href,\n data: {\n requestStart: nav.requestStart - navigationStart,\n responseStart: nav.responseStart - navigationStart,\n responseEnd: nav.responseEnd - navigationStart,\n domContentLoadedEventStart: nav.domContentLoadedEventEnd - navigationStart,\n domContentLoadedEventEnd: nav.domContentLoadedEventEnd - navigationStart,\n loadEventStart: nav.loadEventStart - navigationStart,\n loadEventEnd: nav.loadEventEnd - navigationStart,\n firstPaint,\n firstContentfulPaint,\n dns: nav.domainLookupEnd - nav.domainLookupStart,\n tcp: nav.connectEnd - nav.connectStart,\n ttfb: nav.responseStart - nav.requestStart,\n domComplete: nav.domComplete - navigationStart,\n transferSize: nav.transferSize,\n encodedBodySize: nav.encodedBodySize,\n decodedBodySize: nav.decodedBodySize,\n },\n });\n }\n }\n }, PAGE_TIMING_POLL_INTERVAL);\n }\n\n // ---- Page Render Timing: Speed Index, Visually Complete, TTI (adapted from OpenReplay) ----\n\n private initPageRenderTiming(): void {\n if (typeof window === 'undefined' || !window.performance) return;\n\n let firstContentfulPaint = 0;\n let visuallyComplete = 0;\n let interactiveWindowStartTime = 0;\n let interactiveWindowTickTime: number | null = 0;\n let paintBlocks: PaintBlock[] | null = null;\n let sent = false;\n const startTime = performance.now();\n\n this.pageRenderTimer = setInterval(() => {\n if (sent) {\n if (this.pageRenderTimer) clearInterval(this.pageRenderTimer);\n return;\n }\n\n const time = performance.now();\n\n // Get FCP if we don't have it yet\n if (firstContentfulPaint === 0) {\n for (const entry of performance.getEntriesByType('paint')) {\n if (entry.name === 'first-contentful-paint') {\n firstContentfulPaint = entry.startTime;\n }\n }\n }\n\n // Track visually complete from resource map\n if (this.resourceTimeMap !== null) {\n const times = Object.values(this.resourceTimeMap);\n if (times.length > 0) {\n visuallyComplete = Math.max(...times);\n }\n if (time - visuallyComplete > 1000) {\n paintBlocks = getPaintBlocks(this.resourceTimeMap);\n this.resourceTimeMap = null;\n }\n }\n\n // TTI: 5-second quiet window (no 50ms+ long tasks)\n if (interactiveWindowTickTime !== null) {\n if (time - interactiveWindowTickTime > 50) {\n interactiveWindowStartTime = time;\n }\n interactiveWindowTickTime = time - interactiveWindowStartTime > 5000 ? null : time;\n }\n\n const timedOut = time - startTime > PAGE_TIMING_TIMEOUT;\n\n if ((paintBlocks !== null && interactiveWindowTickTime === null) || timedOut) {\n sent = true;\n if (this.pageRenderTimer) clearInterval(this.pageRenderTimer);\n this.resourceTimeMap = null;\n\n const speedIndex =\n paintBlocks === null\n ? 0\n : calculateSpeedIndex(firstContentfulPaint || 0, paintBlocks);\n\n const nav = performance.getEntriesByType('navigation')[0] as PerformanceNavigationTiming | undefined;\n const domContentLoadedEnd = nav ? nav.domContentLoadedEventEnd - nav.startTime : 0;\n\n const timeToInteractive =\n interactiveWindowTickTime === null\n ? Math.max(interactiveWindowStartTime, firstContentfulPaint, domContentLoadedEnd)\n : 0;\n\n const url = window.location.href;\n const timestamp = new Date().toISOString();\n\n if (speedIndex > 0) {\n this.addMetric({\n type: 'page_render',\n name: 'speed_index',\n value: Math.round(speedIndex),\n unit: 'ms',\n timestamp,\n url,\n });\n }\n\n if (visuallyComplete > 0) {\n this.addMetric({\n type: 'page_render',\n name: 'visually_complete',\n value: Math.round(visuallyComplete),\n unit: 'ms',\n timestamp,\n url,\n });\n }\n\n if (timeToInteractive > 0) {\n this.addMetric({\n type: 'page_render',\n name: 'tti',\n value: Math.round(timeToInteractive),\n unit: 'ms',\n timestamp,\n url,\n });\n }\n }\n }, PAGE_TIMING_POLL_INTERVAL);\n }\n\n // ---- Transactions / Spans (unchanged) ----\n\n startTransaction(name: string, data?: Record<string, unknown>): string {\n const id = `txn_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 6)}`;\n const transaction: PerformanceTransaction = {\n id,\n name,\n startTime: performance.now(),\n status: 'running',\n spans: [],\n data,\n };\n this.activeTransactions.set(id, transaction);\n this.log('Transaction started:', name, id);\n return id;\n }\n\n endTransaction(id: string, status: 'ok' | 'error' = 'ok'): void {\n const transaction = this.activeTransactions.get(id);\n if (!transaction) {\n this.log('Transaction not found:', id);\n return;\n }\n\n transaction.endTime = performance.now();\n transaction.duration = transaction.endTime - transaction.startTime;\n transaction.status = status;\n\n for (const span of transaction.spans) {\n if (span.status === 'running') {\n span.endTime = transaction.endTime;\n span.duration = span.endTime - span.startTime;\n span.status = status;\n }\n }\n\n this.activeTransactions.delete(id);\n\n this.addMetric({\n type: 'transaction',\n name: transaction.name,\n value: transaction.duration,\n unit: 'ms',\n timestamp: new Date().toISOString(),\n url: typeof window !== 'undefined' && window.location ? window.location.href : undefined,\n transaction,\n });\n\n this.log('Transaction ended:', transaction.name, `${transaction.duration.toFixed(1)}ms`);\n }\n\n startSpan(transactionId: string, name: string, data?: Record<string, unknown>): string {\n const transaction = this.activeTransactions.get(transactionId);\n if (!transaction) {\n this.log('Transaction not found for span:', transactionId);\n return '';\n }\n\n const span: PerformanceSpan = {\n id: `span_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 6)}`,\n name,\n startTime: performance.now(),\n status: 'running',\n data,\n };\n\n transaction.spans.push(span);\n return span.id;\n }\n\n endSpan(transactionId: string, spanId: string, status: 'ok' | 'error' = 'ok'): void {\n const transaction = this.activeTransactions.get(transactionId);\n if (!transaction) return;\n\n const span = transaction.spans.find((s) => s.id === spanId);\n if (!span) return;\n\n span.endTime = performance.now();\n span.duration = span.endTime - span.startTime;\n span.status = status;\n }\n\n // ---- Public API ----\n\n getVitals(): WebVitals {\n return { ...this.vitals };\n }\n\n destroy(): void {\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n this.flushTimer = null;\n }\n if (this.pageLoadTimer) {\n clearInterval(this.pageLoadTimer);\n this.pageLoadTimer = null;\n }\n if (this.pageRenderTimer) {\n clearInterval(this.pageRenderTimer);\n this.pageRenderTimer = null;\n }\n if (this.resourceObserver) {\n this.resourceObserver.disconnect();\n this.resourceObserver = null;\n }\n this.flush();\n }\n\n // ---- Internal ----\n\n private reportVital(name: string, value: number, unit: 'ms' | 'score' = 'ms'): void {\n this.addMetric({\n type: 'web_vital',\n name,\n value,\n unit,\n timestamp: new Date().toISOString(),\n url: typeof window !== 'undefined' && window.location ? window.location.href : undefined,\n });\n }\n\n private addMetric(metric: PerformanceMetric): void {\n this.metrics.push(metric);\n }\n\n private startFlushTimer(): void {\n this.flushTimer = setInterval(() => {\n this.flush();\n }, this.config.flushInterval);\n\n if (typeof document !== 'undefined') {\n document.addEventListener('visibilitychange', () => {\n if (document.visibilityState === 'hidden') {\n this.flush();\n }\n });\n }\n }\n\n async flush(): Promise<void> {\n if (this.metrics.length === 0) return;\n\n if (this.disabled) {\n this.metrics = [];\n return;\n }\n\n const metrics = [...this.metrics];\n this.metrics = [];\n this.resourceCount = 0;\n\n const endpoint = this.config.performanceEndpoint || `${this.config.endpoint}/api/performance`;\n\n try {\n const response = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-API-Key': this.config.apiKey,\n },\n body: JSON.stringify({ metrics }),\n });\n\n if (!response.ok) throw new Error(`HTTP ${response.status}`);\n this.flushFailures = 0;\n this.log(`Flushed ${metrics.length} performance metrics`);\n } catch (err) {\n this.flushFailures++;\n\n if (this.flushFailures >= MAX_FLUSH_FAILURES) {\n this.disabled = true;\n console.warn(\n `[SitePong Performance] Disabled after ${MAX_FLUSH_FAILURES} consecutive failures. ` +\n `Check that ${endpoint} is accessible and has proper CORS headers.`\n );\n return;\n }\n\n this.metrics.unshift(...metrics);\n this.log(`Failed to flush metrics (attempt ${this.flushFailures}/${MAX_FLUSH_FAILURES}):`, err);\n }\n }\n\n private log(...args: unknown[]): void {\n if (this.config.debug) {\n console.log('[SitePong Performance]', ...args);\n }\n }\n}\n","export interface TraceContext {\n traceId: string;\n spanId: string;\n parentSpanId: string | null;\n sampled: boolean;\n}\n\nfunction randomHex(byteLength: number): string {\n try {\n if (typeof crypto !== 'undefined' && crypto.getRandomValues) {\n const bytes = new Uint8Array(byteLength);\n crypto.getRandomValues(bytes);\n return Array.from(bytes)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n }\n } catch {\n // Fall through to Math.random fallback\n }\n\n let hex = '';\n for (let i = 0; i < byteLength; i++) {\n hex += Math.floor(Math.random() * 256)\n .toString(16)\n .padStart(2, '0');\n }\n return hex;\n}\n\nexport function generateTraceId(): string {\n return randomHex(16);\n}\n\nexport function generateSpanId(): string {\n return randomHex(8);\n}\n\nexport function createTraceContext(): TraceContext {\n return {\n traceId: generateTraceId(),\n spanId: generateSpanId(),\n parentSpanId: null,\n sampled: true,\n };\n}\n\nexport function propagateTrace(context: TraceContext): Record<string, string> {\n const sampledFlag = context.sampled ? '01' : '00';\n return {\n traceparent: `00-${context.traceId}-${context.spanId}-${sampledFlag}`,\n tracestate: `sitepong=${context.spanId}`,\n };\n}\n\nexport function extractTrace(headers: Record<string, string>): TraceContext | null {\n const traceparent = headers['traceparent'] || headers['Traceparent'];\n if (!traceparent) {\n return null;\n }\n\n const parts = traceparent.split('-');\n if (parts.length !== 4) {\n return null;\n }\n\n const [version, traceId, parentSpanId, flags] = parts;\n\n if (version !== '00') {\n return null;\n }\n\n if (traceId.length !== 32 || !/^[0-9a-f]{32}$/.test(traceId)) {\n return null;\n }\n\n if (parentSpanId.length !== 16 || !/^[0-9a-f]{16}$/.test(parentSpanId)) {\n return null;\n }\n\n if (flags.length !== 2 || !/^[0-9a-f]{2}$/.test(flags)) {\n return null;\n }\n\n const sampled = (parseInt(flags, 16) & 0x01) === 1;\n\n return {\n traceId,\n spanId: generateSpanId(),\n parentSpanId,\n sampled,\n };\n}\n\nexport class TracePropagator {\n private targets: string[];\n private originalFetch: typeof fetch | null = null;\n\n constructor(targets: string[]) {\n this.targets = targets;\n }\n\n shouldPropagate(url: string): boolean {\n return this.targets.some((pattern) => {\n if (pattern.includes('*')) {\n const escaped = pattern.replace(/[.+?^${}()|[\\]\\\\]/g, '\\\\$&').replace(/\\*/g, '.*');\n const regex = new RegExp(`^${escaped}$`);\n return regex.test(url);\n }\n return url.startsWith(pattern);\n });\n }\n\n injectHeaders(\n url: string,\n headers: Record<string, string>,\n context: TraceContext\n ): Record<string, string> {\n if (!this.shouldPropagate(url)) {\n return headers;\n }\n\n const traceHeaders = propagateTrace(context);\n return {\n ...headers,\n ...traceHeaders,\n };\n }\n\n start(): void {\n if (typeof window === 'undefined' || !window.fetch) {\n return;\n }\n\n if (this.originalFetch) {\n return;\n }\n\n this.originalFetch = window.fetch;\n const self = this;\n\n window.fetch = function (\n input: RequestInfo | URL,\n init?: RequestInit\n ): Promise<Response> {\n const url = typeof input === 'string'\n ? input\n : input instanceof URL\n ? input.toString()\n : input.url;\n\n if (self.shouldPropagate(url)) {\n const context = createTraceContext();\n const traceHeaders = propagateTrace(context);\n\n const existingHeaders: Record<string, string> = {};\n if (init?.headers) {\n if (init.headers instanceof Headers) {\n init.headers.forEach((value, key) => {\n existingHeaders[key] = value;\n });\n } else if (Array.isArray(init.headers)) {\n for (const [key, value] of init.headers) {\n existingHeaders[key] = value;\n }\n } else {\n Object.assign(existingHeaders, init.headers);\n }\n }\n\n const mergedHeaders = {\n ...existingHeaders,\n ...traceHeaders,\n };\n\n const patchedInit: RequestInit = {\n ...init,\n headers: mergedHeaders,\n };\n\n return self.originalFetch!.call(window, input as RequestInfo, patchedInit);\n }\n\n return self.originalFetch!.call(window, input as RequestInfo, init);\n };\n }\n\n stop(): void {\n if (typeof window === 'undefined') {\n return;\n }\n\n if (this.originalFetch) {\n window.fetch = this.originalFetch;\n this.originalFetch = null;\n }\n }\n}\n","/**\n * SuperLink core client — platform-agnostic.\n *\n * Holds the configured endpoint + app context and exposes thin POST helpers\n * for the redirect engine's /match and /events routes. Both the web capture\n * path and the React Native deferred-attribution path share this instance.\n *\n * Uses the global `fetch` (present on browser, RN, and Node 18+) directly to\n * avoid pulling in any DOM-only transport. All network calls are best-effort\n * and never throw.\n */\n\nimport type {\n SuperLinkConfig,\n SuperLinkMatchRequest,\n SuperLinkMatchResponse,\n SuperLinkEventType,\n SuperLinkPlatform,\n SuperLinkMatchType,\n} from './types.js';\n\n/** Default shared short domain / redirect engine. */\nexport const DEFAULT_SUPERLINK_ENDPOINT = 'https://pongl.ink';\n\nexport interface ResolvedSuperLinkConfig {\n endpoint: string;\n appId?: string;\n installId?: string;\n debug: boolean;\n}\n\nexport class SuperLinkClient {\n config: ResolvedSuperLinkConfig;\n\n constructor(config: SuperLinkConfig = {}) {\n this.config = {\n endpoint: stripTrailingSlash(config.endpoint || DEFAULT_SUPERLINK_ENDPOINT),\n appId: config.appId,\n installId: config.installId,\n debug: config.debug ?? false,\n };\n }\n\n /** Replace config in place (used by init() so module-level helpers see updates). */\n configure(config: SuperLinkConfig): void {\n if (config.endpoint) this.config.endpoint = stripTrailingSlash(config.endpoint);\n if (config.appId !== undefined) this.config.appId = config.appId;\n if (config.installId !== undefined) this.config.installId = config.installId;\n if (config.debug !== undefined) this.config.debug = config.debug;\n }\n\n private log(...args: unknown[]): void {\n if (this.config.debug) console.warn('[SuperLink]', ...args);\n }\n\n /**\n * POST /match — ask the redirect engine to resolve a deferred deep link from\n * a click token (Android referrer / iOS clipboard) and/or a device\n * fingerprint. Returns `{ matched: false }` on any error.\n */\n async match(body: SuperLinkMatchRequest): Promise<SuperLinkMatchResponse> {\n const payload: SuperLinkMatchRequest = {\n ...body,\n install_id: body.install_id ?? this.config.installId,\n };\n try {\n const res = await fetch(`${this.config.endpoint}/match`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n });\n if (!res.ok) {\n this.log('match failed', res.status);\n return { matched: false };\n }\n const data = (await res.json()) as SuperLinkMatchResponse;\n return data ?? { matched: false };\n } catch (err) {\n this.log('match error', err);\n return { matched: false };\n }\n }\n\n /**\n * POST /events — report a lifecycle event (opened / converted) back to the\n * redirect engine, which fans out to analytics + webhooks. Best-effort.\n */\n async reportEvent(input: {\n type: SuperLinkEventType;\n click_id?: string | null;\n link_id?: string | null;\n platform?: SuperLinkPlatform;\n match_type?: SuperLinkMatchType;\n properties?: Record<string, unknown>;\n }): Promise<boolean> {\n try {\n const res = await fetch(`${this.config.endpoint}/events`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n app_id: this.config.appId,\n install_id: this.config.installId,\n ...input,\n }),\n });\n if (!res.ok) this.log('event failed', input.type, res.status);\n return res.ok;\n } catch (err) {\n this.log('event error', err);\n return false;\n }\n }\n}\n\nfunction stripTrailingSlash(url: string): string {\n return url.endsWith('/') ? url.slice(0, -1) : url;\n}\n\n/** The process-wide SuperLink client. */\nexport const superlinkClient = new SuperLinkClient();\n","/**\n * SuperLink URL parsing — platform-agnostic.\n *\n * Extracts the deep link payload encoded in a SuperLink URL: the path, any\n * `~`-prefixed deep link data, UTM params, and `r_`-prefixed referral params.\n * Works on both inbound web URLs and Universal Link / App Link opens. Uses the\n * WHATWG `URL`, which is available on browser, RN (Hermes), and Node.\n */\n\nimport type { SuperLinkDeepLink, UtmParams } from './types.js';\n\nconst UTM_KEYS: Array<[keyof UtmParams, string]> = [\n ['source', 'utm_source'],\n ['medium', 'utm_medium'],\n ['campaign', 'utm_campaign'],\n ['term', 'utm_term'],\n ['content', 'utm_content'],\n];\n\n/**\n * Parse a SuperLink (or Universal/App Link) URL into a deep link payload.\n * Returns null if the URL can't be parsed.\n *\n * Conventions carried in the query string:\n * - utm_* → utm\n * - r_<key> → referral (affiliate params)\n * - ~<key> → deep_link_data (Branch-style)\n * - click_id → click token\n * - $deep_link_path / dlp → explicit in-app route override\n */\nexport function parseUniversalLink(url: string): SuperLinkDeepLink | null {\n let parsed: URL;\n try {\n parsed = new URL(url);\n } catch {\n return null;\n }\n\n const params = parsed.searchParams;\n\n const utm: UtmParams = {};\n for (const [key, queryKey] of UTM_KEYS) {\n const value = params.get(queryKey);\n if (value) utm[key] = value;\n }\n\n const referral: Record<string, unknown> = {};\n const deep_link_data: Record<string, unknown> = {};\n params.forEach((value, key) => {\n if (key.startsWith('r_')) {\n referral[key.slice(2)] = value;\n } else if (key.startsWith('~')) {\n deep_link_data[key.slice(1)] = value;\n }\n });\n\n const explicitPath = params.get('$deep_link_path') ?? params.get('dlp');\n const deep_link_path = explicitPath ?? (parsed.pathname && parsed.pathname !== '/' ? parsed.pathname : null);\n\n return {\n deep_link_path,\n deep_link_data,\n utm,\n referral,\n click_id: params.get('click_id'),\n match_type: 'none',\n confidence: 1,\n };\n}\n","/**\n * SuperLink deferred-deep-link registry — platform-agnostic.\n *\n * Holds the shared onDeferredDeepLink handler set, the cached last match, and\n * the SuperLinkMatchResponse → SuperLinkDeepLink normaliser. Both the web/node\n * recovery path (identify / completeFromScan) and the React Native first-launch\n * attribution path emit through here so a single handler set sees every match.\n */\n\nimport type { SuperLinkDeepLink, SuperLinkMatchResponse, DeferredDeepLinkHandler } from './types.js';\nimport { superlinkClient } from './client.js';\n\nconst handlers = new Set<DeferredDeepLinkHandler>();\nlet lastMatched: SuperLinkDeepLink | null = null;\n\n/** Normalise a /match response into the resolved deep-link payload. */\nexport function toDeepLink(res: SuperLinkMatchResponse): SuperLinkDeepLink {\n return {\n deep_link_path: res.deep_link_path ?? null,\n deep_link_data: res.deep_link_data ?? {},\n utm: res.utm ?? {},\n referral: res.referral ?? {},\n click_id: res.click_id ?? null,\n match_type: res.match_type ?? 'fingerprint',\n confidence: res.confidence ?? (res.match_type && res.match_type !== 'none' ? 1 : 0),\n };\n}\n\n/** Fire all registered handlers with a resolved deep link and cache it. */\nexport function emitDeferredDeepLink(link: SuperLinkDeepLink): void {\n lastMatched = link;\n for (const handler of handlers) {\n try {\n handler(link);\n } catch (err) {\n if (superlinkClient.config.debug) console.warn('[SuperLink] handler threw', err);\n }\n }\n}\n\n/**\n * Register a handler fired when a deferred deep link is matched (first-launch\n * attribution, identify(), or completeFromScan()). If a match already happened\n * before registration, the handler is invoked immediately with the cached\n * payload. Returns an unsubscribe fn.\n */\nexport function onDeferredDeepLink(handler: DeferredDeepLinkHandler): () => void {\n handlers.add(handler);\n if (lastMatched) {\n try {\n handler(lastMatched);\n } catch {\n /* ignore */\n }\n }\n return () => {\n handlers.delete(handler);\n };\n}\n\n/** The deferred deep link matched so far this process, if any. */\nexport function getMatchedDeepLink(): SuperLinkDeepLink | null {\n return lastMatched;\n}\n","/* eslint-env browser */\n/**\n * SuperLink web capture.\n *\n * On first load, captures inbound deep-link params from the current location\n * (a direct SuperLink open in the browser, or a query-decorated landing) and\n * exposes them via getDeepLink(). The captured payload is cached for the rest\n * of the session so repeated reads are stable.\n *\n * Guards every `window`/`sessionStorage` access so importing this module from a\n * non-DOM bundle is harmless.\n */\n\nimport type {\n SuperLinkDeepLink,\n SuperLinkIdentityMetadata,\n SuperLinkFingerprint,\n SuperLinkMatchResponse,\n} from './types.js';\nimport { parseUniversalLink } from './parse.js';\nimport { superlinkClient } from './client.js';\nimport { toDeepLink, emitDeferredDeepLink } from './deferred.js';\n\nconst STORAGE_KEY = 'sp_superlink';\n\nlet captured: SuperLinkDeepLink | null = null;\nlet didCapture = false;\n\nfunction readStored(): SuperLinkDeepLink | null {\n if (typeof sessionStorage === 'undefined') return null;\n try {\n const raw = sessionStorage.getItem(STORAGE_KEY);\n if (!raw) return null;\n const parsed = JSON.parse(raw) as SuperLinkDeepLink;\n return parsed && typeof parsed === 'object' ? parsed : null;\n } catch {\n return null;\n }\n}\n\nfunction writeStored(link: SuperLinkDeepLink): void {\n if (typeof sessionStorage === 'undefined') return;\n try {\n sessionStorage.setItem(STORAGE_KEY, JSON.stringify(link));\n } catch {\n /* ignore quota / privacy mode */\n }\n}\n\nfunction hasPayload(link: SuperLinkDeepLink): boolean {\n return Boolean(\n link.deep_link_path ||\n link.click_id ||\n Object.keys(link.deep_link_data).length > 0 ||\n Object.keys(link.referral).length > 0 ||\n Object.keys(link.utm).length > 0\n );\n}\n\n/**\n * Write a click token to the clipboard in URL form, for handoff to iOS app on install.\n * Called by the interstitial right before redirect to App Store.\n */\nexport function writeClipboardToken(clickId: string): void {\n if (typeof navigator === 'undefined' || !navigator.clipboard) return;\n const url = `${superlinkClient.config.endpoint}/c/${clickId}`;\n navigator.clipboard.writeText(url).catch(() => {\n /* ignore errors — best effort */\n });\n}\n\n/**\n * Extract identity metadata from URL query params (?email=&phone=&custom=json).\n * Used to seed the deferred link match with user-provided attributes.\n */\nexport function extractIdentityMetadata(url?: string): SuperLinkIdentityMetadata | undefined {\n const href = url ?? (typeof window !== 'undefined' && window.location ? window.location.href : null);\n if (!href) return undefined;\n\n let loc: URL;\n try {\n loc = new URL(href);\n } catch {\n return undefined;\n }\n\n const email = loc.searchParams.get('email');\n const phone = loc.searchParams.get('phone');\n const userId = loc.searchParams.get('user_id');\n const id = loc.searchParams.get('id');\n const customRaw = loc.searchParams.get('custom');\n\n const identity: SuperLinkIdentityMetadata = {};\n if (email) identity.email = email;\n if (phone) identity.phone = phone;\n if (userId) identity.user_id = userId;\n if (id) identity.id = id;\n\n if (customRaw) {\n try {\n const custom = JSON.parse(decodeURIComponent(customRaw));\n if (typeof custom === 'object' && custom !== null) {\n identity.custom = custom;\n }\n } catch {\n /* ignore malformed custom JSON */\n }\n }\n\n return Object.keys(identity).length > 0 ? identity : undefined;\n}\n\n/**\n * Capture inbound deep-link params from the current page URL. Idempotent: only\n * the first call of the session parses; later calls return the cached payload.\n */\nexport function captureWebDeepLink(): SuperLinkDeepLink | null {\n if (didCapture) return captured;\n didCapture = true;\n\n const stored = readStored();\n if (stored) {\n captured = stored;\n return captured;\n }\n\n if (typeof window === 'undefined' || !window.location) return null;\n\n const link = parseUniversalLink(window.location.href);\n if (link && hasPayload(link)) {\n captured = link;\n writeStored(link);\n // Best-effort: notify the engine that the link opened in a browser.\n void superlinkClient.reportEvent({\n type: 'opened',\n click_id: link.click_id,\n platform: 'desktop',\n properties: { surface: 'web' },\n });\n }\n return captured;\n}\n\n/**\n * Return the captured inbound deep link for this session, capturing lazily on\n * first call. Returns null when no SuperLink params were present.\n */\nexport function getDeepLink(): SuperLinkDeepLink | null {\n if (!didCapture) return captureWebDeepLink();\n return captured;\n}\n\n/** Best-effort web/desktop fingerprint for the probabilistic fallback. */\nfunction webFingerprint(): SuperLinkFingerprint {\n const fp: SuperLinkFingerprint = { platform: 'desktop' };\n if (typeof navigator !== 'undefined') {\n if (navigator.userAgent) fp.user_agent = navigator.userAgent;\n const lang = navigator.language || (navigator.languages && navigator.languages[0]);\n if (lang) fp.language = lang;\n }\n return fp;\n}\n\n/**\n * Recover a deferred deep link AFTER the user provides an email/phone (or other\n * identity) at signup. POSTs /match with { identity, install_id, fingerprint }\n * so the engine can match the supplied identity against an unmatched click's\n * metadata. Fires onDeferredDeepLink on a hit. Returns the resolved deep link,\n * or null. Best-effort: never throws.\n *\n * @example\n * ```ts\n * import { identify } from 'sitepong';\n * await identify({ email: user.email, user_id: user.id });\n * ```\n */\nexport async function identify(\n identity: SuperLinkIdentityMetadata\n): Promise<SuperLinkDeepLink | null> {\n if (!identity || Object.keys(identity).length === 0) return null;\n const res: SuperLinkMatchResponse = await superlinkClient.match({\n identity,\n fingerprint: webFingerprint(),\n });\n if (!res.matched) return null;\n const link = toDeepLink(res);\n emitDeferredDeepLink(link);\n return link;\n}\n\n/**\n * Complete attribution from a scanned QR payload. POSTs /match with\n * { qr_token: scanned, install_id } — the raw scanned string is passed straight\n * through, and the engine parses a click-token URL (/c/<id>), a raw click_id, a\n * link URL (pongl.ink/<slug>), or a bare <slug>. Fires onDeferredDeepLink on a\n * hit. Returns the resolved deep link, or null. Best-effort: never throws.\n *\n * @example\n * ```ts\n * import { completeFromScan } from 'sitepong';\n * const link = await completeFromScan(qrCodeValue);\n * ```\n */\nexport async function completeFromScan(\n scanned: string\n): Promise<SuperLinkDeepLink | null> {\n if (!scanned) return null;\n const res: SuperLinkMatchResponse = await superlinkClient.match({\n qr_token: scanned,\n fingerprint: webFingerprint(),\n });\n if (!res.matched) return null;\n const link = toDeepLink(res);\n emitDeferredDeepLink(link);\n return link;\n}\n","/**\n * SuperLink — deferred deep linking / smart links public surface.\n *\n * Platform-agnostic + web entry points. React Native deferred attribution\n * lives in `src/react-native/superlink.ts` and is exported from\n * `sitepong/react-native` so non-RN bundles never pull in native deps.\n */\n\nimport type { SuperLinkConfig } from './types.js';\nimport { superlinkClient } from './client.js';\nimport { captureWebDeepLink } from './web.js';\n\n/**\n * Configure the SuperLink client. Safe to call on any platform.\n *\n * On web, this also captures any inbound deep-link params from the current\n * URL immediately, so getDeepLink() is populated on first read.\n *\n * @example\n * ```ts\n * import { initSuperLink, getDeepLink } from 'sitepong';\n * initSuperLink({ endpoint: 'https://go.acme.com', appId: 'abc' });\n * const link = getDeepLink();\n * ```\n */\nexport function initSuperLink(config: SuperLinkConfig = {}): void {\n superlinkClient.configure(config);\n // Web: capture inbound params now (no-op off-DOM).\n captureWebDeepLink();\n}\n\nexport { superlinkClient, SuperLinkClient, DEFAULT_SUPERLINK_ENDPOINT } from './client.js';\nexport {\n captureWebDeepLink,\n getDeepLink,\n writeClipboardToken,\n extractIdentityMetadata,\n identify,\n completeFromScan,\n} from './web.js';\nexport { onDeferredDeepLink, getMatchedDeepLink } from './deferred.js';\nexport { parseUniversalLink } from './parse.js';\n\nexport type {\n SuperLinkConfig,\n SuperLinkDeepLink,\n SuperLinkMatchResponse,\n SuperLinkMatchRequest,\n SuperLinkFingerprint,\n SuperLinkPlatform,\n SuperLinkMatchType,\n SuperLinkEventType,\n SuperLinkIdentityMetadata,\n DeferredDeepLinkHandler,\n UtmParams,\n} from './types.js';\n","export interface SitePongConfig {\n apiKey: string;\n endpoint?: string;\n environment?: string;\n release?: string;\n autoCapture?: boolean;\n maxBatchSize?: number;\n flushInterval?: number;\n debug?: boolean;\n}\n\nexport interface ErrorContext {\n user?: {\n id?: string;\n email?: string;\n [key: string]: unknown;\n };\n tags?: Record<string, string>;\n extra?: Record<string, unknown>;\n}\n\nexport interface CapturedError {\n message: string;\n stack?: string;\n type: string;\n timestamp: string;\n url?: string;\n userAgent?: string;\n environment?: string;\n release?: string;\n context?: ErrorContext;\n fingerprint?: string;\n /** Replay session ID if session recording is active */\n replaySessionId?: string;\n}\n\nimport { FlagManager } from './flags';\nimport { AnalyticsManager } from './analytics';\nimport type { TrackProperties, UserTraits, GroupTraits } from './analytics';\nimport type { FingerprintManager } from './fingerprint';\nimport type { VisitorIdResult, DeviceSignals } from './fingerprint';\nimport type { ReplayManager } from './replay';\nimport type { PerformanceManager } from './performance';\nimport type { WebVitals } from './performance';\nimport { CronMonitorManager } from './crons';\nimport type { CronCheckinOptions, CronHandle } from './crons';\nimport { MetricsManager } from './metrics';\nimport type { MetricOptions } from './metrics';\nimport { DatabaseTracker } from './database';\nimport { Profiler } from './profiling';\nimport type { ProfileData } from './profiling';\nimport { RemoteConfigManager } from './remote-config';\nimport type { RemoteConfig } from './remote-config';\nimport { getStorageAdapter, getEnvironment, setEnvironment, setRNGetCurrentScreen } from './utils/platform';\nimport type { StorageAdapter } from './utils/platform';\nimport type { EnvironmentAdapter, Unsubscribe, DeviceInfo } from './adapters/environment';\n\n/**\n * Default-entry fallback environment — auto-detects runtime.\n *\n * The default entry `dist/index.mjs` is what Node consumers hit and what\n * browser consumers hit when their bundler doesn't set the `browser`\n * condition. It detects the runtime at load time and installs the matching\n * env adapter so `import { init, captureError } from 'sitepong'` works the\n * same way on Node and browser, just like pre-refactor.\n *\n * Platform entries (entries/web.ts, entries/rn.ts) call `setEnvironment()`\n * BEFORE importing this module, so they win and this function is a no-op\n * for them.\n */\nfunction installFallbackEnvironment(): void {\n if (getEnvironment()) return;\n\n const g = globalThis as {\n window?: {\n addEventListener?: (t: string, l: (e: unknown) => void) => void;\n removeEventListener?: (t: string, l: (e: unknown) => void) => void;\n location?: { href?: string };\n screen?: { width?: number; height?: number };\n };\n document?: {\n referrer?: string;\n addEventListener?: (t: string, l: () => void) => void;\n removeEventListener?: (t: string, l: () => void) => void;\n visibilityState?: string;\n };\n navigator?: {\n userAgent?: string;\n product?: string;\n sendBeacon?: (url: string, body: Blob) => boolean;\n };\n process?: {\n versions?: { node?: string };\n platform?: string;\n on?: (ev: string, h: (...a: unknown[]) => void) => void;\n off?: (ev: string, h: (...a: unknown[]) => void) => void;\n };\n };\n\n const hasBrowser = typeof g.window !== 'undefined' && typeof g.document !== 'undefined';\n const hasNode = !hasBrowser && !!g.process?.versions?.node;\n const platform: 'browser' | 'node' = hasBrowser ? 'browser' : 'node';\n\n const env: EnvironmentAdapter = {\n platform,\n storage: null,\n getDeviceInfo(): DeviceInfo {\n const info: DeviceInfo = { platform };\n if (g.navigator?.userAgent) info.userAgent = g.navigator.userAgent;\n if (hasBrowser && g.window?.screen) {\n info.screenWidth = g.window.screen.width;\n info.screenHeight = g.window.screen.height;\n }\n if (hasNode && g.process) {\n info.osName = g.process.platform;\n info.osVersion = g.process.versions?.node;\n }\n return info;\n },\n getCurrentUrl() {\n return g.window?.location?.href ?? undefined;\n },\n getReferrer() {\n return g.document?.referrer || undefined;\n },\n getUserAgent() {\n if (g.navigator?.userAgent) return g.navigator.userAgent;\n if (hasNode && g.process) return `SitePong-Node/${g.process.versions?.node} (${g.process.platform})`;\n return undefined;\n },\n onUncaughtError(handler) {\n if (hasBrowser && g.window?.addEventListener) {\n const listener = (event: unknown) =>\n handler((event as { error?: unknown; message?: string }).error || (event as { message?: string }).message);\n g.window.addEventListener('error', listener);\n return () => g.window?.removeEventListener?.('error', listener);\n }\n if (hasNode && g.process?.on && g.process.off) {\n const listener = (err: Error) => handler(err);\n g.process.on('uncaughtException', listener as (...a: unknown[]) => void);\n return () => g.process?.off?.('uncaughtException', listener as (...a: unknown[]) => void);\n }\n return () => {};\n },\n onUnhandledRejection(handler) {\n if (hasBrowser && g.window?.addEventListener) {\n const listener = (event: unknown) => handler((event as { reason?: unknown }).reason);\n g.window.addEventListener('unhandledrejection', listener);\n return () => g.window?.removeEventListener?.('unhandledrejection', listener);\n }\n if (hasNode && g.process?.on && g.process.off) {\n const listener = (reason: unknown) => handler(reason);\n g.process.on('unhandledRejection', listener as (...a: unknown[]) => void);\n return () => g.process?.off?.('unhandledRejection', listener as (...a: unknown[]) => void);\n }\n return () => {};\n },\n onBeforeTerminate(handler) {\n if (hasBrowser && g.window?.addEventListener) {\n g.window.addEventListener('beforeunload', handler as unknown as (e: unknown) => void);\n return () => g.window?.removeEventListener?.('beforeunload', handler as unknown as (e: unknown) => void);\n }\n if (hasNode && g.process?.on && g.process.off) {\n g.process.on('beforeExit', handler as (...a: unknown[]) => void);\n g.process.on('SIGINT', handler as (...a: unknown[]) => void);\n g.process.on('SIGTERM', handler as (...a: unknown[]) => void);\n return () => {\n g.process?.off?.('beforeExit', handler as (...a: unknown[]) => void);\n g.process?.off?.('SIGINT', handler as (...a: unknown[]) => void);\n g.process?.off?.('SIGTERM', handler as (...a: unknown[]) => void);\n };\n }\n return () => {};\n },\n onVisibilityHidden(handler) {\n if (g.document?.addEventListener) {\n const listener = () => {\n if (g.document?.visibilityState === 'hidden') handler();\n };\n g.document.addEventListener('visibilitychange', listener);\n return () => g.document?.removeEventListener?.('visibilitychange', listener);\n }\n return () => {};\n },\n sendBeacon(url, body) {\n if (typeof g.navigator?.sendBeacon !== 'function') return false;\n try {\n return g.navigator.sendBeacon(url, new Blob([body], { type: 'application/json' }));\n } catch {\n return false;\n }\n },\n };\n\n setEnvironment(env);\n}\n\ninstallFallbackEnvironment();\n\n/**\n * Web-only manager factories. The web entry (src/entries/web.ts) registers\n * these; RN and Node entries leave them unset so their bundles never pull\n * in DOM-heavy code like rrweb, PerformanceObserver, or canvas fingerprinting.\n */\nexport interface WebManagerFactories {\n createReplay?: (cfg: Record<string, unknown>) => ReplayManager;\n createFingerprint?: (cfg: Record<string, unknown>) => FingerprintManager;\n createPerformance?: (cfg: Record<string, unknown>) => PerformanceManager;\n}\n\nlet webManagerFactories: WebManagerFactories = {};\n\n/**\n * Platform-entry-only: inject web-only manager factories. Called by\n * src/entries/web.ts. Do not call from app code.\n */\nexport function registerWebManagerFactories(factories: WebManagerFactories): void {\n webManagerFactories = { ...webManagerFactories, ...factories };\n}\n\nconst DEFAULT_ENDPOINT = 'https://ingest.sitepong.com';\nconst DEFAULT_BATCH_SIZE = 10;\nconst DEFAULT_FLUSH_INTERVAL = 5000;\n\nexport interface SitePongInitConfig extends SitePongConfig {\n /** Enable feature flags (default: false) */\n enableFlags?: boolean;\n /** Custom endpoint for flags API (default: uses main endpoint) */\n flagsEndpoint?: string;\n /** Analytics configuration */\n analytics?: {\n enabled?: boolean;\n autocapturePageviews?: boolean;\n autocaptureClicks?: boolean;\n autocaptureForms?: boolean;\n /** Full autocapture configuration (overrides individual autocapture flags) */\n autocapture?: {\n clicks?: boolean;\n forms?: boolean;\n pageviews?: boolean;\n blockSelectors?: string[];\n allowSelectors?: string[];\n } | boolean;\n maxBatchSize?: number;\n flushInterval?: number;\n eventsEndpoint?: string;\n };\n /** Fingerprint / device intelligence configuration */\n fingerprint?: {\n enabled?: boolean;\n extendedSignals?: boolean;\n visitorEndpoint?: string;\n };\n /** Performance monitoring configuration */\n performance?: {\n enabled?: boolean;\n webVitals?: boolean;\n navigationTiming?: boolean;\n resourceTiming?: boolean;\n capturePageLoadTimings?: boolean;\n capturePageRenderTimings?: boolean;\n excludedResourceUrls?: string[];\n resourceNameSanitizer?: (url: string) => string;\n sampleRate?: number;\n flushInterval?: number;\n performanceEndpoint?: string;\n };\n /** Session replay configuration — records a rolling buffer and only sends on error */\n replay?: {\n enabled?: boolean;\n maskInputs?: boolean;\n blockSelector?: string;\n maskSelector?: string;\n sampleRate?: number;\n maxSessionDuration?: number;\n flushInterval?: number;\n replayEndpoint?: string;\n /** Record network requests (XHR/fetch) in the replay timeline */\n recordNetwork?: boolean;\n /** Include request/response headers in network recording */\n captureNetworkHeaders?: boolean;\n /** Record console logs in the replay timeline */\n recordConsole?: boolean;\n /** Which console levels to record (default: all) */\n consoleLevels?: Array<'log' | 'info' | 'warn' | 'error' | 'debug'>;\n /** Rolling buffer duration in ms — how many seconds of replay to keep before an error (default: 20000) */\n bufferDuration?: number;\n };\n /** Cron monitoring configuration */\n crons?: {\n enabled?: boolean;\n };\n /** Custom metrics configuration */\n metrics?: {\n enabled?: boolean;\n flushInterval?: number;\n maxBatchSize?: number;\n };\n /** Database query tracking configuration */\n database?: {\n enabled?: boolean;\n slowQueryThreshold?: number;\n redactParams?: boolean;\n };\n /** Production profiling configuration */\n profiling?: {\n enabled?: boolean;\n sampleRate?: number;\n maxDuration?: number;\n flushInterval?: number;\n };\n /** Remote config options */\n remoteConfig?: {\n enabled?: boolean;\n };\n /** Storage adapter for caching (auto-detected if not provided) */\n _storageAdapter?: StorageAdapter;\n}\n\nconst MAX_FLUSH_FAILURES = 3;\n\nclass SitePongClient {\n private config: Required<Omit<SitePongConfig, 'apiKey'>> & { apiKey: string };\n private errorQueue: CapturedError[] = [];\n private flushTimer: ReturnType<typeof setTimeout> | null = null;\n private context: ErrorContext = {};\n private initialized = false;\n private flushFailures = 0;\n private disabled = false;\n private flagManager: FlagManager | null = null;\n private analyticsManager: AnalyticsManager | null = null;\n private fingerprintManager: FingerprintManager | null = null;\n private replayManager: ReplayManager | null = null;\n private performanceManager: PerformanceManager | null = null;\n private cronManager: CronMonitorManager | null = null;\n private metricsManager: MetricsManager | null = null;\n private databaseTracker: DatabaseTracker | null = null;\n private profiler: Profiler | null = null;\n private remoteConfigManager: RemoteConfigManager | null = null;\n private currentScreen?: string;\n private envUnsubs: Unsubscribe[] = [];\n private identifyHooks: Array<(userId: string) => void> = [];\n\n constructor() {\n this.config = {\n apiKey: '',\n endpoint: DEFAULT_ENDPOINT,\n environment: 'production',\n release: '',\n autoCapture: true,\n maxBatchSize: DEFAULT_BATCH_SIZE,\n flushInterval: DEFAULT_FLUSH_INTERVAL,\n debug: false,\n };\n }\n\n init(config: SitePongInitConfig): void {\n if (!config.apiKey) {\n console.error('[SitePong] API key is required');\n return;\n }\n\n this.config = {\n ...this.config,\n ...config,\n };\n\n this.initialized = true;\n\n if (this.config.autoCapture) {\n this.setupAutoCapture();\n }\n\n this.startFlushTimer();\n this.log('Initialized with endpoint:', this.config.endpoint);\n\n // Initialize flags if enabled\n if (config.enableFlags) {\n this.flagManager = new FlagManager({\n apiKey: config.apiKey,\n endpoint: config.flagsEndpoint || config.endpoint || DEFAULT_ENDPOINT,\n debug: config.debug,\n });\n // Start flag initialization (non-blocking)\n this.flagManager.init().catch((err) => {\n this.log('Failed to initialize flags:', err);\n });\n }\n\n // Initialize analytics if enabled\n if (config.analytics?.enabled) {\n if (this.analyticsManager) {\n this.analyticsManager.destroy();\n }\n this.analyticsManager = new AnalyticsManager({\n apiKey: config.apiKey,\n endpoint: config.endpoint || DEFAULT_ENDPOINT,\n enabled: true,\n autocapturePageviews: config.analytics.autocapturePageviews,\n autocaptureClicks: config.analytics.autocaptureClicks,\n autocaptureForms: config.analytics.autocaptureForms,\n autocapture: config.analytics.autocapture,\n maxBatchSize: config.analytics.maxBatchSize,\n flushInterval: config.analytics.flushInterval,\n eventsEndpoint: config.analytics.eventsEndpoint,\n debug: config.debug,\n });\n this.analyticsManager.init();\n }\n\n // Initialize fingerprint if enabled (web-only factory)\n if (config.fingerprint?.enabled && webManagerFactories.createFingerprint) {\n this.fingerprintManager = webManagerFactories.createFingerprint({\n apiKey: config.apiKey,\n endpoint: config.endpoint || DEFAULT_ENDPOINT,\n enabled: true,\n extendedSignals: config.fingerprint.extendedSignals,\n visitorEndpoint: config.fingerprint.visitorEndpoint,\n debug: config.debug,\n });\n } else if (config.fingerprint?.enabled) {\n this.log('Fingerprint requested but not available on this platform (web only).');\n }\n\n // Initialize performance monitoring if enabled (web-only factory)\n if (config.performance?.enabled && webManagerFactories.createPerformance) {\n if (this.performanceManager) {\n this.performanceManager.destroy();\n }\n this.performanceManager = webManagerFactories.createPerformance({\n apiKey: config.apiKey,\n endpoint: config.endpoint || DEFAULT_ENDPOINT,\n enabled: true,\n webVitals: config.performance.webVitals,\n navigationTiming: config.performance.navigationTiming,\n resourceTiming: config.performance.resourceTiming,\n capturePageLoadTimings: config.performance.capturePageLoadTimings,\n capturePageRenderTimings: config.performance.capturePageRenderTimings,\n excludedResourceUrls: config.performance.excludedResourceUrls,\n resourceNameSanitizer: config.performance.resourceNameSanitizer,\n sampleRate: config.performance.sampleRate,\n flushInterval: config.performance.flushInterval,\n performanceEndpoint: config.performance.performanceEndpoint,\n debug: config.debug,\n });\n this.performanceManager.init();\n } else if (config.performance?.enabled) {\n this.log('Performance requested but not available on this platform (web only).');\n }\n\n // Initialize session replay if enabled (web-only factory)\n if (config.replay?.enabled && webManagerFactories.createReplay) {\n // Stop previous replay manager if re-initialized (e.g. React Strict Mode)\n if (this.replayManager) {\n this.replayManager.stop();\n }\n this.replayManager = webManagerFactories.createReplay({\n apiKey: config.apiKey,\n endpoint: config.endpoint || DEFAULT_ENDPOINT,\n enabled: true,\n maskInputs: config.replay.maskInputs,\n blockSelector: config.replay.blockSelector,\n maskSelector: config.replay.maskSelector,\n sampleRate: config.replay.sampleRate,\n maxSessionDuration: config.replay.maxSessionDuration,\n flushInterval: config.replay.flushInterval,\n replayEndpoint: config.replay.replayEndpoint,\n recordNetwork: config.replay.recordNetwork,\n captureNetworkHeaders: config.replay.captureNetworkHeaders,\n recordConsole: config.replay.recordConsole,\n consoleLevels: config.replay.consoleLevels,\n bufferDuration: config.replay.bufferDuration,\n debug: config.debug,\n });\n // Auto-start recording\n this.replayManager.start();\n } else if (config.replay?.enabled) {\n this.log('Replay requested but not available on this platform (web only).');\n }\n\n // Initialize cron monitoring if enabled\n if (config.crons?.enabled) {\n this.cronManager = new CronMonitorManager({\n apiKey: config.apiKey,\n endpoint: config.endpoint || DEFAULT_ENDPOINT,\n debug: config.debug,\n });\n }\n\n // Initialize database query tracking if enabled\n if (config.database?.enabled) {\n this.databaseTracker = new DatabaseTracker({\n apiKey: config.apiKey,\n endpoint: config.endpoint || DEFAULT_ENDPOINT,\n debug: config.debug,\n slowQueryThreshold: config.database.slowQueryThreshold,\n redactParams: config.database.redactParams,\n });\n }\n\n // Initialize custom metrics if enabled\n if (config.metrics?.enabled) {\n this.metricsManager = new MetricsManager({\n apiKey: config.apiKey,\n endpoint: config.endpoint || DEFAULT_ENDPOINT,\n debug: config.debug,\n flushInterval: config.metrics.flushInterval,\n maxBatchSize: config.metrics.maxBatchSize,\n });\n }\n\n // Initialize profiling if enabled\n if (config.profiling?.enabled) {\n this.profiler = new Profiler({\n apiKey: config.apiKey,\n endpoint: config.endpoint || DEFAULT_ENDPOINT,\n debug: config.debug,\n sampleRate: config.profiling.sampleRate,\n maxDuration: config.profiling.maxDuration,\n flushInterval: config.profiling.flushInterval,\n });\n }\n\n // Initialize remote config if enabled\n if (config.remoteConfig?.enabled !== false) {\n const storage = config._storageAdapter || getStorageAdapter();\n this.remoteConfigManager = new RemoteConfigManager({\n apiKey: config.apiKey,\n endpoint: config.endpoint || DEFAULT_ENDPOINT,\n storage,\n debug: config.debug,\n });\n this.remoteConfigManager.init().catch((err) => {\n this.log('Failed to initialize remote config:', err);\n });\n }\n\n }\n\n /**\n * Initialize SDK for React Native — only starts platform-agnostic subsystems.\n * Skips: FingerprintManager, ReplayManager, PerformanceManager, browser autocapture,\n * window event listeners (beforeunload, visibilitychange).\n */\n initRN(config: SitePongInitConfig): void {\n if (!config.apiKey) {\n console.error('[SitePong] API key is required');\n return;\n }\n\n this.config = {\n ...this.config,\n ...config,\n };\n\n this.initialized = true;\n\n // Flush timer only — no beforeunload / visibilitychange listeners\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n }\n this.flushTimer = setInterval(() => {\n this.flush();\n }, this.config.flushInterval);\n\n this.log('Initialized (React Native) with endpoint:', this.config.endpoint);\n\n // Feature flags\n if (config.enableFlags) {\n this.flagManager = new FlagManager({\n apiKey: config.apiKey,\n endpoint: config.flagsEndpoint || config.endpoint || DEFAULT_ENDPOINT,\n debug: config.debug,\n });\n this.flagManager.init().catch((err) => {\n this.log('Failed to initialize flags:', err);\n });\n }\n\n // Analytics — headless mode (no SPA tracking, no DOM autocapture, no page-hide listener)\n if (config.analytics?.enabled) {\n if (this.analyticsManager) {\n this.analyticsManager.destroy();\n }\n this.analyticsManager = new AnalyticsManager({\n apiKey: config.apiKey,\n endpoint: config.endpoint || DEFAULT_ENDPOINT,\n enabled: true,\n maxBatchSize: config.analytics.maxBatchSize,\n flushInterval: config.analytics.flushInterval,\n eventsEndpoint: config.analytics.eventsEndpoint,\n debug: config.debug,\n });\n this.analyticsManager.initHeadless();\n }\n\n // Cron monitoring\n if (config.crons?.enabled) {\n this.cronManager = new CronMonitorManager({\n apiKey: config.apiKey,\n endpoint: config.endpoint || DEFAULT_ENDPOINT,\n debug: config.debug,\n });\n }\n\n // Custom metrics\n if (config.metrics?.enabled) {\n this.metricsManager = new MetricsManager({\n apiKey: config.apiKey,\n endpoint: config.endpoint || DEFAULT_ENDPOINT,\n debug: config.debug,\n flushInterval: config.metrics.flushInterval,\n maxBatchSize: config.metrics.maxBatchSize,\n });\n }\n\n // Database query tracking\n if (config.database?.enabled) {\n this.databaseTracker = new DatabaseTracker({\n apiKey: config.apiKey,\n endpoint: config.endpoint || DEFAULT_ENDPOINT,\n debug: config.debug,\n slowQueryThreshold: config.database.slowQueryThreshold,\n redactParams: config.database.redactParams,\n });\n }\n\n // Profiling\n if (config.profiling?.enabled) {\n this.profiler = new Profiler({\n apiKey: config.apiKey,\n endpoint: config.endpoint || DEFAULT_ENDPOINT,\n debug: config.debug,\n sampleRate: config.profiling.sampleRate,\n maxDuration: config.profiling.maxDuration,\n flushInterval: config.profiling.flushInterval,\n });\n }\n\n // Remote config\n if (config.remoteConfig?.enabled !== false) {\n const storage = config._storageAdapter || getStorageAdapter();\n this.remoteConfigManager = new RemoteConfigManager({\n apiKey: config.apiKey,\n endpoint: config.endpoint || DEFAULT_ENDPOINT,\n storage,\n debug: config.debug,\n });\n this.remoteConfigManager.init().catch((err) => {\n this.log('Failed to initialize remote config:', err);\n });\n }\n }\n\n /**\n * Check if the SDK is initialized\n */\n isInitialized(): boolean {\n return this.initialized;\n }\n\n /**\n * Get a feature flag value\n * Returns the cached evaluated result or default value\n */\n getFlag(key: string, defaultValue = false): boolean {\n if (!this.flagManager) {\n this.log('Flags not enabled. Set enableFlags: true in init()');\n return defaultValue;\n }\n return this.flagManager.getFlag(key, defaultValue);\n }\n\n /**\n * Get all feature flag values\n */\n getAllFlags(): Record<string, boolean> {\n if (!this.flagManager) {\n return {};\n }\n return this.flagManager.getAllFlags();\n }\n\n /**\n * Wait for flags to be initialized\n */\n async waitForFlags(): Promise<void> {\n if (!this.flagManager) {\n return;\n }\n await this.flagManager.waitForInit();\n }\n\n /**\n * Check if flags are ready\n */\n areFlagsReady(): boolean {\n return this.flagManager?.isInitialized() ?? false;\n }\n\n /**\n * Get a multivariate flag variant\n * Returns the assigned variant key or the default value\n */\n getVariant(key: string, defaultValue: string | null = null): string | null {\n if (!this.flagManager) {\n this.log('Flags not enabled. Set enableFlags: true in init()');\n return defaultValue;\n }\n return this.flagManager.getVariant(key, defaultValue);\n }\n\n /**\n * Get the payload for a multivariate flag's assigned variant\n */\n getVariantPayload<T = unknown>(key: string, defaultValue: T | null = null): T | null {\n if (!this.flagManager) {\n return defaultValue;\n }\n return this.flagManager.getVariantPayload<T>(key, defaultValue);\n }\n\n /**\n * Force refresh flags from the server\n */\n async refreshFlags(): Promise<void> {\n if (!this.flagManager) {\n return;\n }\n await this.flagManager.refresh();\n }\n\n // --- Analytics (Tier 4) ---\n\n track(eventName: string, properties?: TrackProperties): void {\n if (!this.analyticsManager) {\n this.log('Analytics not enabled. Set analytics.enabled: true in init()');\n return;\n }\n this.analyticsManager.track(eventName, properties);\n }\n\n trackPageView(url?: string, properties?: TrackProperties): void {\n if (!this.analyticsManager) {\n this.log('Analytics not enabled. Set analytics.enabled: true in init()');\n return;\n }\n this.analyticsManager.trackPageView(url, properties);\n }\n\n identify(userId: string, traits?: UserTraits): void {\n if (this.replayManager) {\n this.replayManager.setUser({ id: userId });\n }\n // Notify any platform-registered identify hooks (e.g. RN push re-registration).\n for (const hook of this.identifyHooks) {\n try {\n hook(userId);\n } catch (err) {\n this.log('identify hook failed:', err);\n }\n }\n if (!this.analyticsManager) {\n this.log('Analytics not enabled. Set analytics.enabled: true in init()');\n return;\n }\n this.analyticsManager.identify(userId, traits);\n }\n\n /**\n * Register a callback invoked whenever identify(userId) is called.\n * Used by platform entries (e.g. RN) to wire side effects like push re-registration.\n */\n registerIdentifyHook(hook: (userId: string) => void): () => void {\n this.identifyHooks.push(hook);\n return () => {\n const idx = this.identifyHooks.indexOf(hook);\n if (idx >= 0) this.identifyHooks.splice(idx, 1);\n };\n }\n\n group(groupId: string, traits?: GroupTraits): void {\n if (!this.analyticsManager) {\n this.log('Analytics not enabled. Set analytics.enabled: true in init()');\n return;\n }\n this.analyticsManager.group(groupId, traits);\n }\n\n resetAnalytics(): void {\n if (!this.analyticsManager) {\n return;\n }\n this.analyticsManager.reset();\n }\n\n // --- Fingerprint (Tier 5) ---\n\n async getVisitorId(): Promise<VisitorIdResult> {\n if (!this.fingerprintManager) {\n throw new Error('Fingerprint not enabled. Set fingerprint.enabled: true in init()');\n }\n return this.fingerprintManager.getVisitorId();\n }\n\n async getDeviceSignals(): Promise<DeviceSignals> {\n if (!this.fingerprintManager) {\n throw new Error('Fingerprint not enabled. Set fingerprint.enabled: true in init()');\n }\n return this.fingerprintManager.getDeviceSignals();\n }\n\n async getFraudCheck() {\n if (!this.fingerprintManager) {\n throw new Error('Fingerprint not enabled. Set fingerprint.enabled: true in init()');\n }\n return this.fingerprintManager.getFraudCheck();\n }\n\n // --- Session Replay (Tier 6) ---\n\n startReplay(): boolean {\n if (!this.replayManager) {\n this.log('Replay not enabled. Set replay.enabled: true in init()');\n return false;\n }\n return this.replayManager.start();\n }\n\n stopReplay(): void {\n if (!this.replayManager) return;\n this.replayManager.stop();\n }\n\n isReplayRecording(): boolean {\n return this.replayManager?.isRecording() ?? false;\n }\n\n getReplaySessionId(): string | null {\n return this.replayManager?.getSessionId() ?? null;\n }\n\n // --- Performance (Tier 7) ---\n\n startTransaction(name: string, data?: Record<string, unknown>): string {\n if (!this.performanceManager) {\n this.log('Performance not enabled. Set performance.enabled: true in init()');\n return '';\n }\n return this.performanceManager.startTransaction(name, data);\n }\n\n endTransaction(id: string, status: 'ok' | 'error' = 'ok'): void {\n if (!this.performanceManager) return;\n this.performanceManager.endTransaction(id, status);\n }\n\n startSpan(transactionId: string, name: string, data?: Record<string, unknown>): string {\n if (!this.performanceManager) return '';\n return this.performanceManager.startSpan(transactionId, name, data);\n }\n\n endSpan(transactionId: string, spanId: string, status: 'ok' | 'error' = 'ok'): void {\n if (!this.performanceManager) return;\n this.performanceManager.endSpan(transactionId, spanId, status);\n }\n\n getWebVitals(): WebVitals {\n if (!this.performanceManager) return {};\n return this.performanceManager.getVitals();\n }\n\n // --- Cron Monitor methods ---\n\n cronCheckin(slug: string, options?: CronCheckinOptions): Promise<void> {\n if (!this.cronManager) {\n this.log('Cron monitoring not enabled. Set crons.enabled: true in init()');\n return Promise.resolve();\n }\n return this.cronManager.checkin(slug, options);\n }\n\n cronStart(slug: string, environment?: string): CronHandle {\n if (!this.cronManager) {\n this.log('Cron monitoring not enabled. Set crons.enabled: true in init()');\n return { ok: () => Promise.resolve(), error: () => Promise.resolve() };\n }\n return this.cronManager.start(slug, environment);\n }\n\n cronWrap<T>(slug: string, fn: () => Promise<T>, environment?: string): Promise<T> {\n if (!this.cronManager) {\n return fn();\n }\n return this.cronManager.wrap(slug, fn, environment);\n }\n\n // --- Custom Metrics methods ---\n\n metricIncrement(name: string, value?: number, options?: MetricOptions): void {\n if (!this.metricsManager) {\n this.log('Metrics not enabled. Set metrics.enabled: true in init()');\n return;\n }\n this.metricsManager.increment(name, value, options);\n }\n\n metricGauge(name: string, value: number, options?: MetricOptions): void {\n if (!this.metricsManager) return;\n this.metricsManager.gauge(name, value, options);\n }\n\n metricHistogram(name: string, value: number, options?: MetricOptions): void {\n if (!this.metricsManager) return;\n this.metricsManager.histogram(name, value, options);\n }\n\n metricDistribution(name: string, value: number, options?: MetricOptions): void {\n if (!this.metricsManager) return;\n this.metricsManager.distribution(name, value, options);\n }\n\n async metricTime<T>(name: string, fn: () => Promise<T>, options?: MetricOptions): Promise<T> {\n if (!this.metricsManager) return fn();\n return this.metricsManager.time(name, fn, options);\n }\n\n metricStartTimer(name: string, options?: MetricOptions): { stop: () => void } {\n if (!this.metricsManager) return { stop: () => {} };\n return this.metricsManager.startTimer(name, options);\n }\n\n async flushMetrics(): Promise<void> {\n if (!this.metricsManager) return;\n return this.metricsManager.flush();\n }\n\n // --- Database Query Tracking methods ---\n\n async dbTrack<T>(query: string, fn: () => Promise<T>, source?: string): Promise<T> {\n if (!this.databaseTracker) return fn();\n return this.databaseTracker.track(query, fn, source);\n }\n\n dbTrackSync<T>(query: string, fn: () => T, source?: string): T {\n if (!this.databaseTracker) return fn();\n return this.databaseTracker.trackSync(query, fn, source);\n }\n\n getDbQueryCount(): number {\n if (!this.databaseTracker) return 0;\n return this.databaseTracker.getQueryCount();\n }\n\n resetDbQueryCount(): void {\n if (this.databaseTracker) this.databaseTracker.resetQueryCount();\n }\n\n getDbNPlusOnePatterns(): Array<{ query: string; count: number }> {\n if (!this.databaseTracker) return [];\n return this.databaseTracker.getNPlusOnePatterns();\n }\n\n // --- Profiling methods ---\n\n async profile<T>(name: string, fn: () => Promise<T>, metadata?: Record<string, unknown>): Promise<T> {\n if (!this.profiler) return fn();\n return this.profiler.profile(name, fn, metadata);\n }\n\n startProfileSpan(name: string, metadata?: Record<string, unknown>): () => void {\n if (!this.profiler) return () => {};\n return this.profiler.startSpan(name, metadata);\n }\n\n getProfiles(): ProfileData[] {\n if (!this.profiler) return [];\n return this.profiler.getProfiles();\n }\n\n getLatestProfile(): ProfileData | null {\n if (!this.profiler) return null;\n return this.profiler.getLatestProfile();\n }\n\n async flushProfiles(): Promise<void> {\n if (!this.profiler) return;\n return this.profiler.flush();\n }\n\n // --- Remote Config ---\n\n getRemoteConfig(): RemoteConfig | null {\n return this.remoteConfigManager?.getConfig() ?? null;\n }\n\n isRemoteConfigFeatureEnabled(key: string, defaultValue = true): boolean {\n return this.remoteConfigManager?.isFeatureEnabled(key, defaultValue) ?? defaultValue;\n }\n\n onRemoteConfigChange(listener: (config: RemoteConfig) => void): () => void {\n if (!this.remoteConfigManager) {\n return () => {};\n }\n return this.remoteConfigManager.onChange(listener);\n }\n\n setContext(context: ErrorContext): void {\n this.context = { ...this.context, ...context };\n }\n\n setUser(user: ErrorContext['user']): void {\n this.context.user = user;\n if (this.replayManager) {\n this.replayManager.setUser(user ? { id: user.id } : null);\n }\n }\n\n setTags(tags: Record<string, string>): void {\n this.context.tags = { ...this.context.tags, ...tags };\n }\n\n clearUser(): void {\n this.context.user = undefined;\n if (this.replayManager) {\n this.replayManager.setUser(null);\n }\n }\n\n addBreadcrumb(breadcrumb: {\n type?: 'default' | 'http' | 'navigation' | 'ui' | 'console' | 'error';\n category?: string;\n message?: string;\n level?: 'fatal' | 'error' | 'warning' | 'info' | 'debug';\n data?: Record<string, unknown>;\n }): void {\n // Breadcrumbs are stored in the replay manager if enabled\n this.log('Breadcrumb added:', breadcrumb);\n }\n\n captureError(error: Error | string, additionalContext?: ErrorContext): void {\n if (!this.initialized) {\n console.warn('[SitePong] SDK not initialized. Call init() first.');\n return;\n }\n\n const capturedError = this.formatError(error, additionalContext);\n this.errorQueue.push(capturedError);\n this.log('Captured error:', capturedError.message);\n\n // Trigger replay buffer flush — sends the last N seconds of recording\n if (this.replayManager?.isRecording()) {\n this.replayManager.flushOnError().catch((err) => {\n this.log('Failed to flush replay on error:', err);\n });\n }\n\n if (this.errorQueue.length >= this.config.maxBatchSize) {\n this.flush();\n }\n }\n\n captureMessage(message: string, level: 'info' | 'warning' | 'error' = 'info', additionalContext?: ErrorContext): void {\n if (!this.initialized) {\n console.warn('[SitePong] SDK not initialized. Call init() first.');\n return;\n }\n\n const capturedError: CapturedError = {\n message,\n type: level,\n timestamp: new Date().toISOString(),\n url: this.getUrl(),\n userAgent: this.getUserAgent(),\n environment: this.config.environment,\n release: this.config.release,\n context: { ...this.context, ...additionalContext },\n replaySessionId: this.replayManager?.isRecording() ? this.replayManager.getSessionId() || undefined : undefined,\n };\n\n this.errorQueue.push(capturedError);\n this.log('Captured message:', message);\n\n if (this.errorQueue.length >= this.config.maxBatchSize) {\n this.flush();\n }\n }\n\n async flush(): Promise<void> {\n if (this.errorQueue.length === 0) {\n return;\n }\n\n // If disabled due to too many failures, drop events silently\n if (this.disabled) {\n this.errorQueue = [];\n return;\n }\n\n const errors = [...this.errorQueue];\n this.errorQueue = [];\n\n try {\n const response = await fetch(`${this.config.endpoint}/api/errors/batch`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-API-Key': this.config.apiKey,\n },\n body: JSON.stringify({ errors }),\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}`);\n }\n\n // Reset failure counter on success\n this.flushFailures = 0;\n this.log(`Flushed ${errors.length} errors`);\n } catch (err) {\n this.flushFailures++;\n\n if (this.flushFailures >= MAX_FLUSH_FAILURES) {\n // Disable SDK after too many failures\n this.disabled = true;\n console.warn(\n `[SitePong] SDK disabled after ${MAX_FLUSH_FAILURES} consecutive failures. ` +\n `Events will no longer be sent. This may be due to CORS issues or network problems. ` +\n `Check that ${this.config.endpoint} is accessible and has proper CORS headers.`\n );\n // Don't re-queue - just drop the events\n return;\n }\n\n // Re-queue errors for retry (up to MAX_FLUSH_FAILURES times)\n this.errorQueue.unshift(...errors);\n this.log(`Failed to flush errors (attempt ${this.flushFailures}/${MAX_FLUSH_FAILURES}):`, err);\n }\n }\n\n private formatError(error: Error | string, additionalContext?: ErrorContext): CapturedError {\n const isError = error instanceof Error;\n const message = isError ? error.message : String(error);\n const stack = isError ? error.stack : new Error(message).stack;\n const type = isError ? error.name : 'Error';\n\n return {\n message,\n stack,\n type,\n timestamp: new Date().toISOString(),\n url: this.getUrl(),\n userAgent: this.getUserAgent(),\n environment: this.config.environment,\n release: this.config.release,\n context: { ...this.context, ...additionalContext },\n fingerprint: this.generateFingerprint(message, stack, type),\n replaySessionId: this.replayManager?.isRecording() ? this.replayManager.getSessionId() || undefined : undefined,\n };\n }\n\n /**\n * Generate a fingerprint matching the server-side algorithm.\n * Groups by: error type + normalized message + top stack frame.\n */\n private generateFingerprint(message: string, stack?: string, type?: string): string {\n const errorType = type || 'Error';\n const normalizedMsg = this.normalizeMessage(message);\n const topFrame = stack ? this.extractTopFrame(stack) : '';\n\n const input = [errorType, normalizedMsg, topFrame].join('\\n');\n\n // Sync hash matching server's SHA-256 truncated to 16 hex chars.\n // We use a fast 53-bit hash here (FNV-1a) since the server is the\n // authoritative source and will recompute with SHA-256 on ingest.\n let h = 0x811c9dc5;\n for (let i = 0; i < input.length; i++) {\n h ^= input.charCodeAt(i);\n h = Math.imul(h, 0x01000193);\n }\n return (h >>> 0).toString(16).padStart(8, '0');\n }\n\n private normalizeMessage(message: string): string {\n return message\n .replace(\n /[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/gi,\n '<uuid>'\n )\n .replace(/\\b0x[0-9a-f]{4,}\\b/gi, '<hex>')\n .replace(/\\b[0-9a-f]{8,}\\b/gi, '<hex>')\n .replace(/https?:\\/\\/[^\\s)\"']+/g, '<url>')\n .replace(/\\b\\d+(\\.\\d+)?\\b/g, '<n>')\n .replace(/\\s+/g, ' ')\n .trim();\n }\n\n private extractTopFrame(stack: string): string {\n const lines = stack.split('\\n');\n for (let i = 1; i < lines.length; i++) {\n const line = lines[i].trim();\n if (line && (line.startsWith('at ') || /^\\w+@/.test(line))) {\n return line.replace(/:\\d+\\)?\\s*$/, ')');\n }\n }\n return '';\n }\n\n private setupAutoCapture(): void {\n const env = getEnvironment();\n if (!env) return;\n\n this.envUnsubs.push(\n env.onUncaughtError((err) => {\n const error = err instanceof Error ? err : new Error(String(err));\n this.captureError(error);\n })\n );\n\n this.envUnsubs.push(\n env.onUnhandledRejection((reason) => {\n const error = reason instanceof Error\n ? reason\n : new Error(String(reason));\n this.captureError(error);\n })\n );\n\n this.log('Auto-capture enabled for', env.platform);\n }\n\n private startFlushTimer(): void {\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n }\n\n this.flushTimer = setInterval(() => {\n this.flush();\n }, this.config.flushInterval);\n\n const env = getEnvironment();\n if (!env) return;\n\n this.envUnsubs.push(env.onBeforeTerminate(() => this.flush()));\n this.envUnsubs.push(env.onVisibilityHidden(() => this.flushWithBeacon()));\n }\n\n private flushWithBeacon(): void {\n if (this.errorQueue.length === 0) return;\n const env = getEnvironment();\n if (!env || !env.sendBeacon) return;\n\n const errors = [...this.errorQueue];\n this.errorQueue = [];\n\n const body = JSON.stringify({ errors, apiKey: this.config.apiKey });\n const ok = env.sendBeacon(`${this.config.endpoint}/api/errors/batch`, body);\n if (ok) {\n this.log(`Flushed ${errors.length} errors via beacon`);\n } else {\n // Re-queue if beacon couldn't send\n this.errorQueue.unshift(...errors);\n }\n }\n\n setCurrentScreen(name: string | undefined): void {\n this.currentScreen = name;\n // Route the screen name through the RN env so shared code that calls\n // env.getCurrentUrl() (e.g. error capture) sees the same value.\n setRNGetCurrentScreen(() => this.currentScreen);\n }\n\n private getUrl(): string | undefined {\n const env = getEnvironment();\n if (!env) return this.currentScreen ?? undefined;\n return env.getCurrentUrl() ?? this.currentScreen ?? undefined;\n }\n\n private getUserAgent(): string | undefined {\n const env = getEnvironment();\n if (!env) return undefined;\n return env.getUserAgent();\n }\n\n private log(...args: unknown[]): void {\n if (this.config.debug) {\n console.log('[SitePong]', ...args);\n }\n }\n}\n\n// Singleton instance\nconst sitepong = new SitePongClient();\n\n// Named exports\nexport const init = sitepong.init.bind(sitepong);\nexport const initRN = sitepong.initRN.bind(sitepong);\nexport const captureError = sitepong.captureError.bind(sitepong);\nexport const captureMessage = sitepong.captureMessage.bind(sitepong);\nexport const setContext = sitepong.setContext.bind(sitepong);\nexport const setUser = sitepong.setUser.bind(sitepong);\nexport const setTags = sitepong.setTags.bind(sitepong);\nexport const flush = sitepong.flush.bind(sitepong);\nexport const isInitialized = sitepong.isInitialized.bind(sitepong);\nexport const clearUser = sitepong.clearUser.bind(sitepong);\nexport const addBreadcrumb = sitepong.addBreadcrumb.bind(sitepong);\nexport const setCurrentScreen = sitepong.setCurrentScreen.bind(sitepong);\nexport { sitepong as client };\n\n// Feature flags exports\nexport const getFlag = sitepong.getFlag.bind(sitepong);\nexport const getAllFlags = sitepong.getAllFlags.bind(sitepong);\nexport const getVariant = sitepong.getVariant.bind(sitepong);\nexport const getVariantPayload = sitepong.getVariantPayload.bind(sitepong);\nexport const waitForFlags = sitepong.waitForFlags.bind(sitepong);\nexport const areFlagsReady = sitepong.areFlagsReady.bind(sitepong);\nexport const refreshFlags = sitepong.refreshFlags.bind(sitepong);\n\n// Analytics exports (Tier 4)\nexport const track = sitepong.track.bind(sitepong);\nexport const trackPageView = sitepong.trackPageView.bind(sitepong);\nexport const identify = sitepong.identify.bind(sitepong);\nexport const group = sitepong.group.bind(sitepong);\nexport const resetAnalytics = sitepong.resetAnalytics.bind(sitepong);\n\n// Fingerprint exports (Tier 5)\nexport const getVisitorId = sitepong.getVisitorId.bind(sitepong);\nexport const getDeviceSignals = sitepong.getDeviceSignals.bind(sitepong);\nexport const getFraudCheck = sitepong.getFraudCheck.bind(sitepong);\n\n// Session Replay exports (Tier 6)\nexport const startReplay = sitepong.startReplay.bind(sitepong);\nexport const stopReplay = sitepong.stopReplay.bind(sitepong);\nexport const isReplayRecording = sitepong.isReplayRecording.bind(sitepong);\nexport const getReplaySessionId = sitepong.getReplaySessionId.bind(sitepong);\n\n// Performance exports (Tier 7)\nexport const startTransaction = sitepong.startTransaction.bind(sitepong);\nexport const endTransaction = sitepong.endTransaction.bind(sitepong);\nexport const startSpan = sitepong.startSpan.bind(sitepong);\nexport const endSpan = sitepong.endSpan.bind(sitepong);\nexport const getWebVitals = sitepong.getWebVitals.bind(sitepong);\n\n// Database query tracking exports\nexport const dbTrack = sitepong.dbTrack.bind(sitepong);\nexport const dbTrackSync = sitepong.dbTrackSync.bind(sitepong);\nexport const getDbQueryCount = sitepong.getDbQueryCount.bind(sitepong);\nexport const resetDbQueryCount = sitepong.resetDbQueryCount.bind(sitepong);\nexport const getDbNPlusOnePatterns = sitepong.getDbNPlusOnePatterns.bind(sitepong);\n\n// Cron monitoring exports\nexport const cronCheckin = sitepong.cronCheckin.bind(sitepong);\nexport const cronStart = sitepong.cronStart.bind(sitepong);\nexport const cronWrap = sitepong.cronWrap.bind(sitepong);\n\n// Custom metrics exports\nexport const metricIncrement = sitepong.metricIncrement.bind(sitepong);\nexport const metricGauge = sitepong.metricGauge.bind(sitepong);\nexport const metricHistogram = sitepong.metricHistogram.bind(sitepong);\nexport const metricDistribution = sitepong.metricDistribution.bind(sitepong);\nexport const metricTime = sitepong.metricTime.bind(sitepong);\nexport const metricStartTimer = sitepong.metricStartTimer.bind(sitepong);\nexport const flushMetrics = sitepong.flushMetrics.bind(sitepong);\n\n// Profiling exports\nexport const profile = sitepong.profile.bind(sitepong);\nexport const startProfileSpan = sitepong.startProfileSpan.bind(sitepong);\nexport const getProfiles = sitepong.getProfiles.bind(sitepong);\nexport const getLatestProfile = sitepong.getLatestProfile.bind(sitepong);\nexport const flushProfiles = sitepong.flushProfiles.bind(sitepong);\n\n// Remote config exports\nexport const getRemoteConfig = sitepong.getRemoteConfig.bind(sitepong);\nexport const isRemoteConfigFeatureEnabled = sitepong.isRemoteConfigFeatureEnabled.bind(sitepong);\nexport const onRemoteConfigChange = sitepong.onRemoteConfigChange.bind(sitepong);\n\n// Widget manager exports\n// Platform-entry helpers (not for end users; used by sitepong/web, sitepong/react-native, sitepong/server entries)\nexport const registerIdentifyHook = sitepong.registerIdentifyHook.bind(sitepong);\nexport { setEnvironment, setRNGetCurrentScreen } from './utils/platform';\nexport type { EnvironmentAdapter, MutableRNEnvironmentAdapter, DeviceInfo, PlatformName } from './adapters/environment';\n\n// Re-export flag utilities for advanced use cases\nexport { getAnonymousId, clearAnonymousId, setAnonymousId } from './flags';\n\n// Re-export types for advanced use cases\nexport type { TrackProperties, UserTraits, GroupTraits } from './analytics';\nexport type { VisitorIdResult, DeviceSignals, FraudCheckResult } from './fingerprint';\nexport type { ReplayConfig, ReplayEvent } from './replay';\nexport type { PerformanceConfig, WebVitals, PerformanceTransaction, PerformanceSpan, ResourceTimingBreakdown } from './performance';\nexport type { CronCheckinOptions, CronHandle } from './crons';\nexport type { MetricOptions } from './metrics';\nexport type { DatabaseQueryEvent, DatabaseTrackerConfig } from './database';\nexport type { ProfileData, ProfileFrame, ProfilerConfig } from './profiling';\n\n// Distributed tracing exports\nexport {\n TracePropagator,\n createTraceContext,\n propagateTrace,\n extractTrace,\n generateTraceId,\n generateSpanId,\n} from './performance';\nexport type { TraceContext } from './performance';\n\n// Re-export remote config types\nexport type { RemoteConfig, RemoteConfigFeatures, RemoteConfigSampling } from './remote-config';\n\n// SuperLink — deferred deep linking / smart links (web + platform-agnostic).\n// React Native deferred attribution is exported from 'sitepong/react-native'.\nexport {\n initSuperLink,\n getDeepLink,\n captureWebDeepLink,\n parseUniversalLink,\n writeClipboardToken,\n extractIdentityMetadata,\n // SuperLink identity recovery. Aliased to avoid colliding with the analytics\n // identify() exported above.\n identify as superlinkIdentify,\n completeFromScan,\n onDeferredDeepLink,\n getMatchedDeepLink,\n superlinkClient,\n SuperLinkClient,\n DEFAULT_SUPERLINK_ENDPOINT,\n} from './superlink';\nexport type {\n SuperLinkConfig,\n SuperLinkDeepLink,\n SuperLinkMatchResponse,\n SuperLinkMatchRequest,\n SuperLinkFingerprint,\n SuperLinkPlatform,\n SuperLinkMatchType,\n SuperLinkEventType,\n SuperLinkIdentityMetadata,\n DeferredDeepLinkHandler,\n} from './superlink';\n\n// Default export\nexport default sitepong;\n","import type { SerializedNode, DOMSnapshot } from './types';\n\nlet nodeIdCounter = 0;\nconst nodeIdMap = new WeakMap<Node, number>();\n\nexport function resetNodeIds(): void {\n nodeIdCounter = 0;\n}\n\nexport function getNodeId(node: Node): number {\n let id = nodeIdMap.get(node);\n if (id === undefined) {\n id = ++nodeIdCounter;\n nodeIdMap.set(node, id);\n }\n return id;\n}\n\nexport function getNodeById(id: number, root: Node): Node | null {\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_ALL);\n let node: Node | null = walker.currentNode;\n while (node) {\n if (nodeIdMap.get(node) === id) return node;\n node = walker.nextNode();\n }\n return null;\n}\n\ninterface SerializeOptions {\n maskInputs: boolean;\n blockSelector?: string;\n maskSelector?: string;\n}\n\nconst SKIP_TAGS = new Set(['script', 'noscript']);\n\nconst ABSOLUTE_URL_ATTRS = new Set(['src', 'href', 'action', 'poster']);\n\n/**\n * Key visual CSS properties to capture via getComputedStyle().\n * We only serialize these to keep payload size manageable.\n */\nconst COMPUTED_STYLE_PROPERTIES = [\n 'display', 'visibility', 'opacity',\n 'position', 'top', 'right', 'bottom', 'left', 'z-index',\n 'float', 'clear',\n 'width', 'height', 'min-width', 'min-height', 'max-width', 'max-height',\n 'margin-top', 'margin-right', 'margin-bottom', 'margin-left',\n 'padding-top', 'padding-right', 'padding-bottom', 'padding-left',\n 'border-top-width', 'border-right-width', 'border-bottom-width', 'border-left-width',\n 'border-top-style', 'border-right-style', 'border-bottom-style', 'border-left-style',\n 'border-top-color', 'border-right-color', 'border-bottom-color', 'border-left-color',\n 'border-radius',\n 'background-color', 'background-image', 'background-size', 'background-position',\n 'color', 'font-family', 'font-size', 'font-weight', 'font-style',\n 'line-height', 'letter-spacing', 'text-align', 'text-decoration', 'text-transform',\n 'overflow', 'overflow-x', 'overflow-y',\n 'flex-direction', 'flex-wrap', 'justify-content', 'align-items', 'align-self',\n 'flex-grow', 'flex-shrink', 'flex-basis', 'gap',\n 'grid-template-columns', 'grid-template-rows',\n 'transform', 'box-shadow', 'text-shadow',\n 'cursor', 'white-space', 'word-break',\n 'box-sizing',\n];\n\n/**\n * Cache of default computed styles per tag name.\n * Built lazily using a hidden iframe with a blank document.\n */\nlet defaultStyleCache: Map<string, Record<string, string>> | null = null;\nlet defaultStyleIframe: HTMLIFrameElement | null = null;\n\nfunction getDefaultStyles(tagName: string): Record<string, string> {\n if (typeof document === 'undefined') return {};\n\n if (!defaultStyleCache) {\n defaultStyleCache = new Map();\n }\n\n const cached = defaultStyleCache.get(tagName);\n if (cached) return cached;\n\n try {\n // Create hidden iframe for computing defaults\n if (!defaultStyleIframe) {\n defaultStyleIframe = document.createElement('iframe');\n defaultStyleIframe.style.cssText = 'position:fixed;top:-9999px;left:-9999px;width:0;height:0;border:none;visibility:hidden;';\n document.body.appendChild(defaultStyleIframe);\n }\n\n const iframeDoc = defaultStyleIframe.contentDocument;\n if (!iframeDoc) return {};\n\n const el = iframeDoc.createElement(tagName);\n iframeDoc.body.appendChild(el);\n const computed = iframeDoc.defaultView!.getComputedStyle(el);\n\n const defaults: Record<string, string> = {};\n for (const prop of COMPUTED_STYLE_PROPERTIES) {\n defaults[prop] = computed.getPropertyValue(prop);\n }\n\n iframeDoc.body.removeChild(el);\n defaultStyleCache.set(tagName, defaults);\n return defaults;\n } catch {\n return {};\n }\n}\n\n/**\n * Capture computed styles for an element, returning only properties\n * that differ from the tag's defaults.\n */\nexport function captureComputedStyle(el: Element): string | null {\n if (typeof window === 'undefined') return null;\n\n try {\n const tagName = el.tagName.toLowerCase();\n // Skip non-visual elements\n if (SKIP_TAGS.has(tagName) || tagName === 'head' || tagName === 'html' || tagName === 'meta' || tagName === 'link' || tagName === 'title') {\n return null;\n }\n\n const computed = window.getComputedStyle(el);\n const defaults = getDefaultStyles(tagName);\n const parts: string[] = [];\n\n for (const prop of COMPUTED_STYLE_PROPERTIES) {\n const value = computed.getPropertyValue(prop);\n if (value && value !== defaults[prop]) {\n parts.push(`${prop}:${value}`);\n }\n }\n\n return parts.length > 0 ? parts.join(';') : null;\n } catch {\n return null;\n }\n}\n\n/**\n * Attempt to re-fetch a cross-origin stylesheet URL and inline its contents.\n * Returns the CSS text or null if fetch fails.\n */\nconst crossOriginCache = new Map<string, string | null>();\n\nexport async function fetchCrossOriginStylesheet(href: string): Promise<string | null> {\n if (crossOriginCache.has(href)) {\n return crossOriginCache.get(href) ?? null;\n }\n\n try {\n const response = await fetch(href, { mode: 'cors' });\n if (!response.ok) {\n crossOriginCache.set(href, null);\n return null;\n }\n const css = await response.text();\n const absolutified = absolutifyUrls(css, href);\n crossOriginCache.set(href, absolutified);\n return absolutified;\n } catch {\n crossOriginCache.set(href, null);\n return null;\n }\n}\n\n/**\n * Synchronously check if a cross-origin stylesheet has been pre-fetched.\n * Call fetchCrossOriginStylesheet() first to populate the cache.\n */\nfunction getCachedCrossOriginStylesheet(href: string): string | null {\n return crossOriginCache.get(href) ?? null;\n}\n\n/**\n * Clean up the default style iframe. Call on stop().\n */\nexport function cleanupStyleDefaults(): void {\n if (defaultStyleIframe && defaultStyleIframe.parentNode) {\n defaultStyleIframe.parentNode.removeChild(defaultStyleIframe);\n }\n defaultStyleIframe = null;\n defaultStyleCache = null;\n crossOriginCache.clear();\n}\n\n/**\n * Convert a potentially relative URL to absolute.\n */\nfunction toAbsoluteUrl(url: string, base: string): string {\n if (!url || url.startsWith('data:') || url.startsWith('blob:') || url.startsWith('#')) {\n return url;\n }\n try {\n return new URL(url, base).href;\n } catch {\n return url;\n }\n}\n\n/**\n * Replace relative url() references inside CSS text with absolute URLs.\n */\nfunction absolutifyUrls(css: string, baseUrl: string): string {\n // Match url(...) but not data: or blob: or absolute http(s) URLs\n return css.replace(\n /url\\(\\s*(['\"]?)([^'\")]+)\\1\\s*\\)/g,\n (_match, quote, rawUrl) => {\n const trimmed = rawUrl.trim();\n if (\n trimmed.startsWith('data:') ||\n trimmed.startsWith('blob:') ||\n trimmed.startsWith('http://') ||\n trimmed.startsWith('https://') ||\n trimmed.startsWith('//')\n ) {\n return `url(${quote}${trimmed}${quote})`;\n }\n try {\n const abs = new URL(trimmed, baseUrl).href;\n return `url(${quote}${abs}${quote})`;\n } catch {\n return `url(${quote}${trimmed}${quote})`;\n }\n }\n );\n}\n\n/**\n * Stringify a CSSStyleSheet, catching SecurityError for cross-origin sheets.\n */\nfunction stringifyStylesheet(sheet: CSSStyleSheet): string | null {\n try {\n const rules = sheet.cssRules;\n let css = '';\n for (let i = 0; i < rules.length; i++) {\n css += rules[i].cssText + '\\n';\n }\n return css;\n } catch {\n // SecurityError: cross-origin stylesheet\n return null;\n }\n}\n\n/**\n * For a <style> or <link rel=\"stylesheet\"> element, extract inlined CSS text\n * with absolute URLs resolved.\n */\nexport function buildCssTextForNode(el: Element): string | null {\n const tagName = el.tagName.toLowerCase();\n const base = location.href;\n\n if (tagName === 'style') {\n // Inline <style>: read from its sheet\n const styleEl = el as HTMLStyleElement;\n if (styleEl.sheet) {\n const css = stringifyStylesheet(styleEl.sheet);\n if (css !== null) {\n return absolutifyUrls(css, base);\n }\n }\n // Fallback: use textContent\n const text = el.textContent || '';\n return text ? absolutifyUrls(text, base) : null;\n }\n\n if (tagName === 'link') {\n const linkEl = el as HTMLLinkElement;\n if (linkEl.rel !== 'stylesheet') return null;\n\n const sheetBase = linkEl.href || base;\n if (linkEl.sheet) {\n const css = stringifyStylesheet(linkEl.sheet);\n if (css !== null) {\n return absolutifyUrls(css, sheetBase);\n }\n }\n // Cross-origin sheet: check if we've pre-fetched it\n if (linkEl.href) {\n const cached = getCachedCrossOriginStylesheet(linkEl.href);\n if (cached) return cached;\n }\n return null;\n }\n\n return null;\n}\n\n/**\n * Absolutify srcset attribute values.\n */\nfunction absolutifySrcset(srcset: string, base: string): string {\n return srcset\n .split(',')\n .map((entry) => {\n const parts = entry.trim().split(/\\s+/);\n if (parts[0]) {\n parts[0] = toAbsoluteUrl(parts[0], base);\n }\n return parts.join(' ');\n })\n .join(', ');\n}\n\nexport function serializeNode(\n node: Node,\n options: SerializeOptions,\n parentIsSVG = false,\n): SerializedNode | null {\n const id = getNodeId(node);\n\n if (node.nodeType === Node.TEXT_NODE) {\n const parent = node.parentElement;\n let textContent = node.textContent || '';\n\n // Mask text content if parent matches maskSelector\n if (parent && options.maskSelector && parent.matches(options.maskSelector)) {\n textContent = textContent.replace(/\\S/g, '*');\n }\n\n return {\n id,\n type: 'text',\n textContent,\n };\n }\n\n if (node.nodeType === Node.COMMENT_NODE) {\n return { id, type: 'comment', textContent: '' };\n }\n\n if (node.nodeType === Node.ELEMENT_NODE) {\n const el = node as Element;\n const htmlEl = el as HTMLElement;\n\n // Block this element entirely if it matches blockSelector\n if (options.blockSelector && el.matches(options.blockSelector)) {\n return {\n id,\n type: 'element',\n tagName: 'div',\n attributes: {\n 'data-blocked': 'true',\n style: `width:${htmlEl.offsetWidth}px;height:${htmlEl.offsetHeight}px;background:#f0f0f0;`,\n },\n };\n }\n\n const tagName = el.tagName.toLowerCase();\n\n // Skip elements that should not be serialized\n if (SKIP_TAGS.has(tagName)) {\n return null;\n }\n\n const isSVG = parentIsSVG || tagName === 'svg' || el instanceof SVGElement;\n\n // Collect all attributes\n const attributes: Record<string, string> = {};\n const base = location.href;\n\n for (let i = 0; i < el.attributes.length; i++) {\n const attr = el.attributes[i];\n const name = attr.name;\n let value = attr.value;\n\n // Skip event handlers\n if (name.startsWith('on')) continue;\n // Skip javascript: URLs\n if (value && value.toLowerCase().startsWith('javascript:')) continue;\n\n // Resolve absolute URLs for known URL attributes\n if (ABSOLUTE_URL_ATTRS.has(name)) {\n value = toAbsoluteUrl(value, base);\n }\n\n // Handle srcset\n if (name === 'srcset') {\n value = absolutifySrcset(value, base);\n }\n\n attributes[name] = value;\n }\n\n // CSS inlining for <style> and <link rel=\"stylesheet\">\n if (tagName === 'style' || (tagName === 'link' && el.getAttribute('rel') === 'stylesheet')) {\n const cssText = buildCssTextForNode(el);\n if (cssText) {\n attributes['_cssText'] = cssText;\n }\n }\n\n // Capture computed styles (diff against defaults) for visual elements\n if (!isSVG && tagName !== 'style' && tagName !== 'link') {\n const computedStyle = captureComputedStyle(el);\n if (computedStyle) {\n attributes['_computedStyle'] = computedStyle;\n }\n }\n\n // Form element state capture\n if (tagName === 'input') {\n const input = el as HTMLInputElement;\n const inputType = (input.type || '').toLowerCase();\n if (inputType === 'checkbox' || inputType === 'radio') {\n attributes['_checked'] = String(input.checked);\n } else {\n const val = options.maskInputs ? '***' : input.value;\n if (val) {\n attributes['_value'] = val;\n }\n }\n } else if (tagName === 'textarea') {\n const textarea = el as HTMLTextAreaElement;\n const val = options.maskInputs ? '***' : textarea.value;\n if (val) {\n attributes['_value'] = val;\n }\n } else if (tagName === 'select') {\n const select = el as HTMLSelectElement;\n attributes['_selectedIndex'] = String(select.selectedIndex);\n }\n\n // Canvas snapshot\n if (tagName === 'canvas') {\n try {\n const canvas = el as HTMLCanvasElement;\n const dataUrl = canvas.toDataURL('image/webp', 0.4);\n if (dataUrl && dataUrl !== 'data:,') {\n attributes['_canvasDataUrl'] = dataUrl;\n }\n } catch {\n // tainted canvas or other error — skip\n }\n }\n\n // Mask content if element matches maskSelector\n if (options.maskSelector && el.matches(options.maskSelector)) {\n // Children text will be masked via the text node branch\n }\n\n // Serialize children\n const children: SerializedNode[] = [];\n for (const child of Array.from(el.childNodes)) {\n const serialized = serializeNode(child, options, isSVG);\n if (serialized) {\n children.push(serialized);\n }\n }\n\n const result: SerializedNode = {\n id,\n type: 'element',\n tagName,\n attributes: Object.keys(attributes).length > 0 ? attributes : undefined,\n children: children.length > 0 ? children : undefined,\n };\n\n if (isSVG) {\n result.isSVG = true;\n }\n\n return result;\n }\n\n return null;\n}\n\nexport function takeSnapshot(options: SerializeOptions): DOMSnapshot | null {\n if (typeof document === 'undefined') return null;\n\n resetNodeIds();\n\n const html = serializeNode(document.documentElement, options);\n if (!html) return null;\n\n return {\n _version: 2,\n doctype: document.doctype\n ? `<!DOCTYPE ${document.doctype.name}>`\n : undefined,\n html,\n width: window.innerWidth,\n height: window.innerHeight,\n };\n}\n","/**\n * Network Request Recording for Session Replay\n * Intercepts XHR and fetch requests to record them in the replay timeline.\n */\n\nexport interface NetworkEvent {\n type: 'network';\n timestamp: number;\n data: NetworkRequestData;\n}\n\nexport interface NetworkRequestData {\n method: string;\n url: string;\n status?: number;\n statusText?: string;\n requestHeaders?: Record<string, string>;\n responseHeaders?: Record<string, string>;\n duration?: number;\n requestSize?: number;\n responseSize?: number;\n error?: string;\n initiator: 'fetch' | 'xhr';\n}\n\ntype NetworkCallback = (event: NetworkEvent) => void;\n\n/** Headers that should never be captured for privacy */\nconst REDACTED_HEADERS = [\n 'authorization',\n 'cookie',\n 'set-cookie',\n 'x-api-key',\n 'x-auth-token',\n];\n\nexport class NetworkRecorder {\n private callback: NetworkCallback;\n private originalFetch: typeof window.fetch | null = null;\n private originalXhrOpen: typeof XMLHttpRequest.prototype.open | null = null;\n private originalXhrSend: typeof XMLHttpRequest.prototype.send | null = null;\n private active = false;\n private captureHeaders: boolean;\n private urlFilter?: (url: string) => boolean;\n\n constructor(\n callback: NetworkCallback,\n options?: {\n captureHeaders?: boolean;\n urlFilter?: (url: string) => boolean;\n }\n ) {\n this.callback = callback;\n this.captureHeaders = options?.captureHeaders ?? false;\n this.urlFilter = options?.urlFilter;\n }\n\n start(): void {\n if (this.active || typeof window === 'undefined') return;\n this.active = true;\n\n this.interceptFetch();\n this.interceptXHR();\n }\n\n stop(): void {\n if (!this.active) return;\n this.active = false;\n\n // Restore fetch\n if (this.originalFetch) {\n window.fetch = this.originalFetch;\n this.originalFetch = null;\n }\n\n // Restore XHR\n if (this.originalXhrOpen) {\n XMLHttpRequest.prototype.open = this.originalXhrOpen;\n this.originalXhrOpen = null;\n }\n if (this.originalXhrSend) {\n XMLHttpRequest.prototype.send = this.originalXhrSend;\n this.originalXhrSend = null;\n }\n }\n\n private interceptFetch(): void {\n if (typeof window.fetch !== 'function') return;\n\n this.originalFetch = window.fetch;\n const self = this;\n\n window.fetch = async function (input: RequestInfo | URL, init?: RequestInit): Promise<Response> {\n const url = typeof input === 'string' ? input : input instanceof URL ? input.toString() : (input as Request).url;\n\n if (self.urlFilter && !self.urlFilter(url)) {\n return self.originalFetch!.call(window, input as RequestInfo, init);\n }\n\n const startTime = Date.now();\n const method = init?.method || (input instanceof Request ? input.method : 'GET');\n\n let requestSize: number | undefined;\n if (init?.body) {\n if (typeof init.body === 'string') {\n requestSize = init.body.length;\n } else if (init.body instanceof Blob) {\n requestSize = init.body.size;\n }\n }\n\n try {\n const response = await self.originalFetch!.call(window, input as RequestInfo, init);\n const duration = Date.now() - startTime;\n\n const data: NetworkRequestData = {\n method: method.toUpperCase(),\n url: self.truncateUrl(url),\n status: response.status,\n statusText: response.statusText,\n duration,\n requestSize,\n initiator: 'fetch',\n };\n\n if (self.captureHeaders) {\n data.requestHeaders = self.safeHeaders(init?.headers);\n data.responseHeaders = self.headersToObject(response.headers);\n }\n\n self.emit(data);\n return response;\n } catch (err) {\n const duration = Date.now() - startTime;\n\n self.emit({\n method: method.toUpperCase(),\n url: self.truncateUrl(url),\n duration,\n requestSize,\n error: err instanceof Error ? err.message : 'Network error',\n initiator: 'fetch',\n });\n\n throw err;\n }\n };\n }\n\n private interceptXHR(): void {\n if (typeof XMLHttpRequest === 'undefined') return;\n\n this.originalXhrOpen = XMLHttpRequest.prototype.open;\n this.originalXhrSend = XMLHttpRequest.prototype.send;\n const self = this;\n\n XMLHttpRequest.prototype.open = function (\n method: string,\n url: string | URL,\n ...args: unknown[]\n ) {\n (this as XMLHttpRequest & { _spMethod: string; _spUrl: string })._spMethod = method;\n (this as XMLHttpRequest & { _spUrl: string })._spUrl = typeof url === 'string' ? url : url.toString();\n return self.originalXhrOpen!.apply(this, [method, url, ...args] as Parameters<typeof XMLHttpRequest.prototype.open>);\n };\n\n XMLHttpRequest.prototype.send = function (body?: Document | XMLHttpRequestBodyInit | null) {\n const xhr = this as XMLHttpRequest & { _spMethod: string; _spUrl: string };\n const url = xhr._spUrl;\n\n if (self.urlFilter && !self.urlFilter(url)) {\n return self.originalXhrSend!.call(this, body);\n }\n\n const startTime = Date.now();\n let requestSize: number | undefined;\n if (typeof body === 'string') {\n requestSize = body.length;\n }\n\n const onLoadEnd = () => {\n const duration = Date.now() - startTime;\n\n // Safely get response size — accessing responseText throws\n // InvalidStateError when responseType is not \"\" or \"text\"\n // (e.g. \"json\", \"arraybuffer\", \"blob\").\n let responseSize: number | undefined;\n try {\n if (xhr.responseType === '' || xhr.responseType === 'text') {\n responseSize = xhr.responseText?.length;\n } else if (xhr.responseType === 'json' && xhr.response != null) {\n responseSize = JSON.stringify(xhr.response).length;\n } else if (xhr.responseType === 'arraybuffer' && xhr.response) {\n responseSize = (xhr.response as ArrayBuffer).byteLength;\n } else if (xhr.responseType === 'blob' && xhr.response) {\n responseSize = (xhr.response as Blob).size;\n }\n } catch {\n // Swallow — response size is best-effort\n }\n\n const data: NetworkRequestData = {\n method: (xhr._spMethod || 'GET').toUpperCase(),\n url: self.truncateUrl(url),\n status: xhr.status,\n statusText: xhr.statusText,\n duration,\n requestSize,\n responseSize,\n initiator: 'xhr',\n };\n\n if (xhr.status === 0) {\n data.error = 'Network error';\n }\n\n self.emit(data);\n xhr.removeEventListener('loadend', onLoadEnd);\n };\n\n xhr.addEventListener('loadend', onLoadEnd);\n return self.originalXhrSend!.call(this, body);\n };\n }\n\n private emit(data: NetworkRequestData): void {\n if (!this.active) return;\n this.callback({\n type: 'network',\n timestamp: Date.now(),\n data,\n });\n }\n\n private truncateUrl(url: string): string {\n // Remove query params with sensitive data patterns\n try {\n const parsed = new URL(url, window.location.origin);\n // Keep path, truncate if too long\n const path = parsed.pathname + parsed.search;\n return path.length > 500 ? path.slice(0, 500) + '...' : parsed.origin + path;\n } catch {\n return url.length > 500 ? url.slice(0, 500) + '...' : url;\n }\n }\n\n private safeHeaders(headers?: HeadersInit): Record<string, string> | undefined {\n if (!headers) return undefined;\n\n const result: Record<string, string> = {};\n if (headers instanceof Headers) {\n headers.forEach((value, key) => {\n result[key] = REDACTED_HEADERS.includes(key.toLowerCase()) ? '[REDACTED]' : value;\n });\n } else if (Array.isArray(headers)) {\n for (const [key, value] of headers) {\n result[key] = REDACTED_HEADERS.includes(key.toLowerCase()) ? '[REDACTED]' : value;\n }\n } else {\n for (const [key, value] of Object.entries(headers)) {\n result[key] = REDACTED_HEADERS.includes(key.toLowerCase()) ? '[REDACTED]' : value;\n }\n }\n return result;\n }\n\n private headersToObject(headers: Headers): Record<string, string> {\n const result: Record<string, string> = {};\n headers.forEach((value, key) => {\n result[key] = REDACTED_HEADERS.includes(key.toLowerCase()) ? '[REDACTED]' : value;\n });\n return result;\n }\n}\n","/**\n * Console Log Recording for Session Replay\n * Intercepts console.log/warn/error/info/debug to record them in the replay timeline.\n */\n\nexport type ConsoleLevel = 'log' | 'info' | 'warn' | 'error' | 'debug';\n\nexport interface ConsoleEvent {\n type: 'console';\n timestamp: number;\n data: ConsoleEventData;\n}\n\nexport interface ConsoleEventData {\n level: ConsoleLevel;\n args: string[];\n trace?: string;\n}\n\ntype ConsoleCallback = (event: ConsoleEvent) => void;\n\nconst MAX_ARG_LENGTH = 1000;\nconst MAX_ARGS = 10;\nconst MAX_TRACE_LENGTH = 2000;\n\nexport class ConsoleRecorder {\n private callback: ConsoleCallback;\n private originals: Record<ConsoleLevel, (...args: unknown[]) => void> = {} as Record<ConsoleLevel, (...args: unknown[]) => void>;\n private active = false;\n private levels: ConsoleLevel[];\n\n constructor(\n callback: ConsoleCallback,\n options?: {\n levels?: ConsoleLevel[];\n }\n ) {\n this.callback = callback;\n this.levels = options?.levels || ['log', 'info', 'warn', 'error', 'debug'];\n }\n\n start(): void {\n if (this.active || typeof console === 'undefined') return;\n this.active = true;\n\n for (const level of this.levels) {\n this.originals[level] = console[level].bind(console);\n console[level] = (...args: unknown[]) => {\n // Always call original\n this.originals[level](...args);\n // Record the event\n this.record(level, args);\n };\n }\n }\n\n stop(): void {\n if (!this.active) return;\n this.active = false;\n\n for (const level of this.levels) {\n if (this.originals[level]) {\n console[level] = this.originals[level];\n }\n }\n this.originals = {} as Record<ConsoleLevel, (...args: unknown[]) => void>;\n }\n\n private record(level: ConsoleLevel, args: unknown[]): void {\n if (!this.active) return;\n\n // Skip SDK's own debug logs to prevent feedback loops\n if (args.length > 0 && typeof args[0] === 'string' && args[0].startsWith('[SitePong')) {\n return;\n }\n\n const serializedArgs = args.slice(0, MAX_ARGS).map((arg) => this.serialize(arg));\n\n const data: ConsoleEventData = {\n level,\n args: serializedArgs,\n };\n\n // Capture stack trace for errors\n if (level === 'error') {\n const trace = this.getStackTrace();\n if (trace) {\n data.trace = trace.slice(0, MAX_TRACE_LENGTH);\n }\n }\n\n this.callback({\n type: 'console',\n timestamp: Date.now(),\n data,\n });\n }\n\n private serialize(value: unknown): string {\n if (value === null) return 'null';\n if (value === undefined) return 'undefined';\n\n if (value instanceof Error) {\n return `Error: ${value.message}${value.stack ? '\\n' + value.stack : ''}`.slice(0, MAX_ARG_LENGTH);\n }\n\n if (typeof value === 'string') {\n return value.slice(0, MAX_ARG_LENGTH);\n }\n\n if (typeof value === 'number' || typeof value === 'boolean') {\n return String(value);\n }\n\n if (typeof value === 'function') {\n return `[Function: ${value.name || 'anonymous'}]`;\n }\n\n if (typeof value === 'symbol') {\n return value.toString();\n }\n\n if (value instanceof HTMLElement) {\n return `<${value.tagName.toLowerCase()}${value.id ? '#' + value.id : ''}${value.className ? '.' + value.className.split(' ').join('.') : ''}>`;\n }\n\n try {\n const str = JSON.stringify(value, this.getReplacer(), 0);\n return str ? str.slice(0, MAX_ARG_LENGTH) : String(value);\n } catch {\n return String(value).slice(0, MAX_ARG_LENGTH);\n }\n }\n\n private getReplacer(): (key: string, value: unknown) => unknown {\n const seen = new WeakSet();\n return (_key: string, value: unknown) => {\n if (typeof value === 'object' && value !== null) {\n if (seen.has(value)) return '[Circular]';\n seen.add(value);\n }\n if (typeof value === 'function') return '[Function]';\n if (value instanceof RegExp) return value.toString();\n return value;\n };\n }\n\n private getStackTrace(): string | undefined {\n try {\n const err = new Error();\n if (!err.stack) return undefined;\n // Remove the first few frames (this function, record, console wrapper)\n const lines = err.stack.split('\\n');\n return lines.slice(4).join('\\n') || undefined;\n } catch {\n return undefined;\n }\n }\n}\n","import type {\n ReplayConfig,\n ReplayEvent,\n MutationData,\n MouseMoveData,\n InputData,\n ScrollData,\n} from './types';\nimport { takeSnapshot, getNodeId, serializeNode, buildCssTextForNode, captureComputedStyle, fetchCrossOriginStylesheet, cleanupStyleDefaults } from './serializer';\nimport { NetworkRecorder } from './network';\nimport { ConsoleRecorder } from './console';\n\nconst DEFAULT_ENDPOINT = 'https://ingest.sitepong.com';\nconst DEFAULT_BUFFER_DURATION = 20_000; // 20 seconds\nconst DEFAULT_MAX_SESSION_DURATION = 60 * 60 * 1000; // 60 minutes\nconst MAX_FLUSH_FAILURES = 3;\nconst TRIM_INTERVAL = 5000; // Trim buffer every 5 seconds\n\nexport class ReplayManager {\n private config: Required<Omit<ReplayConfig, 'apiKey' | 'replayEndpoint' | 'blockSelector' | 'maskSelector' | 'recordNetwork' | 'captureNetworkHeaders' | 'recordConsole' | 'consoleLevels' | 'bufferDuration'>> & {\n apiKey: string;\n replayEndpoint?: string;\n blockSelector?: string;\n maskSelector?: string;\n recordNetwork?: boolean;\n captureNetworkHeaders?: boolean;\n recordConsole?: boolean;\n consoleLevels?: ReplayConfig['consoleLevels'];\n bufferDuration: number;\n };\n private recording = false;\n private sessionId: string | null = null;\n private events: ReplayEvent[] = [];\n private trimTimer: ReturnType<typeof setInterval> | null = null;\n private flushFailures = 0;\n private disabled = false;\n private sessionStartTime: number = 0;\n private observer: MutationObserver | null = null;\n private mouseMoveBuffer: { x: number; y: number; t: number }[] = [];\n private mouseMoveFlushTimer: ReturnType<typeof setTimeout> | null = null;\n private cleanupFns: Array<() => void> = [];\n private networkRecorder: NetworkRecorder | null = null;\n private consoleRecorder: ConsoleRecorder | null = null;\n private lastSnapshotTime: number = 0;\n private snapshotCooldown: number = 500; // min ms between interaction snapshots\n private userContext: { id?: string } | null = null;\n private mutationBuffer: MutationData | null = null;\n private mutationFlushTimer: ReturnType<typeof setTimeout> | null = null;\n private lastScrollTime: number = 0;\n /** Most recent full snapshot, kept so we can prepend it to error replays */\n private latestSnapshot: ReplayEvent | null = null;\n\n constructor(config: ReplayConfig) {\n this.config = {\n endpoint: DEFAULT_ENDPOINT,\n enabled: true,\n maskInputs: true,\n maxSessionDuration: DEFAULT_MAX_SESSION_DURATION,\n flushInterval: 5000, // kept for compat but unused (no periodic flush)\n maxBatchSize: 100,\n sampleRate: 1.0,\n debug: false,\n bufferDuration: DEFAULT_BUFFER_DURATION,\n ...config,\n };\n }\n\n start(): boolean {\n if (typeof window === 'undefined' || typeof document === 'undefined' || typeof window.addEventListener !== 'function') return false;\n if (this.recording) return true;\n if (!this.config.enabled) return false;\n\n // Apply sample rate\n if (Math.random() > this.config.sampleRate) {\n this.log('Session not sampled');\n return false;\n }\n\n this.sessionId = this.getOrCreateSessionId();\n this.sessionStartTime = this.getOrCreateStartTime();\n this.recording = true;\n this.events = [];\n\n // Pre-fetch cross-origin stylesheets (async, non-blocking)\n this.prefetchCrossOriginStylesheets();\n\n // Take initial DOM snapshot\n const snapshot = takeSnapshot({\n maskInputs: this.config.maskInputs,\n blockSelector: this.config.blockSelector,\n maskSelector: this.config.maskSelector,\n });\n\n if (snapshot) {\n this.addEvent('snapshot', snapshot);\n }\n\n // Start recording\n this.setupMutationObserver();\n this.setupEventListeners();\n this.setupNetworkRecording();\n this.setupConsoleRecording();\n this.startTrimTimer();\n\n this.log('Recording started (rolling buffer mode):', this.sessionId);\n return true;\n }\n\n stop(): void {\n if (!this.recording) return;\n\n this.recording = false;\n\n // Cleanup\n if (this.observer) {\n this.observer.disconnect();\n this.observer = null;\n }\n\n if (this.trimTimer) {\n clearInterval(this.trimTimer);\n this.trimTimer = null;\n }\n\n if (this.mouseMoveFlushTimer) {\n clearTimeout(this.mouseMoveFlushTimer);\n this.mouseMoveFlushTimer = null;\n }\n\n if (this.mutationFlushTimer) {\n this.flushMutationBuffer();\n }\n\n if (this.networkRecorder) {\n this.networkRecorder.stop();\n this.networkRecorder = null;\n }\n\n if (this.consoleRecorder) {\n this.consoleRecorder.stop();\n this.consoleRecorder = null;\n }\n\n for (const cleanup of this.cleanupFns) {\n cleanup();\n }\n this.cleanupFns = [];\n\n cleanupStyleDefaults();\n this.log('Recording stopped:', this.sessionId);\n this.sessionId = null;\n }\n\n isRecording(): boolean {\n return this.recording;\n }\n\n getSessionId(): string | null {\n return this.sessionId;\n }\n\n setUser(user: { id?: string } | null): void {\n this.userContext = user;\n }\n\n /**\n * Flush the rolling buffer to the server. Called when an error is captured.\n * Sends the most recent snapshot + all buffered events from the last `bufferDuration` ms.\n * After flushing, the buffer is cleared and recording continues.\n */\n async flushOnError(): Promise<void> {\n if (!this.recording || !this.sessionId) return;\n if (this.disabled) return;\n\n // Flush any pending mutation buffer first\n this.flushMutationBuffer();\n\n // Build the events to send: latest snapshot + buffered events\n const eventsToSend: ReplayEvent[] = [];\n\n // Prepend the latest full snapshot so the replay is self-contained\n if (this.latestSnapshot) {\n eventsToSend.push(this.latestSnapshot);\n }\n\n // Add all buffered events (already trimmed to bufferDuration)\n eventsToSend.push(...this.events);\n\n if (eventsToSend.length === 0) return;\n\n // Clear the buffer after capturing — recording continues fresh\n this.events = [];\n this.latestSnapshot = null;\n\n // Take a fresh snapshot to start the next buffer period\n const newSnapshot = takeSnapshot({\n maskInputs: this.config.maskInputs,\n blockSelector: this.config.blockSelector,\n maskSelector: this.config.maskSelector,\n });\n if (newSnapshot) {\n this.addEvent('snapshot', newSnapshot);\n }\n\n const endpoint = this.config.replayEndpoint || `${this.config.endpoint}/api/replays`;\n\n try {\n const response = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-API-Key': this.config.apiKey,\n },\n body: JSON.stringify({\n sessionId: this.sessionId,\n events: eventsToSend,\n startedAt: new Date(this.sessionStartTime).toISOString(),\n pageUrl: typeof location !== 'undefined' && location ? location.href : undefined,\n pageTitle: typeof document !== 'undefined' ? document.title : undefined,\n userAgent: typeof navigator !== 'undefined' ? navigator.userAgent : undefined,\n userId: this.userContext?.id,\n trigger: 'error',\n }),\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}`);\n }\n\n this.flushFailures = 0;\n this.log(`Flushed ${eventsToSend.length} replay events (error-triggered)`);\n } catch (err) {\n this.flushFailures++;\n\n if (this.flushFailures >= MAX_FLUSH_FAILURES) {\n this.disabled = true;\n console.warn(\n `[SitePong Replay] Disabled after ${MAX_FLUSH_FAILURES} consecutive failures. ` +\n `Check that ${endpoint} is accessible and has proper CORS headers.`\n );\n return;\n }\n\n this.log(`Failed to flush replay events (attempt ${this.flushFailures}/${MAX_FLUSH_FAILURES}):`, err);\n }\n }\n\n /**\n * @deprecated Use flushOnError() instead. Kept for backward compatibility.\n */\n async flush(): Promise<void> {\n return this.flushOnError();\n }\n\n private addEvent(type: ReplayEvent['type'], data: unknown): void {\n if (!this.recording) return;\n\n // Check session duration\n if (Date.now() - this.sessionStartTime > this.config.maxSessionDuration) {\n this.stop();\n return;\n }\n\n const event: ReplayEvent = {\n type,\n timestamp: Date.now() - this.sessionStartTime,\n data,\n };\n\n // Track latest snapshot so we can always prepend it on flush\n if (type === 'snapshot') {\n this.latestSnapshot = event;\n }\n\n this.events.push(event);\n }\n\n /**\n * Trim events older than bufferDuration from the rolling buffer.\n * Always keeps at least the most recent snapshot.\n */\n private trimBuffer(): void {\n if (this.events.length === 0) return;\n\n const now = Date.now() - this.sessionStartTime;\n const cutoff = now - this.config.bufferDuration;\n\n // Find the first event that's within the buffer window\n let trimIndex = 0;\n for (let i = 0; i < this.events.length; i++) {\n if (this.events[i].timestamp >= cutoff) {\n trimIndex = i;\n break;\n }\n // Track the latest snapshot we're about to trim past\n if (this.events[i].type === 'snapshot') {\n this.latestSnapshot = this.events[i];\n }\n trimIndex = i + 1;\n }\n\n if (trimIndex > 0) {\n this.events = this.events.slice(trimIndex);\n }\n }\n\n private flushMutationBuffer(): void {\n if (this.mutationBuffer &&\n (this.mutationBuffer.adds.length || this.mutationBuffer.removes.length ||\n this.mutationBuffer.attributes.length || this.mutationBuffer.texts.length)) {\n this.addEvent('mutation', this.mutationBuffer);\n }\n this.mutationBuffer = null;\n if (this.mutationFlushTimer) {\n clearTimeout(this.mutationFlushTimer);\n }\n this.mutationFlushTimer = null;\n }\n\n private setupMutationObserver(): void {\n if (typeof MutationObserver === 'undefined') return;\n\n this.observer = new MutationObserver((mutations) => {\n // Buffer mutations and flush every 100ms to avoid flooding from\n // continuous DOM changes (marquees, animations, React re-renders)\n if (!this.mutationBuffer) {\n this.mutationBuffer = { adds: [], removes: [], attributes: [], texts: [] };\n }\n\n for (const mutation of mutations) {\n switch (mutation.type) {\n case 'childList': {\n for (const node of Array.from(mutation.addedNodes)) {\n const serialized = serializeNode(node, {\n maskInputs: this.config.maskInputs,\n blockSelector: this.config.blockSelector,\n maskSelector: this.config.maskSelector,\n });\n if (serialized) {\n this.mutationBuffer.adds.push({\n parentId: getNodeId(mutation.target),\n nextId: mutation.nextSibling ? getNodeId(mutation.nextSibling) : null,\n node: serialized,\n });\n }\n }\n for (const node of Array.from(mutation.removedNodes)) {\n this.mutationBuffer.removes.push({\n parentId: getNodeId(mutation.target),\n id: getNodeId(node),\n });\n }\n break;\n }\n case 'attributes': {\n const el = mutation.target as Element;\n const attrName = mutation.attributeName || '';\n const value = el.getAttribute(attrName);\n const attrs: Record<string, string | null> = { [attrName]: value };\n\n // Re-capture _cssText when style/link attributes change\n const elTag = el.tagName?.toLowerCase();\n if (\n elTag === 'style' ||\n (elTag === 'link' && el.getAttribute('rel') === 'stylesheet')\n ) {\n const cssText = buildCssTextForNode(el);\n if (cssText) {\n attrs['_cssText'] = cssText;\n }\n }\n\n // Re-capture computed styles when class or style attributes change\n if (attrName === 'class' || attrName === 'style') {\n const computedStyle = captureComputedStyle(el);\n if (computedStyle) {\n attrs['_computedStyle'] = computedStyle;\n }\n }\n\n this.mutationBuffer.attributes.push({\n id: getNodeId(mutation.target),\n attributes: attrs,\n });\n break;\n }\n case 'characterData': {\n let textValue = mutation.target.textContent || '';\n const parent = mutation.target.parentElement;\n if (parent && this.config.maskSelector && parent.matches(this.config.maskSelector)) {\n textValue = textValue.replace(/\\S/g, '*');\n }\n this.mutationBuffer.texts.push({\n id: getNodeId(mutation.target),\n value: textValue,\n });\n\n // Re-capture _cssText when <style> text content changes\n if (parent && parent.tagName?.toLowerCase() === 'style') {\n const cssText = buildCssTextForNode(parent);\n if (cssText) {\n this.mutationBuffer.attributes.push({\n id: getNodeId(parent),\n attributes: { '_cssText': cssText },\n });\n }\n }\n break;\n }\n }\n }\n\n if (!this.mutationFlushTimer) {\n this.mutationFlushTimer = setTimeout(() => this.flushMutationBuffer(), 1000);\n }\n });\n\n this.observer.observe(document.documentElement, {\n childList: true,\n subtree: true,\n attributes: true,\n characterData: true,\n attributeOldValue: false,\n });\n }\n\n private setupEventListeners(): void {\n // Mouse move (throttled)\n const onMouseMove = (e: MouseEvent) => {\n this.mouseMoveBuffer.push({\n x: e.clientX,\n y: e.clientY,\n t: Date.now() - this.sessionStartTime,\n });\n\n if (!this.mouseMoveFlushTimer) {\n this.mouseMoveFlushTimer = setTimeout(() => {\n if (this.mouseMoveBuffer.length > 0) {\n const data: MouseMoveData = { positions: [...this.mouseMoveBuffer] };\n this.addEvent('mouse_move', data);\n this.mouseMoveBuffer = [];\n }\n this.mouseMoveFlushTimer = null;\n }, 1000);\n }\n };\n\n // Mouse click (left)\n const onClick = (e: MouseEvent) => {\n const target = e.target as Node;\n this.addEvent('mouse_click', {\n x: e.clientX,\n y: e.clientY,\n targetId: getNodeId(target),\n button: e.button,\n });\n this.takeInteractionSnapshot();\n };\n\n // Right-click (contextmenu)\n const onContextMenu = (e: MouseEvent) => {\n const target = e.target as Node;\n this.addEvent('mouse_click', {\n x: e.clientX,\n y: e.clientY,\n targetId: getNodeId(target),\n button: 2,\n });\n this.takeInteractionSnapshot();\n };\n\n // Mouse leaving the page\n const onMouseLeave = () => {\n this.addEvent('mouse_leave', {});\n };\n\n // Touch events (taps)\n const onTouchStart = (e: TouchEvent) => {\n const touch = e.touches[0];\n if (!touch) return;\n const target = e.target as Node;\n this.addEvent('touch', {\n x: touch.clientX,\n y: touch.clientY,\n targetId: getNodeId(target),\n });\n this.takeInteractionSnapshot();\n };\n\n // Scroll (debounced - only record final position)\n let scrollTimer: ReturnType<typeof setTimeout> | null = null;\n const onScroll = () => {\n if (scrollTimer) clearTimeout(scrollTimer);\n scrollTimer = setTimeout(() => {\n const data: ScrollData = {\n id: 0,\n x: window.scrollX,\n y: window.scrollY,\n };\n this.addEvent('scroll', data);\n this.takeInteractionSnapshot();\n }, 1000);\n };\n\n // Input changes\n const onInput = (e: Event) => {\n const target = e.target as HTMLInputElement | HTMLTextAreaElement;\n if (!target) return;\n\n const data: InputData = {\n id: getNodeId(target),\n value: this.config.maskInputs ? '***' : target.value,\n };\n\n if ('checked' in target) {\n data.isChecked = (target as HTMLInputElement).checked;\n }\n\n this.addEvent('input', data);\n };\n\n // Window resize\n const onResize = () => {\n this.addEvent('resize', {\n width: window.innerWidth,\n height: window.innerHeight,\n });\n };\n\n // Focus/blur\n const onFocus = (e: FocusEvent) => {\n if (e.target && e.target !== document) {\n this.addEvent('focus', { id: getNodeId(e.target as Node) });\n }\n };\n\n const onBlur = (e: FocusEvent) => {\n if (e.target && e.target !== document) {\n this.addEvent('blur', { id: getNodeId(e.target as Node) });\n }\n };\n\n // Add listeners\n document.addEventListener('mousemove', onMouseMove, { passive: true });\n document.addEventListener('click', onClick, { passive: true });\n document.addEventListener('contextmenu', onContextMenu, { passive: true });\n document.documentElement.addEventListener('mouseleave', onMouseLeave, { passive: true });\n document.addEventListener('touchstart', onTouchStart, { passive: true });\n window.addEventListener('scroll', onScroll, { passive: true });\n document.addEventListener('input', onInput, { passive: true });\n window.addEventListener('resize', onResize, { passive: true });\n document.addEventListener('focus', onFocus, { passive: true, capture: true });\n document.addEventListener('blur', onBlur, { passive: true, capture: true });\n\n // Store cleanup functions\n this.cleanupFns.push(\n () => document.removeEventListener('mousemove', onMouseMove),\n () => document.removeEventListener('click', onClick),\n () => document.removeEventListener('contextmenu', onContextMenu),\n () => document.documentElement.removeEventListener('mouseleave', onMouseLeave),\n () => document.removeEventListener('touchstart', onTouchStart),\n () => window.removeEventListener('scroll', onScroll),\n () => document.removeEventListener('input', onInput),\n () => window.removeEventListener('resize', onResize),\n () => document.removeEventListener('focus', onFocus, { capture: true } as EventListenerOptions),\n () => document.removeEventListener('blur', onBlur, { capture: true } as EventListenerOptions),\n );\n }\n\n private setupNetworkRecording(): void {\n if (!this.config.recordNetwork) return;\n\n const sdkEndpoint = this.config.replayEndpoint || this.config.endpoint;\n this.networkRecorder = new NetworkRecorder(\n (event) => {\n this.addEvent('network', event.data);\n },\n {\n captureHeaders: this.config.captureNetworkHeaders,\n // Skip recording our own SDK API calls\n urlFilter: (url) => !url.startsWith(sdkEndpoint),\n }\n );\n\n this.networkRecorder.start();\n }\n\n private setupConsoleRecording(): void {\n if (!this.config.recordConsole) return;\n\n this.consoleRecorder = new ConsoleRecorder(\n (event) => {\n this.addEvent('console', event.data);\n },\n {\n levels: this.config.consoleLevels,\n }\n );\n\n this.consoleRecorder.start();\n }\n\n /**\n * Start the buffer trim timer. Periodically removes events older\n * than bufferDuration to keep memory bounded.\n */\n private startTrimTimer(): void {\n this.trimTimer = setInterval(() => {\n this.trimBuffer();\n }, TRIM_INTERVAL);\n }\n\n private takeInteractionSnapshot(): void {\n const now = Date.now();\n if (now - this.lastSnapshotTime < this.snapshotCooldown) return;\n this.lastSnapshotTime = now;\n\n const snapshot = takeSnapshot({\n maskInputs: this.config.maskInputs,\n blockSelector: this.config.blockSelector,\n maskSelector: this.config.maskSelector,\n });\n if (snapshot) {\n this.addEvent('snapshot', snapshot);\n }\n }\n\n private getOrCreateSessionId(): string {\n const storageKey = '__sp_replay_session';\n try {\n const existing = sessionStorage.getItem(storageKey);\n if (existing) return existing;\n } catch { /* ignored */ }\n const id = `rep_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 10)}`;\n try { sessionStorage.setItem(storageKey, id); } catch { /* ignored */ }\n return id;\n }\n\n private getOrCreateStartTime(): number {\n const storageKey = '__sp_replay_start';\n try {\n const existing = sessionStorage.getItem(storageKey);\n if (existing) return parseInt(existing, 10);\n } catch { /* ignored */ }\n const now = Date.now();\n try { sessionStorage.setItem(storageKey, String(now)); } catch { /* ignored */ }\n return now;\n }\n\n private prefetchCrossOriginStylesheets(): void {\n if (typeof document === 'undefined') return;\n const links = document.querySelectorAll('link[rel=\"stylesheet\"]');\n for (const link of Array.from(links)) {\n const linkEl = link as HTMLLinkElement;\n if (linkEl.href && linkEl.sheet) {\n // Try to read rules — if it throws, it's cross-origin\n try {\n linkEl.sheet.cssRules;\n } catch {\n // SecurityError: cross-origin, try to fetch\n fetchCrossOriginStylesheet(linkEl.href).catch(() => {});\n }\n }\n }\n }\n\n private log(...args: unknown[]): void {\n if (this.config.debug) {\n console.log('[SitePong Replay]', ...args);\n }\n }\n}\n","/**\n * Tampering Detection Module\n * Detects browser, canvas, WebGL spoofing, VM usage, and request tampering.\n */\n\nexport interface TamperingResult {\n browserTampered: boolean;\n canvasTampered: boolean;\n webglTampered: boolean;\n vmDetected: boolean;\n geolocationSpoofed: boolean;\n mitmDetected: boolean;\n confidence: number;\n signals: TamperingSignals;\n}\n\nexport interface TamperingSignals {\n uaSpoofed: boolean;\n antiDetectBrowser: boolean;\n canvasNoise: boolean;\n canvasBlocked: boolean;\n webglSpoofed: boolean;\n webglBlocked: boolean;\n vmIndicators: string[];\n platformMismatch: boolean;\n pluginAnomaly: boolean;\n featureAnomaly: boolean;\n geolocationSpoofed: boolean;\n mitmIndicators: string[];\n}\n\n/**\n * Run all tampering detection checks\n */\nexport function detectTampering(): TamperingResult {\n const signals: TamperingSignals = {\n uaSpoofed: false,\n antiDetectBrowser: false,\n canvasNoise: false,\n canvasBlocked: false,\n webglSpoofed: false,\n webglBlocked: false,\n vmIndicators: [],\n platformMismatch: false,\n pluginAnomaly: false,\n featureAnomaly: false,\n geolocationSpoofed: false,\n mitmIndicators: [],\n };\n\n let confidence = 0;\n\n // Browser tampering\n const browserResult = detectBrowserTampering(signals);\n confidence += browserResult;\n\n // Canvas tampering\n const canvasResult = detectCanvasTampering(signals);\n confidence += canvasResult;\n\n // WebGL tampering\n const webglResult = detectWebGLTampering(signals);\n confidence += webglResult;\n\n // VM detection\n const vmResult = detectVM(signals);\n confidence += vmResult;\n\n // Geolocation spoofing\n const geoResult = detectGeolocationSpoofing(signals);\n confidence += geoResult;\n\n // MitM detection\n const mitmResult = detectMitM(signals);\n confidence += mitmResult;\n\n confidence = Math.min(confidence, 1);\n\n return {\n browserTampered: signals.uaSpoofed || signals.antiDetectBrowser || signals.platformMismatch,\n canvasTampered: signals.canvasNoise || signals.canvasBlocked,\n webglTampered: signals.webglSpoofed || signals.webglBlocked,\n vmDetected: signals.vmIndicators.length >= 2,\n geolocationSpoofed: signals.geolocationSpoofed,\n mitmDetected: signals.mitmIndicators.length >= 1,\n confidence,\n signals,\n };\n}\n\n/**\n * Detect user agent / browser fingerprint spoofing\n */\nfunction detectBrowserTampering(signals: TamperingSignals): number {\n if (typeof navigator === 'undefined' || typeof window === 'undefined') return 0;\n\n let score = 0;\n const ua = navigator.userAgent;\n const platform = (navigator as { platform?: string }).platform || '';\n\n // Check 1: Platform vs UA mismatch\n const isWindowsUA = /Windows/.test(ua);\n const isMacUA = /Mac/.test(ua);\n const isLinuxUA = /Linux/.test(ua) && !/Android/.test(ua);\n const isWindowsPlatform = /Win/.test(platform);\n const isMacPlatform = /Mac/.test(platform);\n const isLinuxPlatform = /Linux/.test(platform);\n\n if ((isWindowsUA && !isWindowsPlatform) ||\n (isMacUA && !isMacPlatform) ||\n (isLinuxUA && !isLinuxPlatform)) {\n signals.platformMismatch = true;\n signals.uaSpoofed = true;\n score += 0.3;\n }\n\n // Check 2: Chrome-specific feature detection vs UA claim\n const claimsChrome = /Chrome\\/\\d+/.test(ua) && !/Edge|OPR|Brave/.test(ua);\n if (claimsChrome) {\n // Chrome should have these properties\n const hasChromiumFeatures = 'chrome' in window ||\n 'CSS' in window && 'paintWorklet' in (window as { CSS?: { paintWorklet?: unknown } }).CSS!;\n if (!hasChromiumFeatures && !('brave' in navigator)) {\n signals.uaSpoofed = true;\n score += 0.2;\n }\n }\n\n // Check 3: Firefox feature detection vs UA claim\n const claimsFirefox = /Firefox\\/\\d+/.test(ua) && !/Seamonkey/.test(ua);\n if (claimsFirefox) {\n // Firefox has InstallTrigger\n const hasFirefoxFeatures = 'InstallTrigger' in window ||\n CSS.supports('-moz-appearance', 'none');\n if (!hasFirefoxFeatures) {\n signals.uaSpoofed = true;\n score += 0.2;\n }\n }\n\n // Check 4: Anti-detect browser patterns (Multilogin, GoLogin, Dolphin)\n // These often have inconsistencies in navigator properties\n const nav = navigator as Navigator & {\n userAgentData?: { brands?: Array<{ brand: string }> };\n getBattery?: () => Promise<unknown>;\n };\n\n if (nav.userAgentData?.brands) {\n const brands = nav.userAgentData.brands.map(b => b.brand);\n // Anti-detect browsers sometimes have empty or unusual brand lists\n if (brands.length === 0 || brands.every(b => b === '' || b === 'Not A;Brand')) {\n signals.antiDetectBrowser = true;\n score += 0.25;\n }\n }\n\n // Check 5: Plugin anomalies\n // Real browsers on desktop typically have at least some plugins\n if (!(/mobile|android|iphone|ipad/i.test(ua))) {\n const pluginCount = navigator.plugins?.length || 0;\n if (pluginCount === 0 && claimsChrome) {\n signals.pluginAnomaly = true;\n score += 0.1;\n }\n }\n\n // Check 6: Feature detection anomalies\n // Check if reported hardware matches expected capabilities\n const cores = navigator.hardwareConcurrency || 0;\n const memory = (navigator as { deviceMemory?: number }).deviceMemory || 0;\n if (cores > 0 && memory > 0) {\n // Extremely unusual: high core count with very low memory\n if (cores >= 16 && memory <= 1) {\n signals.featureAnomaly = true;\n score += 0.15;\n }\n }\n\n return Math.min(score, 0.5);\n}\n\n/**\n * Detect canvas fingerprint spoofing/noise injection\n */\nfunction detectCanvasTampering(signals: TamperingSignals): number {\n if (typeof document === 'undefined') return 0;\n\n let score = 0;\n\n try {\n const canvas = document.createElement('canvas');\n canvas.width = 100;\n canvas.height = 20;\n const ctx = canvas.getContext('2d');\n\n if (!ctx) {\n signals.canvasBlocked = true;\n return 0.1;\n }\n\n // Method 1: Draw the same thing twice and compare\n // Noise injectors add random noise, so two identical draws will differ\n ctx.fillStyle = '#ff0000';\n ctx.fillRect(0, 0, 100, 20);\n ctx.fillStyle = '#00ff00';\n ctx.font = '12px Arial';\n ctx.fillText('SitePong', 5, 14);\n const draw1 = canvas.toDataURL();\n\n // Clear and redraw exactly the same\n ctx.clearRect(0, 0, 100, 20);\n ctx.fillStyle = '#ff0000';\n ctx.fillRect(0, 0, 100, 20);\n ctx.fillStyle = '#00ff00';\n ctx.font = '12px Arial';\n ctx.fillText('SitePong', 5, 14);\n const draw2 = canvas.toDataURL();\n\n if (draw1 !== draw2) {\n signals.canvasNoise = true;\n score += 0.35;\n }\n\n // Method 2: Check for known canvas blocker behavior\n // Some blockers return a blank canvas or fixed hash\n const imageData = ctx.getImageData(0, 0, 100, 20);\n const pixels = imageData.data;\n let allZero = true;\n let allSame = true;\n const firstPixel = pixels[0];\n for (let i = 0; i < pixels.length; i += 4) {\n if (pixels[i] !== 0 || pixels[i + 1] !== 0 || pixels[i + 2] !== 0) {\n allZero = false;\n }\n if (pixels[i] !== firstPixel) {\n allSame = false;\n }\n }\n\n if (allZero || allSame) {\n signals.canvasBlocked = true;\n score += 0.2;\n }\n\n // Method 3: Check if toDataURL is overridden\n const toDataURLDesc = Object.getOwnPropertyDescriptor(\n HTMLCanvasElement.prototype, 'toDataURL'\n );\n if (toDataURLDesc && toDataURLDesc.value !== HTMLCanvasElement.prototype.toDataURL) {\n signals.canvasNoise = true;\n score += 0.3;\n }\n } catch {\n signals.canvasBlocked = true;\n score += 0.1;\n }\n\n return Math.min(score, 0.4);\n}\n\n/**\n * Detect WebGL fingerprint spoofing\n */\nfunction detectWebGLTampering(signals: TamperingSignals): number {\n if (typeof document === 'undefined') return 0;\n\n let score = 0;\n\n try {\n const canvas = document.createElement('canvas');\n const gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl');\n\n if (!gl || !(gl instanceof WebGLRenderingContext)) {\n signals.webglBlocked = true;\n return 0.1;\n }\n\n const debugInfo = gl.getExtension('WEBGL_debug_renderer_info');\n if (!debugInfo) {\n signals.webglBlocked = true;\n return 0.1;\n }\n\n const vendor = gl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL) as string;\n const renderer = gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL) as string;\n\n // Check 1: Known spoofed/generic values\n const spoofedVendors = ['Brian Paul', 'Mesa', 'VMware'];\n const spoofedRenderers = ['llvmpipe', 'softpipe', 'Mesa', 'SwiftShader'];\n\n // Note: SwiftShader is legitimate in some contexts but often indicates spoofing\n if (spoofedRenderers.some(s => renderer.includes(s)) &&\n !spoofedVendors.some(v => vendor.includes(v))) {\n signals.webglSpoofed = true;\n score += 0.25;\n }\n\n // Check 2: Renderer vs platform mismatch\n const ua = navigator.userAgent;\n const isMobile = /mobile|android|iphone|ipad/i.test(ua);\n const isDesktopGPU = /GeForce|Radeon|Intel.*HD|GTX|RTX|Vega/i.test(renderer);\n\n if (isMobile && isDesktopGPU) {\n signals.webglSpoofed = true;\n score += 0.3;\n }\n\n // Check 3: Check if getParameter is overridden\n const getParamDesc = Object.getOwnPropertyDescriptor(\n WebGLRenderingContext.prototype, 'getParameter'\n );\n if (getParamDesc && typeof getParamDesc.value === 'function') {\n // Check if it's a native function\n const fnStr = getParamDesc.value.toString();\n if (!fnStr.includes('[native code]')) {\n signals.webglSpoofed = true;\n score += 0.35;\n }\n }\n\n // Check 4: Extensions consistency\n const extensions = gl.getSupportedExtensions() || [];\n // Desktop GPUs should support many extensions; very few suggests blocking\n if (extensions.length < 5 && isDesktopGPU) {\n signals.webglSpoofed = true;\n score += 0.1;\n }\n } catch {\n signals.webglBlocked = true;\n score += 0.1;\n }\n\n return Math.min(score, 0.4);\n}\n\n/**\n * Detect virtual machine environment\n */\nfunction detectVM(signals: TamperingSignals): number {\n if (typeof navigator === 'undefined' || typeof window === 'undefined') return 0;\n\n const indicators: string[] = [];\n const ua = navigator.userAgent;\n\n // Check 1: WebGL renderer often reveals VM\n try {\n const canvas = document.createElement('canvas');\n const gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl');\n if (gl && gl instanceof WebGLRenderingContext) {\n const debugInfo = gl.getExtension('WEBGL_debug_renderer_info');\n if (debugInfo) {\n const renderer = (gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL) as string).toLowerCase();\n const vendor = (gl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL) as string).toLowerCase();\n\n const vmRenderers = ['vmware', 'virtualbox', 'hyper-v', 'parallels', 'qemu', 'llvmpipe', 'mesa'];\n const vmVendors = ['vmware', 'innotek', 'microsoft basic', 'parallels'];\n\n for (const vm of vmRenderers) {\n if (renderer.includes(vm)) {\n indicators.push(`webgl_renderer:${vm}`);\n }\n }\n for (const vm of vmVendors) {\n if (vendor.includes(vm)) {\n indicators.push(`webgl_vendor:${vm}`);\n }\n }\n }\n }\n } catch {\n // WebGL not available\n }\n\n // Check 2: Screen resolution commonly used by VMs\n if (typeof screen !== 'undefined') {\n const w = screen.width;\n const h = screen.height;\n const vmResolutions = [\n [800, 600], [1024, 768], [1280, 800],\n ];\n if (vmResolutions.some(([vw, vh]) => w === vw && h === vh) &&\n screen.colorDepth === 24 &&\n navigator.hardwareConcurrency <= 2) {\n indicators.push('vm_resolution');\n }\n }\n\n // Check 3: Low hardware specs suggesting VM\n const cores = navigator.hardwareConcurrency || 0;\n const memory = (navigator as { deviceMemory?: number }).deviceMemory || 0;\n if (cores > 0 && cores <= 2 && memory > 0 && memory <= 2) {\n // Very low specs with desktop UA suggests VM\n if (!(/mobile|android|iphone/i.test(ua))) {\n indicators.push('low_hw_specs');\n }\n }\n\n // Check 4: Battery API - VMs often report no battery\n if ('getBattery' in navigator) {\n // Presence of battery API but no battery (desktop without battery = likely VM)\n // We can't async here, so just note the capability\n }\n\n // Check 5: Timing-based detection\n // VMs often have less precise timing\n if (typeof performance !== 'undefined') {\n const times: number[] = [];\n for (let i = 0; i < 10; i++) {\n times.push(performance.now());\n }\n // Check if timing precision is suspiciously low (coarsened by VM)\n const uniqueTimes = new Set(times.map(t => Math.floor(t * 1000)));\n if (uniqueTimes.size <= 3 && times.length === 10) {\n indicators.push('coarse_timing');\n }\n }\n\n // Check 6: Cloud VM detection via connection characteristics\n if (typeof navigator !== 'undefined') {\n const connection = (navigator as Navigator & { connection?: { downlink?: number; rtt?: number } }).connection;\n if (connection) {\n // Cloud VMs often have very high bandwidth and very low RTT\n if (connection.downlink && connection.downlink >= 10 &&\n connection.rtt && connection.rtt <= 5) {\n indicators.push('cloud_vm_network');\n }\n }\n }\n\n signals.vmIndicators = indicators;\n\n // Score based on number of indicators\n const vmScore = Math.min(indicators.length * 0.15, 0.5);\n return vmScore;\n}\n\n/**\n * Detect geolocation spoofing (fake GPS apps, location overrides)\n */\nfunction detectGeolocationSpoofing(signals: TamperingSignals): number {\n if (typeof navigator === 'undefined') return 0;\n\n let score = 0;\n\n // Check 1: Geolocation API override detection\n if ('geolocation' in navigator) {\n const geoDesc = Object.getOwnPropertyDescriptor(navigator, 'geolocation');\n if (geoDesc && geoDesc.configurable === false && geoDesc.get) {\n // If geolocation getter has been overridden\n const fnStr = geoDesc.get.toString();\n if (!fnStr.includes('[native code]')) {\n signals.geolocationSpoofed = true;\n score += 0.3;\n }\n }\n\n // Check if getCurrentPosition is overridden\n try {\n const getCurrentPositionDesc = Object.getOwnPropertyDescriptor(\n Geolocation.prototype, 'getCurrentPosition'\n );\n if (getCurrentPositionDesc?.value) {\n const fnStr = getCurrentPositionDesc.value.toString();\n if (!fnStr.includes('[native code]')) {\n signals.geolocationSpoofed = true;\n score += 0.3;\n }\n }\n } catch {\n // Can't check\n }\n }\n\n // Check 2: Check for mock location indicators in DevTools override\n // Chrome's sensor emulation sets a specific flag we can detect indirectly\n if (typeof window !== 'undefined') {\n try {\n // DevTools override often leaves __defineGetter__ traces\n const navProto = Object.getPrototypeOf(navigator);\n const geoGetter = Object.getOwnPropertyDescriptor(navProto, 'geolocation');\n if (geoGetter && geoGetter.get && !geoGetter.get.toString().includes('[native code]')) {\n signals.geolocationSpoofed = true;\n score += 0.2;\n }\n } catch {\n // Can't access\n }\n }\n\n return Math.min(score, 0.4);\n}\n\n/**\n * Detect Man-in-the-Middle attacks (request interception, SSL anomalies)\n */\nfunction detectMitM(signals: TamperingSignals): number {\n if (typeof window === 'undefined' || typeof document === 'undefined') return 0;\n\n const indicators: string[] = [];\n\n // Check 1: Mixed content detection\n // If we're on HTTPS but resources load over HTTP, something is intercepting\n if (window.location?.protocol === 'https:') {\n // Check if any injected scripts are loading over HTTP\n const scripts = document.querySelectorAll('script[src]');\n for (let i = 0; i < scripts.length; i++) {\n const src = scripts[i].getAttribute('src') || '';\n if (src.startsWith('http://') && !src.includes('localhost')) {\n indicators.push('mixed_content_script');\n break;\n }\n }\n }\n\n // Check 2: Unexpected iframes (common in proxy/MitM injections)\n const iframes = document.querySelectorAll('iframe');\n for (let i = 0; i < iframes.length; i++) {\n const src = iframes[i].getAttribute('src') || '';\n if (src && !src.startsWith(window.location?.origin || '') && !src.startsWith('about:') && !src.startsWith('javascript:')) {\n // Check if it's invisible (hidden injection)\n const style = window.getComputedStyle(iframes[i]);\n if (style.display === 'none' || style.visibility === 'hidden' ||\n parseInt(style.width) <= 1 || parseInt(style.height) <= 1) {\n indicators.push('hidden_iframe');\n }\n }\n }\n\n // Check 3: Service Worker hijacking\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.getRegistrations().then(registrations => {\n for (const reg of registrations) {\n const swUrl = reg.active?.scriptURL || '';\n if (swUrl && !swUrl.startsWith(window.location?.origin || '')) {\n indicators.push('foreign_service_worker');\n }\n }\n }).catch(() => { /* Can't check */ });\n }\n\n // Check 4: Proxy detection via performance timing\n if (typeof performance !== 'undefined' && performance.getEntriesByType) {\n try {\n const nav = performance.getEntriesByType('navigation')[0] as PerformanceNavigationTiming;\n if (nav) {\n // Extremely high connect time can indicate proxy\n const connectTime = nav.connectEnd - nav.connectStart;\n const tlsTime = nav.requestStart - nav.secureConnectionStart;\n if (connectTime > 1000 && tlsTime > 500) {\n indicators.push('slow_tls_handshake');\n }\n }\n } catch {\n // Performance API not available\n }\n }\n\n // Check 5: Certificate transparency check (indirect)\n // If the page loaded successfully over HTTPS but connection info shows anomalies\n if (window.location?.protocol === 'https:' && typeof performance !== 'undefined') {\n try {\n const resources = performance.getEntriesByType('resource') as PerformanceResourceTiming[];\n for (const resource of resources.slice(0, 20)) {\n // Resources with 0 transfer size but positive encoded size indicate interception\n if (resource.transferSize === 0 && resource.encodedBodySize > 0 && !resource.name.includes('cache')) {\n indicators.push('intercepted_resource');\n break;\n }\n }\n } catch {\n // Can't check\n }\n }\n\n signals.mitmIndicators = indicators;\n\n return Math.min(indicators.length * 0.2, 0.5);\n}\n","/**\n * Signal Collection\n * Collects device signals for fingerprinting and fraud detection\n */\n\nimport type { CoreSignals, ExtendedSignals, DeviceSignals, SmartSignals, StableFingerprint } from './types';\nimport { detectTampering } from './tampering';\n\nexport function collectCoreSignals(): CoreSignals {\n return {\n userAgent: typeof navigator !== 'undefined' ? navigator.userAgent : '',\n language: typeof navigator !== 'undefined' ? navigator.language : '',\n languages: typeof navigator !== 'undefined' ? Array.from(navigator.languages || []) : [],\n platform: typeof navigator !== 'undefined' ? (navigator as { platform?: string }).platform || '' : '',\n screenWidth: typeof screen !== 'undefined' ? screen.width : 0,\n screenHeight: typeof screen !== 'undefined' ? screen.height : 0,\n screenColorDepth: typeof screen !== 'undefined' ? screen.colorDepth : 0,\n devicePixelRatio: typeof window !== 'undefined' ? window.devicePixelRatio || 1 : 1,\n timezoneOffset: new Date().getTimezoneOffset(),\n timezone: Intl?.DateTimeFormat?.()?.resolvedOptions?.()?.timeZone || '',\n sessionStorage: hasSessionStorage(),\n localStorage: hasLocalStorage(),\n indexedDB: typeof indexedDB !== 'undefined',\n cookieEnabled: typeof navigator !== 'undefined' ? navigator.cookieEnabled : false,\n hardwareConcurrency: typeof navigator !== 'undefined' ? navigator.hardwareConcurrency || 0 : 0,\n maxTouchPoints: typeof navigator !== 'undefined' ? navigator.maxTouchPoints || 0 : 0,\n deviceMemory: typeof navigator !== 'undefined' ? (navigator as { deviceMemory?: number }).deviceMemory : undefined,\n };\n}\n\nexport async function collectExtendedSignals(): Promise<ExtendedSignals> {\n const signals: ExtendedSignals = {};\n\n signals.canvasFingerprint = getCanvasFingerprint();\n const webgl = getWebGLInfo();\n signals.webglVendor = webgl.vendor;\n signals.webglRenderer = webgl.renderer;\n signals.audioFingerprint = await getAudioFingerprint();\n signals.fontFingerprint = getFontFingerprint();\n signals.mathFingerprint = getMathFingerprint();\n signals.webglRenderHash = getWebGLRenderHash();\n signals.cssFeatureHash = getCssFeatureHash();\n signals.localIps = await getLocalIps();\n\n return signals;\n}\n\nexport async function collectDeviceSignals(includeExtended: boolean): Promise<DeviceSignals> {\n const core = collectCoreSignals();\n const signals: DeviceSignals = { ...core };\n\n if (includeExtended) {\n signals.extended = await collectExtendedSignals();\n }\n\n const smart = collectSmartSignals();\n signals.smart = smart;\n // Keep deprecated fields for backward compat\n signals.incognito = smart.incognito;\n signals.bot = smart.bot;\n\n return signals;\n}\n\nexport async function getStableFingerprint(signals: DeviceSignals): Promise<StableFingerprint> {\n const stable: StableFingerprint = {\n userAgent: signals.userAgent,\n language: signals.language,\n languages: signals.languages,\n platform: signals.platform,\n screenWidth: signals.screenWidth,\n screenHeight: signals.screenHeight,\n screenColorDepth: signals.screenColorDepth,\n devicePixelRatio: signals.devicePixelRatio,\n timezoneOffset: signals.timezoneOffset,\n timezone: signals.timezone,\n hardwareConcurrency: signals.hardwareConcurrency,\n maxTouchPoints: signals.maxTouchPoints,\n deviceMemory: signals.deviceMemory,\n };\n\n if (signals.extended) {\n stable.canvasFingerprint = signals.extended.canvasFingerprint;\n stable.webglVendor = signals.extended.webglVendor;\n stable.webglRenderer = signals.extended.webglRenderer;\n stable.audioFingerprint = signals.extended.audioFingerprint;\n stable.fontFingerprint = signals.extended.fontFingerprint;\n stable.mathFingerprint = signals.extended.mathFingerprint;\n stable.webglRenderHash = signals.extended.webglRenderHash;\n stable.cssFeatureHash = signals.extended.cssFeatureHash;\n stable.localIps = signals.extended.localIps;\n }\n\n return stable;\n}\n\nexport function collectSmartSignals(): SmartSignals {\n const signals: SmartSignals = {};\n\n signals.incognito = detectIncognito();\n signals.bot = detectBot();\n signals.privacyBrowser = detectPrivacyBrowser();\n signals.devToolsOpen = detectDevTools();\n signals.connectionType = getConnectionType();\n signals.doNotTrack = getDoNotTrack();\n signals.notificationsEnabled = getNotificationsPermission();\n\n // Device age tracking\n const deviceAge = getDeviceAge();\n signals.deviceFirstSeen = deviceAge.firstSeen;\n signals.deviceVisitCount = deviceAge.visitCount;\n\n // Tampering detection\n const tampering = detectTampering();\n signals.browserTampered = tampering.browserTampered;\n signals.canvasTampered = tampering.canvasTampered;\n signals.webglTampered = tampering.webglTampered;\n signals.vmDetected = tampering.vmDetected;\n signals.vmIndicators = tampering.signals.vmIndicators;\n\n return signals;\n}\n\nfunction hasSessionStorage(): boolean {\n try {\n const key = '__sp_test__';\n sessionStorage.setItem(key, '1');\n sessionStorage.removeItem(key);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction hasLocalStorage(): boolean {\n try {\n const key = '__sp_test__';\n localStorage.setItem(key, '1');\n localStorage.removeItem(key);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction getCanvasFingerprint(): string | undefined {\n if (typeof document === 'undefined') return undefined;\n\n try {\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n if (!ctx) return undefined;\n\n canvas.width = 200;\n canvas.height = 50;\n\n ctx.textBaseline = 'top';\n ctx.font = '14px Arial';\n ctx.fillStyle = '#f60';\n ctx.fillRect(0, 0, 200, 50);\n ctx.fillStyle = '#069';\n ctx.fillText('SitePong fingerprint', 2, 15);\n ctx.fillStyle = 'rgba(102, 204, 0, 0.7)';\n ctx.fillText('SitePong fingerprint', 4, 17);\n\n return hashString(canvas.toDataURL());\n } catch {\n return undefined;\n }\n}\n\nfunction getWebGLInfo(): { vendor?: string; renderer?: string } {\n if (typeof document === 'undefined') return {};\n\n try {\n const canvas = document.createElement('canvas');\n const gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl');\n if (!gl || !(gl instanceof WebGLRenderingContext)) return {};\n\n const debugInfo = gl.getExtension('WEBGL_debug_renderer_info');\n if (!debugInfo) return {};\n\n return {\n vendor: gl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL) as string,\n renderer: gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL) as string,\n };\n } catch {\n return {};\n }\n}\n\nasync function getAudioFingerprint(): Promise<string | undefined> {\n if (typeof window === 'undefined' || typeof OfflineAudioContext === 'undefined') {\n return undefined;\n }\n\n try {\n const context = new OfflineAudioContext(1, 4500, 44100);\n const oscillator = context.createOscillator();\n oscillator.type = 'triangle';\n oscillator.frequency.setValueAtTime(10000, context.currentTime);\n\n const compressor = context.createDynamicsCompressor();\n compressor.threshold.setValueAtTime(-50, context.currentTime);\n compressor.knee.setValueAtTime(40, context.currentTime);\n compressor.ratio.setValueAtTime(12, context.currentTime);\n compressor.attack.setValueAtTime(0, context.currentTime);\n compressor.release.setValueAtTime(0.25, context.currentTime);\n\n oscillator.connect(compressor);\n compressor.connect(context.destination);\n oscillator.start(0);\n\n const buffer = await context.startRendering();\n const data = buffer.getChannelData(0);\n\n // Hash a subset of the rendered audio samples\n let sum = 0;\n for (let i = 4000; i < 4500; i++) {\n sum += Math.abs(data[i]!);\n }\n return hashString(`audio:${sum.toFixed(6)}`);\n } catch {\n return undefined;\n }\n}\n\nfunction detectIncognito(): boolean {\n if (typeof window === 'undefined') return false;\n\n try {\n // Method 1: Safari incognito - localStorage quota is restricted\n const testKey = '__sp_incognito_test__';\n try {\n localStorage.setItem(testKey, new Array(100).join('x'));\n localStorage.removeItem(testKey);\n } catch {\n return true;\n }\n\n // Method 2: Firefox - IndexedDB not available in private mode\n if (typeof indexedDB !== 'undefined') {\n try {\n const db = indexedDB.open('__sp_test__');\n db.onerror = () => { /* detected */ };\n } catch {\n return true;\n }\n }\n\n // Method 3: Check if FileSystem API is restricted (Chrome < 76)\n if ('webkitRequestFileSystem' in window) {\n let detected = false;\n try {\n (window as Window & { webkitRequestFileSystem: (type: number, size: number, success: () => void, error: () => void) => void }).webkitRequestFileSystem(\n 0, 1,\n () => { detected = false; },\n () => { detected = true; }\n );\n } catch {\n // Not available\n }\n if (detected) return true;\n }\n\n // Method 4: Check performance.memory (Chrome) - reduced in incognito\n const perf = performance as Performance & { memory?: { jsHeapSizeLimit?: number } };\n if (perf.memory) {\n // Incognito Chrome often has lower heap limits\n const heapLimit = perf.memory.jsHeapSizeLimit || 0;\n if (heapLimit > 0 && heapLimit < 1073741824) { // < 1GB\n return true;\n }\n }\n\n return false;\n } catch {\n return false;\n }\n}\n\nfunction detectBot(): boolean {\n if (typeof navigator === 'undefined') return false;\n\n const ua = navigator.userAgent.toLowerCase();\n const botPatterns = [\n 'bot', 'crawler', 'spider', 'headless', 'phantom',\n 'puppeteer', 'selenium', 'webdriver', 'playwright',\n ];\n\n if (botPatterns.some(pattern => ua.includes(pattern))) {\n return true;\n }\n\n // Check for webdriver property\n if ('webdriver' in navigator && (navigator as { webdriver?: boolean }).webdriver) {\n return true;\n }\n\n // Check for zero plugins (common in headless)\n if (navigator.plugins && navigator.plugins.length === 0 && !/mobile|android|iphone/i.test(ua)) {\n return true;\n }\n\n return false;\n}\n\nfunction detectPrivacyBrowser(): boolean {\n if (typeof navigator === 'undefined') return false;\n const ua = navigator.userAgent.toLowerCase();\n\n // Brave browser\n if ('brave' in navigator) return true;\n\n // Firefox Focus / Firefox private\n if (ua.includes('focus') && ua.includes('firefox')) return true;\n\n // DuckDuckGo browser\n if (ua.includes('duckduckgo')) return true;\n\n // Tor browser (modified Firefox with specific characteristics)\n if (typeof window !== 'undefined') {\n // Tor browser reports specific screen dimensions\n if (screen.width === 1000 && screen.height === 1000) return true;\n // Tor browser spoofs timezone to UTC\n if (new Date().getTimezoneOffset() === 0 && navigator.language !== 'en') return true;\n }\n\n return false;\n}\n\nfunction detectDevTools(): boolean {\n if (typeof window === 'undefined') return false;\n\n try {\n // Method 1: Check window size difference (devtools takes space)\n const widthThreshold = window.outerWidth - window.innerWidth > 160;\n const heightThreshold = window.outerHeight - window.innerHeight > 160;\n if (widthThreshold || heightThreshold) return true;\n } catch {\n // Ignore\n }\n\n return false;\n}\n\nfunction getConnectionType(): string | undefined {\n if (typeof navigator === 'undefined') return undefined;\n const connection = (navigator as Navigator & { connection?: { effectiveType?: string; type?: string } }).connection;\n if (!connection) return undefined;\n return connection.effectiveType || connection.type || undefined;\n}\n\nfunction getDoNotTrack(): boolean {\n if (typeof navigator === 'undefined') return false;\n const dnt = (navigator as Navigator & { doNotTrack?: string }).doNotTrack;\n return dnt === '1' || dnt === 'yes';\n}\n\nfunction getNotificationsPermission(): boolean {\n if (typeof Notification === 'undefined') return false;\n return Notification.permission === 'granted';\n}\n\nfunction getDeviceAge(): { firstSeen?: string; visitCount: number } {\n const STORAGE_KEY = 'sitepong_device_age';\n const result: { firstSeen?: string; visitCount: number } = { visitCount: 1 };\n\n if (typeof localStorage === 'undefined') return result;\n\n try {\n const stored = localStorage.getItem(STORAGE_KEY);\n if (stored) {\n const parsed = JSON.parse(stored);\n result.firstSeen = parsed.firstSeen;\n result.visitCount = (parsed.visitCount || 0) + 1;\n } else {\n result.firstSeen = new Date().toISOString();\n }\n\n // Update stored value\n localStorage.setItem(STORAGE_KEY, JSON.stringify({\n firstSeen: result.firstSeen,\n visitCount: result.visitCount,\n }));\n } catch {\n // Storage not available\n }\n\n return result;\n}\n\nfunction getFontFingerprint(): string | undefined {\n if (typeof document === 'undefined') return undefined;\n\n try {\n const baseFonts = ['monospace', 'sans-serif', 'serif'] as const;\n const testFonts = [\n 'Arial', 'Arial Black', 'Courier New', 'Georgia', 'Helvetica',\n 'Impact', 'Lucida Console', 'Lucida Sans Unicode', 'Palatino Linotype',\n 'Tahoma', 'Times New Roman', 'Trebuchet MS', 'Verdana',\n 'Comic Sans MS', 'Courier', 'Garamond', 'Monaco',\n ];\n\n const testString = 'mmmmmmmmmmlli';\n const testSize = '72px';\n\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n if (!ctx) return undefined;\n\n // Measure baseline widths\n const baseWidths: Record<string, number> = {};\n for (const base of baseFonts) {\n ctx.font = `${testSize} ${base}`;\n baseWidths[base] = ctx.measureText(testString).width;\n }\n\n // Test each font against baselines\n const detected: string[] = [];\n for (const font of testFonts) {\n for (const base of baseFonts) {\n ctx.font = `${testSize} '${font}', ${base}`;\n const width = ctx.measureText(testString).width;\n if (width !== baseWidths[base]) {\n detected.push(font);\n break;\n }\n }\n }\n\n return hashString(detected.join(','));\n } catch {\n return undefined;\n }\n}\n\nfunction getMathFingerprint(): string | undefined {\n try {\n const results = [\n Math.tan(-1e300),\n Math.log(1e-10),\n Math.pow(Math.PI, -100),\n Math.acos(0.5),\n Math.atan2(1, 1),\n Math.exp(1),\n Math.sinh(1),\n ];\n return hashString(results.map(r => r.toString()).join(','));\n } catch {\n return undefined;\n }\n}\n\nfunction getWebGLRenderHash(): string | undefined {\n if (typeof document === 'undefined') return undefined;\n\n try {\n const canvas = document.createElement('canvas');\n canvas.width = 50;\n canvas.height = 50;\n const gl = canvas.getContext('webgl');\n if (!gl) return undefined;\n\n // Draw a simple colored triangle\n const vs = gl.createShader(gl.VERTEX_SHADER)!;\n gl.shaderSource(vs, `attribute vec2 p;void main(){gl_Position=vec4(p,0,1);}`);\n gl.compileShader(vs);\n\n const fs = gl.createShader(gl.FRAGMENT_SHADER)!;\n gl.shaderSource(fs, `precision mediump float;void main(){gl_FragColor=vec4(.86,.27,.33,1);}`);\n gl.compileShader(fs);\n\n const prog = gl.createProgram()!;\n gl.attachShader(prog, vs);\n gl.attachShader(prog, fs);\n gl.linkProgram(prog);\n gl.useProgram(prog);\n\n const buf = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, buf);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([0, 0.5, -0.5, -0.5, 0.5, -0.5]), gl.STATIC_DRAW);\n\n const loc = gl.getAttribLocation(prog, 'p');\n gl.enableVertexAttribArray(loc);\n gl.vertexAttribPointer(loc, 2, gl.FLOAT, false, 0, 0);\n\n gl.clearColor(0, 0, 0, 1);\n gl.clear(gl.COLOR_BUFFER_BIT);\n gl.drawArrays(gl.TRIANGLES, 0, 3);\n\n return hashString(canvas.toDataURL());\n } catch {\n return undefined;\n }\n}\n\nfunction getCssFeatureHash(): string | undefined {\n if (typeof CSS === 'undefined' || typeof CSS.supports !== 'function') return undefined;\n\n try {\n const features = [\n 'display: grid', 'display: flex', 'display: contents',\n 'position: sticky', 'backdrop-filter: blur(1px)',\n 'gap: 1px', 'aspect-ratio: 1', 'contain: paint',\n 'overflow: clip', 'accent-color: red',\n 'color: oklch(0.5 0.2 0)', 'container-type: inline-size',\n 'text-wrap: balance', 'view-transition-name: x',\n 'anchor-name: --x', 'field-sizing: content',\n ];\n\n const supported = features.map(f => CSS.supports(f) ? '1' : '0').join('');\n return hashString(supported);\n } catch {\n return undefined;\n }\n}\n\nasync function getLocalIps(): Promise<string[] | undefined> {\n if (typeof window === 'undefined' || typeof RTCPeerConnection === 'undefined') {\n return undefined;\n }\n\n try {\n const ips = new Set<string>();\n const pc = new RTCPeerConnection({ iceServers: [] });\n pc.createDataChannel('');\n\n const offer = await pc.createOffer();\n await pc.setLocalDescription(offer);\n\n return new Promise<string[] | undefined>((resolve) => {\n const timeout = setTimeout(() => {\n pc.close();\n resolve(ips.size > 0 ? Array.from(ips) : undefined);\n }, 1000);\n\n pc.onicecandidate = (event) => {\n if (!event.candidate) {\n clearTimeout(timeout);\n pc.close();\n resolve(ips.size > 0 ? Array.from(ips) : undefined);\n return;\n }\n const match = event.candidate.candidate.match(\n /([0-9]{1,3}\\.([0-9]{1,3}\\.){2}[0-9]{1,3})/\n );\n if (match && match[1] && !match[1].startsWith('0.')) {\n ips.add(match[1]);\n }\n };\n });\n } catch {\n return undefined;\n }\n}\n\nfunction hashString(str: string): string {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash;\n }\n return Math.abs(hash).toString(16);\n}\n","/**\n * Behavior Analysis Module\n * Captures mouse movement, keystroke, scroll, and click patterns\n * for bot/automation detection scoring.\n */\n\nexport interface BehaviorMetrics {\n mouse: MouseMetrics;\n keyboard: KeyboardMetrics;\n scroll: ScrollMetrics;\n clicks: ClickMetrics;\n score: number; // 0.0 (bot-like) to 1.0 (human-like)\n}\n\ninterface MouseMetrics {\n totalMovements: number;\n averageSpeed: number;\n maxSpeed: number;\n averageAcceleration: number;\n straightLineRatio: number; // Proportion of straight-line movements\n jitter: number; // Small random movements (humans have jitter)\n hasMovement: boolean;\n}\n\ninterface KeyboardMetrics {\n totalKeystrokes: number;\n averageInterval: number;\n intervalVariance: number; // Humans have high variance\n holdTimeAverage: number;\n holdTimeVariance: number;\n hasKeystrokes: boolean;\n}\n\ninterface ScrollMetrics {\n totalScrolls: number;\n averageSpeed: number;\n smoothness: number; // Humans have smoother scrolling\n hasScroll: boolean;\n}\n\ninterface ClickMetrics {\n totalClicks: number;\n averageInterval: number;\n intervalVariance: number;\n doubleClickCount: number;\n hasClicks: boolean;\n}\n\ninterface Point {\n x: number;\n y: number;\n t: number;\n}\n\nexport class BehaviorAnalyzer {\n private mousePoints: Point[] = [];\n private keyDownTimes: Map<string, number> = new Map();\n private keyIntervals: number[] = [];\n private keyHoldTimes: number[] = [];\n private lastKeyTime = 0;\n private scrollEvents: Array<{ deltaY: number; t: number }> = [];\n private clickTimes: number[] = [];\n private running = false;\n\n private readonly maxSamples = 500;\n\n private handleMouseMove = (e: MouseEvent) => {\n if (this.mousePoints.length >= this.maxSamples) return;\n this.mousePoints.push({ x: e.clientX, y: e.clientY, t: Date.now() });\n };\n\n private handleKeyDown = (e: KeyboardEvent) => {\n if (this.keyIntervals.length >= this.maxSamples) return;\n const now = Date.now();\n this.keyDownTimes.set(e.key, now);\n if (this.lastKeyTime > 0) {\n this.keyIntervals.push(now - this.lastKeyTime);\n }\n this.lastKeyTime = now;\n };\n\n private handleKeyUp = (e: KeyboardEvent) => {\n const downTime = this.keyDownTimes.get(e.key);\n if (downTime) {\n this.keyHoldTimes.push(Date.now() - downTime);\n this.keyDownTimes.delete(e.key);\n }\n };\n\n private handleScroll = () => {\n if (this.scrollEvents.length >= this.maxSamples) return;\n this.scrollEvents.push({ deltaY: window.scrollY, t: Date.now() });\n };\n\n private handleClick = () => {\n if (this.clickTimes.length >= this.maxSamples) return;\n this.clickTimes.push(Date.now());\n };\n\n start(): void {\n if (this.running || typeof window === 'undefined' || typeof window.addEventListener !== 'function') return;\n this.running = true;\n window.addEventListener('mousemove', this.handleMouseMove, { passive: true });\n window.addEventListener('keydown', this.handleKeyDown, { passive: true });\n window.addEventListener('keyup', this.handleKeyUp, { passive: true });\n window.addEventListener('scroll', this.handleScroll, { passive: true });\n window.addEventListener('click', this.handleClick, { passive: true });\n }\n\n stop(): void {\n if (!this.running || typeof window === 'undefined' || typeof window.removeEventListener !== 'function') return;\n this.running = false;\n window.removeEventListener('mousemove', this.handleMouseMove);\n window.removeEventListener('keydown', this.handleKeyDown);\n window.removeEventListener('keyup', this.handleKeyUp);\n window.removeEventListener('scroll', this.handleScroll);\n window.removeEventListener('click', this.handleClick);\n }\n\n getMetrics(): BehaviorMetrics {\n const mouse = this.analyzeMouseMovement();\n const keyboard = this.analyzeKeyboard();\n const scroll = this.analyzeScroll();\n const clicks = this.analyzeClicks();\n const score = this.calculateHumanScore(mouse, keyboard, scroll, clicks);\n\n return { mouse, keyboard, scroll, clicks, score };\n }\n\n reset(): void {\n this.mousePoints = [];\n this.keyDownTimes.clear();\n this.keyIntervals = [];\n this.keyHoldTimes = [];\n this.lastKeyTime = 0;\n this.scrollEvents = [];\n this.clickTimes = [];\n }\n\n private analyzeMouseMovement(): MouseMetrics {\n if (this.mousePoints.length < 3) {\n return {\n totalMovements: this.mousePoints.length,\n averageSpeed: 0,\n maxSpeed: 0,\n averageAcceleration: 0,\n straightLineRatio: 0,\n jitter: 0,\n hasMovement: false,\n };\n }\n\n const speeds: number[] = [];\n const accelerations: number[] = [];\n let straightSegments = 0;\n let totalSegments = 0;\n let jitterSum = 0;\n\n for (let i = 1; i < this.mousePoints.length; i++) {\n const prev = this.mousePoints[i - 1];\n const curr = this.mousePoints[i];\n const dt = (curr.t - prev.t) || 1;\n const dx = curr.x - prev.x;\n const dy = curr.y - prev.y;\n const distance = Math.sqrt(dx * dx + dy * dy);\n const speed = distance / dt;\n speeds.push(speed);\n\n // Jitter: small movements\n if (distance < 3 && distance > 0) {\n jitterSum++;\n }\n\n // Straightness: check if 3 consecutive points are collinear\n if (i >= 2) {\n const pp = this.mousePoints[i - 2];\n const expectedX = pp.x + (curr.x - pp.x) * ((prev.t - pp.t) / (curr.t - pp.t));\n const expectedY = pp.y + (curr.y - pp.y) * ((prev.t - pp.t) / (curr.t - pp.t));\n const deviation = Math.sqrt((prev.x - expectedX) ** 2 + (prev.y - expectedY) ** 2);\n totalSegments++;\n if (deviation < 2) straightSegments++;\n }\n\n if (i >= 2) {\n const prevSpeed = speeds[speeds.length - 2] || 0;\n accelerations.push(Math.abs(speed - prevSpeed) / dt);\n }\n }\n\n const avgSpeed = speeds.reduce((a, b) => a + b, 0) / speeds.length;\n const maxSpeed = Math.max(...speeds);\n const avgAccel = accelerations.length > 0\n ? accelerations.reduce((a, b) => a + b, 0) / accelerations.length\n : 0;\n\n return {\n totalMovements: this.mousePoints.length,\n averageSpeed: Math.round(avgSpeed * 1000) / 1000,\n maxSpeed: Math.round(maxSpeed * 1000) / 1000,\n averageAcceleration: Math.round(avgAccel * 1000) / 1000,\n straightLineRatio: totalSegments > 0 ? straightSegments / totalSegments : 0,\n jitter: this.mousePoints.length > 0 ? jitterSum / this.mousePoints.length : 0,\n hasMovement: true,\n };\n }\n\n private analyzeKeyboard(): KeyboardMetrics {\n if (this.keyIntervals.length < 2) {\n return {\n totalKeystrokes: this.keyIntervals.length,\n averageInterval: 0,\n intervalVariance: 0,\n holdTimeAverage: 0,\n holdTimeVariance: 0,\n hasKeystrokes: false,\n };\n }\n\n const avgInterval = this.keyIntervals.reduce((a, b) => a + b, 0) / this.keyIntervals.length;\n const intervalVar = this.variance(this.keyIntervals);\n\n const avgHold = this.keyHoldTimes.length > 0\n ? this.keyHoldTimes.reduce((a, b) => a + b, 0) / this.keyHoldTimes.length\n : 0;\n const holdVar = this.keyHoldTimes.length > 0\n ? this.variance(this.keyHoldTimes)\n : 0;\n\n return {\n totalKeystrokes: this.keyIntervals.length + 1,\n averageInterval: Math.round(avgInterval),\n intervalVariance: Math.round(intervalVar),\n holdTimeAverage: Math.round(avgHold),\n holdTimeVariance: Math.round(holdVar),\n hasKeystrokes: true,\n };\n }\n\n private analyzeScroll(): ScrollMetrics {\n if (this.scrollEvents.length < 2) {\n return { totalScrolls: this.scrollEvents.length, averageSpeed: 0, smoothness: 0, hasScroll: false };\n }\n\n const speeds: number[] = [];\n const deltas: number[] = [];\n\n for (let i = 1; i < this.scrollEvents.length; i++) {\n const dt = (this.scrollEvents[i].t - this.scrollEvents[i - 1].t) || 1;\n const dy = Math.abs(this.scrollEvents[i].deltaY - this.scrollEvents[i - 1].deltaY);\n speeds.push(dy / dt);\n deltas.push(dy);\n }\n\n const avgSpeed = speeds.reduce((a, b) => a + b, 0) / speeds.length;\n // Smoothness: inverse of speed variance (normalized)\n const speedVar = this.variance(speeds);\n const smoothness = avgSpeed > 0 ? Math.min(1, avgSpeed / (speedVar + avgSpeed)) : 0;\n\n return {\n totalScrolls: this.scrollEvents.length,\n averageSpeed: Math.round(avgSpeed * 100) / 100,\n smoothness: Math.round(smoothness * 100) / 100,\n hasScroll: true,\n };\n }\n\n private analyzeClicks(): ClickMetrics {\n if (this.clickTimes.length < 2) {\n return {\n totalClicks: this.clickTimes.length,\n averageInterval: 0,\n intervalVariance: 0,\n doubleClickCount: 0,\n hasClicks: this.clickTimes.length > 0,\n };\n }\n\n const intervals: number[] = [];\n let doubleClicks = 0;\n\n for (let i = 1; i < this.clickTimes.length; i++) {\n const interval = this.clickTimes[i] - this.clickTimes[i - 1];\n intervals.push(interval);\n if (interval < 500) doubleClicks++;\n }\n\n const avgInterval = intervals.reduce((a, b) => a + b, 0) / intervals.length;\n const intervalVar = this.variance(intervals);\n\n return {\n totalClicks: this.clickTimes.length,\n averageInterval: Math.round(avgInterval),\n intervalVariance: Math.round(intervalVar),\n doubleClickCount: doubleClicks,\n hasClicks: true,\n };\n }\n\n private calculateHumanScore(\n mouse: MouseMetrics,\n keyboard: KeyboardMetrics,\n scroll: ScrollMetrics,\n clicks: ClickMetrics\n ): number {\n let score = 0.5; // Start neutral\n let factors = 0;\n\n // Mouse analysis\n if (mouse.hasMovement) {\n factors++;\n let mouseScore = 0.5;\n\n // Humans have jitter (small involuntary movements)\n if (mouse.jitter > 0.05) mouseScore += 0.15;\n\n // Bots tend to have very straight movements\n if (mouse.straightLineRatio < 0.5) mouseScore += 0.15;\n else if (mouse.straightLineRatio > 0.9) mouseScore -= 0.2;\n\n // Humans have variable speed\n if (mouse.averageSpeed > 0 && mouse.maxSpeed / mouse.averageSpeed > 3) {\n mouseScore += 0.1;\n }\n\n // Very consistent speed is bot-like\n if (mouse.averageAcceleration > 0) mouseScore += 0.1;\n\n score += Math.max(0, Math.min(1, mouseScore)) - 0.5;\n }\n\n // Keyboard analysis\n if (keyboard.hasKeystrokes) {\n factors++;\n let keyScore = 0.5;\n\n // Humans have high interval variance\n if (keyboard.intervalVariance > 1000) keyScore += 0.2;\n else if (keyboard.intervalVariance < 100) keyScore -= 0.2;\n\n // Very uniform typing is bot-like\n const cv = keyboard.averageInterval > 0\n ? Math.sqrt(keyboard.intervalVariance) / keyboard.averageInterval\n : 0;\n if (cv > 0.3) keyScore += 0.15;\n\n // Hold time variance\n if (keyboard.holdTimeVariance > 500) keyScore += 0.1;\n\n score += Math.max(0, Math.min(1, keyScore)) - 0.5;\n }\n\n // Scroll analysis\n if (scroll.hasScroll) {\n factors++;\n let scrollScore = 0.5;\n\n // Humans have smooth scrolling (not perfectly uniform)\n if (scroll.smoothness > 0.3 && scroll.smoothness < 0.9) {\n scrollScore += 0.2;\n }\n\n score += Math.max(0, Math.min(1, scrollScore)) - 0.5;\n }\n\n // Click analysis\n if (clicks.hasClicks) {\n factors++;\n let clickScore = 0.5;\n\n // Humans have variable click intervals\n if (clicks.intervalVariance > 50000) clickScore += 0.15;\n else if (clicks.intervalVariance < 100) clickScore -= 0.2;\n\n score += Math.max(0, Math.min(1, clickScore)) - 0.5;\n }\n\n // No interaction at all is suspicious\n if (factors === 0) return 0.3;\n\n return Math.max(0, Math.min(1, score));\n }\n\n private variance(values: number[]): number {\n if (values.length < 2) return 0;\n const mean = values.reduce((a, b) => a + b, 0) / values.length;\n return values.reduce((sum, v) => sum + (v - mean) ** 2, 0) / (values.length - 1);\n }\n}\n","/**\n * VPN/Proxy Detection Module\n * Client-side heuristics for detecting VPN, proxy, and Tor usage.\n * For full accuracy, combine with server-side IP intelligence.\n */\n\nexport interface VPNDetectionResult {\n vpnDetected: boolean;\n proxyDetected: boolean;\n torDetected: boolean;\n confidence: number;\n signals: VPNSignals;\n}\n\ninterface VPNSignals {\n webrtcLeak: boolean | null;\n timezoneIPMismatch: boolean;\n dnsLeak: boolean | null;\n connectionType: string | null;\n multipleIPs: boolean;\n torBrowser: boolean;\n knownVPNExtension: boolean;\n}\n\nexport async function detectVPN(): Promise<VPNDetectionResult> {\n const signals: VPNSignals = {\n webrtcLeak: null,\n timezoneIPMismatch: false,\n dnsLeak: null,\n connectionType: null,\n multipleIPs: false,\n torBrowser: false,\n knownVPNExtension: false,\n };\n\n let confidence = 0;\n let vpnDetected = false;\n let proxyDetected = false;\n let torDetected = false;\n\n // 1. Tor Browser Detection\n signals.torBrowser = detectTorBrowser();\n if (signals.torBrowser) {\n torDetected = true;\n confidence += 0.9;\n }\n\n // 2. WebRTC IP Leak Detection\n try {\n signals.webrtcLeak = await detectWebRTCLeak();\n if (signals.webrtcLeak) {\n vpnDetected = true;\n confidence += 0.3;\n }\n } catch {\n // WebRTC not available or blocked\n signals.webrtcLeak = null;\n }\n\n // 3. Connection type analysis\n signals.connectionType = getConnectionType();\n if (signals.connectionType === 'unknown' || signals.connectionType === null) {\n // Datacenter connections often have no Network Information API\n confidence += 0.05;\n }\n\n // 4. VPN Extension Detection\n signals.knownVPNExtension = detectVPNExtensions();\n if (signals.knownVPNExtension) {\n vpnDetected = true;\n confidence += 0.4;\n }\n\n // 5. Timezone vs IP heuristic\n // This needs server-side geo data, but we can detect if timezone is unusual\n const tz = Intl.DateTimeFormat().resolvedOptions().timeZone;\n const lang = navigator.language;\n // If timezone doesn't match language locale, it's a weak signal\n if (tz && lang) {\n const tzCountry = getTimezoneCountry(tz);\n const langCountry = lang.split('-')[1]?.toUpperCase();\n if (tzCountry && langCountry && tzCountry !== langCountry) {\n signals.timezoneIPMismatch = true;\n confidence += 0.1;\n }\n }\n\n // Normalize confidence\n confidence = Math.min(confidence, 1);\n\n // If no strong signals, mark as not detected\n if (confidence < 0.3) {\n vpnDetected = false;\n proxyDetected = false;\n }\n\n return {\n vpnDetected,\n proxyDetected,\n torDetected,\n confidence,\n signals,\n };\n}\n\nfunction detectTorBrowser(): boolean {\n if (typeof window === 'undefined') return false;\n\n // Tor browser characteristics\n const checks: boolean[] = [];\n\n // 1. Screen dimensions are typically 1000x1000 in Tor\n checks.push(window.screen.width === 1000 && window.screen.height === 1000);\n\n // 2. Tor disables many APIs\n checks.push(!window.MediaDevices);\n checks.push(navigator.plugins.length === 0);\n\n // 3. Timezone offset is 0 (UTC) in Tor\n checks.push(new Date().getTimezoneOffset() === 0);\n\n // 4. Hardcoded user agent patterns\n const ua = navigator.userAgent;\n checks.push(ua.includes('Firefox') && !ua.includes('Chrome'));\n\n // If 3+ checks pass, likely Tor\n const score = checks.filter(Boolean).length;\n return score >= 3;\n}\n\nasync function detectWebRTCLeak(): Promise<boolean> {\n if (typeof window === 'undefined' || !window.RTCPeerConnection) {\n return false;\n }\n\n return new Promise((resolve) => {\n const timeout = setTimeout(() => resolve(false), 3000);\n const localIPs: Set<string> = new Set();\n\n try {\n const pc = new RTCPeerConnection({\n iceServers: [{ urls: 'stun:stun.l.google.com:19302' }],\n });\n\n pc.createDataChannel('');\n\n pc.onicecandidate = (event) => {\n if (!event.candidate) {\n clearTimeout(timeout);\n pc.close();\n // If we got local IPs through WebRTC, there might be a VPN leak\n // (VPN should prevent local IP exposure)\n resolve(localIPs.size > 1);\n return;\n }\n\n const candidate = event.candidate.candidate;\n const ipMatch = candidate.match(/(\\d{1,3}\\.){3}\\d{1,3}/);\n if (ipMatch) {\n localIPs.add(ipMatch[0]);\n }\n };\n\n pc.createOffer()\n .then(offer => pc.setLocalDescription(offer))\n .catch(() => {\n clearTimeout(timeout);\n resolve(false);\n });\n } catch {\n clearTimeout(timeout);\n resolve(false);\n }\n });\n}\n\nfunction getConnectionType(): string | null {\n if (typeof navigator === 'undefined') return null;\n const nav = navigator as Navigator & { connection?: { type?: string; effectiveType?: string } };\n if (nav.connection) {\n return nav.connection.type || nav.connection.effectiveType || null;\n }\n return null;\n}\n\nfunction detectVPNExtensions(): boolean {\n if (typeof document === 'undefined') return false;\n\n // Check for known VPN extension injected elements or attributes\n const body = document.body;\n if (!body) return false;\n\n // Some VPN extensions add specific classes or data attributes\n const vpnIndicators = [\n '[data-windscribe]',\n '[data-nord]',\n '.surfshark-extension',\n '#vpn-indicator',\n '[data-expressvpn]',\n ];\n\n for (const selector of vpnIndicators) {\n try {\n if (document.querySelector(selector)) return true;\n } catch {\n // Invalid selector, skip\n }\n }\n\n return false;\n}\n\nfunction getTimezoneCountry(tz: string): string | null {\n // Simple timezone to country mapping for common timezones\n const tzMap: Record<string, string> = {\n 'America/New_York': 'US',\n 'America/Chicago': 'US',\n 'America/Denver': 'US',\n 'America/Los_Angeles': 'US',\n 'Europe/London': 'GB',\n 'Europe/Paris': 'FR',\n 'Europe/Berlin': 'DE',\n 'Europe/Madrid': 'ES',\n 'Europe/Rome': 'IT',\n 'Asia/Tokyo': 'JP',\n 'Asia/Shanghai': 'CN',\n 'Asia/Kolkata': 'IN',\n 'Asia/Seoul': 'KR',\n 'Australia/Sydney': 'AU',\n 'America/Toronto': 'CA',\n 'America/Sao_Paulo': 'BR',\n 'America/Mexico_City': 'MX',\n };\n\n return tzMap[tz] || null;\n}\n","/**\n * Fingerprint Manager\n * Manages visitor ID generation, signal caching, and localStorage persistence\n */\n\nimport type { FingerprintConfig, DeviceSignals, VisitorIdResult, FraudCheckResult, CachedVisitor } from './types';\nimport { collectDeviceSignals, getStableFingerprint } from './signals';\nimport { BehaviorAnalyzer } from './behavior';\nimport { detectVPN } from './vpn-detection';\nimport { isReactNative, getNativeDeviceId } from '../utils/platform';\n\nconst DEFAULT_ENDPOINT = 'https://ingest.sitepong.com';\nconst CACHE_KEY = 'sitepong_visitor';\nconst CACHE_TTL_MS = 30 * 24 * 60 * 60 * 1000; // 30 days\nconst COOKIE_NAME = '__sp_vid';\nconst COOKIE_MAX_AGE = 63072000; // 2 years in seconds\n\nexport class FingerprintManager {\n private config: Required<Omit<FingerprintConfig, 'apiKey' | 'visitorEndpoint' | 'extendedSignals'>> & {\n apiKey: string;\n visitorEndpoint?: string;\n extendedSignals?: boolean;\n };\n private cachedVisitor: CachedVisitor | null = null;\n private pendingRequest: Promise<VisitorIdResult> | null = null;\n private behaviorAnalyzer: BehaviorAnalyzer;\n\n constructor(config: FingerprintConfig) {\n this.config = {\n endpoint: DEFAULT_ENDPOINT,\n enabled: true,\n debug: false,\n ...config,\n };\n\n this.behaviorAnalyzer = new BehaviorAnalyzer();\n if (this.config.enabled && typeof window !== 'undefined' && typeof window.addEventListener === 'function') {\n this.behaviorAnalyzer.start();\n }\n\n this.loadFromStorage();\n }\n\n async getVisitorId(): Promise<VisitorIdResult> {\n if (!this.config.enabled) {\n throw new Error('Fingerprint is not enabled');\n }\n\n // On React Native with @sitepong/device-id, use the native persistent ID directly\n const nativeId = isReactNative() ? getNativeDeviceId() : null;\n if (nativeId) {\n const result: VisitorIdResult = {\n visitorId: nativeId,\n confidence: 1.0,\n firstSeenAt: new Date().toISOString(),\n lastSeenAt: new Date().toISOString(),\n };\n this.log('Using native device ID as visitor ID:', nativeId);\n return result;\n }\n\n // Return cached result if valid\n if (this.cachedVisitor && !this.isCacheExpired()) {\n this.log('Returning cached visitor ID:', this.cachedVisitor.result.visitorId);\n return this.cachedVisitor.result;\n }\n\n // Deduplicate concurrent requests\n if (this.pendingRequest) {\n return this.pendingRequest;\n }\n\n this.pendingRequest = this.fetchVisitorId();\n\n try {\n const result = await this.pendingRequest;\n return result;\n } finally {\n this.pendingRequest = null;\n }\n }\n\n async getDeviceSignals(): Promise<DeviceSignals> {\n return collectDeviceSignals(this.config.extendedSignals ?? false);\n }\n\n async getFraudCheck(): Promise<FraudCheckResult> {\n const [visitorResult, signals, vpnResult] = await Promise.all([\n this.getVisitorId(),\n this.getDeviceSignals(),\n detectVPN().catch(() => null),\n ]);\n\n // Include behavior analysis metrics\n const behaviorMetrics = this.behaviorAnalyzer.getMetrics();\n signals.behavior = {\n score: behaviorMetrics.score,\n mouseMovements: behaviorMetrics.mouse.totalMovements,\n keystrokes: behaviorMetrics.keyboard.totalKeystrokes,\n scrolls: behaviorMetrics.scroll.totalScrolls,\n clicks: behaviorMetrics.clicks.totalClicks,\n isHuman: behaviorMetrics.score > 0.6,\n };\n\n const vpnDetected = vpnResult?.vpnDetected || vpnResult?.torDetected || false;\n\n return {\n visitorId: visitorResult.visitorId,\n riskScore: this.calculateRiskScore(signals, vpnDetected),\n signals,\n flags: {\n incognito: signals.smart?.incognito || signals.incognito,\n bot: signals.smart?.bot || signals.bot || !signals.behavior.isHuman,\n vpn: vpnDetected || signals.smart?.timezoneMismatch,\n tampered: signals.smart?.privacyBrowser,\n },\n };\n }\n\n stopBehaviorTracking(): void {\n this.behaviorAnalyzer.stop();\n }\n\n private async fetchVisitorId(): Promise<VisitorIdResult> {\n const signals = await this.getDeviceSignals();\n const stableFingerprint = await getStableFingerprint(signals);\n const endpoint = this.config.visitorEndpoint || `${this.config.endpoint}/api/visitors`;\n\n // Read previous visitor ID from cookie or localStorage cache\n const previousVisitorId = this.getCookieVisitorId() || this.cachedVisitor?.result.visitorId || undefined;\n\n try {\n const response = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-API-Key': this.config.apiKey,\n },\n credentials: 'include',\n body: JSON.stringify({\n signals,\n stableFingerprint,\n previousVisitorId,\n }),\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}`);\n }\n\n const result: VisitorIdResult = await response.json();\n\n // Cache the result\n this.cachedVisitor = {\n result,\n signals,\n cachedAt: Date.now(),\n };\n this.saveToStorage();\n this.setCookieVisitorId(result.visitorId);\n\n this.log('Visitor ID fetched:', result.visitorId);\n return result;\n } catch (err) {\n this.log('Failed to fetch visitor ID:', err);\n throw err;\n }\n }\n\n private calculateRiskScore(signals: DeviceSignals, vpnDetected = false): number {\n let score = 0;\n const smart = signals.smart;\n\n // High-risk signals\n if (smart?.bot || signals.bot) score += 0.8;\n\n // Behavior analysis (strong signal)\n if (signals.behavior) {\n if (signals.behavior.score < 0.3) score += 0.4;\n else if (signals.behavior.score < 0.5) score += 0.2;\n }\n\n // VPN/Proxy detection\n if (vpnDetected) score += 0.25;\n\n // Medium-risk signals\n if (smart?.incognito || signals.incognito) score += 0.2;\n if (smart?.devToolsOpen) score += 0.1;\n if (smart?.privacyBrowser) score += 0.1;\n\n // Low-risk signals\n if (signals.hardwareConcurrency === 0) score += 0.1;\n if (signals.maxTouchPoints === 0 && /mobile|android|iphone/i.test(signals.userAgent)) {\n score += 0.15;\n }\n if (!signals.cookieEnabled) score += 0.1;\n if (smart?.doNotTrack) score += 0.05;\n\n // Device age: brand new devices are slightly more suspicious\n if (smart?.deviceVisitCount === 1) score += 0.05;\n\n return Math.round(Math.min(score, 1) * 100) / 100;\n }\n\n private isCacheExpired(): boolean {\n if (!this.cachedVisitor) return true;\n return Date.now() - this.cachedVisitor.cachedAt > CACHE_TTL_MS;\n }\n\n private loadFromStorage(): void {\n if (typeof window === 'undefined' || typeof localStorage === 'undefined') return;\n\n try {\n const stored = localStorage.getItem(CACHE_KEY);\n if (!stored) return;\n\n const parsed: CachedVisitor = JSON.parse(stored);\n if (!this.isCacheExpiredAt(parsed.cachedAt)) {\n this.cachedVisitor = parsed;\n this.log('Loaded cached visitor from storage');\n } else {\n localStorage.removeItem(CACHE_KEY);\n }\n } catch {\n // Ignore storage errors\n }\n }\n\n private saveToStorage(): void {\n if (typeof window === 'undefined' || typeof localStorage === 'undefined') return;\n if (!this.cachedVisitor) return;\n\n try {\n localStorage.setItem(CACHE_KEY, JSON.stringify(this.cachedVisitor));\n } catch {\n // Ignore storage errors\n }\n }\n\n private isCacheExpiredAt(cachedAt: number): boolean {\n return Date.now() - cachedAt > CACHE_TTL_MS;\n }\n\n private getCookieVisitorId(): string | undefined {\n if (typeof document === 'undefined') return undefined;\n try {\n const match = document.cookie.match(new RegExp(`(?:^|; )${COOKIE_NAME}=([^;]*)`));\n return match?.[1] || undefined;\n } catch {\n return undefined;\n }\n }\n\n private setCookieVisitorId(visitorId: string): void {\n if (typeof document === 'undefined') return;\n try {\n document.cookie = `${COOKIE_NAME}=${visitorId}; path=/; max-age=${COOKIE_MAX_AGE}; SameSite=Lax`;\n } catch {\n // Cookie write failed (e.g. third-party context)\n }\n }\n\n private log(...args: unknown[]): void {\n if (this.config.debug) {\n console.log('[SitePong Fingerprint]', ...args);\n }\n }\n}\n","/**\n * Web (browser) entry point for SitePong SDK.\n *\n * This module installs the browser EnvironmentAdapter before any SDK code\n * touches `window`, `document`, `navigator`, or `localStorage`, AND registers\n * the web-only manager factories (Replay, Fingerprint, Performance) so that\n * `init()` can construct them. RN/Node entries skip this registration, so\n * their bundles never pull in the DOM-heavy code paths.\n */\n\nimport { createWebEnvironment } from '../platforms/web/environment';\nimport { setEnvironment } from '../utils/platform';\nimport { registerWebManagerFactories } from '../index';\nimport { ReplayManager } from '../replay';\nimport { FingerprintManager } from '../fingerprint';\nimport { PerformanceManager } from '../performance';\n\n// Install the browser environment before re-exporting the SDK surface.\nsetEnvironment(createWebEnvironment());\n\n// Register DOM-dependent managers. Without this, calling init() with\n// replay/performance/fingerprint enabled will log a warning and continue\n// without those features.\nregisterWebManagerFactories({\n createReplay: (cfg) =>\n new ReplayManager(cfg as unknown as ConstructorParameters<typeof ReplayManager>[0]),\n createFingerprint: (cfg) =>\n new FingerprintManager(cfg as unknown as ConstructorParameters<typeof FingerprintManager>[0]),\n createPerformance: (cfg) =>\n new PerformanceManager(cfg as unknown as ConstructorParameters<typeof PerformanceManager>[0]),\n});\n\nexport * from '../index';\nexport { default } from '../index';\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/platforms/web/environment.ts","../../src/utils/platform.ts","../../src/flags/anonymous-id.ts","../../src/flags/context.ts","../../src/flags/evaluator.ts","../../src/flags/manager.ts","../../src/analytics/session.ts","../../src/analytics/utm.ts","../../src/analytics/autocapture.ts","../../src/analytics/manager.ts","../../src/crons.ts","../../src/metrics.ts","../../src/database.ts","../../src/profiling.ts","../../src/remote-config/defaults.ts","../../src/remote-config/manager.ts","../../../../node_modules/web-vitals/dist/web-vitals.js","../../src/performance/manager.ts","../../src/performance/tracing.ts","../../src/superlink/client.ts","../../src/superlink/parse.ts","../../src/superlink/deferred.ts","../../src/superlink/web.ts","../../src/superlink/index.ts","../../src/index.ts","../../src/replay/serializer.ts","../../src/replay/network.ts","../../src/replay/console.ts","../../src/replay/manager.ts","../../src/fingerprint/tampering.ts","../../src/fingerprint/signals.ts","../../src/fingerprint/behavior.ts","../../src/fingerprint/vpn-detection.ts","../../src/fingerprint/manager.ts","../../src/entries/web.ts"],"names":["makeLocalStorageAdapter","key","value","createWebEnvironment","info","handler","listener","event","url","body","blob","currentEnv","setEnvironment","env","getEnvironment","detectPlatform","g","isReactNative","legacyNativeDeviceId","asMutableRN","setRNGetCurrentScreen","fn","rn","getNativeDeviceId","getStorageAdapter","STORAGE_KEY","generateUUID","c","r","memoryId","getAnonymousId","id","clearAnonymousId","setAnonymousId","detectDeviceType","userAgent","ua","detectBrowser","detectOS","getEvaluationContext","djb2Hash","str","hash","i","evaluatePercentageRollout","config","evaluateUserbasePercentage","context","flagKey","hashInput","parseTime","timeStr","hours","minutes","evaluateTimeBased","now","parts","dayOfWeek","p","hour","minute","currentMinutes","startMinutes","endMinutes","evaluateDeviceType","evaluateBrowser","evaluateOS","evaluateRule","ruleType","evaluateFlag","flag","rule","evaluateVariant","totalWeight","sum","v","bucket","cumulative","variant","getVariantPayload","variantKey","DEFAULT_ENDPOINT","FlagManager","err","response","data","result","defaultValue","args","SESSION_KEY","SESSION_TIMESTAMP_KEY","memorySessionId","memorySessionTs","generateSessionId","isSessionExpired","lastActivity","getSessionId","existingId","lastTs","newId","getMemorySession","clearSession","UTM_KEYS","parseFromLocation","params","found","queryKey","readStored","raw","parsed","writeStored","utm","getSessionUtm","stored","fresh","DEFAULT_BLOCK_SELECTORS","AutocaptureModule","callback","target","properties","form","elemProps","element","blockSelectors","selector","sel","text","ariaLabel","role","node","names","input","current","depth","parent","siblings","index","max","DEFAULT_BATCH_SIZE","DEFAULT_FLUSH_INTERVAL","MAX_FLUSH_FAILURES","AnalyticsManager","ac","clicksEnabled","formsEnabled","captureClicks","captureForms","allowSelectors","name","eventName","pageUrl","userId","traits","groupId","events","endpoint","type","options","currentUrl","originalPushState","originalReplaceState","CronMonitorManager","slug","environment","startTime","message","duration_ms","handle","MetricsManager","start","metrics","DatabaseTracker","query","source","patterns","count","queries","q","pattern","existing","entries","a","b","Profiler","metadata","profileId","rootFrame","startMs","frame","profiles","countFrames","frames","DEFAULT_REMOTE_CONFIG","STORAGE_TS_KEY","RemoteConfigManager","l","storage","cached","cachedTs","age","ttlMs","platform","pa","pb","na","nb","e","o","n","u","f","s","d","m","h","T","y","E","C","S","L","w","t","A","I","P","M","k","F","D","x","R","B","H","O","N","j","_","z","G","J","K","Q","MAX_RESOURCES_PER_FLUSH","PAGE_TIMING_POLL_INTERVAL","PAGE_TIMING_TIMEOUT","getPaintBlocks","resources","paintBlocks","elements","styleURL","src","backgroundImage","matches","time","rect","top","left","bottom","right","area","calculateSpeedIndex","firstContentfulPaint","PerformanceManager","list","entry","excluded","stalled","responseStatus","failed","breakdown","entryName","firstPaint","sent","nav","timedOut","navigationStart","visuallyComplete","interactiveWindowStartTime","interactiveWindowTickTime","times","speedIndex","domContentLoadedEnd","timeToInteractive","timestamp","transaction","status","span","transactionId","spanId","unit","metric","randomHex","byteLength","bytes","hex","generateTraceId","generateSpanId","createTraceContext","propagateTrace","sampledFlag","extractTrace","headers","traceparent","version","traceId","parentSpanId","flags","sampled","TracePropagator","targets","escaped","traceHeaders","self","init","existingHeaders","mergedHeaders","patchedInit","DEFAULT_SUPERLINK_ENDPOINT","SuperLinkClient","stripTrailingSlash","payload","res","superlinkClient","parseUniversalLink","referral","deep_link_data","handlers","lastMatched","toDeepLink","emitDeferredDeepLink","link","onDeferredDeepLink","getMatchedDeepLink","captured","didCapture","hasPayload","writeClipboardToken","clickId","extractIdentityMetadata","href","loc","email","phone","customRaw","identity","custom","captureWebDeepLink","getDeepLink","webFingerprint","fp","lang","identify","completeFromScan","scanned","initSuperLink","installFallbackEnvironment","hasBrowser","hasNode","reason","webManagerFactories","registerWebManagerFactories","factories","SitePongClient","hook","idx","user","tags","breadcrumb","error","additionalContext","capturedError","level","errors","isError","stack","errorType","normalizedMsg","topFrame","lines","line","sitepong","initRN","captureError","captureMessage","setContext","setUser","setTags","flush","isInitialized","clearUser","addBreadcrumb","setCurrentScreen","getFlag","getAllFlags","getVariant","waitForFlags","areFlagsReady","refreshFlags","track","trackPageView","group","resetAnalytics","getVisitorId","getDeviceSignals","getFraudCheck","startReplay","stopReplay","isReplayRecording","getReplaySessionId","startTransaction","endTransaction","startSpan","endSpan","getWebVitals","dbTrack","dbTrackSync","getDbQueryCount","resetDbQueryCount","getDbNPlusOnePatterns","cronCheckin","cronStart","cronWrap","metricIncrement","metricGauge","metricHistogram","metricDistribution","metricTime","metricStartTimer","flushMetrics","profile","startProfileSpan","getProfiles","getLatestProfile","flushProfiles","getRemoteConfig","isRemoteConfigFeatureEnabled","onRemoteConfigChange","registerIdentifyHook","src_default","nodeIdCounter","nodeIdMap","resetNodeIds","getNodeId","SKIP_TAGS","ABSOLUTE_URL_ATTRS","COMPUTED_STYLE_PROPERTIES","defaultStyleCache","defaultStyleIframe","getDefaultStyles","tagName","iframeDoc","el","computed","defaults","prop","captureComputedStyle","crossOriginCache","fetchCrossOriginStylesheet","css","absolutified","absolutifyUrls","getCachedCrossOriginStylesheet","cleanupStyleDefaults","toAbsoluteUrl","base","baseUrl","_match","quote","rawUrl","trimmed","abs","stringifyStylesheet","sheet","rules","buildCssTextForNode","styleEl","linkEl","sheetBase","absolutifySrcset","srcset","serializeNode","parentIsSVG","textContent","htmlEl","isSVG","attributes","attr","cssText","computedStyle","inputType","val","textarea","select","dataUrl","children","child","serialized","takeSnapshot","html","REDACTED_HEADERS","NetworkRecorder","method","requestSize","duration","xhr","onLoadEnd","responseSize","path","ConsoleRecorder","serializedArgs","arg","trace","seen","_key","DEFAULT_BUFFER_DURATION","DEFAULT_MAX_SESSION_DURATION","TRIM_INTERVAL","ReplayManager","snapshot","cleanup","eventsToSend","newSnapshot","cutoff","trimIndex","mutations","mutation","attrName","attrs","elTag","textValue","onMouseMove","onClick","onContextMenu","onMouseLeave","onTouchStart","touch","scrollTimer","onScroll","onInput","onResize","onFocus","onBlur","sdkEndpoint","storageKey","links","detectTampering","signals","confidence","browserResult","detectBrowserTampering","canvasResult","detectCanvasTampering","webglResult","detectWebGLTampering","vmResult","detectVM","geoResult","detectGeolocationSpoofing","mitmResult","detectMitM","score","isWindowsUA","isMacUA","isLinuxUA","isWindowsPlatform","isMacPlatform","isLinuxPlatform","claimsChrome","brands","cores","memory","canvas","ctx","draw1","draw2","pixels","allZero","allSame","firstPixel","toDataURLDesc","gl","debugInfo","vendor","renderer","spoofedVendors","isMobile","isDesktopGPU","getParamDesc","indicators","vmRenderers","vmVendors","vm","vw","vh","connection","geoDesc","getCurrentPositionDesc","navProto","geoGetter","scripts","iframes","style","registrations","reg","swUrl","connectTime","tlsTime","resource","collectCoreSignals","hasSessionStorage","hasLocalStorage","collectExtendedSignals","getCanvasFingerprint","webgl","getWebGLInfo","getAudioFingerprint","getFontFingerprint","getMathFingerprint","getWebGLRenderHash","getCssFeatureHash","getLocalIps","collectDeviceSignals","includeExtended","smart","collectSmartSignals","getStableFingerprint","stable","detectIncognito","detectBot","detectPrivacyBrowser","detectDevTools","getConnectionType","getDoNotTrack","getNotificationsPermission","deviceAge","getDeviceAge","tampering","hashString","oscillator","compressor","testKey","db","detected","perf","heapLimit","widthThreshold","heightThreshold","dnt","baseFonts","testFonts","testString","testSize","baseWidths","font","results","vs","fs","prog","buf","supported","ips","pc","offer","resolve","timeout","match","char","BehaviorAnalyzer","downTime","mouse","keyboard","scroll","clicks","speeds","accelerations","straightSegments","totalSegments","jitterSum","prev","curr","dt","dx","dy","distance","speed","pp","expectedX","expectedY","deviation","prevSpeed","avgSpeed","maxSpeed","avgAccel","avgInterval","intervalVar","avgHold","holdVar","speedVar","smoothness","intervals","doubleClicks","interval","factors","mouseScore","keyScore","scrollScore","clickScore","values","mean","detectVPN","vpnDetected","proxyDetected","torDetected","detectTorBrowser","detectWebRTCLeak","detectVPNExtensions","tz","tzCountry","getTimezoneCountry","langCountry","checks","localIPs","ipMatch","vpnIndicators","CACHE_KEY","CACHE_TTL_MS","COOKIE_NAME","COOKIE_MAX_AGE","FingerprintManager","visitorResult","vpnResult","behaviorMetrics","stableFingerprint","previousVisitorId","cachedAt","visitorId","cfg"],"mappings":"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","file":"sitepong.min.js","sourcesContent":["/**\n * Web (browser) EnvironmentAdapter implementation.\n * This is the ONLY place in the SDK that touches `window`, `document`,\n * `navigator`, and `localStorage` on the web side.\n */\n\nimport type {\n EnvironmentAdapter,\n DeviceInfo,\n Unsubscribe,\n} from '../../adapters/environment';\nimport type { StorageAdapter } from '../../adapters/storage';\n\nfunction makeLocalStorageAdapter(): StorageAdapter | null {\n try {\n if (typeof localStorage === 'undefined') return null;\n return {\n getItem: async (key) => localStorage.getItem(key),\n setItem: async (key, value) => {\n localStorage.setItem(key, value);\n },\n removeItem: async (key) => {\n localStorage.removeItem(key);\n },\n };\n } catch {\n return null;\n }\n}\n\nexport function createWebEnvironment(): EnvironmentAdapter {\n const storage = makeLocalStorageAdapter();\n\n return {\n platform: 'browser',\n storage,\n\n getDeviceInfo(): DeviceInfo {\n const info: DeviceInfo = { platform: 'browser' };\n if (typeof navigator !== 'undefined') {\n info.userAgent = navigator.userAgent;\n }\n if (typeof window !== 'undefined' && window.screen) {\n info.screenWidth = window.screen.width;\n info.screenHeight = window.screen.height;\n }\n return info;\n },\n\n getCurrentUrl(): string | undefined {\n if (typeof window === 'undefined' || !window.location) return undefined;\n return window.location.href;\n },\n\n getReferrer(): string | undefined {\n if (typeof document === 'undefined') return undefined;\n return document.referrer || undefined;\n },\n\n getUserAgent(): string | undefined {\n if (typeof navigator === 'undefined') return undefined;\n return navigator.userAgent;\n },\n\n onUncaughtError(handler: (err: unknown) => void): Unsubscribe {\n if (typeof window === 'undefined' || !window.addEventListener) {\n return () => {};\n }\n const listener = (event: ErrorEvent) => {\n handler(event.error || event.message);\n };\n window.addEventListener('error', listener);\n return () => window.removeEventListener('error', listener);\n },\n\n onUnhandledRejection(handler: (reason: unknown) => void): Unsubscribe {\n if (typeof window === 'undefined' || !window.addEventListener) {\n return () => {};\n }\n const listener = (event: PromiseRejectionEvent) => {\n handler(event.reason);\n };\n window.addEventListener('unhandledrejection', listener);\n return () => window.removeEventListener('unhandledrejection', listener);\n },\n\n onBeforeTerminate(handler: () => void): Unsubscribe {\n if (typeof window === 'undefined' || !window.addEventListener) {\n return () => {};\n }\n window.addEventListener('beforeunload', handler);\n return () => window.removeEventListener('beforeunload', handler);\n },\n\n onVisibilityHidden(handler: () => void): Unsubscribe {\n if (typeof document === 'undefined' || !document.addEventListener) {\n return () => {};\n }\n const listener = () => {\n if (document.visibilityState === 'hidden') handler();\n };\n document.addEventListener('visibilitychange', listener);\n return () => document.removeEventListener('visibilitychange', listener);\n },\n\n sendBeacon(url: string, body: string): boolean {\n if (\n typeof navigator === 'undefined' ||\n typeof navigator.sendBeacon !== 'function'\n ) {\n return false;\n }\n try {\n const blob = new Blob([body], { type: 'application/json' });\n return navigator.sendBeacon(url, blob);\n } catch {\n return false;\n }\n },\n };\n}\n","/**\n * Platform detection + environment access.\n *\n * At runtime, shared SDK code calls these helpers. They delegate to an\n * `EnvironmentAdapter` that is installed by the platform entry point\n * (src/entries/{web,rn,node}.ts). This keeps shared code free of raw\n * `window`/`document`/`navigator`/`process` access.\n *\n * Back-compat: this file preserves the pre-refactor API shape\n * (StorageAdapter, getDeviceInfo, getStorageAdapter, getCurrentUrl, etc.)\n * so existing call sites continue to work.\n */\n\nimport type {\n EnvironmentAdapter,\n MutableRNEnvironmentAdapter,\n DeviceInfo,\n} from '../adapters/environment';\nimport type { StorageAdapter } from '../adapters/storage';\n\nexport type { StorageAdapter } from '../adapters/storage';\nexport type Platform = 'browser' | 'react-native' | 'node' | 'unknown';\n\n/** The currently installed environment. Set by platform entry points. */\nlet currentEnv: EnvironmentAdapter | null = null;\n\n/** Install the environment adapter. Called exactly once per platform entry. */\nexport function setEnvironment(env: EnvironmentAdapter): void {\n currentEnv = env;\n}\n\nexport function getEnvironment(): EnvironmentAdapter | null {\n return currentEnv;\n}\n\n/**\n * Auto-detect platform WITHOUT touching DOM/process globals at module load.\n * Only runs when called.\n */\nexport function detectPlatform(): Platform {\n if (currentEnv) return currentEnv.platform;\n const g = globalThis as {\n navigator?: { product?: string };\n process?: { versions?: { node?: string } };\n window?: unknown;\n document?: unknown;\n };\n if (g.navigator && g.navigator.product === 'ReactNative') return 'react-native';\n if (g.process && g.process.versions && g.process.versions.node) return 'node';\n if (g.window && g.document) return 'browser';\n return 'unknown';\n}\n\nexport function isBrowser(): boolean {\n return detectPlatform() === 'browser';\n}\n\nexport function isReactNative(): boolean {\n return detectPlatform() === 'react-native';\n}\n\nexport function isNode(): boolean {\n return detectPlatform() === 'node';\n}\n\n// Back-compat alias for what used to be a module-const.\nexport const currentPlatform: Platform = 'unknown';\n\n/**\n * Device info structure (back-compat name).\n */\nexport type DeviceInfoResult = DeviceInfo;\n\n/**\n * Get device info from the installed environment adapter.\n */\nexport function getDeviceInfo(): DeviceInfoResult {\n if (currentEnv) return currentEnv.getDeviceInfo();\n return { platform: detectPlatform() === 'unknown' ? 'browser' : (detectPlatform() as DeviceInfo['platform']) };\n}\n\n// --- RN-specific injection hooks (back-compat shims) ---\n\nlet legacyNativeDeviceId: string | null = null;\n\n/** Narrow the env to MutableRNEnvironmentAdapter if we're on RN. */\nfunction asMutableRN(): MutableRNEnvironmentAdapter | null {\n if (currentEnv && currentEnv.platform === 'react-native') {\n return currentEnv as MutableRNEnvironmentAdapter;\n }\n return null;\n}\n\nexport function setRNDeviceInfo(info: DeviceInfoResult): void {\n const rn = asMutableRN();\n if (rn) rn._setDeviceInfo(info);\n}\n\n/** Set the current-screen getter on the RN env (React Navigation ref, etc.). */\nexport function setRNGetCurrentScreen(\n fn: (() => string | undefined) | undefined\n): void {\n const rn = asMutableRN();\n if (rn) rn._setGetCurrentScreen(fn);\n}\n\nexport function setNativeDeviceId(id: string): void {\n legacyNativeDeviceId = id;\n}\n\nexport function getNativeDeviceId(): string | null {\n return legacyNativeDeviceId;\n}\n\n/**\n * Get the storage adapter from the installed environment.\n * Returns null if running before env install, or on a platform with no storage.\n */\nexport function getStorageAdapter(): StorageAdapter | null {\n return currentEnv ? currentEnv.storage : null;\n}\n\n/**\n * Platform-agnostic fetch — simply delegates to the global fetch which is\n * guaranteed to exist on all three platforms (Node 18+, RN, browser).\n */\nexport async function platformFetch(\n url: string,\n options: RequestInit\n): Promise<Response> {\n if (typeof fetch !== 'undefined') {\n return fetch(url, options);\n }\n throw new Error('No fetch implementation available');\n}\n\n/** Current URL / route name from the installed environment. */\nexport function getCurrentUrl(): string | null {\n if (!currentEnv) return null;\n return currentEnv.getCurrentUrl() ?? null;\n}\n\n/** Referrer from the installed environment. */\nexport function getReferrer(): string | null {\n if (!currentEnv) return null;\n return currentEnv.getReferrer() ?? null;\n}\n","/**\n * Anonymous ID Management\n * Generates and persists a unique ID for consistent flag evaluation\n */\n\nconst STORAGE_KEY = 'sitepong_anonymous_id';\n\n/**\n * Generate a UUID v4\n */\nfunction generateUUID(): string {\n // Use crypto.randomUUID if available (modern browsers and Node.js 19+)\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\n return crypto.randomUUID();\n }\n\n // Fallback UUID v4 generation\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\n/**\n * Get or create an anonymous ID\n * ID is persisted in localStorage (browser) or memory (Node.js)\n */\nlet memoryId: string | null = null;\n\nexport function getAnonymousId(): string {\n // Browser environment with localStorage\n if (typeof window !== 'undefined' && typeof localStorage !== 'undefined') {\n try {\n let id = localStorage.getItem(STORAGE_KEY);\n if (!id) {\n id = generateUUID();\n localStorage.setItem(STORAGE_KEY, id);\n }\n return id;\n } catch {\n // localStorage might be disabled or quota exceeded\n if (!memoryId) {\n memoryId = generateUUID();\n }\n return memoryId;\n }\n }\n\n // Node.js or environments without localStorage\n if (!memoryId) {\n memoryId = generateUUID();\n }\n return memoryId;\n}\n\n/**\n * Clear the anonymous ID\n * Useful for testing or when user wants to reset their identity\n */\nexport function clearAnonymousId(): void {\n if (typeof window !== 'undefined' && typeof localStorage !== 'undefined') {\n try {\n localStorage.removeItem(STORAGE_KEY);\n } catch {\n // Ignore errors\n }\n }\n memoryId = null;\n}\n\n/**\n * Set a custom anonymous ID\n * Useful when you want to use your own user identifier\n */\nexport function setAnonymousId(id: string): void {\n if (typeof window !== 'undefined' && typeof localStorage !== 'undefined') {\n try {\n localStorage.setItem(STORAGE_KEY, id);\n } catch {\n memoryId = id;\n }\n } else {\n memoryId = id;\n }\n}\n","/**\n * Context Detection\n * Detects device type, browser, and OS from user agent\n */\n\nimport type { DeviceType, BrowserType, OSType, FlagEvaluationContext } from '../types';\nimport { getAnonymousId } from './anonymous-id';\nimport { getEnvironment } from '../utils/platform';\n\n/**\n * Detect device type from user agent\n */\nexport function detectDeviceType(userAgent: string): DeviceType {\n const ua = userAgent.toLowerCase();\n\n // Check for tablets first (before mobile, as some tablets have \"mobile\" in UA)\n if (\n /ipad/.test(ua) ||\n (/android/.test(ua) && !/mobile/.test(ua)) ||\n /tablet/.test(ua)\n ) {\n return 'tablet';\n }\n\n // Check for mobile devices\n if (\n /mobile/.test(ua) ||\n /iphone/.test(ua) ||\n /ipod/.test(ua) ||\n /android/.test(ua) ||\n /blackberry/.test(ua) ||\n /windows phone/.test(ua)\n ) {\n return 'mobile';\n }\n\n // Default to desktop\n return 'desktop';\n}\n\n/**\n * Detect browser from user agent\n */\nexport function detectBrowser(userAgent: string): BrowserType {\n const ua = userAgent.toLowerCase();\n\n // Order matters - check more specific browsers first\n if (/edg/.test(ua)) return 'edge';\n if (/opr|opera/.test(ua)) return 'opera';\n if (/samsungbrowser/.test(ua)) return 'samsung';\n if (/chrome|chromium|crios/.test(ua)) return 'chrome';\n if (/safari/.test(ua) && !/chrome/.test(ua)) return 'safari';\n if (/firefox|fxios/.test(ua)) return 'firefox';\n if (/msie|trident/.test(ua)) return 'ie';\n\n return 'other';\n}\n\n/**\n * Detect OS from user agent\n */\nexport function detectOS(userAgent: string): OSType {\n const ua = userAgent.toLowerCase();\n\n if (/iphone|ipad|ipod/.test(ua)) return 'ios';\n if (/android/.test(ua)) return 'android';\n if (/mac os|macos|macintosh/.test(ua)) return 'macos';\n if (/windows/.test(ua)) return 'windows';\n if (/linux/.test(ua)) return 'linux';\n\n return 'other';\n}\n\n/**\n * Get full evaluation context\n */\nexport function getEvaluationContext(): FlagEvaluationContext {\n const userAgent = getEnvironment()?.getUserAgent() ?? '';\n\n return {\n anonymous_id: getAnonymousId(),\n device_type: userAgent ? detectDeviceType(userAgent) : undefined,\n browser: userAgent ? detectBrowser(userAgent) : undefined,\n os: userAgent ? detectOS(userAgent) : undefined,\n user_agent: userAgent || undefined,\n timestamp: new Date(),\n };\n}\n\n/**\n * Create context with custom overrides\n */\nexport function createContext(\n overrides?: Partial<FlagEvaluationContext>\n): FlagEvaluationContext {\n const baseContext = getEvaluationContext();\n return {\n ...baseContext,\n ...overrides,\n };\n}\n","/**\n * Flag Evaluator\n * Evaluates flag rules using AND logic\n */\n\nimport type {\n FlagDefinition,\n FlagEvaluationContext,\n FlagRuleType,\n PercentageRolloutConfig,\n UserbasePercentageConfig,\n TimeBasedConfig,\n DeviceTypeConfig,\n BrowserConfig,\n OSConfig,\n} from '../types';\n\n/**\n * DJB2 hash function for consistent percentage-based evaluation\n */\nfunction djb2Hash(str: string): number {\n let hash = 5381;\n for (let i = 0; i < str.length; i++) {\n hash = ((hash << 5) + hash) ^ str.charCodeAt(i);\n }\n return hash >>> 0; // Convert to unsigned 32-bit integer\n}\n\n/**\n * Evaluate a percentage rollout rule\n * Random evaluation based on percentage\n */\nfunction evaluatePercentageRollout(config: PercentageRolloutConfig): boolean {\n return Math.random() * 100 < config.percentage;\n}\n\n/**\n * Evaluate a userbase percentage rule\n * Consistent evaluation based on anonymous_id + flag_key\n */\nfunction evaluateUserbasePercentage(\n config: UserbasePercentageConfig,\n context: FlagEvaluationContext,\n flagKey: string\n): boolean {\n const hashInput = `${context.anonymous_id}:${flagKey}`;\n const hash = djb2Hash(hashInput);\n const bucket = hash % 100;\n return bucket < config.percentage;\n}\n\n/**\n * Parse time string (HH:mm) to minutes since midnight\n */\nfunction parseTime(timeStr: string): number {\n const [hours, minutes] = timeStr.split(':').map(Number);\n return hours * 60 + minutes;\n}\n\n/**\n * Evaluate a time-based rule\n */\nfunction evaluateTimeBased(\n config: TimeBasedConfig,\n context: FlagEvaluationContext\n): boolean {\n const now = context.timestamp || new Date();\n\n // Get current time in the specified timezone\n const formatter = new Intl.DateTimeFormat('en-US', {\n timeZone: config.timezone,\n weekday: 'short',\n hour: '2-digit',\n minute: '2-digit',\n hour12: false,\n });\n\n const parts = formatter.formatToParts(now);\n const dayOfWeek = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'].indexOf(\n parts.find((p) => p.type === 'weekday')?.value || ''\n );\n const hour = parseInt(parts.find((p) => p.type === 'hour')?.value || '0', 10);\n const minute = parseInt(parts.find((p) => p.type === 'minute')?.value || '0', 10);\n const currentMinutes = hour * 60 + minute;\n\n // Check day of week\n if (config.days_of_week && config.days_of_week.length > 0) {\n if (!config.days_of_week.includes(dayOfWeek)) {\n return false;\n }\n }\n\n // Check time range\n if (config.start_time && config.end_time) {\n const startMinutes = parseTime(config.start_time);\n const endMinutes = parseTime(config.end_time);\n\n // Handle overnight ranges (e.g., 22:00 - 06:00)\n if (startMinutes > endMinutes) {\n // Overnight range\n if (currentMinutes < startMinutes && currentMinutes >= endMinutes) {\n return false;\n }\n } else {\n // Normal range\n if (currentMinutes < startMinutes || currentMinutes >= endMinutes) {\n return false;\n }\n }\n } else if (config.start_time) {\n const startMinutes = parseTime(config.start_time);\n if (currentMinutes < startMinutes) {\n return false;\n }\n } else if (config.end_time) {\n const endMinutes = parseTime(config.end_time);\n if (currentMinutes >= endMinutes) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Evaluate a device type rule\n */\nfunction evaluateDeviceType(\n config: DeviceTypeConfig,\n context: FlagEvaluationContext\n): boolean {\n if (!context.device_type) {\n return false;\n }\n return config.types.includes(context.device_type);\n}\n\n/**\n * Evaluate a browser rule\n */\nfunction evaluateBrowser(\n config: BrowserConfig,\n context: FlagEvaluationContext\n): boolean {\n if (!context.browser) {\n return false;\n }\n return config.browsers.includes(context.browser);\n}\n\n/**\n * Evaluate an OS rule\n */\nfunction evaluateOS(\n config: OSConfig,\n context: FlagEvaluationContext\n): boolean {\n if (!context.os) {\n return false;\n }\n return config.operating_systems.includes(context.os);\n}\n\n/**\n * Evaluate a single rule\n */\nfunction evaluateRule(\n ruleType: FlagRuleType,\n config: unknown,\n context: FlagEvaluationContext,\n flagKey: string\n): boolean {\n switch (ruleType) {\n case 'percentage_rollout':\n return evaluatePercentageRollout(config as PercentageRolloutConfig);\n\n case 'userbase_percentage':\n return evaluateUserbasePercentage(\n config as UserbasePercentageConfig,\n context,\n flagKey\n );\n\n case 'time_based':\n return evaluateTimeBased(config as TimeBasedConfig, context);\n\n case 'device_type':\n return evaluateDeviceType(config as DeviceTypeConfig, context);\n\n case 'browser':\n return evaluateBrowser(config as BrowserConfig, context);\n\n case 'os':\n return evaluateOS(config as OSConfig, context);\n\n default:\n // Unknown rule type - fail closed\n return false;\n }\n}\n\n/**\n * Evaluate a flag definition against context\n */\nexport function evaluateFlag(\n flag: FlagDefinition,\n context: FlagEvaluationContext\n): boolean {\n // 1. Check override first\n if (flag.override === 'force_on') {\n return true;\n }\n if (flag.override === 'force_off') {\n return false;\n }\n\n // 2. Check if enabled\n if (!flag.enabled) {\n return false;\n }\n\n // 3. If no rules, flag is enabled\n if (!flag.rules || flag.rules.length === 0) {\n return true;\n }\n\n // 4. Evaluate all rules with AND logic\n for (const rule of flag.rules) {\n const result = evaluateRule(rule.rule_type, rule.config, context, flag.key);\n if (!result) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Evaluate a multivariate flag and return the variant key\n * Uses consistent hashing based on anonymous_id + flag_key\n */\nexport function evaluateVariant(\n flag: FlagDefinition,\n context: FlagEvaluationContext\n): string | null {\n // Check basic eligibility first\n if (!evaluateFlag(flag, context)) {\n return null;\n }\n\n // If not multivariate or no variants, return null (treated as boolean)\n if (flag.flag_type !== 'multivariate' || !flag.variants || flag.variants.length === 0) {\n return null;\n }\n\n // Use consistent hashing to assign variant\n const hashInput = `${context.anonymous_id}:${flag.key}:variant`;\n const hash = djb2Hash(hashInput);\n const totalWeight = flag.variants.reduce((sum, v) => sum + v.weight, 0);\n const bucket = hash % totalWeight;\n\n let cumulative = 0;\n for (const variant of flag.variants) {\n cumulative += variant.weight;\n if (bucket < cumulative) {\n return variant.key;\n }\n }\n\n // Fallback to first variant\n return flag.variants[0].key;\n}\n\n/**\n * Get payload for a specific variant\n */\nexport function getVariantPayload(\n flag: FlagDefinition,\n variantKey: string\n): unknown | null {\n if (flag.variant_payloads && flag.variant_payloads[variantKey] !== undefined) {\n return flag.variant_payloads[variantKey];\n }\n\n // Check variant-level payload\n const variant = flag.variants?.find(v => v.key === variantKey);\n return variant?.payload || null;\n}\n\n/**\n * Evaluate multiple flags\n */\nexport function evaluateFlags(\n flags: FlagDefinition[],\n context: FlagEvaluationContext\n): Map<string, boolean> {\n const results = new Map<string, boolean>();\n for (const flag of flags) {\n results.set(flag.key, evaluateFlag(flag, context));\n }\n return results;\n}\n","/**\n * Flag Manager\n * Manages flag fetching, caching, and evaluation\n */\n\nimport type { FlagDefinition, SDKFlagsResponse, FlagEvaluationContext } from '../types';\nimport { getEvaluationContext } from './context';\nimport { evaluateFlag, evaluateVariant, getVariantPayload } from './evaluator';\n\nexport interface FlagManagerConfig {\n apiKey: string;\n endpoint?: string;\n debug?: boolean;\n}\n\nconst DEFAULT_ENDPOINT = 'https://api.sitepong.com';\n\nexport class FlagManager {\n private config: FlagManagerConfig;\n private flags: Map<string, FlagDefinition> = new Map();\n private evaluatedFlags: Map<string, boolean> = new Map();\n private evaluatedVariants: Map<string, string | null> = new Map();\n private context: FlagEvaluationContext | null = null;\n private initialized = false;\n private initPromise: Promise<void> | null = null;\n\n constructor(config: FlagManagerConfig) {\n this.config = {\n endpoint: DEFAULT_ENDPOINT,\n debug: false,\n ...config,\n };\n }\n\n /**\n * Initialize the flag manager by fetching flags\n * Flags are evaluated once on init and cached\n */\n async init(): Promise<void> {\n // If already initialized, return immediately\n if (this.initialized) {\n return;\n }\n\n // If initialization is in progress, wait for it\n if (this.initPromise) {\n return this.initPromise;\n }\n\n // Start initialization\n this.initPromise = this.fetchAndEvaluateFlags();\n\n try {\n await this.initPromise;\n this.initialized = true;\n } catch (err) {\n this.log('Failed to initialize flags:', err);\n // Even on error, mark as initialized to prevent retries\n this.initialized = true;\n } finally {\n this.initPromise = null;\n }\n }\n\n /**\n * Fetch flags from the API and evaluate them\n */\n private async fetchAndEvaluateFlags(): Promise<void> {\n try {\n const response = await fetch(`${this.config.endpoint}/api/sdk/flags`, {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n 'X-API-Key': this.config.apiKey,\n },\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n const data: SDKFlagsResponse = await response.json();\n this.log('Fetched flags:', data.flags.length);\n\n // Get evaluation context once\n this.context = getEvaluationContext();\n this.log('Evaluation context:', this.context);\n\n // Store flags and evaluate them\n this.flags.clear();\n this.evaluatedFlags.clear();\n this.evaluatedVariants.clear();\n\n for (const flag of data.flags) {\n this.flags.set(flag.key, flag);\n const result = evaluateFlag(flag, this.context);\n this.evaluatedFlags.set(flag.key, result);\n\n // Evaluate variant for multivariate flags\n if (flag.flag_type === 'multivariate' && flag.variants) {\n const variant = evaluateVariant(flag, this.context);\n this.evaluatedVariants.set(flag.key, variant);\n this.log(`Flag \"${flag.key}\": ${result}, variant: ${variant}`);\n } else {\n this.log(`Flag \"${flag.key}\": ${result}`);\n }\n }\n } catch (err) {\n this.log('Error fetching flags:', err);\n throw err;\n }\n }\n\n /**\n * Get a flag value\n * Returns the cached evaluated result or default value\n */\n getFlag(key: string, defaultValue = false): boolean {\n if (!this.initialized) {\n this.log(`Flag \"${key}\" requested before init, returning default:`, defaultValue);\n return defaultValue;\n }\n\n const value = this.evaluatedFlags.get(key);\n if (value === undefined) {\n this.log(`Flag \"${key}\" not found, returning default:`, defaultValue);\n return defaultValue;\n }\n\n return value;\n }\n\n /**\n * Get a multivariate flag variant\n * Returns the assigned variant key or the default value\n */\n getVariant(key: string, defaultValue: string | null = null): string | null {\n if (!this.initialized) {\n this.log(`Variant \"${key}\" requested before init, returning default:`, defaultValue);\n return defaultValue;\n }\n\n const variant = this.evaluatedVariants.get(key);\n if (variant === undefined) {\n this.log(`Variant \"${key}\" not found, returning default:`, defaultValue);\n return defaultValue;\n }\n\n return variant;\n }\n\n /**\n * Get the payload for a multivariate flag's assigned variant\n */\n getVariantPayload<T = unknown>(key: string, defaultValue: T | null = null): T | null {\n const variant = this.getVariant(key);\n if (!variant) return defaultValue;\n\n const flag = this.flags.get(key);\n if (!flag) return defaultValue;\n\n const payload = getVariantPayload(flag, variant);\n return (payload as T) ?? defaultValue;\n }\n\n /**\n * Get all flag values\n */\n getAllFlags(): Record<string, boolean> {\n const result: Record<string, boolean> = {};\n for (const [key, value] of this.evaluatedFlags) {\n result[key] = value;\n }\n return result;\n }\n\n /**\n * Check if a flag exists\n */\n hasFlag(key: string): boolean {\n return this.flags.has(key);\n }\n\n /**\n * Check if flags are initialized\n */\n isInitialized(): boolean {\n return this.initialized;\n }\n\n /**\n * Wait for initialization to complete\n */\n async waitForInit(): Promise<void> {\n if (this.initialized) {\n return;\n }\n await this.init();\n }\n\n /**\n * Force re-fetch and re-evaluate flags\n * Call this if you need to refresh flags (e.g., on explicit user action)\n */\n async refresh(): Promise<void> {\n this.initialized = false;\n await this.init();\n }\n\n /**\n * Get the current evaluation context\n */\n getContext(): FlagEvaluationContext | null {\n return this.context;\n }\n\n private log(...args: unknown[]): void {\n if (this.config.debug) {\n console.log('[SitePong Flags]', ...args);\n }\n }\n}\n\n// Singleton instance for convenience\nlet defaultManager: FlagManager | null = null;\n\nexport function initFlagManager(config: FlagManagerConfig): FlagManager {\n defaultManager = new FlagManager(config);\n return defaultManager;\n}\n\nexport function getFlagManager(): FlagManager | null {\n return defaultManager;\n}\n","/**\n * Session Management\n * Manages session IDs with sessionStorage and 30-min inactivity timeout\n */\n\nconst SESSION_KEY = 'sitepong_session_id';\nconst SESSION_TIMESTAMP_KEY = 'sitepong_session_ts';\nconst SESSION_TIMEOUT_MS = 30 * 60 * 1000; // 30 minutes\n\nlet memorySessionId: string | null = null;\nlet memorySessionTs: number | null = null;\n\nfunction generateSessionId(): string {\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\n return crypto.randomUUID();\n }\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\nfunction isSessionExpired(lastActivity: number): boolean {\n return Date.now() - lastActivity > SESSION_TIMEOUT_MS;\n}\n\nexport function getSessionId(): string {\n if (typeof window !== 'undefined' && typeof sessionStorage !== 'undefined') {\n try {\n const existingId = sessionStorage.getItem(SESSION_KEY);\n const lastTs = sessionStorage.getItem(SESSION_TIMESTAMP_KEY);\n\n if (existingId && lastTs && !isSessionExpired(parseInt(lastTs, 10))) {\n // Update timestamp on activity\n sessionStorage.setItem(SESSION_TIMESTAMP_KEY, String(Date.now()));\n return existingId;\n }\n\n // Create new session\n const newId = generateSessionId();\n sessionStorage.setItem(SESSION_KEY, newId);\n sessionStorage.setItem(SESSION_TIMESTAMP_KEY, String(Date.now()));\n return newId;\n } catch {\n // sessionStorage might be disabled\n return getMemorySession();\n }\n }\n\n return getMemorySession();\n}\n\nfunction getMemorySession(): string {\n if (memorySessionId && memorySessionTs && !isSessionExpired(memorySessionTs)) {\n memorySessionTs = Date.now();\n return memorySessionId;\n }\n\n memorySessionId = generateSessionId();\n memorySessionTs = Date.now();\n return memorySessionId;\n}\n\nexport function clearSession(): void {\n if (typeof window !== 'undefined' && typeof sessionStorage !== 'undefined') {\n try {\n sessionStorage.removeItem(SESSION_KEY);\n sessionStorage.removeItem(SESSION_TIMESTAMP_KEY);\n } catch {\n // Ignore errors\n }\n }\n memorySessionId = null;\n memorySessionTs = null;\n}\n","/* eslint-env browser */\nimport type { UtmParams } from './types';\n\nconst STORAGE_KEY = 'sp_utm';\nconst UTM_KEYS: Array<[keyof UtmParams, string]> = [\n ['source', 'utm_source'],\n ['medium', 'utm_medium'],\n ['campaign', 'utm_campaign'],\n ['term', 'utm_term'],\n ['content', 'utm_content'],\n];\n\nfunction parseFromLocation(): UtmParams | null {\n if (typeof window === 'undefined' || !window.location || !window.location.search) return null;\n let params: URLSearchParams;\n try {\n params = new URLSearchParams(window.location.search);\n } catch {\n return null;\n }\n const result: UtmParams = {};\n let found = false;\n for (const [key, queryKey] of UTM_KEYS) {\n const value = params.get(queryKey);\n if (value) {\n result[key] = value;\n found = true;\n }\n }\n return found ? result : null;\n}\n\nfunction readStored(): UtmParams | null {\n if (typeof sessionStorage === 'undefined') return null;\n try {\n const raw = sessionStorage.getItem(STORAGE_KEY);\n if (!raw) return null;\n const parsed = JSON.parse(raw) as UtmParams;\n return parsed && typeof parsed === 'object' ? parsed : null;\n } catch {\n return null;\n }\n}\n\nfunction writeStored(utm: UtmParams): void {\n if (typeof sessionStorage === 'undefined') return;\n try {\n sessionStorage.setItem(STORAGE_KEY, JSON.stringify(utm));\n } catch {\n /* ignore quota / privacy mode */\n }\n}\n\n/**\n * First-touch UTM: parse on first call of the session, persist in sessionStorage,\n * return the same params for the rest of the session.\n */\nexport function getSessionUtm(): UtmParams | null {\n const stored = readStored();\n if (stored) return stored;\n const fresh = parseFromLocation();\n if (fresh) writeStored(fresh);\n return fresh;\n}\n","/**\n * Autocapture Module\n * Automatically captures click events, form submissions, and page views\n * without requiring manual instrumentation.\n */\n\nexport interface AutocaptureConfig {\n /** Enable autocapture of click events */\n clicks: boolean;\n /** Enable autocapture of form submissions */\n forms: boolean;\n /** Enable autocapture of page views (SPA-aware) */\n pageviews: boolean;\n /** CSS selectors to exclude from autocapture */\n blockSelectors?: string[];\n /** Only capture clicks on elements matching these selectors (if set) */\n allowSelectors?: string[];\n /** Maximum text content length to capture */\n maxTextLength?: number;\n /** Debug logging */\n debug?: boolean;\n}\n\nexport interface AutocaptureEvent {\n type: 'click' | 'form_submit' | 'page_view';\n timestamp: string;\n properties: Record<string, unknown>;\n}\n\ntype EventCallback = (event: AutocaptureEvent) => void;\n\nconst DEFAULT_BLOCK_SELECTORS = [\n '[data-sp-no-capture]',\n '.sp-no-capture',\n];\n\nconst MAX_TEXT_LENGTH = 255;\n\nexport class AutocaptureModule {\n private config: AutocaptureConfig;\n private callback: EventCallback;\n private clickHandler: ((e: MouseEvent) => void) | null = null;\n private submitHandler: ((e: SubmitEvent) => void) | null = null;\n private active = false;\n\n constructor(config: Partial<AutocaptureConfig>, callback: EventCallback) {\n this.config = {\n clicks: true,\n forms: true,\n pageviews: true,\n blockSelectors: DEFAULT_BLOCK_SELECTORS,\n maxTextLength: MAX_TEXT_LENGTH,\n debug: false,\n ...config,\n };\n this.callback = callback;\n }\n\n start(): void {\n if (this.active || typeof document === 'undefined' || typeof document.addEventListener !== 'function') return;\n this.active = true;\n\n if (this.config.clicks) {\n this.setupClickCapture();\n }\n\n if (this.config.forms) {\n this.setupFormCapture();\n }\n\n this.log('Autocapture started');\n }\n\n stop(): void {\n if (!this.active) return;\n this.active = false;\n\n if (this.clickHandler) {\n document.removeEventListener('click', this.clickHandler, true);\n this.clickHandler = null;\n }\n\n if (this.submitHandler) {\n document.removeEventListener('submit', this.submitHandler, true);\n this.submitHandler = null;\n }\n\n this.log('Autocapture stopped');\n }\n\n private setupClickCapture(): void {\n this.clickHandler = (e: MouseEvent) => {\n const target = e.target as HTMLElement;\n if (!target || !this.shouldCapture(target)) return;\n\n const properties = this.getElementProperties(target);\n properties.$event_type = 'click';\n properties.$x = e.clientX;\n properties.$y = e.clientY;\n\n this.callback({\n type: 'click',\n timestamp: new Date().toISOString(),\n properties,\n });\n };\n\n document.addEventListener('click', this.clickHandler, true);\n }\n\n private setupFormCapture(): void {\n this.submitHandler = (e: SubmitEvent) => {\n const form = e.target as HTMLFormElement;\n if (!form || !this.shouldCapture(form)) return;\n\n const properties: Record<string, unknown> = {\n $event_type: 'form_submit',\n $form_action: form.action || undefined,\n $form_method: form.method || 'get',\n $form_name: form.name || form.id || undefined,\n $field_names: this.getFormFieldNames(form),\n $field_count: form.elements.length,\n };\n\n // Add element properties\n const elemProps = this.getElementProperties(form);\n Object.assign(properties, elemProps);\n\n this.callback({\n type: 'form_submit',\n timestamp: new Date().toISOString(),\n properties,\n });\n };\n\n document.addEventListener('submit', this.submitHandler, true);\n }\n\n private shouldCapture(element: HTMLElement): boolean {\n // Check block selectors\n const blockSelectors = this.config.blockSelectors || DEFAULT_BLOCK_SELECTORS;\n for (const selector of blockSelectors) {\n if (element.matches(selector) || element.closest(selector)) {\n return false;\n }\n }\n\n // Check allow selectors (if specified, element must match)\n if (this.config.allowSelectors && this.config.allowSelectors.length > 0) {\n const matches = this.config.allowSelectors.some(\n (sel) => element.matches(sel) || element.closest(sel) !== null\n );\n if (!matches) return false;\n }\n\n // Skip invisible elements\n if (element.offsetParent === null && element.tagName !== 'BODY') {\n return false;\n }\n\n return true;\n }\n\n private getElementProperties(element: HTMLElement): Record<string, unknown> {\n const properties: Record<string, unknown> = {};\n\n // Tag info\n properties.$tag_name = element.tagName.toLowerCase();\n properties.$el_id = element.id || undefined;\n\n // Classes (limit to first 5)\n if (element.classList.length > 0) {\n properties.$el_classes = Array.from(element.classList).slice(0, 5);\n }\n\n // Text content (truncated)\n const text = this.getElementText(element);\n if (text) {\n properties.$el_text = text;\n }\n\n // Href for links\n if (element instanceof HTMLAnchorElement) {\n properties.$href = element.href || undefined;\n properties.$target = element.target || undefined;\n }\n\n // Type for inputs/buttons\n if (element instanceof HTMLInputElement || element instanceof HTMLButtonElement) {\n properties.$el_type = element.type || undefined;\n properties.$el_name = element.name || undefined;\n }\n\n // ARIA attributes\n const ariaLabel = element.getAttribute('aria-label');\n if (ariaLabel) {\n properties.$aria_label = this.truncate(ariaLabel);\n }\n\n // Role\n const role = element.getAttribute('role');\n if (role) {\n properties.$el_role = role;\n }\n\n // CSS selector path (simplified)\n properties.$selector = this.getSelector(element);\n\n // Page context\n if (typeof window !== 'undefined' && window.location) {\n properties.$current_url = window.location.href;\n properties.$pathname = window.location.pathname;\n }\n\n return properties;\n }\n\n private getElementText(element: HTMLElement): string | undefined {\n // Don't capture text from inputs (could be sensitive)\n if (element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement) {\n return undefined;\n }\n\n // For buttons and links, get direct text\n let text = '';\n if (element instanceof HTMLButtonElement || element instanceof HTMLAnchorElement) {\n text = element.innerText || element.textContent || '';\n } else {\n // Get direct text content (not from children)\n for (const node of Array.from(element.childNodes)) {\n if (node.nodeType === Node.TEXT_NODE) {\n text += node.textContent || '';\n }\n }\n }\n\n text = text.trim().replace(/\\s+/g, ' ');\n return text ? this.truncate(text) : undefined;\n }\n\n private getFormFieldNames(form: HTMLFormElement): string[] {\n const names: string[] = [];\n for (const element of Array.from(form.elements)) {\n const input = element as HTMLInputElement;\n if (input.name && input.type !== 'password' && input.type !== 'hidden') {\n names.push(input.name);\n }\n }\n return names.slice(0, 20); // Limit to 20 field names\n }\n\n private getSelector(element: HTMLElement): string {\n const parts: string[] = [];\n let current: HTMLElement | null = element;\n let depth = 0;\n\n while (current && current !== document.body && depth < 5) {\n let selector = current.tagName.toLowerCase();\n\n if (current.id) {\n selector = `#${current.id}`;\n parts.unshift(selector);\n break;\n }\n\n if (current.classList.length > 0) {\n selector += `.${Array.from(current.classList).slice(0, 2).join('.')}`;\n }\n\n // Add nth-child for disambiguation\n const parent = current.parentElement;\n if (parent) {\n const siblings = Array.from(parent.children).filter(\n (c) => c.tagName === current!.tagName\n );\n if (siblings.length > 1) {\n const index = siblings.indexOf(current) + 1;\n selector += `:nth-of-type(${index})`;\n }\n }\n\n parts.unshift(selector);\n current = current.parentElement;\n depth++;\n }\n\n return parts.join(' > ');\n }\n\n private truncate(text: string): string {\n const max = this.config.maxTextLength || MAX_TEXT_LENGTH;\n return text.length > max ? text.slice(0, max) + '...' : text;\n }\n\n private log(...args: unknown[]): void {\n if (this.config.debug) {\n console.log('[SitePong Autocapture]', ...args);\n }\n }\n}\n","/**\n * Analytics Manager\n * Manages event queue, batch flushing, identify/group state, and SPA page view tracking\n */\n\nimport type { AnalyticsConfig, AnalyticsEvent, TrackProperties, UserTraits, GroupTraits } from './types';\nimport { getSessionId, clearSession } from './session';\nimport { getSessionUtm } from './utm';\nimport { getAnonymousId } from '../flags/anonymous-id';\nimport { AutocaptureModule } from './autocapture';\nimport { isReactNative, getNativeDeviceId } from '../utils/platform';\n\nconst DEFAULT_ENDPOINT = 'https://ingest.sitepong.com';\nconst DEFAULT_BATCH_SIZE = 20;\nconst DEFAULT_FLUSH_INTERVAL = 10000;\nconst MAX_FLUSH_FAILURES = 3;\n\nexport class AnalyticsManager {\n private config: Required<Omit<AnalyticsConfig, 'apiKey' | 'eventsEndpoint' | 'autocaptureClicks' | 'autocaptureForms' | 'autocapture' | 'appVersion'>> & {\n apiKey: string;\n eventsEndpoint?: string;\n autocaptureClicks?: boolean;\n autocaptureForms?: boolean;\n autocapture?: AnalyticsConfig['autocapture'];\n appVersion?: string;\n };\n private eventQueue: AnalyticsEvent[] = [];\n private flushTimer: ReturnType<typeof setInterval> | null = null;\n private flushFailures = 0;\n private disabled = false;\n private userId: string | null = null;\n private groupId: string | null = null;\n private userTraits: UserTraits | null = null;\n private groupTraits: GroupTraits | null = null;\n private lastUrl: string | null = null;\n private popstateHandler: (() => void) | null = null;\n private autocaptureModule: AutocaptureModule | null = null;\n\n constructor(config: AnalyticsConfig) {\n this.config = {\n endpoint: DEFAULT_ENDPOINT,\n enabled: true,\n autocapturePageviews: false,\n maxBatchSize: DEFAULT_BATCH_SIZE,\n flushInterval: DEFAULT_FLUSH_INTERVAL,\n debug: false,\n ...config,\n };\n }\n\n init(): void {\n if (!this.config.enabled) {\n return;\n }\n\n this.startFlushTimer();\n this.setupPageHideListener();\n\n if (this.config.autocapturePageviews) {\n this.setupSPATracking();\n }\n\n this.setupAutocapture();\n this.log('Analytics initialized');\n }\n\n /**\n * Headless init for React Native — starts only the flush timer.\n * No page-hide listener, SPA tracking, or DOM autocapture.\n */\n initHeadless(): void {\n if (!this.config.enabled) {\n return;\n }\n\n this.startFlushTimer();\n this.log('Analytics initialized (headless)');\n }\n\n private setupAutocapture(): void {\n const ac = this.config.autocapture;\n const clicksEnabled = this.config.autocaptureClicks;\n const formsEnabled = this.config.autocaptureForms;\n\n // Determine autocapture configuration\n let captureClicks = clicksEnabled || false;\n let captureForms = formsEnabled || false;\n let blockSelectors: string[] | undefined;\n let allowSelectors: string[] | undefined;\n\n if (ac === true) {\n captureClicks = true;\n captureForms = true;\n } else if (ac && typeof ac === 'object') {\n captureClicks = ac.clicks !== false;\n captureForms = ac.forms !== false;\n blockSelectors = ac.blockSelectors;\n allowSelectors = ac.allowSelectors;\n if (ac.pageviews !== false && !this.config.autocapturePageviews) {\n this.setupSPATracking();\n }\n }\n\n if (!captureClicks && !captureForms) return;\n\n this.autocaptureModule = new AutocaptureModule(\n {\n clicks: captureClicks,\n forms: captureForms,\n pageviews: false, // Handled by SPA tracking above\n blockSelectors,\n allowSelectors,\n debug: this.config.debug,\n },\n (event) => {\n // Convert autocapture event to analytics event\n const name = event.type === 'click'\n ? '$autocapture_click'\n : event.type === 'form_submit'\n ? '$autocapture_form_submit'\n : '$autocapture';\n\n this.track(name, event.properties);\n }\n );\n\n this.autocaptureModule.start();\n }\n\n track(eventName: string, properties?: TrackProperties): void {\n if (!this.config.enabled) return;\n\n const event = this.createEvent('track', { name: eventName, properties });\n this.enqueue(event);\n this.log('Track:', eventName, properties);\n }\n\n trackPageView(url?: string, properties?: TrackProperties): void {\n if (!this.config.enabled) return;\n\n const pageUrl = url || (typeof window !== 'undefined' && window.location ? window.location.href : undefined);\n const event = this.createEvent('page', {\n properties: {\n url: pageUrl,\n referrer: typeof document !== 'undefined' ? document.referrer : undefined,\n title: typeof document !== 'undefined' ? document.title : undefined,\n ...properties,\n },\n });\n this.enqueue(event);\n this.log('Page view:', pageUrl);\n }\n\n identify(userId: string, traits?: UserTraits): void {\n if (!this.config.enabled) return;\n\n this.userId = userId;\n if (traits) {\n this.userTraits = { ...this.userTraits, ...traits };\n }\n\n const event = this.createEvent('identify', { traits: this.userTraits || undefined });\n this.enqueue(event);\n this.log('Identify:', userId, traits);\n }\n\n group(groupId: string, traits?: GroupTraits): void {\n if (!this.config.enabled) return;\n\n this.groupId = groupId;\n if (traits) {\n this.groupTraits = { ...this.groupTraits, ...traits };\n }\n\n const event = this.createEvent('group', { traits: this.groupTraits || undefined });\n this.enqueue(event);\n this.log('Group:', groupId, traits);\n }\n\n reset(): void {\n this.userId = null;\n this.groupId = null;\n this.userTraits = null;\n this.groupTraits = null;\n clearSession();\n this.log('Analytics state reset');\n }\n\n async flush(): Promise<void> {\n if (this.eventQueue.length === 0) return;\n\n if (this.disabled) {\n this.eventQueue = [];\n return;\n }\n\n const events = [...this.eventQueue];\n this.eventQueue = [];\n\n const endpoint = this.config.eventsEndpoint || `${this.config.endpoint}/api/events`;\n\n try {\n const response = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-API-Key': this.config.apiKey,\n },\n body: JSON.stringify({ events }),\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}`);\n }\n\n this.flushFailures = 0;\n this.log(`Flushed ${events.length} events`);\n } catch (err) {\n this.flushFailures++;\n\n if (this.flushFailures >= MAX_FLUSH_FAILURES) {\n this.disabled = true;\n console.warn(\n `[SitePong Analytics] Disabled after ${MAX_FLUSH_FAILURES} consecutive failures. ` +\n `Check that ${endpoint} is accessible and has proper CORS headers.`\n );\n return;\n }\n\n this.eventQueue.unshift(...events);\n this.log(`Failed to flush events (attempt ${this.flushFailures}/${MAX_FLUSH_FAILURES}):`, err);\n }\n }\n\n destroy(): void {\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n this.flushTimer = null;\n }\n\n if (this.popstateHandler && typeof window !== 'undefined') {\n window.removeEventListener('popstate', this.popstateHandler);\n this.popstateHandler = null;\n }\n\n if (this.autocaptureModule) {\n this.autocaptureModule.stop();\n this.autocaptureModule = null;\n }\n\n // Final flush\n this.flushWithBeacon();\n }\n\n private createEvent(\n type: AnalyticsEvent['type'],\n options: { name?: string; properties?: TrackProperties; traits?: Record<string, unknown> }\n ): AnalyticsEvent {\n return {\n type,\n name: options.name,\n properties: options.properties,\n userId: this.userId || undefined,\n anonymousId: getAnonymousId(),\n deviceId: getNativeDeviceId() || undefined,\n groupId: this.groupId || undefined,\n traits: options.traits,\n sessionId: getSessionId(),\n timestamp: new Date().toISOString(),\n url: typeof window !== 'undefined' && window.location ? window.location.href : undefined,\n referrer: typeof document !== 'undefined' && typeof document.referrer === 'string' ? document.referrer : undefined,\n userAgent: typeof navigator !== 'undefined' ? navigator.userAgent : undefined,\n utm: getSessionUtm() || undefined,\n appVersion: this.config.appVersion || undefined,\n };\n }\n\n private enqueue(event: AnalyticsEvent): void {\n this.eventQueue.push(event);\n\n if (this.eventQueue.length >= this.config.maxBatchSize) {\n this.flush();\n }\n }\n\n private startFlushTimer(): void {\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n }\n\n this.flushTimer = setInterval(() => {\n this.flush();\n }, this.config.flushInterval);\n }\n\n private setupPageHideListener(): void {\n if (typeof window === 'undefined' || isReactNative() || typeof window.addEventListener !== 'function') return;\n\n window.addEventListener('visibilitychange', () => {\n if (document.visibilityState === 'hidden') {\n this.flushWithBeacon();\n }\n });\n }\n\n private flushWithBeacon(): void {\n if (this.eventQueue.length === 0 || isReactNative() || typeof navigator?.sendBeacon !== 'function') {\n return;\n }\n\n const events = [...this.eventQueue];\n this.eventQueue = [];\n\n const endpoint = this.config.eventsEndpoint || `${this.config.endpoint}/api/events`;\n const blob = new Blob(\n [JSON.stringify({ events, apiKey: this.config.apiKey })],\n { type: 'application/json' }\n );\n\n navigator.sendBeacon(endpoint, blob);\n this.log(`Flushed ${events.length} events via beacon`);\n }\n\n private setupSPATracking(): void {\n if (\n typeof window === 'undefined' ||\n isReactNative() ||\n !window.location ||\n typeof window.addEventListener !== 'function'\n ) return;\n\n this.lastUrl = window.location.href;\n\n // Track initial page view\n this.trackPageView();\n\n // Listen for popstate (back/forward navigation)\n this.popstateHandler = () => {\n if (!window.location) return;\n const currentUrl = window.location.href;\n if (currentUrl !== this.lastUrl) {\n this.lastUrl = currentUrl;\n this.trackPageView(currentUrl);\n }\n };\n window.addEventListener('popstate', this.popstateHandler);\n\n // Monkey-patch pushState and replaceState for SPA navigation\n const originalPushState = history.pushState.bind(history);\n const originalReplaceState = history.replaceState.bind(history);\n\n history.pushState = (...args: Parameters<typeof history.pushState>) => {\n originalPushState(...args);\n this.handleUrlChange();\n };\n\n history.replaceState = (...args: Parameters<typeof history.replaceState>) => {\n originalReplaceState(...args);\n this.handleUrlChange();\n };\n }\n\n private handleUrlChange(): void {\n if (typeof window === 'undefined' || !window.location) return;\n\n const currentUrl = window.location.href;\n if (currentUrl !== this.lastUrl) {\n this.lastUrl = currentUrl;\n this.trackPageView(currentUrl);\n }\n }\n\n private log(...args: unknown[]): void {\n if (this.config.debug) {\n console.log('[SitePong Analytics]', ...args);\n }\n }\n}\n","/**\n * Cron Job Monitoring SDK Module\n *\n * Usage:\n * import { cronMonitor } from '@sitepong/sdk';\n *\n * // Simple check-in\n * await cronMonitor.checkin('my-job-slug');\n *\n * // With duration tracking\n * const done = cronMonitor.start('my-job-slug');\n * try { await doWork(); done.ok(); }\n * catch (e) { done.error(e.message); }\n */\n\nexport interface CronCheckinOptions {\n status?: 'ok' | 'error' | 'in_progress';\n duration_ms?: number;\n message?: string;\n environment?: string;\n}\n\nexport interface CronHandle {\n ok: (message?: string) => Promise<void>;\n error: (message?: string) => Promise<void>;\n}\n\nexport class CronMonitorManager {\n private apiKey: string;\n private endpoint: string;\n private debug: boolean;\n\n constructor(config: { apiKey: string; endpoint: string; debug?: boolean }) {\n this.apiKey = config.apiKey;\n this.endpoint = config.endpoint;\n this.debug = config.debug || false;\n }\n\n /**\n * Send a check-in for a cron monitor\n */\n async checkin(slug: string, options: CronCheckinOptions = {}): Promise<void> {\n try {\n const response = await fetch(`${this.endpoint}/api/sdk/crons`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-API-Key': this.apiKey,\n },\n body: JSON.stringify({\n slug,\n status: options.status || 'ok',\n duration_ms: options.duration_ms,\n message: options.message,\n environment: options.environment,\n }),\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}`);\n }\n\n this.log(`Check-in sent for \"${slug}\" (${options.status || 'ok'})`);\n } catch (err) {\n this.log('Failed to send check-in:', err);\n }\n }\n\n /**\n * Start tracking a cron job execution.\n * Returns a handle with ok() and error() methods to complete the check-in.\n */\n start(slug: string, environment?: string): CronHandle {\n const startTime = Date.now();\n\n // Send in_progress check-in\n this.checkin(slug, { status: 'in_progress', environment });\n\n return {\n ok: async (message?: string) => {\n const duration_ms = Date.now() - startTime;\n await this.checkin(slug, { status: 'ok', duration_ms, message, environment });\n },\n error: async (message?: string) => {\n const duration_ms = Date.now() - startTime;\n await this.checkin(slug, { status: 'error', duration_ms, message, environment });\n },\n };\n }\n\n /**\n * Wrap an async function with automatic cron monitoring.\n * Sends 'in_progress' on start, 'ok' on success, 'error' on failure.\n */\n wrap<T>(slug: string, fn: () => Promise<T>, environment?: string): Promise<T> {\n const handle = this.start(slug, environment);\n return fn().then(\n async (result) => { await handle.ok(); return result; },\n async (err) => { await handle.error(err?.message || String(err)); throw err; }\n );\n }\n\n private log(...args: unknown[]): void {\n if (this.debug) {\n console.log('[SitePong:Cron]', ...args);\n }\n }\n}\n","/**\n * Custom Metrics SDK Module\n *\n * Usage:\n * import { metrics } from '@sitepong/sdk';\n *\n * // Counter\n * metrics.increment('api.requests', 1, { endpoint: '/users' });\n *\n * // Gauge\n * metrics.gauge('memory.usage', process.memoryUsage().heapUsed, { unit: 'bytes' });\n *\n * // Distribution (for percentile calculations)\n * metrics.distribution('api.latency', responseTime, { unit: 'ms' });\n *\n * // Histogram\n * metrics.histogram('request.size', bodySize, { unit: 'bytes' });\n */\n\nimport { getEnvironment } from './utils/platform';\n\nexport interface MetricOptions {\n tags?: Record<string, string>;\n unit?: string;\n timestamp?: string;\n}\n\ninterface QueuedMetric {\n name: string;\n value: number;\n type: string;\n unit?: string;\n tags?: Record<string, string>;\n timestamp: string;\n}\n\nexport class MetricsManager {\n private apiKey: string;\n private endpoint: string;\n private debug: boolean;\n private queue: QueuedMetric[] = [];\n private flushInterval: number;\n private flushTimer: ReturnType<typeof setTimeout> | null = null;\n private maxBatchSize: number;\n\n constructor(config: {\n apiKey: string;\n endpoint: string;\n debug?: boolean;\n flushInterval?: number;\n maxBatchSize?: number;\n }) {\n this.apiKey = config.apiKey;\n this.endpoint = config.endpoint;\n this.debug = config.debug || false;\n this.flushInterval = config.flushInterval || 10000;\n this.maxBatchSize = config.maxBatchSize || 100;\n this.startFlushTimer();\n }\n\n /**\n * Increment a counter metric\n */\n increment(name: string, value: number = 1, options?: MetricOptions): void {\n this.enqueue(name, value, 'counter', options);\n }\n\n /**\n * Decrement a counter metric\n */\n decrement(name: string, value: number = 1, options?: MetricOptions): void {\n this.enqueue(name, -value, 'counter', options);\n }\n\n /**\n * Set a gauge metric (instantaneous value)\n */\n gauge(name: string, value: number, options?: MetricOptions): void {\n this.enqueue(name, value, 'gauge', options);\n }\n\n /**\n * Record a histogram value (for aggregation server-side)\n */\n histogram(name: string, value: number, options?: MetricOptions): void {\n this.enqueue(name, value, 'histogram', options);\n }\n\n /**\n * Record a distribution value (for percentile calculations)\n */\n distribution(name: string, value: number, options?: MetricOptions): void {\n this.enqueue(name, value, 'distribution', options);\n }\n\n /**\n * Time a function execution and record as distribution\n */\n async time<T>(name: string, fn: () => Promise<T>, options?: MetricOptions): Promise<T> {\n const start = Date.now();\n try {\n const result = await fn();\n this.distribution(name, Date.now() - start, { ...options, unit: options?.unit || 'ms' });\n return result;\n } catch (err) {\n this.distribution(name, Date.now() - start, {\n ...options,\n unit: options?.unit || 'ms',\n tags: { ...options?.tags, error: 'true' },\n });\n throw err;\n }\n }\n\n /**\n * Create a timer that records on stop\n */\n startTimer(name: string, options?: MetricOptions): { stop: () => void } {\n const start = Date.now();\n return {\n stop: () => {\n this.distribution(name, Date.now() - start, { ...options, unit: options?.unit || 'ms' });\n },\n };\n }\n\n /**\n * Force flush all queued metrics\n */\n async flush(): Promise<void> {\n if (this.queue.length === 0) return;\n\n const metrics = [...this.queue];\n this.queue = [];\n\n try {\n const response = await fetch(`${this.endpoint}/api/sdk/metrics`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-API-Key': this.apiKey,\n },\n body: JSON.stringify({ metrics }),\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}`);\n }\n\n this.log(`Flushed ${metrics.length} metrics`);\n } catch (err) {\n // Re-queue on failure\n this.queue.unshift(...metrics);\n this.log('Failed to flush metrics:', err);\n }\n }\n\n /**\n * Stop the flush timer and flush remaining metrics\n */\n async destroy(): Promise<void> {\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n this.flushTimer = null;\n }\n await this.flush();\n }\n\n private enqueue(name: string, value: number, type: string, options?: MetricOptions): void {\n this.queue.push({\n name,\n value,\n type,\n unit: options?.unit,\n tags: options?.tags,\n timestamp: options?.timestamp || new Date().toISOString(),\n });\n\n if (this.queue.length >= this.maxBatchSize) {\n this.flush();\n }\n }\n\n private startFlushTimer(): void {\n this.flushTimer = setInterval(() => {\n this.flush();\n }, this.flushInterval);\n\n // Beacon-flush on visibility hidden if the platform supports it\n const env = getEnvironment();\n if (env) {\n env.onVisibilityHidden(() => this.flushWithBeacon());\n }\n }\n\n private flushWithBeacon(): void {\n if (this.queue.length === 0) return;\n const env = getEnvironment();\n if (!env || !env.sendBeacon) return;\n\n const metrics = [...this.queue];\n this.queue = [];\n\n const body = JSON.stringify({ metrics, apiKey: this.apiKey });\n const ok = env.sendBeacon(`${this.endpoint}/api/sdk/metrics`, body);\n if (ok) {\n this.log(`Flushed ${metrics.length} metrics via beacon`);\n } else {\n this.queue.unshift(...metrics);\n }\n }\n\n private log(...args: unknown[]): void {\n if (this.debug) {\n console.log('[SitePong:Metrics]', ...args);\n }\n }\n}\n","/**\n * Database Query Tracking SDK Module\n *\n * Usage (Node.js):\n * import { dbTracker } from '@sitepong/sdk';\n *\n * // Wrap a database query\n * const result = await dbTracker.track('SELECT * FROM users WHERE id = ?', async () => {\n * return await db.query('SELECT * FROM users WHERE id = ?', [userId]);\n * });\n *\n * // Integration with ORMs\n * dbTracker.patchKnex(knex); // Auto-tracks all Knex queries\n */\n\nexport interface DatabaseQueryEvent {\n query: string;\n duration_ms: number;\n timestamp: string;\n source?: string;\n rows_affected?: number;\n error?: string;\n is_slow?: boolean;\n}\n\nexport interface DatabaseTrackerConfig {\n apiKey: string;\n endpoint: string;\n debug?: boolean;\n slowQueryThreshold?: number; // ms, default 1000\n maxBatchSize?: number;\n flushInterval?: number;\n /** Redact query parameters for security */\n redactParams?: boolean;\n}\n\nexport class DatabaseTracker {\n private config: DatabaseTrackerConfig;\n private queue: DatabaseQueryEvent[] = [];\n private flushTimer: ReturnType<typeof setTimeout> | null = null;\n private queryCounter = 0;\n private nPlusOneDetector: Map<string, { count: number; since: number }> = new Map();\n\n constructor(config: DatabaseTrackerConfig) {\n this.config = {\n slowQueryThreshold: 1000,\n maxBatchSize: 50,\n flushInterval: 10000,\n redactParams: true,\n ...config,\n };\n this.startFlushTimer();\n }\n\n /**\n * Track a database query execution\n */\n async track<T>(query: string, fn: () => Promise<T>, source?: string): Promise<T> {\n const start = Date.now();\n this.queryCounter++;\n\n try {\n const result = await fn();\n const duration_ms = Date.now() - start;\n\n this.recordQuery({\n query: this.config.redactParams ? this.redactQuery(query) : query,\n duration_ms,\n timestamp: new Date().toISOString(),\n source,\n is_slow: duration_ms >= (this.config.slowQueryThreshold || 1000),\n });\n\n // N+1 detection\n this.detectNPlusOne(query);\n\n return result;\n } catch (err) {\n const duration_ms = Date.now() - start;\n this.recordQuery({\n query: this.config.redactParams ? this.redactQuery(query) : query,\n duration_ms,\n timestamp: new Date().toISOString(),\n source,\n error: err instanceof Error ? err.message : String(err),\n });\n throw err;\n }\n }\n\n /**\n * Track a synchronous database query\n */\n trackSync<T>(query: string, fn: () => T, source?: string): T {\n const start = Date.now();\n this.queryCounter++;\n\n try {\n const result = fn();\n const duration_ms = Date.now() - start;\n\n this.recordQuery({\n query: this.config.redactParams ? this.redactQuery(query) : query,\n duration_ms,\n timestamp: new Date().toISOString(),\n source,\n is_slow: duration_ms >= (this.config.slowQueryThreshold || 1000),\n });\n\n return result;\n } catch (err) {\n const duration_ms = Date.now() - start;\n this.recordQuery({\n query: this.config.redactParams ? this.redactQuery(query) : query,\n duration_ms,\n timestamp: new Date().toISOString(),\n source,\n error: err instanceof Error ? err.message : String(err),\n });\n throw err;\n }\n }\n\n /**\n * Get current query count (useful for N+1 detection in tests)\n */\n getQueryCount(): number {\n return this.queryCounter;\n }\n\n /**\n * Reset the query counter\n */\n resetQueryCount(): void {\n this.queryCounter = 0;\n this.nPlusOneDetector.clear();\n }\n\n /**\n * Get detected N+1 patterns\n */\n getNPlusOnePatterns(): Array<{ query: string; count: number }> {\n const patterns: Array<{ query: string; count: number }> = [];\n for (const [query, { count }] of this.nPlusOneDetector.entries()) {\n if (count >= 5) {\n patterns.push({ query, count });\n }\n }\n return patterns;\n }\n\n /**\n * Force flush queued query events\n */\n async flush(): Promise<void> {\n if (this.queue.length === 0) return;\n\n const queries = [...this.queue];\n this.queue = [];\n\n try {\n const response = await fetch(`${this.config.endpoint}/api/sdk/metrics`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-API-Key': this.config.apiKey,\n },\n body: JSON.stringify({\n metrics: queries.map((q) => ({\n name: 'db.query',\n value: q.duration_ms,\n type: 'distribution',\n unit: 'ms',\n tags: {\n query: q.query.substring(0, 200),\n source: q.source || 'unknown',\n is_slow: String(q.is_slow || false),\n ...(q.error ? { error: 'true' } : {}),\n },\n timestamp: q.timestamp,\n })),\n }),\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}`);\n }\n\n this.log(`Flushed ${queries.length} query events`);\n } catch (err) {\n this.queue.unshift(...queries);\n this.log('Failed to flush query events:', err);\n }\n }\n\n /**\n * Destroy the tracker and flush remaining events\n */\n async destroy(): Promise<void> {\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n this.flushTimer = null;\n }\n await this.flush();\n }\n\n private recordQuery(event: DatabaseQueryEvent): void {\n this.queue.push(event);\n\n if (this.queue.length >= (this.config.maxBatchSize || 50)) {\n this.flush();\n }\n\n if (event.is_slow) {\n this.log(`Slow query (${event.duration_ms}ms):`, event.query.substring(0, 100));\n }\n }\n\n private detectNPlusOne(query: string): void {\n // Normalize query for pattern matching\n const pattern = this.normalizeQuery(query);\n const now = Date.now();\n\n const existing = this.nPlusOneDetector.get(pattern);\n if (existing) {\n // If same pattern repeated within 1 second\n if (now - existing.since < 1000) {\n existing.count++;\n if (existing.count === 5) {\n this.log(`N+1 query detected! Pattern repeated ${existing.count} times:`, pattern.substring(0, 100));\n }\n } else {\n // Reset window\n this.nPlusOneDetector.set(pattern, { count: 1, since: now });\n }\n } else {\n this.nPlusOneDetector.set(pattern, { count: 1, since: now });\n }\n\n // Cleanup old patterns\n if (this.nPlusOneDetector.size > 100) {\n const entries = [...this.nPlusOneDetector.entries()];\n entries.sort((a, b) => a[1].since - b[1].since);\n for (let i = 0; i < 50; i++) {\n this.nPlusOneDetector.delete(entries[i][0]);\n }\n }\n }\n\n private normalizeQuery(query: string): string {\n return query\n .replace(/\\s+/g, ' ')\n .replace(/'[^']*'/g, '?')\n .replace(/\\b\\d+\\b/g, '?')\n .trim()\n .substring(0, 300);\n }\n\n private redactQuery(query: string): string {\n return query\n .replace(/'[^']*'/g, \"'***'\")\n .replace(/\\b\\d{4,}\\b/g, '***');\n }\n\n private startFlushTimer(): void {\n this.flushTimer = setInterval(() => {\n this.flush();\n }, this.config.flushInterval || 10000);\n }\n\n private log(...args: unknown[]): void {\n if (this.config.debug) {\n console.log('[SitePong:DB]', ...args);\n }\n }\n}\n","/**\n * Production Profiling SDK Module\n *\n * Usage:\n * import { profiler } from '@sitepong/sdk';\n *\n * // Profile a function\n * const result = await profiler.profile('processOrder', async () => {\n * return await processOrder(orderId);\n * });\n *\n * // Get flame graph data\n * const profile = profiler.getProfile();\n */\n\nexport interface ProfileFrame {\n name: string;\n duration_ms: number;\n start_ms: number;\n children: ProfileFrame[];\n metadata?: Record<string, unknown>;\n}\n\nexport interface ProfileData {\n id: string;\n name: string;\n startTime: number;\n duration_ms: number;\n frames: ProfileFrame[];\n metadata?: Record<string, unknown>;\n}\n\nexport interface ProfilerConfig {\n apiKey: string;\n endpoint: string;\n debug?: boolean;\n /** Sample rate for profiling (0-1, default 0.1 = 10%) */\n sampleRate?: number;\n /** Maximum profile duration in ms (default 30000) */\n maxDuration?: number;\n /** Flush interval for sending profiles (default 30000) */\n flushInterval?: number;\n}\n\nexport class Profiler {\n private config: ProfilerConfig;\n private profiles: ProfileData[] = [];\n private activeProfile: ProfileData | null = null;\n private frameStack: ProfileFrame[] = [];\n private flushTimer: ReturnType<typeof setTimeout> | null = null;\n\n constructor(config: ProfilerConfig) {\n this.config = {\n sampleRate: 0.1,\n maxDuration: 30000,\n flushInterval: 30000,\n ...config,\n };\n this.startFlushTimer();\n }\n\n /**\n * Profile an async function execution\n */\n async profile<T>(name: string, fn: () => Promise<T>, metadata?: Record<string, unknown>): Promise<T> {\n // Sample rate check\n if (Math.random() > (this.config.sampleRate || 0.1)) {\n return fn();\n }\n\n const profileId = this.generateId();\n const startTime = performance.now();\n\n this.activeProfile = {\n id: profileId,\n name,\n startTime,\n duration_ms: 0,\n frames: [],\n metadata,\n };\n this.frameStack = [];\n\n const rootFrame: ProfileFrame = {\n name,\n start_ms: 0,\n duration_ms: 0,\n children: [],\n metadata,\n };\n this.frameStack.push(rootFrame);\n\n try {\n const result = await fn();\n\n rootFrame.duration_ms = performance.now() - startTime;\n this.activeProfile.duration_ms = rootFrame.duration_ms;\n this.activeProfile.frames = [rootFrame];\n\n // Only record if under max duration\n if (rootFrame.duration_ms <= (this.config.maxDuration || 30000)) {\n this.profiles.push(this.activeProfile);\n }\n\n this.activeProfile = null;\n this.frameStack = [];\n\n return result;\n } catch (err) {\n rootFrame.duration_ms = performance.now() - startTime;\n rootFrame.metadata = { ...rootFrame.metadata, error: true };\n if (this.activeProfile) {\n this.activeProfile.duration_ms = rootFrame.duration_ms;\n this.activeProfile.frames = [rootFrame];\n this.profiles.push(this.activeProfile);\n }\n this.activeProfile = null;\n this.frameStack = [];\n throw err;\n }\n }\n\n /**\n * Start a profiling span within an active profile\n */\n startSpan(name: string, metadata?: Record<string, unknown>): () => void {\n if (!this.activeProfile) return () => {};\n\n const startMs = performance.now() - this.activeProfile.startTime;\n const frame: ProfileFrame = {\n name,\n start_ms: startMs,\n duration_ms: 0,\n children: [],\n metadata,\n };\n\n // Add as child of current frame\n const parent = this.frameStack[this.frameStack.length - 1];\n if (parent) {\n parent.children.push(frame);\n }\n this.frameStack.push(frame);\n\n return () => {\n frame.duration_ms = (performance.now() - this.activeProfile!.startTime) - frame.start_ms;\n this.frameStack.pop();\n };\n }\n\n /**\n * Get all collected profiles\n */\n getProfiles(): ProfileData[] {\n return [...this.profiles];\n }\n\n /**\n * Get the latest profile\n */\n getLatestProfile(): ProfileData | null {\n return this.profiles.length > 0 ? this.profiles[this.profiles.length - 1] : null;\n }\n\n /**\n * Flush profiles to the server\n */\n async flush(): Promise<void> {\n if (this.profiles.length === 0) return;\n\n const profiles = [...this.profiles];\n this.profiles = [];\n\n try {\n const response = await fetch(`${this.config.endpoint}/api/sdk/metrics`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-API-Key': this.config.apiKey,\n },\n body: JSON.stringify({\n metrics: profiles.map((p) => ({\n name: `profile.${p.name}`,\n value: p.duration_ms,\n type: 'distribution',\n unit: 'ms',\n tags: {\n profile_id: p.id,\n frame_count: String(countFrames(p.frames)),\n ...(p.metadata as Record<string, string> || {}),\n },\n timestamp: new Date(Date.now() - p.duration_ms).toISOString(),\n })),\n }),\n });\n\n if (!response.ok) throw new Error(`HTTP ${response.status}`);\n this.log(`Flushed ${profiles.length} profiles`);\n } catch (err) {\n this.profiles.unshift(...profiles);\n this.log('Failed to flush profiles:', err);\n }\n }\n\n /**\n * Destroy the profiler\n */\n async destroy(): Promise<void> {\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n this.flushTimer = null;\n }\n await this.flush();\n }\n\n private startFlushTimer(): void {\n this.flushTimer = setInterval(() => {\n this.flush();\n }, this.config.flushInterval || 30000);\n }\n\n private generateId(): string {\n return `prof_${Date.now().toString(36)}_${Math.random().toString(36).substring(2, 8)}`;\n }\n\n private log(...args: unknown[]): void {\n if (this.config.debug) {\n console.log('[SitePong:Profiler]', ...args);\n }\n }\n}\n\nfunction countFrames(frames: ProfileFrame[]): number {\n let count = frames.length;\n for (const frame of frames) {\n count += countFrames(frame.children);\n }\n return count;\n}\n","/**\n * Remote Config Defaults\n *\n * Hardcoded defaults used when no remote config is available.\n */\n\nimport type { RemoteConfig } from './types';\n\nexport const DEFAULT_REMOTE_CONFIG: RemoteConfig = {\n features: {},\n sampling: {\n errors: 1,\n analytics: 1,\n replay: 1,\n performance: 1,\n },\n transport: {\n flushInterval: 10000,\n maxBatchSize: 20,\n maxRetries: 3,\n },\n autocapture: {\n clicks: true,\n forms: true,\n pageviews: true,\n appState: true,\n screenViews: true,\n },\n ttl: 300, // 5 minutes\n};\n","/**\n * Remote Config Manager\n *\n * Fetches SDK behavior config from SitePong servers on init.\n * Caches in StorageAdapter with TTL. Auto-refreshes in background.\n * User's explicit config always wins over remote config.\n */\n\nimport type { RemoteConfig, RemoteConfigResponse, RemoteConfigListener } from './types';\nimport type { StorageAdapter } from '../utils/platform';\nimport { DEFAULT_REMOTE_CONFIG } from './defaults';\nimport { detectPlatform } from '../utils/platform';\n\nconst STORAGE_KEY = 'sitepong_remote_config';\nconst STORAGE_TS_KEY = 'sitepong_remote_config_ts';\n\nexport interface RemoteConfigManagerOptions {\n apiKey: string;\n endpoint: string;\n storage?: StorageAdapter | null;\n sdkVersion?: string;\n debug?: boolean;\n}\n\nexport class RemoteConfigManager {\n private config: RemoteConfig;\n private options: RemoteConfigManagerOptions;\n private listeners: RemoteConfigListener[] = [];\n private refreshTimer: ReturnType<typeof setTimeout> | null = null;\n private initialized = false;\n\n constructor(options: RemoteConfigManagerOptions) {\n this.options = options;\n this.config = { ...DEFAULT_REMOTE_CONFIG };\n }\n\n async init(): Promise<void> {\n // 1. Load cached config instantly\n await this.loadFromCache();\n this.initialized = true;\n\n // 2. Fetch fresh config in background\n this.fetchAndApply().catch((err) => {\n this.log('Failed to fetch remote config:', err);\n });\n }\n\n getConfig(): RemoteConfig {\n return this.config;\n }\n\n isFeatureEnabled(key: string, defaultValue = true): boolean {\n return this.config.features[key] ?? defaultValue;\n }\n\n onChange(listener: RemoteConfigListener): () => void {\n this.listeners.push(listener);\n return () => {\n this.listeners = this.listeners.filter((l) => l !== listener);\n };\n }\n\n isInitialized(): boolean {\n return this.initialized;\n }\n\n destroy(): void {\n if (this.refreshTimer) {\n clearTimeout(this.refreshTimer);\n this.refreshTimer = null;\n }\n this.listeners = [];\n }\n\n private async loadFromCache(): Promise<void> {\n const storage = this.options.storage;\n if (!storage) return;\n\n try {\n const cached = await storage.getItem(STORAGE_KEY);\n const cachedTs = await storage.getItem(STORAGE_TS_KEY);\n\n if (cached && cachedTs) {\n const age = Date.now() - parseInt(cachedTs, 10);\n const ttlMs = this.config.ttl * 1000;\n\n if (age < ttlMs) {\n const parsed = JSON.parse(cached) as RemoteConfig;\n this.config = parsed;\n this.log('Loaded config from cache (age:', Math.round(age / 1000), 's)');\n }\n }\n } catch {\n this.log('Failed to load cached config');\n }\n }\n\n private async fetchAndApply(): Promise<void> {\n try {\n const platform = detectPlatform();\n const params = new URLSearchParams({\n platform,\n ...(this.options.sdkVersion ? { sdkVersion: this.options.sdkVersion } : {}),\n });\n\n const response = await fetch(\n `${this.options.endpoint}/api/sdk/config?${params}`,\n {\n method: 'GET',\n headers: {\n 'X-API-Key': this.options.apiKey,\n },\n }\n );\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}`);\n }\n\n const data = (await response.json()) as RemoteConfigResponse;\n this.config = data.config;\n\n // Notify listeners\n for (const listener of this.listeners) {\n try {\n listener(this.config);\n } catch {\n // Ignore listener errors\n }\n }\n\n // Cache\n await this.saveToCache();\n\n // Schedule refresh\n this.scheduleRefresh();\n\n // Check SDK version\n if (data.config.minSdkVersion && this.options.sdkVersion) {\n if (this.compareVersions(this.options.sdkVersion, data.config.minSdkVersion) < 0) {\n console.warn(\n `[SitePong] SDK version ${this.options.sdkVersion} is outdated. ` +\n `Minimum recommended: ${data.config.minSdkVersion}. Please update.`\n );\n }\n }\n\n this.log('Remote config fetched successfully');\n } catch (err) {\n // Schedule retry even on failure\n this.scheduleRefresh();\n throw err;\n }\n }\n\n private async saveToCache(): Promise<void> {\n const storage = this.options.storage;\n if (!storage) return;\n\n try {\n await storage.setItem(STORAGE_KEY, JSON.stringify(this.config));\n await storage.setItem(STORAGE_TS_KEY, String(Date.now()));\n } catch {\n this.log('Failed to cache remote config');\n }\n }\n\n private scheduleRefresh(): void {\n if (this.refreshTimer) {\n clearTimeout(this.refreshTimer);\n }\n\n const ttlMs = this.config.ttl * 1000;\n this.refreshTimer = setTimeout(() => {\n this.fetchAndApply().catch((err) => {\n this.log('Refresh failed:', err);\n });\n }, ttlMs);\n }\n\n private compareVersions(a: string, b: string): number {\n const pa = a.split('.').map(Number);\n const pb = b.split('.').map(Number);\n for (let i = 0; i < 3; i++) {\n const na = pa[i] || 0;\n const nb = pb[i] || 0;\n if (na > nb) return 1;\n if (na < nb) return -1;\n }\n return 0;\n }\n\n private log(...args: unknown[]): void {\n if (this.options.debug) {\n console.log('[SitePong RemoteConfig]', ...args);\n }\n }\n}\n","var e,n,t,r,i,o=-1,a=function(e){addEventListener(\"pageshow\",(function(n){n.persisted&&(o=n.timeStamp,e(n))}),!0)},c=function(){var e=self.performance&&performance.getEntriesByType&&performance.getEntriesByType(\"navigation\")[0];if(e&&e.responseStart>0&&e.responseStart<performance.now())return e},u=function(){var e=c();return e&&e.activationStart||0},f=function(e,n){var t=c(),r=\"navigate\";o>=0?r=\"back-forward-cache\":t&&(document.prerendering||u()>0?r=\"prerender\":document.wasDiscarded?r=\"restore\":t.type&&(r=t.type.replace(/_/g,\"-\")));return{name:e,value:void 0===n?-1:n,rating:\"good\",delta:0,entries:[],id:\"v4-\".concat(Date.now(),\"-\").concat(Math.floor(8999999999999*Math.random())+1e12),navigationType:r}},s=function(e,n,t){try{if(PerformanceObserver.supportedEntryTypes.includes(e)){var r=new PerformanceObserver((function(e){Promise.resolve().then((function(){n(e.getEntries())}))}));return r.observe(Object.assign({type:e,buffered:!0},t||{})),r}}catch(e){}},d=function(e,n,t,r){var i,o;return function(a){n.value>=0&&(a||r)&&((o=n.value-(i||0))||void 0===i)&&(i=n.value,n.delta=o,n.rating=function(e,n){return e>n[1]?\"poor\":e>n[0]?\"needs-improvement\":\"good\"}(n.value,t),e(n))}},l=function(e){requestAnimationFrame((function(){return requestAnimationFrame((function(){return e()}))}))},p=function(e){document.addEventListener(\"visibilitychange\",(function(){\"hidden\"===document.visibilityState&&e()}))},v=function(e){var n=!1;return function(){n||(e(),n=!0)}},m=-1,h=function(){return\"hidden\"!==document.visibilityState||document.prerendering?1/0:0},g=function(e){\"hidden\"===document.visibilityState&&m>-1&&(m=\"visibilitychange\"===e.type?e.timeStamp:0,T())},y=function(){addEventListener(\"visibilitychange\",g,!0),addEventListener(\"prerenderingchange\",g,!0)},T=function(){removeEventListener(\"visibilitychange\",g,!0),removeEventListener(\"prerenderingchange\",g,!0)},E=function(){return m<0&&(m=h(),y(),a((function(){setTimeout((function(){m=h(),y()}),0)}))),{get firstHiddenTime(){return m}}},C=function(e){document.prerendering?addEventListener(\"prerenderingchange\",(function(){return e()}),!0):e()},b=[1800,3e3],S=function(e,n){n=n||{},C((function(){var t,r=E(),i=f(\"FCP\"),o=s(\"paint\",(function(e){e.forEach((function(e){\"first-contentful-paint\"===e.name&&(o.disconnect(),e.startTime<r.firstHiddenTime&&(i.value=Math.max(e.startTime-u(),0),i.entries.push(e),t(!0)))}))}));o&&(t=d(e,i,b,n.reportAllChanges),a((function(r){i=f(\"FCP\"),t=d(e,i,b,n.reportAllChanges),l((function(){i.value=performance.now()-r.timeStamp,t(!0)}))})))}))},L=[.1,.25],w=function(e,n){n=n||{},S(v((function(){var t,r=f(\"CLS\",0),i=0,o=[],c=function(e){e.forEach((function(e){if(!e.hadRecentInput){var n=o[0],t=o[o.length-1];i&&e.startTime-t.startTime<1e3&&e.startTime-n.startTime<5e3?(i+=e.value,o.push(e)):(i=e.value,o=[e])}})),i>r.value&&(r.value=i,r.entries=o,t())},u=s(\"layout-shift\",c);u&&(t=d(e,r,L,n.reportAllChanges),p((function(){c(u.takeRecords()),t(!0)})),a((function(){i=0,r=f(\"CLS\",0),t=d(e,r,L,n.reportAllChanges),l((function(){return t()}))})),setTimeout(t,0))})))},A=0,I=1/0,P=0,M=function(e){e.forEach((function(e){e.interactionId&&(I=Math.min(I,e.interactionId),P=Math.max(P,e.interactionId),A=P?(P-I)/7+1:0)}))},k=function(){return e?A:performance.interactionCount||0},F=function(){\"interactionCount\"in performance||e||(e=s(\"event\",M,{type:\"event\",buffered:!0,durationThreshold:0}))},D=[],x=new Map,R=0,B=function(){var e=Math.min(D.length-1,Math.floor((k()-R)/50));return D[e]},H=[],q=function(e){if(H.forEach((function(n){return n(e)})),e.interactionId||\"first-input\"===e.entryType){var n=D[D.length-1],t=x.get(e.interactionId);if(t||D.length<10||e.duration>n.latency){if(t)e.duration>t.latency?(t.entries=[e],t.latency=e.duration):e.duration===t.latency&&e.startTime===t.entries[0].startTime&&t.entries.push(e);else{var r={id:e.interactionId,latency:e.duration,entries:[e]};x.set(r.id,r),D.push(r)}D.sort((function(e,n){return n.latency-e.latency})),D.length>10&&D.splice(10).forEach((function(e){return x.delete(e.id)}))}}},O=function(e){var n=self.requestIdleCallback||self.setTimeout,t=-1;return e=v(e),\"hidden\"===document.visibilityState?e():(t=n(e),p(e)),t},N=[200,500],j=function(e,n){\"PerformanceEventTiming\"in self&&\"interactionId\"in PerformanceEventTiming.prototype&&(n=n||{},C((function(){var t;F();var r,i=f(\"INP\"),o=function(e){O((function(){e.forEach(q);var n=B();n&&n.latency!==i.value&&(i.value=n.latency,i.entries=n.entries,r())}))},c=s(\"event\",o,{durationThreshold:null!==(t=n.durationThreshold)&&void 0!==t?t:40});r=d(e,i,N,n.reportAllChanges),c&&(c.observe({type:\"first-input\",buffered:!0}),p((function(){o(c.takeRecords()),r(!0)})),a((function(){R=k(),D.length=0,x.clear(),i=f(\"INP\"),r=d(e,i,N,n.reportAllChanges)})))})))},_=[2500,4e3],z={},G=function(e,n){n=n||{},C((function(){var t,r=E(),i=f(\"LCP\"),o=function(e){n.reportAllChanges||(e=e.slice(-1)),e.forEach((function(e){e.startTime<r.firstHiddenTime&&(i.value=Math.max(e.startTime-u(),0),i.entries=[e],t())}))},c=s(\"largest-contentful-paint\",o);if(c){t=d(e,i,_,n.reportAllChanges);var m=v((function(){z[i.id]||(o(c.takeRecords()),c.disconnect(),z[i.id]=!0,t(!0))}));[\"keydown\",\"click\"].forEach((function(e){addEventListener(e,(function(){return O(m)}),{once:!0,capture:!0})})),p(m),a((function(r){i=f(\"LCP\"),t=d(e,i,_,n.reportAllChanges),l((function(){i.value=performance.now()-r.timeStamp,z[i.id]=!0,t(!0)}))}))}}))},J=[800,1800],K=function e(n){document.prerendering?C((function(){return e(n)})):\"complete\"!==document.readyState?addEventListener(\"load\",(function(){return e(n)}),!0):setTimeout(n,0)},Q=function(e,n){n=n||{};var t=f(\"TTFB\"),r=d(e,t,J,n.reportAllChanges);K((function(){var i=c();i&&(t.value=Math.max(i.responseStart-u(),0),t.entries=[i],r(!0),a((function(){t=f(\"TTFB\",0),(r=d(e,t,J,n.reportAllChanges))(!0)})))}))},U={passive:!0,capture:!0},V=new Date,W=function(e,i){n||(n=i,t=e,r=new Date,Z(removeEventListener),X())},X=function(){if(t>=0&&t<r-V){var e={entryType:\"first-input\",name:n.type,target:n.target,cancelable:n.cancelable,startTime:n.timeStamp,processingStart:n.timeStamp+t};i.forEach((function(n){n(e)})),i=[]}},Y=function(e){if(e.cancelable){var n=(e.timeStamp>1e12?new Date:performance.now())-e.timeStamp;\"pointerdown\"==e.type?function(e,n){var t=function(){W(e,n),i()},r=function(){i()},i=function(){removeEventListener(\"pointerup\",t,U),removeEventListener(\"pointercancel\",r,U)};addEventListener(\"pointerup\",t,U),addEventListener(\"pointercancel\",r,U)}(n,e):W(n,e)}},Z=function(e){[\"mousedown\",\"keydown\",\"touchstart\",\"pointerdown\"].forEach((function(n){return e(n,Y,U)}))},$=[100,300],ee=function(e,r){r=r||{},C((function(){var o,c=E(),u=f(\"FID\"),l=function(e){e.startTime<c.firstHiddenTime&&(u.value=e.processingStart-e.startTime,u.entries.push(e),o(!0))},m=function(e){e.forEach(l)},h=s(\"first-input\",m);o=d(e,u,$,r.reportAllChanges),h&&(p(v((function(){m(h.takeRecords()),h.disconnect()}))),a((function(){var a;u=f(\"FID\"),o=d(e,u,$,r.reportAllChanges),i=[],t=-1,n=null,Z(addEventListener),a=l,i.push(a),X()})))}))};export{L as CLSThresholds,b as FCPThresholds,$ as FIDThresholds,N as INPThresholds,_ as LCPThresholds,J as TTFBThresholds,w as onCLS,S as onFCP,ee as onFID,j as onINP,G as onLCP,Q as onTTFB};\n","import { onCLS, onINP, onLCP, onTTFB, onFCP } from 'web-vitals';\nimport type {\n PerformanceConfig,\n PerformanceMetric,\n PerformanceTransaction,\n PerformanceSpan,\n WebVitals,\n ResourceTimingBreakdown,\n} from './types';\n\nconst DEFAULT_ENDPOINT = 'https://ingest.sitepong.com';\nconst DEFAULT_FLUSH_INTERVAL = 10000;\nconst MAX_FLUSH_FAILURES = 3;\nconst MAX_RESOURCES_PER_FLUSH = 200;\nconst PAGE_TIMING_POLL_INTERVAL = 200;\nconst PAGE_TIMING_TIMEOUT = 30000;\n\n// --- Speed Index helpers (adapted from OpenReplay / RUM-SpeedIndex) ---\n\ninterface ResourcesTimeMap {\n [url: string]: number;\n}\n\ninterface PaintBlock {\n time: number;\n area: number;\n}\n\nfunction getPaintBlocks(resources: ResourcesTimeMap): PaintBlock[] {\n const paintBlocks: PaintBlock[] = [];\n const elements = document.getElementsByTagName('*');\n const styleURL = /url\\((\"[^\"]*\"|'[^']*'|[^)]*)\\)/i;\n\n for (let i = 0; i < elements.length; i++) {\n const element = elements[i];\n let src = '';\n\n if (element.tagName === 'IMG') {\n src = (element as HTMLImageElement).currentSrc || (element as HTMLImageElement).src;\n }\n\n if (!src) {\n const backgroundImage = getComputedStyle(element).getPropertyValue('background-image');\n if (backgroundImage) {\n const matches = styleURL.exec(backgroundImage);\n if (matches !== null) {\n src = matches[1];\n if (src.startsWith('\"') || src.startsWith(\"'\")) {\n src = src.substr(1, src.length - 2);\n }\n }\n }\n }\n\n if (!src) continue;\n const time = src.substr(0, 10) === 'data:image' ? 0 : resources[src];\n if (time === undefined) continue;\n\n const rect = element.getBoundingClientRect();\n const top = Math.max(rect.top, 0);\n const left = Math.max(rect.left, 0);\n const bottom = Math.min(\n rect.bottom,\n window.innerHeight || (document.documentElement && document.documentElement.clientHeight) || 0,\n );\n const right = Math.min(\n rect.right,\n window.innerWidth || (document.documentElement && document.documentElement.clientWidth) || 0,\n );\n\n if (bottom <= top || right <= left) continue;\n const area = (bottom - top) * (right - left);\n paintBlocks.push({ time, area });\n }\n\n return paintBlocks;\n}\n\nfunction calculateSpeedIndex(firstContentfulPaint: number, paintBlocks: PaintBlock[]): number {\n let a =\n (Math.max(\n (document.documentElement && document.documentElement.clientWidth) || 0,\n window.innerWidth || 0,\n ) *\n Math.max(\n (document.documentElement && document.documentElement.clientHeight) || 0,\n window.innerHeight || 0,\n )) /\n 10;\n let s = a * firstContentfulPaint;\n\n for (let i = 0; i < paintBlocks.length; i++) {\n const { time, area } = paintBlocks[i];\n a += area;\n s += area * (time > firstContentfulPaint ? time : firstContentfulPaint);\n }\n\n return a === 0 ? 0 : s / a;\n}\n\n// --- PerformanceManager ---\n\nexport class PerformanceManager {\n private config: Required<\n Omit<\n PerformanceConfig,\n | 'apiKey'\n | 'performanceEndpoint'\n | 'excludedResourceUrls'\n | 'resourceNameSanitizer'\n >\n > & {\n apiKey: string;\n performanceEndpoint?: string;\n excludedResourceUrls: string[];\n resourceNameSanitizer?: (url: string) => string;\n };\n private metrics: PerformanceMetric[] = [];\n private flushTimer: ReturnType<typeof setInterval> | null = null;\n private flushFailures = 0;\n private disabled = false;\n private vitals: WebVitals = {};\n private activeTransactions: Map<string, PerformanceTransaction> = new Map();\n private sampled: boolean;\n\n // Resource timing state for Speed Index\n private resourceObserver: PerformanceObserver | null = null;\n private resourceTimeMap: ResourcesTimeMap | null = {};\n private resourceCount = 0;\n\n // Page timing polling timers\n private pageLoadTimer: ReturnType<typeof setInterval> | null = null;\n private pageRenderTimer: ReturnType<typeof setInterval> | null = null;\n\n constructor(config: PerformanceConfig) {\n this.config = {\n endpoint: DEFAULT_ENDPOINT,\n enabled: true,\n webVitals: true,\n navigationTiming: true,\n resourceTiming: true,\n capturePageLoadTimings: true,\n capturePageRenderTimings: true,\n excludedResourceUrls: [],\n flushInterval: DEFAULT_FLUSH_INTERVAL,\n sampleRate: 1.0,\n debug: false,\n ...config,\n };\n this.sampled = Math.random() <= this.config.sampleRate;\n }\n\n init(): void {\n if (!this.config.enabled || !this.sampled) return;\n if (typeof window === 'undefined' || typeof window.addEventListener !== 'function') return;\n\n if (this.config.webVitals !== false) {\n this.initWebVitals();\n }\n\n if (this.config.resourceTiming !== false) {\n this.initResourceTiming();\n }\n\n if (this.config.capturePageLoadTimings !== false) {\n this.initPageLoadTiming();\n }\n\n if (this.config.capturePageRenderTimings !== false) {\n this.initPageRenderTiming();\n }\n\n this.startFlushTimer();\n this.log('Performance monitoring initialized');\n }\n\n // ---- Web Vitals (via web-vitals library) ----\n\n private initWebVitals(): void {\n onCLS((m) => {\n this.vitals.cls = m.value;\n this.reportVital('CLS', m.value, 'score');\n });\n onINP((m) => {\n this.vitals.inp = m.value;\n this.reportVital('INP', m.value);\n });\n onLCP((m) => {\n this.vitals.lcp = m.value;\n this.reportVital('LCP', m.value);\n });\n onTTFB((m) => {\n this.vitals.ttfb = m.value;\n this.reportVital('TTFB', m.value);\n });\n onFCP((m) => {\n this.vitals.fcp = m.value;\n this.reportVital('FCP', m.value);\n });\n }\n\n // ---- Resource Timing (adapted from OpenReplay timing.ts) ----\n\n private initResourceTiming(): void {\n if (typeof PerformanceObserver === 'undefined') return;\n\n try {\n this.resourceObserver = new PerformanceObserver((list) => {\n for (const entry of list.getEntries()) {\n this.processResourceEntry(entry as PerformanceResourceTiming);\n }\n });\n this.resourceObserver.observe({ type: 'resource', buffered: true });\n } catch {\n this.log('PerformanceObserver for resource timing not supported');\n }\n }\n\n private isServiceURL(url: string): boolean {\n const endpoint = this.config.performanceEndpoint || this.config.endpoint;\n return url.startsWith(endpoint);\n }\n\n private processResourceEntry(entry: PerformanceResourceTiming): void {\n if (entry.duration < 0 || !entry.name.startsWith('http')) return;\n if (this.isServiceURL(entry.name)) return;\n\n // Track for Speed Index calculation\n if (this.resourceTimeMap !== null) {\n this.resourceTimeMap[entry.name] = entry.startTime + entry.duration;\n }\n\n // Check excluded URLs\n for (const excluded of this.config.excludedResourceUrls) {\n if (entry.name.startsWith(excluded)) return;\n }\n\n // Cap resources per flush\n if (this.resourceCount >= MAX_RESOURCES_PER_FLUSH) return;\n this.resourceCount++;\n\n // Stalled time calculation (from OpenReplay)\n let stalled = 0;\n if (entry.connectEnd && entry.connectEnd > entry.domainLookupEnd) {\n stalled = Math.max(0, entry.requestStart - entry.connectEnd);\n } else {\n stalled = Math.max(0, entry.requestStart - entry.domainLookupEnd);\n }\n\n const cached: boolean =\n ((entry as any).responseStatus && (entry as any).responseStatus === 304) ||\n ((entry as any).deliveryType && (entry as any).deliveryType === 'cache') ||\n (entry.transferSize === 0 && entry.decodedBodySize > 0);\n\n const responseStatus = (entry as any).responseStatus || 0;\n const failed = responseStatus >= 400;\n\n const breakdown: ResourceTimingBreakdown = {\n queueing: entry.requestStart - entry.fetchStart,\n dnsLookup: entry.domainLookupEnd - entry.domainLookupStart,\n initialConnection: entry.connectEnd - entry.connectStart,\n ssl: entry.secureConnectionStart > 0 ? entry.connectEnd - entry.secureConnectionStart : 0,\n ttfb: entry.responseStart - entry.requestStart,\n contentDownload: entry.responseEnd - entry.responseStart,\n total: entry.duration ?? entry.responseEnd - entry.startTime,\n stalled,\n cached,\n failed,\n responseStatus,\n headerSize: entry.transferSize > entry.encodedBodySize ? entry.transferSize - entry.encodedBodySize : 0,\n encodedBodySize: entry.encodedBodySize || 0,\n decodedBodySize: failed ? -111 : entry.decodedBodySize || 0,\n transferSize: entry.transferSize,\n initiatorType: entry.initiatorType,\n };\n\n const entryName = this.config.resourceNameSanitizer\n ? this.config.resourceNameSanitizer(entry.name)\n : entry.name;\n\n this.addMetric({\n type: 'resource',\n name: entryName,\n value: entry.duration,\n unit: 'ms',\n timestamp: new Date().toISOString(),\n url: typeof window !== 'undefined' && window.location ? window.location.href : undefined,\n data: breakdown as unknown as Record<string, unknown>,\n });\n }\n\n // ---- Page Load Timing (adapted from OpenReplay timing.ts) ----\n\n private initPageLoadTiming(): void {\n if (typeof window === 'undefined' || !window.performance) return;\n\n let firstPaint = 0;\n let firstContentfulPaint = 0;\n let sent = false;\n const startTime = performance.now();\n\n this.pageLoadTimer = setInterval(() => {\n if (sent) {\n if (this.pageLoadTimer) clearInterval(this.pageLoadTimer);\n return;\n }\n\n // Collect paint entries\n if (firstPaint === 0 || firstContentfulPaint === 0) {\n for (const entry of performance.getEntriesByType('paint')) {\n if (entry.name === 'first-paint') firstPaint = entry.startTime;\n if (entry.name === 'first-contentful-paint') firstContentfulPaint = entry.startTime;\n }\n }\n\n const nav = performance.getEntriesByType('navigation')[0] as PerformanceNavigationTiming | undefined;\n const timedOut = performance.now() - startTime > PAGE_TIMING_TIMEOUT;\n\n if ((nav && nav.loadEventEnd > 0) || timedOut) {\n sent = true;\n if (this.pageLoadTimer) clearInterval(this.pageLoadTimer);\n\n if (nav) {\n const navigationStart = nav.startTime;\n\n this.addMetric({\n type: 'navigation',\n name: 'page_load',\n value: nav.loadEventEnd - navigationStart,\n unit: 'ms',\n timestamp: new Date().toISOString(),\n url: window.location.href,\n data: {\n requestStart: nav.requestStart - navigationStart,\n responseStart: nav.responseStart - navigationStart,\n responseEnd: nav.responseEnd - navigationStart,\n domContentLoadedEventStart: nav.domContentLoadedEventEnd - navigationStart,\n domContentLoadedEventEnd: nav.domContentLoadedEventEnd - navigationStart,\n loadEventStart: nav.loadEventStart - navigationStart,\n loadEventEnd: nav.loadEventEnd - navigationStart,\n firstPaint,\n firstContentfulPaint,\n dns: nav.domainLookupEnd - nav.domainLookupStart,\n tcp: nav.connectEnd - nav.connectStart,\n ttfb: nav.responseStart - nav.requestStart,\n domComplete: nav.domComplete - navigationStart,\n transferSize: nav.transferSize,\n encodedBodySize: nav.encodedBodySize,\n decodedBodySize: nav.decodedBodySize,\n },\n });\n }\n }\n }, PAGE_TIMING_POLL_INTERVAL);\n }\n\n // ---- Page Render Timing: Speed Index, Visually Complete, TTI (adapted from OpenReplay) ----\n\n private initPageRenderTiming(): void {\n if (typeof window === 'undefined' || !window.performance) return;\n\n let firstContentfulPaint = 0;\n let visuallyComplete = 0;\n let interactiveWindowStartTime = 0;\n let interactiveWindowTickTime: number | null = 0;\n let paintBlocks: PaintBlock[] | null = null;\n let sent = false;\n const startTime = performance.now();\n\n this.pageRenderTimer = setInterval(() => {\n if (sent) {\n if (this.pageRenderTimer) clearInterval(this.pageRenderTimer);\n return;\n }\n\n const time = performance.now();\n\n // Get FCP if we don't have it yet\n if (firstContentfulPaint === 0) {\n for (const entry of performance.getEntriesByType('paint')) {\n if (entry.name === 'first-contentful-paint') {\n firstContentfulPaint = entry.startTime;\n }\n }\n }\n\n // Track visually complete from resource map\n if (this.resourceTimeMap !== null) {\n const times = Object.values(this.resourceTimeMap);\n if (times.length > 0) {\n visuallyComplete = Math.max(...times);\n }\n if (time - visuallyComplete > 1000) {\n paintBlocks = getPaintBlocks(this.resourceTimeMap);\n this.resourceTimeMap = null;\n }\n }\n\n // TTI: 5-second quiet window (no 50ms+ long tasks)\n if (interactiveWindowTickTime !== null) {\n if (time - interactiveWindowTickTime > 50) {\n interactiveWindowStartTime = time;\n }\n interactiveWindowTickTime = time - interactiveWindowStartTime > 5000 ? null : time;\n }\n\n const timedOut = time - startTime > PAGE_TIMING_TIMEOUT;\n\n if ((paintBlocks !== null && interactiveWindowTickTime === null) || timedOut) {\n sent = true;\n if (this.pageRenderTimer) clearInterval(this.pageRenderTimer);\n this.resourceTimeMap = null;\n\n const speedIndex =\n paintBlocks === null\n ? 0\n : calculateSpeedIndex(firstContentfulPaint || 0, paintBlocks);\n\n const nav = performance.getEntriesByType('navigation')[0] as PerformanceNavigationTiming | undefined;\n const domContentLoadedEnd = nav ? nav.domContentLoadedEventEnd - nav.startTime : 0;\n\n const timeToInteractive =\n interactiveWindowTickTime === null\n ? Math.max(interactiveWindowStartTime, firstContentfulPaint, domContentLoadedEnd)\n : 0;\n\n const url = window.location.href;\n const timestamp = new Date().toISOString();\n\n if (speedIndex > 0) {\n this.addMetric({\n type: 'page_render',\n name: 'speed_index',\n value: Math.round(speedIndex),\n unit: 'ms',\n timestamp,\n url,\n });\n }\n\n if (visuallyComplete > 0) {\n this.addMetric({\n type: 'page_render',\n name: 'visually_complete',\n value: Math.round(visuallyComplete),\n unit: 'ms',\n timestamp,\n url,\n });\n }\n\n if (timeToInteractive > 0) {\n this.addMetric({\n type: 'page_render',\n name: 'tti',\n value: Math.round(timeToInteractive),\n unit: 'ms',\n timestamp,\n url,\n });\n }\n }\n }, PAGE_TIMING_POLL_INTERVAL);\n }\n\n // ---- Transactions / Spans (unchanged) ----\n\n startTransaction(name: string, data?: Record<string, unknown>): string {\n const id = `txn_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 6)}`;\n const transaction: PerformanceTransaction = {\n id,\n name,\n startTime: performance.now(),\n status: 'running',\n spans: [],\n data,\n };\n this.activeTransactions.set(id, transaction);\n this.log('Transaction started:', name, id);\n return id;\n }\n\n endTransaction(id: string, status: 'ok' | 'error' = 'ok'): void {\n const transaction = this.activeTransactions.get(id);\n if (!transaction) {\n this.log('Transaction not found:', id);\n return;\n }\n\n transaction.endTime = performance.now();\n transaction.duration = transaction.endTime - transaction.startTime;\n transaction.status = status;\n\n for (const span of transaction.spans) {\n if (span.status === 'running') {\n span.endTime = transaction.endTime;\n span.duration = span.endTime - span.startTime;\n span.status = status;\n }\n }\n\n this.activeTransactions.delete(id);\n\n this.addMetric({\n type: 'transaction',\n name: transaction.name,\n value: transaction.duration,\n unit: 'ms',\n timestamp: new Date().toISOString(),\n url: typeof window !== 'undefined' && window.location ? window.location.href : undefined,\n transaction,\n });\n\n this.log('Transaction ended:', transaction.name, `${transaction.duration.toFixed(1)}ms`);\n }\n\n startSpan(transactionId: string, name: string, data?: Record<string, unknown>): string {\n const transaction = this.activeTransactions.get(transactionId);\n if (!transaction) {\n this.log('Transaction not found for span:', transactionId);\n return '';\n }\n\n const span: PerformanceSpan = {\n id: `span_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 6)}`,\n name,\n startTime: performance.now(),\n status: 'running',\n data,\n };\n\n transaction.spans.push(span);\n return span.id;\n }\n\n endSpan(transactionId: string, spanId: string, status: 'ok' | 'error' = 'ok'): void {\n const transaction = this.activeTransactions.get(transactionId);\n if (!transaction) return;\n\n const span = transaction.spans.find((s) => s.id === spanId);\n if (!span) return;\n\n span.endTime = performance.now();\n span.duration = span.endTime - span.startTime;\n span.status = status;\n }\n\n // ---- Public API ----\n\n getVitals(): WebVitals {\n return { ...this.vitals };\n }\n\n destroy(): void {\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n this.flushTimer = null;\n }\n if (this.pageLoadTimer) {\n clearInterval(this.pageLoadTimer);\n this.pageLoadTimer = null;\n }\n if (this.pageRenderTimer) {\n clearInterval(this.pageRenderTimer);\n this.pageRenderTimer = null;\n }\n if (this.resourceObserver) {\n this.resourceObserver.disconnect();\n this.resourceObserver = null;\n }\n this.flush();\n }\n\n // ---- Internal ----\n\n private reportVital(name: string, value: number, unit: 'ms' | 'score' = 'ms'): void {\n this.addMetric({\n type: 'web_vital',\n name,\n value,\n unit,\n timestamp: new Date().toISOString(),\n url: typeof window !== 'undefined' && window.location ? window.location.href : undefined,\n });\n }\n\n private addMetric(metric: PerformanceMetric): void {\n this.metrics.push(metric);\n }\n\n private startFlushTimer(): void {\n this.flushTimer = setInterval(() => {\n this.flush();\n }, this.config.flushInterval);\n\n if (typeof document !== 'undefined') {\n document.addEventListener('visibilitychange', () => {\n if (document.visibilityState === 'hidden') {\n this.flush();\n }\n });\n }\n }\n\n async flush(): Promise<void> {\n if (this.metrics.length === 0) return;\n\n if (this.disabled) {\n this.metrics = [];\n return;\n }\n\n const metrics = [...this.metrics];\n this.metrics = [];\n this.resourceCount = 0;\n\n const endpoint = this.config.performanceEndpoint || `${this.config.endpoint}/api/performance`;\n\n try {\n const response = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-API-Key': this.config.apiKey,\n },\n body: JSON.stringify({ metrics }),\n });\n\n if (!response.ok) throw new Error(`HTTP ${response.status}`);\n this.flushFailures = 0;\n this.log(`Flushed ${metrics.length} performance metrics`);\n } catch (err) {\n this.flushFailures++;\n\n if (this.flushFailures >= MAX_FLUSH_FAILURES) {\n this.disabled = true;\n console.warn(\n `[SitePong Performance] Disabled after ${MAX_FLUSH_FAILURES} consecutive failures. ` +\n `Check that ${endpoint} is accessible and has proper CORS headers.`\n );\n return;\n }\n\n this.metrics.unshift(...metrics);\n this.log(`Failed to flush metrics (attempt ${this.flushFailures}/${MAX_FLUSH_FAILURES}):`, err);\n }\n }\n\n private log(...args: unknown[]): void {\n if (this.config.debug) {\n console.log('[SitePong Performance]', ...args);\n }\n }\n}\n","export interface TraceContext {\n traceId: string;\n spanId: string;\n parentSpanId: string | null;\n sampled: boolean;\n}\n\nfunction randomHex(byteLength: number): string {\n try {\n if (typeof crypto !== 'undefined' && crypto.getRandomValues) {\n const bytes = new Uint8Array(byteLength);\n crypto.getRandomValues(bytes);\n return Array.from(bytes)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n }\n } catch {\n // Fall through to Math.random fallback\n }\n\n let hex = '';\n for (let i = 0; i < byteLength; i++) {\n hex += Math.floor(Math.random() * 256)\n .toString(16)\n .padStart(2, '0');\n }\n return hex;\n}\n\nexport function generateTraceId(): string {\n return randomHex(16);\n}\n\nexport function generateSpanId(): string {\n return randomHex(8);\n}\n\nexport function createTraceContext(): TraceContext {\n return {\n traceId: generateTraceId(),\n spanId: generateSpanId(),\n parentSpanId: null,\n sampled: true,\n };\n}\n\nexport function propagateTrace(context: TraceContext): Record<string, string> {\n const sampledFlag = context.sampled ? '01' : '00';\n return {\n traceparent: `00-${context.traceId}-${context.spanId}-${sampledFlag}`,\n tracestate: `sitepong=${context.spanId}`,\n };\n}\n\nexport function extractTrace(headers: Record<string, string>): TraceContext | null {\n const traceparent = headers['traceparent'] || headers['Traceparent'];\n if (!traceparent) {\n return null;\n }\n\n const parts = traceparent.split('-');\n if (parts.length !== 4) {\n return null;\n }\n\n const [version, traceId, parentSpanId, flags] = parts;\n\n if (version !== '00') {\n return null;\n }\n\n if (traceId.length !== 32 || !/^[0-9a-f]{32}$/.test(traceId)) {\n return null;\n }\n\n if (parentSpanId.length !== 16 || !/^[0-9a-f]{16}$/.test(parentSpanId)) {\n return null;\n }\n\n if (flags.length !== 2 || !/^[0-9a-f]{2}$/.test(flags)) {\n return null;\n }\n\n const sampled = (parseInt(flags, 16) & 0x01) === 1;\n\n return {\n traceId,\n spanId: generateSpanId(),\n parentSpanId,\n sampled,\n };\n}\n\nexport class TracePropagator {\n private targets: string[];\n private originalFetch: typeof fetch | null = null;\n\n constructor(targets: string[]) {\n this.targets = targets;\n }\n\n shouldPropagate(url: string): boolean {\n return this.targets.some((pattern) => {\n if (pattern.includes('*')) {\n const escaped = pattern.replace(/[.+?^${}()|[\\]\\\\]/g, '\\\\$&').replace(/\\*/g, '.*');\n const regex = new RegExp(`^${escaped}$`);\n return regex.test(url);\n }\n return url.startsWith(pattern);\n });\n }\n\n injectHeaders(\n url: string,\n headers: Record<string, string>,\n context: TraceContext\n ): Record<string, string> {\n if (!this.shouldPropagate(url)) {\n return headers;\n }\n\n const traceHeaders = propagateTrace(context);\n return {\n ...headers,\n ...traceHeaders,\n };\n }\n\n start(): void {\n if (typeof window === 'undefined' || !window.fetch) {\n return;\n }\n\n if (this.originalFetch) {\n return;\n }\n\n this.originalFetch = window.fetch;\n const self = this;\n\n window.fetch = function (\n input: RequestInfo | URL,\n init?: RequestInit\n ): Promise<Response> {\n const url = typeof input === 'string'\n ? input\n : input instanceof URL\n ? input.toString()\n : input.url;\n\n if (self.shouldPropagate(url)) {\n const context = createTraceContext();\n const traceHeaders = propagateTrace(context);\n\n const existingHeaders: Record<string, string> = {};\n if (init?.headers) {\n if (init.headers instanceof Headers) {\n init.headers.forEach((value, key) => {\n existingHeaders[key] = value;\n });\n } else if (Array.isArray(init.headers)) {\n for (const [key, value] of init.headers) {\n existingHeaders[key] = value;\n }\n } else {\n Object.assign(existingHeaders, init.headers);\n }\n }\n\n const mergedHeaders = {\n ...existingHeaders,\n ...traceHeaders,\n };\n\n const patchedInit: RequestInit = {\n ...init,\n headers: mergedHeaders,\n };\n\n return self.originalFetch!.call(window, input as RequestInfo, patchedInit);\n }\n\n return self.originalFetch!.call(window, input as RequestInfo, init);\n };\n }\n\n stop(): void {\n if (typeof window === 'undefined') {\n return;\n }\n\n if (this.originalFetch) {\n window.fetch = this.originalFetch;\n this.originalFetch = null;\n }\n }\n}\n","/**\n * SuperLink core client — platform-agnostic.\n *\n * Holds the configured endpoint + app context and exposes thin POST helpers\n * for the redirect engine's /match and /events routes. Both the web capture\n * path and the React Native deferred-attribution path share this instance.\n *\n * Uses the global `fetch` (present on browser, RN, and Node 18+) directly to\n * avoid pulling in any DOM-only transport. All network calls are best-effort\n * and never throw.\n */\n\nimport type {\n SuperLinkConfig,\n SuperLinkMatchRequest,\n SuperLinkMatchResponse,\n SuperLinkEventType,\n SuperLinkPlatform,\n SuperLinkMatchType,\n} from './types.js';\n\n/** Default shared short domain / redirect engine. */\nexport const DEFAULT_SUPERLINK_ENDPOINT = 'https://pongl.ink';\n\nexport interface ResolvedSuperLinkConfig {\n endpoint: string;\n appId?: string;\n installId?: string;\n debug: boolean;\n}\n\nexport class SuperLinkClient {\n config: ResolvedSuperLinkConfig;\n\n constructor(config: SuperLinkConfig = {}) {\n this.config = {\n endpoint: stripTrailingSlash(config.endpoint || DEFAULT_SUPERLINK_ENDPOINT),\n appId: config.appId,\n installId: config.installId,\n debug: config.debug ?? false,\n };\n }\n\n /** Replace config in place (used by init() so module-level helpers see updates). */\n configure(config: SuperLinkConfig): void {\n if (config.endpoint) this.config.endpoint = stripTrailingSlash(config.endpoint);\n if (config.appId !== undefined) this.config.appId = config.appId;\n if (config.installId !== undefined) this.config.installId = config.installId;\n if (config.debug !== undefined) this.config.debug = config.debug;\n }\n\n private log(...args: unknown[]): void {\n if (this.config.debug) console.warn('[SuperLink]', ...args);\n }\n\n /**\n * POST /match — ask the redirect engine to resolve a deferred deep link from\n * a click token (Android referrer / iOS clipboard) and/or a device\n * fingerprint. Returns `{ matched: false }` on any error.\n */\n async match(body: SuperLinkMatchRequest): Promise<SuperLinkMatchResponse> {\n const payload: SuperLinkMatchRequest = {\n ...body,\n install_id: body.install_id ?? this.config.installId,\n };\n try {\n const res = await fetch(`${this.config.endpoint}/match`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n });\n if (!res.ok) {\n this.log('match failed', res.status);\n return { matched: false };\n }\n const data = (await res.json()) as SuperLinkMatchResponse;\n return data ?? { matched: false };\n } catch (err) {\n this.log('match error', err);\n return { matched: false };\n }\n }\n\n /**\n * POST /events — report a lifecycle event (opened / converted) back to the\n * redirect engine, which fans out to analytics + webhooks. Best-effort.\n */\n async reportEvent(input: {\n type: SuperLinkEventType;\n click_id?: string | null;\n link_id?: string | null;\n platform?: SuperLinkPlatform;\n match_type?: SuperLinkMatchType;\n properties?: Record<string, unknown>;\n }): Promise<boolean> {\n try {\n const res = await fetch(`${this.config.endpoint}/events`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n app_id: this.config.appId,\n install_id: this.config.installId,\n ...input,\n }),\n });\n if (!res.ok) this.log('event failed', input.type, res.status);\n return res.ok;\n } catch (err) {\n this.log('event error', err);\n return false;\n }\n }\n}\n\nfunction stripTrailingSlash(url: string): string {\n return url.endsWith('/') ? url.slice(0, -1) : url;\n}\n\n/** The process-wide SuperLink client. */\nexport const superlinkClient = new SuperLinkClient();\n","/**\n * SuperLink URL parsing — platform-agnostic.\n *\n * Extracts the deep link payload encoded in a SuperLink URL: the path, any\n * `~`-prefixed deep link data, UTM params, and `r_`-prefixed referral params.\n * Works on both inbound web URLs and Universal Link / App Link opens. Uses the\n * WHATWG `URL`, which is available on browser, RN (Hermes), and Node.\n */\n\nimport type { SuperLinkDeepLink, UtmParams } from './types.js';\n\nconst UTM_KEYS: Array<[keyof UtmParams, string]> = [\n ['source', 'utm_source'],\n ['medium', 'utm_medium'],\n ['campaign', 'utm_campaign'],\n ['term', 'utm_term'],\n ['content', 'utm_content'],\n];\n\n/**\n * Parse a SuperLink (or Universal/App Link) URL into a deep link payload.\n * Returns null if the URL can't be parsed.\n *\n * Conventions carried in the query string:\n * - utm_* → utm\n * - r_<key> → referral (affiliate params)\n * - ~<key> → deep_link_data (Branch-style)\n * - click_id → click token\n * - $deep_link_path / dlp → explicit in-app route override\n */\nexport function parseUniversalLink(url: string): SuperLinkDeepLink | null {\n let parsed: URL;\n try {\n parsed = new URL(url);\n } catch {\n return null;\n }\n\n const params = parsed.searchParams;\n\n const utm: UtmParams = {};\n for (const [key, queryKey] of UTM_KEYS) {\n const value = params.get(queryKey);\n if (value) utm[key] = value;\n }\n\n const referral: Record<string, unknown> = {};\n const deep_link_data: Record<string, unknown> = {};\n params.forEach((value, key) => {\n if (key.startsWith('r_')) {\n referral[key.slice(2)] = value;\n } else if (key.startsWith('~')) {\n deep_link_data[key.slice(1)] = value;\n }\n });\n\n const explicitPath = params.get('$deep_link_path') ?? params.get('dlp');\n const deep_link_path = explicitPath ?? (parsed.pathname && parsed.pathname !== '/' ? parsed.pathname : null);\n\n return {\n deep_link_path,\n deep_link_data,\n utm,\n referral,\n click_id: params.get('click_id'),\n match_type: 'none',\n confidence: 1,\n };\n}\n","/**\n * SuperLink deferred-deep-link registry — platform-agnostic.\n *\n * Holds the shared onDeferredDeepLink handler set, the cached last match, and\n * the SuperLinkMatchResponse → SuperLinkDeepLink normaliser. Both the web/node\n * recovery path (identify / completeFromScan) and the React Native first-launch\n * attribution path emit through here so a single handler set sees every match.\n */\n\nimport type { SuperLinkDeepLink, SuperLinkMatchResponse, DeferredDeepLinkHandler } from './types.js';\nimport { superlinkClient } from './client.js';\n\nconst handlers = new Set<DeferredDeepLinkHandler>();\nlet lastMatched: SuperLinkDeepLink | null = null;\n\n/** Normalise a /match response into the resolved deep-link payload. */\nexport function toDeepLink(res: SuperLinkMatchResponse): SuperLinkDeepLink {\n return {\n deep_link_path: res.deep_link_path ?? null,\n deep_link_data: res.deep_link_data ?? {},\n utm: res.utm ?? {},\n referral: res.referral ?? {},\n click_id: res.click_id ?? null,\n match_type: res.match_type ?? 'fingerprint',\n confidence: res.confidence ?? (res.match_type && res.match_type !== 'none' ? 1 : 0),\n };\n}\n\n/** Fire all registered handlers with a resolved deep link and cache it. */\nexport function emitDeferredDeepLink(link: SuperLinkDeepLink): void {\n lastMatched = link;\n for (const handler of handlers) {\n try {\n handler(link);\n } catch (err) {\n if (superlinkClient.config.debug) console.warn('[SuperLink] handler threw', err);\n }\n }\n}\n\n/**\n * Register a handler fired when a deferred deep link is matched (first-launch\n * attribution, identify(), or completeFromScan()). If a match already happened\n * before registration, the handler is invoked immediately with the cached\n * payload. Returns an unsubscribe fn.\n */\nexport function onDeferredDeepLink(handler: DeferredDeepLinkHandler): () => void {\n handlers.add(handler);\n if (lastMatched) {\n try {\n handler(lastMatched);\n } catch {\n /* ignore */\n }\n }\n return () => {\n handlers.delete(handler);\n };\n}\n\n/** The deferred deep link matched so far this process, if any. */\nexport function getMatchedDeepLink(): SuperLinkDeepLink | null {\n return lastMatched;\n}\n","/* eslint-env browser */\n/**\n * SuperLink web capture.\n *\n * On first load, captures inbound deep-link params from the current location\n * (a direct SuperLink open in the browser, or a query-decorated landing) and\n * exposes them via getDeepLink(). The captured payload is cached for the rest\n * of the session so repeated reads are stable.\n *\n * Guards every `window`/`sessionStorage` access so importing this module from a\n * non-DOM bundle is harmless.\n */\n\nimport type {\n SuperLinkDeepLink,\n SuperLinkIdentityMetadata,\n SuperLinkFingerprint,\n SuperLinkMatchResponse,\n} from './types.js';\nimport { parseUniversalLink } from './parse.js';\nimport { superlinkClient } from './client.js';\nimport { toDeepLink, emitDeferredDeepLink } from './deferred.js';\n\nconst STORAGE_KEY = 'sp_superlink';\n\nlet captured: SuperLinkDeepLink | null = null;\nlet didCapture = false;\n\nfunction readStored(): SuperLinkDeepLink | null {\n if (typeof sessionStorage === 'undefined') return null;\n try {\n const raw = sessionStorage.getItem(STORAGE_KEY);\n if (!raw) return null;\n const parsed = JSON.parse(raw) as SuperLinkDeepLink;\n return parsed && typeof parsed === 'object' ? parsed : null;\n } catch {\n return null;\n }\n}\n\nfunction writeStored(link: SuperLinkDeepLink): void {\n if (typeof sessionStorage === 'undefined') return;\n try {\n sessionStorage.setItem(STORAGE_KEY, JSON.stringify(link));\n } catch {\n /* ignore quota / privacy mode */\n }\n}\n\nfunction hasPayload(link: SuperLinkDeepLink): boolean {\n return Boolean(\n link.deep_link_path ||\n link.click_id ||\n Object.keys(link.deep_link_data).length > 0 ||\n Object.keys(link.referral).length > 0 ||\n Object.keys(link.utm).length > 0\n );\n}\n\n/**\n * Write a click token to the clipboard in URL form, for handoff to iOS app on install.\n * Called by the interstitial right before redirect to App Store.\n */\nexport function writeClipboardToken(clickId: string): void {\n if (typeof navigator === 'undefined' || !navigator.clipboard) return;\n const url = `${superlinkClient.config.endpoint}/c/${clickId}`;\n navigator.clipboard.writeText(url).catch(() => {\n /* ignore errors — best effort */\n });\n}\n\n/**\n * Extract identity metadata from URL query params (?email=&phone=&custom=json).\n * Used to seed the deferred link match with user-provided attributes.\n */\nexport function extractIdentityMetadata(url?: string): SuperLinkIdentityMetadata | undefined {\n const href = url ?? (typeof window !== 'undefined' && window.location ? window.location.href : null);\n if (!href) return undefined;\n\n let loc: URL;\n try {\n loc = new URL(href);\n } catch {\n return undefined;\n }\n\n const email = loc.searchParams.get('email');\n const phone = loc.searchParams.get('phone');\n const userId = loc.searchParams.get('user_id');\n const id = loc.searchParams.get('id');\n const customRaw = loc.searchParams.get('custom');\n\n const identity: SuperLinkIdentityMetadata = {};\n if (email) identity.email = email;\n if (phone) identity.phone = phone;\n if (userId) identity.user_id = userId;\n if (id) identity.id = id;\n\n if (customRaw) {\n try {\n const custom = JSON.parse(decodeURIComponent(customRaw));\n if (typeof custom === 'object' && custom !== null) {\n identity.custom = custom;\n }\n } catch {\n /* ignore malformed custom JSON */\n }\n }\n\n return Object.keys(identity).length > 0 ? identity : undefined;\n}\n\n/**\n * Capture inbound deep-link params from the current page URL. Idempotent: only\n * the first call of the session parses; later calls return the cached payload.\n */\nexport function captureWebDeepLink(): SuperLinkDeepLink | null {\n if (didCapture) return captured;\n didCapture = true;\n\n const stored = readStored();\n if (stored) {\n captured = stored;\n return captured;\n }\n\n if (typeof window === 'undefined' || !window.location) return null;\n\n const link = parseUniversalLink(window.location.href);\n if (link && hasPayload(link)) {\n captured = link;\n writeStored(link);\n // Best-effort: notify the engine that the link opened in a browser.\n void superlinkClient.reportEvent({\n type: 'opened',\n click_id: link.click_id,\n platform: 'desktop',\n properties: { surface: 'web' },\n });\n }\n return captured;\n}\n\n/**\n * Return the captured inbound deep link for this session, capturing lazily on\n * first call. Returns null when no SuperLink params were present.\n */\nexport function getDeepLink(): SuperLinkDeepLink | null {\n if (!didCapture) return captureWebDeepLink();\n return captured;\n}\n\n/** Best-effort web/desktop fingerprint for the probabilistic fallback. */\nfunction webFingerprint(): SuperLinkFingerprint {\n const fp: SuperLinkFingerprint = { platform: 'desktop' };\n if (typeof navigator !== 'undefined') {\n if (navigator.userAgent) fp.user_agent = navigator.userAgent;\n const lang = navigator.language || (navigator.languages && navigator.languages[0]);\n if (lang) fp.language = lang;\n }\n return fp;\n}\n\n/**\n * Recover a deferred deep link AFTER the user provides an email/phone (or other\n * identity) at signup. POSTs /match with { identity, install_id, fingerprint }\n * so the engine can match the supplied identity against an unmatched click's\n * metadata. Fires onDeferredDeepLink on a hit. Returns the resolved deep link,\n * or null. Best-effort: never throws.\n *\n * @example\n * ```ts\n * import { identify } from 'sitepong';\n * await identify({ email: user.email, user_id: user.id });\n * ```\n */\nexport async function identify(\n identity: SuperLinkIdentityMetadata\n): Promise<SuperLinkDeepLink | null> {\n if (!identity || Object.keys(identity).length === 0) return null;\n const res: SuperLinkMatchResponse = await superlinkClient.match({\n identity,\n fingerprint: webFingerprint(),\n });\n if (!res.matched) return null;\n const link = toDeepLink(res);\n emitDeferredDeepLink(link);\n return link;\n}\n\n/**\n * Complete attribution from a scanned QR payload. POSTs /match with\n * { qr_token: scanned, install_id } — the raw scanned string is passed straight\n * through, and the engine parses a click-token URL (/c/<id>), a raw click_id, a\n * link URL (pongl.ink/<slug>), or a bare <slug>. Fires onDeferredDeepLink on a\n * hit. Returns the resolved deep link, or null. Best-effort: never throws.\n *\n * @example\n * ```ts\n * import { completeFromScan } from 'sitepong';\n * const link = await completeFromScan(qrCodeValue);\n * ```\n */\nexport async function completeFromScan(\n scanned: string\n): Promise<SuperLinkDeepLink | null> {\n if (!scanned) return null;\n const res: SuperLinkMatchResponse = await superlinkClient.match({\n qr_token: scanned,\n fingerprint: webFingerprint(),\n });\n if (!res.matched) return null;\n const link = toDeepLink(res);\n emitDeferredDeepLink(link);\n return link;\n}\n","/**\n * SuperLink — deferred deep linking / smart links public surface.\n *\n * Platform-agnostic + web entry points. React Native deferred attribution\n * lives in `src/react-native/superlink.ts` and is exported from\n * `sitepong/react-native` so non-RN bundles never pull in native deps.\n */\n\nimport type { SuperLinkConfig } from './types.js';\nimport { superlinkClient } from './client.js';\nimport { captureWebDeepLink } from './web.js';\n\n/**\n * Configure the SuperLink client. Safe to call on any platform.\n *\n * On web, this also captures any inbound deep-link params from the current\n * URL immediately, so getDeepLink() is populated on first read.\n *\n * @example\n * ```ts\n * import { initSuperLink, getDeepLink } from 'sitepong';\n * initSuperLink({ endpoint: 'https://go.acme.com', appId: 'abc' });\n * const link = getDeepLink();\n * ```\n */\nexport function initSuperLink(config: SuperLinkConfig = {}): void {\n superlinkClient.configure(config);\n // Web: capture inbound params now (no-op off-DOM).\n captureWebDeepLink();\n}\n\nexport { superlinkClient, SuperLinkClient, DEFAULT_SUPERLINK_ENDPOINT } from './client.js';\nexport {\n captureWebDeepLink,\n getDeepLink,\n writeClipboardToken,\n extractIdentityMetadata,\n identify,\n completeFromScan,\n} from './web.js';\nexport { onDeferredDeepLink, getMatchedDeepLink } from './deferred.js';\nexport { parseUniversalLink } from './parse.js';\n\nexport type {\n SuperLinkConfig,\n SuperLinkDeepLink,\n SuperLinkMatchResponse,\n SuperLinkMatchRequest,\n SuperLinkFingerprint,\n SuperLinkPlatform,\n SuperLinkMatchType,\n SuperLinkEventType,\n SuperLinkIdentityMetadata,\n DeferredDeepLinkHandler,\n UtmParams,\n} from './types.js';\n","export interface SitePongConfig {\n apiKey: string;\n endpoint?: string;\n environment?: string;\n release?: string;\n autoCapture?: boolean;\n maxBatchSize?: number;\n flushInterval?: number;\n debug?: boolean;\n}\n\nexport interface ErrorContext {\n user?: {\n id?: string;\n email?: string;\n [key: string]: unknown;\n };\n tags?: Record<string, string>;\n extra?: Record<string, unknown>;\n}\n\nexport interface CapturedError {\n message: string;\n stack?: string;\n type: string;\n timestamp: string;\n url?: string;\n userAgent?: string;\n environment?: string;\n release?: string;\n context?: ErrorContext;\n fingerprint?: string;\n /** Replay session ID if session recording is active */\n replaySessionId?: string;\n}\n\nimport { FlagManager } from './flags';\nimport { AnalyticsManager } from './analytics';\nimport type { TrackProperties, UserTraits, GroupTraits } from './analytics';\nimport type { FingerprintManager } from './fingerprint';\nimport type { VisitorIdResult, DeviceSignals } from './fingerprint';\nimport type { ReplayManager } from './replay';\nimport type { PerformanceManager } from './performance';\nimport type { WebVitals } from './performance';\nimport { CronMonitorManager } from './crons';\nimport type { CronCheckinOptions, CronHandle } from './crons';\nimport { MetricsManager } from './metrics';\nimport type { MetricOptions } from './metrics';\nimport { DatabaseTracker } from './database';\nimport { Profiler } from './profiling';\nimport type { ProfileData } from './profiling';\nimport { RemoteConfigManager } from './remote-config';\nimport type { RemoteConfig } from './remote-config';\nimport { getStorageAdapter, getEnvironment, setEnvironment, setRNGetCurrentScreen } from './utils/platform';\nimport type { StorageAdapter } from './utils/platform';\nimport type { EnvironmentAdapter, Unsubscribe, DeviceInfo } from './adapters/environment';\n\n/**\n * Default-entry fallback environment — auto-detects runtime.\n *\n * The default entry `dist/index.mjs` is what Node consumers hit and what\n * browser consumers hit when their bundler doesn't set the `browser`\n * condition. It detects the runtime at load time and installs the matching\n * env adapter so `import { init, captureError } from 'sitepong'` works the\n * same way on Node and browser, just like pre-refactor.\n *\n * Platform entries (entries/web.ts, entries/rn.ts) call `setEnvironment()`\n * BEFORE importing this module, so they win and this function is a no-op\n * for them.\n */\nfunction installFallbackEnvironment(): void {\n if (getEnvironment()) return;\n\n const g = globalThis as {\n window?: {\n addEventListener?: (t: string, l: (e: unknown) => void) => void;\n removeEventListener?: (t: string, l: (e: unknown) => void) => void;\n location?: { href?: string };\n screen?: { width?: number; height?: number };\n };\n document?: {\n referrer?: string;\n addEventListener?: (t: string, l: () => void) => void;\n removeEventListener?: (t: string, l: () => void) => void;\n visibilityState?: string;\n };\n navigator?: {\n userAgent?: string;\n product?: string;\n sendBeacon?: (url: string, body: Blob) => boolean;\n };\n process?: {\n versions?: { node?: string };\n platform?: string;\n on?: (ev: string, h: (...a: unknown[]) => void) => void;\n off?: (ev: string, h: (...a: unknown[]) => void) => void;\n };\n };\n\n const hasBrowser = typeof g.window !== 'undefined' && typeof g.document !== 'undefined';\n const hasNode = !hasBrowser && !!g.process?.versions?.node;\n const platform: 'browser' | 'node' = hasBrowser ? 'browser' : 'node';\n\n const env: EnvironmentAdapter = {\n platform,\n storage: null,\n getDeviceInfo(): DeviceInfo {\n const info: DeviceInfo = { platform };\n if (g.navigator?.userAgent) info.userAgent = g.navigator.userAgent;\n if (hasBrowser && g.window?.screen) {\n info.screenWidth = g.window.screen.width;\n info.screenHeight = g.window.screen.height;\n }\n if (hasNode && g.process) {\n info.osName = g.process.platform;\n info.osVersion = g.process.versions?.node;\n }\n return info;\n },\n getCurrentUrl() {\n return g.window?.location?.href ?? undefined;\n },\n getReferrer() {\n return g.document?.referrer || undefined;\n },\n getUserAgent() {\n if (g.navigator?.userAgent) return g.navigator.userAgent;\n if (hasNode && g.process) return `SitePong-Node/${g.process.versions?.node} (${g.process.platform})`;\n return undefined;\n },\n onUncaughtError(handler) {\n if (hasBrowser && g.window?.addEventListener) {\n const listener = (event: unknown) =>\n handler((event as { error?: unknown; message?: string }).error || (event as { message?: string }).message);\n g.window.addEventListener('error', listener);\n return () => g.window?.removeEventListener?.('error', listener);\n }\n if (hasNode && g.process?.on && g.process.off) {\n const listener = (err: Error) => handler(err);\n g.process.on('uncaughtException', listener as (...a: unknown[]) => void);\n return () => g.process?.off?.('uncaughtException', listener as (...a: unknown[]) => void);\n }\n return () => {};\n },\n onUnhandledRejection(handler) {\n if (hasBrowser && g.window?.addEventListener) {\n const listener = (event: unknown) => handler((event as { reason?: unknown }).reason);\n g.window.addEventListener('unhandledrejection', listener);\n return () => g.window?.removeEventListener?.('unhandledrejection', listener);\n }\n if (hasNode && g.process?.on && g.process.off) {\n const listener = (reason: unknown) => handler(reason);\n g.process.on('unhandledRejection', listener as (...a: unknown[]) => void);\n return () => g.process?.off?.('unhandledRejection', listener as (...a: unknown[]) => void);\n }\n return () => {};\n },\n onBeforeTerminate(handler) {\n if (hasBrowser && g.window?.addEventListener) {\n g.window.addEventListener('beforeunload', handler as unknown as (e: unknown) => void);\n return () => g.window?.removeEventListener?.('beforeunload', handler as unknown as (e: unknown) => void);\n }\n if (hasNode && g.process?.on && g.process.off) {\n g.process.on('beforeExit', handler as (...a: unknown[]) => void);\n g.process.on('SIGINT', handler as (...a: unknown[]) => void);\n g.process.on('SIGTERM', handler as (...a: unknown[]) => void);\n return () => {\n g.process?.off?.('beforeExit', handler as (...a: unknown[]) => void);\n g.process?.off?.('SIGINT', handler as (...a: unknown[]) => void);\n g.process?.off?.('SIGTERM', handler as (...a: unknown[]) => void);\n };\n }\n return () => {};\n },\n onVisibilityHidden(handler) {\n if (g.document?.addEventListener) {\n const listener = () => {\n if (g.document?.visibilityState === 'hidden') handler();\n };\n g.document.addEventListener('visibilitychange', listener);\n return () => g.document?.removeEventListener?.('visibilitychange', listener);\n }\n return () => {};\n },\n sendBeacon(url, body) {\n if (typeof g.navigator?.sendBeacon !== 'function') return false;\n try {\n return g.navigator.sendBeacon(url, new Blob([body], { type: 'application/json' }));\n } catch {\n return false;\n }\n },\n };\n\n setEnvironment(env);\n}\n\ninstallFallbackEnvironment();\n\n/**\n * Web-only manager factories. The web entry (src/entries/web.ts) registers\n * these; RN and Node entries leave them unset so their bundles never pull\n * in DOM-heavy code like rrweb, PerformanceObserver, or canvas fingerprinting.\n */\nexport interface WebManagerFactories {\n createReplay?: (cfg: Record<string, unknown>) => ReplayManager;\n createFingerprint?: (cfg: Record<string, unknown>) => FingerprintManager;\n createPerformance?: (cfg: Record<string, unknown>) => PerformanceManager;\n}\n\nlet webManagerFactories: WebManagerFactories = {};\n\n/**\n * Platform-entry-only: inject web-only manager factories. Called by\n * src/entries/web.ts. Do not call from app code.\n */\nexport function registerWebManagerFactories(factories: WebManagerFactories): void {\n webManagerFactories = { ...webManagerFactories, ...factories };\n}\n\nconst DEFAULT_ENDPOINT = 'https://ingest.sitepong.com';\nconst DEFAULT_BATCH_SIZE = 10;\nconst DEFAULT_FLUSH_INTERVAL = 5000;\n\nexport interface SitePongInitConfig extends SitePongConfig {\n /** Enable feature flags (default: false) */\n enableFlags?: boolean;\n /** Custom endpoint for flags API (default: uses main endpoint) */\n flagsEndpoint?: string;\n /** Analytics configuration */\n analytics?: {\n enabled?: boolean;\n autocapturePageviews?: boolean;\n autocaptureClicks?: boolean;\n autocaptureForms?: boolean;\n /** Full autocapture configuration (overrides individual autocapture flags) */\n autocapture?: {\n clicks?: boolean;\n forms?: boolean;\n pageviews?: boolean;\n blockSelectors?: string[];\n allowSelectors?: string[];\n } | boolean;\n maxBatchSize?: number;\n flushInterval?: number;\n eventsEndpoint?: string;\n };\n /** Fingerprint / device intelligence configuration */\n fingerprint?: {\n enabled?: boolean;\n extendedSignals?: boolean;\n visitorEndpoint?: string;\n };\n /** Performance monitoring configuration */\n performance?: {\n enabled?: boolean;\n webVitals?: boolean;\n navigationTiming?: boolean;\n resourceTiming?: boolean;\n capturePageLoadTimings?: boolean;\n capturePageRenderTimings?: boolean;\n excludedResourceUrls?: string[];\n resourceNameSanitizer?: (url: string) => string;\n sampleRate?: number;\n flushInterval?: number;\n performanceEndpoint?: string;\n };\n /** Session replay configuration — records a rolling buffer and only sends on error */\n replay?: {\n enabled?: boolean;\n maskInputs?: boolean;\n blockSelector?: string;\n maskSelector?: string;\n sampleRate?: number;\n maxSessionDuration?: number;\n flushInterval?: number;\n replayEndpoint?: string;\n /** Record network requests (XHR/fetch) in the replay timeline */\n recordNetwork?: boolean;\n /** Include request/response headers in network recording */\n captureNetworkHeaders?: boolean;\n /** Record console logs in the replay timeline */\n recordConsole?: boolean;\n /** Which console levels to record (default: all) */\n consoleLevels?: Array<'log' | 'info' | 'warn' | 'error' | 'debug'>;\n /** Rolling buffer duration in ms — how many seconds of replay to keep before an error (default: 20000) */\n bufferDuration?: number;\n };\n /** Cron monitoring configuration */\n crons?: {\n enabled?: boolean;\n };\n /** Custom metrics configuration */\n metrics?: {\n enabled?: boolean;\n flushInterval?: number;\n maxBatchSize?: number;\n };\n /** Database query tracking configuration */\n database?: {\n enabled?: boolean;\n slowQueryThreshold?: number;\n redactParams?: boolean;\n };\n /** Production profiling configuration */\n profiling?: {\n enabled?: boolean;\n sampleRate?: number;\n maxDuration?: number;\n flushInterval?: number;\n };\n /** Remote config options */\n remoteConfig?: {\n enabled?: boolean;\n };\n /** Storage adapter for caching (auto-detected if not provided) */\n _storageAdapter?: StorageAdapter;\n}\n\nconst MAX_FLUSH_FAILURES = 3;\n\nclass SitePongClient {\n private config: Required<Omit<SitePongConfig, 'apiKey'>> & { apiKey: string };\n private errorQueue: CapturedError[] = [];\n private flushTimer: ReturnType<typeof setTimeout> | null = null;\n private context: ErrorContext = {};\n private initialized = false;\n private flushFailures = 0;\n private disabled = false;\n private flagManager: FlagManager | null = null;\n private analyticsManager: AnalyticsManager | null = null;\n private fingerprintManager: FingerprintManager | null = null;\n private replayManager: ReplayManager | null = null;\n private performanceManager: PerformanceManager | null = null;\n private cronManager: CronMonitorManager | null = null;\n private metricsManager: MetricsManager | null = null;\n private databaseTracker: DatabaseTracker | null = null;\n private profiler: Profiler | null = null;\n private remoteConfigManager: RemoteConfigManager | null = null;\n private currentScreen?: string;\n private envUnsubs: Unsubscribe[] = [];\n private identifyHooks: Array<(userId: string) => void> = [];\n\n constructor() {\n this.config = {\n apiKey: '',\n endpoint: DEFAULT_ENDPOINT,\n environment: 'production',\n release: '',\n autoCapture: true,\n maxBatchSize: DEFAULT_BATCH_SIZE,\n flushInterval: DEFAULT_FLUSH_INTERVAL,\n debug: false,\n };\n }\n\n init(config: SitePongInitConfig): void {\n if (!config.apiKey) {\n console.error('[SitePong] API key is required');\n return;\n }\n\n this.config = {\n ...this.config,\n ...config,\n };\n\n this.initialized = true;\n\n if (this.config.autoCapture) {\n this.setupAutoCapture();\n }\n\n this.startFlushTimer();\n this.log('Initialized with endpoint:', this.config.endpoint);\n\n // Initialize flags if enabled\n if (config.enableFlags) {\n this.flagManager = new FlagManager({\n apiKey: config.apiKey,\n endpoint: config.flagsEndpoint || config.endpoint || DEFAULT_ENDPOINT,\n debug: config.debug,\n });\n // Start flag initialization (non-blocking)\n this.flagManager.init().catch((err) => {\n this.log('Failed to initialize flags:', err);\n });\n }\n\n // Initialize analytics if enabled\n if (config.analytics?.enabled) {\n if (this.analyticsManager) {\n this.analyticsManager.destroy();\n }\n this.analyticsManager = new AnalyticsManager({\n apiKey: config.apiKey,\n endpoint: config.endpoint || DEFAULT_ENDPOINT,\n enabled: true,\n autocapturePageviews: config.analytics.autocapturePageviews,\n autocaptureClicks: config.analytics.autocaptureClicks,\n autocaptureForms: config.analytics.autocaptureForms,\n autocapture: config.analytics.autocapture,\n maxBatchSize: config.analytics.maxBatchSize,\n flushInterval: config.analytics.flushInterval,\n eventsEndpoint: config.analytics.eventsEndpoint,\n debug: config.debug,\n });\n this.analyticsManager.init();\n }\n\n // Initialize fingerprint if enabled (web-only factory)\n if (config.fingerprint?.enabled && webManagerFactories.createFingerprint) {\n this.fingerprintManager = webManagerFactories.createFingerprint({\n apiKey: config.apiKey,\n endpoint: config.endpoint || DEFAULT_ENDPOINT,\n enabled: true,\n extendedSignals: config.fingerprint.extendedSignals,\n visitorEndpoint: config.fingerprint.visitorEndpoint,\n debug: config.debug,\n });\n } else if (config.fingerprint?.enabled) {\n this.log('Fingerprint requested but not available on this platform (web only).');\n }\n\n // Initialize performance monitoring if enabled (web-only factory)\n if (config.performance?.enabled && webManagerFactories.createPerformance) {\n if (this.performanceManager) {\n this.performanceManager.destroy();\n }\n this.performanceManager = webManagerFactories.createPerformance({\n apiKey: config.apiKey,\n endpoint: config.endpoint || DEFAULT_ENDPOINT,\n enabled: true,\n webVitals: config.performance.webVitals,\n navigationTiming: config.performance.navigationTiming,\n resourceTiming: config.performance.resourceTiming,\n capturePageLoadTimings: config.performance.capturePageLoadTimings,\n capturePageRenderTimings: config.performance.capturePageRenderTimings,\n excludedResourceUrls: config.performance.excludedResourceUrls,\n resourceNameSanitizer: config.performance.resourceNameSanitizer,\n sampleRate: config.performance.sampleRate,\n flushInterval: config.performance.flushInterval,\n performanceEndpoint: config.performance.performanceEndpoint,\n debug: config.debug,\n });\n this.performanceManager.init();\n } else if (config.performance?.enabled) {\n this.log('Performance requested but not available on this platform (web only).');\n }\n\n // Initialize session replay if enabled (web-only factory)\n if (config.replay?.enabled && webManagerFactories.createReplay) {\n // Stop previous replay manager if re-initialized (e.g. React Strict Mode)\n if (this.replayManager) {\n this.replayManager.stop();\n }\n this.replayManager = webManagerFactories.createReplay({\n apiKey: config.apiKey,\n endpoint: config.endpoint || DEFAULT_ENDPOINT,\n enabled: true,\n maskInputs: config.replay.maskInputs,\n blockSelector: config.replay.blockSelector,\n maskSelector: config.replay.maskSelector,\n sampleRate: config.replay.sampleRate,\n maxSessionDuration: config.replay.maxSessionDuration,\n flushInterval: config.replay.flushInterval,\n replayEndpoint: config.replay.replayEndpoint,\n recordNetwork: config.replay.recordNetwork,\n captureNetworkHeaders: config.replay.captureNetworkHeaders,\n recordConsole: config.replay.recordConsole,\n consoleLevels: config.replay.consoleLevels,\n bufferDuration: config.replay.bufferDuration,\n debug: config.debug,\n });\n // Auto-start recording\n this.replayManager.start();\n } else if (config.replay?.enabled) {\n this.log('Replay requested but not available on this platform (web only).');\n }\n\n // Initialize cron monitoring if enabled\n if (config.crons?.enabled) {\n this.cronManager = new CronMonitorManager({\n apiKey: config.apiKey,\n endpoint: config.endpoint || DEFAULT_ENDPOINT,\n debug: config.debug,\n });\n }\n\n // Initialize database query tracking if enabled\n if (config.database?.enabled) {\n this.databaseTracker = new DatabaseTracker({\n apiKey: config.apiKey,\n endpoint: config.endpoint || DEFAULT_ENDPOINT,\n debug: config.debug,\n slowQueryThreshold: config.database.slowQueryThreshold,\n redactParams: config.database.redactParams,\n });\n }\n\n // Initialize custom metrics if enabled\n if (config.metrics?.enabled) {\n this.metricsManager = new MetricsManager({\n apiKey: config.apiKey,\n endpoint: config.endpoint || DEFAULT_ENDPOINT,\n debug: config.debug,\n flushInterval: config.metrics.flushInterval,\n maxBatchSize: config.metrics.maxBatchSize,\n });\n }\n\n // Initialize profiling if enabled\n if (config.profiling?.enabled) {\n this.profiler = new Profiler({\n apiKey: config.apiKey,\n endpoint: config.endpoint || DEFAULT_ENDPOINT,\n debug: config.debug,\n sampleRate: config.profiling.sampleRate,\n maxDuration: config.profiling.maxDuration,\n flushInterval: config.profiling.flushInterval,\n });\n }\n\n // Initialize remote config if enabled\n if (config.remoteConfig?.enabled !== false) {\n const storage = config._storageAdapter || getStorageAdapter();\n this.remoteConfigManager = new RemoteConfigManager({\n apiKey: config.apiKey,\n endpoint: config.endpoint || DEFAULT_ENDPOINT,\n storage,\n debug: config.debug,\n });\n this.remoteConfigManager.init().catch((err) => {\n this.log('Failed to initialize remote config:', err);\n });\n }\n\n }\n\n /**\n * Initialize SDK for React Native — only starts platform-agnostic subsystems.\n * Skips: FingerprintManager, ReplayManager, PerformanceManager, browser autocapture,\n * window event listeners (beforeunload, visibilitychange).\n */\n initRN(config: SitePongInitConfig): void {\n if (!config.apiKey) {\n console.error('[SitePong] API key is required');\n return;\n }\n\n this.config = {\n ...this.config,\n ...config,\n };\n\n this.initialized = true;\n\n // Flush timer only — no beforeunload / visibilitychange listeners\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n }\n this.flushTimer = setInterval(() => {\n this.flush();\n }, this.config.flushInterval);\n\n this.log('Initialized (React Native) with endpoint:', this.config.endpoint);\n\n // Feature flags\n if (config.enableFlags) {\n this.flagManager = new FlagManager({\n apiKey: config.apiKey,\n endpoint: config.flagsEndpoint || config.endpoint || DEFAULT_ENDPOINT,\n debug: config.debug,\n });\n this.flagManager.init().catch((err) => {\n this.log('Failed to initialize flags:', err);\n });\n }\n\n // Analytics — headless mode (no SPA tracking, no DOM autocapture, no page-hide listener)\n if (config.analytics?.enabled) {\n if (this.analyticsManager) {\n this.analyticsManager.destroy();\n }\n this.analyticsManager = new AnalyticsManager({\n apiKey: config.apiKey,\n endpoint: config.endpoint || DEFAULT_ENDPOINT,\n enabled: true,\n maxBatchSize: config.analytics.maxBatchSize,\n flushInterval: config.analytics.flushInterval,\n eventsEndpoint: config.analytics.eventsEndpoint,\n debug: config.debug,\n });\n this.analyticsManager.initHeadless();\n }\n\n // Cron monitoring\n if (config.crons?.enabled) {\n this.cronManager = new CronMonitorManager({\n apiKey: config.apiKey,\n endpoint: config.endpoint || DEFAULT_ENDPOINT,\n debug: config.debug,\n });\n }\n\n // Custom metrics\n if (config.metrics?.enabled) {\n this.metricsManager = new MetricsManager({\n apiKey: config.apiKey,\n endpoint: config.endpoint || DEFAULT_ENDPOINT,\n debug: config.debug,\n flushInterval: config.metrics.flushInterval,\n maxBatchSize: config.metrics.maxBatchSize,\n });\n }\n\n // Database query tracking\n if (config.database?.enabled) {\n this.databaseTracker = new DatabaseTracker({\n apiKey: config.apiKey,\n endpoint: config.endpoint || DEFAULT_ENDPOINT,\n debug: config.debug,\n slowQueryThreshold: config.database.slowQueryThreshold,\n redactParams: config.database.redactParams,\n });\n }\n\n // Profiling\n if (config.profiling?.enabled) {\n this.profiler = new Profiler({\n apiKey: config.apiKey,\n endpoint: config.endpoint || DEFAULT_ENDPOINT,\n debug: config.debug,\n sampleRate: config.profiling.sampleRate,\n maxDuration: config.profiling.maxDuration,\n flushInterval: config.profiling.flushInterval,\n });\n }\n\n // Remote config\n if (config.remoteConfig?.enabled !== false) {\n const storage = config._storageAdapter || getStorageAdapter();\n this.remoteConfigManager = new RemoteConfigManager({\n apiKey: config.apiKey,\n endpoint: config.endpoint || DEFAULT_ENDPOINT,\n storage,\n debug: config.debug,\n });\n this.remoteConfigManager.init().catch((err) => {\n this.log('Failed to initialize remote config:', err);\n });\n }\n }\n\n /**\n * Check if the SDK is initialized\n */\n isInitialized(): boolean {\n return this.initialized;\n }\n\n /**\n * Get a feature flag value\n * Returns the cached evaluated result or default value\n */\n getFlag(key: string, defaultValue = false): boolean {\n if (!this.flagManager) {\n this.log('Flags not enabled. Set enableFlags: true in init()');\n return defaultValue;\n }\n return this.flagManager.getFlag(key, defaultValue);\n }\n\n /**\n * Get all feature flag values\n */\n getAllFlags(): Record<string, boolean> {\n if (!this.flagManager) {\n return {};\n }\n return this.flagManager.getAllFlags();\n }\n\n /**\n * Wait for flags to be initialized\n */\n async waitForFlags(): Promise<void> {\n if (!this.flagManager) {\n return;\n }\n await this.flagManager.waitForInit();\n }\n\n /**\n * Check if flags are ready\n */\n areFlagsReady(): boolean {\n return this.flagManager?.isInitialized() ?? false;\n }\n\n /**\n * Get a multivariate flag variant\n * Returns the assigned variant key or the default value\n */\n getVariant(key: string, defaultValue: string | null = null): string | null {\n if (!this.flagManager) {\n this.log('Flags not enabled. Set enableFlags: true in init()');\n return defaultValue;\n }\n return this.flagManager.getVariant(key, defaultValue);\n }\n\n /**\n * Get the payload for a multivariate flag's assigned variant\n */\n getVariantPayload<T = unknown>(key: string, defaultValue: T | null = null): T | null {\n if (!this.flagManager) {\n return defaultValue;\n }\n return this.flagManager.getVariantPayload<T>(key, defaultValue);\n }\n\n /**\n * Force refresh flags from the server\n */\n async refreshFlags(): Promise<void> {\n if (!this.flagManager) {\n return;\n }\n await this.flagManager.refresh();\n }\n\n // --- Analytics (Tier 4) ---\n\n track(eventName: string, properties?: TrackProperties): void {\n if (!this.analyticsManager) {\n this.log('Analytics not enabled. Set analytics.enabled: true in init()');\n return;\n }\n this.analyticsManager.track(eventName, properties);\n }\n\n trackPageView(url?: string, properties?: TrackProperties): void {\n if (!this.analyticsManager) {\n this.log('Analytics not enabled. Set analytics.enabled: true in init()');\n return;\n }\n this.analyticsManager.trackPageView(url, properties);\n }\n\n identify(userId: string, traits?: UserTraits): void {\n if (this.replayManager) {\n this.replayManager.setUser({ id: userId });\n }\n // Notify any platform-registered identify hooks (e.g. RN push re-registration).\n for (const hook of this.identifyHooks) {\n try {\n hook(userId);\n } catch (err) {\n this.log('identify hook failed:', err);\n }\n }\n if (!this.analyticsManager) {\n this.log('Analytics not enabled. Set analytics.enabled: true in init()');\n return;\n }\n this.analyticsManager.identify(userId, traits);\n }\n\n /**\n * Register a callback invoked whenever identify(userId) is called.\n * Used by platform entries (e.g. RN) to wire side effects like push re-registration.\n */\n registerIdentifyHook(hook: (userId: string) => void): () => void {\n this.identifyHooks.push(hook);\n return () => {\n const idx = this.identifyHooks.indexOf(hook);\n if (idx >= 0) this.identifyHooks.splice(idx, 1);\n };\n }\n\n group(groupId: string, traits?: GroupTraits): void {\n if (!this.analyticsManager) {\n this.log('Analytics not enabled. Set analytics.enabled: true in init()');\n return;\n }\n this.analyticsManager.group(groupId, traits);\n }\n\n resetAnalytics(): void {\n if (!this.analyticsManager) {\n return;\n }\n this.analyticsManager.reset();\n }\n\n // --- Fingerprint (Tier 5) ---\n\n async getVisitorId(): Promise<VisitorIdResult> {\n if (!this.fingerprintManager) {\n throw new Error('Fingerprint not enabled. Set fingerprint.enabled: true in init()');\n }\n return this.fingerprintManager.getVisitorId();\n }\n\n async getDeviceSignals(): Promise<DeviceSignals> {\n if (!this.fingerprintManager) {\n throw new Error('Fingerprint not enabled. Set fingerprint.enabled: true in init()');\n }\n return this.fingerprintManager.getDeviceSignals();\n }\n\n async getFraudCheck() {\n if (!this.fingerprintManager) {\n throw new Error('Fingerprint not enabled. Set fingerprint.enabled: true in init()');\n }\n return this.fingerprintManager.getFraudCheck();\n }\n\n // --- Session Replay (Tier 6) ---\n\n startReplay(): boolean {\n if (!this.replayManager) {\n this.log('Replay not enabled. Set replay.enabled: true in init()');\n return false;\n }\n return this.replayManager.start();\n }\n\n stopReplay(): void {\n if (!this.replayManager) return;\n this.replayManager.stop();\n }\n\n isReplayRecording(): boolean {\n return this.replayManager?.isRecording() ?? false;\n }\n\n getReplaySessionId(): string | null {\n return this.replayManager?.getSessionId() ?? null;\n }\n\n // --- Performance (Tier 7) ---\n\n startTransaction(name: string, data?: Record<string, unknown>): string {\n if (!this.performanceManager) {\n this.log('Performance not enabled. Set performance.enabled: true in init()');\n return '';\n }\n return this.performanceManager.startTransaction(name, data);\n }\n\n endTransaction(id: string, status: 'ok' | 'error' = 'ok'): void {\n if (!this.performanceManager) return;\n this.performanceManager.endTransaction(id, status);\n }\n\n startSpan(transactionId: string, name: string, data?: Record<string, unknown>): string {\n if (!this.performanceManager) return '';\n return this.performanceManager.startSpan(transactionId, name, data);\n }\n\n endSpan(transactionId: string, spanId: string, status: 'ok' | 'error' = 'ok'): void {\n if (!this.performanceManager) return;\n this.performanceManager.endSpan(transactionId, spanId, status);\n }\n\n getWebVitals(): WebVitals {\n if (!this.performanceManager) return {};\n return this.performanceManager.getVitals();\n }\n\n // --- Cron Monitor methods ---\n\n cronCheckin(slug: string, options?: CronCheckinOptions): Promise<void> {\n if (!this.cronManager) {\n this.log('Cron monitoring not enabled. Set crons.enabled: true in init()');\n return Promise.resolve();\n }\n return this.cronManager.checkin(slug, options);\n }\n\n cronStart(slug: string, environment?: string): CronHandle {\n if (!this.cronManager) {\n this.log('Cron monitoring not enabled. Set crons.enabled: true in init()');\n return { ok: () => Promise.resolve(), error: () => Promise.resolve() };\n }\n return this.cronManager.start(slug, environment);\n }\n\n cronWrap<T>(slug: string, fn: () => Promise<T>, environment?: string): Promise<T> {\n if (!this.cronManager) {\n return fn();\n }\n return this.cronManager.wrap(slug, fn, environment);\n }\n\n // --- Custom Metrics methods ---\n\n metricIncrement(name: string, value?: number, options?: MetricOptions): void {\n if (!this.metricsManager) {\n this.log('Metrics not enabled. Set metrics.enabled: true in init()');\n return;\n }\n this.metricsManager.increment(name, value, options);\n }\n\n metricGauge(name: string, value: number, options?: MetricOptions): void {\n if (!this.metricsManager) return;\n this.metricsManager.gauge(name, value, options);\n }\n\n metricHistogram(name: string, value: number, options?: MetricOptions): void {\n if (!this.metricsManager) return;\n this.metricsManager.histogram(name, value, options);\n }\n\n metricDistribution(name: string, value: number, options?: MetricOptions): void {\n if (!this.metricsManager) return;\n this.metricsManager.distribution(name, value, options);\n }\n\n async metricTime<T>(name: string, fn: () => Promise<T>, options?: MetricOptions): Promise<T> {\n if (!this.metricsManager) return fn();\n return this.metricsManager.time(name, fn, options);\n }\n\n metricStartTimer(name: string, options?: MetricOptions): { stop: () => void } {\n if (!this.metricsManager) return { stop: () => {} };\n return this.metricsManager.startTimer(name, options);\n }\n\n async flushMetrics(): Promise<void> {\n if (!this.metricsManager) return;\n return this.metricsManager.flush();\n }\n\n // --- Database Query Tracking methods ---\n\n async dbTrack<T>(query: string, fn: () => Promise<T>, source?: string): Promise<T> {\n if (!this.databaseTracker) return fn();\n return this.databaseTracker.track(query, fn, source);\n }\n\n dbTrackSync<T>(query: string, fn: () => T, source?: string): T {\n if (!this.databaseTracker) return fn();\n return this.databaseTracker.trackSync(query, fn, source);\n }\n\n getDbQueryCount(): number {\n if (!this.databaseTracker) return 0;\n return this.databaseTracker.getQueryCount();\n }\n\n resetDbQueryCount(): void {\n if (this.databaseTracker) this.databaseTracker.resetQueryCount();\n }\n\n getDbNPlusOnePatterns(): Array<{ query: string; count: number }> {\n if (!this.databaseTracker) return [];\n return this.databaseTracker.getNPlusOnePatterns();\n }\n\n // --- Profiling methods ---\n\n async profile<T>(name: string, fn: () => Promise<T>, metadata?: Record<string, unknown>): Promise<T> {\n if (!this.profiler) return fn();\n return this.profiler.profile(name, fn, metadata);\n }\n\n startProfileSpan(name: string, metadata?: Record<string, unknown>): () => void {\n if (!this.profiler) return () => {};\n return this.profiler.startSpan(name, metadata);\n }\n\n getProfiles(): ProfileData[] {\n if (!this.profiler) return [];\n return this.profiler.getProfiles();\n }\n\n getLatestProfile(): ProfileData | null {\n if (!this.profiler) return null;\n return this.profiler.getLatestProfile();\n }\n\n async flushProfiles(): Promise<void> {\n if (!this.profiler) return;\n return this.profiler.flush();\n }\n\n // --- Remote Config ---\n\n getRemoteConfig(): RemoteConfig | null {\n return this.remoteConfigManager?.getConfig() ?? null;\n }\n\n isRemoteConfigFeatureEnabled(key: string, defaultValue = true): boolean {\n return this.remoteConfigManager?.isFeatureEnabled(key, defaultValue) ?? defaultValue;\n }\n\n onRemoteConfigChange(listener: (config: RemoteConfig) => void): () => void {\n if (!this.remoteConfigManager) {\n return () => {};\n }\n return this.remoteConfigManager.onChange(listener);\n }\n\n setContext(context: ErrorContext): void {\n this.context = { ...this.context, ...context };\n }\n\n setUser(user: ErrorContext['user']): void {\n this.context.user = user;\n if (this.replayManager) {\n this.replayManager.setUser(user ? { id: user.id } : null);\n }\n }\n\n setTags(tags: Record<string, string>): void {\n this.context.tags = { ...this.context.tags, ...tags };\n }\n\n clearUser(): void {\n this.context.user = undefined;\n if (this.replayManager) {\n this.replayManager.setUser(null);\n }\n }\n\n addBreadcrumb(breadcrumb: {\n type?: 'default' | 'http' | 'navigation' | 'ui' | 'console' | 'error';\n category?: string;\n message?: string;\n level?: 'fatal' | 'error' | 'warning' | 'info' | 'debug';\n data?: Record<string, unknown>;\n }): void {\n // Breadcrumbs are stored in the replay manager if enabled\n this.log('Breadcrumb added:', breadcrumb);\n }\n\n captureError(error: Error | string, additionalContext?: ErrorContext): void {\n if (!this.initialized) {\n console.warn('[SitePong] SDK not initialized. Call init() first.');\n return;\n }\n\n const capturedError = this.formatError(error, additionalContext);\n this.errorQueue.push(capturedError);\n this.log('Captured error:', capturedError.message);\n\n // Trigger replay buffer flush — sends the last N seconds of recording\n if (this.replayManager?.isRecording()) {\n this.replayManager.flushOnError().catch((err) => {\n this.log('Failed to flush replay on error:', err);\n });\n }\n\n if (this.errorQueue.length >= this.config.maxBatchSize) {\n this.flush();\n }\n }\n\n captureMessage(message: string, level: 'info' | 'warning' | 'error' = 'info', additionalContext?: ErrorContext): void {\n if (!this.initialized) {\n console.warn('[SitePong] SDK not initialized. Call init() first.');\n return;\n }\n\n const capturedError: CapturedError = {\n message,\n type: level,\n timestamp: new Date().toISOString(),\n url: this.getUrl(),\n userAgent: this.getUserAgent(),\n environment: this.config.environment,\n release: this.config.release,\n context: { ...this.context, ...additionalContext },\n replaySessionId: this.replayManager?.isRecording() ? this.replayManager.getSessionId() || undefined : undefined,\n };\n\n this.errorQueue.push(capturedError);\n this.log('Captured message:', message);\n\n if (this.errorQueue.length >= this.config.maxBatchSize) {\n this.flush();\n }\n }\n\n async flush(): Promise<void> {\n if (this.errorQueue.length === 0) {\n return;\n }\n\n // If disabled due to too many failures, drop events silently\n if (this.disabled) {\n this.errorQueue = [];\n return;\n }\n\n const errors = [...this.errorQueue];\n this.errorQueue = [];\n\n try {\n const response = await fetch(`${this.config.endpoint}/api/errors/batch`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-API-Key': this.config.apiKey,\n },\n body: JSON.stringify({ errors }),\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}`);\n }\n\n // Reset failure counter on success\n this.flushFailures = 0;\n this.log(`Flushed ${errors.length} errors`);\n } catch (err) {\n this.flushFailures++;\n\n if (this.flushFailures >= MAX_FLUSH_FAILURES) {\n // Disable SDK after too many failures\n this.disabled = true;\n console.warn(\n `[SitePong] SDK disabled after ${MAX_FLUSH_FAILURES} consecutive failures. ` +\n `Events will no longer be sent. This may be due to CORS issues or network problems. ` +\n `Check that ${this.config.endpoint} is accessible and has proper CORS headers.`\n );\n // Don't re-queue - just drop the events\n return;\n }\n\n // Re-queue errors for retry (up to MAX_FLUSH_FAILURES times)\n this.errorQueue.unshift(...errors);\n this.log(`Failed to flush errors (attempt ${this.flushFailures}/${MAX_FLUSH_FAILURES}):`, err);\n }\n }\n\n private formatError(error: Error | string, additionalContext?: ErrorContext): CapturedError {\n const isError = error instanceof Error;\n const message = isError ? error.message : String(error);\n const stack = isError ? error.stack : new Error(message).stack;\n const type = isError ? error.name : 'Error';\n\n return {\n message,\n stack,\n type,\n timestamp: new Date().toISOString(),\n url: this.getUrl(),\n userAgent: this.getUserAgent(),\n environment: this.config.environment,\n release: this.config.release,\n context: { ...this.context, ...additionalContext },\n fingerprint: this.generateFingerprint(message, stack, type),\n replaySessionId: this.replayManager?.isRecording() ? this.replayManager.getSessionId() || undefined : undefined,\n };\n }\n\n /**\n * Generate a fingerprint matching the server-side algorithm.\n * Groups by: error type + normalized message + top stack frame.\n */\n private generateFingerprint(message: string, stack?: string, type?: string): string {\n const errorType = type || 'Error';\n const normalizedMsg = this.normalizeMessage(message);\n const topFrame = stack ? this.extractTopFrame(stack) : '';\n\n const input = [errorType, normalizedMsg, topFrame].join('\\n');\n\n // Sync hash matching server's SHA-256 truncated to 16 hex chars.\n // We use a fast 53-bit hash here (FNV-1a) since the server is the\n // authoritative source and will recompute with SHA-256 on ingest.\n let h = 0x811c9dc5;\n for (let i = 0; i < input.length; i++) {\n h ^= input.charCodeAt(i);\n h = Math.imul(h, 0x01000193);\n }\n return (h >>> 0).toString(16).padStart(8, '0');\n }\n\n private normalizeMessage(message: string): string {\n return message\n .replace(\n /[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/gi,\n '<uuid>'\n )\n .replace(/\\b0x[0-9a-f]{4,}\\b/gi, '<hex>')\n .replace(/\\b[0-9a-f]{8,}\\b/gi, '<hex>')\n .replace(/https?:\\/\\/[^\\s)\"']+/g, '<url>')\n .replace(/\\b\\d+(\\.\\d+)?\\b/g, '<n>')\n .replace(/\\s+/g, ' ')\n .trim();\n }\n\n private extractTopFrame(stack: string): string {\n const lines = stack.split('\\n');\n for (let i = 1; i < lines.length; i++) {\n const line = lines[i].trim();\n if (line && (line.startsWith('at ') || /^\\w+@/.test(line))) {\n return line.replace(/:\\d+\\)?\\s*$/, ')');\n }\n }\n return '';\n }\n\n private setupAutoCapture(): void {\n const env = getEnvironment();\n if (!env) return;\n\n this.envUnsubs.push(\n env.onUncaughtError((err) => {\n const error = err instanceof Error ? err : new Error(String(err));\n this.captureError(error);\n })\n );\n\n this.envUnsubs.push(\n env.onUnhandledRejection((reason) => {\n const error = reason instanceof Error\n ? reason\n : new Error(String(reason));\n this.captureError(error);\n })\n );\n\n this.log('Auto-capture enabled for', env.platform);\n }\n\n private startFlushTimer(): void {\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n }\n\n this.flushTimer = setInterval(() => {\n this.flush();\n }, this.config.flushInterval);\n\n const env = getEnvironment();\n if (!env) return;\n\n this.envUnsubs.push(env.onBeforeTerminate(() => this.flush()));\n this.envUnsubs.push(env.onVisibilityHidden(() => this.flushWithBeacon()));\n }\n\n private flushWithBeacon(): void {\n if (this.errorQueue.length === 0) return;\n const env = getEnvironment();\n if (!env || !env.sendBeacon) return;\n\n const errors = [...this.errorQueue];\n this.errorQueue = [];\n\n const body = JSON.stringify({ errors, apiKey: this.config.apiKey });\n const ok = env.sendBeacon(`${this.config.endpoint}/api/errors/batch`, body);\n if (ok) {\n this.log(`Flushed ${errors.length} errors via beacon`);\n } else {\n // Re-queue if beacon couldn't send\n this.errorQueue.unshift(...errors);\n }\n }\n\n setCurrentScreen(name: string | undefined): void {\n this.currentScreen = name;\n // Route the screen name through the RN env so shared code that calls\n // env.getCurrentUrl() (e.g. error capture) sees the same value.\n setRNGetCurrentScreen(() => this.currentScreen);\n }\n\n private getUrl(): string | undefined {\n const env = getEnvironment();\n if (!env) return this.currentScreen ?? undefined;\n return env.getCurrentUrl() ?? this.currentScreen ?? undefined;\n }\n\n private getUserAgent(): string | undefined {\n const env = getEnvironment();\n if (!env) return undefined;\n return env.getUserAgent();\n }\n\n private log(...args: unknown[]): void {\n if (this.config.debug) {\n console.log('[SitePong]', ...args);\n }\n }\n}\n\n// Singleton instance\nconst sitepong = new SitePongClient();\n\n// Named exports\nexport const init = sitepong.init.bind(sitepong);\nexport const initRN = sitepong.initRN.bind(sitepong);\nexport const captureError = sitepong.captureError.bind(sitepong);\nexport const captureMessage = sitepong.captureMessage.bind(sitepong);\nexport const setContext = sitepong.setContext.bind(sitepong);\nexport const setUser = sitepong.setUser.bind(sitepong);\nexport const setTags = sitepong.setTags.bind(sitepong);\nexport const flush = sitepong.flush.bind(sitepong);\nexport const isInitialized = sitepong.isInitialized.bind(sitepong);\nexport const clearUser = sitepong.clearUser.bind(sitepong);\nexport const addBreadcrumb = sitepong.addBreadcrumb.bind(sitepong);\nexport const setCurrentScreen = sitepong.setCurrentScreen.bind(sitepong);\nexport { sitepong as client };\n\n// Feature flags exports\nexport const getFlag = sitepong.getFlag.bind(sitepong);\nexport const getAllFlags = sitepong.getAllFlags.bind(sitepong);\nexport const getVariant = sitepong.getVariant.bind(sitepong);\nexport const getVariantPayload = sitepong.getVariantPayload.bind(sitepong);\nexport const waitForFlags = sitepong.waitForFlags.bind(sitepong);\nexport const areFlagsReady = sitepong.areFlagsReady.bind(sitepong);\nexport const refreshFlags = sitepong.refreshFlags.bind(sitepong);\n\n// Analytics exports (Tier 4)\nexport const track = sitepong.track.bind(sitepong);\nexport const trackPageView = sitepong.trackPageView.bind(sitepong);\nexport const identify = sitepong.identify.bind(sitepong);\nexport const group = sitepong.group.bind(sitepong);\nexport const resetAnalytics = sitepong.resetAnalytics.bind(sitepong);\n\n// Fingerprint exports (Tier 5)\nexport const getVisitorId = sitepong.getVisitorId.bind(sitepong);\nexport const getDeviceSignals = sitepong.getDeviceSignals.bind(sitepong);\nexport const getFraudCheck = sitepong.getFraudCheck.bind(sitepong);\n\n// Session Replay exports (Tier 6)\nexport const startReplay = sitepong.startReplay.bind(sitepong);\nexport const stopReplay = sitepong.stopReplay.bind(sitepong);\nexport const isReplayRecording = sitepong.isReplayRecording.bind(sitepong);\nexport const getReplaySessionId = sitepong.getReplaySessionId.bind(sitepong);\n\n// Performance exports (Tier 7)\nexport const startTransaction = sitepong.startTransaction.bind(sitepong);\nexport const endTransaction = sitepong.endTransaction.bind(sitepong);\nexport const startSpan = sitepong.startSpan.bind(sitepong);\nexport const endSpan = sitepong.endSpan.bind(sitepong);\nexport const getWebVitals = sitepong.getWebVitals.bind(sitepong);\n\n// Database query tracking exports\nexport const dbTrack = sitepong.dbTrack.bind(sitepong);\nexport const dbTrackSync = sitepong.dbTrackSync.bind(sitepong);\nexport const getDbQueryCount = sitepong.getDbQueryCount.bind(sitepong);\nexport const resetDbQueryCount = sitepong.resetDbQueryCount.bind(sitepong);\nexport const getDbNPlusOnePatterns = sitepong.getDbNPlusOnePatterns.bind(sitepong);\n\n// Cron monitoring exports\nexport const cronCheckin = sitepong.cronCheckin.bind(sitepong);\nexport const cronStart = sitepong.cronStart.bind(sitepong);\nexport const cronWrap = sitepong.cronWrap.bind(sitepong);\n\n// Custom metrics exports\nexport const metricIncrement = sitepong.metricIncrement.bind(sitepong);\nexport const metricGauge = sitepong.metricGauge.bind(sitepong);\nexport const metricHistogram = sitepong.metricHistogram.bind(sitepong);\nexport const metricDistribution = sitepong.metricDistribution.bind(sitepong);\nexport const metricTime = sitepong.metricTime.bind(sitepong);\nexport const metricStartTimer = sitepong.metricStartTimer.bind(sitepong);\nexport const flushMetrics = sitepong.flushMetrics.bind(sitepong);\n\n// Profiling exports\nexport const profile = sitepong.profile.bind(sitepong);\nexport const startProfileSpan = sitepong.startProfileSpan.bind(sitepong);\nexport const getProfiles = sitepong.getProfiles.bind(sitepong);\nexport const getLatestProfile = sitepong.getLatestProfile.bind(sitepong);\nexport const flushProfiles = sitepong.flushProfiles.bind(sitepong);\n\n// Remote config exports\nexport const getRemoteConfig = sitepong.getRemoteConfig.bind(sitepong);\nexport const isRemoteConfigFeatureEnabled = sitepong.isRemoteConfigFeatureEnabled.bind(sitepong);\nexport const onRemoteConfigChange = sitepong.onRemoteConfigChange.bind(sitepong);\n\n// Widget manager exports\n// Platform-entry helpers (not for end users; used by sitepong/web, sitepong/react-native, sitepong/server entries)\nexport const registerIdentifyHook = sitepong.registerIdentifyHook.bind(sitepong);\nexport { setEnvironment, setRNGetCurrentScreen } from './utils/platform';\nexport type { EnvironmentAdapter, MutableRNEnvironmentAdapter, DeviceInfo, PlatformName } from './adapters/environment';\n\n// Re-export flag utilities for advanced use cases\nexport { getAnonymousId, clearAnonymousId, setAnonymousId } from './flags';\n\n// Re-export types for advanced use cases\nexport type { TrackProperties, UserTraits, GroupTraits } from './analytics';\nexport type { VisitorIdResult, DeviceSignals, FraudCheckResult } from './fingerprint';\nexport type { ReplayConfig, ReplayEvent } from './replay';\nexport type { PerformanceConfig, WebVitals, PerformanceTransaction, PerformanceSpan, ResourceTimingBreakdown } from './performance';\nexport type { CronCheckinOptions, CronHandle } from './crons';\nexport type { MetricOptions } from './metrics';\nexport type { DatabaseQueryEvent, DatabaseTrackerConfig } from './database';\nexport type { ProfileData, ProfileFrame, ProfilerConfig } from './profiling';\n\n// Distributed tracing exports\nexport {\n TracePropagator,\n createTraceContext,\n propagateTrace,\n extractTrace,\n generateTraceId,\n generateSpanId,\n} from './performance';\nexport type { TraceContext } from './performance';\n\n// Re-export remote config types\nexport type { RemoteConfig, RemoteConfigFeatures, RemoteConfigSampling } from './remote-config';\n\n// SuperLink — deferred deep linking / smart links (web + platform-agnostic).\n// React Native deferred attribution is exported from 'sitepong/react-native'.\nexport {\n initSuperLink,\n getDeepLink,\n captureWebDeepLink,\n parseUniversalLink,\n writeClipboardToken,\n extractIdentityMetadata,\n // SuperLink identity recovery. Aliased to avoid colliding with the analytics\n // identify() exported above.\n identify as superlinkIdentify,\n completeFromScan,\n onDeferredDeepLink,\n getMatchedDeepLink,\n superlinkClient,\n SuperLinkClient,\n DEFAULT_SUPERLINK_ENDPOINT,\n} from './superlink';\nexport type {\n SuperLinkConfig,\n SuperLinkDeepLink,\n SuperLinkMatchResponse,\n SuperLinkMatchRequest,\n SuperLinkFingerprint,\n SuperLinkPlatform,\n SuperLinkMatchType,\n SuperLinkEventType,\n SuperLinkIdentityMetadata,\n DeferredDeepLinkHandler,\n} from './superlink';\n\n// Default export\nexport default sitepong;\n","import type { SerializedNode, DOMSnapshot } from './types';\n\nlet nodeIdCounter = 0;\nconst nodeIdMap = new WeakMap<Node, number>();\n\nexport function resetNodeIds(): void {\n nodeIdCounter = 0;\n}\n\nexport function getNodeId(node: Node): number {\n let id = nodeIdMap.get(node);\n if (id === undefined) {\n id = ++nodeIdCounter;\n nodeIdMap.set(node, id);\n }\n return id;\n}\n\nexport function getNodeById(id: number, root: Node): Node | null {\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_ALL);\n let node: Node | null = walker.currentNode;\n while (node) {\n if (nodeIdMap.get(node) === id) return node;\n node = walker.nextNode();\n }\n return null;\n}\n\ninterface SerializeOptions {\n maskInputs: boolean;\n blockSelector?: string;\n maskSelector?: string;\n}\n\nconst SKIP_TAGS = new Set(['script', 'noscript']);\n\nconst ABSOLUTE_URL_ATTRS = new Set(['src', 'href', 'action', 'poster']);\n\n/**\n * Key visual CSS properties to capture via getComputedStyle().\n * We only serialize these to keep payload size manageable.\n */\nconst COMPUTED_STYLE_PROPERTIES = [\n 'display', 'visibility', 'opacity',\n 'position', 'top', 'right', 'bottom', 'left', 'z-index',\n 'float', 'clear',\n 'width', 'height', 'min-width', 'min-height', 'max-width', 'max-height',\n 'margin-top', 'margin-right', 'margin-bottom', 'margin-left',\n 'padding-top', 'padding-right', 'padding-bottom', 'padding-left',\n 'border-top-width', 'border-right-width', 'border-bottom-width', 'border-left-width',\n 'border-top-style', 'border-right-style', 'border-bottom-style', 'border-left-style',\n 'border-top-color', 'border-right-color', 'border-bottom-color', 'border-left-color',\n 'border-radius',\n 'background-color', 'background-image', 'background-size', 'background-position',\n 'color', 'font-family', 'font-size', 'font-weight', 'font-style',\n 'line-height', 'letter-spacing', 'text-align', 'text-decoration', 'text-transform',\n 'overflow', 'overflow-x', 'overflow-y',\n 'flex-direction', 'flex-wrap', 'justify-content', 'align-items', 'align-self',\n 'flex-grow', 'flex-shrink', 'flex-basis', 'gap',\n 'grid-template-columns', 'grid-template-rows',\n 'transform', 'box-shadow', 'text-shadow',\n 'cursor', 'white-space', 'word-break',\n 'box-sizing',\n];\n\n/**\n * Cache of default computed styles per tag name.\n * Built lazily using a hidden iframe with a blank document.\n */\nlet defaultStyleCache: Map<string, Record<string, string>> | null = null;\nlet defaultStyleIframe: HTMLIFrameElement | null = null;\n\nfunction getDefaultStyles(tagName: string): Record<string, string> {\n if (typeof document === 'undefined') return {};\n\n if (!defaultStyleCache) {\n defaultStyleCache = new Map();\n }\n\n const cached = defaultStyleCache.get(tagName);\n if (cached) return cached;\n\n try {\n // Create hidden iframe for computing defaults\n if (!defaultStyleIframe) {\n defaultStyleIframe = document.createElement('iframe');\n defaultStyleIframe.style.cssText = 'position:fixed;top:-9999px;left:-9999px;width:0;height:0;border:none;visibility:hidden;';\n document.body.appendChild(defaultStyleIframe);\n }\n\n const iframeDoc = defaultStyleIframe.contentDocument;\n if (!iframeDoc) return {};\n\n const el = iframeDoc.createElement(tagName);\n iframeDoc.body.appendChild(el);\n const computed = iframeDoc.defaultView!.getComputedStyle(el);\n\n const defaults: Record<string, string> = {};\n for (const prop of COMPUTED_STYLE_PROPERTIES) {\n defaults[prop] = computed.getPropertyValue(prop);\n }\n\n iframeDoc.body.removeChild(el);\n defaultStyleCache.set(tagName, defaults);\n return defaults;\n } catch {\n return {};\n }\n}\n\n/**\n * Capture computed styles for an element, returning only properties\n * that differ from the tag's defaults.\n */\nexport function captureComputedStyle(el: Element): string | null {\n if (typeof window === 'undefined') return null;\n\n try {\n const tagName = el.tagName.toLowerCase();\n // Skip non-visual elements\n if (SKIP_TAGS.has(tagName) || tagName === 'head' || tagName === 'html' || tagName === 'meta' || tagName === 'link' || tagName === 'title') {\n return null;\n }\n\n const computed = window.getComputedStyle(el);\n const defaults = getDefaultStyles(tagName);\n const parts: string[] = [];\n\n for (const prop of COMPUTED_STYLE_PROPERTIES) {\n const value = computed.getPropertyValue(prop);\n if (value && value !== defaults[prop]) {\n parts.push(`${prop}:${value}`);\n }\n }\n\n return parts.length > 0 ? parts.join(';') : null;\n } catch {\n return null;\n }\n}\n\n/**\n * Attempt to re-fetch a cross-origin stylesheet URL and inline its contents.\n * Returns the CSS text or null if fetch fails.\n */\nconst crossOriginCache = new Map<string, string | null>();\n\nexport async function fetchCrossOriginStylesheet(href: string): Promise<string | null> {\n if (crossOriginCache.has(href)) {\n return crossOriginCache.get(href) ?? null;\n }\n\n try {\n const response = await fetch(href, { mode: 'cors' });\n if (!response.ok) {\n crossOriginCache.set(href, null);\n return null;\n }\n const css = await response.text();\n const absolutified = absolutifyUrls(css, href);\n crossOriginCache.set(href, absolutified);\n return absolutified;\n } catch {\n crossOriginCache.set(href, null);\n return null;\n }\n}\n\n/**\n * Synchronously check if a cross-origin stylesheet has been pre-fetched.\n * Call fetchCrossOriginStylesheet() first to populate the cache.\n */\nfunction getCachedCrossOriginStylesheet(href: string): string | null {\n return crossOriginCache.get(href) ?? null;\n}\n\n/**\n * Clean up the default style iframe. Call on stop().\n */\nexport function cleanupStyleDefaults(): void {\n if (defaultStyleIframe && defaultStyleIframe.parentNode) {\n defaultStyleIframe.parentNode.removeChild(defaultStyleIframe);\n }\n defaultStyleIframe = null;\n defaultStyleCache = null;\n crossOriginCache.clear();\n}\n\n/**\n * Convert a potentially relative URL to absolute.\n */\nfunction toAbsoluteUrl(url: string, base: string): string {\n if (!url || url.startsWith('data:') || url.startsWith('blob:') || url.startsWith('#')) {\n return url;\n }\n try {\n return new URL(url, base).href;\n } catch {\n return url;\n }\n}\n\n/**\n * Replace relative url() references inside CSS text with absolute URLs.\n */\nfunction absolutifyUrls(css: string, baseUrl: string): string {\n // Match url(...) but not data: or blob: or absolute http(s) URLs\n return css.replace(\n /url\\(\\s*(['\"]?)([^'\")]+)\\1\\s*\\)/g,\n (_match, quote, rawUrl) => {\n const trimmed = rawUrl.trim();\n if (\n trimmed.startsWith('data:') ||\n trimmed.startsWith('blob:') ||\n trimmed.startsWith('http://') ||\n trimmed.startsWith('https://') ||\n trimmed.startsWith('//')\n ) {\n return `url(${quote}${trimmed}${quote})`;\n }\n try {\n const abs = new URL(trimmed, baseUrl).href;\n return `url(${quote}${abs}${quote})`;\n } catch {\n return `url(${quote}${trimmed}${quote})`;\n }\n }\n );\n}\n\n/**\n * Stringify a CSSStyleSheet, catching SecurityError for cross-origin sheets.\n */\nfunction stringifyStylesheet(sheet: CSSStyleSheet): string | null {\n try {\n const rules = sheet.cssRules;\n let css = '';\n for (let i = 0; i < rules.length; i++) {\n css += rules[i].cssText + '\\n';\n }\n return css;\n } catch {\n // SecurityError: cross-origin stylesheet\n return null;\n }\n}\n\n/**\n * For a <style> or <link rel=\"stylesheet\"> element, extract inlined CSS text\n * with absolute URLs resolved.\n */\nexport function buildCssTextForNode(el: Element): string | null {\n const tagName = el.tagName.toLowerCase();\n const base = location.href;\n\n if (tagName === 'style') {\n // Inline <style>: read from its sheet\n const styleEl = el as HTMLStyleElement;\n if (styleEl.sheet) {\n const css = stringifyStylesheet(styleEl.sheet);\n if (css !== null) {\n return absolutifyUrls(css, base);\n }\n }\n // Fallback: use textContent\n const text = el.textContent || '';\n return text ? absolutifyUrls(text, base) : null;\n }\n\n if (tagName === 'link') {\n const linkEl = el as HTMLLinkElement;\n if (linkEl.rel !== 'stylesheet') return null;\n\n const sheetBase = linkEl.href || base;\n if (linkEl.sheet) {\n const css = stringifyStylesheet(linkEl.sheet);\n if (css !== null) {\n return absolutifyUrls(css, sheetBase);\n }\n }\n // Cross-origin sheet: check if we've pre-fetched it\n if (linkEl.href) {\n const cached = getCachedCrossOriginStylesheet(linkEl.href);\n if (cached) return cached;\n }\n return null;\n }\n\n return null;\n}\n\n/**\n * Absolutify srcset attribute values.\n */\nfunction absolutifySrcset(srcset: string, base: string): string {\n return srcset\n .split(',')\n .map((entry) => {\n const parts = entry.trim().split(/\\s+/);\n if (parts[0]) {\n parts[0] = toAbsoluteUrl(parts[0], base);\n }\n return parts.join(' ');\n })\n .join(', ');\n}\n\nexport function serializeNode(\n node: Node,\n options: SerializeOptions,\n parentIsSVG = false,\n): SerializedNode | null {\n const id = getNodeId(node);\n\n if (node.nodeType === Node.TEXT_NODE) {\n const parent = node.parentElement;\n let textContent = node.textContent || '';\n\n // Mask text content if parent matches maskSelector\n if (parent && options.maskSelector && parent.matches(options.maskSelector)) {\n textContent = textContent.replace(/\\S/g, '*');\n }\n\n return {\n id,\n type: 'text',\n textContent,\n };\n }\n\n if (node.nodeType === Node.COMMENT_NODE) {\n return { id, type: 'comment', textContent: '' };\n }\n\n if (node.nodeType === Node.ELEMENT_NODE) {\n const el = node as Element;\n const htmlEl = el as HTMLElement;\n\n // Block this element entirely if it matches blockSelector\n if (options.blockSelector && el.matches(options.blockSelector)) {\n return {\n id,\n type: 'element',\n tagName: 'div',\n attributes: {\n 'data-blocked': 'true',\n style: `width:${htmlEl.offsetWidth}px;height:${htmlEl.offsetHeight}px;background:#f0f0f0;`,\n },\n };\n }\n\n const tagName = el.tagName.toLowerCase();\n\n // Skip elements that should not be serialized\n if (SKIP_TAGS.has(tagName)) {\n return null;\n }\n\n const isSVG = parentIsSVG || tagName === 'svg' || el instanceof SVGElement;\n\n // Collect all attributes\n const attributes: Record<string, string> = {};\n const base = location.href;\n\n for (let i = 0; i < el.attributes.length; i++) {\n const attr = el.attributes[i];\n const name = attr.name;\n let value = attr.value;\n\n // Skip event handlers\n if (name.startsWith('on')) continue;\n // Skip javascript: URLs\n if (value && value.toLowerCase().startsWith('javascript:')) continue;\n\n // Resolve absolute URLs for known URL attributes\n if (ABSOLUTE_URL_ATTRS.has(name)) {\n value = toAbsoluteUrl(value, base);\n }\n\n // Handle srcset\n if (name === 'srcset') {\n value = absolutifySrcset(value, base);\n }\n\n attributes[name] = value;\n }\n\n // CSS inlining for <style> and <link rel=\"stylesheet\">\n if (tagName === 'style' || (tagName === 'link' && el.getAttribute('rel') === 'stylesheet')) {\n const cssText = buildCssTextForNode(el);\n if (cssText) {\n attributes['_cssText'] = cssText;\n }\n }\n\n // Capture computed styles (diff against defaults) for visual elements\n if (!isSVG && tagName !== 'style' && tagName !== 'link') {\n const computedStyle = captureComputedStyle(el);\n if (computedStyle) {\n attributes['_computedStyle'] = computedStyle;\n }\n }\n\n // Form element state capture\n if (tagName === 'input') {\n const input = el as HTMLInputElement;\n const inputType = (input.type || '').toLowerCase();\n if (inputType === 'checkbox' || inputType === 'radio') {\n attributes['_checked'] = String(input.checked);\n } else {\n const val = options.maskInputs ? '***' : input.value;\n if (val) {\n attributes['_value'] = val;\n }\n }\n } else if (tagName === 'textarea') {\n const textarea = el as HTMLTextAreaElement;\n const val = options.maskInputs ? '***' : textarea.value;\n if (val) {\n attributes['_value'] = val;\n }\n } else if (tagName === 'select') {\n const select = el as HTMLSelectElement;\n attributes['_selectedIndex'] = String(select.selectedIndex);\n }\n\n // Canvas snapshot\n if (tagName === 'canvas') {\n try {\n const canvas = el as HTMLCanvasElement;\n const dataUrl = canvas.toDataURL('image/webp', 0.4);\n if (dataUrl && dataUrl !== 'data:,') {\n attributes['_canvasDataUrl'] = dataUrl;\n }\n } catch {\n // tainted canvas or other error — skip\n }\n }\n\n // Mask content if element matches maskSelector\n if (options.maskSelector && el.matches(options.maskSelector)) {\n // Children text will be masked via the text node branch\n }\n\n // Serialize children\n const children: SerializedNode[] = [];\n for (const child of Array.from(el.childNodes)) {\n const serialized = serializeNode(child, options, isSVG);\n if (serialized) {\n children.push(serialized);\n }\n }\n\n const result: SerializedNode = {\n id,\n type: 'element',\n tagName,\n attributes: Object.keys(attributes).length > 0 ? attributes : undefined,\n children: children.length > 0 ? children : undefined,\n };\n\n if (isSVG) {\n result.isSVG = true;\n }\n\n return result;\n }\n\n return null;\n}\n\nexport function takeSnapshot(options: SerializeOptions): DOMSnapshot | null {\n if (typeof document === 'undefined') return null;\n\n resetNodeIds();\n\n const html = serializeNode(document.documentElement, options);\n if (!html) return null;\n\n return {\n _version: 2,\n doctype: document.doctype\n ? `<!DOCTYPE ${document.doctype.name}>`\n : undefined,\n html,\n width: window.innerWidth,\n height: window.innerHeight,\n };\n}\n","/**\n * Network Request Recording for Session Replay\n * Intercepts XHR and fetch requests to record them in the replay timeline.\n */\n\nexport interface NetworkEvent {\n type: 'network';\n timestamp: number;\n data: NetworkRequestData;\n}\n\nexport interface NetworkRequestData {\n method: string;\n url: string;\n status?: number;\n statusText?: string;\n requestHeaders?: Record<string, string>;\n responseHeaders?: Record<string, string>;\n duration?: number;\n requestSize?: number;\n responseSize?: number;\n error?: string;\n initiator: 'fetch' | 'xhr';\n}\n\ntype NetworkCallback = (event: NetworkEvent) => void;\n\n/** Headers that should never be captured for privacy */\nconst REDACTED_HEADERS = [\n 'authorization',\n 'cookie',\n 'set-cookie',\n 'x-api-key',\n 'x-auth-token',\n];\n\nexport class NetworkRecorder {\n private callback: NetworkCallback;\n private originalFetch: typeof window.fetch | null = null;\n private originalXhrOpen: typeof XMLHttpRequest.prototype.open | null = null;\n private originalXhrSend: typeof XMLHttpRequest.prototype.send | null = null;\n private active = false;\n private captureHeaders: boolean;\n private urlFilter?: (url: string) => boolean;\n\n constructor(\n callback: NetworkCallback,\n options?: {\n captureHeaders?: boolean;\n urlFilter?: (url: string) => boolean;\n }\n ) {\n this.callback = callback;\n this.captureHeaders = options?.captureHeaders ?? false;\n this.urlFilter = options?.urlFilter;\n }\n\n start(): void {\n if (this.active || typeof window === 'undefined') return;\n this.active = true;\n\n this.interceptFetch();\n this.interceptXHR();\n }\n\n stop(): void {\n if (!this.active) return;\n this.active = false;\n\n // Restore fetch\n if (this.originalFetch) {\n window.fetch = this.originalFetch;\n this.originalFetch = null;\n }\n\n // Restore XHR\n if (this.originalXhrOpen) {\n XMLHttpRequest.prototype.open = this.originalXhrOpen;\n this.originalXhrOpen = null;\n }\n if (this.originalXhrSend) {\n XMLHttpRequest.prototype.send = this.originalXhrSend;\n this.originalXhrSend = null;\n }\n }\n\n private interceptFetch(): void {\n if (typeof window.fetch !== 'function') return;\n\n this.originalFetch = window.fetch;\n const self = this;\n\n window.fetch = async function (input: RequestInfo | URL, init?: RequestInit): Promise<Response> {\n const url = typeof input === 'string' ? input : input instanceof URL ? input.toString() : (input as Request).url;\n\n if (self.urlFilter && !self.urlFilter(url)) {\n return self.originalFetch!.call(window, input as RequestInfo, init);\n }\n\n const startTime = Date.now();\n const method = init?.method || (input instanceof Request ? input.method : 'GET');\n\n let requestSize: number | undefined;\n if (init?.body) {\n if (typeof init.body === 'string') {\n requestSize = init.body.length;\n } else if (init.body instanceof Blob) {\n requestSize = init.body.size;\n }\n }\n\n try {\n const response = await self.originalFetch!.call(window, input as RequestInfo, init);\n const duration = Date.now() - startTime;\n\n const data: NetworkRequestData = {\n method: method.toUpperCase(),\n url: self.truncateUrl(url),\n status: response.status,\n statusText: response.statusText,\n duration,\n requestSize,\n initiator: 'fetch',\n };\n\n if (self.captureHeaders) {\n data.requestHeaders = self.safeHeaders(init?.headers);\n data.responseHeaders = self.headersToObject(response.headers);\n }\n\n self.emit(data);\n return response;\n } catch (err) {\n const duration = Date.now() - startTime;\n\n self.emit({\n method: method.toUpperCase(),\n url: self.truncateUrl(url),\n duration,\n requestSize,\n error: err instanceof Error ? err.message : 'Network error',\n initiator: 'fetch',\n });\n\n throw err;\n }\n };\n }\n\n private interceptXHR(): void {\n if (typeof XMLHttpRequest === 'undefined') return;\n\n this.originalXhrOpen = XMLHttpRequest.prototype.open;\n this.originalXhrSend = XMLHttpRequest.prototype.send;\n const self = this;\n\n XMLHttpRequest.prototype.open = function (\n method: string,\n url: string | URL,\n ...args: unknown[]\n ) {\n (this as XMLHttpRequest & { _spMethod: string; _spUrl: string })._spMethod = method;\n (this as XMLHttpRequest & { _spUrl: string })._spUrl = typeof url === 'string' ? url : url.toString();\n return self.originalXhrOpen!.apply(this, [method, url, ...args] as Parameters<typeof XMLHttpRequest.prototype.open>);\n };\n\n XMLHttpRequest.prototype.send = function (body?: Document | XMLHttpRequestBodyInit | null) {\n const xhr = this as XMLHttpRequest & { _spMethod: string; _spUrl: string };\n const url = xhr._spUrl;\n\n if (self.urlFilter && !self.urlFilter(url)) {\n return self.originalXhrSend!.call(this, body);\n }\n\n const startTime = Date.now();\n let requestSize: number | undefined;\n if (typeof body === 'string') {\n requestSize = body.length;\n }\n\n const onLoadEnd = () => {\n const duration = Date.now() - startTime;\n\n // Safely get response size — accessing responseText throws\n // InvalidStateError when responseType is not \"\" or \"text\"\n // (e.g. \"json\", \"arraybuffer\", \"blob\").\n let responseSize: number | undefined;\n try {\n if (xhr.responseType === '' || xhr.responseType === 'text') {\n responseSize = xhr.responseText?.length;\n } else if (xhr.responseType === 'json' && xhr.response != null) {\n responseSize = JSON.stringify(xhr.response).length;\n } else if (xhr.responseType === 'arraybuffer' && xhr.response) {\n responseSize = (xhr.response as ArrayBuffer).byteLength;\n } else if (xhr.responseType === 'blob' && xhr.response) {\n responseSize = (xhr.response as Blob).size;\n }\n } catch {\n // Swallow — response size is best-effort\n }\n\n const data: NetworkRequestData = {\n method: (xhr._spMethod || 'GET').toUpperCase(),\n url: self.truncateUrl(url),\n status: xhr.status,\n statusText: xhr.statusText,\n duration,\n requestSize,\n responseSize,\n initiator: 'xhr',\n };\n\n if (xhr.status === 0) {\n data.error = 'Network error';\n }\n\n self.emit(data);\n xhr.removeEventListener('loadend', onLoadEnd);\n };\n\n xhr.addEventListener('loadend', onLoadEnd);\n return self.originalXhrSend!.call(this, body);\n };\n }\n\n private emit(data: NetworkRequestData): void {\n if (!this.active) return;\n this.callback({\n type: 'network',\n timestamp: Date.now(),\n data,\n });\n }\n\n private truncateUrl(url: string): string {\n // Remove query params with sensitive data patterns\n try {\n const parsed = new URL(url, window.location.origin);\n // Keep path, truncate if too long\n const path = parsed.pathname + parsed.search;\n return path.length > 500 ? path.slice(0, 500) + '...' : parsed.origin + path;\n } catch {\n return url.length > 500 ? url.slice(0, 500) + '...' : url;\n }\n }\n\n private safeHeaders(headers?: HeadersInit): Record<string, string> | undefined {\n if (!headers) return undefined;\n\n const result: Record<string, string> = {};\n if (headers instanceof Headers) {\n headers.forEach((value, key) => {\n result[key] = REDACTED_HEADERS.includes(key.toLowerCase()) ? '[REDACTED]' : value;\n });\n } else if (Array.isArray(headers)) {\n for (const [key, value] of headers) {\n result[key] = REDACTED_HEADERS.includes(key.toLowerCase()) ? '[REDACTED]' : value;\n }\n } else {\n for (const [key, value] of Object.entries(headers)) {\n result[key] = REDACTED_HEADERS.includes(key.toLowerCase()) ? '[REDACTED]' : value;\n }\n }\n return result;\n }\n\n private headersToObject(headers: Headers): Record<string, string> {\n const result: Record<string, string> = {};\n headers.forEach((value, key) => {\n result[key] = REDACTED_HEADERS.includes(key.toLowerCase()) ? '[REDACTED]' : value;\n });\n return result;\n }\n}\n","/**\n * Console Log Recording for Session Replay\n * Intercepts console.log/warn/error/info/debug to record them in the replay timeline.\n */\n\nexport type ConsoleLevel = 'log' | 'info' | 'warn' | 'error' | 'debug';\n\nexport interface ConsoleEvent {\n type: 'console';\n timestamp: number;\n data: ConsoleEventData;\n}\n\nexport interface ConsoleEventData {\n level: ConsoleLevel;\n args: string[];\n trace?: string;\n}\n\ntype ConsoleCallback = (event: ConsoleEvent) => void;\n\nconst MAX_ARG_LENGTH = 1000;\nconst MAX_ARGS = 10;\nconst MAX_TRACE_LENGTH = 2000;\n\nexport class ConsoleRecorder {\n private callback: ConsoleCallback;\n private originals: Record<ConsoleLevel, (...args: unknown[]) => void> = {} as Record<ConsoleLevel, (...args: unknown[]) => void>;\n private active = false;\n private levels: ConsoleLevel[];\n\n constructor(\n callback: ConsoleCallback,\n options?: {\n levels?: ConsoleLevel[];\n }\n ) {\n this.callback = callback;\n this.levels = options?.levels || ['log', 'info', 'warn', 'error', 'debug'];\n }\n\n start(): void {\n if (this.active || typeof console === 'undefined') return;\n this.active = true;\n\n for (const level of this.levels) {\n this.originals[level] = console[level].bind(console);\n console[level] = (...args: unknown[]) => {\n // Always call original\n this.originals[level](...args);\n // Record the event\n this.record(level, args);\n };\n }\n }\n\n stop(): void {\n if (!this.active) return;\n this.active = false;\n\n for (const level of this.levels) {\n if (this.originals[level]) {\n console[level] = this.originals[level];\n }\n }\n this.originals = {} as Record<ConsoleLevel, (...args: unknown[]) => void>;\n }\n\n private record(level: ConsoleLevel, args: unknown[]): void {\n if (!this.active) return;\n\n // Skip SDK's own debug logs to prevent feedback loops\n if (args.length > 0 && typeof args[0] === 'string' && args[0].startsWith('[SitePong')) {\n return;\n }\n\n const serializedArgs = args.slice(0, MAX_ARGS).map((arg) => this.serialize(arg));\n\n const data: ConsoleEventData = {\n level,\n args: serializedArgs,\n };\n\n // Capture stack trace for errors\n if (level === 'error') {\n const trace = this.getStackTrace();\n if (trace) {\n data.trace = trace.slice(0, MAX_TRACE_LENGTH);\n }\n }\n\n this.callback({\n type: 'console',\n timestamp: Date.now(),\n data,\n });\n }\n\n private serialize(value: unknown): string {\n if (value === null) return 'null';\n if (value === undefined) return 'undefined';\n\n if (value instanceof Error) {\n return `Error: ${value.message}${value.stack ? '\\n' + value.stack : ''}`.slice(0, MAX_ARG_LENGTH);\n }\n\n if (typeof value === 'string') {\n return value.slice(0, MAX_ARG_LENGTH);\n }\n\n if (typeof value === 'number' || typeof value === 'boolean') {\n return String(value);\n }\n\n if (typeof value === 'function') {\n return `[Function: ${value.name || 'anonymous'}]`;\n }\n\n if (typeof value === 'symbol') {\n return value.toString();\n }\n\n if (value instanceof HTMLElement) {\n return `<${value.tagName.toLowerCase()}${value.id ? '#' + value.id : ''}${value.className ? '.' + value.className.split(' ').join('.') : ''}>`;\n }\n\n try {\n const str = JSON.stringify(value, this.getReplacer(), 0);\n return str ? str.slice(0, MAX_ARG_LENGTH) : String(value);\n } catch {\n return String(value).slice(0, MAX_ARG_LENGTH);\n }\n }\n\n private getReplacer(): (key: string, value: unknown) => unknown {\n const seen = new WeakSet();\n return (_key: string, value: unknown) => {\n if (typeof value === 'object' && value !== null) {\n if (seen.has(value)) return '[Circular]';\n seen.add(value);\n }\n if (typeof value === 'function') return '[Function]';\n if (value instanceof RegExp) return value.toString();\n return value;\n };\n }\n\n private getStackTrace(): string | undefined {\n try {\n const err = new Error();\n if (!err.stack) return undefined;\n // Remove the first few frames (this function, record, console wrapper)\n const lines = err.stack.split('\\n');\n return lines.slice(4).join('\\n') || undefined;\n } catch {\n return undefined;\n }\n }\n}\n","import type {\n ReplayConfig,\n ReplayEvent,\n MutationData,\n MouseMoveData,\n InputData,\n ScrollData,\n} from './types';\nimport { takeSnapshot, getNodeId, serializeNode, buildCssTextForNode, captureComputedStyle, fetchCrossOriginStylesheet, cleanupStyleDefaults } from './serializer';\nimport { NetworkRecorder } from './network';\nimport { ConsoleRecorder } from './console';\n\nconst DEFAULT_ENDPOINT = 'https://ingest.sitepong.com';\nconst DEFAULT_BUFFER_DURATION = 20_000; // 20 seconds\nconst DEFAULT_MAX_SESSION_DURATION = 60 * 60 * 1000; // 60 minutes\nconst MAX_FLUSH_FAILURES = 3;\nconst TRIM_INTERVAL = 5000; // Trim buffer every 5 seconds\n\nexport class ReplayManager {\n private config: Required<Omit<ReplayConfig, 'apiKey' | 'replayEndpoint' | 'blockSelector' | 'maskSelector' | 'recordNetwork' | 'captureNetworkHeaders' | 'recordConsole' | 'consoleLevels' | 'bufferDuration'>> & {\n apiKey: string;\n replayEndpoint?: string;\n blockSelector?: string;\n maskSelector?: string;\n recordNetwork?: boolean;\n captureNetworkHeaders?: boolean;\n recordConsole?: boolean;\n consoleLevels?: ReplayConfig['consoleLevels'];\n bufferDuration: number;\n };\n private recording = false;\n private sessionId: string | null = null;\n private events: ReplayEvent[] = [];\n private trimTimer: ReturnType<typeof setInterval> | null = null;\n private flushFailures = 0;\n private disabled = false;\n private sessionStartTime: number = 0;\n private observer: MutationObserver | null = null;\n private mouseMoveBuffer: { x: number; y: number; t: number }[] = [];\n private mouseMoveFlushTimer: ReturnType<typeof setTimeout> | null = null;\n private cleanupFns: Array<() => void> = [];\n private networkRecorder: NetworkRecorder | null = null;\n private consoleRecorder: ConsoleRecorder | null = null;\n private lastSnapshotTime: number = 0;\n private snapshotCooldown: number = 500; // min ms between interaction snapshots\n private userContext: { id?: string } | null = null;\n private mutationBuffer: MutationData | null = null;\n private mutationFlushTimer: ReturnType<typeof setTimeout> | null = null;\n private lastScrollTime: number = 0;\n /** Most recent full snapshot, kept so we can prepend it to error replays */\n private latestSnapshot: ReplayEvent | null = null;\n\n constructor(config: ReplayConfig) {\n this.config = {\n endpoint: DEFAULT_ENDPOINT,\n enabled: true,\n maskInputs: true,\n maxSessionDuration: DEFAULT_MAX_SESSION_DURATION,\n flushInterval: 5000, // kept for compat but unused (no periodic flush)\n maxBatchSize: 100,\n sampleRate: 1.0,\n debug: false,\n bufferDuration: DEFAULT_BUFFER_DURATION,\n ...config,\n };\n }\n\n start(): boolean {\n if (typeof window === 'undefined' || typeof document === 'undefined' || typeof window.addEventListener !== 'function') return false;\n if (this.recording) return true;\n if (!this.config.enabled) return false;\n\n // Apply sample rate\n if (Math.random() > this.config.sampleRate) {\n this.log('Session not sampled');\n return false;\n }\n\n this.sessionId = this.getOrCreateSessionId();\n this.sessionStartTime = this.getOrCreateStartTime();\n this.recording = true;\n this.events = [];\n\n // Pre-fetch cross-origin stylesheets (async, non-blocking)\n this.prefetchCrossOriginStylesheets();\n\n // Take initial DOM snapshot\n const snapshot = takeSnapshot({\n maskInputs: this.config.maskInputs,\n blockSelector: this.config.blockSelector,\n maskSelector: this.config.maskSelector,\n });\n\n if (snapshot) {\n this.addEvent('snapshot', snapshot);\n }\n\n // Start recording\n this.setupMutationObserver();\n this.setupEventListeners();\n this.setupNetworkRecording();\n this.setupConsoleRecording();\n this.startTrimTimer();\n\n this.log('Recording started (rolling buffer mode):', this.sessionId);\n return true;\n }\n\n stop(): void {\n if (!this.recording) return;\n\n this.recording = false;\n\n // Cleanup\n if (this.observer) {\n this.observer.disconnect();\n this.observer = null;\n }\n\n if (this.trimTimer) {\n clearInterval(this.trimTimer);\n this.trimTimer = null;\n }\n\n if (this.mouseMoveFlushTimer) {\n clearTimeout(this.mouseMoveFlushTimer);\n this.mouseMoveFlushTimer = null;\n }\n\n if (this.mutationFlushTimer) {\n this.flushMutationBuffer();\n }\n\n if (this.networkRecorder) {\n this.networkRecorder.stop();\n this.networkRecorder = null;\n }\n\n if (this.consoleRecorder) {\n this.consoleRecorder.stop();\n this.consoleRecorder = null;\n }\n\n for (const cleanup of this.cleanupFns) {\n cleanup();\n }\n this.cleanupFns = [];\n\n cleanupStyleDefaults();\n this.log('Recording stopped:', this.sessionId);\n this.sessionId = null;\n }\n\n isRecording(): boolean {\n return this.recording;\n }\n\n getSessionId(): string | null {\n return this.sessionId;\n }\n\n setUser(user: { id?: string } | null): void {\n this.userContext = user;\n }\n\n /**\n * Flush the rolling buffer to the server. Called when an error is captured.\n * Sends the most recent snapshot + all buffered events from the last `bufferDuration` ms.\n * After flushing, the buffer is cleared and recording continues.\n */\n async flushOnError(): Promise<void> {\n if (!this.recording || !this.sessionId) return;\n if (this.disabled) return;\n\n // Flush any pending mutation buffer first\n this.flushMutationBuffer();\n\n // Build the events to send: latest snapshot + buffered events\n const eventsToSend: ReplayEvent[] = [];\n\n // Prepend the latest full snapshot so the replay is self-contained\n if (this.latestSnapshot) {\n eventsToSend.push(this.latestSnapshot);\n }\n\n // Add all buffered events (already trimmed to bufferDuration)\n eventsToSend.push(...this.events);\n\n if (eventsToSend.length === 0) return;\n\n // Clear the buffer after capturing — recording continues fresh\n this.events = [];\n this.latestSnapshot = null;\n\n // Take a fresh snapshot to start the next buffer period\n const newSnapshot = takeSnapshot({\n maskInputs: this.config.maskInputs,\n blockSelector: this.config.blockSelector,\n maskSelector: this.config.maskSelector,\n });\n if (newSnapshot) {\n this.addEvent('snapshot', newSnapshot);\n }\n\n const endpoint = this.config.replayEndpoint || `${this.config.endpoint}/api/replays`;\n\n try {\n const response = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-API-Key': this.config.apiKey,\n },\n body: JSON.stringify({\n sessionId: this.sessionId,\n events: eventsToSend,\n startedAt: new Date(this.sessionStartTime).toISOString(),\n pageUrl: typeof location !== 'undefined' && location ? location.href : undefined,\n pageTitle: typeof document !== 'undefined' ? document.title : undefined,\n userAgent: typeof navigator !== 'undefined' ? navigator.userAgent : undefined,\n userId: this.userContext?.id,\n trigger: 'error',\n }),\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}`);\n }\n\n this.flushFailures = 0;\n this.log(`Flushed ${eventsToSend.length} replay events (error-triggered)`);\n } catch (err) {\n this.flushFailures++;\n\n if (this.flushFailures >= MAX_FLUSH_FAILURES) {\n this.disabled = true;\n console.warn(\n `[SitePong Replay] Disabled after ${MAX_FLUSH_FAILURES} consecutive failures. ` +\n `Check that ${endpoint} is accessible and has proper CORS headers.`\n );\n return;\n }\n\n this.log(`Failed to flush replay events (attempt ${this.flushFailures}/${MAX_FLUSH_FAILURES}):`, err);\n }\n }\n\n /**\n * @deprecated Use flushOnError() instead. Kept for backward compatibility.\n */\n async flush(): Promise<void> {\n return this.flushOnError();\n }\n\n private addEvent(type: ReplayEvent['type'], data: unknown): void {\n if (!this.recording) return;\n\n // Check session duration\n if (Date.now() - this.sessionStartTime > this.config.maxSessionDuration) {\n this.stop();\n return;\n }\n\n const event: ReplayEvent = {\n type,\n timestamp: Date.now() - this.sessionStartTime,\n data,\n };\n\n // Track latest snapshot so we can always prepend it on flush\n if (type === 'snapshot') {\n this.latestSnapshot = event;\n }\n\n this.events.push(event);\n }\n\n /**\n * Trim events older than bufferDuration from the rolling buffer.\n * Always keeps at least the most recent snapshot.\n */\n private trimBuffer(): void {\n if (this.events.length === 0) return;\n\n const now = Date.now() - this.sessionStartTime;\n const cutoff = now - this.config.bufferDuration;\n\n // Find the first event that's within the buffer window\n let trimIndex = 0;\n for (let i = 0; i < this.events.length; i++) {\n if (this.events[i].timestamp >= cutoff) {\n trimIndex = i;\n break;\n }\n // Track the latest snapshot we're about to trim past\n if (this.events[i].type === 'snapshot') {\n this.latestSnapshot = this.events[i];\n }\n trimIndex = i + 1;\n }\n\n if (trimIndex > 0) {\n this.events = this.events.slice(trimIndex);\n }\n }\n\n private flushMutationBuffer(): void {\n if (this.mutationBuffer &&\n (this.mutationBuffer.adds.length || this.mutationBuffer.removes.length ||\n this.mutationBuffer.attributes.length || this.mutationBuffer.texts.length)) {\n this.addEvent('mutation', this.mutationBuffer);\n }\n this.mutationBuffer = null;\n if (this.mutationFlushTimer) {\n clearTimeout(this.mutationFlushTimer);\n }\n this.mutationFlushTimer = null;\n }\n\n private setupMutationObserver(): void {\n if (typeof MutationObserver === 'undefined') return;\n\n this.observer = new MutationObserver((mutations) => {\n // Buffer mutations and flush every 100ms to avoid flooding from\n // continuous DOM changes (marquees, animations, React re-renders)\n if (!this.mutationBuffer) {\n this.mutationBuffer = { adds: [], removes: [], attributes: [], texts: [] };\n }\n\n for (const mutation of mutations) {\n switch (mutation.type) {\n case 'childList': {\n for (const node of Array.from(mutation.addedNodes)) {\n const serialized = serializeNode(node, {\n maskInputs: this.config.maskInputs,\n blockSelector: this.config.blockSelector,\n maskSelector: this.config.maskSelector,\n });\n if (serialized) {\n this.mutationBuffer.adds.push({\n parentId: getNodeId(mutation.target),\n nextId: mutation.nextSibling ? getNodeId(mutation.nextSibling) : null,\n node: serialized,\n });\n }\n }\n for (const node of Array.from(mutation.removedNodes)) {\n this.mutationBuffer.removes.push({\n parentId: getNodeId(mutation.target),\n id: getNodeId(node),\n });\n }\n break;\n }\n case 'attributes': {\n const el = mutation.target as Element;\n const attrName = mutation.attributeName || '';\n const value = el.getAttribute(attrName);\n const attrs: Record<string, string | null> = { [attrName]: value };\n\n // Re-capture _cssText when style/link attributes change\n const elTag = el.tagName?.toLowerCase();\n if (\n elTag === 'style' ||\n (elTag === 'link' && el.getAttribute('rel') === 'stylesheet')\n ) {\n const cssText = buildCssTextForNode(el);\n if (cssText) {\n attrs['_cssText'] = cssText;\n }\n }\n\n // Re-capture computed styles when class or style attributes change\n if (attrName === 'class' || attrName === 'style') {\n const computedStyle = captureComputedStyle(el);\n if (computedStyle) {\n attrs['_computedStyle'] = computedStyle;\n }\n }\n\n this.mutationBuffer.attributes.push({\n id: getNodeId(mutation.target),\n attributes: attrs,\n });\n break;\n }\n case 'characterData': {\n let textValue = mutation.target.textContent || '';\n const parent = mutation.target.parentElement;\n if (parent && this.config.maskSelector && parent.matches(this.config.maskSelector)) {\n textValue = textValue.replace(/\\S/g, '*');\n }\n this.mutationBuffer.texts.push({\n id: getNodeId(mutation.target),\n value: textValue,\n });\n\n // Re-capture _cssText when <style> text content changes\n if (parent && parent.tagName?.toLowerCase() === 'style') {\n const cssText = buildCssTextForNode(parent);\n if (cssText) {\n this.mutationBuffer.attributes.push({\n id: getNodeId(parent),\n attributes: { '_cssText': cssText },\n });\n }\n }\n break;\n }\n }\n }\n\n if (!this.mutationFlushTimer) {\n this.mutationFlushTimer = setTimeout(() => this.flushMutationBuffer(), 1000);\n }\n });\n\n this.observer.observe(document.documentElement, {\n childList: true,\n subtree: true,\n attributes: true,\n characterData: true,\n attributeOldValue: false,\n });\n }\n\n private setupEventListeners(): void {\n // Mouse move (throttled)\n const onMouseMove = (e: MouseEvent) => {\n this.mouseMoveBuffer.push({\n x: e.clientX,\n y: e.clientY,\n t: Date.now() - this.sessionStartTime,\n });\n\n if (!this.mouseMoveFlushTimer) {\n this.mouseMoveFlushTimer = setTimeout(() => {\n if (this.mouseMoveBuffer.length > 0) {\n const data: MouseMoveData = { positions: [...this.mouseMoveBuffer] };\n this.addEvent('mouse_move', data);\n this.mouseMoveBuffer = [];\n }\n this.mouseMoveFlushTimer = null;\n }, 1000);\n }\n };\n\n // Mouse click (left)\n const onClick = (e: MouseEvent) => {\n const target = e.target as Node;\n this.addEvent('mouse_click', {\n x: e.clientX,\n y: e.clientY,\n targetId: getNodeId(target),\n button: e.button,\n });\n this.takeInteractionSnapshot();\n };\n\n // Right-click (contextmenu)\n const onContextMenu = (e: MouseEvent) => {\n const target = e.target as Node;\n this.addEvent('mouse_click', {\n x: e.clientX,\n y: e.clientY,\n targetId: getNodeId(target),\n button: 2,\n });\n this.takeInteractionSnapshot();\n };\n\n // Mouse leaving the page\n const onMouseLeave = () => {\n this.addEvent('mouse_leave', {});\n };\n\n // Touch events (taps)\n const onTouchStart = (e: TouchEvent) => {\n const touch = e.touches[0];\n if (!touch) return;\n const target = e.target as Node;\n this.addEvent('touch', {\n x: touch.clientX,\n y: touch.clientY,\n targetId: getNodeId(target),\n });\n this.takeInteractionSnapshot();\n };\n\n // Scroll (debounced - only record final position)\n let scrollTimer: ReturnType<typeof setTimeout> | null = null;\n const onScroll = () => {\n if (scrollTimer) clearTimeout(scrollTimer);\n scrollTimer = setTimeout(() => {\n const data: ScrollData = {\n id: 0,\n x: window.scrollX,\n y: window.scrollY,\n };\n this.addEvent('scroll', data);\n this.takeInteractionSnapshot();\n }, 1000);\n };\n\n // Input changes\n const onInput = (e: Event) => {\n const target = e.target as HTMLInputElement | HTMLTextAreaElement;\n if (!target) return;\n\n const data: InputData = {\n id: getNodeId(target),\n value: this.config.maskInputs ? '***' : target.value,\n };\n\n if ('checked' in target) {\n data.isChecked = (target as HTMLInputElement).checked;\n }\n\n this.addEvent('input', data);\n };\n\n // Window resize\n const onResize = () => {\n this.addEvent('resize', {\n width: window.innerWidth,\n height: window.innerHeight,\n });\n };\n\n // Focus/blur\n const onFocus = (e: FocusEvent) => {\n if (e.target && e.target !== document) {\n this.addEvent('focus', { id: getNodeId(e.target as Node) });\n }\n };\n\n const onBlur = (e: FocusEvent) => {\n if (e.target && e.target !== document) {\n this.addEvent('blur', { id: getNodeId(e.target as Node) });\n }\n };\n\n // Add listeners\n document.addEventListener('mousemove', onMouseMove, { passive: true });\n document.addEventListener('click', onClick, { passive: true });\n document.addEventListener('contextmenu', onContextMenu, { passive: true });\n document.documentElement.addEventListener('mouseleave', onMouseLeave, { passive: true });\n document.addEventListener('touchstart', onTouchStart, { passive: true });\n window.addEventListener('scroll', onScroll, { passive: true });\n document.addEventListener('input', onInput, { passive: true });\n window.addEventListener('resize', onResize, { passive: true });\n document.addEventListener('focus', onFocus, { passive: true, capture: true });\n document.addEventListener('blur', onBlur, { passive: true, capture: true });\n\n // Store cleanup functions\n this.cleanupFns.push(\n () => document.removeEventListener('mousemove', onMouseMove),\n () => document.removeEventListener('click', onClick),\n () => document.removeEventListener('contextmenu', onContextMenu),\n () => document.documentElement.removeEventListener('mouseleave', onMouseLeave),\n () => document.removeEventListener('touchstart', onTouchStart),\n () => window.removeEventListener('scroll', onScroll),\n () => document.removeEventListener('input', onInput),\n () => window.removeEventListener('resize', onResize),\n () => document.removeEventListener('focus', onFocus, { capture: true } as EventListenerOptions),\n () => document.removeEventListener('blur', onBlur, { capture: true } as EventListenerOptions),\n );\n }\n\n private setupNetworkRecording(): void {\n if (!this.config.recordNetwork) return;\n\n const sdkEndpoint = this.config.replayEndpoint || this.config.endpoint;\n this.networkRecorder = new NetworkRecorder(\n (event) => {\n this.addEvent('network', event.data);\n },\n {\n captureHeaders: this.config.captureNetworkHeaders,\n // Skip recording our own SDK API calls\n urlFilter: (url) => !url.startsWith(sdkEndpoint),\n }\n );\n\n this.networkRecorder.start();\n }\n\n private setupConsoleRecording(): void {\n if (!this.config.recordConsole) return;\n\n this.consoleRecorder = new ConsoleRecorder(\n (event) => {\n this.addEvent('console', event.data);\n },\n {\n levels: this.config.consoleLevels,\n }\n );\n\n this.consoleRecorder.start();\n }\n\n /**\n * Start the buffer trim timer. Periodically removes events older\n * than bufferDuration to keep memory bounded.\n */\n private startTrimTimer(): void {\n this.trimTimer = setInterval(() => {\n this.trimBuffer();\n }, TRIM_INTERVAL);\n }\n\n private takeInteractionSnapshot(): void {\n const now = Date.now();\n if (now - this.lastSnapshotTime < this.snapshotCooldown) return;\n this.lastSnapshotTime = now;\n\n const snapshot = takeSnapshot({\n maskInputs: this.config.maskInputs,\n blockSelector: this.config.blockSelector,\n maskSelector: this.config.maskSelector,\n });\n if (snapshot) {\n this.addEvent('snapshot', snapshot);\n }\n }\n\n private getOrCreateSessionId(): string {\n const storageKey = '__sp_replay_session';\n try {\n const existing = sessionStorage.getItem(storageKey);\n if (existing) return existing;\n } catch { /* ignored */ }\n const id = `rep_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 10)}`;\n try { sessionStorage.setItem(storageKey, id); } catch { /* ignored */ }\n return id;\n }\n\n private getOrCreateStartTime(): number {\n const storageKey = '__sp_replay_start';\n try {\n const existing = sessionStorage.getItem(storageKey);\n if (existing) return parseInt(existing, 10);\n } catch { /* ignored */ }\n const now = Date.now();\n try { sessionStorage.setItem(storageKey, String(now)); } catch { /* ignored */ }\n return now;\n }\n\n private prefetchCrossOriginStylesheets(): void {\n if (typeof document === 'undefined') return;\n const links = document.querySelectorAll('link[rel=\"stylesheet\"]');\n for (const link of Array.from(links)) {\n const linkEl = link as HTMLLinkElement;\n if (linkEl.href && linkEl.sheet) {\n // Try to read rules — if it throws, it's cross-origin\n try {\n linkEl.sheet.cssRules;\n } catch {\n // SecurityError: cross-origin, try to fetch\n fetchCrossOriginStylesheet(linkEl.href).catch(() => {});\n }\n }\n }\n }\n\n private log(...args: unknown[]): void {\n if (this.config.debug) {\n console.log('[SitePong Replay]', ...args);\n }\n }\n}\n","/**\n * Tampering Detection Module\n * Detects browser, canvas, WebGL spoofing, VM usage, and request tampering.\n */\n\nexport interface TamperingResult {\n browserTampered: boolean;\n canvasTampered: boolean;\n webglTampered: boolean;\n vmDetected: boolean;\n geolocationSpoofed: boolean;\n mitmDetected: boolean;\n confidence: number;\n signals: TamperingSignals;\n}\n\nexport interface TamperingSignals {\n uaSpoofed: boolean;\n antiDetectBrowser: boolean;\n canvasNoise: boolean;\n canvasBlocked: boolean;\n webglSpoofed: boolean;\n webglBlocked: boolean;\n vmIndicators: string[];\n platformMismatch: boolean;\n pluginAnomaly: boolean;\n featureAnomaly: boolean;\n geolocationSpoofed: boolean;\n mitmIndicators: string[];\n}\n\n/**\n * Run all tampering detection checks\n */\nexport function detectTampering(): TamperingResult {\n const signals: TamperingSignals = {\n uaSpoofed: false,\n antiDetectBrowser: false,\n canvasNoise: false,\n canvasBlocked: false,\n webglSpoofed: false,\n webglBlocked: false,\n vmIndicators: [],\n platformMismatch: false,\n pluginAnomaly: false,\n featureAnomaly: false,\n geolocationSpoofed: false,\n mitmIndicators: [],\n };\n\n let confidence = 0;\n\n // Browser tampering\n const browserResult = detectBrowserTampering(signals);\n confidence += browserResult;\n\n // Canvas tampering\n const canvasResult = detectCanvasTampering(signals);\n confidence += canvasResult;\n\n // WebGL tampering\n const webglResult = detectWebGLTampering(signals);\n confidence += webglResult;\n\n // VM detection\n const vmResult = detectVM(signals);\n confidence += vmResult;\n\n // Geolocation spoofing\n const geoResult = detectGeolocationSpoofing(signals);\n confidence += geoResult;\n\n // MitM detection\n const mitmResult = detectMitM(signals);\n confidence += mitmResult;\n\n confidence = Math.min(confidence, 1);\n\n return {\n browserTampered: signals.uaSpoofed || signals.antiDetectBrowser || signals.platformMismatch,\n canvasTampered: signals.canvasNoise || signals.canvasBlocked,\n webglTampered: signals.webglSpoofed || signals.webglBlocked,\n vmDetected: signals.vmIndicators.length >= 2,\n geolocationSpoofed: signals.geolocationSpoofed,\n mitmDetected: signals.mitmIndicators.length >= 1,\n confidence,\n signals,\n };\n}\n\n/**\n * Detect user agent / browser fingerprint spoofing\n */\nfunction detectBrowserTampering(signals: TamperingSignals): number {\n if (typeof navigator === 'undefined' || typeof window === 'undefined') return 0;\n\n let score = 0;\n const ua = navigator.userAgent;\n const platform = (navigator as { platform?: string }).platform || '';\n\n // Check 1: Platform vs UA mismatch\n const isWindowsUA = /Windows/.test(ua);\n const isMacUA = /Mac/.test(ua);\n const isLinuxUA = /Linux/.test(ua) && !/Android/.test(ua);\n const isWindowsPlatform = /Win/.test(platform);\n const isMacPlatform = /Mac/.test(platform);\n const isLinuxPlatform = /Linux/.test(platform);\n\n if ((isWindowsUA && !isWindowsPlatform) ||\n (isMacUA && !isMacPlatform) ||\n (isLinuxUA && !isLinuxPlatform)) {\n signals.platformMismatch = true;\n signals.uaSpoofed = true;\n score += 0.3;\n }\n\n // Check 2: Chrome-specific feature detection vs UA claim\n const claimsChrome = /Chrome\\/\\d+/.test(ua) && !/Edge|OPR|Brave/.test(ua);\n if (claimsChrome) {\n // Chrome should have these properties\n const hasChromiumFeatures = 'chrome' in window ||\n 'CSS' in window && 'paintWorklet' in (window as { CSS?: { paintWorklet?: unknown } }).CSS!;\n if (!hasChromiumFeatures && !('brave' in navigator)) {\n signals.uaSpoofed = true;\n score += 0.2;\n }\n }\n\n // Check 3: Firefox feature detection vs UA claim\n const claimsFirefox = /Firefox\\/\\d+/.test(ua) && !/Seamonkey/.test(ua);\n if (claimsFirefox) {\n // Firefox has InstallTrigger\n const hasFirefoxFeatures = 'InstallTrigger' in window ||\n CSS.supports('-moz-appearance', 'none');\n if (!hasFirefoxFeatures) {\n signals.uaSpoofed = true;\n score += 0.2;\n }\n }\n\n // Check 4: Anti-detect browser patterns (Multilogin, GoLogin, Dolphin)\n // These often have inconsistencies in navigator properties\n const nav = navigator as Navigator & {\n userAgentData?: { brands?: Array<{ brand: string }> };\n getBattery?: () => Promise<unknown>;\n };\n\n if (nav.userAgentData?.brands) {\n const brands = nav.userAgentData.brands.map(b => b.brand);\n // Anti-detect browsers sometimes have empty or unusual brand lists\n if (brands.length === 0 || brands.every(b => b === '' || b === 'Not A;Brand')) {\n signals.antiDetectBrowser = true;\n score += 0.25;\n }\n }\n\n // Check 5: Plugin anomalies\n // Real browsers on desktop typically have at least some plugins\n if (!(/mobile|android|iphone|ipad/i.test(ua))) {\n const pluginCount = navigator.plugins?.length || 0;\n if (pluginCount === 0 && claimsChrome) {\n signals.pluginAnomaly = true;\n score += 0.1;\n }\n }\n\n // Check 6: Feature detection anomalies\n // Check if reported hardware matches expected capabilities\n const cores = navigator.hardwareConcurrency || 0;\n const memory = (navigator as { deviceMemory?: number }).deviceMemory || 0;\n if (cores > 0 && memory > 0) {\n // Extremely unusual: high core count with very low memory\n if (cores >= 16 && memory <= 1) {\n signals.featureAnomaly = true;\n score += 0.15;\n }\n }\n\n return Math.min(score, 0.5);\n}\n\n/**\n * Detect canvas fingerprint spoofing/noise injection\n */\nfunction detectCanvasTampering(signals: TamperingSignals): number {\n if (typeof document === 'undefined') return 0;\n\n let score = 0;\n\n try {\n const canvas = document.createElement('canvas');\n canvas.width = 100;\n canvas.height = 20;\n const ctx = canvas.getContext('2d');\n\n if (!ctx) {\n signals.canvasBlocked = true;\n return 0.1;\n }\n\n // Method 1: Draw the same thing twice and compare\n // Noise injectors add random noise, so two identical draws will differ\n ctx.fillStyle = '#ff0000';\n ctx.fillRect(0, 0, 100, 20);\n ctx.fillStyle = '#00ff00';\n ctx.font = '12px Arial';\n ctx.fillText('SitePong', 5, 14);\n const draw1 = canvas.toDataURL();\n\n // Clear and redraw exactly the same\n ctx.clearRect(0, 0, 100, 20);\n ctx.fillStyle = '#ff0000';\n ctx.fillRect(0, 0, 100, 20);\n ctx.fillStyle = '#00ff00';\n ctx.font = '12px Arial';\n ctx.fillText('SitePong', 5, 14);\n const draw2 = canvas.toDataURL();\n\n if (draw1 !== draw2) {\n signals.canvasNoise = true;\n score += 0.35;\n }\n\n // Method 2: Check for known canvas blocker behavior\n // Some blockers return a blank canvas or fixed hash\n const imageData = ctx.getImageData(0, 0, 100, 20);\n const pixels = imageData.data;\n let allZero = true;\n let allSame = true;\n const firstPixel = pixels[0];\n for (let i = 0; i < pixels.length; i += 4) {\n if (pixels[i] !== 0 || pixels[i + 1] !== 0 || pixels[i + 2] !== 0) {\n allZero = false;\n }\n if (pixels[i] !== firstPixel) {\n allSame = false;\n }\n }\n\n if (allZero || allSame) {\n signals.canvasBlocked = true;\n score += 0.2;\n }\n\n // Method 3: Check if toDataURL is overridden\n const toDataURLDesc = Object.getOwnPropertyDescriptor(\n HTMLCanvasElement.prototype, 'toDataURL'\n );\n if (toDataURLDesc && toDataURLDesc.value !== HTMLCanvasElement.prototype.toDataURL) {\n signals.canvasNoise = true;\n score += 0.3;\n }\n } catch {\n signals.canvasBlocked = true;\n score += 0.1;\n }\n\n return Math.min(score, 0.4);\n}\n\n/**\n * Detect WebGL fingerprint spoofing\n */\nfunction detectWebGLTampering(signals: TamperingSignals): number {\n if (typeof document === 'undefined') return 0;\n\n let score = 0;\n\n try {\n const canvas = document.createElement('canvas');\n const gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl');\n\n if (!gl || !(gl instanceof WebGLRenderingContext)) {\n signals.webglBlocked = true;\n return 0.1;\n }\n\n const debugInfo = gl.getExtension('WEBGL_debug_renderer_info');\n if (!debugInfo) {\n signals.webglBlocked = true;\n return 0.1;\n }\n\n const vendor = gl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL) as string;\n const renderer = gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL) as string;\n\n // Check 1: Known spoofed/generic values\n const spoofedVendors = ['Brian Paul', 'Mesa', 'VMware'];\n const spoofedRenderers = ['llvmpipe', 'softpipe', 'Mesa', 'SwiftShader'];\n\n // Note: SwiftShader is legitimate in some contexts but often indicates spoofing\n if (spoofedRenderers.some(s => renderer.includes(s)) &&\n !spoofedVendors.some(v => vendor.includes(v))) {\n signals.webglSpoofed = true;\n score += 0.25;\n }\n\n // Check 2: Renderer vs platform mismatch\n const ua = navigator.userAgent;\n const isMobile = /mobile|android|iphone|ipad/i.test(ua);\n const isDesktopGPU = /GeForce|Radeon|Intel.*HD|GTX|RTX|Vega/i.test(renderer);\n\n if (isMobile && isDesktopGPU) {\n signals.webglSpoofed = true;\n score += 0.3;\n }\n\n // Check 3: Check if getParameter is overridden\n const getParamDesc = Object.getOwnPropertyDescriptor(\n WebGLRenderingContext.prototype, 'getParameter'\n );\n if (getParamDesc && typeof getParamDesc.value === 'function') {\n // Check if it's a native function\n const fnStr = getParamDesc.value.toString();\n if (!fnStr.includes('[native code]')) {\n signals.webglSpoofed = true;\n score += 0.35;\n }\n }\n\n // Check 4: Extensions consistency\n const extensions = gl.getSupportedExtensions() || [];\n // Desktop GPUs should support many extensions; very few suggests blocking\n if (extensions.length < 5 && isDesktopGPU) {\n signals.webglSpoofed = true;\n score += 0.1;\n }\n } catch {\n signals.webglBlocked = true;\n score += 0.1;\n }\n\n return Math.min(score, 0.4);\n}\n\n/**\n * Detect virtual machine environment\n */\nfunction detectVM(signals: TamperingSignals): number {\n if (typeof navigator === 'undefined' || typeof window === 'undefined') return 0;\n\n const indicators: string[] = [];\n const ua = navigator.userAgent;\n\n // Check 1: WebGL renderer often reveals VM\n try {\n const canvas = document.createElement('canvas');\n const gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl');\n if (gl && gl instanceof WebGLRenderingContext) {\n const debugInfo = gl.getExtension('WEBGL_debug_renderer_info');\n if (debugInfo) {\n const renderer = (gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL) as string).toLowerCase();\n const vendor = (gl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL) as string).toLowerCase();\n\n const vmRenderers = ['vmware', 'virtualbox', 'hyper-v', 'parallels', 'qemu', 'llvmpipe', 'mesa'];\n const vmVendors = ['vmware', 'innotek', 'microsoft basic', 'parallels'];\n\n for (const vm of vmRenderers) {\n if (renderer.includes(vm)) {\n indicators.push(`webgl_renderer:${vm}`);\n }\n }\n for (const vm of vmVendors) {\n if (vendor.includes(vm)) {\n indicators.push(`webgl_vendor:${vm}`);\n }\n }\n }\n }\n } catch {\n // WebGL not available\n }\n\n // Check 2: Screen resolution commonly used by VMs\n if (typeof screen !== 'undefined') {\n const w = screen.width;\n const h = screen.height;\n const vmResolutions = [\n [800, 600], [1024, 768], [1280, 800],\n ];\n if (vmResolutions.some(([vw, vh]) => w === vw && h === vh) &&\n screen.colorDepth === 24 &&\n navigator.hardwareConcurrency <= 2) {\n indicators.push('vm_resolution');\n }\n }\n\n // Check 3: Low hardware specs suggesting VM\n const cores = navigator.hardwareConcurrency || 0;\n const memory = (navigator as { deviceMemory?: number }).deviceMemory || 0;\n if (cores > 0 && cores <= 2 && memory > 0 && memory <= 2) {\n // Very low specs with desktop UA suggests VM\n if (!(/mobile|android|iphone/i.test(ua))) {\n indicators.push('low_hw_specs');\n }\n }\n\n // Check 4: Battery API - VMs often report no battery\n if ('getBattery' in navigator) {\n // Presence of battery API but no battery (desktop without battery = likely VM)\n // We can't async here, so just note the capability\n }\n\n // Check 5: Timing-based detection\n // VMs often have less precise timing\n if (typeof performance !== 'undefined') {\n const times: number[] = [];\n for (let i = 0; i < 10; i++) {\n times.push(performance.now());\n }\n // Check if timing precision is suspiciously low (coarsened by VM)\n const uniqueTimes = new Set(times.map(t => Math.floor(t * 1000)));\n if (uniqueTimes.size <= 3 && times.length === 10) {\n indicators.push('coarse_timing');\n }\n }\n\n // Check 6: Cloud VM detection via connection characteristics\n if (typeof navigator !== 'undefined') {\n const connection = (navigator as Navigator & { connection?: { downlink?: number; rtt?: number } }).connection;\n if (connection) {\n // Cloud VMs often have very high bandwidth and very low RTT\n if (connection.downlink && connection.downlink >= 10 &&\n connection.rtt && connection.rtt <= 5) {\n indicators.push('cloud_vm_network');\n }\n }\n }\n\n signals.vmIndicators = indicators;\n\n // Score based on number of indicators\n const vmScore = Math.min(indicators.length * 0.15, 0.5);\n return vmScore;\n}\n\n/**\n * Detect geolocation spoofing (fake GPS apps, location overrides)\n */\nfunction detectGeolocationSpoofing(signals: TamperingSignals): number {\n if (typeof navigator === 'undefined') return 0;\n\n let score = 0;\n\n // Check 1: Geolocation API override detection\n if ('geolocation' in navigator) {\n const geoDesc = Object.getOwnPropertyDescriptor(navigator, 'geolocation');\n if (geoDesc && geoDesc.configurable === false && geoDesc.get) {\n // If geolocation getter has been overridden\n const fnStr = geoDesc.get.toString();\n if (!fnStr.includes('[native code]')) {\n signals.geolocationSpoofed = true;\n score += 0.3;\n }\n }\n\n // Check if getCurrentPosition is overridden\n try {\n const getCurrentPositionDesc = Object.getOwnPropertyDescriptor(\n Geolocation.prototype, 'getCurrentPosition'\n );\n if (getCurrentPositionDesc?.value) {\n const fnStr = getCurrentPositionDesc.value.toString();\n if (!fnStr.includes('[native code]')) {\n signals.geolocationSpoofed = true;\n score += 0.3;\n }\n }\n } catch {\n // Can't check\n }\n }\n\n // Check 2: Check for mock location indicators in DevTools override\n // Chrome's sensor emulation sets a specific flag we can detect indirectly\n if (typeof window !== 'undefined') {\n try {\n // DevTools override often leaves __defineGetter__ traces\n const navProto = Object.getPrototypeOf(navigator);\n const geoGetter = Object.getOwnPropertyDescriptor(navProto, 'geolocation');\n if (geoGetter && geoGetter.get && !geoGetter.get.toString().includes('[native code]')) {\n signals.geolocationSpoofed = true;\n score += 0.2;\n }\n } catch {\n // Can't access\n }\n }\n\n return Math.min(score, 0.4);\n}\n\n/**\n * Detect Man-in-the-Middle attacks (request interception, SSL anomalies)\n */\nfunction detectMitM(signals: TamperingSignals): number {\n if (typeof window === 'undefined' || typeof document === 'undefined') return 0;\n\n const indicators: string[] = [];\n\n // Check 1: Mixed content detection\n // If we're on HTTPS but resources load over HTTP, something is intercepting\n if (window.location?.protocol === 'https:') {\n // Check if any injected scripts are loading over HTTP\n const scripts = document.querySelectorAll('script[src]');\n for (let i = 0; i < scripts.length; i++) {\n const src = scripts[i].getAttribute('src') || '';\n if (src.startsWith('http://') && !src.includes('localhost')) {\n indicators.push('mixed_content_script');\n break;\n }\n }\n }\n\n // Check 2: Unexpected iframes (common in proxy/MitM injections)\n const iframes = document.querySelectorAll('iframe');\n for (let i = 0; i < iframes.length; i++) {\n const src = iframes[i].getAttribute('src') || '';\n if (src && !src.startsWith(window.location?.origin || '') && !src.startsWith('about:') && !src.startsWith('javascript:')) {\n // Check if it's invisible (hidden injection)\n const style = window.getComputedStyle(iframes[i]);\n if (style.display === 'none' || style.visibility === 'hidden' ||\n parseInt(style.width) <= 1 || parseInt(style.height) <= 1) {\n indicators.push('hidden_iframe');\n }\n }\n }\n\n // Check 3: Service Worker hijacking\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.getRegistrations().then(registrations => {\n for (const reg of registrations) {\n const swUrl = reg.active?.scriptURL || '';\n if (swUrl && !swUrl.startsWith(window.location?.origin || '')) {\n indicators.push('foreign_service_worker');\n }\n }\n }).catch(() => { /* Can't check */ });\n }\n\n // Check 4: Proxy detection via performance timing\n if (typeof performance !== 'undefined' && performance.getEntriesByType) {\n try {\n const nav = performance.getEntriesByType('navigation')[0] as PerformanceNavigationTiming;\n if (nav) {\n // Extremely high connect time can indicate proxy\n const connectTime = nav.connectEnd - nav.connectStart;\n const tlsTime = nav.requestStart - nav.secureConnectionStart;\n if (connectTime > 1000 && tlsTime > 500) {\n indicators.push('slow_tls_handshake');\n }\n }\n } catch {\n // Performance API not available\n }\n }\n\n // Check 5: Certificate transparency check (indirect)\n // If the page loaded successfully over HTTPS but connection info shows anomalies\n if (window.location?.protocol === 'https:' && typeof performance !== 'undefined') {\n try {\n const resources = performance.getEntriesByType('resource') as PerformanceResourceTiming[];\n for (const resource of resources.slice(0, 20)) {\n // Resources with 0 transfer size but positive encoded size indicate interception\n if (resource.transferSize === 0 && resource.encodedBodySize > 0 && !resource.name.includes('cache')) {\n indicators.push('intercepted_resource');\n break;\n }\n }\n } catch {\n // Can't check\n }\n }\n\n signals.mitmIndicators = indicators;\n\n return Math.min(indicators.length * 0.2, 0.5);\n}\n","/**\n * Signal Collection\n * Collects device signals for fingerprinting and fraud detection\n */\n\nimport type { CoreSignals, ExtendedSignals, DeviceSignals, SmartSignals, StableFingerprint } from './types';\nimport { detectTampering } from './tampering';\n\nexport function collectCoreSignals(): CoreSignals {\n return {\n userAgent: typeof navigator !== 'undefined' ? navigator.userAgent : '',\n language: typeof navigator !== 'undefined' ? navigator.language : '',\n languages: typeof navigator !== 'undefined' ? Array.from(navigator.languages || []) : [],\n platform: typeof navigator !== 'undefined' ? (navigator as { platform?: string }).platform || '' : '',\n screenWidth: typeof screen !== 'undefined' ? screen.width : 0,\n screenHeight: typeof screen !== 'undefined' ? screen.height : 0,\n screenColorDepth: typeof screen !== 'undefined' ? screen.colorDepth : 0,\n devicePixelRatio: typeof window !== 'undefined' ? window.devicePixelRatio || 1 : 1,\n timezoneOffset: new Date().getTimezoneOffset(),\n timezone: Intl?.DateTimeFormat?.()?.resolvedOptions?.()?.timeZone || '',\n sessionStorage: hasSessionStorage(),\n localStorage: hasLocalStorage(),\n indexedDB: typeof indexedDB !== 'undefined',\n cookieEnabled: typeof navigator !== 'undefined' ? navigator.cookieEnabled : false,\n hardwareConcurrency: typeof navigator !== 'undefined' ? navigator.hardwareConcurrency || 0 : 0,\n maxTouchPoints: typeof navigator !== 'undefined' ? navigator.maxTouchPoints || 0 : 0,\n deviceMemory: typeof navigator !== 'undefined' ? (navigator as { deviceMemory?: number }).deviceMemory : undefined,\n };\n}\n\nexport async function collectExtendedSignals(): Promise<ExtendedSignals> {\n const signals: ExtendedSignals = {};\n\n signals.canvasFingerprint = getCanvasFingerprint();\n const webgl = getWebGLInfo();\n signals.webglVendor = webgl.vendor;\n signals.webglRenderer = webgl.renderer;\n signals.audioFingerprint = await getAudioFingerprint();\n signals.fontFingerprint = getFontFingerprint();\n signals.mathFingerprint = getMathFingerprint();\n signals.webglRenderHash = getWebGLRenderHash();\n signals.cssFeatureHash = getCssFeatureHash();\n signals.localIps = await getLocalIps();\n\n return signals;\n}\n\nexport async function collectDeviceSignals(includeExtended: boolean): Promise<DeviceSignals> {\n const core = collectCoreSignals();\n const signals: DeviceSignals = { ...core };\n\n if (includeExtended) {\n signals.extended = await collectExtendedSignals();\n }\n\n const smart = collectSmartSignals();\n signals.smart = smart;\n // Keep deprecated fields for backward compat\n signals.incognito = smart.incognito;\n signals.bot = smart.bot;\n\n return signals;\n}\n\nexport async function getStableFingerprint(signals: DeviceSignals): Promise<StableFingerprint> {\n const stable: StableFingerprint = {\n userAgent: signals.userAgent,\n language: signals.language,\n languages: signals.languages,\n platform: signals.platform,\n screenWidth: signals.screenWidth,\n screenHeight: signals.screenHeight,\n screenColorDepth: signals.screenColorDepth,\n devicePixelRatio: signals.devicePixelRatio,\n timezoneOffset: signals.timezoneOffset,\n timezone: signals.timezone,\n hardwareConcurrency: signals.hardwareConcurrency,\n maxTouchPoints: signals.maxTouchPoints,\n deviceMemory: signals.deviceMemory,\n };\n\n if (signals.extended) {\n stable.canvasFingerprint = signals.extended.canvasFingerprint;\n stable.webglVendor = signals.extended.webglVendor;\n stable.webglRenderer = signals.extended.webglRenderer;\n stable.audioFingerprint = signals.extended.audioFingerprint;\n stable.fontFingerprint = signals.extended.fontFingerprint;\n stable.mathFingerprint = signals.extended.mathFingerprint;\n stable.webglRenderHash = signals.extended.webglRenderHash;\n stable.cssFeatureHash = signals.extended.cssFeatureHash;\n stable.localIps = signals.extended.localIps;\n }\n\n return stable;\n}\n\nexport function collectSmartSignals(): SmartSignals {\n const signals: SmartSignals = {};\n\n signals.incognito = detectIncognito();\n signals.bot = detectBot();\n signals.privacyBrowser = detectPrivacyBrowser();\n signals.devToolsOpen = detectDevTools();\n signals.connectionType = getConnectionType();\n signals.doNotTrack = getDoNotTrack();\n signals.notificationsEnabled = getNotificationsPermission();\n\n // Device age tracking\n const deviceAge = getDeviceAge();\n signals.deviceFirstSeen = deviceAge.firstSeen;\n signals.deviceVisitCount = deviceAge.visitCount;\n\n // Tampering detection\n const tampering = detectTampering();\n signals.browserTampered = tampering.browserTampered;\n signals.canvasTampered = tampering.canvasTampered;\n signals.webglTampered = tampering.webglTampered;\n signals.vmDetected = tampering.vmDetected;\n signals.vmIndicators = tampering.signals.vmIndicators;\n\n return signals;\n}\n\nfunction hasSessionStorage(): boolean {\n try {\n const key = '__sp_test__';\n sessionStorage.setItem(key, '1');\n sessionStorage.removeItem(key);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction hasLocalStorage(): boolean {\n try {\n const key = '__sp_test__';\n localStorage.setItem(key, '1');\n localStorage.removeItem(key);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction getCanvasFingerprint(): string | undefined {\n if (typeof document === 'undefined') return undefined;\n\n try {\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n if (!ctx) return undefined;\n\n canvas.width = 200;\n canvas.height = 50;\n\n ctx.textBaseline = 'top';\n ctx.font = '14px Arial';\n ctx.fillStyle = '#f60';\n ctx.fillRect(0, 0, 200, 50);\n ctx.fillStyle = '#069';\n ctx.fillText('SitePong fingerprint', 2, 15);\n ctx.fillStyle = 'rgba(102, 204, 0, 0.7)';\n ctx.fillText('SitePong fingerprint', 4, 17);\n\n return hashString(canvas.toDataURL());\n } catch {\n return undefined;\n }\n}\n\nfunction getWebGLInfo(): { vendor?: string; renderer?: string } {\n if (typeof document === 'undefined') return {};\n\n try {\n const canvas = document.createElement('canvas');\n const gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl');\n if (!gl || !(gl instanceof WebGLRenderingContext)) return {};\n\n const debugInfo = gl.getExtension('WEBGL_debug_renderer_info');\n if (!debugInfo) return {};\n\n return {\n vendor: gl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL) as string,\n renderer: gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL) as string,\n };\n } catch {\n return {};\n }\n}\n\nasync function getAudioFingerprint(): Promise<string | undefined> {\n if (typeof window === 'undefined' || typeof OfflineAudioContext === 'undefined') {\n return undefined;\n }\n\n try {\n const context = new OfflineAudioContext(1, 4500, 44100);\n const oscillator = context.createOscillator();\n oscillator.type = 'triangle';\n oscillator.frequency.setValueAtTime(10000, context.currentTime);\n\n const compressor = context.createDynamicsCompressor();\n compressor.threshold.setValueAtTime(-50, context.currentTime);\n compressor.knee.setValueAtTime(40, context.currentTime);\n compressor.ratio.setValueAtTime(12, context.currentTime);\n compressor.attack.setValueAtTime(0, context.currentTime);\n compressor.release.setValueAtTime(0.25, context.currentTime);\n\n oscillator.connect(compressor);\n compressor.connect(context.destination);\n oscillator.start(0);\n\n const buffer = await context.startRendering();\n const data = buffer.getChannelData(0);\n\n // Hash a subset of the rendered audio samples\n let sum = 0;\n for (let i = 4000; i < 4500; i++) {\n sum += Math.abs(data[i]!);\n }\n return hashString(`audio:${sum.toFixed(6)}`);\n } catch {\n return undefined;\n }\n}\n\nfunction detectIncognito(): boolean {\n if (typeof window === 'undefined') return false;\n\n try {\n // Method 1: Safari incognito - localStorage quota is restricted\n const testKey = '__sp_incognito_test__';\n try {\n localStorage.setItem(testKey, new Array(100).join('x'));\n localStorage.removeItem(testKey);\n } catch {\n return true;\n }\n\n // Method 2: Firefox - IndexedDB not available in private mode\n if (typeof indexedDB !== 'undefined') {\n try {\n const db = indexedDB.open('__sp_test__');\n db.onerror = () => { /* detected */ };\n } catch {\n return true;\n }\n }\n\n // Method 3: Check if FileSystem API is restricted (Chrome < 76)\n if ('webkitRequestFileSystem' in window) {\n let detected = false;\n try {\n (window as Window & { webkitRequestFileSystem: (type: number, size: number, success: () => void, error: () => void) => void }).webkitRequestFileSystem(\n 0, 1,\n () => { detected = false; },\n () => { detected = true; }\n );\n } catch {\n // Not available\n }\n if (detected) return true;\n }\n\n // Method 4: Check performance.memory (Chrome) - reduced in incognito\n const perf = performance as Performance & { memory?: { jsHeapSizeLimit?: number } };\n if (perf.memory) {\n // Incognito Chrome often has lower heap limits\n const heapLimit = perf.memory.jsHeapSizeLimit || 0;\n if (heapLimit > 0 && heapLimit < 1073741824) { // < 1GB\n return true;\n }\n }\n\n return false;\n } catch {\n return false;\n }\n}\n\nfunction detectBot(): boolean {\n if (typeof navigator === 'undefined') return false;\n\n const ua = navigator.userAgent.toLowerCase();\n const botPatterns = [\n 'bot', 'crawler', 'spider', 'headless', 'phantom',\n 'puppeteer', 'selenium', 'webdriver', 'playwright',\n ];\n\n if (botPatterns.some(pattern => ua.includes(pattern))) {\n return true;\n }\n\n // Check for webdriver property\n if ('webdriver' in navigator && (navigator as { webdriver?: boolean }).webdriver) {\n return true;\n }\n\n // Check for zero plugins (common in headless)\n if (navigator.plugins && navigator.plugins.length === 0 && !/mobile|android|iphone/i.test(ua)) {\n return true;\n }\n\n return false;\n}\n\nfunction detectPrivacyBrowser(): boolean {\n if (typeof navigator === 'undefined') return false;\n const ua = navigator.userAgent.toLowerCase();\n\n // Brave browser\n if ('brave' in navigator) return true;\n\n // Firefox Focus / Firefox private\n if (ua.includes('focus') && ua.includes('firefox')) return true;\n\n // DuckDuckGo browser\n if (ua.includes('duckduckgo')) return true;\n\n // Tor browser (modified Firefox with specific characteristics)\n if (typeof window !== 'undefined') {\n // Tor browser reports specific screen dimensions\n if (screen.width === 1000 && screen.height === 1000) return true;\n // Tor browser spoofs timezone to UTC\n if (new Date().getTimezoneOffset() === 0 && navigator.language !== 'en') return true;\n }\n\n return false;\n}\n\nfunction detectDevTools(): boolean {\n if (typeof window === 'undefined') return false;\n\n try {\n // Method 1: Check window size difference (devtools takes space)\n const widthThreshold = window.outerWidth - window.innerWidth > 160;\n const heightThreshold = window.outerHeight - window.innerHeight > 160;\n if (widthThreshold || heightThreshold) return true;\n } catch {\n // Ignore\n }\n\n return false;\n}\n\nfunction getConnectionType(): string | undefined {\n if (typeof navigator === 'undefined') return undefined;\n const connection = (navigator as Navigator & { connection?: { effectiveType?: string; type?: string } }).connection;\n if (!connection) return undefined;\n return connection.effectiveType || connection.type || undefined;\n}\n\nfunction getDoNotTrack(): boolean {\n if (typeof navigator === 'undefined') return false;\n const dnt = (navigator as Navigator & { doNotTrack?: string }).doNotTrack;\n return dnt === '1' || dnt === 'yes';\n}\n\nfunction getNotificationsPermission(): boolean {\n if (typeof Notification === 'undefined') return false;\n return Notification.permission === 'granted';\n}\n\nfunction getDeviceAge(): { firstSeen?: string; visitCount: number } {\n const STORAGE_KEY = 'sitepong_device_age';\n const result: { firstSeen?: string; visitCount: number } = { visitCount: 1 };\n\n if (typeof localStorage === 'undefined') return result;\n\n try {\n const stored = localStorage.getItem(STORAGE_KEY);\n if (stored) {\n const parsed = JSON.parse(stored);\n result.firstSeen = parsed.firstSeen;\n result.visitCount = (parsed.visitCount || 0) + 1;\n } else {\n result.firstSeen = new Date().toISOString();\n }\n\n // Update stored value\n localStorage.setItem(STORAGE_KEY, JSON.stringify({\n firstSeen: result.firstSeen,\n visitCount: result.visitCount,\n }));\n } catch {\n // Storage not available\n }\n\n return result;\n}\n\nfunction getFontFingerprint(): string | undefined {\n if (typeof document === 'undefined') return undefined;\n\n try {\n const baseFonts = ['monospace', 'sans-serif', 'serif'] as const;\n const testFonts = [\n 'Arial', 'Arial Black', 'Courier New', 'Georgia', 'Helvetica',\n 'Impact', 'Lucida Console', 'Lucida Sans Unicode', 'Palatino Linotype',\n 'Tahoma', 'Times New Roman', 'Trebuchet MS', 'Verdana',\n 'Comic Sans MS', 'Courier', 'Garamond', 'Monaco',\n ];\n\n const testString = 'mmmmmmmmmmlli';\n const testSize = '72px';\n\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n if (!ctx) return undefined;\n\n // Measure baseline widths\n const baseWidths: Record<string, number> = {};\n for (const base of baseFonts) {\n ctx.font = `${testSize} ${base}`;\n baseWidths[base] = ctx.measureText(testString).width;\n }\n\n // Test each font against baselines\n const detected: string[] = [];\n for (const font of testFonts) {\n for (const base of baseFonts) {\n ctx.font = `${testSize} '${font}', ${base}`;\n const width = ctx.measureText(testString).width;\n if (width !== baseWidths[base]) {\n detected.push(font);\n break;\n }\n }\n }\n\n return hashString(detected.join(','));\n } catch {\n return undefined;\n }\n}\n\nfunction getMathFingerprint(): string | undefined {\n try {\n const results = [\n Math.tan(-1e300),\n Math.log(1e-10),\n Math.pow(Math.PI, -100),\n Math.acos(0.5),\n Math.atan2(1, 1),\n Math.exp(1),\n Math.sinh(1),\n ];\n return hashString(results.map(r => r.toString()).join(','));\n } catch {\n return undefined;\n }\n}\n\nfunction getWebGLRenderHash(): string | undefined {\n if (typeof document === 'undefined') return undefined;\n\n try {\n const canvas = document.createElement('canvas');\n canvas.width = 50;\n canvas.height = 50;\n const gl = canvas.getContext('webgl');\n if (!gl) return undefined;\n\n // Draw a simple colored triangle\n const vs = gl.createShader(gl.VERTEX_SHADER)!;\n gl.shaderSource(vs, `attribute vec2 p;void main(){gl_Position=vec4(p,0,1);}`);\n gl.compileShader(vs);\n\n const fs = gl.createShader(gl.FRAGMENT_SHADER)!;\n gl.shaderSource(fs, `precision mediump float;void main(){gl_FragColor=vec4(.86,.27,.33,1);}`);\n gl.compileShader(fs);\n\n const prog = gl.createProgram()!;\n gl.attachShader(prog, vs);\n gl.attachShader(prog, fs);\n gl.linkProgram(prog);\n gl.useProgram(prog);\n\n const buf = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, buf);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([0, 0.5, -0.5, -0.5, 0.5, -0.5]), gl.STATIC_DRAW);\n\n const loc = gl.getAttribLocation(prog, 'p');\n gl.enableVertexAttribArray(loc);\n gl.vertexAttribPointer(loc, 2, gl.FLOAT, false, 0, 0);\n\n gl.clearColor(0, 0, 0, 1);\n gl.clear(gl.COLOR_BUFFER_BIT);\n gl.drawArrays(gl.TRIANGLES, 0, 3);\n\n return hashString(canvas.toDataURL());\n } catch {\n return undefined;\n }\n}\n\nfunction getCssFeatureHash(): string | undefined {\n if (typeof CSS === 'undefined' || typeof CSS.supports !== 'function') return undefined;\n\n try {\n const features = [\n 'display: grid', 'display: flex', 'display: contents',\n 'position: sticky', 'backdrop-filter: blur(1px)',\n 'gap: 1px', 'aspect-ratio: 1', 'contain: paint',\n 'overflow: clip', 'accent-color: red',\n 'color: oklch(0.5 0.2 0)', 'container-type: inline-size',\n 'text-wrap: balance', 'view-transition-name: x',\n 'anchor-name: --x', 'field-sizing: content',\n ];\n\n const supported = features.map(f => CSS.supports(f) ? '1' : '0').join('');\n return hashString(supported);\n } catch {\n return undefined;\n }\n}\n\nasync function getLocalIps(): Promise<string[] | undefined> {\n if (typeof window === 'undefined' || typeof RTCPeerConnection === 'undefined') {\n return undefined;\n }\n\n try {\n const ips = new Set<string>();\n const pc = new RTCPeerConnection({ iceServers: [] });\n pc.createDataChannel('');\n\n const offer = await pc.createOffer();\n await pc.setLocalDescription(offer);\n\n return new Promise<string[] | undefined>((resolve) => {\n const timeout = setTimeout(() => {\n pc.close();\n resolve(ips.size > 0 ? Array.from(ips) : undefined);\n }, 1000);\n\n pc.onicecandidate = (event) => {\n if (!event.candidate) {\n clearTimeout(timeout);\n pc.close();\n resolve(ips.size > 0 ? Array.from(ips) : undefined);\n return;\n }\n const match = event.candidate.candidate.match(\n /([0-9]{1,3}\\.([0-9]{1,3}\\.){2}[0-9]{1,3})/\n );\n if (match && match[1] && !match[1].startsWith('0.')) {\n ips.add(match[1]);\n }\n };\n });\n } catch {\n return undefined;\n }\n}\n\nfunction hashString(str: string): string {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash;\n }\n return Math.abs(hash).toString(16);\n}\n","/**\n * Behavior Analysis Module\n * Captures mouse movement, keystroke, scroll, and click patterns\n * for bot/automation detection scoring.\n */\n\nexport interface BehaviorMetrics {\n mouse: MouseMetrics;\n keyboard: KeyboardMetrics;\n scroll: ScrollMetrics;\n clicks: ClickMetrics;\n score: number; // 0.0 (bot-like) to 1.0 (human-like)\n}\n\ninterface MouseMetrics {\n totalMovements: number;\n averageSpeed: number;\n maxSpeed: number;\n averageAcceleration: number;\n straightLineRatio: number; // Proportion of straight-line movements\n jitter: number; // Small random movements (humans have jitter)\n hasMovement: boolean;\n}\n\ninterface KeyboardMetrics {\n totalKeystrokes: number;\n averageInterval: number;\n intervalVariance: number; // Humans have high variance\n holdTimeAverage: number;\n holdTimeVariance: number;\n hasKeystrokes: boolean;\n}\n\ninterface ScrollMetrics {\n totalScrolls: number;\n averageSpeed: number;\n smoothness: number; // Humans have smoother scrolling\n hasScroll: boolean;\n}\n\ninterface ClickMetrics {\n totalClicks: number;\n averageInterval: number;\n intervalVariance: number;\n doubleClickCount: number;\n hasClicks: boolean;\n}\n\ninterface Point {\n x: number;\n y: number;\n t: number;\n}\n\nexport class BehaviorAnalyzer {\n private mousePoints: Point[] = [];\n private keyDownTimes: Map<string, number> = new Map();\n private keyIntervals: number[] = [];\n private keyHoldTimes: number[] = [];\n private lastKeyTime = 0;\n private scrollEvents: Array<{ deltaY: number; t: number }> = [];\n private clickTimes: number[] = [];\n private running = false;\n\n private readonly maxSamples = 500;\n\n private handleMouseMove = (e: MouseEvent) => {\n if (this.mousePoints.length >= this.maxSamples) return;\n this.mousePoints.push({ x: e.clientX, y: e.clientY, t: Date.now() });\n };\n\n private handleKeyDown = (e: KeyboardEvent) => {\n if (this.keyIntervals.length >= this.maxSamples) return;\n const now = Date.now();\n this.keyDownTimes.set(e.key, now);\n if (this.lastKeyTime > 0) {\n this.keyIntervals.push(now - this.lastKeyTime);\n }\n this.lastKeyTime = now;\n };\n\n private handleKeyUp = (e: KeyboardEvent) => {\n const downTime = this.keyDownTimes.get(e.key);\n if (downTime) {\n this.keyHoldTimes.push(Date.now() - downTime);\n this.keyDownTimes.delete(e.key);\n }\n };\n\n private handleScroll = () => {\n if (this.scrollEvents.length >= this.maxSamples) return;\n this.scrollEvents.push({ deltaY: window.scrollY, t: Date.now() });\n };\n\n private handleClick = () => {\n if (this.clickTimes.length >= this.maxSamples) return;\n this.clickTimes.push(Date.now());\n };\n\n start(): void {\n if (this.running || typeof window === 'undefined' || typeof window.addEventListener !== 'function') return;\n this.running = true;\n window.addEventListener('mousemove', this.handleMouseMove, { passive: true });\n window.addEventListener('keydown', this.handleKeyDown, { passive: true });\n window.addEventListener('keyup', this.handleKeyUp, { passive: true });\n window.addEventListener('scroll', this.handleScroll, { passive: true });\n window.addEventListener('click', this.handleClick, { passive: true });\n }\n\n stop(): void {\n if (!this.running || typeof window === 'undefined' || typeof window.removeEventListener !== 'function') return;\n this.running = false;\n window.removeEventListener('mousemove', this.handleMouseMove);\n window.removeEventListener('keydown', this.handleKeyDown);\n window.removeEventListener('keyup', this.handleKeyUp);\n window.removeEventListener('scroll', this.handleScroll);\n window.removeEventListener('click', this.handleClick);\n }\n\n getMetrics(): BehaviorMetrics {\n const mouse = this.analyzeMouseMovement();\n const keyboard = this.analyzeKeyboard();\n const scroll = this.analyzeScroll();\n const clicks = this.analyzeClicks();\n const score = this.calculateHumanScore(mouse, keyboard, scroll, clicks);\n\n return { mouse, keyboard, scroll, clicks, score };\n }\n\n reset(): void {\n this.mousePoints = [];\n this.keyDownTimes.clear();\n this.keyIntervals = [];\n this.keyHoldTimes = [];\n this.lastKeyTime = 0;\n this.scrollEvents = [];\n this.clickTimes = [];\n }\n\n private analyzeMouseMovement(): MouseMetrics {\n if (this.mousePoints.length < 3) {\n return {\n totalMovements: this.mousePoints.length,\n averageSpeed: 0,\n maxSpeed: 0,\n averageAcceleration: 0,\n straightLineRatio: 0,\n jitter: 0,\n hasMovement: false,\n };\n }\n\n const speeds: number[] = [];\n const accelerations: number[] = [];\n let straightSegments = 0;\n let totalSegments = 0;\n let jitterSum = 0;\n\n for (let i = 1; i < this.mousePoints.length; i++) {\n const prev = this.mousePoints[i - 1];\n const curr = this.mousePoints[i];\n const dt = (curr.t - prev.t) || 1;\n const dx = curr.x - prev.x;\n const dy = curr.y - prev.y;\n const distance = Math.sqrt(dx * dx + dy * dy);\n const speed = distance / dt;\n speeds.push(speed);\n\n // Jitter: small movements\n if (distance < 3 && distance > 0) {\n jitterSum++;\n }\n\n // Straightness: check if 3 consecutive points are collinear\n if (i >= 2) {\n const pp = this.mousePoints[i - 2];\n const expectedX = pp.x + (curr.x - pp.x) * ((prev.t - pp.t) / (curr.t - pp.t));\n const expectedY = pp.y + (curr.y - pp.y) * ((prev.t - pp.t) / (curr.t - pp.t));\n const deviation = Math.sqrt((prev.x - expectedX) ** 2 + (prev.y - expectedY) ** 2);\n totalSegments++;\n if (deviation < 2) straightSegments++;\n }\n\n if (i >= 2) {\n const prevSpeed = speeds[speeds.length - 2] || 0;\n accelerations.push(Math.abs(speed - prevSpeed) / dt);\n }\n }\n\n const avgSpeed = speeds.reduce((a, b) => a + b, 0) / speeds.length;\n const maxSpeed = Math.max(...speeds);\n const avgAccel = accelerations.length > 0\n ? accelerations.reduce((a, b) => a + b, 0) / accelerations.length\n : 0;\n\n return {\n totalMovements: this.mousePoints.length,\n averageSpeed: Math.round(avgSpeed * 1000) / 1000,\n maxSpeed: Math.round(maxSpeed * 1000) / 1000,\n averageAcceleration: Math.round(avgAccel * 1000) / 1000,\n straightLineRatio: totalSegments > 0 ? straightSegments / totalSegments : 0,\n jitter: this.mousePoints.length > 0 ? jitterSum / this.mousePoints.length : 0,\n hasMovement: true,\n };\n }\n\n private analyzeKeyboard(): KeyboardMetrics {\n if (this.keyIntervals.length < 2) {\n return {\n totalKeystrokes: this.keyIntervals.length,\n averageInterval: 0,\n intervalVariance: 0,\n holdTimeAverage: 0,\n holdTimeVariance: 0,\n hasKeystrokes: false,\n };\n }\n\n const avgInterval = this.keyIntervals.reduce((a, b) => a + b, 0) / this.keyIntervals.length;\n const intervalVar = this.variance(this.keyIntervals);\n\n const avgHold = this.keyHoldTimes.length > 0\n ? this.keyHoldTimes.reduce((a, b) => a + b, 0) / this.keyHoldTimes.length\n : 0;\n const holdVar = this.keyHoldTimes.length > 0\n ? this.variance(this.keyHoldTimes)\n : 0;\n\n return {\n totalKeystrokes: this.keyIntervals.length + 1,\n averageInterval: Math.round(avgInterval),\n intervalVariance: Math.round(intervalVar),\n holdTimeAverage: Math.round(avgHold),\n holdTimeVariance: Math.round(holdVar),\n hasKeystrokes: true,\n };\n }\n\n private analyzeScroll(): ScrollMetrics {\n if (this.scrollEvents.length < 2) {\n return { totalScrolls: this.scrollEvents.length, averageSpeed: 0, smoothness: 0, hasScroll: false };\n }\n\n const speeds: number[] = [];\n const deltas: number[] = [];\n\n for (let i = 1; i < this.scrollEvents.length; i++) {\n const dt = (this.scrollEvents[i].t - this.scrollEvents[i - 1].t) || 1;\n const dy = Math.abs(this.scrollEvents[i].deltaY - this.scrollEvents[i - 1].deltaY);\n speeds.push(dy / dt);\n deltas.push(dy);\n }\n\n const avgSpeed = speeds.reduce((a, b) => a + b, 0) / speeds.length;\n // Smoothness: inverse of speed variance (normalized)\n const speedVar = this.variance(speeds);\n const smoothness = avgSpeed > 0 ? Math.min(1, avgSpeed / (speedVar + avgSpeed)) : 0;\n\n return {\n totalScrolls: this.scrollEvents.length,\n averageSpeed: Math.round(avgSpeed * 100) / 100,\n smoothness: Math.round(smoothness * 100) / 100,\n hasScroll: true,\n };\n }\n\n private analyzeClicks(): ClickMetrics {\n if (this.clickTimes.length < 2) {\n return {\n totalClicks: this.clickTimes.length,\n averageInterval: 0,\n intervalVariance: 0,\n doubleClickCount: 0,\n hasClicks: this.clickTimes.length > 0,\n };\n }\n\n const intervals: number[] = [];\n let doubleClicks = 0;\n\n for (let i = 1; i < this.clickTimes.length; i++) {\n const interval = this.clickTimes[i] - this.clickTimes[i - 1];\n intervals.push(interval);\n if (interval < 500) doubleClicks++;\n }\n\n const avgInterval = intervals.reduce((a, b) => a + b, 0) / intervals.length;\n const intervalVar = this.variance(intervals);\n\n return {\n totalClicks: this.clickTimes.length,\n averageInterval: Math.round(avgInterval),\n intervalVariance: Math.round(intervalVar),\n doubleClickCount: doubleClicks,\n hasClicks: true,\n };\n }\n\n private calculateHumanScore(\n mouse: MouseMetrics,\n keyboard: KeyboardMetrics,\n scroll: ScrollMetrics,\n clicks: ClickMetrics\n ): number {\n let score = 0.5; // Start neutral\n let factors = 0;\n\n // Mouse analysis\n if (mouse.hasMovement) {\n factors++;\n let mouseScore = 0.5;\n\n // Humans have jitter (small involuntary movements)\n if (mouse.jitter > 0.05) mouseScore += 0.15;\n\n // Bots tend to have very straight movements\n if (mouse.straightLineRatio < 0.5) mouseScore += 0.15;\n else if (mouse.straightLineRatio > 0.9) mouseScore -= 0.2;\n\n // Humans have variable speed\n if (mouse.averageSpeed > 0 && mouse.maxSpeed / mouse.averageSpeed > 3) {\n mouseScore += 0.1;\n }\n\n // Very consistent speed is bot-like\n if (mouse.averageAcceleration > 0) mouseScore += 0.1;\n\n score += Math.max(0, Math.min(1, mouseScore)) - 0.5;\n }\n\n // Keyboard analysis\n if (keyboard.hasKeystrokes) {\n factors++;\n let keyScore = 0.5;\n\n // Humans have high interval variance\n if (keyboard.intervalVariance > 1000) keyScore += 0.2;\n else if (keyboard.intervalVariance < 100) keyScore -= 0.2;\n\n // Very uniform typing is bot-like\n const cv = keyboard.averageInterval > 0\n ? Math.sqrt(keyboard.intervalVariance) / keyboard.averageInterval\n : 0;\n if (cv > 0.3) keyScore += 0.15;\n\n // Hold time variance\n if (keyboard.holdTimeVariance > 500) keyScore += 0.1;\n\n score += Math.max(0, Math.min(1, keyScore)) - 0.5;\n }\n\n // Scroll analysis\n if (scroll.hasScroll) {\n factors++;\n let scrollScore = 0.5;\n\n // Humans have smooth scrolling (not perfectly uniform)\n if (scroll.smoothness > 0.3 && scroll.smoothness < 0.9) {\n scrollScore += 0.2;\n }\n\n score += Math.max(0, Math.min(1, scrollScore)) - 0.5;\n }\n\n // Click analysis\n if (clicks.hasClicks) {\n factors++;\n let clickScore = 0.5;\n\n // Humans have variable click intervals\n if (clicks.intervalVariance > 50000) clickScore += 0.15;\n else if (clicks.intervalVariance < 100) clickScore -= 0.2;\n\n score += Math.max(0, Math.min(1, clickScore)) - 0.5;\n }\n\n // No interaction at all is suspicious\n if (factors === 0) return 0.3;\n\n return Math.max(0, Math.min(1, score));\n }\n\n private variance(values: number[]): number {\n if (values.length < 2) return 0;\n const mean = values.reduce((a, b) => a + b, 0) / values.length;\n return values.reduce((sum, v) => sum + (v - mean) ** 2, 0) / (values.length - 1);\n }\n}\n","/**\n * VPN/Proxy Detection Module\n * Client-side heuristics for detecting VPN, proxy, and Tor usage.\n * For full accuracy, combine with server-side IP intelligence.\n */\n\nexport interface VPNDetectionResult {\n vpnDetected: boolean;\n proxyDetected: boolean;\n torDetected: boolean;\n confidence: number;\n signals: VPNSignals;\n}\n\ninterface VPNSignals {\n webrtcLeak: boolean | null;\n timezoneIPMismatch: boolean;\n dnsLeak: boolean | null;\n connectionType: string | null;\n multipleIPs: boolean;\n torBrowser: boolean;\n knownVPNExtension: boolean;\n}\n\nexport async function detectVPN(): Promise<VPNDetectionResult> {\n const signals: VPNSignals = {\n webrtcLeak: null,\n timezoneIPMismatch: false,\n dnsLeak: null,\n connectionType: null,\n multipleIPs: false,\n torBrowser: false,\n knownVPNExtension: false,\n };\n\n let confidence = 0;\n let vpnDetected = false;\n let proxyDetected = false;\n let torDetected = false;\n\n // 1. Tor Browser Detection\n signals.torBrowser = detectTorBrowser();\n if (signals.torBrowser) {\n torDetected = true;\n confidence += 0.9;\n }\n\n // 2. WebRTC IP Leak Detection\n try {\n signals.webrtcLeak = await detectWebRTCLeak();\n if (signals.webrtcLeak) {\n vpnDetected = true;\n confidence += 0.3;\n }\n } catch {\n // WebRTC not available or blocked\n signals.webrtcLeak = null;\n }\n\n // 3. Connection type analysis\n signals.connectionType = getConnectionType();\n if (signals.connectionType === 'unknown' || signals.connectionType === null) {\n // Datacenter connections often have no Network Information API\n confidence += 0.05;\n }\n\n // 4. VPN Extension Detection\n signals.knownVPNExtension = detectVPNExtensions();\n if (signals.knownVPNExtension) {\n vpnDetected = true;\n confidence += 0.4;\n }\n\n // 5. Timezone vs IP heuristic\n // This needs server-side geo data, but we can detect if timezone is unusual\n const tz = Intl.DateTimeFormat().resolvedOptions().timeZone;\n const lang = navigator.language;\n // If timezone doesn't match language locale, it's a weak signal\n if (tz && lang) {\n const tzCountry = getTimezoneCountry(tz);\n const langCountry = lang.split('-')[1]?.toUpperCase();\n if (tzCountry && langCountry && tzCountry !== langCountry) {\n signals.timezoneIPMismatch = true;\n confidence += 0.1;\n }\n }\n\n // Normalize confidence\n confidence = Math.min(confidence, 1);\n\n // If no strong signals, mark as not detected\n if (confidence < 0.3) {\n vpnDetected = false;\n proxyDetected = false;\n }\n\n return {\n vpnDetected,\n proxyDetected,\n torDetected,\n confidence,\n signals,\n };\n}\n\nfunction detectTorBrowser(): boolean {\n if (typeof window === 'undefined') return false;\n\n // Tor browser characteristics\n const checks: boolean[] = [];\n\n // 1. Screen dimensions are typically 1000x1000 in Tor\n checks.push(window.screen.width === 1000 && window.screen.height === 1000);\n\n // 2. Tor disables many APIs\n checks.push(!window.MediaDevices);\n checks.push(navigator.plugins.length === 0);\n\n // 3. Timezone offset is 0 (UTC) in Tor\n checks.push(new Date().getTimezoneOffset() === 0);\n\n // 4. Hardcoded user agent patterns\n const ua = navigator.userAgent;\n checks.push(ua.includes('Firefox') && !ua.includes('Chrome'));\n\n // If 3+ checks pass, likely Tor\n const score = checks.filter(Boolean).length;\n return score >= 3;\n}\n\nasync function detectWebRTCLeak(): Promise<boolean> {\n if (typeof window === 'undefined' || !window.RTCPeerConnection) {\n return false;\n }\n\n return new Promise((resolve) => {\n const timeout = setTimeout(() => resolve(false), 3000);\n const localIPs: Set<string> = new Set();\n\n try {\n const pc = new RTCPeerConnection({\n iceServers: [{ urls: 'stun:stun.l.google.com:19302' }],\n });\n\n pc.createDataChannel('');\n\n pc.onicecandidate = (event) => {\n if (!event.candidate) {\n clearTimeout(timeout);\n pc.close();\n // If we got local IPs through WebRTC, there might be a VPN leak\n // (VPN should prevent local IP exposure)\n resolve(localIPs.size > 1);\n return;\n }\n\n const candidate = event.candidate.candidate;\n const ipMatch = candidate.match(/(\\d{1,3}\\.){3}\\d{1,3}/);\n if (ipMatch) {\n localIPs.add(ipMatch[0]);\n }\n };\n\n pc.createOffer()\n .then(offer => pc.setLocalDescription(offer))\n .catch(() => {\n clearTimeout(timeout);\n resolve(false);\n });\n } catch {\n clearTimeout(timeout);\n resolve(false);\n }\n });\n}\n\nfunction getConnectionType(): string | null {\n if (typeof navigator === 'undefined') return null;\n const nav = navigator as Navigator & { connection?: { type?: string; effectiveType?: string } };\n if (nav.connection) {\n return nav.connection.type || nav.connection.effectiveType || null;\n }\n return null;\n}\n\nfunction detectVPNExtensions(): boolean {\n if (typeof document === 'undefined') return false;\n\n // Check for known VPN extension injected elements or attributes\n const body = document.body;\n if (!body) return false;\n\n // Some VPN extensions add specific classes or data attributes\n const vpnIndicators = [\n '[data-windscribe]',\n '[data-nord]',\n '.surfshark-extension',\n '#vpn-indicator',\n '[data-expressvpn]',\n ];\n\n for (const selector of vpnIndicators) {\n try {\n if (document.querySelector(selector)) return true;\n } catch {\n // Invalid selector, skip\n }\n }\n\n return false;\n}\n\nfunction getTimezoneCountry(tz: string): string | null {\n // Simple timezone to country mapping for common timezones\n const tzMap: Record<string, string> = {\n 'America/New_York': 'US',\n 'America/Chicago': 'US',\n 'America/Denver': 'US',\n 'America/Los_Angeles': 'US',\n 'Europe/London': 'GB',\n 'Europe/Paris': 'FR',\n 'Europe/Berlin': 'DE',\n 'Europe/Madrid': 'ES',\n 'Europe/Rome': 'IT',\n 'Asia/Tokyo': 'JP',\n 'Asia/Shanghai': 'CN',\n 'Asia/Kolkata': 'IN',\n 'Asia/Seoul': 'KR',\n 'Australia/Sydney': 'AU',\n 'America/Toronto': 'CA',\n 'America/Sao_Paulo': 'BR',\n 'America/Mexico_City': 'MX',\n };\n\n return tzMap[tz] || null;\n}\n","/**\n * Fingerprint Manager\n * Manages visitor ID generation, signal caching, and localStorage persistence\n */\n\nimport type { FingerprintConfig, DeviceSignals, VisitorIdResult, FraudCheckResult, CachedVisitor } from './types';\nimport { collectDeviceSignals, getStableFingerprint } from './signals';\nimport { BehaviorAnalyzer } from './behavior';\nimport { detectVPN } from './vpn-detection';\nimport { isReactNative, getNativeDeviceId } from '../utils/platform';\n\nconst DEFAULT_ENDPOINT = 'https://ingest.sitepong.com';\nconst CACHE_KEY = 'sitepong_visitor';\nconst CACHE_TTL_MS = 30 * 24 * 60 * 60 * 1000; // 30 days\nconst COOKIE_NAME = '__sp_vid';\nconst COOKIE_MAX_AGE = 63072000; // 2 years in seconds\n\nexport class FingerprintManager {\n private config: Required<Omit<FingerprintConfig, 'apiKey' | 'visitorEndpoint' | 'extendedSignals'>> & {\n apiKey: string;\n visitorEndpoint?: string;\n extendedSignals?: boolean;\n };\n private cachedVisitor: CachedVisitor | null = null;\n private pendingRequest: Promise<VisitorIdResult> | null = null;\n private behaviorAnalyzer: BehaviorAnalyzer;\n\n constructor(config: FingerprintConfig) {\n this.config = {\n endpoint: DEFAULT_ENDPOINT,\n enabled: true,\n debug: false,\n ...config,\n };\n\n this.behaviorAnalyzer = new BehaviorAnalyzer();\n if (this.config.enabled && typeof window !== 'undefined' && typeof window.addEventListener === 'function') {\n this.behaviorAnalyzer.start();\n }\n\n this.loadFromStorage();\n }\n\n async getVisitorId(): Promise<VisitorIdResult> {\n if (!this.config.enabled) {\n throw new Error('Fingerprint is not enabled');\n }\n\n // On React Native with @sitepong/device-id, use the native persistent ID directly\n const nativeId = isReactNative() ? getNativeDeviceId() : null;\n if (nativeId) {\n const result: VisitorIdResult = {\n visitorId: nativeId,\n confidence: 1.0,\n firstSeenAt: new Date().toISOString(),\n lastSeenAt: new Date().toISOString(),\n };\n this.log('Using native device ID as visitor ID:', nativeId);\n return result;\n }\n\n // Return cached result if valid\n if (this.cachedVisitor && !this.isCacheExpired()) {\n this.log('Returning cached visitor ID:', this.cachedVisitor.result.visitorId);\n return this.cachedVisitor.result;\n }\n\n // Deduplicate concurrent requests\n if (this.pendingRequest) {\n return this.pendingRequest;\n }\n\n this.pendingRequest = this.fetchVisitorId();\n\n try {\n const result = await this.pendingRequest;\n return result;\n } finally {\n this.pendingRequest = null;\n }\n }\n\n async getDeviceSignals(): Promise<DeviceSignals> {\n return collectDeviceSignals(this.config.extendedSignals ?? false);\n }\n\n async getFraudCheck(): Promise<FraudCheckResult> {\n const [visitorResult, signals, vpnResult] = await Promise.all([\n this.getVisitorId(),\n this.getDeviceSignals(),\n detectVPN().catch(() => null),\n ]);\n\n // Include behavior analysis metrics\n const behaviorMetrics = this.behaviorAnalyzer.getMetrics();\n signals.behavior = {\n score: behaviorMetrics.score,\n mouseMovements: behaviorMetrics.mouse.totalMovements,\n keystrokes: behaviorMetrics.keyboard.totalKeystrokes,\n scrolls: behaviorMetrics.scroll.totalScrolls,\n clicks: behaviorMetrics.clicks.totalClicks,\n isHuman: behaviorMetrics.score > 0.6,\n };\n\n const vpnDetected = vpnResult?.vpnDetected || vpnResult?.torDetected || false;\n\n return {\n visitorId: visitorResult.visitorId,\n riskScore: this.calculateRiskScore(signals, vpnDetected),\n signals,\n flags: {\n incognito: signals.smart?.incognito || signals.incognito,\n bot: signals.smart?.bot || signals.bot || !signals.behavior.isHuman,\n vpn: vpnDetected || signals.smart?.timezoneMismatch,\n tampered: signals.smart?.privacyBrowser,\n },\n };\n }\n\n stopBehaviorTracking(): void {\n this.behaviorAnalyzer.stop();\n }\n\n private async fetchVisitorId(): Promise<VisitorIdResult> {\n const signals = await this.getDeviceSignals();\n const stableFingerprint = await getStableFingerprint(signals);\n const endpoint = this.config.visitorEndpoint || `${this.config.endpoint}/api/visitors`;\n\n // Read previous visitor ID from cookie or localStorage cache\n const previousVisitorId = this.getCookieVisitorId() || this.cachedVisitor?.result.visitorId || undefined;\n\n try {\n const response = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-API-Key': this.config.apiKey,\n },\n credentials: 'include',\n body: JSON.stringify({\n signals,\n stableFingerprint,\n previousVisitorId,\n }),\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}`);\n }\n\n const result: VisitorIdResult = await response.json();\n\n // Cache the result\n this.cachedVisitor = {\n result,\n signals,\n cachedAt: Date.now(),\n };\n this.saveToStorage();\n this.setCookieVisitorId(result.visitorId);\n\n this.log('Visitor ID fetched:', result.visitorId);\n return result;\n } catch (err) {\n this.log('Failed to fetch visitor ID:', err);\n throw err;\n }\n }\n\n private calculateRiskScore(signals: DeviceSignals, vpnDetected = false): number {\n let score = 0;\n const smart = signals.smart;\n\n // High-risk signals\n if (smart?.bot || signals.bot) score += 0.8;\n\n // Behavior analysis (strong signal)\n if (signals.behavior) {\n if (signals.behavior.score < 0.3) score += 0.4;\n else if (signals.behavior.score < 0.5) score += 0.2;\n }\n\n // VPN/Proxy detection\n if (vpnDetected) score += 0.25;\n\n // Medium-risk signals\n if (smart?.incognito || signals.incognito) score += 0.2;\n if (smart?.devToolsOpen) score += 0.1;\n if (smart?.privacyBrowser) score += 0.1;\n\n // Low-risk signals\n if (signals.hardwareConcurrency === 0) score += 0.1;\n if (signals.maxTouchPoints === 0 && /mobile|android|iphone/i.test(signals.userAgent)) {\n score += 0.15;\n }\n if (!signals.cookieEnabled) score += 0.1;\n if (smart?.doNotTrack) score += 0.05;\n\n // Device age: brand new devices are slightly more suspicious\n if (smart?.deviceVisitCount === 1) score += 0.05;\n\n return Math.round(Math.min(score, 1) * 100) / 100;\n }\n\n private isCacheExpired(): boolean {\n if (!this.cachedVisitor) return true;\n return Date.now() - this.cachedVisitor.cachedAt > CACHE_TTL_MS;\n }\n\n private loadFromStorage(): void {\n if (typeof window === 'undefined' || typeof localStorage === 'undefined') return;\n\n try {\n const stored = localStorage.getItem(CACHE_KEY);\n if (!stored) return;\n\n const parsed: CachedVisitor = JSON.parse(stored);\n if (!this.isCacheExpiredAt(parsed.cachedAt)) {\n this.cachedVisitor = parsed;\n this.log('Loaded cached visitor from storage');\n } else {\n localStorage.removeItem(CACHE_KEY);\n }\n } catch {\n // Ignore storage errors\n }\n }\n\n private saveToStorage(): void {\n if (typeof window === 'undefined' || typeof localStorage === 'undefined') return;\n if (!this.cachedVisitor) return;\n\n try {\n localStorage.setItem(CACHE_KEY, JSON.stringify(this.cachedVisitor));\n } catch {\n // Ignore storage errors\n }\n }\n\n private isCacheExpiredAt(cachedAt: number): boolean {\n return Date.now() - cachedAt > CACHE_TTL_MS;\n }\n\n private getCookieVisitorId(): string | undefined {\n if (typeof document === 'undefined') return undefined;\n try {\n const match = document.cookie.match(new RegExp(`(?:^|; )${COOKIE_NAME}=([^;]*)`));\n return match?.[1] || undefined;\n } catch {\n return undefined;\n }\n }\n\n private setCookieVisitorId(visitorId: string): void {\n if (typeof document === 'undefined') return;\n try {\n document.cookie = `${COOKIE_NAME}=${visitorId}; path=/; max-age=${COOKIE_MAX_AGE}; SameSite=Lax`;\n } catch {\n // Cookie write failed (e.g. third-party context)\n }\n }\n\n private log(...args: unknown[]): void {\n if (this.config.debug) {\n console.log('[SitePong Fingerprint]', ...args);\n }\n }\n}\n","/**\n * Web (browser) entry point for SitePong SDK.\n *\n * This module installs the browser EnvironmentAdapter before any SDK code\n * touches `window`, `document`, `navigator`, or `localStorage`, AND registers\n * the web-only manager factories (Replay, Fingerprint, Performance) so that\n * `init()` can construct them. RN/Node entries skip this registration, so\n * their bundles never pull in the DOM-heavy code paths.\n */\n\nimport { createWebEnvironment } from '../platforms/web/environment';\nimport { setEnvironment } from '../utils/platform';\nimport { registerWebManagerFactories } from '../index';\nimport { ReplayManager } from '../replay';\nimport { FingerprintManager } from '../fingerprint';\nimport { PerformanceManager } from '../performance';\n\n// Install the browser environment before re-exporting the SDK surface.\nsetEnvironment(createWebEnvironment());\n\n// Register DOM-dependent managers. Without this, calling init() with\n// replay/performance/fingerprint enabled will log a warning and continue\n// without those features.\nregisterWebManagerFactories({\n createReplay: (cfg) =>\n new ReplayManager(cfg as unknown as ConstructorParameters<typeof ReplayManager>[0]),\n createFingerprint: (cfg) =>\n new FingerprintManager(cfg as unknown as ConstructorParameters<typeof FingerprintManager>[0]),\n createPerformance: (cfg) =>\n new PerformanceManager(cfg as unknown as ConstructorParameters<typeof PerformanceManager>[0]),\n});\n\nexport * from '../index';\nexport { default } from '../index';\n"]}
|