@sessionlens/sdk 0.1.0 → 0.2.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.
package/README.md CHANGED
@@ -88,14 +88,82 @@ function App() {
88
88
 
89
89
  ## Configuration
90
90
 
91
- ### Environment Variables
91
+ ### Runtime Configuration
92
+
93
+ The SDK supports flexible runtime configuration through the `SessionLensConfig` interface:
92
94
 
93
- The SDK supports configuration through environment variables:
95
+ ```typescript
96
+ interface SessionLensConfig {
97
+ sdk_key: string; // Your SessionLens SDK key
98
+ user_id: string; // Unique identifier for the user
99
+ org_id: string; // Your organization ID
100
+ project_id?: string; // Optional: extracted from SDK key if not provided
101
+ debug?: boolean; // Optional: enable debug logging
102
+ // API configuration options
103
+ api_base_url?: string; // Optional: override API base URL
104
+ endpoints?: {
105
+ events?: string; // Optional: override events endpoint (default: /events/ingest)
106
+ identify?: string; // Optional: override identify endpoint (default: /identify)
107
+ reset?: string; // Optional: override reset endpoint (default: /reset)
108
+ validate?: string; // Optional: override validation endpoint (default: /org/validate)
109
+ };
110
+ }
111
+ ```
94
112
 
95
- #### API Base URL
113
+ #### API Base URL Configuration
96
114
 
97
115
  Configure the API base URL for different environments:
98
116
 
117
+ ```javascript
118
+ // Development
119
+ await sessionLens.sessionLensInit({
120
+ sdk_key: 'your-sdk-key',
121
+ user_id: 'user123',
122
+ org_id: 'org456',
123
+ api_base_url: 'https://dev-api.sessionlens.com/v1',
124
+ debug: true
125
+ });
126
+
127
+ // Staging
128
+ await sessionLens.sessionLensInit({
129
+ sdk_key: 'your-sdk-key',
130
+ user_id: 'user123',
131
+ org_id: 'org456',
132
+ api_base_url: 'https://staging-api.sessionlens.com/v1'
133
+ });
134
+
135
+ // Production
136
+ await sessionLens.sessionLensInit({
137
+ sdk_key: 'your-sdk-key',
138
+ user_id: 'user123',
139
+ org_id: 'org456',
140
+ api_base_url: 'https://api.sessionlens.com/v1'
141
+ });
142
+ ```
143
+
144
+ #### Custom Endpoints
145
+
146
+ Override specific API endpoints if needed:
147
+
148
+ ```javascript
149
+ await sessionLens.sessionLensInit({
150
+ sdk_key: 'your-sdk-key',
151
+ user_id: 'user123',
152
+ org_id: 'org456',
153
+ api_base_url: 'https://api.sessionlens.com/v1',
154
+ endpoints: {
155
+ events: '/custom/events/endpoint',
156
+ identify: '/custom/identify/endpoint',
157
+ reset: '/custom/reset/endpoint',
158
+ validate: '/custom/validate/endpoint'
159
+ }
160
+ });
161
+ ```
162
+
163
+ ### Environment Variables
164
+
165
+ The SDK also supports configuration through environment variables (fallback):
166
+
99
167
  ```bash
100
168
  # For Node.js applications
101
169
  SESSIONLENS_API_BASE_URL=https://api.sessionlens.com/v1
@@ -108,6 +176,11 @@ SESSIONLENS_API_BASE_URL=https://staging-api.sessionlens.com/v1
108
176
  REACT_APP_SESSIONLENS_API_BASE_URL=https://staging-api.sessionlens.com/v1
109
177
  ```
110
178
 
179
+ **Configuration Priority:**
180
+ 1. Runtime config (`api_base_url` in `sessionLensInit`)
181
+ 2. Environment variables (`SESSIONLENS_API_BASE_URL` or `REACT_APP_SESSIONLENS_API_BASE_URL`)
182
+ 3. Default (`https://api.sessionlens.com/v1`)
183
+
111
184
  **Default:** `https://api.sessionlens.com/v1`
112
185
 
113
186
  ### Environment Setup Examples
@@ -4,6 +4,13 @@ export interface SessionLensConfig {
4
4
  org_id: string;
5
5
  project_id?: string;
6
6
  debug?: boolean;
7
+ api_base_url?: string;
8
+ endpoints?: {
9
+ events?: string;
10
+ identify?: string;
11
+ reset?: string;
12
+ validate?: string;
13
+ };
7
14
  }
8
15
  interface SessionInfo {
9
16
  session_id: string;
package/dist/index.esm.js CHANGED
@@ -81,15 +81,26 @@ const updateSessionActivity = () => {
81
81
  currentSession.last_activity = Date.now();
82
82
  }
83
83
  };
84
- // Get API base URL from environment variable or use default
85
- const getApiBaseUrl = () => {
86
- // Check for environment variable (works in Node.js and bundlers like Webpack/Vite)
84
+ // Get API base URL with priority: config > env vars > default
85
+ const getApiBaseUrl = (config) => {
86
+ // Priority 1: Runtime config (highest priority)
87
+ if (config === null || config === void 0 ? void 0 : config.api_base_url) {
88
+ return config.api_base_url;
89
+ }
90
+ // Priority 2: Environment variables (fallback)
87
91
  if (typeof process !== 'undefined' && process.env) {
88
- return process.env.SESSIONLENS_API_BASE_URL || process.env.REACT_APP_SESSIONLENS_API_BASE_URL || 'https://api.sessionlens.com/v1';
92
+ return process.env.SESSIONLENS_API_BASE_URL ||
93
+ process.env.REACT_APP_SESSIONLENS_API_BASE_URL ||
94
+ 'https://api.sessionlens.com/v1';
89
95
  }
90
- // Fallback for browser environments without build-time env vars
96
+ // Priority 3: Default (lowest priority)
91
97
  return 'https://api.sessionlens.com/v1';
92
98
  };
99
+ // Get endpoint with fallback to default
100
+ const getEndpoint = (config, endpointType, defaultEndpoint) => {
101
+ var _a;
102
+ return ((_a = config.endpoints) === null || _a === void 0 ? void 0 : _a[endpointType]) || defaultEndpoint;
103
+ };
93
104
  // `sessionLensInit()` sets the config and validates with backend
94
105
  async function sessionLensInit(config) {
95
106
  // Validate required fields
@@ -107,10 +118,11 @@ async function sessionLensInit(config) {
107
118
  // Start new session with scalable ID generation
108
119
  startNewSession(config);
109
120
  // Validate configuration with backend using GET (more RESTful)
110
- const apiBaseUrl = getApiBaseUrl();
121
+ const apiBaseUrl = getApiBaseUrl(config);
122
+ const validateEndpoint = getEndpoint(config, 'validate', '/org/validate');
111
123
  try {
112
124
  // Use GET with query parameters for org_id and user_id validation
113
- const validationUrl = new URL(`${apiBaseUrl}/org/validate`);
125
+ const validationUrl = new URL(`${apiBaseUrl}${validateEndpoint}`);
114
126
  validationUrl.searchParams.set('org_id', config.org_id);
115
127
  validationUrl.searchParams.set('user_id', config.user_id);
116
128
  const response = await fetch(validationUrl.toString(), {
@@ -177,7 +189,7 @@ function getSessionInfo() {
177
189
  }
178
190
  // Export function to get API base URL for use in other modules
179
191
  function getSessionLensApiBaseUrl() {
180
- return getApiBaseUrl();
192
+ return getApiBaseUrl(currentConfig || undefined);
181
193
  }
182
194
 
183
195
  function sessionLensTrack(event) {
@@ -229,9 +241,11 @@ function sessionLensReset() {
229
241
  }
230
242
  // Helper functions for backend communication with session context
231
243
  async function sendEventToBackend(event, config, sessionInfo) {
244
+ var _a;
232
245
  const apiBaseUrl = getSessionLensApiBaseUrl();
246
+ const eventsEndpoint = ((_a = config.endpoints) === null || _a === void 0 ? void 0 : _a.events) || '/events/ingest';
233
247
  try {
234
- const response = await fetch(`${apiBaseUrl}/events/ingest`, {
248
+ const response = await fetch(`${apiBaseUrl}${eventsEndpoint}`, {
235
249
  method: 'POST',
236
250
  headers: {
237
251
  'Content-Type': 'application/json',
@@ -261,9 +275,11 @@ async function sendEventToBackend(event, config, sessionInfo) {
261
275
  }
262
276
  }
263
277
  async function sendIdentifyToBackend(user, config, sessionInfo) {
278
+ var _a;
264
279
  const apiBaseUrl = getSessionLensApiBaseUrl();
280
+ const identifyEndpoint = ((_a = config.endpoints) === null || _a === void 0 ? void 0 : _a.identify) || '/identify';
265
281
  try {
266
- const response = await fetch(`${apiBaseUrl}/identify`, {
282
+ const response = await fetch(`${apiBaseUrl}${identifyEndpoint}`, {
267
283
  method: 'POST',
268
284
  headers: {
269
285
  'Content-Type': 'application/json',
@@ -293,9 +309,11 @@ async function sendIdentifyToBackend(user, config, sessionInfo) {
293
309
  }
294
310
  }
295
311
  async function sendResetToBackend(config, sessionInfo) {
312
+ var _a;
296
313
  const apiBaseUrl = getSessionLensApiBaseUrl();
314
+ const resetEndpoint = ((_a = config.endpoints) === null || _a === void 0 ? void 0 : _a.reset) || '/reset';
297
315
  try {
298
- const response = await fetch(`${apiBaseUrl}/reset`, {
316
+ const response = await fetch(`${apiBaseUrl}${resetEndpoint}`, {
299
317
  method: 'POST',
300
318
  headers: {
301
319
  'Content-Type': 'application/json',
@@ -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}\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 from environment variable or use default\nconst getApiBaseUrl = (): string => {\n // Check for environment variable (works in Node.js and bundlers like Webpack/Vite)\n if (typeof process !== 'undefined' && process.env) {\n return process.env.SESSIONLENS_API_BASE_URL || process.env.REACT_APP_SESSIONLENS_API_BASE_URL || 'https://api.sessionlens.com/v1';\n }\n \n // Fallback for browser environments without build-time env vars\n return 'https://api.sessionlens.com/v1';\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();\n \n try {\n // Use GET with query parameters for org_id and user_id validation\n const validationUrl = new URL(`${apiBaseUrl}/org/validate`);\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();\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 \n try {\n const response = await fetch(`${apiBaseUrl}/events/ingest`, {\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 \n try {\n const response = await fetch(`${apiBaseUrl}/identify`, {\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 \n try {\n const response = await fetch(`${apiBaseUrl}/reset`, {\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/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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"}
package/dist/index.js CHANGED
@@ -85,15 +85,26 @@ const updateSessionActivity = () => {
85
85
  currentSession.last_activity = Date.now();
86
86
  }
87
87
  };
88
- // Get API base URL from environment variable or use default
89
- const getApiBaseUrl = () => {
90
- // Check for environment variable (works in Node.js and bundlers like Webpack/Vite)
88
+ // Get API base URL with priority: config > env vars > default
89
+ const getApiBaseUrl = (config) => {
90
+ // Priority 1: Runtime config (highest priority)
91
+ if (config === null || config === void 0 ? void 0 : config.api_base_url) {
92
+ return config.api_base_url;
93
+ }
94
+ // Priority 2: Environment variables (fallback)
91
95
  if (typeof process !== 'undefined' && process.env) {
92
- return process.env.SESSIONLENS_API_BASE_URL || process.env.REACT_APP_SESSIONLENS_API_BASE_URL || 'https://api.sessionlens.com/v1';
96
+ return process.env.SESSIONLENS_API_BASE_URL ||
97
+ process.env.REACT_APP_SESSIONLENS_API_BASE_URL ||
98
+ 'https://api.sessionlens.com/v1';
93
99
  }
94
- // Fallback for browser environments without build-time env vars
100
+ // Priority 3: Default (lowest priority)
95
101
  return 'https://api.sessionlens.com/v1';
96
102
  };
103
+ // Get endpoint with fallback to default
104
+ const getEndpoint = (config, endpointType, defaultEndpoint) => {
105
+ var _a;
106
+ return ((_a = config.endpoints) === null || _a === void 0 ? void 0 : _a[endpointType]) || defaultEndpoint;
107
+ };
97
108
  // `sessionLensInit()` sets the config and validates with backend
98
109
  async function sessionLensInit(config) {
99
110
  // Validate required fields
@@ -111,10 +122,11 @@ async function sessionLensInit(config) {
111
122
  // Start new session with scalable ID generation
112
123
  startNewSession(config);
113
124
  // Validate configuration with backend using GET (more RESTful)
114
- const apiBaseUrl = getApiBaseUrl();
125
+ const apiBaseUrl = getApiBaseUrl(config);
126
+ const validateEndpoint = getEndpoint(config, 'validate', '/org/validate');
115
127
  try {
116
128
  // Use GET with query parameters for org_id and user_id validation
117
- const validationUrl = new URL(`${apiBaseUrl}/org/validate`);
129
+ const validationUrl = new URL(`${apiBaseUrl}${validateEndpoint}`);
118
130
  validationUrl.searchParams.set('org_id', config.org_id);
119
131
  validationUrl.searchParams.set('user_id', config.user_id);
120
132
  const response = await fetch(validationUrl.toString(), {
@@ -181,7 +193,7 @@ function getSessionInfo() {
181
193
  }
182
194
  // Export function to get API base URL for use in other modules
183
195
  function getSessionLensApiBaseUrl() {
184
- return getApiBaseUrl();
196
+ return getApiBaseUrl(currentConfig || undefined);
185
197
  }
186
198
 
187
199
  function sessionLensTrack(event) {
@@ -233,9 +245,11 @@ function sessionLensReset() {
233
245
  }
234
246
  // Helper functions for backend communication with session context
235
247
  async function sendEventToBackend(event, config, sessionInfo) {
248
+ var _a;
236
249
  const apiBaseUrl = getSessionLensApiBaseUrl();
250
+ const eventsEndpoint = ((_a = config.endpoints) === null || _a === void 0 ? void 0 : _a.events) || '/events/ingest';
237
251
  try {
238
- const response = await fetch(`${apiBaseUrl}/events/ingest`, {
252
+ const response = await fetch(`${apiBaseUrl}${eventsEndpoint}`, {
239
253
  method: 'POST',
240
254
  headers: {
241
255
  'Content-Type': 'application/json',
@@ -265,9 +279,11 @@ async function sendEventToBackend(event, config, sessionInfo) {
265
279
  }
266
280
  }
267
281
  async function sendIdentifyToBackend(user, config, sessionInfo) {
282
+ var _a;
268
283
  const apiBaseUrl = getSessionLensApiBaseUrl();
284
+ const identifyEndpoint = ((_a = config.endpoints) === null || _a === void 0 ? void 0 : _a.identify) || '/identify';
269
285
  try {
270
- const response = await fetch(`${apiBaseUrl}/identify`, {
286
+ const response = await fetch(`${apiBaseUrl}${identifyEndpoint}`, {
271
287
  method: 'POST',
272
288
  headers: {
273
289
  'Content-Type': 'application/json',
@@ -297,9 +313,11 @@ async function sendIdentifyToBackend(user, config, sessionInfo) {
297
313
  }
298
314
  }
299
315
  async function sendResetToBackend(config, sessionInfo) {
316
+ var _a;
300
317
  const apiBaseUrl = getSessionLensApiBaseUrl();
318
+ const resetEndpoint = ((_a = config.endpoints) === null || _a === void 0 ? void 0 : _a.reset) || '/reset';
301
319
  try {
302
- const response = await fetch(`${apiBaseUrl}/reset`, {
320
+ const response = await fetch(`${apiBaseUrl}${resetEndpoint}`, {
303
321
  method: 'POST',
304
322
  headers: {
305
323
  'Content-Type': 'application/json',
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.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}\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 from environment variable or use default\nconst getApiBaseUrl = (): string => {\n // Check for environment variable (works in Node.js and bundlers like Webpack/Vite)\n if (typeof process !== 'undefined' && process.env) {\n return process.env.SESSIONLENS_API_BASE_URL || process.env.REACT_APP_SESSIONLENS_API_BASE_URL || 'https://api.sessionlens.com/v1';\n }\n \n // Fallback for browser environments without build-time env vars\n return 'https://api.sessionlens.com/v1';\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();\n \n try {\n // Use GET with query parameters for org_id and user_id validation\n const validationUrl = new URL(`${apiBaseUrl}/org/validate`);\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();\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 \n try {\n const response = await fetch(`${apiBaseUrl}/events/ingest`, {\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 \n try {\n const response = await fetch(`${apiBaseUrl}/identify`, {\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 \n try {\n const response = await fetch(`${apiBaseUrl}/reset`, {\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":["useEffect"],"mappings":"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"}
1
+ {"version":3,"file":"index.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":["useEffect"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sessionlens/sdk",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "SessionLens SDK for analytics and event tracking",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.esm.js",