@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.
- package/FTMobileReactNativeSDK.podspec +1 -1
- package/README.md +0 -34
- package/android/build.gradle +2 -2
- package/android/src/main/java/com/ft/sdk/reactnative/FTLogImpl.java +10 -2
- package/android/src/main/java/com/ft/sdk/reactnative/FTMobileImpl.java +45 -3
- package/android/src/main/java/com/ft/sdk/reactnative/FTRUMImpl.java +51 -9
- package/android/src/main/java/com/ft/sdk/reactnative/FTTraceImpl.java +5 -2
- package/android/src/main/java/com/ft/sdk/reactnative/ViewTiming.java +17 -0
- package/android/src/main/java/com/ft/sdk/reactnative/VisitorIdConfigMapper.java +50 -0
- package/android/src/newarch/java/com/ft/sdk/reactnative/FTMobileModule.java +5 -0
- package/android/src/newarch/java/com/ft/sdk/reactnative/FTRUMModule.java +18 -0
- package/android/src/oldarch/java/com/ft/sdk/reactnative/FTMobileModule.java +5 -0
- package/android/src/oldarch/java/com/ft/sdk/reactnative/FTRUMModule.java +15 -0
- package/android/src/test/java/com/ft/sdk/reactnative/FTMobileImplTest.java +53 -0
- package/ios/FTMobileReactNative.mm +37 -2
- package/ios/FTReactNativeLog.mm +7 -2
- package/ios/FTReactNativeRUM.mm +94 -4
- package/ios/FTReactNativeResource.m +6 -0
- package/ios/FTReactNativeTrace.mm +4 -2
- package/ios/FTReactNativeViewTiming.h +18 -0
- package/ios/FTWebSocketResourceData.h +4 -0
- package/ios/FTWebSocketResourceData.m +31 -0
- package/lib/commonjs/ft_logger.js +3 -1
- package/lib/commonjs/ft_logger.js.map +1 -1
- package/lib/commonjs/ft_mobile_agent.js +13 -1
- package/lib/commonjs/ft_mobile_agent.js.map +1 -1
- package/lib/commonjs/ft_rum.js +19 -3
- package/lib/commonjs/ft_rum.js.map +1 -1
- package/lib/commonjs/ft_tracing.js +2 -1
- package/lib/commonjs/ft_tracing.js.map +1 -1
- package/lib/commonjs/index.js +7 -0
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/rum/FTRumViewTracking.js +147 -0
- package/lib/commonjs/rum/FTRumViewTracking.js.map +1 -0
- package/lib/commonjs/rum/FTRumWebSocketNative.js.map +1 -1
- package/lib/commonjs/rum/FTRumWebSocketTiming.js +19 -1
- package/lib/commonjs/rum/FTRumWebSocketTiming.js.map +1 -1
- package/lib/commonjs/rum/FTRumWebSocketTracking.js +7 -11
- package/lib/commonjs/rum/FTRumWebSocketTracking.js.map +1 -1
- package/lib/commonjs/specs/NativeFTMobileReactNative.js.map +1 -1
- package/lib/commonjs/specs/NativeFTReactNativeRUM.js.map +1 -1
- package/lib/commonjs/version.js +1 -1
- package/lib/commonjs/version.js.map +1 -1
- package/lib/commonjs/visitorIdConfig.js +37 -0
- package/lib/commonjs/visitorIdConfig.js.map +1 -0
- package/lib/module/ft_logger.js +3 -1
- package/lib/module/ft_logger.js.map +1 -1
- package/lib/module/ft_mobile_agent.js +13 -1
- package/lib/module/ft_mobile_agent.js.map +1 -1
- package/lib/module/ft_rum.js +19 -3
- package/lib/module/ft_rum.js.map +1 -1
- package/lib/module/ft_tracing.js +2 -1
- package/lib/module/ft_tracing.js.map +1 -1
- package/lib/module/index.js +1 -0
- package/lib/module/index.js.map +1 -1
- package/lib/module/rum/FTRumViewTracking.js +140 -0
- package/lib/module/rum/FTRumViewTracking.js.map +1 -0
- package/lib/module/rum/FTRumWebSocketNative.js.map +1 -1
- package/lib/module/rum/FTRumWebSocketTiming.js +19 -1
- package/lib/module/rum/FTRumWebSocketTiming.js.map +1 -1
- package/lib/module/rum/FTRumWebSocketTracking.js +7 -11
- package/lib/module/rum/FTRumWebSocketTracking.js.map +1 -1
- package/lib/module/specs/NativeFTMobileReactNative.js.map +1 -1
- package/lib/module/specs/NativeFTReactNativeRUM.js.map +1 -1
- package/lib/module/version.js +1 -1
- package/lib/module/version.js.map +1 -1
- package/lib/module/visitorIdConfig.js +31 -0
- package/lib/module/visitorIdConfig.js.map +1 -0
- package/lib/typescript/ft_logger.d.ts +11 -1
- package/lib/typescript/ft_mobile_agent.d.ts +25 -0
- package/lib/typescript/ft_rum.d.ts +33 -5
- package/lib/typescript/ft_tracing.d.ts +9 -1
- package/lib/typescript/index.d.ts +2 -0
- package/lib/typescript/rum/FTRumViewTracking.d.ts +32 -0
- package/lib/typescript/rum/FTRumWebSocketNative.d.ts +2 -3
- package/lib/typescript/rum/FTRumWebSocketTiming.d.ts +6 -1
- package/lib/typescript/rum/FTRumWebSocketTracking.d.ts +2 -4
- package/lib/typescript/specs/NativeFTMobileReactNative.d.ts +1 -0
- package/lib/typescript/specs/NativeFTReactNativeRUM.d.ts +7 -1
- package/lib/typescript/version.d.ts +1 -1
- package/lib/typescript/visitorIdConfig.d.ts +11 -0
- package/package.json +4 -3
- package/src/ft_logger.tsx +11 -1
- package/src/ft_mobile_agent.tsx +34 -1
- package/src/ft_rum.tsx +50 -5
- package/src/ft_tracing.tsx +9 -1
- package/src/index.tsx +4 -0
- package/src/rum/FTRumViewTracking.ts +179 -0
- package/src/rum/FTRumWebSocketNative.ts +2 -1
- package/src/rum/FTRumWebSocketTiming.ts +34 -2
- package/src/rum/FTRumWebSocketTracking.ts +9 -14
- package/src/specs/NativeFTMobileReactNative.ts +1 -0
- package/src/specs/NativeFTReactNativeRUM.ts +15 -1
- package/src/version.ts +1 -1
- 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
|
|
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
|
|
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":[]}
|
package/lib/commonjs/index.js
CHANGED
|
@@ -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":"
|
|
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:
|
|
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
|
-
|
|
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(): ()
|
|
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
|
|
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
|
-
},
|
|
239
|
+
}, timing, error, errorReady);
|
|
240
240
|
return;
|
|
241
241
|
}
|
|
242
|
-
void FTRumWebSocketTracking.completeResource(resourceReporter, lifecycleVersion, resourceKey, started, url, requestHeaders, resourceStatus, state,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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.');
|