@truewatchtech/react-native-mobile 0.4.3-alpha.2 → 0.4.3

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.
Files changed (95) hide show
  1. package/FTMobileReactNativeSDK.podspec +1 -1
  2. package/README.md +0 -34
  3. package/android/build.gradle +2 -2
  4. package/android/src/main/java/com/ft/sdk/reactnative/FTLogImpl.java +10 -2
  5. package/android/src/main/java/com/ft/sdk/reactnative/FTMobileImpl.java +45 -3
  6. package/android/src/main/java/com/ft/sdk/reactnative/FTRUMImpl.java +51 -9
  7. package/android/src/main/java/com/ft/sdk/reactnative/FTTraceImpl.java +5 -2
  8. package/android/src/main/java/com/ft/sdk/reactnative/ViewTiming.java +17 -0
  9. package/android/src/main/java/com/ft/sdk/reactnative/VisitorIdConfigMapper.java +50 -0
  10. package/android/src/newarch/java/com/ft/sdk/reactnative/FTMobileModule.java +5 -0
  11. package/android/src/newarch/java/com/ft/sdk/reactnative/FTRUMModule.java +18 -0
  12. package/android/src/oldarch/java/com/ft/sdk/reactnative/FTMobileModule.java +5 -0
  13. package/android/src/oldarch/java/com/ft/sdk/reactnative/FTRUMModule.java +15 -0
  14. package/android/src/test/java/com/ft/sdk/reactnative/FTMobileImplTest.java +53 -0
  15. package/ios/FTMobileReactNative.mm +37 -2
  16. package/ios/FTReactNativeLog.mm +7 -2
  17. package/ios/FTReactNativeRUM.mm +94 -4
  18. package/ios/FTReactNativeResource.m +6 -0
  19. package/ios/FTReactNativeTrace.mm +4 -2
  20. package/ios/FTReactNativeViewTiming.h +18 -0
  21. package/ios/FTWebSocketResourceData.h +4 -0
  22. package/ios/FTWebSocketResourceData.m +31 -0
  23. package/lib/commonjs/ft_logger.js +3 -1
  24. package/lib/commonjs/ft_logger.js.map +1 -1
  25. package/lib/commonjs/ft_mobile_agent.js +13 -1
  26. package/lib/commonjs/ft_mobile_agent.js.map +1 -1
  27. package/lib/commonjs/ft_rum.js +19 -3
  28. package/lib/commonjs/ft_rum.js.map +1 -1
  29. package/lib/commonjs/ft_tracing.js +2 -1
  30. package/lib/commonjs/ft_tracing.js.map +1 -1
  31. package/lib/commonjs/index.js +7 -0
  32. package/lib/commonjs/index.js.map +1 -1
  33. package/lib/commonjs/rum/FTRumViewTracking.js +147 -0
  34. package/lib/commonjs/rum/FTRumViewTracking.js.map +1 -0
  35. package/lib/commonjs/rum/FTRumWebSocketNative.js.map +1 -1
  36. package/lib/commonjs/rum/FTRumWebSocketTiming.js +19 -1
  37. package/lib/commonjs/rum/FTRumWebSocketTiming.js.map +1 -1
  38. package/lib/commonjs/rum/FTRumWebSocketTracking.js +7 -11
  39. package/lib/commonjs/rum/FTRumWebSocketTracking.js.map +1 -1
  40. package/lib/commonjs/specs/NativeFTMobileReactNative.js.map +1 -1
  41. package/lib/commonjs/specs/NativeFTReactNativeRUM.js.map +1 -1
  42. package/lib/commonjs/version.js +1 -1
  43. package/lib/commonjs/version.js.map +1 -1
  44. package/lib/commonjs/visitorIdConfig.js +37 -0
  45. package/lib/commonjs/visitorIdConfig.js.map +1 -0
  46. package/lib/module/ft_logger.js +3 -1
  47. package/lib/module/ft_logger.js.map +1 -1
  48. package/lib/module/ft_mobile_agent.js +13 -1
  49. package/lib/module/ft_mobile_agent.js.map +1 -1
  50. package/lib/module/ft_rum.js +19 -3
  51. package/lib/module/ft_rum.js.map +1 -1
  52. package/lib/module/ft_tracing.js +2 -1
  53. package/lib/module/ft_tracing.js.map +1 -1
  54. package/lib/module/index.js +1 -0
  55. package/lib/module/index.js.map +1 -1
  56. package/lib/module/rum/FTRumViewTracking.js +140 -0
  57. package/lib/module/rum/FTRumViewTracking.js.map +1 -0
  58. package/lib/module/rum/FTRumWebSocketNative.js.map +1 -1
  59. package/lib/module/rum/FTRumWebSocketTiming.js +19 -1
  60. package/lib/module/rum/FTRumWebSocketTiming.js.map +1 -1
  61. package/lib/module/rum/FTRumWebSocketTracking.js +7 -11
  62. package/lib/module/rum/FTRumWebSocketTracking.js.map +1 -1
  63. package/lib/module/specs/NativeFTMobileReactNative.js.map +1 -1
  64. package/lib/module/specs/NativeFTReactNativeRUM.js.map +1 -1
  65. package/lib/module/version.js +1 -1
  66. package/lib/module/version.js.map +1 -1
  67. package/lib/module/visitorIdConfig.js +31 -0
  68. package/lib/module/visitorIdConfig.js.map +1 -0
  69. package/lib/typescript/ft_logger.d.ts +11 -1
  70. package/lib/typescript/ft_mobile_agent.d.ts +25 -0
  71. package/lib/typescript/ft_rum.d.ts +33 -5
  72. package/lib/typescript/ft_tracing.d.ts +9 -1
  73. package/lib/typescript/index.d.ts +2 -0
  74. package/lib/typescript/rum/FTRumViewTracking.d.ts +32 -0
  75. package/lib/typescript/rum/FTRumWebSocketNative.d.ts +2 -3
  76. package/lib/typescript/rum/FTRumWebSocketTiming.d.ts +6 -1
  77. package/lib/typescript/rum/FTRumWebSocketTracking.d.ts +2 -4
  78. package/lib/typescript/specs/NativeFTMobileReactNative.d.ts +1 -0
  79. package/lib/typescript/specs/NativeFTReactNativeRUM.d.ts +7 -1
  80. package/lib/typescript/version.d.ts +1 -1
  81. package/lib/typescript/visitorIdConfig.d.ts +11 -0
  82. package/package.json +4 -3
  83. package/src/ft_logger.tsx +11 -1
  84. package/src/ft_mobile_agent.tsx +34 -1
  85. package/src/ft_rum.tsx +50 -5
  86. package/src/ft_tracing.tsx +9 -1
  87. package/src/index.tsx +4 -0
  88. package/src/rum/FTRumViewTracking.ts +179 -0
  89. package/src/rum/FTRumWebSocketNative.ts +2 -1
  90. package/src/rum/FTRumWebSocketTiming.ts +34 -2
  91. package/src/rum/FTRumWebSocketTracking.ts +9 -14
  92. package/src/specs/NativeFTMobileReactNative.ts +1 -0
  93. package/src/specs/NativeFTReactNativeRUM.ts +15 -1
  94. package/src/version.ts +1 -1
  95. package/src/visitorIdConfig.ts +123 -0
@@ -1 +1 @@
1
- {"version":3,"names":["_reactNative","require","_NativeFTReactNativeTrace","_interopRequireDefault","_FTRumWebSocketTiming","_FTRumWebSocketNative","e","__esModule","default","_defineProperty","r","t","_toPropertyKey","Object","defineProperty","value","enumerable","configurable","writable","i","_toPrimitive","Symbol","toPrimitive","call","TypeError","String","Number","REACT_NATIVE_DEV_WEBSOCKET","SOCKET_ROCKET_HTTP_ERROR","MAX_HTTP_ERROR_PARSE_LENGTH","FTRumWebSocketTracking","getLifecycleVersion","lifecycleVersion","shutDown","clearNativeWebSocketSessions","setNativeAutoTraceEnabled","stopTracking","pendingHandshakes","forEach","removeListeners","clear","warnedFailures","enabled","nativeAutoTraceEnabled","stopNativeSession","_FTRumWebSocketTracki","nativeSession","stop","undefined","startTracking","resourceReporter","Platform","OS","runtimeGlobal","globalThis","originalWebSocket","WebSocket","instrumentedWebSocket","startNativeWebSocketSession","createResourceKey","InstrumentedWebSocket","args","new","target","Reflect","apply","construct","createWebSocket","prototype","setPrototypeOf","warnOnce","installed","OriginalWebSocket","originalArguments","newTarget","url","__DEV__","test","options","Array","isArray","resourceKey","traceKey","argumentsWithHeaders","requestHeaders","traceHeaders","getTraceHeaders","mergeTraceHeaders","cancelTrace","stopTiming","startWebSocketTiming","socket","completed","cancelled","pendingCloseError","startPromise","nativeResourceStarted","keepFailureClose","delete","cancelHandshake","removers","listenerRemovers","slice","remove","releaseNativeResource","release","beginResource","start","startResource","webSocketNativeID","catch","complete","resourceStatus","state","getError","event","supplementFailureClose","duration","error","errorReady","message","Promise","resolve","then","started","completeNativeResource","httpMethod","requestHeader","webSocketEvent","completeResource","onOpen","onError","handshakeErrorFromEvent","onClose","failureMessageFromClose","_socket","removeEventListener","_socket2","_socket3","toHandshakeError","addEventListener","add","replace","token","randomNibble","Math","floor","random","uuidNibble","toString","key","NativeFTReactNativeTrace","cancelWebSocketTrace","headers","getTraceHeaderFieldsSync","toHeaderRecord","toOptions","traceHeaderEntries","entries","length","traceHeaderNames","Set","map","toLowerCase","keys","has","optionDescriptors","getOwnPropertyDescriptors","defineProperties","eventString","property","code","statusFromError","match","exec","trim","Error","name","reject","webSocketHandshakeState","isCurrentLifecycle","stopResource","httpStatus","resource","resourceType","webSocketHandshake","errorMessage","metrics","addResource","session","content","stopped","console","warn","exports"],"sources":["FTRumWebSocketTracking.ts"],"sourcesContent":["/* global WebSocket */\nimport { Platform } from 'react-native';\nimport NativeFTReactNativeTrace from '../specs/NativeFTReactNativeTrace';\nimport { startWebSocketTiming } from './FTRumWebSocketTiming';\nimport {\n clearNativeWebSocketSessions,\n startNativeWebSocketSession,\n webSocketNativeID,\n} from './FTRumWebSocketNative';\nimport type {\n NativeWebSocketSession,\n NativeWebSocketResource,\n} from './FTRumWebSocketNative';\n\ntype WebSocketConstructor = typeof WebSocket;\ntype WebSocketHandshakeState = 'success' | 'rejected' | 'failed';\n\ninterface ReactNativeWebSocketOptions {\n headers?: Record<string, unknown>;\n [key: string]: unknown;\n}\n\ninterface FTRUMWebSocketResource {\n url: string;\n httpMethod: string;\n requestHeader: Record<string, unknown>;\n resourceStatus: number;\n responseHeader?: Record<string, string>;\n resourceType: 'websocket';\n webSocketHandshake: true;\n webSocketHandshakeState: WebSocketHandshakeState;\n errorMessage?: string;\n}\n\ninterface WebSocketHandshakeError {\n message?: string;\n}\n\ninterface FTRumWebSocketResourceReporter {\n startResource(key: string): Promise<void>;\n stopResource(key: string): Promise<void>;\n addResource(\n key: string,\n resource: FTRUMWebSocketResource,\n metrics?: { duration?: number; resource_http_protocol?: string }\n ): Promise<void>;\n}\n\ntype RuntimeGlobal = typeof globalThis & {\n WebSocket: WebSocketConstructor;\n __DEV__?: boolean;\n};\n\nconst REACT_NATIVE_DEV_WEBSOCKET =\n /^wss?:\\/\\/(?:(?:10|172|192)\\.[0-9]+\\.[0-9]+\\.[0-9]+|localhost|127\\.0\\.0\\.1|\\[::1\\]):808[0-9]\\/(?:hot|symbolicate|message|inspector|status|assets|logs|debugger-proxy)(?:[/?#].*)?$/i;\n\n// SocketRocket embeds the actual response status in this description, which\n// RCTWebSocketModule forwards to JS. Do not match proxy errors or bare numbers.\nconst SOCKET_ROCKET_HTTP_ERROR =\n /^Received\\s+bad\\s+response\\s+code\\s+from\\s+server\\s*:\\s*([1-9]\\d{2})\\s*\\.?$/i;\nconst MAX_HTTP_ERROR_PARSE_LENGTH = 512;\n\nexport class FTRumWebSocketTracking {\n private static enabled = false;\n private static installed = false;\n private static originalWebSocket: WebSocketConstructor | null = null;\n private static instrumentedWebSocket: WebSocketConstructor | null = null;\n private static resourceReporter: FTRumWebSocketResourceReporter | null = null;\n private static nativeAutoTraceEnabled = false;\n private static warnedFailures = new Set<string>();\n private static lifecycleVersion = 0;\n private static nativeSession: NativeWebSocketSession | undefined;\n private static pendingHandshakes = new Set<() => void>();\n\n /** Identifies configuration and reporting work started before SDK shutdown. */\n static getLifecycleVersion(): number {\n return FTRumWebSocketTracking.lifecycleVersion;\n }\n\n static shutDown(): void {\n FTRumWebSocketTracking.lifecycleVersion += 1;\n clearNativeWebSocketSessions();\n FTRumWebSocketTracking.setNativeAutoTraceEnabled(false);\n FTRumWebSocketTracking.stopTracking();\n FTRumWebSocketTracking.pendingHandshakes.forEach((removeListeners) =>\n removeListeners()\n );\n FTRumWebSocketTracking.pendingHandshakes.clear();\n FTRumWebSocketTracking.warnedFailures.clear();\n }\n\n static setNativeAutoTraceEnabled(enabled: boolean): void {\n FTRumWebSocketTracking.nativeAutoTraceEnabled = enabled;\n }\n\n private static stopNativeSession(): void {\n FTRumWebSocketTracking.nativeSession?.stop();\n FTRumWebSocketTracking.nativeSession = undefined;\n }\n\n static startTracking(resourceReporter: FTRumWebSocketResourceReporter): void {\n if (Platform.OS !== 'ios') {\n return;\n }\n\n FTRumWebSocketTracking.enabled = true;\n FTRumWebSocketTracking.resourceReporter = resourceReporter;\n const runtimeGlobal = globalThis as RuntimeGlobal;\n const originalWebSocket = runtimeGlobal.WebSocket;\n if (originalWebSocket === FTRumWebSocketTracking.instrumentedWebSocket) {\n return;\n }\n if (typeof originalWebSocket !== 'function') {\n FTRumWebSocketTracking.stopNativeSession();\n return;\n }\n\n if (!FTRumWebSocketTracking.nativeSession) {\n FTRumWebSocketTracking.nativeSession = startNativeWebSocketSession(() =>\n FTRumWebSocketTracking.createResourceKey()\n );\n }\n\n const InstrumentedWebSocket = function (\n this: WebSocket,\n ...args: unknown[]\n ): WebSocket {\n if (!new.target) {\n return Reflect.apply(originalWebSocket, this, args);\n }\n // A constructor retained before stop/reinitialization must stay passive.\n if (\n FTRumWebSocketTracking.instrumentedWebSocket !== InstrumentedWebSocket\n ) {\n return Reflect.construct(originalWebSocket, args, new.target);\n }\n return FTRumWebSocketTracking.createWebSocket(\n originalWebSocket,\n args,\n new.target as unknown as WebSocketConstructor\n );\n } as unknown as WebSocketConstructor;\n\n try {\n InstrumentedWebSocket.prototype = originalWebSocket.prototype;\n Object.setPrototypeOf(InstrumentedWebSocket, originalWebSocket);\n runtimeGlobal.WebSocket = InstrumentedWebSocket;\n if (runtimeGlobal.WebSocket !== InstrumentedWebSocket) {\n FTRumWebSocketTracking.warnOnce(\n 'Unable to install WebSocket tracking.'\n );\n FTRumWebSocketTracking.stopNativeSession();\n return;\n }\n FTRumWebSocketTracking.originalWebSocket = originalWebSocket;\n FTRumWebSocketTracking.instrumentedWebSocket = InstrumentedWebSocket;\n FTRumWebSocketTracking.installed = true;\n } catch {\n FTRumWebSocketTracking.stopNativeSession();\n FTRumWebSocketTracking.warnOnce('Unable to install WebSocket tracking.');\n }\n }\n\n static stopTracking(): void {\n FTRumWebSocketTracking.stopNativeSession();\n FTRumWebSocketTracking.enabled = false;\n FTRumWebSocketTracking.resourceReporter = null;\n if (!FTRumWebSocketTracking.installed) {\n return;\n }\n\n const runtimeGlobal = globalThis as RuntimeGlobal;\n if (\n runtimeGlobal.WebSocket ===\n FTRumWebSocketTracking.instrumentedWebSocket &&\n FTRumWebSocketTracking.originalWebSocket\n ) {\n try {\n runtimeGlobal.WebSocket = FTRumWebSocketTracking.originalWebSocket;\n if (\n runtimeGlobal.WebSocket !== FTRumWebSocketTracking.originalWebSocket\n ) {\n FTRumWebSocketTracking.warnOnce(\n 'Unable to restore WebSocket constructor.'\n );\n return;\n }\n FTRumWebSocketTracking.installed = false;\n FTRumWebSocketTracking.originalWebSocket = null;\n FTRumWebSocketTracking.instrumentedWebSocket = null;\n } catch {\n // The disabled wrapper remains a passthrough if another library froze it.\n FTRumWebSocketTracking.warnOnce(\n 'Unable to restore WebSocket constructor.'\n );\n }\n }\n }\n\n private static createWebSocket(\n OriginalWebSocket: WebSocketConstructor,\n originalArguments: unknown[],\n newTarget: WebSocketConstructor\n ): WebSocket {\n if (!FTRumWebSocketTracking.enabled) {\n return Reflect.construct(OriginalWebSocket, originalArguments, newTarget);\n }\n\n const resourceReporter = FTRumWebSocketTracking.resourceReporter;\n if (!resourceReporter) {\n return Reflect.construct(OriginalWebSocket, originalArguments, newTarget);\n }\n\n // Leave coercion and validation of nonstandard arguments to the constructor.\n const url = originalArguments[0];\n if (typeof url !== 'string') {\n return Reflect.construct(OriginalWebSocket, originalArguments, newTarget);\n }\n const runtimeGlobal = globalThis as RuntimeGlobal;\n if (\n runtimeGlobal.__DEV__ === true &&\n REACT_NATIVE_DEV_WEBSOCKET.test(url)\n ) {\n return Reflect.construct(OriginalWebSocket, originalArguments, newTarget);\n }\n\n const options = originalArguments[2];\n if (\n options !== undefined &&\n (!options || typeof options !== 'object' || Array.isArray(options))\n ) {\n return Reflect.construct(OriginalWebSocket, originalArguments, newTarget);\n }\n const lifecycleVersion = FTRumWebSocketTracking.lifecycleVersion;\n let resourceKey: string;\n let traceKey: string | undefined;\n let argumentsWithHeaders: unknown[];\n let requestHeaders: Record<string, unknown>;\n try {\n resourceKey = FTRumWebSocketTracking.createResourceKey();\n // Generation may cache correlation before the bridge returns or throws.\n if (FTRumWebSocketTracking.nativeAutoTraceEnabled) traceKey = resourceKey;\n const traceHeaders = traceKey\n ? FTRumWebSocketTracking.getTraceHeaders(url, traceKey)\n : {};\n ({ argumentsWithHeaders, requestHeaders } =\n FTRumWebSocketTracking.mergeTraceHeaders(\n originalArguments,\n traceHeaders\n ));\n } catch {\n FTRumWebSocketTracking.cancelTrace(traceKey);\n FTRumWebSocketTracking.warnOnce('Unable to prepare WebSocket tracking.');\n return Reflect.construct(OriginalWebSocket, originalArguments, newTarget);\n }\n\n const stopTiming = startWebSocketTiming();\n let socket: WebSocket;\n let completed = false;\n let cancelled = false;\n let pendingCloseError: WebSocketHandshakeError | undefined;\n let startPromise: Promise<boolean> | undefined;\n // Decide once before reporting. Never switch routes after an ambiguous\n // native result: start/add may already have reached the SDK.\n const nativeSession = FTRumWebSocketTracking.nativeSession;\n let nativeResourceStarted = false;\n const removeListeners = (keepFailureClose = false) => {\n completed = true;\n if (!keepFailureClose) {\n pendingCloseError = undefined;\n FTRumWebSocketTracking.pendingHandshakes.delete(cancelHandshake);\n }\n // Cleanup failures must neither interrupt business dispatch nor skip the\n // other listeners. Completed guards also protect callbacks already queued.\n const removers = keepFailureClose\n ? listenerRemovers.slice(0, 2)\n : listenerRemovers;\n for (const remove of removers) {\n try {\n remove();\n } catch {\n FTRumWebSocketTracking.warnOnce(\n 'Unable to remove WebSocket listener.'\n );\n }\n }\n };\n const releaseNativeResource = () => {\n if (nativeResourceStarted) {\n nativeResourceStarted = false;\n nativeSession?.release(resourceKey);\n }\n };\n const cancelHandshake = () => {\n cancelled = true;\n removeListeners();\n releaseNativeResource();\n };\n const beginResource = () => {\n if (!startPromise) {\n nativeResourceStarted = nativeSession !== undefined;\n const start = () =>\n nativeSession\n ? nativeSession.startResource(\n resourceKey,\n webSocketNativeID(socket),\n url\n )\n : resourceReporter.startResource(resourceKey);\n startPromise = FTRumWebSocketTracking.startResource(start).catch(() => {\n cancelHandshake();\n if (lifecycleVersion === FTRumWebSocketTracking.lifecycleVersion) {\n FTRumWebSocketTracking.warnOnce(\n 'Unable to start WebSocket resource.'\n );\n }\n return false;\n });\n }\n return startPromise;\n };\n const complete = (\n resourceStatus: number,\n state: WebSocketHandshakeState,\n getError?: () => WebSocketHandshakeError,\n event: 'open' | 'error' | 'close' = 'error',\n supplementFailureClose = false\n ) => {\n if (completed) {\n return;\n }\n completed = true;\n const duration = stopTiming();\n // Freeze the observed boundary before inspecting or parsing error data.\n const error = getError?.();\n if (\n cancelled ||\n lifecycleVersion !== FTRumWebSocketTracking.lifecycleVersion\n ) {\n removeListeners();\n return;\n }\n let errorReady: Promise<void> | undefined;\n if (supplementFailureClose && error && !error.message) {\n // RN's built-in EventTarget emits error without message, immediately\n // followed by close(1006, nativeErrorMessage) in the same native-event\n // callback. This also covers RN 0.79's opt-in implementation without\n // guessing behavior from a version number. Freeze time and stop now;\n // allow only that synchronous close to supplement the error text.\n pendingCloseError = error;\n removeListeners(true);\n errorReady = Promise.resolve().then(() => removeListeners());\n } else {\n removeListeners();\n }\n const started = beginResource();\n if (nativeSession) {\n // Invoke stop at the event boundary, without waiting for the start\n // promise or business callbacks. The native module processes in order.\n void FTRumWebSocketTracking.completeNativeResource(\n nativeSession,\n lifecycleVersion,\n resourceKey,\n started,\n {\n url,\n httpMethod: 'GET',\n requestHeader: requestHeaders,\n webSocketEvent: event,\n },\n duration,\n error,\n errorReady\n );\n return;\n }\n void FTRumWebSocketTracking.completeResource(\n resourceReporter,\n lifecycleVersion,\n resourceKey,\n started,\n url,\n requestHeaders,\n resourceStatus,\n state,\n duration,\n error,\n errorReady\n );\n };\n const onOpen = () => complete(0, 'success', undefined, 'open');\n const onError = (event: Event) => {\n complete(\n 0,\n 'failed',\n () => FTRumWebSocketTracking.handshakeErrorFromEvent(event),\n 'error',\n true\n );\n };\n const onClose = (event: Event) => {\n if (pendingCloseError) {\n const error = pendingCloseError;\n const message = FTRumWebSocketTracking.failureMessageFromClose(event);\n // Accessors can reenter shutdown. Do not restore a cancelled error.\n if (pendingCloseError === error) error.message = message;\n removeListeners();\n return;\n }\n // A standalone close is only a terminal signal. Never interpret its\n // business code/reason as a network error or as an HTTP response.\n complete(0, 'failed', undefined, 'close');\n };\n const listenerRemovers = [\n () => socket?.removeEventListener('open', onOpen),\n () => socket?.removeEventListener('error', onError),\n () => socket?.removeEventListener('close', onClose),\n ];\n\n try {\n socket = Reflect.construct(\n OriginalWebSocket,\n argumentsWithHeaders,\n newTarget\n );\n } catch (error) {\n complete(0, 'failed', () =>\n FTRumWebSocketTracking.toHandshakeError(error)\n );\n throw error;\n }\n\n try {\n socket.addEventListener('open', onOpen);\n socket.addEventListener('error', onError);\n socket.addEventListener('close', onClose);\n if (!completed) {\n FTRumWebSocketTracking.pendingHandshakes.add(cancelHandshake);\n // Do not leave a native Resource behind if listener installation fails.\n beginResource();\n }\n } catch {\n cancelHandshake();\n // A reentrant terminal may already have started normal Resource reporting.\n if (!startPromise) FTRumWebSocketTracking.cancelTrace(traceKey);\n FTRumWebSocketTracking.warnOnce('Unable to observe WebSocket events.');\n }\n return socket;\n }\n\n private static createResourceKey(): string {\n return 'xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx'.replace(/[xy]/g, (token) => {\n const randomNibble = Math.floor(Math.random() * 16);\n const uuidNibble = token === 'x' ? randomNibble : (randomNibble % 4) + 8;\n return uuidNibble.toString(16);\n });\n }\n\n private static cancelTrace(key: string | undefined): void {\n if (!key) return;\n try {\n // Older native binaries do not expose this optional cancellation bridge.\n if (\n typeof NativeFTReactNativeTrace?.cancelWebSocketTrace === 'function'\n ) {\n void Promise.resolve(\n NativeFTReactNativeTrace.cancelWebSocketTrace(key)\n ).catch(() => {});\n }\n } catch {\n // Cleanup must never interrupt the business constructor or its exception.\n }\n }\n\n private static getTraceHeaders(\n url: string,\n resourceKey: string\n ): Record<string, unknown> {\n try {\n const headers = NativeFTReactNativeTrace?.getTraceHeaderFieldsSync(\n url,\n resourceKey\n );\n return FTRumWebSocketTracking.toHeaderRecord(headers);\n } catch {\n FTRumWebSocketTracking.warnOnce(\n 'Unable to inject WebSocket trace headers.'\n );\n return {};\n }\n }\n\n private static mergeTraceHeaders(\n originalArguments: unknown[],\n traceHeaders: Record<string, unknown>\n ): {\n argumentsWithHeaders: unknown[];\n requestHeaders: Record<string, unknown>;\n } {\n const options = FTRumWebSocketTracking.toOptions(originalArguments[2]);\n const requestHeaders = {\n ...FTRumWebSocketTracking.toHeaderRecord(options.headers),\n };\n const traceHeaderEntries = Object.entries(traceHeaders);\n\n if (traceHeaderEntries.length === 0) {\n return {\n argumentsWithHeaders: originalArguments,\n requestHeaders,\n };\n }\n\n const traceHeaderNames = new Set(\n traceHeaderEntries.map(([key]) => key.toLowerCase())\n );\n Object.keys(requestHeaders).forEach((key) => {\n if (traceHeaderNames.has(key.toLowerCase())) {\n delete requestHeaders[key];\n }\n });\n traceHeaderEntries.forEach(([key, value]) => {\n requestHeaders[key] = value;\n });\n\n const argumentsWithHeaders = [...originalArguments];\n // Read a headers accessor only once. Spreading options here would read it\n // again before replacing it with the already captured header values.\n const optionDescriptors = Object.getOwnPropertyDescriptors(options);\n optionDescriptors.headers = {\n configurable: true,\n enumerable: true,\n writable: true,\n value: requestHeaders,\n };\n argumentsWithHeaders[2] = Object.defineProperties({}, optionDescriptors);\n return { argumentsWithHeaders, requestHeaders };\n }\n\n private static toOptions(value: unknown): ReactNativeWebSocketOptions {\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n return value as ReactNativeWebSocketOptions;\n }\n return {};\n }\n\n private static toHeaderRecord(value: unknown): Record<string, unknown> {\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n return value as Record<string, unknown>;\n }\n return {};\n }\n\n private static eventString(\n event: unknown,\n property: string\n ): string | undefined {\n if (!event || typeof event !== 'object') {\n return undefined;\n }\n try {\n const value = (event as Record<string, unknown>)[property];\n return typeof value === 'string' && value.length > 0 ? value : undefined;\n } catch {\n return undefined;\n }\n }\n\n private static handshakeErrorFromEvent(\n event: Event\n ): WebSocketHandshakeError {\n return { message: FTRumWebSocketTracking.eventString(event, 'message') };\n }\n\n private static failureMessageFromClose(event: Event): string | undefined {\n try {\n if ((event as Event & { code?: unknown })?.code === 1006) {\n return FTRumWebSocketTracking.eventString(event, 'reason');\n }\n } catch {\n // Optional event details must never interrupt business event dispatch.\n }\n return undefined;\n }\n\n private static statusFromError(\n message: string | undefined\n ): number | undefined {\n const match =\n message && message.length <= MAX_HTTP_ERROR_PARSE_LENGTH\n ? SOCKET_ROCKET_HTTP_ERROR.exec(message.trim())\n : null;\n return match ? Number(match[1]) : undefined;\n }\n\n private static toHandshakeError(error: unknown): WebSocketHandshakeError {\n try {\n return {\n message:\n error instanceof Error ? error.message || error.name : String(error),\n };\n } catch {\n return {};\n }\n }\n\n private static startResource(start: () => Promise<void>): Promise<boolean> {\n try {\n return Promise.resolve(start()).then(() => true);\n } catch (error) {\n return Promise.reject(error);\n }\n }\n\n private static async completeResource(\n resourceReporter: FTRumWebSocketResourceReporter,\n lifecycleVersion: number,\n resourceKey: string,\n startPromise: Promise<boolean>,\n url: string,\n requestHeader: Record<string, unknown>,\n resourceStatus: number,\n webSocketHandshakeState: WebSocketHandshakeState,\n duration: number | undefined,\n error?: WebSocketHandshakeError,\n errorReady?: Promise<void>\n ): Promise<void> {\n const isCurrentLifecycle = () =>\n lifecycleVersion === FTRumWebSocketTracking.lifecycleVersion;\n try {\n if (!(await startPromise) || !isCurrentLifecycle()) {\n return;\n }\n try {\n await resourceReporter.stopResource(resourceKey);\n } catch {\n // addResource completes the native Resource. Attempt it even if stop\n // failed, but never retry addResource and risk duplicate completion.\n if (isCurrentLifecycle()) {\n FTRumWebSocketTracking.warnOnce('Unable to stop WebSocket resource.');\n }\n }\n if (errorReady) await errorReady;\n // Only old native binaries classify in JS. Resolve supplemental text\n // before normalization; duration was frozen at the first terminal event.\n const httpStatus = FTRumWebSocketTracking.statusFromError(error?.message);\n if (httpStatus !== undefined && webSocketHandshakeState !== 'success') {\n resourceStatus = httpStatus;\n webSocketHandshakeState = httpStatus !== 101 ? 'rejected' : 'failed';\n }\n const resource: FTRUMWebSocketResource = {\n url,\n httpMethod: 'GET',\n requestHeader,\n resourceStatus,\n resourceType: 'websocket',\n webSocketHandshake: true,\n webSocketHandshakeState,\n };\n if (error?.message) resource.errorMessage = error.message;\n const metrics: { duration?: number } = {};\n if (duration !== undefined) metrics.duration = duration;\n if (isCurrentLifecycle()) {\n await resourceReporter.addResource(\n resourceKey,\n resource,\n Object.keys(metrics).length ? metrics : undefined\n );\n }\n } catch {\n if (isCurrentLifecycle()) {\n FTRumWebSocketTracking.warnOnce('Unable to report WebSocket resource.');\n }\n }\n }\n\n private static async completeNativeResource(\n session: NativeWebSocketSession,\n lifecycleVersion: number,\n key: string,\n started: Promise<boolean>,\n content: NativeWebSocketResource,\n duration: number | undefined,\n error?: WebSocketHandshakeError,\n errorReady?: Promise<void>\n ): Promise<void> {\n // Attach rejection handling immediately, including when start never settles.\n let stopped: Promise<void>;\n try {\n stopped = Promise.resolve(\n session.stopResource(key, content.webSocketEvent)\n ).catch(() => {\n if (lifecycleVersion === FTRumWebSocketTracking.lifecycleVersion)\n FTRumWebSocketTracking.warnOnce('Unable to stop WebSocket resource.');\n });\n } catch {\n stopped = Promise.resolve();\n }\n try {\n if (!(await started)) return;\n await stopped;\n if (errorReady) await errorReady;\n if (lifecycleVersion !== FTRumWebSocketTracking.lifecycleVersion) return;\n await session.addResource(\n key,\n error?.message ? { ...content, errorMessage: error.message } : content,\n duration === undefined ? {} : { duration }\n );\n } catch {\n session.release(key);\n if (lifecycleVersion === FTRumWebSocketTracking.lifecycleVersion)\n FTRumWebSocketTracking.warnOnce('Unable to report WebSocket resource.');\n }\n }\n\n private static warnOnce(message: string): void {\n if (FTRumWebSocketTracking.warnedFailures.has(message)) {\n return;\n }\n FTRumWebSocketTracking.warnedFailures.add(message);\n try {\n console.warn(`[FT-SDK] ${message}`);\n } catch {\n // A host-provided logger must not turn instrumentation failure into one\n // on the application's constructor, event dispatch or promise chain.\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_reactNative","require","_NativeFTReactNativeTrace","_interopRequireDefault","_FTRumWebSocketTiming","_FTRumWebSocketNative","e","__esModule","default","_defineProperty","r","t","_toPropertyKey","Object","defineProperty","value","enumerable","configurable","writable","i","_toPrimitive","Symbol","toPrimitive","call","TypeError","String","Number","REACT_NATIVE_DEV_WEBSOCKET","SOCKET_ROCKET_HTTP_ERROR","MAX_HTTP_ERROR_PARSE_LENGTH","FTRumWebSocketTracking","getLifecycleVersion","lifecycleVersion","shutDown","clearNativeWebSocketSessions","setNativeAutoTraceEnabled","stopTracking","pendingHandshakes","forEach","removeListeners","clear","warnedFailures","enabled","nativeAutoTraceEnabled","stopNativeSession","_FTRumWebSocketTracki","nativeSession","stop","undefined","startTracking","resourceReporter","Platform","OS","runtimeGlobal","globalThis","originalWebSocket","WebSocket","instrumentedWebSocket","startNativeWebSocketSession","createResourceKey","InstrumentedWebSocket","args","new","target","Reflect","apply","construct","createWebSocket","prototype","setPrototypeOf","warnOnce","installed","OriginalWebSocket","originalArguments","newTarget","url","__DEV__","test","options","Array","isArray","resourceKey","traceKey","argumentsWithHeaders","requestHeaders","traceHeaders","getTraceHeaders","mergeTraceHeaders","cancelTrace","stopTiming","startWebSocketTiming","socket","completed","cancelled","pendingCloseError","startPromise","nativeResourceStarted","keepFailureClose","delete","cancelHandshake","removers","listenerRemovers","slice","remove","releaseNativeResource","release","beginResource","start","startResource","webSocketNativeID","catch","complete","resourceStatus","state","getError","event","supplementFailureClose","timing","error","errorReady","message","Promise","resolve","then","started","completeNativeResource","httpMethod","requestHeader","webSocketEvent","completeResource","onOpen","onError","handshakeErrorFromEvent","onClose","failureMessageFromClose","_socket","removeEventListener","_socket2","_socket3","toHandshakeError","addEventListener","add","replace","token","randomNibble","Math","floor","random","uuidNibble","toString","key","NativeFTReactNativeTrace","cancelWebSocketTrace","headers","getTraceHeaderFieldsSync","toHeaderRecord","toOptions","traceHeaderEntries","entries","length","traceHeaderNames","Set","map","toLowerCase","keys","has","optionDescriptors","getOwnPropertyDescriptors","defineProperties","eventString","property","code","statusFromError","match","exec","trim","Error","name","reject","webSocketHandshakeState","isCurrentLifecycle","stopResource","httpStatus","resource","resourceType","webSocketHandshake","errorMessage","addResource","session","content","stopped","console","warn","exports"],"sources":["FTRumWebSocketTracking.ts"],"sourcesContent":["/* global WebSocket */\nimport { Platform } from 'react-native';\nimport NativeFTReactNativeTrace from '../specs/NativeFTReactNativeTrace';\nimport { startWebSocketTiming } from './FTRumWebSocketTiming';\nimport type { WebSocketTimingMetrics } from './FTRumWebSocketTiming';\nimport {\n clearNativeWebSocketSessions,\n startNativeWebSocketSession,\n webSocketNativeID,\n} from './FTRumWebSocketNative';\nimport type {\n NativeWebSocketSession,\n NativeWebSocketResource,\n} from './FTRumWebSocketNative';\n\ntype WebSocketConstructor = typeof WebSocket;\ntype WebSocketHandshakeState = 'success' | 'rejected' | 'failed';\n\ninterface ReactNativeWebSocketOptions {\n headers?: Record<string, unknown>;\n [key: string]: unknown;\n}\n\ninterface FTRUMWebSocketResource {\n url: string;\n httpMethod: string;\n requestHeader: Record<string, unknown>;\n resourceStatus: number;\n responseHeader?: Record<string, string>;\n resourceType: 'websocket';\n webSocketHandshake: true;\n webSocketHandshakeState: WebSocketHandshakeState;\n errorMessage?: string;\n}\n\ninterface WebSocketHandshakeError {\n message?: string;\n}\n\ninterface FTRumWebSocketResourceReporter {\n startResource(key: string): Promise<void>;\n stopResource(key: string): Promise<void>;\n addResource(\n key: string,\n resource: FTRUMWebSocketResource,\n metrics?: WebSocketTimingMetrics\n ): Promise<void>;\n}\n\ntype RuntimeGlobal = typeof globalThis & {\n WebSocket: WebSocketConstructor;\n __DEV__?: boolean;\n};\n\nconst REACT_NATIVE_DEV_WEBSOCKET =\n /^wss?:\\/\\/(?:(?:10|172|192)\\.[0-9]+\\.[0-9]+\\.[0-9]+|localhost|127\\.0\\.0\\.1|\\[::1\\]):808[0-9]\\/(?:hot|symbolicate|message|inspector|status|assets|logs|debugger-proxy)(?:[/?#].*)?$/i;\n\n// SocketRocket embeds the actual response status in this description, which\n// RCTWebSocketModule forwards to JS. Do not match proxy errors or bare numbers.\nconst SOCKET_ROCKET_HTTP_ERROR =\n /^Received\\s+bad\\s+response\\s+code\\s+from\\s+server\\s*:\\s*([1-9]\\d{2})\\s*\\.?$/i;\nconst MAX_HTTP_ERROR_PARSE_LENGTH = 512;\n\nexport class FTRumWebSocketTracking {\n private static enabled = false;\n private static installed = false;\n private static originalWebSocket: WebSocketConstructor | null = null;\n private static instrumentedWebSocket: WebSocketConstructor | null = null;\n private static resourceReporter: FTRumWebSocketResourceReporter | null = null;\n private static nativeAutoTraceEnabled = false;\n private static warnedFailures = new Set<string>();\n private static lifecycleVersion = 0;\n private static nativeSession: NativeWebSocketSession | undefined;\n private static pendingHandshakes = new Set<() => void>();\n\n /** Identifies configuration and reporting work started before SDK shutdown. */\n static getLifecycleVersion(): number {\n return FTRumWebSocketTracking.lifecycleVersion;\n }\n\n static shutDown(): void {\n FTRumWebSocketTracking.lifecycleVersion += 1;\n clearNativeWebSocketSessions();\n FTRumWebSocketTracking.setNativeAutoTraceEnabled(false);\n FTRumWebSocketTracking.stopTracking();\n FTRumWebSocketTracking.pendingHandshakes.forEach((removeListeners) =>\n removeListeners()\n );\n FTRumWebSocketTracking.pendingHandshakes.clear();\n FTRumWebSocketTracking.warnedFailures.clear();\n }\n\n static setNativeAutoTraceEnabled(enabled: boolean): void {\n FTRumWebSocketTracking.nativeAutoTraceEnabled = enabled;\n }\n\n private static stopNativeSession(): void {\n FTRumWebSocketTracking.nativeSession?.stop();\n FTRumWebSocketTracking.nativeSession = undefined;\n }\n\n static startTracking(resourceReporter: FTRumWebSocketResourceReporter): void {\n if (Platform.OS !== 'ios') {\n return;\n }\n\n FTRumWebSocketTracking.enabled = true;\n FTRumWebSocketTracking.resourceReporter = resourceReporter;\n const runtimeGlobal = globalThis as RuntimeGlobal;\n const originalWebSocket = runtimeGlobal.WebSocket;\n if (originalWebSocket === FTRumWebSocketTracking.instrumentedWebSocket) {\n return;\n }\n if (typeof originalWebSocket !== 'function') {\n FTRumWebSocketTracking.stopNativeSession();\n return;\n }\n\n if (!FTRumWebSocketTracking.nativeSession) {\n FTRumWebSocketTracking.nativeSession = startNativeWebSocketSession(() =>\n FTRumWebSocketTracking.createResourceKey()\n );\n }\n\n const InstrumentedWebSocket = function (\n this: WebSocket,\n ...args: unknown[]\n ): WebSocket {\n if (!new.target) {\n return Reflect.apply(originalWebSocket, this, args);\n }\n // A constructor retained before stop/reinitialization must stay passive.\n if (\n FTRumWebSocketTracking.instrumentedWebSocket !== InstrumentedWebSocket\n ) {\n return Reflect.construct(originalWebSocket, args, new.target);\n }\n return FTRumWebSocketTracking.createWebSocket(\n originalWebSocket,\n args,\n new.target as unknown as WebSocketConstructor\n );\n } as unknown as WebSocketConstructor;\n\n try {\n InstrumentedWebSocket.prototype = originalWebSocket.prototype;\n Object.setPrototypeOf(InstrumentedWebSocket, originalWebSocket);\n runtimeGlobal.WebSocket = InstrumentedWebSocket;\n if (runtimeGlobal.WebSocket !== InstrumentedWebSocket) {\n FTRumWebSocketTracking.warnOnce(\n 'Unable to install WebSocket tracking.'\n );\n FTRumWebSocketTracking.stopNativeSession();\n return;\n }\n FTRumWebSocketTracking.originalWebSocket = originalWebSocket;\n FTRumWebSocketTracking.instrumentedWebSocket = InstrumentedWebSocket;\n FTRumWebSocketTracking.installed = true;\n } catch {\n FTRumWebSocketTracking.stopNativeSession();\n FTRumWebSocketTracking.warnOnce('Unable to install WebSocket tracking.');\n }\n }\n\n static stopTracking(): void {\n FTRumWebSocketTracking.stopNativeSession();\n FTRumWebSocketTracking.enabled = false;\n FTRumWebSocketTracking.resourceReporter = null;\n if (!FTRumWebSocketTracking.installed) {\n return;\n }\n\n const runtimeGlobal = globalThis as RuntimeGlobal;\n if (\n runtimeGlobal.WebSocket ===\n FTRumWebSocketTracking.instrumentedWebSocket &&\n FTRumWebSocketTracking.originalWebSocket\n ) {\n try {\n runtimeGlobal.WebSocket = FTRumWebSocketTracking.originalWebSocket;\n if (\n runtimeGlobal.WebSocket !== FTRumWebSocketTracking.originalWebSocket\n ) {\n FTRumWebSocketTracking.warnOnce(\n 'Unable to restore WebSocket constructor.'\n );\n return;\n }\n FTRumWebSocketTracking.installed = false;\n FTRumWebSocketTracking.originalWebSocket = null;\n FTRumWebSocketTracking.instrumentedWebSocket = null;\n } catch {\n // The disabled wrapper remains a passthrough if another library froze it.\n FTRumWebSocketTracking.warnOnce(\n 'Unable to restore WebSocket constructor.'\n );\n }\n }\n }\n\n private static createWebSocket(\n OriginalWebSocket: WebSocketConstructor,\n originalArguments: unknown[],\n newTarget: WebSocketConstructor\n ): WebSocket {\n if (!FTRumWebSocketTracking.enabled) {\n return Reflect.construct(OriginalWebSocket, originalArguments, newTarget);\n }\n\n const resourceReporter = FTRumWebSocketTracking.resourceReporter;\n if (!resourceReporter) {\n return Reflect.construct(OriginalWebSocket, originalArguments, newTarget);\n }\n\n // Leave coercion and validation of nonstandard arguments to the constructor.\n const url = originalArguments[0];\n if (typeof url !== 'string') {\n return Reflect.construct(OriginalWebSocket, originalArguments, newTarget);\n }\n const runtimeGlobal = globalThis as RuntimeGlobal;\n if (\n runtimeGlobal.__DEV__ === true &&\n REACT_NATIVE_DEV_WEBSOCKET.test(url)\n ) {\n return Reflect.construct(OriginalWebSocket, originalArguments, newTarget);\n }\n\n const options = originalArguments[2];\n if (\n options !== undefined &&\n (!options || typeof options !== 'object' || Array.isArray(options))\n ) {\n return Reflect.construct(OriginalWebSocket, originalArguments, newTarget);\n }\n const lifecycleVersion = FTRumWebSocketTracking.lifecycleVersion;\n let resourceKey: string;\n let traceKey: string | undefined;\n let argumentsWithHeaders: unknown[];\n let requestHeaders: Record<string, unknown>;\n try {\n resourceKey = FTRumWebSocketTracking.createResourceKey();\n // Generation may cache correlation before the bridge returns or throws.\n if (FTRumWebSocketTracking.nativeAutoTraceEnabled) traceKey = resourceKey;\n const traceHeaders = traceKey\n ? FTRumWebSocketTracking.getTraceHeaders(url, traceKey)\n : {};\n ({ argumentsWithHeaders, requestHeaders } =\n FTRumWebSocketTracking.mergeTraceHeaders(\n originalArguments,\n traceHeaders\n ));\n } catch {\n FTRumWebSocketTracking.cancelTrace(traceKey);\n FTRumWebSocketTracking.warnOnce('Unable to prepare WebSocket tracking.');\n return Reflect.construct(OriginalWebSocket, originalArguments, newTarget);\n }\n\n const stopTiming = startWebSocketTiming();\n let socket: WebSocket;\n let completed = false;\n let cancelled = false;\n let pendingCloseError: WebSocketHandshakeError | undefined;\n let startPromise: Promise<boolean> | undefined;\n // Decide once before reporting. Never switch routes after an ambiguous\n // native result: start/add may already have reached the SDK.\n const nativeSession = FTRumWebSocketTracking.nativeSession;\n let nativeResourceStarted = false;\n const removeListeners = (keepFailureClose = false) => {\n completed = true;\n if (!keepFailureClose) {\n pendingCloseError = undefined;\n FTRumWebSocketTracking.pendingHandshakes.delete(cancelHandshake);\n }\n // Cleanup failures must neither interrupt business dispatch nor skip the\n // other listeners. Completed guards also protect callbacks already queued.\n const removers = keepFailureClose\n ? listenerRemovers.slice(0, 2)\n : listenerRemovers;\n for (const remove of removers) {\n try {\n remove();\n } catch {\n FTRumWebSocketTracking.warnOnce(\n 'Unable to remove WebSocket listener.'\n );\n }\n }\n };\n const releaseNativeResource = () => {\n if (nativeResourceStarted) {\n nativeResourceStarted = false;\n nativeSession?.release(resourceKey);\n }\n };\n const cancelHandshake = () => {\n cancelled = true;\n removeListeners();\n releaseNativeResource();\n };\n const beginResource = () => {\n if (!startPromise) {\n nativeResourceStarted = nativeSession !== undefined;\n const start = () =>\n nativeSession\n ? nativeSession.startResource(\n resourceKey,\n webSocketNativeID(socket),\n url\n )\n : resourceReporter.startResource(resourceKey);\n startPromise = FTRumWebSocketTracking.startResource(start).catch(() => {\n cancelHandshake();\n if (lifecycleVersion === FTRumWebSocketTracking.lifecycleVersion) {\n FTRumWebSocketTracking.warnOnce(\n 'Unable to start WebSocket resource.'\n );\n }\n return false;\n });\n }\n return startPromise;\n };\n const complete = (\n resourceStatus: number,\n state: WebSocketHandshakeState,\n getError?: () => WebSocketHandshakeError,\n event: 'open' | 'error' | 'close' = 'error',\n supplementFailureClose = false\n ) => {\n if (completed) {\n return;\n }\n completed = true;\n const timing = stopTiming();\n // Freeze the observed boundary before inspecting or parsing error data.\n const error = getError?.();\n if (\n cancelled ||\n lifecycleVersion !== FTRumWebSocketTracking.lifecycleVersion\n ) {\n removeListeners();\n return;\n }\n let errorReady: Promise<void> | undefined;\n if (supplementFailureClose && error && !error.message) {\n // RN's built-in EventTarget emits error without message, immediately\n // followed by close(1006, nativeErrorMessage) in the same native-event\n // callback. This also covers RN 0.79's opt-in implementation without\n // guessing behavior from a version number. Freeze time and stop now;\n // allow only that synchronous close to supplement the error text.\n pendingCloseError = error;\n removeListeners(true);\n errorReady = Promise.resolve().then(() => removeListeners());\n } else {\n removeListeners();\n }\n const started = beginResource();\n if (nativeSession) {\n // Invoke stop at the event boundary, without waiting for the start\n // promise or business callbacks. The native module processes in order.\n void FTRumWebSocketTracking.completeNativeResource(\n nativeSession,\n lifecycleVersion,\n resourceKey,\n started,\n {\n url,\n httpMethod: 'GET',\n requestHeader: requestHeaders,\n webSocketEvent: event,\n },\n timing,\n error,\n errorReady\n );\n return;\n }\n void FTRumWebSocketTracking.completeResource(\n resourceReporter,\n lifecycleVersion,\n resourceKey,\n started,\n url,\n requestHeaders,\n resourceStatus,\n state,\n timing,\n error,\n errorReady\n );\n };\n const onOpen = () => complete(0, 'success', undefined, 'open');\n const onError = (event: Event) => {\n complete(\n 0,\n 'failed',\n () => FTRumWebSocketTracking.handshakeErrorFromEvent(event),\n 'error',\n true\n );\n };\n const onClose = (event: Event) => {\n if (pendingCloseError) {\n const error = pendingCloseError;\n const message = FTRumWebSocketTracking.failureMessageFromClose(event);\n // Accessors can reenter shutdown. Do not restore a cancelled error.\n if (pendingCloseError === error) error.message = message;\n removeListeners();\n return;\n }\n // A standalone close is only a terminal signal. Never interpret its\n // business code/reason as a network error or as an HTTP response.\n complete(0, 'failed', undefined, 'close');\n };\n const listenerRemovers = [\n () => socket?.removeEventListener('open', onOpen),\n () => socket?.removeEventListener('error', onError),\n () => socket?.removeEventListener('close', onClose),\n ];\n\n try {\n socket = Reflect.construct(\n OriginalWebSocket,\n argumentsWithHeaders,\n newTarget\n );\n } catch (error) {\n complete(0, 'failed', () =>\n FTRumWebSocketTracking.toHandshakeError(error)\n );\n throw error;\n }\n\n try {\n socket.addEventListener('open', onOpen);\n socket.addEventListener('error', onError);\n socket.addEventListener('close', onClose);\n if (!completed) {\n FTRumWebSocketTracking.pendingHandshakes.add(cancelHandshake);\n // Do not leave a native Resource behind if listener installation fails.\n beginResource();\n }\n } catch {\n cancelHandshake();\n // A reentrant terminal may already have started normal Resource reporting.\n if (!startPromise) FTRumWebSocketTracking.cancelTrace(traceKey);\n FTRumWebSocketTracking.warnOnce('Unable to observe WebSocket events.');\n }\n return socket;\n }\n\n private static createResourceKey(): string {\n return 'xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx'.replace(/[xy]/g, (token) => {\n const randomNibble = Math.floor(Math.random() * 16);\n const uuidNibble = token === 'x' ? randomNibble : (randomNibble % 4) + 8;\n return uuidNibble.toString(16);\n });\n }\n\n private static cancelTrace(key: string | undefined): void {\n if (!key) return;\n try {\n // Older native binaries do not expose this optional cancellation bridge.\n if (\n typeof NativeFTReactNativeTrace?.cancelWebSocketTrace === 'function'\n ) {\n void Promise.resolve(\n NativeFTReactNativeTrace.cancelWebSocketTrace(key)\n ).catch(() => {});\n }\n } catch {\n // Cleanup must never interrupt the business constructor or its exception.\n }\n }\n\n private static getTraceHeaders(\n url: string,\n resourceKey: string\n ): Record<string, unknown> {\n try {\n const headers = NativeFTReactNativeTrace?.getTraceHeaderFieldsSync(\n url,\n resourceKey\n );\n return FTRumWebSocketTracking.toHeaderRecord(headers);\n } catch {\n FTRumWebSocketTracking.warnOnce(\n 'Unable to inject WebSocket trace headers.'\n );\n return {};\n }\n }\n\n private static mergeTraceHeaders(\n originalArguments: unknown[],\n traceHeaders: Record<string, unknown>\n ): {\n argumentsWithHeaders: unknown[];\n requestHeaders: Record<string, unknown>;\n } {\n const options = FTRumWebSocketTracking.toOptions(originalArguments[2]);\n const requestHeaders = {\n ...FTRumWebSocketTracking.toHeaderRecord(options.headers),\n };\n const traceHeaderEntries = Object.entries(traceHeaders);\n\n if (traceHeaderEntries.length === 0) {\n return {\n argumentsWithHeaders: originalArguments,\n requestHeaders,\n };\n }\n\n const traceHeaderNames = new Set(\n traceHeaderEntries.map(([key]) => key.toLowerCase())\n );\n Object.keys(requestHeaders).forEach((key) => {\n if (traceHeaderNames.has(key.toLowerCase())) {\n delete requestHeaders[key];\n }\n });\n traceHeaderEntries.forEach(([key, value]) => {\n requestHeaders[key] = value;\n });\n\n const argumentsWithHeaders = [...originalArguments];\n // Read a headers accessor only once. Spreading options here would read it\n // again before replacing it with the already captured header values.\n const optionDescriptors = Object.getOwnPropertyDescriptors(options);\n optionDescriptors.headers = {\n configurable: true,\n enumerable: true,\n writable: true,\n value: requestHeaders,\n };\n argumentsWithHeaders[2] = Object.defineProperties({}, optionDescriptors);\n return { argumentsWithHeaders, requestHeaders };\n }\n\n private static toOptions(value: unknown): ReactNativeWebSocketOptions {\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n return value as ReactNativeWebSocketOptions;\n }\n return {};\n }\n\n private static toHeaderRecord(value: unknown): Record<string, unknown> {\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n return value as Record<string, unknown>;\n }\n return {};\n }\n\n private static eventString(\n event: unknown,\n property: string\n ): string | undefined {\n if (!event || typeof event !== 'object') {\n return undefined;\n }\n try {\n const value = (event as Record<string, unknown>)[property];\n return typeof value === 'string' && value.length > 0 ? value : undefined;\n } catch {\n return undefined;\n }\n }\n\n private static handshakeErrorFromEvent(\n event: Event\n ): WebSocketHandshakeError {\n return { message: FTRumWebSocketTracking.eventString(event, 'message') };\n }\n\n private static failureMessageFromClose(event: Event): string | undefined {\n try {\n if ((event as Event & { code?: unknown })?.code === 1006) {\n return FTRumWebSocketTracking.eventString(event, 'reason');\n }\n } catch {\n // Optional event details must never interrupt business event dispatch.\n }\n return undefined;\n }\n\n private static statusFromError(\n message: string | undefined\n ): number | undefined {\n const match =\n message && message.length <= MAX_HTTP_ERROR_PARSE_LENGTH\n ? SOCKET_ROCKET_HTTP_ERROR.exec(message.trim())\n : null;\n return match ? Number(match[1]) : undefined;\n }\n\n private static toHandshakeError(error: unknown): WebSocketHandshakeError {\n try {\n return {\n message:\n error instanceof Error ? error.message || error.name : String(error),\n };\n } catch {\n return {};\n }\n }\n\n private static startResource(start: () => Promise<void>): Promise<boolean> {\n try {\n return Promise.resolve(start()).then(() => true);\n } catch (error) {\n return Promise.reject(error);\n }\n }\n\n private static async completeResource(\n resourceReporter: FTRumWebSocketResourceReporter,\n lifecycleVersion: number,\n resourceKey: string,\n startPromise: Promise<boolean>,\n url: string,\n requestHeader: Record<string, unknown>,\n resourceStatus: number,\n webSocketHandshakeState: WebSocketHandshakeState,\n timing: WebSocketTimingMetrics | undefined,\n error?: WebSocketHandshakeError,\n errorReady?: Promise<void>\n ): Promise<void> {\n const isCurrentLifecycle = () =>\n lifecycleVersion === FTRumWebSocketTracking.lifecycleVersion;\n try {\n if (!(await startPromise) || !isCurrentLifecycle()) {\n return;\n }\n try {\n await resourceReporter.stopResource(resourceKey);\n } catch {\n // addResource completes the native Resource. Attempt it even if stop\n // failed, but never retry addResource and risk duplicate completion.\n if (isCurrentLifecycle()) {\n FTRumWebSocketTracking.warnOnce('Unable to stop WebSocket resource.');\n }\n }\n if (errorReady) await errorReady;\n // Only old native binaries classify in JS. Resolve supplemental text\n // before normalization; duration was frozen at the first terminal event.\n const httpStatus = FTRumWebSocketTracking.statusFromError(error?.message);\n if (httpStatus !== undefined && webSocketHandshakeState !== 'success') {\n resourceStatus = httpStatus;\n webSocketHandshakeState = httpStatus !== 101 ? 'rejected' : 'failed';\n }\n const resource: FTRUMWebSocketResource = {\n url,\n httpMethod: 'GET',\n requestHeader,\n resourceStatus,\n resourceType: 'websocket',\n webSocketHandshake: true,\n webSocketHandshakeState,\n };\n if (error?.message) resource.errorMessage = error.message;\n if (isCurrentLifecycle()) {\n await resourceReporter.addResource(resourceKey, resource, timing);\n }\n } catch {\n if (isCurrentLifecycle()) {\n FTRumWebSocketTracking.warnOnce('Unable to report WebSocket resource.');\n }\n }\n }\n\n private static async completeNativeResource(\n session: NativeWebSocketSession,\n lifecycleVersion: number,\n key: string,\n started: Promise<boolean>,\n content: NativeWebSocketResource,\n timing: WebSocketTimingMetrics | undefined,\n error?: WebSocketHandshakeError,\n errorReady?: Promise<void>\n ): Promise<void> {\n // Attach rejection handling immediately, including when start never settles.\n let stopped: Promise<void>;\n try {\n stopped = Promise.resolve(\n session.stopResource(key, content.webSocketEvent)\n ).catch(() => {\n if (lifecycleVersion === FTRumWebSocketTracking.lifecycleVersion)\n FTRumWebSocketTracking.warnOnce('Unable to stop WebSocket resource.');\n });\n } catch {\n stopped = Promise.resolve();\n }\n try {\n if (!(await started)) return;\n await stopped;\n if (errorReady) await errorReady;\n if (lifecycleVersion !== FTRumWebSocketTracking.lifecycleVersion) return;\n await session.addResource(\n key,\n error?.message ? { ...content, errorMessage: error.message } : content,\n timing ?? {}\n );\n } catch {\n session.release(key);\n if (lifecycleVersion === FTRumWebSocketTracking.lifecycleVersion)\n FTRumWebSocketTracking.warnOnce('Unable to report WebSocket resource.');\n }\n }\n\n private static warnOnce(message: string): void {\n if (FTRumWebSocketTracking.warnedFailures.has(message)) {\n return;\n }\n FTRumWebSocketTracking.warnedFailures.add(message);\n try {\n console.warn(`[FT-SDK] ${message}`);\n } catch {\n // A host-provided logger must not turn instrumentation failure into one\n // on the application's constructor, event dispatch or promise chain.\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"names":["_reactNative","require","_default","exports","default","TurboModuleRegistry","get"],"sources":["NativeFTMobileReactNative.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/ban-types */\nimport type { TurboModule } from 'react-native';\nimport { TurboModuleRegistry } from 'react-native';\n\nexport interface Spec extends TurboModule {\n /**\n * SDK initialization method.\n * @param config SDK initialization configuration items.\n * @returns a Promise.\n */\n sdkConfig(config: Object): Promise<void>;\n /**\n * Dynamically set the Datakit upload URL after SDK initialization.\n * @param datakitUrl Datakit upload URL.\n * @returns a Promise.\n */\n setDatakitURL(datakitUrl: string): Promise<void>;\n /**\n * Dynamically set the Dataway upload URL and client token after SDK initialization.\n * @param datawayUrl Dataway upload URL.\n * @param clientToken Dataway authentication token.\n * @returns a Promise.\n */\n setDatawayURL(datawayUrl: string, clientToken: string): Promise<void>;\n /**\n * Bind user.\n * @param userId user ID.\n * @param userName user name.\n * @param userEmail user email\n * @param extra additional user information\n * @returns a Promise.\n */\n bindRUMUserData(\n userId: string,\n userName?: string,\n userEmail?: string,\n extra?: Object\n ): Promise<void>;\n /**\n * Unbind user.\n * @returns a Promise.\n */\n unbindRUMUserData(): Promise<void>;\n /**\n * Add custom global parameters. Applies to RUM and Log data\n * @param context custom global parameters.\n * @returns a Promise.\n */\n appendGlobalContext(context: Object): Promise<void>;\n /**\n * Add custom RUM global parameters. Applies to RUM data\n * @param context custom RUM global parameters.\n * @returns a Promise.\n */\n appendRUMGlobalContext(context: Object): Promise<void>;\n /**\n * Add custom RUM and Log global parameters. Applies to Log data\n * @param context custom Log global parameters.\n * @returns a Promise.\n */\n appendLogGlobalContext(context: Object): Promise<void>;\n /**\n * Actively synchronize data. When `FTMobileConfig.autoSync=false` is configured, you need to actively trigger this method to synchronize data.\n * @returns a Promise.\n */\n flushSyncData(): Promise<void>;\n\n /**\n * Synchronize events in iOS Widget Extension, iOS only\n * @param groupIdentifier app groupId\n * @returns {groupIdentifier:string,datas:Array<Object>} can be used to view data collected in Extension.\n */\n trackEventFromExtension(identifier: string): Promise<Object>;\n /**\n * Shut down objects currently running in the SDK\n */\n shutDown(): Promise<void>;\n /**\n * Clear all data that has not yet been uploaded to the server.\n */\n clearAllData(): Promise<void>;\n /**\n * Update remote configuration using the configured minimum update interval.\n */\n updateRemoteConfig(): Promise<Object>;\n /**\n * Update remote configuration using a custom minimum update interval and\n * optional override rules.\n */\n updateRemoteConfigWithMiniUpdateInterval(\n interval: number,\n rules?: Array<Object>\n ): Promise<Object>;\n /**\n * Required by NativeEventEmitter for remote configuration callbacks.\n */\n addListener(eventName: string): void;\n removeListeners(count: number): void;\n}\nexport default TurboModuleRegistry.get<Spec>('FTMobileReactNative');\n"],"mappings":";;;;;;AAEA,IAAAA,YAAA,GAAAC,OAAA;AAFA;AAAA,IAAAC,QAAA,GAAAC,OAAA,CAAAC,OAAA,GAmGeC,gCAAmB,CAACC,GAAG,CAAO,qBAAqB,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["_reactNative","require","_default","exports","default","TurboModuleRegistry","get"],"sources":["NativeFTMobileReactNative.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/ban-types */\nimport type { TurboModule } from 'react-native';\nimport { TurboModuleRegistry } from 'react-native';\n\nexport interface Spec extends TurboModule {\n /**\n * SDK initialization method.\n * @param config SDK initialization configuration items.\n * @returns a Promise.\n */\n sdkConfig(config: Object): Promise<void>;\n /**\n * Dynamically set the Datakit upload URL after SDK initialization.\n * @param datakitUrl Datakit upload URL.\n * @returns a Promise.\n */\n setDatakitURL(datakitUrl: string): Promise<void>;\n /**\n * Dynamically set the Dataway upload URL and client token after SDK initialization.\n * @param datawayUrl Dataway upload URL.\n * @param clientToken Dataway authentication token.\n * @returns a Promise.\n */\n setDatawayURL(datawayUrl: string, clientToken: string): Promise<void>;\n /**\n * Bind user.\n * @param userId user ID.\n * @param userName user name.\n * @param userEmail user email\n * @param extra additional user information\n * @returns a Promise.\n */\n bindRUMUserData(\n userId: string,\n userName?: string,\n userEmail?: string,\n extra?: Object\n ): Promise<void>;\n /**\n * Unbind user.\n * @returns a Promise.\n */\n unbindRUMUserData(): Promise<void>;\n resetVisitorId(): Promise<void>;\n /**\n * Add custom global parameters. Applies to RUM and Log data\n * @param context custom global parameters.\n * @returns a Promise.\n */\n appendGlobalContext(context: Object): Promise<void>;\n /**\n * Add custom RUM global parameters. Applies to RUM data\n * @param context custom RUM global parameters.\n * @returns a Promise.\n */\n appendRUMGlobalContext(context: Object): Promise<void>;\n /**\n * Add custom RUM and Log global parameters. Applies to Log data\n * @param context custom Log global parameters.\n * @returns a Promise.\n */\n appendLogGlobalContext(context: Object): Promise<void>;\n /**\n * Actively synchronize data. When `FTMobileConfig.autoSync=false` is configured, you need to actively trigger this method to synchronize data.\n * @returns a Promise.\n */\n flushSyncData(): Promise<void>;\n\n /**\n * Synchronize events in iOS Widget Extension, iOS only\n * @param groupIdentifier app groupId\n * @returns {groupIdentifier:string,datas:Array<Object>} can be used to view data collected in Extension.\n */\n trackEventFromExtension(identifier: string): Promise<Object>;\n /**\n * Shut down objects currently running in the SDK\n */\n shutDown(): Promise<void>;\n /**\n * Clear all data that has not yet been uploaded to the server.\n */\n clearAllData(): Promise<void>;\n /**\n * Update remote configuration using the configured minimum update interval.\n */\n updateRemoteConfig(): Promise<Object>;\n /**\n * Update remote configuration using a custom minimum update interval and\n * optional override rules.\n */\n updateRemoteConfigWithMiniUpdateInterval(\n interval: number,\n rules?: Array<Object>\n ): Promise<Object>;\n /**\n * Required by NativeEventEmitter for remote configuration callbacks.\n */\n addListener(eventName: string): void;\n removeListeners(count: number): void;\n}\nexport default TurboModuleRegistry.get<Spec>('FTMobileReactNative');\n"],"mappings":";;;;;;AAEA,IAAAA,YAAA,GAAAC,OAAA;AAFA;AAAA,IAAAC,QAAA,GAAAC,OAAA,CAAAC,OAAA,GAoGeC,gCAAmB,CAACC,GAAG,CAAO,qBAAqB,CAAC","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"names":["_reactNative","require","_default","exports","default","TurboModuleRegistry","get"],"sources":["NativeFTReactNativeRUM.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/ban-types */\nimport type { TurboModule } from 'react-native';\nimport { TurboModuleRegistry } from 'react-native';\n\nexport interface Spec extends TurboModule {\n /**\n * Set RUM tracking conditions and enable RUM collection.\n * @param config rum configuration parameters.\n * @returns a Promise.\n */\n setConfig(config: Object): Promise<void>;\n /** Internal synchronous snapshot used only by native JS long task reporting. */\n setLongTaskContext(context: Object): boolean;\n /** Stops the internal JavaScript long task monitor before SDK shutdown. */\n stopLongTaskTracking(): Promise<void>;\n /**\n * Start RUM Action.\n * RUM will bind Resource, Error, LongTask events that may be triggered by this Action.\n * Avoid adding multiple times within 0.1s, only one Action will be associated with the same View at the same time, and new Actions will be discarded if the previous one has not ended.\n * Adding Action with `addAction` method does not affect each other.\n * @param actionName action name\n * @param actionType action type\n * @param property event context (optional)\n * @returns a Promise.\n */\n startAction(\n actionName: string,\n actionType: string,\n property?: Object\n ): Promise<void>;\n /**\n * Add Action event. This type of data cannot be associated with Error, Resource, LongTask data, and has no discard logic.\n * @param actionName action name\n * @param actionType action type\n * @param property event context (optional)\n * @returns a Promise.\n */\n addAction(\n actionName: string,\n actionType: string,\n property?: Object\n ): Promise<void>;\n /**\n * view load duration.\n * @param viewName view name\n * @param loadTime view load duration\n * @returns a Promise.\n */\n onCreateView(viewName: string, loadTime: number): Promise<void>;\n /**\n * view start.\n * @param viewName page name\n * @param property event context (optional)\n * @returns a Promise.\n */\n startView(viewName: string, property?: Object): Promise<void>;\n /**\n * view end.\n * @param property event context (optional)\n * @returns a Promise.\n */\n stopView(property?: Object): Promise<void>;\n /**\n * Exception capture and log collection.\n * @param stack stack log\n * @param message error message\n * @param property event context (optional)\n * @returns a Promise.\n */\n addError(stack: string, message: string, property?: Object): Promise<void>;\n /**\n * Exception capture and log collection.\n * @param type error type\n * @param stack stack log\n * @param message error message\n * @param property event context (optional)\n * @returns a Promise.\n */\n addErrorWithType(\n type: string,\n stack: string,\n message: string,\n property?: Object\n ): Promise<void>;\n /**\n * Start resource request.\n * @param key unique id\n * @param property event context (optional)\n * @returns a Promise.\n */\n startResource(key: string, property?: Object): Promise<void>;\n /**\n * End resource request.\n * @param key unique id\n * @param property event context (optional)\n * @returns a Promise.\n */\n stopResource(key: string, property?: Object): Promise<void>;\n /**\n * Send resource data metrics.\n * @param key unique id\n * @param resource resource data\n * @param metrics resource performance data\n * @returns a Promise.\n */\n addResource(key: string, resource: Object, metrics?: Object): Promise<void>;\n}\nexport default TurboModuleRegistry.get<Spec>('FTReactNativeRUM');\n"],"mappings":";;;;;;AAEA,IAAAA,YAAA,GAAAC,OAAA;AAFA;AAAA,IAAAC,QAAA,GAAAC,OAAA,CAAAC,OAAA,GA2GeC,gCAAmB,CAACC,GAAG,CAAO,kBAAkB,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["_reactNative","require","_default","exports","default","TurboModuleRegistry","get"],"sources":["NativeFTReactNativeRUM.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/ban-types */\nimport type { TurboModule } from 'react-native';\nimport { TurboModuleRegistry } from 'react-native';\n\nexport interface Spec extends TurboModule {\n /**\n * Set RUM tracking conditions and enable RUM collection.\n * @param config rum configuration parameters.\n * @returns a Promise.\n */\n setConfig(config: Object): Promise<void>;\n /** Internal synchronous snapshot used only by native JS long task reporting. */\n setLongTaskContext(context: Object): boolean;\n /** Stops the internal JavaScript long task monitor before SDK shutdown. */\n stopLongTaskTracking(): Promise<void>;\n /**\n * Start RUM Action.\n * RUM will bind Resource, Error, LongTask events that may be triggered by this Action.\n * Avoid adding multiple times within 0.1s, only one Action will be associated with the same View at the same time, and new Actions will be discarded if the previous one has not ended.\n * Adding Action with `addAction` method does not affect each other.\n * @param actionName action name\n * @param actionType action type\n * @param property event context (optional)\n * @returns a Promise.\n */\n startAction(\n actionName: string,\n actionType: string,\n property?: Object\n ): Promise<void>;\n /**\n * Add Action event. This type of data cannot be associated with Error, Resource, LongTask data, and has no discard logic.\n * @param actionName action name\n * @param actionType action type\n * @param property event context (optional)\n * @returns a Promise.\n */\n addAction(\n actionName: string,\n actionType: string,\n property?: Object\n ): Promise<void>;\n /**\n * view load duration.\n * @param viewName view name\n * @param loadTime monotonic view load duration in nanoseconds\n * @returns a Promise.\n */\n onCreateView(viewName: string, loadTime: number): Promise<void>;\n /** Replace the current View's loading duration; non-negative safe integer nanoseconds. */\n updateViewLoadingTime(duration: number): Promise<void>;\n /** Framework integration: duration in ns; epoch start in ms, converted natively. */\n onCreateViewWithLoadStart(\n viewName: string,\n loadTime: number,\n loadStartEpochMs: number\n ): Promise<void>;\n /** Framework integration: Manual = 0, Automatic = 1. */\n startViewWithTrackingType(\n viewName: string,\n property: Object | undefined,\n trackingType: number\n ): Promise<void>;\n /**\n * view start.\n * @param viewName page name\n * @param property event context (optional)\n * @returns a Promise.\n */\n startView(viewName: string, property?: Object): Promise<void>;\n /**\n * view end.\n * @param property event context (optional)\n * @returns a Promise.\n */\n stopView(property?: Object): Promise<void>;\n /**\n * Exception capture and log collection.\n * @param stack stack log\n * @param message error message\n * @param property event context (optional)\n * @returns a Promise.\n */\n addError(stack: string, message: string, property?: Object): Promise<void>;\n /**\n * Exception capture and log collection.\n * @param type error type\n * @param stack stack log\n * @param message error message\n * @param property event context (optional)\n * @returns a Promise.\n */\n addErrorWithType(\n type: string,\n stack: string,\n message: string,\n property?: Object\n ): Promise<void>;\n /**\n * Start resource request.\n * @param key unique id\n * @param property event context (optional)\n * @returns a Promise.\n */\n startResource(key: string, property?: Object): Promise<void>;\n /**\n * End resource request.\n * @param key unique id\n * @param property event context (optional)\n * @returns a Promise.\n */\n stopResource(key: string, property?: Object): Promise<void>;\n /**\n * Send resource data metrics.\n * @param key unique id\n * @param resource resource data\n * @param metrics resource performance data\n * @returns a Promise.\n */\n addResource(key: string, resource: Object, metrics?: Object): Promise<void>;\n}\nexport default TurboModuleRegistry.get<Spec>('FTReactNativeRUM');\n"],"mappings":";;;;;;AAEA,IAAAA,YAAA,GAAAC,OAAA;AAFA;AAAA,IAAAC,QAAA,GAAAC,OAAA,CAAAC,OAAA,GAyHeC,gCAAmB,CAACC,GAAG,CAAO,kBAAkB,CAAC","ignoreList":[]}
@@ -5,5 +5,5 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.version = void 0;
7
7
  // generated by genversion
8
- const version = exports.version = '0.4.3-alpha.2';
8
+ const version = exports.version = '0.4.3';
9
9
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["version","exports"],"sources":["version.ts"],"sourcesContent":["// generated by genversion\nexport const version = '0.4.3-alpha.2';\n"],"mappings":";;;;;;AAAA;AACO,MAAMA,OAAO,GAAAC,OAAA,CAAAD,OAAA,GAAG,eAAe","ignoreList":[]}
1
+ {"version":3,"names":["version","exports"],"sources":["version.ts"],"sourcesContent":["// generated by genversion\nexport const version = '0.4.3';\n"],"mappings":";;;;;;AAAA;AACO,MAAMA,OAAO,GAAAC,OAAA,CAAAD,OAAA,GAAG,OAAO","ignoreList":[]}
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.validateVisitorIdConfig = validateVisitorIdConfig;
7
+ /** Anonymous Visitor ID header configuration for HTTP(S), excluding WebSockets. */
8
+
9
+ // These restrictions are shared by the target iOS and Android native SDKs.
10
+ const reservedHeaders = new Set(['accept-charset', 'accept-encoding', 'access-control-request-headers', 'access-control-request-method', 'connection', 'content-length', 'cookie', 'cookie2', 'date', 'dnt', 'expect', 'host', 'keep-alive', 'origin', 'permissions-policy', 'referer', 'te', 'trailer', 'transfer-encoding', 'upgrade', 'via', 'b3', 'traceparent', 'tracestate', 'uber-trace-id', 'sw8', 'x-gc-trace-id', 'x-gc-span-id', 'x-rum-resource-id']);
11
+ const reservedFragments = ['authorization', 'authentication', 'api-key', 'api_key', 'apikey', 'auth-token', 'auth_token', 'access-token', 'access_token', 'session-token', 'session_token', 'refresh-token', 'refresh_token', 'id-token', 'id_token', 'security-token', 'security_token', 'csrf', 'xsrf', 'jwt', 'signature'];
12
+ function validateVisitorIdConfig(config) {
13
+ if (!config || typeof config !== 'object' || Array.isArray(config)) {
14
+ throw new Error('visitorIdConfig must be an object');
15
+ }
16
+ const {
17
+ header,
18
+ ttlHours = 24,
19
+ urlPrefixes = [],
20
+ regularExpressions = []
21
+ } = config;
22
+ if (typeof header !== 'string' || /[\r\n]/.test(header) || !/^[!#$%&'*+.^_`|~0-9a-z-]+$/.test(header) || reservedHeaders.has(header) || reservedFragments.some(part => header.includes(part)) || ['proxy-', 'sec-', 'x-datadog-', 'x-b3-'].some(prefix => header.startsWith(prefix))) {
23
+ throw new Error('visitorIdConfig.header must be a lowercase custom HTTP header');
24
+ }
25
+ // Android stores TTL as a signed long number of milliseconds.
26
+ const milliseconds = ttlHours * 3600000;
27
+ if (typeof ttlHours !== 'number' || !Number.isFinite(ttlHours) || milliseconds < 1 || milliseconds >= 2 ** 63) {
28
+ throw new Error('visitorIdConfig.ttlHours must represent at least 1 millisecond and fit a signed 64-bit integer');
29
+ }
30
+ if (!Array.isArray(urlPrefixes) || !Array.isArray(regularExpressions) || urlPrefixes.length + regularExpressions.length === 0) {
31
+ throw new Error('visitorIdConfig requires at least one URL matching rule');
32
+ }
33
+ if (urlPrefixes.some(prefix => typeof prefix !== 'string' || !/^https?:\/\/[^/?#\s]+(?:[/?#]|$)/i.test(prefix)) || regularExpressions.some(pattern => typeof pattern !== 'string' || pattern.length === 0)) {
34
+ throw new Error('visitorIdConfig contains an invalid URL matching rule');
35
+ }
36
+ }
37
+ //# sourceMappingURL=visitorIdConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["reservedHeaders","Set","reservedFragments","validateVisitorIdConfig","config","Array","isArray","Error","header","ttlHours","urlPrefixes","regularExpressions","test","has","some","part","includes","prefix","startsWith","milliseconds","Number","isFinite","length","pattern"],"sources":["visitorIdConfig.ts"],"sourcesContent":["/** Anonymous Visitor ID header configuration for HTTP(S), excluding WebSockets. */\nexport interface FTVisitorIdConfig {\n header: string;\n /** Fixed lifetime in hours; defaults to 24. Access does not renew it. */\n ttlHours?: number;\n /** Complete HTTP(S) prefixes constrained to the same scheme, host and port. */\n urlPrefixes?: string[];\n /** Native regular expressions searched against the complete URL; rules use OR. */\n regularExpressions?: string[];\n}\n\n// These restrictions are shared by the target iOS and Android native SDKs.\nconst reservedHeaders = new Set([\n 'accept-charset',\n 'accept-encoding',\n 'access-control-request-headers',\n 'access-control-request-method',\n 'connection',\n 'content-length',\n 'cookie',\n 'cookie2',\n 'date',\n 'dnt',\n 'expect',\n 'host',\n 'keep-alive',\n 'origin',\n 'permissions-policy',\n 'referer',\n 'te',\n 'trailer',\n 'transfer-encoding',\n 'upgrade',\n 'via',\n 'b3',\n 'traceparent',\n 'tracestate',\n 'uber-trace-id',\n 'sw8',\n 'x-gc-trace-id',\n 'x-gc-span-id',\n 'x-rum-resource-id',\n]);\nconst reservedFragments = [\n 'authorization',\n 'authentication',\n 'api-key',\n 'api_key',\n 'apikey',\n 'auth-token',\n 'auth_token',\n 'access-token',\n 'access_token',\n 'session-token',\n 'session_token',\n 'refresh-token',\n 'refresh_token',\n 'id-token',\n 'id_token',\n 'security-token',\n 'security_token',\n 'csrf',\n 'xsrf',\n 'jwt',\n 'signature',\n];\n\nexport function validateVisitorIdConfig(config: FTVisitorIdConfig): void {\n if (!config || typeof config !== 'object' || Array.isArray(config)) {\n throw new Error('visitorIdConfig must be an object');\n }\n const {\n header,\n ttlHours = 24,\n urlPrefixes = [],\n regularExpressions = [],\n } = config;\n if (\n typeof header !== 'string' ||\n /[\\r\\n]/.test(header) ||\n !/^[!#$%&'*+.^_`|~0-9a-z-]+$/.test(header) ||\n reservedHeaders.has(header) ||\n reservedFragments.some((part) => header.includes(part)) ||\n ['proxy-', 'sec-', 'x-datadog-', 'x-b3-'].some((prefix) =>\n header.startsWith(prefix)\n )\n ) {\n throw new Error(\n 'visitorIdConfig.header must be a lowercase custom HTTP header'\n );\n }\n // Android stores TTL as a signed long number of milliseconds.\n const milliseconds = ttlHours * 3600000;\n if (\n typeof ttlHours !== 'number' ||\n !Number.isFinite(ttlHours) ||\n milliseconds < 1 ||\n milliseconds >= 2 ** 63\n ) {\n throw new Error(\n 'visitorIdConfig.ttlHours must represent at least 1 millisecond and fit a signed 64-bit integer'\n );\n }\n if (\n !Array.isArray(urlPrefixes) ||\n !Array.isArray(regularExpressions) ||\n urlPrefixes.length + regularExpressions.length === 0\n ) {\n throw new Error('visitorIdConfig requires at least one URL matching rule');\n }\n if (\n urlPrefixes.some(\n (prefix) =>\n typeof prefix !== 'string' ||\n !/^https?:\\/\\/[^/?#\\s]+(?:[/?#]|$)/i.test(prefix)\n ) ||\n regularExpressions.some(\n (pattern) => typeof pattern !== 'string' || pattern.length === 0\n )\n ) {\n throw new Error('visitorIdConfig contains an invalid URL matching rule');\n }\n}\n"],"mappings":";;;;;;AAAA;;AAWA;AACA,MAAMA,eAAe,GAAG,IAAIC,GAAG,CAAC,CAC9B,gBAAgB,EAChB,iBAAiB,EACjB,gCAAgC,EAChC,+BAA+B,EAC/B,YAAY,EACZ,gBAAgB,EAChB,QAAQ,EACR,SAAS,EACT,MAAM,EACN,KAAK,EACL,QAAQ,EACR,MAAM,EACN,YAAY,EACZ,QAAQ,EACR,oBAAoB,EACpB,SAAS,EACT,IAAI,EACJ,SAAS,EACT,mBAAmB,EACnB,SAAS,EACT,KAAK,EACL,IAAI,EACJ,aAAa,EACb,YAAY,EACZ,eAAe,EACf,KAAK,EACL,eAAe,EACf,cAAc,EACd,mBAAmB,CACpB,CAAC;AACF,MAAMC,iBAAiB,GAAG,CACxB,eAAe,EACf,gBAAgB,EAChB,SAAS,EACT,SAAS,EACT,QAAQ,EACR,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,cAAc,EACd,eAAe,EACf,eAAe,EACf,eAAe,EACf,eAAe,EACf,UAAU,EACV,UAAU,EACV,gBAAgB,EAChB,gBAAgB,EAChB,MAAM,EACN,MAAM,EACN,KAAK,EACL,WAAW,CACZ;AAEM,SAASC,uBAAuBA,CAACC,MAAyB,EAAQ;EACvE,IAAI,CAACA,MAAM,IAAI,OAAOA,MAAM,KAAK,QAAQ,IAAIC,KAAK,CAACC,OAAO,CAACF,MAAM,CAAC,EAAE;IAClE,MAAM,IAAIG,KAAK,CAAC,mCAAmC,CAAC;EACtD;EACA,MAAM;IACJC,MAAM;IACNC,QAAQ,GAAG,EAAE;IACbC,WAAW,GAAG,EAAE;IAChBC,kBAAkB,GAAG;EACvB,CAAC,GAAGP,MAAM;EACV,IACE,OAAOI,MAAM,KAAK,QAAQ,IAC1B,QAAQ,CAACI,IAAI,CAACJ,MAAM,CAAC,IACrB,CAAC,4BAA4B,CAACI,IAAI,CAACJ,MAAM,CAAC,IAC1CR,eAAe,CAACa,GAAG,CAACL,MAAM,CAAC,IAC3BN,iBAAiB,CAACY,IAAI,CAAEC,IAAI,IAAKP,MAAM,CAACQ,QAAQ,CAACD,IAAI,CAAC,CAAC,IACvD,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,CAAC,CAACD,IAAI,CAAEG,MAAM,IACpDT,MAAM,CAACU,UAAU,CAACD,MAAM,CAC1B,CAAC,EACD;IACA,MAAM,IAAIV,KAAK,CACb,+DACF,CAAC;EACH;EACA;EACA,MAAMY,YAAY,GAAGV,QAAQ,GAAG,OAAO;EACvC,IACE,OAAOA,QAAQ,KAAK,QAAQ,IAC5B,CAACW,MAAM,CAACC,QAAQ,CAACZ,QAAQ,CAAC,IAC1BU,YAAY,GAAG,CAAC,IAChBA,YAAY,IAAI,CAAC,IAAI,EAAE,EACvB;IACA,MAAM,IAAIZ,KAAK,CACb,gGACF,CAAC;EACH;EACA,IACE,CAACF,KAAK,CAACC,OAAO,CAACI,WAAW,CAAC,IAC3B,CAACL,KAAK,CAACC,OAAO,CAACK,kBAAkB,CAAC,IAClCD,WAAW,CAACY,MAAM,GAAGX,kBAAkB,CAACW,MAAM,KAAK,CAAC,EACpD;IACA,MAAM,IAAIf,KAAK,CAAC,yDAAyD,CAAC;EAC5E;EACA,IACEG,WAAW,CAACI,IAAI,CACbG,MAAM,IACL,OAAOA,MAAM,KAAK,QAAQ,IAC1B,CAAC,mCAAmC,CAACL,IAAI,CAACK,MAAM,CACpD,CAAC,IACDN,kBAAkB,CAACG,IAAI,CACpBS,OAAO,IAAK,OAAOA,OAAO,KAAK,QAAQ,IAAIA,OAAO,CAACD,MAAM,KAAK,CACjE,CAAC,EACD;IACA,MAAM,IAAIf,KAAK,CAAC,uDAAuD,CAAC;EAC1E;AACF","ignoreList":[]}
@@ -23,8 +23,10 @@ export let FTLogCacheDiscard = /*#__PURE__*/function (FTLogCacheDiscard) {
23
23
  }({});
24
24
  /**
25
25
  * Configure log output configuration.
26
- * @param sampleRate sampling rate
26
+ * @param logSamplingRate Log sampling percentage in [0, 100], default 100. Supports fractional percentages and takes precedence over sampleRate.
27
+ * @param sampleRate Deprecated log sampling probability in [0, 1], default 1. Used only when logSamplingRate is omitted; multiplied by 100 before passing to Native.
27
28
  * @param enableLinkRumData whether to link with RUM
29
+ * @param enableWebViewLog Collect Browser Logs SDK events from WebViews, default false
28
30
  * @param enableCustomLog whether to enable custom logs
29
31
  * @param discardStrategy log discard strategy
30
32
  * @param logLevelFilters log level filter
@@ -1 +1 @@
1
- {"version":3,"names":["bridgeContextManager","FTLogStatus","FTLogCacheDiscard","FTReactNativeLogWrapper","constructor","_defineProperty","require","default","logConfig","config","logger","logging","content","logStatus","property","mergedProperties","mergeWithLocalPropertiesSync","logWithStatusString","toString","enumLogStatus","FTReactNativeLog"],"sources":["ft_logger.tsx"],"sourcesContent":["import { bridgeContextManager } from './ft_mobile_agent';\n/**\n * Set log level.\n */\nexport enum FTLogStatus {\n info,\n warning,\n error,\n critical,\n ok,\n}\n/**\n * Log discard method.\n */\nexport enum FTLogCacheDiscard {\n discard,\n discardOldest,\n}\n/**\n * Configure log output configuration.\n * @param sampleRate sampling rate\n * @param enableLinkRumData whether to link with RUM\n * @param enableCustomLog whether to enable custom logs\n * @param discardStrategy log discard strategy\n * @param logLevelFilters log level filter\n * @param globalContext custom global parameters\n * @param logCacheLimitCount get maximum log entry count limit [1000,), default 5000\n */\nexport interface FTLogConfig {\n sampleRate?: number;\n enableLinkRumData?: boolean;\n enableCustomLog?: boolean;\n discardStrategy?: FTLogCacheDiscard;\n logLevelFilters?: Array<FTLogStatus>;\n globalContext?: object;\n logCacheLimitCount?: number;\n}\n\ntype FTReactNativeLogType = {\n /**\n *Configure log output configuration to enable log collection.\n */\n logConfig(config: FTLogConfig): Promise<void>;\n /**\n * Output log.\n * @param content log content\n * @param status log status\n * @param property log context (optional)\n */\n logging(\n content: string,\n logStatus: FTLogStatus,\n property?: object\n ): Promise<void>;\n /**\n * Output log.\n * @param content log content\n * @param status log status\n * @param property log context (optional)\n */\n logWithStatusString(\n content: string,\n logStatus: string,\n property?: object\n ): Promise<void>;\n};\n\nclass FTReactNativeLogWrapper {\n /* eslint-disable @typescript-eslint/no-var-requires */\n private logger: FTReactNativeLogType =\n require('./specs/NativeFTReactNativeLog').default;\n /* eslint-enable @typescript-eslint/no-var-requires */\n\n /**\n *Configure log output configuration to enable log collection.\n */\n logConfig(config: FTLogConfig): Promise<void> {\n return this.logger.logConfig(config);\n }\n\n /**\n * Output log.\n * @param content log content\n * @param status log status\n * @param property log context (optional)\n */\n logging(\n content: string,\n logStatus: FTLogStatus | string,\n property?: object\n ): Promise<void> {\n // Automatically merge bridge context properties with local properties\n const mergedProperties =\n bridgeContextManager.mergeWithLocalPropertiesSync(property);\n\n if (typeof logStatus === 'string') {\n return this.logger.logWithStatusString(\n content,\n logStatus.toString(),\n mergedProperties\n );\n }\n let enumLogStatus: FTLogStatus = logStatus as FTLogStatus;\n return this.logger.logging(content, enumLogStatus, mergedProperties);\n }\n}\nexport const FTReactNativeLog: FTReactNativeLogWrapper =\n new FTReactNativeLogWrapper();\n"],"mappings":";;;AAAA,SAASA,oBAAoB,QAAQ,mBAAmB;AACxD;AACA;AACA;AACA,WAAYC,WAAW,0BAAXA,WAAW;EAAXA,WAAW,CAAXA,WAAW;EAAXA,WAAW,CAAXA,WAAW;EAAXA,WAAW,CAAXA,WAAW;EAAXA,WAAW,CAAXA,WAAW;EAAXA,WAAW,CAAXA,WAAW;EAAA,OAAXA,WAAW;AAAA;AAOvB;AACA;AACA;AACA,WAAYC,iBAAiB,0BAAjBA,iBAAiB;EAAjBA,iBAAiB,CAAjBA,iBAAiB;EAAjBA,iBAAiB,CAAjBA,iBAAiB;EAAA,OAAjBA,iBAAiB;AAAA;AAI7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAwCA,MAAMC,uBAAuB,CAAC;EAAAC,YAAA;IAC5B;IAAAC,eAAA,iBAEEC,OAAO,CAAC,gCAAgC,CAAC,CAACC,OAAO;EAAA;EACnD;;EAEA;AACF;AACA;EACEC,SAASA,CAACC,MAAmB,EAAiB;IAC5C,OAAO,IAAI,CAACC,MAAM,CAACF,SAAS,CAACC,MAAM,CAAC;EACtC;;EAEA;AACF;AACA;AACA;AACA;AACA;EACEE,OAAOA,CACLC,OAAe,EACfC,SAA+B,EAC/BC,QAAiB,EACF;IACf;IACA,MAAMC,gBAAgB,GACpBf,oBAAoB,CAACgB,4BAA4B,CAACF,QAAQ,CAAC;IAE7D,IAAI,OAAOD,SAAS,KAAK,QAAQ,EAAE;MACjC,OAAO,IAAI,CAACH,MAAM,CAACO,mBAAmB,CACpCL,OAAO,EACPC,SAAS,CAACK,QAAQ,CAAC,CAAC,EACpBH,gBACF,CAAC;IACH;IACA,IAAII,aAA0B,GAAGN,SAAwB;IACzD,OAAO,IAAI,CAACH,MAAM,CAACC,OAAO,CAACC,OAAO,EAAEO,aAAa,EAAEJ,gBAAgB,CAAC;EACtE;AACF;AACA,OAAO,MAAMK,gBAAyC,GACpD,IAAIjB,uBAAuB,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["bridgeContextManager","FTLogStatus","FTLogCacheDiscard","FTReactNativeLogWrapper","constructor","_defineProperty","require","default","logConfig","config","logger","logging","content","logStatus","property","mergedProperties","mergeWithLocalPropertiesSync","logWithStatusString","toString","enumLogStatus","FTReactNativeLog"],"sources":["ft_logger.tsx"],"sourcesContent":["import { bridgeContextManager } from './ft_mobile_agent';\n/**\n * Set log level.\n */\nexport enum FTLogStatus {\n info,\n warning,\n error,\n critical,\n ok,\n}\n/**\n * Log discard method.\n */\nexport enum FTLogCacheDiscard {\n discard,\n discardOldest,\n}\n/**\n * Configure log output configuration.\n * @param logSamplingRate Log sampling percentage in [0, 100], default 100. Supports fractional percentages and takes precedence over sampleRate.\n * @param sampleRate Deprecated log sampling probability in [0, 1], default 1. Used only when logSamplingRate is omitted; multiplied by 100 before passing to Native.\n * @param enableLinkRumData whether to link with RUM\n * @param enableWebViewLog Collect Browser Logs SDK events from WebViews, default false\n * @param enableCustomLog whether to enable custom logs\n * @param discardStrategy log discard strategy\n * @param logLevelFilters log level filter\n * @param globalContext custom global parameters\n * @param logCacheLimitCount get maximum log entry count limit [1000,), default 5000\n */\nexport interface FTLogConfig {\n /**\n * Log sampling percentage in [0, 100], default 100.\n * Supports fractional percentages: 12.5 means 12.5%, not 0.125.\n * Takes precedence over sampleRate when both are supplied, including 0.\n */\n logSamplingRate?: number;\n /** @deprecated Use logSamplingRate. Probability in [0, 1], default 1; 0.125 maps to 12.5%. Ignored when logSamplingRate is supplied. */\n sampleRate?: number;\n enableLinkRumData?: boolean;\n enableCustomLog?: boolean;\n enableWebViewLog?: boolean;\n discardStrategy?: FTLogCacheDiscard;\n logLevelFilters?: Array<FTLogStatus>;\n globalContext?: object;\n logCacheLimitCount?: number;\n}\n\ntype FTReactNativeLogType = {\n /**\n *Configure log output configuration to enable log collection.\n */\n logConfig(config: FTLogConfig): Promise<void>;\n /**\n * Output log.\n * @param content log content\n * @param status log status\n * @param property log context (optional)\n */\n logging(\n content: string,\n logStatus: FTLogStatus,\n property?: object\n ): Promise<void>;\n /**\n * Output log.\n * @param content log content\n * @param status log status\n * @param property log context (optional)\n */\n logWithStatusString(\n content: string,\n logStatus: string,\n property?: object\n ): Promise<void>;\n};\n\nclass FTReactNativeLogWrapper {\n /* eslint-disable @typescript-eslint/no-var-requires */\n private logger: FTReactNativeLogType =\n require('./specs/NativeFTReactNativeLog').default;\n /* eslint-enable @typescript-eslint/no-var-requires */\n\n /**\n *Configure log output configuration to enable log collection.\n */\n logConfig(config: FTLogConfig): Promise<void> {\n return this.logger.logConfig(config);\n }\n\n /**\n * Output log.\n * @param content log content\n * @param status log status\n * @param property log context (optional)\n */\n logging(\n content: string,\n logStatus: FTLogStatus | string,\n property?: object\n ): Promise<void> {\n // Automatically merge bridge context properties with local properties\n const mergedProperties =\n bridgeContextManager.mergeWithLocalPropertiesSync(property);\n\n if (typeof logStatus === 'string') {\n return this.logger.logWithStatusString(\n content,\n logStatus.toString(),\n mergedProperties\n );\n }\n let enumLogStatus: FTLogStatus = logStatus as FTLogStatus;\n return this.logger.logging(content, enumLogStatus, mergedProperties);\n }\n}\nexport const FTReactNativeLog: FTReactNativeLogWrapper =\n new FTReactNativeLogWrapper();\n"],"mappings":";;;AAAA,SAASA,oBAAoB,QAAQ,mBAAmB;AACxD;AACA;AACA;AACA,WAAYC,WAAW,0BAAXA,WAAW;EAAXA,WAAW,CAAXA,WAAW;EAAXA,WAAW,CAAXA,WAAW;EAAXA,WAAW,CAAXA,WAAW;EAAXA,WAAW,CAAXA,WAAW;EAAXA,WAAW,CAAXA,WAAW;EAAA,OAAXA,WAAW;AAAA;AAOvB;AACA;AACA;AACA,WAAYC,iBAAiB,0BAAjBA,iBAAiB;EAAjBA,iBAAiB,CAAjBA,iBAAiB;EAAjBA,iBAAiB,CAAjBA,iBAAiB;EAAA,OAAjBA,iBAAiB;AAAA;AAI7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAgDA,MAAMC,uBAAuB,CAAC;EAAAC,YAAA;IAC5B;IAAAC,eAAA,iBAEEC,OAAO,CAAC,gCAAgC,CAAC,CAACC,OAAO;EAAA;EACnD;;EAEA;AACF;AACA;EACEC,SAASA,CAACC,MAAmB,EAAiB;IAC5C,OAAO,IAAI,CAACC,MAAM,CAACF,SAAS,CAACC,MAAM,CAAC;EACtC;;EAEA;AACF;AACA;AACA;AACA;AACA;EACEE,OAAOA,CACLC,OAAe,EACfC,SAA+B,EAC/BC,QAAiB,EACF;IACf;IACA,MAAMC,gBAAgB,GACpBf,oBAAoB,CAACgB,4BAA4B,CAACF,QAAQ,CAAC;IAE7D,IAAI,OAAOD,SAAS,KAAK,QAAQ,EAAE;MACjC,OAAO,IAAI,CAACH,MAAM,CAACO,mBAAmB,CACpCL,OAAO,EACPC,SAAS,CAACK,QAAQ,CAAC,CAAC,EACpBH,gBACF,CAAC;IACH;IACA,IAAII,aAA0B,GAAGN,SAAwB;IACzD,OAAO,IAAI,CAACH,MAAM,CAACC,OAAO,CAACC,OAAO,EAAEO,aAAa,EAAEJ,gBAAgB,CAAC;EACtE;AACF;AACA,OAAO,MAAMK,gBAAyC,GACpD,IAAIjB,uBAAuB,CAAC,CAAC","ignoreList":[]}
@@ -148,6 +148,8 @@ export let FTDBCacheDiscard = /*#__PURE__*/function (FTDBCacheDiscard) {
148
148
  /**
149
149
  * Values that can be modified by remote config override rules.
150
150
  * These values will adjust the fetched remote configuration before it is applied.
151
+ * Omitted fields are not changed by this rule. Sampling percentages use [0, 100]
152
+ * and support fractions (12.5 means 12.5%); legacy probabilities use [0, 1].
151
153
  */
152
154
 
153
155
  /**
@@ -216,7 +218,14 @@ class FTMobileReactNativeWrapper {
216
218
  if (config.serverUrl != null && config.serverUrl.length > 0 && config.datakitUrl == null) {
217
219
  config.datakitUrl = config.serverUrl;
218
220
  }
219
- return this.sdk.sdkConfig(config);
221
+ const nativeConfig = {
222
+ ...config
223
+ };
224
+ // Keep undefined equivalent to omission; explicit null overrides legacy hosts.
225
+ if (nativeConfig.allowWebViewHost === undefined) {
226
+ delete nativeConfig.allowWebViewHost;
227
+ }
228
+ return this.sdk.sdkConfig(nativeConfig);
220
229
  }
221
230
  setDatakitURL(datakitUrl) {
222
231
  return this.sdk.setDatakitURL(datakitUrl);
@@ -227,6 +236,9 @@ class FTMobileReactNativeWrapper {
227
236
  bindRUMUserData(userId, userName, userEmail, extra) {
228
237
  return this.sdk.bindRUMUserData(userId, userName, userEmail, extra);
229
238
  }
239
+ resetVisitorId() {
240
+ return this.sdk.resetVisitorId();
241
+ }
230
242
  unbindRUMUserData() {
231
243
  return this.sdk.unbindRUMUserData();
232
244
  }
@@ -1 +1 @@
1
- {"version":3,"names":["NativeEventEmitter","NativeModules","version","sdkVersion","FTRumWebSocketTracking","BridgeContextManager","constructor","_defineProperty","Map","initializeSDKInfo","sdkBridgeInfo","react_native","properties","set","JSON","stringify","getInstance","instance","appendBridgeContext","Object","entries","forEach","key","value","longTaskContextEnabled","syncLongTaskContext","error","console","warn","configureLongTaskContext","enabled","rum","require","default","setLongTaskContext","mergeWithLocalPropertiesSync","localProperties","merged","assign","_BridgeContextManager","bridgeContextManager","EnvType","FTDBCacheDiscard","FTMobileReactNativeWrapper","getEmitter","_NativeModules$FTMobi","emitter","nativeEventModule","FTMobileReactNative","sdk","sdkConfig","config","serverUrl","length","datakitUrl","setDatakitURL","setDatawayURL","datawayUrl","clientToken","bindRUMUserData","userId","userName","userEmail","extra","unbindRUMUserData","appendGlobalContext","context","appendLogGlobalContext","appendRUMGlobalContext","trackEventFromExtension","identifier","flushSyncData","shutDown","stopLongTaskTracking","clearAllData","updateRemoteConfig","updateRemoteConfigWithMiniUpdateInterval","interval","rules","addRemoteConfigListener","listener","addListener"],"sources":["ft_mobile_agent.tsx"],"sourcesContent":["import {\n EmitterSubscription,\n NativeEventEmitter,\n NativeModules,\n} from 'react-native';\nimport type { Spec as NativeFTMobileReactNativeSpec } from './specs/NativeFTMobileReactNative';\nimport type { Spec as NativeFTReactNativeRUMSpec } from './specs/NativeFTReactNativeRUM';\nimport { version as sdkVersion } from './version';\nimport { FTRumWebSocketTracking } from './rum/FTRumWebSocketTracking';\n\n/**\n * Bridge context manager for managing shared properties across RUM and Logger modules\n * This class provides a centralized way to store and retrieve global properties that will be\n * automatically merged with local properties when making calls to RUM and Logger functions\n */\nclass BridgeContextManager {\n private static instance: BridgeContextManager;\n private properties: Map<string, any> = new Map();\n private longTaskContextEnabled = false;\n\n private constructor() {\n // Initialize with SDK version information\n this.initializeSDKInfo();\n }\n\n /**\n * Initialize SDK information properties\n * @private\n */\n private initializeSDKInfo(): void {\n // Create sdk_bridge_info with version information\n const sdkBridgeInfo = {\n react_native: sdkVersion,\n };\n\n // Set the sdk_bridge_info property\n this.properties.set('sdk_bridge_info', JSON.stringify(sdkBridgeInfo));\n }\n\n /**\n * Get singleton instance of BridgeContextManager\n * @returns BridgeContextManager instance\n */\n public static getInstance(): BridgeContextManager {\n if (!BridgeContextManager.instance) {\n BridgeContextManager.instance = new BridgeContextManager();\n }\n return BridgeContextManager.instance;\n }\n\n /**\n * Add bridge context properties that will be automatically merged with local properties\n * @param properties Object containing key-value pairs\n */\n public appendBridgeContext(properties: Record<string, any>): void {\n // Store properties locally in JavaScript\n try {\n // Store properties locally in JavaScript\n Object.entries(properties).forEach(([key, value]) => {\n this.properties.set(key, value);\n });\n if (this.longTaskContextEnabled) {\n this.syncLongTaskContext();\n }\n } catch (error) {\n console.warn('Failed to append bridge context:', error);\n }\n }\n\n public configureLongTaskContext(enabled: boolean): void {\n this.longTaskContextEnabled = enabled;\n if (enabled) {\n this.syncLongTaskContext();\n }\n }\n\n private syncLongTaskContext(): void {\n try {\n // Apply the snapshot before JS can block. An async native call may run after\n // the frame that detects the long task and attach stale context to it.\n const rum: NativeFTReactNativeRUMSpec =\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n require('./specs/NativeFTReactNativeRUM').default;\n rum.setLongTaskContext(this.mergeWithLocalPropertiesSync());\n } catch (error) {\n // Context synchronization must not make a destroyed/older bridge crash the host.\n console.warn('Failed to sync JS long task bridge context:', error);\n }\n }\n\n /**\n * Merge bridge context properties with local properties\n * Bridge context properties take precedence over local properties\n * @param localProperties Local properties to merge with bridge context properties\n * @returns Merged properties object\n */\n public mergeWithLocalPropertiesSync(\n localProperties?: object\n ): Record<string, any> {\n try {\n const merged: Record<string, any> = {};\n\n // First add local properties (if any)\n if (localProperties) {\n Object.assign(merged, localProperties);\n }\n\n // Then add bridge context properties (these will override local properties with same keys)\n this.properties.forEach((value, key) => {\n merged[key] = value;\n });\n\n return merged;\n } catch (error) {\n console.warn(\n 'Failed to merge bridge context with local properties:',\n error\n );\n // Return empty object or only local properties on error\n return localProperties ? { ...localProperties } : {};\n }\n }\n}\n\n// Internal bridge context manager - not exported\nexport const bridgeContextManager = BridgeContextManager.getInstance();\n\n/**\n * Environment.\n */\nexport enum EnvType {\n prod,\n gray,\n pre,\n common,\n local,\n}\nexport enum FTDBCacheDiscard {\n discard,\n discardOldest,\n}\n\n/**\n * Remote config override rule matching condition for custom keys. Supports exact match and contains match.\n * For exact match, set the value directly, for example: \"userid\": \"test_user\", which means the rule will be applied when the custom key \"userid\" is exactly \"test_user\".\n * For contains match, set the value as an object with a \"contains\" field, for example: \"userid\": { \"contains\": \"test_user\" }, which means the rule will be applied when the custom key \"userid\" contains the object \"test_user\".\n */\nexport type FTRemoteConfigCustomKeyContainsMatch = {\n contains: string | number | boolean;\n};\n\n/**\n * Matching rules for remote config override\n * Defines matching conditions using customKeys\n */\nexport type FTRemoteConfigOverrideMatch = {\n customKeys?: Record<\n string,\n string | number | boolean | FTRemoteConfigCustomKeyContainsMatch\n >;\n};\n\n/**\n * Values that can be modified by remote config override rules.\n * These values will adjust the fetched remote configuration before it is applied.\n */\nexport type FTRemoteConfigOverrideValues = {\n env?: string;\n serviceName?: string;\n autoSync?: boolean;\n compressIntakeRequests?: boolean;\n syncPageSize?: number;\n syncSleepTime?: number;\n rumSampleRate?: number;\n rumSessionOnErrorSampleRate?: number;\n rumEnableTraceUserAction?: boolean;\n rumEnableTraceUserView?: boolean;\n rumEnableTraceUserResource?: boolean;\n rumEnableResourceHostIP?: boolean;\n rumEnableTrackAppUIBlock?: boolean;\n rumBlockDurationMs?: number;\n rumEnableTrackAppCrash?: boolean;\n rumEnableTrackAppANR?: boolean;\n rumEnableTraceWebView?: boolean;\n rumAllowWebViewHost?: Array<string>;\n traceSampleRate?: number;\n traceEnableAutoTrace?: boolean;\n traceType?: string;\n logSampleRate?: number;\n logLevelFilters?: Array<string>;\n logEnableCustomLog?: boolean;\n logEnableConsoleLog?: boolean;\n};\n\n/**\n * Remote config override rules .\n * Adjust the fetched remote configuration before application.\n */\nexport type FTRemoteConfigOverrideRule = {\n id?: string;\n enabled?: boolean;\n match: FTRemoteConfigOverrideMatch;\n override: FTRemoteConfigOverrideValues;\n};\n/**\n * Final result of the remote config update\n * @param triggerType the type of remote config update trigger, auto or manual\n * @param success whether the remote config update was successful\n * @param platform the platform of the device, ios or android\n * @param timestamp the timestamp when the remote config update was triggered\n * @param rawJson the final remote config update result, in JSON string format\n * @param errorCode the error code if the remote config update failed, may be null if the update was successful\n * @param errorMessage the error message if the remote config update failed, may be null if the update was successful\n * @param appliedOverrideRuleIds the list of override rule IDs applied in this remote config update, may be null if no rules were applied\n */\nexport type FTRemoteConfigResult = {\n triggerType: 'auto' | 'manual';\n success: boolean;\n platform: 'ios' | 'android';\n timestamp: number;\n rawJson?: string;\n errorCode?: string | number;\n errorMessage?: string;\n appliedOverrideRuleIds?: string[];\n};\n/**\n * Configure SDK startup parameters.\n * @param serverUrl data reporting address, deprecated, use [datakitUrl] instead\n * @param datakitUrl datakit access URL address, example: http://10.0.0.1:9529, default port 9529. Choose one between datakit and dataway configuration\n * @param datawayUrl dataway access URL address, example: http://10.0.0.1:9528, default port 9528, note: the device installing the SDK needs to be able to access this address. Note: choose one between datakit and dataway configuration\n * @param clientToken dataway authentication token, needs to be configured together with [datawayUrl]\n * @param debug set whether to allow log printing, default false\n * @param env environment, default prod\n * @param service set the name of the business or service it belongs to, default: `df_rum_ios`, `df_rum_android`\n * @param autoSync whether data is automatically synchronized and uploaded, default: true\n * @param syncPageSize number of synchronized items per request during data synchronization, minimum value 5, default: 10\n * @param syncSleepTime interval time between each request during data synchronization, unit milliseconds, 0 < syncSleepTime < 100\n * @param enableDataIntegerCompatible whether to enable data integer compatibility during data synchronization, enabled by default\n * @param compressIntakeRequests whether to compress synchronized data\n * @param enableDataFilter whether to enable SDK-side local data filters, enabled by default\n * @param dataFilters local blocklist filter rules. Supported categories include `logging` and `rum`. Any data that matches a rule will be discarded.\n * @param globalContext custom global parameters\n * @param groupIdentifiers iOS side sets the AppGroups Identifier array corresponding to the collected Widget Extension\n * @param enableLimitWithDbSize set whether to enable using db to limit data size, after enabling, `FTLogConfig.logCacheLimitCount` and `FTRUMConfig.rumCacheLimitCount` will no longer take effect\n * @param dbCacheLimit db cache limit size, minimum value 30MB, default 100MB, unit byte\n * @param dbDiscardStrategy db data discard strategy\n * @param dataModifier data modifier, modify individual fields {key:value}, after setting, the SDK will replace the original value with the set value according to the key\n * @param lineDataModifier data modifier, modify single data {\"measurement\":measurement,\"data\":{key:value}}, after setting, the SDK will replace the original value with the set value according to the key\n * @param remoteConfiguration Set whether to enable remote dynamic configuration\n * @param remoteConfigMiniUpdateInterval Set remote dynamic configuration minimum update interval, unit seconds, default 12*60*60\n * @param remoteConfigOverrideRules Remote config override rules .Adjust the fetched remote configuration before application.\n */\nexport interface FTMobileConfig {\n /**\n * @deprecated \"serverUrl\" parameter renamed to \"datakitUrl\"\n */\n serverUrl?: string;\n datakitUrl?: string;\n datawayUrl?: string;\n clientToken?: string;\n debug?: boolean;\n envType?: EnvType;\n env?: string;\n service?: string;\n autoSync?: boolean;\n syncPageSize?: number;\n syncSleepTime?: number;\n enableDataIntegerCompatible?: boolean;\n compressIntakeRequests?: boolean;\n enableDataFilter?: boolean;\n dataFilters?: Record<string, Array<string>>;\n globalContext?: object;\n groupIdentifiers?: Array<string>;\n enableLimitWithDbSize?: boolean;\n dbCacheLimit?: number;\n dbDiscardStrategy?: FTDBCacheDiscard;\n dataModifier?: object;\n lineDataModifier?: object;\n remoteConfiguration?: boolean;\n remoteConfigMiniUpdateInterval?: number;\n remoteConfigOverrideRules?: Array<FTRemoteConfigOverrideRule>;\n}\n\ntype FTMobileReactNativeType = {\n /**\n * SDK initialization method.\n * @param config SDK initialization configuration items.\n * @returns a Promise.\n */\n sdkConfig(config: FTMobileConfig): Promise<void>;\n /**\n * Dynamically set the Datakit upload URL after SDK initialization.\n * @param datakitUrl Datakit upload URL.\n * @returns a Promise.\n */\n setDatakitURL(datakitUrl: string): Promise<void>;\n /**\n * Dynamically set the Dataway upload URL and client token after SDK initialization.\n * @param datawayUrl Dataway upload URL.\n * @param clientToken Dataway authentication token.\n * @returns a Promise.\n */\n setDatawayURL(datawayUrl: string, clientToken: string): Promise<void>;\n /**\n * Bind user.\n * @param userId user ID.\n * @param userName user name.\n * @param userEmail user email\n * @param extra additional user information\n * @returns a Promise.\n */\n bindRUMUserData(\n userId: string,\n userName?: string,\n userEmail?: string,\n extra?: object\n ): Promise<void>;\n /**\n * Unbind user.\n * @returns a Promise.\n */\n unbindRUMUserData(): Promise<void>;\n /**\n * Add custom global parameters. Applies to RUM and Log data\n * @param context custom global parameters.\n * @returns a Promise.\n */\n appendGlobalContext(context: object): Promise<void>;\n /**\n * Add custom RUM global parameters. Applies to RUM data\n * @param context custom RUM global parameters.\n * @returns a Promise.\n */\n appendRUMGlobalContext(context: object): Promise<void>;\n /**\n * Add custom RUM and Log global parameters. Applies to Log data\n * @param context custom Log global parameters.\n * @returns a Promise.\n */\n appendLogGlobalContext(context: object): Promise<void>;\n /**\n * Actively synchronize data. When `FTMobileConfig.autoSync=false` is configured, you need to actively trigger this method to synchronize data.\n * @returns a Promise.\n */\n flushSyncData(): Promise<void>;\n\n /**\n * Synchronize events in iOS Widget Extension, iOS only\n * @param groupIdentifier app groupId\n * @returns {groupIdentifier:string,datas:Array<object>} can be used to view data collected in Extension.\n */\n trackEventFromExtension(identifier: string): Promise<object>;\n /**\n * Shut down objects currently running in the SDK\n */\n shutDown(): Promise<void>;\n /**\n * Clear all data that has not yet been uploaded to the server.\n */\n clearAllData(): Promise<void>;\n /**\n * Add bridge context properties that will be automatically merged with local properties\n * @param properties Object containing key-value pairs\n */\n appendBridgeContext(properties: Record<string, any>): void;\n /**\n * Update remote configuration, after enabling remote configuration, you can call this method to update the configuration in real time.\n */\n updateRemoteConfig(): Promise<FTRemoteConfigResult>;\n /**\n * Update remote configuration with minimum update interval, after enabling remote configuration, you can call this method to update the configuration in real time.\n * This method is used to set the minimum update interval for remote configuration updates. If the time since the last update is less than the specified interval, the update will not be performed.\n * @param interval minimum update interval, unit seconds\n * @param rules Remote config override rules .Adjust the fetched remote configuration before application.\n * @returns the result of the remote config update\n */\n updateRemoteConfigWithMiniUpdateInterval(\n interval: number,\n rules?: Array<FTRemoteConfigOverrideRule>\n ): Promise<FTRemoteConfigResult>;\n /**\n * Listen for auto remote configuration updates triggered by the native SDK.\n * Manual updates are returned through the update Promise instead of this event.\n */\n addRemoteConfigListener(\n listener: (result: FTRemoteConfigResult) => void\n ): EmitterSubscription;\n};\n\nclass FTMobileReactNativeWrapper implements FTMobileReactNativeType {\n /* eslint-disable @typescript-eslint/no-var-requires */\n private sdk: NativeFTMobileReactNativeSpec =\n require('./specs/NativeFTMobileReactNative').default;\n private rum: NativeFTReactNativeRUMSpec =\n require('./specs/NativeFTReactNativeRUM').default;\n /* eslint-enable @typescript-eslint/no-var-requires */\n\n private emitter: NativeEventEmitter | null = null;\n\n private getEmitter(): NativeEventEmitter {\n if (this.emitter) {\n return this.emitter;\n }\n\n const nativeEventModule = NativeModules.FTMobileReactNative ?? this.sdk;\n this.emitter = new NativeEventEmitter(nativeEventModule as never);\n return this.emitter;\n }\n\n sdkConfig(config: FTMobileConfig): Promise<void> {\n if (\n config.serverUrl != null &&\n config.serverUrl.length > 0 &&\n config.datakitUrl == null\n ) {\n config.datakitUrl = config.serverUrl;\n }\n return this.sdk.sdkConfig(config);\n }\n setDatakitURL(datakitUrl: string): Promise<void> {\n return this.sdk.setDatakitURL(datakitUrl);\n }\n setDatawayURL(datawayUrl: string, clientToken: string): Promise<void> {\n return this.sdk.setDatawayURL(datawayUrl, clientToken);\n }\n bindRUMUserData(\n userId: string,\n userName?: string,\n userEmail?: string,\n extra?: object\n ): Promise<void> {\n return this.sdk.bindRUMUserData(userId, userName, userEmail, extra);\n }\n unbindRUMUserData(): Promise<void> {\n return this.sdk.unbindRUMUserData();\n }\n appendGlobalContext(context: object): Promise<void> {\n return this.sdk.appendGlobalContext(context);\n }\n appendLogGlobalContext(context: object): Promise<void> {\n return this.sdk.appendLogGlobalContext(context);\n }\n appendRUMGlobalContext(context: object): Promise<void> {\n return this.sdk.appendRUMGlobalContext(context);\n }\n trackEventFromExtension(identifier: string): Promise<object> {\n return this.sdk.trackEventFromExtension(identifier);\n }\n flushSyncData(): Promise<void> {\n return this.sdk.flushSyncData();\n }\n async shutDown(): Promise<void> {\n bridgeContextManager.configureLongTaskContext(false);\n try {\n FTRumWebSocketTracking.shutDown();\n await this.rum.stopLongTaskTracking();\n } finally {\n await this.sdk.shutDown();\n }\n }\n clearAllData(): Promise<void> {\n return this.sdk.clearAllData();\n }\n appendBridgeContext(properties: Record<string, any>): void {\n // Store properties in JS and update the native long task snapshot when enabled.\n bridgeContextManager.appendBridgeContext(properties);\n }\n updateRemoteConfig(): Promise<FTRemoteConfigResult> {\n return this.sdk.updateRemoteConfig() as Promise<FTRemoteConfigResult>;\n }\n updateRemoteConfigWithMiniUpdateInterval(\n interval: number,\n rules?: Array<FTRemoteConfigOverrideRule>\n ): Promise<FTRemoteConfigResult> {\n return this.sdk.updateRemoteConfigWithMiniUpdateInterval(\n interval,\n rules\n ) as Promise<FTRemoteConfigResult>;\n }\n addRemoteConfigListener(\n listener: (result: FTRemoteConfigResult) => void\n ): EmitterSubscription {\n return this.getEmitter().addListener('ft_remote_config_callback', listener);\n }\n}\nexport const FTMobileReactNative: FTMobileReactNativeType =\n new FTMobileReactNativeWrapper();\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["NativeEventEmitter","NativeModules","version","sdkVersion","FTRumWebSocketTracking","BridgeContextManager","constructor","_defineProperty","Map","initializeSDKInfo","sdkBridgeInfo","react_native","properties","set","JSON","stringify","getInstance","instance","appendBridgeContext","Object","entries","forEach","key","value","longTaskContextEnabled","syncLongTaskContext","error","console","warn","configureLongTaskContext","enabled","rum","require","default","setLongTaskContext","mergeWithLocalPropertiesSync","localProperties","merged","assign","_BridgeContextManager","bridgeContextManager","EnvType","FTDBCacheDiscard","FTMobileReactNativeWrapper","getEmitter","_NativeModules$FTMobi","emitter","nativeEventModule","FTMobileReactNative","sdk","sdkConfig","config","serverUrl","length","datakitUrl","nativeConfig","allowWebViewHost","undefined","setDatakitURL","setDatawayURL","datawayUrl","clientToken","bindRUMUserData","userId","userName","userEmail","extra","resetVisitorId","unbindRUMUserData","appendGlobalContext","context","appendLogGlobalContext","appendRUMGlobalContext","trackEventFromExtension","identifier","flushSyncData","shutDown","stopLongTaskTracking","clearAllData","updateRemoteConfig","updateRemoteConfigWithMiniUpdateInterval","interval","rules","addRemoteConfigListener","listener","addListener"],"sources":["ft_mobile_agent.tsx"],"sourcesContent":["import {\n EmitterSubscription,\n NativeEventEmitter,\n NativeModules,\n} from 'react-native';\nimport type { Spec as NativeFTMobileReactNativeSpec } from './specs/NativeFTMobileReactNative';\nimport type { Spec as NativeFTReactNativeRUMSpec } from './specs/NativeFTReactNativeRUM';\nimport { version as sdkVersion } from './version';\nimport { FTRumWebSocketTracking } from './rum/FTRumWebSocketTracking';\n\n/**\n * Bridge context manager for managing shared properties across RUM and Logger modules\n * This class provides a centralized way to store and retrieve global properties that will be\n * automatically merged with local properties when making calls to RUM and Logger functions\n */\nclass BridgeContextManager {\n private static instance: BridgeContextManager;\n private properties: Map<string, any> = new Map();\n private longTaskContextEnabled = false;\n\n private constructor() {\n // Initialize with SDK version information\n this.initializeSDKInfo();\n }\n\n /**\n * Initialize SDK information properties\n * @private\n */\n private initializeSDKInfo(): void {\n // Create sdk_bridge_info with version information\n const sdkBridgeInfo = {\n react_native: sdkVersion,\n };\n\n // Set the sdk_bridge_info property\n this.properties.set('sdk_bridge_info', JSON.stringify(sdkBridgeInfo));\n }\n\n /**\n * Get singleton instance of BridgeContextManager\n * @returns BridgeContextManager instance\n */\n public static getInstance(): BridgeContextManager {\n if (!BridgeContextManager.instance) {\n BridgeContextManager.instance = new BridgeContextManager();\n }\n return BridgeContextManager.instance;\n }\n\n /**\n * Add bridge context properties that will be automatically merged with local properties\n * @param properties Object containing key-value pairs\n */\n public appendBridgeContext(properties: Record<string, any>): void {\n // Store properties locally in JavaScript\n try {\n // Store properties locally in JavaScript\n Object.entries(properties).forEach(([key, value]) => {\n this.properties.set(key, value);\n });\n if (this.longTaskContextEnabled) {\n this.syncLongTaskContext();\n }\n } catch (error) {\n console.warn('Failed to append bridge context:', error);\n }\n }\n\n public configureLongTaskContext(enabled: boolean): void {\n this.longTaskContextEnabled = enabled;\n if (enabled) {\n this.syncLongTaskContext();\n }\n }\n\n private syncLongTaskContext(): void {\n try {\n // Apply the snapshot before JS can block. An async native call may run after\n // the frame that detects the long task and attach stale context to it.\n const rum: NativeFTReactNativeRUMSpec =\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n require('./specs/NativeFTReactNativeRUM').default;\n rum.setLongTaskContext(this.mergeWithLocalPropertiesSync());\n } catch (error) {\n // Context synchronization must not make a destroyed/older bridge crash the host.\n console.warn('Failed to sync JS long task bridge context:', error);\n }\n }\n\n /**\n * Merge bridge context properties with local properties\n * Bridge context properties take precedence over local properties\n * @param localProperties Local properties to merge with bridge context properties\n * @returns Merged properties object\n */\n public mergeWithLocalPropertiesSync(\n localProperties?: object\n ): Record<string, any> {\n try {\n const merged: Record<string, any> = {};\n\n // First add local properties (if any)\n if (localProperties) {\n Object.assign(merged, localProperties);\n }\n\n // Then add bridge context properties (these will override local properties with same keys)\n this.properties.forEach((value, key) => {\n merged[key] = value;\n });\n\n return merged;\n } catch (error) {\n console.warn(\n 'Failed to merge bridge context with local properties:',\n error\n );\n // Return empty object or only local properties on error\n return localProperties ? { ...localProperties } : {};\n }\n }\n}\n\n// Internal bridge context manager - not exported\nexport const bridgeContextManager = BridgeContextManager.getInstance();\n\n/**\n * Environment.\n */\nexport enum EnvType {\n prod,\n gray,\n pre,\n common,\n local,\n}\nexport enum FTDBCacheDiscard {\n discard,\n discardOldest,\n}\n\n/**\n * Remote config override rule matching condition for custom keys. Supports exact match and contains match.\n * For exact match, set the value directly, for example: \"userid\": \"test_user\", which means the rule will be applied when the custom key \"userid\" is exactly \"test_user\".\n * For contains match, set the value as an object with a \"contains\" field, for example: \"userid\": { \"contains\": \"test_user\" }, which means the rule will be applied when the custom key \"userid\" contains the object \"test_user\".\n */\nexport type FTRemoteConfigCustomKeyContainsMatch = {\n contains: string | number | boolean;\n};\n\n/**\n * Matching rules for remote config override\n * Defines matching conditions using customKeys\n */\nexport type FTRemoteConfigOverrideMatch = {\n customKeys?: Record<\n string,\n string | number | boolean | FTRemoteConfigCustomKeyContainsMatch\n >;\n};\n\n/**\n * Values that can be modified by remote config override rules.\n * These values will adjust the fetched remote configuration before it is applied.\n * Omitted fields are not changed by this rule. Sampling percentages use [0, 100]\n * and support fractions (12.5 means 12.5%); legacy probabilities use [0, 1].\n */\nexport type FTRemoteConfigOverrideValues = {\n env?: string;\n serviceName?: string;\n autoSync?: boolean;\n compressIntakeRequests?: boolean;\n syncPageSize?: number;\n syncSleepTime?: number;\n /** RUM session sampling percentage override in [0, 100]; takes precedence over rumSampleRate, including 0. */\n sessionSamplingRate?: number;\n /** Error session sampling percentage override in [0, 100]; takes precedence over rumSessionOnErrorSampleRate, including 0. */\n sessionOnErrorSamplingRate?: number;\n /** Trace sampling percentage override in [0, 100]; takes precedence over traceSampleRate, including 0. */\n traceSamplingRate?: number;\n /** Log sampling percentage override in [0, 100]; takes precedence over logSampleRate, including 0. */\n logSamplingRate?: number;\n /** Session Replay sampling percentage override in [0, 100]; fractional percentages are supported. */\n sessionReplaySamplingRate?: number;\n /** Error replay sampling percentage override in [0, 100]; fractional percentages are supported. */\n sessionReplayOnErrorSamplingRate?: number;\n /** @deprecated Use sessionSamplingRate. Legacy RUM probability override in [0, 1]; 0.125 maps to 12.5%. */\n rumSampleRate?: number;\n /** @deprecated Use sessionOnErrorSamplingRate. Legacy error session probability override in [0, 1]. */\n rumSessionOnErrorSampleRate?: number;\n rumEnableTraceUserAction?: boolean;\n rumEnableTraceUserView?: boolean;\n rumEnableTraceUserResource?: boolean;\n rumEnableResourceHostIP?: boolean;\n rumEnableTrackAppUIBlock?: boolean;\n rumBlockDurationMs?: number;\n rumEnableTrackAppCrash?: boolean;\n rumEnableTrackAppANR?: boolean;\n rumEnableTraceWebView?: boolean;\n rumAllowWebViewHost?: Array<string>;\n /** @deprecated Use traceSamplingRate. Legacy Trace probability override in [0, 1]. */\n traceSampleRate?: number;\n traceEnableAutoTrace?: boolean;\n traceType?: string;\n /** @deprecated Use logSamplingRate. Legacy log probability override in [0, 1]. */\n logSampleRate?: number;\n logLevelFilters?: Array<string>;\n logEnableCustomLog?: boolean;\n logEnableWebViewLog?: boolean;\n logEnableConsoleLog?: boolean;\n};\n\n/**\n * Remote config override rules .\n * Adjust the fetched remote configuration before application.\n */\nexport type FTRemoteConfigOverrideRule = {\n id?: string;\n enabled?: boolean;\n match: FTRemoteConfigOverrideMatch;\n override: FTRemoteConfigOverrideValues;\n};\n/**\n * Final result of the remote config update\n * @param triggerType the type of remote config update trigger, auto or manual\n * @param success whether the remote config update was successful\n * @param platform the platform of the device, ios or android\n * @param timestamp the timestamp when the remote config update was triggered\n * @param rawJson the final remote config update result, in JSON string format\n * @param errorCode the error code if the remote config update failed, may be null if the update was successful\n * @param errorMessage the error message if the remote config update failed, may be null if the update was successful\n * @param appliedOverrideRuleIds the list of override rule IDs applied in this remote config update, may be null if no rules were applied\n */\nexport type FTRemoteConfigResult = {\n triggerType: 'auto' | 'manual';\n success: boolean;\n platform: 'ios' | 'android';\n timestamp: number;\n rawJson?: string;\n errorCode?: string | number;\n errorMessage?: string;\n appliedOverrideRuleIds?: string[];\n};\n/**\n * Configure SDK startup parameters.\n * @param serverUrl data reporting address, deprecated, use [datakitUrl] instead\n * @param datakitUrl datakit access URL address, example: http://10.0.0.1:9529, default port 9529. Choose one between datakit and dataway configuration\n * @param datawayUrl dataway access URL address, example: http://10.0.0.1:9528, default port 9528, note: the device installing the SDK needs to be able to access this address. Note: choose one between datakit and dataway configuration\n * @param clientToken dataway authentication token, needs to be configured together with [datawayUrl]\n * @param debug set whether to allow log printing, default false\n * @param env environment, default prod\n * @param service set the name of the business or service it belongs to, default: `df_rum_ios`, `df_rum_android`\n * @param autoSync whether data is automatically synchronized and uploaded, default: true\n * @param syncPageSize number of synchronized items per request during data synchronization, minimum value 5, default: 10\n * @param syncSleepTime interval time between each request during data synchronization, unit milliseconds, 0 < syncSleepTime < 100\n * @param enableDataIntegerCompatible whether to enable data integer compatibility during data synchronization, enabled by default\n * @param compressIntakeRequests whether to compress synchronized data\n * @param enableDataFilter whether to enable SDK-side local data filters, enabled by default\n * @param dataFilters local blocklist filter rules. Supported categories include `logging` and `rum`. Any data that matches a rule will be discarded.\n * @param globalContext custom global parameters\n * @param groupIdentifiers iOS side sets the AppGroups Identifier array corresponding to the collected Widget Extension\n * @param enableLimitWithDbSize set whether to enable using db to limit data size, after enabling, `FTLogConfig.logCacheLimitCount` and `FTRUMConfig.rumCacheLimitCount` will no longer take effect\n * @param dbCacheLimit db cache limit size, minimum value 30MB, default 100MB, unit byte\n * @param dbDiscardStrategy db data discard strategy\n * @param dataModifier data modifier, modify individual fields {key:value}, after setting, the SDK will replace the original value with the set value according to the key\n * @param lineDataModifier data modifier, modify single data {\"measurement\":measurement,\"data\":{key:value}}, after setting, the SDK will replace the original value with the set value according to the key\n * @param remoteConfiguration Set whether to enable remote dynamic configuration\n * @param remoteConfigMiniUpdateInterval Set remote dynamic configuration minimum update interval, unit seconds, default 12*60*60\n * @param remoteConfigOverrideRules Remote config override rules .Adjust the fetched remote configuration before application.\n */\nexport interface FTMobileConfig {\n /**\n * @deprecated \"serverUrl\" parameter renamed to \"datakitUrl\"\n */\n serverUrl?: string;\n datakitUrl?: string;\n datawayUrl?: string;\n clientToken?: string;\n debug?: boolean;\n envType?: EnvType;\n env?: string;\n service?: string;\n autoSync?: boolean;\n syncPageSize?: number;\n syncSleepTime?: number;\n enableDataIntegerCompatible?: boolean;\n compressIntakeRequests?: boolean;\n enableDataFilter?: boolean;\n dataFilters?: Record<string, Array<string>>;\n /** Shared WebView host allowlist for RUM and Log. Omitted uses the legacy RUM\n * config; null allows every host; [] disables bridge access. Remote config wins.\n */\n allowWebViewHost?: Array<string> | null;\n globalContext?: object;\n groupIdentifiers?: Array<string>;\n enableLimitWithDbSize?: boolean;\n dbCacheLimit?: number;\n dbDiscardStrategy?: FTDBCacheDiscard;\n dataModifier?: object;\n lineDataModifier?: object;\n remoteConfiguration?: boolean;\n remoteConfigMiniUpdateInterval?: number;\n remoteConfigOverrideRules?: Array<FTRemoteConfigOverrideRule>;\n}\n\ntype FTMobileReactNativeType = {\n /**\n * SDK initialization method.\n * @param config SDK initialization configuration items.\n * @returns a Promise.\n */\n sdkConfig(config: FTMobileConfig): Promise<void>;\n /**\n * Dynamically set the Datakit upload URL after SDK initialization.\n * @param datakitUrl Datakit upload URL.\n * @returns a Promise.\n */\n setDatakitURL(datakitUrl: string): Promise<void>;\n /**\n * Dynamically set the Dataway upload URL and client token after SDK initialization.\n * @param datawayUrl Dataway upload URL.\n * @param clientToken Dataway authentication token.\n * @returns a Promise.\n */\n setDatawayURL(datawayUrl: string, clientToken: string): Promise<void>;\n /**\n * Bind user.\n * @param userId user ID.\n * @param userName user name.\n * @param userEmail user email\n * @param extra additional user information\n * @returns a Promise.\n */\n bindRUMUserData(\n userId: string,\n userName?: string,\n userEmail?: string,\n extra?: object\n ): Promise<void>;\n /**\n * Unbind user.\n * @returns a Promise.\n */\n unbindRUMUserData(): Promise<void>;\n /** Rotate the native anonymous Visitor ID for subsequent requests. */\n resetVisitorId(): Promise<void>;\n /**\n * Add custom global parameters. Applies to RUM and Log data\n * @param context custom global parameters.\n * @returns a Promise.\n */\n appendGlobalContext(context: object): Promise<void>;\n /**\n * Add custom RUM global parameters. Applies to RUM data\n * @param context custom RUM global parameters.\n * @returns a Promise.\n */\n appendRUMGlobalContext(context: object): Promise<void>;\n /**\n * Add custom RUM and Log global parameters. Applies to Log data\n * @param context custom Log global parameters.\n * @returns a Promise.\n */\n appendLogGlobalContext(context: object): Promise<void>;\n /**\n * Actively synchronize data. When `FTMobileConfig.autoSync=false` is configured, you need to actively trigger this method to synchronize data.\n * @returns a Promise.\n */\n flushSyncData(): Promise<void>;\n\n /**\n * Synchronize events in iOS Widget Extension, iOS only\n * @param groupIdentifier app groupId\n * @returns {groupIdentifier:string,datas:Array<object>} can be used to view data collected in Extension.\n */\n trackEventFromExtension(identifier: string): Promise<object>;\n /**\n * Shut down objects currently running in the SDK\n */\n shutDown(): Promise<void>;\n /**\n * Clear all data that has not yet been uploaded to the server.\n */\n clearAllData(): Promise<void>;\n /**\n * Add bridge context properties that will be automatically merged with local properties\n * @param properties Object containing key-value pairs\n */\n appendBridgeContext(properties: Record<string, any>): void;\n /**\n * Update remote configuration, after enabling remote configuration, you can call this method to update the configuration in real time.\n */\n updateRemoteConfig(): Promise<FTRemoteConfigResult>;\n /**\n * Update remote configuration with minimum update interval, after enabling remote configuration, you can call this method to update the configuration in real time.\n * This method is used to set the minimum update interval for remote configuration updates. If the time since the last update is less than the specified interval, the update will not be performed.\n * @param interval minimum update interval, unit seconds\n * @param rules Remote config override rules .Adjust the fetched remote configuration before application.\n * @returns the result of the remote config update\n */\n updateRemoteConfigWithMiniUpdateInterval(\n interval: number,\n rules?: Array<FTRemoteConfigOverrideRule>\n ): Promise<FTRemoteConfigResult>;\n /**\n * Listen for auto remote configuration updates triggered by the native SDK.\n * Manual updates are returned through the update Promise instead of this event.\n */\n addRemoteConfigListener(\n listener: (result: FTRemoteConfigResult) => void\n ): EmitterSubscription;\n};\n\nclass FTMobileReactNativeWrapper implements FTMobileReactNativeType {\n /* eslint-disable @typescript-eslint/no-var-requires */\n private sdk: NativeFTMobileReactNativeSpec =\n require('./specs/NativeFTMobileReactNative').default;\n private rum: NativeFTReactNativeRUMSpec =\n require('./specs/NativeFTReactNativeRUM').default;\n /* eslint-enable @typescript-eslint/no-var-requires */\n\n private emitter: NativeEventEmitter | null = null;\n\n private getEmitter(): NativeEventEmitter {\n if (this.emitter) {\n return this.emitter;\n }\n\n const nativeEventModule = NativeModules.FTMobileReactNative ?? this.sdk;\n this.emitter = new NativeEventEmitter(nativeEventModule as never);\n return this.emitter;\n }\n\n sdkConfig(config: FTMobileConfig): Promise<void> {\n if (\n config.serverUrl != null &&\n config.serverUrl.length > 0 &&\n config.datakitUrl == null\n ) {\n config.datakitUrl = config.serverUrl;\n }\n const nativeConfig = { ...config };\n // Keep undefined equivalent to omission; explicit null overrides legacy hosts.\n if (nativeConfig.allowWebViewHost === undefined) {\n delete nativeConfig.allowWebViewHost;\n }\n return this.sdk.sdkConfig(nativeConfig);\n }\n setDatakitURL(datakitUrl: string): Promise<void> {\n return this.sdk.setDatakitURL(datakitUrl);\n }\n setDatawayURL(datawayUrl: string, clientToken: string): Promise<void> {\n return this.sdk.setDatawayURL(datawayUrl, clientToken);\n }\n bindRUMUserData(\n userId: string,\n userName?: string,\n userEmail?: string,\n extra?: object\n ): Promise<void> {\n return this.sdk.bindRUMUserData(userId, userName, userEmail, extra);\n }\n resetVisitorId(): Promise<void> {\n return this.sdk.resetVisitorId();\n }\n unbindRUMUserData(): Promise<void> {\n return this.sdk.unbindRUMUserData();\n }\n appendGlobalContext(context: object): Promise<void> {\n return this.sdk.appendGlobalContext(context);\n }\n appendLogGlobalContext(context: object): Promise<void> {\n return this.sdk.appendLogGlobalContext(context);\n }\n appendRUMGlobalContext(context: object): Promise<void> {\n return this.sdk.appendRUMGlobalContext(context);\n }\n trackEventFromExtension(identifier: string): Promise<object> {\n return this.sdk.trackEventFromExtension(identifier);\n }\n flushSyncData(): Promise<void> {\n return this.sdk.flushSyncData();\n }\n async shutDown(): Promise<void> {\n bridgeContextManager.configureLongTaskContext(false);\n try {\n FTRumWebSocketTracking.shutDown();\n await this.rum.stopLongTaskTracking();\n } finally {\n await this.sdk.shutDown();\n }\n }\n clearAllData(): Promise<void> {\n return this.sdk.clearAllData();\n }\n appendBridgeContext(properties: Record<string, any>): void {\n // Store properties in JS and update the native long task snapshot when enabled.\n bridgeContextManager.appendBridgeContext(properties);\n }\n updateRemoteConfig(): Promise<FTRemoteConfigResult> {\n return this.sdk.updateRemoteConfig() as Promise<FTRemoteConfigResult>;\n }\n updateRemoteConfigWithMiniUpdateInterval(\n interval: number,\n rules?: Array<FTRemoteConfigOverrideRule>\n ): Promise<FTRemoteConfigResult> {\n return this.sdk.updateRemoteConfigWithMiniUpdateInterval(\n interval,\n rules\n ) as Promise<FTRemoteConfigResult>;\n }\n addRemoteConfigListener(\n listener: (result: FTRemoteConfigResult) => void\n ): EmitterSubscription {\n return this.getEmitter().addListener('ft_remote_config_callback', listener);\n }\n}\nexport const FTMobileReactNative: FTMobileReactNativeType =\n new FTMobileReactNativeWrapper();\n"],"mappings":";;;;AAAA,SAEEA,kBAAkB,EAClBC,aAAa,QACR,cAAc;AAGrB,SAASC,OAAO,IAAIC,UAAU,QAAQ,WAAW;AACjD,SAASC,sBAAsB,QAAQ,8BAA8B;;AAErE;AACA;AACA;AACA;AACA;AACA,MAAMC,oBAAoB,CAAC;EAKjBC,WAAWA,CAAA,EAAG;IAAAC,eAAA,qBAHiB,IAAIC,GAAG,CAAC,CAAC;IAAAD,eAAA,iCACf,KAAK;IAGpC;IACA,IAAI,CAACE,iBAAiB,CAAC,CAAC;EAC1B;;EAEA;AACF;AACA;AACA;EACUA,iBAAiBA,CAAA,EAAS;IAChC;IACA,MAAMC,aAAa,GAAG;MACpBC,YAAY,EAAER;IAChB,CAAC;;IAED;IACA,IAAI,CAACS,UAAU,CAACC,GAAG,CAAC,iBAAiB,EAAEC,IAAI,CAACC,SAAS,CAACL,aAAa,CAAC,CAAC;EACvE;;EAEA;AACF;AACA;AACA;EACE,OAAcM,WAAWA,CAAA,EAAyB;IAChD,IAAI,CAACX,oBAAoB,CAACY,QAAQ,EAAE;MAClCZ,oBAAoB,CAACY,QAAQ,GAAG,IAAIZ,oBAAoB,CAAC,CAAC;IAC5D;IACA,OAAOA,oBAAoB,CAACY,QAAQ;EACtC;;EAEA;AACF;AACA;AACA;EACSC,mBAAmBA,CAACN,UAA+B,EAAQ;IAChE;IACA,IAAI;MACF;MACAO,MAAM,CAACC,OAAO,CAACR,UAAU,CAAC,CAACS,OAAO,CAAC,CAAC,CAACC,GAAG,EAAEC,KAAK,CAAC,KAAK;QACnD,IAAI,CAACX,UAAU,CAACC,GAAG,CAACS,GAAG,EAAEC,KAAK,CAAC;MACjC,CAAC,CAAC;MACF,IAAI,IAAI,CAACC,sBAAsB,EAAE;QAC/B,IAAI,CAACC,mBAAmB,CAAC,CAAC;MAC5B;IACF,CAAC,CAAC,OAAOC,KAAK,EAAE;MACdC,OAAO,CAACC,IAAI,CAAC,kCAAkC,EAAEF,KAAK,CAAC;IACzD;EACF;EAEOG,wBAAwBA,CAACC,OAAgB,EAAQ;IACtD,IAAI,CAACN,sBAAsB,GAAGM,OAAO;IACrC,IAAIA,OAAO,EAAE;MACX,IAAI,CAACL,mBAAmB,CAAC,CAAC;IAC5B;EACF;EAEQA,mBAAmBA,CAAA,EAAS;IAClC,IAAI;MACF;MACA;MACA,MAAMM,GAA+B;MACnC;MACAC,OAAO,CAAC,gCAAgC,CAAC,CAACC,OAAO;MACnDF,GAAG,CAACG,kBAAkB,CAAC,IAAI,CAACC,4BAA4B,CAAC,CAAC,CAAC;IAC7D,CAAC,CAAC,OAAOT,KAAK,EAAE;MACd;MACAC,OAAO,CAACC,IAAI,CAAC,6CAA6C,EAAEF,KAAK,CAAC;IACpE;EACF;;EAEA;AACF;AACA;AACA;AACA;AACA;EACSS,4BAA4BA,CACjCC,eAAwB,EACH;IACrB,IAAI;MACF,MAAMC,MAA2B,GAAG,CAAC,CAAC;;MAEtC;MACA,IAAID,eAAe,EAAE;QACnBjB,MAAM,CAACmB,MAAM,CAACD,MAAM,EAAED,eAAe,CAAC;MACxC;;MAEA;MACA,IAAI,CAACxB,UAAU,CAACS,OAAO,CAAC,CAACE,KAAK,EAAED,GAAG,KAAK;QACtCe,MAAM,CAACf,GAAG,CAAC,GAAGC,KAAK;MACrB,CAAC,CAAC;MAEF,OAAOc,MAAM;IACf,CAAC,CAAC,OAAOX,KAAK,EAAE;MACdC,OAAO,CAACC,IAAI,CACV,uDAAuD,EACvDF,KACF,CAAC;MACD;MACA,OAAOU,eAAe,GAAG;QAAE,GAAGA;MAAgB,CAAC,GAAG,CAAC,CAAC;IACtD;EACF;AACF;;AAEA;AAAAG,qBAAA,GA7GMlC,oBAAoB;AAAAE,eAAA,CAApBF,oBAAoB;AA8G1B,OAAO,MAAMmC,oBAAoB,GAAGnC,oBAAoB,CAACW,WAAW,CAAC,CAAC;;AAEtE;AACA;AACA;AACA,WAAYyB,OAAO,0BAAPA,OAAO;EAAPA,OAAO,CAAPA,OAAO;EAAPA,OAAO,CAAPA,OAAO;EAAPA,OAAO,CAAPA,OAAO;EAAPA,OAAO,CAAPA,OAAO;EAAPA,OAAO,CAAPA,OAAO;EAAA,OAAPA,OAAO;AAAA;AAOnB,WAAYC,gBAAgB,0BAAhBA,gBAAgB;EAAhBA,gBAAgB,CAAhBA,gBAAgB;EAAhBA,gBAAgB,CAAhBA,gBAAgB;EAAA,OAAhBA,gBAAgB;AAAA;;AAK5B;AACA;AACA;AACA;AACA;;AAKA;AACA;AACA;AACA;;AAQA;AACA;AACA;AACA;AACA;AACA;;AA8CA;AACA;AACA;AACA;;AAOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAWA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAgJA,MAAMC,0BAA0B,CAAoC;EAAArC,YAAA;IAClE;IAAAC,eAAA,cAEEyB,OAAO,CAAC,mCAAmC,CAAC,CAACC,OAAO;IAAA1B,eAAA,cAEpDyB,OAAO,CAAC,gCAAgC,CAAC,CAACC,OAAO;IACnD;IAAA1B,eAAA,kBAE6C,IAAI;EAAA;EAEzCqC,UAAUA,CAAA,EAAuB;IAAA,IAAAC,qBAAA;IACvC,IAAI,IAAI,CAACC,OAAO,EAAE;MAChB,OAAO,IAAI,CAACA,OAAO;IACrB;IAEA,MAAMC,iBAAiB,IAAAF,qBAAA,GAAG5C,aAAa,CAAC+C,mBAAmB,cAAAH,qBAAA,cAAAA,qBAAA,GAAI,IAAI,CAACI,GAAG;IACvE,IAAI,CAACH,OAAO,GAAG,IAAI9C,kBAAkB,CAAC+C,iBAA0B,CAAC;IACjE,OAAO,IAAI,CAACD,OAAO;EACrB;EAEAI,SAASA,CAACC,MAAsB,EAAiB;IAC/C,IACEA,MAAM,CAACC,SAAS,IAAI,IAAI,IACxBD,MAAM,CAACC,SAAS,CAACC,MAAM,GAAG,CAAC,IAC3BF,MAAM,CAACG,UAAU,IAAI,IAAI,EACzB;MACAH,MAAM,CAACG,UAAU,GAAGH,MAAM,CAACC,SAAS;IACtC;IACA,MAAMG,YAAY,GAAG;MAAE,GAAGJ;IAAO,CAAC;IAClC;IACA,IAAII,YAAY,CAACC,gBAAgB,KAAKC,SAAS,EAAE;MAC/C,OAAOF,YAAY,CAACC,gBAAgB;IACtC;IACA,OAAO,IAAI,CAACP,GAAG,CAACC,SAAS,CAACK,YAAY,CAAC;EACzC;EACAG,aAAaA,CAACJ,UAAkB,EAAiB;IAC/C,OAAO,IAAI,CAACL,GAAG,CAACS,aAAa,CAACJ,UAAU,CAAC;EAC3C;EACAK,aAAaA,CAACC,UAAkB,EAAEC,WAAmB,EAAiB;IACpE,OAAO,IAAI,CAACZ,GAAG,CAACU,aAAa,CAACC,UAAU,EAAEC,WAAW,CAAC;EACxD;EACAC,eAAeA,CACbC,MAAc,EACdC,QAAiB,EACjBC,SAAkB,EAClBC,KAAc,EACC;IACf,OAAO,IAAI,CAACjB,GAAG,CAACa,eAAe,CAACC,MAAM,EAAEC,QAAQ,EAAEC,SAAS,EAAEC,KAAK,CAAC;EACrE;EACAC,cAAcA,CAAA,EAAkB;IAC9B,OAAO,IAAI,CAAClB,GAAG,CAACkB,cAAc,CAAC,CAAC;EAClC;EACAC,iBAAiBA,CAAA,EAAkB;IACjC,OAAO,IAAI,CAACnB,GAAG,CAACmB,iBAAiB,CAAC,CAAC;EACrC;EACAC,mBAAmBA,CAACC,OAAe,EAAiB;IAClD,OAAO,IAAI,CAACrB,GAAG,CAACoB,mBAAmB,CAACC,OAAO,CAAC;EAC9C;EACAC,sBAAsBA,CAACD,OAAe,EAAiB;IACrD,OAAO,IAAI,CAACrB,GAAG,CAACsB,sBAAsB,CAACD,OAAO,CAAC;EACjD;EACAE,sBAAsBA,CAACF,OAAe,EAAiB;IACrD,OAAO,IAAI,CAACrB,GAAG,CAACuB,sBAAsB,CAACF,OAAO,CAAC;EACjD;EACAG,uBAAuBA,CAACC,UAAkB,EAAmB;IAC3D,OAAO,IAAI,CAACzB,GAAG,CAACwB,uBAAuB,CAACC,UAAU,CAAC;EACrD;EACAC,aAAaA,CAAA,EAAkB;IAC7B,OAAO,IAAI,CAAC1B,GAAG,CAAC0B,aAAa,CAAC,CAAC;EACjC;EACA,MAAMC,QAAQA,CAAA,EAAkB;IAC9BpC,oBAAoB,CAACX,wBAAwB,CAAC,KAAK,CAAC;IACpD,IAAI;MACFzB,sBAAsB,CAACwE,QAAQ,CAAC,CAAC;MACjC,MAAM,IAAI,CAAC7C,GAAG,CAAC8C,oBAAoB,CAAC,CAAC;IACvC,CAAC,SAAS;MACR,MAAM,IAAI,CAAC5B,GAAG,CAAC2B,QAAQ,CAAC,CAAC;IAC3B;EACF;EACAE,YAAYA,CAAA,EAAkB;IAC5B,OAAO,IAAI,CAAC7B,GAAG,CAAC6B,YAAY,CAAC,CAAC;EAChC;EACA5D,mBAAmBA,CAACN,UAA+B,EAAQ;IACzD;IACA4B,oBAAoB,CAACtB,mBAAmB,CAACN,UAAU,CAAC;EACtD;EACAmE,kBAAkBA,CAAA,EAAkC;IAClD,OAAO,IAAI,CAAC9B,GAAG,CAAC8B,kBAAkB,CAAC,CAAC;EACtC;EACAC,wCAAwCA,CACtCC,QAAgB,EAChBC,KAAyC,EACV;IAC/B,OAAO,IAAI,CAACjC,GAAG,CAAC+B,wCAAwC,CACtDC,QAAQ,EACRC,KACF,CAAC;EACH;EACAC,uBAAuBA,CACrBC,QAAgD,EAC3B;IACrB,OAAO,IAAI,CAACxC,UAAU,CAAC,CAAC,CAACyC,WAAW,CAAC,2BAA2B,EAAED,QAAQ,CAAC;EAC7E;AACF;AACA,OAAO,MAAMpC,mBAA4C,GACvD,IAAIL,0BAA0B,CAAC,CAAC","ignoreList":[]}