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

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 (130) hide show
  1. package/FTMobileReactNativeSDK.podspec +7 -5
  2. package/README.md +34 -0
  3. package/android/build.gradle +9 -2
  4. package/android/src/main/java/com/ft/sdk/reactnative/FTMobileImpl.java +45 -14
  5. package/android/src/main/java/com/ft/sdk/reactnative/FTRUMImpl.java +85 -2
  6. package/android/src/main/java/com/ft/sdk/reactnative/FTTraceImpl.java +5 -1
  7. package/android/src/main/java/com/ft/sdk/reactnative/JsLongTaskMonitor.java +281 -0
  8. package/android/src/main/java/com/ft/sdk/reactnative/utils/ReactNativeUtils.java +5 -12
  9. package/android/src/newarch/java/com/ft/sdk/reactnative/FTMobileModule.java +9 -5
  10. package/android/src/newarch/java/com/ft/sdk/reactnative/FTRUMModule.java +26 -1
  11. package/android/src/newarch/java/com/ft/sdk/reactnative/FTTraceModule.java +14 -0
  12. package/android/src/oldarch/java/com/ft/sdk/reactnative/FTMobileModule.java +2 -2
  13. package/android/src/oldarch/java/com/ft/sdk/reactnative/FTRUMModule.java +29 -1
  14. package/android/src/oldarch/java/com/ft/sdk/reactnative/FTTraceModule.java +12 -0
  15. package/android/src/rnpost70/java/com/ft/sdk/reactnative/ReactJsThreadExecutor.java +21 -0
  16. package/android/src/rnpre70/java/com/ft/sdk/reactnative/ReactJsThreadExecutor.java +37 -0
  17. package/android/src/test/java/com/ft/sdk/reactnative/FTRUMModuleTest.java +117 -0
  18. package/android/src/test/java/com/ft/sdk/reactnative/JsLongTaskMonitorTest.java +446 -0
  19. package/android/src/test/java/com/ft/sdk/reactnative/utils/ReactNativeUtilsTest.java +33 -0
  20. package/ios/FTJSLongTaskMonitor.h +51 -0
  21. package/ios/FTJSLongTaskMonitor.m +250 -0
  22. package/ios/FTMobileReactNative.mm +23 -16
  23. package/ios/FTReactNativeLog.mm +3 -4
  24. package/ios/FTReactNativeRUM.mm +103 -28
  25. package/ios/FTReactNativeResource.h +4 -0
  26. package/ios/FTReactNativeResource.m +58 -0
  27. package/ios/FTReactNativeTrace.mm +56 -13
  28. package/ios/FTReactNativeUtils.m +10 -15
  29. package/ios/FTReactNativeWebSocket.h +10 -0
  30. package/ios/FTReactNativeWebSocket.mm +201 -0
  31. package/ios/FTWebSocketMetadataStore.h +25 -0
  32. package/ios/FTWebSocketMetadataStore.m +622 -0
  33. package/ios/FTWebSocketResourceData.h +16 -0
  34. package/ios/FTWebSocketResourceData.m +75 -0
  35. package/lib/commonjs/ft_mobile_agent.js +36 -3
  36. package/lib/commonjs/ft_mobile_agent.js.map +1 -1
  37. package/lib/commonjs/ft_rum.js +46 -2
  38. package/lib/commonjs/ft_rum.js.map +1 -1
  39. package/lib/commonjs/ft_tracing.js +12 -3
  40. package/lib/commonjs/ft_tracing.js.map +1 -1
  41. package/lib/commonjs/index.js +14 -0
  42. package/lib/commonjs/index.js.map +1 -1
  43. package/lib/commonjs/rum/FTBabelInteractionTracking.js +72 -0
  44. package/lib/commonjs/rum/FTBabelInteractionTracking.js.map +1 -0
  45. package/lib/commonjs/rum/FTBabelUtils.js +87 -0
  46. package/lib/commonjs/rum/FTBabelUtils.js.map +1 -0
  47. package/lib/commonjs/rum/FTRumActionTracking.js +10 -39
  48. package/lib/commonjs/rum/FTRumActionTracking.js.map +1 -1
  49. package/lib/commonjs/rum/FTRumActionTrackingContext.js +50 -0
  50. package/lib/commonjs/rum/FTRumActionTrackingContext.js.map +1 -0
  51. package/lib/commonjs/rum/FTRumWebSocketNative.js +73 -0
  52. package/lib/commonjs/rum/FTRumWebSocketNative.js.map +1 -0
  53. package/lib/commonjs/rum/FTRumWebSocketTiming.js +55 -0
  54. package/lib/commonjs/rum/FTRumWebSocketTiming.js.map +1 -0
  55. package/lib/commonjs/rum/FTRumWebSocketTracking.js +510 -0
  56. package/lib/commonjs/rum/FTRumWebSocketTracking.js.map +1 -0
  57. package/lib/commonjs/rum/longTasksUtils.js +25 -0
  58. package/lib/commonjs/rum/longTasksUtils.js.map +1 -0
  59. package/lib/commonjs/specs/NativeFTMobileReactNative.js.map +1 -1
  60. package/lib/commonjs/specs/NativeFTReactNativeRUM.js.map +1 -1
  61. package/lib/commonjs/specs/NativeFTReactNativeTrace.js.map +1 -1
  62. package/lib/commonjs/specs/NativeFTReactNativeWebSocket.js +11 -0
  63. package/lib/commonjs/specs/NativeFTReactNativeWebSocket.js.map +1 -0
  64. package/lib/commonjs/version.js +1 -1
  65. package/lib/commonjs/version.js.map +1 -1
  66. package/lib/module/ft_mobile_agent.js +36 -3
  67. package/lib/module/ft_mobile_agent.js.map +1 -1
  68. package/lib/module/ft_rum.js +46 -2
  69. package/lib/module/ft_rum.js.map +1 -1
  70. package/lib/module/ft_tracing.js +12 -1
  71. package/lib/module/ft_tracing.js.map +1 -1
  72. package/lib/module/index.js +3 -1
  73. package/lib/module/index.js.map +1 -1
  74. package/lib/module/rum/FTBabelInteractionTracking.js +66 -0
  75. package/lib/module/rum/FTBabelInteractionTracking.js.map +1 -0
  76. package/lib/module/rum/FTBabelUtils.js +80 -0
  77. package/lib/module/rum/FTBabelUtils.js.map +1 -0
  78. package/lib/module/rum/FTRumActionTracking.js +10 -39
  79. package/lib/module/rum/FTRumActionTracking.js.map +1 -1
  80. package/lib/module/rum/FTRumActionTrackingContext.js +43 -0
  81. package/lib/module/rum/FTRumActionTrackingContext.js.map +1 -0
  82. package/lib/module/rum/FTRumWebSocketNative.js +62 -0
  83. package/lib/module/rum/FTRumWebSocketNative.js.map +1 -0
  84. package/lib/module/rum/FTRumWebSocketTiming.js +49 -0
  85. package/lib/module/rum/FTRumWebSocketTiming.js.map +1 -0
  86. package/lib/module/rum/FTRumWebSocketTracking.js +503 -0
  87. package/lib/module/rum/FTRumWebSocketTracking.js.map +1 -0
  88. package/lib/module/rum/longTasksUtils.js +18 -0
  89. package/lib/module/rum/longTasksUtils.js.map +1 -0
  90. package/lib/module/specs/NativeFTMobileReactNative.js.map +1 -1
  91. package/lib/module/specs/NativeFTReactNativeRUM.js.map +1 -1
  92. package/lib/module/specs/NativeFTReactNativeTrace.js.map +1 -1
  93. package/lib/module/specs/NativeFTReactNativeWebSocket.js +8 -0
  94. package/lib/module/specs/NativeFTReactNativeWebSocket.js.map +1 -0
  95. package/lib/module/version.js +1 -1
  96. package/lib/module/version.js.map +1 -1
  97. package/lib/typescript/ft_mobile_agent.d.ts +7 -0
  98. package/lib/typescript/ft_rum.d.ts +9 -0
  99. package/lib/typescript/index.d.ts +3 -1
  100. package/lib/typescript/rum/FTBabelInteractionTracking.d.ts +30 -0
  101. package/lib/typescript/rum/FTBabelUtils.d.ts +1 -0
  102. package/lib/typescript/rum/FTRumActionTracking.d.ts +0 -2
  103. package/lib/typescript/rum/FTRumActionTrackingContext.d.ts +11 -0
  104. package/lib/typescript/rum/FTRumWebSocketNative.d.ts +23 -0
  105. package/lib/typescript/rum/FTRumWebSocketTiming.d.ts +2 -0
  106. package/lib/typescript/rum/FTRumWebSocketTracking.d.ts +56 -0
  107. package/lib/typescript/rum/longTasksUtils.d.ts +8 -0
  108. package/lib/typescript/specs/NativeFTMobileReactNative.d.ts +14 -0
  109. package/lib/typescript/specs/NativeFTReactNativeRUM.d.ts +4 -0
  110. package/lib/typescript/specs/NativeFTReactNativeTrace.d.ts +12 -0
  111. package/lib/typescript/specs/NativeFTReactNativeWebSocket.d.ts +13 -0
  112. package/lib/typescript/version.d.ts +1 -1
  113. package/package.json +7 -6
  114. package/src/ft_mobile_agent.tsx +49 -6
  115. package/src/ft_rum.tsx +61 -2
  116. package/src/ft_tracing.tsx +15 -1
  117. package/src/index.tsx +4 -0
  118. package/src/rum/FTBabelInteractionTracking.ts +124 -0
  119. package/src/rum/FTBabelUtils.tsx +99 -0
  120. package/src/rum/FTRumActionTracking.tsx +14 -43
  121. package/src/rum/FTRumActionTrackingContext.ts +68 -0
  122. package/src/rum/FTRumWebSocketNative.ts +106 -0
  123. package/src/rum/FTRumWebSocketTiming.ts +50 -0
  124. package/src/rum/FTRumWebSocketTracking.ts +727 -0
  125. package/src/rum/longTasksUtils.ts +17 -0
  126. package/src/specs/NativeFTMobileReactNative.ts +17 -0
  127. package/src/specs/NativeFTReactNativeRUM.ts +4 -0
  128. package/src/specs/NativeFTReactNativeTrace.ts +12 -0
  129. package/src/specs/NativeFTReactNativeWebSocket.ts +33 -0
  130. package/src/version.ts +1 -1
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.FTBabelInteractionTracking = void 0;
7
+ var _FTRumActionTrackingContext = require("./FTRumActionTrackingContext");
8
+ 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; }
9
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
10
+ 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); }
11
+ const DEFAULT_ACTION_TYPE = 'click';
12
+ const normalize = value => value.replace(/\s+/g, ' ').trim();
13
+ const normalizeActionType = value => typeof value === 'string' && value.trim() ? value.trim() : DEFAULT_ACTION_TYPE;
14
+ const nonEmpty = values => {
15
+ if (!values) {
16
+ return null;
17
+ }
18
+ const normalized = values.map(normalize).filter(Boolean);
19
+ return normalized.length > 0 ? normalized : null;
20
+ };
21
+ class BabelInteractionTracking {
22
+ constructor() {
23
+ _defineProperty(this, "trackInteractions", false);
24
+ _defineProperty(this, "actionReporter", void 0);
25
+ }
26
+ getInstance() {
27
+ return this;
28
+ }
29
+ configure(config) {
30
+ this.trackInteractions = config.trackInteractions;
31
+ this.actionReporter = config.actionReporter;
32
+ }
33
+ getTargetName(target) {
34
+ let selectedContent = nonEmpty(target['ft-action-name']);
35
+ selectedContent || (selectedContent = nonEmpty(target.customActionName));
36
+ selectedContent || (selectedContent = nonEmpty(target.accessibilityLabel));
37
+ if (!selectedContent && target.options.useContent) {
38
+ var _target$getContent;
39
+ selectedContent = nonEmpty((_target$getContent = target.getContent) === null || _target$getContent === void 0 ? void 0 : _target$getContent.call(target));
40
+ }
41
+ if (!selectedContent) {
42
+ return target.componentName;
43
+ }
44
+ const handlerArgs = target.handlerArgs || [];
45
+ const numericArgument = handlerArgs.find(value => typeof value === 'number');
46
+ const index = numericArgument !== undefined && Number.isInteger(numericArgument) && numericArgument >= 0 && numericArgument < selectedContent.length ? numericArgument : 0;
47
+ const output = selectedContent[index] || selectedContent[0];
48
+ return target.options.useNamePrefix ? `${target.componentName} ("${output}")` : output;
49
+ }
50
+ wrapRumAction(handler, actionType, target) {
51
+ const normalizedActionType = normalizeActionType(actionType);
52
+ return (...args) => {
53
+ try {
54
+ if (this.trackInteractions && this.actionReporter) {
55
+ const context = (0, _FTRumActionTrackingContext.resolveActionTrackingContext)(args);
56
+ if (context.enabled) {
57
+ const actionName = this.getTargetName({
58
+ ...target,
59
+ handlerArgs: args
60
+ });
61
+ Promise.resolve(this.actionReporter(actionName, normalizedActionType, context.property)).catch(() => undefined);
62
+ }
63
+ }
64
+ } catch (_error) {
65
+ // Tracking must never block the application's original handler.
66
+ }
67
+ return handler === null || handler === void 0 ? void 0 : handler(...args);
68
+ };
69
+ }
70
+ }
71
+ const FTBabelInteractionTracking = exports.FTBabelInteractionTracking = new BabelInteractionTracking();
72
+ //# sourceMappingURL=FTBabelInteractionTracking.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_FTRumActionTrackingContext","require","_defineProperty","e","r","t","_toPropertyKey","Object","defineProperty","value","enumerable","configurable","writable","i","_toPrimitive","Symbol","toPrimitive","call","TypeError","String","Number","DEFAULT_ACTION_TYPE","normalize","replace","trim","normalizeActionType","nonEmpty","values","normalized","map","filter","Boolean","length","BabelInteractionTracking","constructor","getInstance","configure","config","trackInteractions","actionReporter","getTargetName","target","selectedContent","customActionName","accessibilityLabel","options","useContent","_target$getContent","getContent","componentName","handlerArgs","numericArgument","find","index","undefined","isInteger","output","useNamePrefix","wrapRumAction","handler","actionType","normalizedActionType","args","context","resolveActionTrackingContext","enabled","actionName","Promise","resolve","property","catch","_error","FTBabelInteractionTracking","exports"],"sources":["FTBabelInteractionTracking.ts"],"sourcesContent":["import { resolveActionTrackingContext } from './FTRumActionTrackingContext';\n\ndeclare global {\n // eslint-disable-next-line no-var\n var __FT_RN_BABEL_PLUGIN_ENABLED__: boolean | undefined;\n}\n\nexport type FTBabelActionTarget = {\n 'options': {\n useContent: boolean;\n useNamePrefix: boolean;\n };\n 'handlerArgs'?: unknown[];\n 'componentName': string;\n 'getContent'?: () => string[];\n 'ft-action-name'?: string[];\n 'customActionName'?: string[];\n 'accessibilityLabel'?: string[];\n};\n\ntype ActionReporter = (\n actionName: string,\n actionType: string,\n property?: object\n) => Promise<void>;\n\ntype BabelTrackingConfig = {\n trackInteractions: boolean;\n actionReporter?: ActionReporter;\n};\n\nconst DEFAULT_ACTION_TYPE = 'click';\n\nconst normalize = (value: string): string => value.replace(/\\s+/g, ' ').trim();\n\nconst normalizeActionType = (value: unknown): string =>\n typeof value === 'string' && value.trim()\n ? value.trim()\n : DEFAULT_ACTION_TYPE;\n\nconst nonEmpty = (values: string[] | undefined): string[] | null => {\n if (!values) {\n return null;\n }\n const normalized = values.map(normalize).filter(Boolean);\n return normalized.length > 0 ? normalized : null;\n};\n\nclass BabelInteractionTracking {\n private trackInteractions = false;\n private actionReporter: ActionReporter | undefined;\n\n getInstance(): BabelInteractionTracking {\n return this;\n }\n\n configure(config: BabelTrackingConfig): void {\n this.trackInteractions = config.trackInteractions;\n this.actionReporter = config.actionReporter;\n }\n\n getTargetName(target: FTBabelActionTarget): string {\n let selectedContent = nonEmpty(target['ft-action-name']);\n selectedContent ||= nonEmpty(target.customActionName);\n selectedContent ||= nonEmpty(target.accessibilityLabel);\n if (!selectedContent && target.options.useContent) {\n selectedContent = nonEmpty(target.getContent?.());\n }\n\n if (!selectedContent) {\n return target.componentName;\n }\n\n const handlerArgs = target.handlerArgs || [];\n const numericArgument = handlerArgs.find(\n (value) => typeof value === 'number'\n ) as number | undefined;\n const index =\n numericArgument !== undefined &&\n Number.isInteger(numericArgument) &&\n numericArgument >= 0 &&\n numericArgument < selectedContent.length\n ? numericArgument\n : 0;\n const output = selectedContent[index] || selectedContent[0];\n\n return target.options.useNamePrefix\n ? `${target.componentName} (\"${output}\")`\n : output;\n }\n\n wrapRumAction(\n handler: ((...args: any[]) => any) | null | undefined,\n actionType: string,\n target: FTBabelActionTarget\n ): (...args: any[]) => any {\n const normalizedActionType = normalizeActionType(actionType);\n return (...args: any[]) => {\n try {\n if (this.trackInteractions && this.actionReporter) {\n const context = resolveActionTrackingContext(args);\n if (context.enabled) {\n const actionName = this.getTargetName({\n ...target,\n handlerArgs: args,\n });\n Promise.resolve(\n this.actionReporter(\n actionName,\n normalizedActionType,\n context.property\n )\n ).catch(() => undefined);\n }\n }\n } catch (_error) {\n // Tracking must never block the application's original handler.\n }\n return handler?.(...args);\n };\n }\n}\n\nexport const FTBabelInteractionTracking = new BabelInteractionTracking();\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.__ftExtractText = __ftExtractText;
7
+ var _react = _interopRequireDefault(require("react"));
8
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
9
+ const LABEL_PROPS = ['label', 'title', 'text'];
10
+ const normalize = value => value.replace(/\s+/g, ' ').trim();
11
+ function flattenText(values) {
12
+ const output = [];
13
+ for (const value of values) {
14
+ for (const text of __ftExtractText(value)) {
15
+ output.push(text);
16
+ }
17
+ }
18
+ return output;
19
+ }
20
+ function __ftExtractText(node, prefer) {
21
+ if (Array.isArray(prefer)) {
22
+ const preferred = flattenText(prefer);
23
+ if (preferred.length > 0) {
24
+ return preferred;
25
+ }
26
+ }
27
+ if (node == null || typeof node === 'boolean') {
28
+ return [];
29
+ }
30
+ if (typeof node === 'string' || typeof node === 'number') {
31
+ const value = normalize(String(node));
32
+ return value ? [value] : [];
33
+ }
34
+ if (Array.isArray(node)) {
35
+ return flattenText(node);
36
+ }
37
+ if (typeof node === 'object' && typeof Symbol !== 'undefined' && Symbol.iterator in node) {
38
+ return flattenText(Array.from(node));
39
+ }
40
+ if (typeof node === 'function' && node.length === 0) {
41
+ try {
42
+ return __ftExtractText(node());
43
+ } catch (_error) {
44
+ return [];
45
+ }
46
+ }
47
+ if (! /*#__PURE__*/_react.default.isValidElement(node)) {
48
+ return [];
49
+ }
50
+ const props = node.props || {};
51
+ for (const propertyName of LABEL_PROPS) {
52
+ if (props[propertyName] != null) {
53
+ const label = __ftExtractText(props[propertyName]);
54
+ if (label.length > 0) {
55
+ return label;
56
+ }
57
+ }
58
+ }
59
+ const rawChildren = Array.isArray(props.children) ? props.children : [props.children];
60
+ const children = rawChildren.filter(child => child != null && child !== false);
61
+ if (children.length === 0) {
62
+ return [];
63
+ }
64
+ const perChild = children.map(child => __ftExtractText(child));
65
+ let labeledChildCount = 0;
66
+ children.forEach((child, index) => {
67
+ const childProps = /*#__PURE__*/_react.default.isValidElement(child) ? child.props || {} : null;
68
+ const hasLabelProperty = childProps !== null && LABEL_PROPS.some(propertyName => childProps[propertyName] != null);
69
+ if (hasLabelProperty || perChild[index].length > 0) {
70
+ labeledChildCount += 1;
71
+ }
72
+ });
73
+
74
+ // Each child has already been extracted and normalized. Only merge its text.
75
+ const flattened = [];
76
+ for (const values of perChild) {
77
+ for (const value of values) {
78
+ flattened.push(value);
79
+ }
80
+ }
81
+ if (labeledChildCount > 1) {
82
+ return Array.from(new Set(flattened));
83
+ }
84
+ const joined = flattened.join(' ');
85
+ return joined ? [joined] : [];
86
+ }
87
+ //# sourceMappingURL=FTBabelUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_react","_interopRequireDefault","require","e","__esModule","default","LABEL_PROPS","normalize","value","replace","trim","flattenText","values","output","text","__ftExtractText","push","node","prefer","Array","isArray","preferred","length","String","Symbol","iterator","from","_error","React","isValidElement","props","propertyName","label","rawChildren","children","filter","child","perChild","map","labeledChildCount","forEach","index","childProps","hasLabelProperty","some","flattened","Set","joined","join"],"sources":["FTBabelUtils.tsx"],"sourcesContent":["import React from 'react';\n\nconst LABEL_PROPS = ['label', 'title', 'text'] as const;\n\nconst normalize = (value: string): string => value.replace(/\\s+/g, ' ').trim();\n\nfunction flattenText(values: unknown[]): string[] {\n const output: string[] = [];\n for (const value of values) {\n for (const text of __ftExtractText(value)) {\n output.push(text);\n }\n }\n return output;\n}\n\nexport function __ftExtractText(node: any, prefer?: any[]): string[] {\n if (Array.isArray(prefer)) {\n const preferred = flattenText(prefer);\n if (preferred.length > 0) {\n return preferred;\n }\n }\n\n if (node == null || typeof node === 'boolean') {\n return [];\n }\n if (typeof node === 'string' || typeof node === 'number') {\n const value = normalize(String(node));\n return value ? [value] : [];\n }\n if (Array.isArray(node)) {\n return flattenText(node);\n }\n if (\n typeof node === 'object' &&\n typeof Symbol !== 'undefined' &&\n Symbol.iterator in node\n ) {\n return flattenText(Array.from(node as Iterable<unknown>));\n }\n if (typeof node === 'function' && node.length === 0) {\n try {\n return __ftExtractText(node());\n } catch (_error) {\n return [];\n }\n }\n if (!React.isValidElement(node)) {\n return [];\n }\n\n const props = (node.props || {}) as Record<string, unknown>;\n for (const propertyName of LABEL_PROPS) {\n if (props[propertyName] != null) {\n const label = __ftExtractText(props[propertyName]);\n if (label.length > 0) {\n return label;\n }\n }\n }\n\n const rawChildren = Array.isArray(props.children)\n ? props.children\n : [props.children];\n const children = rawChildren.filter(\n (child) => child != null && child !== false\n );\n if (children.length === 0) {\n return [];\n }\n\n const perChild = children.map((child) => __ftExtractText(child));\n let labeledChildCount = 0;\n children.forEach((child, index) => {\n const childProps = React.isValidElement(child)\n ? ((child.props || {}) as Record<string, unknown>)\n : null;\n const hasLabelProperty =\n childProps !== null &&\n LABEL_PROPS.some((propertyName) => childProps[propertyName] != null);\n if (hasLabelProperty || perChild[index].length > 0) {\n labeledChildCount += 1;\n }\n });\n\n // Each child has already been extracted and normalized. Only merge its text.\n const flattened: string[] = [];\n for (const values of perChild) {\n for (const value of values) {\n flattened.push(value);\n }\n }\n if (labeledChildCount > 1) {\n return Array.from(new Set(flattened));\n }\n const joined = flattened.join(' ');\n return joined ? [joined] : [];\n}\n"],"mappings":"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","ignoreList":[]}
@@ -6,19 +6,19 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.FTRumActionTracking = void 0;
7
7
  var _react = _interopRequireDefault(require("react"));
8
8
  var _ft_rum = require("../ft_rum");
9
+ var _FTRumActionTrackingContext = require("./FTRumActionTrackingContext");
9
10
  var _FTRumActionTracking;
10
11
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
11
12
  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; }
12
13
  function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
13
14
  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); }
14
- const FT_ENABLE_TRACK = 'ft-enable-track';
15
- const FT_EXTRA_PROPERTY = 'ft-extra-property';
16
15
  class FTRumActionTracking {
17
16
  static startTracking() {
18
17
  if (FTRumActionTracking.isTracking) {
19
18
  return;
20
19
  }
21
20
  const original = _react.default.createElement;
21
+ this.originalCreateElement = original;
22
22
  _react.default.createElement = (...args) => {
23
23
  return this.patchCreateElementFunction(original, args);
24
24
  };
@@ -33,6 +33,7 @@ class FTRumActionTracking {
33
33
  // Ignore missing jsx runtime support on older React versions.
34
34
  }
35
35
  const originalMemo = _react.default.memo;
36
+ this.originalMemo = originalMemo;
36
37
  _react.default.memo = (component, propsAreEqual) => {
37
38
  return originalMemo(component, (prev, next) => {
38
39
  if (!next.onPress || !prev.onPress) {
@@ -64,6 +65,9 @@ class FTRumActionTracking {
64
65
  FTRumActionTracking.isTracking = true;
65
66
  }
66
67
  static stopTracking() {
68
+ if (!FTRumActionTracking.isTracking) {
69
+ return;
70
+ }
67
71
  _react.default.createElement = this.originalCreateElement;
68
72
  _react.default.memo = this.originalMemo;
69
73
  FTRumActionTracking.isTracking = false;
@@ -86,21 +90,12 @@ class FTRumActionTracking {
86
90
  }
87
91
  static handleTargetEvent(targetNode) {
88
92
  if (targetNode) {
89
- const enable = FTRumActionTracking.findActionEnableTrack(targetNode);
90
- if (enable) {
91
- const extraProperty = FTRumActionTracking.findActionProperty(targetNode);
93
+ const context = (0, _FTRumActionTrackingContext.resolveActionTrackingContextFromTarget)(targetNode);
94
+ if (context.enabled) {
92
95
  const elementTypeName = FTRumActionTracking.resolveActionName(targetNode);
93
96
  if (elementTypeName) {
94
- let jsonObject = null;
95
- if (extraProperty) {
96
- try {
97
- jsonObject = JSON.parse(extraProperty);
98
- } catch (error) {
99
- console.warn(`Error parsing JSON string ${extraProperty}:`, error);
100
- }
101
- }
102
- if (jsonObject) {
103
- _ft_rum.FTReactNativeRUM.startAction(elementTypeName, 'click', jsonObject);
97
+ if (context.property) {
98
+ _ft_rum.FTReactNativeRUM.startAction(elementTypeName, 'click', context.property);
104
99
  } else {
105
100
  _ft_rum.FTReactNativeRUM.startAction(elementTypeName, 'click');
106
101
  }
@@ -143,30 +138,6 @@ class FTRumActionTracking {
143
138
  }
144
139
  return null;
145
140
  }
146
- static findActionProperty(targetNode) {
147
- let currentNode = targetNode;
148
- while (currentNode) {
149
- const props = currentNode.memoizedProps;
150
- if (props && props[FT_EXTRA_PROPERTY]) {
151
- return props[FT_EXTRA_PROPERTY];
152
- }
153
- currentNode = currentNode.return;
154
- }
155
- return null;
156
- }
157
- static findActionEnableTrack(targetNode) {
158
- let currentNode = targetNode;
159
- let enable = true;
160
- while (currentNode) {
161
- const props = currentNode.memoizedProps;
162
- if (props && props[FT_ENABLE_TRACK]) {
163
- enable = props[FT_ENABLE_TRACK] === 'true';
164
- break;
165
- }
166
- currentNode = currentNode.return;
167
- }
168
- return enable;
169
- }
170
141
  }
171
142
  exports.FTRumActionTracking = FTRumActionTracking;
172
143
  _FTRumActionTracking = FTRumActionTracking;
@@ -1 +1 @@
1
- {"version":3,"names":["_react","_interopRequireDefault","require","_ft_rum","_FTRumActionTracking","e","__esModule","default","_defineProperty","r","t","_toPropertyKey","Object","defineProperty","value","enumerable","configurable","writable","i","_toPrimitive","Symbol","toPrimitive","call","TypeError","String","Number","FT_ENABLE_TRACK","FT_EXTRA_PROPERTY","FTRumActionTracking","startTracking","isTracking","original","React","createElement","args","patchCreateElementFunction","jsxRuntime","getJsxRuntime","originaljsx","jsx","originalJsx","originalMemo","memo","component","propsAreEqual","prev","next","onPress","areObjectShallowEqual","_prevOnPress","partialPrevProps","prevProps","__FT_INTERNAL_ORIGINAL_ON_PRESS__","_nextOnPress","partialNextProps","nextProps","stopTracking","originalCreateElement","interceptOnPress","length","_targetInst","currentTime","Date","now","timestampDifference","Math","abs","preActionTimestamp","targetNode","handleTargetEvent","enable","findActionEnableTrack","extraProperty","findActionProperty","elementTypeName","resolveActionName","jsonObject","JSON","parse","error","console","warn","FTReactNativeRUM","startAction","_targetNode$memoizedP","_targetNode$memoizedP2","_targetNode$memoizedP3","accessibilityLabel","memoizedProps","accessibilityRole","subTitle","children","Array","isArray","props","elementType","name","currentNode","return","exports","MIN_VALUE","originalFunction","element","rest","originalOnPress","objectA","objectB","keys","key","major","minor","version","split","Error"],"sources":["FTRumActionTracking.tsx"],"sourcesContent":["import React from 'react';\nimport { FTReactNativeRUM } from '../ft_rum';\nconst FT_ENABLE_TRACK = 'ft-enable-track';\nconst FT_EXTRA_PROPERTY = 'ft-extra-property';\nexport class FTRumActionTracking {\n private static isTracking = false;\n private static preActionTimestamp = Number.MIN_VALUE;\n private static originalMemo = React.memo;\n private static originalJsx = null;\n private static originalCreateElement = React.createElement;\n\n private static patchCreateElementFunction = (\n originalFunction: typeof React.createElement,\n [element, props, ...rest]: Parameters<typeof React.createElement>\n ): ReturnType<typeof React.createElement> => {\n if (\n props &&\n typeof (props as Record<string, unknown>).onPress === 'function'\n ) {\n const originalOnPress = (props as Record<string, unknown>) // eslint-disable-next-line @typescript-eslint/ban-types\n .onPress as Function;\n (props as Record<string, unknown>).onPress = (...args: any[]) => {\n FTRumActionTracking.interceptOnPress(...args);\n return originalOnPress(...args);\n };\n\n (props as Record<string, unknown>).__FT_INTERNAL_ORIGINAL_ON_PRESS__ =\n originalOnPress;\n }\n return originalFunction(element, props, ...rest);\n };\n static startTracking(): void {\n if (FTRumActionTracking.isTracking) {\n return;\n }\n const original = React.createElement;\n React.createElement = (\n ...args: Parameters<typeof React.createElement>\n ): any => {\n return this.patchCreateElementFunction(original, args);\n };\n try {\n const jsxRuntime = getJsxRuntime();\n const originaljsx = jsxRuntime.jsx;\n this.originalJsx = originaljsx;\n jsxRuntime.jsx = (\n ...args: Parameters<typeof React.createElement>\n ): ReturnType<typeof React.createElement> => {\n return this.patchCreateElementFunction(originaljsx, args);\n };\n } catch (e) {\n // Ignore missing jsx runtime support on older React versions.\n }\n\n const originalMemo = React.memo;\n React.memo = (\n component: any,\n propsAreEqual?: (prevProps: any, newProps: any) => boolean\n ) => {\n return originalMemo(component, (prev, next) => {\n if (!next.onPress || !prev.onPress) {\n return propsAreEqual\n ? propsAreEqual(prev, next)\n : areObjectShallowEqual(prev, next);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { onPress: _prevOnPress, ...partialPrevProps } = prev;\n const prevProps = {\n ...partialPrevProps,\n onPress: prev.__FT_INTERNAL_ORIGINAL_ON_PRESS__,\n };\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { onPress: _nextOnPress, ...partialNextProps } = next;\n const nextProps = {\n ...partialNextProps,\n onPress: next.__FT_INTERNAL_ORIGINAL_ON_PRESS__,\n };\n\n return propsAreEqual\n ? propsAreEqual(prevProps, nextProps)\n : areObjectShallowEqual(nextProps, prevProps);\n });\n };\n FTRumActionTracking.isTracking = true;\n }\n static stopTracking() {\n React.createElement = this.originalCreateElement;\n React.memo = this.originalMemo;\n FTRumActionTracking.isTracking = false;\n if (this.originalJsx) {\n const jsxRuntime = getJsxRuntime();\n jsxRuntime.jsx = this.originalJsx;\n this.originalJsx = null;\n }\n }\n\n private static interceptOnPress(...args: any[]): void {\n if (args.length > 0 && args[0] && args[0]._targetInst) {\n const currentTime = Date.now();\n const timestampDifference = Math.abs(\n Date.now() - FTRumActionTracking.preActionTimestamp\n );\n if (timestampDifference > 10) {\n const targetNode = args[0]._targetInst;\n this.handleTargetEvent(targetNode);\n FTRumActionTracking.preActionTimestamp = currentTime;\n }\n }\n }\n\n private static handleTargetEvent(targetNode: any | null) {\n if (targetNode) {\n const enable = FTRumActionTracking.findActionEnableTrack(targetNode);\n if (enable) {\n const extraProperty =\n FTRumActionTracking.findActionProperty(targetNode);\n const elementTypeName =\n FTRumActionTracking.resolveActionName(targetNode);\n if (elementTypeName) {\n let jsonObject = null;\n if (extraProperty) {\n try {\n jsonObject = JSON.parse(extraProperty);\n } catch (error) {\n console.warn(\n `Error parsing JSON string ${extraProperty}:`,\n error\n );\n }\n }\n if (jsonObject) {\n FTReactNativeRUM.startAction(elementTypeName, 'click', jsonObject);\n } else {\n FTReactNativeRUM.startAction(elementTypeName, 'click');\n }\n }\n }\n }\n }\n\n private static resolveActionName(targetNode: any): string | null {\n const accessibilityLabel = targetNode.memoizedProps?.accessibilityLabel;\n if (accessibilityLabel != null) {\n return accessibilityLabel;\n }\n const accessibilityRole = targetNode.memoizedProps?.accessibilityRole;\n let subTitle = '';\n let children = targetNode.memoizedProps?.children;\n while (children) {\n if (Array.isArray(children) && children.length > 0 && children[0]) {\n children = children[0];\n } else if (\n typeof children === 'object' &&\n children.props &&\n children.props.children\n ) {\n children = children.props.children;\n } else if (typeof children === 'string') {\n subTitle = children;\n children = null;\n } else {\n children = null;\n }\n }\n let elementTypeName = accessibilityRole;\n if (!accessibilityRole) {\n let elementType = targetNode.elementType;\n if (typeof elementType === 'string') {\n elementTypeName = elementType;\n } else if (elementType && typeof elementType.name === 'string') {\n elementTypeName = elementType.name;\n }\n }\n if (elementTypeName) {\n return '[' + elementTypeName + ']' + subTitle;\n }\n return null;\n }\n private static findActionProperty(targetNode: any): string | null {\n let currentNode = targetNode;\n while (currentNode) {\n const props = currentNode.memoizedProps;\n if (props && props[FT_EXTRA_PROPERTY]) {\n return props[FT_EXTRA_PROPERTY];\n }\n currentNode = currentNode.return;\n }\n return null;\n }\n private static findActionEnableTrack(targetNode: any): boolean {\n let currentNode = targetNode;\n let enable = true;\n while (currentNode) {\n const props = currentNode.memoizedProps;\n if (props && props[FT_ENABLE_TRACK]) {\n enable = props[FT_ENABLE_TRACK] === 'true';\n break;\n }\n currentNode = currentNode.return;\n }\n return enable;\n }\n}\n\nconst areObjectShallowEqual = (\n objectA: Record<string, unknown> | undefined | null,\n objectB: Record<string, unknown> | undefined | null\n): boolean => {\n if (!objectA || !objectB) {\n return objectA === objectB;\n }\n\n const keys = Object.keys(objectA);\n if (keys.length !== Object.keys(objectB).length) {\n return false;\n }\n for (const key of keys) {\n if (objectA[key] !== objectB[key]) {\n return false;\n }\n }\n return true;\n};\nconst getJsxRuntime = () => {\n // eslint-disable-next-line global-require, @typescript-eslint/no-var-requires\n const [major, minor] = require('react/package.json').version.split('.');\n // JSX Transform applies to > 16.14.0\n if (Number(major) <= 16 && Number(minor) < 14) {\n throw new Error('React version does not support new jsx transform');\n }\n\n // eslint-disable-next-line global-require, @typescript-eslint/no-var-requires\n const jsxRuntime = require('react/jsx-runtime');\n if (!jsxRuntime.jsx) {\n throw new Error('React jsx runtime does not export new jsx transform');\n }\n return jsxRuntime;\n};\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_react","_interopRequireDefault","require","_ft_rum","_FTRumActionTrackingContext","_FTRumActionTracking","e","__esModule","default","_defineProperty","r","t","_toPropertyKey","Object","defineProperty","value","enumerable","configurable","writable","i","_toPrimitive","Symbol","toPrimitive","call","TypeError","String","Number","FTRumActionTracking","startTracking","isTracking","original","React","createElement","originalCreateElement","args","patchCreateElementFunction","jsxRuntime","getJsxRuntime","originaljsx","jsx","originalJsx","originalMemo","memo","component","propsAreEqual","prev","next","onPress","areObjectShallowEqual","_prevOnPress","partialPrevProps","prevProps","__FT_INTERNAL_ORIGINAL_ON_PRESS__","_nextOnPress","partialNextProps","nextProps","stopTracking","interceptOnPress","length","_targetInst","currentTime","Date","now","timestampDifference","Math","abs","preActionTimestamp","targetNode","handleTargetEvent","context","resolveActionTrackingContextFromTarget","enabled","elementTypeName","resolveActionName","property","FTReactNativeRUM","startAction","_targetNode$memoizedP","_targetNode$memoizedP2","_targetNode$memoizedP3","accessibilityLabel","memoizedProps","accessibilityRole","subTitle","children","Array","isArray","props","elementType","name","exports","MIN_VALUE","originalFunction","element","rest","originalOnPress","objectA","objectB","keys","key","major","minor","version","split","Error"],"sources":["FTRumActionTracking.tsx"],"sourcesContent":["import React from 'react';\nimport { FTReactNativeRUM } from '../ft_rum';\nimport { resolveActionTrackingContextFromTarget } from './FTRumActionTrackingContext';\nexport class FTRumActionTracking {\n private static isTracking = false;\n private static preActionTimestamp = Number.MIN_VALUE;\n private static originalMemo = React.memo;\n private static originalJsx = null;\n private static originalCreateElement = React.createElement;\n\n private static patchCreateElementFunction = (\n originalFunction: typeof React.createElement,\n [element, props, ...rest]: Parameters<typeof React.createElement>\n ): ReturnType<typeof React.createElement> => {\n if (\n props &&\n typeof (props as Record<string, unknown>).onPress === 'function'\n ) {\n const originalOnPress = (props as Record<string, unknown>) // eslint-disable-next-line @typescript-eslint/ban-types\n .onPress as Function;\n (props as Record<string, unknown>).onPress = (...args: any[]) => {\n FTRumActionTracking.interceptOnPress(...args);\n return originalOnPress(...args);\n };\n\n (props as Record<string, unknown>).__FT_INTERNAL_ORIGINAL_ON_PRESS__ =\n originalOnPress;\n }\n return originalFunction(element, props, ...rest);\n };\n static startTracking(): void {\n if (FTRumActionTracking.isTracking) {\n return;\n }\n const original = React.createElement;\n this.originalCreateElement = original;\n React.createElement = (\n ...args: Parameters<typeof React.createElement>\n ): any => {\n return this.patchCreateElementFunction(original, args);\n };\n try {\n const jsxRuntime = getJsxRuntime();\n const originaljsx = jsxRuntime.jsx;\n this.originalJsx = originaljsx;\n jsxRuntime.jsx = (\n ...args: Parameters<typeof React.createElement>\n ): ReturnType<typeof React.createElement> => {\n return this.patchCreateElementFunction(originaljsx, args);\n };\n } catch (e) {\n // Ignore missing jsx runtime support on older React versions.\n }\n\n const originalMemo = React.memo;\n this.originalMemo = originalMemo;\n React.memo = (\n component: any,\n propsAreEqual?: (prevProps: any, newProps: any) => boolean\n ) => {\n return originalMemo(component, (prev, next) => {\n if (!next.onPress || !prev.onPress) {\n return propsAreEqual\n ? propsAreEqual(prev, next)\n : areObjectShallowEqual(prev, next);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { onPress: _prevOnPress, ...partialPrevProps } = prev;\n const prevProps = {\n ...partialPrevProps,\n onPress: prev.__FT_INTERNAL_ORIGINAL_ON_PRESS__,\n };\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { onPress: _nextOnPress, ...partialNextProps } = next;\n const nextProps = {\n ...partialNextProps,\n onPress: next.__FT_INTERNAL_ORIGINAL_ON_PRESS__,\n };\n\n return propsAreEqual\n ? propsAreEqual(prevProps, nextProps)\n : areObjectShallowEqual(nextProps, prevProps);\n });\n };\n FTRumActionTracking.isTracking = true;\n }\n static stopTracking() {\n if (!FTRumActionTracking.isTracking) {\n return;\n }\n React.createElement = this.originalCreateElement;\n React.memo = this.originalMemo;\n FTRumActionTracking.isTracking = false;\n if (this.originalJsx) {\n const jsxRuntime = getJsxRuntime();\n jsxRuntime.jsx = this.originalJsx;\n this.originalJsx = null;\n }\n }\n\n private static interceptOnPress(...args: any[]): void {\n if (args.length > 0 && args[0] && args[0]._targetInst) {\n const currentTime = Date.now();\n const timestampDifference = Math.abs(\n Date.now() - FTRumActionTracking.preActionTimestamp\n );\n if (timestampDifference > 10) {\n const targetNode = args[0]._targetInst;\n this.handleTargetEvent(targetNode);\n FTRumActionTracking.preActionTimestamp = currentTime;\n }\n }\n }\n\n private static handleTargetEvent(targetNode: any | null) {\n if (targetNode) {\n const context = resolveActionTrackingContextFromTarget(targetNode);\n if (context.enabled) {\n const elementTypeName =\n FTRumActionTracking.resolveActionName(targetNode);\n if (elementTypeName) {\n if (context.property) {\n FTReactNativeRUM.startAction(\n elementTypeName,\n 'click',\n context.property\n );\n } else {\n FTReactNativeRUM.startAction(elementTypeName, 'click');\n }\n }\n }\n }\n }\n\n private static resolveActionName(targetNode: any): string | null {\n const accessibilityLabel = targetNode.memoizedProps?.accessibilityLabel;\n if (accessibilityLabel != null) {\n return accessibilityLabel;\n }\n const accessibilityRole = targetNode.memoizedProps?.accessibilityRole;\n let subTitle = '';\n let children = targetNode.memoizedProps?.children;\n while (children) {\n if (Array.isArray(children) && children.length > 0 && children[0]) {\n children = children[0];\n } else if (\n typeof children === 'object' &&\n children.props &&\n children.props.children\n ) {\n children = children.props.children;\n } else if (typeof children === 'string') {\n subTitle = children;\n children = null;\n } else {\n children = null;\n }\n }\n let elementTypeName = accessibilityRole;\n if (!accessibilityRole) {\n let elementType = targetNode.elementType;\n if (typeof elementType === 'string') {\n elementTypeName = elementType;\n } else if (elementType && typeof elementType.name === 'string') {\n elementTypeName = elementType.name;\n }\n }\n if (elementTypeName) {\n return '[' + elementTypeName + ']' + subTitle;\n }\n return null;\n }\n}\n\nconst areObjectShallowEqual = (\n objectA: Record<string, unknown> | undefined | null,\n objectB: Record<string, unknown> | undefined | null\n): boolean => {\n if (!objectA || !objectB) {\n return objectA === objectB;\n }\n\n const keys = Object.keys(objectA);\n if (keys.length !== Object.keys(objectB).length) {\n return false;\n }\n for (const key of keys) {\n if (objectA[key] !== objectB[key]) {\n return false;\n }\n }\n return true;\n};\nconst getJsxRuntime = () => {\n // eslint-disable-next-line global-require, @typescript-eslint/no-var-requires\n const [major, minor] = require('react/package.json').version.split('.');\n // JSX Transform applies to > 16.14.0\n if (Number(major) <= 16 && Number(minor) < 14) {\n throw new Error('React version does not support new jsx transform');\n }\n\n // eslint-disable-next-line global-require, @typescript-eslint/no-var-requires\n const jsxRuntime = require('react/jsx-runtime');\n if (!jsxRuntime.jsx) {\n throw new Error('React jsx runtime does not export new jsx transform');\n }\n return jsxRuntime;\n};\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.resolveActionTrackingContext = resolveActionTrackingContext;
7
+ exports.resolveActionTrackingContextFromTarget = resolveActionTrackingContextFromTarget;
8
+ const FT_ENABLE_TRACK = 'ft-enable-track';
9
+ const FT_EXTRA_PROPERTY = 'ft-extra-property';
10
+ function findFiberTarget(handlerArgs) {
11
+ for (const handlerArg of handlerArgs) {
12
+ if (handlerArg && typeof handlerArg === 'object' && '_targetInst' in handlerArg) {
13
+ return handlerArg._targetInst || null;
14
+ }
15
+ }
16
+ return null;
17
+ }
18
+ function findFiberProperty(targetNode, propertyName) {
19
+ let currentNode = targetNode;
20
+ while (currentNode) {
21
+ const props = currentNode.memoizedProps;
22
+ if (props && props[propertyName]) {
23
+ return props[propertyName];
24
+ }
25
+ currentNode = currentNode.return || null;
26
+ }
27
+ return undefined;
28
+ }
29
+ function resolveActionTrackingContextFromTarget(targetNode) {
30
+ const enableTrack = findFiberProperty(targetNode, FT_ENABLE_TRACK);
31
+ const extraProperty = findFiberProperty(targetNode, FT_EXTRA_PROPERTY);
32
+ const context = {
33
+ enabled: enableTrack === undefined || enableTrack === 'true'
34
+ };
35
+ if (extraProperty !== undefined) {
36
+ try {
37
+ const parsedProperty = JSON.parse(String(extraProperty));
38
+ if (parsedProperty && typeof parsedProperty === 'object') {
39
+ context.property = parsedProperty;
40
+ }
41
+ } catch (error) {
42
+ console.warn(`Error parsing JSON string ${extraProperty}:`, error);
43
+ }
44
+ }
45
+ return context;
46
+ }
47
+ function resolveActionTrackingContext(handlerArgs) {
48
+ return resolveActionTrackingContextFromTarget(findFiberTarget(handlerArgs));
49
+ }
50
+ //# sourceMappingURL=FTRumActionTrackingContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["FT_ENABLE_TRACK","FT_EXTRA_PROPERTY","findFiberTarget","handlerArgs","handlerArg","_targetInst","findFiberProperty","targetNode","propertyName","currentNode","props","memoizedProps","return","undefined","resolveActionTrackingContextFromTarget","enableTrack","extraProperty","context","enabled","parsedProperty","JSON","parse","String","property","error","console","warn","resolveActionTrackingContext"],"sources":["FTRumActionTrackingContext.ts"],"sourcesContent":["const FT_ENABLE_TRACK = 'ft-enable-track';\nconst FT_EXTRA_PROPERTY = 'ft-extra-property';\n\nexport type FTRumActionTrackingContext = {\n enabled: boolean;\n property?: object;\n};\n\ntype FiberNode = {\n memoizedProps?: Record<string, unknown>;\n return?: FiberNode | null;\n};\n\nfunction findFiberTarget(handlerArgs: unknown[]): FiberNode | null {\n for (const handlerArg of handlerArgs) {\n if (\n handlerArg &&\n typeof handlerArg === 'object' &&\n '_targetInst' in handlerArg\n ) {\n return (handlerArg as { _targetInst?: FiberNode })._targetInst || null;\n }\n }\n return null;\n}\n\nfunction findFiberProperty(\n targetNode: FiberNode | null,\n propertyName: string\n): unknown {\n let currentNode = targetNode;\n while (currentNode) {\n const props = currentNode.memoizedProps;\n if (props && props[propertyName]) {\n return props[propertyName];\n }\n currentNode = currentNode.return || null;\n }\n return undefined;\n}\n\nexport function resolveActionTrackingContextFromTarget(\n targetNode: FiberNode | null\n): FTRumActionTrackingContext {\n const enableTrack = findFiberProperty(targetNode, FT_ENABLE_TRACK);\n const extraProperty = findFiberProperty(targetNode, FT_EXTRA_PROPERTY);\n const context: FTRumActionTrackingContext = {\n enabled: enableTrack === undefined || enableTrack === 'true',\n };\n\n if (extraProperty !== undefined) {\n try {\n const parsedProperty = JSON.parse(String(extraProperty));\n if (parsedProperty && typeof parsedProperty === 'object') {\n context.property = parsedProperty as object;\n }\n } catch (error) {\n console.warn(`Error parsing JSON string ${extraProperty}:`, error);\n }\n }\n return context;\n}\n\nexport function resolveActionTrackingContext(\n handlerArgs: unknown[]\n): FTRumActionTrackingContext {\n return resolveActionTrackingContextFromTarget(findFiberTarget(handlerArgs));\n}\n"],"mappings":";;;;;;;AAAA,MAAMA,eAAe,GAAG,iBAAiB;AACzC,MAAMC,iBAAiB,GAAG,mBAAmB;AAY7C,SAASC,eAAeA,CAACC,WAAsB,EAAoB;EACjE,KAAK,MAAMC,UAAU,IAAID,WAAW,EAAE;IACpC,IACEC,UAAU,IACV,OAAOA,UAAU,KAAK,QAAQ,IAC9B,aAAa,IAAIA,UAAU,EAC3B;MACA,OAAQA,UAAU,CAAiCC,WAAW,IAAI,IAAI;IACxE;EACF;EACA,OAAO,IAAI;AACb;AAEA,SAASC,iBAAiBA,CACxBC,UAA4B,EAC5BC,YAAoB,EACX;EACT,IAAIC,WAAW,GAAGF,UAAU;EAC5B,OAAOE,WAAW,EAAE;IAClB,MAAMC,KAAK,GAAGD,WAAW,CAACE,aAAa;IACvC,IAAID,KAAK,IAAIA,KAAK,CAACF,YAAY,CAAC,EAAE;MAChC,OAAOE,KAAK,CAACF,YAAY,CAAC;IAC5B;IACAC,WAAW,GAAGA,WAAW,CAACG,MAAM,IAAI,IAAI;EAC1C;EACA,OAAOC,SAAS;AAClB;AAEO,SAASC,sCAAsCA,CACpDP,UAA4B,EACA;EAC5B,MAAMQ,WAAW,GAAGT,iBAAiB,CAACC,UAAU,EAAEP,eAAe,CAAC;EAClE,MAAMgB,aAAa,GAAGV,iBAAiB,CAACC,UAAU,EAAEN,iBAAiB,CAAC;EACtE,MAAMgB,OAAmC,GAAG;IAC1CC,OAAO,EAAEH,WAAW,KAAKF,SAAS,IAAIE,WAAW,KAAK;EACxD,CAAC;EAED,IAAIC,aAAa,KAAKH,SAAS,EAAE;IAC/B,IAAI;MACF,MAAMM,cAAc,GAAGC,IAAI,CAACC,KAAK,CAACC,MAAM,CAACN,aAAa,CAAC,CAAC;MACxD,IAAIG,cAAc,IAAI,OAAOA,cAAc,KAAK,QAAQ,EAAE;QACxDF,OAAO,CAACM,QAAQ,GAAGJ,cAAwB;MAC7C;IACF,CAAC,CAAC,OAAOK,KAAK,EAAE;MACdC,OAAO,CAACC,IAAI,CAAC,6BAA6BV,aAAa,GAAG,EAAEQ,KAAK,CAAC;IACpE;EACF;EACA,OAAOP,OAAO;AAChB;AAEO,SAASU,4BAA4BA,CAC1CxB,WAAsB,EACM;EAC5B,OAAOW,sCAAsC,CAACZ,eAAe,CAACC,WAAW,CAAC,CAAC;AAC7E","ignoreList":[]}
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.NativeWebSocketSession = void 0;
7
+ exports.clearNativeWebSocketSessions = clearNativeWebSocketSessions;
8
+ exports.startNativeWebSocketSession = startNativeWebSocketSession;
9
+ exports.webSocketNativeID = webSocketNativeID;
10
+ var _NativeFTReactNativeWebSocket = _interopRequireDefault(require("../specs/NativeFTReactNativeWebSocket"));
11
+ var _ft_mobile_agent = require("../ft_mobile_agent");
12
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
13
+ 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; }
14
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
15
+ 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); }
16
+ function ignoreBridgeFailure(call) {
17
+ try {
18
+ void Promise.resolve(call()).catch(() => {});
19
+ } catch {
20
+ /* Setup/cleanup replies must not interrupt JS capture. */
21
+ }
22
+ }
23
+ class NativeWebSocketSession {
24
+ constructor(session) {
25
+ this.session = session;
26
+ _defineProperty(this, "stopped", false);
27
+ _defineProperty(this, "sequence", 0);
28
+ // Enqueue setup before start/stop/add on the same native module queue.
29
+ // Its reply never gates JS capture or selects a different reporting route.
30
+ ignoreBridgeFailure(() => _NativeFTReactNativeWebSocket.default.startCapture(session));
31
+ }
32
+ startResource(key, socketID, url) {
33
+ const property = _ft_mobile_agent.bridgeContextManager.mergeWithLocalPropertiesSync();
34
+ return _NativeFTReactNativeWebSocket.default.startResource(key, socketID !== null && socketID !== void 0 ? socketID : -1, url, this.session, ++this.sequence, property);
35
+ }
36
+ stopResource(key, event) {
37
+ const property = _ft_mobile_agent.bridgeContextManager.mergeWithLocalPropertiesSync();
38
+ return _NativeFTReactNativeWebSocket.default.stopResource(key, event, this.session, property);
39
+ }
40
+ addResource(key, content, metrics) {
41
+ return _NativeFTReactNativeWebSocket.default.addResource(key, content, metrics, this.session);
42
+ }
43
+ release(key) {
44
+ ignoreBridgeFailure(() => _NativeFTReactNativeWebSocket.default === null || _NativeFTReactNativeWebSocket.default === void 0 ? void 0 : _NativeFTReactNativeWebSocket.default.releaseResource(key, this.session));
45
+ }
46
+ stop() {
47
+ if (this.stopped) return;
48
+ this.stopped = true;
49
+ // Existing handshakes still finish through their originally selected route.
50
+ ignoreBridgeFailure(() => _NativeFTReactNativeWebSocket.default === null || _NativeFTReactNativeWebSocket.default === void 0 ? void 0 : _NativeFTReactNativeWebSocket.default.stopCapture(this.session));
51
+ }
52
+ }
53
+ exports.NativeWebSocketSession = NativeWebSocketSession;
54
+ function startNativeWebSocketSession(createKey) {
55
+ try {
56
+ if (typeof (_NativeFTReactNativeWebSocket.default === null || _NativeFTReactNativeWebSocket.default === void 0 ? void 0 : _NativeFTReactNativeWebSocket.default.startCapture) === 'function' && typeof _NativeFTReactNativeWebSocket.default.stopCapture === 'function' && typeof _NativeFTReactNativeWebSocket.default.clear === 'function' && typeof _NativeFTReactNativeWebSocket.default.startResource === 'function' && typeof _NativeFTReactNativeWebSocket.default.stopResource === 'function' && typeof _NativeFTReactNativeWebSocket.default.addResource === 'function' && typeof _NativeFTReactNativeWebSocket.default.releaseResource === 'function') return new NativeWebSocketSession(createKey());
57
+ } catch {
58
+ /* Old native binaries keep the JS fallback. */
59
+ }
60
+ return undefined;
61
+ }
62
+ function clearNativeWebSocketSessions() {
63
+ ignoreBridgeFailure(() => _NativeFTReactNativeWebSocket.default === null || _NativeFTReactNativeWebSocket.default === void 0 ? void 0 : _NativeFTReactNativeWebSocket.default.clear());
64
+ }
65
+ function webSocketNativeID(socket) {
66
+ try {
67
+ const id = socket === null || socket === void 0 ? void 0 : socket._socketId;
68
+ return typeof id === 'number' && Number.isSafeInteger(id) && id >= 0 ? id : undefined;
69
+ } catch {
70
+ return undefined;
71
+ }
72
+ }
73
+ //# sourceMappingURL=FTRumWebSocketNative.js.map
@@ -0,0 +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":[]}
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.startWebSocketTiming = startWebSocketTiming;
7
+ /** Measures only the JS-observed opening handshake; bridge delays are excluded. */
8
+ function startWebSocketTiming() {
9
+ const wallStart = readWallTime();
10
+ let monotonicNow;
11
+ let monotonicStart;
12
+ try {
13
+ const clock = globalThis.performance;
14
+ if (typeof (clock === null || clock === void 0 ? void 0 : clock.now) === 'function') {
15
+ monotonicNow = () => clock.now();
16
+ monotonicStart = monotonicNow();
17
+ }
18
+ } catch {
19
+ // Older runtimes and other instrumentation may not provide this clock.
20
+ }
21
+ return () => {
22
+ let durationMs;
23
+ try {
24
+ if (monotonicNow && Number.isFinite(monotonicStart)) {
25
+ const elapsed = monotonicNow() - monotonicStart;
26
+ if (Number.isFinite(elapsed) && elapsed >= 0) {
27
+ durationMs = elapsed;
28
+ }
29
+ }
30
+ } catch {
31
+ // Fall back to wall time if the monotonic clock becomes unavailable.
32
+ }
33
+ if (durationMs === undefined && wallStart !== undefined) {
34
+ const wallEnd = readWallTime();
35
+ if (wallEnd !== undefined && wallEnd >= wallStart) {
36
+ durationMs = wallEnd - wallStart;
37
+ }
38
+ }
39
+ if (durationMs === undefined) {
40
+ return undefined;
41
+ }
42
+ // Resource metrics use nanoseconds. Do not send an invalid bridge number.
43
+ const durationNs = Math.round(durationMs * 1e6);
44
+ return Number.isSafeInteger(durationNs) ? durationNs : undefined;
45
+ };
46
+ }
47
+ function readWallTime() {
48
+ try {
49
+ const time = Date.now();
50
+ return Number.isFinite(time) ? time : undefined;
51
+ } catch {
52
+ return undefined;
53
+ }
54
+ }
55
+ //# sourceMappingURL=FTRumWebSocketTiming.js.map
@@ -0,0 +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":[]}