UNPKG

@adopture/next

Version:

Next.js SDK for Adopture feature adoption tracking with SSR support

1 lines 30.8 kB
{"version":3,"sources":["../src/server/ServerTracker.ts","../src/server/actions.ts"],"names":["NextServerTracker","generateSessionId","manualConfig","loadServerConfig","validation","validateConfig","environment","extractEnvironmentFromApiKey","error","featureId","userId","metadata","featureValidation","validateFeatureId","userValidation","validateUserId","event","now","sanitizeMetadata","generateEventId","data","exposureChannel","exposureEvent","properties","userProperties","type","timeout","retryWithBackoff","tRPCPayload","response","errorBody","createServerTracker","config","tracker","globalServerTracker","getServerTracker","initServerTracker","trackFeature","finalUserId","extractUserIdFromRequest","trackAdoption","exposeFeature","identifyUser","initializeTracker","getTrackerStatus","headersList","headers","cookieStore","cookies","cookiesObj","cookie","extractUserId","withTracking","action","options","args","startTime","success","result","e","trackError","track","target","propertyName","descriptor","originalMethod"],"mappings":"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","file":"server.mjs","sourcesContent":["import {\n validateFeatureId,\n validateUserId,\n sanitizeMetadata,\n generateEventId,\n generateSessionId,\n generateAnonymousId,\n type AdoptionEventData,\n type ExposureEventData,\n type UserProperties,\n} from '@adopture/sdk-core';\n\nimport type { ServerAdoptureConfig, ServerAdoptureTracker, BootstrapData } from '../types';\nimport { loadServerConfig, validateConfig, extractProjectIdFromApiKey, extractEnvironmentFromApiKey } from '../shared/config';\nimport { retryWithBackoff, timeout, sanitizeMetadata as sanitizeServerMetadata, now } from '../shared/utils';\n\n/**\n * Server-side Adopture tracker for Next.js applications\n * Designed for server components, API routes, and middleware\n */\nexport class NextServerTracker implements ServerAdoptureTracker {\n private config: ServerAdoptureConfig | null = null;\n private isInitialized = false;\n private events: any[] = [];\n private sessionId: string;\n\n constructor() {\n this.sessionId = generateSessionId();\n }\n\n /**\n * Initialize the server tracker\n */\n async init(manualConfig: Partial<ServerAdoptureConfig> = {}): Promise<void> {\n if (this.isInitialized) {\n return;\n }\n\n try {\n this.config = loadServerConfig(manualConfig);\n \n // Validate configuration\n const validation = validateConfig(this.config);\n if (!validation.isValid) {\n throw new Error(`Invalid configuration: ${validation.errors.join(', ')}`);\n }\n\n // Auto-extract project ID and environment from API key if not provided\n if (this.config.apiKey && !this.config.projectId) {\n // Use real project UUID for the SDK demo\n this.config.projectId = '35207190-2644-4230-b088-9ada94638e5d';\n }\n \n if (this.config.apiKey && !this.config.environment) {\n const environment = extractEnvironmentFromApiKey(this.config.apiKey);\n this.config.environment = environment || undefined;\n }\n\n this.isInitialized = true;\n\n if (this.config.debug) {\n console.log('[ADOPTURE-SERVER] Server tracker initialized');\n }\n } catch (error) {\n console.error('[ADOPTURE-SERVER] Failed to initialize:', error);\n throw error;\n }\n }\n\n /**\n * Track feature usage\n */\n async track(featureId: string, userId: string, metadata?: Record<string, unknown>): Promise<void> {\n if (!this.isInitialized) {\n throw new Error('Server tracker not initialized');\n }\n\n // Validate inputs\n const featureValidation = validateFeatureId(featureId);\n if (!featureValidation.isValid) {\n throw new Error(`Invalid feature ID: ${featureValidation.error}`);\n }\n\n const userValidation = validateUserId(userId);\n if (!userValidation.isValid) {\n throw new Error(`Invalid user ID: ${userValidation.error}`);\n }\n\n const event = {\n featureId,\n userId,\n timestamp: now(),\n metadata: metadata ? sanitizeServerMetadata(metadata) : {},\n sessionId: this.sessionId,\n eventId: generateEventId(),\n };\n\n await this.sendEvent('track', event);\n\n if (this.config?.debug) {\n console.log('[ADOPTURE-SERVER] Track event sent:', event);\n }\n }\n\n /**\n * Track feature adoption\n */\n async trackAdoption(data: AdoptionEventData): Promise<void> {\n if (!this.isInitialized) {\n throw new Error('Server tracker not initialized');\n }\n\n // Validate inputs\n const featureValidation = validateFeatureId(data.featureId);\n if (!featureValidation.isValid) {\n throw new Error(`Invalid feature ID: ${featureValidation.error}`);\n }\n\n const userValidation = validateUserId(data.userId);\n if (!userValidation.isValid) {\n throw new Error(`Invalid user ID: ${userValidation.error}`);\n }\n\n const event = {\n ...data,\n timestamp: data.timestamp || now(),\n metadata: data.metadata ? sanitizeServerMetadata(data.metadata) : {},\n sessionId: data.sessionId || this.sessionId,\n eventId: data.eventId || generateEventId(),\n };\n\n await this.sendEvent('adoption', event);\n\n if (this.config?.debug) {\n console.log('[ADOPTURE-SERVER] Adoption event sent:', event);\n }\n }\n\n /**\n * Track feature exposure\n */\n async expose(\n featureId: string,\n userId: string,\n exposureChannel: string = 'server',\n metadata?: Record<string, unknown>\n ): Promise<void> {\n if (!this.isInitialized) {\n throw new Error('Server tracker not initialized');\n }\n\n // Validate inputs\n const featureValidation = validateFeatureId(featureId);\n if (!featureValidation.isValid) {\n throw new Error(`Invalid feature ID: ${featureValidation.error}`);\n }\n\n const userValidation = validateUserId(userId);\n if (!userValidation.isValid) {\n throw new Error(`Invalid user ID: ${userValidation.error}`);\n }\n\n const exposureEvent: ExposureEventData = {\n featureId,\n userId,\n exposureChannel,\n exposedAt: now(),\n metadata: metadata ? sanitizeServerMetadata(metadata) : {},\n eventId: generateEventId(),\n };\n\n await this.sendEvent('exposure', exposureEvent);\n\n if (this.config?.debug) {\n console.log('[ADOPTURE-SERVER] Exposure event sent:', exposureEvent);\n }\n }\n\n /**\n * Identify user with properties\n */\n async identify(userId: string, properties?: UserProperties): Promise<void> {\n if (!this.isInitialized) {\n throw new Error('Server tracker not initialized');\n }\n\n const userValidation = validateUserId(userId);\n if (!userValidation.isValid) {\n throw new Error(`Invalid user ID: ${userValidation.error}`);\n }\n\n const event = {\n userId,\n properties: properties ? sanitizeServerMetadata(properties) : {},\n timestamp: now(),\n sessionId: this.sessionId,\n eventId: generateEventId(),\n };\n\n await this.sendEvent('identify', event);\n\n if (this.config?.debug) {\n console.log('[ADOPTURE-SERVER] Identify event sent:', event);\n }\n }\n\n /**\n * Flush all queued events (not applicable for server-side, events are sent immediately)\n */\n async flush(): Promise<void> {\n // Server-side events are sent immediately, so flush is a no-op\n if (this.config?.debug) {\n console.log('[ADOPTURE-SERVER] Flush called (no-op for server tracker)');\n }\n }\n\n /**\n * Check if tracker is ready\n */\n isReady(): boolean {\n return this.isInitialized;\n }\n\n /**\n * Get current configuration\n */\n getConfig(): ServerAdoptureConfig | null {\n return this.config;\n }\n\n /**\n * Generate bootstrap data for client-side hydration\n */\n generateBootstrapData(userId?: string, userProperties?: UserProperties): BootstrapData | null {\n if (!this.config) {\n return null;\n }\n\n // Convert server config to client config format\n const clientConfig = {\n apiUrl: this.config.apiUrl,\n // For demo purposes, pass API key to client (in production, use client-side keys)\n apiKey: this.config.apiKey,\n projectId: this.config.projectId,\n environment: this.config.environment,\n debug: this.config.debug,\n batchSize: this.config.batchSize,\n flushInterval: this.config.flushInterval,\n retryAttempts: this.config.retryAttempts,\n retryDelay: this.config.retryDelay,\n sessionTimeout: this.config.sessionTimeout,\n persistUser: this.config.persistUser,\n autoTrackSessions: this.config.autoTrackSessions,\n autoTrackLifecycle: this.config.autoTrackLifecycle,\n lifecycleDeduplication: this.config.lifecycleDeduplication,\n };\n\n return {\n config: clientConfig,\n initialUserId: userId,\n initialUserProperties: userProperties,\n sessionId: this.sessionId,\n timestamp: now(),\n };\n }\n\n /**\n * Send event to API\n */\n private async sendEvent(type: string, event: any): Promise<void> {\n if (!this.config) {\n throw new Error('Configuration not loaded');\n }\n\n const payload = {\n type,\n event,\n projectId: this.config.projectId,\n environment: this.config.environment,\n timestamp: now(),\n };\n\n try {\n const sendRequest = async () => {\n // Convert to tRPC format - the payload IS the input, no 'json' wrapper\n const tRPCPayload = {\n projectId: this.config!.projectId || '35207190-2644-4230-b088-9ada94638e5d',\n featureId: event.featureId,\n userId: event.userId,\n eventType: 'feature_exposed',\n sessionId: event.sessionId,\n metadata: event.metadata || {}\n };\n \n const response = await fetch(`${this.config!.apiUrl}/trpc/featureAdoption.trackEvent`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${this.config!.apiKey}`,\n 'User-Agent': 'adopture-next-server/0.1.0',\n },\n body: JSON.stringify(tRPCPayload),\n });\n\n if (!response.ok) {\n const errorBody = await response.text();\n throw new Error(`HTTP ${response.status}: ${errorBody}`);\n }\n\n return response.json();\n };\n\n // Apply timeout and retry logic\n await timeout(\n retryWithBackoff(sendRequest, this.config.retryAttempts, this.config.retryDelay),\n this.config.requestTimeout || 5000\n );\n\n } catch (error) {\n if (this.config.debug) {\n console.error('[ADOPTURE-SERVER] Failed to send event:', error);\n }\n throw error;\n }\n }\n}\n\n/**\n * Create a new server tracker instance\n */\nexport function createServerTracker(config?: Partial<ServerAdoptureConfig>): NextServerTracker {\n const tracker = new NextServerTracker();\n if (config) {\n // Initialize asynchronously in the background\n tracker.init(config).catch(error => {\n console.error('[ADOPTURE-SERVER] Failed to initialize tracker:', error);\n });\n }\n return tracker;\n}\n\n/**\n * Singleton instance for convenience\n */\nlet globalServerTracker: NextServerTracker | null = null;\n\n/**\n * Get or create global server tracker instance\n */\nexport function getServerTracker(config?: Partial<ServerAdoptureConfig>): NextServerTracker {\n if (!globalServerTracker) {\n globalServerTracker = createServerTracker(config);\n }\n return globalServerTracker;\n}\n\n/**\n * Initialize global server tracker\n */\nexport async function initServerTracker(config?: Partial<ServerAdoptureConfig>): Promise<NextServerTracker> {\n const tracker = getServerTracker(config);\n await tracker.init(config);\n return tracker;\n}","/**\n * Next.js Server Actions integration for Adopture\n * Provides server actions that can be called from client components\n */\n\nimport { cookies, headers } from 'next/headers';\nimport type { AdoptionEventData, ExposureEventData, UserProperties } from '@adopture/sdk-core';\nimport type { ServerAdoptureConfig } from '../types';\nimport { getServerTracker } from './ServerTracker';\nimport { extractUserId } from '../shared/utils';\n\n/**\n * Server action to track feature usage\n */\nexport async function trackFeature(\n featureId: string, \n userId?: string, \n metadata?: Record<string, unknown>\n): Promise<{ success: boolean; error?: string }> {\n 'use server';\n \n try {\n const tracker = getServerTracker();\n \n if (!tracker.isReady()) {\n throw new Error('Server tracker not initialized');\n }\n\n // Extract user ID from request if not provided\n const finalUserId = userId || await extractUserIdFromRequest();\n \n if (!finalUserId) {\n throw new Error('User ID is required for server-side tracking');\n }\n\n await tracker.track(featureId, finalUserId, metadata);\n \n return { success: true };\n } catch (error) {\n console.error('[ADOPTURE-SERVER-ACTION] Track failed:', error);\n return { \n success: false, \n error: error instanceof Error ? error.message : 'Unknown error' \n };\n }\n}\n\n/**\n * Server action to track feature adoption\n */\nexport async function trackAdoption(\n data: Omit<AdoptionEventData, 'userId'> & { userId?: string }\n): Promise<{ success: boolean; error?: string }> {\n 'use server';\n \n try {\n const tracker = getServerTracker();\n \n if (!tracker.isReady()) {\n throw new Error('Server tracker not initialized');\n }\n\n // Extract user ID from request if not provided\n const finalUserId = data.userId || await extractUserIdFromRequest();\n \n if (!finalUserId) {\n throw new Error('User ID is required for server-side tracking');\n }\n\n await tracker.trackAdoption({\n ...data,\n userId: finalUserId,\n });\n \n return { success: true };\n } catch (error) {\n console.error('[ADOPTURE-SERVER-ACTION] Track adoption failed:', error);\n return { \n success: false, \n error: error instanceof Error ? error.message : 'Unknown error' \n };\n }\n}\n\n/**\n * Server action to track feature exposure\n */\nexport async function exposeFeature(\n featureId: string,\n exposureChannel: string = 'server-action',\n userId?: string,\n metadata?: Record<string, unknown>\n): Promise<{ success: boolean; error?: string }> {\n 'use server';\n \n try {\n const tracker = getServerTracker();\n \n if (!tracker.isReady()) {\n throw new Error('Server tracker not initialized');\n }\n\n // Extract user ID from request if not provided\n const finalUserId = userId || await extractUserIdFromRequest();\n \n if (!finalUserId) {\n throw new Error('User ID is required for server-side tracking');\n }\n\n await tracker.expose(featureId, finalUserId, exposureChannel, metadata);\n \n return { success: true };\n } catch (error) {\n console.error('[ADOPTURE-SERVER-ACTION] Expose failed:', error);\n return { \n success: false, \n error: error instanceof Error ? error.message : 'Unknown error' \n };\n }\n}\n\n/**\n * Server action to identify user\n */\nexport async function identifyUser(\n userId: string,\n properties?: UserProperties\n): Promise<{ success: boolean; error?: string }> {\n 'use server';\n \n try {\n const tracker = getServerTracker();\n \n if (!tracker.isReady()) {\n throw new Error('Server tracker not initialized');\n }\n\n await tracker.identify(userId, properties);\n \n return { success: true };\n } catch (error) {\n console.error('[ADOPTURE-SERVER-ACTION] Identify failed:', error);\n return { \n success: false, \n error: error instanceof Error ? error.message : 'Unknown error' \n };\n }\n}\n\n/**\n * Server action to initialize tracker (should be called from layout or page)\n */\nexport async function initializeTracker(\n config?: Partial<ServerAdoptureConfig>\n): Promise<{ success: boolean; error?: string; bootstrapData?: any }> {\n 'use server';\n \n try {\n const tracker = getServerTracker();\n await tracker.init(config);\n \n // Generate bootstrap data for client\n const userId = await extractUserIdFromRequest();\n const bootstrapData = tracker.generateBootstrapData(userId || undefined);\n \n return { \n success: true,\n bootstrapData \n };\n } catch (error) {\n console.error('[ADOPTURE-SERVER-ACTION] Initialize failed:', error);\n return { \n success: false, \n error: error instanceof Error ? error.message : 'Unknown error' \n };\n }\n}\n\n/**\n * Server action to get current tracker status\n */\nexport async function getTrackerStatus(): Promise<{\n isReady: boolean;\n config?: ServerAdoptureConfig | null;\n error?: string;\n}> {\n 'use server';\n \n try {\n const tracker = getServerTracker();\n \n return {\n isReady: tracker.isReady(),\n config: tracker.getConfig(),\n };\n } catch (error) {\n console.error('[ADOPTURE-SERVER-ACTION] Get status failed:', error);\n return {\n isReady: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n}\n\n/**\n * Extract user ID from Next.js request context\n */\nasync function extractUserIdFromRequest(): Promise<string | null> {\n try {\n const headersList = await headers();\n const cookieStore = await cookies();\n \n // Convert cookies to object\n const cookiesObj: { [key: string]: string } = {};\n cookieStore.getAll().forEach((cookie: any) => {\n cookiesObj[cookie.name] = cookie.value;\n });\n \n return extractUserId(headersList as any, cookiesObj) || null;\n } catch (error) {\n // If headers/cookies are not available (e.g., during build time), return null\n return null;\n }\n}\n\n/**\n * Higher-order function to wrap server actions with automatic tracking\n */\nexport function withTracking<T extends any[], R>(\n action: (...args: T) => Promise<R>,\n options: {\n featureId: string;\n extractUserId?: (...args: T) => string | undefined;\n extractMetadata?: (...args: T) => Record<string, unknown>;\n trackOnSuccess?: boolean;\n trackOnError?: boolean;\n }\n) {\n return async (...args: T): Promise<R> => {\n 'use server';\n \n const startTime = Date.now();\n let success = false;\n let error: Error | null = null;\n \n try {\n const result = await action(...args);\n success = true;\n return result;\n } catch (e) {\n error = e as Error;\n success = false;\n throw e;\n } finally {\n // Track the action execution\n if ((success && options.trackOnSuccess !== false) || \n (!success && options.trackOnError === true)) {\n \n try {\n const userId = options.extractUserId?.(...args) || await extractUserIdFromRequest();\n if (userId) {\n const metadata = {\n ...(options.extractMetadata?.(...args) || {}),\n success,\n duration: Date.now() - startTime,\n ...(error && { error: error.message }),\n };\n \n await trackFeature(options.featureId, userId, metadata);\n }\n } catch (trackError) {\n console.error('[ADOPTURE-SERVER-ACTION] Failed to track action:', trackError);\n }\n }\n }\n };\n}\n\n/**\n * Decorator for server actions to add automatic tracking\n */\nexport function track(options: {\n featureId: string;\n extractUserId?: (...args: any[]) => string | undefined;\n extractMetadata?: (...args: any[]) => Record<string, unknown>;\n trackOnSuccess?: boolean;\n trackOnError?: boolean;\n}) {\n return function <T extends any[], R>(\n target: any,\n propertyName: string,\n descriptor: TypedPropertyDescriptor<(...args: T) => Promise<R>>\n ) {\n if (!descriptor.value) {\n return descriptor;\n }\n\n const originalMethod = descriptor.value;\n descriptor.value = withTracking(originalMethod, options);\n \n return descriptor;\n };\n}"]}