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
package/dist/entries/rn.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/platforms/rn/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","../../src/superlink/client.ts","../../src/superlink/parse.ts","../../src/superlink/deferred.ts","../../src/superlink/web.ts","../../src/index.ts","../../src/react-native/storage.ts","../../src/react-native/device.ts","../../src/react-native/screen-recorder.ts","../../src/react-native/error-handler.ts","../../src/react-native/navigation.ts","../../src/react-native/network.ts","../../src/react-native/autocapture.ts","../../src/react-native/performance.ts","../../src/react-native/push.ts","../../src/react-native/provider.tsx","../../src/react-native/hooks.ts","../../src/react-native/sqlite-tracker.ts","../../src/react-native/widgets.ts","../../src/react-native/superlink.ts","../../src/entries/rn.ts"],"names":["env","ErrorUtils","now","DEFAULT_ENDPOINT","STORAGE_KEY","platform","DEFAULT_BATCH_SIZE","DEFAULT_FLUSH_INTERVAL","MAX_FLUSH_FAILURES","getVariantPayload","identify","Dimensions","Platform","AppState","createContext","useRef","useState","useEffect","jsx","useContext","getNativeModule","getEndpoint","getApiKey","completeFromScan"],"mappings":"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","file":"rn.js","sourcesContent":["/**\n * React Native EnvironmentAdapter.\n * Does NOT touch `window`, `document`, or `localStorage`.\n *\n * RN device info (deviceModel/osName/etc.) and AsyncStorage/MMKV-backed storage\n * are injected from the consuming app via the SitePongProvider, because they\n * depend on peer deps (@sitepong/device-id, @react-native-async-storage/async-storage).\n */\n\nimport type {\n MutableRNEnvironmentAdapter,\n DeviceInfo,\n Unsubscribe,\n} from '../../adapters/environment';\nimport type { StorageAdapter } from '../../adapters/storage';\n\nexport interface RNEnvironmentOptions {\n /** Storage backed by AsyncStorage/MMKV, supplied by host app. */\n storage?: StorageAdapter | null;\n /** Device info collected by the RN provider. */\n deviceInfo?: Partial<DeviceInfo>;\n /** Getter for the current screen/route name. */\n getCurrentScreen?: () => string | undefined;\n}\n\nexport function createRNEnvironment(\n options: RNEnvironmentOptions = {}\n): MutableRNEnvironmentAdapter {\n let deviceInfo: DeviceInfo = {\n platform: 'react-native',\n ...options.deviceInfo,\n };\n let getCurrentScreen = options.getCurrentScreen;\n\n const env: MutableRNEnvironmentAdapter = {\n platform: 'react-native',\n storage: options.storage ?? null,\n\n getDeviceInfo(): DeviceInfo {\n return deviceInfo;\n },\n\n getCurrentUrl(): string | undefined {\n return getCurrentScreen ? getCurrentScreen() : undefined;\n },\n\n getReferrer(): string | undefined {\n return undefined;\n },\n\n getUserAgent(): string | undefined {\n const osPart = deviceInfo.osName\n ? `${deviceInfo.osName}${\n deviceInfo.osVersion ? ` ${deviceInfo.osVersion}` : ''\n }`\n : undefined;\n const devicePart = deviceInfo.deviceModel || deviceInfo.deviceName;\n if (!osPart && !devicePart) return undefined;\n return `SitePong-RN/${[osPart, devicePart].filter(Boolean).join('; ')}`;\n },\n\n onUncaughtError(handler: (err: unknown) => void): Unsubscribe {\n const g = globalThis as unknown as {\n ErrorUtils?: {\n getGlobalHandler?: () => ((err: Error, isFatal?: boolean) => void) | undefined;\n setGlobalHandler?: (h: (err: Error, isFatal?: boolean) => void) => void;\n };\n };\n const ErrorUtils = g.ErrorUtils;\n if (!ErrorUtils || !ErrorUtils.setGlobalHandler || !ErrorUtils.getGlobalHandler) {\n return () => {};\n }\n const prev = ErrorUtils.getGlobalHandler();\n ErrorUtils.setGlobalHandler((err, isFatal) => {\n try {\n handler(err);\n } finally {\n if (prev) prev(err, isFatal);\n }\n });\n return () => {\n if (prev) ErrorUtils.setGlobalHandler!(prev);\n };\n },\n\n onUnhandledRejection(handler: (reason: unknown) => void): Unsubscribe {\n // RN does not have a shared-SDK unhandled-rejection hook. The RN\n // provider installs `promise/setimmediate/rejection-tracking` itself\n // in `src/react-native/error-handler.ts`; this stub exists so shared\n // code can safely call `env.onUnhandledRejection(...)` without platform\n // checks.\n void handler;\n return () => {};\n },\n\n onBeforeTerminate(handler: () => void): Unsubscribe {\n // RN uses AppState 'background' as the terminate-proxy. The provider\n // wires AppState listeners in `src/react-native/provider.tsx`; this\n // stub is intentional.\n void handler;\n return () => {};\n },\n\n onVisibilityHidden(handler: () => void): Unsubscribe {\n // RN equivalent is AppState 'background', wired by the provider.\n void handler;\n return () => {};\n },\n\n _setDeviceInfo(info: Partial<DeviceInfo>): void {\n deviceInfo = { ...deviceInfo, ...info };\n },\n\n _setGetCurrentScreen(fn): void {\n getCurrentScreen = fn;\n },\n\n _setStorage(storage: StorageAdapter | null): void {\n env.storage = storage;\n },\n };\n\n return env;\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","/**\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","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","/**\n * React Native Storage Adapter\n *\n * Wraps any AsyncStorage-compatible instance into the SDK's StorageAdapter interface.\n */\n\nimport type { StorageAdapter } from '../utils/platform';\n\nexport interface AsyncStorageLike {\n getItem(key: string): Promise<string | null>;\n setItem(key: string, value: string): Promise<void>;\n removeItem(key: string): Promise<void>;\n}\n\nexport function createAsyncStorageAdapter(asyncStorage: AsyncStorageLike): StorageAdapter {\n return {\n getItem: (key: string) => asyncStorage.getItem(key),\n setItem: (key: string, value: string) => asyncStorage.setItem(key, value),\n removeItem: (key: string) => asyncStorage.removeItem(key),\n };\n}\n","/**\n * React Native Device Info\n *\n * Collects device information using only RN built-in APIs.\n * Zero external dependencies — uses only Platform and Dimensions.\n */\n\nimport { Platform, Dimensions } from 'react-native';\n\nexport interface RNDeviceInfo {\n platform: 'ios' | 'android';\n osVersion?: string;\n deviceName?: string;\n deviceBrand?: string;\n deviceModel?: string;\n appVersion?: string;\n appBuildNumber?: string;\n screenWidth?: number;\n screenHeight?: number;\n screenScale?: number;\n isEmulator?: boolean;\n deviceId?: string;\n}\n\nexport function collectDeviceInfo(): RNDeviceInfo {\n const screen = Dimensions.get('screen');\n\n return {\n platform: Platform.OS as 'ios' | 'android',\n osVersion: String(Platform.Version),\n screenWidth: screen.width,\n screenHeight: screen.height,\n screenScale: screen.scale,\n };\n}\n\n/** @deprecated No-op, returns null. Kept for API compatibility. */\nexport async function fetchPersistentDeviceId(): Promise<string | null> {\n return null;\n}\n\n/** @deprecated No-op, returns null. Kept for API compatibility. */\nexport async function fetchNativeDeviceSignals(): Promise<null> {\n return null;\n}\n","/**\n * React Native Screen Recorder SDK Integration\n *\n * Two modes:\n * 1. **On error (via provider)**: Recording starts automatically, keeps a 10s\n * rolling buffer. On error the buffer is flushed and attached to the error.\n * 2. **Manual**: Call startScreenRecording / stopScreenRecording / flushScreenRecording\n * yourself. Keeps a 60s rolling buffer by default.\n */\n\ninterface NativeScreenRecorderModule {\n startRecording(config: {\n apiKey: string;\n endpoint: string;\n sessionId: string;\n fps: number;\n quality: string;\n bufferDuration: number;\n }): Promise<void>;\n stopRecording(): Promise<void>;\n isRecording(): boolean;\n flushBuffer(): Promise<void>;\n addSensitiveView(viewTag: number): void;\n removeSensitiveView(viewTag: number): void;\n}\n\nlet nativeModule: NativeScreenRecorderModule | null = null;\n\nfunction getNativeModule(): NativeScreenRecorderModule | null {\n if (!nativeModule) {\n try {\n nativeModule = require('@sitepong/screen-recorder');\n } catch {\n nativeModule = null;\n }\n }\n return nativeModule;\n}\n\nexport interface ScreenRecordingConfig {\n /** Enable screen recording (default: false) */\n enabled?: boolean;\n /** Frames per second (default: 1) */\n fps?: number;\n /** Video quality preset */\n quality?: 'low' | 'standard' | 'high';\n /** Sample rate 0-1: what fraction of sessions to record (default: 1.0) */\n sampleRate?: number;\n /** Max recording duration in ms (default: 60 min) */\n maxDuration?: number;\n /**\n * Rolling buffer duration in ms — how much video to keep.\n * - On-error mode (via provider): default 10_000 (10 seconds)\n * - Manual mode: default 60_000 (60 seconds)\n */\n bufferDuration?: number;\n}\n\n/** Default buffer for on-error mode (via provider) */\nconst ERROR_BUFFER_DURATION = 10_000;\n/** Default buffer for manual mode */\nconst MANUAL_BUFFER_DURATION = 60_000;\n\nlet recordingActive = false;\nlet maxDurationTimer: ReturnType<typeof setTimeout> | null = null;\n\n/**\n * Start screen recording in on-error mode (called by provider).\n * Recording runs in a 10s rolling buffer — auto-flushed and attached to errors.\n */\nexport function startScreenRecordingOnError(\n apiKey: string,\n endpoint: string,\n sessionId: string,\n config: ScreenRecordingConfig = {},\n): boolean {\n return _startRecording(apiKey, endpoint, sessionId, {\n ...config,\n bufferDuration: config.bufferDuration ?? ERROR_BUFFER_DURATION,\n });\n}\n\n/**\n * Start screen recording manually.\n * Recording runs in a 60s rolling buffer. Call flushScreenRecording() to upload.\n */\nexport function startScreenRecording(\n apiKey: string,\n endpoint: string,\n sessionId: string,\n config: Omit<ScreenRecordingConfig, 'enabled'> = {},\n): boolean {\n return _startRecording(apiKey, endpoint, sessionId, {\n ...config,\n enabled: true,\n bufferDuration: config.bufferDuration ?? MANUAL_BUFFER_DURATION,\n });\n}\n\nfunction _startRecording(\n apiKey: string,\n endpoint: string,\n sessionId: string,\n config: ScreenRecordingConfig,\n): boolean {\n const mod = getNativeModule();\n if (!mod) return false;\n\n if (!config.enabled) return false;\n\n // Apply sample rate\n const sampleRate = config.sampleRate ?? 1.0;\n if (Math.random() > sampleRate) return false;\n\n mod.startRecording({\n apiKey,\n endpoint,\n sessionId,\n fps: config.fps ?? 1,\n quality: config.quality ?? 'standard',\n bufferDuration: config.bufferDuration ?? ERROR_BUFFER_DURATION,\n }).catch((err: unknown) => {\n console.warn('[SitePong] Screen recording failed to start:', err);\n });\n\n recordingActive = true;\n\n // Auto-stop after max duration\n const maxDuration = config.maxDuration ?? 60 * 60 * 1000;\n maxDurationTimer = setTimeout(() => {\n stopScreenRecording();\n }, maxDuration);\n\n return true;\n}\n\n/**\n * Stop screen recording and discard the buffer.\n */\nexport function stopScreenRecording(): void {\n const mod = getNativeModule();\n if (!mod || !recordingActive) return;\n\n if (maxDurationTimer) {\n clearTimeout(maxDurationTimer);\n maxDurationTimer = null;\n }\n\n mod.stopRecording().catch(() => {});\n recordingActive = false;\n}\n\n/**\n * Flush the rolling buffer to the server.\n * In on-error mode this is called automatically by the error handler.\n * In manual mode, call this yourself to upload the buffer.\n */\nexport async function flushScreenRecording(): Promise<void> {\n const mod = getNativeModule();\n if (!mod || !recordingActive) return;\n\n try {\n await mod.flushBuffer();\n } catch (err) {\n console.warn('[SitePong] Screen recording flush failed:', err);\n }\n}\n\n/**\n * @deprecated Use flushScreenRecording() instead.\n */\nexport const flushScreenRecordingOnError = flushScreenRecording;\n\n/**\n * Check if screen recording is currently active.\n */\nexport function isScreenRecording(): boolean {\n return recordingActive;\n}\n","/**\n * React Native Error Handler\n *\n * Enhanced ErrorUtils.setGlobalHandler() + Promise rejection tracking.\n * Returns a teardown function.\n */\n\nimport { captureError } from '../index';\nimport { flushScreenRecording } from './screen-recorder';\n\ndeclare const ErrorUtils: {\n setGlobalHandler: (handler: (error: Error, isFatal: boolean) => void) => void;\n getGlobalHandler: () => (error: Error, isFatal: boolean) => void;\n};\n\nexport interface RNErrorHandlerOptions {\n /** Capture fatal errors (default: true) */\n captureFatal?: boolean;\n /** Capture non-fatal errors (default: true) */\n captureNonFatal?: boolean;\n /** Capture unhandled promise rejections (default: true) */\n capturePromiseRejections?: boolean;\n}\n\nexport function setupRNErrorHandler(options: RNErrorHandlerOptions = {}): () => void {\n const {\n captureFatal = true,\n captureNonFatal = true,\n capturePromiseRejections = true,\n } = options;\n\n const teardowns: Array<() => void> = [];\n\n // Global JS error handler\n if (typeof ErrorUtils !== 'undefined') {\n const previousHandler = ErrorUtils.getGlobalHandler();\n\n ErrorUtils.setGlobalHandler((error: Error, isFatal: boolean) => {\n if ((isFatal && captureFatal) || (!isFatal && captureNonFatal)) {\n captureError(error, {\n tags: {\n fatal: String(isFatal),\n handler: 'react-native-global',\n },\n });\n // Flush screen recording buffer on error\n flushScreenRecording().catch(() => {});\n }\n\n // Call previous handler\n if (previousHandler) {\n previousHandler(error, isFatal);\n }\n });\n\n teardowns.push(() => {\n if (previousHandler) {\n ErrorUtils.setGlobalHandler(previousHandler);\n }\n });\n }\n\n // Promise rejection tracking\n if (capturePromiseRejections) {\n // Track via global event (works on both Hermes and JSC)\n if (typeof global !== 'undefined') {\n const rejectionHandler = (event: { reason?: unknown }) => {\n const err = event.reason instanceof Error ? event.reason : new Error(String(event.reason));\n captureError(err, {\n tags: { handler: 'unhandled-promise-rejection' },\n });\n // Flush screen recording buffer on error\n flushScreenRecording().catch(() => {});\n };\n\n if (typeof globalThis.addEventListener === 'function') {\n globalThis.addEventListener('unhandledrejection', rejectionHandler as unknown as Parameters<typeof globalThis.addEventListener>[1]);\n teardowns.push(() => {\n globalThis.removeEventListener('unhandledrejection', rejectionHandler as unknown as Parameters<typeof globalThis.removeEventListener>[1]);\n });\n }\n }\n }\n\n return () => {\n for (const teardown of teardowns) {\n teardown();\n }\n };\n}\n","/**\n * React Navigation Tracker\n *\n * Integrates with React Navigation's navigationRef to track\n * $screen_view events and navigation breadcrumbs.\n */\n\nimport { track, addBreadcrumb, setCurrentScreen } from '../index';\n\nexport interface NavigationRef {\n addListener: (event: string, callback: (...args: unknown[]) => void) => () => void;\n getCurrentRoute: () => { name: string; params?: Record<string, unknown> } | undefined;\n}\n\nexport interface NavigationTrackerOptions {\n /** Track screen view events (default: true) */\n trackScreenViews?: boolean;\n /** Add navigation breadcrumbs (default: true) */\n addBreadcrumbs?: boolean;\n /** Screen name filter — return null to skip tracking */\n screenNameFilter?: (name: string) => string | null;\n}\n\nexport function createNavigationTracker(\n navigationRef: NavigationRef,\n options: NavigationTrackerOptions = {}\n): () => void {\n const {\n trackScreenViews = true,\n addBreadcrumbs = true,\n screenNameFilter,\n } = options;\n\n let currentRouteName: string | undefined;\n\n const unsubscribe = navigationRef.addListener('state', () => {\n const route = navigationRef.getCurrentRoute();\n if (!route) return;\n\n const previousRouteName = currentRouteName;\n currentRouteName = route.name;\n\n if (previousRouteName === currentRouteName) return;\n\n const screenName = screenNameFilter ? screenNameFilter(currentRouteName) : currentRouteName;\n if (!screenName) return;\n\n setCurrentScreen(screenName);\n\n if (trackScreenViews) {\n track('$screen_view', {\n screen_name: screenName,\n previous_screen: previousRouteName,\n params: route.params,\n });\n }\n\n if (addBreadcrumbs) {\n addBreadcrumb({\n type: 'navigation',\n category: 'screen',\n message: `Navigated to ${screenName}`,\n data: {\n from: previousRouteName,\n to: screenName,\n },\n });\n }\n });\n\n return () => {\n unsubscribe();\n setCurrentScreen(undefined);\n };\n}\n","/**\n * React Native Network Interception\n *\n * XHR monkey-patch for request tracking + breadcrumbs.\n * RN fetch is XHR internally, so intercepting XMLHttpRequest captures all network.\n */\n\nimport { addBreadcrumb } from '../index';\n\nexport interface NetworkInterceptionOptions {\n /** Track request/response as breadcrumbs (default: true) */\n addBreadcrumbs?: boolean;\n /** URL patterns to ignore (e.g., SitePong's own endpoints) */\n ignoreUrls?: (string | RegExp)[];\n /** Max breadcrumb data size in bytes (default: 1024) */\n maxDataSize?: number;\n}\n\nexport function setupNetworkInterception(options: NetworkInterceptionOptions = {}): () => void {\n const {\n addBreadcrumbs = true,\n ignoreUrls = [/sitepong\\.com/],\n maxDataSize = 1024,\n } = options;\n\n if (typeof XMLHttpRequest === 'undefined') {\n return () => {};\n }\n\n const originalOpen = XMLHttpRequest.prototype.open;\n const originalSend = XMLHttpRequest.prototype.send;\n\n XMLHttpRequest.prototype.open = function (\n method: string,\n url: string | URL,\n ...rest: unknown[]\n ) {\n const xhr = this as XMLHttpRequest & {\n _sitepong_method?: string;\n _sitepong_url?: string;\n _sitepong_startTime?: number;\n };\n\n xhr._sitepong_method = method;\n xhr._sitepong_url = String(url);\n\n return originalOpen.apply(this, [method, url, ...rest] as Parameters<typeof originalOpen>);\n };\n\n XMLHttpRequest.prototype.send = function (body?: Document | XMLHttpRequestBodyInit | null) {\n const xhr = this as XMLHttpRequest & {\n _sitepong_method?: string;\n _sitepong_url?: string;\n _sitepong_startTime?: number;\n };\n\n const url = xhr._sitepong_url || '';\n const method = xhr._sitepong_method || 'GET';\n\n // Check if URL should be ignored\n const shouldIgnore = ignoreUrls.some((pattern) => {\n if (typeof pattern === 'string') return url.includes(pattern);\n return pattern.test(url);\n });\n\n if (shouldIgnore) {\n return originalSend.call(this, body);\n }\n\n xhr._sitepong_startTime = Date.now();\n\n const onLoadEnd = () => {\n const duration = xhr._sitepong_startTime ? Date.now() - xhr._sitepong_startTime : undefined;\n\n if (addBreadcrumbs) {\n addBreadcrumb({\n type: 'http',\n category: 'xhr',\n message: `${method} ${url}`,\n level: xhr.status >= 400 ? 'error' : 'info',\n data: {\n method,\n url: url.length > maxDataSize ? url.substring(0, maxDataSize) : url,\n status_code: xhr.status,\n duration_ms: duration,\n },\n });\n }\n };\n\n this.addEventListener('loadend', onLoadEnd);\n return originalSend.call(this, body);\n };\n\n return () => {\n XMLHttpRequest.prototype.open = originalOpen;\n XMLHttpRequest.prototype.send = originalSend;\n };\n}\n","/**\n * React Native Autocapture Module\n *\n * Tracks AppState changes (foreground/background/inactive) automatically.\n */\n\nimport { AppState } from 'react-native';\nimport { track } from '../index';\n\nexport interface RNAutocaptureOptions {\n /** Track app state changes (default: true) */\n trackAppState?: boolean;\n}\n\nexport class RNAutocaptureModule {\n private options: Required<RNAutocaptureOptions>;\n private appStateSubscription: { remove: () => void } | null = null;\n private currentAppState: string = 'active';\n\n constructor(options: RNAutocaptureOptions = {}) {\n this.options = {\n trackAppState: options.trackAppState ?? true,\n };\n }\n\n start(): void {\n if (this.options.trackAppState) {\n this.setupAppStateTracking();\n }\n }\n\n stop(): void {\n if (this.appStateSubscription) {\n this.appStateSubscription.remove();\n this.appStateSubscription = null;\n }\n }\n\n private setupAppStateTracking(): void {\n try {\n this.currentAppState = AppState.currentState;\n\n this.appStateSubscription = AppState.addEventListener('change', (nextAppState: string) => {\n const previousState = this.currentAppState;\n this.currentAppState = nextAppState;\n\n if (previousState !== nextAppState) {\n track('$app_state_change', {\n from: previousState,\n to: nextAppState,\n });\n\n // Track specific transitions\n if (previousState.match(/inactive|background/) && nextAppState === 'active') {\n track('$app_foreground', {\n previous_state: previousState,\n });\n } else if (previousState === 'active' && nextAppState.match(/inactive|background/)) {\n track('$app_background', {\n next_state: nextAppState,\n });\n }\n }\n });\n } catch {\n // react-native AppState not available\n }\n }\n}\n","/**\n * React Native Performance Manager\n *\n * Cold start timing and screen render tracking for RN apps.\n */\n\nimport { track } from '../index';\n\nlet coldStartTimestamp: number | null = null;\nlet coldStartTracked = false;\n\n/**\n * Call at the very top of your app entry point to capture cold start.\n * Must be called before any async work.\n */\nexport function markColdStart(): void {\n coldStartTimestamp = Date.now();\n}\n\nexport class RNPerformanceManager {\n private screenRenderStarts: Map<string, number> = new Map();\n\n /**\n * Track cold start time from markColdStart() to now.\n * Should be called once the app is interactive (e.g., in the root component's useEffect).\n */\n trackColdStart(): void {\n if (coldStartTracked || !coldStartTimestamp) return;\n\n const duration = Date.now() - coldStartTimestamp;\n coldStartTracked = true;\n\n track('$cold_start', {\n duration_ms: duration,\n });\n }\n\n /**\n * Start tracking a screen render. Call before rendering starts.\n */\n startScreenRender(screenName: string): void {\n this.screenRenderStarts.set(screenName, Date.now());\n }\n\n /**\n * End tracking a screen render. Call after rendering completes.\n */\n endScreenRender(screenName: string): number | null {\n const startTime = this.screenRenderStarts.get(screenName);\n if (startTime === undefined) return null;\n\n this.screenRenderStarts.delete(screenName);\n const duration = Date.now() - startTime;\n\n track('$screen_render', {\n screen_name: screenName,\n duration_ms: duration,\n });\n\n return duration;\n }\n\n /**\n * Track a screen render using a useEffect-friendly pattern.\n * Returns a cleanup function.\n */\n trackScreenRender(screenName: string): () => void {\n this.startScreenRender(screenName);\n\n return () => {\n this.endScreenRender(screenName);\n };\n }\n}\n","/**\n * Push Notification & Live Activity token registration for React Native.\n *\n * Registers Expo push tokens and APNs Live Activity tokens with the\n * SitePong ingest server for remote push notification delivery.\n *\n * For Live Activities, prefer the turnkey `@sitepong/expo-live-activity`\n * package — it ships a built-in SwiftUI widget template (SF Symbols,\n * custom progress bar with sliding icon, visibility-driven slots) and\n * forwards push tokens to the registration functions in this file\n * automatically. Use the lower-level `registerLiveActivityToken` and\n * `registerPushToStartToken` exports below only if you author your own\n * iOS Widget Extension and `ActivityAttributes` struct in Swift.\n *\n * ## User attribution (two-step)\n *\n * These register* functions only store (project_id, token, device_id). They\n * deliberately do not accept or send a user_id — publishable SDK keys are\n * extractable from compiled apps, so letting the client attach arbitrary\n * user_ids would let a leaked key shadow-subscribe to another user's pushes.\n *\n * After the user authenticates with your backend, have your backend call\n * `POST /api/push/tokens/associate` (authenticated with your `sp_push_xxx`\n * server key) to bind the token to the user_id.\n *\n * @since 0.1.0\n */\n\nimport { client } from '../index';\nimport { collectDeviceInfo, fetchPersistentDeviceId } from './device';\n\ninterface PushEnvironmentOptions {\n environment: 'sandbox' | 'production';\n}\n\ninterface DeviceContext {\n deviceId?: string;\n platform?: string;\n appVersion?: string;\n deviceModel?: string;\n osVersion?: string;\n}\n\nlet cachedDeviceContext: DeviceContext | null = null;\n\nfunction getEndpoint(): string {\n const cfg = (client as unknown as { config: { endpoint: string; apiKey: string } }).config;\n return cfg?.endpoint || 'https://ingest.sitepong.com';\n}\n\nfunction getApiKey(): string {\n const cfg = (client as unknown as { config: { endpoint: string; apiKey: string } }).config;\n return cfg?.apiKey || '';\n}\n\nfunction getDeviceContext(): DeviceContext {\n if (cachedDeviceContext) return cachedDeviceContext;\n\n try {\n const info = collectDeviceInfo();\n cachedDeviceContext = {\n platform: info.platform,\n appVersion: info.appVersion,\n deviceModel: info.deviceModel,\n osVersion: info.osVersion,\n };\n\n fetchPersistentDeviceId().then((id) => {\n if (id && cachedDeviceContext) cachedDeviceContext.deviceId = id;\n });\n } catch {\n cachedDeviceContext = {};\n }\n\n return cachedDeviceContext;\n}\n\nasync function postToIngest(path: string, body: Record<string, unknown>): Promise<void> {\n const endpoint = getEndpoint();\n const apiKey = getApiKey();\n\n if (!apiKey) {\n console.warn('[SitePong] Cannot register push token: SDK not initialized');\n return;\n }\n\n try {\n const response = await fetch(`${endpoint}${path}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-API-Key': apiKey,\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n console.warn(`[SitePong] Push token registration failed: HTTP ${response.status}`);\n }\n } catch (err) {\n console.warn('[SitePong] Push token registration failed:', err);\n }\n}\n\nasync function deleteFromIngest(path: string, body: Record<string, unknown>): Promise<void> {\n const endpoint = getEndpoint();\n const apiKey = getApiKey();\n\n if (!apiKey) return;\n\n try {\n const response = await fetch(`${endpoint}${path}`, {\n method: 'DELETE',\n headers: {\n 'Content-Type': 'application/json',\n 'X-API-Key': apiKey,\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n console.warn(`[SitePong] Push token deactivation failed: HTTP ${response.status}`);\n }\n } catch (err) {\n console.warn('[SitePong] Push token deactivation failed:', err);\n }\n}\n\n/**\n * Register an Expo push token for receiving regular push notifications.\n *\n * To attach this token to an authenticated user, have your backend call\n * `POST https://api.sitepong.com/api/push/tokens/associate` with\n * `Authorization: Bearer sp_push_xxx` and body `{ token, user_id }`.\n */\nexport function registerPushToken(token: string, options: PushEnvironmentOptions): void {\n const device = getDeviceContext();\n\n postToIngest('/api/push/tokens', {\n expo_push_token: token,\n environment: options.environment,\n device_id: device.deviceId,\n platform: device.platform,\n app_version: device.appVersion,\n device_model: device.deviceModel,\n os_version: device.osVersion,\n });\n}\n\n/**\n * Register a native device token (APNs or FCM) for direct push delivery.\n * This bypasses Expo and sends directly to Apple/Google.\n *\n * @param token - The raw device token (hex string for APNs, FCM registration token for Android)\n * @param options - Platform and environment. `userId` is accepted but ignored\n * — see the two-step attribution note at the top of this file.\n */\nexport function registerDeviceToken(\n token: string,\n options: {\n platform: 'ios' | 'android';\n environment: 'sandbox' | 'production';\n /** @deprecated Ignored. Associate via POST /api/push/tokens/associate from your backend. */\n userId?: string;\n }\n): void {\n const device = getDeviceContext();\n\n const tokenType = options.platform === 'ios' ? 'apns' : 'fcm';\n\n postToIngest('/api/push/tokens', {\n native_device_token: token,\n token_type: tokenType,\n environment: options.environment,\n device_id: device.deviceId,\n platform: options.platform,\n app_version: device.appVersion,\n device_model: device.deviceModel,\n os_version: device.osVersion,\n });\n}\n\n/**\n * Register a running Live Activity's push token for remote updates.\n */\nexport function registerLiveActivityToken(\n activityType: string,\n activityId: string,\n pushToken: string,\n options: PushEnvironmentOptions\n): void {\n const device = getDeviceContext();\n\n postToIngest('/api/push/live-activity-tokens', {\n activity_type: activityType,\n activity_id: activityId,\n push_token: pushToken,\n environment: options.environment,\n device_id: device.deviceId,\n });\n}\n\n/**\n * Register a push-to-start token for remotely launching Live Activities (iOS 17.2+).\n */\nexport function registerPushToStartToken(\n activityType: string,\n pushToStartToken: string,\n options: PushEnvironmentOptions\n): void {\n const device = getDeviceContext();\n\n postToIngest('/api/push/push-to-start-tokens', {\n activity_type: activityType,\n push_to_start_token: pushToStartToken,\n environment: options.environment,\n device_id: device.deviceId,\n });\n}\n\n/**\n * Mark a Live Activity as ended (deactivates its token).\n */\nexport function endLiveActivity(activityType: string, activityId: string): void {\n deleteFromIngest('/api/push/live-activity-tokens', {\n activity_type: activityType,\n activity_id: activityId,\n });\n}\n\n/**\n * Clear cached device context (useful for testing).\n */\nexport function clearPushCache(): void {\n cachedDeviceContext = null;\n}\n","/**\n * SitePong React Native Provider\n *\n * Mirrors the react/provider.tsx pattern with RN-specific setup.\n */\n\nimport React, { createContext, useContext, useEffect, useRef, useState } from 'react';\nimport type { SitePongInitConfig } from '../index';\nimport { initRN } from '../index';\nimport { createAsyncStorageAdapter } from './storage';\nimport type { AsyncStorageLike } from './storage';\nimport { collectDeviceInfo, fetchPersistentDeviceId } from './device';\nimport { setRNDeviceInfo, setNativeDeviceId } from '../utils/platform';\nimport { setupRNErrorHandler } from './error-handler';\nimport { createNavigationTracker } from './navigation';\nimport type { NavigationRef } from './navigation';\nimport { setupNetworkInterception } from './network';\nimport { RNAutocaptureModule } from './autocapture';\nimport { RNPerformanceManager } from './performance';\nimport { startScreenRecordingOnError, stopScreenRecording } from './screen-recorder';\nimport type { ScreenRecordingConfig } from './screen-recorder';\nimport { registerDeviceToken } from './push';\n\ninterface SitePongRNContextValue {\n isInitialized: boolean;\n performanceManager: RNPerformanceManager | null;\n}\n\nexport const SitePongRNContext = createContext<SitePongRNContextValue>({\n isInitialized: false,\n performanceManager: null,\n});\n\nexport interface SitePongRNProviderProps {\n /** API key in format: sp_live_xxx or sp_test_xxx */\n apiKey: string;\n /** Additional configuration options */\n config?: Omit<SitePongInitConfig, 'apiKey'>;\n /** AsyncStorage instance for persistence */\n asyncStorage?: AsyncStorageLike;\n /** React Navigation ref for screen tracking */\n navigationRef?: NavigationRef;\n /** Enable network request interception (default: true) */\n trackNetwork?: boolean;\n /** Enable app state tracking (default: true) */\n trackAppState?: boolean;\n /** Enable error handler setup (default: true) */\n captureErrors?: boolean;\n /** Screen recording configuration — records rolling buffer, only sends on error */\n screenRecording?: ScreenRecordingConfig;\n /** Native device token (APNs hex string or FCM registration token) for direct push delivery */\n devicePushToken?: string;\n /** Device platform — required when using devicePushToken */\n devicePlatform?: 'ios' | 'android';\n /** APNs environment for push notifications */\n pushEnvironment?: 'sandbox' | 'production';\n /**\n * @deprecated Ignored. Associate via `POST /api/push/tokens/associate`\n * from your backend using a `sp_push_xxx` key — see the SDK README.\n */\n pushUserId?: string;\n children: React.ReactNode;\n}\n\nexport function SitePongRNProvider({\n apiKey,\n config = {},\n asyncStorage,\n navigationRef,\n trackNetwork = true,\n trackAppState = true,\n captureErrors = true,\n screenRecording,\n devicePushToken,\n devicePlatform,\n pushEnvironment = 'production',\n pushUserId,\n children,\n}: SitePongRNProviderProps): React.ReactElement {\n const initialized = useRef(false);\n const [sdkReady, setSdkReady] = useState(false);\n const performanceManagerRef = useRef<RNPerformanceManager | null>(null);\n\n useEffect(() => {\n if (initialized.current) return;\n\n const teardowns: Array<() => void> = [];\n\n // Collect and set device info\n const deviceInfo = collectDeviceInfo();\n setRNDeviceInfo({\n platform: 'react-native',\n osName: deviceInfo.platform,\n osVersion: deviceInfo.osVersion,\n deviceName: deviceInfo.deviceName,\n deviceBrand: deviceInfo.deviceBrand,\n deviceModel: deviceInfo.deviceModel,\n appVersion: deviceInfo.appVersion,\n screenWidth: deviceInfo.screenWidth,\n screenHeight: deviceInfo.screenHeight,\n isEmulator: deviceInfo.isEmulator,\n });\n\n // Fetch persistent device ID from @sitepong/device-id (async, non-blocking)\n fetchPersistentDeviceId().then((id) => {\n if (id) setNativeDeviceId(id);\n }).catch(() => {});\n\n // Create storage adapter\n const storageAdapter = asyncStorage ? createAsyncStorageAdapter(asyncStorage) : undefined;\n\n // Initialize SDK (RN-only subsystems — no browser code)\n initRN({\n apiKey,\n ...config,\n _storageAdapter: storageAdapter,\n });\n\n // Setup error handler\n if (captureErrors) {\n const teardownErrors = setupRNErrorHandler();\n teardowns.push(teardownErrors);\n }\n\n // Setup network interception\n if (trackNetwork) {\n const teardownNetwork = setupNetworkInterception();\n teardowns.push(teardownNetwork);\n }\n\n // Setup autocapture\n if (trackAppState) {\n const autocapture = new RNAutocaptureModule({ trackAppState: true });\n autocapture.start();\n teardowns.push(() => autocapture.stop());\n }\n\n // Setup navigation tracking\n if (navigationRef) {\n const teardownNav = createNavigationTracker(navigationRef);\n teardowns.push(teardownNav);\n }\n\n // Setup screen recording (on-error mode: 10s rolling buffer, auto-flushed on error)\n if (screenRecording?.enabled) {\n const sessionId = `rn_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 10)}`;\n const endpoint = config.endpoint || 'https://ingest.sitepong.com';\n startScreenRecordingOnError(apiKey, endpoint, sessionId, screenRecording);\n teardowns.push(() => stopScreenRecording());\n }\n\n // Register native device token for direct APNs/FCM delivery\n if (devicePushToken && devicePlatform) {\n registerDeviceToken(devicePushToken, { platform: devicePlatform, environment: pushEnvironment, userId: pushUserId });\n }\n\n // Setup performance manager\n performanceManagerRef.current = new RNPerformanceManager();\n performanceManagerRef.current.trackColdStart();\n\n initialized.current = true;\n setSdkReady(true);\n\n return () => {\n for (const teardown of teardowns) {\n teardown();\n }\n };\n }, [apiKey]);\n\n const value: SitePongRNContextValue = {\n isInitialized: sdkReady,\n performanceManager: performanceManagerRef.current,\n };\n\n return (\n <SitePongRNContext.Provider value={value}>\n {children}\n </SitePongRNContext.Provider>\n );\n}\n\nexport function useSitePongRNContext(): SitePongRNContextValue {\n return useContext(SitePongRNContext);\n}\n","/**\n * React Native Hooks\n *\n * RN-specific hooks + re-exported base hooks.\n */\n\nimport { useContext, useEffect, useRef, useState } from 'react';\nimport { AppState } from 'react-native';\nimport { SitePongRNContext } from './provider';\nimport { getRemoteConfig, onRemoteConfigChange } from '../index';\nimport type { RemoteConfig } from '../remote-config';\n\n/**\n * Track a screen render automatically via useEffect.\n */\nexport function useScreenTrack(screenName: string): void {\n const { performanceManager } = useContext(SitePongRNContext);\n\n useEffect(() => {\n if (!performanceManager) return;\n\n performanceManager.startScreenRender(screenName);\n\n return () => {\n performanceManager.endScreenRender(screenName);\n };\n }, [screenName, performanceManager]);\n}\n\n/**\n * Track app state with a reactive hook.\n */\nexport function useAppState(): string {\n const [appState, setAppState] = useState('active');\n\n useEffect(() => {\n setAppState(AppState.currentState);\n\n const subscription = AppState.addEventListener('change', (nextState: string) => {\n setAppState(nextState);\n });\n\n return () => subscription.remove();\n }, []);\n\n return appState;\n}\n\n/**\n * Access remote config with reactive updates.\n */\nexport function useRemoteConfig(): RemoteConfig | null {\n const [config, setConfig] = useState<RemoteConfig | null>(() => getRemoteConfig());\n\n useEffect(() => {\n // Set initial value\n setConfig(getRemoteConfig());\n\n // Listen for changes\n const unsubscribe = onRemoteConfigChange((newConfig) => {\n setConfig(newConfig);\n });\n\n return unsubscribe;\n }, []);\n\n return config;\n}\n\n/**\n * Track screen render performance. Returns duration when render completes.\n */\nexport function useRNPerformance(screenName: string): { duration: number | null } {\n const { performanceManager } = useContext(SitePongRNContext);\n const [duration, setDuration] = useState<number | null>(null);\n const startTimeRef = useRef<number>(Date.now());\n\n useEffect(() => {\n startTimeRef.current = Date.now();\n\n // On next frame, measure the render time\n const handle = requestAnimationFrame(() => {\n const d = Date.now() - startTimeRef.current;\n setDuration(d);\n\n if (performanceManager) {\n performanceManager.startScreenRender(screenName);\n performanceManager.endScreenRender(screenName);\n }\n });\n\n return () => cancelAnimationFrame(handle);\n }, [screenName, performanceManager]);\n\n return { duration };\n}\n","/**\n * SQLite Query Tracker for expo-sqlite\n *\n * Wraps an expo-sqlite database handle to intercept and time all queries.\n * Slow queries are reported as analytics events and breadcrumbs.\n */\n\nimport { track, addBreadcrumb } from '../index';\n\nexport interface TrackedDatabaseOptions {\n /** Threshold in ms — queries slower than this are tracked (default: 100) */\n slowQueryThreshold?: number;\n /** If true, track every query regardless of duration (default: false) */\n trackAll?: boolean;\n}\n\n/** Minimal interface matching expo-sqlite's SQLiteDatabase */\ninterface SQLiteDatabase {\n execAsync(sql: string): Promise<void>;\n runAsync(sql: string, ...params: unknown[]): Promise<{ changes: number; lastInsertRowId: number }>;\n getAllAsync(sql: string, ...params: unknown[]): Promise<unknown[]>;\n getFirstAsync(sql: string, ...params: unknown[]): Promise<unknown | null>;\n execSync(sql: string): void;\n runSync(sql: string, ...params: unknown[]): { changes: number; lastInsertRowId: number };\n getAllSync(sql: string, ...params: unknown[]): unknown[];\n getFirstSync(sql: string, ...params: unknown[]): unknown | null;\n [key: string]: unknown;\n}\n\nfunction now(): number {\n if (typeof performance !== 'undefined' && typeof performance.now === 'function') {\n return performance.now();\n }\n return Date.now();\n}\n\nfunction reportQuery(\n sql: string,\n durationMs: number,\n rowCount: number | undefined,\n options: Required<Pick<TrackedDatabaseOptions, 'slowQueryThreshold' | 'trackAll'>>,\n): void {\n const shouldTrack = options.trackAll || durationMs >= options.slowQueryThreshold;\n if (!shouldTrack) return;\n\n const properties: Record<string, unknown> = {\n sql: sql.length > 500 ? sql.slice(0, 500) + '...' : sql,\n durationMs: Math.round(durationMs * 100) / 100,\n };\n if (rowCount !== undefined) {\n properties.rowCount = rowCount;\n }\n\n track('$sqlite_query', properties);\n\n addBreadcrumb({\n type: 'default',\n category: 'sqlite',\n message: sql.length > 200 ? sql.slice(0, 200) + '...' : sql,\n level: durationMs >= options.slowQueryThreshold ? 'warning' : 'info',\n data: properties,\n });\n}\n\n/**\n * Wrap an expo-sqlite database with query timing and tracking.\n *\n * Returns a proxy that intercepts all query methods. Use it exactly like the\n * original database — same API, same return values.\n *\n * @example\n * ```ts\n * import { createTrackedDatabase } from 'sitepong/react-native';\n * import * as SQLite from 'expo-sqlite';\n *\n * const db = SQLite.openDatabaseSync('myapp.db');\n * const trackedDb = createTrackedDatabase(db, { slowQueryThreshold: 100 });\n * const users = trackedDb.getAllSync('SELECT * FROM users WHERE active = 1');\n * ```\n */\nexport function createTrackedDatabase<T extends SQLiteDatabase>(\n db: T,\n options: TrackedDatabaseOptions = {},\n): T {\n const threshold = options.slowQueryThreshold ?? 100;\n const trackAll = options.trackAll ?? false;\n const opts = { slowQueryThreshold: threshold, trackAll };\n\n return new Proxy(db, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n\n if (typeof value !== 'function') return value;\n\n const method = prop as string;\n\n // Async methods\n if (method === 'execAsync') {\n return async function trackedExecAsync(sql: string) {\n const start = now();\n const result = await target.execAsync(sql);\n reportQuery(sql, now() - start, undefined, opts);\n return result;\n };\n }\n\n if (method === 'runAsync') {\n return async function trackedRunAsync(sql: string, ...params: unknown[]) {\n const start = now();\n const result = await target.runAsync(sql, ...params);\n reportQuery(sql, now() - start, result.changes, opts);\n return result;\n };\n }\n\n if (method === 'getAllAsync') {\n return async function trackedGetAllAsync(sql: string, ...params: unknown[]) {\n const start = now();\n const result = await target.getAllAsync(sql, ...params);\n reportQuery(sql, now() - start, Array.isArray(result) ? result.length : undefined, opts);\n return result;\n };\n }\n\n if (method === 'getFirstAsync') {\n return async function trackedGetFirstAsync(sql: string, ...params: unknown[]) {\n const start = now();\n const result = await target.getFirstAsync(sql, ...params);\n reportQuery(sql, now() - start, result != null ? 1 : 0, opts);\n return result;\n };\n }\n\n // Sync methods\n if (method === 'execSync') {\n return function trackedExecSync(sql: string) {\n const start = now();\n const result = target.execSync(sql);\n reportQuery(sql, now() - start, undefined, opts);\n return result;\n };\n }\n\n if (method === 'runSync') {\n return function trackedRunSync(sql: string, ...params: unknown[]) {\n const start = now();\n const result = target.runSync(sql, ...params);\n reportQuery(sql, now() - start, result.changes, opts);\n return result;\n };\n }\n\n if (method === 'getAllSync') {\n return function trackedGetAllSync(sql: string, ...params: unknown[]) {\n const start = now();\n const result = target.getAllSync(sql, ...params);\n reportQuery(sql, now() - start, Array.isArray(result) ? result.length : undefined, opts);\n return result;\n };\n }\n\n if (method === 'getFirstSync') {\n return function trackedGetFirstSync(sql: string, ...params: unknown[]) {\n const start = now();\n const result = target.getFirstSync(sql, ...params);\n reportQuery(sql, now() - start, result != null ? 1 : 0, opts);\n return result;\n };\n }\n\n // Pass through all other methods unchanged\n return value.bind(target);\n },\n });\n}\n","import { client } from '../index';\n\nlet syncTimer: ReturnType<typeof setInterval> | null = null;\nlet cachedVersion = 0;\n\nfunction getNativeModule(): { syncWidgetConfigs(json: string): Promise<void>; updateWidgetData(json: string): Promise<void> } | null {\n try {\n return require('@sitepong/expo-live-activity');\n } catch {\n return null;\n }\n}\n\nexport interface WidgetSyncOptions {\n refreshInterval?: number;\n}\n\nfunction getEndpoint(): string {\n const cfg = (client as unknown as { config: { endpoint: string; apiKey: string } }).config;\n return cfg?.endpoint || 'https://api.sitepong.com';\n}\n\nfunction getApiKey(): string {\n const cfg = (client as unknown as { config: { endpoint: string; apiKey: string } }).config;\n return cfg?.apiKey || '';\n}\n\nexport async function syncWidgets(options?: WidgetSyncOptions): Promise<void> {\n const apiKey = getApiKey();\n if (!apiKey) return;\n\n const mod = getNativeModule();\n if (!mod) return;\n\n try {\n const res = await fetch(`${getEndpoint()}/api/sdk/widgets/config`, {\n headers: { 'X-API-Key': apiKey },\n });\n\n if (!res.ok) return;\n\n const data = await res.json();\n const widgets = data.widgets || [];\n\n const maxVersion = widgets.reduce((max: number, w: { version: number }) => Math.max(max, w.version), 0);\n if (maxVersion <= cachedVersion && cachedVersion > 0) return;\n\n cachedVersion = maxVersion;\n await mod.syncWidgetConfigs(JSON.stringify(widgets));\n } catch (err) {\n console.warn('[SitePong] Widget sync failed:', err);\n }\n\n if (syncTimer) clearInterval(syncTimer);\n const interval = options?.refreshInterval ?? 900000;\n syncTimer = setInterval(() => syncWidgets(options), interval);\n}\n\nexport async function updateWidgetData(data: Record<string, unknown>): Promise<void> {\n const mod = getNativeModule();\n if (!mod) return;\n\n try {\n await mod.updateWidgetData(JSON.stringify(data));\n } catch (err) {\n console.warn('[SitePong] Widget data update failed:', err);\n }\n}\n\nexport function triggerWidgetRefresh(): void {\n const mod = getNativeModule();\n if (!mod) return;\n mod.updateWidgetData('{}').catch(() => {});\n}\n\nexport function stopWidgetSync(): void {\n if (syncTimer) {\n clearInterval(syncTimer);\n syncTimer = null;\n }\n}\n","/**\n * SuperLink — React Native deferred deep linking / attribution.\n *\n * On first launch, the SDK resolves the deep link the user originally clicked\n * before the app was installed (\"deferred deep link\"), bridging the install\n * gap that ordinary Universal Links / App Links can't cross:\n *\n * - Android: read the Play Install Referrer to recover the deterministic\n * `click_id` the redirect engine stamped on the Play Store URL.\n * - iOS: attempt a clipboard read for a click token handed off by the\n * interstitial (Safari → App Store → app).\n * - Both: gather a minimal device fingerprint (UA/model/os/os_version/locale)\n * as a probabilistic fallback.\n *\n * It then POSTs /match and, on a hit, invokes any registered\n * onDeferredDeepLink handler with the resolved payload.\n *\n * For apps that are ALREADY installed, use parseUniversalLink() +\n * createSuperLinkListener() to handle direct opens and report `opened` events.\n *\n * Every native dependency is loaded through guarded optional requires, exactly\n * like the rest of the RN SDK — so an app that hasn't installed\n * `react-native-play-install-referrer` / `expo-clipboard` still builds and the\n * SDK degrades to fingerprint-only matching.\n */\n\nimport { Platform } from 'react-native';\nimport { superlinkClient } from '../superlink/client.js';\nimport { parseUniversalLink } from '../superlink/parse.js';\nimport { extractIdentityMetadata } from '../superlink/web.js';\nimport {\n toDeepLink,\n emitDeferredDeepLink,\n onDeferredDeepLink,\n getMatchedDeepLink,\n} from '../superlink/deferred.js';\nimport type {\n SuperLinkConfig,\n SuperLinkDeepLink,\n SuperLinkFingerprint,\n SuperLinkPlatform,\n SuperLinkIdentityMetadata,\n DeferredDeepLinkHandler,\n} from '../superlink/types.js';\n\nlet started = false;\n\nfunction platform(): SuperLinkPlatform {\n if (Platform.OS === 'ios') return 'ios';\n if (Platform.OS === 'android') return 'android';\n return 'other';\n}\n\nfunction locale(): string | undefined {\n try {\n // RN exposes locale via NativeModules; fall back to Intl when present.\n const tag =\n typeof Intl !== 'undefined' && typeof Intl.DateTimeFormat === 'function'\n ? Intl.DateTimeFormat().resolvedOptions().locale\n : undefined;\n return tag || undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction collectFingerprint(): SuperLinkFingerprint {\n const fp: SuperLinkFingerprint = { platform: platform() };\n const osVersion = Platform.Version;\n if (osVersion !== undefined && osVersion !== null) fp.os_version = String(osVersion);\n fp.os = Platform.OS;\n const lang = locale();\n if (lang) fp.language = lang;\n\n // expo-device (optional) gives us the model name when present.\n try {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const device = require('expo-device') as { modelName?: string | null };\n if (device?.modelName) fp.device_model = device.modelName;\n } catch {\n /* expo-device not installed — fingerprint stays minimal */\n }\n return fp;\n}\n\n/**\n * Android: read the Play Install Referrer to recover the deterministic click\n * token. Guarded — returns undefined if the lib isn't installed or on iOS.\n */\nasync function readPlayInstallReferrer(): Promise<string | undefined> {\n if (Platform.OS !== 'android') return undefined;\n let mod: {\n PlayInstallReferrer?: {\n getInstallReferrerInfo(\n cb: (info: { installReferrer?: string } | null, error?: unknown) => void\n ): void;\n };\n } | null = null;\n try {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n mod = require('react-native-play-install-referrer');\n } catch {\n return undefined;\n }\n const PlayInstallReferrer = mod?.PlayInstallReferrer;\n if (!PlayInstallReferrer) return undefined;\n\n const referrer = await new Promise<string | undefined>((resolve) => {\n try {\n PlayInstallReferrer.getInstallReferrerInfo((info, error) => {\n if (error || !info?.installReferrer) return resolve(undefined);\n resolve(info.installReferrer);\n });\n } catch {\n resolve(undefined);\n }\n });\n if (!referrer) return undefined;\n\n // The referrer is a urlencoded query string; pull our click_id out of it.\n try {\n const params = new URLSearchParams(referrer);\n return params.get('click_id') ?? params.get('referrer') ?? undefined;\n } catch {\n return undefined;\n }\n}\n\n/**\n * iOS: read the raw clipboard string and return it verbatim IF it carries a\n * SuperLink token. The engine parses the token from the raw value, so we hand\n * the whole clipboard string through as `clipboard_token` rather than pulling\n * the id out here. Tries @react-native-clipboard/clipboard then expo-clipboard.\n * Guarded — returns undefined off iOS or when neither lib is installed.\n */\nasync function readClipboardToken(): Promise<string | undefined> {\n if (Platform.OS !== 'ios') return undefined;\n\n let value: string | null | undefined;\n\n // @react-native-clipboard/clipboard\n try {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const clip = require('@react-native-clipboard/clipboard');\n const Clipboard = clip?.default ?? clip;\n if (Clipboard?.getString) {\n value = await Clipboard.getString();\n }\n } catch {\n /* not installed — try expo-clipboard */\n }\n\n // expo-clipboard\n if (value == null) {\n try {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const expoClip = require('expo-clipboard') as {\n getStringAsync?: () => Promise<string>;\n };\n if (expoClip?.getStringAsync) {\n value = await expoClip.getStringAsync();\n }\n } catch {\n /* not installed */\n }\n }\n\n return hasSuperLinkToken(value) ? value!.trim() : undefined;\n}\n\n/**\n * True when a clipboard string contains a SuperLink token: a \"/c/<id>\" click\n * URL, a \"splk:<id>\" / \"pongl.ink/c/<id>\" form, or a bare uuid. We only POST\n * /match when the clipboard plausibly holds a token, to avoid leaking unrelated\n * clipboard contents to the engine.\n */\nfunction hasSuperLinkToken(value: string | null | undefined): boolean {\n if (!value) return false;\n const trimmed = value.trim();\n if (/^splk:[\\w-]+$/i.test(trimmed)) return true;\n if (/\\/c\\/[\\w-]+/i.test(trimmed)) return true;\n // Bare uuid\n if (/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(trimmed)) return true;\n return false;\n}\n\n/**\n * Configure SuperLink and run deferred-attribution on first launch.\n *\n * Idempotent: the /match round-trip runs at most once per process. Safe to\n * call from app bootstrap. Returns the matched deep link, or null.\n *\n * Supports identity metadata extraction from the clipboard or from passed options,\n * enabling deterministic matching when the user has provided email/phone/custom\n * attributes on the source link.\n */\nexport async function initSuperLinkRN(\n config: SuperLinkConfig = {},\n identityOverride?: SuperLinkIdentityMetadata\n): Promise<SuperLinkDeepLink | null> {\n superlinkClient.configure(config);\n if (started) return getMatchedDeepLink();\n started = true;\n\n const fingerprint = collectFingerprint();\n const [referrer, clipboardToken] = await Promise.all([\n readPlayInstallReferrer(),\n readClipboardToken(),\n ]);\n\n // Extract identity metadata from clipboard URL if present, or use override.\n let identity: SuperLinkIdentityMetadata | undefined = identityOverride;\n if (!identity && clipboardToken) {\n try {\n identity = extractIdentityMetadata(clipboardToken);\n } catch {\n /* ignore malformed URL */\n }\n }\n\n // Resolution order is enforced engine-side: referrer → clipboard_token →\n // qr_token → identity → fingerprint. We send every signal we gathered.\n const res = await superlinkClient.match({\n fingerprint,\n ...(referrer ? { referrer } : {}),\n ...(clipboardToken ? { clipboard_token: clipboardToken } : {}),\n ...(identity ? { identity } : {}),\n });\n\n if (!res.matched) return null;\n\n const link = toDeepLink(res);\n emitDeferredDeepLink(link);\n return link;\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 matches the identity against an unmatched click's metadata.\n * Fires onDeferredDeepLink on a hit. Returns the resolved deep link, or null.\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 = await superlinkClient.match({\n identity,\n fingerprint: collectFingerprint(),\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.\n */\nexport async function completeFromScan(\n scanned: string\n): Promise<SuperLinkDeepLink | null> {\n if (!scanned) return null;\n const res = await superlinkClient.match({\n qr_token: scanned,\n fingerprint: collectFingerprint(),\n });\n if (!res.matched) return null;\n const link = toDeepLink(res);\n emitDeferredDeepLink(link);\n return link;\n}\n\n/**\n * Handle a direct open of an already-installed app via a Universal Link /\n * App Link URL: parse the payload and report an `opened` event. Returns the\n * parsed deep link (does NOT fire onDeferredDeepLink handlers — that channel is\n * reserved for deferred first-launch matches).\n */\nexport function handleUniversalLink(url: string): SuperLinkDeepLink | null {\n const link = parseUniversalLink(url);\n if (!link) return null;\n void superlinkClient.reportEvent({\n type: 'opened',\n click_id: link.click_id,\n platform: platform(),\n properties: { surface: 'native', url },\n });\n return link;\n}\n\ninterface LinkingLike {\n getInitialURL(): Promise<string | null>;\n addEventListener(\n type: 'url',\n handler: (event: { url: string }) => void\n ): { remove(): void } | void;\n removeEventListener?(type: 'url', handler: (event: { url: string }) => void): void;\n}\n\n/**\n * Wire RN Linking to handle already-installed opens. Processes the cold-start\n * URL (getInitialURL) and subsequent warm opens, calling `onLink` with the\n * parsed payload and reporting `opened` events. Returns an unsubscribe fn.\n *\n * Pass your app's `Linking` module from 'react-native' (kept as a param so this\n * file has no hard dependency on the Linking native module at import time).\n */\nexport function createSuperLinkListener(\n Linking: LinkingLike,\n onLink: DeferredDeepLinkHandler\n): () => void {\n const onUrl = (event: { url: string }) => {\n const link = handleUniversalLink(event.url);\n if (link) onLink(link);\n };\n\n Linking.getInitialURL()\n .then((url) => {\n if (url) onUrl({ url });\n })\n .catch(() => {\n /* ignore */\n });\n\n const subscription = Linking.addEventListener('url', onUrl);\n\n return () => {\n if (subscription && typeof (subscription as { remove?: () => void }).remove === 'function') {\n (subscription as { remove: () => void }).remove();\n } else if (Linking.removeEventListener) {\n Linking.removeEventListener('url', onUrl);\n }\n };\n}\n\n/**\n * Report a downstream conversion (signup, purchase, ...) back to the redirect\n * engine, attributed to the matched click when available.\n */\nexport async function reportConversion(\n props: Record<string, unknown> = {}\n): Promise<boolean> {\n const matched = getMatchedDeepLink();\n return superlinkClient.reportEvent({\n type: 'converted',\n click_id: matched?.click_id ?? null,\n platform: platform(),\n match_type: matched?.match_type,\n properties: props,\n });\n}\n\nexport { parseUniversalLink };\nexport { onDeferredDeepLink, getMatchedDeepLink };\n","/**\n * React Native entry point for SitePong SDK.\n *\n * Installs the RN EnvironmentAdapter first, then re-exports the RN public\n * API (SitePongRNProvider + RN-safe SDK functions). Consumers should use\n * `initRN()` (not `init()`), which does not touch DOM APIs.\n *\n * Because this module installs the env adapter at import time, simply\n * importing `sitepong/react-native` is enough to make shared SDK modules\n * route all environment access through the RN adapter.\n */\n\nimport { createRNEnvironment } from '../platforms/rn/environment';\nimport { setEnvironment } from '../utils/platform';\nimport type { StorageAdapter } from '../adapters/storage';\n\nconst env = createRNEnvironment();\nsetEnvironment(env);\n\n/**\n * Advanced: inject a StorageAdapter (e.g. AsyncStorage/MMKV-backed) after app boot.\n * Typically called by SitePongRNProvider.\n */\nexport function setRNStorage(storage: StorageAdapter | null): void {\n env._setStorage(storage);\n}\n\n// Re-export the full RN public API. This intentionally does NOT export\n// browser-only managers (Replay, WebVitals, Fingerprint) — see index.ts\n// registerWebManagerFactories() for how those are scoped to web bundles.\nexport * from '../react-native';\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/platforms/rn/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","../../src/superlink/client.ts","../../src/superlink/parse.ts","../../src/superlink/deferred.ts","../../src/superlink/web.ts","../../src/index.ts","../../src/react-native/storage.ts","../../src/react-native/device.ts","../../src/react-native/screen-recorder.ts","../../src/react-native/error-handler.ts","../../src/react-native/navigation.ts","../../src/react-native/network.ts","../../src/react-native/autocapture.ts","../../src/react-native/performance.ts","../../src/react-native/push.ts","../../src/react-native/provider.tsx","../../src/react-native/hooks.ts","../../src/react-native/sqlite-tracker.ts","../../src/react-native/widgets.ts","../../src/react-native/superlink.ts","../../src/entries/rn.ts"],"names":["env","ErrorUtils","now","STORAGE_KEY","DEFAULT_ENDPOINT","platform","UTM_KEYS","DEFAULT_BATCH_SIZE","DEFAULT_FLUSH_INTERVAL","MAX_FLUSH_FAILURES","getVariantPayload","identify","Dimensions","Platform","AppState","createContext","useRef","useState","useEffect","jsx","useContext","getNativeModule","getEndpoint","getApiKey","completeFromScan"],"mappings":"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","file":"rn.js","sourcesContent":["/**\n * React Native EnvironmentAdapter.\n * Does NOT touch `window`, `document`, or `localStorage`.\n *\n * RN device info (deviceModel/osName/etc.) and AsyncStorage/MMKV-backed storage\n * are injected from the consuming app via the SitePongProvider, because they\n * depend on peer deps (@sitepong/device-id, @react-native-async-storage/async-storage).\n */\n\nimport type {\n MutableRNEnvironmentAdapter,\n DeviceInfo,\n Unsubscribe,\n} from '../../adapters/environment';\nimport type { StorageAdapter } from '../../adapters/storage';\n\nexport interface RNEnvironmentOptions {\n /** Storage backed by AsyncStorage/MMKV, supplied by host app. */\n storage?: StorageAdapter | null;\n /** Device info collected by the RN provider. */\n deviceInfo?: Partial<DeviceInfo>;\n /** Getter for the current screen/route name. */\n getCurrentScreen?: () => string | undefined;\n}\n\nexport function createRNEnvironment(\n options: RNEnvironmentOptions = {}\n): MutableRNEnvironmentAdapter {\n let deviceInfo: DeviceInfo = {\n platform: 'react-native',\n ...options.deviceInfo,\n };\n let getCurrentScreen = options.getCurrentScreen;\n\n const env: MutableRNEnvironmentAdapter = {\n platform: 'react-native',\n storage: options.storage ?? null,\n\n getDeviceInfo(): DeviceInfo {\n return deviceInfo;\n },\n\n getCurrentUrl(): string | undefined {\n return getCurrentScreen ? getCurrentScreen() : undefined;\n },\n\n getReferrer(): string | undefined {\n return undefined;\n },\n\n getUserAgent(): string | undefined {\n const osPart = deviceInfo.osName\n ? `${deviceInfo.osName}${\n deviceInfo.osVersion ? ` ${deviceInfo.osVersion}` : ''\n }`\n : undefined;\n const devicePart = deviceInfo.deviceModel || deviceInfo.deviceName;\n if (!osPart && !devicePart) return undefined;\n return `SitePong-RN/${[osPart, devicePart].filter(Boolean).join('; ')}`;\n },\n\n onUncaughtError(handler: (err: unknown) => void): Unsubscribe {\n const g = globalThis as unknown as {\n ErrorUtils?: {\n getGlobalHandler?: () => ((err: Error, isFatal?: boolean) => void) | undefined;\n setGlobalHandler?: (h: (err: Error, isFatal?: boolean) => void) => void;\n };\n };\n const ErrorUtils = g.ErrorUtils;\n if (!ErrorUtils || !ErrorUtils.setGlobalHandler || !ErrorUtils.getGlobalHandler) {\n return () => {};\n }\n const prev = ErrorUtils.getGlobalHandler();\n ErrorUtils.setGlobalHandler((err, isFatal) => {\n try {\n handler(err);\n } finally {\n if (prev) prev(err, isFatal);\n }\n });\n return () => {\n if (prev) ErrorUtils.setGlobalHandler!(prev);\n };\n },\n\n onUnhandledRejection(handler: (reason: unknown) => void): Unsubscribe {\n // RN does not have a shared-SDK unhandled-rejection hook. The RN\n // provider installs `promise/setimmediate/rejection-tracking` itself\n // in `src/react-native/error-handler.ts`; this stub exists so shared\n // code can safely call `env.onUnhandledRejection(...)` without platform\n // checks.\n void handler;\n return () => {};\n },\n\n onBeforeTerminate(handler: () => void): Unsubscribe {\n // RN uses AppState 'background' as the terminate-proxy. The provider\n // wires AppState listeners in `src/react-native/provider.tsx`; this\n // stub is intentional.\n void handler;\n return () => {};\n },\n\n onVisibilityHidden(handler: () => void): Unsubscribe {\n // RN equivalent is AppState 'background', wired by the provider.\n void handler;\n return () => {};\n },\n\n _setDeviceInfo(info: Partial<DeviceInfo>): void {\n deviceInfo = { ...deviceInfo, ...info };\n },\n\n _setGetCurrentScreen(fn): void {\n getCurrentScreen = fn;\n },\n\n _setStorage(storage: StorageAdapter | null): void {\n env.storage = storage;\n },\n };\n\n return env;\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","/**\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","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","/**\n * React Native Storage Adapter\n *\n * Wraps any AsyncStorage-compatible instance into the SDK's StorageAdapter interface.\n */\n\nimport type { StorageAdapter } from '../utils/platform';\n\nexport interface AsyncStorageLike {\n getItem(key: string): Promise<string | null>;\n setItem(key: string, value: string): Promise<void>;\n removeItem(key: string): Promise<void>;\n}\n\nexport function createAsyncStorageAdapter(asyncStorage: AsyncStorageLike): StorageAdapter {\n return {\n getItem: (key: string) => asyncStorage.getItem(key),\n setItem: (key: string, value: string) => asyncStorage.setItem(key, value),\n removeItem: (key: string) => asyncStorage.removeItem(key),\n };\n}\n","/**\n * React Native Device Info\n *\n * Collects device information using only RN built-in APIs.\n * Zero external dependencies — uses only Platform and Dimensions.\n */\n\nimport { Platform, Dimensions } from 'react-native';\n\nexport interface RNDeviceInfo {\n platform: 'ios' | 'android';\n osVersion?: string;\n deviceName?: string;\n deviceBrand?: string;\n deviceModel?: string;\n appVersion?: string;\n appBuildNumber?: string;\n screenWidth?: number;\n screenHeight?: number;\n screenScale?: number;\n isEmulator?: boolean;\n deviceId?: string;\n}\n\nexport function collectDeviceInfo(): RNDeviceInfo {\n const screen = Dimensions.get('screen');\n\n return {\n platform: Platform.OS as 'ios' | 'android',\n osVersion: String(Platform.Version),\n screenWidth: screen.width,\n screenHeight: screen.height,\n screenScale: screen.scale,\n };\n}\n\n/** @deprecated No-op, returns null. Kept for API compatibility. */\nexport async function fetchPersistentDeviceId(): Promise<string | null> {\n return null;\n}\n\n/** @deprecated No-op, returns null. Kept for API compatibility. */\nexport async function fetchNativeDeviceSignals(): Promise<null> {\n return null;\n}\n","/**\n * React Native Screen Recorder SDK Integration\n *\n * Two modes:\n * 1. **On error (via provider)**: Recording starts automatically, keeps a 10s\n * rolling buffer. On error the buffer is flushed and attached to the error.\n * 2. **Manual**: Call startScreenRecording / stopScreenRecording / flushScreenRecording\n * yourself. Keeps a 60s rolling buffer by default.\n */\n\ninterface NativeScreenRecorderModule {\n startRecording(config: {\n apiKey: string;\n endpoint: string;\n sessionId: string;\n fps: number;\n quality: string;\n bufferDuration: number;\n }): Promise<void>;\n stopRecording(): Promise<void>;\n isRecording(): boolean;\n flushBuffer(): Promise<void>;\n addSensitiveView(viewTag: number): void;\n removeSensitiveView(viewTag: number): void;\n}\n\nlet nativeModule: NativeScreenRecorderModule | null = null;\n\nfunction getNativeModule(): NativeScreenRecorderModule | null {\n if (!nativeModule) {\n try {\n nativeModule = require('@sitepong/screen-recorder');\n } catch {\n nativeModule = null;\n }\n }\n return nativeModule;\n}\n\nexport interface ScreenRecordingConfig {\n /** Enable screen recording (default: false) */\n enabled?: boolean;\n /** Frames per second (default: 1) */\n fps?: number;\n /** Video quality preset */\n quality?: 'low' | 'standard' | 'high';\n /** Sample rate 0-1: what fraction of sessions to record (default: 1.0) */\n sampleRate?: number;\n /** Max recording duration in ms (default: 60 min) */\n maxDuration?: number;\n /**\n * Rolling buffer duration in ms — how much video to keep.\n * - On-error mode (via provider): default 10_000 (10 seconds)\n * - Manual mode: default 60_000 (60 seconds)\n */\n bufferDuration?: number;\n}\n\n/** Default buffer for on-error mode (via provider) */\nconst ERROR_BUFFER_DURATION = 10_000;\n/** Default buffer for manual mode */\nconst MANUAL_BUFFER_DURATION = 60_000;\n\nlet recordingActive = false;\nlet maxDurationTimer: ReturnType<typeof setTimeout> | null = null;\n\n/**\n * Start screen recording in on-error mode (called by provider).\n * Recording runs in a 10s rolling buffer — auto-flushed and attached to errors.\n */\nexport function startScreenRecordingOnError(\n apiKey: string,\n endpoint: string,\n sessionId: string,\n config: ScreenRecordingConfig = {},\n): boolean {\n return _startRecording(apiKey, endpoint, sessionId, {\n ...config,\n bufferDuration: config.bufferDuration ?? ERROR_BUFFER_DURATION,\n });\n}\n\n/**\n * Start screen recording manually.\n * Recording runs in a 60s rolling buffer. Call flushScreenRecording() to upload.\n */\nexport function startScreenRecording(\n apiKey: string,\n endpoint: string,\n sessionId: string,\n config: Omit<ScreenRecordingConfig, 'enabled'> = {},\n): boolean {\n return _startRecording(apiKey, endpoint, sessionId, {\n ...config,\n enabled: true,\n bufferDuration: config.bufferDuration ?? MANUAL_BUFFER_DURATION,\n });\n}\n\nfunction _startRecording(\n apiKey: string,\n endpoint: string,\n sessionId: string,\n config: ScreenRecordingConfig,\n): boolean {\n const mod = getNativeModule();\n if (!mod) return false;\n\n if (!config.enabled) return false;\n\n // Apply sample rate\n const sampleRate = config.sampleRate ?? 1.0;\n if (Math.random() > sampleRate) return false;\n\n mod.startRecording({\n apiKey,\n endpoint,\n sessionId,\n fps: config.fps ?? 1,\n quality: config.quality ?? 'standard',\n bufferDuration: config.bufferDuration ?? ERROR_BUFFER_DURATION,\n }).catch((err: unknown) => {\n console.warn('[SitePong] Screen recording failed to start:', err);\n });\n\n recordingActive = true;\n\n // Auto-stop after max duration\n const maxDuration = config.maxDuration ?? 60 * 60 * 1000;\n maxDurationTimer = setTimeout(() => {\n stopScreenRecording();\n }, maxDuration);\n\n return true;\n}\n\n/**\n * Stop screen recording and discard the buffer.\n */\nexport function stopScreenRecording(): void {\n const mod = getNativeModule();\n if (!mod || !recordingActive) return;\n\n if (maxDurationTimer) {\n clearTimeout(maxDurationTimer);\n maxDurationTimer = null;\n }\n\n mod.stopRecording().catch(() => {});\n recordingActive = false;\n}\n\n/**\n * Flush the rolling buffer to the server.\n * In on-error mode this is called automatically by the error handler.\n * In manual mode, call this yourself to upload the buffer.\n */\nexport async function flushScreenRecording(): Promise<void> {\n const mod = getNativeModule();\n if (!mod || !recordingActive) return;\n\n try {\n await mod.flushBuffer();\n } catch (err) {\n console.warn('[SitePong] Screen recording flush failed:', err);\n }\n}\n\n/**\n * @deprecated Use flushScreenRecording() instead.\n */\nexport const flushScreenRecordingOnError = flushScreenRecording;\n\n/**\n * Check if screen recording is currently active.\n */\nexport function isScreenRecording(): boolean {\n return recordingActive;\n}\n","/**\n * React Native Error Handler\n *\n * Enhanced ErrorUtils.setGlobalHandler() + Promise rejection tracking.\n * Returns a teardown function.\n */\n\nimport { captureError } from '../index';\nimport { flushScreenRecording } from './screen-recorder';\n\ndeclare const ErrorUtils: {\n setGlobalHandler: (handler: (error: Error, isFatal: boolean) => void) => void;\n getGlobalHandler: () => (error: Error, isFatal: boolean) => void;\n};\n\nexport interface RNErrorHandlerOptions {\n /** Capture fatal errors (default: true) */\n captureFatal?: boolean;\n /** Capture non-fatal errors (default: true) */\n captureNonFatal?: boolean;\n /** Capture unhandled promise rejections (default: true) */\n capturePromiseRejections?: boolean;\n}\n\nexport function setupRNErrorHandler(options: RNErrorHandlerOptions = {}): () => void {\n const {\n captureFatal = true,\n captureNonFatal = true,\n capturePromiseRejections = true,\n } = options;\n\n const teardowns: Array<() => void> = [];\n\n // Global JS error handler\n if (typeof ErrorUtils !== 'undefined') {\n const previousHandler = ErrorUtils.getGlobalHandler();\n\n ErrorUtils.setGlobalHandler((error: Error, isFatal: boolean) => {\n if ((isFatal && captureFatal) || (!isFatal && captureNonFatal)) {\n captureError(error, {\n tags: {\n fatal: String(isFatal),\n handler: 'react-native-global',\n },\n });\n // Flush screen recording buffer on error\n flushScreenRecording().catch(() => {});\n }\n\n // Call previous handler\n if (previousHandler) {\n previousHandler(error, isFatal);\n }\n });\n\n teardowns.push(() => {\n if (previousHandler) {\n ErrorUtils.setGlobalHandler(previousHandler);\n }\n });\n }\n\n // Promise rejection tracking\n if (capturePromiseRejections) {\n // Track via global event (works on both Hermes and JSC)\n if (typeof global !== 'undefined') {\n const rejectionHandler = (event: { reason?: unknown }) => {\n const err = event.reason instanceof Error ? event.reason : new Error(String(event.reason));\n captureError(err, {\n tags: { handler: 'unhandled-promise-rejection' },\n });\n // Flush screen recording buffer on error\n flushScreenRecording().catch(() => {});\n };\n\n if (typeof globalThis.addEventListener === 'function') {\n globalThis.addEventListener('unhandledrejection', rejectionHandler as unknown as Parameters<typeof globalThis.addEventListener>[1]);\n teardowns.push(() => {\n globalThis.removeEventListener('unhandledrejection', rejectionHandler as unknown as Parameters<typeof globalThis.removeEventListener>[1]);\n });\n }\n }\n }\n\n return () => {\n for (const teardown of teardowns) {\n teardown();\n }\n };\n}\n","/**\n * React Navigation Tracker\n *\n * Integrates with React Navigation's navigationRef to track\n * $screen_view events and navigation breadcrumbs.\n */\n\nimport { track, addBreadcrumb, setCurrentScreen } from '../index';\n\nexport interface NavigationRef {\n addListener: (event: string, callback: (...args: unknown[]) => void) => () => void;\n getCurrentRoute: () => { name: string; params?: Record<string, unknown> } | undefined;\n}\n\nexport interface NavigationTrackerOptions {\n /** Track screen view events (default: true) */\n trackScreenViews?: boolean;\n /** Add navigation breadcrumbs (default: true) */\n addBreadcrumbs?: boolean;\n /** Screen name filter — return null to skip tracking */\n screenNameFilter?: (name: string) => string | null;\n}\n\nexport function createNavigationTracker(\n navigationRef: NavigationRef,\n options: NavigationTrackerOptions = {}\n): () => void {\n const {\n trackScreenViews = true,\n addBreadcrumbs = true,\n screenNameFilter,\n } = options;\n\n let currentRouteName: string | undefined;\n\n const unsubscribe = navigationRef.addListener('state', () => {\n const route = navigationRef.getCurrentRoute();\n if (!route) return;\n\n const previousRouteName = currentRouteName;\n currentRouteName = route.name;\n\n if (previousRouteName === currentRouteName) return;\n\n const screenName = screenNameFilter ? screenNameFilter(currentRouteName) : currentRouteName;\n if (!screenName) return;\n\n setCurrentScreen(screenName);\n\n if (trackScreenViews) {\n track('$screen_view', {\n screen_name: screenName,\n previous_screen: previousRouteName,\n params: route.params,\n });\n }\n\n if (addBreadcrumbs) {\n addBreadcrumb({\n type: 'navigation',\n category: 'screen',\n message: `Navigated to ${screenName}`,\n data: {\n from: previousRouteName,\n to: screenName,\n },\n });\n }\n });\n\n return () => {\n unsubscribe();\n setCurrentScreen(undefined);\n };\n}\n","/**\n * React Native Network Interception\n *\n * XHR monkey-patch for request tracking + breadcrumbs.\n * RN fetch is XHR internally, so intercepting XMLHttpRequest captures all network.\n */\n\nimport { addBreadcrumb } from '../index';\n\nexport interface NetworkInterceptionOptions {\n /** Track request/response as breadcrumbs (default: true) */\n addBreadcrumbs?: boolean;\n /** URL patterns to ignore (e.g., SitePong's own endpoints) */\n ignoreUrls?: (string | RegExp)[];\n /** Max breadcrumb data size in bytes (default: 1024) */\n maxDataSize?: number;\n}\n\nexport function setupNetworkInterception(options: NetworkInterceptionOptions = {}): () => void {\n const {\n addBreadcrumbs = true,\n ignoreUrls = [/sitepong\\.com/],\n maxDataSize = 1024,\n } = options;\n\n if (typeof XMLHttpRequest === 'undefined') {\n return () => {};\n }\n\n const originalOpen = XMLHttpRequest.prototype.open;\n const originalSend = XMLHttpRequest.prototype.send;\n\n XMLHttpRequest.prototype.open = function (\n method: string,\n url: string | URL,\n ...rest: unknown[]\n ) {\n const xhr = this as XMLHttpRequest & {\n _sitepong_method?: string;\n _sitepong_url?: string;\n _sitepong_startTime?: number;\n };\n\n xhr._sitepong_method = method;\n xhr._sitepong_url = String(url);\n\n return originalOpen.apply(this, [method, url, ...rest] as Parameters<typeof originalOpen>);\n };\n\n XMLHttpRequest.prototype.send = function (body?: Document | XMLHttpRequestBodyInit | null) {\n const xhr = this as XMLHttpRequest & {\n _sitepong_method?: string;\n _sitepong_url?: string;\n _sitepong_startTime?: number;\n };\n\n const url = xhr._sitepong_url || '';\n const method = xhr._sitepong_method || 'GET';\n\n // Check if URL should be ignored\n const shouldIgnore = ignoreUrls.some((pattern) => {\n if (typeof pattern === 'string') return url.includes(pattern);\n return pattern.test(url);\n });\n\n if (shouldIgnore) {\n return originalSend.call(this, body);\n }\n\n xhr._sitepong_startTime = Date.now();\n\n const onLoadEnd = () => {\n const duration = xhr._sitepong_startTime ? Date.now() - xhr._sitepong_startTime : undefined;\n\n if (addBreadcrumbs) {\n addBreadcrumb({\n type: 'http',\n category: 'xhr',\n message: `${method} ${url}`,\n level: xhr.status >= 400 ? 'error' : 'info',\n data: {\n method,\n url: url.length > maxDataSize ? url.substring(0, maxDataSize) : url,\n status_code: xhr.status,\n duration_ms: duration,\n },\n });\n }\n };\n\n this.addEventListener('loadend', onLoadEnd);\n return originalSend.call(this, body);\n };\n\n return () => {\n XMLHttpRequest.prototype.open = originalOpen;\n XMLHttpRequest.prototype.send = originalSend;\n };\n}\n","/**\n * React Native Autocapture Module\n *\n * Tracks AppState changes (foreground/background/inactive) automatically.\n */\n\nimport { AppState } from 'react-native';\nimport { track } from '../index';\n\nexport interface RNAutocaptureOptions {\n /** Track app state changes (default: true) */\n trackAppState?: boolean;\n}\n\nexport class RNAutocaptureModule {\n private options: Required<RNAutocaptureOptions>;\n private appStateSubscription: { remove: () => void } | null = null;\n private currentAppState: string = 'active';\n\n constructor(options: RNAutocaptureOptions = {}) {\n this.options = {\n trackAppState: options.trackAppState ?? true,\n };\n }\n\n start(): void {\n if (this.options.trackAppState) {\n this.setupAppStateTracking();\n }\n }\n\n stop(): void {\n if (this.appStateSubscription) {\n this.appStateSubscription.remove();\n this.appStateSubscription = null;\n }\n }\n\n private setupAppStateTracking(): void {\n try {\n this.currentAppState = AppState.currentState;\n\n this.appStateSubscription = AppState.addEventListener('change', (nextAppState: string) => {\n const previousState = this.currentAppState;\n this.currentAppState = nextAppState;\n\n if (previousState !== nextAppState) {\n track('$app_state_change', {\n from: previousState,\n to: nextAppState,\n });\n\n // Track specific transitions\n if (previousState.match(/inactive|background/) && nextAppState === 'active') {\n track('$app_foreground', {\n previous_state: previousState,\n });\n } else if (previousState === 'active' && nextAppState.match(/inactive|background/)) {\n track('$app_background', {\n next_state: nextAppState,\n });\n }\n }\n });\n } catch {\n // react-native AppState not available\n }\n }\n}\n","/**\n * React Native Performance Manager\n *\n * Cold start timing and screen render tracking for RN apps.\n */\n\nimport { track } from '../index';\n\nlet coldStartTimestamp: number | null = null;\nlet coldStartTracked = false;\n\n/**\n * Call at the very top of your app entry point to capture cold start.\n * Must be called before any async work.\n */\nexport function markColdStart(): void {\n coldStartTimestamp = Date.now();\n}\n\nexport class RNPerformanceManager {\n private screenRenderStarts: Map<string, number> = new Map();\n\n /**\n * Track cold start time from markColdStart() to now.\n * Should be called once the app is interactive (e.g., in the root component's useEffect).\n */\n trackColdStart(): void {\n if (coldStartTracked || !coldStartTimestamp) return;\n\n const duration = Date.now() - coldStartTimestamp;\n coldStartTracked = true;\n\n track('$cold_start', {\n duration_ms: duration,\n });\n }\n\n /**\n * Start tracking a screen render. Call before rendering starts.\n */\n startScreenRender(screenName: string): void {\n this.screenRenderStarts.set(screenName, Date.now());\n }\n\n /**\n * End tracking a screen render. Call after rendering completes.\n */\n endScreenRender(screenName: string): number | null {\n const startTime = this.screenRenderStarts.get(screenName);\n if (startTime === undefined) return null;\n\n this.screenRenderStarts.delete(screenName);\n const duration = Date.now() - startTime;\n\n track('$screen_render', {\n screen_name: screenName,\n duration_ms: duration,\n });\n\n return duration;\n }\n\n /**\n * Track a screen render using a useEffect-friendly pattern.\n * Returns a cleanup function.\n */\n trackScreenRender(screenName: string): () => void {\n this.startScreenRender(screenName);\n\n return () => {\n this.endScreenRender(screenName);\n };\n }\n}\n","/**\n * Push Notification & Live Activity token registration for React Native.\n *\n * Registers Expo push tokens and APNs Live Activity tokens with the\n * SitePong ingest server for remote push notification delivery.\n *\n * For Live Activities, prefer the turnkey `@sitepong/expo-live-activity`\n * package — it ships a built-in SwiftUI widget template (SF Symbols,\n * custom progress bar with sliding icon, visibility-driven slots) and\n * forwards push tokens to the registration functions in this file\n * automatically. Use the lower-level `registerLiveActivityToken` and\n * `registerPushToStartToken` exports below only if you author your own\n * iOS Widget Extension and `ActivityAttributes` struct in Swift.\n *\n * ## User attribution (two-step)\n *\n * These register* functions only store (project_id, token, device_id). They\n * deliberately do not accept or send a user_id — publishable SDK keys are\n * extractable from compiled apps, so letting the client attach arbitrary\n * user_ids would let a leaked key shadow-subscribe to another user's pushes.\n *\n * After the user authenticates with your backend, have your backend call\n * `POST /api/push/tokens/associate` (authenticated with your `sp_push_xxx`\n * server key) to bind the token to the user_id.\n *\n * @since 0.1.0\n */\n\nimport { client } from '../index';\nimport { collectDeviceInfo, fetchPersistentDeviceId } from './device';\n\ninterface PushEnvironmentOptions {\n environment: 'sandbox' | 'production';\n}\n\ninterface DeviceContext {\n deviceId?: string;\n platform?: string;\n appVersion?: string;\n deviceModel?: string;\n osVersion?: string;\n}\n\nlet cachedDeviceContext: DeviceContext | null = null;\n\nfunction getEndpoint(): string {\n const cfg = (client as unknown as { config: { endpoint: string; apiKey: string } }).config;\n return cfg?.endpoint || 'https://ingest.sitepong.com';\n}\n\nfunction getApiKey(): string {\n const cfg = (client as unknown as { config: { endpoint: string; apiKey: string } }).config;\n return cfg?.apiKey || '';\n}\n\nfunction getDeviceContext(): DeviceContext {\n if (cachedDeviceContext) return cachedDeviceContext;\n\n try {\n const info = collectDeviceInfo();\n cachedDeviceContext = {\n platform: info.platform,\n appVersion: info.appVersion,\n deviceModel: info.deviceModel,\n osVersion: info.osVersion,\n };\n\n fetchPersistentDeviceId().then((id) => {\n if (id && cachedDeviceContext) cachedDeviceContext.deviceId = id;\n });\n } catch {\n cachedDeviceContext = {};\n }\n\n return cachedDeviceContext;\n}\n\nasync function postToIngest(path: string, body: Record<string, unknown>): Promise<void> {\n const endpoint = getEndpoint();\n const apiKey = getApiKey();\n\n if (!apiKey) {\n console.warn('[SitePong] Cannot register push token: SDK not initialized');\n return;\n }\n\n try {\n const response = await fetch(`${endpoint}${path}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-API-Key': apiKey,\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n console.warn(`[SitePong] Push token registration failed: HTTP ${response.status}`);\n }\n } catch (err) {\n console.warn('[SitePong] Push token registration failed:', err);\n }\n}\n\nasync function deleteFromIngest(path: string, body: Record<string, unknown>): Promise<void> {\n const endpoint = getEndpoint();\n const apiKey = getApiKey();\n\n if (!apiKey) return;\n\n try {\n const response = await fetch(`${endpoint}${path}`, {\n method: 'DELETE',\n headers: {\n 'Content-Type': 'application/json',\n 'X-API-Key': apiKey,\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n console.warn(`[SitePong] Push token deactivation failed: HTTP ${response.status}`);\n }\n } catch (err) {\n console.warn('[SitePong] Push token deactivation failed:', err);\n }\n}\n\n/**\n * Register an Expo push token for receiving regular push notifications.\n *\n * To attach this token to an authenticated user, have your backend call\n * `POST https://api.sitepong.com/api/push/tokens/associate` with\n * `Authorization: Bearer sp_push_xxx` and body `{ token, user_id }`.\n */\nexport function registerPushToken(token: string, options: PushEnvironmentOptions): void {\n const device = getDeviceContext();\n\n postToIngest('/api/push/tokens', {\n expo_push_token: token,\n environment: options.environment,\n device_id: device.deviceId,\n platform: device.platform,\n app_version: device.appVersion,\n device_model: device.deviceModel,\n os_version: device.osVersion,\n });\n}\n\n/**\n * Register a native device token (APNs or FCM) for direct push delivery.\n * This bypasses Expo and sends directly to Apple/Google.\n *\n * @param token - The raw device token (hex string for APNs, FCM registration token for Android)\n * @param options - Platform and environment. `userId` is accepted but ignored\n * — see the two-step attribution note at the top of this file.\n */\nexport function registerDeviceToken(\n token: string,\n options: {\n platform: 'ios' | 'android';\n environment: 'sandbox' | 'production';\n /** @deprecated Ignored. Associate via POST /api/push/tokens/associate from your backend. */\n userId?: string;\n }\n): void {\n const device = getDeviceContext();\n\n const tokenType = options.platform === 'ios' ? 'apns' : 'fcm';\n\n postToIngest('/api/push/tokens', {\n native_device_token: token,\n token_type: tokenType,\n environment: options.environment,\n device_id: device.deviceId,\n platform: options.platform,\n app_version: device.appVersion,\n device_model: device.deviceModel,\n os_version: device.osVersion,\n });\n}\n\n/**\n * Register a running Live Activity's push token for remote updates.\n */\nexport function registerLiveActivityToken(\n activityType: string,\n activityId: string,\n pushToken: string,\n options: PushEnvironmentOptions\n): void {\n const device = getDeviceContext();\n\n postToIngest('/api/push/live-activity-tokens', {\n activity_type: activityType,\n activity_id: activityId,\n push_token: pushToken,\n environment: options.environment,\n device_id: device.deviceId,\n });\n}\n\n/**\n * Register a push-to-start token for remotely launching Live Activities (iOS 17.2+).\n */\nexport function registerPushToStartToken(\n activityType: string,\n pushToStartToken: string,\n options: PushEnvironmentOptions\n): void {\n const device = getDeviceContext();\n\n postToIngest('/api/push/push-to-start-tokens', {\n activity_type: activityType,\n push_to_start_token: pushToStartToken,\n environment: options.environment,\n device_id: device.deviceId,\n });\n}\n\n/**\n * Mark a Live Activity as ended (deactivates its token).\n */\nexport function endLiveActivity(activityType: string, activityId: string): void {\n deleteFromIngest('/api/push/live-activity-tokens', {\n activity_type: activityType,\n activity_id: activityId,\n });\n}\n\n/**\n * Clear cached device context (useful for testing).\n */\nexport function clearPushCache(): void {\n cachedDeviceContext = null;\n}\n","/**\n * SitePong React Native Provider\n *\n * Mirrors the react/provider.tsx pattern with RN-specific setup.\n */\n\nimport React, { createContext, useContext, useEffect, useRef, useState } from 'react';\nimport type { SitePongInitConfig } from '../index';\nimport { initRN } from '../index';\nimport { createAsyncStorageAdapter } from './storage';\nimport type { AsyncStorageLike } from './storage';\nimport { collectDeviceInfo, fetchPersistentDeviceId } from './device';\nimport { setRNDeviceInfo, setNativeDeviceId } from '../utils/platform';\nimport { setupRNErrorHandler } from './error-handler';\nimport { createNavigationTracker } from './navigation';\nimport type { NavigationRef } from './navigation';\nimport { setupNetworkInterception } from './network';\nimport { RNAutocaptureModule } from './autocapture';\nimport { RNPerformanceManager } from './performance';\nimport { startScreenRecordingOnError, stopScreenRecording } from './screen-recorder';\nimport type { ScreenRecordingConfig } from './screen-recorder';\nimport { registerDeviceToken } from './push';\n\ninterface SitePongRNContextValue {\n isInitialized: boolean;\n performanceManager: RNPerformanceManager | null;\n}\n\nexport const SitePongRNContext = createContext<SitePongRNContextValue>({\n isInitialized: false,\n performanceManager: null,\n});\n\nexport interface SitePongRNProviderProps {\n /** API key in format: sp_live_xxx or sp_test_xxx */\n apiKey: string;\n /** Additional configuration options */\n config?: Omit<SitePongInitConfig, 'apiKey'>;\n /** AsyncStorage instance for persistence */\n asyncStorage?: AsyncStorageLike;\n /** React Navigation ref for screen tracking */\n navigationRef?: NavigationRef;\n /** Enable network request interception (default: true) */\n trackNetwork?: boolean;\n /** Enable app state tracking (default: true) */\n trackAppState?: boolean;\n /** Enable error handler setup (default: true) */\n captureErrors?: boolean;\n /** Screen recording configuration — records rolling buffer, only sends on error */\n screenRecording?: ScreenRecordingConfig;\n /** Native device token (APNs hex string or FCM registration token) for direct push delivery */\n devicePushToken?: string;\n /** Device platform — required when using devicePushToken */\n devicePlatform?: 'ios' | 'android';\n /** APNs environment for push notifications */\n pushEnvironment?: 'sandbox' | 'production';\n /**\n * @deprecated Ignored. Associate via `POST /api/push/tokens/associate`\n * from your backend using a `sp_push_xxx` key — see the SDK README.\n */\n pushUserId?: string;\n children: React.ReactNode;\n}\n\nexport function SitePongRNProvider({\n apiKey,\n config = {},\n asyncStorage,\n navigationRef,\n trackNetwork = true,\n trackAppState = true,\n captureErrors = true,\n screenRecording,\n devicePushToken,\n devicePlatform,\n pushEnvironment = 'production',\n pushUserId,\n children,\n}: SitePongRNProviderProps): React.ReactElement {\n const initialized = useRef(false);\n const [sdkReady, setSdkReady] = useState(false);\n const performanceManagerRef = useRef<RNPerformanceManager | null>(null);\n\n useEffect(() => {\n if (initialized.current) return;\n\n const teardowns: Array<() => void> = [];\n\n // Collect and set device info\n const deviceInfo = collectDeviceInfo();\n setRNDeviceInfo({\n platform: 'react-native',\n osName: deviceInfo.platform,\n osVersion: deviceInfo.osVersion,\n deviceName: deviceInfo.deviceName,\n deviceBrand: deviceInfo.deviceBrand,\n deviceModel: deviceInfo.deviceModel,\n appVersion: deviceInfo.appVersion,\n screenWidth: deviceInfo.screenWidth,\n screenHeight: deviceInfo.screenHeight,\n isEmulator: deviceInfo.isEmulator,\n });\n\n // Fetch persistent device ID from @sitepong/device-id (async, non-blocking)\n fetchPersistentDeviceId().then((id) => {\n if (id) setNativeDeviceId(id);\n }).catch(() => {});\n\n // Create storage adapter\n const storageAdapter = asyncStorage ? createAsyncStorageAdapter(asyncStorage) : undefined;\n\n // Initialize SDK (RN-only subsystems — no browser code)\n initRN({\n apiKey,\n ...config,\n _storageAdapter: storageAdapter,\n });\n\n // Setup error handler\n if (captureErrors) {\n const teardownErrors = setupRNErrorHandler();\n teardowns.push(teardownErrors);\n }\n\n // Setup network interception\n if (trackNetwork) {\n const teardownNetwork = setupNetworkInterception();\n teardowns.push(teardownNetwork);\n }\n\n // Setup autocapture\n if (trackAppState) {\n const autocapture = new RNAutocaptureModule({ trackAppState: true });\n autocapture.start();\n teardowns.push(() => autocapture.stop());\n }\n\n // Setup navigation tracking\n if (navigationRef) {\n const teardownNav = createNavigationTracker(navigationRef);\n teardowns.push(teardownNav);\n }\n\n // Setup screen recording (on-error mode: 10s rolling buffer, auto-flushed on error)\n if (screenRecording?.enabled) {\n const sessionId = `rn_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 10)}`;\n const endpoint = config.endpoint || 'https://ingest.sitepong.com';\n startScreenRecordingOnError(apiKey, endpoint, sessionId, screenRecording);\n teardowns.push(() => stopScreenRecording());\n }\n\n // Register native device token for direct APNs/FCM delivery\n if (devicePushToken && devicePlatform) {\n registerDeviceToken(devicePushToken, { platform: devicePlatform, environment: pushEnvironment, userId: pushUserId });\n }\n\n // Setup performance manager\n performanceManagerRef.current = new RNPerformanceManager();\n performanceManagerRef.current.trackColdStart();\n\n initialized.current = true;\n setSdkReady(true);\n\n return () => {\n for (const teardown of teardowns) {\n teardown();\n }\n };\n }, [apiKey]);\n\n const value: SitePongRNContextValue = {\n isInitialized: sdkReady,\n performanceManager: performanceManagerRef.current,\n };\n\n return (\n <SitePongRNContext.Provider value={value}>\n {children}\n </SitePongRNContext.Provider>\n );\n}\n\nexport function useSitePongRNContext(): SitePongRNContextValue {\n return useContext(SitePongRNContext);\n}\n","/**\n * React Native Hooks\n *\n * RN-specific hooks + re-exported base hooks.\n */\n\nimport { useContext, useEffect, useRef, useState } from 'react';\nimport { AppState } from 'react-native';\nimport { SitePongRNContext } from './provider';\nimport { getRemoteConfig, onRemoteConfigChange } from '../index';\nimport type { RemoteConfig } from '../remote-config';\n\n/**\n * Track a screen render automatically via useEffect.\n */\nexport function useScreenTrack(screenName: string): void {\n const { performanceManager } = useContext(SitePongRNContext);\n\n useEffect(() => {\n if (!performanceManager) return;\n\n performanceManager.startScreenRender(screenName);\n\n return () => {\n performanceManager.endScreenRender(screenName);\n };\n }, [screenName, performanceManager]);\n}\n\n/**\n * Track app state with a reactive hook.\n */\nexport function useAppState(): string {\n const [appState, setAppState] = useState('active');\n\n useEffect(() => {\n setAppState(AppState.currentState);\n\n const subscription = AppState.addEventListener('change', (nextState: string) => {\n setAppState(nextState);\n });\n\n return () => subscription.remove();\n }, []);\n\n return appState;\n}\n\n/**\n * Access remote config with reactive updates.\n */\nexport function useRemoteConfig(): RemoteConfig | null {\n const [config, setConfig] = useState<RemoteConfig | null>(() => getRemoteConfig());\n\n useEffect(() => {\n // Set initial value\n setConfig(getRemoteConfig());\n\n // Listen for changes\n const unsubscribe = onRemoteConfigChange((newConfig) => {\n setConfig(newConfig);\n });\n\n return unsubscribe;\n }, []);\n\n return config;\n}\n\n/**\n * Track screen render performance. Returns duration when render completes.\n */\nexport function useRNPerformance(screenName: string): { duration: number | null } {\n const { performanceManager } = useContext(SitePongRNContext);\n const [duration, setDuration] = useState<number | null>(null);\n const startTimeRef = useRef<number>(Date.now());\n\n useEffect(() => {\n startTimeRef.current = Date.now();\n\n // On next frame, measure the render time\n const handle = requestAnimationFrame(() => {\n const d = Date.now() - startTimeRef.current;\n setDuration(d);\n\n if (performanceManager) {\n performanceManager.startScreenRender(screenName);\n performanceManager.endScreenRender(screenName);\n }\n });\n\n return () => cancelAnimationFrame(handle);\n }, [screenName, performanceManager]);\n\n return { duration };\n}\n","/**\n * SQLite Query Tracker for expo-sqlite\n *\n * Wraps an expo-sqlite database handle to intercept and time all queries.\n * Slow queries are reported as analytics events and breadcrumbs.\n */\n\nimport { track, addBreadcrumb } from '../index';\n\nexport interface TrackedDatabaseOptions {\n /** Threshold in ms — queries slower than this are tracked (default: 100) */\n slowQueryThreshold?: number;\n /** If true, track every query regardless of duration (default: false) */\n trackAll?: boolean;\n}\n\n/** Minimal interface matching expo-sqlite's SQLiteDatabase */\ninterface SQLiteDatabase {\n execAsync(sql: string): Promise<void>;\n runAsync(sql: string, ...params: unknown[]): Promise<{ changes: number; lastInsertRowId: number }>;\n getAllAsync(sql: string, ...params: unknown[]): Promise<unknown[]>;\n getFirstAsync(sql: string, ...params: unknown[]): Promise<unknown | null>;\n execSync(sql: string): void;\n runSync(sql: string, ...params: unknown[]): { changes: number; lastInsertRowId: number };\n getAllSync(sql: string, ...params: unknown[]): unknown[];\n getFirstSync(sql: string, ...params: unknown[]): unknown | null;\n [key: string]: unknown;\n}\n\nfunction now(): number {\n if (typeof performance !== 'undefined' && typeof performance.now === 'function') {\n return performance.now();\n }\n return Date.now();\n}\n\nfunction reportQuery(\n sql: string,\n durationMs: number,\n rowCount: number | undefined,\n options: Required<Pick<TrackedDatabaseOptions, 'slowQueryThreshold' | 'trackAll'>>,\n): void {\n const shouldTrack = options.trackAll || durationMs >= options.slowQueryThreshold;\n if (!shouldTrack) return;\n\n const properties: Record<string, unknown> = {\n sql: sql.length > 500 ? sql.slice(0, 500) + '...' : sql,\n durationMs: Math.round(durationMs * 100) / 100,\n };\n if (rowCount !== undefined) {\n properties.rowCount = rowCount;\n }\n\n track('$sqlite_query', properties);\n\n addBreadcrumb({\n type: 'default',\n category: 'sqlite',\n message: sql.length > 200 ? sql.slice(0, 200) + '...' : sql,\n level: durationMs >= options.slowQueryThreshold ? 'warning' : 'info',\n data: properties,\n });\n}\n\n/**\n * Wrap an expo-sqlite database with query timing and tracking.\n *\n * Returns a proxy that intercepts all query methods. Use it exactly like the\n * original database — same API, same return values.\n *\n * @example\n * ```ts\n * import { createTrackedDatabase } from 'sitepong/react-native';\n * import * as SQLite from 'expo-sqlite';\n *\n * const db = SQLite.openDatabaseSync('myapp.db');\n * const trackedDb = createTrackedDatabase(db, { slowQueryThreshold: 100 });\n * const users = trackedDb.getAllSync('SELECT * FROM users WHERE active = 1');\n * ```\n */\nexport function createTrackedDatabase<T extends SQLiteDatabase>(\n db: T,\n options: TrackedDatabaseOptions = {},\n): T {\n const threshold = options.slowQueryThreshold ?? 100;\n const trackAll = options.trackAll ?? false;\n const opts = { slowQueryThreshold: threshold, trackAll };\n\n return new Proxy(db, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n\n if (typeof value !== 'function') return value;\n\n const method = prop as string;\n\n // Async methods\n if (method === 'execAsync') {\n return async function trackedExecAsync(sql: string) {\n const start = now();\n const result = await target.execAsync(sql);\n reportQuery(sql, now() - start, undefined, opts);\n return result;\n };\n }\n\n if (method === 'runAsync') {\n return async function trackedRunAsync(sql: string, ...params: unknown[]) {\n const start = now();\n const result = await target.runAsync(sql, ...params);\n reportQuery(sql, now() - start, result.changes, opts);\n return result;\n };\n }\n\n if (method === 'getAllAsync') {\n return async function trackedGetAllAsync(sql: string, ...params: unknown[]) {\n const start = now();\n const result = await target.getAllAsync(sql, ...params);\n reportQuery(sql, now() - start, Array.isArray(result) ? result.length : undefined, opts);\n return result;\n };\n }\n\n if (method === 'getFirstAsync') {\n return async function trackedGetFirstAsync(sql: string, ...params: unknown[]) {\n const start = now();\n const result = await target.getFirstAsync(sql, ...params);\n reportQuery(sql, now() - start, result != null ? 1 : 0, opts);\n return result;\n };\n }\n\n // Sync methods\n if (method === 'execSync') {\n return function trackedExecSync(sql: string) {\n const start = now();\n const result = target.execSync(sql);\n reportQuery(sql, now() - start, undefined, opts);\n return result;\n };\n }\n\n if (method === 'runSync') {\n return function trackedRunSync(sql: string, ...params: unknown[]) {\n const start = now();\n const result = target.runSync(sql, ...params);\n reportQuery(sql, now() - start, result.changes, opts);\n return result;\n };\n }\n\n if (method === 'getAllSync') {\n return function trackedGetAllSync(sql: string, ...params: unknown[]) {\n const start = now();\n const result = target.getAllSync(sql, ...params);\n reportQuery(sql, now() - start, Array.isArray(result) ? result.length : undefined, opts);\n return result;\n };\n }\n\n if (method === 'getFirstSync') {\n return function trackedGetFirstSync(sql: string, ...params: unknown[]) {\n const start = now();\n const result = target.getFirstSync(sql, ...params);\n reportQuery(sql, now() - start, result != null ? 1 : 0, opts);\n return result;\n };\n }\n\n // Pass through all other methods unchanged\n return value.bind(target);\n },\n });\n}\n","import { client } from '../index';\n\nlet syncTimer: ReturnType<typeof setInterval> | null = null;\nlet cachedVersion = 0;\n\nfunction getNativeModule(): { syncWidgetConfigs(json: string): Promise<void>; updateWidgetData(json: string): Promise<void> } | null {\n try {\n return require('@sitepong/expo-live-activity');\n } catch {\n return null;\n }\n}\n\nexport interface WidgetSyncOptions {\n refreshInterval?: number;\n}\n\nfunction getEndpoint(): string {\n const cfg = (client as unknown as { config: { endpoint: string; apiKey: string } }).config;\n return cfg?.endpoint || 'https://api.sitepong.com';\n}\n\nfunction getApiKey(): string {\n const cfg = (client as unknown as { config: { endpoint: string; apiKey: string } }).config;\n return cfg?.apiKey || '';\n}\n\nexport async function syncWidgets(options?: WidgetSyncOptions): Promise<void> {\n const apiKey = getApiKey();\n if (!apiKey) return;\n\n const mod = getNativeModule();\n if (!mod) return;\n\n try {\n const res = await fetch(`${getEndpoint()}/api/sdk/widgets/config`, {\n headers: { 'X-API-Key': apiKey },\n });\n\n if (!res.ok) return;\n\n const data = await res.json();\n const widgets = data.widgets || [];\n\n const maxVersion = widgets.reduce((max: number, w: { version: number }) => Math.max(max, w.version), 0);\n if (maxVersion <= cachedVersion && cachedVersion > 0) return;\n\n cachedVersion = maxVersion;\n await mod.syncWidgetConfigs(JSON.stringify(widgets));\n } catch (err) {\n console.warn('[SitePong] Widget sync failed:', err);\n }\n\n if (syncTimer) clearInterval(syncTimer);\n const interval = options?.refreshInterval ?? 900000;\n syncTimer = setInterval(() => syncWidgets(options), interval);\n}\n\nexport async function updateWidgetData(data: Record<string, unknown>): Promise<void> {\n const mod = getNativeModule();\n if (!mod) return;\n\n try {\n await mod.updateWidgetData(JSON.stringify(data));\n } catch (err) {\n console.warn('[SitePong] Widget data update failed:', err);\n }\n}\n\nexport function triggerWidgetRefresh(): void {\n const mod = getNativeModule();\n if (!mod) return;\n mod.updateWidgetData('{}').catch(() => {});\n}\n\nexport function stopWidgetSync(): void {\n if (syncTimer) {\n clearInterval(syncTimer);\n syncTimer = null;\n }\n}\n","/**\n * SuperLink — React Native deferred deep linking / attribution.\n *\n * On first launch, the SDK resolves the deep link the user originally clicked\n * before the app was installed (\"deferred deep link\"), bridging the install\n * gap that ordinary Universal Links / App Links can't cross:\n *\n * - Android: read the Play Install Referrer to recover the deterministic\n * `click_id` the redirect engine stamped on the Play Store URL.\n * - iOS: attempt a clipboard read for a click token handed off by the\n * interstitial (Safari → App Store → app).\n * - Both: gather a minimal device fingerprint (UA/model/os/os_version/locale)\n * as a probabilistic fallback.\n *\n * It then POSTs /match and, on a hit, invokes any registered\n * onDeferredDeepLink handler with the resolved payload.\n *\n * For apps that are ALREADY installed, use parseUniversalLink() +\n * createSuperLinkListener() to handle direct opens and report `opened` events.\n *\n * Every native dependency is loaded through guarded optional requires, exactly\n * like the rest of the RN SDK — so an app that hasn't installed\n * `react-native-play-install-referrer` / `expo-clipboard` still builds and the\n * SDK degrades to fingerprint-only matching.\n */\n\nimport { Platform } from 'react-native';\nimport { superlinkClient } from '../superlink/client.js';\nimport { parseUniversalLink } from '../superlink/parse.js';\nimport { extractIdentityMetadata } from '../superlink/web.js';\nimport {\n toDeepLink,\n emitDeferredDeepLink,\n onDeferredDeepLink,\n getMatchedDeepLink,\n} from '../superlink/deferred.js';\nimport type {\n SuperLinkConfig,\n SuperLinkDeepLink,\n SuperLinkFingerprint,\n SuperLinkPlatform,\n SuperLinkIdentityMetadata,\n DeferredDeepLinkHandler,\n} from '../superlink/types.js';\n\nlet started = false;\n\nfunction platform(): SuperLinkPlatform {\n if (Platform.OS === 'ios') return 'ios';\n if (Platform.OS === 'android') return 'android';\n return 'other';\n}\n\nfunction locale(): string | undefined {\n try {\n // RN exposes locale via NativeModules; fall back to Intl when present.\n const tag =\n typeof Intl !== 'undefined' && typeof Intl.DateTimeFormat === 'function'\n ? Intl.DateTimeFormat().resolvedOptions().locale\n : undefined;\n return tag || undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction collectFingerprint(): SuperLinkFingerprint {\n const fp: SuperLinkFingerprint = { platform: platform() };\n const osVersion = Platform.Version;\n if (osVersion !== undefined && osVersion !== null) fp.os_version = String(osVersion);\n fp.os = Platform.OS;\n const lang = locale();\n if (lang) fp.language = lang;\n\n // expo-device (optional) gives us the model name when present.\n try {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const device = require('expo-device') as { modelName?: string | null };\n if (device?.modelName) fp.device_model = device.modelName;\n } catch {\n /* expo-device not installed — fingerprint stays minimal */\n }\n return fp;\n}\n\n/**\n * Android: read the Play Install Referrer to recover the deterministic click\n * token. Guarded — returns undefined if the lib isn't installed or on iOS.\n */\nasync function readPlayInstallReferrer(): Promise<string | undefined> {\n if (Platform.OS !== 'android') return undefined;\n let mod: {\n PlayInstallReferrer?: {\n getInstallReferrerInfo(\n cb: (info: { installReferrer?: string } | null, error?: unknown) => void\n ): void;\n };\n } | null = null;\n try {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n mod = require('react-native-play-install-referrer');\n } catch {\n return undefined;\n }\n const PlayInstallReferrer = mod?.PlayInstallReferrer;\n if (!PlayInstallReferrer) return undefined;\n\n const referrer = await new Promise<string | undefined>((resolve) => {\n try {\n PlayInstallReferrer.getInstallReferrerInfo((info, error) => {\n if (error || !info?.installReferrer) return resolve(undefined);\n resolve(info.installReferrer);\n });\n } catch {\n resolve(undefined);\n }\n });\n if (!referrer) return undefined;\n\n // The referrer is a urlencoded query string; pull our click_id out of it.\n try {\n const params = new URLSearchParams(referrer);\n return params.get('click_id') ?? params.get('referrer') ?? undefined;\n } catch {\n return undefined;\n }\n}\n\n/**\n * iOS: read the raw clipboard string and return it verbatim IF it carries a\n * SuperLink token. The engine parses the token from the raw value, so we hand\n * the whole clipboard string through as `clipboard_token` rather than pulling\n * the id out here. Tries @react-native-clipboard/clipboard then expo-clipboard.\n * Guarded — returns undefined off iOS or when neither lib is installed.\n */\nasync function readClipboardToken(): Promise<string | undefined> {\n if (Platform.OS !== 'ios') return undefined;\n\n let value: string | null | undefined;\n\n // @react-native-clipboard/clipboard\n try {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const clip = require('@react-native-clipboard/clipboard');\n const Clipboard = clip?.default ?? clip;\n if (Clipboard?.getString) {\n value = await Clipboard.getString();\n }\n } catch {\n /* not installed — try expo-clipboard */\n }\n\n // expo-clipboard\n if (value == null) {\n try {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const expoClip = require('expo-clipboard') as {\n getStringAsync?: () => Promise<string>;\n };\n if (expoClip?.getStringAsync) {\n value = await expoClip.getStringAsync();\n }\n } catch {\n /* not installed */\n }\n }\n\n return hasSuperLinkToken(value) ? value!.trim() : undefined;\n}\n\n/**\n * True when a clipboard string contains a SuperLink token: a \"/c/<id>\" click\n * URL, a \"splk:<id>\" / \"pongl.ink/c/<id>\" form, or a bare uuid. We only POST\n * /match when the clipboard plausibly holds a token, to avoid leaking unrelated\n * clipboard contents to the engine.\n */\nfunction hasSuperLinkToken(value: string | null | undefined): boolean {\n if (!value) return false;\n const trimmed = value.trim();\n if (/^splk:[\\w-]+$/i.test(trimmed)) return true;\n if (/\\/c\\/[\\w-]+/i.test(trimmed)) return true;\n // Bare uuid\n if (/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(trimmed)) return true;\n return false;\n}\n\n/**\n * Configure SuperLink and run deferred-attribution on first launch.\n *\n * Idempotent: the /match round-trip runs at most once per process. Safe to\n * call from app bootstrap. Returns the matched deep link, or null.\n *\n * Supports identity metadata extraction from the clipboard or from passed options,\n * enabling deterministic matching when the user has provided email/phone/custom\n * attributes on the source link.\n */\nexport async function initSuperLinkRN(\n config: SuperLinkConfig = {},\n identityOverride?: SuperLinkIdentityMetadata\n): Promise<SuperLinkDeepLink | null> {\n superlinkClient.configure(config);\n if (started) return getMatchedDeepLink();\n started = true;\n\n const fingerprint = collectFingerprint();\n const [referrer, clipboardToken] = await Promise.all([\n readPlayInstallReferrer(),\n readClipboardToken(),\n ]);\n\n // Extract identity metadata from clipboard URL if present, or use override.\n let identity: SuperLinkIdentityMetadata | undefined = identityOverride;\n if (!identity && clipboardToken) {\n try {\n identity = extractIdentityMetadata(clipboardToken);\n } catch {\n /* ignore malformed URL */\n }\n }\n\n // Resolution order is enforced engine-side: referrer → clipboard_token →\n // qr_token → identity → fingerprint. We send every signal we gathered.\n const res = await superlinkClient.match({\n fingerprint,\n ...(referrer ? { referrer } : {}),\n ...(clipboardToken ? { clipboard_token: clipboardToken } : {}),\n ...(identity ? { identity } : {}),\n });\n\n if (!res.matched) return null;\n\n const link = toDeepLink(res);\n emitDeferredDeepLink(link);\n return link;\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 matches the identity against an unmatched click's metadata.\n * Fires onDeferredDeepLink on a hit. Returns the resolved deep link, or null.\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 = await superlinkClient.match({\n identity,\n fingerprint: collectFingerprint(),\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.\n */\nexport async function completeFromScan(\n scanned: string\n): Promise<SuperLinkDeepLink | null> {\n if (!scanned) return null;\n const res = await superlinkClient.match({\n qr_token: scanned,\n fingerprint: collectFingerprint(),\n });\n if (!res.matched) return null;\n const link = toDeepLink(res);\n emitDeferredDeepLink(link);\n return link;\n}\n\n/**\n * Handle a direct open of an already-installed app via a Universal Link /\n * App Link URL: parse the payload and report an `opened` event. Returns the\n * parsed deep link (does NOT fire onDeferredDeepLink handlers — that channel is\n * reserved for deferred first-launch matches).\n */\nexport function handleUniversalLink(url: string): SuperLinkDeepLink | null {\n const link = parseUniversalLink(url);\n if (!link) return null;\n void superlinkClient.reportEvent({\n type: 'opened',\n click_id: link.click_id,\n platform: platform(),\n properties: { surface: 'native', url },\n });\n return link;\n}\n\ninterface LinkingLike {\n getInitialURL(): Promise<string | null>;\n addEventListener(\n type: 'url',\n handler: (event: { url: string }) => void\n ): { remove(): void } | void;\n removeEventListener?(type: 'url', handler: (event: { url: string }) => void): void;\n}\n\n/**\n * Wire RN Linking to handle already-installed opens. Processes the cold-start\n * URL (getInitialURL) and subsequent warm opens, calling `onLink` with the\n * parsed payload and reporting `opened` events. Returns an unsubscribe fn.\n *\n * Pass your app's `Linking` module from 'react-native' (kept as a param so this\n * file has no hard dependency on the Linking native module at import time).\n */\nexport function createSuperLinkListener(\n Linking: LinkingLike,\n onLink: DeferredDeepLinkHandler\n): () => void {\n const onUrl = (event: { url: string }) => {\n const link = handleUniversalLink(event.url);\n if (link) onLink(link);\n };\n\n Linking.getInitialURL()\n .then((url) => {\n if (url) onUrl({ url });\n })\n .catch(() => {\n /* ignore */\n });\n\n const subscription = Linking.addEventListener('url', onUrl);\n\n return () => {\n if (subscription && typeof (subscription as { remove?: () => void }).remove === 'function') {\n (subscription as { remove: () => void }).remove();\n } else if (Linking.removeEventListener) {\n Linking.removeEventListener('url', onUrl);\n }\n };\n}\n\n/**\n * Report a downstream conversion (signup, purchase, ...) back to the redirect\n * engine, attributed to the matched click when available.\n */\nexport async function reportConversion(\n props: Record<string, unknown> = {}\n): Promise<boolean> {\n const matched = getMatchedDeepLink();\n return superlinkClient.reportEvent({\n type: 'converted',\n click_id: matched?.click_id ?? null,\n platform: platform(),\n match_type: matched?.match_type,\n properties: props,\n });\n}\n\nexport { parseUniversalLink };\nexport { onDeferredDeepLink, getMatchedDeepLink };\n","/**\n * React Native entry point for SitePong SDK.\n *\n * Installs the RN EnvironmentAdapter first, then re-exports the RN public\n * API (SitePongRNProvider + RN-safe SDK functions). Consumers should use\n * `initRN()` (not `init()`), which does not touch DOM APIs.\n *\n * Because this module installs the env adapter at import time, simply\n * importing `sitepong/react-native` is enough to make shared SDK modules\n * route all environment access through the RN adapter.\n */\n\nimport { createRNEnvironment } from '../platforms/rn/environment';\nimport { setEnvironment } from '../utils/platform';\nimport type { StorageAdapter } from '../adapters/storage';\n\nconst env = createRNEnvironment();\nsetEnvironment(env);\n\n/**\n * Advanced: inject a StorageAdapter (e.g. AsyncStorage/MMKV-backed) after app boot.\n * Typically called by SitePongRNProvider.\n */\nexport function setRNStorage(storage: StorageAdapter | null): void {\n env._setStorage(storage);\n}\n\n// Re-export the full RN public API. This intentionally does NOT export\n// browser-only managers (Replay, WebVitals, Fingerprint) — see index.ts\n// registerWebManagerFactories() for how those are scoped to web bundles.\nexport * from '../react-native';\n"]}
|