@nathanclaire/edge-telemetry-sdk 3.0.0 → 4.0.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 (298) hide show
  1. package/README.md +831 -186
  2. package/dist/appLifecycle-CECgRVu_.cjs +2 -0
  3. package/dist/appLifecycle-CECgRVu_.cjs.map +1 -0
  4. package/dist/appLifecycle-DQErzJIR.js +22 -0
  5. package/dist/appLifecycle-DQErzJIR.js.map +1 -0
  6. package/dist/batch-CwoO7noL.js +56 -0
  7. package/dist/batch-CwoO7noL.js.map +1 -0
  8. package/dist/batch-DNu8Xr9T.cjs +2 -0
  9. package/dist/batch-DNu8Xr9T.cjs.map +1 -0
  10. package/dist/crashCapture-BOJ8nSAZ.cjs +4 -0
  11. package/dist/crashCapture-BOJ8nSAZ.cjs.map +1 -0
  12. package/dist/crashCapture-BW8WuyaU.js +70 -0
  13. package/dist/crashCapture-BW8WuyaU.js.map +1 -0
  14. package/dist/crashHandler.web-8F_k2veo.js +29 -0
  15. package/dist/crashHandler.web-8F_k2veo.js.map +1 -0
  16. package/dist/crashHandler.web-CWmF56mJ.cjs +2 -0
  17. package/dist/crashHandler.web-CWmF56mJ.cjs.map +1 -0
  18. package/dist/crashHandlerNative.native-C2kSikDt.cjs +2 -0
  19. package/dist/crashHandlerNative.native-C2kSikDt.cjs.map +1 -0
  20. package/dist/crashHandlerNative.native-FupMnr1U.js +39 -0
  21. package/dist/crashHandlerNative.native-FupMnr1U.js.map +1 -0
  22. package/dist/deviceInfo.native-BJ-3Jj1T.js +53 -0
  23. package/dist/deviceInfo.native-BJ-3Jj1T.js.map +1 -0
  24. package/dist/deviceInfo.native-BoeTZcD6.cjs +2 -0
  25. package/dist/deviceInfo.native-BoeTZcD6.cjs.map +1 -0
  26. package/dist/deviceInfo.web-3L3IDQQA.cjs +2 -0
  27. package/dist/deviceInfo.web-3L3IDQQA.cjs.map +1 -0
  28. package/dist/deviceInfo.web-BFB1-pcA.js +41 -0
  29. package/dist/deviceInfo.web-BFB1-pcA.js.map +1 -0
  30. package/dist/frameTracker-CHG6sIx9.cjs +2 -0
  31. package/dist/frameTracker-CHG6sIx9.cjs.map +1 -0
  32. package/dist/frameTracker-DdB8W_kC.js +54 -0
  33. package/dist/frameTracker-DdB8W_kC.js.map +1 -0
  34. package/dist/httpAttributes-BrrtM8zh.js +70 -0
  35. package/dist/httpAttributes-BrrtM8zh.js.map +1 -0
  36. package/dist/httpAttributes-D0m6UID7.cjs +2 -0
  37. package/dist/httpAttributes-D0m6UID7.cjs.map +1 -0
  38. package/dist/index-BtLlV1HA.js +57 -0
  39. package/dist/index-BtLlV1HA.js.map +1 -0
  40. package/dist/{deviceInfo.native-D2k0LDhI.js → index-C2XQ-EYw.js} +362 -411
  41. package/dist/index-C2XQ-EYw.js.map +1 -0
  42. package/dist/index-CXsVZY35.cjs +2 -0
  43. package/dist/index-CXsVZY35.cjs.map +1 -0
  44. package/dist/index-DLquF88M.cjs +2 -0
  45. package/dist/index-DLquF88M.cjs.map +1 -0
  46. package/dist/index.native.cjs +1 -1
  47. package/dist/index.native.cjs.map +1 -1
  48. package/dist/index.native.js +94 -59
  49. package/dist/index.native.js.map +1 -1
  50. package/dist/index.web.cjs +1 -1
  51. package/dist/index.web.cjs.map +1 -1
  52. package/dist/index.web.js +88 -33
  53. package/dist/index.web.js.map +1 -1
  54. package/dist/interactionWeb.web-Bl_cZlgh.cjs +2 -0
  55. package/dist/interactionWeb.web-Bl_cZlgh.cjs.map +1 -0
  56. package/dist/interactionWeb.web-CJAviVQ7.js +109 -0
  57. package/dist/interactionWeb.web-CJAviVQ7.js.map +1 -0
  58. package/dist/interceptFetchWeb.web-T88kO-bE.cjs +2 -0
  59. package/dist/interceptFetchWeb.web-T88kO-bE.cjs.map +1 -0
  60. package/dist/interceptFetchWeb.web-UXC2Lb6X.js +61 -0
  61. package/dist/interceptFetchWeb.web-UXC2Lb6X.js.map +1 -0
  62. package/dist/interceptHttpNative.native-BVpFuoNB.cjs +2 -0
  63. package/dist/interceptHttpNative.native-BVpFuoNB.cjs.map +1 -0
  64. package/dist/interceptHttpNative.native-rX-lPNST.js +18 -0
  65. package/dist/interceptHttpNative.native-rX-lPNST.js.map +1 -0
  66. package/dist/loadingTime-Bhomd9qq.cjs +2 -0
  67. package/dist/loadingTime-Bhomd9qq.cjs.map +1 -0
  68. package/dist/loadingTime-ZkYvFijA.js +70 -0
  69. package/dist/loadingTime-ZkYvFijA.js.map +1 -0
  70. package/dist/memoryNative.native-C42h9SjK.js +54 -0
  71. package/dist/memoryNative.native-C42h9SjK.js.map +1 -0
  72. package/dist/memoryNative.native-CA-7w9w1.cjs +2 -0
  73. package/dist/memoryNative.native-CA-7w9w1.cjs.map +1 -0
  74. package/dist/memoryStore-BIGZmmfD.cjs +2 -0
  75. package/dist/memoryStore-BIGZmmfD.cjs.map +1 -0
  76. package/dist/memoryStore-F5I-GQKM.js +193 -0
  77. package/dist/memoryStore-F5I-GQKM.js.map +1 -0
  78. package/dist/nativeSender-CfQaRuDK.cjs +2 -0
  79. package/dist/nativeSender-CfQaRuDK.cjs.map +1 -0
  80. package/dist/nativeSender-pgVSIv-X.js +59 -0
  81. package/dist/nativeSender-pgVSIv-X.js.map +1 -0
  82. package/dist/navigationRef-BzYbs8cm.js +28 -0
  83. package/dist/navigationRef-BzYbs8cm.js.map +1 -0
  84. package/dist/navigationRef-C-_qhb43.cjs +2 -0
  85. package/dist/navigationRef-C-_qhb43.cjs.map +1 -0
  86. package/dist/{navigationTracker-Cts68dgG.js → navigationTracker-BmywA_Bg.js} +4 -4
  87. package/dist/navigationTracker-BmywA_Bg.js.map +1 -0
  88. package/dist/navigationTracker-HkwVyywz.cjs +2 -0
  89. package/dist/navigationTracker-HkwVyywz.cjs.map +1 -0
  90. package/dist/navigationWeb.web-CW_z7Ca4.cjs +2 -0
  91. package/dist/navigationWeb.web-CW_z7Ca4.cjs.map +1 -0
  92. package/dist/navigationWeb.web-CcwgKuIZ.js +55 -0
  93. package/dist/navigationWeb.web-CcwgKuIZ.js.map +1 -0
  94. package/dist/{networkInfo.native-BK5fpAOL.js → networkInfo.native-CGrx9cnH.js} +15 -15
  95. package/dist/{networkInfo.native-BK5fpAOL.js.map → networkInfo.native-CGrx9cnH.js.map} +1 -1
  96. package/dist/{networkInfo.native-cxuw93Uy.cjs → networkInfo.native-YVySdv3S.cjs} +2 -2
  97. package/dist/{networkInfo.native-cxuw93Uy.cjs.map → networkInfo.native-YVySdv3S.cjs.map} +1 -1
  98. package/dist/{networkInfo.web-twcNn_hc.js → networkInfo.web-B2YlLNsI.js} +3 -3
  99. package/dist/networkInfo.web-B2YlLNsI.js.map +1 -0
  100. package/dist/networkInfo.web-PltJTHsy.cjs +2 -0
  101. package/dist/networkInfo.web-PltJTHsy.cjs.map +1 -0
  102. package/dist/runtimeReady.native-Bh7EcYmK.js +14 -0
  103. package/dist/runtimeReady.native-Bh7EcYmK.js.map +1 -0
  104. package/dist/runtimeReady.native-jUmuE1lV.cjs +2 -0
  105. package/dist/runtimeReady.native-jUmuE1lV.cjs.map +1 -0
  106. package/dist/runtimeReady.web-C8fdIbVR.js +25 -0
  107. package/dist/runtimeReady.web-C8fdIbVR.js.map +1 -0
  108. package/dist/runtimeReady.web-DHW682RN.cjs +2 -0
  109. package/dist/runtimeReady.web-DHW682RN.cjs.map +1 -0
  110. package/dist/seedRuntimeReady-BKwkBEAF.cjs +2 -0
  111. package/dist/seedRuntimeReady-BKwkBEAF.cjs.map +1 -0
  112. package/dist/seedRuntimeReady-Cz8nOKoo.js +10 -0
  113. package/dist/seedRuntimeReady-Cz8nOKoo.js.map +1 -0
  114. package/dist/src/adapters/appLifecycle.d.ts +8 -1
  115. package/dist/src/adapters/batch.d.ts +2 -0
  116. package/dist/src/adapters/crashCapture.d.ts +38 -9
  117. package/dist/src/adapters/failedEvents.d.ts +43 -0
  118. package/dist/src/adapters/frameAggregate.d.ts +8 -3
  119. package/dist/src/adapters/frameTracker.d.ts +30 -0
  120. package/dist/src/adapters/httpAttributes.d.ts +18 -0
  121. package/dist/src/adapters/loadingTime.d.ts +67 -0
  122. package/dist/src/adapters/native/interceptHttpNative.native.d.ts +18 -0
  123. package/dist/src/adapters/native/memoryNative.native.d.ts +15 -11
  124. package/dist/src/adapters/native/runtimeReady.native.d.ts +1 -0
  125. package/dist/src/adapters/native/store.native.d.ts +10 -0
  126. package/dist/src/adapters/nativeSender.d.ts +2 -2
  127. package/dist/src/adapters/navigationRef.d.ts +21 -0
  128. package/dist/src/adapters/navigationTracker.d.ts +1 -1
  129. package/dist/src/adapters/screenTiming.d.ts +8 -2
  130. package/dist/src/adapters/seedRuntimeReady.d.ts +8 -0
  131. package/dist/src/adapters/traceHeader.d.ts +33 -0
  132. package/dist/src/adapters/traceManager.d.ts +131 -0
  133. package/dist/src/adapters/uiInteraction.d.ts +111 -0
  134. package/dist/src/adapters/viewManager.d.ts +161 -0
  135. package/dist/src/adapters/viewport.d.ts +15 -0
  136. package/dist/src/adapters/web/interactionWeb.web.d.ts +36 -0
  137. package/dist/src/adapters/web/interceptFetchWeb.web.d.ts +3 -11
  138. package/dist/src/adapters/web/navigationWeb.web.d.ts +10 -0
  139. package/dist/src/adapters/web/runtimeReady.web.d.ts +5 -0
  140. package/dist/src/adapters/web/store.web.d.ts +12 -0
  141. package/dist/src/adapters/web/webVitals.web.d.ts +49 -0
  142. package/dist/src/adapters/webSender.d.ts +2 -2
  143. package/dist/src/adapters/webVitals.d.ts +25 -0
  144. package/dist/src/adapters/xhrIntercept.d.ts +53 -0
  145. package/dist/src/core/beforeSend.d.ts +20 -0
  146. package/dist/src/core/debug.d.ts +7 -0
  147. package/dist/src/core/memoryStore.d.ts +23 -0
  148. package/dist/src/core/store.d.ts +41 -0
  149. package/dist/src/core/telemetry.d.ts +305 -35
  150. package/dist/src/core/userProfile.d.ts +12 -0
  151. package/dist/src/core/utils/json.d.ts +7 -0
  152. package/dist/src/core/utils/uuid.d.ts +10 -1
  153. package/dist/src/createTelemetry.native.d.ts +7 -0
  154. package/dist/src/createTelemetry.web.d.ts +7 -0
  155. package/dist/src/index.base.d.ts +17 -1
  156. package/dist/src/index.native.d.ts +46 -9
  157. package/dist/src/index.web.d.ts +33 -2
  158. package/dist/store.native-BYBJcy6o.js +32 -0
  159. package/dist/store.native-BYBJcy6o.js.map +1 -0
  160. package/dist/store.native-TPqXngmF.cjs +2 -0
  161. package/dist/store.native-TPqXngmF.cjs.map +1 -0
  162. package/dist/store.web-CvqqN-_Z.cjs +2 -0
  163. package/dist/store.web-CvqqN-_Z.cjs.map +1 -0
  164. package/dist/store.web-DJAlN0nc.js +31 -0
  165. package/dist/store.web-DJAlN0nc.js.map +1 -0
  166. package/dist/telemetry-ByDJIz_9.js +1280 -0
  167. package/dist/telemetry-ByDJIz_9.js.map +1 -0
  168. package/dist/telemetry-CrU7i1Jc.cjs +2 -0
  169. package/dist/telemetry-CrU7i1Jc.cjs.map +1 -0
  170. package/dist/uiInteraction-CdzvEI1p.cjs +2 -0
  171. package/dist/uiInteraction-CdzvEI1p.cjs.map +1 -0
  172. package/dist/uiInteraction-DAqxxz0q.js +104 -0
  173. package/dist/uiInteraction-DAqxxz0q.js.map +1 -0
  174. package/dist/viewport-Dd85GUNO.cjs +2 -0
  175. package/dist/viewport-Dd85GUNO.cjs.map +1 -0
  176. package/dist/viewport-Dzmt5QwK.js +15 -0
  177. package/dist/viewport-Dzmt5QwK.js.map +1 -0
  178. package/dist/web-vitals.attribution-CVCPiX-h.cjs +2 -0
  179. package/dist/web-vitals.attribution-CVCPiX-h.cjs.map +1 -0
  180. package/dist/web-vitals.attribution-xw9N5MKQ.js +488 -0
  181. package/dist/web-vitals.attribution-xw9N5MKQ.js.map +1 -0
  182. package/dist/webSender-BIwslfpT.js +63 -0
  183. package/dist/webSender-BIwslfpT.js.map +1 -0
  184. package/dist/webSender-CVtE4sOF.cjs +2 -0
  185. package/dist/webSender-CVtE4sOF.cjs.map +1 -0
  186. package/dist/webVitals.web-CNIpsKlA.js +85 -0
  187. package/dist/webVitals.web-CNIpsKlA.js.map +1 -0
  188. package/dist/webVitals.web-DpWJ-iYp.cjs +2 -0
  189. package/dist/webVitals.web-DpWJ-iYp.cjs.map +1 -0
  190. package/dist/xhrIntercept-BADex6Cq.cjs +2 -0
  191. package/dist/xhrIntercept-BADex6Cq.cjs.map +1 -0
  192. package/dist/xhrIntercept-BNiA41Mj.js +53 -0
  193. package/dist/xhrIntercept-BNiA41Mj.js.map +1 -0
  194. package/docs/migration-v4.md +190 -0
  195. package/package.json +12 -4
  196. package/dist/appLifecycle-Cynw0kAv.js +0 -14
  197. package/dist/appLifecycle-Cynw0kAv.js.map +0 -1
  198. package/dist/appLifecycle-DvJIt7ym.cjs +0 -2
  199. package/dist/appLifecycle-DvJIt7ym.cjs.map +0 -1
  200. package/dist/batch-CLBFgYPC.cjs +0 -2
  201. package/dist/batch-CLBFgYPC.cjs.map +0 -1
  202. package/dist/batch-DLG_gtOm.js +0 -12
  203. package/dist/batch-DLG_gtOm.js.map +0 -1
  204. package/dist/crashCapture-BYTM4FLC.cjs +0 -2
  205. package/dist/crashCapture-BYTM4FLC.cjs.map +0 -1
  206. package/dist/crashCapture-D_rkkBVa.js +0 -31
  207. package/dist/crashCapture-D_rkkBVa.js.map +0 -1
  208. package/dist/crashHandler.web-BSxDpFTo.cjs +0 -2
  209. package/dist/crashHandler.web-BSxDpFTo.cjs.map +0 -1
  210. package/dist/crashHandler.web-D59bmhg9.js +0 -32
  211. package/dist/crashHandler.web-D59bmhg9.js.map +0 -1
  212. package/dist/crashHandlerNative.native-DeAFze4E.cjs +0 -2
  213. package/dist/crashHandlerNative.native-DeAFze4E.cjs.map +0 -1
  214. package/dist/crashHandlerNative.native-d7qJkzA6.js +0 -41
  215. package/dist/crashHandlerNative.native-d7qJkzA6.js.map +0 -1
  216. package/dist/debug-DsvQ9y3W.js +0 -68
  217. package/dist/debug-DsvQ9y3W.js.map +0 -1
  218. package/dist/debug-rnOOxFpN.cjs +0 -2
  219. package/dist/debug-rnOOxFpN.cjs.map +0 -1
  220. package/dist/deviceInfo.native-7hbRYixR.cjs +0 -2
  221. package/dist/deviceInfo.native-7hbRYixR.cjs.map +0 -1
  222. package/dist/deviceInfo.native-D2k0LDhI.js.map +0 -1
  223. package/dist/deviceInfo.web-ByNAlEJh.cjs +0 -2
  224. package/dist/deviceInfo.web-ByNAlEJh.cjs.map +0 -1
  225. package/dist/deviceInfo.web-DzQyEku6.js +0 -40
  226. package/dist/deviceInfo.web-DzQyEku6.js.map +0 -1
  227. package/dist/frameAggregate-C_HoVFcK.cjs +0 -2
  228. package/dist/frameAggregate-C_HoVFcK.cjs.map +0 -1
  229. package/dist/frameAggregate-Cwh1juw1.js +0 -17
  230. package/dist/frameAggregate-Cwh1juw1.js.map +0 -1
  231. package/dist/frameDropsNative.native-CP7zrXDf.js +0 -23
  232. package/dist/frameDropsNative.native-CP7zrXDf.js.map +0 -1
  233. package/dist/frameDropsNative.native-DKqEDqip.cjs +0 -2
  234. package/dist/frameDropsNative.native-DKqEDqip.cjs.map +0 -1
  235. package/dist/frameDropsWeb.web-C9Lt3Fuj.js +0 -22
  236. package/dist/frameDropsWeb.web-C9Lt3Fuj.js.map +0 -1
  237. package/dist/frameDropsWeb.web-azpwQCUz.cjs +0 -2
  238. package/dist/frameDropsWeb.web-azpwQCUz.cjs.map +0 -1
  239. package/dist/httpAttributes-BV50UKQU.js +0 -19
  240. package/dist/httpAttributes-BV50UKQU.js.map +0 -1
  241. package/dist/httpAttributes-xXOD9trQ.cjs +0 -2
  242. package/dist/httpAttributes-xXOD9trQ.cjs.map +0 -1
  243. package/dist/interaction-CH8yoY5-.js +0 -23
  244. package/dist/interaction-CH8yoY5-.js.map +0 -1
  245. package/dist/interaction-DcNFBW7a.cjs +0 -2
  246. package/dist/interaction-DcNFBW7a.cjs.map +0 -1
  247. package/dist/interceptFetchNative.native-VlhtMG-U.js +0 -49
  248. package/dist/interceptFetchNative.native-VlhtMG-U.js.map +0 -1
  249. package/dist/interceptFetchNative.native-jEAldH14.cjs +0 -2
  250. package/dist/interceptFetchNative.native-jEAldH14.cjs.map +0 -1
  251. package/dist/interceptFetchWeb.web-DFzZliik.cjs +0 -2
  252. package/dist/interceptFetchWeb.web-DFzZliik.cjs.map +0 -1
  253. package/dist/interceptFetchWeb.web-DfsMfoRP.js +0 -77
  254. package/dist/interceptFetchWeb.web-DfsMfoRP.js.map +0 -1
  255. package/dist/memoryNative.native-BWLh2S9L.js +0 -48
  256. package/dist/memoryNative.native-BWLh2S9L.js.map +0 -1
  257. package/dist/memoryNative.native-DCXSOd4Q.cjs +0 -2
  258. package/dist/memoryNative.native-DCXSOd4Q.cjs.map +0 -1
  259. package/dist/memoryWeb.web-B3YuV-cB.js +0 -48
  260. package/dist/memoryWeb.web-B3YuV-cB.js.map +0 -1
  261. package/dist/memoryWeb.web-CheXAcJn.cjs +0 -2
  262. package/dist/memoryWeb.web-CheXAcJn.cjs.map +0 -1
  263. package/dist/nativeSender-BE_mzw_S.js +0 -70
  264. package/dist/nativeSender-BE_mzw_S.js.map +0 -1
  265. package/dist/nativeSender-DyAUGY7c.cjs +0 -2
  266. package/dist/nativeSender-DyAUGY7c.cjs.map +0 -1
  267. package/dist/navigationNative.native-3tO5JxSd.cjs +0 -2
  268. package/dist/navigationNative.native-3tO5JxSd.cjs.map +0 -1
  269. package/dist/navigationNative.native-BUCGPQX2.js +0 -25
  270. package/dist/navigationNative.native-BUCGPQX2.js.map +0 -1
  271. package/dist/navigationTracker-B2GMwyKk.cjs +0 -2
  272. package/dist/navigationTracker-B2GMwyKk.cjs.map +0 -1
  273. package/dist/navigationTracker-Cts68dgG.js.map +0 -1
  274. package/dist/navigationWeb.web-B0necr5j.cjs +0 -2
  275. package/dist/navigationWeb.web-B0necr5j.cjs.map +0 -1
  276. package/dist/navigationWeb.web-CORzE_Id.js +0 -46
  277. package/dist/navigationWeb.web-CORzE_Id.js.map +0 -1
  278. package/dist/networkInfo.web-DJmw1sNK.cjs +0 -2
  279. package/dist/networkInfo.web-DJmw1sNK.cjs.map +0 -1
  280. package/dist/networkInfo.web-twcNn_hc.js.map +0 -1
  281. package/dist/src/adapters/interaction.d.ts +0 -17
  282. package/dist/src/adapters/native/frameDropsNative.native.d.ts +0 -16
  283. package/dist/src/adapters/native/interceptFetchNative.native.d.ts +0 -23
  284. package/dist/src/adapters/native/navigationNative.native.d.ts +0 -12
  285. package/dist/src/adapters/web/frameDropsWeb.web.d.ts +0 -16
  286. package/dist/src/adapters/web/memoryWeb.web.d.ts +0 -26
  287. package/dist/telemetry-Co4MYdwa.cjs +0 -2
  288. package/dist/telemetry-Co4MYdwa.cjs.map +0 -1
  289. package/dist/telemetry-KI0x4gzC.js +0 -389
  290. package/dist/telemetry-KI0x4gzC.js.map +0 -1
  291. package/dist/v4-BysszJq8.js +0 -31
  292. package/dist/v4-BysszJq8.js.map +0 -1
  293. package/dist/v4-CqdK_b8Y.cjs +0 -2
  294. package/dist/v4-CqdK_b8Y.cjs.map +0 -1
  295. package/dist/webSender-B27tmT1w.js +0 -42
  296. package/dist/webSender-B27tmT1w.js.map +0 -1
  297. package/dist/webSender-BWi4x1df.cjs +0 -2
  298. package/dist/webSender-BWi4x1df.cjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.native.cjs","sources":["../src/createTelemetry.native.ts","../src/index.native.ts"],"sourcesContent":["import { TelemetryNative } from \"./index.native\";\n\nexport type TelemetryOpts = {\n apiKey: string; // required; must start with \"edge_\"\n sender?: any;\n batchSize?: number;\n flushIntervalMs?: number;\n endpoint?: string;\n captureConsole?: boolean; // funnel console.error/warn into app.crash (default on, opt-out)\n debug?: boolean; // SDK-internal diagnostics; off by default (#23)\n};\n\nexport function assertApiKey(apiKey?: string) {\n if (!apiKey || !apiKey.startsWith(\"edge_\")) {\n throw new Error(\"createTelemetry: apiKey is required and must start with 'edge_'\");\n }\n}\n\n/**\n * Cross-platform factory for telemetry. The platform is chosen by the bundler\n * via the .web / .native file split — no runtime navigator sniffing.\n */\nexport function createTelemetry(opts: TelemetryOpts) {\n assertApiKey(opts?.apiKey);\n return new TelemetryNative(opts);\n}\n","// React Native telemetry implementation\nimport { TelemetryBase } from \"./index.base\";\nimport { debug, setDebug } from \"./core/debug\";\n\nexport { createTelemetry, type TelemetryOpts } from \"./createTelemetry.native\";\n\nexport class TelemetryNative extends TelemetryBase {\n constructor(opts?: {\n apiKey?: string;\n sender?: any;\n batchSize?: number;\n flushIntervalMs?: number;\n endpoint?: string;\n captureConsole?: boolean;\n debug?: boolean;\n }) {\n setDebug(opts?.debug ?? false); // gate SDK console noise before anything logs (#23)\n super();\n\n debug.log(\"🌍 Running Native Telemetry\");\n this.instancePromise = (async () => {\n const { Telemetry } = await import(\"./core/telemetry\");\n const { nativeSender } = await import(\"./adapters/nativeSender\");\n\n const { replayFailedNative } = await import(\"./adapters/nativeSender\");\n const { DeviceInfoTrackerNative } = await import(\"./adapters/native/deviceInfo.native\");\n const { NetworkInfoTrackerNative } = await import(\"./adapters/native/networkInfo.native\");\n\n // device OS forms the device/session id suffix (ios|android)\n let platform: string | undefined;\n try {\n ({ Platform: { OS: platform } } = await import(\"react-native\") as any);\n } catch { /* non-RN context (e.g. tests) — omit the suffix */ }\n\n const networkInfoTrackerNative = new NetworkInfoTrackerNative();\n const deviceInfoTrackerNative = new DeviceInfoTrackerNative();\n\n const sender = opts?.sender ?? nativeSender(opts?.endpoint, opts?.apiKey);\n\n const telemetry = new Telemetry({\n sender,\n batchSize: opts?.batchSize,\n flushIntervalMs: opts?.flushIntervalMs,\n endpoint: opts?.endpoint,\n platform,\n deviceInfoHandler: deviceInfoTrackerNative,\n networkInfoHandler: networkInfoTrackerNative,\n });\n\n // 🔄 recover failed events right after init\n replayFailedNative(opts?.endpoint, opts?.apiKey).catch(err => {\n debug.warn(\"Native replay failed:\", err);\n });\n\n return telemetry;\n })();\n\n // session.started on init; AppState drives background→finalize, foreground→new session (#29)\n this.startSessionOnInit().catch(err => debug.warn(\"Native startSession failed:\", err));\n this.attachAppState().catch(err => debug.warn(\"Native AppState attach failed:\", err));\n\n // app_lifecycle on foreground/background (#30)\n this.attachAppLifecycle().catch(err => {\n debug.log(\"Native attachAppLifecycle errors\", err);\n });\n\n this.trackErrors({ captureConsole: opts?.captureConsole }).catch(err => {\n debug.warn(\"Native trackErrors failed:\", err);\n });\n\n this.trackFrameDrops().catch(err => {\n debug.log(\"Native trackFrameDrops errors\", err);\n });\n this.trackNetworkRequests().catch(err => {\n debug.log(\"Native trackNetworkRequests errors\", err);\n });\n this.trackMemoryUsage().catch(err => {\n debug.log(\"Native trackMemoryUsage errors\", err);\n });\n }\n\n private async startSessionOnInit() {\n const inst = await this.instancePromise;\n await inst.startSession();\n }\n\n // Background → finalize (immediate flush). Foreground after background → fresh session. (#29)\n private async attachAppState() {\n const { AppState } = await import(\"react-native\") as any;\n const inst = await this.instancePromise;\n let prev: string = AppState.currentState;\n AppState.addEventListener(\"change\", (next: string) => {\n if (next === \"background\") {\n inst.finalizeSession().catch((e: any) => debug.warn(\"finalizeSession failed:\", e));\n } else if (next === \"active\" && prev === \"background\") {\n inst.newSession().catch((e: any) => debug.warn(\"newSession failed:\", e));\n }\n prev = next;\n });\n }\n\n // app_lifecycle on foreground/background via RN AppState (#30)\n async attachAppLifecycle() {\n const { AppState } = await import(\"react-native\") as any;\n const inst = await this.instancePromise;\n const { AppLifecycleEmitter } = await import(\"./adapters/appLifecycle\");\n const emitter = new AppLifecycleEmitter(inst);\n emitter.onState(AppState.currentState === \"active\"); // seed current state\n AppState.addEventListener(\"change\", (next: string) => emitter.onState(next === \"active\"));\n }\n\n async getDeviceInfo() {\n const { DeviceInfoTrackerNative } = await import(\"./adapters/native/deviceInfo.native\");\n const inst = await this.instancePromise;\n const deviceInfoTrackerNative = new DeviceInfoTrackerNative();\n return inst.getDeviceInfo(deviceInfoTrackerNative);\n }\n\n async getNetworkInfo() {\n const { NetworkInfoTrackerNative } = await import(\"./adapters/native/networkInfo.native\");\n const inst = await this.instancePromise;\n const networkInfoTrackerNative = new NetworkInfoTrackerNative();\n return inst.getNetworkInfo(networkInfoTrackerNative);\n }\n\n async trackFrameDrops() {\n const { FrameDropTrackerNative } = await import(\"./adapters/native/frameDropsNative.native\");\n const inst = await this.instancePromise;\n const frameDropTracker = new FrameDropTrackerNative(inst);\n return inst.trackFrameDrops(frameDropTracker);\n }\n\n async trackNetworkRequests() {\n const { NetworkTrackerNative } = await import(\"./adapters/native/interceptFetchNative.native\");\n const inst = await this.instancePromise;\n const networkTracker = new NetworkTrackerNative(inst);\n return inst.trackNetworkRequests(networkTracker);\n }\n\n async trackMemoryUsage() {\n const { TelemetryMemoryUsageNative } = await import(\"./adapters/native/memoryNative.native\");\n const inst = await this.instancePromise;\n const memoryTracker = new TelemetryMemoryUsageNative(inst);\n return inst.trackMemoryUsage(memoryTracker);\n }\n\n // ---------- Screen Management ----------\n\n async screenStart(name: string) {\n const inst = await this.instancePromise;\n inst.screens.startScreen(name);\n }\n\n async screenEnd(name: string) {\n const inst = await this.instancePromise;\n inst.screens.endScreen(name);\n }\n\n async trackRoute(from: string, to: string) {\n const inst = await this.instancePromise;\n inst.recordRouteChange(from, to);\n }\n\n // Best-effort native taps → user.interaction (#33). Spread the returned props on your\n // app root <View>; each tap emits user.interaction with the current screen when known.\n // const props = await telemetry.interactionProps();\n // <View {...props}>{app}</View>\n async interactionProps() {\n const inst = await this.instancePromise;\n const { InteractionEmitter } = await import(\"./adapters/interaction\");\n return new InteractionEmitter(inst).responderProps();\n }\n\n async attachNavigation(navigationRef: any) {\n debug.log(\"Attaching navigation tracker\");\n if (!navigationRef) {\n debug.warn(\"Navigation reference is undefined. Cannot attach navigation tracker.\");\n return;\n }\n const inst = await this.instancePromise;\n const { NavigationTrackerNative } = await import(\"./adapters/native/navigationNative.native\");\n const tracker = new NavigationTrackerNative(inst);\n tracker.attach(navigationRef);\n }\n}\n"],"names":["assertApiKey","apiKey","createTelemetry","opts","TelemetryNative","TelemetryBase","setDebug","debug","Telemetry","nativeSender","replayFailedNative","DeviceInfoTrackerNative","NetworkInfoTrackerNative","platform","networkInfoTrackerNative","deviceInfoTrackerNative","sender","telemetry","err","AppState","inst","prev","next","e","AppLifecycleEmitter","emitter","FrameDropTrackerNative","frameDropTracker","NetworkTrackerNative","networkTracker","TelemetryMemoryUsageNative","memoryTracker","name","from","to","InteractionEmitter","navigationRef","NavigationTrackerNative"],"mappings":"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"}
1
+ {"version":3,"file":"index.native.cjs","sources":["../src/createTelemetry.native.ts","../src/index.native.ts"],"sourcesContent":["import { TelemetryNative } from \"./index.native\";\nimport type { Store } from \"./core/store\";\nimport type { BeforeSend } from \"./core/beforeSend\";\nimport { normalizeAllowlist } from \"./adapters/traceHeader\";\nimport { setDebug } from \"./core/debug\";\n\nexport type TelemetryOpts = {\n apiKey: string; // required credential; must start with \"edge_\" (API key or JWT, #90)\n sender?: any;\n batchSize?: number;\n flushIntervalMs?: number;\n endpoint?: string;\n // console.error -> app.error, console.warn -> a breadcrumb. Default OFF (§4.7, #100).\n captureConsole?: boolean;\n debug?: boolean; // SDK-internal diagnostics; off by default (#23)\n store?: Store; // persisted-state port (#89); either shape — the native path awaits\n // Constructor-only (§3.6) — there is deliberately no runtime setter for either.\n beforeSend?: BeforeSend; // sync scrubbing hook, run at enqueue over events and metrics\n sessionSampleRate?: number; // 0.0-1.0, sticky per session, re-rolled at rotation; default 1\n // §6.4/#99. Bare hosts, exact match, **ports ignored** (a deliberate mismatch with\n // `http.host`, which keeps the port — do not join them). Empty by default: v4 is dark on\n // upgrade. Listing a host asserts that host's CORS allows `traceparent`; a malformed\n // entry throws in dev and is dropped in production.\n traceHostAllowlist?: string[];\n // §4.8 — the symbolication resolve key. A git SHA or CI run number; consumer-supplied\n // (the SDK has zero OTA awareness), **omitted when unset, never `\"\"`**, and never\n // derived from app.version + app.build_number under any circumstances.\n buildId?: string;\n};\n\n// Deliberately loose: `apiKey` is the *credential*, and under AUTH_MODE=jwt it is\n// `edge_<jwt>` — a shape the collector's >=3-`_`-part API-key check would reject. Tightening\n// to that check here would hard-reject every JWT and make the segmented deployment\n// unreachable, which is the exact bug #90 exists to close. Prefix + non-empty remainder is\n// all we assert; the real catch is the 401 warn (contract §11.1).\nexport function assertApiKey(apiKey?: string) {\n if (!apiKey || !apiKey.startsWith(\"edge_\")) {\n throw new Error(\"createTelemetry: apiKey is required and must start with 'edge_'\");\n }\n}\n\n/**\n * Cross-platform factory for telemetry. The platform is chosen by the bundler\n * via the .web / .native file split — no runtime navigator sniffing.\n */\nexport function createTelemetry(opts: TelemetryOpts) {\n assertApiKey(opts?.apiKey);\n // §6.4's dev throw has to happen *here*, synchronously: the core Telemetry is built\n // inside `instancePromise`, which deliberately never rethrows, so a throw down there\n // would be a silently rejected promise instead of the loud config error dev asks for.\n // In production it drops the bad entry and reports through debug() — which is why the\n // gate has to be open first: the entry ctor's own setDebug() runs *after* this line, so\n // without this the production report would be a guaranteed no-op even with debug: true.\n // It runs again in TraceManager, where it is idempotent.\n setDebug(opts?.debug ?? false);\n normalizeAllowlist(opts?.traceHostAllowlist);\n return new TelemetryNative(opts);\n}\n","// React Native telemetry implementation\nimport { TelemetryBase } from \"./index.base\";\nimport { debug, setDebug } from \"./core/debug\";\nimport { RAGE_WINDOW_MS, RageTracker, UI_UNNAMED, uiAttributes } from \"./adapters/uiInteraction\";\nimport type { Store } from \"./core/store\";\nimport type { BeforeSend } from \"./core/beforeSend\";\n\nexport { createTelemetry, type TelemetryOpts } from \"./createTelemetry.native\";\n\n// The Store port (#89) — public so a consumer can inject their own persistence,\n// and so the in-memory fake is available outside the test tree.\nexport type { Store, SyncStore, AsyncStore, StoreRead, StoreWrite } from \"./core/store\";\nexport { memoryStore, type MemoryStoreOpts } from \"./core/memoryStore\";\n\n// The scrubbing hook (#93) — public so a consumer can type their beforeSend.\nexport type { BeforeSend } from \"./core/beforeSend\";\n\nexport class TelemetryNative extends TelemetryBase {\n /** ≥3 named taps in a 1000 ms window, keyed on the name — see `trackTap`. */\n private readonly tapRage = new RageTracker(RAGE_WINDOW_MS);\n /**\n * The resolved core, once `instancePromise` settles. `trackTap` is the one public method that\n * cannot afford an `await` before it reads the world: the host's own press handler\n * navigates on the very next line (§4.6's mint/emit split).\n */\n private resolved?: any;\n\n constructor(opts?: {\n apiKey?: string;\n sender?: any;\n batchSize?: number;\n flushIntervalMs?: number;\n endpoint?: string;\n captureConsole?: boolean;\n debug?: boolean;\n store?: Store; // either shape: the native path awaits\n // Constructor-only (§3.6). No runtime setter: registering later leaves a window\n // where session.started and the earliest requests have already been enqueued.\n beforeSend?: BeforeSend;\n sessionSampleRate?: number;\n // §6.4/#99 — bare hosts, exact match, ports ignored, empty by default.\n traceHostAllowlist?: string[];\n // §4.8 — symbolication resolve key. Omitted when unset, never `\"\"`, never derived.\n buildId?: string;\n }) {\n setDebug(opts?.debug ?? false); // gate SDK console noise before anything logs (#23)\n super();\n\n debug.log(\"🌍 Running Native Telemetry\");\n this.instancePromise = (async () => {\n // RN ships no WebCrypto; this already-declared dependency installs\n // crypto.getRandomValues, which the id path now draws from (#91). It is a\n // no-op wherever crypto already exists, which is why a failure here is only a\n // warning — off-device (SSR, tests) crypto is already there. If it genuinely\n // isn't, randomHex() throws with the reinstall instruction.\n try { await import(\"react-native-get-random-values\"); }\n catch (err) { debug.warn(\"crypto.getRandomValues polyfill unavailable:\", err); }\n\n const { Telemetry } = await import(\"./core/telemetry\");\n const { nativeSender } = await import(\"./adapters/nativeSender\");\n\n const { nativeStore } = await import(\"./adapters/native/store.native\");\n const { DeviceInfoTrackerNative } = await import(\"./adapters/native/deviceInfo.native\");\n const { NetworkInfoTrackerNative } = await import(\"./adapters/native/networkInfo.native\");\n\n // device OS forms the device/session id suffix (ios|android)\n let platform: string | undefined;\n try {\n ({ Platform: { OS: platform } } = await import(\"react-native\") as any);\n } catch { /* non-RN context (e.g. tests) — omit the suffix */ }\n\n const networkInfoTrackerNative = new NetworkInfoTrackerNative();\n const deviceInfoTrackerNative = new DeviceInfoTrackerNative();\n\n // One store, shared by the offline queue and core (#89) — so a consumer that\n // injects a store governs both, instead of the sender quietly keeping its own.\n const store = opts?.store ?? nativeStore();\n const sender = opts?.sender ?? nativeSender(opts?.endpoint, opts?.apiKey, store);\n\n const telemetry = new Telemetry({\n sender,\n batchSize: opts?.batchSize,\n flushIntervalMs: opts?.flushIntervalMs,\n endpoint: opts?.endpoint,\n platform,\n deviceInfoHandler: deviceInfoTrackerNative,\n networkInfoHandler: networkInfoTrackerNative,\n store,\n beforeSend: opts?.beforeSend,\n sessionSampleRate: opts?.sessionSampleRate,\n traceHostAllowlist: opts?.traceHostAllowlist,\n buildId: opts?.buildId,\n });\n\n // The offline queue drains through `sender.replayFailed()`, which the core\n // constructor above already called (#113). A second call here is what sent\n // every recovered batch twice.\n\n // Resume or start the session before the instance is visible (#92), so\n // session.started can never land behind the host app's first event.\n // Never rethrown into instancePromise: finalizeSession() flushes, flush() rethrows on a\n // dead collector, and a rejected instancePromise would brick every public method for the\n // life of the process. Hydration has already run; only the emission is lost.\n // §4.5.2's `initial_load` seed: the launch view stays busy until the platform's\n // runtime-ready marker. The *module* is awaited with everything else, so the seed\n // is armed before `instancePromise` resolves; the *marker* is not, because on web\n // it arrives with the load event and blocking init on it would delay every host\n // call behind the page's own images.\n // The module is awaited so the seed is armed before `instancePromise` resolves,\n // but never rethrown into it: a failed chunk load must not brick every public\n // method for the life of the process. A missing reader just releases the gate.\n const { runtimeReadyAt } = await import(\"./adapters/native/runtimeReady.native\")\n .catch((err: unknown) => {\n debug.warn(\"Native runtime-ready module unavailable:\", err);\n return { runtimeReadyAt: async () => undefined };\n });\n const { seedRuntimeReady } = await import(\"./adapters/seedRuntimeReady\");\n seedRuntimeReady(telemetry.views, runtimeReadyAt, \"Native\");\n\n await telemetry.resumeOrStartSession()\n .catch(err => debug.warn(\"Native session resume failed:\", err));\n\n this.resolved = telemetry;\n return telemetry;\n })();\n\n // app_lifecycle on foreground/background (#30)\n this.attachAppLifecycle().catch(err => {\n debug.log(\"Native attachAppLifecycle errors\", err);\n });\n\n this.trackErrors({ captureConsole: opts?.captureConsole }).catch(err => {\n debug.warn(\"Native trackErrors failed:\", err);\n });\n\n this.trackFrameDrops().catch(err => {\n debug.log(\"Native trackFrameDrops errors\", err);\n });\n this.trackNetworkRequests().catch(err => {\n debug.log(\"Native trackNetworkRequests errors\", err);\n });\n this.trackMemoryUsage().catch(err => {\n debug.log(\"Native trackMemoryUsage errors\", err);\n });\n }\n\n // app_lifecycle on foreground/background via RN AppState (#30).\n //\n // §4.2: neither build rotates on a lifecycle transition — parity with web is reached by\n // *deleting* the old background→finalize / foreground→newSession pair, not by adding it\n // to web. Backgrounding still forces a flush, because the process is now most likely to\n // be killed and the queue only lives in memory.\n async attachAppLifecycle() {\n const { AppState } = await import(\"react-native\") as any;\n const inst = await this.instancePromise;\n const { AppLifecycleEmitter } = await import(\"./adapters/appLifecycle\");\n const emitter = new AppLifecycleEmitter(inst);\n // seed current state — a transition-only emitter, so this enqueues nothing\n emitter.onState(AppState.currentState === \"active\")\n .catch((e: any) => debug.warn(\"app lifecycle seed failed:\", e));\n AppState.addEventListener(\"change\", (next: string) => {\n const isActive = next === \"active\";\n // Awaited before the flush, not fired alongside it: backgrounding is a view\n // boundary (§4.5) and the `view` row it emits is exactly the row this flush\n // exists to rescue from the kill that usually follows.\n emitter.onState(isActive)\n .then(() => (isActive ? undefined : inst.flush()))\n .catch((e: any) => debug.warn(\"background flush failed:\", e));\n });\n }\n\n async getDeviceInfo() {\n const { DeviceInfoTrackerNative } = await import(\"./adapters/native/deviceInfo.native\");\n const inst = await this.instancePromise;\n const deviceInfoTrackerNative = new DeviceInfoTrackerNative();\n return inst.getDeviceInfo(deviceInfoTrackerNative);\n }\n\n async getNetworkInfo() {\n const { NetworkInfoTrackerNative } = await import(\"./adapters/native/networkInfo.native\");\n const inst = await this.instancePromise;\n const networkInfoTrackerNative = new NetworkInfoTrackerNative();\n return inst.getNetworkInfo(networkInfoTrackerNative);\n }\n\n async trackFrameDrops() {\n const { FrameDropTracker } = await import(\"./adapters/frameTracker\");\n const inst = await this.instancePromise;\n const frameDropTracker = new FrameDropTracker(inst);\n return inst.trackFrameDrops(frameDropTracker);\n }\n\n async trackNetworkRequests() {\n const { NetworkTrackerNative } = await import(\"./adapters/native/interceptHttpNative.native\");\n const inst = await this.instancePromise;\n const networkTracker = new NetworkTrackerNative(inst);\n return inst.trackNetworkRequests(networkTracker);\n }\n\n async trackMemoryUsage() {\n const { TelemetryMemoryUsageNative } = await import(\"./adapters/native/memoryNative.native\");\n const inst = await this.instancePromise;\n const memoryTracker = new TelemetryMemoryUsageNative(inst);\n return inst.trackMemoryUsage(memoryTracker);\n }\n\n // ---------- Screen Management ----------\n\n async screenStart(name: string) {\n const inst = await this.instancePromise;\n return inst.screens.startScreen(name);\n }\n\n async screenEnd(name: string) {\n const inst = await this.instancePromise;\n return inst.screens.endScreen(name);\n }\n\n async trackRoute(from: string, to: string) {\n const inst = await this.instancePromise;\n return inst.recordRouteChange(from, to);\n }\n\n // ---------- Interactions ----------\n\n /**\n * §4.6's native producer, explicit-only (#103). `interactionProps()` is gone with\n * `user.interaction` (#102): it sat on the consumer's **root** `<View>`, where\n * `PressEvent.nativeEvent.target` is a node tag number with no public API resolving it,\n * so it could not tell a tap on a button from a tap on padding and every row it emitted\n * was un-nameable. There is no role model to gate on and no DOM to derive from, so\n * anything auto-derived here would be either wrong or a PII leak.\n *\n * `name` is web's rung 1 — explicit author intent — so it ships **unnormalized and\n * uncapped**, and `ui.name_source` has exactly **two** values: `edge_action`, or `none`\n * for a blank name, whose `ui.target` is `unnamed`. **`surface` never appears**: it only\n * means something where role-less elements exist.\n *\n * ⚠ **The mint/emit split.** The row's `timestamp`, `view.id`, `view.name` and\n * `session.id` are snapshotted **here, synchronously**, because the host's press handler\n * navigates on the next line and the emit rides a promise. Stamping emit time would\n * attribute a navigating tap to **the view it opened**, inverting every \"which screen\n * frustrates users\" query. Before `instancePromise` settles there is no core to snapshot\n * from, so a tap that early falls back to emit-time identity — the launch view either\n * way.\n *\n * ⚠ **`ui.dead` is absent on every native row**, never `false`: with no DOM there is no\n * mutation signal, so any dead-click *rate* must filter to the web build.\n */\n async trackTap(name: string) {\n const at = Date.now();\n const named = typeof name === \"string\" && name.trim() !== \"\";\n const attrs = uiAttributes({\n type: \"tap\",\n target: named ? name : UI_UNNAMED,\n nameSource: named ? \"edge_action\" : \"none\",\n // No element model: nothing was resolved, so the tag names the platform rather\n // than inventing a `<button>` that does not exist. §4.6 types it never-null, as\n // it does the coordinates the builder floors at 0 — a `PressEvent` carries some,\n // but `trackTap(name)` deliberately takes none: the name is the whole contract.\n tag: \"native\",\n // Gated to named taps (§4.6): running rage over `unnamed` would not merely lose\n // information, it would invent a frustration event that never happened. Identity\n // is the name, which on native *is* the element — there is no node to key on.\n rage: named && this.tapRage.record(name, at),\n });\n // §6.2: **every** tap mints an interaction root, live carrier or not — a tap is a new\n // user action by definition, so the request it fires is its child and not the route\n // change's before it.\n const emit = (inst: any) =>\n inst.log(\"ui.interaction\", { ...inst.trace.interactionSpan(at), ...attrs }, inst.snapshot(at));\n // Swallowed like every other capture path: the README's own example calls this\n // un-awaited from an `onPress`, and a RUM SDK must not be able to fault the host with\n // an unhandled rejection.\n return Promise.resolve(this.resolved ? emit(this.resolved) : this.instancePromise.then(emit))\n .catch((err: unknown) => debug.warn(\"Native ui.interaction failed:\", err));\n }\n}\n"],"names":["assertApiKey","apiKey","createTelemetry","opts","setDebug","normalizeAllowlist","TelemetryNative","TelemetryBase","RageTracker","RAGE_WINDOW_MS","debug","n","err","Telemetry","nativeSender","nativeStore","DeviceInfoTrackerNative","NetworkInfoTrackerNative","platform","networkInfoTrackerNative","deviceInfoTrackerNative","store","sender","telemetry","runtimeReadyAt","seedRuntimeReady","AppState","inst","AppLifecycleEmitter","emitter","e","next","isActive","FrameDropTracker","frameDropTracker","NetworkTrackerNative","networkTracker","TelemetryMemoryUsageNative","memoryTracker","name","from","to","at","named","attrs","uiAttributes","UI_UNNAMED","emit"],"mappings":"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"}
@@ -1,33 +1,44 @@
1
- import { T as l, s as v, d as r } from "./debug-DsvQ9y3W.js";
2
- function f(s) {
3
- if (!s || !s.startsWith("edge_"))
1
+ import { s as u, n as k, T as f, d as r } from "./memoryStore-F5I-GQKM.js";
2
+ import { m as E } from "./memoryStore-F5I-GQKM.js";
3
+ import { R as g, a as N, u as T, U as S } from "./uiInteraction-DAqxxz0q.js";
4
+ function I(i) {
5
+ if (!i || !i.startsWith("edge_"))
4
6
  throw new Error("createTelemetry: apiKey is required and must start with 'edge_'");
5
7
  }
6
- function N(s) {
7
- return f(s?.apiKey), new d(s);
8
+ function D(i) {
9
+ return I(i?.apiKey), u(i?.debug ?? !1), k(i?.traceHostAllowlist), new R(i);
8
10
  }
9
- class d extends l {
11
+ class R extends f {
10
12
  constructor(e) {
11
- v(e?.debug ?? !1), super(), r.log("🌍 Running Native Telemetry"), this.instancePromise = (async () => {
12
- const { Telemetry: t } = await import("./telemetry-KI0x4gzC.js"), { nativeSender: a } = await import("./nativeSender-BE_mzw_S.js"), { replayFailedNative: n } = await import("./nativeSender-BE_mzw_S.js"), { DeviceInfoTrackerNative: i } = await import("./deviceInfo.native-D2k0LDhI.js"), { NetworkInfoTrackerNative: o } = await import("./networkInfo.native-BK5fpAOL.js");
13
- let c;
13
+ u(e?.debug ?? !1), super(), this.tapRage = new g(N), r.log("🌍 Running Native Telemetry"), this.instancePromise = (async () => {
14
14
  try {
15
- ({ Platform: { OS: c } } = await import("react-native"));
15
+ await import("./index-BtLlV1HA.js").then((c) => c.i);
16
+ } catch (c) {
17
+ r.warn("crypto.getRandomValues polyfill unavailable:", c);
18
+ }
19
+ const { Telemetry: t } = await import("./telemetry-ByDJIz_9.js"), { nativeSender: a } = await import("./nativeSender-pgVSIv-X.js"), { nativeStore: o } = await import("./store.native-BYBJcy6o.js"), { DeviceInfoTrackerNative: s } = await import("./deviceInfo.native-BJ-3Jj1T.js"), { NetworkInfoTrackerNative: n } = await import("./networkInfo.native-CGrx9cnH.js");
20
+ let m;
21
+ try {
22
+ ({ Platform: { OS: m } } = await import("react-native"));
16
23
  } catch {
17
24
  }
18
- const w = new o(), m = new i(), h = e?.sender ?? a(e?.endpoint, e?.apiKey), p = new t({
19
- sender: h,
25
+ const d = new n(), h = new s(), w = e?.store ?? o(), v = e?.sender ?? a(e?.endpoint, e?.apiKey, w), l = new t({
26
+ sender: v,
20
27
  batchSize: e?.batchSize,
21
28
  flushIntervalMs: e?.flushIntervalMs,
22
29
  endpoint: e?.endpoint,
23
- platform: c,
24
- deviceInfoHandler: m,
25
- networkInfoHandler: w
26
- });
27
- return n(e?.endpoint, e?.apiKey).catch((k) => {
28
- r.warn("Native replay failed:", k);
29
- }), p;
30
- })(), this.startSessionOnInit().catch((t) => r.warn("Native startSession failed:", t)), this.attachAppState().catch((t) => r.warn("Native AppState attach failed:", t)), this.attachAppLifecycle().catch((t) => {
30
+ platform: m,
31
+ deviceInfoHandler: h,
32
+ networkInfoHandler: d,
33
+ store: w,
34
+ beforeSend: e?.beforeSend,
35
+ sessionSampleRate: e?.sessionSampleRate,
36
+ traceHostAllowlist: e?.traceHostAllowlist,
37
+ buildId: e?.buildId
38
+ }), { runtimeReadyAt: p } = await import("./runtimeReady.native-Bh7EcYmK.js").catch((c) => (r.warn("Native runtime-ready module unavailable:", c), { runtimeReadyAt: async () => {
39
+ } })), { seedRuntimeReady: y } = await import("./seedRuntimeReady-Cz8nOKoo.js");
40
+ return y(l.views, p, "Native"), await l.resumeOrStartSession().catch((c) => r.warn("Native session resume failed:", c)), this.resolved = l, l;
41
+ })(), this.attachAppLifecycle().catch((t) => {
31
42
  r.log("Native attachAppLifecycle errors", t);
32
43
  }), this.trackErrors({ captureConsole: e?.captureConsole }).catch((t) => {
33
44
  r.warn("Native trackErrors failed:", t);
@@ -39,71 +50,95 @@ class d extends l {
39
50
  r.log("Native trackMemoryUsage errors", t);
40
51
  });
41
52
  }
42
- async startSessionOnInit() {
43
- await (await this.instancePromise).startSession();
44
- }
45
- // Background finalize (immediate flush). Foreground after background fresh session. (#29)
46
- async attachAppState() {
47
- const { AppState: e } = await import("react-native"), t = await this.instancePromise;
48
- let a = e.currentState;
49
- e.addEventListener("change", (n) => {
50
- n === "background" ? t.finalizeSession().catch((i) => r.warn("finalizeSession failed:", i)) : n === "active" && a === "background" && t.newSession().catch((i) => r.warn("newSession failed:", i)), a = n;
51
- });
52
- }
53
- // app_lifecycle on foreground/background via RN AppState (#30)
53
+ // app_lifecycle on foreground/background via RN AppState (#30).
54
+ //
55
+ // §4.2: neither build rotates on a lifecycle transition — parity with web is reached by
56
+ // *deleting* the old background→finalize / foreground→newSession pair, not by adding it
57
+ // to web. Backgrounding still forces a flush, because the process is now most likely to
58
+ // be killed and the queue only lives in memory.
54
59
  async attachAppLifecycle() {
55
- const { AppState: e } = await import("react-native"), t = await this.instancePromise, { AppLifecycleEmitter: a } = await import("./appLifecycle-Cynw0kAv.js"), n = new a(t);
56
- n.onState(e.currentState === "active"), e.addEventListener("change", (i) => n.onState(i === "active"));
60
+ const { AppState: e } = await import("react-native"), t = await this.instancePromise, { AppLifecycleEmitter: a } = await import("./appLifecycle-DQErzJIR.js"), o = new a(t);
61
+ o.onState(e.currentState === "active").catch((s) => r.warn("app lifecycle seed failed:", s)), e.addEventListener("change", (s) => {
62
+ const n = s === "active";
63
+ o.onState(n).then(() => n ? void 0 : t.flush()).catch((m) => r.warn("background flush failed:", m));
64
+ });
57
65
  }
58
66
  async getDeviceInfo() {
59
- const { DeviceInfoTrackerNative: e } = await import("./deviceInfo.native-D2k0LDhI.js"), t = await this.instancePromise, a = new e();
67
+ const { DeviceInfoTrackerNative: e } = await import("./deviceInfo.native-BJ-3Jj1T.js"), t = await this.instancePromise, a = new e();
60
68
  return t.getDeviceInfo(a);
61
69
  }
62
70
  async getNetworkInfo() {
63
- const { NetworkInfoTrackerNative: e } = await import("./networkInfo.native-BK5fpAOL.js"), t = await this.instancePromise, a = new e();
71
+ const { NetworkInfoTrackerNative: e } = await import("./networkInfo.native-CGrx9cnH.js"), t = await this.instancePromise, a = new e();
64
72
  return t.getNetworkInfo(a);
65
73
  }
66
74
  async trackFrameDrops() {
67
- const { FrameDropTrackerNative: e } = await import("./frameDropsNative.native-CP7zrXDf.js"), t = await this.instancePromise, a = new e(t);
75
+ const { FrameDropTracker: e } = await import("./frameTracker-DdB8W_kC.js"), t = await this.instancePromise, a = new e(t);
68
76
  return t.trackFrameDrops(a);
69
77
  }
70
78
  async trackNetworkRequests() {
71
- const { NetworkTrackerNative: e } = await import("./interceptFetchNative.native-VlhtMG-U.js"), t = await this.instancePromise, a = new e(t);
79
+ const { NetworkTrackerNative: e } = await import("./interceptHttpNative.native-rX-lPNST.js"), t = await this.instancePromise, a = new e(t);
72
80
  return t.trackNetworkRequests(a);
73
81
  }
74
82
  async trackMemoryUsage() {
75
- const { TelemetryMemoryUsageNative: e } = await import("./memoryNative.native-BWLh2S9L.js"), t = await this.instancePromise, a = new e(t);
83
+ const { TelemetryMemoryUsageNative: e } = await import("./memoryNative.native-C42h9SjK.js"), t = await this.instancePromise, a = new e(t);
76
84
  return t.trackMemoryUsage(a);
77
85
  }
78
86
  // ---------- Screen Management ----------
79
87
  async screenStart(e) {
80
- (await this.instancePromise).screens.startScreen(e);
88
+ return (await this.instancePromise).screens.startScreen(e);
81
89
  }
82
90
  async screenEnd(e) {
83
- (await this.instancePromise).screens.endScreen(e);
91
+ return (await this.instancePromise).screens.endScreen(e);
84
92
  }
85
93
  async trackRoute(e, t) {
86
- (await this.instancePromise).recordRouteChange(e, t);
87
- }
88
- // Best-effort native taps → user.interaction (#33). Spread the returned props on your
89
- // app root <View>; each tap emits user.interaction with the current screen when known.
90
- // const props = await telemetry.interactionProps();
91
- // <View {...props}>{app}</View>
92
- async interactionProps() {
93
- const e = await this.instancePromise, { InteractionEmitter: t } = await import("./interaction-CH8yoY5-.js");
94
- return new t(e).responderProps();
94
+ return (await this.instancePromise).recordRouteChange(e, t);
95
95
  }
96
- async attachNavigation(e) {
97
- if (r.log("Attaching navigation tracker"), !e) {
98
- r.warn("Navigation reference is undefined. Cannot attach navigation tracker.");
99
- return;
100
- }
101
- const t = await this.instancePromise, { NavigationTrackerNative: a } = await import("./navigationNative.native-BUCGPQX2.js");
102
- new a(t).attach(e);
96
+ // ---------- Interactions ----------
97
+ /**
98
+ * §4.6's native producer, explicit-only (#103). `interactionProps()` is gone with
99
+ * `user.interaction` (#102): it sat on the consumer's **root** `<View>`, where
100
+ * `PressEvent.nativeEvent.target` is a node tag number with no public API resolving it,
101
+ * so it could not tell a tap on a button from a tap on padding and every row it emitted
102
+ * was un-nameable. There is no role model to gate on and no DOM to derive from, so
103
+ * anything auto-derived here would be either wrong or a PII leak.
104
+ *
105
+ * `name` is web's rung 1 — explicit author intent — so it ships **unnormalized and
106
+ * uncapped**, and `ui.name_source` has exactly **two** values: `edge_action`, or `none`
107
+ * for a blank name, whose `ui.target` is `unnamed`. **`surface` never appears**: it only
108
+ * means something where role-less elements exist.
109
+ *
110
+ * ⚠ **The mint/emit split.** The row's `timestamp`, `view.id`, `view.name` and
111
+ * `session.id` are snapshotted **here, synchronously**, because the host's press handler
112
+ * navigates on the next line and the emit rides a promise. Stamping emit time would
113
+ * attribute a navigating tap to **the view it opened**, inverting every "which screen
114
+ * frustrates users" query. Before `instancePromise` settles there is no core to snapshot
115
+ * from, so a tap that early falls back to emit-time identity — the launch view either
116
+ * way.
117
+ *
118
+ * ⚠ **`ui.dead` is absent on every native row**, never `false`: with no DOM there is no
119
+ * mutation signal, so any dead-click *rate* must filter to the web build.
120
+ */
121
+ async trackTap(e) {
122
+ const t = Date.now(), a = typeof e == "string" && e.trim() !== "", o = T({
123
+ type: "tap",
124
+ target: a ? e : S,
125
+ nameSource: a ? "edge_action" : "none",
126
+ // No element model: nothing was resolved, so the tag names the platform rather
127
+ // than inventing a `<button>` that does not exist. §4.6 types it never-null, as
128
+ // it does the coordinates the builder floors at 0 — a `PressEvent` carries some,
129
+ // but `trackTap(name)` deliberately takes none: the name is the whole contract.
130
+ tag: "native",
131
+ // Gated to named taps (§4.6): running rage over `unnamed` would not merely lose
132
+ // information, it would invent a frustration event that never happened. Identity
133
+ // is the name, which on native *is* the element — there is no node to key on.
134
+ rage: a && this.tapRage.record(e, t)
135
+ }), s = (n) => n.log("ui.interaction", { ...n.trace.interactionSpan(t), ...o }, n.snapshot(t));
136
+ return Promise.resolve(this.resolved ? s(this.resolved) : this.instancePromise.then(s)).catch((n) => r.warn("Native ui.interaction failed:", n));
103
137
  }
104
138
  }
105
139
  export {
106
- d as TelemetryNative,
107
- N as createTelemetry
140
+ R as TelemetryNative,
141
+ D as createTelemetry,
142
+ E as memoryStore
108
143
  };
109
144
  //# sourceMappingURL=index.native.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.native.js","sources":["../src/createTelemetry.native.ts","../src/index.native.ts"],"sourcesContent":["import { TelemetryNative } from \"./index.native\";\n\nexport type TelemetryOpts = {\n apiKey: string; // required; must start with \"edge_\"\n sender?: any;\n batchSize?: number;\n flushIntervalMs?: number;\n endpoint?: string;\n captureConsole?: boolean; // funnel console.error/warn into app.crash (default on, opt-out)\n debug?: boolean; // SDK-internal diagnostics; off by default (#23)\n};\n\nexport function assertApiKey(apiKey?: string) {\n if (!apiKey || !apiKey.startsWith(\"edge_\")) {\n throw new Error(\"createTelemetry: apiKey is required and must start with 'edge_'\");\n }\n}\n\n/**\n * Cross-platform factory for telemetry. The platform is chosen by the bundler\n * via the .web / .native file split — no runtime navigator sniffing.\n */\nexport function createTelemetry(opts: TelemetryOpts) {\n assertApiKey(opts?.apiKey);\n return new TelemetryNative(opts);\n}\n","// React Native telemetry implementation\nimport { TelemetryBase } from \"./index.base\";\nimport { debug, setDebug } from \"./core/debug\";\n\nexport { createTelemetry, type TelemetryOpts } from \"./createTelemetry.native\";\n\nexport class TelemetryNative extends TelemetryBase {\n constructor(opts?: {\n apiKey?: string;\n sender?: any;\n batchSize?: number;\n flushIntervalMs?: number;\n endpoint?: string;\n captureConsole?: boolean;\n debug?: boolean;\n }) {\n setDebug(opts?.debug ?? false); // gate SDK console noise before anything logs (#23)\n super();\n\n debug.log(\"🌍 Running Native Telemetry\");\n this.instancePromise = (async () => {\n const { Telemetry } = await import(\"./core/telemetry\");\n const { nativeSender } = await import(\"./adapters/nativeSender\");\n\n const { replayFailedNative } = await import(\"./adapters/nativeSender\");\n const { DeviceInfoTrackerNative } = await import(\"./adapters/native/deviceInfo.native\");\n const { NetworkInfoTrackerNative } = await import(\"./adapters/native/networkInfo.native\");\n\n // device OS forms the device/session id suffix (ios|android)\n let platform: string | undefined;\n try {\n ({ Platform: { OS: platform } } = await import(\"react-native\") as any);\n } catch { /* non-RN context (e.g. tests) — omit the suffix */ }\n\n const networkInfoTrackerNative = new NetworkInfoTrackerNative();\n const deviceInfoTrackerNative = new DeviceInfoTrackerNative();\n\n const sender = opts?.sender ?? nativeSender(opts?.endpoint, opts?.apiKey);\n\n const telemetry = new Telemetry({\n sender,\n batchSize: opts?.batchSize,\n flushIntervalMs: opts?.flushIntervalMs,\n endpoint: opts?.endpoint,\n platform,\n deviceInfoHandler: deviceInfoTrackerNative,\n networkInfoHandler: networkInfoTrackerNative,\n });\n\n // 🔄 recover failed events right after init\n replayFailedNative(opts?.endpoint, opts?.apiKey).catch(err => {\n debug.warn(\"Native replay failed:\", err);\n });\n\n return telemetry;\n })();\n\n // session.started on init; AppState drives background→finalize, foreground→new session (#29)\n this.startSessionOnInit().catch(err => debug.warn(\"Native startSession failed:\", err));\n this.attachAppState().catch(err => debug.warn(\"Native AppState attach failed:\", err));\n\n // app_lifecycle on foreground/background (#30)\n this.attachAppLifecycle().catch(err => {\n debug.log(\"Native attachAppLifecycle errors\", err);\n });\n\n this.trackErrors({ captureConsole: opts?.captureConsole }).catch(err => {\n debug.warn(\"Native trackErrors failed:\", err);\n });\n\n this.trackFrameDrops().catch(err => {\n debug.log(\"Native trackFrameDrops errors\", err);\n });\n this.trackNetworkRequests().catch(err => {\n debug.log(\"Native trackNetworkRequests errors\", err);\n });\n this.trackMemoryUsage().catch(err => {\n debug.log(\"Native trackMemoryUsage errors\", err);\n });\n }\n\n private async startSessionOnInit() {\n const inst = await this.instancePromise;\n await inst.startSession();\n }\n\n // Background → finalize (immediate flush). Foreground after background → fresh session. (#29)\n private async attachAppState() {\n const { AppState } = await import(\"react-native\") as any;\n const inst = await this.instancePromise;\n let prev: string = AppState.currentState;\n AppState.addEventListener(\"change\", (next: string) => {\n if (next === \"background\") {\n inst.finalizeSession().catch((e: any) => debug.warn(\"finalizeSession failed:\", e));\n } else if (next === \"active\" && prev === \"background\") {\n inst.newSession().catch((e: any) => debug.warn(\"newSession failed:\", e));\n }\n prev = next;\n });\n }\n\n // app_lifecycle on foreground/background via RN AppState (#30)\n async attachAppLifecycle() {\n const { AppState } = await import(\"react-native\") as any;\n const inst = await this.instancePromise;\n const { AppLifecycleEmitter } = await import(\"./adapters/appLifecycle\");\n const emitter = new AppLifecycleEmitter(inst);\n emitter.onState(AppState.currentState === \"active\"); // seed current state\n AppState.addEventListener(\"change\", (next: string) => emitter.onState(next === \"active\"));\n }\n\n async getDeviceInfo() {\n const { DeviceInfoTrackerNative } = await import(\"./adapters/native/deviceInfo.native\");\n const inst = await this.instancePromise;\n const deviceInfoTrackerNative = new DeviceInfoTrackerNative();\n return inst.getDeviceInfo(deviceInfoTrackerNative);\n }\n\n async getNetworkInfo() {\n const { NetworkInfoTrackerNative } = await import(\"./adapters/native/networkInfo.native\");\n const inst = await this.instancePromise;\n const networkInfoTrackerNative = new NetworkInfoTrackerNative();\n return inst.getNetworkInfo(networkInfoTrackerNative);\n }\n\n async trackFrameDrops() {\n const { FrameDropTrackerNative } = await import(\"./adapters/native/frameDropsNative.native\");\n const inst = await this.instancePromise;\n const frameDropTracker = new FrameDropTrackerNative(inst);\n return inst.trackFrameDrops(frameDropTracker);\n }\n\n async trackNetworkRequests() {\n const { NetworkTrackerNative } = await import(\"./adapters/native/interceptFetchNative.native\");\n const inst = await this.instancePromise;\n const networkTracker = new NetworkTrackerNative(inst);\n return inst.trackNetworkRequests(networkTracker);\n }\n\n async trackMemoryUsage() {\n const { TelemetryMemoryUsageNative } = await import(\"./adapters/native/memoryNative.native\");\n const inst = await this.instancePromise;\n const memoryTracker = new TelemetryMemoryUsageNative(inst);\n return inst.trackMemoryUsage(memoryTracker);\n }\n\n // ---------- Screen Management ----------\n\n async screenStart(name: string) {\n const inst = await this.instancePromise;\n inst.screens.startScreen(name);\n }\n\n async screenEnd(name: string) {\n const inst = await this.instancePromise;\n inst.screens.endScreen(name);\n }\n\n async trackRoute(from: string, to: string) {\n const inst = await this.instancePromise;\n inst.recordRouteChange(from, to);\n }\n\n // Best-effort native taps → user.interaction (#33). Spread the returned props on your\n // app root <View>; each tap emits user.interaction with the current screen when known.\n // const props = await telemetry.interactionProps();\n // <View {...props}>{app}</View>\n async interactionProps() {\n const inst = await this.instancePromise;\n const { InteractionEmitter } = await import(\"./adapters/interaction\");\n return new InteractionEmitter(inst).responderProps();\n }\n\n async attachNavigation(navigationRef: any) {\n debug.log(\"Attaching navigation tracker\");\n if (!navigationRef) {\n debug.warn(\"Navigation reference is undefined. Cannot attach navigation tracker.\");\n return;\n }\n const inst = await this.instancePromise;\n const { NavigationTrackerNative } = await import(\"./adapters/native/navigationNative.native\");\n const tracker = new NavigationTrackerNative(inst);\n tracker.attach(navigationRef);\n }\n}\n"],"names":["assertApiKey","apiKey","createTelemetry","opts","TelemetryNative","TelemetryBase","setDebug","debug","Telemetry","nativeSender","replayFailedNative","DeviceInfoTrackerNative","NetworkInfoTrackerNative","platform","networkInfoTrackerNative","deviceInfoTrackerNative","sender","telemetry","err","AppState","inst","prev","next","e","AppLifecycleEmitter","emitter","FrameDropTrackerNative","frameDropTracker","NetworkTrackerNative","networkTracker","TelemetryMemoryUsageNative","memoryTracker","name","from","to","InteractionEmitter","navigationRef","NavigationTrackerNative"],"mappings":";AAYO,SAASA,EAAaC,GAAiB;AAC1C,MAAI,CAACA,KAAU,CAACA,EAAO,WAAW,OAAO;AACrC,UAAM,IAAI,MAAM,iEAAiE;AAEzF;AAMO,SAASC,EAAgBC,GAAqB;AACjD,SAAAH,EAAaG,GAAM,MAAM,GAClB,IAAIC,EAAgBD,CAAI;AACnC;ACnBO,MAAMC,UAAwBC,EAAc;AAAA,EAC/C,YAAYF,GAQT;AACC,IAAAG,EAASH,GAAM,SAAS,EAAK,GAC7B,MAAA,GAEAI,EAAM,IAAI,6BAA6B,GACvC,KAAK,mBAAmB,YAAY;AAChC,YAAM,EAAE,WAAAC,EAAA,IAAc,MAAM,OAAO,yBAAkB,GAC/C,EAAE,cAAAC,EAAA,IAAiB,MAAM,OAAO,4BAAyB,GAEzD,EAAE,oBAAAC,EAAA,IAAuB,MAAM,OAAO,4BAAyB,GAC/D,EAAE,yBAAAC,EAAA,IAA4B,MAAM,OAAO,iCAAqC,GAChF,EAAE,0BAAAC,EAAA,IAA6B,MAAM,OAAO,kCAAsC;AAGxF,UAAIC;AACJ,UAAI;AACA,SAAC,EAAE,UAAU,EAAE,IAAIA,IAAS,IAAM,MAAM,OAAO,cAAc;AAAA,MACjE,QAAQ;AAAA,MAAsD;AAE9D,YAAMC,IAA2B,IAAIF,EAAA,GAC/BG,IAA0B,IAAIJ,EAAA,GAE9BK,IAASb,GAAM,UAAUM,EAAaN,GAAM,UAAUA,GAAM,MAAM,GAElEc,IAAY,IAAIT,EAAU;AAAA,QAC5B,QAAAQ;AAAA,QACA,WAAWb,GAAM;AAAA,QACjB,iBAAiBA,GAAM;AAAA,QACvB,UAAUA,GAAM;AAAA,QAChB,UAAAU;AAAA,QACA,mBAAmBE;AAAA,QACnB,oBAAoBD;AAAA,MAAA,CACvB;AAGD,aAAAJ,EAAmBP,GAAM,UAAUA,GAAM,MAAM,EAAE,MAAM,CAAAe,MAAO;AAC1D,QAAAX,EAAM,KAAK,yBAAyBW,CAAG;AAAA,MAC3C,CAAC,GAEMD;AAAA,IACX,GAAA,GAGA,KAAK,qBAAqB,MAAM,CAAAC,MAAOX,EAAM,KAAK,+BAA+BW,CAAG,CAAC,GACrF,KAAK,iBAAiB,MAAM,CAAAA,MAAOX,EAAM,KAAK,kCAAkCW,CAAG,CAAC,GAGpF,KAAK,mBAAA,EAAqB,MAAM,CAAAA,MAAO;AACnC,MAAAX,EAAM,IAAI,oCAAoCW,CAAG;AAAA,IACrD,CAAC,GAED,KAAK,YAAY,EAAE,gBAAgBf,GAAM,gBAAgB,EAAE,MAAM,CAAAe,MAAO;AACpE,MAAAX,EAAM,KAAK,8BAA8BW,CAAG;AAAA,IAChD,CAAC,GAED,KAAK,gBAAA,EAAkB,MAAM,CAAAA,MAAO;AAChC,MAAAX,EAAM,IAAI,iCAAiCW,CAAG;AAAA,IAClD,CAAC,GACD,KAAK,qBAAA,EAAuB,MAAM,CAAAA,MAAO;AACrC,MAAAX,EAAM,IAAI,sCAAsCW,CAAG;AAAA,IACvD,CAAC,GACD,KAAK,iBAAA,EAAmB,MAAM,CAAAA,MAAO;AACjC,MAAAX,EAAM,IAAI,kCAAkCW,CAAG;AAAA,IACnD,CAAC;AAAA,EACL;AAAA,EAEA,MAAc,qBAAqB;AAE/B,WADa,MAAM,KAAK,iBACb,aAAA;AAAA,EACf;AAAA;AAAA,EAGA,MAAc,iBAAiB;AAC3B,UAAM,EAAE,UAAAC,EAAA,IAAa,MAAM,OAAO,cAAc,GAC1CC,IAAO,MAAM,KAAK;AACxB,QAAIC,IAAeF,EAAS;AAC5B,IAAAA,EAAS,iBAAiB,UAAU,CAACG,MAAiB;AAClD,MAAIA,MAAS,eACTF,EAAK,kBAAkB,MAAM,CAACG,MAAWhB,EAAM,KAAK,2BAA2BgB,CAAC,CAAC,IAC1ED,MAAS,YAAYD,MAAS,gBACrCD,EAAK,aAAa,MAAM,CAACG,MAAWhB,EAAM,KAAK,sBAAsBgB,CAAC,CAAC,GAE3EF,IAAOC;AAAA,IACX,CAAC;AAAA,EACL;AAAA;AAAA,EAGA,MAAM,qBAAqB;AACvB,UAAM,EAAE,UAAAH,EAAA,IAAa,MAAM,OAAO,cAAc,GAC1CC,IAAO,MAAM,KAAK,iBAClB,EAAE,qBAAAI,EAAA,IAAwB,MAAM,OAAO,4BAAyB,GAChEC,IAAU,IAAID,EAAoBJ,CAAI;AAC5C,IAAAK,EAAQ,QAAQN,EAAS,iBAAiB,QAAQ,GAClDA,EAAS,iBAAiB,UAAU,CAACG,MAAiBG,EAAQ,QAAQH,MAAS,QAAQ,CAAC;AAAA,EAC5F;AAAA,EAEA,MAAM,gBAAgB;AAClB,UAAM,EAAE,yBAAAX,EAAA,IAA4B,MAAM,OAAO,iCAAqC,GAChFS,IAAO,MAAM,KAAK,iBAClBL,IAA0B,IAAIJ,EAAA;AACpC,WAAOS,EAAK,cAAcL,CAAuB;AAAA,EACrD;AAAA,EAEA,MAAM,iBAAiB;AACnB,UAAM,EAAE,0BAAAH,EAAA,IAA6B,MAAM,OAAO,kCAAsC,GAClFQ,IAAO,MAAM,KAAK,iBAClBN,IAA2B,IAAIF,EAAA;AACrC,WAAOQ,EAAK,eAAeN,CAAwB;AAAA,EACvD;AAAA,EAEA,MAAM,kBAAkB;AACpB,UAAM,EAAE,wBAAAY,EAAA,IAA2B,MAAM,OAAO,uCAA2C,GACrFN,IAAO,MAAM,KAAK,iBAClBO,IAAmB,IAAID,EAAuBN,CAAI;AACxD,WAAOA,EAAK,gBAAgBO,CAAgB;AAAA,EAChD;AAAA,EAEA,MAAM,uBAAuB;AACzB,UAAM,EAAE,sBAAAC,EAAA,IAAyB,MAAM,OAAO,2CAA+C,GACvFR,IAAO,MAAM,KAAK,iBAClBS,IAAiB,IAAID,EAAqBR,CAAI;AACpD,WAAOA,EAAK,qBAAqBS,CAAc;AAAA,EACnD;AAAA,EAEA,MAAM,mBAAmB;AACrB,UAAM,EAAE,4BAAAC,EAAA,IAA+B,MAAM,OAAO,mCAAuC,GACrFV,IAAO,MAAM,KAAK,iBAClBW,IAAgB,IAAID,EAA2BV,CAAI;AACzD,WAAOA,EAAK,iBAAiBW,CAAa;AAAA,EAC9C;AAAA;AAAA,EAIA,MAAM,YAAYC,GAAc;AAE5B,KADa,MAAM,KAAK,iBACnB,QAAQ,YAAYA,CAAI;AAAA,EACjC;AAAA,EAEA,MAAM,UAAUA,GAAc;AAE1B,KADa,MAAM,KAAK,iBACnB,QAAQ,UAAUA,CAAI;AAAA,EAC/B;AAAA,EAEA,MAAM,WAAWC,GAAcC,GAAY;AAEvC,KADa,MAAM,KAAK,iBACnB,kBAAkBD,GAAMC,CAAE;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,mBAAmB;AACrB,UAAMd,IAAO,MAAM,KAAK,iBAClB,EAAE,oBAAAe,EAAA,IAAuB,MAAM,OAAO,2BAAwB;AACpE,WAAO,IAAIA,EAAmBf,CAAI,EAAE,eAAA;AAAA,EACxC;AAAA,EAEA,MAAM,iBAAiBgB,GAAoB;AAEvC,QADA7B,EAAM,IAAI,8BAA8B,GACpC,CAAC6B,GAAe;AAChB,MAAA7B,EAAM,KAAK,sEAAsE;AACjF;AAAA,IACJ;AACA,UAAMa,IAAO,MAAM,KAAK,iBAClB,EAAE,yBAAAiB,EAAA,IAA4B,MAAM,OAAO,uCAA2C;AAE5F,IADgB,IAAIA,EAAwBjB,CAAI,EACxC,OAAOgB,CAAa;AAAA,EAChC;AACJ;"}
1
+ {"version":3,"file":"index.native.js","sources":["../src/createTelemetry.native.ts","../src/index.native.ts"],"sourcesContent":["import { TelemetryNative } from \"./index.native\";\nimport type { Store } from \"./core/store\";\nimport type { BeforeSend } from \"./core/beforeSend\";\nimport { normalizeAllowlist } from \"./adapters/traceHeader\";\nimport { setDebug } from \"./core/debug\";\n\nexport type TelemetryOpts = {\n apiKey: string; // required credential; must start with \"edge_\" (API key or JWT, #90)\n sender?: any;\n batchSize?: number;\n flushIntervalMs?: number;\n endpoint?: string;\n // console.error -> app.error, console.warn -> a breadcrumb. Default OFF (§4.7, #100).\n captureConsole?: boolean;\n debug?: boolean; // SDK-internal diagnostics; off by default (#23)\n store?: Store; // persisted-state port (#89); either shape — the native path awaits\n // Constructor-only (§3.6) — there is deliberately no runtime setter for either.\n beforeSend?: BeforeSend; // sync scrubbing hook, run at enqueue over events and metrics\n sessionSampleRate?: number; // 0.0-1.0, sticky per session, re-rolled at rotation; default 1\n // §6.4/#99. Bare hosts, exact match, **ports ignored** (a deliberate mismatch with\n // `http.host`, which keeps the port — do not join them). Empty by default: v4 is dark on\n // upgrade. Listing a host asserts that host's CORS allows `traceparent`; a malformed\n // entry throws in dev and is dropped in production.\n traceHostAllowlist?: string[];\n // §4.8 — the symbolication resolve key. A git SHA or CI run number; consumer-supplied\n // (the SDK has zero OTA awareness), **omitted when unset, never `\"\"`**, and never\n // derived from app.version + app.build_number under any circumstances.\n buildId?: string;\n};\n\n// Deliberately loose: `apiKey` is the *credential*, and under AUTH_MODE=jwt it is\n// `edge_<jwt>` — a shape the collector's >=3-`_`-part API-key check would reject. Tightening\n// to that check here would hard-reject every JWT and make the segmented deployment\n// unreachable, which is the exact bug #90 exists to close. Prefix + non-empty remainder is\n// all we assert; the real catch is the 401 warn (contract §11.1).\nexport function assertApiKey(apiKey?: string) {\n if (!apiKey || !apiKey.startsWith(\"edge_\")) {\n throw new Error(\"createTelemetry: apiKey is required and must start with 'edge_'\");\n }\n}\n\n/**\n * Cross-platform factory for telemetry. The platform is chosen by the bundler\n * via the .web / .native file split — no runtime navigator sniffing.\n */\nexport function createTelemetry(opts: TelemetryOpts) {\n assertApiKey(opts?.apiKey);\n // §6.4's dev throw has to happen *here*, synchronously: the core Telemetry is built\n // inside `instancePromise`, which deliberately never rethrows, so a throw down there\n // would be a silently rejected promise instead of the loud config error dev asks for.\n // In production it drops the bad entry and reports through debug() — which is why the\n // gate has to be open first: the entry ctor's own setDebug() runs *after* this line, so\n // without this the production report would be a guaranteed no-op even with debug: true.\n // It runs again in TraceManager, where it is idempotent.\n setDebug(opts?.debug ?? false);\n normalizeAllowlist(opts?.traceHostAllowlist);\n return new TelemetryNative(opts);\n}\n","// React Native telemetry implementation\nimport { TelemetryBase } from \"./index.base\";\nimport { debug, setDebug } from \"./core/debug\";\nimport { RAGE_WINDOW_MS, RageTracker, UI_UNNAMED, uiAttributes } from \"./adapters/uiInteraction\";\nimport type { Store } from \"./core/store\";\nimport type { BeforeSend } from \"./core/beforeSend\";\n\nexport { createTelemetry, type TelemetryOpts } from \"./createTelemetry.native\";\n\n// The Store port (#89) — public so a consumer can inject their own persistence,\n// and so the in-memory fake is available outside the test tree.\nexport type { Store, SyncStore, AsyncStore, StoreRead, StoreWrite } from \"./core/store\";\nexport { memoryStore, type MemoryStoreOpts } from \"./core/memoryStore\";\n\n// The scrubbing hook (#93) — public so a consumer can type their beforeSend.\nexport type { BeforeSend } from \"./core/beforeSend\";\n\nexport class TelemetryNative extends TelemetryBase {\n /** ≥3 named taps in a 1000 ms window, keyed on the name — see `trackTap`. */\n private readonly tapRage = new RageTracker(RAGE_WINDOW_MS);\n /**\n * The resolved core, once `instancePromise` settles. `trackTap` is the one public method that\n * cannot afford an `await` before it reads the world: the host's own press handler\n * navigates on the very next line (§4.6's mint/emit split).\n */\n private resolved?: any;\n\n constructor(opts?: {\n apiKey?: string;\n sender?: any;\n batchSize?: number;\n flushIntervalMs?: number;\n endpoint?: string;\n captureConsole?: boolean;\n debug?: boolean;\n store?: Store; // either shape: the native path awaits\n // Constructor-only (§3.6). No runtime setter: registering later leaves a window\n // where session.started and the earliest requests have already been enqueued.\n beforeSend?: BeforeSend;\n sessionSampleRate?: number;\n // §6.4/#99 — bare hosts, exact match, ports ignored, empty by default.\n traceHostAllowlist?: string[];\n // §4.8 — symbolication resolve key. Omitted when unset, never `\"\"`, never derived.\n buildId?: string;\n }) {\n setDebug(opts?.debug ?? false); // gate SDK console noise before anything logs (#23)\n super();\n\n debug.log(\"🌍 Running Native Telemetry\");\n this.instancePromise = (async () => {\n // RN ships no WebCrypto; this already-declared dependency installs\n // crypto.getRandomValues, which the id path now draws from (#91). It is a\n // no-op wherever crypto already exists, which is why a failure here is only a\n // warning — off-device (SSR, tests) crypto is already there. If it genuinely\n // isn't, randomHex() throws with the reinstall instruction.\n try { await import(\"react-native-get-random-values\"); }\n catch (err) { debug.warn(\"crypto.getRandomValues polyfill unavailable:\", err); }\n\n const { Telemetry } = await import(\"./core/telemetry\");\n const { nativeSender } = await import(\"./adapters/nativeSender\");\n\n const { nativeStore } = await import(\"./adapters/native/store.native\");\n const { DeviceInfoTrackerNative } = await import(\"./adapters/native/deviceInfo.native\");\n const { NetworkInfoTrackerNative } = await import(\"./adapters/native/networkInfo.native\");\n\n // device OS forms the device/session id suffix (ios|android)\n let platform: string | undefined;\n try {\n ({ Platform: { OS: platform } } = await import(\"react-native\") as any);\n } catch { /* non-RN context (e.g. tests) — omit the suffix */ }\n\n const networkInfoTrackerNative = new NetworkInfoTrackerNative();\n const deviceInfoTrackerNative = new DeviceInfoTrackerNative();\n\n // One store, shared by the offline queue and core (#89) — so a consumer that\n // injects a store governs both, instead of the sender quietly keeping its own.\n const store = opts?.store ?? nativeStore();\n const sender = opts?.sender ?? nativeSender(opts?.endpoint, opts?.apiKey, store);\n\n const telemetry = new Telemetry({\n sender,\n batchSize: opts?.batchSize,\n flushIntervalMs: opts?.flushIntervalMs,\n endpoint: opts?.endpoint,\n platform,\n deviceInfoHandler: deviceInfoTrackerNative,\n networkInfoHandler: networkInfoTrackerNative,\n store,\n beforeSend: opts?.beforeSend,\n sessionSampleRate: opts?.sessionSampleRate,\n traceHostAllowlist: opts?.traceHostAllowlist,\n buildId: opts?.buildId,\n });\n\n // The offline queue drains through `sender.replayFailed()`, which the core\n // constructor above already called (#113). A second call here is what sent\n // every recovered batch twice.\n\n // Resume or start the session before the instance is visible (#92), so\n // session.started can never land behind the host app's first event.\n // Never rethrown into instancePromise: finalizeSession() flushes, flush() rethrows on a\n // dead collector, and a rejected instancePromise would brick every public method for the\n // life of the process. Hydration has already run; only the emission is lost.\n // §4.5.2's `initial_load` seed: the launch view stays busy until the platform's\n // runtime-ready marker. The *module* is awaited with everything else, so the seed\n // is armed before `instancePromise` resolves; the *marker* is not, because on web\n // it arrives with the load event and blocking init on it would delay every host\n // call behind the page's own images.\n // The module is awaited so the seed is armed before `instancePromise` resolves,\n // but never rethrown into it: a failed chunk load must not brick every public\n // method for the life of the process. A missing reader just releases the gate.\n const { runtimeReadyAt } = await import(\"./adapters/native/runtimeReady.native\")\n .catch((err: unknown) => {\n debug.warn(\"Native runtime-ready module unavailable:\", err);\n return { runtimeReadyAt: async () => undefined };\n });\n const { seedRuntimeReady } = await import(\"./adapters/seedRuntimeReady\");\n seedRuntimeReady(telemetry.views, runtimeReadyAt, \"Native\");\n\n await telemetry.resumeOrStartSession()\n .catch(err => debug.warn(\"Native session resume failed:\", err));\n\n this.resolved = telemetry;\n return telemetry;\n })();\n\n // app_lifecycle on foreground/background (#30)\n this.attachAppLifecycle().catch(err => {\n debug.log(\"Native attachAppLifecycle errors\", err);\n });\n\n this.trackErrors({ captureConsole: opts?.captureConsole }).catch(err => {\n debug.warn(\"Native trackErrors failed:\", err);\n });\n\n this.trackFrameDrops().catch(err => {\n debug.log(\"Native trackFrameDrops errors\", err);\n });\n this.trackNetworkRequests().catch(err => {\n debug.log(\"Native trackNetworkRequests errors\", err);\n });\n this.trackMemoryUsage().catch(err => {\n debug.log(\"Native trackMemoryUsage errors\", err);\n });\n }\n\n // app_lifecycle on foreground/background via RN AppState (#30).\n //\n // §4.2: neither build rotates on a lifecycle transition — parity with web is reached by\n // *deleting* the old background→finalize / foreground→newSession pair, not by adding it\n // to web. Backgrounding still forces a flush, because the process is now most likely to\n // be killed and the queue only lives in memory.\n async attachAppLifecycle() {\n const { AppState } = await import(\"react-native\") as any;\n const inst = await this.instancePromise;\n const { AppLifecycleEmitter } = await import(\"./adapters/appLifecycle\");\n const emitter = new AppLifecycleEmitter(inst);\n // seed current state — a transition-only emitter, so this enqueues nothing\n emitter.onState(AppState.currentState === \"active\")\n .catch((e: any) => debug.warn(\"app lifecycle seed failed:\", e));\n AppState.addEventListener(\"change\", (next: string) => {\n const isActive = next === \"active\";\n // Awaited before the flush, not fired alongside it: backgrounding is a view\n // boundary (§4.5) and the `view` row it emits is exactly the row this flush\n // exists to rescue from the kill that usually follows.\n emitter.onState(isActive)\n .then(() => (isActive ? undefined : inst.flush()))\n .catch((e: any) => debug.warn(\"background flush failed:\", e));\n });\n }\n\n async getDeviceInfo() {\n const { DeviceInfoTrackerNative } = await import(\"./adapters/native/deviceInfo.native\");\n const inst = await this.instancePromise;\n const deviceInfoTrackerNative = new DeviceInfoTrackerNative();\n return inst.getDeviceInfo(deviceInfoTrackerNative);\n }\n\n async getNetworkInfo() {\n const { NetworkInfoTrackerNative } = await import(\"./adapters/native/networkInfo.native\");\n const inst = await this.instancePromise;\n const networkInfoTrackerNative = new NetworkInfoTrackerNative();\n return inst.getNetworkInfo(networkInfoTrackerNative);\n }\n\n async trackFrameDrops() {\n const { FrameDropTracker } = await import(\"./adapters/frameTracker\");\n const inst = await this.instancePromise;\n const frameDropTracker = new FrameDropTracker(inst);\n return inst.trackFrameDrops(frameDropTracker);\n }\n\n async trackNetworkRequests() {\n const { NetworkTrackerNative } = await import(\"./adapters/native/interceptHttpNative.native\");\n const inst = await this.instancePromise;\n const networkTracker = new NetworkTrackerNative(inst);\n return inst.trackNetworkRequests(networkTracker);\n }\n\n async trackMemoryUsage() {\n const { TelemetryMemoryUsageNative } = await import(\"./adapters/native/memoryNative.native\");\n const inst = await this.instancePromise;\n const memoryTracker = new TelemetryMemoryUsageNative(inst);\n return inst.trackMemoryUsage(memoryTracker);\n }\n\n // ---------- Screen Management ----------\n\n async screenStart(name: string) {\n const inst = await this.instancePromise;\n return inst.screens.startScreen(name);\n }\n\n async screenEnd(name: string) {\n const inst = await this.instancePromise;\n return inst.screens.endScreen(name);\n }\n\n async trackRoute(from: string, to: string) {\n const inst = await this.instancePromise;\n return inst.recordRouteChange(from, to);\n }\n\n // ---------- Interactions ----------\n\n /**\n * §4.6's native producer, explicit-only (#103). `interactionProps()` is gone with\n * `user.interaction` (#102): it sat on the consumer's **root** `<View>`, where\n * `PressEvent.nativeEvent.target` is a node tag number with no public API resolving it,\n * so it could not tell a tap on a button from a tap on padding and every row it emitted\n * was un-nameable. There is no role model to gate on and no DOM to derive from, so\n * anything auto-derived here would be either wrong or a PII leak.\n *\n * `name` is web's rung 1 — explicit author intent — so it ships **unnormalized and\n * uncapped**, and `ui.name_source` has exactly **two** values: `edge_action`, or `none`\n * for a blank name, whose `ui.target` is `unnamed`. **`surface` never appears**: it only\n * means something where role-less elements exist.\n *\n * ⚠ **The mint/emit split.** The row's `timestamp`, `view.id`, `view.name` and\n * `session.id` are snapshotted **here, synchronously**, because the host's press handler\n * navigates on the next line and the emit rides a promise. Stamping emit time would\n * attribute a navigating tap to **the view it opened**, inverting every \"which screen\n * frustrates users\" query. Before `instancePromise` settles there is no core to snapshot\n * from, so a tap that early falls back to emit-time identity — the launch view either\n * way.\n *\n * ⚠ **`ui.dead` is absent on every native row**, never `false`: with no DOM there is no\n * mutation signal, so any dead-click *rate* must filter to the web build.\n */\n async trackTap(name: string) {\n const at = Date.now();\n const named = typeof name === \"string\" && name.trim() !== \"\";\n const attrs = uiAttributes({\n type: \"tap\",\n target: named ? name : UI_UNNAMED,\n nameSource: named ? \"edge_action\" : \"none\",\n // No element model: nothing was resolved, so the tag names the platform rather\n // than inventing a `<button>` that does not exist. §4.6 types it never-null, as\n // it does the coordinates the builder floors at 0 — a `PressEvent` carries some,\n // but `trackTap(name)` deliberately takes none: the name is the whole contract.\n tag: \"native\",\n // Gated to named taps (§4.6): running rage over `unnamed` would not merely lose\n // information, it would invent a frustration event that never happened. Identity\n // is the name, which on native *is* the element — there is no node to key on.\n rage: named && this.tapRage.record(name, at),\n });\n // §6.2: **every** tap mints an interaction root, live carrier or not — a tap is a new\n // user action by definition, so the request it fires is its child and not the route\n // change's before it.\n const emit = (inst: any) =>\n inst.log(\"ui.interaction\", { ...inst.trace.interactionSpan(at), ...attrs }, inst.snapshot(at));\n // Swallowed like every other capture path: the README's own example calls this\n // un-awaited from an `onPress`, and a RUM SDK must not be able to fault the host with\n // an unhandled rejection.\n return Promise.resolve(this.resolved ? emit(this.resolved) : this.instancePromise.then(emit))\n .catch((err: unknown) => debug.warn(\"Native ui.interaction failed:\", err));\n }\n}\n"],"names":["assertApiKey","apiKey","createTelemetry","opts","setDebug","normalizeAllowlist","TelemetryNative","TelemetryBase","RageTracker","RAGE_WINDOW_MS","debug","n","err","Telemetry","nativeSender","nativeStore","DeviceInfoTrackerNative","NetworkInfoTrackerNative","platform","networkInfoTrackerNative","deviceInfoTrackerNative","store","sender","telemetry","runtimeReadyAt","seedRuntimeReady","AppState","inst","AppLifecycleEmitter","emitter","e","next","isActive","FrameDropTracker","frameDropTracker","NetworkTrackerNative","networkTracker","TelemetryMemoryUsageNative","memoryTracker","name","from","to","at","named","attrs","uiAttributes","UI_UNNAMED","emit"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const n=require("./debug-rnOOxFpN.cjs");function m(s){if(!s||!s.startsWith("edge_"))throw new Error("createTelemetry: apiKey is required and must start with 'edge_'")}function w(s){return m(s?.apiKey),new i(s)}class i extends n.TelemetryBase{constructor(t){n.setDebug(t?.debug??!1),super(),n.debug.log("🌍 Running Web Telemetry"),this.instancePromise=(async()=>{const{Telemetry:e}=await Promise.resolve().then(()=>require("./telemetry-Co4MYdwa.cjs")),{webSender:r}=await Promise.resolve().then(()=>require("./webSender-BWi4x1df.cjs")),{DeviceInfoTrackerWeb:a}=await Promise.resolve().then(()=>require("./deviceInfo.web-ByNAlEJh.cjs")),{NetworkInfoTrackerWeb:o}=await Promise.resolve().then(()=>require("./networkInfo.web-DJmw1sNK.cjs")),c=new a,u=new o,l=t?.sender??r(t?.endpoint,t?.apiKey);return new e({sender:l,batchSize:t?.batchSize,flushIntervalMs:t?.flushIntervalMs,endpoint:t?.endpoint,deviceInfoHandler:c,networkInfoHandler:u})})(),this.startSessionOnInit().catch(e=>n.debug.warn("Web startSession failed:",e)),this.trackErrors({captureConsole:t?.captureConsole}).catch(e=>{n.debug.warn("Web trackErrors failed:",e)}),this.trackFrameDrops().catch(e=>{n.debug.log("Web trackFrameDrops errors",e)}),this.trackNetworkRequests().catch(e=>{n.debug.log("Web trackNetworkRequests errors",e)}),this.trackMemoryUsage().catch(e=>{n.debug.log("Web trackMemoryUsage errors",e)}),this.autoTrackNavigation().catch(e=>{n.debug.log("Web autoTrackNavigation errors",e)}),this.attachAppLifecycle().catch(e=>{n.debug.log("Web attachAppLifecycle errors",e)})}async attachAppLifecycle(){if(typeof document>"u")return;const t=await this.instancePromise,{AppLifecycleEmitter:e}=await Promise.resolve().then(()=>require("./appLifecycle-DvJIt7ym.cjs")),r=new e(t);r.onState(document.visibilityState==="visible"),document.addEventListener("visibilitychange",()=>r.onState(document.visibilityState==="visible"))}async trackErrors(t){const{CrashHandler:e}=await Promise.resolve().then(()=>require("./crashHandler.web-BSxDpFTo.cjs")),r=await this.instancePromise,a=new e(r);return r.trackErrors(a,t)}async startSessionOnInit(){await(await this.instancePromise).startSession()}async trackFrameDrops(){const{FrameDropTrackerWeb:t}=await Promise.resolve().then(()=>require("./frameDropsWeb.web-azpwQCUz.cjs")),e=await this.instancePromise,r=new t(e);return e.trackFrameDrops(r)}async trackNetworkRequests(){const{NetworkTrackerWeb:t}=await Promise.resolve().then(()=>require("./interceptFetchWeb.web-DFzZliik.cjs")),e=await this.instancePromise,r=new t(e);return e.trackNetworkRequests(r)}async trackMemoryUsage(){const{TelemetryMemoryUsageWeb:t}=await Promise.resolve().then(()=>require("./memoryWeb.web-CheXAcJn.cjs")),e=await this.instancePromise,r=new t(e);return e.trackMemoryUsage(r)}async autoTrackNavigation(){const{NavigationTrackerWeb:t}=await Promise.resolve().then(()=>require("./navigationWeb.web-B0necr5j.cjs")),e=await this.instancePromise,r=new t(e);return e.start(r)}async getDeviceInfo(){const{DeviceInfoTrackerWeb:t}=await Promise.resolve().then(()=>require("./deviceInfo.web-ByNAlEJh.cjs")),e=await this.instancePromise,r=new t;return e.getDeviceInfo(r)}async getNetworkInfo(){const{NetworkInfoTrackerWeb:t}=await Promise.resolve().then(()=>require("./networkInfo.web-DJmw1sNK.cjs")),e=await this.instancePromise,r=new t;return e.getNetworkInfo(r)}}exports.TelemetryWeb=i;exports.createTelemetry=w;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const a=require("./memoryStore-BIGZmmfD.cjs");function k(n){if(!n||!n.startsWith("edge_"))throw new Error("createTelemetry: apiKey is required and must start with 'edge_'")}function y(n){return k(n?.apiKey),a.setDebug(n?.debug??!1),a.normalizeAllowlist(n?.traceHostAllowlist),new w(n)}class w extends a.TelemetryBase{constructor(t){a.setDebug(t?.debug??!1),super(),a.debug.log("🌍 Running Web Telemetry"),this.instancePromise=(async()=>{const{Telemetry:e}=await Promise.resolve().then(()=>require("./telemetry-CrU7i1Jc.cjs")),{webSender:r}=await Promise.resolve().then(()=>require("./webSender-CVtE4sOF.cjs")),{webStore:s}=await Promise.resolve().then(()=>require("./store.web-CvqqN-_Z.cjs")),{DeviceInfoTrackerWeb:i}=await Promise.resolve().then(()=>require("./deviceInfo.web-3L3IDQQA.cjs")),{NetworkInfoTrackerWeb:o}=await Promise.resolve().then(()=>require("./networkInfo.web-PltJTHsy.cjs")),d=new i,h=new o,u=t?.store??s(),m=t?.sender??r(t?.endpoint,t?.apiKey,u),c=new e({sender:m,batchSize:t?.batchSize,flushIntervalMs:t?.flushIntervalMs,endpoint:t?.endpoint,platform:"web",traceLaunchStart:typeof performance<"u"?performance.timeOrigin:void 0,deviceInfoHandler:d,networkInfoHandler:h,store:u,beforeSend:t?.beforeSend,sessionSampleRate:t?.sessionSampleRate,traceHostAllowlist:t?.traceHostAllowlist,buildId:t?.buildId,deprecatedScreenFeeds:!1}),{runtimeReadyAt:b}=await Promise.resolve().then(()=>require("./runtimeReady.web-DHW682RN.cjs")).catch(l=>(a.debug.warn("Web runtime-ready module unavailable:",l),{runtimeReadyAt:async()=>{}})),{seedRuntimeReady:f}=await Promise.resolve().then(()=>require("./seedRuntimeReady-BKwkBEAF.cjs"));return f(c.views,b,"Web"),await c.resumeOrStartSession().catch(l=>a.debug.warn("Web session resume failed:",l)),c})(),this.trackErrors({captureConsole:t?.captureConsole}).catch(e=>{a.debug.warn("Web trackErrors failed:",e)}),this.trackFrameDrops().catch(e=>{a.debug.log("Web trackFrameDrops errors",e)}),this.trackNetworkRequests().catch(e=>{a.debug.log("Web trackNetworkRequests errors",e)}),this.autoTrackNavigation().catch(e=>{a.debug.log("Web autoTrackNavigation errors",e)}),this.trackInteractions().catch(e=>{a.debug.log("Web trackInteractions errors",e)}),this.trackWebVitals().catch(e=>{a.debug.log("Web trackWebVitals errors",e)}),this.attachAppLifecycle().catch(e=>{a.debug.log("Web attachAppLifecycle errors",e)}),this.attachBfcacheRestore().catch(e=>{a.debug.log("Web attachBfcacheRestore errors",e)})}async attachBfcacheRestore(){if(typeof window>"u")return;const t=await this.instancePromise;window.addEventListener("pageshow",e=>{e.persisted&&t.resumeOrStartSession().catch(r=>a.debug.warn("Web bfcache session resume failed:",r))})}async attachAppLifecycle(){if(typeof document>"u")return;const t=await this.instancePromise,{AppLifecycleEmitter:e}=await Promise.resolve().then(()=>require("./appLifecycle-CECgRVu_.cjs")),r=new e(t),s=()=>{const i=document.visibilityState==="visible";return r.onState(i).then(()=>i?void 0:t.flush()).catch(o=>a.debug.warn("Web app lifecycle failed:",o))};s(),document.addEventListener("visibilitychange",s)}async trackErrors(t){const{CrashHandler:e}=await Promise.resolve().then(()=>require("./crashHandler.web-CWmF56mJ.cjs")),r=await this.instancePromise,s=new e(r);return r.trackErrors(s,t)}async trackFrameDrops(){const{FrameDropTracker:t}=await Promise.resolve().then(()=>require("./frameTracker-CHG6sIx9.cjs")),e=await this.instancePromise,r=new t(e);return e.trackFrameDrops(r)}async trackNetworkRequests(){const{NetworkTrackerWeb:t}=await Promise.resolve().then(()=>require("./interceptFetchWeb.web-T88kO-bE.cjs")),e=await this.instancePromise,r=new t(e);return e.trackNetworkRequests(r)}async trackInteractions(){const{InteractionTrackerWeb:t}=await Promise.resolve().then(()=>require("./interactionWeb.web-Bl_cZlgh.cjs")),e=await this.instancePromise;(e.webInteractions??=new t(e)).start()}async trackWebVitals(){const{WebVitalsTracker:t}=await Promise.resolve().then(()=>require("./webVitals.web-DpWJ-iYp.cjs")),e=await this.instancePromise;await(e.webVitals??=new t(e)).start()}async autoTrackNavigation(){const{NavigationTrackerWeb:t}=await Promise.resolve().then(()=>require("./navigationWeb.web-CW_z7Ca4.cjs")),e=await this.instancePromise,r=new t(e);return e.start(r)}async getDeviceInfo(){const{DeviceInfoTrackerWeb:t}=await Promise.resolve().then(()=>require("./deviceInfo.web-3L3IDQQA.cjs")),e=await this.instancePromise,r=new t;return e.getDeviceInfo(r)}async getNetworkInfo(){const{NetworkInfoTrackerWeb:t}=await Promise.resolve().then(()=>require("./networkInfo.web-PltJTHsy.cjs")),e=await this.instancePromise,r=new t;return e.getNetworkInfo(r)}}exports.memoryStore=a.memoryStore;exports.TelemetryWeb=w;exports.createTelemetry=y;
2
2
  //# sourceMappingURL=index.web.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.web.cjs","sources":["../src/createTelemetry.web.ts","../src/index.web.ts"],"sourcesContent":["import { TelemetryWeb } from \"./index.web\";\n\nexport type TelemetryOpts = {\n apiKey: string; // required; must start with \"edge_\"\n sender?: any;\n batchSize?: number;\n flushIntervalMs?: number;\n endpoint?: string;\n captureConsole?: boolean; // funnel console.error/warn into app.crash (default on, opt-out)\n debug?: boolean; // SDK-internal diagnostics; off by default (#23)\n};\n\nexport function assertApiKey(apiKey?: string) {\n if (!apiKey || !apiKey.startsWith(\"edge_\")) {\n throw new Error(\"createTelemetry: apiKey is required and must start with 'edge_'\");\n }\n}\n\n/**\n * Cross-platform factory for telemetry. The platform is chosen by the bundler\n * via the .web / .native file split — no runtime navigator sniffing.\n */\nexport function createTelemetry(opts: TelemetryOpts) {\n assertApiKey(opts?.apiKey);\n return new TelemetryWeb(opts);\n}\n","// src/index.web.ts\nimport { TelemetryBase } from \"./index.base\";\nimport { debug, setDebug } from \"./core/debug\";\n\nexport { createTelemetry, type TelemetryOpts } from \"./createTelemetry.web\";\n\nexport class TelemetryWeb extends TelemetryBase {\n constructor(opts?: {\n apiKey?: string;\n sender?: any;\n batchSize?: number;\n flushIntervalMs?: number;\n endpoint?: string;\n captureConsole?: boolean;\n debug?: boolean;\n }) {\n setDebug(opts?.debug ?? false); // gate SDK console noise before anything logs (#23)\n super();\n\n debug.log(\"🌍 Running Web Telemetry\");\n\n this.instancePromise = (async () => {\n const { Telemetry } = await import(\"./core/telemetry\");\n const { webSender } = await import(\"./adapters/webSender\");\n\n const { DeviceInfoTrackerWeb } = await import(\"./adapters/web/deviceInfo.web\");\n const { NetworkInfoTrackerWeb } = await import(\"./adapters/web/networkInfo.web\");\n const deviceInfoTrackerWeb = new DeviceInfoTrackerWeb();\n const networkInfoTrackerWeb = new NetworkInfoTrackerWeb();\n\n const sender = opts?.sender ?? webSender(opts?.endpoint, opts?.apiKey);\n\n const telemetry = new Telemetry({\n sender,\n batchSize: opts?.batchSize,\n flushIntervalMs: opts?.flushIntervalMs,\n endpoint: opts?.endpoint,\n // no id suffix on web: the contract suffix is ios|android only.\n // device.platform=\"web\" still rides as an attribute from the adapter.\n deviceInfoHandler: deviceInfoTrackerWeb,\n networkInfoHandler: networkInfoTrackerWeb,\n });\n\n return telemetry;\n })();\n\n // session.started on init (#29). Background/foreground via AppState is native-only.\n this.startSessionOnInit().catch(err => debug.warn(\"Web startSession failed:\", err));\n\n this.trackErrors({ captureConsole: opts?.captureConsole }).catch(err => {\n debug.warn(\"Web trackErrors failed:\", err);\n });\n\n this.trackFrameDrops().catch(err => {\n debug.log(\"Web trackFrameDrops errors\", err);\n });\n this.trackNetworkRequests().catch(err => {\n debug.log(\"Web trackNetworkRequests errors\", err);\n });\n this.trackMemoryUsage().catch(err => {\n debug.log(\"Web trackMemoryUsage errors\", err);\n });\n this.autoTrackNavigation().catch(err => {\n debug.log(\"Web autoTrackNavigation errors\", err);\n });\n this.attachAppLifecycle().catch(err => {\n debug.log(\"Web attachAppLifecycle errors\", err);\n });\n }\n\n // app_lifecycle on tab visibility change — web equivalent of native AppState (#30)\n async attachAppLifecycle() {\n if (typeof document === \"undefined\") return;\n const inst = await this.instancePromise;\n const { AppLifecycleEmitter } = await import(\"./adapters/appLifecycle\");\n const emitter = new AppLifecycleEmitter(inst);\n emitter.onState(document.visibilityState === \"visible\"); // seed current state\n document.addEventListener(\"visibilitychange\", () =>\n emitter.onState(document.visibilityState === \"visible\"));\n }\n\n // Web uses the web crash handler (window.onerror/onunhandledrejection), not the native one.\n async trackErrors(options?: { captureConsole?: boolean }) {\n const { CrashHandler } = await import(\"./adapters/web/crashHandler.web\");\n const inst = await this.instancePromise;\n const crashHandler = new CrashHandler(inst);\n return inst.trackErrors(crashHandler, options);\n }\n\n private async startSessionOnInit() {\n const inst = await this.instancePromise;\n await inst.startSession();\n }\n\n async trackFrameDrops() {\n const { FrameDropTrackerWeb } = await import(\"./adapters/web/frameDropsWeb.web\");\n const inst = await this.instancePromise;\n const frameDropTracker = new FrameDropTrackerWeb(inst);\n return inst.trackFrameDrops(frameDropTracker);\n }\n\n async trackNetworkRequests() {\n const { NetworkTrackerWeb } = await import(\"./adapters/web/interceptFetchWeb.web\");\n const inst = await this.instancePromise;\n const networkTracker = new NetworkTrackerWeb(inst);\n return inst.trackNetworkRequests(networkTracker);\n }\n\n async trackMemoryUsage() {\n const { TelemetryMemoryUsageWeb } = await import(\"./adapters/web/memoryWeb.web\");\n const inst = await this.instancePromise;\n const memoryTracker = new TelemetryMemoryUsageWeb(inst);\n return inst.trackMemoryUsage(memoryTracker);\n }\n\n async autoTrackNavigation() {\n const { NavigationTrackerWeb } = await import(\"./adapters/web/navigationWeb.web\");\n const inst = await this.instancePromise;\n const navigationTracker = new NavigationTrackerWeb(inst);\n return inst.start(navigationTracker);\n }\n\n async getDeviceInfo() {\n const { DeviceInfoTrackerWeb } = await import(\"./adapters/web/deviceInfo.web\");\n const inst = await this.instancePromise;\n const deviceInfoTrackerWeb = new DeviceInfoTrackerWeb();\n return inst.getDeviceInfo(deviceInfoTrackerWeb);\n }\n\n async getNetworkInfo() {\n const { NetworkInfoTrackerWeb } = await import(\"./adapters/web/networkInfo.web\");\n const inst = await this.instancePromise;\n const networkInfoTrackerWeb = new NetworkInfoTrackerWeb();\n return inst.getNetworkInfo(networkInfoTrackerWeb);\n }\n}\n"],"names":["assertApiKey","apiKey","createTelemetry","opts","TelemetryWeb","TelemetryBase","setDebug","debug","Telemetry","webSender","DeviceInfoTrackerWeb","NetworkInfoTrackerWeb","deviceInfoTrackerWeb","networkInfoTrackerWeb","sender","err","inst","AppLifecycleEmitter","emitter","options","CrashHandler","crashHandler","FrameDropTrackerWeb","frameDropTracker","NetworkTrackerWeb","networkTracker","TelemetryMemoryUsageWeb","memoryTracker","NavigationTrackerWeb","navigationTracker"],"mappings":"wHAYO,SAASA,EAAaC,EAAiB,CAC1C,GAAI,CAACA,GAAU,CAACA,EAAO,WAAW,OAAO,EACrC,MAAM,IAAI,MAAM,iEAAiE,CAEzF,CAMO,SAASC,EAAgBC,EAAqB,CACjD,OAAAH,EAAaG,GAAM,MAAM,EAClB,IAAIC,EAAaD,CAAI,CAChC,CCnBO,MAAMC,UAAqBC,EAAAA,aAAc,CAC5C,YAAYF,EAQT,CACCG,WAASH,GAAM,OAAS,EAAK,EAC7B,MAAA,EAEAI,EAAAA,MAAM,IAAI,0BAA0B,EAEpC,KAAK,iBAAmB,SAAY,CAChC,KAAM,CAAE,UAAAC,CAAA,EAAc,MAAM,QAAA,QAAA,EAAA,KAAA,IAAA,QAAO,0BAAkB,CAAA,EAC/C,CAAE,UAAAC,CAAA,EAAc,MAAM,QAAA,QAAA,EAAA,KAAA,IAAA,QAAO,0BAAsB,CAAA,EAEnD,CAAE,qBAAAC,CAAA,EAAyB,MAAM,QAAA,QAAA,EAAA,KAAA,IAAA,QAAO,+BAA+B,CAAA,EACvE,CAAE,sBAAAC,CAAA,EAA0B,MAAM,QAAA,QAAA,EAAA,KAAA,IAAA,QAAO,gCAAgC,CAAA,EACzEC,EAAuB,IAAIF,EAC3BG,EAAwB,IAAIF,EAE5BG,EAASX,GAAM,QAAUM,EAAUN,GAAM,SAAUA,GAAM,MAAM,EAarE,OAXkB,IAAIK,EAAU,CAC5B,OAAAM,EACA,UAAWX,GAAM,UACjB,gBAAiBA,GAAM,gBACvB,SAAUA,GAAM,SAGhB,kBAAmBS,EACnB,mBAAoBC,CAAA,CACvB,CAGL,GAAA,EAGA,KAAK,qBAAqB,MAAME,GAAOR,EAAAA,MAAM,KAAK,2BAA4BQ,CAAG,CAAC,EAElF,KAAK,YAAY,CAAE,eAAgBZ,GAAM,eAAgB,EAAE,MAAMY,GAAO,CACpER,QAAM,KAAK,0BAA2BQ,CAAG,CAC7C,CAAC,EAED,KAAK,gBAAA,EAAkB,MAAMA,GAAO,CAChCR,QAAM,IAAI,6BAA8BQ,CAAG,CAC/C,CAAC,EACD,KAAK,qBAAA,EAAuB,MAAMA,GAAO,CACrCR,QAAM,IAAI,kCAAmCQ,CAAG,CACpD,CAAC,EACD,KAAK,iBAAA,EAAmB,MAAMA,GAAO,CACjCR,QAAM,IAAI,8BAA+BQ,CAAG,CAChD,CAAC,EACD,KAAK,oBAAA,EAAsB,MAAMA,GAAO,CACpCR,QAAM,IAAI,iCAAkCQ,CAAG,CACnD,CAAC,EACD,KAAK,mBAAA,EAAqB,MAAMA,GAAO,CACnCR,QAAM,IAAI,gCAAiCQ,CAAG,CAClD,CAAC,CACL,CAGA,MAAM,oBAAqB,CACvB,GAAI,OAAO,SAAa,IAAa,OACrC,MAAMC,EAAO,MAAM,KAAK,gBAClB,CAAE,oBAAAC,CAAA,EAAwB,MAAM,QAAA,QAAA,EAAA,KAAA,IAAA,QAAO,6BAAyB,CAAA,EAChEC,EAAU,IAAID,EAAoBD,CAAI,EAC5CE,EAAQ,QAAQ,SAAS,kBAAoB,SAAS,EACtD,SAAS,iBAAiB,mBAAoB,IAC1CA,EAAQ,QAAQ,SAAS,kBAAoB,SAAS,CAAC,CAC/D,CAGA,MAAM,YAAYC,EAAwC,CACtD,KAAM,CAAE,aAAAC,CAAA,EAAiB,MAAM,QAAA,QAAA,EAAA,KAAA,IAAA,QAAO,iCAAiC,CAAA,EACjEJ,EAAO,MAAM,KAAK,gBAClBK,EAAe,IAAID,EAAaJ,CAAI,EAC1C,OAAOA,EAAK,YAAYK,EAAcF,CAAO,CACjD,CAEA,MAAc,oBAAqB,CAE/B,MADa,MAAM,KAAK,iBACb,aAAA,CACf,CAEA,MAAM,iBAAkB,CACpB,KAAM,CAAE,oBAAAG,CAAA,EAAwB,MAAM,QAAA,QAAA,EAAA,KAAA,IAAA,QAAO,kCAAkC,CAAA,EACzEN,EAAO,MAAM,KAAK,gBAClBO,EAAmB,IAAID,EAAoBN,CAAI,EACrD,OAAOA,EAAK,gBAAgBO,CAAgB,CAChD,CAEA,MAAM,sBAAuB,CACzB,KAAM,CAAE,kBAAAC,CAAA,EAAsB,MAAM,QAAA,QAAA,EAAA,KAAA,IAAA,QAAO,sCAAsC,CAAA,EAC3ER,EAAO,MAAM,KAAK,gBAClBS,EAAiB,IAAID,EAAkBR,CAAI,EACjD,OAAOA,EAAK,qBAAqBS,CAAc,CACnD,CAEA,MAAM,kBAAmB,CACrB,KAAM,CAAE,wBAAAC,CAAA,EAA4B,MAAM,QAAA,QAAA,EAAA,KAAA,IAAA,QAAO,8BAA8B,CAAA,EACzEV,EAAO,MAAM,KAAK,gBAClBW,EAAgB,IAAID,EAAwBV,CAAI,EACtD,OAAOA,EAAK,iBAAiBW,CAAa,CAC9C,CAEA,MAAM,qBAAsB,CACxB,KAAM,CAAE,qBAAAC,CAAA,EAAyB,MAAM,QAAA,QAAA,EAAA,KAAA,IAAA,QAAO,kCAAkC,CAAA,EAC1EZ,EAAO,MAAM,KAAK,gBAClBa,EAAoB,IAAID,EAAqBZ,CAAI,EACvD,OAAOA,EAAK,MAAMa,CAAiB,CACvC,CAEA,MAAM,eAAgB,CAClB,KAAM,CAAE,qBAAAnB,CAAA,EAAyB,MAAM,QAAA,QAAA,EAAA,KAAA,IAAA,QAAO,+BAA+B,CAAA,EACvEM,EAAO,MAAM,KAAK,gBAClBJ,EAAuB,IAAIF,EACjC,OAAOM,EAAK,cAAcJ,CAAoB,CAClD,CAEA,MAAM,gBAAiB,CACnB,KAAM,CAAE,sBAAAD,CAAA,EAA0B,MAAM,QAAA,QAAA,EAAA,KAAA,IAAA,QAAO,gCAAgC,CAAA,EACzEK,EAAO,MAAM,KAAK,gBAClBH,EAAwB,IAAIF,EAClC,OAAOK,EAAK,eAAeH,CAAqB,CACpD,CACJ"}
1
+ {"version":3,"file":"index.web.cjs","sources":["../src/createTelemetry.web.ts","../src/index.web.ts"],"sourcesContent":["import { TelemetryWeb } from \"./index.web\";\nimport type { SyncStore } from \"./core/store\";\nimport type { BeforeSend } from \"./core/beforeSend\";\nimport { normalizeAllowlist } from \"./adapters/traceHeader\";\nimport { setDebug } from \"./core/debug\";\n\nexport type TelemetryOpts = {\n apiKey: string; // required credential; must start with \"edge_\" (API key or JWT, #90)\n sender?: any;\n batchSize?: number;\n flushIntervalMs?: number;\n endpoint?: string;\n // console.error -> app.error, console.warn -> a breadcrumb. Default OFF (§4.7, #100).\n captureConsole?: boolean;\n debug?: boolean; // SDK-internal diagnostics; off by default (#23)\n store?: SyncStore; // persisted-state port (#89); MUST be sync — see core/store.ts\n // Constructor-only (§3.6) — there is deliberately no runtime setter for either.\n beforeSend?: BeforeSend; // sync scrubbing hook, run at enqueue over events and metrics\n sessionSampleRate?: number; // 0.0-1.0, sticky per session, re-rolled at rotation; default 1\n // §6.4/#99. Bare hosts, exact match, **ports ignored** (a deliberate mismatch with\n // `http.host`, which keeps the port — do not join them). Empty by default: v4 is dark on\n // upgrade. Listing a host asserts that host's CORS allows `traceparent`; a malformed\n // entry throws in dev and is dropped in production.\n traceHostAllowlist?: string[];\n // §4.8 — the symbolication resolve key. A git SHA or CI run number; consumer-supplied\n // (the SDK has zero OTA awareness), **omitted when unset, never `\"\"`**, and never\n // derived from app.version + app.build_number under any circumstances.\n buildId?: string;\n};\n\n// Deliberately loose: `apiKey` is the *credential*, and under AUTH_MODE=jwt it is\n// `edge_<jwt>` — a shape the collector's >=3-`_`-part API-key check would reject. Tightening\n// to that check here would hard-reject every JWT and make the segmented deployment\n// unreachable, which is the exact bug #90 exists to close. Prefix + non-empty remainder is\n// all we assert; the real catch is the 401 warn (contract §11.1).\nexport function assertApiKey(apiKey?: string) {\n if (!apiKey || !apiKey.startsWith(\"edge_\")) {\n throw new Error(\"createTelemetry: apiKey is required and must start with 'edge_'\");\n }\n}\n\n/**\n * Cross-platform factory for telemetry. The platform is chosen by the bundler\n * via the .web / .native file split — no runtime navigator sniffing.\n */\nexport function createTelemetry(opts: TelemetryOpts) {\n assertApiKey(opts?.apiKey);\n // §6.4's dev throw has to happen *here*, synchronously: the core Telemetry is built\n // inside `instancePromise`, which deliberately never rethrows, so a throw down there\n // would be a silently rejected promise instead of the loud config error dev asks for.\n // In production it drops the bad entry and reports through debug() — which is why the\n // gate has to be open first: the entry ctor's own setDebug() runs *after* this line, so\n // without this the production report would be a guaranteed no-op even with debug: true.\n // It runs again in TraceManager, where it is idempotent.\n setDebug(opts?.debug ?? false);\n normalizeAllowlist(opts?.traceHostAllowlist);\n return new TelemetryWeb(opts);\n}\n","// src/index.web.ts\nimport { TelemetryBase } from \"./index.base\";\nimport { debug, setDebug } from \"./core/debug\";\nimport type { SyncStore } from \"./core/store\";\nimport type { BeforeSend } from \"./core/beforeSend\";\n\nexport { createTelemetry, type TelemetryOpts } from \"./createTelemetry.web\";\n\n// The Store port (#89) — public so a consumer can inject their own persistence,\n// and so the in-memory fake is available outside the test tree.\nexport type { Store, SyncStore, AsyncStore, StoreRead, StoreWrite } from \"./core/store\";\nexport { memoryStore, type MemoryStoreOpts } from \"./core/memoryStore\";\n\n// The scrubbing hook (#93) — public so a consumer can type their beforeSend.\nexport type { BeforeSend } from \"./core/beforeSend\";\n\nexport class TelemetryWeb extends TelemetryBase {\n constructor(opts?: {\n apiKey?: string;\n sender?: any;\n batchSize?: number;\n flushIntervalMs?: number;\n endpoint?: string;\n captureConsole?: boolean;\n debug?: boolean;\n store?: SyncStore; // sync only: the web build's guarantee depends on it\n // Constructor-only (§3.6). No runtime setter: registering later leaves a window\n // where session.started and the earliest requests have already been enqueued.\n beforeSend?: BeforeSend;\n sessionSampleRate?: number;\n // §6.4/#99 — bare hosts, exact match, ports ignored, empty by default.\n traceHostAllowlist?: string[];\n // §4.8 — symbolication resolve key. Omitted when unset, never `\"\"`, never derived.\n buildId?: string;\n }) {\n setDebug(opts?.debug ?? false); // gate SDK console noise before anything logs (#23)\n super();\n\n debug.log(\"🌍 Running Web Telemetry\");\n\n this.instancePromise = (async () => {\n const { Telemetry } = await import(\"./core/telemetry\");\n const { webSender } = await import(\"./adapters/webSender\");\n const { webStore } = await import(\"./adapters/web/store.web\");\n\n const { DeviceInfoTrackerWeb } = await import(\"./adapters/web/deviceInfo.web\");\n const { NetworkInfoTrackerWeb } = await import(\"./adapters/web/networkInfo.web\");\n const deviceInfoTrackerWeb = new DeviceInfoTrackerWeb();\n const networkInfoTrackerWeb = new NetworkInfoTrackerWeb();\n\n // One store, shared by the offline queue and core (#89) — so a consumer that\n // injects a store governs both, instead of the sender quietly keeping its own.\n const store = opts?.store ?? webStore();\n const sender = opts?.sender ?? webSender(opts?.endpoint, opts?.apiKey, store);\n\n const telemetry = new Telemetry({\n sender,\n batchSize: opts?.batchSize,\n flushIntervalMs: opts?.flushIntervalMs,\n endpoint: opts?.endpoint,\n // device.id is suffixed `_web`; session.id is not — §3.3 gives session.id a\n // `_web` suffix only in v4. generateSessionId() holds that rule.\n platform: \"web\",\n // §6.2: web's launch root reports true navigation start, which is *better*\n // than Android's fork-time-free approximation — and is why native's and\n // web's launch envelopes must not be compared as the same interval.\n traceLaunchStart: typeof performance !== \"undefined\" ? performance.timeOrigin : undefined,\n deviceInfoHandler: deviceInfoTrackerWeb,\n networkInfoHandler: networkInfoTrackerWeb,\n store,\n beforeSend: opts?.beforeSend,\n sessionSampleRate: opts?.sessionSampleRate,\n traceHostAllowlist: opts?.traceHostAllowlist,\n buildId: opts?.buildId,\n // §4.11: web has never emitted `screen.duration`, and a now-shared\n // attachNavigation must not be what starts it. `navigation` is untouched by\n // this flag — web's own history+popstate path still emits it (see the known\n // gap in CLAUDE.md); the flag only stops the ref path adding a second feed.\n deprecatedScreenFeeds: false,\n });\n\n // Resume or start the session before the instance is visible (#92). On web the\n // Store is localStorage, so a hard reload, a bfcache restore and a second tab\n // all resume the same session.\n // Never rethrown into instancePromise: finalizeSession() flushes, flush() rethrows on a\n // dead collector, and a rejected instancePromise would brick every public method for the\n // life of the process. Hydration has already run; only the emission is lost.\n // §4.5.2's `initial_load` seed: the launch view stays busy until the platform's\n // runtime-ready marker. The *module* is awaited with everything else, so the seed\n // is armed before `instancePromise` resolves; the *marker* is not, because on web\n // it arrives with the load event and blocking init on it would delay every host\n // call behind the page's own images.\n // The module is awaited so the seed is armed before `instancePromise` resolves,\n // but never rethrown into it: a failed chunk load must not brick every public\n // method for the life of the process. A missing reader just releases the gate.\n const { runtimeReadyAt } = await import(\"./adapters/web/runtimeReady.web\")\n .catch((err: unknown) => {\n debug.warn(\"Web runtime-ready module unavailable:\", err);\n return { runtimeReadyAt: async () => undefined };\n });\n const { seedRuntimeReady } = await import(\"./adapters/seedRuntimeReady\");\n seedRuntimeReady(telemetry.views, runtimeReadyAt, \"Web\");\n\n await telemetry.resumeOrStartSession()\n .catch(err => debug.warn(\"Web session resume failed:\", err));\n\n return telemetry;\n })();\n\n this.trackErrors({ captureConsole: opts?.captureConsole }).catch(err => {\n debug.warn(\"Web trackErrors failed:\", err);\n });\n\n this.trackFrameDrops().catch(err => {\n debug.log(\"Web trackFrameDrops errors\", err);\n });\n this.trackNetworkRequests().catch(err => {\n debug.log(\"Web trackNetworkRequests errors\", err);\n });\n this.autoTrackNavigation().catch(err => {\n debug.log(\"Web autoTrackNavigation errors\", err);\n });\n this.trackInteractions().catch(err => {\n debug.log(\"Web trackInteractions errors\", err);\n });\n this.trackWebVitals().catch(err => {\n debug.log(\"Web trackWebVitals errors\", err);\n });\n this.attachAppLifecycle().catch(err => {\n debug.log(\"Web attachAppLifecycle errors\", err);\n });\n this.attachBfcacheRestore().catch(err => {\n debug.log(\"Web attachBfcacheRestore errors\", err);\n });\n }\n\n /**\n * A bfcache restore resumes a frozen JS context, so the in-memory session survives on its\n * own — but the freeze can have outlasted the idle window, and a sibling tab may have\n * rotated the shared localStorage record while this one was suspended. Re-running the\n * init decision against the Store is what reconciles both (#92, §4.2).\n */\n private async attachBfcacheRestore() {\n if (typeof window === \"undefined\") return;\n const inst = await this.instancePromise;\n window.addEventListener(\"pageshow\", (e: PageTransitionEvent) => {\n if (!e.persisted) return; // an ordinary load already ran this at init\n inst.resumeOrStartSession()\n .catch((err: any) => debug.warn(\"Web bfcache session resume failed:\", err));\n });\n }\n\n // app_lifecycle on tab visibility change — web equivalent of native AppState (#30)\n async attachAppLifecycle() {\n if (typeof document === \"undefined\") return;\n const inst = await this.instancePromise;\n const { AppLifecycleEmitter } = await import(\"./adapters/appLifecycle\");\n const emitter = new AppLifecycleEmitter(inst);\n const onState = () => {\n const isActive = document.visibilityState === \"visible\";\n // Awaited before the flush, not fired alongside it — the same ordering native has\n // (§4.5). Backgrounding is a view boundary, and the rows it emits are exactly the\n // rows this flush exists to rescue: the `view` row, and §5.3's drained CLS and INP,\n // whose whole reason for being held is that the library's page-hide report loses\n // them on a closed tab. Holding them and then not flushing would move that defect\n // rather than close it. Web's sender uses `fetch({keepalive:true})`, which is what\n // lets a hidden tab's batch outlive the document.\n return emitter.onState(isActive)\n .then(() => (isActive ? undefined : inst.flush()))\n .catch((e: any) => debug.warn(\"Web app lifecycle failed:\", e));\n };\n onState(); // seed current state\n document.addEventListener(\"visibilitychange\", onState);\n }\n\n // Web uses the web crash handler (window.onerror/onunhandledrejection), not the native one.\n async trackErrors(options?: { captureConsole?: boolean }) {\n const { CrashHandler } = await import(\"./adapters/web/crashHandler.web\");\n const inst = await this.instancePromise;\n const crashHandler = new CrashHandler(inst);\n return inst.trackErrors(crashHandler, options);\n }\n\n async trackFrameDrops() {\n const { FrameDropTracker } = await import(\"./adapters/frameTracker\");\n const inst = await this.instancePromise;\n const frameDropTracker = new FrameDropTracker(inst);\n return inst.trackFrameDrops(frameDropTracker);\n }\n\n async trackNetworkRequests() {\n const { NetworkTrackerWeb } = await import(\"./adapters/web/interceptFetchWeb.web\");\n const inst = await this.instancePromise;\n const networkTracker = new NetworkTrackerWeb(inst);\n return inst.trackNetworkRequests(networkTracker);\n }\n\n // §5.2/#105: web emits no `memory_usage` at all, and exposes no `trackMemoryUsage`.\n // Why, in CLAUDE.md's `memory_usage` section.\n\n /**\n * §4.6/#102 — one capture-phase `click` listener on `document`. Auto-started, like every\n * other capture: `ui.interaction` is what §6.2's interaction root hangs off, so a\n * consumer forgetting to call it would leave every tap-driven request unattributed.\n */\n async trackInteractions() {\n const { InteractionTrackerWeb } = await import(\"./adapters/web/interactionWeb.web\");\n const inst = await this.instancePromise;\n // One tracker per core instance, like the XHR patch: `start()`'s own guard is\n // per-tracker, so constructing a fresh one on a second call would add a second\n // capture-phase listener and double every `ui.interaction` row.\n (inst.webInteractions ??= new InteractionTrackerWeb(inst)).start();\n }\n\n /**\n * §5.3/#106 — the five Core Web Vitals on the metric path, web only. Auto-started and\n * deliberately not public API: there is nothing for a consumer to configure, and a vital\n * that only fires if someone remembered to call a method is a vital nobody has.\n *\n * `web-vitals/attribution` is bundled, so this is the only import of it in the tree and\n * `index.native` never reaches it. A failed chunk load is caught by the caller and costs\n * the vitals, nothing else.\n */\n private async trackWebVitals() {\n const { WebVitalsTracker } = await import(\"./adapters/web/webVitals.web\");\n const inst = await this.instancePromise;\n // One tracker per core instance: `start()`'s guard is per-tracker, so a fresh one on a\n // second call would double-subscribe and double every vital row.\n await (inst.webVitals ??= new WebVitalsTracker(inst)).start();\n }\n\n async autoTrackNavigation() {\n const { NavigationTrackerWeb } = await import(\"./adapters/web/navigationWeb.web\");\n const inst = await this.instancePromise;\n const navigationTracker = new NavigationTrackerWeb(inst);\n return inst.start(navigationTracker);\n }\n\n async getDeviceInfo() {\n const { DeviceInfoTrackerWeb } = await import(\"./adapters/web/deviceInfo.web\");\n const inst = await this.instancePromise;\n const deviceInfoTrackerWeb = new DeviceInfoTrackerWeb();\n return inst.getDeviceInfo(deviceInfoTrackerWeb);\n }\n\n async getNetworkInfo() {\n const { NetworkInfoTrackerWeb } = await import(\"./adapters/web/networkInfo.web\");\n const inst = await this.instancePromise;\n const networkInfoTrackerWeb = new NetworkInfoTrackerWeb();\n return inst.getNetworkInfo(networkInfoTrackerWeb);\n }\n}\n"],"names":["assertApiKey","apiKey","createTelemetry","opts","setDebug","normalizeAllowlist","TelemetryWeb","TelemetryBase","debug","Telemetry","webSender","webStore","DeviceInfoTrackerWeb","NetworkInfoTrackerWeb","deviceInfoTrackerWeb","networkInfoTrackerWeb","store","sender","telemetry","runtimeReadyAt","err","seedRuntimeReady","inst","AppLifecycleEmitter","emitter","onState","isActive","e","options","CrashHandler","crashHandler","FrameDropTracker","frameDropTracker","NetworkTrackerWeb","networkTracker","InteractionTrackerWeb","WebVitalsTracker","NavigationTrackerWeb","navigationTracker"],"mappings":"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"}