datafast 1.0.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/core/utils.ts","../../src/core/queue.ts","../../src/core/client.ts","../../src/web/storage.ts","../../src/web/network.ts","../../src/web/device.ts","../../src/web/index.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["import type { Platform } from './types';\n\n/**\n * Generate a UUID v4 for visitor ID\n * Format: xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx (36 chars)\n */\nexport function generateVisitorId(): string {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\n/**\n * Generate a session ID\n * Format: sxxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx (37 chars, starts with 's')\n */\nexport function generateSessionId(): string {\n return 'sxxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\n/**\n * Validate visitor ID format (UUID v4)\n */\nexport function isValidVisitorId(id: string): boolean {\n if (!id || typeof id !== 'string' || id.length !== 36) return false;\n return /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(id);\n}\n\n/**\n * Validate session ID format (s + UUID v4)\n */\nexport function isValidSessionId(id: string): boolean {\n if (!id || typeof id !== 'string' || id.length !== 37) return false;\n return /^s[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(id);\n}\n\n/**\n * Build the href for a screen view\n * Format: datafast://platform/ScreenName\n */\nexport function buildScreenHref(platform: Platform, screenName: string): string {\n // Normalize screen name: remove leading slashes, trim whitespace\n const normalizedName = screenName.replace(/^\\/+/, '').trim();\n return `datafast://${platform}/${normalizedName}`;\n}\n\n/**\n * Build User-Agent header for mobile SDK\n * Format: DataFast/version (OS version; Device)\n */\nexport function buildUserAgent(\n sdkVersion: string,\n platform: Platform,\n osVersion: string,\n deviceModel: string\n): string {\n const os = platform === 'ios' ? 'iOS' : platform === 'android' ? 'Android' : 'Web';\n return `DataFast/${sdkVersion} (${os} ${osVersion}; ${deviceModel})`;\n}\n\n/**\n * Validate custom event name\n * - Lowercase alphanumeric + underscore/hyphen\n * - Max 64 characters\n */\nexport function isValidEventName(name: string): boolean {\n if (!name || typeof name !== 'string') return false;\n if (name.length === 0 || name.length > 64) return false;\n return /^[a-z0-9_-]+$/.test(name.toLowerCase());\n}\n\n/**\n * Validate and sanitize custom properties\n * - Max 10 properties\n * - Property names: lowercase alphanumeric + underscore/hyphen, max 64 chars\n * - Property values: max 255 chars\n */\nexport function sanitizeCustomProperties(\n properties: Record<string, unknown>\n): Record<string, string> | null {\n if (!properties || typeof properties !== 'object' || Array.isArray(properties)) {\n return {};\n }\n\n const sanitized: Record<string, string> = {};\n const entries = Object.entries(properties);\n\n if (entries.length > 10) {\n console.warn('[DataFast] Maximum 10 custom properties allowed');\n return null;\n }\n\n for (const [key, value] of entries) {\n // Skip eventName as it's handled separately\n if (key === 'eventName') continue;\n\n // Validate property name\n if (!key || typeof key !== 'string' || key.length > 64) {\n console.warn(`[DataFast] Invalid property name: ${key}`);\n return null;\n }\n\n if (!/^[a-z0-9_-]+$/i.test(key)) {\n console.warn(`[DataFast] Property name must be alphanumeric with _ or -: ${key}`);\n return null;\n }\n\n // Convert value to string and truncate\n let stringValue = value == null ? '' : String(value);\n if (stringValue.length > 255) {\n stringValue = stringValue.substring(0, 255);\n }\n\n // Basic XSS prevention\n stringValue = stringValue\n .replace(/[<>'\"&]/g, '')\n .replace(/javascript:/gi, '')\n .replace(/on\\w+=/gi, '')\n .trim();\n\n sanitized[key.toLowerCase()] = stringValue;\n }\n\n return sanitized;\n}\n\n/**\n * Generate a unique event ID for queue management\n */\nexport function generateEventId(): string {\n return `${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;\n}\n\n/**\n * Check if session has expired (24 hours)\n */\nexport function isSessionExpired(sessionStartTime: number): boolean {\n const SESSION_TTL_MS = 24 * 60 * 60 * 1000; // 24 hours\n return Date.now() - sessionStartTime > SESSION_TTL_MS;\n}\n\n/**\n * Simple logger that respects debug mode\n */\nexport function createLogger(debug: boolean) {\n return {\n log: (...args: unknown[]) => {\n if (debug) console.log('[DataFast]', ...args);\n },\n warn: (...args: unknown[]) => {\n if (debug) console.warn('[DataFast]', ...args);\n },\n error: (...args: unknown[]) => {\n console.error('[DataFast]', ...args);\n },\n };\n}\n","import type { BaseEventPayload, QueuedEvent, StorageAdapter, NetworkAdapter } from './types';\nimport { generateEventId } from './utils';\n\nconst QUEUE_STORAGE_KEY = 'datafast_event_queue';\nconst MAX_RETRIES = 3;\n\nexport class EventQueue {\n private queue: QueuedEvent[] = [];\n private storage: StorageAdapter;\n private network?: NetworkAdapter;\n private apiUrl: string;\n private userAgent: string;\n private flushInterval: number;\n private maxQueueSize: number;\n private flushTimer: ReturnType<typeof setInterval> | null = null;\n private isFlushing = false;\n private onFlushError?: (error: Error, event: QueuedEvent) => void;\n\n constructor(options: {\n storage: StorageAdapter;\n network?: NetworkAdapter;\n apiUrl: string;\n userAgent: string;\n flushInterval?: number;\n maxQueueSize?: number;\n onFlushError?: (error: Error, event: QueuedEvent) => void;\n }) {\n this.storage = options.storage;\n this.network = options.network;\n this.apiUrl = options.apiUrl;\n this.userAgent = options.userAgent;\n this.flushInterval = options.flushInterval ?? 30000;\n this.maxQueueSize = options.maxQueueSize ?? 20;\n this.onFlushError = options.onFlushError;\n }\n\n /**\n * Initialize the queue - load persisted events from storage\n */\n async init(): Promise<void> {\n try {\n const stored = await this.storage.getItem(QUEUE_STORAGE_KEY);\n if (stored) {\n const parsed = JSON.parse(stored);\n if (Array.isArray(parsed)) {\n this.queue = parsed;\n }\n }\n } catch {\n // Storage read failed, start with empty queue\n this.queue = [];\n }\n\n // Start flush timer\n this.startFlushTimer();\n\n // Listen for network changes if adapter supports it\n if (this.network?.onConnectionChange) {\n this.network.onConnectionChange((isConnected) => {\n if (isConnected) {\n this.flush();\n }\n });\n }\n }\n\n /**\n * Add an event to the queue\n */\n async enqueue(payload: BaseEventPayload): Promise<void> {\n const event: QueuedEvent = {\n id: generateEventId(),\n payload,\n timestamp: Date.now(),\n retries: 0,\n };\n\n this.queue.push(event);\n await this.persistQueue();\n\n // Flush immediately if queue is full\n if (this.queue.length >= this.maxQueueSize) {\n this.flush();\n }\n }\n\n /**\n * Flush all queued events to the server\n */\n async flush(): Promise<void> {\n if (this.isFlushing || this.queue.length === 0) {\n return;\n }\n\n // Check network connectivity if adapter provided\n if (this.network) {\n const isConnected = await this.network.isConnected();\n if (!isConnected) {\n return;\n }\n }\n\n this.isFlushing = true;\n\n // Process events one by one\n const eventsToProcess = [...this.queue];\n\n for (const event of eventsToProcess) {\n try {\n await this.sendEvent(event.payload);\n // Remove from queue on success\n this.queue = this.queue.filter((e) => e.id !== event.id);\n } catch (error) {\n event.retries++;\n if (event.retries >= MAX_RETRIES) {\n // Remove event after max retries\n this.queue = this.queue.filter((e) => e.id !== event.id);\n if (this.onFlushError) {\n this.onFlushError(error as Error, event);\n }\n }\n }\n }\n\n await this.persistQueue();\n this.isFlushing = false;\n }\n\n /**\n * Send a single event to the API\n */\n private async sendEvent(payload: BaseEventPayload): Promise<void> {\n const response = await fetch(this.apiUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'User-Agent': this.userAgent,\n },\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}`);\n }\n }\n\n /**\n * Persist queue to storage\n */\n private async persistQueue(): Promise<void> {\n try {\n await this.storage.setItem(QUEUE_STORAGE_KEY, JSON.stringify(this.queue));\n } catch {\n // Storage write failed, events remain in memory\n }\n }\n\n /**\n * Start the periodic flush timer\n */\n private startFlushTimer(): void {\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n }\n this.flushTimer = setInterval(() => {\n this.flush();\n }, this.flushInterval);\n }\n\n /**\n * Stop the flush timer and flush remaining events\n */\n async shutdown(): Promise<void> {\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n this.flushTimer = null;\n }\n await this.flush();\n }\n\n /**\n * Get current queue size\n */\n get size(): number {\n return this.queue.length;\n }\n\n /**\n * Clear all queued events\n */\n async clear(): Promise<void> {\n this.queue = [];\n await this.persistQueue();\n }\n}\n","import type {\n DataFastConfig,\n SDKState,\n DeviceInfo,\n BaseEventPayload,\n CustomProperties,\n UserProperties,\n PaymentData,\n Platform,\n} from './types';\nimport { EventQueue } from './queue';\nimport {\n generateVisitorId,\n generateSessionId,\n isValidVisitorId,\n isValidSessionId,\n isSessionExpired,\n buildScreenHref,\n buildUserAgent,\n isValidEventName,\n sanitizeCustomProperties,\n createLogger,\n} from './utils';\n\nconst SDK_VERSION = '1.0.0';\nconst DEFAULT_API_URL = 'https://datafa.st/api/events';\n\nconst STORAGE_KEYS = {\n VISITOR_ID: 'datafast_visitor_id',\n SESSION_ID: 'datafast_session_id',\n SESSION_START: 'datafast_session_start',\n IGNORE_TRACKING: 'datafast_ignore',\n};\n\nexport class DataFastClient {\n private state: SDKState = {\n initialized: false,\n visitorId: null,\n sessionId: null,\n sessionStartTime: null,\n lastScreenName: null,\n config: null,\n deviceInfo: null,\n };\n\n private queue: EventQueue | null = null;\n private logger = createLogger(false);\n\n /**\n * Initialize the SDK with configuration\n */\n async init(config: DataFastConfig): Promise<void> {\n if (this.state.initialized) {\n this.logger.warn('SDK already initialized');\n return;\n }\n\n // Validate required config\n if (!config.appId) {\n throw new Error('[DataFast] appId is required');\n }\n if (!config.domain) {\n throw new Error('[DataFast] domain is required');\n }\n if (!config.storage) {\n throw new Error('[DataFast] storage adapter is required');\n }\n if (!config.platform) {\n throw new Error('[DataFast] platform is required');\n }\n\n this.state.config = config;\n this.logger = createLogger(config.debug ?? false);\n\n // Check if tracking is disabled\n const ignoreTracking = await config.storage.getItem(STORAGE_KEYS.IGNORE_TRACKING);\n if (ignoreTracking === 'true') {\n this.logger.log('Tracking disabled via user opt-out');\n return;\n }\n\n // Load or create visitor ID\n await this.initVisitorId();\n\n // Load or create session ID\n await this.initSessionId();\n\n // Initialize event queue\n const apiUrl = config.apiUrl ?? DEFAULT_API_URL;\n const userAgent = buildUserAgent(\n SDK_VERSION,\n config.platform,\n config.appVersion ?? '1.0.0',\n 'Unknown'\n );\n\n this.queue = new EventQueue({\n storage: config.storage,\n network: config.network,\n apiUrl,\n userAgent,\n flushInterval: config.flushInterval,\n maxQueueSize: config.maxQueueSize,\n onFlushError: (error, event) => {\n this.logger.error('Failed to send event:', error, event.payload.type);\n },\n });\n\n await this.queue.init();\n\n this.state.initialized = true;\n this.logger.log('SDK initialized', { visitorId: this.state.visitorId, sessionId: this.state.sessionId });\n }\n\n /**\n * Track a screen view (equivalent to pageview)\n */\n async trackScreen(screenName: string): Promise<void> {\n if (!this.isReady()) return;\n\n if (!screenName || typeof screenName !== 'string') {\n this.logger.warn('trackScreen requires a screen name');\n return;\n }\n\n const config = this.state.config!;\n const referrer = this.state.lastScreenName\n ? buildScreenHref(config.platform, this.state.lastScreenName)\n : null;\n\n const payload = this.buildBasePayload('pageview', screenName);\n payload.referrer = referrer;\n\n await this.queue!.enqueue(payload);\n this.state.lastScreenName = screenName;\n\n this.logger.log('Screen tracked:', screenName);\n }\n\n /**\n * Track a custom event\n */\n async track(eventName: string, properties?: CustomProperties): Promise<void> {\n if (!this.isReady()) return;\n\n if (!isValidEventName(eventName)) {\n this.logger.warn(\n 'Invalid event name. Use lowercase alphanumeric with _ or -, max 64 chars:',\n eventName\n );\n return;\n }\n\n const sanitized = sanitizeCustomProperties(properties ?? {});\n if (sanitized === null) {\n this.logger.warn('Custom properties validation failed');\n return;\n }\n\n const screenName = this.state.lastScreenName ?? 'Unknown';\n const payload = this.buildBasePayload('custom', screenName);\n payload.extraData = {\n eventName: eventName.toLowerCase(),\n ...sanitized,\n };\n\n await this.queue!.enqueue(payload);\n this.logger.log('Event tracked:', eventName, sanitized);\n }\n\n /**\n * Identify a user\n */\n async identify(userId: string, properties?: Omit<UserProperties, 'user_id'>): Promise<void> {\n if (!this.isReady()) return;\n\n if (!userId || typeof userId !== 'string') {\n this.logger.warn('identify requires a user_id');\n return;\n }\n\n const screenName = this.state.lastScreenName ?? 'Unknown';\n const payload = this.buildBasePayload('identify', screenName);\n payload.extraData = {\n user_id: userId,\n name: properties?.name ?? '',\n image: properties?.image ?? '',\n ...properties,\n };\n\n await this.queue!.enqueue(payload);\n this.logger.log('User identified:', userId);\n }\n\n /**\n * Track a payment event\n */\n async trackPayment(data: PaymentData): Promise<void> {\n if (!this.isReady()) return;\n\n if (!data.email || typeof data.email !== 'string') {\n this.logger.warn('trackPayment requires an email');\n return;\n }\n\n const screenName = this.state.lastScreenName ?? 'Unknown';\n const payload = this.buildBasePayload('payment', screenName);\n payload.extraData = {\n email: data.email,\n ...(data.amount !== undefined && { amount: data.amount }),\n ...(data.currency && { currency: data.currency }),\n };\n\n await this.queue!.enqueue(payload);\n this.logger.log('Payment tracked:', data.email);\n }\n\n /**\n * Track an external link click\n */\n async trackExternalLink(url: string, text?: string): Promise<void> {\n if (!this.isReady()) return;\n\n if (!url || typeof url !== 'string') {\n this.logger.warn('trackExternalLink requires a URL');\n return;\n }\n\n const screenName = this.state.lastScreenName ?? 'Unknown';\n const payload = this.buildBasePayload('external_link', screenName);\n payload.extraData = {\n url,\n ...(text && { text }),\n };\n\n await this.queue!.enqueue(payload);\n this.logger.log('External link tracked:', url);\n }\n\n /**\n * Flush all queued events immediately\n */\n async flush(): Promise<void> {\n if (this.queue) {\n await this.queue.flush();\n }\n }\n\n /**\n * Reset the session (start a new session)\n */\n async resetSession(): Promise<void> {\n if (!this.state.config) return;\n\n const newSessionId = generateSessionId();\n const now = Date.now();\n\n this.state.sessionId = newSessionId;\n this.state.sessionStartTime = now;\n this.state.lastScreenName = null;\n\n await this.state.config.storage.setItem(STORAGE_KEYS.SESSION_ID, newSessionId);\n await this.state.config.storage.setItem(STORAGE_KEYS.SESSION_START, now.toString());\n\n this.logger.log('Session reset:', newSessionId);\n }\n\n /**\n * Reset the visitor (new anonymous user)\n */\n async reset(): Promise<void> {\n if (!this.state.config) return;\n\n const newVisitorId = generateVisitorId();\n const newSessionId = generateSessionId();\n const now = Date.now();\n\n this.state.visitorId = newVisitorId;\n this.state.sessionId = newSessionId;\n this.state.sessionStartTime = now;\n this.state.lastScreenName = null;\n\n await this.state.config.storage.setItem(STORAGE_KEYS.VISITOR_ID, newVisitorId);\n await this.state.config.storage.setItem(STORAGE_KEYS.SESSION_ID, newSessionId);\n await this.state.config.storage.setItem(STORAGE_KEYS.SESSION_START, now.toString());\n\n // Clear the queue\n if (this.queue) {\n await this.queue.clear();\n }\n\n this.logger.log('Visitor reset:', newVisitorId);\n }\n\n /**\n * Opt out of tracking\n */\n async optOut(): Promise<void> {\n if (!this.state.config) return;\n\n await this.state.config.storage.setItem(STORAGE_KEYS.IGNORE_TRACKING, 'true');\n this.state.initialized = false;\n\n if (this.queue) {\n await this.queue.clear();\n await this.queue.shutdown();\n }\n\n this.logger.log('User opted out of tracking');\n }\n\n /**\n * Opt back into tracking\n */\n async optIn(): Promise<void> {\n if (!this.state.config) return;\n\n await this.state.config.storage.removeItem(STORAGE_KEYS.IGNORE_TRACKING);\n this.logger.log('User opted back into tracking. Call init() to restart.');\n }\n\n /**\n * Set device info (call this when device info becomes available)\n */\n setDeviceInfo(info: Partial<DeviceInfo>): void {\n this.state.deviceInfo = {\n platform: info.platform ?? this.state.config?.platform ?? 'ios',\n osVersion: info.osVersion ?? '0.0',\n deviceModel: info.deviceModel ?? 'Unknown',\n appVersion: info.appVersion ?? this.state.config?.appVersion ?? '1.0.0',\n screenWidth: info.screenWidth ?? 0,\n screenHeight: info.screenHeight ?? 0,\n viewport: info.viewport ?? { width: 0, height: 0 },\n language: info.language ?? 'en',\n timezone: info.timezone ?? 'UTC',\n };\n }\n\n /**\n * Get current visitor ID\n */\n getVisitorId(): string | null {\n return this.state.visitorId;\n }\n\n /**\n * Get current session ID\n */\n getSessionId(): string | null {\n return this.state.sessionId;\n }\n\n /**\n * Check if SDK is initialized and ready\n */\n isInitialized(): boolean {\n return this.state.initialized;\n }\n\n /**\n * Shutdown the SDK\n */\n async shutdown(): Promise<void> {\n if (this.queue) {\n await this.queue.shutdown();\n }\n this.state.initialized = false;\n }\n\n // Private methods\n\n private isReady(): boolean {\n if (!this.state.initialized) {\n this.logger.warn('SDK not initialized. Call init() first.');\n return false;\n }\n return true;\n }\n\n private async initVisitorId(): Promise<void> {\n const config = this.state.config!;\n let visitorId = await config.storage.getItem(STORAGE_KEYS.VISITOR_ID);\n\n if (!visitorId || !isValidVisitorId(visitorId)) {\n visitorId = generateVisitorId();\n await config.storage.setItem(STORAGE_KEYS.VISITOR_ID, visitorId);\n }\n\n this.state.visitorId = visitorId;\n }\n\n private async initSessionId(): Promise<void> {\n const config = this.state.config!;\n let sessionId = await config.storage.getItem(STORAGE_KEYS.SESSION_ID);\n const sessionStartStr = await config.storage.getItem(STORAGE_KEYS.SESSION_START);\n const sessionStart = sessionStartStr ? parseInt(sessionStartStr, 10) : 0;\n\n // Create new session if invalid or expired\n if (!sessionId || !isValidSessionId(sessionId) || isSessionExpired(sessionStart)) {\n sessionId = generateSessionId();\n const now = Date.now();\n await config.storage.setItem(STORAGE_KEYS.SESSION_ID, sessionId);\n await config.storage.setItem(STORAGE_KEYS.SESSION_START, now.toString());\n this.state.sessionStartTime = now;\n } else {\n this.state.sessionStartTime = sessionStart;\n }\n\n this.state.sessionId = sessionId;\n }\n\n private buildBasePayload(type: BaseEventPayload['type'], screenName: string): BaseEventPayload {\n const config = this.state.config!;\n const deviceInfo = this.state.deviceInfo;\n\n return {\n websiteId: config.appId,\n domain: config.domain,\n visitorId: this.state.visitorId!,\n sessionId: this.state.sessionId!,\n href: buildScreenHref(config.platform, screenName),\n referrer: null,\n type,\n viewport: deviceInfo?.viewport ?? { width: 0, height: 0 },\n language: deviceInfo?.language ?? 'en',\n timezone: deviceInfo?.timezone ?? 'UTC',\n screenWidth: deviceInfo?.screenWidth ?? 0,\n screenHeight: deviceInfo?.screenHeight ?? 0,\n };\n }\n}\n\n// Singleton instance\nlet instance: DataFastClient | null = null;\n\n/**\n * Get the singleton DataFast client instance\n */\nexport function getDataFastClient(): DataFastClient {\n if (!instance) {\n instance = new DataFastClient();\n }\n return instance;\n}\n\n/**\n * Create a new DataFast client (for cases where you need multiple instances)\n */\nexport function createDataFastClient(): DataFastClient {\n return new DataFastClient();\n}\n\n// Re-export types\nexport type { DataFastConfig } from './types';\n","import type { StorageAdapter } from '../core/types';\n\n/**\n * Browser localStorage adapter for DataFast\n */\nexport function createLocalStorageAdapter(): StorageAdapter {\n return {\n async getItem(key: string): Promise<string | null> {\n try {\n return localStorage.getItem(key);\n } catch (error) {\n console.warn('[DataFast] localStorage.getItem failed:', error);\n return null;\n }\n },\n\n async setItem(key: string, value: string): Promise<void> {\n try {\n localStorage.setItem(key, value);\n } catch (error) {\n console.warn('[DataFast] localStorage.setItem failed:', error);\n }\n },\n\n async removeItem(key: string): Promise<void> {\n try {\n localStorage.removeItem(key);\n } catch (error) {\n console.warn('[DataFast] localStorage.removeItem failed:', error);\n }\n },\n };\n}\n\n/**\n * In-memory storage adapter (fallback when localStorage is not available)\n */\nexport function createMemoryStorageAdapter(): StorageAdapter {\n const storage = new Map<string, string>();\n\n return {\n async getItem(key: string): Promise<string | null> {\n return storage.get(key) ?? null;\n },\n\n async setItem(key: string, value: string): Promise<void> {\n storage.set(key, value);\n },\n\n async removeItem(key: string): Promise<void> {\n storage.delete(key);\n },\n };\n}\n","import type { NetworkAdapter } from '../core/types';\n\n/**\n * Browser fetch-based network adapter for DataFast\n */\nexport function createFetchNetworkAdapter(): NetworkAdapter {\n return {\n async isConnected(): Promise<boolean> {\n // In browsers, assume we're always connected (can't reliably detect)\n // Most browsers will queue requests if offline\n return true;\n },\n\n onConnectionChange(callback: (connected: boolean) => void): () => void {\n // Listen for online/offline events\n const handleOnline = () => callback(true);\n const handleOffline = () => callback(false);\n\n window.addEventListener('online', handleOnline);\n window.addEventListener('offline', handleOffline);\n\n // Return cleanup function\n return () => {\n window.removeEventListener('online', handleOnline);\n window.removeEventListener('offline', handleOffline);\n };\n },\n };\n}\n","import type { DeviceInfo } from '../core/types';\n\n/**\n * Get device info for web browsers\n */\nexport function getDeviceInfo(): Partial<DeviceInfo> {\n // Safely access browser APIs\n const getViewport = () => {\n if (typeof window === 'undefined') return { width: 0, height: 0 };\n return {\n width: window.innerWidth || 0,\n height: window.innerHeight || 0,\n };\n };\n\n const getScreenSize = () => {\n if (typeof window === 'undefined' || !window.screen) return { width: 0, height: 0 };\n return {\n width: window.screen.width || 0,\n height: window.screen.height || 0,\n };\n };\n\n const getLanguage = () => {\n if (typeof navigator === 'undefined') return 'en';\n return navigator.language || 'en';\n };\n\n const getTimezone = () => {\n try {\n return Intl.DateTimeFormat().resolvedOptions().timeZone || 'UTC';\n } catch {\n return 'UTC';\n }\n };\n\n const getUserAgent = () => {\n if (typeof navigator === 'undefined') return 'Unknown';\n return navigator.userAgent || 'Unknown';\n };\n\n const viewport = getViewport();\n const screen = getScreenSize();\n\n return {\n platform: 'web',\n osVersion: getUserAgent(),\n deviceModel: 'Browser',\n appVersion: '1.0.0',\n screenWidth: screen.width,\n screenHeight: screen.height,\n viewport,\n language: getLanguage(),\n timezone: getTimezone(),\n };\n}\n\n/**\n * Listen for viewport changes (resize events)\n */\n// eslint-disable-next-line no-unused-vars -- callback param name documents API\nexport function onViewportChange(callback: (viewport: { width: number; height: number }) => void): () => void {\n if (typeof window === 'undefined') {\n return () => {};\n }\n\n const handleResize = () => {\n callback({\n width: window.innerWidth || 0,\n height: window.innerHeight || 0,\n });\n };\n\n window.addEventListener('resize', handleResize);\n\n return () => {\n window.removeEventListener('resize', handleResize);\n };\n}\n","import {\n DataFastClient,\n getDataFastClient,\n createDataFastClient,\n type DataFastConfig,\n} from '../core/client';\nimport { createLocalStorageAdapter, createMemoryStorageAdapter } from './storage';\nimport { createFetchNetworkAdapter } from './network';\nimport { getDeviceInfo, onViewportChange } from './device';\n\n// Re-export everything from core\nexport * from '../core';\n\n// Export web-specific utilities\nexport { createLocalStorageAdapter, createMemoryStorageAdapter } from './storage';\nexport { createFetchNetworkAdapter } from './network';\nexport { getDeviceInfo, onViewportChange } from './device';\n\n/**\n * Simplified configuration for web apps\n */\nexport interface DataFastWebConfig {\n /** Your DataFast website ID */\n websiteId: string;\n /** Domain (defaults to current hostname) */\n domain?: string;\n /** Custom API endpoint */\n apiUrl?: string;\n /** Enable debug logging */\n debug?: boolean;\n /** Flush interval in ms (default: 5000) */\n flushInterval?: number;\n /** Max queue size before flush (default: 10) */\n maxQueueSize?: number;\n}\n\n/**\n * Initialize DataFast for web apps\n *\n * This is the recommended way to use DataFast in browser environments.\n * It automatically configures localStorage and fetch adapters and returns\n * a client with trackPageview(), track(), identify(), trackPayment(), reset().\n *\n * Usage (matches docs):\n * ```ts\n * import { initDataFast } from 'datafast';\n *\n * const datafast = await initDataFast({\n * websiteId: 'your-website-id',\n * });\n *\n * datafast.trackPageview();\n * datafast.track('button_click', { button: 'signup' });\n * datafast.identify('user_123', { name: 'John' });\n * ```\n */\nexport async function initDataFast(config: DataFastWebConfig): Promise<DataFastWeb> {\n const client = getDataFastClient();\n\n // Set up storage (with fallback)\n let storage;\n try {\n // Test if localStorage is available\n localStorage.setItem('__datafast_test__', 'test');\n localStorage.removeItem('__datafast_test__');\n storage = createLocalStorageAdapter();\n } catch {\n console.warn('[DataFast] localStorage not available, using in-memory storage');\n storage = createMemoryStorageAdapter();\n }\n\n // Set up network adapter\n const network = createFetchNetworkAdapter();\n\n // Get device info\n const deviceInfo = getDeviceInfo();\n\n // Determine domain\n const domain = config.domain ?? (typeof window !== 'undefined' ? window.location.hostname : 'unknown');\n\n // Initialize the client\n await client.init({\n appId: config.websiteId,\n domain,\n storage,\n network,\n platform: 'web',\n apiUrl: config.apiUrl,\n debug: config.debug,\n flushInterval: config.flushInterval ?? 5000,\n maxQueueSize: config.maxQueueSize ?? 10,\n });\n\n // Set device info\n client.setDeviceInfo(deviceInfo);\n\n // Listen for viewport changes\n onViewportChange((viewport) => {\n client.setDeviceInfo({\n ...deviceInfo,\n viewport,\n });\n });\n\n // Attach web convenience method so docs (initDataFast + trackPageview) work\n const webClient = client as DataFastWeb;\n webClient.trackPageview = async (path?: string) => {\n const pagePath = path ?? (typeof window !== 'undefined' ? window.location.pathname : '/');\n await client.trackScreen(pagePath);\n };\n\n return webClient;\n}\n\n/**\n * Create a DataFast client with manual configuration\n *\n * Use this for more control over adapters or for non-standard setups.\n *\n * Usage:\n * ```ts\n * import {\n * createDataFastWithAdapters,\n * createLocalStorageAdapter,\n * createFetchNetworkAdapter,\n * } from 'datafast/web';\n *\n * const datafast = await createDataFastWithAdapters({\n * appId: 'your-website-id',\n * domain: 'example.com',\n * storage: createLocalStorageAdapter(),\n * network: createFetchNetworkAdapter(),\n * platform: 'web',\n * });\n * ```\n */\nexport async function createDataFastWithAdapters(\n config: DataFastConfig\n): Promise<DataFastClient> {\n const client = createDataFastClient();\n await client.init(config);\n\n // Get and set device info\n const deviceInfo = getDeviceInfo();\n client.setDeviceInfo(deviceInfo);\n\n return client;\n}\n\n// Extended client with convenience methods for web (returned by initDataFast)\nexport interface DataFastWeb extends DataFastClient {\n /** Track a page view (alias for trackScreen). Optional path defaults to current location. */\n // eslint-disable-next-line no-unused-vars -- interface param for API docs\n trackPageview(path?: string): Promise<void>;\n}\n\n/**\n * Create a web-optimized DataFast client. Same as initDataFast (alias).\n */\nexport async function createDataFastWeb(config: DataFastWebConfig): Promise<DataFastWeb> {\n return initDataFast(config);\n}\n\n// Default export for convenience\nconst dataFastWeb = {\n init: initDataFast,\n createWeb: createDataFastWeb,\n getClient: getDataFastClient,\n createClient: createDataFastClient,\n};\nexport default dataFastWeb;\n"]}
package/package.json ADDED
@@ -0,0 +1,39 @@
1
+ {
2
+ "name": "datafast",
3
+ "version": "1.0.1",
4
+ "description": "Analytics SDK for DataFast",
5
+ "author": "",
6
+ "license": "MIT",
7
+ "keywords": [
8
+ "analytics",
9
+ "tracking",
10
+ "datafast",
11
+ "web",
12
+ "browser"
13
+ ],
14
+ "exports": {
15
+ ".": {
16
+ "types": "./dist/web/index.d.ts",
17
+ "import": "./dist/web/index.mjs",
18
+ "require": "./dist/web/index.js"
19
+ },
20
+ "./package.json": "./package.json"
21
+ },
22
+ "files": [
23
+ "dist",
24
+ "README.md"
25
+ ],
26
+ "scripts": {
27
+ "build": "tsup",
28
+ "dev": "tsup --watch",
29
+ "typecheck": "tsc --noEmit",
30
+ "clean": "rm -rf dist"
31
+ },
32
+ "devDependencies": {
33
+ "tsup": "^8.0.0",
34
+ "typescript": "^5.3.0"
35
+ },
36
+ "publishConfig": {
37
+ "access": "public"
38
+ }
39
+ }