eventlog-rn 0.3.3 → 0.3.4
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 +1 -1
- package/dist/index.d.mts +5 -4
- package/dist/index.d.ts +5 -4
- package/dist/index.js.map +1 -1
- package/dist/index.mjs.map +1 -1
- package/dist/viewer/index.js.map +1 -1
- package/dist/viewer/index.mjs.map +1 -1
- package/package.json +5 -1
- package/src/index.ts +1 -2
- package/src/storage/mmkv.ts +1 -1
- package/src/types.ts +14 -6
package/README.md
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
> Functional, type-safe event logging SDK for React Native
|
|
4
4
|
|
|
5
5
|
[](https://www.typescriptlang.org/)
|
|
6
|
-
[](https://bundlephobia.com/)
|
|
7
7
|
[](LICENSE)
|
|
8
8
|
|
|
9
9
|
## What is this?
|
package/dist/index.d.mts
CHANGED
|
@@ -16,11 +16,11 @@ type StorageAdapter = Readonly<{
|
|
|
16
16
|
/**
|
|
17
17
|
* Event categories
|
|
18
18
|
*/
|
|
19
|
-
type EventCategory =
|
|
19
|
+
type EventCategory = "screen" | "action" | "network" | "error" | "log";
|
|
20
20
|
/**
|
|
21
21
|
* Log levels
|
|
22
22
|
*/
|
|
23
|
-
type LogLevel =
|
|
23
|
+
type LogLevel = "debug" | "info" | "warn" | "error";
|
|
24
24
|
/**
|
|
25
25
|
* Event context (attached to all events)
|
|
26
26
|
*/
|
|
@@ -49,7 +49,7 @@ type Event = Readonly<{
|
|
|
49
49
|
type Session = Readonly<{
|
|
50
50
|
readonly sessionId: string;
|
|
51
51
|
readonly sessionStart: number;
|
|
52
|
-
readonly startType:
|
|
52
|
+
readonly startType: "cold" | "warm";
|
|
53
53
|
readonly seq: number;
|
|
54
54
|
readonly lastActivityTime: number;
|
|
55
55
|
}>;
|
|
@@ -74,6 +74,7 @@ type FeatureConfig = Readonly<{
|
|
|
74
74
|
* Tracker configuration
|
|
75
75
|
*/
|
|
76
76
|
type EventLogConfig = Readonly<{
|
|
77
|
+
readonly apiKey?: string;
|
|
77
78
|
readonly autoDetect?: boolean;
|
|
78
79
|
readonly maxEvents?: number;
|
|
79
80
|
readonly maxAgeDays?: number;
|
|
@@ -86,7 +87,7 @@ type EventLogConfig = Readonly<{
|
|
|
86
87
|
* Export options
|
|
87
88
|
*/
|
|
88
89
|
type ExportOptions = Readonly<{
|
|
89
|
-
readonly mode:
|
|
90
|
+
readonly mode: "repro" | "full";
|
|
90
91
|
}>;
|
|
91
92
|
/**
|
|
92
93
|
* Network event payload
|
package/dist/index.d.ts
CHANGED
|
@@ -16,11 +16,11 @@ type StorageAdapter = Readonly<{
|
|
|
16
16
|
/**
|
|
17
17
|
* Event categories
|
|
18
18
|
*/
|
|
19
|
-
type EventCategory =
|
|
19
|
+
type EventCategory = "screen" | "action" | "network" | "error" | "log";
|
|
20
20
|
/**
|
|
21
21
|
* Log levels
|
|
22
22
|
*/
|
|
23
|
-
type LogLevel =
|
|
23
|
+
type LogLevel = "debug" | "info" | "warn" | "error";
|
|
24
24
|
/**
|
|
25
25
|
* Event context (attached to all events)
|
|
26
26
|
*/
|
|
@@ -49,7 +49,7 @@ type Event = Readonly<{
|
|
|
49
49
|
type Session = Readonly<{
|
|
50
50
|
readonly sessionId: string;
|
|
51
51
|
readonly sessionStart: number;
|
|
52
|
-
readonly startType:
|
|
52
|
+
readonly startType: "cold" | "warm";
|
|
53
53
|
readonly seq: number;
|
|
54
54
|
readonly lastActivityTime: number;
|
|
55
55
|
}>;
|
|
@@ -74,6 +74,7 @@ type FeatureConfig = Readonly<{
|
|
|
74
74
|
* Tracker configuration
|
|
75
75
|
*/
|
|
76
76
|
type EventLogConfig = Readonly<{
|
|
77
|
+
readonly apiKey?: string;
|
|
77
78
|
readonly autoDetect?: boolean;
|
|
78
79
|
readonly maxEvents?: number;
|
|
79
80
|
readonly maxAgeDays?: number;
|
|
@@ -86,7 +87,7 @@ type EventLogConfig = Readonly<{
|
|
|
86
87
|
* Export options
|
|
87
88
|
*/
|
|
88
89
|
type ExportOptions = Readonly<{
|
|
89
|
-
readonly mode:
|
|
90
|
+
readonly mode: "repro" | "full";
|
|
90
91
|
}>;
|
|
91
92
|
/**
|
|
92
93
|
* Network event payload
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/utils.ts","../src/core/events.ts","../src/core/buffer.ts","../src/core/query.ts","../src/core/network.ts","../src/core/errors.ts","../src/storage/mmkv.ts","../src/core/eventlog.ts","../src/viewer/styles.ts","../src/viewer/Header.tsx","../src/viewer/SearchBar.tsx","../src/viewer/types.ts","../src/viewer/FilterChip.tsx","../src/viewer/FilterBar.tsx","../src/viewer/EventItem.tsx","../src/viewer/EventList.tsx","../src/viewer/hooks.ts","../src/instance.ts","../src/viewer/EventLogViewer.tsx","../src/components/EventLogErrorBoundary.tsx"],"names":["eventLog","MMKVModule","StyleSheet","React","View","Text","TouchableOpacity","TextInput","ScrollView","FlatList","useState","useCallback","useEffect","Component","styles"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Pure utility functions\n */\n\n/**\n * Generate a UUID v4\n */\nexport const generateUUID = (): 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 * Get current timestamp in milliseconds\n */\nexport const getTimestamp = (): number => Date.now();\n\n/**\n * Get ISO 8601 timestamp with timezone\n */\nexport const getTimestampISO = (): string => new Date().toISOString();\n\n/**\n * Get IANA timezone identifier\n */\nexport const getTimezone = (): string => {\n try {\n return Intl.DateTimeFormat().resolvedOptions().timeZone;\n } catch {\n return 'UTC';\n }\n};\n\n/**\n * Debounce function (returns a new function, pure in concept)\n */\nexport const debounce = <T extends ReadonlyArray<unknown>>(\n func: (...args: T) => void,\n wait: number\n): ((...args: T) => void) => {\n let timeout: ReturnType<typeof setTimeout> | null = null;\n\n return (...args: T): void => {\n if (timeout !== null) {\n clearTimeout(timeout);\n }\n timeout = setTimeout(() => {\n func(...args);\n }, wait);\n };\n};\n","/**\n * Pure event creation functions\n */\n\nimport type {\n Event,\n EventCategory,\n EventContext,\n Session,\n LogLevel,\n ErrorEventPayload,\n} from '../types';\nimport { generateUUID, getTimestamp, getTimestampISO, getTimezone } from './utils';\n\n/**\n * Create an event (pure function)\n */\nexport const createEvent = (\n session: Session,\n context: EventContext,\n category: EventCategory,\n payload: unknown\n): Event => {\n return {\n eventId: generateUUID(),\n sessionId: session.sessionId,\n seq: session.seq,\n timestamp: getTimestamp(),\n timestampISO: getTimestampISO(),\n timezone: getTimezone(),\n category,\n payload,\n context,\n } as const;\n};\n\n/**\n * Create a screen event payload\n */\nexport const createScreenPayload = (\n name: string,\n params?: unknown\n): Readonly<{ name: string; params?: unknown }> => {\n return { name, params } as const;\n};\n\n/**\n * Create an action event payload\n */\nexport const createActionPayload = (\n name: string,\n data?: unknown\n): Readonly<{ name: string; data?: unknown }> => {\n return { name, data } as const;\n};\n\n/**\n * Create a log event payload\n */\nexport const createLogPayload = (\n level: LogLevel,\n message: string,\n data?: unknown\n): Readonly<{ level: LogLevel; message: string; data?: unknown }> => {\n return { level, message, data } as const;\n};\n\n/**\n * Create an error event payload\n */\nexport const createErrorPayload = (\n error: unknown,\n context?: unknown\n): ErrorEventPayload => {\n const err = error as { message?: string; stack?: string };\n const payload: ErrorEventPayload = {\n message: err.message ?? String(error),\n ...(err.stack !== undefined && { stack: err.stack }),\n ...(context !== undefined && { context }),\n };\n return payload;\n};\n\n/**\n * Increment session sequence number (pure function, returns new session)\n */\nexport const incrementSeq = (session: Session): Session => {\n return {\n ...session,\n seq: session.seq + 1,\n } as const;\n};\n\n/**\n * Update session activity time (pure function, returns new session)\n */\nexport const updateSessionActivity = (session: Session): Session => {\n return {\n ...session,\n lastActivityTime: getTimestamp(),\n } as const;\n};\n\n/**\n * Check if session has expired\n */\nexport const isSessionExpired = (\n session: Session,\n timeoutMs: number\n): boolean => {\n const now = getTimestamp();\n return now - session.lastActivityTime > timeoutMs;\n};\n\n/**\n * Create a new session\n */\nexport const createSession = (\n startType: 'cold' | 'warm'\n): Session => {\n const now = getTimestamp();\n return {\n sessionId: generateUUID(),\n sessionStart: now,\n startType,\n seq: 0,\n lastActivityTime: now,\n } as const;\n};\n\n/**\n * Sanitize event (pure function)\n */\nconst SENSITIVE_KEYS = [\n 'password',\n 'token',\n 'authorization',\n 'secret',\n 'apiKey',\n 'api_key',\n 'accessToken',\n 'access_token',\n 'refreshToken',\n 'refresh_token',\n] as const;\n\nconst MAX_DEPTH = 10;\nconst MAX_SIZE = 100 * 1024; // 100KB\n\nconst isSensitiveKey = (key: string): boolean => {\n const lowerKey = key.toLowerCase();\n return SENSITIVE_KEYS.some((sensitive) => lowerKey.includes(sensitive));\n};\n\nconst sanitizeValue = (value: unknown, depth: number): unknown => {\n if (depth > MAX_DEPTH) {\n return { _maxDepthExceeded: true } as const;\n }\n\n if (value === null || value === undefined) {\n return value;\n }\n\n if (typeof value !== 'object') {\n return value;\n }\n\n if (Array.isArray(value)) {\n return value.map((item) => sanitizeValue(item, depth + 1));\n }\n\n const sanitized: Record<string, unknown> = {};\n for (const key in value) {\n if (Object.prototype.hasOwnProperty.call(value, key)) {\n const val = (value as Record<string, unknown>)[key];\n sanitized[key] = isSensitiveKey(key)\n ? '***REDACTED***'\n : sanitizeValue(val, depth + 1);\n }\n }\n\n return sanitized;\n};\n\nexport const sanitizeEvent = (event: Event): Event => {\n const sanitizedPayload = sanitizeValue(event.payload, 0);\n const sanitizedContext = sanitizeValue(event.context, 0) as EventContext;\n\n // Check size\n const size = JSON.stringify(event).length;\n if (size > MAX_SIZE) {\n return {\n ...event,\n payload: { _truncated: true, _originalSize: size },\n context: event.context,\n };\n }\n\n return {\n ...event,\n payload: sanitizedPayload,\n context: sanitizedContext,\n };\n};\n\n/**\n * Export events as JSONL (pure function)\n */\nexport const exportEventsAsJSONL = (\n events: ReadonlyArray<Event>,\n mode: 'repro' | 'full'\n): string => {\n const filtered = mode === 'repro' ? getReproEvents(events) : events;\n return filtered.map((event) => JSON.stringify(event)).join('\\n');\n};\n\n/**\n * Get events for repro mode (pure function)\n */\nconst getReproEvents = (events: ReadonlyArray<Event>): ReadonlyArray<Event> => {\n if (events.length === 0) {\n return [];\n }\n\n const lastEvent = events[events.length - 1];\n if (lastEvent === undefined) {\n return [];\n }\n\n const currentSessionId: string = lastEvent.sessionId;\n\n // Get all unique session IDs\n const sessionIds = Array.from(new Set(events.map((e) => e.sessionId)));\n const currentSessionIndex = sessionIds.indexOf(currentSessionId);\n const previousSessionId: string | null =\n currentSessionIndex > 0 ? sessionIds[currentSessionIndex - 1] ?? null : null;\n\n // Get errors\n const errors = events.filter((e) => e.category === 'error').slice(-10);\n\n // Get events from current and previous session\n const sessionEvents = events.filter(\n (e) => e.sessionId === currentSessionId || e.sessionId === previousSessionId\n );\n\n // Combine and deduplicate\n const combined = [...sessionEvents];\n errors.forEach((error) => {\n if (!combined.find((e) => e.eventId === error.eventId)) {\n combined.push(error);\n }\n });\n\n // Sort by timestamp\n return combined.sort((a, b) => a.timestamp - b.timestamp);\n};\n","/**\n * Functional ring buffer implementation\n */\n\nimport type { Event } from '../types';\n\n/**\n * Ring buffer state (immutable)\n */\nexport type RingBufferState = Readonly<{\n readonly buffer: ReadonlyArray<Event | undefined>;\n readonly writeIndex: number;\n readonly size: number;\n readonly maxSize: number;\n}>;\n\n/**\n * Create a new ring buffer\n */\nexport const createRingBuffer = (maxSize: number): RingBufferState => {\n return {\n buffer: new Array(maxSize).fill(undefined),\n writeIndex: 0,\n size: 0,\n maxSize,\n } as const;\n};\n\n/**\n * Add event to buffer (pure function, returns new state)\n */\nexport const pushEvent = (\n state: RingBufferState,\n event: Event\n): RingBufferState => {\n const newBuffer = [...state.buffer];\n newBuffer[state.writeIndex] = event;\n\n return {\n ...state,\n buffer: newBuffer,\n writeIndex: (state.writeIndex + 1) % state.maxSize,\n size: Math.min(state.size + 1, state.maxSize),\n } as const;\n};\n\n/**\n * Get all events in chronological order (pure function)\n */\nexport const toArray = (state: RingBufferState): ReadonlyArray<Event> => {\n if (state.size < state.maxSize) {\n return state.buffer.slice(0, state.size).filter((e): e is Event => e !== undefined);\n }\n\n const afterWrite = state.buffer.slice(state.writeIndex);\n const beforeWrite = state.buffer.slice(0, state.writeIndex);\n \n return [...afterWrite, ...beforeWrite].filter((e): e is Event => e !== undefined);\n};\n\n/**\n * Clear buffer (pure function, returns new state)\n */\nexport const clearBuffer = (state: RingBufferState): RingBufferState => {\n return createRingBuffer(state.maxSize);\n};\n","/**\n * Query events by filters\n */\n\nimport type { Event, EventQuery } from '../types';\n\nexport const queryEvents = (\n events: ReadonlyArray<Event>,\n query: EventQuery\n): ReadonlyArray<Event> => {\n let filtered = events;\n\n // Filter by category\n if (query.category && query.category.length > 0) {\n filtered = filtered.filter((e) => {\n const categories = query.category;\n return categories ? categories.includes(e.category) : true;\n });\n }\n\n // Filter by time range\n if (query.timeRange) {\n filtered = filtered.filter(\n (e) =>\n e.timestamp >= query.timeRange!.start &&\n e.timestamp <= query.timeRange!.end\n );\n }\n\n // Filter by session ID\n if (query.sessionId) {\n filtered = filtered.filter((e) => e.sessionId === query.sessionId);\n }\n\n // Search in payload\n if (query.search) {\n const searchLower = query.search.toLowerCase();\n filtered = filtered.filter((e) => {\n const payloadStr = JSON.stringify(e.payload).toLowerCase();\n return payloadStr.includes(searchLower);\n });\n }\n\n // Limit results\n if (query.limit && query.limit > 0) {\n filtered = filtered.slice(-query.limit);\n }\n\n return filtered;\n};\n","/**\n * Network interception logic (Fetch & XHR)\n */\n\nimport type { EventLog, FeatureConfig, NetworkEventPayload } from '../types';\n\ntype NetworkConfig = NonNullable<FeatureConfig['network']>;\n\n// Keep original globals\nconst originalFetch = global.fetch;\nconst originalXMLHttpRequest = global.XMLHttpRequest;\n\n/**\n * Intercept Fetch API\n */\nconst interceptFetch = (eventLog: EventLog, config: NetworkConfig) => {\n if (!config.interceptFetch) return;\n\n global.fetch = async (input: RequestInfo | URL, init?: RequestInit) => {\n const startTime = Date.now();\n const url = typeof input === 'string' ? input : input instanceof URL ? input.toString() : input.url;\n const method = (init?.method ?? 'GET').toUpperCase();\n\n try {\n const response = await originalFetch(input, init);\n const endTime = Date.now();\n const duration = endTime - startTime;\n\n // Clone response to read body without consuming original stream\n const clone = response.clone();\n \n let responseBody: unknown;\n if (config.logResponseBody) {\n try {\n // Text first to check size/parse JSON\n const text = await clone.text();\n if (!config.maxBodySize || text.length <= config.maxBodySize) {\n try {\n responseBody = JSON.parse(text);\n } catch {\n responseBody = text;\n }\n } else {\n responseBody = `[Body too large: ${text.length} bytes]`;\n }\n } catch {\n responseBody = '[Failed to read response body]';\n }\n }\n\n const payload: NetworkEventPayload = {\n url,\n method,\n status: response.status,\n duration,\n responseHeaders: config.redactHeaders ? redactHeaders(response.headers, config.redactHeaders) : headersToObject(response.headers),\n responseBody,\n };\n\n eventLog.network(payload);\n \n return response;\n } catch (error) {\n const endTime = Date.now();\n eventLog.error(error, {\n url,\n method,\n duration: endTime - startTime,\n category: 'network', // Context hack\n });\n throw error;\n }\n };\n};\n\n/**\n * Intercept XMLHttpRequest\n */\nconst interceptXHR = (eventLog: EventLog, config: NetworkConfig) => {\n // If explicitly disabled, return. Undefined means enabled by default.\n if (config.interceptAxios === false) return;\n\n const XHR = originalXMLHttpRequest;\n \n // @ts-ignore - Monkey patching\n global.XMLHttpRequest = function() {\n const xhr = new XHR();\n const startTime = Date.now();\n let method = 'GET';\n let url = '';\n\n const originalOpen = xhr.open;\n const originalSend = xhr.send;\n\n xhr.open = function(m: string, u: string, ...args: any[]) {\n method = m.toUpperCase();\n url = u;\n return originalOpen.apply(this, [m, u, ...args] as any);\n };\n\n xhr.send = function(body?: any) {\n xhr.addEventListener('loadend', () => {\n const duration = Date.now() - startTime;\n \n // Extract headers (messy in XHR)\n const responseHeadersString = xhr.getAllResponseHeaders();\n const responseHeaders = parseXHRHeaders(responseHeadersString);\n\n let responseBody: unknown;\n if (config.logResponseBody) {\n try {\n if (xhr.responseType === '' || xhr.responseType === 'text') {\n responseBody = xhr.responseText;\n if (responseBody && typeof responseBody === 'string' && (!config.maxBodySize || responseBody.length <= config.maxBodySize)) {\n try { responseBody = JSON.parse(responseBody); } catch {}\n }\n }\n } catch {}\n }\n\n const payload: NetworkEventPayload = {\n url,\n method,\n status: xhr.status,\n duration,\n responseHeaders: config.redactHeaders ? redactHeaders(responseHeaders, config.redactHeaders) : responseHeaders as any,\n responseBody,\n };\n \n // @ts-ignore - We will add this method\n if (typeof eventLog.network === 'function') {\n // @ts-ignore\n eventLog.network(payload);\n }\n });\n return originalSend.apply(this, [body]);\n }\n\n return xhr;\n };\n \n // Restore prototype chain\n global.XMLHttpRequest.prototype = XHR.prototype;\n Object.assign(global.XMLHttpRequest, XHR);\n};\n\n/**\n * Helpers\n */\nconst headersToObject = (headers: Headers): Record<string, string> => {\n const obj: Record<string, string> = {};\n headers.forEach((value, key) => {\n obj[key] = value;\n });\n return obj;\n}\n\nconst redactHeaders = (headers: Headers | Record<string, string>, keysToRedact: ReadonlyArray<string>): Record<string, string> => {\n const obj = headers instanceof Headers ? headersToObject(headers) : headers;\n const redacted: Record<string, string> = { ...obj };\n keysToRedact.forEach(key => {\n const lowerKey = key.toLowerCase();\n // Simple case-insensitive match simulation\n Object.keys(redacted).forEach(h => {\n if (h.toLowerCase() === lowerKey) {\n redacted[h] = '***REDACTED***';\n }\n });\n });\n return redacted;\n}\n\nconst parseXHRHeaders = (headers: string): Record<string, string> => {\n if (!headers) return {};\n const result: Record<string, string> = {};\n const pairs = headers.trim().split(/[\\r\\n]+/);\n pairs.forEach(line => {\n const parts = line.split(': ');\n if (parts.length >= 2) {\n const key = parts.shift()!;\n const value = parts.join(': ');\n result[key] = value;\n }\n });\n return result;\n}\n\n/**\n * Main enable function\n */\nexport const enableNetworkInterception = (eventLog: EventLog, config: FeatureConfig['network']) => {\n if (!config || !config.enabled) return;\n \n // Cleanup first just in case\n restoreNetworkInterception();\n\n if (config.interceptFetch !== false) {\n interceptFetch(eventLog, config);\n }\n // Default to true for XHR if not specified, or checks interceptAxios\n if (config.interceptAxios !== false) {\n interceptXHR(eventLog, config);\n }\n};\n\nexport const restoreNetworkInterception = () => {\n global.fetch = originalFetch;\n global.XMLHttpRequest = originalXMLHttpRequest;\n};\n","/**\n * Global Error Handlers (Fatal & Promise Rejections)\n */\n\nimport type { EventLog, FeatureConfig } from '../types';\n\ntype GlobalErrorsConfig = NonNullable<FeatureConfig['globalErrors']>;\n\n// React Native's global error handler interface\ninterface ErrorUtils {\n setGlobalHandler: (handler: (error: Error, isFatal?: boolean) => void) => void;\n getGlobalHandler: () => (error: Error, isFatal?: boolean) => void;\n}\n\ndeclare let ErrorUtils: ErrorUtils;\n\n/**\n * Enable global error tracking\n */\nexport const enableGlobalErrorLogging = (\n eventLog: EventLog,\n config: GlobalErrorsConfig\n) => {\n if (!config || config.enabled === false) return;\n\n // 1. Handle JS Fatal Errors (Reference: React Native ErrorUtils)\n try {\n // @ts-ignore - ErrorUtils is a React Native global\n if (global.ErrorUtils) {\n // @ts-ignore\n const originalHandler = global.ErrorUtils.getGlobalHandler();\n\n // @ts-ignore\n global.ErrorUtils.setGlobalHandler((error: Error, isFatal?: boolean) => {\n // Log to EventLog\n eventLog.error(error, {\n isFatal,\n origin: 'global_handler',\n timestamp: Date.now(),\n });\n\n // Delegate to original handler (Crash or LogBox)\n if (originalHandler) {\n originalHandler(error, isFatal);\n }\n });\n }\n } catch (e) {\n // Failsafe: Don't crash if ErrorUtils is strangely absent or behavior changes\n console.warn('[EventLog] Failed to setup ErrorUtils handler', e);\n }\n\n // 2. Handle Unhandled Promise Rejections\n // React Native environments typically handle this via 'tracking' packages or polyfills.\n // Modern RN versions might support 'unhandledrejection' event on global.\n // We opt for a safe, non-intrusive approach:\n // If the user wants promise rejection tracking, they usually need a specific RN version support.\n // We will add a simple listener if available.\n \n const rejectionHandler = (event: any) => {\n // Logic for web or standard JS environments\n // RN generic \"promise rejection\" handling is complex and varies by version.\n // We'll stick to ErrorUtils primarily for now as it's the RN standard for crashes.\n const reason = event?.reason;\n if (reason) {\n eventLog.error(reason, {\n origin: 'unhandled_rejection',\n isFatal: false\n });\n }\n };\n\n // Safe attach (mostly for web/hybrid - purely native RN relies on ErrorUtils for fatals)\n // @ts-ignore\n if (typeof window !== 'undefined' && window.addEventListener) {\n // @ts-ignore\n window.addEventListener('unhandledrejection', rejectionHandler);\n }\n};\n","/**\n * Internal MMKV storage adapter\n * Supports both MMKV v3 (RN 0.74+) and v4 (RN 0.75+)\n * MMKV is synchronous, but we wrap it in Promises to match StorageAdapter interface\n */\n\nimport type { StorageAdapter } from '../types';\n\n// Detect and initialize MMKV with version compatibility\nimport * as MMKVModule from 'react-native-mmkv';\n\nlet mmkv: any;\n\ntry {\n // Handle ESM vs CJS\n const m = (MMKVModule as any)?.default ? (MMKVModule as any).default : MMKVModule;\n\n if (typeof (m as any).createMMKV === 'function') {\n // v4 API\n mmkv = (m as any).createMMKV({ id: 'eventlog-rn' });\n\n } else if (typeof (m as any).MMKV === 'function') {\n // v3 API\n mmkv = new (m as any).MMKV({ id: 'eventlog-rn' });\n\n } else if (typeof m === 'function') {\n // v2/v3 fallback (default export)\n mmkv = new (m as any)({ id: 'eventlog-rn' });\n\n } else {\n throw new Error('MMKV module found but no valid constructor (createMMKV or class MMKV) found.');\n }\n} catch (error: any) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new Error(\n `[EventLog] Failed to initialize MMKV: ${errorMessage}.`\n );\n}\n\nexport const internalStorage: StorageAdapter = {\n setItem: async (key: string, value: string): Promise<void> => {\n mmkv.set(key, value);\n },\n\n getItem: async (key: string): Promise<string | null> => {\n return mmkv.getString(key) ?? null;\n },\n\n removeItem: async (key: string): Promise<void> => {\n // v4 uses remove(), v3 uses delete()\n if (typeof mmkv.remove === 'function') {\n mmkv.remove(key);\n } else {\n mmkv.delete(key);\n }\n },\n};\n","/**\n * Main EventLog API - Functional implementation with closures\n */\n\nimport type {\n EventLog,\n EventLogConfig,\n Event,\n Session,\n EventContext,\n ExportOptions,\n LogLevel,\n Result,\n StorageAdapter,\n EventQuery,\n} from '../types';\nimport type { RingBufferState } from './buffer';\nimport {\n createEvent,\n createScreenPayload,\n createActionPayload,\n createLogPayload,\n createErrorPayload,\n incrementSeq,\n updateSessionActivity,\n createSession,\n sanitizeEvent,\n exportEventsAsJSONL,\n} from './events';\nimport {\n createRingBuffer,\n pushEvent,\n toArray as bufferToArray,\n clearBuffer,\n} from './buffer';\nimport { debounce } from './utils';\nimport { queryEvents } from './query';\nimport { enableNetworkInterception } from './network';\nimport { enableGlobalErrorLogging } from './errors';\nimport { internalStorage } from '../storage/mmkv';\n\n/**\n * Internal state (encapsulated in closure)\n */\ntype InternalState = {\n config: EventLogConfig;\n session: Session;\n buffer: RingBufferState;\n context: EventContext;\n initialized: boolean;\n};\n\n/**\n * Storage keys\n */\nconst STORAGE_KEYS = {\n SESSION: 'eventlog-rn/session',\n EVENTS: 'eventlog-rn/events',\n} as const;\n\n/**\n * Create EventLog instance (factory function with closure)\n */\nexport const createEventLog = (config: EventLogConfig = {}): EventLog => {\n // Mutable state (encapsulated in closure)\n let state: InternalState | null = null;\n let initPromise: Promise<Result<void>> | null = null;\n\n // Pre-init queue\n let preInitQueue: Array<{\n category: Parameters<typeof createEvent>[2];\n payload: unknown;\n }> = [];\n\n /**\n * Load session from storage\n */\n const loadSession = async (\n storage: StorageAdapter\n ): Promise<Session | null> => {\n try {\n const data = await storage.getItem(STORAGE_KEYS.SESSION);\n if (!data) {\n return null;\n }\n return JSON.parse(data) as Session;\n } catch {\n return null;\n }\n };\n\n /**\n * Save session to storage\n */\n const saveSession = async (\n storage: StorageAdapter,\n session: Session\n ): Promise<void> => {\n try {\n await storage.setItem(STORAGE_KEYS.SESSION, JSON.stringify(session));\n } catch (error) {\n console.warn('[EventLog] Failed to save session:', error);\n }\n };\n\n /**\n * Load events from storage\n */\n const loadEvents = async (\n storage: StorageAdapter\n ): Promise<ReadonlyArray<Event>> => {\n try {\n const data = await storage.getItem(STORAGE_KEYS.EVENTS);\n if (!data) {\n return [];\n }\n return JSON.parse(data) as ReadonlyArray<Event>;\n } catch {\n return [];\n }\n };\n\n /**\n * Save events to storage (debounced)\n */\n const saveEventsImmediate = async (\n storage: StorageAdapter,\n events: ReadonlyArray<Event>\n ): Promise<void> => {\n try {\n await storage.setItem(STORAGE_KEYS.EVENTS, JSON.stringify(events));\n } catch (error) {\n console.warn('[EventLog] Failed to save events:', error);\n }\n };\n\n const saveEvents = debounce(\n (storage: StorageAdapter, events: ReadonlyArray<Event>) => {\n saveEventsImmediate(storage, events);\n },\n config.batchWriteDelayMs ?? 100\n );\n\n /**\n * Auto-detect device info\n */\n const autoDetectDeviceInfo = (): Readonly<Record<string, unknown>> => {\n try {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const { Platform, Dimensions } = require('react-native');\n\n return {\n platform: Platform.OS,\n platformVersion: Platform.Version,\n screenWidth: Dimensions.get('window').width,\n screenHeight: Dimensions.get('window').height,\n } as const;\n } catch {\n return {} as const;\n }\n };\n\n /**\n * Initialize\n */\n const init = async (runtimeConfig?: Partial<EventLogConfig>): Promise<Result<void>> => {\n // Merge runtime config with initial config\n if (runtimeConfig) {\n Object.assign(config, runtimeConfig);\n }\n\n if (state?.initialized) {\n return { ok: true, value: undefined } as const;\n }\n\n if (initPromise) {\n return initPromise;\n }\n\n initPromise = (async (): Promise<Result<void>> => {\n try {\n\n\n // Load or create session\n const savedSession = await loadSession(internalStorage);\n const now = Date.now();\n const timeoutMs = (config.sessionTimeoutMinutes ?? 30) * 60 * 1000;\n\n const session: Session =\n savedSession && now - savedSession.lastActivityTime < timeoutMs\n ? { ...savedSession, startType: 'warm' as const }\n : createSession('cold');\n\n // Load events\n const events = await loadEvents(internalStorage);\n let buffer = createRingBuffer(config.maxEvents ?? 1000);\n\n // Filter old events and populate buffer\n const maxAge = (config.maxAgeDays ?? 7) * 24 * 60 * 60 * 1000;\n events.forEach((event) => {\n if (now - event.timestamp < maxAge) {\n buffer = pushEvent(buffer, event);\n }\n });\n\n // Auto-detect device info\n const deviceInfo = autoDetectDeviceInfo();\n\n // Initialize state\n state = {\n config,\n session,\n buffer,\n context: { deviceInfo } as const,\n initialized: true,\n };\n\n await saveSession(internalStorage, session);\n \n // Flush pre-init queue\n if (preInitQueue.length > 0) {\n\n preInitQueue.forEach(item => {\n logEvent(item.category, item.payload);\n });\n preInitQueue = [];\n }\n\n // Enable network interception (default to true if config provided, or just default enabled?)\n // User requested: \"default as network.enabled\" and \"it should be default true\"\n // Interpreting as: If features.network is present, it defaults to enabled.\n // Actually, if we want it DEFAULT ENABLED even without config, we should check that.\n // But usually libraries are opt-in. However, user said \"api log... should be default as network.enabled\".\n // And \"remove navigation features config. it should be default true\".\n // Let's make network enabled by default if the user passes `features: {}` or even no features?\n // Let's stick to: If features.network is typically passed, enabled defaults to true.\n // Actually, let's just default it to TRUE if config.features?.network is defined.\n \n // Network logging is Enabled by Default\n const networkConfig = config.features?.network ?? { enabled: true };\n \n if (networkConfig.enabled !== false) {\n const proxyConfig = { \n ...networkConfig, \n enabled: true \n }; // Ensure enabled is true for the interceptor\n\n const networkProxy = {\n log: (level: LogLevel, message: string, data?: unknown) => logEvent('log', createLogPayload(level, message, data)),\n error: (error: unknown, context?: unknown) => logEvent('error', createErrorPayload(error, context)),\n network: (payload: any) => logEvent('network', payload),\n } as unknown as EventLog;\n \n enableNetworkInterception(networkProxy, proxyConfig);\n }\n \n // Global Error Logging (Enabled by Default)\n const globalErrorsConfig = config.features?.globalErrors ?? { enabled: true };\n if (globalErrorsConfig.enabled !== false) {\n const errorProxy = {\n error: (error: unknown, context?: unknown) => logEvent('error', createErrorPayload(error, context)),\n } as unknown as EventLog;\n \n enableGlobalErrorLogging(errorProxy, { ...globalErrorsConfig, enabled: true });\n }\n \n\n\n return { ok: true, value: undefined } as const;\n } catch (error) {\n console.error('[EventLog] Initialization failed:', error);\n return {\n ok: false,\n error: error instanceof Error ? error : new Error(String(error)),\n } as const;\n }\n })();\n\n return initPromise;\n };\n\n /**\n * Check if ready\n */\n const isReady = (): boolean => {\n return state?.initialized ?? false;\n };\n\n /**\n * Log event (internal helper)\n */\n const logEvent = (\n category: Parameters<typeof createEvent>[2],\n payload: unknown\n ): Result<void> => {\n if (!state?.initialized) {\n // Queue event if not initialized\n preInitQueue.push({ category, payload });\n\n return { ok: true, value: undefined } as const;\n }\n\n try {\n // Create event\n let event = createEvent(state.session, state.context, category, payload);\n\n // Sanitize\n event = sanitizeEvent(event);\n\n // Apply custom sanitizer if provided\n if (state.config.sanitize) {\n event = state.config.sanitize(event);\n }\n\n // Update buffer\n state.buffer = pushEvent(state.buffer, event);\n\n // Update session\n state.session = incrementSeq(state.session);\n state.session = updateSessionActivity(state.session);\n\n // Save to storage (debounced)\n const events = bufferToArray(state.buffer);\n saveEvents(internalStorage, events);\n saveSession(internalStorage, state.session);\n\n\n\n return { ok: true, value: undefined } as const;\n } catch (error) {\n return {\n ok: false,\n error: error instanceof Error ? error : new Error(String(error)),\n } as const;\n }\n };\n\n /**\n * Public API\n */\n return {\n init,\n isReady,\n\n screen: (name: string, params?: unknown): Result<void> => {\n return logEvent('screen', createScreenPayload(name, params));\n },\n\n action: (name: string, data?: unknown): Result<void> => {\n return logEvent('action', createActionPayload(name, data));\n },\n\n log: (level: LogLevel, message: string, data?: unknown): Result<void> => {\n return logEvent('log', createLogPayload(level, message, data));\n },\n\n error: (error: unknown, context?: unknown): Result<void> => {\n return logEvent('error', createErrorPayload(error, context));\n },\n\n setUser: (user: Readonly<Record<string, unknown>>): void => {\n if (state) {\n state.context = { ...state.context, user } as const;\n }\n },\n\n setContext: (key: string, value: unknown): void => {\n if (state) {\n state.context = { ...state.context, [key]: value } as const;\n }\n },\n\n setDeviceInfo: (info: Readonly<Record<string, unknown>>): void => {\n if (state) {\n state.context = { ...state.context, deviceInfo: info } as const;\n }\n },\n\n export: async (options: ExportOptions): Promise<Result<string>> => {\n if (!state?.initialized) {\n return {\n ok: false,\n error: new Error('[EventLog] Not initialized'),\n } as const;\n }\n\n try {\n // Flush pending writes\n const events = bufferToArray(state.buffer);\n await saveEventsImmediate(internalStorage, events);\n\n\n\n const jsonl = exportEventsAsJSONL(events, options.mode);\n return { ok: true, value: jsonl } as const;\n } catch (error) {\n return {\n ok: false,\n error: error instanceof Error ? error : new Error(String(error)),\n } as const;\n }\n },\n\n clear: async (): Promise<Result<void>> => {\n if (!state?.initialized) {\n return {\n ok: false,\n error: new Error('[EventLog] Not initialized'),\n } as const;\n }\n\n try {\n state.buffer = clearBuffer(state.buffer);\n state.context = {} as const;\n\n await internalStorage.removeItem(STORAGE_KEYS.EVENTS);\n\n return { ok: true, value: undefined } as const;\n } catch (error) {\n return {\n ok: false,\n error: error instanceof Error ? error : new Error(String(error)),\n } as const;\n }\n },\n\n getEvents: (): Result<ReadonlyArray<Event>> => {\n if (!state?.initialized) {\n return {\n ok: false,\n error: new Error('[EventLog] Not initialized'),\n } as const;\n }\n\n const events = bufferToArray(state.buffer);\n return { ok: true, value: events } as const;\n },\n\n query: (query: EventQuery): Result<ReadonlyArray<Event>> => {\n if (!state?.initialized) {\n return {\n ok: false,\n error: new Error('[EventLog] Not initialized'),\n } as const;\n }\n\n try {\n const events = bufferToArray(state.buffer);\n const filtered = queryEvents(events, query);\n return { ok: true, value: filtered } as const;\n } catch (error) {\n return {\n ok: false,\n error: error instanceof Error ? error : new Error(String(error)),\n } as const;\n }\n },\n\n network: (payload: any): Result<void> => {\n return logEvent('network', payload);\n },\n } as const;\n};\n","/**\n * Shared styles for viewer components\n */\n\nimport { StyleSheet } from 'react-native';\n\nexport const colors = {\n background: '#f9fafb',\n surface: '#fff',\n border: '#e5e7eb',\n text: {\n primary: '#111827',\n secondary: '#6b7280',\n tertiary: '#9ca3af',\n },\n primary: '#3b82f6',\n} as const;\n\nexport const styles = StyleSheet.create({\n container: {\n flex: 1,\n backgroundColor: colors.background,\n },\n header: {\n flexDirection: 'row',\n justifyContent: 'space-between',\n alignItems: 'center',\n padding: 16,\n backgroundColor: colors.surface,\n borderBottomWidth: 1,\n borderBottomColor: colors.border,\n },\n title: {\n fontSize: 18,\n fontWeight: '600',\n color: colors.text.primary,\n },\n headerButtons: {\n flexDirection: 'row',\n gap: 8,\n },\n button: {\n paddingHorizontal: 12,\n paddingVertical: 6,\n backgroundColor: colors.primary,\n borderRadius: 6,\n },\n buttonText: {\n color: '#fff',\n fontSize: 14,\n fontWeight: '500',\n },\n searchInput: {\n margin: 16,\n marginBottom: 8,\n padding: 12,\n backgroundColor: colors.surface,\n borderRadius: 8,\n borderWidth: 1,\n borderColor: colors.border,\n fontSize: 14,\n color: colors.text.primary,\n },\n filters: {\n paddingHorizontal: 16,\n paddingBottom: 12,\n maxHeight: 50,\n },\n filterChip: {\n paddingHorizontal: 12,\n paddingVertical: 6,\n borderRadius: 16,\n marginRight: 8,\n justifyContent: 'center',\n alignItems: 'center',\n },\n filterText: {\n fontSize: 12,\n fontWeight: '500',\n textAlign: 'center',\n textAlignVertical: 'center', // Android\n },\n eventList: {\n flex: 1,\n },\n eventItem: {\n backgroundColor: colors.surface,\n marginHorizontal: 16,\n marginBottom: 8,\n padding: 12,\n borderRadius: 8,\n borderWidth: 1,\n borderColor: colors.border,\n },\n eventHeader: {\n flexDirection: 'row',\n justifyContent: 'space-between',\n alignItems: 'center',\n marginBottom: 8,\n },\n categoryBadge: {\n paddingHorizontal: 8,\n paddingVertical: 4,\n borderRadius: 4,\n justifyContent: 'center',\n alignItems: 'center',\n },\n categoryText: {\n color: '#fff',\n fontSize: 12,\n fontWeight: '600',\n textTransform: 'uppercase',\n textAlign: 'center',\n textAlignVertical: 'center', // Android specific\n },\n timestamp: {\n fontSize: 12,\n color: colors.text.secondary,\n },\n eventSummary: {\n fontSize: 14,\n color: colors.text.secondary,\n fontFamily: 'monospace',\n },\n eventDetails: {\n marginTop: 12,\n paddingTop: 12,\n borderTopWidth: 1,\n borderTopColor: colors.border,\n },\n detailsLabel: {\n fontSize: 12,\n fontWeight: '600',\n color: colors.text.secondary,\n marginTop: 8,\n marginBottom: 4,\n },\n detailsText: {\n fontSize: 12,\n color: colors.text.secondary,\n fontFamily: 'monospace',\n },\n emptyState: {\n padding: 32,\n alignItems: 'center',\n },\n emptyText: {\n fontSize: 14,\n color: colors.text.tertiary,\n },\n});\n","/**\n * Header component\n */\n\nimport React from 'react';\nimport { View, Text, TouchableOpacity } from 'react-native';\nimport type { HeaderProps } from './types';\nimport { styles } from './styles';\n\nexport const Header: React.FC<HeaderProps> = ({ eventCount, onExport, onClear }) => {\n return (\n <View style={styles.header}>\n <Text style={styles.title}>Event Log ({eventCount})</Text>\n <View style={styles.headerButtons}>\n <TouchableOpacity onPress={onExport} style={styles.button}>\n <Text style={styles.buttonText}>Export</Text>\n </TouchableOpacity>\n <TouchableOpacity onPress={onClear} style={styles.button}>\n <Text style={styles.buttonText}>Clear</Text>\n </TouchableOpacity>\n </View>\n </View>\n );\n};\n","/**\n * SearchBar component\n */\n\nimport React from 'react';\nimport { TextInput } from 'react-native';\nimport type { SearchBarProps } from './types';\nimport { styles, colors } from './styles';\n\nexport const SearchBar: React.FC<SearchBarProps> = ({ value, onChange }) => {\n return (\n <TextInput\n style={styles.searchInput}\n placeholder=\"Search events...\"\n value={value}\n onChangeText={onChange}\n placeholderTextColor={colors.text.tertiary}\n />\n );\n};\n","/**\n * Type definitions for viewer components\n */\n\nimport type { Event, EventCategory } from '../types';\n\nexport type EventLogViewerProps = {\n readonly maxEvents?: number;\n};\n\nexport type EventListProps = {\n readonly events: ReadonlyArray<Event>;\n readonly onEventPress: (eventId: string) => void;\n readonly expandedId: string | null;\n};\n\nexport type EventItemProps = {\n readonly event: Event;\n readonly expanded: boolean;\n readonly onPress: () => void;\n};\n\nexport type FilterChipProps = {\n readonly category: EventCategory;\n readonly selected: boolean;\n readonly onToggle: () => void;\n};\n\nexport type HeaderProps = {\n readonly eventCount: number;\n readonly onExport: () => void;\n readonly onClear: () => void;\n};\n\nexport type SearchBarProps = {\n readonly value: string;\n readonly onChange: (text: string) => void;\n};\n\nexport type FilterBarProps = {\n readonly selected: ReadonlyArray<EventCategory>;\n readonly onToggle: (category: EventCategory) => void;\n};\n\nexport const CATEGORY_COLORS: Readonly<Record<EventCategory, string>> = {\n screen: '#3b82f6',\n action: '#10b981',\n network: '#f59e0b',\n error: '#ef4444',\n log: '#6b7280',\n} as const;\n\nexport const ALL_CATEGORIES: ReadonlyArray<EventCategory> = [\n 'screen',\n 'action',\n 'network',\n 'error',\n 'log',\n] as const;\n","/**\n * FilterChip component\n */\n\nimport React from 'react';\nimport { TouchableOpacity, Text } from 'react-native';\nimport type { FilterChipProps } from './types';\nimport { CATEGORY_COLORS } from './types';\nimport { styles, colors } from './styles';\n\nexport const FilterChip: React.FC<FilterChipProps> = ({ category, selected, onToggle }) => {\n return (\n <TouchableOpacity\n onPress={onToggle}\n style={[\n styles.filterChip,\n {\n backgroundColor: selected ? CATEGORY_COLORS[category] : colors.border,\n },\n ]}\n >\n <Text\n style={[\n styles.filterText,\n { color: selected ? '#fff' : colors.text.secondary },\n ]}\n >\n {category}\n </Text>\n </TouchableOpacity>\n );\n};\n","/**\n * FilterBar component\n */\n\nimport React from 'react';\nimport { ScrollView } from 'react-native';\nimport type { FilterBarProps } from './types';\nimport { ALL_CATEGORIES } from './types';\nimport { FilterChip } from './FilterChip';\nimport { styles } from './styles';\n\nexport const FilterBar: React.FC<FilterBarProps> = ({ selected, onToggle }) => {\n return (\n <ScrollView horizontal style={styles.filters} showsHorizontalScrollIndicator={false}>\n {ALL_CATEGORIES.map((category) => (\n <FilterChip\n key={category}\n category={category}\n selected={selected.includes(category)}\n onToggle={() => onToggle(category)}\n />\n ))}\n </ScrollView>\n );\n};\n","/**\n * EventItem component\n */\n\nimport React from 'react';\nimport { View, Text, TouchableOpacity } from 'react-native';\nimport type { EventItemProps } from './types';\nimport { CATEGORY_COLORS } from './types';\nimport { styles } from './styles';\n\nexport const EventItem: React.FC<EventItemProps> = ({ event, expanded, onPress }) => {\n return (\n <TouchableOpacity onPress={onPress} style={styles.eventItem}>\n {/* Event Header */}\n <View style={styles.eventHeader}>\n <View\n style={[\n styles.categoryBadge,\n { backgroundColor: CATEGORY_COLORS[event.category] },\n ]}\n >\n <Text style={styles.categoryText}>{event.category}</Text>\n </View>\n <Text style={styles.timestamp}>\n {new Date(event.timestamp).toLocaleTimeString()}\n </Text>\n </View>\n\n {/* Event Summary */}\n <Text style={styles.eventSummary} numberOfLines={expanded ? undefined : 1}>\n {JSON.stringify(event.payload)}\n </Text>\n\n {/* Expanded Details */}\n {expanded && (\n <View style={styles.eventDetails}>\n <Text style={styles.detailsLabel}>Session:</Text>\n <Text style={styles.detailsText}>{event.sessionId}</Text>\n\n <Text style={styles.detailsLabel}>Sequence:</Text>\n <Text style={styles.detailsText}>{event.seq}</Text>\n\n <Text style={styles.detailsLabel}>Timezone:</Text>\n <Text style={styles.detailsText}>{event.timezone}</Text>\n\n {event.context && Object.keys(event.context).length > 0 && (\n <>\n <Text style={styles.detailsLabel}>Context:</Text>\n <Text style={styles.detailsText}>\n {JSON.stringify(event.context, null, 2)}\n </Text>\n </>\n )}\n\n <Text style={styles.detailsLabel}>Full Event:</Text>\n <Text style={styles.detailsText}>\n {JSON.stringify(event, null, 2)}\n </Text>\n </View>\n )}\n </TouchableOpacity>\n );\n};\n","/**\n * EventList component\n */\n\nimport React from 'react';\nimport { FlatList, View, Text } from 'react-native';\nimport type { EventListProps } from './types';\nimport { EventItem } from './EventItem';\nimport { styles } from './styles';\nimport type { Event } from '../types';\n\nexport const EventList: React.FC<EventListProps> = ({ events, onEventPress, expandedId }) => {\n const renderItem = ({ item }: { item: Event }) => (\n <EventItem\n event={item}\n expanded={expandedId === item.eventId}\n onPress={() => onEventPress(item.eventId)}\n />\n );\n\n const keyExtractor = (item: Event) => item.eventId;\n\n const renderEmpty = () => (\n <View style={styles.emptyState}>\n <Text style={styles.emptyText}>No events</Text>\n </View>\n );\n\n return (\n <FlatList\n data={events}\n renderItem={renderItem}\n keyExtractor={keyExtractor}\n ListEmptyComponent={renderEmpty}\n style={styles.eventList}\n initialNumToRender={20}\n maxToRenderPerBatch={10}\n windowSize={5}\n />\n );\n};\n","/**\n * Custom hooks for EventLogViewer\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport type { Event, EventCategory, EventLog } from '../types';\n\nexport const useEvents = (eventLog: EventLog, maxEvents: number) => {\n const [events, setEvents] = useState<ReadonlyArray<Event>>([]);\n\n const fetchEvents = useCallback(() => {\n const result = eventLog.getEvents();\n if (result.ok) {\n setEvents(result.value.slice(-maxEvents));\n }\n }, [eventLog, maxEvents]);\n\n useEffect(() => {\n // Fetch once on mount\n fetchEvents();\n }, [fetchEvents]);\n\n return { events, refetch: fetchEvents };\n};\n\nexport const useEventFilter = (events: ReadonlyArray<Event>) => {\n const [filter, setFilter] = useState<ReadonlyArray<EventCategory>>([]);\n const [search, setSearch] = useState('');\n\n const toggleFilter = useCallback((category: EventCategory): void => {\n setFilter((prev) =>\n prev.includes(category)\n ? prev.filter((c) => c !== category)\n : [...prev, category]\n );\n }, []);\n\n const filteredEvents = events.filter((event) => {\n if (filter.length > 0 && !filter.includes(event.category)) {\n return false;\n }\n if (search) {\n const searchLower = search.toLowerCase();\n const payloadStr = JSON.stringify(event.payload).toLowerCase();\n return payloadStr.includes(searchLower);\n }\n return true;\n });\n\n return {\n filter,\n search,\n setSearch,\n toggleFilter,\n filteredEvents,\n };\n};\n\nexport const useEventActions = (eventLog: EventLog, onClear?: () => void) => {\n const handleClear = useCallback(async (): Promise<void> => {\n await eventLog.clear();\n // Refetch after clearing\n if (onClear) {\n onClear();\n }\n }, [eventLog, onClear]);\n\n const handleExport = useCallback(async (): Promise<void> => {\n const result = await eventLog.export({ mode: 'full' });\n if (result.ok) {\n console.log('=== EXPORTED LOGS ===');\n console.log(result.value);\n console.log('=== END LOGS ===');\n }\n }, [eventLog]);\n\n return { handleClear, handleExport };\n};\n","/**\n * Singleton instance of EventLog\n * Moved here to avoid circular dependencies\n */\nimport { createEventLog } from './core/eventlog';\n\nexport const eventLog = createEventLog();\n","/**\n * EventLogViewer - Main component\n * \n * Clean, modular architecture with proper separation of concerns\n */\n\nimport React, { useState } from 'react';\nimport { View } from 'react-native';\nimport type { EventLogViewerProps } from './types';\nimport { Header } from './Header';\nimport { SearchBar } from './SearchBar';\nimport { FilterBar } from './FilterBar';\nimport { EventList } from './EventList';\nimport { useEvents, useEventFilter, useEventActions } from './hooks';\nimport { styles } from './styles';\nimport { eventLog as globalEventLog } from '../instance';\n\nexport const EventLogViewer: React.FC<EventLogViewerProps> = ({\n maxEvents = 100,\n}) => {\n const [expandedId, setExpandedId] = useState<string | null>(null);\n\n // Custom hooks for state management\n const { events, refetch } = useEvents(globalEventLog, maxEvents);\n const { filter, search, setSearch, toggleFilter, filteredEvents } = useEventFilter(events);\n const { handleClear, handleExport } = useEventActions(globalEventLog, refetch);\n\n const handleEventPress = (eventId: string): void => {\n setExpandedId(expandedId === eventId ? null : eventId);\n };\n\n return (\n <View style={styles.container}>\n <Header\n eventCount={filteredEvents.length}\n onExport={handleExport}\n onClear={handleClear}\n />\n <SearchBar value={search} onChange={setSearch} />\n <FilterBar selected={filter} onToggle={toggleFilter} />\n <EventList\n events={filteredEvents}\n onEventPress={handleEventPress}\n expandedId={expandedId}\n />\n </View>\n );\n};\n","import React, { Component, ReactNode, ErrorInfo } from 'react';\nimport { View, Text, StyleSheet, TouchableOpacity } from 'react-native';\nimport { eventLog } from '../instance'; // Use singleton\n\nexport type EventLogErrorBoundaryProps = {\n children: ReactNode;\n fallback?: ReactNode;\n onError?: (error: Error, info: ErrorInfo) => void;\n};\n\ntype State = {\n hasError: boolean;\n error: Error | null;\n};\n\n/**\n * EventLog Error Boundary\n * \n * Catches React render errors in its child component tree.\n * Automatically logs them to the EventLog.\n */\nexport class EventLogErrorBoundary extends Component<EventLogErrorBoundaryProps, State> {\n constructor(props: EventLogErrorBoundaryProps) {\n super(props);\n this.state = { hasError: false, error: null };\n }\n\n static getDerivedStateFromError(error: Error): State {\n return { hasError: true, error };\n }\n\n override componentDidCatch(error: Error, info: ErrorInfo) {\n // 1. Log to EventLog\n eventLog.error(error, { \n origin: 'react_error_boundary',\n componentStack: info.componentStack \n });\n\n // 2. Call custom handler if provided\n if (this.props.onError) {\n this.props.onError(error, info);\n }\n }\n\n resetError = () => {\n this.setState({ hasError: false, error: null });\n };\n\n override render() {\n if (this.state.hasError) {\n if (this.props.fallback) {\n return this.props.fallback;\n }\n\n // Default fallback UI\n return (\n <View style={styles.content}>\n <Text style={styles.title}>Something went wrong</Text>\n <Text style={styles.message}>\n {this.state.error?.message || 'An unexpected error occurred.'}\n </Text>\n <TouchableOpacity style={styles.button} onPress={this.resetError}>\n <Text style={styles.buttonText}>Try Again</Text>\n </TouchableOpacity>\n </View>\n );\n }\n\n return this.props.children;\n }\n}\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n backgroundColor: '#fff',\n justifyContent: 'center',\n alignItems: 'center',\n },\n content: {\n padding: 20,\n flex: 1,\n backgroundColor: '#fff',\n justifyContent: 'center',\n alignItems: 'center',\n },\n title: {\n fontSize: 20,\n fontWeight: 'bold',\n marginBottom: 10,\n color: '#333',\n },\n message: {\n fontSize: 14,\n color: '#666',\n textAlign: 'center',\n marginBottom: 20,\n },\n button: {\n backgroundColor: '#3b82f6',\n paddingHorizontal: 20,\n paddingVertical: 10,\n borderRadius: 8,\n },\n buttonText: {\n color: '#fff',\n fontWeight: '600',\n },\n});\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/core/utils.ts","../src/core/events.ts","../src/core/buffer.ts","../src/core/query.ts","../src/core/network.ts","../src/core/errors.ts","../src/storage/mmkv.ts","../src/core/eventlog.ts","../src/viewer/styles.ts","../src/viewer/Header.tsx","../src/viewer/SearchBar.tsx","../src/viewer/types.ts","../src/viewer/FilterChip.tsx","../src/viewer/FilterBar.tsx","../src/viewer/EventItem.tsx","../src/viewer/EventList.tsx","../src/viewer/hooks.ts","../src/instance.ts","../src/viewer/EventLogViewer.tsx","../src/components/EventLogErrorBoundary.tsx"],"names":["eventLog","MMKVModule","StyleSheet","React","View","Text","TouchableOpacity","TextInput","ScrollView","FlatList","useState","useCallback","useEffect","Component","styles"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Pure utility functions\n */\n\n/**\n * Generate a UUID v4\n */\nexport const generateUUID = (): 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 * Get current timestamp in milliseconds\n */\nexport const getTimestamp = (): number => Date.now();\n\n/**\n * Get ISO 8601 timestamp with timezone\n */\nexport const getTimestampISO = (): string => new Date().toISOString();\n\n/**\n * Get IANA timezone identifier\n */\nexport const getTimezone = (): string => {\n try {\n return Intl.DateTimeFormat().resolvedOptions().timeZone;\n } catch {\n return 'UTC';\n }\n};\n\n/**\n * Debounce function (returns a new function, pure in concept)\n */\nexport const debounce = <T extends ReadonlyArray<unknown>>(\n func: (...args: T) => void,\n wait: number\n): ((...args: T) => void) => {\n let timeout: ReturnType<typeof setTimeout> | null = null;\n\n return (...args: T): void => {\n if (timeout !== null) {\n clearTimeout(timeout);\n }\n timeout = setTimeout(() => {\n func(...args);\n }, wait);\n };\n};\n","/**\n * Pure event creation functions\n */\n\nimport type {\n Event,\n EventCategory,\n EventContext,\n Session,\n LogLevel,\n ErrorEventPayload,\n} from '../types';\nimport { generateUUID, getTimestamp, getTimestampISO, getTimezone } from './utils';\n\n/**\n * Create an event (pure function)\n */\nexport const createEvent = (\n session: Session,\n context: EventContext,\n category: EventCategory,\n payload: unknown\n): Event => {\n return {\n eventId: generateUUID(),\n sessionId: session.sessionId,\n seq: session.seq,\n timestamp: getTimestamp(),\n timestampISO: getTimestampISO(),\n timezone: getTimezone(),\n category,\n payload,\n context,\n } as const;\n};\n\n/**\n * Create a screen event payload\n */\nexport const createScreenPayload = (\n name: string,\n params?: unknown\n): Readonly<{ name: string; params?: unknown }> => {\n return { name, params } as const;\n};\n\n/**\n * Create an action event payload\n */\nexport const createActionPayload = (\n name: string,\n data?: unknown\n): Readonly<{ name: string; data?: unknown }> => {\n return { name, data } as const;\n};\n\n/**\n * Create a log event payload\n */\nexport const createLogPayload = (\n level: LogLevel,\n message: string,\n data?: unknown\n): Readonly<{ level: LogLevel; message: string; data?: unknown }> => {\n return { level, message, data } as const;\n};\n\n/**\n * Create an error event payload\n */\nexport const createErrorPayload = (\n error: unknown,\n context?: unknown\n): ErrorEventPayload => {\n const err = error as { message?: string; stack?: string };\n const payload: ErrorEventPayload = {\n message: err.message ?? String(error),\n ...(err.stack !== undefined && { stack: err.stack }),\n ...(context !== undefined && { context }),\n };\n return payload;\n};\n\n/**\n * Increment session sequence number (pure function, returns new session)\n */\nexport const incrementSeq = (session: Session): Session => {\n return {\n ...session,\n seq: session.seq + 1,\n } as const;\n};\n\n/**\n * Update session activity time (pure function, returns new session)\n */\nexport const updateSessionActivity = (session: Session): Session => {\n return {\n ...session,\n lastActivityTime: getTimestamp(),\n } as const;\n};\n\n/**\n * Check if session has expired\n */\nexport const isSessionExpired = (\n session: Session,\n timeoutMs: number\n): boolean => {\n const now = getTimestamp();\n return now - session.lastActivityTime > timeoutMs;\n};\n\n/**\n * Create a new session\n */\nexport const createSession = (\n startType: 'cold' | 'warm'\n): Session => {\n const now = getTimestamp();\n return {\n sessionId: generateUUID(),\n sessionStart: now,\n startType,\n seq: 0,\n lastActivityTime: now,\n } as const;\n};\n\n/**\n * Sanitize event (pure function)\n */\nconst SENSITIVE_KEYS = [\n 'password',\n 'token',\n 'authorization',\n 'secret',\n 'apiKey',\n 'api_key',\n 'accessToken',\n 'access_token',\n 'refreshToken',\n 'refresh_token',\n] as const;\n\nconst MAX_DEPTH = 10;\nconst MAX_SIZE = 100 * 1024; // 100KB\n\nconst isSensitiveKey = (key: string): boolean => {\n const lowerKey = key.toLowerCase();\n return SENSITIVE_KEYS.some((sensitive) => lowerKey.includes(sensitive));\n};\n\nconst sanitizeValue = (value: unknown, depth: number): unknown => {\n if (depth > MAX_DEPTH) {\n return { _maxDepthExceeded: true } as const;\n }\n\n if (value === null || value === undefined) {\n return value;\n }\n\n if (typeof value !== 'object') {\n return value;\n }\n\n if (Array.isArray(value)) {\n return value.map((item) => sanitizeValue(item, depth + 1));\n }\n\n const sanitized: Record<string, unknown> = {};\n for (const key in value) {\n if (Object.prototype.hasOwnProperty.call(value, key)) {\n const val = (value as Record<string, unknown>)[key];\n sanitized[key] = isSensitiveKey(key)\n ? '***REDACTED***'\n : sanitizeValue(val, depth + 1);\n }\n }\n\n return sanitized;\n};\n\nexport const sanitizeEvent = (event: Event): Event => {\n const sanitizedPayload = sanitizeValue(event.payload, 0);\n const sanitizedContext = sanitizeValue(event.context, 0) as EventContext;\n\n // Check size\n const size = JSON.stringify(event).length;\n if (size > MAX_SIZE) {\n return {\n ...event,\n payload: { _truncated: true, _originalSize: size },\n context: event.context,\n };\n }\n\n return {\n ...event,\n payload: sanitizedPayload,\n context: sanitizedContext,\n };\n};\n\n/**\n * Export events as JSONL (pure function)\n */\nexport const exportEventsAsJSONL = (\n events: ReadonlyArray<Event>,\n mode: 'repro' | 'full'\n): string => {\n const filtered = mode === 'repro' ? getReproEvents(events) : events;\n return filtered.map((event) => JSON.stringify(event)).join('\\n');\n};\n\n/**\n * Get events for repro mode (pure function)\n */\nconst getReproEvents = (events: ReadonlyArray<Event>): ReadonlyArray<Event> => {\n if (events.length === 0) {\n return [];\n }\n\n const lastEvent = events[events.length - 1];\n if (lastEvent === undefined) {\n return [];\n }\n\n const currentSessionId: string = lastEvent.sessionId;\n\n // Get all unique session IDs\n const sessionIds = Array.from(new Set(events.map((e) => e.sessionId)));\n const currentSessionIndex = sessionIds.indexOf(currentSessionId);\n const previousSessionId: string | null =\n currentSessionIndex > 0 ? sessionIds[currentSessionIndex - 1] ?? null : null;\n\n // Get errors\n const errors = events.filter((e) => e.category === 'error').slice(-10);\n\n // Get events from current and previous session\n const sessionEvents = events.filter(\n (e) => e.sessionId === currentSessionId || e.sessionId === previousSessionId\n );\n\n // Combine and deduplicate\n const combined = [...sessionEvents];\n errors.forEach((error) => {\n if (!combined.find((e) => e.eventId === error.eventId)) {\n combined.push(error);\n }\n });\n\n // Sort by timestamp\n return combined.sort((a, b) => a.timestamp - b.timestamp);\n};\n","/**\n * Functional ring buffer implementation\n */\n\nimport type { Event } from '../types';\n\n/**\n * Ring buffer state (immutable)\n */\nexport type RingBufferState = Readonly<{\n readonly buffer: ReadonlyArray<Event | undefined>;\n readonly writeIndex: number;\n readonly size: number;\n readonly maxSize: number;\n}>;\n\n/**\n * Create a new ring buffer\n */\nexport const createRingBuffer = (maxSize: number): RingBufferState => {\n return {\n buffer: new Array(maxSize).fill(undefined),\n writeIndex: 0,\n size: 0,\n maxSize,\n } as const;\n};\n\n/**\n * Add event to buffer (pure function, returns new state)\n */\nexport const pushEvent = (\n state: RingBufferState,\n event: Event\n): RingBufferState => {\n const newBuffer = [...state.buffer];\n newBuffer[state.writeIndex] = event;\n\n return {\n ...state,\n buffer: newBuffer,\n writeIndex: (state.writeIndex + 1) % state.maxSize,\n size: Math.min(state.size + 1, state.maxSize),\n } as const;\n};\n\n/**\n * Get all events in chronological order (pure function)\n */\nexport const toArray = (state: RingBufferState): ReadonlyArray<Event> => {\n if (state.size < state.maxSize) {\n return state.buffer.slice(0, state.size).filter((e): e is Event => e !== undefined);\n }\n\n const afterWrite = state.buffer.slice(state.writeIndex);\n const beforeWrite = state.buffer.slice(0, state.writeIndex);\n \n return [...afterWrite, ...beforeWrite].filter((e): e is Event => e !== undefined);\n};\n\n/**\n * Clear buffer (pure function, returns new state)\n */\nexport const clearBuffer = (state: RingBufferState): RingBufferState => {\n return createRingBuffer(state.maxSize);\n};\n","/**\n * Query events by filters\n */\n\nimport type { Event, EventQuery } from '../types';\n\nexport const queryEvents = (\n events: ReadonlyArray<Event>,\n query: EventQuery\n): ReadonlyArray<Event> => {\n let filtered = events;\n\n // Filter by category\n if (query.category && query.category.length > 0) {\n filtered = filtered.filter((e) => {\n const categories = query.category;\n return categories ? categories.includes(e.category) : true;\n });\n }\n\n // Filter by time range\n if (query.timeRange) {\n filtered = filtered.filter(\n (e) =>\n e.timestamp >= query.timeRange!.start &&\n e.timestamp <= query.timeRange!.end\n );\n }\n\n // Filter by session ID\n if (query.sessionId) {\n filtered = filtered.filter((e) => e.sessionId === query.sessionId);\n }\n\n // Search in payload\n if (query.search) {\n const searchLower = query.search.toLowerCase();\n filtered = filtered.filter((e) => {\n const payloadStr = JSON.stringify(e.payload).toLowerCase();\n return payloadStr.includes(searchLower);\n });\n }\n\n // Limit results\n if (query.limit && query.limit > 0) {\n filtered = filtered.slice(-query.limit);\n }\n\n return filtered;\n};\n","/**\n * Network interception logic (Fetch & XHR)\n */\n\nimport type { EventLog, FeatureConfig, NetworkEventPayload } from '../types';\n\ntype NetworkConfig = NonNullable<FeatureConfig['network']>;\n\n// Keep original globals\nconst originalFetch = global.fetch;\nconst originalXMLHttpRequest = global.XMLHttpRequest;\n\n/**\n * Intercept Fetch API\n */\nconst interceptFetch = (eventLog: EventLog, config: NetworkConfig) => {\n if (!config.interceptFetch) return;\n\n global.fetch = async (input: RequestInfo | URL, init?: RequestInit) => {\n const startTime = Date.now();\n const url = typeof input === 'string' ? input : input instanceof URL ? input.toString() : input.url;\n const method = (init?.method ?? 'GET').toUpperCase();\n\n try {\n const response = await originalFetch(input, init);\n const endTime = Date.now();\n const duration = endTime - startTime;\n\n // Clone response to read body without consuming original stream\n const clone = response.clone();\n \n let responseBody: unknown;\n if (config.logResponseBody) {\n try {\n // Text first to check size/parse JSON\n const text = await clone.text();\n if (!config.maxBodySize || text.length <= config.maxBodySize) {\n try {\n responseBody = JSON.parse(text);\n } catch {\n responseBody = text;\n }\n } else {\n responseBody = `[Body too large: ${text.length} bytes]`;\n }\n } catch {\n responseBody = '[Failed to read response body]';\n }\n }\n\n const payload: NetworkEventPayload = {\n url,\n method,\n status: response.status,\n duration,\n responseHeaders: config.redactHeaders ? redactHeaders(response.headers, config.redactHeaders) : headersToObject(response.headers),\n responseBody,\n };\n\n eventLog.network(payload);\n \n return response;\n } catch (error) {\n const endTime = Date.now();\n eventLog.error(error, {\n url,\n method,\n duration: endTime - startTime,\n category: 'network', // Context hack\n });\n throw error;\n }\n };\n};\n\n/**\n * Intercept XMLHttpRequest\n */\nconst interceptXHR = (eventLog: EventLog, config: NetworkConfig) => {\n // If explicitly disabled, return. Undefined means enabled by default.\n if (config.interceptAxios === false) return;\n\n const XHR = originalXMLHttpRequest;\n \n // @ts-ignore - Monkey patching\n global.XMLHttpRequest = function() {\n const xhr = new XHR();\n const startTime = Date.now();\n let method = 'GET';\n let url = '';\n\n const originalOpen = xhr.open;\n const originalSend = xhr.send;\n\n xhr.open = function(m: string, u: string, ...args: any[]) {\n method = m.toUpperCase();\n url = u;\n return originalOpen.apply(this, [m, u, ...args] as any);\n };\n\n xhr.send = function(body?: any) {\n xhr.addEventListener('loadend', () => {\n const duration = Date.now() - startTime;\n \n // Extract headers (messy in XHR)\n const responseHeadersString = xhr.getAllResponseHeaders();\n const responseHeaders = parseXHRHeaders(responseHeadersString);\n\n let responseBody: unknown;\n if (config.logResponseBody) {\n try {\n if (xhr.responseType === '' || xhr.responseType === 'text') {\n responseBody = xhr.responseText;\n if (responseBody && typeof responseBody === 'string' && (!config.maxBodySize || responseBody.length <= config.maxBodySize)) {\n try { responseBody = JSON.parse(responseBody); } catch {}\n }\n }\n } catch {}\n }\n\n const payload: NetworkEventPayload = {\n url,\n method,\n status: xhr.status,\n duration,\n responseHeaders: config.redactHeaders ? redactHeaders(responseHeaders, config.redactHeaders) : responseHeaders as any,\n responseBody,\n };\n \n // @ts-ignore - We will add this method\n if (typeof eventLog.network === 'function') {\n // @ts-ignore\n eventLog.network(payload);\n }\n });\n return originalSend.apply(this, [body]);\n }\n\n return xhr;\n };\n \n // Restore prototype chain\n global.XMLHttpRequest.prototype = XHR.prototype;\n Object.assign(global.XMLHttpRequest, XHR);\n};\n\n/**\n * Helpers\n */\nconst headersToObject = (headers: Headers): Record<string, string> => {\n const obj: Record<string, string> = {};\n headers.forEach((value, key) => {\n obj[key] = value;\n });\n return obj;\n}\n\nconst redactHeaders = (headers: Headers | Record<string, string>, keysToRedact: ReadonlyArray<string>): Record<string, string> => {\n const obj = headers instanceof Headers ? headersToObject(headers) : headers;\n const redacted: Record<string, string> = { ...obj };\n keysToRedact.forEach(key => {\n const lowerKey = key.toLowerCase();\n // Simple case-insensitive match simulation\n Object.keys(redacted).forEach(h => {\n if (h.toLowerCase() === lowerKey) {\n redacted[h] = '***REDACTED***';\n }\n });\n });\n return redacted;\n}\n\nconst parseXHRHeaders = (headers: string): Record<string, string> => {\n if (!headers) return {};\n const result: Record<string, string> = {};\n const pairs = headers.trim().split(/[\\r\\n]+/);\n pairs.forEach(line => {\n const parts = line.split(': ');\n if (parts.length >= 2) {\n const key = parts.shift()!;\n const value = parts.join(': ');\n result[key] = value;\n }\n });\n return result;\n}\n\n/**\n * Main enable function\n */\nexport const enableNetworkInterception = (eventLog: EventLog, config: FeatureConfig['network']) => {\n if (!config || !config.enabled) return;\n \n // Cleanup first just in case\n restoreNetworkInterception();\n\n if (config.interceptFetch !== false) {\n interceptFetch(eventLog, config);\n }\n // Default to true for XHR if not specified, or checks interceptAxios\n if (config.interceptAxios !== false) {\n interceptXHR(eventLog, config);\n }\n};\n\nexport const restoreNetworkInterception = () => {\n global.fetch = originalFetch;\n global.XMLHttpRequest = originalXMLHttpRequest;\n};\n","/**\n * Global Error Handlers (Fatal & Promise Rejections)\n */\n\nimport type { EventLog, FeatureConfig } from '../types';\n\ntype GlobalErrorsConfig = NonNullable<FeatureConfig['globalErrors']>;\n\n// React Native's global error handler interface\ninterface ErrorUtils {\n setGlobalHandler: (handler: (error: Error, isFatal?: boolean) => void) => void;\n getGlobalHandler: () => (error: Error, isFatal?: boolean) => void;\n}\n\ndeclare let ErrorUtils: ErrorUtils;\n\n/**\n * Enable global error tracking\n */\nexport const enableGlobalErrorLogging = (\n eventLog: EventLog,\n config: GlobalErrorsConfig\n) => {\n if (!config || config.enabled === false) return;\n\n // 1. Handle JS Fatal Errors (Reference: React Native ErrorUtils)\n try {\n // @ts-ignore - ErrorUtils is a React Native global\n if (global.ErrorUtils) {\n // @ts-ignore\n const originalHandler = global.ErrorUtils.getGlobalHandler();\n\n // @ts-ignore\n global.ErrorUtils.setGlobalHandler((error: Error, isFatal?: boolean) => {\n // Log to EventLog\n eventLog.error(error, {\n isFatal,\n origin: 'global_handler',\n timestamp: Date.now(),\n });\n\n // Delegate to original handler (Crash or LogBox)\n if (originalHandler) {\n originalHandler(error, isFatal);\n }\n });\n }\n } catch (e) {\n // Failsafe: Don't crash if ErrorUtils is strangely absent or behavior changes\n console.warn('[EventLog] Failed to setup ErrorUtils handler', e);\n }\n\n // 2. Handle Unhandled Promise Rejections\n // React Native environments typically handle this via 'tracking' packages or polyfills.\n // Modern RN versions might support 'unhandledrejection' event on global.\n // We opt for a safe, non-intrusive approach:\n // If the user wants promise rejection tracking, they usually need a specific RN version support.\n // We will add a simple listener if available.\n \n const rejectionHandler = (event: any) => {\n // Logic for web or standard JS environments\n // RN generic \"promise rejection\" handling is complex and varies by version.\n // We'll stick to ErrorUtils primarily for now as it's the RN standard for crashes.\n const reason = event?.reason;\n if (reason) {\n eventLog.error(reason, {\n origin: 'unhandled_rejection',\n isFatal: false\n });\n }\n };\n\n // Safe attach (mostly for web/hybrid - purely native RN relies on ErrorUtils for fatals)\n // @ts-ignore\n if (typeof window !== 'undefined' && window.addEventListener) {\n // @ts-ignore\n window.addEventListener('unhandledrejection', rejectionHandler);\n }\n};\n","/**\n * Internal MMKV storage adapter\n * Supports MMKV v2+ (RN 0.70+), v3 (RN 0.74+), and v4 (RN 0.75+)\n * MMKV is synchronous, but we wrap it in Promises to match StorageAdapter interface\n */\n\nimport type { StorageAdapter } from '../types';\n\n// Detect and initialize MMKV with version compatibility\nimport * as MMKVModule from 'react-native-mmkv';\n\nlet mmkv: any;\n\ntry {\n // Handle ESM vs CJS\n const m = (MMKVModule as any)?.default ? (MMKVModule as any).default : MMKVModule;\n\n if (typeof (m as any).createMMKV === 'function') {\n // v4 API\n mmkv = (m as any).createMMKV({ id: 'eventlog-rn' });\n\n } else if (typeof (m as any).MMKV === 'function') {\n // v3 API\n mmkv = new (m as any).MMKV({ id: 'eventlog-rn' });\n\n } else if (typeof m === 'function') {\n // v2/v3 fallback (default export)\n mmkv = new (m as any)({ id: 'eventlog-rn' });\n\n } else {\n throw new Error('MMKV module found but no valid constructor (createMMKV or class MMKV) found.');\n }\n} catch (error: any) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new Error(\n `[EventLog] Failed to initialize MMKV: ${errorMessage}.`\n );\n}\n\nexport const internalStorage: StorageAdapter = {\n setItem: async (key: string, value: string): Promise<void> => {\n mmkv.set(key, value);\n },\n\n getItem: async (key: string): Promise<string | null> => {\n return mmkv.getString(key) ?? null;\n },\n\n removeItem: async (key: string): Promise<void> => {\n // v4 uses remove(), v3 uses delete()\n if (typeof mmkv.remove === 'function') {\n mmkv.remove(key);\n } else {\n mmkv.delete(key);\n }\n },\n};\n","/**\n * Main EventLog API - Functional implementation with closures\n */\n\nimport type {\n EventLog,\n EventLogConfig,\n Event,\n Session,\n EventContext,\n ExportOptions,\n LogLevel,\n Result,\n StorageAdapter,\n EventQuery,\n} from '../types';\nimport type { RingBufferState } from './buffer';\nimport {\n createEvent,\n createScreenPayload,\n createActionPayload,\n createLogPayload,\n createErrorPayload,\n incrementSeq,\n updateSessionActivity,\n createSession,\n sanitizeEvent,\n exportEventsAsJSONL,\n} from './events';\nimport {\n createRingBuffer,\n pushEvent,\n toArray as bufferToArray,\n clearBuffer,\n} from './buffer';\nimport { debounce } from './utils';\nimport { queryEvents } from './query';\nimport { enableNetworkInterception } from './network';\nimport { enableGlobalErrorLogging } from './errors';\nimport { internalStorage } from '../storage/mmkv';\n\n/**\n * Internal state (encapsulated in closure)\n */\ntype InternalState = {\n config: EventLogConfig;\n session: Session;\n buffer: RingBufferState;\n context: EventContext;\n initialized: boolean;\n};\n\n/**\n * Storage keys\n */\nconst STORAGE_KEYS = {\n SESSION: 'eventlog-rn/session',\n EVENTS: 'eventlog-rn/events',\n} as const;\n\n/**\n * Create EventLog instance (factory function with closure)\n */\nexport const createEventLog = (config: EventLogConfig = {}): EventLog => {\n // Mutable state (encapsulated in closure)\n let state: InternalState | null = null;\n let initPromise: Promise<Result<void>> | null = null;\n\n // Pre-init queue\n let preInitQueue: Array<{\n category: Parameters<typeof createEvent>[2];\n payload: unknown;\n }> = [];\n\n /**\n * Load session from storage\n */\n const loadSession = async (\n storage: StorageAdapter\n ): Promise<Session | null> => {\n try {\n const data = await storage.getItem(STORAGE_KEYS.SESSION);\n if (!data) {\n return null;\n }\n return JSON.parse(data) as Session;\n } catch {\n return null;\n }\n };\n\n /**\n * Save session to storage\n */\n const saveSession = async (\n storage: StorageAdapter,\n session: Session\n ): Promise<void> => {\n try {\n await storage.setItem(STORAGE_KEYS.SESSION, JSON.stringify(session));\n } catch (error) {\n console.warn('[EventLog] Failed to save session:', error);\n }\n };\n\n /**\n * Load events from storage\n */\n const loadEvents = async (\n storage: StorageAdapter\n ): Promise<ReadonlyArray<Event>> => {\n try {\n const data = await storage.getItem(STORAGE_KEYS.EVENTS);\n if (!data) {\n return [];\n }\n return JSON.parse(data) as ReadonlyArray<Event>;\n } catch {\n return [];\n }\n };\n\n /**\n * Save events to storage (debounced)\n */\n const saveEventsImmediate = async (\n storage: StorageAdapter,\n events: ReadonlyArray<Event>\n ): Promise<void> => {\n try {\n await storage.setItem(STORAGE_KEYS.EVENTS, JSON.stringify(events));\n } catch (error) {\n console.warn('[EventLog] Failed to save events:', error);\n }\n };\n\n const saveEvents = debounce(\n (storage: StorageAdapter, events: ReadonlyArray<Event>) => {\n saveEventsImmediate(storage, events);\n },\n config.batchWriteDelayMs ?? 100\n );\n\n /**\n * Auto-detect device info\n */\n const autoDetectDeviceInfo = (): Readonly<Record<string, unknown>> => {\n try {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const { Platform, Dimensions } = require('react-native');\n\n return {\n platform: Platform.OS,\n platformVersion: Platform.Version,\n screenWidth: Dimensions.get('window').width,\n screenHeight: Dimensions.get('window').height,\n } as const;\n } catch {\n return {} as const;\n }\n };\n\n /**\n * Initialize\n */\n const init = async (runtimeConfig?: Partial<EventLogConfig>): Promise<Result<void>> => {\n // Merge runtime config with initial config\n if (runtimeConfig) {\n Object.assign(config, runtimeConfig);\n }\n\n if (state?.initialized) {\n return { ok: true, value: undefined } as const;\n }\n\n if (initPromise) {\n return initPromise;\n }\n\n initPromise = (async (): Promise<Result<void>> => {\n try {\n\n\n // Load or create session\n const savedSession = await loadSession(internalStorage);\n const now = Date.now();\n const timeoutMs = (config.sessionTimeoutMinutes ?? 30) * 60 * 1000;\n\n const session: Session =\n savedSession && now - savedSession.lastActivityTime < timeoutMs\n ? { ...savedSession, startType: 'warm' as const }\n : createSession('cold');\n\n // Load events\n const events = await loadEvents(internalStorage);\n let buffer = createRingBuffer(config.maxEvents ?? 1000);\n\n // Filter old events and populate buffer\n const maxAge = (config.maxAgeDays ?? 7) * 24 * 60 * 60 * 1000;\n events.forEach((event) => {\n if (now - event.timestamp < maxAge) {\n buffer = pushEvent(buffer, event);\n }\n });\n\n // Auto-detect device info\n const deviceInfo = autoDetectDeviceInfo();\n\n // Initialize state\n state = {\n config,\n session,\n buffer,\n context: { deviceInfo } as const,\n initialized: true,\n };\n\n await saveSession(internalStorage, session);\n \n // Flush pre-init queue\n if (preInitQueue.length > 0) {\n\n preInitQueue.forEach(item => {\n logEvent(item.category, item.payload);\n });\n preInitQueue = [];\n }\n\n // Enable network interception (default to true if config provided, or just default enabled?)\n // User requested: \"default as network.enabled\" and \"it should be default true\"\n // Interpreting as: If features.network is present, it defaults to enabled.\n // Actually, if we want it DEFAULT ENABLED even without config, we should check that.\n // But usually libraries are opt-in. However, user said \"api log... should be default as network.enabled\".\n // And \"remove navigation features config. it should be default true\".\n // Let's make network enabled by default if the user passes `features: {}` or even no features?\n // Let's stick to: If features.network is typically passed, enabled defaults to true.\n // Actually, let's just default it to TRUE if config.features?.network is defined.\n \n // Network logging is Enabled by Default\n const networkConfig = config.features?.network ?? { enabled: true };\n \n if (networkConfig.enabled !== false) {\n const proxyConfig = { \n ...networkConfig, \n enabled: true \n }; // Ensure enabled is true for the interceptor\n\n const networkProxy = {\n log: (level: LogLevel, message: string, data?: unknown) => logEvent('log', createLogPayload(level, message, data)),\n error: (error: unknown, context?: unknown) => logEvent('error', createErrorPayload(error, context)),\n network: (payload: any) => logEvent('network', payload),\n } as unknown as EventLog;\n \n enableNetworkInterception(networkProxy, proxyConfig);\n }\n \n // Global Error Logging (Enabled by Default)\n const globalErrorsConfig = config.features?.globalErrors ?? { enabled: true };\n if (globalErrorsConfig.enabled !== false) {\n const errorProxy = {\n error: (error: unknown, context?: unknown) => logEvent('error', createErrorPayload(error, context)),\n } as unknown as EventLog;\n \n enableGlobalErrorLogging(errorProxy, { ...globalErrorsConfig, enabled: true });\n }\n \n\n\n return { ok: true, value: undefined } as const;\n } catch (error) {\n console.error('[EventLog] Initialization failed:', error);\n return {\n ok: false,\n error: error instanceof Error ? error : new Error(String(error)),\n } as const;\n }\n })();\n\n return initPromise;\n };\n\n /**\n * Check if ready\n */\n const isReady = (): boolean => {\n return state?.initialized ?? false;\n };\n\n /**\n * Log event (internal helper)\n */\n const logEvent = (\n category: Parameters<typeof createEvent>[2],\n payload: unknown\n ): Result<void> => {\n if (!state?.initialized) {\n // Queue event if not initialized\n preInitQueue.push({ category, payload });\n\n return { ok: true, value: undefined } as const;\n }\n\n try {\n // Create event\n let event = createEvent(state.session, state.context, category, payload);\n\n // Sanitize\n event = sanitizeEvent(event);\n\n // Apply custom sanitizer if provided\n if (state.config.sanitize) {\n event = state.config.sanitize(event);\n }\n\n // Update buffer\n state.buffer = pushEvent(state.buffer, event);\n\n // Update session\n state.session = incrementSeq(state.session);\n state.session = updateSessionActivity(state.session);\n\n // Save to storage (debounced)\n const events = bufferToArray(state.buffer);\n saveEvents(internalStorage, events);\n saveSession(internalStorage, state.session);\n\n\n\n return { ok: true, value: undefined } as const;\n } catch (error) {\n return {\n ok: false,\n error: error instanceof Error ? error : new Error(String(error)),\n } as const;\n }\n };\n\n /**\n * Public API\n */\n return {\n init,\n isReady,\n\n screen: (name: string, params?: unknown): Result<void> => {\n return logEvent('screen', createScreenPayload(name, params));\n },\n\n action: (name: string, data?: unknown): Result<void> => {\n return logEvent('action', createActionPayload(name, data));\n },\n\n log: (level: LogLevel, message: string, data?: unknown): Result<void> => {\n return logEvent('log', createLogPayload(level, message, data));\n },\n\n error: (error: unknown, context?: unknown): Result<void> => {\n return logEvent('error', createErrorPayload(error, context));\n },\n\n setUser: (user: Readonly<Record<string, unknown>>): void => {\n if (state) {\n state.context = { ...state.context, user } as const;\n }\n },\n\n setContext: (key: string, value: unknown): void => {\n if (state) {\n state.context = { ...state.context, [key]: value } as const;\n }\n },\n\n setDeviceInfo: (info: Readonly<Record<string, unknown>>): void => {\n if (state) {\n state.context = { ...state.context, deviceInfo: info } as const;\n }\n },\n\n export: async (options: ExportOptions): Promise<Result<string>> => {\n if (!state?.initialized) {\n return {\n ok: false,\n error: new Error('[EventLog] Not initialized'),\n } as const;\n }\n\n try {\n // Flush pending writes\n const events = bufferToArray(state.buffer);\n await saveEventsImmediate(internalStorage, events);\n\n\n\n const jsonl = exportEventsAsJSONL(events, options.mode);\n return { ok: true, value: jsonl } as const;\n } catch (error) {\n return {\n ok: false,\n error: error instanceof Error ? error : new Error(String(error)),\n } as const;\n }\n },\n\n clear: async (): Promise<Result<void>> => {\n if (!state?.initialized) {\n return {\n ok: false,\n error: new Error('[EventLog] Not initialized'),\n } as const;\n }\n\n try {\n state.buffer = clearBuffer(state.buffer);\n state.context = {} as const;\n\n await internalStorage.removeItem(STORAGE_KEYS.EVENTS);\n\n return { ok: true, value: undefined } as const;\n } catch (error) {\n return {\n ok: false,\n error: error instanceof Error ? error : new Error(String(error)),\n } as const;\n }\n },\n\n getEvents: (): Result<ReadonlyArray<Event>> => {\n if (!state?.initialized) {\n return {\n ok: false,\n error: new Error('[EventLog] Not initialized'),\n } as const;\n }\n\n const events = bufferToArray(state.buffer);\n return { ok: true, value: events } as const;\n },\n\n query: (query: EventQuery): Result<ReadonlyArray<Event>> => {\n if (!state?.initialized) {\n return {\n ok: false,\n error: new Error('[EventLog] Not initialized'),\n } as const;\n }\n\n try {\n const events = bufferToArray(state.buffer);\n const filtered = queryEvents(events, query);\n return { ok: true, value: filtered } as const;\n } catch (error) {\n return {\n ok: false,\n error: error instanceof Error ? error : new Error(String(error)),\n } as const;\n }\n },\n\n network: (payload: any): Result<void> => {\n return logEvent('network', payload);\n },\n } as const;\n};\n","/**\n * Shared styles for viewer components\n */\n\nimport { StyleSheet } from 'react-native';\n\nexport const colors = {\n background: '#f9fafb',\n surface: '#fff',\n border: '#e5e7eb',\n text: {\n primary: '#111827',\n secondary: '#6b7280',\n tertiary: '#9ca3af',\n },\n primary: '#3b82f6',\n} as const;\n\nexport const styles = StyleSheet.create({\n container: {\n flex: 1,\n backgroundColor: colors.background,\n },\n header: {\n flexDirection: 'row',\n justifyContent: 'space-between',\n alignItems: 'center',\n padding: 16,\n backgroundColor: colors.surface,\n borderBottomWidth: 1,\n borderBottomColor: colors.border,\n },\n title: {\n fontSize: 18,\n fontWeight: '600',\n color: colors.text.primary,\n },\n headerButtons: {\n flexDirection: 'row',\n gap: 8,\n },\n button: {\n paddingHorizontal: 12,\n paddingVertical: 6,\n backgroundColor: colors.primary,\n borderRadius: 6,\n },\n buttonText: {\n color: '#fff',\n fontSize: 14,\n fontWeight: '500',\n },\n searchInput: {\n margin: 16,\n marginBottom: 8,\n padding: 12,\n backgroundColor: colors.surface,\n borderRadius: 8,\n borderWidth: 1,\n borderColor: colors.border,\n fontSize: 14,\n color: colors.text.primary,\n },\n filters: {\n paddingHorizontal: 16,\n paddingBottom: 12,\n maxHeight: 50,\n },\n filterChip: {\n paddingHorizontal: 12,\n paddingVertical: 6,\n borderRadius: 16,\n marginRight: 8,\n justifyContent: 'center',\n alignItems: 'center',\n },\n filterText: {\n fontSize: 12,\n fontWeight: '500',\n textAlign: 'center',\n textAlignVertical: 'center', // Android\n },\n eventList: {\n flex: 1,\n },\n eventItem: {\n backgroundColor: colors.surface,\n marginHorizontal: 16,\n marginBottom: 8,\n padding: 12,\n borderRadius: 8,\n borderWidth: 1,\n borderColor: colors.border,\n },\n eventHeader: {\n flexDirection: 'row',\n justifyContent: 'space-between',\n alignItems: 'center',\n marginBottom: 8,\n },\n categoryBadge: {\n paddingHorizontal: 8,\n paddingVertical: 4,\n borderRadius: 4,\n justifyContent: 'center',\n alignItems: 'center',\n },\n categoryText: {\n color: '#fff',\n fontSize: 12,\n fontWeight: '600',\n textTransform: 'uppercase',\n textAlign: 'center',\n textAlignVertical: 'center', // Android specific\n },\n timestamp: {\n fontSize: 12,\n color: colors.text.secondary,\n },\n eventSummary: {\n fontSize: 14,\n color: colors.text.secondary,\n fontFamily: 'monospace',\n },\n eventDetails: {\n marginTop: 12,\n paddingTop: 12,\n borderTopWidth: 1,\n borderTopColor: colors.border,\n },\n detailsLabel: {\n fontSize: 12,\n fontWeight: '600',\n color: colors.text.secondary,\n marginTop: 8,\n marginBottom: 4,\n },\n detailsText: {\n fontSize: 12,\n color: colors.text.secondary,\n fontFamily: 'monospace',\n },\n emptyState: {\n padding: 32,\n alignItems: 'center',\n },\n emptyText: {\n fontSize: 14,\n color: colors.text.tertiary,\n },\n});\n","/**\n * Header component\n */\n\nimport React from 'react';\nimport { View, Text, TouchableOpacity } from 'react-native';\nimport type { HeaderProps } from './types';\nimport { styles } from './styles';\n\nexport const Header: React.FC<HeaderProps> = ({ eventCount, onExport, onClear }) => {\n return (\n <View style={styles.header}>\n <Text style={styles.title}>Event Log ({eventCount})</Text>\n <View style={styles.headerButtons}>\n <TouchableOpacity onPress={onExport} style={styles.button}>\n <Text style={styles.buttonText}>Export</Text>\n </TouchableOpacity>\n <TouchableOpacity onPress={onClear} style={styles.button}>\n <Text style={styles.buttonText}>Clear</Text>\n </TouchableOpacity>\n </View>\n </View>\n );\n};\n","/**\n * SearchBar component\n */\n\nimport React from 'react';\nimport { TextInput } from 'react-native';\nimport type { SearchBarProps } from './types';\nimport { styles, colors } from './styles';\n\nexport const SearchBar: React.FC<SearchBarProps> = ({ value, onChange }) => {\n return (\n <TextInput\n style={styles.searchInput}\n placeholder=\"Search events...\"\n value={value}\n onChangeText={onChange}\n placeholderTextColor={colors.text.tertiary}\n />\n );\n};\n","/**\n * Type definitions for viewer components\n */\n\nimport type { Event, EventCategory } from '../types';\n\nexport type EventLogViewerProps = {\n readonly maxEvents?: number;\n};\n\nexport type EventListProps = {\n readonly events: ReadonlyArray<Event>;\n readonly onEventPress: (eventId: string) => void;\n readonly expandedId: string | null;\n};\n\nexport type EventItemProps = {\n readonly event: Event;\n readonly expanded: boolean;\n readonly onPress: () => void;\n};\n\nexport type FilterChipProps = {\n readonly category: EventCategory;\n readonly selected: boolean;\n readonly onToggle: () => void;\n};\n\nexport type HeaderProps = {\n readonly eventCount: number;\n readonly onExport: () => void;\n readonly onClear: () => void;\n};\n\nexport type SearchBarProps = {\n readonly value: string;\n readonly onChange: (text: string) => void;\n};\n\nexport type FilterBarProps = {\n readonly selected: ReadonlyArray<EventCategory>;\n readonly onToggle: (category: EventCategory) => void;\n};\n\nexport const CATEGORY_COLORS: Readonly<Record<EventCategory, string>> = {\n screen: '#3b82f6',\n action: '#10b981',\n network: '#f59e0b',\n error: '#ef4444',\n log: '#6b7280',\n} as const;\n\nexport const ALL_CATEGORIES: ReadonlyArray<EventCategory> = [\n 'screen',\n 'action',\n 'network',\n 'error',\n 'log',\n] as const;\n","/**\n * FilterChip component\n */\n\nimport React from 'react';\nimport { TouchableOpacity, Text } from 'react-native';\nimport type { FilterChipProps } from './types';\nimport { CATEGORY_COLORS } from './types';\nimport { styles, colors } from './styles';\n\nexport const FilterChip: React.FC<FilterChipProps> = ({ category, selected, onToggle }) => {\n return (\n <TouchableOpacity\n onPress={onToggle}\n style={[\n styles.filterChip,\n {\n backgroundColor: selected ? CATEGORY_COLORS[category] : colors.border,\n },\n ]}\n >\n <Text\n style={[\n styles.filterText,\n { color: selected ? '#fff' : colors.text.secondary },\n ]}\n >\n {category}\n </Text>\n </TouchableOpacity>\n );\n};\n","/**\n * FilterBar component\n */\n\nimport React from 'react';\nimport { ScrollView } from 'react-native';\nimport type { FilterBarProps } from './types';\nimport { ALL_CATEGORIES } from './types';\nimport { FilterChip } from './FilterChip';\nimport { styles } from './styles';\n\nexport const FilterBar: React.FC<FilterBarProps> = ({ selected, onToggle }) => {\n return (\n <ScrollView horizontal style={styles.filters} showsHorizontalScrollIndicator={false}>\n {ALL_CATEGORIES.map((category) => (\n <FilterChip\n key={category}\n category={category}\n selected={selected.includes(category)}\n onToggle={() => onToggle(category)}\n />\n ))}\n </ScrollView>\n );\n};\n","/**\n * EventItem component\n */\n\nimport React from 'react';\nimport { View, Text, TouchableOpacity } from 'react-native';\nimport type { EventItemProps } from './types';\nimport { CATEGORY_COLORS } from './types';\nimport { styles } from './styles';\n\nexport const EventItem: React.FC<EventItemProps> = ({ event, expanded, onPress }) => {\n return (\n <TouchableOpacity onPress={onPress} style={styles.eventItem}>\n {/* Event Header */}\n <View style={styles.eventHeader}>\n <View\n style={[\n styles.categoryBadge,\n { backgroundColor: CATEGORY_COLORS[event.category] },\n ]}\n >\n <Text style={styles.categoryText}>{event.category}</Text>\n </View>\n <Text style={styles.timestamp}>\n {new Date(event.timestamp).toLocaleTimeString()}\n </Text>\n </View>\n\n {/* Event Summary */}\n <Text style={styles.eventSummary} numberOfLines={expanded ? undefined : 1}>\n {JSON.stringify(event.payload)}\n </Text>\n\n {/* Expanded Details */}\n {expanded && (\n <View style={styles.eventDetails}>\n <Text style={styles.detailsLabel}>Session:</Text>\n <Text style={styles.detailsText}>{event.sessionId}</Text>\n\n <Text style={styles.detailsLabel}>Sequence:</Text>\n <Text style={styles.detailsText}>{event.seq}</Text>\n\n <Text style={styles.detailsLabel}>Timezone:</Text>\n <Text style={styles.detailsText}>{event.timezone}</Text>\n\n {event.context && Object.keys(event.context).length > 0 && (\n <>\n <Text style={styles.detailsLabel}>Context:</Text>\n <Text style={styles.detailsText}>\n {JSON.stringify(event.context, null, 2)}\n </Text>\n </>\n )}\n\n <Text style={styles.detailsLabel}>Full Event:</Text>\n <Text style={styles.detailsText}>\n {JSON.stringify(event, null, 2)}\n </Text>\n </View>\n )}\n </TouchableOpacity>\n );\n};\n","/**\n * EventList component\n */\n\nimport React from 'react';\nimport { FlatList, View, Text } from 'react-native';\nimport type { EventListProps } from './types';\nimport { EventItem } from './EventItem';\nimport { styles } from './styles';\nimport type { Event } from '../types';\n\nexport const EventList: React.FC<EventListProps> = ({ events, onEventPress, expandedId }) => {\n const renderItem = ({ item }: { item: Event }) => (\n <EventItem\n event={item}\n expanded={expandedId === item.eventId}\n onPress={() => onEventPress(item.eventId)}\n />\n );\n\n const keyExtractor = (item: Event) => item.eventId;\n\n const renderEmpty = () => (\n <View style={styles.emptyState}>\n <Text style={styles.emptyText}>No events</Text>\n </View>\n );\n\n return (\n <FlatList\n data={events}\n renderItem={renderItem}\n keyExtractor={keyExtractor}\n ListEmptyComponent={renderEmpty}\n style={styles.eventList}\n initialNumToRender={20}\n maxToRenderPerBatch={10}\n windowSize={5}\n />\n );\n};\n","/**\n * Custom hooks for EventLogViewer\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport type { Event, EventCategory, EventLog } from '../types';\n\nexport const useEvents = (eventLog: EventLog, maxEvents: number) => {\n const [events, setEvents] = useState<ReadonlyArray<Event>>([]);\n\n const fetchEvents = useCallback(() => {\n const result = eventLog.getEvents();\n if (result.ok) {\n setEvents(result.value.slice(-maxEvents));\n }\n }, [eventLog, maxEvents]);\n\n useEffect(() => {\n // Fetch once on mount\n fetchEvents();\n }, [fetchEvents]);\n\n return { events, refetch: fetchEvents };\n};\n\nexport const useEventFilter = (events: ReadonlyArray<Event>) => {\n const [filter, setFilter] = useState<ReadonlyArray<EventCategory>>([]);\n const [search, setSearch] = useState('');\n\n const toggleFilter = useCallback((category: EventCategory): void => {\n setFilter((prev) =>\n prev.includes(category)\n ? prev.filter((c) => c !== category)\n : [...prev, category]\n );\n }, []);\n\n const filteredEvents = events.filter((event) => {\n if (filter.length > 0 && !filter.includes(event.category)) {\n return false;\n }\n if (search) {\n const searchLower = search.toLowerCase();\n const payloadStr = JSON.stringify(event.payload).toLowerCase();\n return payloadStr.includes(searchLower);\n }\n return true;\n });\n\n return {\n filter,\n search,\n setSearch,\n toggleFilter,\n filteredEvents,\n };\n};\n\nexport const useEventActions = (eventLog: EventLog, onClear?: () => void) => {\n const handleClear = useCallback(async (): Promise<void> => {\n await eventLog.clear();\n // Refetch after clearing\n if (onClear) {\n onClear();\n }\n }, [eventLog, onClear]);\n\n const handleExport = useCallback(async (): Promise<void> => {\n const result = await eventLog.export({ mode: 'full' });\n if (result.ok) {\n console.log('=== EXPORTED LOGS ===');\n console.log(result.value);\n console.log('=== END LOGS ===');\n }\n }, [eventLog]);\n\n return { handleClear, handleExport };\n};\n","/**\n * Singleton instance of EventLog\n * Moved here to avoid circular dependencies\n */\nimport { createEventLog } from './core/eventlog';\n\nexport const eventLog = createEventLog();\n","/**\n * EventLogViewer - Main component\n * \n * Clean, modular architecture with proper separation of concerns\n */\n\nimport React, { useState } from 'react';\nimport { View } from 'react-native';\nimport type { EventLogViewerProps } from './types';\nimport { Header } from './Header';\nimport { SearchBar } from './SearchBar';\nimport { FilterBar } from './FilterBar';\nimport { EventList } from './EventList';\nimport { useEvents, useEventFilter, useEventActions } from './hooks';\nimport { styles } from './styles';\nimport { eventLog as globalEventLog } from '../instance';\n\nexport const EventLogViewer: React.FC<EventLogViewerProps> = ({\n maxEvents = 100,\n}) => {\n const [expandedId, setExpandedId] = useState<string | null>(null);\n\n // Custom hooks for state management\n const { events, refetch } = useEvents(globalEventLog, maxEvents);\n const { filter, search, setSearch, toggleFilter, filteredEvents } = useEventFilter(events);\n const { handleClear, handleExport } = useEventActions(globalEventLog, refetch);\n\n const handleEventPress = (eventId: string): void => {\n setExpandedId(expandedId === eventId ? null : eventId);\n };\n\n return (\n <View style={styles.container}>\n <Header\n eventCount={filteredEvents.length}\n onExport={handleExport}\n onClear={handleClear}\n />\n <SearchBar value={search} onChange={setSearch} />\n <FilterBar selected={filter} onToggle={toggleFilter} />\n <EventList\n events={filteredEvents}\n onEventPress={handleEventPress}\n expandedId={expandedId}\n />\n </View>\n );\n};\n","import React, { Component, ReactNode, ErrorInfo } from 'react';\nimport { View, Text, StyleSheet, TouchableOpacity } from 'react-native';\nimport { eventLog } from '../instance'; // Use singleton\n\nexport type EventLogErrorBoundaryProps = {\n children: ReactNode;\n fallback?: ReactNode;\n onError?: (error: Error, info: ErrorInfo) => void;\n};\n\ntype State = {\n hasError: boolean;\n error: Error | null;\n};\n\n/**\n * EventLog Error Boundary\n * \n * Catches React render errors in its child component tree.\n * Automatically logs them to the EventLog.\n */\nexport class EventLogErrorBoundary extends Component<EventLogErrorBoundaryProps, State> {\n constructor(props: EventLogErrorBoundaryProps) {\n super(props);\n this.state = { hasError: false, error: null };\n }\n\n static getDerivedStateFromError(error: Error): State {\n return { hasError: true, error };\n }\n\n override componentDidCatch(error: Error, info: ErrorInfo) {\n // 1. Log to EventLog\n eventLog.error(error, { \n origin: 'react_error_boundary',\n componentStack: info.componentStack \n });\n\n // 2. Call custom handler if provided\n if (this.props.onError) {\n this.props.onError(error, info);\n }\n }\n\n resetError = () => {\n this.setState({ hasError: false, error: null });\n };\n\n override render() {\n if (this.state.hasError) {\n if (this.props.fallback) {\n return this.props.fallback;\n }\n\n // Default fallback UI\n return (\n <View style={styles.content}>\n <Text style={styles.title}>Something went wrong</Text>\n <Text style={styles.message}>\n {this.state.error?.message || 'An unexpected error occurred.'}\n </Text>\n <TouchableOpacity style={styles.button} onPress={this.resetError}>\n <Text style={styles.buttonText}>Try Again</Text>\n </TouchableOpacity>\n </View>\n );\n }\n\n return this.props.children;\n }\n}\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n backgroundColor: '#fff',\n justifyContent: 'center',\n alignItems: 'center',\n },\n content: {\n padding: 20,\n flex: 1,\n backgroundColor: '#fff',\n justifyContent: 'center',\n alignItems: 'center',\n },\n title: {\n fontSize: 20,\n fontWeight: 'bold',\n marginBottom: 10,\n color: '#333',\n },\n message: {\n fontSize: 14,\n color: '#666',\n textAlign: 'center',\n marginBottom: 20,\n },\n button: {\n backgroundColor: '#3b82f6',\n paddingHorizontal: 20,\n paddingVertical: 10,\n borderRadius: 8,\n },\n buttonText: {\n color: '#fff',\n fontWeight: '600',\n },\n});\n"]}
|