@sessionlens/sdk 0.2.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.js","sources":["../src/core/config.ts","../src/core/tracker.ts","../src/integrations/react.ts","../src/index.ts"],"sourcesContent":["export interface SessionLensConfig {\n sdk_key: string;\n user_id: string;\n org_id: string;\n project_id?: string; // Optional: extracted from SDK key if not provided\n debug?: boolean;\n // API configuration options\n api_base_url?: string; // Optional: override API base URL\n endpoints?: {\n events?: string; // Optional: override events endpoint (default: /events/ingest)\n identify?: string; // Optional: override identify endpoint (default: /identify)\n reset?: string; // Optional: override reset endpoint (default: /reset)\n validate?: string; // Optional: override validation endpoint (default: /org/validate)\n };\n}\n\n// Production-ready session management interface\ninterface SessionInfo {\n session_id: string;\n client_id: string;\n org_id: string;\n project_id: string;\n user_id: string;\n started_at: number;\n last_activity: number;\n}\n\n// Session timeout (30 minutes of inactivity)\nconst SESSION_TIMEOUT = 30 * 60 * 1000;\n\n// Store the config and session info\nlet currentConfig: SessionLensConfig | null = null;\nlet currentSession: SessionInfo | null = null;\n\n// Extract project ID from SDK key pattern: sdk_prod_0000_684f15_5e0e72ac_35d2\nconst extractProjectFromSDKKey = (sdk_key: string): string => {\n const parts = sdk_key.split('_');\n return parts.length >= 4 ? `proj_${parts[3]}` : 'default';\n};\n\n// Generate crypto-grade unique IDs with hierarchical structure\nconst generateUniqueId = (config: SessionLensConfig, prefix: string): string => {\n const timestamp = Date.now();\n const project_id = config.project_id || extractProjectFromSDKKey(config.sdk_key);\n \n // Use crypto.randomUUID() for true uniqueness, fallback to secure random\n const uuid = (() => {\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\n return crypto.randomUUID().replace(/-/g, '').substring(0, 12);\n }\n // Fallback: combine multiple random values for better entropy\n const random1 = Math.random().toString(36).substring(2, 15);\n const random2 = Math.random().toString(36).substring(2, 15);\n return (random1 + random2).substring(0, 12);\n })();\n \n // Format: {org_id}_{project_id}_{prefix}_{timestamp}_{uuid}\n return `${config.org_id}_${project_id}_${prefix}_${timestamp}_${uuid}`;\n};\n\n// Get or create persistent client ID (per project)\nconst getOrCreateClientId = (config: SessionLensConfig): string => {\n const project_id = config.project_id || extractProjectFromSDKKey(config.sdk_key);\n const storageKey = `sessionlens_client_${config.org_id}_${project_id}`;\n \n if (typeof window !== 'undefined' && window.localStorage) {\n try {\n let clientId = localStorage.getItem(storageKey);\n if (!clientId) {\n clientId = generateUniqueId(config, 'client');\n localStorage.setItem(storageKey, clientId);\n }\n return clientId;\n } catch (error) {\n // localStorage might be disabled, fallback to session-only ID\n return generateUniqueId(config, 'client');\n }\n }\n \n // Fallback for non-browser environments\n return generateUniqueId(config, 'client');\n};\n\n// Start new session with collision-proof IDs\nconst startNewSession = (config: SessionLensConfig): void => {\n const now = Date.now();\n const project_id = config.project_id || extractProjectFromSDKKey(config.sdk_key);\n \n currentSession = {\n session_id: generateUniqueId(config, 'sess'),\n client_id: getOrCreateClientId(config),\n org_id: config.org_id,\n project_id: project_id,\n user_id: config.user_id,\n started_at: now,\n last_activity: now\n };\n \n if (config.debug) {\n console.log('SessionLens: New session started', {\n session_id: currentSession.session_id,\n client_id: currentSession.client_id,\n project_id: currentSession.project_id\n });\n }\n};\n\n// Check if session is expired\nconst isSessionExpired = (): boolean => {\n if (!currentSession) return true;\n return Date.now() - currentSession.last_activity > SESSION_TIMEOUT;\n};\n\n// Update session activity timestamp\nconst updateSessionActivity = (): void => {\n if (currentSession) {\n currentSession.last_activity = Date.now();\n }\n};\n\n// Get API base URL with priority: config > env vars > default\nconst getApiBaseUrl = (config?: SessionLensConfig): string => {\n // Priority 1: Runtime config (highest priority)\n if (config?.api_base_url) {\n return config.api_base_url;\n }\n \n // Priority 2: Environment variables (fallback)\n if (typeof process !== 'undefined' && process.env) {\n return process.env.SESSIONLENS_API_BASE_URL || \n process.env.REACT_APP_SESSIONLENS_API_BASE_URL || \n 'https://api.sessionlens.com/v1';\n }\n \n // Priority 3: Default (lowest priority)\n return 'https://api.sessionlens.com/v1';\n};\n\n// Get endpoint with fallback to default\nconst getEndpoint = (config: SessionLensConfig, endpointType: keyof NonNullable<SessionLensConfig['endpoints']>, defaultEndpoint: string): string => {\n return config.endpoints?.[endpointType] || defaultEndpoint;\n};\n\n// `sessionLensInit()` sets the config and validates with backend\nexport async function sessionLensInit(config: SessionLensConfig): Promise<void> {\n // Validate required fields\n if (!config.sdk_key) {\n throw new Error('[SessionLens] sdk_key is required');\n }\n if (!config.user_id) {\n throw new Error('[SessionLens] user_id is required');\n }\n if (!config.org_id) {\n throw new Error('[SessionLens] org_id is required');\n }\n\n // Store the configuration\n currentConfig = config;\n\n // Start new session with scalable ID generation\n startNewSession(config);\n\n // Validate configuration with backend using GET (more RESTful)\n const apiBaseUrl = getApiBaseUrl(config);\n const validateEndpoint = getEndpoint(config, 'validate', '/org/validate');\n \n try {\n // Use GET with query parameters for org_id and user_id validation\n const validationUrl = new URL(`${apiBaseUrl}${validateEndpoint}`);\n validationUrl.searchParams.set('org_id', config.org_id);\n validationUrl.searchParams.set('user_id', config.user_id);\n \n const response = await fetch(validationUrl.toString(), {\n method: 'GET',\n headers: {\n 'Authorization': `Bearer ${config.sdk_key}`\n }\n });\n\n if (!response.ok) {\n switch (response.status) {\n case 401:\n throw new Error('Invalid SDK key. Please check your credentials.');\n case 403:\n throw new Error('Access denied. Please verify your organization permissions.');\n case 404:\n throw new Error('Organization not found. Please check your org_id.');\n case 429:\n throw new Error('Rate limit exceeded. Please try again later.');\n default:\n throw new Error(`Validation failed with status ${response.status}`);\n }\n }\n\n const result = await response.json();\n if (config.debug) {\n console.log('SessionLens SDK initialized successfully:', result);\n console.log('Using API base URL:', apiBaseUrl);\n console.log('Validation endpoint:', validationUrl.toString());\n console.log('Session Info:', currentSession);\n }\n } catch (error) {\n if (error instanceof TypeError && error.message.includes('fetch')) {\n // Network error - allow offline mode\n if (config.debug) {\n console.warn('SessionLens SDK: Running in offline mode due to network error');\n }\n return;\n }\n // Re-throw validation errors\n throw error;\n }\n}\n\n// `sessionLensGetConfig()` returns it later (for use in tracker, etc)\nexport function sessionLensGetConfig(): SessionLensConfig {\n if (!currentConfig) {\n throw new Error('[SessionLens] SDK not initialized. Call `sessionLensInit()` first.');\n }\n return currentConfig;\n}\n\n// Get current session info with auto-renewal and activity tracking\nexport function getSessionInfo(): SessionInfo {\n if (!currentConfig) {\n throw new Error('[SessionLens] SDK not initialized. Call `sessionLensInit()` first.');\n }\n\n // Check if session expired or doesn't exist\n if (!currentSession || isSessionExpired()) {\n startNewSession(currentConfig);\n } else {\n // Update activity timestamp\n updateSessionActivity();\n }\n\n return currentSession!;\n}\n\n// Export function to get API base URL for use in other modules\nexport function getSessionLensApiBaseUrl(): string {\n return getApiBaseUrl(currentConfig || undefined);\n} ","import { sessionLensGetConfig, getSessionLensApiBaseUrl, getSessionInfo } from './config';\nimport { SessionLensEvent, SessionLensUser } from '../types';\n\nexport function sessionLensTrack(event: SessionLensEvent): void {\n const config = sessionLensGetConfig();\n const sessionInfo = getSessionInfo(); // Get current session with activity update\n \n // Add timestamp if not provided\n const eventWithTimestamp: SessionLensEvent = {\n ...event,\n timestamp: event.timestamp || Date.now()\n };\n\n if (config.debug) {\n console.log('SessionLens Track:', eventWithTimestamp);\n console.log('Session Context:', {\n session_id: sessionInfo.session_id,\n client_id: sessionInfo.client_id,\n project_id: sessionInfo.project_id\n });\n }\n\n // Send event to backend with session context\n sendEventToBackend(eventWithTimestamp, config, sessionInfo);\n}\n\nexport function sessionLensIdentify(user: SessionLensUser): void {\n const config = sessionLensGetConfig();\n const sessionInfo = getSessionInfo(); // Get current session with activity update\n \n if (config.debug) {\n console.log('SessionLens Identify:', user);\n console.log('Session Context:', {\n session_id: sessionInfo.session_id,\n client_id: sessionInfo.client_id,\n project_id: sessionInfo.project_id\n });\n }\n\n // Send identify event to backend with session context\n sendIdentifyToBackend(user, config, sessionInfo);\n}\n\nexport function sessionLensReset(): void {\n const config = sessionLensGetConfig();\n const sessionInfo = getSessionInfo(); // Get current session with activity update\n \n if (config.debug) {\n console.log('SessionLens Reset');\n console.log('Session Context:', {\n session_id: sessionInfo.session_id,\n client_id: sessionInfo.client_id,\n project_id: sessionInfo.project_id\n });\n }\n\n // Clear any stored user data and send reset event to backend\n sendResetToBackend(config, sessionInfo);\n}\n\n// Helper functions for backend communication with session context\nasync function sendEventToBackend(event: SessionLensEvent, config: any, sessionInfo: any): Promise<void> {\n const apiBaseUrl = getSessionLensApiBaseUrl();\n const eventsEndpoint = config.endpoints?.events || '/events/ingest';\n \n try {\n const response = await fetch(`${apiBaseUrl}${eventsEndpoint}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${config.sdk_key}`\n },\n body: JSON.stringify({\n org_id: config.org_id,\n project_id: sessionInfo.project_id,\n user_id: config.user_id,\n session_id: sessionInfo.session_id,\n client_id: sessionInfo.client_id,\n session_started_at: sessionInfo.started_at,\n event: event\n })\n });\n\n if (!response.ok && config.debug) {\n console.warn('SessionLens: Failed to send event:', response.status);\n } else if (config.debug) {\n console.log('SessionLens: Event sent successfully with session context');\n }\n } catch (error) {\n if (config.debug) {\n console.warn('SessionLens: Network error sending event:', error);\n }\n }\n}\n\nasync function sendIdentifyToBackend(user: SessionLensUser, config: any, sessionInfo: any): Promise<void> {\n const apiBaseUrl = getSessionLensApiBaseUrl();\n const identifyEndpoint = config.endpoints?.identify || '/identify';\n \n try {\n const response = await fetch(`${apiBaseUrl}${identifyEndpoint}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${config.sdk_key}`\n },\n body: JSON.stringify({\n org_id: config.org_id,\n project_id: sessionInfo.project_id,\n user_id: user.user_id,\n session_id: sessionInfo.session_id,\n client_id: sessionInfo.client_id,\n session_started_at: sessionInfo.started_at,\n properties: user.properties\n })\n });\n\n if (!response.ok && config.debug) {\n console.warn('SessionLens: Failed to send identify:', response.status);\n } else if (config.debug) {\n console.log('SessionLens: Identify sent successfully with session context');\n }\n } catch (error) {\n if (config.debug) {\n console.warn('SessionLens: Network error sending identify:', error);\n }\n }\n}\n\nasync function sendResetToBackend(config: any, sessionInfo: any): Promise<void> {\n const apiBaseUrl = getSessionLensApiBaseUrl();\n const resetEndpoint = config.endpoints?.reset || '/reset';\n \n try {\n const response = await fetch(`${apiBaseUrl}${resetEndpoint}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${config.sdk_key}`\n },\n body: JSON.stringify({\n org_id: config.org_id,\n project_id: sessionInfo.project_id,\n user_id: config.user_id,\n session_id: sessionInfo.session_id,\n client_id: sessionInfo.client_id,\n session_started_at: sessionInfo.started_at\n })\n });\n\n if (!response.ok && config.debug) {\n console.warn('SessionLens: Failed to send reset:', response.status);\n } else if (config.debug) {\n console.log('SessionLens: Reset sent successfully with session context');\n }\n } catch (error) {\n if (config.debug) {\n console.warn('SessionLens: Network error sending reset:', error);\n }\n }\n} ","import { useEffect } from 'react';\nimport { SessionLensEvent, SessionLensUser } from '../types';\nimport { sessionLensInit, SessionLensConfig } from '../core/config';\nimport { sessionLensTrack, sessionLensIdentify, sessionLensReset } from '../core/tracker';\n\nexport const useSessionLens = (config: SessionLensConfig) => {\n useEffect(() => {\n // Initialize SDK asynchronously\n const initializeSDK = async () => {\n try {\n await sessionLensInit(config);\n } catch (error) {\n console.error('[SessionLens] Initialization failed:', error);\n }\n };\n\n initializeSDK();\n\n // Cleanup on unmount\n return () => {\n sessionLensReset();\n };\n }, [config]);\n};\n\nexport const useSessionLensTrack = () => {\n return (event: SessionLensEvent) => {\n try {\n sessionLensTrack(event);\n } catch (error) {\n console.error('[SessionLens] Track failed:', error);\n }\n };\n};\n\nexport const useSessionLensIdentify = () => {\n return (user: SessionLensUser) => {\n try {\n sessionLensIdentify(user);\n } catch (error) {\n console.error('[SessionLens] Identify failed:', error);\n }\n };\n}; ","import { sessionLensInit, SessionLensConfig } from './core/config';\nimport { sessionLensTrack, sessionLensIdentify, sessionLensReset } from './core/tracker';\nimport { SessionLensEvent, SessionLensUser, SessionLensInstance } from './types';\n\n// Export types\nexport * from './types';\nexport { SessionLensConfig } from './core/config';\n\n// Export React hooks\nexport * from './integrations/react';\n\nclass SessionLens implements SessionLensInstance {\n public async sessionLensInit(config: SessionLensConfig): Promise<void> {\n await sessionLensInit(config);\n }\n\n public sessionLensTrack(event: SessionLensEvent): void {\n sessionLensTrack(event);\n }\n\n public sessionLensIdentify(user: SessionLensUser): void {\n sessionLensIdentify(user);\n }\n\n public sessionLensReset(): void {\n sessionLensReset();\n }\n}\n\n// Create and export singleton instance\nconst sessionLens = new SessionLens();\nexport default sessionLens; "],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.esm.js","sources":["../src/utils/uuid.ts","../src/core/identity.ts","../src/core/config.ts","../src/utils/ua.ts","../src/version.ts","../src/core/enrich.ts","../src/core/tracker.ts","../src/integrations/react.ts","../src/index.ts"],"sourcesContent":["/** RFC 4122 v4 UUID: crypto.randomUUID() when available, else getRandomValues, else Math.random. */\nexport function uuidv4(): string {\n const c: Crypto | undefined = typeof crypto !== 'undefined' ? crypto : undefined;\n\n if (c && typeof c.randomUUID === 'function') {\n return c.randomUUID();\n }\n\n const bytes = new Uint8Array(16);\n if (c && typeof c.getRandomValues === 'function') {\n c.getRandomValues(bytes);\n } else {\n for (let i = 0; i < 16; i++) bytes[i] = Math.floor(Math.random() * 256);\n }\n bytes[6] = (bytes[6] & 0x0f) | 0x40; // version 4\n bytes[8] = (bytes[8] & 0x3f) | 0x80; // variant 10\n\n const hex: string[] = [];\n for (let i = 0; i < 16; i++) hex.push((bytes[i] + 0x100).toString(16).substring(1));\n return (\n hex.slice(0, 4).join('') + '-' + hex.slice(4, 6).join('') + '-' + hex.slice(6, 8).join('') + '-' +\n hex.slice(8, 10).join('') + '-' + hex.slice(10, 16).join('')\n );\n}\n","import { uuidv4 } from '../utils/uuid';\n\n// Storage keys (localStorage). Deliberately not scoped per project: a device is one device.\nconst DEVICE_ID_KEY = '_sl_device_id';\nconst DISTINCT_ID_KEY = '_sl_distinct_id';\nconst USER_ID_KEY = '_sl_user_id';\nconst INITIAL_REFERRER_KEY = '_sl_initial_referrer';\n\n// Used when localStorage is unavailable (SSR, private mode, blocked storage).\nconst memoryStore: Record<string, string> = {};\n\nfunction storageGet(key: string): string | null {\n try {\n if (typeof window !== 'undefined' && window.localStorage) {\n return window.localStorage.getItem(key);\n }\n } catch (_) {\n // fall through to memory\n }\n return key in memoryStore ? memoryStore[key] : null;\n}\n\nfunction storageSet(key: string, value: string): void {\n memoryStore[key] = value;\n try {\n if (typeof window !== 'undefined' && window.localStorage) {\n window.localStorage.setItem(key, value);\n }\n } catch (_) {\n // memory copy above keeps the identity stable for this page session\n }\n}\n\nfunction storageRemove(key: string): void {\n delete memoryStore[key];\n try {\n if (typeof window !== 'undefined' && window.localStorage) {\n window.localStorage.removeItem(key);\n }\n } catch (_) {\n // ignore\n }\n}\n\nexport interface Identity {\n device_id: string;\n distinct_id: string;\n user_id?: string;\n}\n\nexport function getDeviceId(): string {\n let deviceId = storageGet(DEVICE_ID_KEY);\n if (!deviceId) {\n deviceId = uuidv4();\n storageSet(DEVICE_ID_KEY, deviceId);\n }\n return deviceId;\n}\n\n/** Current identity. Anonymous visitors have distinct_id === device_id and no user_id. */\nexport function getIdentity(): Identity {\n const device_id = getDeviceId();\n const user_id = storageGet(USER_ID_KEY) || undefined;\n const distinct_id = storageGet(DISTINCT_ID_KEY) || user_id || device_id;\n return { device_id, distinct_id, user_id };\n}\n\n/** Persist a user identity. From now on events carry distinct_id = userId. */\nexport function setUser(userId: string): void {\n storageSet(USER_ID_KEY, userId);\n storageSet(DISTINCT_ID_KEY, userId);\n}\n\n/** Forget the user and start a fresh anonymous identity on a new device id. */\nexport function resetIdentity(): Identity {\n storageRemove(USER_ID_KEY);\n storageRemove(DISTINCT_ID_KEY);\n storageRemove(DEVICE_ID_KEY);\n return getIdentity();\n}\n\n/** Referrer of the very first page load, persisted once ('$direct' when there was none). */\nexport function getInitialReferrer(currentReferrer: string): string {\n let value = storageGet(INITIAL_REFERRER_KEY);\n if (value === null) {\n value = currentReferrer || '$direct';\n storageSet(INITIAL_REFERRER_KEY, value);\n }\n return value;\n}\n","import { getIdentity } from './identity';\n\nexport interface SessionLensConfig {\n sdk_key: string;\n user_id?: string; // Optional: when provided it is treated as an implicit identify(user_id)\n org_id: string;\n project_id?: string; // Optional: extracted from SDK key if not provided\n app?: string; // Optional: default app tag for events that don't specify their own (e.g. sub-module within the project)\n debug?: boolean;\n // API configuration options\n api_base_url?: string; // Optional: override API base URL\n endpoints?: {\n events?: string; // Optional: override events endpoint (default: /events/ingest)\n identify?: string; // Optional: override identify endpoint (default: /identify)\n reset?: string; // Optional: override reset endpoint (default: /reset)\n userProperties?: string; // Optional: override user-properties endpoint (default: /user-properties)\n validate?: string; // Optional: override validation endpoint (default: /org/validate)\n };\n}\n\n// Production-ready session management interface\ninterface SessionInfo {\n session_id: string;\n client_id: string;\n org_id: string;\n project_id: string;\n user_id?: string;\n started_at: number;\n last_activity: number;\n}\n\n// Session timeout (30 minutes of inactivity)\nconst SESSION_TIMEOUT = 30 * 60 * 1000;\n\n// Store the config and session info\nlet currentConfig: SessionLensConfig | null = null;\nlet currentSession: SessionInfo | null = null;\n\n// Extract project ID from SDK key pattern: sdk_prod_0000_684f15_5e0e72ac_35d2\nconst extractProjectFromSDKKey = (sdk_key: string): string => {\n const parts = sdk_key.split('_');\n return parts.length >= 4 ? `proj_${parts[3]}` : 'default';\n};\n\n// Generate crypto-grade unique IDs with hierarchical structure\nconst generateUniqueId = (config: SessionLensConfig, prefix: string): string => {\n const timestamp = Date.now();\n const project_id = config.project_id || extractProjectFromSDKKey(config.sdk_key);\n \n // Use crypto.randomUUID() for true uniqueness, fallback to secure random\n const uuid = (() => {\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\n return crypto.randomUUID().replace(/-/g, '').substring(0, 12);\n }\n // Fallback: combine multiple random values for better entropy\n const random1 = Math.random().toString(36).substring(2, 15);\n const random2 = Math.random().toString(36).substring(2, 15);\n return (random1 + random2).substring(0, 12);\n })();\n \n // Format: {org_id}_{project_id}_{prefix}_{timestamp}_{uuid}\n return `${config.org_id}_${project_id}_${prefix}_${timestamp}_${uuid}`;\n};\n\n// Get or create persistent client ID (per project)\nconst getOrCreateClientId = (config: SessionLensConfig): string => {\n const project_id = config.project_id || extractProjectFromSDKKey(config.sdk_key);\n const storageKey = `sessionlens_client_${config.org_id}_${project_id}`;\n \n if (typeof window !== 'undefined' && window.localStorage) {\n try {\n let clientId = localStorage.getItem(storageKey);\n if (!clientId) {\n clientId = generateUniqueId(config, 'client');\n localStorage.setItem(storageKey, clientId);\n }\n return clientId;\n } catch (error) {\n // localStorage might be disabled, fallback to session-only ID\n return generateUniqueId(config, 'client');\n }\n }\n \n // Fallback for non-browser environments\n return generateUniqueId(config, 'client');\n};\n\n// Start new session with collision-proof IDs\nconst startNewSession = (config: SessionLensConfig): void => {\n const now = Date.now();\n const project_id = config.project_id || extractProjectFromSDKKey(config.sdk_key);\n \n currentSession = {\n session_id: generateUniqueId(config, 'sess'),\n client_id: getOrCreateClientId(config),\n org_id: config.org_id,\n project_id: project_id,\n user_id: getIdentity().user_id,\n started_at: now,\n last_activity: now\n };\n \n if (config.debug) {\n console.log('SessionLens: New session started', {\n session_id: currentSession.session_id,\n client_id: currentSession.client_id,\n project_id: currentSession.project_id\n });\n }\n};\n\n// Check if session is expired\nconst isSessionExpired = (): boolean => {\n if (!currentSession) return true;\n return Date.now() - currentSession.last_activity > SESSION_TIMEOUT;\n};\n\n// Begin a fresh session (used by reset())\nexport function restartSession(): void {\n if (currentConfig) {\n startNewSession(currentConfig);\n }\n}\n\n// Update session activity timestamp\nconst updateSessionActivity = (): void => {\n if (currentSession) {\n currentSession.last_activity = Date.now();\n }\n};\n\n// Get API base URL with priority: config > env vars > default\nconst getApiBaseUrl = (config?: SessionLensConfig): string => {\n // Priority 1: Runtime config (highest priority)\n if (config?.api_base_url) {\n return config.api_base_url;\n }\n \n // Priority 2: Environment variables (fallback)\n if (typeof process !== 'undefined' && process.env) {\n return process.env.SESSIONLENS_API_BASE_URL || \n process.env.REACT_APP_SESSIONLENS_API_BASE_URL || \n 'https://api.sessionlens.com/v1';\n }\n \n // Priority 3: Default (lowest priority)\n return 'https://api.sessionlens.com/v1';\n};\n\n// Get endpoint with fallback to default\nconst getEndpoint = (config: SessionLensConfig, endpointType: keyof NonNullable<SessionLensConfig['endpoints']>, defaultEndpoint: string): string => {\n return config.endpoints?.[endpointType] || defaultEndpoint;\n};\n\n// `sessionLensInit()` sets the config and validates with backend\nexport async function sessionLensInit(config: SessionLensConfig): Promise<void> {\n // Validate required fields\n if (!config.sdk_key) {\n throw new Error('[SessionLens] sdk_key is required');\n }\n if (!config.org_id) {\n throw new Error('[SessionLens] org_id is required');\n }\n\n // Store the configuration\n currentConfig = config;\n\n // Start new session with scalable ID generation\n startNewSession(config);\n\n // Validate configuration with backend using GET (more RESTful)\n const apiBaseUrl = getApiBaseUrl(config);\n const validateEndpoint = getEndpoint(config, 'validate', '/org/validate');\n \n try {\n // Use GET with query parameters for org_id and user_id validation\n const validationUrl = new URL(`${apiBaseUrl}${validateEndpoint}`);\n validationUrl.searchParams.set('org_id', config.org_id);\n if (config.user_id) {\n validationUrl.searchParams.set('user_id', config.user_id);\n }\n \n const response = await fetch(validationUrl.toString(), {\n method: 'GET',\n headers: {\n 'Authorization': `Bearer ${config.sdk_key}`\n }\n });\n\n if (!response.ok) {\n switch (response.status) {\n case 401:\n throw new Error('Invalid SDK key. Please check your credentials.');\n case 403:\n throw new Error('Access denied. Please verify your organization permissions.');\n case 404:\n throw new Error('Organization not found. Please check your org_id.');\n case 429:\n throw new Error('Rate limit exceeded. Please try again later.');\n default:\n throw new Error(`Validation failed with status ${response.status}`);\n }\n }\n\n const result = await response.json();\n if (config.debug) {\n console.log('SessionLens SDK initialized successfully:', result);\n console.log('Using API base URL:', apiBaseUrl);\n console.log('Validation endpoint:', validationUrl.toString());\n console.log('Session Info:', currentSession);\n }\n } catch (error) {\n if (error instanceof TypeError && error.message.includes('fetch')) {\n // Network error - allow offline mode\n if (config.debug) {\n console.warn('SessionLens SDK: Running in offline mode due to network error');\n }\n return;\n }\n // Re-throw validation errors\n throw error;\n }\n}\n\n// `sessionLensGetConfig()` returns it later (for use in tracker, etc)\nexport function sessionLensGetConfig(): SessionLensConfig {\n if (!currentConfig) {\n throw new Error('[SessionLens] SDK not initialized. Call `sessionLensInit()` first.');\n }\n return currentConfig;\n}\n\n// Get current session info with auto-renewal and activity tracking\nexport function getSessionInfo(): SessionInfo {\n if (!currentConfig) {\n throw new Error('[SessionLens] SDK not initialized. Call `sessionLensInit()` first.');\n }\n\n // Check if session expired or doesn't exist\n if (!currentSession || isSessionExpired()) {\n startNewSession(currentConfig);\n } else {\n // Update activity timestamp\n updateSessionActivity();\n }\n\n return currentSession!;\n}\n\n// Export function to get API base URL for use in other modules\nexport function getSessionLensApiBaseUrl(): string {\n return getApiBaseUrl(currentConfig || undefined);\n} ","export interface ParsedUA {\n browser: string;\n browser_version: string;\n os: string;\n os_version: string;\n device_type: string;\n}\n\n// Order matters: Edge/Opera/Samsung embed \"Chrome\", Chrome embeds \"Safari\".\nconst BROWSERS: Array<[string, RegExp]> = [\n ['Edge', /(?:Edg|EdgA|EdgiOS|Edge)\\/([\\d.]+)/],\n ['Opera', /(?:OPR|Opera)\\/([\\d.]+)/],\n ['Samsung Internet', /SamsungBrowser\\/([\\d.]+)/],\n ['Firefox', /(?:Firefox|FxiOS)\\/([\\d.]+)/],\n ['Chrome', /(?:Chrome|CriOS)\\/([\\d.]+)/],\n ['Internet Explorer', /(?:MSIE |Trident\\/.*rv:)([\\d.]+)/],\n ['Safari', /Version\\/([\\d.]+).*Safari/],\n];\n\nconst OSES: Array<[string, RegExp]> = [\n ['Windows', /Windows NT ([\\d.]+)/],\n ['iOS', /(?:iPhone|CPU) OS ([\\d_]+)/],\n ['Android', /Android ([\\d.]+)/],\n ['Mac OS X', /Mac OS X ([\\d_.]+)/],\n ['Chrome OS', /CrOS \\S+ ([\\d.]+)/],\n ['Linux', /Linux()/],\n];\n\nexport function parseUserAgent(ua: string): ParsedUA {\n const result: ParsedUA = { browser: '', browser_version: '', os: '', os_version: '', device_type: '' };\n if (!ua) return result;\n\n for (const [name, re] of BROWSERS) {\n const m = ua.match(re);\n if (m) {\n result.browser = name;\n result.browser_version = m[1];\n break;\n }\n }\n for (const [name, re] of OSES) {\n const m = ua.match(re);\n if (m) {\n result.os = name;\n result.os_version = (m[1] || '').replace(/_/g, '.');\n break;\n }\n }\n\n if (/iPad|Tablet|PlayBook|Silk/i.test(ua) || (/Android/i.test(ua) && !/Mobile/i.test(ua))) {\n result.device_type = 'Tablet';\n } else if (/Mobi|iPhone|iPod|Android|Windows Phone/i.test(ua)) {\n result.device_type = 'Mobile';\n } else if (result.os) {\n result.device_type = 'Desktop';\n }\n return result;\n}\n","// Hand-maintained (bundling package.json would need an extra rollup plugin).\n// Keep in sync with \"version\" in package.json when releasing.\nexport const SDK_VERSION = '0.3.0';\nexport const SDK_LIBRARY = 'sessionlens-js';\n","import { getIdentity, getInitialReferrer } from './identity';\nimport { parseUserAgent } from '../utils/ua';\nimport { uuidv4 } from '../utils/uuid';\nimport { SDK_LIBRARY, SDK_VERSION } from '../version';\n\nconst UTM_KEYS = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content'];\n\nfunction hostOf(url: string): string {\n try {\n return new URL(url).hostname;\n } catch (_) {\n return '';\n }\n}\n\n/**\n * System properties attached to every event. All browser access is guarded so this\n * is safe to call during SSR (only identity/library fields are returned there).\n * The server re-derives browser/os/geo authoritatively; the client UA fields are a fallback.\n */\nexport function buildSystemProperties(clientTimestamp: number): Record<string, any> {\n const identity = getIdentity();\n const props: Record<string, any> = {\n $device_id: identity.device_id,\n $distinct_id: identity.distinct_id,\n $insert_id: uuidv4(),\n $library: SDK_LIBRARY,\n $library_version: SDK_VERSION,\n $client_timestamp: clientTimestamp,\n };\n if (identity.user_id) props.$user_id = identity.user_id;\n\n if (typeof window === 'undefined') return props;\n\n try {\n const loc = window.location;\n props.$current_url = loc.href;\n props.$pathname = loc.pathname;\n\n const referrer = typeof document !== 'undefined' ? document.referrer || '' : '';\n props.$referrer = referrer || '$direct';\n props.$referring_domain = referrer ? hostOf(referrer) : '$direct';\n props.$initial_referrer = getInitialReferrer(referrer);\n\n const params = new URLSearchParams(loc.search);\n for (const key of UTM_KEYS) {\n const value = params.get(key);\n if (value) props['$' + key] = value;\n }\n\n if (window.screen) {\n props.$screen_width = window.screen.width;\n props.$screen_height = window.screen.height;\n }\n\n if (typeof navigator !== 'undefined' && navigator.userAgent) {\n const ua = parseUserAgent(navigator.userAgent);\n if (ua.browser) props.$browser = ua.browser;\n if (ua.browser_version) props.$browser_version = ua.browser_version;\n if (ua.os) props.$os = ua.os;\n if (ua.os_version) props.$os_version = ua.os_version;\n if (ua.device_type) props.$device_type = ua.device_type;\n }\n } catch (_) {\n // enrichment must never break tracking\n }\n return props;\n}\n","import {\n sessionLensInit as coreInit,\n sessionLensGetConfig,\n getSessionLensApiBaseUrl,\n getSessionInfo,\n restartSession,\n SessionLensConfig,\n} from './config';\nimport { getIdentity, setUser, resetIdentity } from './identity';\nimport { buildSystemProperties } from './enrich';\nimport { SessionLensEvent, SessionLensUser } from '../types';\n\n/**\n * Initialize the SDK. If `config.user_id` is supplied (pre-0.3 integrations) it is treated\n * as an implicit identify() - sent only when it differs from the persisted identity.\n */\nexport async function sessionLensInit(config: SessionLensConfig): Promise<void> {\n await coreInit(config);\n if (config.user_id && getIdentity().user_id !== config.user_id) {\n identify(config.user_id);\n }\n}\n\nexport function sessionLensTrack(event: SessionLensEvent): void {\n const config = sessionLensGetConfig();\n const sessionInfo = getSessionInfo(); // Get current session with activity update\n\n const timestamp = event.timestamp || Date.now();\n // Caller-supplied properties override auto-collected ones (e.g. to pass a stable $insert_id for retries).\n const properties = { ...buildSystemProperties(timestamp), ...(event.properties || {}) };\n const eventWithContext: SessionLensEvent = { ...event, timestamp, properties };\n\n if (config.debug) {\n console.log('SessionLens Track:', eventWithContext);\n console.log('Session Context:', {\n session_id: sessionInfo.session_id,\n client_id: sessionInfo.client_id,\n project_id: sessionInfo.project_id\n });\n }\n\n sendEventToBackend(eventWithContext, config, sessionInfo);\n}\n\n/** Link the current device to `userId` (last identify wins) and optionally set traits. */\nexport function identify(userId: string, traits?: Record<string, any>): void {\n const config = sessionLensGetConfig();\n const sessionInfo = getSessionInfo();\n\n if (!userId) {\n if (config.debug) console.warn('SessionLens: identify() requires a userId');\n return;\n }\n\n setUser(userId);\n if (config.debug) {\n console.log('SessionLens Identify:', { userId, traits });\n }\n post(config, config.endpoints?.identify || '/identify', {\n org_id: config.org_id,\n project_id: sessionInfo.project_id,\n app: config.app || 'unknown',\n user_id: userId,\n device_id: getIdentity().device_id,\n session_id: sessionInfo.session_id,\n client_id: sessionInfo.client_id,\n session_started_at: sessionInfo.started_at,\n traits: traits || {}\n }, 'identify');\n}\n\n/** @deprecated Aliasing is subsumed by identify(); `oldId` is ignored (the device link is implicit). */\nexport function alias(newId: string, _oldId?: string): void {\n identify(newId);\n}\n\n/** Set traits on the current profile (`name` and `email` map to core profile fields). */\nexport function setUserProperties(traits: Record<string, any>): void {\n const config = sessionLensGetConfig();\n const sessionInfo = getSessionInfo();\n\n post(config, config.endpoints?.userProperties || '/user-properties', {\n org_id: config.org_id,\n project_id: sessionInfo.project_id,\n distinct_id: getIdentity().distinct_id,\n traits: traits || {}\n }, 'user properties');\n}\n\n/** Legacy signature: sessionLensIdentify({ user_id, properties }). */\nexport function sessionLensIdentify(user: SessionLensUser): void {\n identify(user.user_id, user.properties);\n}\n\n/** Forget the user, start an anonymous identity on a new device id and a new session. */\nexport function reset(): void {\n const config = sessionLensGetConfig();\n const sessionInfo = getSessionInfo();\n\n if (config.debug) {\n console.log('SessionLens Reset');\n }\n\n post(config, config.endpoints?.reset || '/reset', {\n org_id: config.org_id,\n project_id: sessionInfo.project_id,\n session_id: sessionInfo.session_id,\n client_id: sessionInfo.client_id,\n session_started_at: sessionInfo.started_at\n }, 'reset');\n\n resetIdentity();\n restartSession();\n}\n\nexport const sessionLensReset = reset;\n\nasync function post(config: SessionLensConfig, endpoint: string, body: Record<string, any>, label: string): Promise<void> {\n try {\n const response = await fetch(`${getSessionLensApiBaseUrl()}${endpoint}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${config.sdk_key}`\n },\n body: JSON.stringify(body)\n });\n\n if (!response.ok && config.debug) {\n console.warn(`SessionLens: Failed to send ${label}:`, response.status);\n } else if (config.debug) {\n console.log(`SessionLens: ${label} sent successfully`);\n }\n } catch (error) {\n if (config.debug) {\n console.warn(`SessionLens: Network error sending ${label}:`, error);\n }\n }\n}\n\nfunction sendEventToBackend(event: SessionLensEvent, config: SessionLensConfig, sessionInfo: any): Promise<void> {\n const identity = getIdentity();\n const body: Record<string, any> = {\n org_id: config.org_id,\n project_id: sessionInfo.project_id,\n app: event.app || config.app || 'unknown',\n device_id: identity.device_id,\n distinct_id: identity.distinct_id,\n session_id: sessionInfo.session_id,\n client_id: sessionInfo.client_id,\n session_started_at: sessionInfo.started_at,\n event: event\n };\n if (identity.user_id) {\n body.user_id = identity.user_id;\n }\n return post(config, config.endpoints?.events || '/events/ingest', body, 'event');\n}\n","import { useEffect } from 'react';\nimport { SessionLensEvent, SessionLensUser } from '../types';\nimport { SessionLensConfig } from '../core/config';\nimport { sessionLensInit, sessionLensTrack, sessionLensIdentify } from '../core/tracker';\n\nexport const useSessionLens = (config: SessionLensConfig) => {\n useEffect(() => {\n // Initialize SDK asynchronously\n const initializeSDK = async () => {\n try {\n await sessionLensInit(config);\n } catch (error) {\n console.error('[SessionLens] Initialization failed:', error);\n }\n };\n\n initializeSDK();\n // No cleanup reset: reset() now clears the persisted device/user identity, which must\n // survive unmounts and re-renders. Call reset() explicitly on logout instead.\n }, [config]);\n};\n\nexport const useSessionLensTrack = () => {\n return (event: SessionLensEvent) => {\n try {\n sessionLensTrack(event);\n } catch (error) {\n console.error('[SessionLens] Track failed:', error);\n }\n };\n};\n\nexport const useSessionLensIdentify = () => {\n return (user: SessionLensUser) => {\n try {\n sessionLensIdentify(user);\n } catch (error) {\n console.error('[SessionLens] Identify failed:', error);\n }\n };\n}; ","import { SessionLensConfig } from './core/config';\nimport {\n sessionLensInit,\n sessionLensTrack,\n sessionLensIdentify,\n sessionLensReset,\n identify,\n alias,\n setUserProperties,\n reset,\n} from './core/tracker';\nimport { SessionLensEvent, SessionLensUser, SessionLensInstance } from './types';\n\n// Export types\nexport * from './types';\nexport { SessionLensConfig } from './core/config';\nexport { SDK_VERSION } from './version';\n\n// Export React hooks\nexport * from './integrations/react';\n\nclass SessionLens implements SessionLensInstance {\n public async sessionLensInit(config: SessionLensConfig): Promise<void> {\n await sessionLensInit(config);\n }\n\n public sessionLensTrack(event: SessionLensEvent): void {\n sessionLensTrack(event);\n }\n\n public sessionLensIdentify(user: SessionLensUser): void {\n sessionLensIdentify(user);\n }\n\n public sessionLensReset(): void {\n sessionLensReset();\n }\n\n public identify(userId: string, traits?: Record<string, any>): void {\n identify(userId, traits);\n }\n\n /** @deprecated Use identify(). */\n public alias(newId: string, oldId?: string): void {\n alias(newId, oldId);\n }\n\n public setUserProperties(traits: Record<string, any>): void {\n setUserProperties(traits);\n }\n\n public reset(): void {\n reset();\n }\n}\n\n// Create and export singleton instance\nconst sessionLens = new SessionLens();\nexport default sessionLens; "],"names":["sessionLensInit","coreInit"],"mappings":"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"}