@grafana/faro-react-native 1.2.1 → 1.3.0

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 (217) hide show
  1. package/android/build.gradle +118 -36
  2. package/android/consumer-proguard-rules.pro +2 -0
  3. package/android/src/main/java/com/grafana/faro/reactnative/ANRTracker.kt +61 -9
  4. package/android/src/main/java/com/grafana/faro/reactnative/AnrThreadDumpParser.kt +70 -0
  5. package/android/src/main/java/com/grafana/faro/reactnative/ApplicationExitTraceReader.kt +142 -0
  6. package/android/src/main/java/com/grafana/faro/reactnative/FaroAnrCache.kt +163 -0
  7. package/android/src/main/java/com/grafana/faro/reactnative/FaroAnrReporter.kt +163 -0
  8. package/android/src/main/java/com/grafana/faro/reactnative/FaroCrashReporter.kt +243 -50
  9. package/android/src/main/java/com/grafana/faro/reactnative/FaroCrashTraceCache.kt +75 -0
  10. package/android/src/main/java/com/grafana/faro/reactnative/FaroNativeCrashTrace.kt +39 -0
  11. package/android/src/main/java/com/grafana/faro/reactnative/FaroReactNativeModule.kt +99 -8
  12. package/android/src/main/java/com/grafana/faro/reactnative/FaroReactNativePackage.kt +1 -0
  13. package/android/src/main/java/com/grafana/faro/reactnative/FaroUncaughtExceptionHandler.kt +62 -0
  14. package/android/src/main/java/com/grafana/faro/reactnative/TombstoneBacktraceFormatter.kt +117 -0
  15. package/android/src/main/java/com/grafana/faro/reactnative/TombstoneModels.kt +35 -0
  16. package/android/src/main/java/com/grafana/faro/reactnative/TombstoneWireParser.kt +235 -0
  17. package/android/src/main/proto/tombstone.proto +62 -0
  18. package/android/src/test/java/com/grafana/faro/reactnative/AnrStackFiltersTest.kt +28 -0
  19. package/android/src/test/java/com/grafana/faro/reactnative/AnrThreadDumpParserTest.kt +38 -0
  20. package/android/src/test/java/com/grafana/faro/reactnative/FaroAnrCacheTest.kt +81 -0
  21. package/android/src/test/java/com/grafana/faro/reactnative/TombstoneWireParserTest.kt +51 -0
  22. package/dist/cjs/config/getRNInstrumentations.js +3 -1
  23. package/dist/cjs/config/getRNInstrumentations.js.map +1 -1
  24. package/dist/cjs/config/makeRNConfig.js +48 -9
  25. package/dist/cjs/config/makeRNConfig.js.map +1 -1
  26. package/dist/cjs/config/types.js.map +1 -1
  27. package/dist/cjs/generated/faroRNPackageMeta.js +1 -1
  28. package/dist/cjs/generated/faroRNPackageMeta.js.map +1 -1
  29. package/dist/cjs/index.js +3 -2
  30. package/dist/cjs/index.js.map +1 -1
  31. package/dist/cjs/initialize.js +14 -8
  32. package/dist/cjs/initialize.js.map +1 -1
  33. package/dist/cjs/instrumentations/anr/anrStack.js +19 -0
  34. package/dist/cjs/instrumentations/anr/anrStack.js.map +1 -0
  35. package/dist/cjs/instrumentations/anr/instrumentation.js +374 -72
  36. package/dist/cjs/instrumentations/anr/instrumentation.js.map +1 -1
  37. package/dist/cjs/instrumentations/anr/types.js.map +1 -1
  38. package/dist/cjs/instrumentations/console/index.js +5 -1
  39. package/dist/cjs/instrumentations/console/index.js.map +1 -1
  40. package/dist/cjs/instrumentations/crashReporting/{instrumentation.js → BaseCrashReportingInstrumentation.js} +110 -103
  41. package/dist/cjs/instrumentations/crashReporting/BaseCrashReportingInstrumentation.js.map +1 -0
  42. package/dist/cjs/instrumentations/crashReporting/NoOpCrashReportingInstrumentation.js +41 -0
  43. package/dist/cjs/instrumentations/crashReporting/NoOpCrashReportingInstrumentation.js.map +1 -0
  44. package/dist/cjs/instrumentations/crashReporting/android/AndroidCrashReportingInstrumentation.js +87 -0
  45. package/dist/cjs/instrumentations/crashReporting/android/AndroidCrashReportingInstrumentation.js.map +1 -0
  46. package/dist/cjs/instrumentations/crashReporting/android/crashErrorMessage.js +123 -0
  47. package/dist/cjs/instrumentations/crashReporting/android/crashErrorMessage.js.map +1 -0
  48. package/dist/cjs/instrumentations/crashReporting/android/index.js +12 -0
  49. package/dist/cjs/instrumentations/crashReporting/android/index.js.map +1 -0
  50. package/dist/cjs/instrumentations/crashReporting/android/nativeTombstoneTrace.js +11 -0
  51. package/dist/cjs/instrumentations/crashReporting/android/nativeTombstoneTrace.js.map +1 -0
  52. package/dist/cjs/instrumentations/crashReporting/android/parseAndroidCrashTrace.js +181 -0
  53. package/dist/cjs/instrumentations/crashReporting/android/parseAndroidCrashTrace.js.map +1 -0
  54. package/dist/cjs/instrumentations/crashReporting/index.js +35 -2
  55. package/dist/cjs/instrumentations/crashReporting/index.js.map +1 -1
  56. package/dist/cjs/instrumentations/crashReporting/ios/IosCrashReportingInstrumentation.js +78 -0
  57. package/dist/cjs/instrumentations/crashReporting/ios/IosCrashReportingInstrumentation.js.map +1 -0
  58. package/dist/cjs/instrumentations/crashReporting/ios/crashErrorMessage.js +103 -0
  59. package/dist/cjs/instrumentations/crashReporting/ios/crashErrorMessage.js.map +1 -0
  60. package/dist/cjs/instrumentations/crashReporting/ios/index.js +11 -0
  61. package/dist/cjs/instrumentations/crashReporting/ios/index.js.map +1 -0
  62. package/dist/cjs/instrumentations/crashReporting/ios/parseIosCrashTrace.js +48 -0
  63. package/dist/cjs/instrumentations/crashReporting/ios/parseIosCrashTrace.js.map +1 -0
  64. package/dist/cjs/instrumentations/crashReporting/types.js.map +1 -1
  65. package/dist/cjs/instrumentations/errors/index.js +2 -1
  66. package/dist/cjs/instrumentations/errors/index.js.map +1 -1
  67. package/dist/cjs/instrumentations/session/installationId.js +91 -0
  68. package/dist/cjs/instrumentations/session/installationId.js.map +1 -0
  69. package/dist/cjs/instrumentations/session/sessionAttributes.js +152 -89
  70. package/dist/cjs/instrumentations/session/sessionAttributes.js.map +1 -1
  71. package/dist/cjs/metas/appBuildIdentity.js +95 -0
  72. package/dist/cjs/metas/appBuildIdentity.js.map +1 -0
  73. package/dist/cjs/testUtils/mockDeviceInfo.js +5 -0
  74. package/dist/cjs/testUtils/mockDeviceInfo.js.map +1 -1
  75. package/dist/cjs/testUtils/setupTests.js +7 -0
  76. package/dist/cjs/testUtils/setupTests.js.map +1 -1
  77. package/dist/esm/config/getRNInstrumentations.js +3 -1
  78. package/dist/esm/config/getRNInstrumentations.js.map +1 -1
  79. package/dist/esm/config/makeRNConfig.js +49 -10
  80. package/dist/esm/config/makeRNConfig.js.map +1 -1
  81. package/dist/esm/config/types.js.map +1 -1
  82. package/dist/esm/generated/faroRNPackageMeta.js +1 -1
  83. package/dist/esm/generated/faroRNPackageMeta.js.map +1 -1
  84. package/dist/esm/index.js +1 -1
  85. package/dist/esm/index.js.map +1 -1
  86. package/dist/esm/initialize.js +11 -5
  87. package/dist/esm/initialize.js.map +1 -1
  88. package/dist/esm/instrumentations/anr/anrStack.js +16 -0
  89. package/dist/esm/instrumentations/anr/anrStack.js.map +1 -0
  90. package/dist/esm/instrumentations/anr/instrumentation.js +260 -67
  91. package/dist/esm/instrumentations/anr/instrumentation.js.map +1 -1
  92. package/dist/esm/instrumentations/anr/types.js.map +1 -1
  93. package/dist/esm/instrumentations/console/index.js +5 -1
  94. package/dist/esm/instrumentations/console/index.js.map +1 -1
  95. package/dist/esm/instrumentations/crashReporting/{instrumentation.js → BaseCrashReportingInstrumentation.js} +76 -94
  96. package/dist/esm/instrumentations/crashReporting/BaseCrashReportingInstrumentation.js.map +1 -0
  97. package/dist/esm/instrumentations/crashReporting/NoOpCrashReportingInstrumentation.js +18 -0
  98. package/dist/esm/instrumentations/crashReporting/NoOpCrashReportingInstrumentation.js.map +1 -0
  99. package/dist/esm/instrumentations/crashReporting/android/AndroidCrashReportingInstrumentation.js +56 -0
  100. package/dist/esm/instrumentations/crashReporting/android/AndroidCrashReportingInstrumentation.js.map +1 -0
  101. package/dist/esm/instrumentations/crashReporting/android/crashErrorMessage.js +116 -0
  102. package/dist/esm/instrumentations/crashReporting/android/crashErrorMessage.js.map +1 -0
  103. package/dist/esm/instrumentations/crashReporting/android/index.js +4 -0
  104. package/dist/esm/instrumentations/crashReporting/android/index.js.map +1 -0
  105. package/dist/esm/instrumentations/crashReporting/android/nativeTombstoneTrace.js +8 -0
  106. package/dist/esm/instrumentations/crashReporting/android/nativeTombstoneTrace.js.map +1 -0
  107. package/dist/esm/instrumentations/crashReporting/android/parseAndroidCrashTrace.js +174 -0
  108. package/dist/esm/instrumentations/crashReporting/android/parseAndroidCrashTrace.js.map +1 -0
  109. package/dist/esm/instrumentations/crashReporting/index.js +35 -1
  110. package/dist/esm/instrumentations/crashReporting/index.js.map +1 -1
  111. package/dist/esm/instrumentations/crashReporting/ios/IosCrashReportingInstrumentation.js +56 -0
  112. package/dist/esm/instrumentations/crashReporting/ios/IosCrashReportingInstrumentation.js.map +1 -0
  113. package/dist/esm/instrumentations/crashReporting/ios/crashErrorMessage.js +98 -0
  114. package/dist/esm/instrumentations/crashReporting/ios/crashErrorMessage.js.map +1 -0
  115. package/dist/esm/instrumentations/crashReporting/ios/index.js +4 -0
  116. package/dist/esm/instrumentations/crashReporting/ios/index.js.map +1 -0
  117. package/dist/esm/instrumentations/crashReporting/ios/parseIosCrashTrace.js +44 -0
  118. package/dist/esm/instrumentations/crashReporting/ios/parseIosCrashTrace.js.map +1 -0
  119. package/dist/esm/instrumentations/crashReporting/types.js.map +1 -1
  120. package/dist/esm/instrumentations/errors/index.js +2 -1
  121. package/dist/esm/instrumentations/errors/index.js.map +1 -1
  122. package/dist/esm/instrumentations/session/installationId.js +48 -0
  123. package/dist/esm/instrumentations/session/installationId.js.map +1 -0
  124. package/dist/esm/instrumentations/session/sessionAttributes.js +83 -38
  125. package/dist/esm/instrumentations/session/sessionAttributes.js.map +1 -1
  126. package/dist/esm/metas/appBuildIdentity.js +56 -0
  127. package/dist/esm/metas/appBuildIdentity.js.map +1 -0
  128. package/dist/esm/testUtils/mockDeviceInfo.js +5 -0
  129. package/dist/esm/testUtils/mockDeviceInfo.js.map +1 -1
  130. package/dist/esm/testUtils/setupTests.js +7 -0
  131. package/dist/esm/testUtils/setupTests.js.map +1 -1
  132. package/dist/types/config/makeRNConfig.d.ts +4 -3
  133. package/dist/types/config/types.d.ts +2 -1
  134. package/dist/types/generated/faroRNPackageMeta.d.ts +1 -1
  135. package/dist/types/index.d.ts +2 -2
  136. package/dist/types/initialize.d.ts +4 -2
  137. package/dist/types/instrumentations/anr/anrStack.d.ts +7 -0
  138. package/dist/types/instrumentations/anr/instrumentation.d.ts +23 -28
  139. package/dist/types/instrumentations/anr/types.d.ts +5 -1
  140. package/dist/types/instrumentations/appState/index.d.ts +1 -1
  141. package/dist/types/instrumentations/console/index.d.ts +1 -1
  142. package/dist/types/instrumentations/crashReporting/BaseCrashReportingInstrumentation.d.ts +56 -0
  143. package/dist/types/instrumentations/crashReporting/NoOpCrashReportingInstrumentation.d.ts +12 -0
  144. package/dist/types/instrumentations/crashReporting/android/AndroidCrashReportingInstrumentation.d.ts +26 -0
  145. package/dist/types/instrumentations/crashReporting/android/crashErrorMessage.d.ts +23 -0
  146. package/dist/types/instrumentations/crashReporting/android/index.d.ts +4 -0
  147. package/dist/types/instrumentations/crashReporting/android/nativeTombstoneTrace.d.ts +2 -0
  148. package/dist/types/instrumentations/crashReporting/android/parseAndroidCrashTrace.d.ts +45 -0
  149. package/dist/types/instrumentations/crashReporting/index.d.ts +25 -2
  150. package/dist/types/instrumentations/crashReporting/ios/IosCrashReportingInstrumentation.d.ts +28 -0
  151. package/dist/types/instrumentations/crashReporting/ios/crashErrorMessage.d.ts +14 -0
  152. package/dist/types/instrumentations/crashReporting/ios/index.d.ts +4 -0
  153. package/dist/types/instrumentations/crashReporting/ios/parseIosCrashTrace.d.ts +38 -0
  154. package/dist/types/instrumentations/crashReporting/types.d.ts +18 -51
  155. package/dist/types/instrumentations/frameMonitoring/instrumentation.d.ts +1 -1
  156. package/dist/types/instrumentations/http/index.d.ts +1 -1
  157. package/dist/types/instrumentations/performance/index.d.ts +1 -1
  158. package/dist/types/instrumentations/session/index.d.ts +1 -1
  159. package/dist/types/instrumentations/session/installationId.d.ts +1 -0
  160. package/dist/types/instrumentations/session/sessionAttributes.d.ts +13 -4
  161. package/dist/types/instrumentations/startup/index.d.ts +1 -1
  162. package/dist/types/instrumentations/userActions/index.d.ts +1 -1
  163. package/dist/types/instrumentations/view/index.d.ts +1 -1
  164. package/dist/types/instrumentations/xhr/index.d.ts +1 -1
  165. package/dist/types/metas/appBuildIdentity.d.ts +16 -0
  166. package/dist/types/testUtils/mockFaroReactNativeTracing.d.ts +1 -1
  167. package/dist/types/transports/console/transport.d.ts +1 -1
  168. package/dist/types/transports/fetch/transport.d.ts +1 -1
  169. package/dist/types/transports/offline/transport.d.ts +1 -1
  170. package/package.json +3 -3
  171. package/src/config/getRNInstrumentations.ts +5 -1
  172. package/src/config/makeRNConfig.test.ts +59 -3
  173. package/src/config/makeRNConfig.ts +48 -9
  174. package/src/config/types.ts +2 -1
  175. package/src/generated/faroRNPackageMeta.ts +1 -1
  176. package/src/index.ts +2 -1
  177. package/src/initialize.test.ts +71 -15
  178. package/src/initialize.ts +11 -5
  179. package/src/instrumentations/anr/anrStack.test.ts +27 -0
  180. package/src/instrumentations/anr/anrStack.ts +19 -0
  181. package/src/instrumentations/anr/instrumentation.test.ts +45 -0
  182. package/src/instrumentations/anr/instrumentation.ts +301 -67
  183. package/src/instrumentations/anr/types.ts +7 -1
  184. package/src/instrumentations/console/index.ts +5 -1
  185. package/src/instrumentations/console/instrumentation.test.ts +5 -0
  186. package/src/instrumentations/crashReporting/{instrumentation.ts → BaseCrashReportingInstrumentation.ts} +119 -93
  187. package/src/instrumentations/crashReporting/NoOpCrashReportingInstrumentation.ts +23 -0
  188. package/src/instrumentations/crashReporting/android/AndroidCrashReportingInstrumentation.ts +62 -0
  189. package/src/instrumentations/crashReporting/android/crashErrorMessage.test.ts +182 -0
  190. package/src/instrumentations/crashReporting/android/crashErrorMessage.ts +135 -0
  191. package/src/instrumentations/crashReporting/android/index.ts +4 -0
  192. package/src/instrumentations/crashReporting/android/nativeTombstoneTrace.test.ts +19 -0
  193. package/src/instrumentations/crashReporting/android/nativeTombstoneTrace.ts +8 -0
  194. package/src/instrumentations/crashReporting/android/parseAndroidCrashTrace.test.ts +232 -0
  195. package/src/instrumentations/crashReporting/android/parseAndroidCrashTrace.ts +235 -0
  196. package/src/instrumentations/crashReporting/index.ts +43 -2
  197. package/src/instrumentations/crashReporting/instrumentation.test.ts +42 -0
  198. package/src/instrumentations/crashReporting/ios/IosCrashReportingInstrumentation.ts +62 -0
  199. package/src/instrumentations/crashReporting/ios/crashErrorMessage.test.ts +170 -0
  200. package/src/instrumentations/crashReporting/ios/crashErrorMessage.ts +111 -0
  201. package/src/instrumentations/crashReporting/ios/index.ts +4 -0
  202. package/src/instrumentations/crashReporting/ios/parseIosCrashTrace.test.ts +86 -0
  203. package/src/instrumentations/crashReporting/ios/parseIosCrashTrace.ts +83 -0
  204. package/src/instrumentations/crashReporting/types.ts +19 -58
  205. package/src/instrumentations/errors/index.ts +2 -1
  206. package/src/instrumentations/errors/instrumentation.test.ts +8 -2
  207. package/src/instrumentations/errors/stackTraceParser.test.ts +1 -1
  208. package/src/instrumentations/session/installationId.ts +43 -0
  209. package/src/instrumentations/session/sessionAttributes.test.ts +260 -30
  210. package/src/instrumentations/session/sessionAttributes.ts +112 -22
  211. package/src/metas/appBuildIdentity.test.ts +48 -0
  212. package/src/metas/appBuildIdentity.ts +50 -0
  213. package/src/testUtils/mockDeviceInfo.ts +5 -0
  214. package/src/testUtils/setupTests.ts +7 -0
  215. package/dist/cjs/instrumentations/crashReporting/instrumentation.js.map +0 -1
  216. package/dist/esm/instrumentations/crashReporting/instrumentation.js.map +0 -1
  217. package/dist/types/instrumentations/crashReporting/instrumentation.d.ts +0 -58
@@ -1 +1 @@
1
- {"version":3,"file":"setupTests.js","sourceRoot":"","sources":["../../../src/testUtils/setupTests.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Jest setup file for React Native tests\n * Mocks third-party React Native dependencies\n */\n\n// Mock react-native-device-info\njest.mock('react-native-device-info', () => {\n const mockDeviceInfo = {\n getBrand: jest.fn(() => 'Apple'),\n getDeviceId: jest.fn(() => 'iPhone14,2'),\n getModel: jest.fn(() => 'iPhone 13 Pro'),\n getSystemName: jest.fn(() => 'iOS'),\n getSystemVersion: jest.fn(() => '16.0'),\n getVersion: jest.fn(() => '1.0.0'),\n isTablet: jest.fn(() => false),\n isEmulatorSync: jest.fn(() => false),\n getTotalMemorySync: jest.fn(() => 6442450944), // 6GB in bytes\n getUsedMemorySync: jest.fn(() => 2147483648), // 2GB in bytes\n getBatteryLevel: jest.fn(() => Promise.resolve(0.75)),\n getCarrier: jest.fn(() => Promise.resolve('T-Mobile')),\n isPowerSaveMode: jest.fn(() => Promise.resolve(false)),\n isBatteryCharging: jest.fn(() => Promise.resolve(false)),\n };\n return {\n __esModule: true,\n default: mockDeviceInfo,\n ...mockDeviceInfo,\n };\n});\n\n// Mock @react-native-async-storage/async-storage\n// Using a global storage object that can be accessed by tests\n(global as any).mockAsyncStorage = {};\n\nconst mockAsyncStorageImpl = {\n getItem: jest.fn((key: string) => {\n const storage = (global as any).mockAsyncStorage;\n return Promise.resolve(storage[key] ?? null);\n }),\n setItem: jest.fn((key: string, value: string) => {\n const storage = (global as any).mockAsyncStorage;\n storage[key] = value;\n return Promise.resolve();\n }),\n removeItem: jest.fn((key: string) => {\n const storage = (global as any).mockAsyncStorage;\n delete storage[key];\n return Promise.resolve();\n }),\n clear: jest.fn(() => {\n (global as any).mockAsyncStorage = {};\n return Promise.resolve();\n }),\n getAllKeys: jest.fn(() => {\n const storage = (global as any).mockAsyncStorage;\n return Promise.resolve(Object.keys(storage));\n }),\n multiGet: jest.fn((keys: string[]) => {\n const storage = (global as any).mockAsyncStorage;\n return Promise.resolve(keys.map((key) => [key, storage[key] ?? null]));\n }),\n multiSet: jest.fn((keyValuePairs: Array<[string, string]>) => {\n const storage = (global as any).mockAsyncStorage;\n keyValuePairs.forEach(([key, value]) => {\n storage[key] = value;\n });\n return Promise.resolve();\n }),\n multiRemove: jest.fn((keys: string[]) => {\n const storage = (global as any).mockAsyncStorage;\n keys.forEach((key) => delete storage[key]);\n return Promise.resolve();\n }),\n};\n\njest.mock('@react-native-async-storage/async-storage', () => ({\n __esModule: true,\n default: mockAsyncStorageImpl,\n}));\n\n// Ensure Platform.Version is properly mocked\n// The react-native preset mocks Platform, but we need to ensure Version is accessible\njest.mock(\n 'react-native/Libraries/Utilities/Platform',\n () => ({\n OS: 'ios',\n Version: '16.0',\n select: jest.fn((obj) => obj.ios || obj.default),\n }),\n { virtual: true }\n);\n\n// Mock fetch API globals for HTTP instrumentation tests\nif (typeof global.Response === 'undefined') {\n global.Response = class Response {\n ok: boolean;\n status: number;\n statusText: string;\n body: any;\n\n constructor(body?: BodyInit | null, init?: ResponseInit) {\n this.body = body;\n this.status = init?.status ?? 200;\n this.statusText = init?.statusText ?? 'OK';\n this.ok = this.status >= 200 && this.status < 300;\n }\n } as any;\n}\n\nif (typeof global.Request === 'undefined') {\n global.Request = class Request {\n url: string;\n method: string;\n\n constructor(input: RequestInfo | URL, init?: RequestInit) {\n if (typeof input === 'string') {\n this.url = input;\n this.method = init?.method ?? 'GET';\n } else if (input instanceof URL) {\n this.url = input.href;\n this.method = init?.method ?? 'GET';\n } else {\n // input is a Request object\n const req = input as Request;\n this.url = req.url;\n this.method = init?.method ?? req.method ?? 'GET';\n }\n }\n } as any;\n}\n\nif (typeof global.URL === 'undefined') {\n global.URL = class URL {\n href: string;\n\n constructor(url: string) {\n this.href = url;\n }\n } as any;\n}\n\n/**\n * Minimal XMLHttpRequest for Jest (Node has no XHR). Patches in XHRInstrumentation\n * tests attach to this prototype; send() completes asynchronously like a real request.\n */\nif (typeof global.XMLHttpRequest === 'undefined') {\n class MockXMLHttpRequest {\n static readonly DONE = 4;\n\n readyState = 0;\n status = 200;\n statusText = 'OK';\n onreadystatechange: ((this: XMLHttpRequest, ev: Event) => unknown) | null = null;\n\n private readonly listeners = new Map<string, Set<EventListener>>();\n\n open(_method: string, _url: string | URL): void {\n // Real open is replaced by instrumentation; baseline is a no-op.\n }\n\n send(_body?: Document | XMLHttpRequestBodyInit | null): void {\n // Synchronous completion matches test doubles and ensures Faro pushEvent runs in the same turn as send().\n this.readyState = MockXMLHttpRequest.DONE;\n const ev = { type: 'readystatechange' } as Event;\n if (this.onreadystatechange) {\n this.onreadystatechange.call(this as unknown as XMLHttpRequest, ev);\n }\n const load = this.listeners.get('load');\n if (load) {\n load.forEach((fn) => {\n fn.call(this as unknown as XMLHttpRequest, ev);\n });\n }\n }\n\n setRequestHeader(_name: string, _value: string): void {}\n\n getResponseHeader(_name: string): string | null {\n return null;\n }\n\n addEventListener(type: string, listener: EventListener): void {\n let set = this.listeners.get(type);\n if (!set) {\n set = new Set();\n this.listeners.set(type, set);\n }\n set.add(listener);\n }\n\n removeEventListener(type: string, listener: EventListener): void {\n this.listeners.get(type)?.delete(listener);\n }\n\n abort(): void {}\n }\n\n global.XMLHttpRequest = MockXMLHttpRequest as unknown as typeof XMLHttpRequest;\n}\n"]}
1
+ {"version":3,"file":"setupTests.js","sourceRoot":"","sources":["../../../src/testUtils/setupTests.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Jest setup file for React Native tests\n * Mocks third-party React Native dependencies\n */\n\n// Mock react-native-device-info\njest.mock('react-native-device-info', () => {\n const mockDeviceInfo = {\n getBrand: jest.fn(() => 'Apple'),\n getDeviceId: jest.fn(() => 'iPhone14,2'),\n getDeviceNameSync: jest.fn(() => \"Test's iPhone\"),\n getUniqueId: jest.fn(() => Promise.resolve('test-device-id')),\n getModel: jest.fn(() => 'iPhone 13 Pro'),\n getManufacturerSync: jest.fn(() => 'Apple'),\n getSystemName: jest.fn(() => 'iOS'),\n getSystemVersion: jest.fn(() => '16.0'),\n getVersion: jest.fn(() => '1.0.0'),\n getBundleId: jest.fn(() => 'com.example.myapp'),\n getBuildNumber: jest.fn(() => '42'),\n getApiLevel: jest.fn(() => Promise.resolve(35)),\n getBuildId: jest.fn(() => Promise.resolve('22B83')),\n isTablet: jest.fn(() => false),\n isEmulatorSync: jest.fn(() => false),\n getTotalMemorySync: jest.fn(() => 6442450944), // 6GB in bytes\n getUsedMemorySync: jest.fn(() => 2147483648), // 2GB in bytes\n getBatteryLevel: jest.fn(() => Promise.resolve(0.75)),\n getCarrier: jest.fn(() => Promise.resolve('T-Mobile')),\n isPowerSaveMode: jest.fn(() => Promise.resolve(false)),\n isBatteryCharging: jest.fn(() => Promise.resolve(false)),\n };\n return {\n __esModule: true,\n default: mockDeviceInfo,\n ...mockDeviceInfo,\n };\n});\n\n// Mock @react-native-async-storage/async-storage\n// Using a global storage object that can be accessed by tests\n(global as any).mockAsyncStorage = {};\n\nconst mockAsyncStorageImpl = {\n getItem: jest.fn((key: string) => {\n const storage = (global as any).mockAsyncStorage;\n return Promise.resolve(storage[key] ?? null);\n }),\n setItem: jest.fn((key: string, value: string) => {\n const storage = (global as any).mockAsyncStorage;\n storage[key] = value;\n return Promise.resolve();\n }),\n removeItem: jest.fn((key: string) => {\n const storage = (global as any).mockAsyncStorage;\n delete storage[key];\n return Promise.resolve();\n }),\n clear: jest.fn(() => {\n (global as any).mockAsyncStorage = {};\n return Promise.resolve();\n }),\n getAllKeys: jest.fn(() => {\n const storage = (global as any).mockAsyncStorage;\n return Promise.resolve(Object.keys(storage));\n }),\n multiGet: jest.fn((keys: string[]) => {\n const storage = (global as any).mockAsyncStorage;\n return Promise.resolve(keys.map((key) => [key, storage[key] ?? null]));\n }),\n multiSet: jest.fn((keyValuePairs: Array<[string, string]>) => {\n const storage = (global as any).mockAsyncStorage;\n keyValuePairs.forEach(([key, value]) => {\n storage[key] = value;\n });\n return Promise.resolve();\n }),\n multiRemove: jest.fn((keys: string[]) => {\n const storage = (global as any).mockAsyncStorage;\n keys.forEach((key) => delete storage[key]);\n return Promise.resolve();\n }),\n};\n\njest.mock('@react-native-async-storage/async-storage', () => ({\n __esModule: true,\n default: mockAsyncStorageImpl,\n}));\n\n// Ensure Platform.Version is properly mocked\n// The react-native preset mocks Platform, but we need to ensure Version is accessible\njest.mock(\n 'react-native/Libraries/Utilities/Platform',\n () => ({\n OS: 'ios',\n Version: '16.0',\n select: jest.fn((obj) => obj.ios || obj.default),\n }),\n { virtual: true }\n);\n\n// Mock fetch API globals for HTTP instrumentation tests\nif (typeof global.Response === 'undefined') {\n global.Response = class Response {\n ok: boolean;\n status: number;\n statusText: string;\n body: any;\n\n constructor(body?: BodyInit | null, init?: ResponseInit) {\n this.body = body;\n this.status = init?.status ?? 200;\n this.statusText = init?.statusText ?? 'OK';\n this.ok = this.status >= 200 && this.status < 300;\n }\n } as any;\n}\n\nif (typeof global.Request === 'undefined') {\n global.Request = class Request {\n url: string;\n method: string;\n\n constructor(input: RequestInfo | URL, init?: RequestInit) {\n if (typeof input === 'string') {\n this.url = input;\n this.method = init?.method ?? 'GET';\n } else if (input instanceof URL) {\n this.url = input.href;\n this.method = init?.method ?? 'GET';\n } else {\n // input is a Request object\n const req = input as Request;\n this.url = req.url;\n this.method = init?.method ?? req.method ?? 'GET';\n }\n }\n } as any;\n}\n\nif (typeof global.URL === 'undefined') {\n global.URL = class URL {\n href: string;\n\n constructor(url: string) {\n this.href = url;\n }\n } as any;\n}\n\n/**\n * Minimal XMLHttpRequest for Jest (Node has no XHR). Patches in XHRInstrumentation\n * tests attach to this prototype; send() completes asynchronously like a real request.\n */\nif (typeof global.XMLHttpRequest === 'undefined') {\n class MockXMLHttpRequest {\n static readonly DONE = 4;\n\n readyState = 0;\n status = 200;\n statusText = 'OK';\n onreadystatechange: ((this: XMLHttpRequest, ev: Event) => unknown) | null = null;\n\n private readonly listeners = new Map<string, Set<EventListener>>();\n\n open(_method: string, _url: string | URL): void {\n // Real open is replaced by instrumentation; baseline is a no-op.\n }\n\n send(_body?: Document | XMLHttpRequestBodyInit | null): void {\n // Synchronous completion matches test doubles and ensures Faro pushEvent runs in the same turn as send().\n this.readyState = MockXMLHttpRequest.DONE;\n const ev = { type: 'readystatechange' } as Event;\n if (this.onreadystatechange) {\n this.onreadystatechange.call(this as unknown as XMLHttpRequest, ev);\n }\n const load = this.listeners.get('load');\n if (load) {\n load.forEach((fn) => {\n fn.call(this as unknown as XMLHttpRequest, ev);\n });\n }\n }\n\n setRequestHeader(_name: string, _value: string): void {}\n\n getResponseHeader(_name: string): string | null {\n return null;\n }\n\n addEventListener(type: string, listener: EventListener): void {\n let set = this.listeners.get(type);\n if (!set) {\n set = new Set();\n this.listeners.set(type, set);\n }\n set.add(listener);\n }\n\n removeEventListener(type: string, listener: EventListener): void {\n this.listeners.get(type)?.delete(listener);\n }\n\n abort(): void {}\n }\n\n global.XMLHttpRequest = MockXMLHttpRequest as unknown as typeof XMLHttpRequest;\n}\n"]}
@@ -107,7 +107,9 @@ export function getRNInstrumentations(config = {}) {
107
107
  }
108
108
  // Crash reporting
109
109
  if (enableCrashReporting) {
110
- instrumentations.push(new CrashReportingInstrumentation());
110
+ instrumentations.push(new CrashReportingInstrumentation({
111
+ releaseBundleFilename: config.releaseBundleFilename,
112
+ }));
111
113
  }
112
114
  if (enableTracing) {
113
115
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"getRNInstrumentations.js","sourceRoot":"","sources":["../../../src/config/getRNInstrumentations.ts"],"names":[],"mappings":"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","sourcesContent":["import { Platform } from 'react-native';\n\nimport type { Instrumentation, Patterns } from '@grafana/faro-core';\n\nimport { ANRInstrumentation } from '../instrumentations/anr';\nimport { AppStateInstrumentation } from '../instrumentations/appState';\nimport { ConsoleInstrumentation } from '../instrumentations/console';\nimport { CrashReportingInstrumentation } from '../instrumentations/crashReporting';\nimport { ErrorsInstrumentation } from '../instrumentations/errors';\nimport { FrameMonitoringInstrumentation } from '../instrumentations/frameMonitoring';\nimport { HttpInstrumentation } from '../instrumentations/http';\nimport { PerformanceInstrumentation } from '../instrumentations/performance';\nimport { SessionInstrumentation } from '../instrumentations/session';\nimport { StartupInstrumentation } from '../instrumentations/startup';\nimport { UserActionInstrumentation } from '../instrumentations/userActions';\nimport { ViewInstrumentation } from '../instrumentations/view';\nimport { XHRInstrumentation } from '../instrumentations/xhr';\n\nimport type { ReactNativeConfig } from './types';\n\n/** Convert Patterns (string | RegExp)[] to RegExp[] for instrumentations that require RegExp[]. */\nfunction toRegExpArray(patterns: Patterns): RegExp[] {\n return patterns.map((p) => (typeof p === 'string' ? new RegExp(p.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')) : p));\n}\n\n/**\n * Returns the default set of instrumentations for React Native.\n *\n * Reads all options from the Faro config (single source of truth).\n * Property names are aligned with Flutter SDK FaroConfig:\n * - cpuUsageVitals, memoryUsageVitals, anrTracking, refreshRateVitals\n * - enableCrashReporting, enableErrorReporting\n * - fetchVitalsInterval, ignoreUrls\n *\n * @example\n * ```ts\n * const config: ReactNativeConfig = {\n * app: { name: 'my-app', version: '1.0.0' },\n * cpuUsageVitals: true,\n * memoryUsageVitals: true,\n * anrTracking: true,\n * refreshRateVitals: true,\n * enableCrashReporting: true,\n * fetchVitalsInterval: 30000,\n * instrumentations: getRNInstrumentations(config),\n * };\n * ```\n */\nexport function getRNInstrumentations(config: Partial<ReactNativeConfig> = {}): Instrumentation[] {\n // Aligned with Flutter SDK FaroConfig defaults\n const {\n // Error & crash tracking\n enableErrorReporting = true,\n enableCrashReporting = false,\n anrTracking = false,\n anrOptions = {},\n\n // Performance vitals\n cpuUsageVitals = true,\n memoryUsageVitals = true,\n refreshRateVitals = false,\n fetchVitalsInterval = 30000,\n frameMonitoringOptions = {},\n\n // Network\n ignoreUrls = [],\n enableHttpInstrumentation = {},\n\n // Console and user actions\n enableConsoleCapture = true,\n enableUserActions = true,\n\n // Tracing\n enableTracing = false,\n tracingOptions = {},\n } = config;\n\n const instrumentations: Instrumentation[] = [];\n\n // Error reporting (Flutter: enableFlutterErrorReporting)\n if (enableErrorReporting) {\n instrumentations.push(\n new ErrorsInstrumentation({\n releaseBundleFilename: config.releaseBundleFilename,\n })\n );\n }\n\n // Console capture - not in Flutter SDK, RN-specific\n if (enableConsoleCapture) {\n instrumentations.push(new ConsoleInstrumentation());\n }\n\n // Sessions - always enabled in Flutter, same here\n instrumentations.push(new SessionInstrumentation());\n\n // Views - always enabled in Flutter, same here\n instrumentations.push(new ViewInstrumentation());\n\n // App state - always enabled in Flutter, same here\n instrumentations.push(new AppStateInstrumentation());\n\n // User actions - enabled by default, opt-out via enableUserActions\n if (enableUserActions) {\n instrumentations.push(new UserActionInstrumentation());\n }\n\n // HTTP/XHR tracking: when tracing is enabled, TracingInstrumentation patches fetch and XHR.\n // When tracing is disabled, add HttpInstrumentation and/or XHRInstrumentation per enableHttpInstrumentation.\n if (!enableTracing) {\n const { fetch: enableFetch = true, xhr: enableXhr = true } = enableHttpInstrumentation;\n const ignoredUrlsRegExp = toRegExpArray(ignoreUrls);\n if (enableFetch) {\n instrumentations.push(new HttpInstrumentation({ ignoredUrls: ignoredUrlsRegExp }));\n }\n if (enableXhr) {\n instrumentations.push(new XHRInstrumentation({ ignoredUrls: ignoredUrlsRegExp }));\n }\n }\n\n // Performance vitals (CPU/memory) - only add if at least one metric is enabled\n if (cpuUsageVitals || memoryUsageVitals) {\n const perfInstrumentation = new PerformanceInstrumentation({\n memoryUsageVitals,\n cpuUsageVitals,\n fetchVitalsInterval,\n });\n instrumentations.push(perfInstrumentation);\n }\n\n // Startup tracking - always enabled\n instrumentations.push(new StartupInstrumentation());\n\n // Frame monitoring: enabled when refreshRateVitals is true\n // The instrumentation reads refreshRateVitals from faro.config (single source of truth)\n if (refreshRateVitals) {\n instrumentations.push(new FrameMonitoringInstrumentation(frameMonitoringOptions));\n }\n\n // ANR detection (Android only)\n if (anrTracking && Platform.OS === 'android') {\n instrumentations.push(new ANRInstrumentation(anrOptions));\n }\n\n // Crash reporting\n if (enableCrashReporting) {\n instrumentations.push(new CrashReportingInstrumentation());\n }\n\n if (enableTracing) {\n try {\n const { TracingInstrumentation } = require('@grafana/faro-react-native-tracing');\n instrumentations.push(new TracingInstrumentation(tracingOptions));\n } catch {\n console.warn(\n '[Faro] enableTracing is true but @grafana/faro-react-native-tracing is not installed. ' +\n 'Add it to use tracing: yarn add @grafana/faro-react-native-tracing'\n );\n }\n }\n\n return instrumentations;\n}\n"]}
1
+ {"version":3,"file":"getRNInstrumentations.js","sourceRoot":"","sources":["../../../src/config/getRNInstrumentations.ts"],"names":[],"mappings":"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","sourcesContent":["import { Platform } from 'react-native';\n\nimport type { Instrumentation, Patterns } from '@grafana/faro-core';\n\nimport { ANRInstrumentation } from '../instrumentations/anr';\nimport { AppStateInstrumentation } from '../instrumentations/appState';\nimport { ConsoleInstrumentation } from '../instrumentations/console';\nimport { CrashReportingInstrumentation } from '../instrumentations/crashReporting';\nimport { ErrorsInstrumentation } from '../instrumentations/errors';\nimport { FrameMonitoringInstrumentation } from '../instrumentations/frameMonitoring';\nimport { HttpInstrumentation } from '../instrumentations/http';\nimport { PerformanceInstrumentation } from '../instrumentations/performance';\nimport { SessionInstrumentation } from '../instrumentations/session';\nimport { StartupInstrumentation } from '../instrumentations/startup';\nimport { UserActionInstrumentation } from '../instrumentations/userActions';\nimport { ViewInstrumentation } from '../instrumentations/view';\nimport { XHRInstrumentation } from '../instrumentations/xhr';\n\nimport type { ReactNativeConfig } from './types';\n\n/** Convert Patterns (string | RegExp)[] to RegExp[] for instrumentations that require RegExp[]. */\nfunction toRegExpArray(patterns: Patterns): RegExp[] {\n return patterns.map((p) => (typeof p === 'string' ? new RegExp(p.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')) : p));\n}\n\n/**\n * Returns the default set of instrumentations for React Native.\n *\n * Reads all options from the Faro config (single source of truth).\n * Property names are aligned with Flutter SDK FaroConfig:\n * - cpuUsageVitals, memoryUsageVitals, anrTracking, refreshRateVitals\n * - enableCrashReporting, enableErrorReporting\n * - fetchVitalsInterval, ignoreUrls\n *\n * @example\n * ```ts\n * const config: ReactNativeConfig = {\n * app: { name: 'my-app', version: '1.0.0' },\n * cpuUsageVitals: true,\n * memoryUsageVitals: true,\n * anrTracking: true,\n * refreshRateVitals: true,\n * enableCrashReporting: true,\n * fetchVitalsInterval: 30000,\n * instrumentations: getRNInstrumentations(config),\n * };\n * ```\n */\nexport function getRNInstrumentations(config: Partial<ReactNativeConfig> = {}): Instrumentation[] {\n // Aligned with Flutter SDK FaroConfig defaults\n const {\n // Error & crash tracking\n enableErrorReporting = true,\n enableCrashReporting = false,\n anrTracking = false,\n anrOptions = {},\n\n // Performance vitals\n cpuUsageVitals = true,\n memoryUsageVitals = true,\n refreshRateVitals = false,\n fetchVitalsInterval = 30000,\n frameMonitoringOptions = {},\n\n // Network\n ignoreUrls = [],\n enableHttpInstrumentation = {},\n\n // Console and user actions\n enableConsoleCapture = true,\n enableUserActions = true,\n\n // Tracing\n enableTracing = false,\n tracingOptions = {},\n } = config;\n\n const instrumentations: Instrumentation[] = [];\n\n // Error reporting (Flutter: enableFlutterErrorReporting)\n if (enableErrorReporting) {\n instrumentations.push(\n new ErrorsInstrumentation({\n releaseBundleFilename: config.releaseBundleFilename,\n })\n );\n }\n\n // Console capture - not in Flutter SDK, RN-specific\n if (enableConsoleCapture) {\n instrumentations.push(new ConsoleInstrumentation());\n }\n\n // Sessions - always enabled in Flutter, same here\n instrumentations.push(new SessionInstrumentation());\n\n // Views - always enabled in Flutter, same here\n instrumentations.push(new ViewInstrumentation());\n\n // App state - always enabled in Flutter, same here\n instrumentations.push(new AppStateInstrumentation());\n\n // User actions - enabled by default, opt-out via enableUserActions\n if (enableUserActions) {\n instrumentations.push(new UserActionInstrumentation());\n }\n\n // HTTP/XHR tracking: when tracing is enabled, TracingInstrumentation patches fetch and XHR.\n // When tracing is disabled, add HttpInstrumentation and/or XHRInstrumentation per enableHttpInstrumentation.\n if (!enableTracing) {\n const { fetch: enableFetch = true, xhr: enableXhr = true } = enableHttpInstrumentation;\n const ignoredUrlsRegExp = toRegExpArray(ignoreUrls);\n if (enableFetch) {\n instrumentations.push(new HttpInstrumentation({ ignoredUrls: ignoredUrlsRegExp }));\n }\n if (enableXhr) {\n instrumentations.push(new XHRInstrumentation({ ignoredUrls: ignoredUrlsRegExp }));\n }\n }\n\n // Performance vitals (CPU/memory) - only add if at least one metric is enabled\n if (cpuUsageVitals || memoryUsageVitals) {\n const perfInstrumentation = new PerformanceInstrumentation({\n memoryUsageVitals,\n cpuUsageVitals,\n fetchVitalsInterval,\n });\n instrumentations.push(perfInstrumentation);\n }\n\n // Startup tracking - always enabled\n instrumentations.push(new StartupInstrumentation());\n\n // Frame monitoring: enabled when refreshRateVitals is true\n // The instrumentation reads refreshRateVitals from faro.config (single source of truth)\n if (refreshRateVitals) {\n instrumentations.push(new FrameMonitoringInstrumentation(frameMonitoringOptions));\n }\n\n // ANR detection (Android only)\n if (anrTracking && Platform.OS === 'android') {\n instrumentations.push(new ANRInstrumentation(anrOptions));\n }\n\n // Crash reporting\n if (enableCrashReporting) {\n instrumentations.push(\n new CrashReportingInstrumentation({\n releaseBundleFilename: config.releaseBundleFilename,\n })\n );\n }\n\n if (enableTracing) {\n try {\n const { TracingInstrumentation } = require('@grafana/faro-react-native-tracing');\n instrumentations.push(new TracingInstrumentation(tracingOptions));\n } catch {\n console.warn(\n '[Faro] enableTracing is true but @grafana/faro-react-native-tracing is not installed. ' +\n 'Add it to use tracing: yarn add @grafana/faro-react-native-tracing'\n );\n }\n }\n\n return instrumentations;\n}\n"]}
@@ -1,7 +1,19 @@
1
+ var __rest = (this && this.__rest) || function (s, e) {
2
+ var t = {};
3
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
4
+ t[p] = s[p];
5
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
6
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
7
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
8
+ t[p[i]] = s[p[i]];
9
+ }
10
+ return t;
11
+ };
1
12
  import { defaultGlobalObjectKey, defaultUnpatchedConsole } from '@grafana/faro-core';
2
13
  import { getStackFramesFromError } from '../instrumentations/errors/stackTraceParser';
3
14
  import { defaultSessionTrackingConfig } from '../instrumentations/session/sessionManager/sessionConstants';
4
15
  import { InternalLoggerLevel, LogLevel } from '../internalLogger';
16
+ import { getMetroInjectedBundleId } from '../metas/appBuildIdentity';
5
17
  import { getPageMeta } from '../metas/page';
6
18
  import { getScreenMeta } from '../metas/screen';
7
19
  import { getSdkMeta } from '../metas/sdk';
@@ -10,6 +22,23 @@ import { FetchTransport } from '../transports/fetch';
10
22
  import { OfflineTransport } from '../transports/offline';
11
23
  import { getRNInstrumentations } from './getRNInstrumentations';
12
24
  const DEFAULT_OFFLINE_CACHE_MS = 3 * 24 * 60 * 60 * 1000; // 3 days
25
+ /**
26
+ * Resolves `meta.app.bundleId` when it is not already supplied by faro-core from
27
+ * the Metro preamble (`registerInitialMetas` / `__faroBundleId_<appName>`).
28
+ *
29
+ * Priority: explicit `config.app.bundleId` → Metro preamble (core) → DeviceInfo
30
+ * fallback (`applicationId@versionCode@versionName`, same shape Gradle/Metro use).
31
+ */
32
+ function resolveAppBundleId(configApp, appName, appSymbolsBundleId) {
33
+ if (configApp === null || configApp === void 0 ? void 0 : configApp.bundleId) {
34
+ return configApp.bundleId;
35
+ }
36
+ const metroId = getMetroInjectedBundleId(appName);
37
+ if (metroId) {
38
+ return metroId;
39
+ }
40
+ return appSymbolsBundleId;
41
+ }
13
42
  /**
14
43
  * Builds transports. FetchTransport is always added when url is provided.
15
44
  * User can enable offline and console via enableTransports.
@@ -59,22 +88,32 @@ function createParseStacktrace(releaseBundleFilename) {
59
88
  * Based on flags, builds instrumentations and transports automatically.
60
89
  * Client just enables what they need; makeRNConfig does the rest.
61
90
  *
62
- * @param preloadedSessionDeviceAttributes Device/session fields for session meta (passed from async `initializeFaro`).
91
+ * @param preloadedMobileMeta Device/session fields and structured mobile meta (passed from async `initializeFaro`).
92
+ * @param appSymbolsBundleId Encoded `meta.app.bundleId` for server-side symbol retrace.
63
93
  */
64
- export function makeRNConfig(config, preloadedSessionDeviceAttributes) {
65
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
66
- const defaultMetas = [getSdkMeta(), getPageMeta(), getScreenMeta()];
67
- const customMetas = (_a = config.metas) !== null && _a !== void 0 ? _a : [];
94
+ export function makeRNConfig(config, preloadedMobileMeta, appSymbolsBundleId) {
95
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
96
+ const _p = (_a = preloadedMobileMeta === null || preloadedMobileMeta === void 0 ? void 0 : preloadedMobileMeta.meta) !== null && _a !== void 0 ? _a : {}, { app: preloadedAppMeta } = _p, structuredMobileMeta = __rest(_p, ["app"]);
97
+ const mobileMetas = Object.keys(structuredMobileMeta).length > 0 ? [structuredMobileMeta] : [];
98
+ const defaultMetas = [getSdkMeta(), getPageMeta(), getScreenMeta(), ...mobileMetas];
99
+ const customMetas = (_b = config.metas) !== null && _b !== void 0 ? _b : [];
68
100
  const transports = buildTransports(config);
69
101
  const instrumentations = buildInstrumentations(config);
102
+ const installationId = (_c = config.app.installationId) !== null && _c !== void 0 ? _c : preloadedAppMeta === null || preloadedAppMeta === void 0 ? void 0 : preloadedAppMeta.installationId;
70
103
  const releaseBundleFilename = config.releaseBundleFilename;
71
- return Object.assign(Object.assign({ app: config.app }, (preloadedSessionDeviceAttributes != null && {
72
- preloadedSessionDeviceAttributes,
73
- })), { dedupe: (_b = config.dedupe) !== null && _b !== void 0 ? _b : true, globalObjectKey: (_c = config.globalObjectKey) !== null && _c !== void 0 ? _c : defaultGlobalObjectKey, internalLoggerLevel: (_d = config.internalLoggerLevel) !== null && _d !== void 0 ? _d : InternalLoggerLevel.ERROR, isolate: (_e = config.isolate) !== null && _e !== void 0 ? _e : false, parseStacktrace: (_f = config.parseStacktrace) !== null && _f !== void 0 ? _f : createParseStacktrace(releaseBundleFilename), paused: (_g = config.paused) !== null && _g !== void 0 ? _g : false, preventGlobalExposure: (_h = config.preventGlobalExposure) !== null && _h !== void 0 ? _h : false, unpatchedConsole: (_j = config.unpatchedConsole) !== null && _j !== void 0 ? _j : defaultUnpatchedConsole, batching: {
104
+ // Merge bundleId (from config, Metro, or DeviceInfo) with preloaded app meta
105
+ const bundleIdValue = resolveAppBundleId(config.app, (_d = config.app) === null || _d === void 0 ? void 0 : _d.name, appSymbolsBundleId);
106
+ const appMetasIfPresent = preloadedAppMeta || bundleIdValue
107
+ ? [{ app: Object.assign(Object.assign({}, preloadedAppMeta), (bundleIdValue && { bundleId: bundleIdValue })) }]
108
+ : [];
109
+ return Object.assign(Object.assign({ app: Object.assign(Object.assign({}, config.app), (installationId && { installationId })) }, (preloadedMobileMeta != null && {
110
+ preloadedMobileMeta: preloadedMobileMeta.meta,
111
+ preloadedSessionDeviceAttributes: preloadedMobileMeta.sessionAttributes,
112
+ })), { dedupe: (_e = config.dedupe) !== null && _e !== void 0 ? _e : true, globalObjectKey: (_f = config.globalObjectKey) !== null && _f !== void 0 ? _f : defaultGlobalObjectKey, internalLoggerLevel: (_g = config.internalLoggerLevel) !== null && _g !== void 0 ? _g : InternalLoggerLevel.ERROR, isolate: (_h = config.isolate) !== null && _h !== void 0 ? _h : false, parseStacktrace: (_j = config.parseStacktrace) !== null && _j !== void 0 ? _j : createParseStacktrace(releaseBundleFilename), paused: (_k = config.paused) !== null && _k !== void 0 ? _k : false, preventGlobalExposure: (_l = config.preventGlobalExposure) !== null && _l !== void 0 ? _l : false, unpatchedConsole: (_m = config.unpatchedConsole) !== null && _m !== void 0 ? _m : defaultUnpatchedConsole, batching: {
74
113
  enabled: false,
75
114
  sendTimeout: 250,
76
115
  itemLimit: 50,
77
- }, sessionTracking: Object.assign(Object.assign({}, defaultSessionTrackingConfig), config.sessionTracking), metas: [...defaultMetas, ...customMetas], instrumentations,
78
- transports, ignoreUrls: (_k = config.ignoreUrls) !== null && _k !== void 0 ? _k : [], ignoreErrors: config.ignoreErrors, beforeSend: config.beforeSend, preserveOriginalError: config.preserveOriginalError, userActionsInstrumentation: config.userActionsOptions, consoleInstrumentation: config.consoleCaptureOptions });
116
+ }, sessionTracking: Object.assign(Object.assign({}, defaultSessionTrackingConfig), config.sessionTracking), metas: [...defaultMetas, ...customMetas, ...appMetasIfPresent], instrumentations,
117
+ transports, ignoreUrls: (_o = config.ignoreUrls) !== null && _o !== void 0 ? _o : [], ignoreErrors: config.ignoreErrors, beforeSend: config.beforeSend, preserveOriginalError: config.preserveOriginalError, userActionsInstrumentation: config.userActionsOptions, consoleInstrumentation: config.consoleCaptureOptions });
79
118
  }
80
119
  //# sourceMappingURL=makeRNConfig.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"makeRNConfig.js","sourceRoot":"","sources":["../../../src/config/makeRNConfig.ts"],"names":[],"mappings":"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","sourcesContent":["import { defaultGlobalObjectKey, defaultUnpatchedConsole } from '@grafana/faro-core';\nimport type { Config } from '@grafana/faro-core';\n\nimport { getStackFramesFromError } from '../instrumentations/errors/stackTraceParser';\nimport type { SessionAttributes } from '../instrumentations/session/sessionAttributes';\nimport { defaultSessionTrackingConfig } from '../instrumentations/session/sessionManager/sessionConstants';\nimport { InternalLoggerLevel, LogLevel } from '../internalLogger';\nimport { getPageMeta } from '../metas/page';\nimport { getScreenMeta } from '../metas/screen';\nimport { getSdkMeta } from '../metas/sdk';\nimport { ConsoleTransport } from '../transports/console';\nimport { FetchTransport } from '../transports/fetch';\nimport { OfflineTransport } from '../transports/offline';\n\nimport { getRNInstrumentations } from './getRNInstrumentations';\nimport type { ReactNativeConfig, ReactNativeFullConfig } from './types';\n\nconst DEFAULT_OFFLINE_CACHE_MS = 3 * 24 * 60 * 60 * 1000; // 3 days\n\n/**\n * Builds transports. FetchTransport is always added when url is provided.\n * User can enable offline and console via enableTransports.\n */\nfunction buildTransports(config: ReactNativeConfig): Config['transports'] {\n const { enableTransports = { offline: false, console: false } } = config;\n\n if (!config.url) {\n throw new Error('url is required. Provide the Faro collector URL.');\n }\n\n const builtTransports: Config['transports'] = [];\n\n if (enableTransports.offline) {\n builtTransports.push(\n new OfflineTransport({\n maxCacheDurationMs: DEFAULT_OFFLINE_CACHE_MS,\n })\n );\n }\n\n builtTransports.push(\n new FetchTransport({\n url: config.url,\n apiKey: config.apiKey,\n })\n );\n\n if (enableTransports.console) {\n builtTransports.push(new ConsoleTransport({ level: LogLevel.DEBUG }));\n }\n\n const extraTransports = config.transports ?? [];\n return [...builtTransports, ...extraTransports];\n}\n\n/**\n * Builds instrumentations from config flags.\n */\nfunction buildInstrumentations(config: ReactNativeConfig): Config['instrumentations'] {\n const baseInstrumentations = getRNInstrumentations(config);\n const extraInstrumentations = config.instrumentations ?? [];\n return [...baseInstrumentations, ...extraInstrumentations];\n}\n\n/**\n * React Native stacktrace parser. Uses getStackFramesFromError for RN-specific formats.\n */\nfunction createParseStacktrace(releaseBundleFilename: string | undefined): Config['parseStacktrace'] {\n return (err) => ({\n frames: getStackFramesFromError(err, { releaseBundleFilename }),\n });\n}\n\n/**\n * Creates a full Faro config from React Native flag-based config.\n *\n * Based on flags, builds instrumentations and transports automatically.\n * Client just enables what they need; makeRNConfig does the rest.\n *\n * @param preloadedSessionDeviceAttributes Device/session fields for session meta (passed from async `initializeFaro`).\n */\nexport function makeRNConfig(\n config: ReactNativeConfig,\n preloadedSessionDeviceAttributes?: SessionAttributes\n): ReactNativeFullConfig {\n const defaultMetas = [getSdkMeta(), getPageMeta(), getScreenMeta()];\n const customMetas = config.metas ?? [];\n const transports = buildTransports(config);\n const instrumentations = buildInstrumentations(config);\n\n const releaseBundleFilename = config.releaseBundleFilename;\n return {\n app: config.app,\n ...(preloadedSessionDeviceAttributes != null && {\n preloadedSessionDeviceAttributes,\n }),\n dedupe: config.dedupe ?? true,\n globalObjectKey: config.globalObjectKey ?? defaultGlobalObjectKey,\n internalLoggerLevel: config.internalLoggerLevel ?? InternalLoggerLevel.ERROR,\n isolate: config.isolate ?? false,\n parseStacktrace: config.parseStacktrace ?? createParseStacktrace(releaseBundleFilename),\n paused: config.paused ?? false,\n preventGlobalExposure: config.preventGlobalExposure ?? false,\n unpatchedConsole: config.unpatchedConsole ?? defaultUnpatchedConsole,\n batching: {\n enabled: false,\n sendTimeout: 250,\n itemLimit: 50,\n },\n sessionTracking: {\n ...defaultSessionTrackingConfig,\n ...config.sessionTracking,\n },\n metas: [...defaultMetas, ...customMetas],\n instrumentations,\n transports,\n ignoreUrls: config.ignoreUrls ?? [],\n ignoreErrors: config.ignoreErrors,\n beforeSend: config.beforeSend,\n preserveOriginalError: config.preserveOriginalError,\n userActionsInstrumentation: config.userActionsOptions,\n consoleInstrumentation: config.consoleCaptureOptions,\n };\n}\n"]}
1
+ {"version":3,"file":"makeRNConfig.js","sourceRoot":"","sources":["../../../src/config/makeRNConfig.ts"],"names":[],"mappings":"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","sourcesContent":["import { defaultGlobalObjectKey, defaultUnpatchedConsole } from '@grafana/faro-core';\nimport type { Config, MetaApp } from '@grafana/faro-core';\n\nimport { getStackFramesFromError } from '../instrumentations/errors/stackTraceParser';\nimport type { PreloadedMobileMeta } from '../instrumentations/session/sessionAttributes';\nimport { defaultSessionTrackingConfig } from '../instrumentations/session/sessionManager/sessionConstants';\nimport { InternalLoggerLevel, LogLevel } from '../internalLogger';\nimport { getMetroInjectedBundleId } from '../metas/appBuildIdentity';\nimport { getPageMeta } from '../metas/page';\nimport { getScreenMeta } from '../metas/screen';\nimport { getSdkMeta } from '../metas/sdk';\nimport { ConsoleTransport } from '../transports/console';\nimport { FetchTransport } from '../transports/fetch';\nimport { OfflineTransport } from '../transports/offline';\n\nimport { getRNInstrumentations } from './getRNInstrumentations';\nimport type { ReactNativeConfig, ReactNativeFullConfig } from './types';\n\nconst DEFAULT_OFFLINE_CACHE_MS = 3 * 24 * 60 * 60 * 1000; // 3 days\n\n/**\n * Resolves `meta.app.bundleId` when it is not already supplied by faro-core from\n * the Metro preamble (`registerInitialMetas` / `__faroBundleId_<appName>`).\n *\n * Priority: explicit `config.app.bundleId` → Metro preamble (core) → DeviceInfo\n * fallback (`applicationId@versionCode@versionName`, same shape Gradle/Metro use).\n */\nfunction resolveAppBundleId(\n configApp: MetaApp | undefined,\n appName: string | undefined,\n appSymbolsBundleId?: string\n): string | undefined {\n if (configApp?.bundleId) {\n return configApp.bundleId;\n }\n const metroId = getMetroInjectedBundleId(appName);\n if (metroId) {\n return metroId;\n }\n return appSymbolsBundleId;\n}\n\n/**\n * Builds transports. FetchTransport is always added when url is provided.\n * User can enable offline and console via enableTransports.\n */\nfunction buildTransports(config: ReactNativeConfig): Config['transports'] {\n const { enableTransports = { offline: false, console: false } } = config;\n\n if (!config.url) {\n throw new Error('url is required. Provide the Faro collector URL.');\n }\n\n const builtTransports: Config['transports'] = [];\n\n if (enableTransports.offline) {\n builtTransports.push(\n new OfflineTransport({\n maxCacheDurationMs: DEFAULT_OFFLINE_CACHE_MS,\n })\n );\n }\n\n builtTransports.push(\n new FetchTransport({\n url: config.url,\n apiKey: config.apiKey,\n })\n );\n\n if (enableTransports.console) {\n builtTransports.push(new ConsoleTransport({ level: LogLevel.DEBUG }));\n }\n\n const extraTransports = config.transports ?? [];\n return [...builtTransports, ...extraTransports];\n}\n\n/**\n * Builds instrumentations from config flags.\n */\nfunction buildInstrumentations(config: ReactNativeConfig): Config['instrumentations'] {\n const baseInstrumentations = getRNInstrumentations(config);\n const extraInstrumentations = config.instrumentations ?? [];\n return [...baseInstrumentations, ...extraInstrumentations];\n}\n\n/**\n * React Native stacktrace parser. Uses getStackFramesFromError for RN-specific formats.\n */\nfunction createParseStacktrace(releaseBundleFilename: string | undefined): Config['parseStacktrace'] {\n return (err) => ({\n frames: getStackFramesFromError(err, { releaseBundleFilename }),\n });\n}\n\n/**\n * Creates a full Faro config from React Native flag-based config.\n *\n * Based on flags, builds instrumentations and transports automatically.\n * Client just enables what they need; makeRNConfig does the rest.\n *\n * @param preloadedMobileMeta Device/session fields and structured mobile meta (passed from async `initializeFaro`).\n * @param appSymbolsBundleId Encoded `meta.app.bundleId` for server-side symbol retrace.\n */\nexport function makeRNConfig(\n config: ReactNativeConfig,\n preloadedMobileMeta?: PreloadedMobileMeta,\n appSymbolsBundleId?: string\n): ReactNativeFullConfig {\n const { app: preloadedAppMeta, ...structuredMobileMeta } = preloadedMobileMeta?.meta ?? {};\n const mobileMetas = Object.keys(structuredMobileMeta).length > 0 ? [structuredMobileMeta] : [];\n const defaultMetas = [getSdkMeta(), getPageMeta(), getScreenMeta(), ...mobileMetas];\n const customMetas = config.metas ?? [];\n const transports = buildTransports(config);\n const instrumentations = buildInstrumentations(config);\n const installationId = config.app.installationId ?? preloadedAppMeta?.installationId;\n\n const releaseBundleFilename = config.releaseBundleFilename;\n // Merge bundleId (from config, Metro, or DeviceInfo) with preloaded app meta\n const bundleIdValue = resolveAppBundleId(config.app, config.app?.name, appSymbolsBundleId);\n const appMetasIfPresent =\n preloadedAppMeta || bundleIdValue\n ? [{ app: { ...preloadedAppMeta, ...(bundleIdValue && { bundleId: bundleIdValue }) } }]\n : [];\n\n return {\n app: {\n ...config.app,\n ...(installationId && { installationId }),\n },\n ...(preloadedMobileMeta != null && {\n preloadedMobileMeta: preloadedMobileMeta.meta,\n preloadedSessionDeviceAttributes: preloadedMobileMeta.sessionAttributes,\n }),\n dedupe: config.dedupe ?? true,\n globalObjectKey: config.globalObjectKey ?? defaultGlobalObjectKey,\n internalLoggerLevel: config.internalLoggerLevel ?? InternalLoggerLevel.ERROR,\n isolate: config.isolate ?? false,\n parseStacktrace: config.parseStacktrace ?? createParseStacktrace(releaseBundleFilename),\n paused: config.paused ?? false,\n preventGlobalExposure: config.preventGlobalExposure ?? false,\n unpatchedConsole: config.unpatchedConsole ?? defaultUnpatchedConsole,\n batching: {\n enabled: false,\n sendTimeout: 250,\n itemLimit: 50,\n },\n sessionTracking: {\n ...defaultSessionTrackingConfig,\n ...config.sessionTracking,\n },\n metas: [...defaultMetas, ...customMetas, ...appMetasIfPresent],\n instrumentations,\n transports,\n ignoreUrls: config.ignoreUrls ?? [],\n ignoreErrors: config.ignoreErrors,\n beforeSend: config.beforeSend,\n preserveOriginalError: config.preserveOriginalError,\n userActionsInstrumentation: config.userActionsOptions,\n consoleInstrumentation: config.consoleCaptureOptions,\n };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/config/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { Config } from '@grafana/faro-core';\n\nimport type { ANRInstrumentationOptions } from '../instrumentations/anr';\nimport type { FrameMonitoringOptions } from '../instrumentations/frameMonitoring';\nimport type { SessionAttributes } from '../instrumentations/session/sessionAttributes';\n\nimport type { Sampling } from './sampling';\n\n/**\n * React Native session tracking config.\n * Extends Config['sessionTracking'] with sampling (Flutter-style) and RN-specific props.\n * Excludes samplingRate and sampler in favor of sampling.\n *\n * When `persistent` is true, sessions are stored with [react-native-mmkv](https://github.com/mrousavy/react-native-mmkv)\n * (synchronous). Add `react-native-mmkv` to your app and rebuild native projects.\n */\nexport type ReactNativeSessionTrackingConfig = Omit<\n NonNullable<Config['sessionTracking']>,\n 'samplingRate' | 'sampler'\n> & {\n /**\n * Session sampling. Use {@link SamplingRate} for fixed rate or\n * {@link SamplingFunction} for dynamic sampling.\n */\n sampling?: Sampling;\n};\n\n/**\n * Flags for enabling optional built-in transports.\n * FetchTransport is always instantiated when url is provided.\n */\nexport interface EnableTransportsConfig {\n /** Enable OfflineTransport for caching when offline (default: false) */\n offline?: boolean;\n /** Enable ConsoleTransport to log telemetry to Metro console for debugging (default: false) */\n console?: boolean;\n}\n\n/** RN-specific config: overrides + new props. Omit faro-core props we replace with RN equivalents. */\ntype ReactNativeConfigOverrides = {\n /** Application metadata (required) */\n app: Config['app'];\n sessionTracking?: ReactNativeSessionTrackingConfig;\n url?: string;\n apiKey?: string;\n enableTransports?: EnableTransportsConfig;\n /**\n * Which HTTP instrumentations to enable. When tracing is disabled, these control\n * HttpInstrumentation (fetch) and XHRInstrumentation (xhr). Default: both true.\n */\n enableHttpInstrumentation?: {\n /** HttpInstrumentation - patches fetch API (default: true) */\n fetch?: boolean;\n /** XHRInstrumentation - patches XMLHttpRequest (default: true) */\n xhr?: boolean;\n };\n enableTracing?: boolean;\n /** Passed to TracingInstrumentation. See TracingInstrumentationOptions in @grafana/faro-react-native-tracing. */\n tracingOptions?: Record<string, unknown>;\n cpuUsageVitals?: boolean;\n memoryUsageVitals?: boolean;\n refreshRateVitals?: boolean;\n fetchVitalsInterval?: number;\n frameMonitoringOptions?: FrameMonitoringOptions;\n enableErrorReporting?: boolean;\n enableCrashReporting?: boolean;\n anrTracking?: boolean;\n anrOptions?: ANRInstrumentationOptions;\n enableConsoleCapture?: boolean;\n consoleCaptureOptions?: Config['consoleInstrumentation'];\n enableUserActions?: boolean;\n userActionsOptions?: Config['userActionsInstrumentation'];\n /**\n * Hermes / minified release stack lines omit a file path. This must match the Metro plugin\n * source map top-level `file` (default `bundle.js`, or your `sourceMapFile` option there).\n */\n releaseBundleFilename?: string;\n};\n\n/**\n * React Native config: Config (omit replaced props) & overrides.\n * Omit: sessionTracking, consoleInstrumentation, userActionsInstrumentation.\n * instrumentations and transports inherited from Config for extras (built-ins come from flags).\n */\nexport type ReactNativeConfig = Partial<\n Omit<Config, 'sessionTracking' | 'consoleInstrumentation' | 'userActionsInstrumentation'>\n> &\n ReactNativeConfigOverrides;\n\n/**\n * Internal full config returned by `makeRNConfig`.\n * Extends faro-core `Config` with RN-specific fields that instrumentations need at init time.\n */\nexport type ReactNativeFullConfig = Config & {\n preloadedSessionDeviceAttributes?: SessionAttributes;\n};\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/config/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { Config } from '@grafana/faro-core';\n\nimport type { ANRInstrumentationOptions } from '../instrumentations/anr';\nimport type { FrameMonitoringOptions } from '../instrumentations/frameMonitoring';\nimport type { PreloadedMobileMeta, SessionAttributes } from '../instrumentations/session/sessionAttributes';\n\nimport type { Sampling } from './sampling';\n\n/**\n * React Native session tracking config.\n * Extends Config['sessionTracking'] with sampling (Flutter-style) and RN-specific props.\n * Excludes samplingRate and sampler in favor of sampling.\n *\n * When `persistent` is true, sessions are stored with [react-native-mmkv](https://github.com/mrousavy/react-native-mmkv)\n * (synchronous). Add `react-native-mmkv` to your app and rebuild native projects.\n */\nexport type ReactNativeSessionTrackingConfig = Omit<\n NonNullable<Config['sessionTracking']>,\n 'samplingRate' | 'sampler'\n> & {\n /**\n * Session sampling. Use {@link SamplingRate} for fixed rate or\n * {@link SamplingFunction} for dynamic sampling.\n */\n sampling?: Sampling;\n};\n\n/**\n * Flags for enabling optional built-in transports.\n * FetchTransport is always instantiated when url is provided.\n */\nexport interface EnableTransportsConfig {\n /** Enable OfflineTransport for caching when offline (default: false) */\n offline?: boolean;\n /** Enable ConsoleTransport to log telemetry to Metro console for debugging (default: false) */\n console?: boolean;\n}\n\n/** RN-specific config: overrides + new props. Omit faro-core props we replace with RN equivalents. */\ntype ReactNativeConfigOverrides = {\n /** Application metadata (required) */\n app: Config['app'];\n sessionTracking?: ReactNativeSessionTrackingConfig;\n url?: string;\n apiKey?: string;\n enableTransports?: EnableTransportsConfig;\n /**\n * Which HTTP instrumentations to enable. When tracing is disabled, these control\n * HttpInstrumentation (fetch) and XHRInstrumentation (xhr). Default: both true.\n */\n enableHttpInstrumentation?: {\n /** HttpInstrumentation - patches fetch API (default: true) */\n fetch?: boolean;\n /** XHRInstrumentation - patches XMLHttpRequest (default: true) */\n xhr?: boolean;\n };\n enableTracing?: boolean;\n /** Passed to TracingInstrumentation. See TracingInstrumentationOptions in @grafana/faro-react-native-tracing. */\n tracingOptions?: Record<string, unknown>;\n cpuUsageVitals?: boolean;\n memoryUsageVitals?: boolean;\n refreshRateVitals?: boolean;\n fetchVitalsInterval?: number;\n frameMonitoringOptions?: FrameMonitoringOptions;\n enableErrorReporting?: boolean;\n enableCrashReporting?: boolean;\n anrTracking?: boolean;\n anrOptions?: ANRInstrumentationOptions;\n enableConsoleCapture?: boolean;\n consoleCaptureOptions?: Config['consoleInstrumentation'];\n enableUserActions?: boolean;\n userActionsOptions?: Config['userActionsInstrumentation'];\n /**\n * Hermes / minified release stack lines omit a file path. This must match the Metro plugin\n * source map top-level `file` (default `bundle.js`, or your `sourceMapFile` option there).\n */\n releaseBundleFilename?: string;\n};\n\n/**\n * React Native config: Config (omit replaced props) & overrides.\n * Omit: sessionTracking, consoleInstrumentation, userActionsInstrumentation.\n * instrumentations and transports inherited from Config for extras (built-ins come from flags).\n */\nexport type ReactNativeConfig = Partial<\n Omit<Config, 'sessionTracking' | 'consoleInstrumentation' | 'userActionsInstrumentation'>\n> &\n ReactNativeConfigOverrides;\n\n/**\n * Internal full config returned by `makeRNConfig`.\n * Extends faro-core `Config` with RN-specific fields that instrumentations need at init time.\n */\nexport type ReactNativeFullConfig = Config & {\n preloadedMobileMeta?: PreloadedMobileMeta['meta'];\n preloadedSessionDeviceAttributes?: SessionAttributes;\n};\n"]}
@@ -2,5 +2,5 @@
2
2
  * NPM package identity for this build. Generated by scripts/sync-faro-rn-package-meta.mjs - do not edit.
3
3
  */
4
4
  export const FARO_REACT_NATIVE_NPM_NAME = '@grafana/faro-react-native';
5
- export const FARO_REACT_NATIVE_NPM_VERSION = '1.2.1';
5
+ export const FARO_REACT_NATIVE_NPM_VERSION = '1.3.0';
6
6
  //# sourceMappingURL=faroRNPackageMeta.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"faroRNPackageMeta.js","sourceRoot":"","sources":["../../../src/generated/faroRNPackageMeta.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,4BAAqC,CAAC;AAChF,MAAM,CAAC,MAAM,6BAA6B,GAAG,OAAgB,CAAC","sourcesContent":["/**\n * NPM package identity for this build. Generated by scripts/sync-faro-rn-package-meta.mjs - do not edit.\n */\nexport const FARO_REACT_NATIVE_NPM_NAME = '@grafana/faro-react-native' as const;\nexport const FARO_REACT_NATIVE_NPM_VERSION = '1.2.1' as const;\n"]}
1
+ {"version":3,"file":"faroRNPackageMeta.js","sourceRoot":"","sources":["../../../src/generated/faroRNPackageMeta.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,4BAAqC,CAAC;AAChF,MAAM,CAAC,MAAM,6BAA6B,GAAG,OAAgB,CAAC","sourcesContent":["/**\n * NPM package identity for this build. Generated by scripts/sync-faro-rn-package-meta.mjs - do not edit.\n */\nexport const FARO_REACT_NATIVE_NPM_NAME = '@grafana/faro-react-native' as const;\nexport const FARO_REACT_NATIVE_NPM_VERSION = '1.3.0' as const;\n"]}
package/dist/esm/index.js CHANGED
@@ -12,7 +12,7 @@ export { getRNInstrumentations } from './config/getRNInstrumentations';
12
12
  export { ErrorMechanism, ErrorsInstrumentation } from './instrumentations/errors';
13
13
  export { ConsoleInstrumentation } from './instrumentations/console';
14
14
  export { SessionInstrumentation } from './instrumentations/session';
15
- export { getSessionAttributes, loadSessionDeviceAttributesForInit, minimalSessionDeviceAttributes, } from './instrumentations/session/sessionAttributes';
15
+ export { getSessionAttributes, loadMobileMetaForInit, loadSessionDeviceAttributesForInit, minimalSessionDeviceAttributes, } from './instrumentations/session/sessionAttributes';
16
16
  export { ViewInstrumentation } from './instrumentations/view';
17
17
  export { AppStateInstrumentation } from './instrumentations/appState';
18
18
  export { UserActionInstrumentation } from './instrumentations/userActions';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,kDAAkD;AAClD,mFAAmF;AACnF,OAAO,EAAE,gCAAgC,EAAE,MAAM,oCAAoC,CAAC;AACtF,gCAAgC,EAAE,CAAC;AACnC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAK1C,4CAA4C;AAC5C,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAuC,MAAM,mBAAmB,CAAC;AAExG,iCAAiC;AACjC,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAEvE,0BAA0B;AAC1B,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAElF,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EACL,oBAAoB,EACpB,kCAAkC,EAClC,8BAA8B,GAC/B,MAAM,8CAA8C,CAAC;AAEtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,0BAA0B,EAAE,MAAM,gCAAgC,CAAC;AAE5E,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAEpE,OAAO,EAAE,8BAA8B,EAAE,MAAM,oCAAoC,CAAC;AAEpF,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE5D,OAAO,EAAE,6BAA6B,EAAE,MAAM,mCAAmC,CAAC;AAGlF,2BAA2B;AAC3B,OAAO,EAAE,4BAA4B,EAAE,MAAM,kCAAkC,CAAC;AAEhF,6BAA6B;AAC7B,OAAO,EACL,kBAAkB,EAClB,eAAe,GAEhB,MAAM,mDAAmD,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,MAAM,mDAAmD,CAAC;AAGjH,wBAAwB;AACxB,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AAO9E,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,oBAAoB;AACpB,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAExD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAGxD,gCAAgC;AAChC,OAAO,EACL,0BAA0B,EAC1B,uBAAuB,EACvB,8BAA8B,EAC9B,uBAAuB,GACxB,MAAM,kBAAkB,CAAC;AAG1B,0BAA0B;AAC1B,OAAO,EACL,qBAAqB,EACrB,kBAAkB,EAClB,yBAAyB,EACzB,kBAAkB,GACnB,MAAM,mBAAmB,CAAC;AAG3B,8BAA8B;AAC9B,OAAO,EAAE,gCAAgC,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EACL,iBAAiB,EACjB,kCAAkC,EAClC,eAAe,EACf,YAAY,EACZ,uBAAuB,GACxB,MAAM,cAAc,CAAC;AAgBtB,oGAAoG;AACpG,OAAO,EAAE,QAAQ,EAAE,mBAAmB,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC","sourcesContent":["// Main entry point for @grafana/faro-react-native\n// Apply PerformanceObserver polyfill first to prevent iOS bad_variant_access crash\nimport { applyPerformanceObserverPolyfill } from './util/performanceObserverPolyfill';\napplyPerformanceObserverPolyfill();\nexport { initializeFaro } from './initialize';\nexport { faro } from '@grafana/faro-core';\n\n// Export types\nexport type { EnableTransportsConfig, ReactNativeConfig, ReactNativeSessionTrackingConfig } from './config/types';\n\n// Export sampling (Flutter-style interface)\nexport { SamplingFunction, SamplingRate, type Sampling, type SamplingContext } from './config/sampling';\n\n// Export instrumentation helpers\nexport { getRNInstrumentations } from './config/getRNInstrumentations';\n\n// Export instrumentations\nexport { ErrorMechanism, ErrorsInstrumentation } from './instrumentations/errors';\nexport type { ErrorMechanismType, ErrorsInstrumentationOptions } from './instrumentations/errors';\nexport { ConsoleInstrumentation } from './instrumentations/console';\nexport { SessionInstrumentation } from './instrumentations/session';\nexport {\n getSessionAttributes,\n loadSessionDeviceAttributesForInit,\n minimalSessionDeviceAttributes,\n} from './instrumentations/session/sessionAttributes';\nexport type { SessionAttributes } from './instrumentations/session/sessionAttributes';\nexport { ViewInstrumentation } from './instrumentations/view';\nexport { AppStateInstrumentation } from './instrumentations/appState';\nexport { UserActionInstrumentation } from './instrumentations/userActions';\nexport { HttpInstrumentation } from './instrumentations/http';\nexport { XHRInstrumentation } from './instrumentations/xhr';\nexport { PerformanceInstrumentation } from './instrumentations/performance';\nexport type { PerformanceInstrumentationOptions } from './instrumentations/performance/types';\nexport { StartupInstrumentation } from './instrumentations/startup';\nexport type { StartupInstrumentationOptions } from './instrumentations/startup/types';\nexport { FrameMonitoringInstrumentation } from './instrumentations/frameMonitoring';\nexport type { FrameMonitoringOptions } from './instrumentations/frameMonitoring';\nexport { ANRInstrumentation } from './instrumentations/anr';\nexport type { ANRInstrumentationOptions } from './instrumentations/anr';\nexport { CrashReportingInstrumentation } from './instrumentations/crashReporting';\nexport type { CrashReportingOptions } from './instrumentations/crashReporting';\n\n// Export console utilities\nexport { reactNativeLogArgsSerializer } from './instrumentations/console/utils';\n\n// Export user action helpers\nexport {\n withFaroUserAction,\n trackUserAction,\n type WithFaroUserActionProps,\n} from './instrumentations/userActions/withFaroUserAction';\nexport { notifyHttpRequestEnd, notifyHttpRequestStart } from './instrumentations/userActions/httpRequestMonitor';\nexport type { HttpRequestMessagePayload } from './instrumentations/userActions/httpRequestMonitor';\n\n// Export error boundary\nexport { FaroErrorBoundary } from './errorBoundary/FaroErrorBoundary';\nexport { withFaroErrorBoundary } from './errorBoundary/withFaroErrorBoundary';\nexport type {\n FaroErrorBoundaryProps,\n FaroErrorBoundaryState,\n FaroErrorBoundaryFallbackRender,\n} from './errorBoundary/types';\n\n// Export metas\nexport { getPageMeta } from './metas/page';\nexport { getScreenMeta } from './metas/screen';\nexport { getSdkMeta } from './metas/sdk';\n\n// Export transports\nexport { FetchTransport } from './transports/fetch';\nexport { ConsoleTransport } from './transports/console';\nexport type { ConsoleTransportOptions } from './transports/console';\nexport { OfflineTransport } from './transports/offline';\nexport type { OfflineTransportOptions } from './transports/offline';\n\n// Export data collection policy\nexport {\n createDataCollectionPolicy,\n getDataCollectionPolicy,\n initializeDataCollectionPolicy,\n setDataCollectionPolicy,\n} from './dataCollection';\nexport type { DataCollectionPolicy, DataCollectionPolicyOptions } from './dataCollection';\n\n// Export user persistence\nexport {\n createUserPersistence,\n getUserPersistence,\n initializeUserPersistence,\n setUserPersistence,\n} from './userPersistence';\nexport type { UserPersistence, UserPersistenceOptions } from './userPersistence';\n\n// Export navigation utilities\nexport { ReactNativeNavigationIntegration } from './navigation/v6';\nexport {\n useFaroNavigation,\n createNavigationStateChangeHandler,\n getCurrentRoute,\n getRouteName,\n onNavigationStateChange,\n} from './navigation';\nexport type { ReactNavigationDependencies, ReactNavigationConfig } from './navigation/types';\n\n// Re-export core types and enums that consumers will need\nexport type {\n Config,\n Faro,\n Instrumentation,\n Meta,\n Transport,\n PushErrorOptions,\n PushEventOptions,\n PushLogOptions,\n PushMeasurementOptions,\n} from '@grafana/faro-core';\n\n// Export LogLevel and InternalLoggerLevel from our local copy (avoid bundling faro-core's web code)\nexport { LogLevel, InternalLoggerLevel, allLogLevels, defaultLogLevel } from './internalLogger';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,kDAAkD;AAClD,mFAAmF;AACnF,OAAO,EAAE,gCAAgC,EAAE,MAAM,oCAAoC,CAAC;AACtF,gCAAgC,EAAE,CAAC;AACnC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAK1C,4CAA4C;AAC5C,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAuC,MAAM,mBAAmB,CAAC;AAExG,iCAAiC;AACjC,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAEvE,0BAA0B;AAC1B,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAElF,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,kCAAkC,EAClC,8BAA8B,GAC/B,MAAM,8CAA8C,CAAC;AAEtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,0BAA0B,EAAE,MAAM,gCAAgC,CAAC;AAE5E,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAEpE,OAAO,EAAE,8BAA8B,EAAE,MAAM,oCAAoC,CAAC;AAEpF,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE5D,OAAO,EAAE,6BAA6B,EAAE,MAAM,mCAAmC,CAAC;AAGlF,2BAA2B;AAC3B,OAAO,EAAE,4BAA4B,EAAE,MAAM,kCAAkC,CAAC;AAEhF,6BAA6B;AAC7B,OAAO,EACL,kBAAkB,EAClB,eAAe,GAEhB,MAAM,mDAAmD,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,MAAM,mDAAmD,CAAC;AAGjH,wBAAwB;AACxB,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AAO9E,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,oBAAoB;AACpB,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAExD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAGxD,gCAAgC;AAChC,OAAO,EACL,0BAA0B,EAC1B,uBAAuB,EACvB,8BAA8B,EAC9B,uBAAuB,GACxB,MAAM,kBAAkB,CAAC;AAG1B,0BAA0B;AAC1B,OAAO,EACL,qBAAqB,EACrB,kBAAkB,EAClB,yBAAyB,EACzB,kBAAkB,GACnB,MAAM,mBAAmB,CAAC;AAG3B,8BAA8B;AAC9B,OAAO,EAAE,gCAAgC,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EACL,iBAAiB,EACjB,kCAAkC,EAClC,eAAe,EACf,YAAY,EACZ,uBAAuB,GACxB,MAAM,cAAc,CAAC;AAgBtB,oGAAoG;AACpG,OAAO,EAAE,QAAQ,EAAE,mBAAmB,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC","sourcesContent":["// Main entry point for @grafana/faro-react-native\n// Apply PerformanceObserver polyfill first to prevent iOS bad_variant_access crash\nimport { applyPerformanceObserverPolyfill } from './util/performanceObserverPolyfill';\napplyPerformanceObserverPolyfill();\nexport { initializeFaro } from './initialize';\nexport { faro } from '@grafana/faro-core';\n\n// Export types\nexport type { EnableTransportsConfig, ReactNativeConfig, ReactNativeSessionTrackingConfig } from './config/types';\n\n// Export sampling (Flutter-style interface)\nexport { SamplingFunction, SamplingRate, type Sampling, type SamplingContext } from './config/sampling';\n\n// Export instrumentation helpers\nexport { getRNInstrumentations } from './config/getRNInstrumentations';\n\n// Export instrumentations\nexport { ErrorMechanism, ErrorsInstrumentation } from './instrumentations/errors';\nexport type { ErrorMechanismType, ErrorsInstrumentationOptions } from './instrumentations/errors';\nexport { ConsoleInstrumentation } from './instrumentations/console';\nexport { SessionInstrumentation } from './instrumentations/session';\nexport {\n getSessionAttributes,\n loadMobileMetaForInit,\n loadSessionDeviceAttributesForInit,\n minimalSessionDeviceAttributes,\n} from './instrumentations/session/sessionAttributes';\nexport type { PreloadedMobileMeta, SessionAttributes } from './instrumentations/session/sessionAttributes';\nexport { ViewInstrumentation } from './instrumentations/view';\nexport { AppStateInstrumentation } from './instrumentations/appState';\nexport { UserActionInstrumentation } from './instrumentations/userActions';\nexport { HttpInstrumentation } from './instrumentations/http';\nexport { XHRInstrumentation } from './instrumentations/xhr';\nexport { PerformanceInstrumentation } from './instrumentations/performance';\nexport type { PerformanceInstrumentationOptions } from './instrumentations/performance/types';\nexport { StartupInstrumentation } from './instrumentations/startup';\nexport type { StartupInstrumentationOptions } from './instrumentations/startup/types';\nexport { FrameMonitoringInstrumentation } from './instrumentations/frameMonitoring';\nexport type { FrameMonitoringOptions } from './instrumentations/frameMonitoring';\nexport { ANRInstrumentation } from './instrumentations/anr';\nexport type { ANRInstrumentationOptions } from './instrumentations/anr';\nexport { CrashReportingInstrumentation } from './instrumentations/crashReporting';\nexport type { CrashReportingOptions } from './instrumentations/crashReporting';\n\n// Export console utilities\nexport { reactNativeLogArgsSerializer } from './instrumentations/console/utils';\n\n// Export user action helpers\nexport {\n withFaroUserAction,\n trackUserAction,\n type WithFaroUserActionProps,\n} from './instrumentations/userActions/withFaroUserAction';\nexport { notifyHttpRequestEnd, notifyHttpRequestStart } from './instrumentations/userActions/httpRequestMonitor';\nexport type { HttpRequestMessagePayload } from './instrumentations/userActions/httpRequestMonitor';\n\n// Export error boundary\nexport { FaroErrorBoundary } from './errorBoundary/FaroErrorBoundary';\nexport { withFaroErrorBoundary } from './errorBoundary/withFaroErrorBoundary';\nexport type {\n FaroErrorBoundaryProps,\n FaroErrorBoundaryState,\n FaroErrorBoundaryFallbackRender,\n} from './errorBoundary/types';\n\n// Export metas\nexport { getPageMeta } from './metas/page';\nexport { getScreenMeta } from './metas/screen';\nexport { getSdkMeta } from './metas/sdk';\n\n// Export transports\nexport { FetchTransport } from './transports/fetch';\nexport { ConsoleTransport } from './transports/console';\nexport type { ConsoleTransportOptions } from './transports/console';\nexport { OfflineTransport } from './transports/offline';\nexport type { OfflineTransportOptions } from './transports/offline';\n\n// Export data collection policy\nexport {\n createDataCollectionPolicy,\n getDataCollectionPolicy,\n initializeDataCollectionPolicy,\n setDataCollectionPolicy,\n} from './dataCollection';\nexport type { DataCollectionPolicy, DataCollectionPolicyOptions } from './dataCollection';\n\n// Export user persistence\nexport {\n createUserPersistence,\n getUserPersistence,\n initializeUserPersistence,\n setUserPersistence,\n} from './userPersistence';\nexport type { UserPersistence, UserPersistenceOptions } from './userPersistence';\n\n// Export navigation utilities\nexport { ReactNativeNavigationIntegration } from './navigation/v6';\nexport {\n useFaroNavigation,\n createNavigationStateChangeHandler,\n getCurrentRoute,\n getRouteName,\n onNavigationStateChange,\n} from './navigation';\nexport type { ReactNavigationDependencies, ReactNavigationConfig } from './navigation/types';\n\n// Re-export core types and enums that consumers will need\nexport type {\n Config,\n Faro,\n Instrumentation,\n Meta,\n Transport,\n PushErrorOptions,\n PushEventOptions,\n PushLogOptions,\n PushMeasurementOptions,\n} from '@grafana/faro-core';\n\n// Export LogLevel and InternalLoggerLevel from our local copy (avoid bundling faro-core's web code)\nexport { LogLevel, InternalLoggerLevel, allLogLevels, defaultLogLevel } from './internalLogger';\n"]}
@@ -9,15 +9,21 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
9
9
  };
10
10
  import { initializeFaro as initializeFaroCore } from '@grafana/faro-core';
11
11
  import { makeRNConfig } from './config/makeRNConfig';
12
- import { loadSessionDeviceAttributesForInit } from './instrumentations/session/sessionAttributes';
12
+ import { loadMobileMetaForInit } from './instrumentations/session/sessionAttributes';
13
+ import { loadAppSymbolsBundleIdForInit } from './metas/appBuildIdentity';
13
14
  /**
14
- * Awaits async device/session attribute collection, then initializes Faro with core `initializeFaro`.
15
- * On failure during collection, uses `minimalSessionDeviceAttributes` before init.
15
+ * Awaits async device/session attribute collection and the build identity used
16
+ * for server-side symbol retrace, then initializes Faro with core
17
+ * `initializeFaro`. On failure during collection, uses
18
+ * `minimalSessionDeviceAttributes` / an empty build identity before init.
16
19
  */
17
20
  export function initializeFaro(config) {
18
21
  return __awaiter(this, void 0, void 0, function* () {
19
- const preloadedSessionDeviceAttributes = yield loadSessionDeviceAttributesForInit();
20
- const fullConfig = makeRNConfig(config, preloadedSessionDeviceAttributes);
22
+ const [preloadedMobileMeta, appSymbolsBundleId] = yield Promise.all([
23
+ loadMobileMetaForInit(),
24
+ loadAppSymbolsBundleIdForInit(),
25
+ ]);
26
+ const fullConfig = makeRNConfig(config, preloadedMobileMeta, appSymbolsBundleId);
21
27
  return initializeFaroCore(fullConfig);
22
28
  });
23
29
  }
@@ -1 +1 @@
1
- {"version":3,"file":"initialize.js","sourceRoot":"","sources":["../../src/initialize.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAa,cAAc,IAAI,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAErF,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD,OAAO,EAAE,kCAAkC,EAAE,MAAM,8CAA8C,CAAC;AAElG;;;GAGG;AACH,MAAM,UAAgB,cAAc,CAAC,MAAyB;;QAC5D,MAAM,gCAAgC,GAAG,MAAM,kCAAkC,EAAE,CAAC;QACpF,MAAM,UAAU,GAAG,YAAY,CAAC,MAAM,EAAE,gCAAgC,CAAC,CAAC;QAC1E,OAAO,kBAAkB,CAAC,UAAU,CAAC,CAAC;IACxC,CAAC;CAAA","sourcesContent":["import { type Faro, initializeFaro as initializeFaroCore } from '@grafana/faro-core';\n\nimport { makeRNConfig } from './config/makeRNConfig';\nimport type { ReactNativeConfig } from './config/types';\nimport { loadSessionDeviceAttributesForInit } from './instrumentations/session/sessionAttributes';\n\n/**\n * Awaits async device/session attribute collection, then initializes Faro with core `initializeFaro`.\n * On failure during collection, uses `minimalSessionDeviceAttributes` before init.\n */\nexport async function initializeFaro(config: ReactNativeConfig): Promise<Faro> {\n const preloadedSessionDeviceAttributes = await loadSessionDeviceAttributesForInit();\n const fullConfig = makeRNConfig(config, preloadedSessionDeviceAttributes);\n return initializeFaroCore(fullConfig);\n}\n"]}
1
+ {"version":3,"file":"initialize.js","sourceRoot":"","sources":["../../src/initialize.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAa,cAAc,IAAI,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAErF,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD,OAAO,EAAE,qBAAqB,EAAE,MAAM,8CAA8C,CAAC;AACrF,OAAO,EAAE,6BAA6B,EAAE,MAAM,0BAA0B,CAAC;AAEzE;;;;;GAKG;AACH,MAAM,UAAgB,cAAc,CAAC,MAAyB;;QAC5D,MAAM,CAAC,mBAAmB,EAAE,kBAAkB,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAClE,qBAAqB,EAAE;YACvB,6BAA6B,EAAE;SAChC,CAAC,CAAC;QACH,MAAM,UAAU,GAAG,YAAY,CAAC,MAAM,EAAE,mBAAmB,EAAE,kBAAkB,CAAC,CAAC;QACjF,OAAO,kBAAkB,CAAC,UAAU,CAAC,CAAC;IACxC,CAAC;CAAA","sourcesContent":["import { type Faro, initializeFaro as initializeFaroCore } from '@grafana/faro-core';\n\nimport { makeRNConfig } from './config/makeRNConfig';\nimport type { ReactNativeConfig } from './config/types';\nimport { loadMobileMetaForInit } from './instrumentations/session/sessionAttributes';\nimport { loadAppSymbolsBundleIdForInit } from './metas/appBuildIdentity';\n\n/**\n * Awaits async device/session attribute collection and the build identity used\n * for server-side symbol retrace, then initializes Faro with core\n * `initializeFaro`. On failure during collection, uses\n * `minimalSessionDeviceAttributes` / an empty build identity before init.\n */\nexport async function initializeFaro(config: ReactNativeConfig): Promise<Faro> {\n const [preloadedMobileMeta, appSymbolsBundleId] = await Promise.all([\n loadMobileMetaForInit(),\n loadAppSymbolsBundleIdForInit(),\n ]);\n const fullConfig = makeRNConfig(config, preloadedMobileMeta, appSymbolsBundleId);\n return initializeFaroCore(fullConfig);\n}\n"]}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Returns true when an ANR stack was sampled on the crash-killer path instead of
3
+ * the blocked main thread (common when ANRTracker fires during process teardown).
4
+ *
5
+ * Uses only Android framework and Faro SDK frame names — no app-specific identifiers.
6
+ */
7
+ export function isInvalidAnrCaptureStack(stack) {
8
+ if (!(stack === null || stack === void 0 ? void 0 : stack.trim())) {
9
+ return true;
10
+ }
11
+ const normalized = stack.toLowerCase();
12
+ return (normalized.includes('handleapplicationcrash') ||
13
+ normalized.includes('killapplicationhandler') ||
14
+ normalized.includes('farouncaughtexceptionhandler'));
15
+ }
16
+ //# sourceMappingURL=anrStack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anrStack.js","sourceRoot":"","sources":["../../../../src/instrumentations/anr/anrStack.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,UAAU,wBAAwB,CAAC,KAAyB;IAChE,IAAI,CAAC,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,IAAI,EAAE,CAAA,EAAE,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IAEvC,OAAO,CACL,UAAU,CAAC,QAAQ,CAAC,wBAAwB,CAAC;QAC7C,UAAU,CAAC,QAAQ,CAAC,wBAAwB,CAAC;QAC7C,UAAU,CAAC,QAAQ,CAAC,8BAA8B,CAAC,CACpD,CAAC;AACJ,CAAC","sourcesContent":["/**\n * Returns true when an ANR stack was sampled on the crash-killer path instead of\n * the blocked main thread (common when ANRTracker fires during process teardown).\n *\n * Uses only Android framework and Faro SDK frame names — no app-specific identifiers.\n */\nexport function isInvalidAnrCaptureStack(stack: string | undefined): boolean {\n if (!stack?.trim()) {\n return true;\n }\n\n const normalized = stack.toLowerCase();\n\n return (\n normalized.includes('handleapplicationcrash') ||\n normalized.includes('killapplicationhandler') ||\n normalized.includes('farouncaughtexceptionhandler')\n );\n}\n"]}