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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. package/FTMobileReactNativeSDK.podspec +1 -1
  2. package/README.md +0 -34
  3. package/android/build.gradle +2 -2
  4. package/android/src/main/java/com/ft/sdk/reactnative/FTLogImpl.java +10 -2
  5. package/android/src/main/java/com/ft/sdk/reactnative/FTMobileImpl.java +45 -3
  6. package/android/src/main/java/com/ft/sdk/reactnative/FTRUMImpl.java +51 -9
  7. package/android/src/main/java/com/ft/sdk/reactnative/FTTraceImpl.java +5 -2
  8. package/android/src/main/java/com/ft/sdk/reactnative/ViewTiming.java +17 -0
  9. package/android/src/main/java/com/ft/sdk/reactnative/VisitorIdConfigMapper.java +50 -0
  10. package/android/src/newarch/java/com/ft/sdk/reactnative/FTMobileModule.java +5 -0
  11. package/android/src/newarch/java/com/ft/sdk/reactnative/FTRUMModule.java +18 -0
  12. package/android/src/oldarch/java/com/ft/sdk/reactnative/FTMobileModule.java +5 -0
  13. package/android/src/oldarch/java/com/ft/sdk/reactnative/FTRUMModule.java +15 -0
  14. package/android/src/test/java/com/ft/sdk/reactnative/FTMobileImplTest.java +53 -0
  15. package/ios/FTMobileReactNative.mm +37 -2
  16. package/ios/FTReactNativeLog.mm +7 -2
  17. package/ios/FTReactNativeRUM.mm +94 -4
  18. package/ios/FTReactNativeResource.m +6 -0
  19. package/ios/FTReactNativeTrace.mm +4 -2
  20. package/ios/FTReactNativeViewTiming.h +18 -0
  21. package/ios/FTWebSocketResourceData.h +4 -0
  22. package/ios/FTWebSocketResourceData.m +31 -0
  23. package/lib/commonjs/ft_logger.js +3 -1
  24. package/lib/commonjs/ft_logger.js.map +1 -1
  25. package/lib/commonjs/ft_mobile_agent.js +13 -1
  26. package/lib/commonjs/ft_mobile_agent.js.map +1 -1
  27. package/lib/commonjs/ft_rum.js +19 -3
  28. package/lib/commonjs/ft_rum.js.map +1 -1
  29. package/lib/commonjs/ft_tracing.js +2 -1
  30. package/lib/commonjs/ft_tracing.js.map +1 -1
  31. package/lib/commonjs/index.js +7 -0
  32. package/lib/commonjs/index.js.map +1 -1
  33. package/lib/commonjs/rum/FTRumViewTracking.js +147 -0
  34. package/lib/commonjs/rum/FTRumViewTracking.js.map +1 -0
  35. package/lib/commonjs/rum/FTRumWebSocketNative.js.map +1 -1
  36. package/lib/commonjs/rum/FTRumWebSocketTiming.js +19 -1
  37. package/lib/commonjs/rum/FTRumWebSocketTiming.js.map +1 -1
  38. package/lib/commonjs/rum/FTRumWebSocketTracking.js +7 -11
  39. package/lib/commonjs/rum/FTRumWebSocketTracking.js.map +1 -1
  40. package/lib/commonjs/specs/NativeFTMobileReactNative.js.map +1 -1
  41. package/lib/commonjs/specs/NativeFTReactNativeRUM.js.map +1 -1
  42. package/lib/commonjs/version.js +1 -1
  43. package/lib/commonjs/version.js.map +1 -1
  44. package/lib/commonjs/visitorIdConfig.js +37 -0
  45. package/lib/commonjs/visitorIdConfig.js.map +1 -0
  46. package/lib/module/ft_logger.js +3 -1
  47. package/lib/module/ft_logger.js.map +1 -1
  48. package/lib/module/ft_mobile_agent.js +13 -1
  49. package/lib/module/ft_mobile_agent.js.map +1 -1
  50. package/lib/module/ft_rum.js +19 -3
  51. package/lib/module/ft_rum.js.map +1 -1
  52. package/lib/module/ft_tracing.js +2 -1
  53. package/lib/module/ft_tracing.js.map +1 -1
  54. package/lib/module/index.js +1 -0
  55. package/lib/module/index.js.map +1 -1
  56. package/lib/module/rum/FTRumViewTracking.js +140 -0
  57. package/lib/module/rum/FTRumViewTracking.js.map +1 -0
  58. package/lib/module/rum/FTRumWebSocketNative.js.map +1 -1
  59. package/lib/module/rum/FTRumWebSocketTiming.js +19 -1
  60. package/lib/module/rum/FTRumWebSocketTiming.js.map +1 -1
  61. package/lib/module/rum/FTRumWebSocketTracking.js +7 -11
  62. package/lib/module/rum/FTRumWebSocketTracking.js.map +1 -1
  63. package/lib/module/specs/NativeFTMobileReactNative.js.map +1 -1
  64. package/lib/module/specs/NativeFTReactNativeRUM.js.map +1 -1
  65. package/lib/module/version.js +1 -1
  66. package/lib/module/version.js.map +1 -1
  67. package/lib/module/visitorIdConfig.js +31 -0
  68. package/lib/module/visitorIdConfig.js.map +1 -0
  69. package/lib/typescript/ft_logger.d.ts +11 -1
  70. package/lib/typescript/ft_mobile_agent.d.ts +25 -0
  71. package/lib/typescript/ft_rum.d.ts +33 -5
  72. package/lib/typescript/ft_tracing.d.ts +9 -1
  73. package/lib/typescript/index.d.ts +2 -0
  74. package/lib/typescript/rum/FTRumViewTracking.d.ts +32 -0
  75. package/lib/typescript/rum/FTRumWebSocketNative.d.ts +2 -3
  76. package/lib/typescript/rum/FTRumWebSocketTiming.d.ts +6 -1
  77. package/lib/typescript/rum/FTRumWebSocketTracking.d.ts +2 -4
  78. package/lib/typescript/specs/NativeFTMobileReactNative.d.ts +1 -0
  79. package/lib/typescript/specs/NativeFTReactNativeRUM.d.ts +7 -1
  80. package/lib/typescript/version.d.ts +1 -1
  81. package/lib/typescript/visitorIdConfig.d.ts +11 -0
  82. package/package.json +4 -3
  83. package/src/ft_logger.tsx +11 -1
  84. package/src/ft_mobile_agent.tsx +34 -1
  85. package/src/ft_rum.tsx +50 -5
  86. package/src/ft_tracing.tsx +9 -1
  87. package/src/index.tsx +4 -0
  88. package/src/rum/FTRumViewTracking.ts +179 -0
  89. package/src/rum/FTRumWebSocketNative.ts +2 -1
  90. package/src/rum/FTRumWebSocketTiming.ts +34 -2
  91. package/src/rum/FTRumWebSocketTracking.ts +9 -14
  92. package/src/specs/NativeFTMobileReactNative.ts +1 -0
  93. package/src/specs/NativeFTReactNativeRUM.ts +15 -1
  94. package/src/version.ts +1 -1
  95. package/src/visitorIdConfig.ts +123 -0
@@ -1 +1 @@
1
- {"version":3,"names":["_reactNative","require","_FTRumErrorTracking","_FTRumActionTracking","_FTBabelInteractionTracking","_FTRumWebSocketTracking","_ft_mobile_agent","_longTasksUtils","_defineProperty","e","r","t","_toPropertyKey","Object","defineProperty","value","enumerable","configurable","writable","i","_toPrimitive","Symbol","toPrimitive","call","TypeError","String","Number","ErrorMonitorType","exports","DeviceMetricsMonitorType","DetectFrequency","FTRUMCacheDiscard","IOSCrashMonitoringType","isBabelPluginEnabled","globalThis","__FT_RN_BABEL_PLUGIN_ENABLED__","global","FTReactNativeRUMWrapper","constructor","default","setConfig","config","bridgeContextManager","configureLongTaskContext","enableLongTask","webSocketLifecycle","FTRumWebSocketTracking","getLifecycleVersion","webSocketConfigVersion","trackWebSocket","enableIOSWebSocketResource","console","log","enableAutoTrackError","FTRumErrorTracking","startTracking","babelPluginEnabled","FTBabelInteractionTracking","configure","trackInteractions","Boolean","enableAutoTrackUserAction","actionReporter","actionName","actionType","property","startAction","FTRumActionTracking","stopTracking","rum","longTaskThresholdMs","normalizeLongTaskThreshold","then","Platform","OS","mergedProperties","mergeWithLocalPropertiesSync","addAction","onCreateView","viewName","loadTime","startView","stopView","addError","stack","message","addErrorWithType","type","startResource","key","stopResource","addResource","resource","metrics","FTReactNativeRUM"],"sources":["ft_rum.tsx"],"sourcesContent":["// import { NativeModules } from 'react-native';\nimport { Platform } from 'react-native';\nimport { FTRumErrorTracking } from './rum/FTRumErrorTracking';\nimport { FTRumActionTracking } from './rum/FTRumActionTracking';\nimport { FTBabelInteractionTracking } from './rum/FTBabelInteractionTracking';\nimport { FTRumWebSocketTracking } from './rum/FTRumWebSocketTracking';\nimport { bridgeContextManager } from './ft_mobile_agent';\nimport { normalizeLongTaskThreshold } from './rum/longTasksUtils';\n\n/**\n * Error monitoring type.\n */\n/* eslint-disable no-bitwise */\nexport enum ErrorMonitorType {\n all = 0xffffffff,\n battery = 1 << 1,\n memory = 1 << 2,\n cpu = 1 << 3,\n}\n/**\n * Page monitoring supplement type\n */\nexport enum DeviceMetricsMonitorType {\n all = 0xffffffff,\n battery = 1 << 1,\n memory = 1 << 2,\n cpu = 1 << 3,\n fps = 1 << 4,\n}\n/**\n * Device information monitoring cycle.\n */\nexport enum DetectFrequency {\n normal,\n frequent,\n rare,\n}\n\nexport enum FTRUMCacheDiscard {\n discard,\n discardOldest,\n}\n\nexport enum IOSCrashMonitoringType {\n /** Monitor Mach kernel exceptions. */\n machException = 0x01,\n\n /** Monitor fatal signals. */\n signal = 0x02,\n\n /** Monitor uncaught C++ exceptions. */\n cppException = 0x04,\n\n /** Monitor uncaught Objective-C NSExceptions. */\n nsException = 0x08,\n\n /** Track and inject system information. */\n system = 0x40,\n\n /** Track and inject application state information. */\n applicationState = 0x80,\n\n /** All crash monitor types. */\n all = machException |\n signal |\n cppException |\n nsException |\n applicationState |\n system,\n\n /** High compatibility crash monitor types (excludes Mach exceptions). */\n highCompatibility = all & ~machException,\n}\n/* eslint-enable no-bitwise */\n/**\n * Set RUM tracking conditions.\n * @param androidAppId appId, apply during monitoring\n * @param iOSAppId appId, apply during monitoring\n * @param sampleRate sampling rate\n * @param sessionOnErrorSampleRate error session sampling rate. For sessions not sampled, if ERROR is hit, collect data 1 minute before the error occurs\n * @param enableAutoTrackUserAction whether to automatically collect react-native control click events, can set actionName with accessibilityLabel when enabled\n * @param enableTrackError whether to automatically collect react-native Error\n * @param enableTrackNativeCrash whether to collect Native Error\n * @param enableTrackNativeAppANR whether to collect Native ANR\n * @param enableTrackNativeFreeze whether to collect Native Freeze\n * @param nativeFreezeDurationMs set the threshold for collecting Native Freeze, value range [100,), unit ms. iOS default 250ms, Android default 1000ms\n * @param enableLongTask whether to collect React Native JavaScript LongTasks, default false\n * @param longTaskThresholdMs set the threshold for collecting React Native JavaScript LongTasks, unit ms. Defaults to 100 and is clamped to [100, 5000]\n * @param enableNativeUserAction whether to start Native Action tracking, Button click events, recommended to disable for pure react-native apps\n * @param enableNativeUserView whether to start Native View auto tracking, recommended to disable for pure react-native apps\n * @param enableNativeUserResource whether to automatically collect react-native Resource\n * @param enableIOSWebSocketResource whether to collect iOS WebSocket opening handshakes as RUM Resources. Defaults to false.\n * Independent of enableNativeUserResource. Android native WebSocket collection is unaffected.\n * iOS WebSocket Trace header injection requires both this option and enableNativeAutoTrace.\n * When disabled, new iOS WebSocket connections are not instrumented or automatically injected with Trace headers by this SDK.\n * @param enableResourceHostIP whether to collect network request Host IP (only for native http, iOS 13 and above)\n * @param errorMonitorType error monitoring supplement type\n * @param deviceMonitorType page monitoring supplement type\n * @param detectFrequency monitoring frequency\n * @param globalContext custom global parameters\n * @param rumCacheLimitCount RUM max cache size, default 100_000\n * @param rumDiscardStrategy RUM data discard strategy\n * @param enableTraceWebView Set whether to enable WebView data collection, default true\n * @param allowWebViewHost Set specific hosts or domains allowed to collect WebView data, nil means collect all\n * @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.\n */\nexport interface FTRUMConfig {\n androidAppId: string;\n iOSAppId: string;\n sampleRate?: number;\n sessionOnErrorSampleRate?: number;\n enableAutoTrackUserAction?: boolean;\n enableAutoTrackError?: boolean;\n enableTrackNativeCrash?: boolean;\n enableTrackNativeAppANR?: boolean;\n enableTrackNativeFreeze?: boolean;\n nativeFreezeDurationMs?: number;\n enableLongTask?: boolean;\n longTaskThresholdMs?: number;\n enableNativeUserAction?: boolean;\n enableNativeUserView?: boolean;\n enableNativeUserResource?: boolean;\n enableIOSWebSocketResource?: boolean;\n enableResourceHostIP?: boolean;\n errorMonitorType?: ErrorMonitorType;\n deviceMonitorType?: DeviceMetricsMonitorType;\n detectFrequency?: DetectFrequency;\n globalContext?: object;\n rumCacheLimitCount?: number;\n rumDiscardStrategy?: FTRUMCacheDiscard;\n enableTraceWebView?: boolean;\n allowWebViewHost?: Array<string>;\n iosCrashMonitoringType?: IOSCrashMonitoringType;\n}\n/**\n * RUM Resource data.\n * @param url request URL\n * @param httpMethod request method\n * @param requestHeader request header parameters\n * @param responseHeader response header parameters\n * @param responseBody response content\n * @param resourceStatus response status code\n */\nexport interface FTRUMResource {\n url: string;\n httpMethod: string;\n requestHeader: object;\n responseHeader?: object;\n responseBody?: string;\n resourceStatus?: number;\n}\n/**\n * RUM Resource performance metrics.\n * @param duration resource load time\n * @param resource_dns resource DNS resolution time\n * @param resource_tcp resource TCP connection time\n * @param resource_ssl resource SSL connection time\n * @param resource_ttfb resource request response time\n * @param resource_trans resource content transfer time\n * @param resource_first_byte resource first byte time\n */\nexport interface FTRUMResourceMetrics {\n duration?: number;\n resource_dns?: number;\n resource_tcp?: number;\n resource_ssl?: number;\n resource_ttfb?: number;\n resource_trans?: number;\n resource_first_byte?: number;\n}\ntype FTReactNativeRUMType = {\n /**\n * Set RUM tracking conditions and enable RUM collection.\n * @param config rum configuration parameters.\n * @returns a Promise.\n */\n setConfig(config: FTRUMConfig): 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(\n key: string,\n resource: FTRUMResource,\n metrics?: FTRUMResourceMetrics\n ): Promise<void>;\n};\n\nfunction isBabelPluginEnabled(): boolean {\n if (typeof globalThis !== 'undefined') {\n return globalThis.__FT_RN_BABEL_PLUGIN_ENABLED__ === true;\n }\n if (typeof global !== 'undefined') {\n return global.__FT_RN_BABEL_PLUGIN_ENABLED__ === true;\n }\n return false;\n}\n\nclass FTReactNativeRUMWrapper implements FTReactNativeRUMType {\n private webSocketConfigVersion = 0;\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n private rum: FTReactNativeRUMType = require('./specs/NativeFTReactNativeRUM')\n .default;\n\n setConfig(config: FTRUMConfig): Promise<void> {\n bridgeContextManager.configureLongTaskContext(\n config.enableLongTask === true\n );\n const webSocketLifecycle = FTRumWebSocketTracking.getLifecycleVersion();\n const webSocketConfigVersion = ++this.webSocketConfigVersion;\n const trackWebSocket = config.enableIOSWebSocketResource === true;\n console.log('FTRUMConfig');\n if (config.enableAutoTrackError) {\n FTRumErrorTracking.startTracking();\n }\n const babelPluginEnabled = isBabelPluginEnabled();\n FTBabelInteractionTracking.configure({\n trackInteractions:\n babelPluginEnabled && Boolean(config.enableAutoTrackUserAction),\n actionReporter: (actionName, actionType, property) =>\n this.startAction(actionName, actionType, property),\n });\n if (config.enableAutoTrackUserAction && !babelPluginEnabled) {\n FTRumActionTracking.startTracking();\n } else {\n FTRumActionTracking.stopTracking();\n }\n return this.rum\n .setConfig({\n ...config,\n enableLongTask: config.enableLongTask === true,\n longTaskThresholdMs: normalizeLongTaskThreshold(\n config.longTaskThresholdMs\n ),\n })\n .then(() => {\n if (\n webSocketLifecycle !== FTRumWebSocketTracking.getLifecycleVersion() ||\n webSocketConfigVersion !== this.webSocketConfigVersion\n ) {\n return;\n }\n if (Platform.OS === 'ios' && trackWebSocket) {\n FTRumWebSocketTracking.startTracking(this);\n } else {\n FTRumWebSocketTracking.stopTracking();\n }\n });\n }\n startAction(\n actionName: string,\n actionType: string,\n property?: object\n ): Promise<void> {\n // Automatically merge bridge context properties with local properties\n const mergedProperties =\n bridgeContextManager.mergeWithLocalPropertiesSync(property);\n return this.rum.startAction(actionName, actionType, mergedProperties);\n }\n addAction(\n actionName: string,\n actionType: string,\n property?: object\n ): Promise<void> {\n // Automatically merge bridge context properties with local properties\n const mergedProperties =\n bridgeContextManager.mergeWithLocalPropertiesSync(property);\n return this.rum.addAction(actionName, actionType, mergedProperties);\n }\n onCreateView(viewName: string, loadTime: number): Promise<void> {\n return this.rum.onCreateView(viewName, loadTime);\n }\n startView(viewName: string, property?: object): Promise<void> {\n // Automatically merge bridge context properties with local properties\n const mergedProperties =\n bridgeContextManager.mergeWithLocalPropertiesSync(property);\n return this.rum.startView(viewName, mergedProperties);\n }\n stopView(property?: object): Promise<void> {\n // Automatically merge bridge context properties with local properties\n const mergedProperties =\n bridgeContextManager.mergeWithLocalPropertiesSync(property);\n return this.rum.stopView(mergedProperties);\n }\n addError(stack: string, message: string, property?: object): Promise<void> {\n // Automatically merge bridge context properties with local properties\n const mergedProperties =\n bridgeContextManager.mergeWithLocalPropertiesSync(property);\n return this.rum.addError(stack, message, mergedProperties);\n }\n addErrorWithType(\n type: string,\n stack: string,\n message: string,\n property?: object\n ): Promise<void> {\n // Automatically merge bridge context properties with local properties\n const mergedProperties =\n bridgeContextManager.mergeWithLocalPropertiesSync(property);\n return this.rum.addErrorWithType(type, stack, message, mergedProperties);\n }\n startResource(key: string, property?: object): Promise<void> {\n // Automatically merge bridge context properties with local properties\n const mergedProperties =\n bridgeContextManager.mergeWithLocalPropertiesSync(property);\n return this.rum.startResource(key, mergedProperties);\n }\n stopResource(key: string, property?: object): Promise<void> {\n // Automatically merge bridge context properties with local properties\n const mergedProperties =\n bridgeContextManager.mergeWithLocalPropertiesSync(property);\n return this.rum.stopResource(key, mergedProperties);\n }\n addResource(\n key: string,\n resource: FTRUMResource,\n metrics: FTRUMResourceMetrics = {}\n ): Promise<void> {\n return this.rum.addResource(key, resource, metrics);\n }\n}\n\nexport const FTReactNativeRUM: FTReactNativeRUMType =\n new FTReactNativeRUMWrapper();\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_visitorIdConfig","require","_reactNative","_FTRumErrorTracking","_FTRumActionTracking","_FTBabelInteractionTracking","_FTRumWebSocketTracking","_ft_mobile_agent","_longTasksUtils","_defineProperty","e","r","t","_toPropertyKey","Object","defineProperty","value","enumerable","configurable","writable","i","_toPrimitive","Symbol","toPrimitive","call","TypeError","String","Number","ErrorMonitorType","exports","DeviceMetricsMonitorType","DetectFrequency","FTRUMCacheDiscard","IOSCrashMonitoringType","isBabelPluginEnabled","globalThis","__FT_RN_BABEL_PLUGIN_ENABLED__","global","FTReactNativeRUMWrapper","constructor","default","setConfig","config","visitorIdConfig","validateVisitorIdConfig","error","Promise","reject","bridgeContextManager","configureLongTaskContext","enableLongTask","webSocketLifecycle","FTRumWebSocketTracking","getLifecycleVersion","webSocketConfigVersion","trackWebSocket","enableIOSWebSocketResource","console","log","enableAutoTrackError","FTRumErrorTracking","startTracking","babelPluginEnabled","FTBabelInteractionTracking","configure","trackInteractions","Boolean","enableAutoTrackUserAction","actionReporter","actionName","actionType","property","startAction","FTRumActionTracking","stopTracking","rum","longTaskThresholdMs","normalizeLongTaskThreshold","then","Platform","OS","mergedProperties","mergeWithLocalPropertiesSync","addAction","onCreateView","viewName","loadTime","updateViewLoadingTime","duration","isSafeInteger","RangeError","startView","stopView","addError","stack","message","addErrorWithType","type","startResource","key","stopResource","addResource","resource","metrics","FTReactNativeRUM"],"sources":["ft_rum.tsx"],"sourcesContent":["import { FTVisitorIdConfig, validateVisitorIdConfig } from './visitorIdConfig';\n// import { NativeModules } from 'react-native';\nimport { Platform } from 'react-native';\nimport { FTRumErrorTracking } from './rum/FTRumErrorTracking';\nimport { FTRumActionTracking } from './rum/FTRumActionTracking';\nimport { FTBabelInteractionTracking } from './rum/FTBabelInteractionTracking';\nimport { FTRumWebSocketTracking } from './rum/FTRumWebSocketTracking';\nimport { bridgeContextManager } from './ft_mobile_agent';\nimport { normalizeLongTaskThreshold } from './rum/longTasksUtils';\n\n/**\n * Error monitoring type.\n */\n/* eslint-disable no-bitwise */\nexport enum ErrorMonitorType {\n all = 0xffffffff,\n battery = 1 << 1,\n memory = 1 << 2,\n cpu = 1 << 3,\n}\n/**\n * Page monitoring supplement type\n */\nexport enum DeviceMetricsMonitorType {\n all = 0xffffffff,\n battery = 1 << 1,\n memory = 1 << 2,\n cpu = 1 << 3,\n fps = 1 << 4,\n}\n/**\n * Device information monitoring cycle.\n */\nexport enum DetectFrequency {\n normal,\n frequent,\n rare,\n}\n\nexport enum FTRUMCacheDiscard {\n discard,\n discardOldest,\n}\n\nexport enum IOSCrashMonitoringType {\n /** Monitor Mach kernel exceptions. */\n machException = 0x01,\n\n /** Monitor fatal signals. */\n signal = 0x02,\n\n /** Monitor uncaught C++ exceptions. */\n cppException = 0x04,\n\n /** Monitor uncaught Objective-C NSExceptions. */\n nsException = 0x08,\n\n /** Track and inject system information. */\n system = 0x40,\n\n /** Track and inject application state information. */\n applicationState = 0x80,\n\n /** All crash monitor types. */\n all = machException |\n signal |\n cppException |\n nsException |\n applicationState |\n system,\n\n /** High compatibility crash monitor types (excludes Mach exceptions). */\n highCompatibility = all & ~machException,\n}\n/* eslint-enable no-bitwise */\n/**\n * Set RUM tracking conditions.\n * @param androidAppId appId, apply during monitoring\n * @param iOSAppId appId, apply during monitoring\n * @param sessionSamplingRate RUM session sampling percentage in [0, 100], default 100. Supports fractional percentages and takes precedence over sampleRate.\n * @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.\n * @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.\n * @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.\n * @param enableAutoTrackUserAction whether to automatically collect react-native control click events, can set actionName with accessibilityLabel when enabled\n * @param enableTrackError whether to automatically collect react-native Error\n * @param enableTrackNativeCrash whether to collect Native Error\n * @param enableTrackNativeAppANR whether to collect Native ANR\n * @param enableTrackNativeFreeze whether to collect Native Freeze\n * @param nativeFreezeDurationMs set the threshold for collecting Native Freeze, value range [100,), unit ms. iOS default 250ms, Android default 1000ms\n * @param enableLongTask whether to collect React Native JavaScript LongTasks, default false\n * @param longTaskThresholdMs set the threshold for collecting React Native JavaScript LongTasks, unit ms. Defaults to 100 and is clamped to [100, 5000]\n * @param enableNativeUserAction whether to start Native Action tracking, Button click events, recommended to disable for pure react-native apps\n * @param enableNativeUserView whether to start Native View auto tracking, recommended to disable for pure react-native apps\n * @param enableNativeUserResource whether to automatically collect react-native Resource\n * @param enableIOSWebSocketResource whether to collect iOS WebSocket opening handshakes as RUM Resources. Defaults to false.\n * Independent of enableNativeUserResource. Android native WebSocket collection is unaffected.\n * iOS WebSocket Trace header injection requires both this option and enableNativeAutoTrace.\n * When disabled, new iOS WebSocket connections are not instrumented or automatically injected with Trace headers by this SDK.\n * @param enableResourceHostIP whether to collect network request Host IP (only for native http, iOS 13 and above)\n * @param errorMonitorType error monitoring supplement type\n * @param deviceMonitorType page monitoring supplement type\n * @param detectFrequency monitoring frequency\n * @param globalContext custom global parameters\n * @param rumCacheLimitCount RUM max cache size, default 100_000\n * @param rumDiscardStrategy RUM data discard strategy\n * @param enableTraceWebView Set whether to enable WebView data collection, default true\n * @param allowWebViewHost Deprecated; use FTMobileConfig.allowWebViewHost for shared WebView host filtering.\n * @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.\n */\nexport interface FTRUMConfig {\n /** Valid config enables Visitor ID; omitted/null disables it. */\n visitorIdConfig?: FTVisitorIdConfig | null;\n androidAppId: string;\n iOSAppId: string;\n /**\n * RUM session sampling percentage in [0, 100], default 100.\n * Supports fractional percentages: 12.5 means 12.5%, not 0.125.\n * Takes precedence over sampleRate when both are supplied, including 0.\n * Setting 0 disables regular session sampling; error session sampling is separate.\n */\n sessionSamplingRate?: number;\n /** @deprecated Use sessionSamplingRate. Probability in [0, 1], default 1; 0.125 maps to 12.5%. Ignored when sessionSamplingRate is supplied. */\n sampleRate?: number;\n /**\n * Sampling percentage for otherwise unsampled RUM sessions when an error occurs.\n * Range [0, 100], default 0; fractional percentages are supported.\n * Takes precedence over sessionOnErrorSampleRate when both are supplied, including 0.\n */\n sessionOnErrorSamplingRate?: number;\n /** @deprecated Use sessionOnErrorSamplingRate. Probability in [0, 1], default 0; multiplied by 100. Ignored when sessionOnErrorSamplingRate is supplied. */\n sessionOnErrorSampleRate?: number;\n enableAutoTrackUserAction?: boolean;\n enableAutoTrackError?: boolean;\n enableTrackNativeCrash?: boolean;\n enableTrackNativeAppANR?: boolean;\n enableTrackNativeFreeze?: boolean;\n nativeFreezeDurationMs?: number;\n enableLongTask?: boolean;\n longTaskThresholdMs?: number;\n enableNativeUserAction?: boolean;\n enableNativeUserView?: boolean;\n enableNativeUserResource?: boolean;\n enableIOSWebSocketResource?: boolean;\n enableResourceHostIP?: boolean;\n errorMonitorType?: ErrorMonitorType;\n deviceMonitorType?: DeviceMetricsMonitorType;\n detectFrequency?: DetectFrequency;\n globalContext?: object;\n rumCacheLimitCount?: number;\n rumDiscardStrategy?: FTRUMCacheDiscard;\n enableTraceWebView?: boolean;\n /** @deprecated Configure the shared host allowlist in FTMobileConfig.allowWebViewHost. */\n allowWebViewHost?: Array<string> | null;\n iosCrashMonitoringType?: IOSCrashMonitoringType;\n}\n/**\n * RUM Resource data.\n * @param url request URL\n * @param httpMethod request method\n * @param requestHeader request header parameters\n * @param responseHeader response header parameters\n * @param responseBody response content\n * @param resourceStatus response status code\n */\nexport interface FTRUMResource {\n url: string;\n httpMethod: string;\n requestHeader: object;\n responseHeader?: object;\n responseBody?: string;\n resourceStatus?: number;\n}\n/**\n * RUM Resource performance metrics.\n * @param duration resource load time\n * @param resource_dns resource DNS resolution time\n * @param resource_tcp resource TCP connection time\n * @param resource_ssl resource SSL connection time\n * @param resource_ttfb resource request response time\n * @param resource_trans resource content transfer time\n * @param resource_first_byte resource first byte time\n */\nexport interface FTRUMResourceMetrics {\n duration?: number;\n resource_dns?: number;\n resource_tcp?: number;\n resource_ssl?: number;\n resource_ttfb?: number;\n resource_trans?: number;\n resource_first_byte?: number;\n}\ntype FTReactNativeRUMType = {\n /**\n * Set RUM tracking conditions and enable RUM collection.\n * @param config rum configuration parameters.\n * @returns a Promise.\n */\n setConfig(config: FTRUMConfig): 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 /**\n * Replace the current active View's loading duration, between startView and stopView.\n * @param duration monotonic elapsed time in nanoseconds; a non-negative safe integer.\n * Zero clears loading time. Late calls can update a newer View; no View ID is supplied.\n * @returns a Promise for the native call, not for data upload.\n */\n updateViewLoadingTime(duration: 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(\n key: string,\n resource: FTRUMResource,\n metrics?: FTRUMResourceMetrics\n ): Promise<void>;\n};\n\nfunction isBabelPluginEnabled(): boolean {\n if (typeof globalThis !== 'undefined') {\n return globalThis.__FT_RN_BABEL_PLUGIN_ENABLED__ === true;\n }\n if (typeof global !== 'undefined') {\n return global.__FT_RN_BABEL_PLUGIN_ENABLED__ === true;\n }\n return false;\n}\n\nclass FTReactNativeRUMWrapper implements FTReactNativeRUMType {\n private webSocketConfigVersion = 0;\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n private rum: FTReactNativeRUMType = require('./specs/NativeFTReactNativeRUM')\n .default;\n\n setConfig(config: FTRUMConfig): Promise<void> {\n if (config.visitorIdConfig != null) {\n try {\n validateVisitorIdConfig(config.visitorIdConfig);\n } catch (error) {\n return Promise.reject(error);\n }\n }\n bridgeContextManager.configureLongTaskContext(\n config.enableLongTask === true\n );\n const webSocketLifecycle = FTRumWebSocketTracking.getLifecycleVersion();\n const webSocketConfigVersion = ++this.webSocketConfigVersion;\n const trackWebSocket = config.enableIOSWebSocketResource === true;\n console.log('FTRUMConfig');\n if (config.enableAutoTrackError) {\n FTRumErrorTracking.startTracking();\n }\n const babelPluginEnabled = isBabelPluginEnabled();\n FTBabelInteractionTracking.configure({\n trackInteractions:\n babelPluginEnabled && Boolean(config.enableAutoTrackUserAction),\n actionReporter: (actionName, actionType, property) =>\n this.startAction(actionName, actionType, property),\n });\n if (config.enableAutoTrackUserAction && !babelPluginEnabled) {\n FTRumActionTracking.startTracking();\n } else {\n FTRumActionTracking.stopTracking();\n }\n return this.rum\n .setConfig({\n ...config,\n enableLongTask: config.enableLongTask === true,\n longTaskThresholdMs: normalizeLongTaskThreshold(\n config.longTaskThresholdMs\n ),\n })\n .then(() => {\n if (\n webSocketLifecycle !== FTRumWebSocketTracking.getLifecycleVersion() ||\n webSocketConfigVersion !== this.webSocketConfigVersion\n ) {\n return;\n }\n if (Platform.OS === 'ios' && trackWebSocket) {\n FTRumWebSocketTracking.startTracking(this);\n } else {\n FTRumWebSocketTracking.stopTracking();\n }\n });\n }\n startAction(\n actionName: string,\n actionType: string,\n property?: object\n ): Promise<void> {\n // Automatically merge bridge context properties with local properties\n const mergedProperties =\n bridgeContextManager.mergeWithLocalPropertiesSync(property);\n return this.rum.startAction(actionName, actionType, mergedProperties);\n }\n addAction(\n actionName: string,\n actionType: string,\n property?: object\n ): Promise<void> {\n // Automatically merge bridge context properties with local properties\n const mergedProperties =\n bridgeContextManager.mergeWithLocalPropertiesSync(property);\n return this.rum.addAction(actionName, actionType, mergedProperties);\n }\n onCreateView(viewName: string, loadTime: number): Promise<void> {\n return this.rum.onCreateView(viewName, loadTime);\n }\n updateViewLoadingTime(duration: number): Promise<void> {\n if (!Number.isSafeInteger(duration) || duration < 0) {\n return Promise.reject(\n new RangeError(\n 'duration must be a non-negative safe integer in nanoseconds'\n )\n );\n }\n return this.rum.updateViewLoadingTime(duration);\n }\n startView(viewName: string, property?: object): Promise<void> {\n // Automatically merge bridge context properties with local properties\n const mergedProperties =\n bridgeContextManager.mergeWithLocalPropertiesSync(property);\n return this.rum.startView(viewName, mergedProperties);\n }\n stopView(property?: object): Promise<void> {\n // Automatically merge bridge context properties with local properties\n const mergedProperties =\n bridgeContextManager.mergeWithLocalPropertiesSync(property);\n return this.rum.stopView(mergedProperties);\n }\n addError(stack: string, message: string, property?: object): Promise<void> {\n // Automatically merge bridge context properties with local properties\n const mergedProperties =\n bridgeContextManager.mergeWithLocalPropertiesSync(property);\n return this.rum.addError(stack, message, mergedProperties);\n }\n addErrorWithType(\n type: string,\n stack: string,\n message: string,\n property?: object\n ): Promise<void> {\n // Automatically merge bridge context properties with local properties\n const mergedProperties =\n bridgeContextManager.mergeWithLocalPropertiesSync(property);\n return this.rum.addErrorWithType(type, stack, message, mergedProperties);\n }\n startResource(key: string, property?: object): Promise<void> {\n // Automatically merge bridge context properties with local properties\n const mergedProperties =\n bridgeContextManager.mergeWithLocalPropertiesSync(property);\n return this.rum.startResource(key, mergedProperties);\n }\n stopResource(key: string, property?: object): Promise<void> {\n // Automatically merge bridge context properties with local properties\n const mergedProperties =\n bridgeContextManager.mergeWithLocalPropertiesSync(property);\n return this.rum.stopResource(key, mergedProperties);\n }\n addResource(\n key: string,\n resource: FTRUMResource,\n metrics: FTRUMResourceMetrics = {}\n ): Promise<void> {\n return this.rum.addResource(key, resource, metrics);\n }\n}\n\nexport const FTReactNativeRUM: FTReactNativeRUMType =\n new FTReactNativeRUMWrapper();\n"],"mappings":"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","ignoreList":[]}
@@ -42,7 +42,8 @@ let TraceType = exports.TraceType = /*#__PURE__*/function (TraceType) {
42
42
  }({});
43
43
  /**
44
44
  * Configure trace.
45
- * @param sampleRate sampling rate
45
+ * @param traceSamplingRate Trace sampling percentage in [0, 100], default 100. Supports fractional percentages and takes precedence over sampleRate.
46
+ * @param sampleRate Deprecated Trace sampling probability in [0, 1], default 1. Used only when traceSamplingRate is omitted; multiplied by 100 before passing to Native.
46
47
  * @param traceType trace type
47
48
  * @param enableLinkRUMData whether to link with RUM data
48
49
  * @param enableNativeAutoTrace whether to enable automatic tracing
@@ -1 +1 @@
1
- {"version":3,"names":["_FTRumWebSocketTracking","require","_defineProperty","e","r","t","_toPropertyKey","Object","defineProperty","value","enumerable","configurable","writable","i","_toPrimitive","Symbol","toPrimitive","call","TypeError","String","Number","TraceType","exports","FTReactNativeTraceWrapper","constructor","default","setConfig","config","webSocketLifecycle","FTRumWebSocketTracking","getLifecycleVersion","webSocketConfigVersion","traceWebSocket","enableNativeAutoTrace","trace","then","setNativeAutoTraceEnabled","getTraceHeader","key","url","getTraceHeaderFields","FTReactNativeTrace"],"sources":["ft_tracing.tsx"],"sourcesContent":["// import { NativeModules } from 'react-native';\n//FTReactNativeTrace\n\nimport { FTRumWebSocketTracking } from './rum/FTRumWebSocketTracking';\n\n/**\n * Trace types for use.\n */\nexport enum TraceType {\n //\n // datadog trace\n //\n // x-datadog-trace-id\n // x-datadog-parent-id\n // x-datadog-sampling-priority\n // x-datadog-origin\n //\n ddTrace,\n //\n // zipkin multi header\n //\n // X-B3-TraceId\n // X-B3-SpanId\n // X-B3-Sampled\n //\n zipkinMulti,\n /// zipkin single header,b3\n zipkinSingle,\n // w3c, traceparent\n traceparent,\n // skywalking 8.0+, sw-8\n skywalking,\n // jaeger, header uber-trace-id\n jaeger,\n}\n/**\n * Configure trace.\n * @param sampleRate sampling rate\n * @param traceType trace type\n * @param enableLinkRUMData whether to link with RUM data\n * @param enableNativeAutoTrace whether to enable automatic tracing\n */\nexport interface FTTraceConfig {\n sampleRate?: number;\n traceType?: TraceType;\n enableLinkRUMData?: boolean;\n enableNativeAutoTrace?: boolean;\n}\n\ntype FTReactNativeTraceType = {\n /**\n * Configure trace to enable distributed tracing.\n * @param config trace configuration parameters.\n * @returns a Promise.\n */\n setConfig(config: FTTraceConfig): Promise<void>;\n /**\n * Get trace HTTP request header data.\n * @param url request URL\n * @returns trace request header parameters\n * @deprecated use getTraceHeaderFields() replace.\n */\n getTraceHeader(key: string, url: string): Promise<object>;\n /**\n * Get trace HTTP request header data.\n * @param url request URL\n * @returns trace request header parameters\n */\n getTraceHeaderFields(url: string, key?: string): Promise<object>;\n};\n\nclass FTReactNativeTraceWrapper implements FTReactNativeTraceType {\n private webSocketConfigVersion = 0;\n /* eslint-disable @typescript-eslint/no-var-requires */\n private trace: FTReactNativeTraceType =\n require('./specs/NativeFTReactNativeTrace').default;\n /* eslint-enable @typescript-eslint/no-var-requires */\n\n setConfig(config: FTTraceConfig): Promise<void> {\n const webSocketLifecycle = FTRumWebSocketTracking.getLifecycleVersion();\n const webSocketConfigVersion = ++this.webSocketConfigVersion;\n const traceWebSocket = config.enableNativeAutoTrace === true;\n return this.trace.setConfig(config).then(() => {\n if (\n webSocketLifecycle !== FTRumWebSocketTracking.getLifecycleVersion() ||\n webSocketConfigVersion !== this.webSocketConfigVersion\n ) {\n return;\n }\n FTRumWebSocketTracking.setNativeAutoTraceEnabled(traceWebSocket);\n });\n }\n /**\n * Get trace HTTP request header data.\n * @param key unique id\n * @param url request URL\n * @returns a Promise.\n */\n getTraceHeader(key: string, url: string): Promise<object> {\n return this.trace.getTraceHeaderFields(url, key);\n }\n /**\n * Get trace HTTP request header data.\n * @param url request URL\n * @param key unique id\n * @returns a Promise.\n */\n getTraceHeaderFields(url: string, key?: string): Promise<object> {\n return this.trace.getTraceHeaderFields(url, key);\n }\n}\nexport const FTReactNativeTrace: FTReactNativeTraceType =\n new FTReactNativeTraceWrapper();\n"],"mappings":";;;;;;AAGA,IAAAA,uBAAA,GAAAC,OAAA;AAAsE,SAAAC,gBAAAC,CAAA,EAAAC,CAAA,EAAAC,CAAA,YAAAD,CAAA,GAAAE,cAAA,CAAAF,CAAA,MAAAD,CAAA,GAAAI,MAAA,CAAAC,cAAA,CAAAL,CAAA,EAAAC,CAAA,IAAAK,KAAA,EAAAJ,CAAA,EAAAK,UAAA,MAAAC,YAAA,MAAAC,QAAA,UAAAT,CAAA,CAAAC,CAAA,IAAAC,CAAA,EAAAF,CAAA;AAAA,SAAAG,eAAAD,CAAA,QAAAQ,CAAA,GAAAC,YAAA,CAAAT,CAAA,uCAAAQ,CAAA,GAAAA,CAAA,GAAAA,CAAA;AAAA,SAAAC,aAAAT,CAAA,EAAAD,CAAA,2BAAAC,CAAA,KAAAA,CAAA,SAAAA,CAAA,MAAAF,CAAA,GAAAE,CAAA,CAAAU,MAAA,CAAAC,WAAA,kBAAAb,CAAA,QAAAU,CAAA,GAAAV,CAAA,CAAAc,IAAA,CAAAZ,CAAA,EAAAD,CAAA,uCAAAS,CAAA,SAAAA,CAAA,YAAAK,SAAA,yEAAAd,CAAA,GAAAe,MAAA,GAAAC,MAAA,EAAAf,CAAA,KAHtE;AACA;AAIA;AACA;AACA;AAFA,IAGYgB,SAAS,GAAAC,OAAA,CAAAD,SAAA,0BAATA,SAAS;EACnB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EARUA,SAAS,CAATA,SAAS;EAUnB;EACA;EACA;EACA;EACA;EACA;EACA;EAhBUA,SAAS,CAATA,SAAS;EAkBnB;EAlBUA,SAAS,CAATA,SAAS;EAoBnB;EApBUA,SAAS,CAATA,SAAS;EAsBnB;EAtBUA,SAAS,CAATA,SAAS;EAwBnB;EAxBUA,SAAS,CAATA,SAAS;EAAA,OAATA,SAAS;AAAA;AA2BrB;AACA;AACA;AACA;AACA;AACA;AACA;AA8BA,MAAME,yBAAyB,CAAmC;EAAAC,YAAA;IAAAtB,eAAA,iCAC/B,CAAC;IAClC;IAAAA,eAAA,gBAEED,OAAO,CAAC,kCAAkC,CAAC,CAACwB,OAAO;EAAA;EACrD;;EAEAC,SAASA,CAACC,MAAqB,EAAiB;IAC9C,MAAMC,kBAAkB,GAAGC,8CAAsB,CAACC,mBAAmB,CAAC,CAAC;IACvE,MAAMC,sBAAsB,GAAG,EAAE,IAAI,CAACA,sBAAsB;IAC5D,MAAMC,cAAc,GAAGL,MAAM,CAACM,qBAAqB,KAAK,IAAI;IAC5D,OAAO,IAAI,CAACC,KAAK,CAACR,SAAS,CAACC,MAAM,CAAC,CAACQ,IAAI,CAAC,MAAM;MAC7C,IACEP,kBAAkB,KAAKC,8CAAsB,CAACC,mBAAmB,CAAC,CAAC,IACnEC,sBAAsB,KAAK,IAAI,CAACA,sBAAsB,EACtD;QACA;MACF;MACAF,8CAAsB,CAACO,yBAAyB,CAACJ,cAAc,CAAC;IAClE,CAAC,CAAC;EACJ;EACA;AACF;AACA;AACA;AACA;AACA;EACEK,cAAcA,CAACC,GAAW,EAAEC,GAAW,EAAmB;IACxD,OAAO,IAAI,CAACL,KAAK,CAACM,oBAAoB,CAACD,GAAG,EAAED,GAAG,CAAC;EAClD;EACA;AACF;AACA;AACA;AACA;AACA;EACEE,oBAAoBA,CAACD,GAAW,EAAED,GAAY,EAAmB;IAC/D,OAAO,IAAI,CAACJ,KAAK,CAACM,oBAAoB,CAACD,GAAG,EAAED,GAAG,CAAC;EAClD;AACF;AACO,MAAMG,kBAA0C,GAAAnB,OAAA,CAAAmB,kBAAA,GACrD,IAAIlB,yBAAyB,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["_FTRumWebSocketTracking","require","_defineProperty","e","r","t","_toPropertyKey","Object","defineProperty","value","enumerable","configurable","writable","i","_toPrimitive","Symbol","toPrimitive","call","TypeError","String","Number","TraceType","exports","FTReactNativeTraceWrapper","constructor","default","setConfig","config","webSocketLifecycle","FTRumWebSocketTracking","getLifecycleVersion","webSocketConfigVersion","traceWebSocket","enableNativeAutoTrace","trace","then","setNativeAutoTraceEnabled","getTraceHeader","key","url","getTraceHeaderFields","FTReactNativeTrace"],"sources":["ft_tracing.tsx"],"sourcesContent":["// import { NativeModules } from 'react-native';\n//FTReactNativeTrace\n\nimport { FTRumWebSocketTracking } from './rum/FTRumWebSocketTracking';\n\n/**\n * Trace types for use.\n */\nexport enum TraceType {\n //\n // datadog trace\n //\n // x-datadog-trace-id\n // x-datadog-parent-id\n // x-datadog-sampling-priority\n // x-datadog-origin\n //\n ddTrace,\n //\n // zipkin multi header\n //\n // X-B3-TraceId\n // X-B3-SpanId\n // X-B3-Sampled\n //\n zipkinMulti,\n /// zipkin single header,b3\n zipkinSingle,\n // w3c, traceparent\n traceparent,\n // skywalking 8.0+, sw-8\n skywalking,\n // jaeger, header uber-trace-id\n jaeger,\n}\n/**\n * Configure trace.\n * @param traceSamplingRate Trace sampling percentage in [0, 100], default 100. Supports fractional percentages and takes precedence over sampleRate.\n * @param sampleRate Deprecated Trace sampling probability in [0, 1], default 1. Used only when traceSamplingRate is omitted; multiplied by 100 before passing to Native.\n * @param traceType trace type\n * @param enableLinkRUMData whether to link with RUM data\n * @param enableNativeAutoTrace whether to enable automatic tracing\n */\nexport interface FTTraceConfig {\n /**\n * Trace sampling percentage in [0, 100], default 100.\n * Supports fractional percentages: 12.5 means 12.5%, not 0.125.\n * Takes precedence over sampleRate when both are supplied, including 0.\n */\n traceSamplingRate?: number;\n /** @deprecated Use traceSamplingRate. Probability in [0, 1], default 1; 0.125 maps to 12.5%. Ignored when traceSamplingRate is supplied. */\n sampleRate?: number;\n traceType?: TraceType;\n enableLinkRUMData?: boolean;\n enableNativeAutoTrace?: boolean;\n}\n\ntype FTReactNativeTraceType = {\n /**\n * Configure trace to enable distributed tracing.\n * @param config trace configuration parameters.\n * @returns a Promise.\n */\n setConfig(config: FTTraceConfig): Promise<void>;\n /**\n * Get trace HTTP request header data.\n * @param url request URL\n * @returns trace request header parameters\n * @deprecated use getTraceHeaderFields() replace.\n */\n getTraceHeader(key: string, url: string): Promise<object>;\n /**\n * Get trace HTTP request header data.\n * @param url request URL\n * @returns trace request header parameters\n */\n getTraceHeaderFields(url: string, key?: string): Promise<object>;\n};\n\nclass FTReactNativeTraceWrapper implements FTReactNativeTraceType {\n private webSocketConfigVersion = 0;\n /* eslint-disable @typescript-eslint/no-var-requires */\n private trace: FTReactNativeTraceType =\n require('./specs/NativeFTReactNativeTrace').default;\n /* eslint-enable @typescript-eslint/no-var-requires */\n\n setConfig(config: FTTraceConfig): Promise<void> {\n const webSocketLifecycle = FTRumWebSocketTracking.getLifecycleVersion();\n const webSocketConfigVersion = ++this.webSocketConfigVersion;\n const traceWebSocket = config.enableNativeAutoTrace === true;\n return this.trace.setConfig(config).then(() => {\n if (\n webSocketLifecycle !== FTRumWebSocketTracking.getLifecycleVersion() ||\n webSocketConfigVersion !== this.webSocketConfigVersion\n ) {\n return;\n }\n FTRumWebSocketTracking.setNativeAutoTraceEnabled(traceWebSocket);\n });\n }\n /**\n * Get trace HTTP request header data.\n * @param key unique id\n * @param url request URL\n * @returns a Promise.\n */\n getTraceHeader(key: string, url: string): Promise<object> {\n return this.trace.getTraceHeaderFields(url, key);\n }\n /**\n * Get trace HTTP request header data.\n * @param url request URL\n * @param key unique id\n * @returns a Promise.\n */\n getTraceHeaderFields(url: string, key?: string): Promise<object> {\n return this.trace.getTraceHeaderFields(url, key);\n }\n}\nexport const FTReactNativeTrace: FTReactNativeTraceType =\n new FTReactNativeTraceWrapper();\n"],"mappings":";;;;;;AAGA,IAAAA,uBAAA,GAAAC,OAAA;AAAsE,SAAAC,gBAAAC,CAAA,EAAAC,CAAA,EAAAC,CAAA,YAAAD,CAAA,GAAAE,cAAA,CAAAF,CAAA,MAAAD,CAAA,GAAAI,MAAA,CAAAC,cAAA,CAAAL,CAAA,EAAAC,CAAA,IAAAK,KAAA,EAAAJ,CAAA,EAAAK,UAAA,MAAAC,YAAA,MAAAC,QAAA,UAAAT,CAAA,CAAAC,CAAA,IAAAC,CAAA,EAAAF,CAAA;AAAA,SAAAG,eAAAD,CAAA,QAAAQ,CAAA,GAAAC,YAAA,CAAAT,CAAA,uCAAAQ,CAAA,GAAAA,CAAA,GAAAA,CAAA;AAAA,SAAAC,aAAAT,CAAA,EAAAD,CAAA,2BAAAC,CAAA,KAAAA,CAAA,SAAAA,CAAA,MAAAF,CAAA,GAAAE,CAAA,CAAAU,MAAA,CAAAC,WAAA,kBAAAb,CAAA,QAAAU,CAAA,GAAAV,CAAA,CAAAc,IAAA,CAAAZ,CAAA,EAAAD,CAAA,uCAAAS,CAAA,SAAAA,CAAA,YAAAK,SAAA,yEAAAd,CAAA,GAAAe,MAAA,GAAAC,MAAA,EAAAf,CAAA,KAHtE;AACA;AAIA;AACA;AACA;AAFA,IAGYgB,SAAS,GAAAC,OAAA,CAAAD,SAAA,0BAATA,SAAS;EACnB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EARUA,SAAS,CAATA,SAAS;EAUnB;EACA;EACA;EACA;EACA;EACA;EACA;EAhBUA,SAAS,CAATA,SAAS;EAkBnB;EAlBUA,SAAS,CAATA,SAAS;EAoBnB;EApBUA,SAAS,CAATA,SAAS;EAsBnB;EAtBUA,SAAS,CAATA,SAAS;EAwBnB;EAxBUA,SAAS,CAATA,SAAS;EAAA,OAATA,SAAS;AAAA;AA2BrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAqCA,MAAME,yBAAyB,CAAmC;EAAAC,YAAA;IAAAtB,eAAA,iCAC/B,CAAC;IAClC;IAAAA,eAAA,gBAEED,OAAO,CAAC,kCAAkC,CAAC,CAACwB,OAAO;EAAA;EACrD;;EAEAC,SAASA,CAACC,MAAqB,EAAiB;IAC9C,MAAMC,kBAAkB,GAAGC,8CAAsB,CAACC,mBAAmB,CAAC,CAAC;IACvE,MAAMC,sBAAsB,GAAG,EAAE,IAAI,CAACA,sBAAsB;IAC5D,MAAMC,cAAc,GAAGL,MAAM,CAACM,qBAAqB,KAAK,IAAI;IAC5D,OAAO,IAAI,CAACC,KAAK,CAACR,SAAS,CAACC,MAAM,CAAC,CAACQ,IAAI,CAAC,MAAM;MAC7C,IACEP,kBAAkB,KAAKC,8CAAsB,CAACC,mBAAmB,CAAC,CAAC,IACnEC,sBAAsB,KAAK,IAAI,CAACA,sBAAsB,EACtD;QACA;MACF;MACAF,8CAAsB,CAACO,yBAAyB,CAACJ,cAAc,CAAC;IAClE,CAAC,CAAC;EACJ;EACA;AACF;AACA;AACA;AACA;AACA;EACEK,cAAcA,CAACC,GAAW,EAAEC,GAAW,EAAmB;IACxD,OAAO,IAAI,CAACL,KAAK,CAACM,oBAAoB,CAACD,GAAG,EAAED,GAAG,CAAC;EAClD;EACA;AACF;AACA;AACA;AACA;AACA;EACEE,oBAAoBA,CAACD,GAAW,EAAED,GAAY,EAAmB;IAC/D,OAAO,IAAI,CAACJ,KAAK,CAACM,oBAAoB,CAACD,GAAG,EAAED,GAAG,CAAC;EAClD;AACF;AACO,MAAMG,kBAA0C,GAAAnB,OAAA,CAAAmB,kBAAA,GACrD,IAAIlB,yBAAyB,CAAC,CAAC","ignoreList":[]}
@@ -147,6 +147,12 @@ Object.defineProperty(exports, "FTRumErrorTracking", {
147
147
  return _FTRumErrorTracking.FTRumErrorTracking;
148
148
  }
149
149
  });
150
+ Object.defineProperty(exports, "FTRumViewTracking", {
151
+ enumerable: true,
152
+ get: function () {
153
+ return _FTRumViewTracking.FTRumViewTracking;
154
+ }
155
+ });
150
156
  Object.defineProperty(exports, "FTTraceConfig", {
151
157
  enumerable: true,
152
158
  get: function () {
@@ -179,4 +185,5 @@ var _FTRumActionTracking = require("./rum/FTRumActionTracking");
179
185
  var _FTRumErrorTracking = require("./rum/FTRumErrorTracking");
180
186
  var _FTBabelInteractionTracking = require("./rum/FTBabelInteractionTracking");
181
187
  var _FTBabelUtils = require("./rum/FTBabelUtils");
188
+ var _FTRumViewTracking = require("./rum/FTRumViewTracking");
182
189
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["_ft_mobile_agent","require","_ft_logger","_ft_rum","_ft_tracing","_FTRumActionTracking","_FTRumErrorTracking","_FTBabelInteractionTracking","_FTBabelUtils"],"sources":["index.tsx"],"sourcesContent":["import {\n FTMobileConfig,\n FTMobileReactNative,\n EnvType,\n FTDBCacheDiscard,\n FTRemoteConfigResult,\n FTRemoteConfigOverrideRule,\n FTRemoteConfigOverrideMatch,\n FTRemoteConfigOverrideValues,\n} from './ft_mobile_agent';\nimport {\n FTLogConfig,\n FTReactNativeLog,\n FTLogStatus,\n FTLogCacheDiscard,\n} from './ft_logger';\nimport {\n FTRUMConfig,\n FTRUMResource,\n FTReactNativeRUM,\n ErrorMonitorType,\n DeviceMetricsMonitorType,\n DetectFrequency,\n FTRUMResourceMetrics,\n FTRUMCacheDiscard,\n IOSCrashMonitoringType,\n} from './ft_rum';\nimport { FTTraceConfig, FTReactNativeTrace, TraceType } from './ft_tracing';\nimport { FTRumActionTracking } from './rum/FTRumActionTracking';\nimport { FTRumErrorTracking } from './rum/FTRumErrorTracking';\nimport { FTBabelInteractionTracking } from './rum/FTBabelInteractionTracking';\nimport { __ftExtractText } from './rum/FTBabelUtils';\n\nexport {\n FTMobileReactNative,\n FTMobileConfig,\n EnvType,\n FTDBCacheDiscard,\n FTRemoteConfigResult,\n FTRemoteConfigOverrideRule,\n FTRemoteConfigOverrideMatch,\n FTRemoteConfigOverrideValues,\n FTLogConfig,\n FTReactNativeLog,\n FTLogStatus,\n FTLogCacheDiscard,\n FTRUMConfig,\n FTReactNativeRUM,\n FTRUMResource,\n ErrorMonitorType,\n DeviceMetricsMonitorType,\n DetectFrequency,\n FTRUMResourceMetrics,\n FTRUMCacheDiscard,\n IOSCrashMonitoringType,\n FTTraceConfig,\n FTReactNativeTrace,\n TraceType,\n FTRumActionTracking,\n FTRumErrorTracking,\n FTBabelInteractionTracking,\n __ftExtractText,\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,gBAAA,GAAAC,OAAA;AAUA,IAAAC,UAAA,GAAAD,OAAA;AAMA,IAAAE,OAAA,GAAAF,OAAA;AAWA,IAAAG,WAAA,GAAAH,OAAA;AACA,IAAAI,oBAAA,GAAAJ,OAAA;AACA,IAAAK,mBAAA,GAAAL,OAAA;AACA,IAAAM,2BAAA,GAAAN,OAAA;AACA,IAAAO,aAAA,GAAAP,OAAA","ignoreList":[]}
1
+ {"version":3,"names":["_ft_mobile_agent","require","_ft_logger","_ft_rum","_ft_tracing","_FTRumActionTracking","_FTRumErrorTracking","_FTBabelInteractionTracking","_FTBabelUtils","_FTRumViewTracking"],"sources":["index.tsx"],"sourcesContent":["import {\n FTMobileConfig,\n FTMobileReactNative,\n EnvType,\n FTDBCacheDiscard,\n FTRemoteConfigResult,\n FTRemoteConfigOverrideRule,\n FTRemoteConfigOverrideMatch,\n FTRemoteConfigOverrideValues,\n} from './ft_mobile_agent';\nimport {\n FTLogConfig,\n FTReactNativeLog,\n FTLogStatus,\n FTLogCacheDiscard,\n} from './ft_logger';\nimport {\n FTRUMConfig,\n FTRUMResource,\n FTReactNativeRUM,\n ErrorMonitorType,\n DeviceMetricsMonitorType,\n DetectFrequency,\n FTRUMResourceMetrics,\n FTRUMCacheDiscard,\n IOSCrashMonitoringType,\n} from './ft_rum';\nimport { FTTraceConfig, FTReactNativeTrace, TraceType } from './ft_tracing';\nimport { FTRumActionTracking } from './rum/FTRumActionTracking';\nimport { FTRumErrorTracking } from './rum/FTRumErrorTracking';\nimport { FTBabelInteractionTracking } from './rum/FTBabelInteractionTracking';\nimport { __ftExtractText } from './rum/FTBabelUtils';\n\nexport {\n FTMobileReactNative,\n FTMobileConfig,\n EnvType,\n FTDBCacheDiscard,\n FTRemoteConfigResult,\n FTRemoteConfigOverrideRule,\n FTRemoteConfigOverrideMatch,\n FTRemoteConfigOverrideValues,\n FTLogConfig,\n FTReactNativeLog,\n FTLogStatus,\n FTLogCacheDiscard,\n FTRUMConfig,\n FTReactNativeRUM,\n FTRUMResource,\n ErrorMonitorType,\n DeviceMetricsMonitorType,\n DetectFrequency,\n FTRUMResourceMetrics,\n FTRUMCacheDiscard,\n IOSCrashMonitoringType,\n FTTraceConfig,\n FTReactNativeTrace,\n TraceType,\n FTRumActionTracking,\n FTRumErrorTracking,\n FTBabelInteractionTracking,\n __ftExtractText,\n};\n\nexport type { FTVisitorIdConfig } from './visitorIdConfig';\n\nexport { FTRumViewTracking } from './rum/FTRumViewTracking';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,gBAAA,GAAAC,OAAA;AAUA,IAAAC,UAAA,GAAAD,OAAA;AAMA,IAAAE,OAAA,GAAAF,OAAA;AAWA,IAAAG,WAAA,GAAAH,OAAA;AACA,IAAAI,oBAAA,GAAAJ,OAAA;AACA,IAAAK,mBAAA,GAAAL,OAAA;AACA,IAAAM,2BAAA,GAAAN,OAAA;AACA,IAAAO,aAAA,GAAAP,OAAA;AAmCA,IAAAQ,kBAAA,GAAAR,OAAA","ignoreList":[]}
@@ -0,0 +1,147 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.FTRumViewTracking = void 0;
7
+ var _reactNative = require("react-native");
8
+ var _ft_rum = require("../ft_rum");
9
+ var _ft_mobile_agent = require("../ft_mobile_agent");
10
+ function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
11
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
12
+ function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
13
+ const MAX_PENDING_LOAD_MS = 15 * 60 * 1000;
14
+
15
+ /** Shared lifecycle coordinator for navigation adapters. Use one per navigator. */
16
+ class FTRumViewTracking {
17
+ constructor(onBackground) {
18
+ this.onBackground = onBackground;
19
+ _defineProperty(this, "current", void 0);
20
+ _defineProperty(this, "active", void 0);
21
+ _defineProperty(this, "generation", 0);
22
+ _defineProperty(this, "lifecycle", 0);
23
+ _defineProperty(this, "state", null);
24
+ _defineProperty(this, "subscription", void 0);
25
+ _defineProperty(this, "loading", new Map());
26
+ _defineProperty(this, "onAppState", state => {
27
+ if (state === this.state) return;
28
+ this.state = state;
29
+ if (state === 'background') {
30
+ var _this$onBackground;
31
+ // Native closes Automatic Views at its own history boundary. No JS stop.
32
+ this.active = undefined;
33
+ this.loading.clear();
34
+ (_this$onBackground = this.onBackground) === null || _this$onBackground === void 0 || _this$onBackground.call(this);
35
+ } else if (state === 'active' && this.current) {
36
+ this.show(this.current);
37
+ }
38
+ });
39
+ }
40
+ start() {
41
+ if (this.subscription) return;
42
+ this.state = _reactNative.AppState.currentState;
43
+ const lifecycle = ++this.lifecycle;
44
+ const listener = state => {
45
+ if (lifecycle === this.lifecycle) this.onAppState(state);
46
+ };
47
+ const subscription = _reactNative.AppState.addEventListener('change', listener);
48
+ // RN < 0.65 uses removeEventListener instead of returning a subscription.
49
+ const legacyAppState = _reactNative.AppState;
50
+ this.subscription = subscription || {
51
+ remove: () => {
52
+ var _legacyAppState$remov;
53
+ return (_legacyAppState$remov = legacyAppState.removeEventListener) === null || _legacyAppState$remov === void 0 ? void 0 : _legacyAppState$remov.call(legacyAppState, 'change', listener);
54
+ }
55
+ };
56
+ }
57
+
58
+ /** Capture both clocks at the loading boundary, before any async work. */
59
+ beginLoad(key) {
60
+ this.start();
61
+ this.pruneLoading();
62
+ if (this.state === 'background' || this.loading.has(key)) return;
63
+ if (typeof performance === 'undefined' || typeof performance.now !== 'function') return;
64
+ // Only the latest transition can supply loading for this navigator.
65
+ this.loading.clear();
66
+ this.loading.set(key, {
67
+ monotonicMs: performance.now(),
68
+ epochMs: Date.now()
69
+ });
70
+ }
71
+
72
+ /** Remember a transitioning route so foreground recovery uses the current page. */
73
+ setCurrent(route) {
74
+ this.start();
75
+ this.current = {
76
+ key: route.key,
77
+ name: route.name
78
+ };
79
+ }
80
+ show(route, loadingKey = route.key) {
81
+ var _this$active;
82
+ this.setCurrent(route);
83
+ this.pruneLoading();
84
+ const loading = this.loading.get(loadingKey);
85
+ this.loading.clear();
86
+ if (this.state !== 'active') return undefined;
87
+ if (((_this$active = this.active) === null || _this$active === void 0 ? void 0 : _this$active.key) === route.key) return this.active.generation;
88
+ this.active = {
89
+ key: route.key,
90
+ generation: ++this.generation
91
+ };
92
+ if (loading) {
93
+ const durationNs = Math.floor((performance.now() - loading.monotonicMs) * 1000000);
94
+ if (Number.isFinite(durationNs) && durationNs > 0) {
95
+ this.report(this.nativeRUM.onCreateViewWithLoadStart(route.name, durationNs, Number.isFinite(loading.epochMs) ? loading.epochMs : 0));
96
+ }
97
+ }
98
+ // Enqueue these calls together. Waiting for a Promise here could start a stale
99
+ // page after background/route changes; native consumes loading before start.
100
+ this.report(this.nativeRUM.startViewWithTrackingType(route.name, _ft_mobile_agent.bridgeContextManager.mergeWithLocalPropertiesSync(), 1 // Automatic is an internal framework bridge detail.
101
+ ));
102
+ return this.active.generation;
103
+ }
104
+
105
+ /** Apply a completed interval only to the appearance that started it. */
106
+ updateLoadingTime(key, generation, durationNs) {
107
+ if (this.state !== 'active' || !this.active || this.active.key !== key || this.active.generation !== generation || !Number.isSafeInteger(durationNs) || durationNs <= 0) return;
108
+ // Enqueue immediately; never let a Promise continuation update another View.
109
+ this.report(_ft_rum.FTReactNativeRUM.updateViewLoadingTime(durationNs));
110
+ }
111
+
112
+ /** Only the appearance that owns the active generation may close it. */
113
+ hide(key, generation) {
114
+ if (this.state !== 'active') return;
115
+ if (!this.active || this.active.key !== key || this.active.generation !== generation) return;
116
+ this.active = undefined;
117
+ this.current = undefined;
118
+ this.report(_ft_rum.FTReactNativeRUM.stopView());
119
+ }
120
+ stop() {
121
+ var _this$subscription;
122
+ ++this.lifecycle;
123
+ (_this$subscription = this.subscription) === null || _this$subscription === void 0 || _this$subscription.remove();
124
+ this.subscription = undefined;
125
+ if (this.active && this.state === 'active') this.report(_ft_rum.FTReactNativeRUM.stopView());
126
+ this.active = undefined;
127
+ this.current = undefined;
128
+ this.loading.clear();
129
+ // Never reuse generation values: callbacks from a previous subscription can arrive late.
130
+ }
131
+ pruneLoading() {
132
+ const now = typeof performance !== 'undefined' && typeof performance.now === 'function' ? performance.now() : NaN;
133
+ for (const [key, load] of this.loading) {
134
+ const age = now - load.monotonicMs;
135
+ if (!Number.isFinite(age) || age < 0 || age >= MAX_PENDING_LOAD_MS) this.loading.delete(key);
136
+ }
137
+ }
138
+ get nativeRUM() {
139
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
140
+ return require('../specs/NativeFTReactNativeRUM').default;
141
+ }
142
+ report(result) {
143
+ result.catch(error => console.warn('[TrueWatch] Automatic View tracking failed', error));
144
+ }
145
+ }
146
+ exports.FTRumViewTracking = FTRumViewTracking;
147
+ //# sourceMappingURL=FTRumViewTracking.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_reactNative","require","_ft_rum","_ft_mobile_agent","_defineProperty","e","r","t","_toPropertyKey","Object","defineProperty","value","enumerable","configurable","writable","i","_toPrimitive","Symbol","toPrimitive","call","TypeError","String","Number","MAX_PENDING_LOAD_MS","FTRumViewTracking","constructor","onBackground","Map","state","_this$onBackground","active","undefined","loading","clear","current","show","start","subscription","AppState","currentState","lifecycle","listener","onAppState","addEventListener","legacyAppState","remove","_legacyAppState$remov","removeEventListener","beginLoad","key","pruneLoading","has","performance","now","set","monotonicMs","epochMs","Date","setCurrent","route","name","loadingKey","_this$active","get","generation","durationNs","Math","floor","isFinite","report","nativeRUM","onCreateViewWithLoadStart","startViewWithTrackingType","bridgeContextManager","mergeWithLocalPropertiesSync","updateLoadingTime","isSafeInteger","FTReactNativeRUM","updateViewLoadingTime","hide","stopView","stop","_this$subscription","NaN","load","age","delete","default","result","catch","error","console","warn","exports"],"sources":["FTRumViewTracking.ts"],"sourcesContent":["import { AppState } from 'react-native';\nimport type { AppStateStatus } from 'react-native';\nimport { FTReactNativeRUM } from '../ft_rum';\nimport { bridgeContextManager } from '../ft_mobile_agent';\nimport type { Spec as NativeRUMSpec } from '../specs/NativeFTReactNativeRUM';\n\ntype Route = { key: string; name: string };\ntype Loading = { monotonicMs: number; epochMs: number };\nconst MAX_PENDING_LOAD_MS = 15 * 60 * 1000;\n\n/** Shared lifecycle coordinator for navigation adapters. Use one per navigator. */\nexport class FTRumViewTracking {\n private current?: Route;\n private active?: { key: string; generation: number };\n private generation = 0;\n private lifecycle = 0;\n private state: AppStateStatus | null = null;\n private subscription?: { remove(): void };\n private loading = new Map<string, Loading>();\n\n constructor(private readonly onBackground?: () => void) {}\n\n start(): void {\n if (this.subscription) return;\n this.state = AppState.currentState;\n const lifecycle = ++this.lifecycle;\n const listener = (state: AppStateStatus): void => {\n if (lifecycle === this.lifecycle) this.onAppState(state);\n };\n const subscription = AppState.addEventListener('change', listener);\n // RN < 0.65 uses removeEventListener instead of returning a subscription.\n const legacyAppState = AppState as typeof AppState & {\n removeEventListener?: (type: string, callback: typeof listener) => void;\n };\n this.subscription = subscription || {\n remove: () => legacyAppState.removeEventListener?.('change', listener),\n };\n }\n\n /** Capture both clocks at the loading boundary, before any async work. */\n beginLoad(key: string): void {\n this.start();\n this.pruneLoading();\n if (this.state === 'background' || this.loading.has(key)) return;\n if (\n typeof performance === 'undefined' ||\n typeof performance.now !== 'function'\n )\n return;\n // Only the latest transition can supply loading for this navigator.\n this.loading.clear();\n this.loading.set(key, {\n monotonicMs: performance.now(),\n epochMs: Date.now(),\n });\n }\n\n /** Remember a transitioning route so foreground recovery uses the current page. */\n setCurrent(route: Route): void {\n this.start();\n this.current = { key: route.key, name: route.name };\n }\n\n show(route: Route, loadingKey: string = route.key): number | undefined {\n this.setCurrent(route);\n this.pruneLoading();\n const loading = this.loading.get(loadingKey);\n this.loading.clear();\n if (this.state !== 'active') return undefined;\n if (this.active?.key === route.key) return this.active.generation;\n this.active = { key: route.key, generation: ++this.generation };\n if (loading) {\n const durationNs = Math.floor(\n (performance.now() - loading.monotonicMs) * 1000000\n );\n if (Number.isFinite(durationNs) && durationNs > 0) {\n this.report(\n this.nativeRUM.onCreateViewWithLoadStart(\n route.name,\n durationNs,\n Number.isFinite(loading.epochMs) ? loading.epochMs : 0\n )\n );\n }\n }\n // Enqueue these calls together. Waiting for a Promise here could start a stale\n // page after background/route changes; native consumes loading before start.\n this.report(\n this.nativeRUM.startViewWithTrackingType(\n route.name,\n bridgeContextManager.mergeWithLocalPropertiesSync(),\n 1 // Automatic is an internal framework bridge detail.\n )\n );\n return this.active.generation;\n }\n\n /** Apply a completed interval only to the appearance that started it. */\n updateLoadingTime(\n key: string,\n generation: number | undefined,\n durationNs: number\n ): void {\n if (\n this.state !== 'active' ||\n !this.active ||\n this.active.key !== key ||\n this.active.generation !== generation ||\n !Number.isSafeInteger(durationNs) ||\n durationNs <= 0\n )\n return;\n // Enqueue immediately; never let a Promise continuation update another View.\n this.report(FTReactNativeRUM.updateViewLoadingTime(durationNs));\n }\n\n /** Only the appearance that owns the active generation may close it. */\n hide(key: string, generation: number | undefined): void {\n if (this.state !== 'active') return;\n if (\n !this.active ||\n this.active.key !== key ||\n this.active.generation !== generation\n )\n return;\n this.active = undefined;\n this.current = undefined;\n this.report(FTReactNativeRUM.stopView());\n }\n\n stop(): void {\n ++this.lifecycle;\n this.subscription?.remove();\n this.subscription = undefined;\n if (this.active && this.state === 'active')\n this.report(FTReactNativeRUM.stopView());\n this.active = undefined;\n this.current = undefined;\n this.loading.clear();\n // Never reuse generation values: callbacks from a previous subscription can arrive late.\n }\n\n private onAppState = (state: AppStateStatus): void => {\n if (state === this.state) return;\n this.state = state;\n if (state === 'background') {\n // Native closes Automatic Views at its own history boundary. No JS stop.\n this.active = undefined;\n this.loading.clear();\n this.onBackground?.();\n } else if (state === 'active' && this.current) {\n this.show(this.current);\n }\n };\n\n private pruneLoading(): void {\n const now =\n typeof performance !== 'undefined' &&\n typeof performance.now === 'function'\n ? performance.now()\n : NaN;\n for (const [key, load] of this.loading) {\n const age = now - load.monotonicMs;\n if (!Number.isFinite(age) || age < 0 || age >= MAX_PENDING_LOAD_MS)\n this.loading.delete(key);\n }\n }\n\n private get nativeRUM(): NativeRUMSpec {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n return require('../specs/NativeFTReactNativeRUM').default;\n }\n\n private report(result: Promise<void>): void {\n result.catch((error) =>\n console.warn('[TrueWatch] Automatic View tracking failed', error)\n );\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"names":["_NativeFTReactNativeWebSocket","_interopRequireDefault","require","_ft_mobile_agent","e","__esModule","default","_defineProperty","r","t","_toPropertyKey","Object","defineProperty","value","enumerable","configurable","writable","i","_toPrimitive","Symbol","toPrimitive","call","TypeError","String","Number","ignoreBridgeFailure","Promise","resolve","catch","NativeWebSocketSession","constructor","session","NativeWebSocket","startCapture","startResource","key","socketID","url","property","bridgeContextManager","mergeWithLocalPropertiesSync","sequence","stopResource","event","addResource","content","metrics","release","releaseResource","stop","stopped","stopCapture","exports","startNativeWebSocketSession","createKey","clear","undefined","clearNativeWebSocketSessions","webSocketNativeID","socket","id","_socketId","isSafeInteger"],"sources":["FTRumWebSocketNative.ts"],"sourcesContent":["import NativeWebSocket from '../specs/NativeFTReactNativeWebSocket';\nimport { bridgeContextManager } from '../ft_mobile_agent';\n\nexport interface NativeWebSocketResource {\n url: string;\n httpMethod: string;\n requestHeader: Record<string, unknown>;\n webSocketEvent: string;\n errorMessage?: string;\n}\n\nfunction ignoreBridgeFailure(call: () => unknown): void {\n try {\n void Promise.resolve(call()).catch(() => {});\n } catch {\n /* Setup/cleanup replies must not interrupt JS capture. */\n }\n}\n\nexport class NativeWebSocketSession {\n private stopped = false;\n private sequence = 0;\n\n constructor(private readonly session: string) {\n // Enqueue setup before start/stop/add on the same native module queue.\n // Its reply never gates JS capture or selects a different reporting route.\n ignoreBridgeFailure(() => NativeWebSocket!.startCapture(session));\n }\n\n startResource(\n key: string,\n socketID: number | undefined,\n url: string\n ): Promise<void> {\n const property = bridgeContextManager.mergeWithLocalPropertiesSync();\n return NativeWebSocket!.startResource(\n key,\n socketID ?? -1,\n url,\n this.session,\n ++this.sequence,\n property\n );\n }\n\n stopResource(key: string, event: string): Promise<void> {\n const property = bridgeContextManager.mergeWithLocalPropertiesSync();\n return NativeWebSocket!.stopResource(key, event, this.session, property);\n }\n\n addResource(\n key: string,\n content: NativeWebSocketResource,\n metrics: { duration?: number }\n ): Promise<void> {\n return NativeWebSocket!.addResource(key, content, metrics, this.session);\n }\n\n release(key: string): void {\n ignoreBridgeFailure(() =>\n NativeWebSocket?.releaseResource(key, this.session)\n );\n }\n\n stop(): void {\n if (this.stopped) return;\n this.stopped = true;\n // Existing handshakes still finish through their originally selected route.\n ignoreBridgeFailure(() => NativeWebSocket?.stopCapture(this.session));\n }\n}\n\nexport function startNativeWebSocketSession(\n createKey: () => string\n): NativeWebSocketSession | undefined {\n try {\n if (\n typeof NativeWebSocket?.startCapture === 'function' &&\n typeof NativeWebSocket.stopCapture === 'function' &&\n typeof NativeWebSocket.clear === 'function' &&\n typeof NativeWebSocket.startResource === 'function' &&\n typeof NativeWebSocket.stopResource === 'function' &&\n typeof NativeWebSocket.addResource === 'function' &&\n typeof NativeWebSocket.releaseResource === 'function'\n )\n return new NativeWebSocketSession(createKey());\n } catch {\n /* Old native binaries keep the JS fallback. */\n }\n return undefined;\n}\n\nexport function clearNativeWebSocketSessions(): void {\n ignoreBridgeFailure(() => NativeWebSocket?.clear());\n}\n\nexport function webSocketNativeID(socket: unknown): number | undefined {\n try {\n const id = (socket as { _socketId?: unknown })?._socketId;\n return typeof id === 'number' && Number.isSafeInteger(id) && id >= 0\n ? id\n : undefined;\n } catch {\n return undefined;\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_NativeFTReactNativeWebSocket","_interopRequireDefault","require","_ft_mobile_agent","e","__esModule","default","_defineProperty","r","t","_toPropertyKey","Object","defineProperty","value","enumerable","configurable","writable","i","_toPrimitive","Symbol","toPrimitive","call","TypeError","String","Number","ignoreBridgeFailure","Promise","resolve","catch","NativeWebSocketSession","constructor","session","NativeWebSocket","startCapture","startResource","key","socketID","url","property","bridgeContextManager","mergeWithLocalPropertiesSync","sequence","stopResource","event","addResource","content","metrics","release","releaseResource","stop","stopped","stopCapture","exports","startNativeWebSocketSession","createKey","clear","undefined","clearNativeWebSocketSessions","webSocketNativeID","socket","id","_socketId","isSafeInteger"],"sources":["FTRumWebSocketNative.ts"],"sourcesContent":["import NativeWebSocket from '../specs/NativeFTReactNativeWebSocket';\nimport { bridgeContextManager } from '../ft_mobile_agent';\nimport type { WebSocketTimingMetrics } from './FTRumWebSocketTiming';\n\nexport interface NativeWebSocketResource {\n url: string;\n httpMethod: string;\n requestHeader: Record<string, unknown>;\n webSocketEvent: string;\n errorMessage?: string;\n}\n\nfunction ignoreBridgeFailure(call: () => unknown): void {\n try {\n void Promise.resolve(call()).catch(() => {});\n } catch {\n /* Setup/cleanup replies must not interrupt JS capture. */\n }\n}\n\nexport class NativeWebSocketSession {\n private stopped = false;\n private sequence = 0;\n\n constructor(private readonly session: string) {\n // Enqueue setup before start/stop/add on the same native module queue.\n // Its reply never gates JS capture or selects a different reporting route.\n ignoreBridgeFailure(() => NativeWebSocket!.startCapture(session));\n }\n\n startResource(\n key: string,\n socketID: number | undefined,\n url: string\n ): Promise<void> {\n const property = bridgeContextManager.mergeWithLocalPropertiesSync();\n return NativeWebSocket!.startResource(\n key,\n socketID ?? -1,\n url,\n this.session,\n ++this.sequence,\n property\n );\n }\n\n stopResource(key: string, event: string): Promise<void> {\n const property = bridgeContextManager.mergeWithLocalPropertiesSync();\n return NativeWebSocket!.stopResource(key, event, this.session, property);\n }\n\n addResource(\n key: string,\n content: NativeWebSocketResource,\n metrics: Partial<WebSocketTimingMetrics>\n ): Promise<void> {\n return NativeWebSocket!.addResource(key, content, metrics, this.session);\n }\n\n release(key: string): void {\n ignoreBridgeFailure(() =>\n NativeWebSocket?.releaseResource(key, this.session)\n );\n }\n\n stop(): void {\n if (this.stopped) return;\n this.stopped = true;\n // Existing handshakes still finish through their originally selected route.\n ignoreBridgeFailure(() => NativeWebSocket?.stopCapture(this.session));\n }\n}\n\nexport function startNativeWebSocketSession(\n createKey: () => string\n): NativeWebSocketSession | undefined {\n try {\n if (\n typeof NativeWebSocket?.startCapture === 'function' &&\n typeof NativeWebSocket.stopCapture === 'function' &&\n typeof NativeWebSocket.clear === 'function' &&\n typeof NativeWebSocket.startResource === 'function' &&\n typeof NativeWebSocket.stopResource === 'function' &&\n typeof NativeWebSocket.addResource === 'function' &&\n typeof NativeWebSocket.releaseResource === 'function'\n )\n return new NativeWebSocketSession(createKey());\n } catch {\n /* Old native binaries keep the JS fallback. */\n }\n return undefined;\n}\n\nexport function clearNativeWebSocketSessions(): void {\n ignoreBridgeFailure(() => NativeWebSocket?.clear());\n}\n\nexport function webSocketNativeID(socket: unknown): number | undefined {\n try {\n const id = (socket as { _socketId?: unknown })?._socketId;\n return typeof id === 'number' && Number.isSafeInteger(id) && id >= 0\n ? id\n : undefined;\n } catch {\n return undefined;\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -41,9 +41,27 @@ function startWebSocketTiming() {
41
41
  }
42
42
  // Resource metrics use nanoseconds. Do not send an invalid bridge number.
43
43
  const durationNs = Math.round(durationMs * 1e6);
44
- return Number.isSafeInteger(durationNs) ? durationNs : undefined;
44
+ if (!Number.isSafeInteger(durationNs)) return undefined;
45
+ const metrics = {
46
+ duration: durationNs
47
+ };
48
+ if (wallStart !== undefined && Number.isSafeInteger(wallStart) && wallStart > 0) {
49
+ // Add the monotonic elapsed interval to the start epoch, not Date.now()
50
+ // at completion. Split milliseconds/remainder to avoid epoch-ns doubles.
51
+ const endMs = wallStart + Math.floor(durationNs / 1e6);
52
+ const start = `${wallStart}000000`;
53
+ const end = `${endMs}${String(durationNs % 1e6).padStart(6, '0')}`;
54
+ if (Number.isSafeInteger(endMs) && fitsInt64(start) && fitsInt64(end)) {
55
+ metrics.fetchStartNsTimeInterval = start;
56
+ metrics.fetchEndNsTimeInterval = end;
57
+ }
58
+ }
59
+ return metrics;
45
60
  };
46
61
  }
62
+ function fitsInt64(value) {
63
+ return value.length < 19 || value.length === 19 && value <= '9223372036854775807';
64
+ }
47
65
  function readWallTime() {
48
66
  try {
49
67
  const time = Date.now();
@@ -1 +1 @@
1
- {"version":3,"names":["startWebSocketTiming","wallStart","readWallTime","monotonicNow","monotonicStart","clock","globalThis","performance","now","durationMs","Number","isFinite","elapsed","undefined","wallEnd","durationNs","Math","round","isSafeInteger","time","Date"],"sources":["FTRumWebSocketTiming.ts"],"sourcesContent":["/** Measures only the JS-observed opening handshake; bridge delays are excluded. */\nexport function startWebSocketTiming(): () => number | undefined {\n const wallStart = readWallTime();\n let monotonicNow: (() => number) | undefined;\n let monotonicStart: number | undefined;\n try {\n const clock = globalThis.performance;\n if (typeof clock?.now === 'function') {\n monotonicNow = () => clock.now();\n monotonicStart = monotonicNow();\n }\n } catch {\n // Older runtimes and other instrumentation may not provide this clock.\n }\n\n return () => {\n let durationMs: number | undefined;\n try {\n if (monotonicNow && Number.isFinite(monotonicStart)) {\n const elapsed = monotonicNow() - (monotonicStart as number);\n if (Number.isFinite(elapsed) && elapsed >= 0) {\n durationMs = elapsed;\n }\n }\n } catch {\n // Fall back to wall time if the monotonic clock becomes unavailable.\n }\n if (durationMs === undefined && wallStart !== undefined) {\n const wallEnd = readWallTime();\n if (wallEnd !== undefined && wallEnd >= wallStart) {\n durationMs = wallEnd - wallStart;\n }\n }\n if (durationMs === undefined) {\n return undefined;\n }\n // Resource metrics use nanoseconds. Do not send an invalid bridge number.\n const durationNs = Math.round(durationMs * 1e6);\n return Number.isSafeInteger(durationNs) ? durationNs : undefined;\n };\n}\n\nfunction readWallTime(): number | undefined {\n try {\n const time = Date.now();\n return Number.isFinite(time) ? time : undefined;\n } catch {\n return undefined;\n }\n}\n"],"mappings":";;;;;;AAAA;AACO,SAASA,oBAAoBA,CAAA,EAA6B;EAC/D,MAAMC,SAAS,GAAGC,YAAY,CAAC,CAAC;EAChC,IAAIC,YAAwC;EAC5C,IAAIC,cAAkC;EACtC,IAAI;IACF,MAAMC,KAAK,GAAGC,UAAU,CAACC,WAAW;IACpC,IAAI,QAAOF,KAAK,aAALA,KAAK,uBAALA,KAAK,CAAEG,GAAG,MAAK,UAAU,EAAE;MACpCL,YAAY,GAAGA,CAAA,KAAME,KAAK,CAACG,GAAG,CAAC,CAAC;MAChCJ,cAAc,GAAGD,YAAY,CAAC,CAAC;IACjC;EACF,CAAC,CAAC,MAAM;IACN;EAAA;EAGF,OAAO,MAAM;IACX,IAAIM,UAA8B;IAClC,IAAI;MACF,IAAIN,YAAY,IAAIO,MAAM,CAACC,QAAQ,CAACP,cAAc,CAAC,EAAE;QACnD,MAAMQ,OAAO,GAAGT,YAAY,CAAC,CAAC,GAAIC,cAAyB;QAC3D,IAAIM,MAAM,CAACC,QAAQ,CAACC,OAAO,CAAC,IAAIA,OAAO,IAAI,CAAC,EAAE;UAC5CH,UAAU,GAAGG,OAAO;QACtB;MACF;IACF,CAAC,CAAC,MAAM;MACN;IAAA;IAEF,IAAIH,UAAU,KAAKI,SAAS,IAAIZ,SAAS,KAAKY,SAAS,EAAE;MACvD,MAAMC,OAAO,GAAGZ,YAAY,CAAC,CAAC;MAC9B,IAAIY,OAAO,KAAKD,SAAS,IAAIC,OAAO,IAAIb,SAAS,EAAE;QACjDQ,UAAU,GAAGK,OAAO,GAAGb,SAAS;MAClC;IACF;IACA,IAAIQ,UAAU,KAAKI,SAAS,EAAE;MAC5B,OAAOA,SAAS;IAClB;IACA;IACA,MAAME,UAAU,GAAGC,IAAI,CAACC,KAAK,CAACR,UAAU,GAAG,GAAG,CAAC;IAC/C,OAAOC,MAAM,CAACQ,aAAa,CAACH,UAAU,CAAC,GAAGA,UAAU,GAAGF,SAAS;EAClE,CAAC;AACH;AAEA,SAASX,YAAYA,CAAA,EAAuB;EAC1C,IAAI;IACF,MAAMiB,IAAI,GAAGC,IAAI,CAACZ,GAAG,CAAC,CAAC;IACvB,OAAOE,MAAM,CAACC,QAAQ,CAACQ,IAAI,CAAC,GAAGA,IAAI,GAAGN,SAAS;EACjD,CAAC,CAAC,MAAM;IACN,OAAOA,SAAS;EAClB;AACF","ignoreList":[]}
1
+ {"version":3,"names":["startWebSocketTiming","wallStart","readWallTime","monotonicNow","monotonicStart","clock","globalThis","performance","now","durationMs","Number","isFinite","elapsed","undefined","wallEnd","durationNs","Math","round","isSafeInteger","metrics","duration","endMs","floor","start","end","String","padStart","fitsInt64","fetchStartNsTimeInterval","fetchEndNsTimeInterval","value","length","time","Date"],"sources":["FTRumWebSocketTiming.ts"],"sourcesContent":["export interface WebSocketTimingMetrics {\n duration: number;\n // Decimal int64 nanoseconds: epoch nanoseconds exceed JS number precision.\n fetchStartNsTimeInterval?: string;\n fetchEndNsTimeInterval?: string;\n}\n\n/** Measures only the JS-observed opening handshake; bridge delays are excluded. */\nexport function startWebSocketTiming(): () =>\n | WebSocketTimingMetrics\n | undefined {\n const wallStart = readWallTime();\n let monotonicNow: (() => number) | undefined;\n let monotonicStart: number | undefined;\n try {\n const clock = globalThis.performance;\n if (typeof clock?.now === 'function') {\n monotonicNow = () => clock.now();\n monotonicStart = monotonicNow();\n }\n } catch {\n // Older runtimes and other instrumentation may not provide this clock.\n }\n\n return () => {\n let durationMs: number | undefined;\n try {\n if (monotonicNow && Number.isFinite(monotonicStart)) {\n const elapsed = monotonicNow() - (monotonicStart as number);\n if (Number.isFinite(elapsed) && elapsed >= 0) {\n durationMs = elapsed;\n }\n }\n } catch {\n // Fall back to wall time if the monotonic clock becomes unavailable.\n }\n if (durationMs === undefined && wallStart !== undefined) {\n const wallEnd = readWallTime();\n if (wallEnd !== undefined && wallEnd >= wallStart) {\n durationMs = wallEnd - wallStart;\n }\n }\n if (durationMs === undefined) {\n return undefined;\n }\n // Resource metrics use nanoseconds. Do not send an invalid bridge number.\n const durationNs = Math.round(durationMs * 1e6);\n if (!Number.isSafeInteger(durationNs)) return undefined;\n const metrics: WebSocketTimingMetrics = { duration: durationNs };\n if (\n wallStart !== undefined &&\n Number.isSafeInteger(wallStart) &&\n wallStart > 0\n ) {\n // Add the monotonic elapsed interval to the start epoch, not Date.now()\n // at completion. Split milliseconds/remainder to avoid epoch-ns doubles.\n const endMs = wallStart + Math.floor(durationNs / 1e6);\n const start = `${wallStart}000000`;\n const end = `${endMs}${String(durationNs % 1e6).padStart(6, '0')}`;\n if (Number.isSafeInteger(endMs) && fitsInt64(start) && fitsInt64(end)) {\n metrics.fetchStartNsTimeInterval = start;\n metrics.fetchEndNsTimeInterval = end;\n }\n }\n return metrics;\n };\n}\n\nfunction fitsInt64(value: string): boolean {\n return (\n value.length < 19 || (value.length === 19 && value <= '9223372036854775807')\n );\n}\n\nfunction readWallTime(): number | undefined {\n try {\n const time = Date.now();\n return Number.isFinite(time) ? time : undefined;\n } catch {\n return undefined;\n }\n}\n"],"mappings":";;;;;;AAOA;AACO,SAASA,oBAAoBA,CAAA,EAEtB;EACZ,MAAMC,SAAS,GAAGC,YAAY,CAAC,CAAC;EAChC,IAAIC,YAAwC;EAC5C,IAAIC,cAAkC;EACtC,IAAI;IACF,MAAMC,KAAK,GAAGC,UAAU,CAACC,WAAW;IACpC,IAAI,QAAOF,KAAK,aAALA,KAAK,uBAALA,KAAK,CAAEG,GAAG,MAAK,UAAU,EAAE;MACpCL,YAAY,GAAGA,CAAA,KAAME,KAAK,CAACG,GAAG,CAAC,CAAC;MAChCJ,cAAc,GAAGD,YAAY,CAAC,CAAC;IACjC;EACF,CAAC,CAAC,MAAM;IACN;EAAA;EAGF,OAAO,MAAM;IACX,IAAIM,UAA8B;IAClC,IAAI;MACF,IAAIN,YAAY,IAAIO,MAAM,CAACC,QAAQ,CAACP,cAAc,CAAC,EAAE;QACnD,MAAMQ,OAAO,GAAGT,YAAY,CAAC,CAAC,GAAIC,cAAyB;QAC3D,IAAIM,MAAM,CAACC,QAAQ,CAACC,OAAO,CAAC,IAAIA,OAAO,IAAI,CAAC,EAAE;UAC5CH,UAAU,GAAGG,OAAO;QACtB;MACF;IACF,CAAC,CAAC,MAAM;MACN;IAAA;IAEF,IAAIH,UAAU,KAAKI,SAAS,IAAIZ,SAAS,KAAKY,SAAS,EAAE;MACvD,MAAMC,OAAO,GAAGZ,YAAY,CAAC,CAAC;MAC9B,IAAIY,OAAO,KAAKD,SAAS,IAAIC,OAAO,IAAIb,SAAS,EAAE;QACjDQ,UAAU,GAAGK,OAAO,GAAGb,SAAS;MAClC;IACF;IACA,IAAIQ,UAAU,KAAKI,SAAS,EAAE;MAC5B,OAAOA,SAAS;IAClB;IACA;IACA,MAAME,UAAU,GAAGC,IAAI,CAACC,KAAK,CAACR,UAAU,GAAG,GAAG,CAAC;IAC/C,IAAI,CAACC,MAAM,CAACQ,aAAa,CAACH,UAAU,CAAC,EAAE,OAAOF,SAAS;IACvD,MAAMM,OAA+B,GAAG;MAAEC,QAAQ,EAAEL;IAAW,CAAC;IAChE,IACEd,SAAS,KAAKY,SAAS,IACvBH,MAAM,CAACQ,aAAa,CAACjB,SAAS,CAAC,IAC/BA,SAAS,GAAG,CAAC,EACb;MACA;MACA;MACA,MAAMoB,KAAK,GAAGpB,SAAS,GAAGe,IAAI,CAACM,KAAK,CAACP,UAAU,GAAG,GAAG,CAAC;MACtD,MAAMQ,KAAK,GAAG,GAAGtB,SAAS,QAAQ;MAClC,MAAMuB,GAAG,GAAG,GAAGH,KAAK,GAAGI,MAAM,CAACV,UAAU,GAAG,GAAG,CAAC,CAACW,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE;MAClE,IAAIhB,MAAM,CAACQ,aAAa,CAACG,KAAK,CAAC,IAAIM,SAAS,CAACJ,KAAK,CAAC,IAAII,SAAS,CAACH,GAAG,CAAC,EAAE;QACrEL,OAAO,CAACS,wBAAwB,GAAGL,KAAK;QACxCJ,OAAO,CAACU,sBAAsB,GAAGL,GAAG;MACtC;IACF;IACA,OAAOL,OAAO;EAChB,CAAC;AACH;AAEA,SAASQ,SAASA,CAACG,KAAa,EAAW;EACzC,OACEA,KAAK,CAACC,MAAM,GAAG,EAAE,IAAKD,KAAK,CAACC,MAAM,KAAK,EAAE,IAAID,KAAK,IAAI,qBAAsB;AAEhF;AAEA,SAAS5B,YAAYA,CAAA,EAAuB;EAC1C,IAAI;IACF,MAAM8B,IAAI,GAAGC,IAAI,CAACzB,GAAG,CAAC,CAAC;IACvB,OAAOE,MAAM,CAACC,QAAQ,CAACqB,IAAI,CAAC,GAAGA,IAAI,GAAGnB,SAAS;EACjD,CAAC,CAAC,MAAM;IACN,OAAOA,SAAS;EAClB;AACF","ignoreList":[]}
@@ -207,7 +207,7 @@ class FTRumWebSocketTracking {
207
207
  return;
208
208
  }
209
209
  completed = true;
210
- const duration = stopTiming();
210
+ const timing = stopTiming();
211
211
  // Freeze the observed boundary before inspecting or parsing error data.
212
212
  const error = getError === null || getError === void 0 ? void 0 : getError();
213
213
  if (cancelled || lifecycleVersion !== FTRumWebSocketTracking.lifecycleVersion) {
@@ -236,10 +236,10 @@ class FTRumWebSocketTracking {
236
236
  httpMethod: 'GET',
237
237
  requestHeader: requestHeaders,
238
238
  webSocketEvent: event
239
- }, duration, error, errorReady);
239
+ }, timing, error, errorReady);
240
240
  return;
241
241
  }
242
- void FTRumWebSocketTracking.completeResource(resourceReporter, lifecycleVersion, resourceKey, started, url, requestHeaders, resourceStatus, state, duration, error, errorReady);
242
+ void FTRumWebSocketTracking.completeResource(resourceReporter, lifecycleVersion, resourceKey, started, url, requestHeaders, resourceStatus, state, timing, error, errorReady);
243
243
  };
244
244
  const onOpen = () => complete(0, 'success', undefined, 'open');
245
245
  const onError = event => {
@@ -413,7 +413,7 @@ class FTRumWebSocketTracking {
413
413
  return Promise.reject(error);
414
414
  }
415
415
  }
416
- static async completeResource(resourceReporter, lifecycleVersion, resourceKey, startPromise, url, requestHeader, resourceStatus, webSocketHandshakeState, duration, error, errorReady) {
416
+ static async completeResource(resourceReporter, lifecycleVersion, resourceKey, startPromise, url, requestHeader, resourceStatus, webSocketHandshakeState, timing, error, errorReady) {
417
417
  const isCurrentLifecycle = () => lifecycleVersion === FTRumWebSocketTracking.lifecycleVersion;
418
418
  try {
419
419
  if (!(await startPromise) || !isCurrentLifecycle()) {
@@ -446,10 +446,8 @@ class FTRumWebSocketTracking {
446
446
  webSocketHandshakeState
447
447
  };
448
448
  if (error !== null && error !== void 0 && error.message) resource.errorMessage = error.message;
449
- const metrics = {};
450
- if (duration !== undefined) metrics.duration = duration;
451
449
  if (isCurrentLifecycle()) {
452
- await resourceReporter.addResource(resourceKey, resource, Object.keys(metrics).length ? metrics : undefined);
450
+ await resourceReporter.addResource(resourceKey, resource, timing);
453
451
  }
454
452
  } catch {
455
453
  if (isCurrentLifecycle()) {
@@ -457,7 +455,7 @@ class FTRumWebSocketTracking {
457
455
  }
458
456
  }
459
457
  }
460
- static async completeNativeResource(session, lifecycleVersion, key, started, content, duration, error, errorReady) {
458
+ static async completeNativeResource(session, lifecycleVersion, key, started, content, timing, error, errorReady) {
461
459
  // Attach rejection handling immediately, including when start never settles.
462
460
  let stopped;
463
461
  try {
@@ -475,9 +473,7 @@ class FTRumWebSocketTracking {
475
473
  await session.addResource(key, error !== null && error !== void 0 && error.message ? {
476
474
  ...content,
477
475
  errorMessage: error.message
478
- } : content, duration === undefined ? {} : {
479
- duration
480
- });
476
+ } : content, timing !== null && timing !== void 0 ? timing : {});
481
477
  } catch {
482
478
  session.release(key);
483
479
  if (lifecycleVersion === FTRumWebSocketTracking.lifecycleVersion) FTRumWebSocketTracking.warnOnce('Unable to report WebSocket resource.');