@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":["Platform","NativeFTReactNativeTrace","startWebSocketTiming","clearNativeWebSocketSessions","startNativeWebSocketSession","webSocketNativeID","REACT_NATIVE_DEV_WEBSOCKET","SOCKET_ROCKET_HTTP_ERROR","MAX_HTTP_ERROR_PARSE_LENGTH","FTRumWebSocketTracking","getLifecycleVersion","lifecycleVersion","shutDown","setNativeAutoTraceEnabled","stopTracking","pendingHandshakes","forEach","removeListeners","clear","warnedFailures","enabled","nativeAutoTraceEnabled","stopNativeSession","_FTRumWebSocketTracki","nativeSession","stop","undefined","startTracking","resourceReporter","OS","runtimeGlobal","globalThis","originalWebSocket","WebSocket","instrumentedWebSocket","createResourceKey","InstrumentedWebSocket","args","new","target","Reflect","apply","construct","createWebSocket","prototype","Object","setPrototypeOf","warnOnce","installed","OriginalWebSocket","originalArguments","newTarget","url","__DEV__","test","options","Array","isArray","resourceKey","traceKey","argumentsWithHeaders","requestHeaders","traceHeaders","getTraceHeaders","mergeTraceHeaders","cancelTrace","stopTiming","socket","completed","cancelled","pendingCloseError","startPromise","nativeResourceStarted","keepFailureClose","delete","cancelHandshake","removers","listenerRemovers","slice","remove","releaseNativeResource","release","beginResource","start","startResource","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","cancelWebSocketTrace","headers","getTraceHeaderFieldsSync","toHeaderRecord","toOptions","traceHeaderEntries","entries","length","traceHeaderNames","Set","map","toLowerCase","keys","has","value","optionDescriptors","getOwnPropertyDescriptors","configurable","enumerable","writable","defineProperties","eventString","property","code","statusFromError","match","exec","trim","Number","Error","name","String","reject","webSocketHandshakeState","isCurrentLifecycle","stopResource","httpStatus","resource","resourceType","webSocketHandshake","errorMessage","metrics","addResource","session","content","stopped","console","warn","_defineProperty"],"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":["Platform","NativeFTReactNativeTrace","startWebSocketTiming","clearNativeWebSocketSessions","startNativeWebSocketSession","webSocketNativeID","REACT_NATIVE_DEV_WEBSOCKET","SOCKET_ROCKET_HTTP_ERROR","MAX_HTTP_ERROR_PARSE_LENGTH","FTRumWebSocketTracking","getLifecycleVersion","lifecycleVersion","shutDown","setNativeAutoTraceEnabled","stopTracking","pendingHandshakes","forEach","removeListeners","clear","warnedFailures","enabled","nativeAutoTraceEnabled","stopNativeSession","_FTRumWebSocketTracki","nativeSession","stop","undefined","startTracking","resourceReporter","OS","runtimeGlobal","globalThis","originalWebSocket","WebSocket","instrumentedWebSocket","createResourceKey","InstrumentedWebSocket","args","new","target","Reflect","apply","construct","createWebSocket","prototype","Object","setPrototypeOf","warnOnce","installed","OriginalWebSocket","originalArguments","newTarget","url","__DEV__","test","options","Array","isArray","resourceKey","traceKey","argumentsWithHeaders","requestHeaders","traceHeaders","getTraceHeaders","mergeTraceHeaders","cancelTrace","stopTiming","socket","completed","cancelled","pendingCloseError","startPromise","nativeResourceStarted","keepFailureClose","delete","cancelHandshake","removers","listenerRemovers","slice","remove","releaseNativeResource","release","beginResource","start","startResource","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","cancelWebSocketTrace","headers","getTraceHeaderFieldsSync","toHeaderRecord","toOptions","traceHeaderEntries","entries","length","traceHeaderNames","Set","map","toLowerCase","keys","has","value","optionDescriptors","getOwnPropertyDescriptors","configurable","enumerable","writable","defineProperties","eventString","property","code","statusFromError","match","exec","trim","Number","Error","name","String","reject","webSocketHandshakeState","isCurrentLifecycle","stopResource","httpStatus","resource","resourceType","webSocketHandshake","errorMessage","addResource","session","content","stopped","console","warn","_defineProperty"],"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":["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":"AAAA;;AAEA,SAASA,mBAAmB,QAAQ,cAAc;AAiGlD,eAAeA,mBAAmB,CAACC,GAAG,CAAO,qBAAqB,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["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":"AAAA;;AAEA,SAASA,mBAAmB,QAAQ,cAAc;AAkGlD,eAAeA,mBAAmB,CAACC,GAAG,CAAO,qBAAqB,CAAC","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"names":["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":"AAAA;;AAEA,SAASA,mBAAmB,QAAQ,cAAc;AAyGlD,eAAeA,mBAAmB,CAACC,GAAG,CAAO,kBAAkB,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["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":"AAAA;;AAEA,SAASA,mBAAmB,QAAQ,cAAc;AAuHlD,eAAeA,mBAAmB,CAACC,GAAG,CAAO,kBAAkB,CAAC","ignoreList":[]}
@@ -1,3 +1,3 @@
1
1
  // generated by genversion
2
- export const version = '0.4.3-alpha.2';
2
+ export const version = '0.4.3';
3
3
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["version"],"sources":["version.ts"],"sourcesContent":["// generated by genversion\nexport const version = '0.4.3-alpha.2';\n"],"mappings":"AAAA;AACA,OAAO,MAAMA,OAAO,GAAG,eAAe","ignoreList":[]}
1
+ {"version":3,"names":["version"],"sources":["version.ts"],"sourcesContent":["// generated by genversion\nexport const version = '0.4.3';\n"],"mappings":"AAAA;AACA,OAAO,MAAMA,OAAO,GAAG,OAAO","ignoreList":[]}
@@ -0,0 +1,31 @@
1
+ /** Anonymous Visitor ID header configuration for HTTP(S), excluding WebSockets. */
2
+
3
+ // These restrictions are shared by the target iOS and Android native SDKs.
4
+ 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']);
5
+ 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'];
6
+ export function validateVisitorIdConfig(config) {
7
+ if (!config || typeof config !== 'object' || Array.isArray(config)) {
8
+ throw new Error('visitorIdConfig must be an object');
9
+ }
10
+ const {
11
+ header,
12
+ ttlHours = 24,
13
+ urlPrefixes = [],
14
+ regularExpressions = []
15
+ } = config;
16
+ 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))) {
17
+ throw new Error('visitorIdConfig.header must be a lowercase custom HTTP header');
18
+ }
19
+ // Android stores TTL as a signed long number of milliseconds.
20
+ const milliseconds = ttlHours * 3600000;
21
+ if (typeof ttlHours !== 'number' || !Number.isFinite(ttlHours) || milliseconds < 1 || milliseconds >= 2 ** 63) {
22
+ throw new Error('visitorIdConfig.ttlHours must represent at least 1 millisecond and fit a signed 64-bit integer');
23
+ }
24
+ if (!Array.isArray(urlPrefixes) || !Array.isArray(regularExpressions) || urlPrefixes.length + regularExpressions.length === 0) {
25
+ throw new Error('visitorIdConfig requires at least one URL matching rule');
26
+ }
27
+ if (urlPrefixes.some(prefix => typeof prefix !== 'string' || !/^https?:\/\/[^/?#\s]+(?:[/?#]|$)/i.test(prefix)) || regularExpressions.some(pattern => typeof pattern !== 'string' || pattern.length === 0)) {
28
+ throw new Error('visitorIdConfig contains an invalid URL matching rule');
29
+ }
30
+ }
31
+ //# 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;AAED,OAAO,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":[]}
@@ -17,8 +17,10 @@ export declare enum FTLogCacheDiscard {
17
17
  }
18
18
  /**
19
19
  * Configure log output configuration.
20
- * @param sampleRate sampling rate
20
+ * @param logSamplingRate Log sampling percentage in [0, 100], default 100. Supports fractional percentages and takes precedence over sampleRate.
21
+ * @param sampleRate Deprecated log sampling probability in [0, 1], default 1. Used only when logSamplingRate is omitted; multiplied by 100 before passing to Native.
21
22
  * @param enableLinkRumData whether to link with RUM
23
+ * @param enableWebViewLog Collect Browser Logs SDK events from WebViews, default false
22
24
  * @param enableCustomLog whether to enable custom logs
23
25
  * @param discardStrategy log discard strategy
24
26
  * @param logLevelFilters log level filter
@@ -26,9 +28,17 @@ export declare enum FTLogCacheDiscard {
26
28
  * @param logCacheLimitCount get maximum log entry count limit [1000,), default 5000
27
29
  */
28
30
  export interface FTLogConfig {
31
+ /**
32
+ * Log sampling percentage in [0, 100], default 100.
33
+ * Supports fractional percentages: 12.5 means 12.5%, not 0.125.
34
+ * Takes precedence over sampleRate when both are supplied, including 0.
35
+ */
36
+ logSamplingRate?: number;
37
+ /** @deprecated Use logSamplingRate. Probability in [0, 1], default 1; 0.125 maps to 12.5%. Ignored when logSamplingRate is supplied. */
29
38
  sampleRate?: number;
30
39
  enableLinkRumData?: boolean;
31
40
  enableCustomLog?: boolean;
41
+ enableWebViewLog?: boolean;
32
42
  discardStrategy?: FTLogCacheDiscard;
33
43
  logLevelFilters?: Array<FTLogStatus>;
34
44
  globalContext?: object;
@@ -67,6 +67,8 @@ export type FTRemoteConfigOverrideMatch = {
67
67
  /**
68
68
  * Values that can be modified by remote config override rules.
69
69
  * These values will adjust the fetched remote configuration before it is applied.
70
+ * Omitted fields are not changed by this rule. Sampling percentages use [0, 100]
71
+ * and support fractions (12.5 means 12.5%); legacy probabilities use [0, 1].
70
72
  */
71
73
  export type FTRemoteConfigOverrideValues = {
72
74
  env?: string;
@@ -75,7 +77,21 @@ export type FTRemoteConfigOverrideValues = {
75
77
  compressIntakeRequests?: boolean;
76
78
  syncPageSize?: number;
77
79
  syncSleepTime?: number;
80
+ /** RUM session sampling percentage override in [0, 100]; takes precedence over rumSampleRate, including 0. */
81
+ sessionSamplingRate?: number;
82
+ /** Error session sampling percentage override in [0, 100]; takes precedence over rumSessionOnErrorSampleRate, including 0. */
83
+ sessionOnErrorSamplingRate?: number;
84
+ /** Trace sampling percentage override in [0, 100]; takes precedence over traceSampleRate, including 0. */
85
+ traceSamplingRate?: number;
86
+ /** Log sampling percentage override in [0, 100]; takes precedence over logSampleRate, including 0. */
87
+ logSamplingRate?: number;
88
+ /** Session Replay sampling percentage override in [0, 100]; fractional percentages are supported. */
89
+ sessionReplaySamplingRate?: number;
90
+ /** Error replay sampling percentage override in [0, 100]; fractional percentages are supported. */
91
+ sessionReplayOnErrorSamplingRate?: number;
92
+ /** @deprecated Use sessionSamplingRate. Legacy RUM probability override in [0, 1]; 0.125 maps to 12.5%. */
78
93
  rumSampleRate?: number;
94
+ /** @deprecated Use sessionOnErrorSamplingRate. Legacy error session probability override in [0, 1]. */
79
95
  rumSessionOnErrorSampleRate?: number;
80
96
  rumEnableTraceUserAction?: boolean;
81
97
  rumEnableTraceUserView?: boolean;
@@ -87,12 +103,15 @@ export type FTRemoteConfigOverrideValues = {
87
103
  rumEnableTrackAppANR?: boolean;
88
104
  rumEnableTraceWebView?: boolean;
89
105
  rumAllowWebViewHost?: Array<string>;
106
+ /** @deprecated Use traceSamplingRate. Legacy Trace probability override in [0, 1]. */
90
107
  traceSampleRate?: number;
91
108
  traceEnableAutoTrace?: boolean;
92
109
  traceType?: string;
110
+ /** @deprecated Use logSamplingRate. Legacy log probability override in [0, 1]. */
93
111
  logSampleRate?: number;
94
112
  logLevelFilters?: Array<string>;
95
113
  logEnableCustomLog?: boolean;
114
+ logEnableWebViewLog?: boolean;
96
115
  logEnableConsoleLog?: boolean;
97
116
  };
98
117
  /**
@@ -172,6 +191,10 @@ export interface FTMobileConfig {
172
191
  compressIntakeRequests?: boolean;
173
192
  enableDataFilter?: boolean;
174
193
  dataFilters?: Record<string, Array<string>>;
194
+ /** Shared WebView host allowlist for RUM and Log. Omitted uses the legacy RUM
195
+ * config; null allows every host; [] disables bridge access. Remote config wins.
196
+ */
197
+ allowWebViewHost?: Array<string> | null;
175
198
  globalContext?: object;
176
199
  groupIdentifiers?: Array<string>;
177
200
  enableLimitWithDbSize?: boolean;
@@ -217,6 +240,8 @@ type FTMobileReactNativeType = {
217
240
  * @returns a Promise.
218
241
  */
219
242
  unbindRUMUserData(): Promise<void>;
243
+ /** Rotate the native anonymous Visitor ID for subsequent requests. */
244
+ resetVisitorId(): Promise<void>;
220
245
  /**
221
246
  * Add custom global parameters. Applies to RUM and Log data
222
247
  * @param context custom global parameters.
@@ -1,3 +1,4 @@
1
+ import { FTVisitorIdConfig } from './visitorIdConfig';
1
2
  /**
2
3
  * Error monitoring type.
3
4
  */
@@ -51,8 +52,10 @@ export declare enum IOSCrashMonitoringType {
51
52
  * Set RUM tracking conditions.
52
53
  * @param androidAppId appId, apply during monitoring
53
54
  * @param iOSAppId appId, apply during monitoring
54
- * @param sampleRate sampling rate
55
- * @param sessionOnErrorSampleRate error session sampling rate. For sessions not sampled, if ERROR is hit, collect data 1 minute before the error occurs
55
+ * @param sessionSamplingRate RUM session sampling percentage in [0, 100], default 100. Supports fractional percentages and takes precedence over sampleRate.
56
+ * @param sessionOnErrorSamplingRate Sampling percentage in [0, 100] for otherwise unsampled sessions when an error occurs, default 0. Supports fractional percentages and takes precedence over sessionOnErrorSampleRate.
57
+ * @param sampleRate Deprecated RUM session sampling probability in [0, 1], default 1. Used only when sessionSamplingRate is omitted; multiplied by 100 before passing to Native.
58
+ * @param sessionOnErrorSampleRate Deprecated error session sampling probability in [0, 1], default 0. Used only when sessionOnErrorSamplingRate is omitted; multiplied by 100 before passing to Native.
56
59
  * @param enableAutoTrackUserAction whether to automatically collect react-native control click events, can set actionName with accessibilityLabel when enabled
57
60
  * @param enableTrackError whether to automatically collect react-native Error
58
61
  * @param enableTrackNativeCrash whether to collect Native Error
@@ -76,13 +79,30 @@ export declare enum IOSCrashMonitoringType {
76
79
  * @param rumCacheLimitCount RUM max cache size, default 100_000
77
80
  * @param rumDiscardStrategy RUM data discard strategy
78
81
  * @param enableTraceWebView Set whether to enable WebView data collection, default true
79
- * @param allowWebViewHost Set specific hosts or domains allowed to collect WebView data, nil means collect all
82
+ * @param allowWebViewHost Deprecated; use FTMobileConfig.allowWebViewHost for shared WebView host filtering.
80
83
  * @param iosCrashMonitoringType iOS crash monitoring type , default is highCompatibility, which does not include Mach exceptions for better compatibility. you must enable system crash monitoring to get crash stack traces and crash information.
81
84
  */
82
85
  export interface FTRUMConfig {
86
+ /** Valid config enables Visitor ID; omitted/null disables it. */
87
+ visitorIdConfig?: FTVisitorIdConfig | null;
83
88
  androidAppId: string;
84
89
  iOSAppId: string;
90
+ /**
91
+ * RUM session sampling percentage in [0, 100], default 100.
92
+ * Supports fractional percentages: 12.5 means 12.5%, not 0.125.
93
+ * Takes precedence over sampleRate when both are supplied, including 0.
94
+ * Setting 0 disables regular session sampling; error session sampling is separate.
95
+ */
96
+ sessionSamplingRate?: number;
97
+ /** @deprecated Use sessionSamplingRate. Probability in [0, 1], default 1; 0.125 maps to 12.5%. Ignored when sessionSamplingRate is supplied. */
85
98
  sampleRate?: number;
99
+ /**
100
+ * Sampling percentage for otherwise unsampled RUM sessions when an error occurs.
101
+ * Range [0, 100], default 0; fractional percentages are supported.
102
+ * Takes precedence over sessionOnErrorSampleRate when both are supplied, including 0.
103
+ */
104
+ sessionOnErrorSamplingRate?: number;
105
+ /** @deprecated Use sessionOnErrorSamplingRate. Probability in [0, 1], default 0; multiplied by 100. Ignored when sessionOnErrorSamplingRate is supplied. */
86
106
  sessionOnErrorSampleRate?: number;
87
107
  enableAutoTrackUserAction?: boolean;
88
108
  enableAutoTrackError?: boolean;
@@ -104,7 +124,8 @@ export interface FTRUMConfig {
104
124
  rumCacheLimitCount?: number;
105
125
  rumDiscardStrategy?: FTRUMCacheDiscard;
106
126
  enableTraceWebView?: boolean;
107
- allowWebViewHost?: Array<string>;
127
+ /** @deprecated Configure the shared host allowlist in FTMobileConfig.allowWebViewHost. */
128
+ allowWebViewHost?: Array<string> | null;
108
129
  iosCrashMonitoringType?: IOSCrashMonitoringType;
109
130
  }
110
131
  /**
@@ -172,10 +193,17 @@ type FTReactNativeRUMType = {
172
193
  /**
173
194
  * view load duration.
174
195
  * @param viewName view name
175
- * @param loadTime view load duration
196
+ * @param loadTime monotonic view load duration in nanoseconds
176
197
  * @returns a Promise.
177
198
  */
178
199
  onCreateView(viewName: string, loadTime: number): Promise<void>;
200
+ /**
201
+ * Replace the current active View's loading duration, between startView and stopView.
202
+ * @param duration monotonic elapsed time in nanoseconds; a non-negative safe integer.
203
+ * Zero clears loading time. Late calls can update a newer View; no View ID is supplied.
204
+ * @returns a Promise for the native call, not for data upload.
205
+ */
206
+ updateViewLoadingTime(duration: number): Promise<void>;
179
207
  /**
180
208
  * view start.
181
209
  * @param viewName page name
@@ -11,12 +11,20 @@ export declare enum TraceType {
11
11
  }
12
12
  /**
13
13
  * Configure trace.
14
- * @param sampleRate sampling rate
14
+ * @param traceSamplingRate Trace sampling percentage in [0, 100], default 100. Supports fractional percentages and takes precedence over sampleRate.
15
+ * @param sampleRate Deprecated Trace sampling probability in [0, 1], default 1. Used only when traceSamplingRate is omitted; multiplied by 100 before passing to Native.
15
16
  * @param traceType trace type
16
17
  * @param enableLinkRUMData whether to link with RUM data
17
18
  * @param enableNativeAutoTrace whether to enable automatic tracing
18
19
  */
19
20
  export interface FTTraceConfig {
21
+ /**
22
+ * Trace sampling percentage in [0, 100], default 100.
23
+ * Supports fractional percentages: 12.5 means 12.5%, not 0.125.
24
+ * Takes precedence over sampleRate when both are supplied, including 0.
25
+ */
26
+ traceSamplingRate?: number;
27
+ /** @deprecated Use traceSamplingRate. Probability in [0, 1], default 1; 0.125 maps to 12.5%. Ignored when traceSamplingRate is supplied. */
20
28
  sampleRate?: number;
21
29
  traceType?: TraceType;
22
30
  enableLinkRUMData?: boolean;
@@ -7,3 +7,5 @@ import { FTRumErrorTracking } from './rum/FTRumErrorTracking';
7
7
  import { FTBabelInteractionTracking } from './rum/FTBabelInteractionTracking';
8
8
  import { __ftExtractText } from './rum/FTBabelUtils';
9
9
  export { FTMobileReactNative, FTMobileConfig, EnvType, FTDBCacheDiscard, FTRemoteConfigResult, FTRemoteConfigOverrideRule, FTRemoteConfigOverrideMatch, FTRemoteConfigOverrideValues, FTLogConfig, FTReactNativeLog, FTLogStatus, FTLogCacheDiscard, FTRUMConfig, FTReactNativeRUM, FTRUMResource, ErrorMonitorType, DeviceMetricsMonitorType, DetectFrequency, FTRUMResourceMetrics, FTRUMCacheDiscard, IOSCrashMonitoringType, FTTraceConfig, FTReactNativeTrace, TraceType, FTRumActionTracking, FTRumErrorTracking, FTBabelInteractionTracking, __ftExtractText, };
10
+ export type { FTVisitorIdConfig } from './visitorIdConfig';
11
+ export { FTRumViewTracking } from './rum/FTRumViewTracking';
@@ -0,0 +1,32 @@
1
+ type Route = {
2
+ key: string;
3
+ name: string;
4
+ };
5
+ /** Shared lifecycle coordinator for navigation adapters. Use one per navigator. */
6
+ export declare class FTRumViewTracking {
7
+ private readonly onBackground?;
8
+ private current?;
9
+ private active?;
10
+ private generation;
11
+ private lifecycle;
12
+ private state;
13
+ private subscription?;
14
+ private loading;
15
+ constructor(onBackground?: (() => void) | undefined);
16
+ start(): void;
17
+ /** Capture both clocks at the loading boundary, before any async work. */
18
+ beginLoad(key: string): void;
19
+ /** Remember a transitioning route so foreground recovery uses the current page. */
20
+ setCurrent(route: Route): void;
21
+ show(route: Route, loadingKey?: string): number | undefined;
22
+ /** Apply a completed interval only to the appearance that started it. */
23
+ updateLoadingTime(key: string, generation: number | undefined, durationNs: number): void;
24
+ /** Only the appearance that owns the active generation may close it. */
25
+ hide(key: string, generation: number | undefined): void;
26
+ stop(): void;
27
+ private onAppState;
28
+ private pruneLoading;
29
+ private get nativeRUM();
30
+ private report;
31
+ }
32
+ export {};
@@ -1,3 +1,4 @@
1
+ import type { WebSocketTimingMetrics } from './FTRumWebSocketTiming';
1
2
  export interface NativeWebSocketResource {
2
3
  url: string;
3
4
  httpMethod: string;
@@ -12,9 +13,7 @@ export declare class NativeWebSocketSession {
12
13
  constructor(session: string);
13
14
  startResource(key: string, socketID: number | undefined, url: string): Promise<void>;
14
15
  stopResource(key: string, event: string): Promise<void>;
15
- addResource(key: string, content: NativeWebSocketResource, metrics: {
16
- duration?: number;
17
- }): Promise<void>;
16
+ addResource(key: string, content: NativeWebSocketResource, metrics: Partial<WebSocketTimingMetrics>): Promise<void>;
18
17
  release(key: string): void;
19
18
  stop(): void;
20
19
  }
@@ -1,2 +1,7 @@
1
+ export interface WebSocketTimingMetrics {
2
+ duration: number;
3
+ fetchStartNsTimeInterval?: string;
4
+ fetchEndNsTimeInterval?: string;
5
+ }
1
6
  /** Measures only the JS-observed opening handshake; bridge delays are excluded. */
2
- export declare function startWebSocketTiming(): () => number | undefined;
7
+ export declare function startWebSocketTiming(): () => WebSocketTimingMetrics | undefined;
@@ -1,3 +1,4 @@
1
+ import type { WebSocketTimingMetrics } from './FTRumWebSocketTiming';
1
2
  type WebSocketHandshakeState = 'success' | 'rejected' | 'failed';
2
3
  interface FTRUMWebSocketResource {
3
4
  url: string;
@@ -13,10 +14,7 @@ interface FTRUMWebSocketResource {
13
14
  interface FTRumWebSocketResourceReporter {
14
15
  startResource(key: string): Promise<void>;
15
16
  stopResource(key: string): Promise<void>;
16
- addResource(key: string, resource: FTRUMWebSocketResource, metrics?: {
17
- duration?: number;
18
- resource_http_protocol?: string;
19
- }): Promise<void>;
17
+ addResource(key: string, resource: FTRUMWebSocketResource, metrics?: WebSocketTimingMetrics): Promise<void>;
20
18
  }
21
19
  export declare class FTRumWebSocketTracking {
22
20
  private static enabled;