@sessionlens/sdk 0.1.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -45,6 +45,103 @@ sessionLens.sessionLensIdentify({
45
45
  sessionLens.sessionLensReset();
46
46
  ```
47
47
 
48
+ ### Advanced Usage with Custom Configuration
49
+
50
+ ```javascript
51
+ import sessionLens from '@sessionlens/sdk';
52
+
53
+ // Initialize with custom API configuration
54
+ await sessionLens.sessionLensInit({
55
+ sdk_key: 'your-sdk-key-here',
56
+ user_id: 'user123',
57
+ org_id: 'org456',
58
+ api_base_url: 'https://dev-api.sessionlens.com/v1', // Custom API base URL
59
+ endpoints: {
60
+ events: '/custom/events/ingest', // Custom events endpoint
61
+ identify: '/custom/user/identify', // Custom identify endpoint
62
+ reset: '/custom/session/reset', // Custom reset endpoint
63
+ validate: '/custom/org/validate' // Custom validation endpoint
64
+ },
65
+ debug: true
66
+ });
67
+
68
+ // Track events with rich properties
69
+ sessionLens.sessionLensTrack({
70
+ event_name: 'user_action',
71
+ properties: {
72
+ action_type: 'form_submit',
73
+ form_name: 'contact_form',
74
+ fields_completed: 5,
75
+ time_spent: 120, // seconds
76
+ user_segment: 'premium',
77
+ referrer: document.referrer,
78
+ user_agent: navigator.userAgent
79
+ },
80
+ timestamp: Date.now() // Optional: auto-generated if not provided
81
+ });
82
+
83
+ // Identify user with comprehensive properties
84
+ sessionLens.sessionLensIdentify({
85
+ user_id: 'user123',
86
+ properties: {
87
+ email: 'user@example.com',
88
+ name: 'John Doe',
89
+ plan: 'premium',
90
+ company: 'Acme Corp',
91
+ signup_date: '2024-01-15',
92
+ last_login: new Date().toISOString(),
93
+ preferences: {
94
+ theme: 'dark',
95
+ language: 'en',
96
+ notifications: true
97
+ }
98
+ }
99
+ });
100
+ ```
101
+
102
+ ### Environment-Specific Configuration
103
+
104
+ ```javascript
105
+ import sessionLens from '@sessionlens/sdk';
106
+
107
+ // Determine environment
108
+ const environment = process.env.NODE_ENV || 'development';
109
+
110
+ // Environment-specific configuration
111
+ const configs = {
112
+ development: {
113
+ api_base_url: 'https://dev-api.sessionlens.com/v1',
114
+ debug: true
115
+ },
116
+ staging: {
117
+ api_base_url: 'https://staging-api.sessionlens.com/v1',
118
+ debug: true
119
+ },
120
+ production: {
121
+ api_base_url: 'https://api.sessionlens.com/v1',
122
+ debug: false
123
+ }
124
+ };
125
+
126
+ // Initialize with environment-specific config
127
+ await sessionLens.sessionLensInit({
128
+ sdk_key: 'your-sdk-key-here',
129
+ user_id: 'user123',
130
+ org_id: 'org456',
131
+ ...configs[environment]
132
+ });
133
+
134
+ // Track environment info
135
+ sessionLens.sessionLensTrack({
136
+ event_name: 'app_initialized',
137
+ properties: {
138
+ environment: environment,
139
+ version: '1.0.0',
140
+ timestamp: Date.now()
141
+ }
142
+ });
143
+ ```
144
+
48
145
  ### React Integration
49
146
 
50
147
  ```jsx
@@ -86,16 +183,181 @@ function App() {
86
183
  }
87
184
  ```
88
185
 
186
+ ### React Integration with Custom Configuration
187
+
188
+ ```jsx
189
+ import React from 'react';
190
+ import { useSessionLens, useSessionLensTrack, useSessionLensIdentify } from '@sessionlens/sdk';
191
+
192
+ function App() {
193
+ // Environment-specific configuration
194
+ const environment = process.env.NODE_ENV || 'development';
195
+
196
+ const configs = {
197
+ development: {
198
+ api_base_url: 'https://dev-api.sessionlens.com/v1',
199
+ debug: true
200
+ },
201
+ staging: {
202
+ api_base_url: 'https://staging-api.sessionlens.com/v1',
203
+ debug: true
204
+ },
205
+ production: {
206
+ api_base_url: 'https://api.sessionlens.com/v1',
207
+ debug: false
208
+ }
209
+ };
210
+
211
+ // Initialize SDK with environment-specific config
212
+ useSessionLens({
213
+ sdk_key: 'your-sdk-key-here',
214
+ user_id: 'user123',
215
+ org_id: 'org456',
216
+ ...configs[environment]
217
+ });
218
+
219
+ const track = useSessionLensTrack();
220
+ const identify = useSessionLensIdentify();
221
+
222
+ const handlePageView = () => {
223
+ track({
224
+ event_name: 'page_view',
225
+ properties: {
226
+ page: window.location.pathname,
227
+ referrer: document.referrer,
228
+ environment: environment,
229
+ timestamp: Date.now()
230
+ }
231
+ });
232
+ };
233
+
234
+ const handleUserAction = (action, details) => {
235
+ track({
236
+ event_name: 'user_action',
237
+ properties: {
238
+ action_type: action,
239
+ ...details,
240
+ user_agent: navigator.userAgent,
241
+ screen_resolution: `${screen.width}x${screen.height}`
242
+ }
243
+ });
244
+ };
245
+
246
+ const handleUserLogin = (userData) => {
247
+ identify({
248
+ user_id: userData.id,
249
+ properties: {
250
+ email: userData.email,
251
+ name: userData.name,
252
+ login_method: userData.loginMethod,
253
+ last_login: new Date().toISOString(),
254
+ preferences: userData.preferences
255
+ }
256
+ });
257
+ };
258
+
259
+ // Track page view on component mount
260
+ React.useEffect(() => {
261
+ handlePageView();
262
+ }, []);
263
+
264
+ return (
265
+ <div>
266
+ <button onClick={() => handleUserAction('button_click', { button: 'header_cta' })}>
267
+ Track Event
268
+ </button>
269
+ <button onClick={() => handleUserLogin({
270
+ id: 'user123',
271
+ email: 'user@example.com',
272
+ name: 'John Doe',
273
+ loginMethod: 'email',
274
+ preferences: { theme: 'dark' }
275
+ })}>
276
+ Identify User
277
+ </button>
278
+ </div>
279
+ );
280
+ }
281
+ ```
282
+
89
283
  ## Configuration
90
284
 
91
- ### Environment Variables
285
+ ### Runtime Configuration
92
286
 
93
- The SDK supports configuration through environment variables:
287
+ The SDK supports flexible runtime configuration through the `SessionLensConfig` interface:
94
288
 
95
- #### API Base URL
289
+ ```typescript
290
+ interface SessionLensConfig {
291
+ sdk_key: string; // Your SessionLens SDK key
292
+ user_id: string; // Unique identifier for the user
293
+ org_id: string; // Your organization ID
294
+ project_id?: string; // Optional: extracted from SDK key if not provided
295
+ debug?: boolean; // Optional: enable debug logging
296
+ // API configuration options
297
+ api_base_url?: string; // Optional: override API base URL
298
+ endpoints?: {
299
+ events?: string; // Optional: override events endpoint (default: /events/ingest)
300
+ identify?: string; // Optional: override identify endpoint (default: /identify)
301
+ reset?: string; // Optional: override reset endpoint (default: /reset)
302
+ validate?: string; // Optional: override validation endpoint (default: /org/validate)
303
+ };
304
+ }
305
+ ```
306
+
307
+ #### API Base URL Configuration
96
308
 
97
309
  Configure the API base URL for different environments:
98
310
 
311
+ ```javascript
312
+ // Development
313
+ await sessionLens.sessionLensInit({
314
+ sdk_key: 'your-sdk-key',
315
+ user_id: 'user123',
316
+ org_id: 'org456',
317
+ api_base_url: 'https://dev-api.sessionlens.com/v1',
318
+ debug: true
319
+ });
320
+
321
+ // Staging
322
+ await sessionLens.sessionLensInit({
323
+ sdk_key: 'your-sdk-key',
324
+ user_id: 'user123',
325
+ org_id: 'org456',
326
+ api_base_url: 'https://staging-api.sessionlens.com/v1'
327
+ });
328
+
329
+ // Production
330
+ await sessionLens.sessionLensInit({
331
+ sdk_key: 'your-sdk-key',
332
+ user_id: 'user123',
333
+ org_id: 'org456',
334
+ api_base_url: 'https://api.sessionlens.com/v1'
335
+ });
336
+ ```
337
+
338
+ #### Custom Endpoints
339
+
340
+ Override specific API endpoints if needed:
341
+
342
+ ```javascript
343
+ await sessionLens.sessionLensInit({
344
+ sdk_key: 'your-sdk-key',
345
+ user_id: 'user123',
346
+ org_id: 'org456',
347
+ api_base_url: 'https://api.sessionlens.com/v1',
348
+ endpoints: {
349
+ events: '/custom/events/endpoint',
350
+ identify: '/custom/identify/endpoint',
351
+ reset: '/custom/reset/endpoint',
352
+ validate: '/custom/validate/endpoint'
353
+ }
354
+ });
355
+ ```
356
+
357
+ ### Environment Variables
358
+
359
+ The SDK also supports configuration through environment variables (fallback):
360
+
99
361
  ```bash
100
362
  # For Node.js applications
101
363
  SESSIONLENS_API_BASE_URL=https://api.sessionlens.com/v1
@@ -108,6 +370,11 @@ SESSIONLENS_API_BASE_URL=https://staging-api.sessionlens.com/v1
108
370
  REACT_APP_SESSIONLENS_API_BASE_URL=https://staging-api.sessionlens.com/v1
109
371
  ```
110
372
 
373
+ **Configuration Priority:**
374
+ 1. Runtime config (`api_base_url` in `sessionLensInit`)
375
+ 2. Environment variables (`SESSIONLENS_API_BASE_URL` or `REACT_APP_SESSIONLENS_API_BASE_URL`)
376
+ 3. Default (`https://api.sessionlens.com/v1`)
377
+
111
378
  **Default:** `https://api.sessionlens.com/v1`
112
379
 
113
380
  ### 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.1",
4
4
  "description": "SessionLens SDK for analytics and event tracking",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.esm.js",