@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.
- package/README.md +831 -186
- package/dist/appLifecycle-CECgRVu_.cjs +2 -0
- package/dist/appLifecycle-CECgRVu_.cjs.map +1 -0
- package/dist/appLifecycle-DQErzJIR.js +22 -0
- package/dist/appLifecycle-DQErzJIR.js.map +1 -0
- package/dist/batch-CwoO7noL.js +56 -0
- package/dist/batch-CwoO7noL.js.map +1 -0
- package/dist/batch-DNu8Xr9T.cjs +2 -0
- package/dist/batch-DNu8Xr9T.cjs.map +1 -0
- package/dist/crashCapture-BOJ8nSAZ.cjs +4 -0
- package/dist/crashCapture-BOJ8nSAZ.cjs.map +1 -0
- package/dist/crashCapture-BW8WuyaU.js +70 -0
- package/dist/crashCapture-BW8WuyaU.js.map +1 -0
- package/dist/crashHandler.web-8F_k2veo.js +29 -0
- package/dist/crashHandler.web-8F_k2veo.js.map +1 -0
- package/dist/crashHandler.web-CWmF56mJ.cjs +2 -0
- package/dist/crashHandler.web-CWmF56mJ.cjs.map +1 -0
- package/dist/crashHandlerNative.native-C2kSikDt.cjs +2 -0
- package/dist/crashHandlerNative.native-C2kSikDt.cjs.map +1 -0
- package/dist/crashHandlerNative.native-FupMnr1U.js +39 -0
- package/dist/crashHandlerNative.native-FupMnr1U.js.map +1 -0
- package/dist/deviceInfo.native-BJ-3Jj1T.js +53 -0
- package/dist/deviceInfo.native-BJ-3Jj1T.js.map +1 -0
- package/dist/deviceInfo.native-BoeTZcD6.cjs +2 -0
- package/dist/deviceInfo.native-BoeTZcD6.cjs.map +1 -0
- package/dist/deviceInfo.web-3L3IDQQA.cjs +2 -0
- package/dist/deviceInfo.web-3L3IDQQA.cjs.map +1 -0
- package/dist/deviceInfo.web-BFB1-pcA.js +41 -0
- package/dist/deviceInfo.web-BFB1-pcA.js.map +1 -0
- package/dist/frameTracker-CHG6sIx9.cjs +2 -0
- package/dist/frameTracker-CHG6sIx9.cjs.map +1 -0
- package/dist/frameTracker-DdB8W_kC.js +54 -0
- package/dist/frameTracker-DdB8W_kC.js.map +1 -0
- package/dist/httpAttributes-BrrtM8zh.js +70 -0
- package/dist/httpAttributes-BrrtM8zh.js.map +1 -0
- package/dist/httpAttributes-D0m6UID7.cjs +2 -0
- package/dist/httpAttributes-D0m6UID7.cjs.map +1 -0
- package/dist/index-BtLlV1HA.js +57 -0
- package/dist/index-BtLlV1HA.js.map +1 -0
- package/dist/{deviceInfo.native-D2k0LDhI.js → index-C2XQ-EYw.js} +362 -411
- package/dist/index-C2XQ-EYw.js.map +1 -0
- package/dist/index-CXsVZY35.cjs +2 -0
- package/dist/index-CXsVZY35.cjs.map +1 -0
- package/dist/index-DLquF88M.cjs +2 -0
- package/dist/index-DLquF88M.cjs.map +1 -0
- package/dist/index.native.cjs +1 -1
- package/dist/index.native.cjs.map +1 -1
- package/dist/index.native.js +94 -59
- package/dist/index.native.js.map +1 -1
- package/dist/index.web.cjs +1 -1
- package/dist/index.web.cjs.map +1 -1
- package/dist/index.web.js +88 -33
- package/dist/index.web.js.map +1 -1
- package/dist/interactionWeb.web-Bl_cZlgh.cjs +2 -0
- package/dist/interactionWeb.web-Bl_cZlgh.cjs.map +1 -0
- package/dist/interactionWeb.web-CJAviVQ7.js +109 -0
- package/dist/interactionWeb.web-CJAviVQ7.js.map +1 -0
- package/dist/interceptFetchWeb.web-T88kO-bE.cjs +2 -0
- package/dist/interceptFetchWeb.web-T88kO-bE.cjs.map +1 -0
- package/dist/interceptFetchWeb.web-UXC2Lb6X.js +61 -0
- package/dist/interceptFetchWeb.web-UXC2Lb6X.js.map +1 -0
- package/dist/interceptHttpNative.native-BVpFuoNB.cjs +2 -0
- package/dist/interceptHttpNative.native-BVpFuoNB.cjs.map +1 -0
- package/dist/interceptHttpNative.native-rX-lPNST.js +18 -0
- package/dist/interceptHttpNative.native-rX-lPNST.js.map +1 -0
- package/dist/loadingTime-Bhomd9qq.cjs +2 -0
- package/dist/loadingTime-Bhomd9qq.cjs.map +1 -0
- package/dist/loadingTime-ZkYvFijA.js +70 -0
- package/dist/loadingTime-ZkYvFijA.js.map +1 -0
- package/dist/memoryNative.native-C42h9SjK.js +54 -0
- package/dist/memoryNative.native-C42h9SjK.js.map +1 -0
- package/dist/memoryNative.native-CA-7w9w1.cjs +2 -0
- package/dist/memoryNative.native-CA-7w9w1.cjs.map +1 -0
- package/dist/memoryStore-BIGZmmfD.cjs +2 -0
- package/dist/memoryStore-BIGZmmfD.cjs.map +1 -0
- package/dist/memoryStore-F5I-GQKM.js +193 -0
- package/dist/memoryStore-F5I-GQKM.js.map +1 -0
- package/dist/nativeSender-CfQaRuDK.cjs +2 -0
- package/dist/nativeSender-CfQaRuDK.cjs.map +1 -0
- package/dist/nativeSender-pgVSIv-X.js +59 -0
- package/dist/nativeSender-pgVSIv-X.js.map +1 -0
- package/dist/navigationRef-BzYbs8cm.js +28 -0
- package/dist/navigationRef-BzYbs8cm.js.map +1 -0
- package/dist/navigationRef-C-_qhb43.cjs +2 -0
- package/dist/navigationRef-C-_qhb43.cjs.map +1 -0
- package/dist/{navigationTracker-Cts68dgG.js → navigationTracker-BmywA_Bg.js} +4 -4
- package/dist/navigationTracker-BmywA_Bg.js.map +1 -0
- package/dist/navigationTracker-HkwVyywz.cjs +2 -0
- package/dist/navigationTracker-HkwVyywz.cjs.map +1 -0
- package/dist/navigationWeb.web-CW_z7Ca4.cjs +2 -0
- package/dist/navigationWeb.web-CW_z7Ca4.cjs.map +1 -0
- package/dist/navigationWeb.web-CcwgKuIZ.js +55 -0
- package/dist/navigationWeb.web-CcwgKuIZ.js.map +1 -0
- package/dist/{networkInfo.native-BK5fpAOL.js → networkInfo.native-CGrx9cnH.js} +15 -15
- package/dist/{networkInfo.native-BK5fpAOL.js.map → networkInfo.native-CGrx9cnH.js.map} +1 -1
- package/dist/{networkInfo.native-cxuw93Uy.cjs → networkInfo.native-YVySdv3S.cjs} +2 -2
- package/dist/{networkInfo.native-cxuw93Uy.cjs.map → networkInfo.native-YVySdv3S.cjs.map} +1 -1
- package/dist/{networkInfo.web-twcNn_hc.js → networkInfo.web-B2YlLNsI.js} +3 -3
- package/dist/networkInfo.web-B2YlLNsI.js.map +1 -0
- package/dist/networkInfo.web-PltJTHsy.cjs +2 -0
- package/dist/networkInfo.web-PltJTHsy.cjs.map +1 -0
- package/dist/runtimeReady.native-Bh7EcYmK.js +14 -0
- package/dist/runtimeReady.native-Bh7EcYmK.js.map +1 -0
- package/dist/runtimeReady.native-jUmuE1lV.cjs +2 -0
- package/dist/runtimeReady.native-jUmuE1lV.cjs.map +1 -0
- package/dist/runtimeReady.web-C8fdIbVR.js +25 -0
- package/dist/runtimeReady.web-C8fdIbVR.js.map +1 -0
- package/dist/runtimeReady.web-DHW682RN.cjs +2 -0
- package/dist/runtimeReady.web-DHW682RN.cjs.map +1 -0
- package/dist/seedRuntimeReady-BKwkBEAF.cjs +2 -0
- package/dist/seedRuntimeReady-BKwkBEAF.cjs.map +1 -0
- package/dist/seedRuntimeReady-Cz8nOKoo.js +10 -0
- package/dist/seedRuntimeReady-Cz8nOKoo.js.map +1 -0
- package/dist/src/adapters/appLifecycle.d.ts +8 -1
- package/dist/src/adapters/batch.d.ts +2 -0
- package/dist/src/adapters/crashCapture.d.ts +38 -9
- package/dist/src/adapters/failedEvents.d.ts +43 -0
- package/dist/src/adapters/frameAggregate.d.ts +8 -3
- package/dist/src/adapters/frameTracker.d.ts +30 -0
- package/dist/src/adapters/httpAttributes.d.ts +18 -0
- package/dist/src/adapters/loadingTime.d.ts +67 -0
- package/dist/src/adapters/native/interceptHttpNative.native.d.ts +18 -0
- package/dist/src/adapters/native/memoryNative.native.d.ts +15 -11
- package/dist/src/adapters/native/runtimeReady.native.d.ts +1 -0
- package/dist/src/adapters/native/store.native.d.ts +10 -0
- package/dist/src/adapters/nativeSender.d.ts +2 -2
- package/dist/src/adapters/navigationRef.d.ts +21 -0
- package/dist/src/adapters/navigationTracker.d.ts +1 -1
- package/dist/src/adapters/screenTiming.d.ts +8 -2
- package/dist/src/adapters/seedRuntimeReady.d.ts +8 -0
- package/dist/src/adapters/traceHeader.d.ts +33 -0
- package/dist/src/adapters/traceManager.d.ts +131 -0
- package/dist/src/adapters/uiInteraction.d.ts +111 -0
- package/dist/src/adapters/viewManager.d.ts +161 -0
- package/dist/src/adapters/viewport.d.ts +15 -0
- package/dist/src/adapters/web/interactionWeb.web.d.ts +36 -0
- package/dist/src/adapters/web/interceptFetchWeb.web.d.ts +3 -11
- package/dist/src/adapters/web/navigationWeb.web.d.ts +10 -0
- package/dist/src/adapters/web/runtimeReady.web.d.ts +5 -0
- package/dist/src/adapters/web/store.web.d.ts +12 -0
- package/dist/src/adapters/web/webVitals.web.d.ts +49 -0
- package/dist/src/adapters/webSender.d.ts +2 -2
- package/dist/src/adapters/webVitals.d.ts +25 -0
- package/dist/src/adapters/xhrIntercept.d.ts +53 -0
- package/dist/src/core/beforeSend.d.ts +20 -0
- package/dist/src/core/debug.d.ts +7 -0
- package/dist/src/core/memoryStore.d.ts +23 -0
- package/dist/src/core/store.d.ts +41 -0
- package/dist/src/core/telemetry.d.ts +305 -35
- package/dist/src/core/userProfile.d.ts +12 -0
- package/dist/src/core/utils/json.d.ts +7 -0
- package/dist/src/core/utils/uuid.d.ts +10 -1
- package/dist/src/createTelemetry.native.d.ts +7 -0
- package/dist/src/createTelemetry.web.d.ts +7 -0
- package/dist/src/index.base.d.ts +17 -1
- package/dist/src/index.native.d.ts +46 -9
- package/dist/src/index.web.d.ts +33 -2
- package/dist/store.native-BYBJcy6o.js +32 -0
- package/dist/store.native-BYBJcy6o.js.map +1 -0
- package/dist/store.native-TPqXngmF.cjs +2 -0
- package/dist/store.native-TPqXngmF.cjs.map +1 -0
- package/dist/store.web-CvqqN-_Z.cjs +2 -0
- package/dist/store.web-CvqqN-_Z.cjs.map +1 -0
- package/dist/store.web-DJAlN0nc.js +31 -0
- package/dist/store.web-DJAlN0nc.js.map +1 -0
- package/dist/telemetry-ByDJIz_9.js +1280 -0
- package/dist/telemetry-ByDJIz_9.js.map +1 -0
- package/dist/telemetry-CrU7i1Jc.cjs +2 -0
- package/dist/telemetry-CrU7i1Jc.cjs.map +1 -0
- package/dist/uiInteraction-CdzvEI1p.cjs +2 -0
- package/dist/uiInteraction-CdzvEI1p.cjs.map +1 -0
- package/dist/uiInteraction-DAqxxz0q.js +104 -0
- package/dist/uiInteraction-DAqxxz0q.js.map +1 -0
- package/dist/viewport-Dd85GUNO.cjs +2 -0
- package/dist/viewport-Dd85GUNO.cjs.map +1 -0
- package/dist/viewport-Dzmt5QwK.js +15 -0
- package/dist/viewport-Dzmt5QwK.js.map +1 -0
- package/dist/web-vitals.attribution-CVCPiX-h.cjs +2 -0
- package/dist/web-vitals.attribution-CVCPiX-h.cjs.map +1 -0
- package/dist/web-vitals.attribution-xw9N5MKQ.js +488 -0
- package/dist/web-vitals.attribution-xw9N5MKQ.js.map +1 -0
- package/dist/webSender-BIwslfpT.js +63 -0
- package/dist/webSender-BIwslfpT.js.map +1 -0
- package/dist/webSender-CVtE4sOF.cjs +2 -0
- package/dist/webSender-CVtE4sOF.cjs.map +1 -0
- package/dist/webVitals.web-CNIpsKlA.js +85 -0
- package/dist/webVitals.web-CNIpsKlA.js.map +1 -0
- package/dist/webVitals.web-DpWJ-iYp.cjs +2 -0
- package/dist/webVitals.web-DpWJ-iYp.cjs.map +1 -0
- package/dist/xhrIntercept-BADex6Cq.cjs +2 -0
- package/dist/xhrIntercept-BADex6Cq.cjs.map +1 -0
- package/dist/xhrIntercept-BNiA41Mj.js +53 -0
- package/dist/xhrIntercept-BNiA41Mj.js.map +1 -0
- package/docs/migration-v4.md +190 -0
- package/package.json +12 -4
- package/dist/appLifecycle-Cynw0kAv.js +0 -14
- package/dist/appLifecycle-Cynw0kAv.js.map +0 -1
- package/dist/appLifecycle-DvJIt7ym.cjs +0 -2
- package/dist/appLifecycle-DvJIt7ym.cjs.map +0 -1
- package/dist/batch-CLBFgYPC.cjs +0 -2
- package/dist/batch-CLBFgYPC.cjs.map +0 -1
- package/dist/batch-DLG_gtOm.js +0 -12
- package/dist/batch-DLG_gtOm.js.map +0 -1
- package/dist/crashCapture-BYTM4FLC.cjs +0 -2
- package/dist/crashCapture-BYTM4FLC.cjs.map +0 -1
- package/dist/crashCapture-D_rkkBVa.js +0 -31
- package/dist/crashCapture-D_rkkBVa.js.map +0 -1
- package/dist/crashHandler.web-BSxDpFTo.cjs +0 -2
- package/dist/crashHandler.web-BSxDpFTo.cjs.map +0 -1
- package/dist/crashHandler.web-D59bmhg9.js +0 -32
- package/dist/crashHandler.web-D59bmhg9.js.map +0 -1
- package/dist/crashHandlerNative.native-DeAFze4E.cjs +0 -2
- package/dist/crashHandlerNative.native-DeAFze4E.cjs.map +0 -1
- package/dist/crashHandlerNative.native-d7qJkzA6.js +0 -41
- package/dist/crashHandlerNative.native-d7qJkzA6.js.map +0 -1
- package/dist/debug-DsvQ9y3W.js +0 -68
- package/dist/debug-DsvQ9y3W.js.map +0 -1
- package/dist/debug-rnOOxFpN.cjs +0 -2
- package/dist/debug-rnOOxFpN.cjs.map +0 -1
- package/dist/deviceInfo.native-7hbRYixR.cjs +0 -2
- package/dist/deviceInfo.native-7hbRYixR.cjs.map +0 -1
- package/dist/deviceInfo.native-D2k0LDhI.js.map +0 -1
- package/dist/deviceInfo.web-ByNAlEJh.cjs +0 -2
- package/dist/deviceInfo.web-ByNAlEJh.cjs.map +0 -1
- package/dist/deviceInfo.web-DzQyEku6.js +0 -40
- package/dist/deviceInfo.web-DzQyEku6.js.map +0 -1
- package/dist/frameAggregate-C_HoVFcK.cjs +0 -2
- package/dist/frameAggregate-C_HoVFcK.cjs.map +0 -1
- package/dist/frameAggregate-Cwh1juw1.js +0 -17
- package/dist/frameAggregate-Cwh1juw1.js.map +0 -1
- package/dist/frameDropsNative.native-CP7zrXDf.js +0 -23
- package/dist/frameDropsNative.native-CP7zrXDf.js.map +0 -1
- package/dist/frameDropsNative.native-DKqEDqip.cjs +0 -2
- package/dist/frameDropsNative.native-DKqEDqip.cjs.map +0 -1
- package/dist/frameDropsWeb.web-C9Lt3Fuj.js +0 -22
- package/dist/frameDropsWeb.web-C9Lt3Fuj.js.map +0 -1
- package/dist/frameDropsWeb.web-azpwQCUz.cjs +0 -2
- package/dist/frameDropsWeb.web-azpwQCUz.cjs.map +0 -1
- package/dist/httpAttributes-BV50UKQU.js +0 -19
- package/dist/httpAttributes-BV50UKQU.js.map +0 -1
- package/dist/httpAttributes-xXOD9trQ.cjs +0 -2
- package/dist/httpAttributes-xXOD9trQ.cjs.map +0 -1
- package/dist/interaction-CH8yoY5-.js +0 -23
- package/dist/interaction-CH8yoY5-.js.map +0 -1
- package/dist/interaction-DcNFBW7a.cjs +0 -2
- package/dist/interaction-DcNFBW7a.cjs.map +0 -1
- package/dist/interceptFetchNative.native-VlhtMG-U.js +0 -49
- package/dist/interceptFetchNative.native-VlhtMG-U.js.map +0 -1
- package/dist/interceptFetchNative.native-jEAldH14.cjs +0 -2
- package/dist/interceptFetchNative.native-jEAldH14.cjs.map +0 -1
- package/dist/interceptFetchWeb.web-DFzZliik.cjs +0 -2
- package/dist/interceptFetchWeb.web-DFzZliik.cjs.map +0 -1
- package/dist/interceptFetchWeb.web-DfsMfoRP.js +0 -77
- package/dist/interceptFetchWeb.web-DfsMfoRP.js.map +0 -1
- package/dist/memoryNative.native-BWLh2S9L.js +0 -48
- package/dist/memoryNative.native-BWLh2S9L.js.map +0 -1
- package/dist/memoryNative.native-DCXSOd4Q.cjs +0 -2
- package/dist/memoryNative.native-DCXSOd4Q.cjs.map +0 -1
- package/dist/memoryWeb.web-B3YuV-cB.js +0 -48
- package/dist/memoryWeb.web-B3YuV-cB.js.map +0 -1
- package/dist/memoryWeb.web-CheXAcJn.cjs +0 -2
- package/dist/memoryWeb.web-CheXAcJn.cjs.map +0 -1
- package/dist/nativeSender-BE_mzw_S.js +0 -70
- package/dist/nativeSender-BE_mzw_S.js.map +0 -1
- package/dist/nativeSender-DyAUGY7c.cjs +0 -2
- package/dist/nativeSender-DyAUGY7c.cjs.map +0 -1
- package/dist/navigationNative.native-3tO5JxSd.cjs +0 -2
- package/dist/navigationNative.native-3tO5JxSd.cjs.map +0 -1
- package/dist/navigationNative.native-BUCGPQX2.js +0 -25
- package/dist/navigationNative.native-BUCGPQX2.js.map +0 -1
- package/dist/navigationTracker-B2GMwyKk.cjs +0 -2
- package/dist/navigationTracker-B2GMwyKk.cjs.map +0 -1
- package/dist/navigationTracker-Cts68dgG.js.map +0 -1
- package/dist/navigationWeb.web-B0necr5j.cjs +0 -2
- package/dist/navigationWeb.web-B0necr5j.cjs.map +0 -1
- package/dist/navigationWeb.web-CORzE_Id.js +0 -46
- package/dist/navigationWeb.web-CORzE_Id.js.map +0 -1
- package/dist/networkInfo.web-DJmw1sNK.cjs +0 -2
- package/dist/networkInfo.web-DJmw1sNK.cjs.map +0 -1
- package/dist/networkInfo.web-twcNn_hc.js.map +0 -1
- package/dist/src/adapters/interaction.d.ts +0 -17
- package/dist/src/adapters/native/frameDropsNative.native.d.ts +0 -16
- package/dist/src/adapters/native/interceptFetchNative.native.d.ts +0 -23
- package/dist/src/adapters/native/navigationNative.native.d.ts +0 -12
- package/dist/src/adapters/web/frameDropsWeb.web.d.ts +0 -16
- package/dist/src/adapters/web/memoryWeb.web.d.ts +0 -26
- package/dist/telemetry-Co4MYdwa.cjs +0 -2
- package/dist/telemetry-Co4MYdwa.cjs.map +0 -1
- package/dist/telemetry-KI0x4gzC.js +0 -389
- package/dist/telemetry-KI0x4gzC.js.map +0 -1
- package/dist/v4-BysszJq8.js +0 -31
- package/dist/v4-BysszJq8.js.map +0 -1
- package/dist/v4-CqdK_b8Y.cjs +0 -2
- package/dist/v4-CqdK_b8Y.cjs.map +0 -1
- package/dist/webSender-B27tmT1w.js +0 -42
- package/dist/webSender-B27tmT1w.js.map +0 -1
- package/dist/webSender-BWi4x1df.cjs +0 -2
- package/dist/webSender-BWi4x1df.cjs.map +0 -1
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
# Migrating to v4 — @nathanclaire/edge-telemetry-sdk (React Native)
|
|
2
|
+
|
|
3
|
+
**Ships with the release, not after it.** **Exactly one of the twenty discontinuities below is
|
|
4
|
+
visible at compile time** — #2, the accessor return shapes. (The six `@deprecated` `UserProfile`
|
|
5
|
+
fields are the other compile-time-visible change, but they are **not one of the twenty**; they sit
|
|
6
|
+
outside the list, which is why the table below numbers them `—`.) The remaining **nineteen**
|
|
7
|
+
surface at runtime or in a chart — which is exactly why this note has to arrive with the release
|
|
8
|
+
rather than trailing it.
|
|
9
|
+
|
|
10
|
+
`docs/backend-wire-contract.md` §12 is authoritative for this list; where it and this note
|
|
11
|
+
disagree, the contract wins. `CLAUDE.md` explains the behaviour behind each entry.
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Read this first
|
|
16
|
+
|
|
17
|
+
- ⚠ **You are almost certainly on 3.0.0, not 3.1.0.** `3.0.1` and `3.1.0` exist in the
|
|
18
|
+
[CHANGELOG](../CHANGELOG.md) but **were never published to npm** — `npm view
|
|
19
|
+
@nathanclaire/edge-telemetry-sdk versions` returns `["3.0.0"]`. So the twenty discontinuities
|
|
20
|
+
below, which are counted from 3.1.0, are **not the whole delta for you**: 3.0.1 and 3.1.0
|
|
21
|
+
arrive inside this upgrade too. The one that matters is 3.1.0's respelling of seven Context
|
|
22
|
+
keys from camelCase to their contract spelling (`app.packageName` → `app.package_name` and
|
|
23
|
+
six others). Those columns were never filling for you and start filling now — a step at this
|
|
24
|
+
release boundary that is a *fix landing*, not a v4 regression. Nothing about it breaks a
|
|
25
|
+
build.
|
|
26
|
+
- **Two changes break a build.** #2 (accessor return shapes) and the six `@deprecated`
|
|
27
|
+
`UserProfile` fields — the latter outside the twenty. Both are compile-time visible; fix them
|
|
28
|
+
and your app builds.
|
|
29
|
+
- **Nineteen changes break a chart** — every entry of the twenty except #2. No compile error, no
|
|
30
|
+
runtime error, no log line: a saved filter quietly returns zero rows, or a series steps at the
|
|
31
|
+
release boundary.
|
|
32
|
+
- **Every one of them is separable only by `sdk.version`.** ⚠ That key is absent from the bag on
|
|
33
|
+
essentially all historical rows, so splitting a *historical* series on it does not work.
|
|
34
|
+
Promoting it going forward is the only version of this that does.
|
|
35
|
+
- **One action item for most consumers:** if you called `setUserProfile()`, `setUserDetails()`,
|
|
36
|
+
`updateUserProfile()`, `setUserName()` or `setUserContact()` and never called `identify()`,
|
|
37
|
+
your profile data now reaches the wire **not at all** — those five record state, and only
|
|
38
|
+
`identify()` emits `user.profile.update`. Add one `identify()` call. See #6.
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## Compile-time visible (2)
|
|
43
|
+
|
|
44
|
+
| # | Change | What breaks | Fix |
|
|
45
|
+
|---|---|---|---|
|
|
46
|
+
| 2 | `getDeviceInfo()` / `getNetworkInfo()` return shapes changed | destructuring the old camelCase keys | read the new snake_case shape; the `DeviceInfo` type is not importable, so this is structural only |
|
|
47
|
+
| — | Six `UserProfile` fields are `@deprecated` (live until v5) | `fullName`, `firstName`, `lastName`, `avatar`, `createdAt`, `updatedAt` warn | `fullName` still works and still builds `user.name`; the other five have no wire key and no reader — drop them |
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## Shipped in 3.1.0, ahead of v4 (3)
|
|
52
|
+
|
|
53
|
+
| # | Change | Effect |
|
|
54
|
+
|---|---|---|
|
|
55
|
+
| 1 | Seven camelCase Context keys respelled to snake_case | any bag query on the old spellings returns **zero rows**; five columns start filling; every `rum_apps` series **steps** here |
|
|
56
|
+
| 2 | `getDeviceInfo()` / `getNetworkInfo()` return shapes change | **compile-time visible** — the map's first consumer API break |
|
|
57
|
+
| 3 | `app.packageName` → `app.package_name` | stops an active cross-tenant corruption; does **not** migrate history |
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## v4 — keys that disappear (6)
|
|
62
|
+
|
|
63
|
+
| # | Change | Effect |
|
|
64
|
+
|---|---|---|
|
|
65
|
+
| 4 | **`http.url` removed** | ⚠ empties `rum_http_requests.url`, a populated production column in the 2nd most-queried table. Replaced by `http.host` + `http.route` — **not** a query-strip; the identifier lives in the path |
|
|
66
|
+
| 5 | **`http.path` removed** | not a rename a `COALESCE` papers over — raw values vs normalized templates |
|
|
67
|
+
| 6 | `user.name` / `user.email` / `user.phone` leave the Context block | any bag query filtering **events** on them returns zero rows; they ride `user.profile.update` **only**, and only when you call `identify()` |
|
|
68
|
+
| 7 | Six `user.*` wire keys vanish outright | `fullName`, `firstName`, `lastName`, `avatar`, `createdAt`, `updatedAt` |
|
|
69
|
+
| 8 | `device.iosDeviceName` vanishes | PII removal. `device.fingerprint` goes with it — see #20 |
|
|
70
|
+
| 9 | **Web loses `memory_usage` entirely** | the metric's presence was browser detection wearing a memory label (`performance.memory` is Chromium-only). `TelemetryWeb` has no `trackMemoryUsage` method at all |
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
## v4 — values that change under an unchanged key (7)
|
|
75
|
+
|
|
76
|
+
These are the dangerous ones: the key still exists, the query still runs, the number is different.
|
|
77
|
+
|
|
78
|
+
| # | Change | Effect |
|
|
79
|
+
|---|---|---|
|
|
80
|
+
| 10 | `sdk.platform`: `react-native` → `react-native-{Platform.OS}` | ⚠ a saved filter on `sdk.platform = 'react-native'` returns **zero rows** — the worst way for a chart to fail. ⚠ **Not** a closed three-value enum: `ios` / `android` / `web` are what the two builds emit today, but RN-Windows would emit `react-native-windows` |
|
|
81
|
+
| 11 | `memory.type`: `"heap"` → `"rss"` | ⚠ on a **promoted column**, with real v3 Hermes data to be silently compared against. RSS counts native allocations — images, native views — which are what actually get a process OOM-killed |
|
|
82
|
+
| 12 | `http.request_size`: UTF-16 units → **UTF-8 bytes** | any non-ASCII traffic's payload-size series steps up **2–3×** |
|
|
83
|
+
| 13 | `session.id` gains a `_web` suffix on the web build | value shape changes; nothing parses it |
|
|
84
|
+
| 14 | `error.source` re-cuts `crash.cause` | ⚠ a **migration table, not a rename** — do not map the four old values on positionally. `ConsoleWarn` is deleted (a warning is a breadcrumb); `cross_origin` is new. All five `crash.*` keys become dotted `error.*` |
|
|
85
|
+
| 15 | `http.method` uppercased | a saved filter on `'post'` returns zero rows — a **correction** |
|
|
86
|
+
| 16 | `frame.dropped_count` values move on 90/120 Hz devices | a **correction**: v3 budgeted against a hardcoded 60 Hz and undercounted. `frame.target_fps` is now measured; `frame.target_hz` is gone |
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
## v4 — counts that step (4)
|
|
91
|
+
|
|
92
|
+
| # | Change | Effect |
|
|
93
|
+
|---|---|---|
|
|
94
|
+
| 17 | **Session counts drop sharply** | resume-across-process-death replaces per-launch minting, and RN native processes are killed constantly. A resumed session emits **no** `session.started`, so count launches from `app.start`, not from `session.reason` |
|
|
95
|
+
| 18 | **Every native device gets a new `device.id`** | device counts double across the boundary **once**, with no v3↔v4 device join available. `device.id` is now SDK-minted and never rotates |
|
|
96
|
+
| 19 | **`user.id` vanishes from anonymous traffic** | any "users" chart that does not filter drops to the **identified population**. `COUNT(DISTINCT device.id)` is anonymous reach; `COUNT(DISTINCT user.id)` is known-user reach |
|
|
97
|
+
| 20 | **RN-Android device counts step up** | previously-merged handsets un-merge as `device.fingerprint` stops being sent — a **correction** of a real undercount, and the only entry where the v3 numbers were wrong in that direction |
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
## Arrival changes, not content changes
|
|
102
|
+
|
|
103
|
+
Not counted among the twenty, but they change what ingest sees:
|
|
104
|
+
|
|
105
|
+
- **Burst arrival**, ~25×-larger and 3×-rarer POSTs (`batchSize` 50 / 30 s).
|
|
106
|
+
- **At-least-once duplicates** until the `(session_id, event_sequence)` dedup index exists. ⚠ This
|
|
107
|
+
is a **rollout-ordering question**: the index should land **before or with** the SDK. Until it
|
|
108
|
+
does, replay inflates every aggregate.
|
|
109
|
+
- Two volume moves that are not breaks but will look like incidents: `http.request` goes **zero →
|
|
110
|
+
everything** for axios-based tenants (native now patches XHR, the one chokepoint axios uses), and
|
|
111
|
+
`screen.duration` volume goes **up** for React Navigation consumers at the exact moment it is
|
|
112
|
+
deprecated.
|
|
113
|
+
|
|
114
|
+
---
|
|
115
|
+
|
|
116
|
+
## Four event names retired
|
|
117
|
+
|
|
118
|
+
⚠ **Instructions, not omissions.** These are off the allowlist and unreachable — a `log()` call
|
|
119
|
+
using one is rewritten to `custom_event`. Build nothing for them.
|
|
120
|
+
|
|
121
|
+
| Name | Why it is gone |
|
|
122
|
+
|---|---|
|
|
123
|
+
| `user.interaction` | superseded by `ui.interaction` (§4.6). Android's own contract already says not to build a table for it |
|
|
124
|
+
| `page_load` | its job is done three times over: *a page load happened* → `view` with `view.load_type: initial_load`; *how long* → `view.loading_time`; *why slow* → TTFB/FCP/LCP with the phase splits |
|
|
125
|
+
| `resource_timing` | per-asset rows: hundreds per asset-heavy view, in a namespace with no column, on one platform of four. A single such view would exceed the 500-event in-memory queue on its own |
|
|
126
|
+
| `long_task` | `PerformanceLongTaskTiming` and `long-animation-frame` are **both Chromium-only**, so a "bare `longtask` fallback" buys Chrome 58–122, not one non-Chromium user. Jank detection is already universal via `frame_render_time`; the user-visible consequence is measured by INP's phase split |
|
|
127
|
+
|
|
128
|
+
The last three were **allowlisted but never produced**, so they add nothing to the migration
|
|
129
|
+
story — no chart exists on any of them.
|
|
130
|
+
|
|
131
|
+
---
|
|
132
|
+
|
|
133
|
+
## Columns RN will never write
|
|
134
|
+
|
|
135
|
+
So nobody builds an ANR panel that shows an empty slice forever. Contract §10.1/§10.3.
|
|
136
|
+
|
|
137
|
+
| Table | Columns | Why |
|
|
138
|
+
|---|---|---|
|
|
139
|
+
| `rum_crash_events` / `rum_errors` | `anr_duration_ms`, `hang_duration_ms`, `crash_thread`, `crash_is_main_thread` | crash capture is **JS-level only**. A signal handler has no JS `Error` to derive `error.*` from and cannot read the trace carrier |
|
|
140
|
+
| `rum_crash_events` | `error_context`, `product_id`, `error_code`, `user_action`, `severity_level` | Android's positional `trackError` overloads. RN ships one method — `captureError(err, context)` — and `context` carries them at no fixed spelling |
|
|
141
|
+
| `rum_crash_events` | `crash_hash` | ⚠ `NOT NULL` with no producer, **by design** — backend-computed. No fingerprint ships on the wire: grouping algorithms change, which is a backfill server-side and an app-store rollout SDK-side |
|
|
142
|
+
| `rum_ui_interactions` | `ui_direction` | `ui.type` is closed at `click` \| `tap`. Gesture capture is out of scope — do not size this column for RN |
|
|
143
|
+
| `rum_ui_interactions` | `ui_screen` | dropped deliberately; `view.name` on the Context block supersedes it |
|
|
144
|
+
| `rum_screen_durations` | every row, **on web** | web has never emitted `screen.duration` and will not |
|
|
145
|
+
| `rum_sessions` | `duration_ms`, `event_count`, `metric_count`, `screen_count`, `visited_screens`, `is_first_session`, `total_sessions` | all derived server-side |
|
|
146
|
+
| `rum_performance_events` | `memory_usage_mb`, `memory_pressure_level`, `memory_timestamp` | RN emits `memory_usage` on the **metric** path; these live on the **event** path |
|
|
147
|
+
| `rum_performance_metrics` / `rum_performance_events` | `frame_build_duration_ms`, `frame_raster_duration_ms`, `frame_type`, `frame_dropped`, `frame_total_duration_ms`, `frame_severity` | a model difference, not a spelling one |
|
|
148
|
+
| `rum_devices` | `fingerprint` | **deliberately stopped** — zero analytics readers, and sending it corrupts device identity |
|
|
149
|
+
| `rum_navigations` / `rum_navigation_events` | `has_arguments` | not adopted; `navigation` is deprecated anyway |
|
|
150
|
+
| `rum_trace_spans`, `rum_user_actions` | **every column** | RN writes neither table. The trace surface lands on `rum_telemetry_events` and `rum_http_requests` |
|
|
151
|
+
| — | any `resource.*` / `long_task` key, `metric_name = 'page_load'` | retired above |
|
|
152
|
+
|
|
153
|
+
**Plus the 35 allowlist keys `extract.go` reads that RN never sends** — the largest single group of
|
|
154
|
+
empty columns, and the one most likely to be mistaken for a capture bug. Enumerate them with the
|
|
155
|
+
command in contract Appendix A; every one stays NULL for RN traffic.
|
|
156
|
+
|
|
157
|
+
**Deferred as one bundle, not refused:** `device.cpu_cores`, `device.thermal_status`,
|
|
158
|
+
`device.battery_level`, `device.battery_charging`, `device.power_save`, `app.exit` and its keys,
|
|
159
|
+
native signal/ANR/hang capture, and a synchronous crash store. The rule is that **anything needing
|
|
160
|
+
the SDK's first native module defers and is priced against the whole native surface** — Kotlin and
|
|
161
|
+
Swift sources in a repo whose CI runs only `npm ci`, a TurboModule spec, and an Expo config plugin,
|
|
162
|
+
without which Expo Go consumers cannot install a package that is pure JS today.
|
|
163
|
+
|
|
164
|
+
⚠ **The JS dirty-flag approximation of `app.exit` is rejected on the record** and must not come
|
|
165
|
+
back as the cheap win: it detects abnormal termination without naming the cause, and on mobile the
|
|
166
|
+
dominant cause is the user force-quitting, which is not a fault. The metric would not be thin — it
|
|
167
|
+
would **invert**, scoring healthy apps with engaged users worst.
|
|
168
|
+
|
|
169
|
+
---
|
|
170
|
+
|
|
171
|
+
## Five deliberate departures from Android
|
|
172
|
+
|
|
173
|
+
RN adopts Android's key names wherever the concept already exists — `trace.*`, `span.*`,
|
|
174
|
+
`rum.action.id`, `traceparent.outcome`, `navigation.*`, `screen.*`, `ui.*`, the bag-first storage
|
|
175
|
+
model and the promotion rule. These five diverge **on purpose**. Recorded here so the next person
|
|
176
|
+
diffing the two SDKs does not file a decision as drift. Contract §13.
|
|
177
|
+
|
|
178
|
+
| # | Departure | The argument in one line |
|
|
179
|
+
|---|---|---|
|
|
180
|
+
| 1 | **`error.*` dotted, not Android's undotted `message` / `cause` / `is_fatal`** | RN's bag is one flat namespace shared with 124 keys and `log()` flattens caller data into it, so `message` and `cause` would collide with userland |
|
|
181
|
+
| 2 | **`sessionSampleRate`, not Android's `traceSampleRate`** | Android's is per-*trace* and pinned at `1.0`; a per-trace sampler produces orphan children |
|
|
182
|
+
| 3 | **`http.route`, not a normalized `http.path`** | one column, two dialects, and nothing in the data to separate them |
|
|
183
|
+
| 4 | **`user.id` omitted on anonymous traffic; `device.id` carries anonymous identity** | Android mints both ids the same way into the same store, so its two columns carry one fact. The departure is in *naming*, not storage |
|
|
184
|
+
| 5 | **`user.*` profile keys leave the Context block for `user.profile.update`** | Android persists its profile; RN's is in-memory, and shipping PII on every event to fill a table that needs it once is indefensible |
|
|
185
|
+
|
|
186
|
+
Smaller stated divergences, each in place: `injected_unwired` dropped; `b3` declined; hostname
|
|
187
|
+
matching ignores the port while `http.host` keeps it (**do not join them**); allowlist validation is
|
|
188
|
+
`__DEV__`-gated rather than an unconditional `require`; malformed consumer `traceparent` headers are
|
|
189
|
+
left alone rather than repaired; `ui.screen` dropped; `error.handled` dropped; breadcrumb cap 20
|
|
190
|
+
against Android's 50; `app.start.js_ready_ms` rather than `duration_ms`.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nathanclaire/edge-telemetry-sdk",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "4.0.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
@@ -31,7 +31,8 @@
|
|
|
31
31
|
}
|
|
32
32
|
},
|
|
33
33
|
"files": [
|
|
34
|
-
"dist"
|
|
34
|
+
"dist",
|
|
35
|
+
"docs/migration-v4.md"
|
|
35
36
|
],
|
|
36
37
|
"peerDependencies": {
|
|
37
38
|
"@react-native-async-storage/async-storage": ">=1.21.0",
|
|
@@ -68,12 +69,19 @@
|
|
|
68
69
|
"web"
|
|
69
70
|
],
|
|
70
71
|
"license": "MIT",
|
|
72
|
+
"repository": {
|
|
73
|
+
"type": "git",
|
|
74
|
+
"url": "git+https://github.com/NCG-Africa/edge_telemetry_react_native.git"
|
|
75
|
+
},
|
|
76
|
+
"homepage": "https://github.com/NCG-Africa/edge_telemetry_react_native#readme",
|
|
77
|
+
"bugs": {
|
|
78
|
+
"url": "https://github.com/NCG-Africa/edge_telemetry_react_native/issues"
|
|
79
|
+
},
|
|
71
80
|
"devDependencies": {
|
|
72
81
|
"@types/node": "^24.4.0",
|
|
73
82
|
"@types/react": "^19.1.13",
|
|
74
83
|
"@types/react-dom": "^19.1.9",
|
|
75
84
|
"@types/react-navigation": "^3.0.8",
|
|
76
|
-
"@types/uuid": "^10.0.0",
|
|
77
85
|
"@vitejs/plugin-react": "^5.0.2",
|
|
78
86
|
"rimraf": "^6.0.1",
|
|
79
87
|
"typescript": "^5.9.2",
|
|
@@ -86,6 +94,6 @@
|
|
|
86
94
|
"@react-native-community/netinfo": "^11.4.1",
|
|
87
95
|
"react-native-device-info": "^12.0.0",
|
|
88
96
|
"react-native-get-random-values": "^1.11.0",
|
|
89
|
-
"
|
|
97
|
+
"web-vitals": "^6.2.1"
|
|
90
98
|
}
|
|
91
99
|
}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
class c {
|
|
2
|
-
constructor(t) {
|
|
3
|
-
this.telemetry = t;
|
|
4
|
-
}
|
|
5
|
-
onState(t) {
|
|
6
|
-
this.active !== void 0 && this.active !== t && this.telemetry.log("app_lifecycle", {
|
|
7
|
-
"app_lifecycle.state": t ? "foreground" : "background"
|
|
8
|
-
}), this.active = t;
|
|
9
|
-
}
|
|
10
|
-
}
|
|
11
|
-
export {
|
|
12
|
-
c as AppLifecycleEmitter
|
|
13
|
-
};
|
|
14
|
-
//# sourceMappingURL=appLifecycle-Cynw0kAv.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"appLifecycle-Cynw0kAv.js","sources":["../src/adapters/appLifecycle.ts"],"sourcesContent":["import { Telemetry } from \"../core/telemetry\";\n\n/**\n * Shared foreground/background emitter — the single source of truth so the native\n * (RN AppState) and web (visibilitychange) lifecycle adapters stay in lockstep on the\n * v3 `app_lifecycle` contract (#30).\n *\n * Feed it the current active state via `onState(isActive)`. It emits `app_lifecycle` only\n * on a transition, carrying the direction as `app_lifecycle.state` (foreground|background).\n */\nexport class AppLifecycleEmitter {\n private active?: boolean;\n\n constructor(private telemetry: Telemetry) {}\n\n onState(isActive: boolean): void {\n if (this.active !== undefined && this.active !== isActive) {\n this.telemetry.log(\"app_lifecycle\", {\n \"app_lifecycle.state\": isActive ? \"foreground\" : \"background\",\n });\n }\n this.active = isActive;\n }\n}\n"],"names":["AppLifecycleEmitter","telemetry","isActive"],"mappings":"AAUO,MAAMA,EAAoB;AAAA,EAG/B,YAAoBC,GAAsB;AAAtB,SAAA,YAAAA;AAAA,EAAuB;AAAA,EAE3C,QAAQC,GAAyB;AAC/B,IAAI,KAAK,WAAW,UAAa,KAAK,WAAWA,KAC/C,KAAK,UAAU,IAAI,iBAAiB;AAAA,MAClC,uBAAuBA,IAAW,eAAe;AAAA,IAAA,CAClD,GAEH,KAAK,SAASA;AAAA,EAChB;AACF;"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});class t{constructor(e){this.telemetry=e}onState(e){this.active!==void 0&&this.active!==e&&this.telemetry.log("app_lifecycle",{"app_lifecycle.state":e?"foreground":"background"}),this.active=e}}exports.AppLifecycleEmitter=t;
|
|
2
|
-
//# sourceMappingURL=appLifecycle-DvJIt7ym.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"appLifecycle-DvJIt7ym.cjs","sources":["../src/adapters/appLifecycle.ts"],"sourcesContent":["import { Telemetry } from \"../core/telemetry\";\n\n/**\n * Shared foreground/background emitter — the single source of truth so the native\n * (RN AppState) and web (visibilitychange) lifecycle adapters stay in lockstep on the\n * v3 `app_lifecycle` contract (#30).\n *\n * Feed it the current active state via `onState(isActive)`. It emits `app_lifecycle` only\n * on a transition, carrying the direction as `app_lifecycle.state` (foreground|background).\n */\nexport class AppLifecycleEmitter {\n private active?: boolean;\n\n constructor(private telemetry: Telemetry) {}\n\n onState(isActive: boolean): void {\n if (this.active !== undefined && this.active !== isActive) {\n this.telemetry.log(\"app_lifecycle\", {\n \"app_lifecycle.state\": isActive ? \"foreground\" : \"background\",\n });\n }\n this.active = isActive;\n }\n}\n"],"names":["AppLifecycleEmitter","telemetry","isActive"],"mappings":"gFAUO,MAAMA,CAAoB,CAG/B,YAAoBC,EAAsB,CAAtB,KAAA,UAAAA,CAAuB,CAE3C,QAAQC,EAAyB,CAC3B,KAAK,SAAW,QAAa,KAAK,SAAWA,GAC/C,KAAK,UAAU,IAAI,gBAAiB,CAClC,sBAAuBA,EAAW,aAAe,YAAA,CAClD,EAEH,KAAK,OAASA,CAChB,CACF"}
|
package/dist/batch-CLBFgYPC.cjs
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"batch-CLBFgYPC.cjs","sources":["../src/adapters/batch.ts"],"sourcesContent":["import type { TelemetryEvent } from \"../core/telemetry\";\n\n// v3 wire envelope. Shared by both senders so the web and native POST bodies\n// stay byte-identical to the EdgeRum telemetry_batch contract.\nexport function buildBatch(events: TelemetryEvent[]): string {\n return JSON.stringify({\n type: \"telemetry_batch\",\n timestamp: new Date().toISOString(),\n batch_size: events.length,\n events,\n });\n}\n"],"names":["buildBatch","events"],"mappings":"aAIO,SAASA,EAAWC,EAAkC,CACzD,OAAO,KAAK,UAAU,CAClB,KAAM,kBACN,UAAW,IAAI,KAAA,EAAO,YAAA,EACtB,WAAYA,EAAO,OACnB,OAAAA,CAAA,CACH,CACL"}
|
package/dist/batch-DLG_gtOm.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"batch-DLG_gtOm.js","sources":["../src/adapters/batch.ts"],"sourcesContent":["import type { TelemetryEvent } from \"../core/telemetry\";\n\n// v3 wire envelope. Shared by both senders so the web and native POST bodies\n// stay byte-identical to the EdgeRum telemetry_batch contract.\nexport function buildBatch(events: TelemetryEvent[]): string {\n return JSON.stringify({\n type: \"telemetry_batch\",\n timestamp: new Date().toISOString(),\n batch_size: events.length,\n events,\n });\n}\n"],"names":["buildBatch","events"],"mappings":"AAIO,SAASA,EAAWC,GAAkC;AACzD,SAAO,KAAK,UAAU;AAAA,IAClB,MAAM;AAAA,IACN,YAAW,oBAAI,KAAA,GAAO,YAAA;AAAA,IACtB,YAAYA,EAAO;AAAA,IACnB,QAAAA;AAAA,EAAA,CACH;AACL;"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";function l(n,r={}){const s={"crash.cause":n,"crash.message":r.message??null,"crash.stacktrace":r.stacktrace??null};return r.fatal!==void 0&&(s["crash.fatal"]=r.fatal),s}function u(n,r=console){const s=r.error.bind(r),o=r.warn.bind(r);let a=!1;const c=(t,i)=>(...e)=>{if(!a){a=!0;try{n.log("app.crash",l(t,{message:e.map(String).join(" ")}))}finally{a=!1}}i(...e)};return r.error=c("ConsoleError",s),r.warn=c("ConsoleWarn",o),()=>{r.error=s,r.warn=o}}exports.buildCrashAttributes=l;exports.captureConsole=u;
|
|
2
|
-
//# sourceMappingURL=crashCapture-BYTM4FLC.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"crashCapture-BYTM4FLC.cjs","sources":["../src/adapters/crashCapture.ts"],"sourcesContent":["import { Telemetry } from \"../core/telemetry\";\n\n// One `app.crash` stream, segmented by cause (lifts the iOS ADR-010 model). #28\nexport type CrashCause = \"Error\" | \"UnhandledRejection\" | \"ConsoleError\" | \"ConsoleWarn\";\n\nexport function buildCrashAttributes(\n cause: CrashCause,\n fields: { message?: unknown; stacktrace?: unknown; fatal?: boolean } = {},\n): Record<string, any> {\n const attrs: Record<string, any> = {\n \"crash.cause\": cause,\n \"crash.message\": fields.message ?? null,\n \"crash.stacktrace\": fields.stacktrace ?? null,\n };\n if (fields.fatal !== undefined) attrs[\"crash.fatal\"] = fields.fatal;\n return attrs;\n}\n\n/**\n * Patch console.error/warn to funnel into `app.crash` (cause ConsoleError/ConsoleWarn).\n * Opt-out: callers only invoke this when console capture is enabled. Returns a restore fn.\n * A reentrancy guard prevents the SDK's own console writes during logging from re-capturing.\n */\nexport function captureConsole(\n telemetry: Telemetry,\n target: Pick<Console, \"error\" | \"warn\"> = console,\n): () => void {\n const origError = target.error.bind(target);\n const origWarn = target.warn.bind(target);\n let inside = false;\n\n const make = (cause: CrashCause, orig: (...a: any[]) => void) =>\n (...args: any[]) => {\n if (!inside) {\n inside = true;\n try {\n telemetry.log(\"app.crash\", buildCrashAttributes(cause, { message: args.map(String).join(\" \") }));\n } finally {\n inside = false;\n }\n }\n orig(...args);\n };\n\n target.error = make(\"ConsoleError\", origError);\n target.warn = make(\"ConsoleWarn\", origWarn);\n\n return () => { target.error = origError; target.warn = origWarn; };\n}\n"],"names":["buildCrashAttributes","cause","fields","attrs","captureConsole","telemetry","target","origError","origWarn","inside","make","orig","args"],"mappings":"aAKO,SAASA,EACdC,EACAC,EAAuE,GAClD,CACrB,MAAMC,EAA6B,CACjC,cAAeF,EACf,gBAAiBC,EAAO,SAAW,KACnC,mBAAoBA,EAAO,YAAc,IAAA,EAE3C,OAAIA,EAAO,QAAU,SAAWC,EAAM,aAAa,EAAID,EAAO,OACvDC,CACT,CAOO,SAASC,EACdC,EACAC,EAA0C,QAC9B,CACZ,MAAMC,EAAYD,EAAO,MAAM,KAAKA,CAAM,EACpCE,EAAWF,EAAO,KAAK,KAAKA,CAAM,EACxC,IAAIG,EAAS,GAEb,MAAMC,EAAO,CAACT,EAAmBU,IAC/B,IAAIC,IAAgB,CAClB,GAAI,CAACH,EAAQ,CACXA,EAAS,GACT,GAAI,CACFJ,EAAU,IAAI,YAAaL,EAAqBC,EAAO,CAAE,QAASW,EAAK,IAAI,MAAM,EAAE,KAAK,GAAG,CAAA,CAAG,CAAC,CACjG,QAAA,CACEH,EAAS,EACX,CACF,CACAE,EAAK,GAAGC,CAAI,CACd,EAEF,OAAAN,EAAO,MAAQI,EAAK,eAAgBH,CAAS,EAC7CD,EAAO,KAAOI,EAAK,cAAeF,CAAQ,EAEnC,IAAM,CAAEF,EAAO,MAAQC,EAAWD,EAAO,KAAOE,CAAU,CACnE"}
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
function t(n, r = {}) {
|
|
2
|
-
const a = {
|
|
3
|
-
"crash.cause": n,
|
|
4
|
-
"crash.message": r.message ?? null,
|
|
5
|
-
"crash.stacktrace": r.stacktrace ?? null
|
|
6
|
-
};
|
|
7
|
-
return r.fatal !== void 0 && (a["crash.fatal"] = r.fatal), a;
|
|
8
|
-
}
|
|
9
|
-
function u(n, r = console) {
|
|
10
|
-
const a = r.error.bind(r), o = r.warn.bind(r);
|
|
11
|
-
let s = !1;
|
|
12
|
-
const c = (l, i) => (...e) => {
|
|
13
|
-
if (!s) {
|
|
14
|
-
s = !0;
|
|
15
|
-
try {
|
|
16
|
-
n.log("app.crash", t(l, { message: e.map(String).join(" ") }));
|
|
17
|
-
} finally {
|
|
18
|
-
s = !1;
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
i(...e);
|
|
22
|
-
};
|
|
23
|
-
return r.error = c("ConsoleError", a), r.warn = c("ConsoleWarn", o), () => {
|
|
24
|
-
r.error = a, r.warn = o;
|
|
25
|
-
};
|
|
26
|
-
}
|
|
27
|
-
export {
|
|
28
|
-
t as b,
|
|
29
|
-
u as c
|
|
30
|
-
};
|
|
31
|
-
//# sourceMappingURL=crashCapture-D_rkkBVa.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"crashCapture-D_rkkBVa.js","sources":["../src/adapters/crashCapture.ts"],"sourcesContent":["import { Telemetry } from \"../core/telemetry\";\n\n// One `app.crash` stream, segmented by cause (lifts the iOS ADR-010 model). #28\nexport type CrashCause = \"Error\" | \"UnhandledRejection\" | \"ConsoleError\" | \"ConsoleWarn\";\n\nexport function buildCrashAttributes(\n cause: CrashCause,\n fields: { message?: unknown; stacktrace?: unknown; fatal?: boolean } = {},\n): Record<string, any> {\n const attrs: Record<string, any> = {\n \"crash.cause\": cause,\n \"crash.message\": fields.message ?? null,\n \"crash.stacktrace\": fields.stacktrace ?? null,\n };\n if (fields.fatal !== undefined) attrs[\"crash.fatal\"] = fields.fatal;\n return attrs;\n}\n\n/**\n * Patch console.error/warn to funnel into `app.crash` (cause ConsoleError/ConsoleWarn).\n * Opt-out: callers only invoke this when console capture is enabled. Returns a restore fn.\n * A reentrancy guard prevents the SDK's own console writes during logging from re-capturing.\n */\nexport function captureConsole(\n telemetry: Telemetry,\n target: Pick<Console, \"error\" | \"warn\"> = console,\n): () => void {\n const origError = target.error.bind(target);\n const origWarn = target.warn.bind(target);\n let inside = false;\n\n const make = (cause: CrashCause, orig: (...a: any[]) => void) =>\n (...args: any[]) => {\n if (!inside) {\n inside = true;\n try {\n telemetry.log(\"app.crash\", buildCrashAttributes(cause, { message: args.map(String).join(\" \") }));\n } finally {\n inside = false;\n }\n }\n orig(...args);\n };\n\n target.error = make(\"ConsoleError\", origError);\n target.warn = make(\"ConsoleWarn\", origWarn);\n\n return () => { target.error = origError; target.warn = origWarn; };\n}\n"],"names":["buildCrashAttributes","cause","fields","attrs","captureConsole","telemetry","target","origError","origWarn","inside","make","orig","args"],"mappings":"AAKO,SAASA,EACdC,GACAC,IAAuE,IAClD;AACrB,QAAMC,IAA6B;AAAA,IACjC,eAAeF;AAAA,IACf,iBAAiBC,EAAO,WAAW;AAAA,IACnC,oBAAoBA,EAAO,cAAc;AAAA,EAAA;AAE3C,SAAIA,EAAO,UAAU,WAAWC,EAAM,aAAa,IAAID,EAAO,QACvDC;AACT;AAOO,SAASC,EACdC,GACAC,IAA0C,SAC9B;AACZ,QAAMC,IAAYD,EAAO,MAAM,KAAKA,CAAM,GACpCE,IAAWF,EAAO,KAAK,KAAKA,CAAM;AACxC,MAAIG,IAAS;AAEb,QAAMC,IAAO,CAACT,GAAmBU,MAC/B,IAAIC,MAAgB;AAClB,QAAI,CAACH,GAAQ;AACX,MAAAA,IAAS;AACT,UAAI;AACF,QAAAJ,EAAU,IAAI,aAAaL,EAAqBC,GAAO,EAAE,SAASW,EAAK,IAAI,MAAM,EAAE,KAAK,GAAG,EAAA,CAAG,CAAC;AAAA,MACjG,UAAA;AACE,QAAAH,IAAS;AAAA,MACX;AAAA,IACF;AACA,IAAAE,EAAK,GAAGC,CAAI;AAAA,EACd;AAEF,SAAAN,EAAO,QAAQI,EAAK,gBAAgBH,CAAS,GAC7CD,EAAO,OAAOI,EAAK,eAAeF,CAAQ,GAEnC,MAAM;AAAE,IAAAF,EAAO,QAAQC,GAAWD,EAAO,OAAOE;AAAA,EAAU;AACnE;"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("./crashCapture-BYTM4FLC.cjs");class c{constructor(t){this.telemetry=t}attach(t={}){const{captureConsole:a=!0}=t;return new Promise((o,n)=>{try{window.onerror=(e,i,h,u,s)=>{this.telemetry.log("app.crash",r.buildCrashAttributes("Error",{message:s?.message??e,stacktrace:s?.stack}))},window.onunhandledrejection=e=>{this.telemetry.log("app.crash",r.buildCrashAttributes("UnhandledRejection",{message:e.reason?.message??"Unhandled Promise Rejection",stacktrace:e.reason?.stack}))},a&&r.captureConsole(this.telemetry),o()}catch(e){n(e)}})}}exports.CrashHandler=c;
|
|
2
|
-
//# sourceMappingURL=crashHandler.web-BSxDpFTo.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"crashHandler.web-BSxDpFTo.cjs","sources":["../src/adapters/web/crashHandler.web.ts"],"sourcesContent":["import { Telemetry } from \"../../core/telemetry\";\nimport { buildCrashAttributes, captureConsole } from \"../crashCapture\";\n\nexport type CrashHandlerOptions = { captureConsole?: boolean };\n\nexport class CrashHandler {\n constructor(private telemetry: Telemetry) { }\n\n // Lockstep with native: funnels JS errors, unhandled rejections and (opt-out)\n // console.error/warn into one `app.crash` stream keyed by `crash.cause`. #28\n attach(options: CrashHandlerOptions = {}): Promise<void> {\n const { captureConsole: consoleEnabled = true } = options;\n return new Promise((resolve, reject) => {\n try {\n window.onerror = (msg, _url, _line, _col, error) => {\n this.telemetry.log(\"app.crash\", buildCrashAttributes(\"Error\", {\n message: error?.message ?? msg,\n stacktrace: error?.stack,\n }));\n };\n\n window.onunhandledrejection = (event) => {\n this.telemetry.log(\"app.crash\", buildCrashAttributes(\"UnhandledRejection\", {\n message: event.reason?.message ?? \"Unhandled Promise Rejection\",\n stacktrace: event.reason?.stack,\n }));\n };\n\n if (consoleEnabled) captureConsole(this.telemetry);\n\n resolve();\n } catch (error) {\n reject(error);\n }\n });\n }\n}\n"],"names":["CrashHandler","telemetry","options","consoleEnabled","resolve","reject","msg","_url","_line","_col","error","buildCrashAttributes","event","captureConsole"],"mappings":"+HAKO,MAAMA,CAAa,CACtB,YAAoBC,EAAsB,CAAtB,KAAA,UAAAA,CAAwB,CAI5C,OAAOC,EAA+B,GAAmB,CACrD,KAAM,CAAE,eAAgBC,EAAiB,EAAA,EAASD,EAClD,OAAO,IAAI,QAAQ,CAACE,EAASC,IAAW,CACpC,GAAI,CACA,OAAO,QAAU,CAACC,EAAKC,EAAMC,EAAOC,EAAMC,IAAU,CAChD,KAAK,UAAU,IAAI,YAAaC,EAAAA,qBAAqB,QAAS,CAC1D,QAASD,GAAO,SAAWJ,EAC3B,WAAYI,GAAO,KAAA,CACtB,CAAC,CACN,EAEA,OAAO,qBAAwBE,GAAU,CACrC,KAAK,UAAU,IAAI,YAAaD,EAAAA,qBAAqB,qBAAsB,CACvE,QAASC,EAAM,QAAQ,SAAW,8BAClC,WAAYA,EAAM,QAAQ,KAAA,CAC7B,CAAC,CACN,EAEIT,GAAgBU,EAAAA,eAAe,KAAK,SAAS,EAEjDT,EAAA,CACJ,OAASM,EAAO,CACZL,EAAOK,CAAK,CAChB,CACJ,CAAC,CACL,CACJ"}
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import { b as s, c } from "./crashCapture-D_rkkBVa.js";
|
|
2
|
-
class u {
|
|
3
|
-
constructor(t) {
|
|
4
|
-
this.telemetry = t;
|
|
5
|
-
}
|
|
6
|
-
// Lockstep with native: funnels JS errors, unhandled rejections and (opt-out)
|
|
7
|
-
// console.error/warn into one `app.crash` stream keyed by `crash.cause`. #28
|
|
8
|
-
attach(t = {}) {
|
|
9
|
-
const { captureConsole: a = !0 } = t;
|
|
10
|
-
return new Promise((o, n) => {
|
|
11
|
-
try {
|
|
12
|
-
window.onerror = (e, i, h, m, r) => {
|
|
13
|
-
this.telemetry.log("app.crash", s("Error", {
|
|
14
|
-
message: r?.message ?? e,
|
|
15
|
-
stacktrace: r?.stack
|
|
16
|
-
}));
|
|
17
|
-
}, window.onunhandledrejection = (e) => {
|
|
18
|
-
this.telemetry.log("app.crash", s("UnhandledRejection", {
|
|
19
|
-
message: e.reason?.message ?? "Unhandled Promise Rejection",
|
|
20
|
-
stacktrace: e.reason?.stack
|
|
21
|
-
}));
|
|
22
|
-
}, a && c(this.telemetry), o();
|
|
23
|
-
} catch (e) {
|
|
24
|
-
n(e);
|
|
25
|
-
}
|
|
26
|
-
});
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
export {
|
|
30
|
-
u as CrashHandler
|
|
31
|
-
};
|
|
32
|
-
//# sourceMappingURL=crashHandler.web-D59bmhg9.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"crashHandler.web-D59bmhg9.js","sources":["../src/adapters/web/crashHandler.web.ts"],"sourcesContent":["import { Telemetry } from \"../../core/telemetry\";\nimport { buildCrashAttributes, captureConsole } from \"../crashCapture\";\n\nexport type CrashHandlerOptions = { captureConsole?: boolean };\n\nexport class CrashHandler {\n constructor(private telemetry: Telemetry) { }\n\n // Lockstep with native: funnels JS errors, unhandled rejections and (opt-out)\n // console.error/warn into one `app.crash` stream keyed by `crash.cause`. #28\n attach(options: CrashHandlerOptions = {}): Promise<void> {\n const { captureConsole: consoleEnabled = true } = options;\n return new Promise((resolve, reject) => {\n try {\n window.onerror = (msg, _url, _line, _col, error) => {\n this.telemetry.log(\"app.crash\", buildCrashAttributes(\"Error\", {\n message: error?.message ?? msg,\n stacktrace: error?.stack,\n }));\n };\n\n window.onunhandledrejection = (event) => {\n this.telemetry.log(\"app.crash\", buildCrashAttributes(\"UnhandledRejection\", {\n message: event.reason?.message ?? \"Unhandled Promise Rejection\",\n stacktrace: event.reason?.stack,\n }));\n };\n\n if (consoleEnabled) captureConsole(this.telemetry);\n\n resolve();\n } catch (error) {\n reject(error);\n }\n });\n }\n}\n"],"names":["CrashHandler","telemetry","options","consoleEnabled","resolve","reject","msg","_url","_line","_col","error","buildCrashAttributes","event","captureConsole"],"mappings":";AAKO,MAAMA,EAAa;AAAA,EACtB,YAAoBC,GAAsB;AAAtB,SAAA,YAAAA;AAAA,EAAwB;AAAA;AAAA;AAAA,EAI5C,OAAOC,IAA+B,IAAmB;AACrD,UAAM,EAAE,gBAAgBC,IAAiB,GAAA,IAASD;AAClD,WAAO,IAAI,QAAQ,CAACE,GAASC,MAAW;AACpC,UAAI;AACA,eAAO,UAAU,CAACC,GAAKC,GAAMC,GAAOC,GAAMC,MAAU;AAChD,eAAK,UAAU,IAAI,aAAaC,EAAqB,SAAS;AAAA,YAC1D,SAASD,GAAO,WAAWJ;AAAA,YAC3B,YAAYI,GAAO;AAAA,UAAA,CACtB,CAAC;AAAA,QACN,GAEA,OAAO,uBAAuB,CAACE,MAAU;AACrC,eAAK,UAAU,IAAI,aAAaD,EAAqB,sBAAsB;AAAA,YACvE,SAASC,EAAM,QAAQ,WAAW;AAAA,YAClC,YAAYA,EAAM,QAAQ;AAAA,UAAA,CAC7B,CAAC;AAAA,QACN,GAEIT,KAAgBU,EAAe,KAAK,SAAS,GAEjDT,EAAA;AAAA,MACJ,SAASM,GAAO;AACZ,QAAAL,EAAOK,CAAK;AAAA,MAChB;AAAA,IACJ,CAAC;AAAA,EACL;AACJ;"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const n=require("./crashCapture-BYTM4FLC.cjs");class c{constructor(s){this.telemetry=s}attach(s={}){const{captureConsole:l=!0}=s;return new Promise((o,i)=>{try{if(typeof ErrorUtils<"u"&&ErrorUtils.setGlobalHandler){const e=ErrorUtils.getGlobalHandler?.();ErrorUtils.setGlobalHandler((r,a)=>{this.telemetry.log("app.crash",n.buildCrashAttributes("Error",{message:r?.message,stacktrace:r?.stack,fatal:a})),e&&e(r,a)})}const t=e=>{this.telemetry.log("app.crash",n.buildCrashAttributes("UnhandledRejection",{message:e?.reason?.message??"Unhandled Promise Rejection",stacktrace:e?.reason?.stack}))};globalThis.addEventListener?globalThis.addEventListener("unhandledrejection",t):require("promise/setimmediate/rejection-tracking").enable({allRejections:!0,onUnhandled:(r,a)=>t({reason:a})}),l&&n.captureConsole(this.telemetry),o()}catch(t){i(t)}})}}exports.CrashHandlerNative=c;
|
|
2
|
-
//# sourceMappingURL=crashHandlerNative.native-DeAFze4E.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"crashHandlerNative.native-DeAFze4E.cjs","sources":["../src/adapters/native/crashHandlerNative.native.ts"],"sourcesContent":["import { Telemetry } from \"../../core/telemetry\";\nimport { buildCrashAttributes, captureConsole } from \"../crashCapture\";\n\nexport type CrashHandlerOptions = { captureConsole?: boolean };\n\nexport class CrashHandlerNative {\n constructor(private telemetry: Telemetry) { }\n\n // Funnels JS errors, unhandled rejections and (opt-out) console.error/warn into one\n // `app.crash` stream keyed by `crash.cause`. Console capture defaults on (opt-out). #28\n attach(options: CrashHandlerOptions = {}): Promise<void> {\n const { captureConsole: consoleEnabled = true } = options;\n return new Promise((resolve, reject) => {\n try {\n if (typeof ErrorUtils !== \"undefined\" && ErrorUtils.setGlobalHandler) {\n const defaultHandler = ErrorUtils.getGlobalHandler?.();\n ErrorUtils.setGlobalHandler((error: any, isFatal?: boolean) => {\n this.telemetry.log(\"app.crash\", buildCrashAttributes(\"Error\", {\n message: error?.message,\n stacktrace: error?.stack,\n fatal: isFatal,\n }));\n if (defaultHandler) defaultHandler(error, isFatal); // keep RN red screen in dev\n });\n }\n\n const onRejection = (event: any) => {\n this.telemetry.log(\"app.crash\", buildCrashAttributes(\"UnhandledRejection\", {\n message: event?.reason?.message ?? \"Unhandled Promise Rejection\",\n stacktrace: event?.reason?.stack,\n }));\n };\n\n if (globalThis.addEventListener) {\n globalThis.addEventListener(\"unhandledrejection\", onRejection);\n } else {\n const tracking = require(\"promise/setimmediate/rejection-tracking\");\n tracking.enable({\n allRejections: true,\n onUnhandled: (_id: any, error: any) =>\n onRejection({ reason: error }),\n });\n }\n\n if (consoleEnabled) captureConsole(this.telemetry);\n\n resolve();\n } catch (error) {\n reject(error);\n }\n });\n }\n}\n"],"names":["CrashHandlerNative","telemetry","options","consoleEnabled","resolve","reject","defaultHandler","error","isFatal","buildCrashAttributes","onRejection","event","_id","captureConsole"],"mappings":"+HAKO,MAAMA,CAAmB,CAC5B,YAAoBC,EAAsB,CAAtB,KAAA,UAAAA,CAAwB,CAI5C,OAAOC,EAA+B,GAAmB,CACrD,KAAM,CAAE,eAAgBC,EAAiB,EAAA,EAASD,EAClD,OAAO,IAAI,QAAQ,CAACE,EAASC,IAAW,CACpC,GAAI,CACA,GAAI,OAAO,WAAe,KAAe,WAAW,iBAAkB,CAClE,MAAMC,EAAiB,WAAW,mBAAA,EAClC,WAAW,iBAAiB,CAACC,EAAYC,IAAsB,CAC3D,KAAK,UAAU,IAAI,YAAaC,EAAAA,qBAAqB,QAAS,CAC1D,QAASF,GAAO,QAChB,WAAYA,GAAO,MACnB,MAAOC,CAAA,CACV,CAAC,EACEF,GAAgBA,EAAeC,EAAOC,CAAO,CACrD,CAAC,CACL,CAEA,MAAME,EAAeC,GAAe,CAChC,KAAK,UAAU,IAAI,YAAaF,EAAAA,qBAAqB,qBAAsB,CACvE,QAASE,GAAO,QAAQ,SAAW,8BACnC,WAAYA,GAAO,QAAQ,KAAA,CAC9B,CAAC,CACN,EAEI,WAAW,iBACX,WAAW,iBAAiB,qBAAsBD,CAAW,EAE5C,QAAQ,yCAAyC,EACzD,OAAO,CACZ,cAAe,GACf,YAAa,CAACE,EAAUL,IACpBG,EAAY,CAAE,OAAQH,EAAO,CAAA,CACpC,EAGDJ,GAAgBU,EAAAA,eAAe,KAAK,SAAS,EAEjDT,EAAA,CACJ,OAASG,EAAO,CACZF,EAAOE,CAAK,CAChB,CACJ,CAAC,CACL,CACJ"}
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
import { b as n, c } from "./crashCapture-D_rkkBVa.js";
|
|
2
|
-
class m {
|
|
3
|
-
constructor(s) {
|
|
4
|
-
this.telemetry = s;
|
|
5
|
-
}
|
|
6
|
-
// Funnels JS errors, unhandled rejections and (opt-out) console.error/warn into one
|
|
7
|
-
// `app.crash` stream keyed by `crash.cause`. Console capture defaults on (opt-out). #28
|
|
8
|
-
attach(s = {}) {
|
|
9
|
-
const { captureConsole: l = !0 } = s;
|
|
10
|
-
return new Promise((o, i) => {
|
|
11
|
-
try {
|
|
12
|
-
if (typeof ErrorUtils < "u" && ErrorUtils.setGlobalHandler) {
|
|
13
|
-
const e = ErrorUtils.getGlobalHandler?.();
|
|
14
|
-
ErrorUtils.setGlobalHandler((r, a) => {
|
|
15
|
-
this.telemetry.log("app.crash", n("Error", {
|
|
16
|
-
message: r?.message,
|
|
17
|
-
stacktrace: r?.stack,
|
|
18
|
-
fatal: a
|
|
19
|
-
})), e && e(r, a);
|
|
20
|
-
});
|
|
21
|
-
}
|
|
22
|
-
const t = (e) => {
|
|
23
|
-
this.telemetry.log("app.crash", n("UnhandledRejection", {
|
|
24
|
-
message: e?.reason?.message ?? "Unhandled Promise Rejection",
|
|
25
|
-
stacktrace: e?.reason?.stack
|
|
26
|
-
}));
|
|
27
|
-
};
|
|
28
|
-
globalThis.addEventListener ? globalThis.addEventListener("unhandledrejection", t) : require("promise/setimmediate/rejection-tracking").enable({
|
|
29
|
-
allRejections: !0,
|
|
30
|
-
onUnhandled: (r, a) => t({ reason: a })
|
|
31
|
-
}), l && c(this.telemetry), o();
|
|
32
|
-
} catch (t) {
|
|
33
|
-
i(t);
|
|
34
|
-
}
|
|
35
|
-
});
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
export {
|
|
39
|
-
m as CrashHandlerNative
|
|
40
|
-
};
|
|
41
|
-
//# sourceMappingURL=crashHandlerNative.native-d7qJkzA6.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"crashHandlerNative.native-d7qJkzA6.js","sources":["../src/adapters/native/crashHandlerNative.native.ts"],"sourcesContent":["import { Telemetry } from \"../../core/telemetry\";\nimport { buildCrashAttributes, captureConsole } from \"../crashCapture\";\n\nexport type CrashHandlerOptions = { captureConsole?: boolean };\n\nexport class CrashHandlerNative {\n constructor(private telemetry: Telemetry) { }\n\n // Funnels JS errors, unhandled rejections and (opt-out) console.error/warn into one\n // `app.crash` stream keyed by `crash.cause`. Console capture defaults on (opt-out). #28\n attach(options: CrashHandlerOptions = {}): Promise<void> {\n const { captureConsole: consoleEnabled = true } = options;\n return new Promise((resolve, reject) => {\n try {\n if (typeof ErrorUtils !== \"undefined\" && ErrorUtils.setGlobalHandler) {\n const defaultHandler = ErrorUtils.getGlobalHandler?.();\n ErrorUtils.setGlobalHandler((error: any, isFatal?: boolean) => {\n this.telemetry.log(\"app.crash\", buildCrashAttributes(\"Error\", {\n message: error?.message,\n stacktrace: error?.stack,\n fatal: isFatal,\n }));\n if (defaultHandler) defaultHandler(error, isFatal); // keep RN red screen in dev\n });\n }\n\n const onRejection = (event: any) => {\n this.telemetry.log(\"app.crash\", buildCrashAttributes(\"UnhandledRejection\", {\n message: event?.reason?.message ?? \"Unhandled Promise Rejection\",\n stacktrace: event?.reason?.stack,\n }));\n };\n\n if (globalThis.addEventListener) {\n globalThis.addEventListener(\"unhandledrejection\", onRejection);\n } else {\n const tracking = require(\"promise/setimmediate/rejection-tracking\");\n tracking.enable({\n allRejections: true,\n onUnhandled: (_id: any, error: any) =>\n onRejection({ reason: error }),\n });\n }\n\n if (consoleEnabled) captureConsole(this.telemetry);\n\n resolve();\n } catch (error) {\n reject(error);\n }\n });\n }\n}\n"],"names":["CrashHandlerNative","telemetry","options","consoleEnabled","resolve","reject","defaultHandler","error","isFatal","buildCrashAttributes","onRejection","event","_id","captureConsole"],"mappings":";AAKO,MAAMA,EAAmB;AAAA,EAC5B,YAAoBC,GAAsB;AAAtB,SAAA,YAAAA;AAAA,EAAwB;AAAA;AAAA;AAAA,EAI5C,OAAOC,IAA+B,IAAmB;AACrD,UAAM,EAAE,gBAAgBC,IAAiB,GAAA,IAASD;AAClD,WAAO,IAAI,QAAQ,CAACE,GAASC,MAAW;AACpC,UAAI;AACA,YAAI,OAAO,aAAe,OAAe,WAAW,kBAAkB;AAClE,gBAAMC,IAAiB,WAAW,mBAAA;AAClC,qBAAW,iBAAiB,CAACC,GAAYC,MAAsB;AAC3D,iBAAK,UAAU,IAAI,aAAaC,EAAqB,SAAS;AAAA,cAC1D,SAASF,GAAO;AAAA,cAChB,YAAYA,GAAO;AAAA,cACnB,OAAOC;AAAA,YAAA,CACV,CAAC,GACEF,KAAgBA,EAAeC,GAAOC,CAAO;AAAA,UACrD,CAAC;AAAA,QACL;AAEA,cAAME,IAAc,CAACC,MAAe;AAChC,eAAK,UAAU,IAAI,aAAaF,EAAqB,sBAAsB;AAAA,YACvE,SAASE,GAAO,QAAQ,WAAW;AAAA,YACnC,YAAYA,GAAO,QAAQ;AAAA,UAAA,CAC9B,CAAC;AAAA,QACN;AAEA,QAAI,WAAW,mBACX,WAAW,iBAAiB,sBAAsBD,CAAW,IAE5C,QAAQ,yCAAyC,EACzD,OAAO;AAAA,UACZ,eAAe;AAAA,UACf,aAAa,CAACE,GAAUL,MACpBG,EAAY,EAAE,QAAQH,GAAO;AAAA,QAAA,CACpC,GAGDJ,KAAgBU,EAAe,KAAK,SAAS,GAEjDT,EAAA;AAAA,MACJ,SAASG,GAAO;AACZ,QAAAF,EAAOE,CAAK;AAAA,MAChB;AAAA,IACJ,CAAC;AAAA,EACL;AACJ;"}
|
package/dist/debug-DsvQ9y3W.js
DELETED
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
class r {
|
|
2
|
-
async log(s, t) {
|
|
3
|
-
return (await this.instancePromise).log(s, t);
|
|
4
|
-
}
|
|
5
|
-
async flush() {
|
|
6
|
-
return (await this.instancePromise).flush();
|
|
7
|
-
}
|
|
8
|
-
async shutdown() {
|
|
9
|
-
return (await this.instancePromise).shutdown();
|
|
10
|
-
}
|
|
11
|
-
async trackErrors(s) {
|
|
12
|
-
const { CrashHandlerNative: t } = await import("./crashHandlerNative.native-d7qJkzA6.js"), e = await this.instancePromise, a = new t(e);
|
|
13
|
-
return e.trackErrors(a, s);
|
|
14
|
-
}
|
|
15
|
-
// ---------- User Profile Management ----------
|
|
16
|
-
async setUserId(s) {
|
|
17
|
-
(await this.instancePromise).setUserId(s);
|
|
18
|
-
}
|
|
19
|
-
async generateUserId() {
|
|
20
|
-
return (await this.instancePromise).generateUserId();
|
|
21
|
-
}
|
|
22
|
-
async setUserProfile(s) {
|
|
23
|
-
(await this.instancePromise).setUserProfile(s);
|
|
24
|
-
}
|
|
25
|
-
async setUserDetails(s) {
|
|
26
|
-
(await this.instancePromise).setUserDetails(s);
|
|
27
|
-
}
|
|
28
|
-
async updateUserProfile(s) {
|
|
29
|
-
(await this.instancePromise).updateUserProfile(s);
|
|
30
|
-
}
|
|
31
|
-
async getUserProfile() {
|
|
32
|
-
return (await this.instancePromise).getUserProfile();
|
|
33
|
-
}
|
|
34
|
-
async clearUserProfile() {
|
|
35
|
-
(await this.instancePromise).clearUserProfile();
|
|
36
|
-
}
|
|
37
|
-
async setUserName(s, t, e) {
|
|
38
|
-
(await this.instancePromise).setUserName(s, t, e);
|
|
39
|
-
}
|
|
40
|
-
async setUserContact(s, t) {
|
|
41
|
-
(await this.instancePromise).setUserContact(s, t);
|
|
42
|
-
}
|
|
43
|
-
// EdgeRum-style identify(): emits user.profile.update, preserves the anonymous user.id (#31)
|
|
44
|
-
async identify(s) {
|
|
45
|
-
return (await this.instancePromise).identify(s);
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
let i = !1;
|
|
49
|
-
function o(n) {
|
|
50
|
-
i = n;
|
|
51
|
-
}
|
|
52
|
-
const c = {
|
|
53
|
-
log: (...n) => {
|
|
54
|
-
i && console.log(...n);
|
|
55
|
-
},
|
|
56
|
-
warn: (...n) => {
|
|
57
|
-
i && console.warn(...n);
|
|
58
|
-
},
|
|
59
|
-
error: (...n) => {
|
|
60
|
-
i && console.error(...n);
|
|
61
|
-
}
|
|
62
|
-
};
|
|
63
|
-
export {
|
|
64
|
-
r as T,
|
|
65
|
-
c as d,
|
|
66
|
-
o as s
|
|
67
|
-
};
|
|
68
|
-
//# sourceMappingURL=debug-DsvQ9y3W.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"debug-DsvQ9y3W.js","sources":["../src/index.base.ts","../src/core/debug.ts"],"sourcesContent":["// Shared delegation base for TelemetryWeb / TelemetryNative.\n// Both platform classes lazily build a core `Telemetry` behind `instancePromise`\n// and forward every public call to it; these methods are identical across platforms.\n// Platform-specific capture (getDeviceInfo, track*, navigation/screen) stays in the\n// subclasses because each imports a different platform adapter.\n\ntype ProfileInput = {\n userId?: string;\n fullName?: string;\n firstName?: string;\n lastName?: string;\n email?: string;\n phone?: string;\n avatar?: string;\n customAttributes?: Record<string, any>;\n};\n\nexport abstract class TelemetryBase {\n protected instancePromise!: Promise<any>;\n\n async log(event: string, data?: Record<string, any>) {\n const inst = await this.instancePromise;\n return inst.log(event, data);\n }\n\n async flush() {\n const inst = await this.instancePromise;\n return inst.flush();\n }\n\n async shutdown() {\n const inst = await this.instancePromise;\n return inst.shutdown();\n }\n\n async trackErrors(options?: { captureConsole?: boolean }) {\n const { CrashHandlerNative } = await import(\"./adapters/native/crashHandlerNative.native\");\n const inst = await this.instancePromise;\n const crashHandler = new CrashHandlerNative(inst);\n return inst.trackErrors(crashHandler, options);\n }\n\n // ---------- User Profile Management ----------\n\n async setUserId(id: string) {\n const inst = await this.instancePromise;\n inst.setUserId(id);\n }\n\n async generateUserId() {\n const inst = await this.instancePromise;\n return inst.generateUserId();\n }\n\n async setUserProfile(profile: ProfileInput) {\n const inst = await this.instancePromise;\n inst.setUserProfile(profile);\n }\n\n async setUserDetails(details: ProfileInput) {\n const inst = await this.instancePromise;\n inst.setUserDetails(details);\n }\n\n async updateUserProfile(updates: ProfileInput) {\n const inst = await this.instancePromise;\n inst.updateUserProfile(updates);\n }\n\n async getUserProfile() {\n const inst = await this.instancePromise;\n return inst.getUserProfile();\n }\n\n async clearUserProfile() {\n const inst = await this.instancePromise;\n inst.clearUserProfile();\n }\n\n async setUserName(fullName: string, firstName?: string, lastName?: string) {\n const inst = await this.instancePromise;\n inst.setUserName(fullName, firstName, lastName);\n }\n\n async setUserContact(email?: string, phone?: string) {\n const inst = await this.instancePromise;\n inst.setUserContact(email, phone);\n }\n\n // EdgeRum-style identify(): emits user.profile.update, preserves the anonymous user.id (#31)\n async identify(profile: { name?: string; email?: string; phone?: string; avatar?: string; customAttributes?: Record<string, any> }) {\n const inst = await this.instancePromise;\n return inst.identify(profile);\n }\n}\n","// SDK-internal debug gate (#23, Workstream E). Silent by default so v3 never spams the\n// host app's console; `createTelemetry({ debug: true })` flips it on. Gates log AND\n// warn/error — nothing prints unless debug is enabled.\nlet enabled = false;\n\nexport function setDebug(on: boolean): void {\n enabled = on;\n}\n\nexport const debug = {\n log: (...args: any[]) => { if (enabled) console.log(...args); },\n warn: (...args: any[]) => { if (enabled) console.warn(...args); },\n error: (...args: any[]) => { if (enabled) console.error(...args); },\n};\n"],"names":["TelemetryBase","event","data","options","CrashHandlerNative","inst","crashHandler","id","profile","details","updates","fullName","firstName","lastName","email","phone","enabled","setDebug","on","debug","args"],"mappings":"AAiBO,MAAeA,EAAc;AAAA,EAGhC,MAAM,IAAIC,GAAeC,GAA4B;AAEjD,YADa,MAAM,KAAK,iBACZ,IAAID,GAAOC,CAAI;AAAA,EAC/B;AAAA,EAEA,MAAM,QAAQ;AAEV,YADa,MAAM,KAAK,iBACZ,MAAA;AAAA,EAChB;AAAA,EAEA,MAAM,WAAW;AAEb,YADa,MAAM,KAAK,iBACZ,SAAA;AAAA,EAChB;AAAA,EAEA,MAAM,YAAYC,GAAwC;AACtD,UAAM,EAAE,oBAAAC,EAAA,IAAuB,MAAM,OAAO,yCAA6C,GACnFC,IAAO,MAAM,KAAK,iBAClBC,IAAe,IAAIF,EAAmBC,CAAI;AAChD,WAAOA,EAAK,YAAYC,GAAcH,CAAO;AAAA,EACjD;AAAA;AAAA,EAIA,MAAM,UAAUI,GAAY;AAExB,KADa,MAAM,KAAK,iBACnB,UAAUA,CAAE;AAAA,EACrB;AAAA,EAEA,MAAM,iBAAiB;AAEnB,YADa,MAAM,KAAK,iBACZ,eAAA;AAAA,EAChB;AAAA,EAEA,MAAM,eAAeC,GAAuB;AAExC,KADa,MAAM,KAAK,iBACnB,eAAeA,CAAO;AAAA,EAC/B;AAAA,EAEA,MAAM,eAAeC,GAAuB;AAExC,KADa,MAAM,KAAK,iBACnB,eAAeA,CAAO;AAAA,EAC/B;AAAA,EAEA,MAAM,kBAAkBC,GAAuB;AAE3C,KADa,MAAM,KAAK,iBACnB,kBAAkBA,CAAO;AAAA,EAClC;AAAA,EAEA,MAAM,iBAAiB;AAEnB,YADa,MAAM,KAAK,iBACZ,eAAA;AAAA,EAChB;AAAA,EAEA,MAAM,mBAAmB;AAErB,KADa,MAAM,KAAK,iBACnB,iBAAA;AAAA,EACT;AAAA,EAEA,MAAM,YAAYC,GAAkBC,GAAoBC,GAAmB;AAEvE,KADa,MAAM,KAAK,iBACnB,YAAYF,GAAUC,GAAWC,CAAQ;AAAA,EAClD;AAAA,EAEA,MAAM,eAAeC,GAAgBC,GAAgB;AAEjD,KADa,MAAM,KAAK,iBACnB,eAAeD,GAAOC,CAAK;AAAA,EACpC;AAAA;AAAA,EAGA,MAAM,SAASP,GAAqH;AAEhI,YADa,MAAM,KAAK,iBACZ,SAASA,CAAO;AAAA,EAChC;AACJ;AC3FA,IAAIQ,IAAU;AAEP,SAASC,EAASC,GAAmB;AAC1C,EAAAF,IAAUE;AACZ;AAEO,MAAMC,IAAQ;AAAA,EACnB,KAAK,IAAIC,MAAgB;AAAE,IAAIJ,KAAS,QAAQ,IAAI,GAAGI,CAAI;AAAA,EAAG;AAAA,EAC9D,MAAM,IAAIA,MAAgB;AAAE,IAAIJ,KAAS,QAAQ,KAAK,GAAGI,CAAI;AAAA,EAAG;AAAA,EAChE,OAAO,IAAIA,MAAgB;AAAE,IAAIJ,KAAS,QAAQ,MAAM,GAAGI,CAAI;AAAA,EAAG;AACpE;"}
|
package/dist/debug-rnOOxFpN.cjs
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";class a{async log(s,t){return(await this.instancePromise).log(s,t)}async flush(){return(await this.instancePromise).flush()}async shutdown(){return(await this.instancePromise).shutdown()}async trackErrors(s){const{CrashHandlerNative:t}=await Promise.resolve().then(()=>require("./crashHandlerNative.native-DeAFze4E.cjs")),n=await this.instancePromise,r=new t(n);return n.trackErrors(r,s)}async setUserId(s){(await this.instancePromise).setUserId(s)}async generateUserId(){return(await this.instancePromise).generateUserId()}async setUserProfile(s){(await this.instancePromise).setUserProfile(s)}async setUserDetails(s){(await this.instancePromise).setUserDetails(s)}async updateUserProfile(s){(await this.instancePromise).updateUserProfile(s)}async getUserProfile(){return(await this.instancePromise).getUserProfile()}async clearUserProfile(){(await this.instancePromise).clearUserProfile()}async setUserName(s,t,n){(await this.instancePromise).setUserName(s,t,n)}async setUserContact(s,t){(await this.instancePromise).setUserContact(s,t)}async identify(s){return(await this.instancePromise).identify(s)}}let i=!1;function o(e){i=e}const c={log:(...e)=>{i&&console.log(...e)},warn:(...e)=>{i&&console.warn(...e)},error:(...e)=>{i&&console.error(...e)}};exports.TelemetryBase=a;exports.debug=c;exports.setDebug=o;
|
|
2
|
-
//# sourceMappingURL=debug-rnOOxFpN.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"debug-rnOOxFpN.cjs","sources":["../src/index.base.ts","../src/core/debug.ts"],"sourcesContent":["// Shared delegation base for TelemetryWeb / TelemetryNative.\n// Both platform classes lazily build a core `Telemetry` behind `instancePromise`\n// and forward every public call to it; these methods are identical across platforms.\n// Platform-specific capture (getDeviceInfo, track*, navigation/screen) stays in the\n// subclasses because each imports a different platform adapter.\n\ntype ProfileInput = {\n userId?: string;\n fullName?: string;\n firstName?: string;\n lastName?: string;\n email?: string;\n phone?: string;\n avatar?: string;\n customAttributes?: Record<string, any>;\n};\n\nexport abstract class TelemetryBase {\n protected instancePromise!: Promise<any>;\n\n async log(event: string, data?: Record<string, any>) {\n const inst = await this.instancePromise;\n return inst.log(event, data);\n }\n\n async flush() {\n const inst = await this.instancePromise;\n return inst.flush();\n }\n\n async shutdown() {\n const inst = await this.instancePromise;\n return inst.shutdown();\n }\n\n async trackErrors(options?: { captureConsole?: boolean }) {\n const { CrashHandlerNative } = await import(\"./adapters/native/crashHandlerNative.native\");\n const inst = await this.instancePromise;\n const crashHandler = new CrashHandlerNative(inst);\n return inst.trackErrors(crashHandler, options);\n }\n\n // ---------- User Profile Management ----------\n\n async setUserId(id: string) {\n const inst = await this.instancePromise;\n inst.setUserId(id);\n }\n\n async generateUserId() {\n const inst = await this.instancePromise;\n return inst.generateUserId();\n }\n\n async setUserProfile(profile: ProfileInput) {\n const inst = await this.instancePromise;\n inst.setUserProfile(profile);\n }\n\n async setUserDetails(details: ProfileInput) {\n const inst = await this.instancePromise;\n inst.setUserDetails(details);\n }\n\n async updateUserProfile(updates: ProfileInput) {\n const inst = await this.instancePromise;\n inst.updateUserProfile(updates);\n }\n\n async getUserProfile() {\n const inst = await this.instancePromise;\n return inst.getUserProfile();\n }\n\n async clearUserProfile() {\n const inst = await this.instancePromise;\n inst.clearUserProfile();\n }\n\n async setUserName(fullName: string, firstName?: string, lastName?: string) {\n const inst = await this.instancePromise;\n inst.setUserName(fullName, firstName, lastName);\n }\n\n async setUserContact(email?: string, phone?: string) {\n const inst = await this.instancePromise;\n inst.setUserContact(email, phone);\n }\n\n // EdgeRum-style identify(): emits user.profile.update, preserves the anonymous user.id (#31)\n async identify(profile: { name?: string; email?: string; phone?: string; avatar?: string; customAttributes?: Record<string, any> }) {\n const inst = await this.instancePromise;\n return inst.identify(profile);\n }\n}\n","// SDK-internal debug gate (#23, Workstream E). Silent by default so v3 never spams the\n// host app's console; `createTelemetry({ debug: true })` flips it on. Gates log AND\n// warn/error — nothing prints unless debug is enabled.\nlet enabled = false;\n\nexport function setDebug(on: boolean): void {\n enabled = on;\n}\n\nexport const debug = {\n log: (...args: any[]) => { if (enabled) console.log(...args); },\n warn: (...args: any[]) => { if (enabled) console.warn(...args); },\n error: (...args: any[]) => { if (enabled) console.error(...args); },\n};\n"],"names":["TelemetryBase","event","data","options","CrashHandlerNative","inst","crashHandler","id","profile","details","updates","fullName","firstName","lastName","email","phone","enabled","setDebug","on","debug","args"],"mappings":"aAiBO,MAAeA,CAAc,CAGhC,MAAM,IAAIC,EAAeC,EAA4B,CAEjD,OADa,MAAM,KAAK,iBACZ,IAAID,EAAOC,CAAI,CAC/B,CAEA,MAAM,OAAQ,CAEV,OADa,MAAM,KAAK,iBACZ,MAAA,CAChB,CAEA,MAAM,UAAW,CAEb,OADa,MAAM,KAAK,iBACZ,SAAA,CAChB,CAEA,MAAM,YAAYC,EAAwC,CACtD,KAAM,CAAE,mBAAAC,CAAA,EAAuB,MAAM,QAAA,QAAA,EAAA,KAAA,IAAA,QAAO,0CAA6C,CAAA,EACnFC,EAAO,MAAM,KAAK,gBAClBC,EAAe,IAAIF,EAAmBC,CAAI,EAChD,OAAOA,EAAK,YAAYC,EAAcH,CAAO,CACjD,CAIA,MAAM,UAAUI,EAAY,EACX,MAAM,KAAK,iBACnB,UAAUA,CAAE,CACrB,CAEA,MAAM,gBAAiB,CAEnB,OADa,MAAM,KAAK,iBACZ,eAAA,CAChB,CAEA,MAAM,eAAeC,EAAuB,EAC3B,MAAM,KAAK,iBACnB,eAAeA,CAAO,CAC/B,CAEA,MAAM,eAAeC,EAAuB,EAC3B,MAAM,KAAK,iBACnB,eAAeA,CAAO,CAC/B,CAEA,MAAM,kBAAkBC,EAAuB,EAC9B,MAAM,KAAK,iBACnB,kBAAkBA,CAAO,CAClC,CAEA,MAAM,gBAAiB,CAEnB,OADa,MAAM,KAAK,iBACZ,eAAA,CAChB,CAEA,MAAM,kBAAmB,EACR,MAAM,KAAK,iBACnB,iBAAA,CACT,CAEA,MAAM,YAAYC,EAAkBC,EAAoBC,EAAmB,EAC1D,MAAM,KAAK,iBACnB,YAAYF,EAAUC,EAAWC,CAAQ,CAClD,CAEA,MAAM,eAAeC,EAAgBC,EAAgB,EACpC,MAAM,KAAK,iBACnB,eAAeD,EAAOC,CAAK,CACpC,CAGA,MAAM,SAASP,EAAqH,CAEhI,OADa,MAAM,KAAK,iBACZ,SAASA,CAAO,CAChC,CACJ,CC3FA,IAAIQ,EAAU,GAEP,SAASC,EAASC,EAAmB,CAC1CF,EAAUE,CACZ,CAEO,MAAMC,EAAQ,CACnB,IAAK,IAAIC,IAAgB,CAAMJ,GAAS,QAAQ,IAAI,GAAGI,CAAI,CAAG,EAC9D,KAAM,IAAIA,IAAgB,CAAMJ,GAAS,QAAQ,KAAK,GAAGI,CAAI,CAAG,EAChE,MAAO,IAAIA,IAAgB,CAAMJ,GAAS,QAAQ,MAAM,GAAGI,CAAI,CAAG,CACpE"}
|