@nathanclaire/edge-telemetry-sdk 3.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 +348 -0
- package/dist/appLifecycle-Cynw0kAv.js +14 -0
- package/dist/appLifecycle-Cynw0kAv.js.map +1 -0
- package/dist/appLifecycle-DvJIt7ym.cjs +2 -0
- package/dist/appLifecycle-DvJIt7ym.cjs.map +1 -0
- package/dist/batch-CLBFgYPC.cjs +2 -0
- package/dist/batch-CLBFgYPC.cjs.map +1 -0
- package/dist/batch-DLG_gtOm.js +12 -0
- package/dist/batch-DLG_gtOm.js.map +1 -0
- package/dist/crashCapture-BYTM4FLC.cjs +2 -0
- package/dist/crashCapture-BYTM4FLC.cjs.map +1 -0
- package/dist/crashCapture-D_rkkBVa.js +31 -0
- package/dist/crashCapture-D_rkkBVa.js.map +1 -0
- package/dist/crashHandler.web-BSxDpFTo.cjs +2 -0
- package/dist/crashHandler.web-BSxDpFTo.cjs.map +1 -0
- package/dist/crashHandler.web-D59bmhg9.js +32 -0
- package/dist/crashHandler.web-D59bmhg9.js.map +1 -0
- package/dist/crashHandlerNative.native-DeAFze4E.cjs +2 -0
- package/dist/crashHandlerNative.native-DeAFze4E.cjs.map +1 -0
- package/dist/crashHandlerNative.native-d7qJkzA6.js +41 -0
- package/dist/crashHandlerNative.native-d7qJkzA6.js.map +1 -0
- package/dist/debug-DsvQ9y3W.js +68 -0
- package/dist/debug-DsvQ9y3W.js.map +1 -0
- package/dist/debug-rnOOxFpN.cjs +2 -0
- package/dist/debug-rnOOxFpN.cjs.map +1 -0
- package/dist/deviceInfo.native-7hbRYixR.cjs +2 -0
- package/dist/deviceInfo.native-7hbRYixR.cjs.map +1 -0
- package/dist/deviceInfo.native-D2k0LDhI.js +1171 -0
- package/dist/deviceInfo.native-D2k0LDhI.js.map +1 -0
- package/dist/deviceInfo.web-ByNAlEJh.cjs +2 -0
- package/dist/deviceInfo.web-ByNAlEJh.cjs.map +1 -0
- package/dist/deviceInfo.web-DzQyEku6.js +40 -0
- package/dist/deviceInfo.web-DzQyEku6.js.map +1 -0
- package/dist/frameAggregate-C_HoVFcK.cjs +2 -0
- package/dist/frameAggregate-C_HoVFcK.cjs.map +1 -0
- package/dist/frameAggregate-Cwh1juw1.js +17 -0
- package/dist/frameAggregate-Cwh1juw1.js.map +1 -0
- package/dist/frameDropsNative.native-CP7zrXDf.js +23 -0
- package/dist/frameDropsNative.native-CP7zrXDf.js.map +1 -0
- package/dist/frameDropsNative.native-DKqEDqip.cjs +2 -0
- package/dist/frameDropsNative.native-DKqEDqip.cjs.map +1 -0
- package/dist/frameDropsWeb.web-C9Lt3Fuj.js +22 -0
- package/dist/frameDropsWeb.web-C9Lt3Fuj.js.map +1 -0
- package/dist/frameDropsWeb.web-azpwQCUz.cjs +2 -0
- package/dist/frameDropsWeb.web-azpwQCUz.cjs.map +1 -0
- package/dist/httpAttributes-BV50UKQU.js +19 -0
- package/dist/httpAttributes-BV50UKQU.js.map +1 -0
- package/dist/httpAttributes-xXOD9trQ.cjs +2 -0
- package/dist/httpAttributes-xXOD9trQ.cjs.map +1 -0
- package/dist/index.native.cjs +2 -0
- package/dist/index.native.cjs.map +1 -0
- package/dist/index.native.d.ts +2 -0
- package/dist/index.native.js +109 -0
- package/dist/index.native.js.map +1 -0
- package/dist/index.web.cjs +2 -0
- package/dist/index.web.cjs.map +1 -0
- package/dist/index.web.d.ts +2 -0
- package/dist/index.web.js +80 -0
- package/dist/index.web.js.map +1 -0
- package/dist/interaction-CH8yoY5-.js +23 -0
- package/dist/interaction-CH8yoY5-.js.map +1 -0
- package/dist/interaction-DcNFBW7a.cjs +2 -0
- package/dist/interaction-DcNFBW7a.cjs.map +1 -0
- package/dist/interceptFetchNative.native-VlhtMG-U.js +49 -0
- package/dist/interceptFetchNative.native-VlhtMG-U.js.map +1 -0
- package/dist/interceptFetchNative.native-jEAldH14.cjs +2 -0
- package/dist/interceptFetchNative.native-jEAldH14.cjs.map +1 -0
- package/dist/interceptFetchWeb.web-DFzZliik.cjs +2 -0
- package/dist/interceptFetchWeb.web-DFzZliik.cjs.map +1 -0
- package/dist/interceptFetchWeb.web-DfsMfoRP.js +77 -0
- package/dist/interceptFetchWeb.web-DfsMfoRP.js.map +1 -0
- package/dist/memoryNative.native-BWLh2S9L.js +48 -0
- package/dist/memoryNative.native-BWLh2S9L.js.map +1 -0
- package/dist/memoryNative.native-DCXSOd4Q.cjs +2 -0
- package/dist/memoryNative.native-DCXSOd4Q.cjs.map +1 -0
- package/dist/memoryWeb.web-B3YuV-cB.js +48 -0
- package/dist/memoryWeb.web-B3YuV-cB.js.map +1 -0
- package/dist/memoryWeb.web-CheXAcJn.cjs +2 -0
- package/dist/memoryWeb.web-CheXAcJn.cjs.map +1 -0
- package/dist/nativeSender-BE_mzw_S.js +70 -0
- package/dist/nativeSender-BE_mzw_S.js.map +1 -0
- package/dist/nativeSender-DyAUGY7c.cjs +2 -0
- package/dist/nativeSender-DyAUGY7c.cjs.map +1 -0
- package/dist/navigationNative.native-3tO5JxSd.cjs +2 -0
- package/dist/navigationNative.native-3tO5JxSd.cjs.map +1 -0
- package/dist/navigationNative.native-BUCGPQX2.js +25 -0
- package/dist/navigationNative.native-BUCGPQX2.js.map +1 -0
- package/dist/navigationTracker-B2GMwyKk.cjs +2 -0
- package/dist/navigationTracker-B2GMwyKk.cjs.map +1 -0
- package/dist/navigationTracker-Cts68dgG.js +19 -0
- package/dist/navigationTracker-Cts68dgG.js.map +1 -0
- package/dist/navigationWeb.web-B0necr5j.cjs +2 -0
- package/dist/navigationWeb.web-B0necr5j.cjs.map +1 -0
- package/dist/navigationWeb.web-CORzE_Id.js +46 -0
- package/dist/navigationWeb.web-CORzE_Id.js.map +1 -0
- package/dist/networkChange-CUO1hRLj.cjs +2 -0
- package/dist/networkChange-CUO1hRLj.cjs.map +1 -0
- package/dist/networkChange-D39hdSb0.js +16 -0
- package/dist/networkChange-D39hdSb0.js.map +1 -0
- package/dist/networkInfo.native-BK5fpAOL.js +343 -0
- package/dist/networkInfo.native-BK5fpAOL.js.map +1 -0
- package/dist/networkInfo.native-cxuw93Uy.cjs +2 -0
- package/dist/networkInfo.native-cxuw93Uy.cjs.map +1 -0
- package/dist/networkInfo.web-DJmw1sNK.cjs +2 -0
- package/dist/networkInfo.web-DJmw1sNK.cjs.map +1 -0
- package/dist/networkInfo.web-twcNn_hc.js +32 -0
- package/dist/networkInfo.web-twcNn_hc.js.map +1 -0
- package/dist/src/adapters/appLifecycle.d.ts +15 -0
- package/dist/src/adapters/batch.d.ts +2 -0
- package/dist/src/adapters/crashCapture.d.ts +13 -0
- package/dist/src/adapters/frameAggregate.d.ts +12 -0
- package/dist/src/adapters/httpAttributes.d.ts +9 -0
- package/dist/src/adapters/interaction.d.ts +17 -0
- package/dist/src/adapters/native/crashHandlerNative.native.d.ts +9 -0
- package/dist/src/adapters/native/deviceInfo.native.d.ts +10 -0
- package/dist/src/adapters/native/frameDropsNative.native.d.ts +16 -0
- package/dist/src/adapters/native/interceptFetchNative.native.d.ts +23 -0
- package/dist/src/adapters/native/memoryNative.native.d.ts +25 -0
- package/dist/src/adapters/native/navigationNative.native.d.ts +12 -0
- package/dist/src/adapters/native/networkInfo.native.d.ts +12 -0
- package/dist/src/adapters/nativeSender.d.ts +3 -0
- package/dist/src/adapters/navigationTracker.d.ts +6 -0
- package/dist/src/adapters/networkChange.d.ts +15 -0
- package/dist/src/adapters/screenTiming.d.ts +9 -0
- package/dist/src/adapters/web/crashHandler.web.d.ts +9 -0
- package/dist/src/adapters/web/deviceInfo.web.d.ts +7 -0
- package/dist/src/adapters/web/frameDropsWeb.web.d.ts +16 -0
- package/dist/src/adapters/web/interceptFetchWeb.web.d.ts +29 -0
- package/dist/src/adapters/web/memoryWeb.web.d.ts +26 -0
- package/dist/src/adapters/web/navigationWeb.web.d.ts +29 -0
- package/dist/src/adapters/web/networkInfo.web.d.ts +8 -0
- package/dist/src/adapters/webSender.d.ts +3 -0
- package/dist/src/core/breadcrumbs.d.ts +12 -0
- package/dist/src/core/debug.d.ts +6 -0
- package/dist/src/core/telemetry.d.ts +233 -0
- package/dist/src/core/utils/uuid.d.ts +2 -0
- package/dist/src/createTelemetry.native.d.ts +16 -0
- package/dist/src/createTelemetry.web.d.ts +16 -0
- package/dist/src/index.base.d.ts +36 -0
- package/dist/src/index.native.d.ts +28 -0
- package/dist/src/index.web.d.ts +24 -0
- package/dist/src/shims/react-native-web-shim.d.ts +6 -0
- package/dist/telemetry-Co4MYdwa.cjs +2 -0
- package/dist/telemetry-Co4MYdwa.cjs.map +1 -0
- package/dist/telemetry-KI0x4gzC.js +389 -0
- package/dist/telemetry-KI0x4gzC.js.map +1 -0
- package/dist/v4-BysszJq8.js +31 -0
- package/dist/v4-BysszJq8.js.map +1 -0
- package/dist/v4-CqdK_b8Y.cjs +2 -0
- package/dist/v4-CqdK_b8Y.cjs.map +1 -0
- package/dist/webSender-B27tmT1w.js +42 -0
- package/dist/webSender-B27tmT1w.js.map +1 -0
- package/dist/webSender-BWi4x1df.cjs +2 -0
- package/dist/webSender-BWi4x1df.cjs.map +1 -0
- package/package.json +91 -0
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { d as t } from "./debug-DsvQ9y3W.js";
|
|
2
|
+
import n from "@react-native-async-storage/async-storage";
|
|
3
|
+
import { b as h } from "./batch-DLG_gtOm.js";
|
|
4
|
+
const y = "https://your.telemetry.endpoint/collect", o = "telemetry_failed_events";
|
|
5
|
+
async function c(r) {
|
|
6
|
+
const a = JSON.parse(await n.getItem(o) || "[]");
|
|
7
|
+
await n.setItem(o, JSON.stringify([...a, ...r]));
|
|
8
|
+
}
|
|
9
|
+
async function d(r, a, e, s = 3) {
|
|
10
|
+
let l = 0, m;
|
|
11
|
+
for (; l < s; )
|
|
12
|
+
try {
|
|
13
|
+
const i = await fetch(r, {
|
|
14
|
+
method: "POST",
|
|
15
|
+
headers: {
|
|
16
|
+
"Content-Type": "application/json",
|
|
17
|
+
...a ? { "X-API-Key": a } : {}
|
|
18
|
+
},
|
|
19
|
+
body: h(e)
|
|
20
|
+
});
|
|
21
|
+
if (!i.ok)
|
|
22
|
+
throw t.warn("Telemetry send failed with status:", i.status), new Error(`Telemetry send failed: ${i.status}`);
|
|
23
|
+
t.log("Telemetry send succeeded, events sent:", e.length ?? 0);
|
|
24
|
+
return;
|
|
25
|
+
} catch (i) {
|
|
26
|
+
m = i, l++, l < s && await new Promise(
|
|
27
|
+
(g) => setTimeout(g, 500 * 2 ** l + Math.random() * 200)
|
|
28
|
+
);
|
|
29
|
+
}
|
|
30
|
+
throw m;
|
|
31
|
+
}
|
|
32
|
+
function u(r = y, a) {
|
|
33
|
+
return {
|
|
34
|
+
async send(e) {
|
|
35
|
+
await d(r, a, e);
|
|
36
|
+
},
|
|
37
|
+
async onFailure(e) {
|
|
38
|
+
await c(e);
|
|
39
|
+
},
|
|
40
|
+
async replayFailed() {
|
|
41
|
+
t.log("Telemetry replayFailedNative launched"), t.log("AsyncStorage available methods:", Object.keys(n));
|
|
42
|
+
const e = JSON.parse(await n.getItem(o) || "[]");
|
|
43
|
+
if (e.length > 0) {
|
|
44
|
+
t.log("Replaying failed events, count:", e.length), await n.removeItem(o), t.log("Failed events removed from storage, attempting to resend");
|
|
45
|
+
try {
|
|
46
|
+
await d(r, a, e);
|
|
47
|
+
} catch (s) {
|
|
48
|
+
throw await c(e), s;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
async function v(r = y, a) {
|
|
55
|
+
t.log("Telemetry replayFailedNative launched"), t.log("AsyncStorage available methods:", Object.keys(n));
|
|
56
|
+
const e = JSON.parse(await n.getItem(o) || "[]");
|
|
57
|
+
if (e.length > 0) {
|
|
58
|
+
await n.removeItem(o);
|
|
59
|
+
try {
|
|
60
|
+
t.log("Replaying failed events, count:", e.length), t.log("Failed events removed from storage, attempting to resend"), await d(r, a, e);
|
|
61
|
+
} catch (s) {
|
|
62
|
+
throw t.warn("Telemetry replay failed Native Sender class:", s), await c(e), s;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
export {
|
|
67
|
+
u as nativeSender,
|
|
68
|
+
v as replayFailedNative
|
|
69
|
+
};
|
|
70
|
+
//# sourceMappingURL=nativeSender-BE_mzw_S.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nativeSender-BE_mzw_S.js","sources":["../src/adapters/nativeSender.ts"],"sourcesContent":["import { debug } from \"../core/debug\";\nimport type { TelemetryEvent, Sender } from \"../core/telemetry\";\nimport AsyncStorage from \"@react-native-async-storage/async-storage\";\nimport { buildBatch } from \"./batch\";\n\nconst DEFAULT_ENDPOINT = \"https://your.telemetry.endpoint/collect\";\nconst STORAGE_KEY = \"telemetry_failed_events\";\n\nasync function persistFailed(events: TelemetryEvent[]) {\n const existing = JSON.parse((await AsyncStorage.getItem(STORAGE_KEY)) || \"[]\");\n await AsyncStorage.setItem(STORAGE_KEY, JSON.stringify([...existing, ...events]));\n}\n\n// ⬇️ Helper: send with retries (exponential backoff + jitter)\nasync function sendWithRetry(endpoint: string, apiKey: string | undefined, events: TelemetryEvent[], retryCount: number = 3) {\n let attempts = 0;\n let lastError: any;\n\n while (attempts < retryCount) {\n try {\n const res = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...(apiKey ? { \"X-API-Key\": apiKey } : {}),\n },\n body: buildBatch(events),\n });\n\n if (!res.ok) {\n\n debug.warn(\"Telemetry send failed with status:\", res.status);\n throw new Error(`Telemetry send failed: ${res.status}`);\n }\n\n debug.log(\"Telemetry send succeeded, events sent:\", events.length ?? 0);\n\n return; // ✅ success\n } catch (err) {\n lastError = err;\n attempts++;\n if (attempts < retryCount) {\n // ⬇️ exponential backoff with jitter\n await new Promise(res =>\n setTimeout(res, 500 * 2 ** attempts + Math.random() * 200)\n );\n }\n }\n }\n\n // ❌ after retries still failed\n throw lastError;\n}\n\nexport function nativeSender(endpoint: string = DEFAULT_ENDPOINT, apiKey?: string): Sender {\n return {\n async send(events) {\n // Retry + backoff here; persistence on final failure is the core flush()'s\n // job via onFailure() — kept single, so a failed batch isn't persisted twice.\n await sendWithRetry(endpoint, apiKey, events);\n },\n async onFailure(events) {\n await persistFailed(events);\n },\n async replayFailed() {\n debug.log(\"Telemetry replayFailedNative launched\");\n debug.log(\"AsyncStorage available methods:\", Object.keys(AsyncStorage));\n const stored = JSON.parse((await AsyncStorage.getItem(STORAGE_KEY)) || \"[]\");\n if (stored.length > 0) {\n debug.log(\"Replaying failed events, count:\", stored.length);\n await AsyncStorage.removeItem(STORAGE_KEY);\n debug.log(\"Failed events removed from storage, attempting to resend\");\n try {\n await sendWithRetry(endpoint, apiKey, stored);\n } catch (err) {\n // If replay fails again, re-store\n await persistFailed(stored);\n throw err;\n }\n }\n },\n };\n}\n\n// Recover failed events on app start\nexport async function replayFailedNative(endpoint: string = DEFAULT_ENDPOINT, apiKey?: string) {\n debug.log(\"Telemetry replayFailedNative launched\");\n debug.log(\"AsyncStorage available methods:\", Object.keys(AsyncStorage));\n const stored = JSON.parse((await AsyncStorage.getItem(STORAGE_KEY)) || \"[]\");\n if (stored.length > 0) {\n await AsyncStorage.removeItem(STORAGE_KEY);\n try {\n debug.log(\"Replaying failed events, count:\", stored.length);\n debug.log(\"Failed events removed from storage, attempting to resend\");\n await sendWithRetry(endpoint, apiKey, stored);\n } catch (err) {\n // If replay fails again, re-store\n debug.warn(\"Telemetry replay failed Native Sender class:\", err);\n await persistFailed(stored);\n throw err;\n }\n }\n}\n\n"],"names":["DEFAULT_ENDPOINT","STORAGE_KEY","persistFailed","events","existing","AsyncStorage","sendWithRetry","endpoint","apiKey","retryCount","attempts","lastError","res","buildBatch","debug","err","nativeSender","stored","replayFailedNative"],"mappings":";;;AAKA,MAAMA,IAAmB,2CACnBC,IAAc;AAEpB,eAAeC,EAAcC,GAA0B;AACnD,QAAMC,IAAW,KAAK,MAAO,MAAMC,EAAa,QAAQJ,CAAW,KAAM,IAAI;AAC7E,QAAMI,EAAa,QAAQJ,GAAa,KAAK,UAAU,CAAC,GAAGG,GAAU,GAAGD,CAAM,CAAC,CAAC;AACpF;AAGA,eAAeG,EAAcC,GAAkBC,GAA4BL,GAA0BM,IAAqB,GAAG;AACzH,MAAIC,IAAW,GACXC;AAEJ,SAAOD,IAAWD;AACd,QAAI;AACA,YAAMG,IAAM,MAAM,MAAML,GAAU;AAAA,QAC9B,QAAQ;AAAA,QACR,SAAS;AAAA,UACL,gBAAgB;AAAA,UAChB,GAAIC,IAAS,EAAE,aAAaA,MAAW,CAAA;AAAA,QAAC;AAAA,QAE5C,MAAMK,EAAWV,CAAM;AAAA,MAAA,CAC1B;AAED,UAAI,CAACS,EAAI;AAEL,cAAAE,EAAM,KAAK,sCAAsCF,EAAI,MAAM,GACrD,IAAI,MAAM,0BAA0BA,EAAI,MAAM,EAAE;AAG1D,MAAAE,EAAM,IAAI,0CAA0CX,EAAO,UAAU,CAAC;AAEtE;AAAA,IACJ,SAASY,GAAK;AACV,MAAAJ,IAAYI,GACZL,KACIA,IAAWD,KAEX,MAAM,IAAI;AAAA,QAAQ,CAAAG,MACd,WAAWA,GAAK,MAAM,KAAKF,IAAW,KAAK,OAAA,IAAW,GAAG;AAAA,MAAA;AAAA,IAGrE;AAIJ,QAAMC;AACV;AAEO,SAASK,EAAaT,IAAmBP,GAAkBQ,GAAyB;AACvF,SAAO;AAAA,IACH,MAAM,KAAKL,GAAQ;AAGf,YAAMG,EAAcC,GAAUC,GAAQL,CAAM;AAAA,IAChD;AAAA,IACA,MAAM,UAAUA,GAAQ;AACpB,YAAMD,EAAcC,CAAM;AAAA,IAC9B;AAAA,IACA,MAAM,eAAe;AACjB,MAAAW,EAAM,IAAI,uCAAuC,GACjDA,EAAM,IAAI,mCAAmC,OAAO,KAAKT,CAAY,CAAC;AACtE,YAAMY,IAAS,KAAK,MAAO,MAAMZ,EAAa,QAAQJ,CAAW,KAAM,IAAI;AAC3E,UAAIgB,EAAO,SAAS,GAAG;AACnB,QAAAH,EAAM,IAAI,mCAAmCG,EAAO,MAAM,GAC1D,MAAMZ,EAAa,WAAWJ,CAAW,GACzCa,EAAM,IAAI,0DAA0D;AACpE,YAAI;AACA,gBAAMR,EAAcC,GAAUC,GAAQS,CAAM;AAAA,QAChD,SAASF,GAAK;AAEV,sBAAMb,EAAce,CAAM,GACpBF;AAAA,QACV;AAAA,MACJ;AAAA,IACJ;AAAA,EAAA;AAER;AAGA,eAAsBG,EAAmBX,IAAmBP,GAAkBQ,GAAiB;AAC3F,EAAAM,EAAM,IAAI,uCAAuC,GACjDA,EAAM,IAAI,mCAAmC,OAAO,KAAKT,CAAY,CAAC;AACtE,QAAMY,IAAS,KAAK,MAAO,MAAMZ,EAAa,QAAQJ,CAAW,KAAM,IAAI;AAC3E,MAAIgB,EAAO,SAAS,GAAG;AACnB,UAAMZ,EAAa,WAAWJ,CAAW;AACzC,QAAI;AACA,MAAAa,EAAM,IAAI,mCAAmCG,EAAO,MAAM,GAC1DH,EAAM,IAAI,0DAA0D,GACpE,MAAMR,EAAcC,GAAUC,GAAQS,CAAM;AAAA,IAChD,SAASF,GAAK;AAEV,YAAAD,EAAM,KAAK,gDAAgDC,CAAG,GAC9D,MAAMb,EAAce,CAAM,GACpBF;AAAA,IACV;AAAA,EACJ;AACJ;"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("./debug-rnOOxFpN.cjs"),n=require("@react-native-async-storage/async-storage"),m=require("./batch-CLBFgYPC.cjs"),u="https://your.telemetry.endpoint/collect",s="telemetry_failed_events";async function d(r){const a=JSON.parse(await n.getItem(s)||"[]");await n.setItem(s,JSON.stringify([...a,...r]))}async function c(r,a,e,i=3){let o=0,g;for(;o<i;)try{const l=await fetch(r,{method:"POST",headers:{"Content-Type":"application/json",...a?{"X-API-Key":a}:{}},body:m.buildBatch(e)});if(!l.ok)throw t.debug.warn("Telemetry send failed with status:",l.status),new Error(`Telemetry send failed: ${l.status}`);t.debug.log("Telemetry send succeeded, events sent:",e.length??0);return}catch(l){g=l,o++,o<i&&await new Promise(y=>setTimeout(y,500*2**o+Math.random()*200))}throw g}function h(r=u,a){return{async send(e){await c(r,a,e)},async onFailure(e){await d(e)},async replayFailed(){t.debug.log("Telemetry replayFailedNative launched"),t.debug.log("AsyncStorage available methods:",Object.keys(n));const e=JSON.parse(await n.getItem(s)||"[]");if(e.length>0){t.debug.log("Replaying failed events, count:",e.length),await n.removeItem(s),t.debug.log("Failed events removed from storage, attempting to resend");try{await c(r,a,e)}catch(i){throw await d(e),i}}}}}async function w(r=u,a){t.debug.log("Telemetry replayFailedNative launched"),t.debug.log("AsyncStorage available methods:",Object.keys(n));const e=JSON.parse(await n.getItem(s)||"[]");if(e.length>0){await n.removeItem(s);try{t.debug.log("Replaying failed events, count:",e.length),t.debug.log("Failed events removed from storage, attempting to resend"),await c(r,a,e)}catch(i){throw t.debug.warn("Telemetry replay failed Native Sender class:",i),await d(e),i}}}exports.nativeSender=h;exports.replayFailedNative=w;
|
|
2
|
+
//# sourceMappingURL=nativeSender-DyAUGY7c.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nativeSender-DyAUGY7c.cjs","sources":["../src/adapters/nativeSender.ts"],"sourcesContent":["import { debug } from \"../core/debug\";\nimport type { TelemetryEvent, Sender } from \"../core/telemetry\";\nimport AsyncStorage from \"@react-native-async-storage/async-storage\";\nimport { buildBatch } from \"./batch\";\n\nconst DEFAULT_ENDPOINT = \"https://your.telemetry.endpoint/collect\";\nconst STORAGE_KEY = \"telemetry_failed_events\";\n\nasync function persistFailed(events: TelemetryEvent[]) {\n const existing = JSON.parse((await AsyncStorage.getItem(STORAGE_KEY)) || \"[]\");\n await AsyncStorage.setItem(STORAGE_KEY, JSON.stringify([...existing, ...events]));\n}\n\n// ⬇️ Helper: send with retries (exponential backoff + jitter)\nasync function sendWithRetry(endpoint: string, apiKey: string | undefined, events: TelemetryEvent[], retryCount: number = 3) {\n let attempts = 0;\n let lastError: any;\n\n while (attempts < retryCount) {\n try {\n const res = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...(apiKey ? { \"X-API-Key\": apiKey } : {}),\n },\n body: buildBatch(events),\n });\n\n if (!res.ok) {\n\n debug.warn(\"Telemetry send failed with status:\", res.status);\n throw new Error(`Telemetry send failed: ${res.status}`);\n }\n\n debug.log(\"Telemetry send succeeded, events sent:\", events.length ?? 0);\n\n return; // ✅ success\n } catch (err) {\n lastError = err;\n attempts++;\n if (attempts < retryCount) {\n // ⬇️ exponential backoff with jitter\n await new Promise(res =>\n setTimeout(res, 500 * 2 ** attempts + Math.random() * 200)\n );\n }\n }\n }\n\n // ❌ after retries still failed\n throw lastError;\n}\n\nexport function nativeSender(endpoint: string = DEFAULT_ENDPOINT, apiKey?: string): Sender {\n return {\n async send(events) {\n // Retry + backoff here; persistence on final failure is the core flush()'s\n // job via onFailure() — kept single, so a failed batch isn't persisted twice.\n await sendWithRetry(endpoint, apiKey, events);\n },\n async onFailure(events) {\n await persistFailed(events);\n },\n async replayFailed() {\n debug.log(\"Telemetry replayFailedNative launched\");\n debug.log(\"AsyncStorage available methods:\", Object.keys(AsyncStorage));\n const stored = JSON.parse((await AsyncStorage.getItem(STORAGE_KEY)) || \"[]\");\n if (stored.length > 0) {\n debug.log(\"Replaying failed events, count:\", stored.length);\n await AsyncStorage.removeItem(STORAGE_KEY);\n debug.log(\"Failed events removed from storage, attempting to resend\");\n try {\n await sendWithRetry(endpoint, apiKey, stored);\n } catch (err) {\n // If replay fails again, re-store\n await persistFailed(stored);\n throw err;\n }\n }\n },\n };\n}\n\n// Recover failed events on app start\nexport async function replayFailedNative(endpoint: string = DEFAULT_ENDPOINT, apiKey?: string) {\n debug.log(\"Telemetry replayFailedNative launched\");\n debug.log(\"AsyncStorage available methods:\", Object.keys(AsyncStorage));\n const stored = JSON.parse((await AsyncStorage.getItem(STORAGE_KEY)) || \"[]\");\n if (stored.length > 0) {\n await AsyncStorage.removeItem(STORAGE_KEY);\n try {\n debug.log(\"Replaying failed events, count:\", stored.length);\n debug.log(\"Failed events removed from storage, attempting to resend\");\n await sendWithRetry(endpoint, apiKey, stored);\n } catch (err) {\n // If replay fails again, re-store\n debug.warn(\"Telemetry replay failed Native Sender class:\", err);\n await persistFailed(stored);\n throw err;\n }\n }\n}\n\n"],"names":["DEFAULT_ENDPOINT","STORAGE_KEY","persistFailed","events","existing","AsyncStorage","sendWithRetry","endpoint","apiKey","retryCount","attempts","lastError","res","buildBatch","debug","err","nativeSender","stored","replayFailedNative"],"mappings":"iNAKMA,EAAmB,0CACnBC,EAAc,0BAEpB,eAAeC,EAAcC,EAA0B,CACnD,MAAMC,EAAW,KAAK,MAAO,MAAMC,EAAa,QAAQJ,CAAW,GAAM,IAAI,EAC7E,MAAMI,EAAa,QAAQJ,EAAa,KAAK,UAAU,CAAC,GAAGG,EAAU,GAAGD,CAAM,CAAC,CAAC,CACpF,CAGA,eAAeG,EAAcC,EAAkBC,EAA4BL,EAA0BM,EAAqB,EAAG,CACzH,IAAIC,EAAW,EACXC,EAEJ,KAAOD,EAAWD,GACd,GAAI,CACA,MAAMG,EAAM,MAAM,MAAML,EAAU,CAC9B,OAAQ,OACR,QAAS,CACL,eAAgB,mBAChB,GAAIC,EAAS,CAAE,YAAaA,GAAW,CAAA,CAAC,EAE5C,KAAMK,EAAAA,WAAWV,CAAM,CAAA,CAC1B,EAED,GAAI,CAACS,EAAI,GAELE,MAAAA,EAAAA,MAAM,KAAK,qCAAsCF,EAAI,MAAM,EACrD,IAAI,MAAM,0BAA0BA,EAAI,MAAM,EAAE,EAG1DE,EAAAA,MAAM,IAAI,yCAA0CX,EAAO,QAAU,CAAC,EAEtE,MACJ,OAASY,EAAK,CACVJ,EAAYI,EACZL,IACIA,EAAWD,GAEX,MAAM,IAAI,QAAQG,GACd,WAAWA,EAAK,IAAM,GAAKF,EAAW,KAAK,OAAA,EAAW,GAAG,CAAA,CAGrE,CAIJ,MAAMC,CACV,CAEO,SAASK,EAAaT,EAAmBP,EAAkBQ,EAAyB,CACvF,MAAO,CACH,MAAM,KAAKL,EAAQ,CAGf,MAAMG,EAAcC,EAAUC,EAAQL,CAAM,CAChD,EACA,MAAM,UAAUA,EAAQ,CACpB,MAAMD,EAAcC,CAAM,CAC9B,EACA,MAAM,cAAe,CACjBW,EAAAA,MAAM,IAAI,uCAAuC,EACjDA,EAAAA,MAAM,IAAI,kCAAmC,OAAO,KAAKT,CAAY,CAAC,EACtE,MAAMY,EAAS,KAAK,MAAO,MAAMZ,EAAa,QAAQJ,CAAW,GAAM,IAAI,EAC3E,GAAIgB,EAAO,OAAS,EAAG,CACnBH,EAAAA,MAAM,IAAI,kCAAmCG,EAAO,MAAM,EAC1D,MAAMZ,EAAa,WAAWJ,CAAW,EACzCa,EAAAA,MAAM,IAAI,0DAA0D,EACpE,GAAI,CACA,MAAMR,EAAcC,EAAUC,EAAQS,CAAM,CAChD,OAASF,EAAK,CAEV,YAAMb,EAAce,CAAM,EACpBF,CACV,CACJ,CACJ,CAAA,CAER,CAGA,eAAsBG,EAAmBX,EAAmBP,EAAkBQ,EAAiB,CAC3FM,EAAAA,MAAM,IAAI,uCAAuC,EACjDA,EAAAA,MAAM,IAAI,kCAAmC,OAAO,KAAKT,CAAY,CAAC,EACtE,MAAMY,EAAS,KAAK,MAAO,MAAMZ,EAAa,QAAQJ,CAAW,GAAM,IAAI,EAC3E,GAAIgB,EAAO,OAAS,EAAG,CACnB,MAAMZ,EAAa,WAAWJ,CAAW,EACzC,GAAI,CACAa,EAAAA,MAAM,IAAI,kCAAmCG,EAAO,MAAM,EAC1DH,EAAAA,MAAM,IAAI,0DAA0D,EACpE,MAAMR,EAAcC,EAAUC,EAAQS,CAAM,CAChD,OAASF,EAAK,CAEVD,MAAAA,QAAM,KAAK,+CAAgDC,CAAG,EAC9D,MAAMb,EAAce,CAAM,EACpBF,CACV,CACJ,CACJ"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("./debug-rnOOxFpN.cjs"),a=require("./navigationTracker-B2GMwyKk.cjs");class i{constructor(t){this.tracker=new a.NavigationTracker(t)}attach(t){t&&(r.debug.log("NavigationTrackerNative: attaching to navigationRef"),t.addListener("state",()=>{const e=this.getActiveRouteName(t.getCurrentRoute());e&&e!==this.currentRoute&&(r.debug.log(`NavigationTrackerNative: route changed to ${e}`),this.tracker.recordRouteChange(this.currentRoute??"init",e),this.currentRoute=e)}))}getActiveRouteName(t){if(!t)return"unknown";if(t.state){const e=t.state.routes[t.state.index];return this.getActiveRouteName(e)}return t.name}}exports.NavigationTrackerNative=i;
|
|
2
|
+
//# sourceMappingURL=navigationNative.native-3tO5JxSd.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"navigationNative.native-3tO5JxSd.cjs","sources":["../src/adapters/native/navigationNative.native.ts"],"sourcesContent":["import { debug } from \"../../core/debug\";\nimport { Telemetry } from \"../../core/telemetry\";\nimport { NavigationTracker } from \"../navigationTracker\";\n\n/**\n * Hook into React Navigation events\n * Usage: pass your navigationContainerRef\n */\nexport class NavigationTrackerNative {\n private tracker: NavigationTracker;\n private currentRoute?: string;\n\n constructor(telemetry: Telemetry) {\n this.tracker = new NavigationTracker(telemetry);\n }\n\n attach(navigationRef: any) {\n if (!navigationRef) return;\n\n debug.log(\"NavigationTrackerNative: attaching to navigationRef\");\n navigationRef.addListener(\"state\", () => {\n const route = this.getActiveRouteName(navigationRef.getCurrentRoute());\n if (route && route !== this.currentRoute) {\n\n debug.log(`NavigationTrackerNative: route changed to ${route}`);\n this.tracker.recordRouteChange(this.currentRoute ?? \"init\", route);\n this.currentRoute = route;\n }\n });\n }\n\n private getActiveRouteName(route: any): string {\n if (!route) return \"unknown\";\n if (route.state) {\n const nested = route.state.routes[route.state.index];\n return this.getActiveRouteName(nested);\n }\n return route.name;\n }\n}\n"],"names":["NavigationTrackerNative","telemetry","NavigationTracker","navigationRef","debug","route","nested"],"mappings":"sKAQO,MAAMA,CAAwB,CAIjC,YAAYC,EAAsB,CAC9B,KAAK,QAAU,IAAIC,EAAAA,kBAAkBD,CAAS,CAClD,CAEA,OAAOE,EAAoB,CAClBA,IAELC,EAAAA,MAAM,IAAI,qDAAqD,EAC/DD,EAAc,YAAY,QAAS,IAAM,CACrC,MAAME,EAAQ,KAAK,mBAAmBF,EAAc,iBAAiB,EACjEE,GAASA,IAAU,KAAK,eAExBD,EAAAA,MAAM,IAAI,6CAA6CC,CAAK,EAAE,EAC9D,KAAK,QAAQ,kBAAkB,KAAK,cAAgB,OAAQA,CAAK,EACjE,KAAK,aAAeA,EAE5B,CAAC,EACL,CAEQ,mBAAmBA,EAAoB,CAC3C,GAAI,CAACA,EAAO,MAAO,UACnB,GAAIA,EAAM,MAAO,CACb,MAAMC,EAASD,EAAM,MAAM,OAAOA,EAAM,MAAM,KAAK,EACnD,OAAO,KAAK,mBAAmBC,CAAM,CACzC,CACA,OAAOD,EAAM,IACjB,CACJ"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { d as r } from "./debug-DsvQ9y3W.js";
|
|
2
|
+
import { N as a } from "./navigationTracker-Cts68dgG.js";
|
|
3
|
+
class c {
|
|
4
|
+
constructor(t) {
|
|
5
|
+
this.tracker = new a(t);
|
|
6
|
+
}
|
|
7
|
+
attach(t) {
|
|
8
|
+
t && (r.log("NavigationTrackerNative: attaching to navigationRef"), t.addListener("state", () => {
|
|
9
|
+
const e = this.getActiveRouteName(t.getCurrentRoute());
|
|
10
|
+
e && e !== this.currentRoute && (r.log(`NavigationTrackerNative: route changed to ${e}`), this.tracker.recordRouteChange(this.currentRoute ?? "init", e), this.currentRoute = e);
|
|
11
|
+
}));
|
|
12
|
+
}
|
|
13
|
+
getActiveRouteName(t) {
|
|
14
|
+
if (!t) return "unknown";
|
|
15
|
+
if (t.state) {
|
|
16
|
+
const e = t.state.routes[t.state.index];
|
|
17
|
+
return this.getActiveRouteName(e);
|
|
18
|
+
}
|
|
19
|
+
return t.name;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
export {
|
|
23
|
+
c as NavigationTrackerNative
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=navigationNative.native-BUCGPQX2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"navigationNative.native-BUCGPQX2.js","sources":["../src/adapters/native/navigationNative.native.ts"],"sourcesContent":["import { debug } from \"../../core/debug\";\nimport { Telemetry } from \"../../core/telemetry\";\nimport { NavigationTracker } from \"../navigationTracker\";\n\n/**\n * Hook into React Navigation events\n * Usage: pass your navigationContainerRef\n */\nexport class NavigationTrackerNative {\n private tracker: NavigationTracker;\n private currentRoute?: string;\n\n constructor(telemetry: Telemetry) {\n this.tracker = new NavigationTracker(telemetry);\n }\n\n attach(navigationRef: any) {\n if (!navigationRef) return;\n\n debug.log(\"NavigationTrackerNative: attaching to navigationRef\");\n navigationRef.addListener(\"state\", () => {\n const route = this.getActiveRouteName(navigationRef.getCurrentRoute());\n if (route && route !== this.currentRoute) {\n\n debug.log(`NavigationTrackerNative: route changed to ${route}`);\n this.tracker.recordRouteChange(this.currentRoute ?? \"init\", route);\n this.currentRoute = route;\n }\n });\n }\n\n private getActiveRouteName(route: any): string {\n if (!route) return \"unknown\";\n if (route.state) {\n const nested = route.state.routes[route.state.index];\n return this.getActiveRouteName(nested);\n }\n return route.name;\n }\n}\n"],"names":["NavigationTrackerNative","telemetry","NavigationTracker","navigationRef","debug","route","nested"],"mappings":";;AAQO,MAAMA,EAAwB;AAAA,EAIjC,YAAYC,GAAsB;AAC9B,SAAK,UAAU,IAAIC,EAAkBD,CAAS;AAAA,EAClD;AAAA,EAEA,OAAOE,GAAoB;AACvB,IAAKA,MAELC,EAAM,IAAI,qDAAqD,GAC/DD,EAAc,YAAY,SAAS,MAAM;AACrC,YAAME,IAAQ,KAAK,mBAAmBF,EAAc,iBAAiB;AACrE,MAAIE,KAASA,MAAU,KAAK,iBAExBD,EAAM,IAAI,6CAA6CC,CAAK,EAAE,GAC9D,KAAK,QAAQ,kBAAkB,KAAK,gBAAgB,QAAQA,CAAK,GACjE,KAAK,eAAeA;AAAA,IAE5B,CAAC;AAAA,EACL;AAAA,EAEQ,mBAAmBA,GAAoB;AAC3C,QAAI,CAACA,EAAO,QAAO;AACnB,QAAIA,EAAM,OAAO;AACb,YAAMC,IAASD,EAAM,MAAM,OAAOA,EAAM,MAAM,KAAK;AACnD,aAAO,KAAK,mBAAmBC,CAAM;AAAA,IACzC;AACA,WAAOD,EAAM;AAAA,EACjB;AACJ;"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";class a{constructor(t){this.telemetry=t}recordRouteChange(t,e){this.telemetry.log("navigation",{"navigation.from_screen":t,"navigation.to_screen":e,"navigation.method":"push","navigation.route_type":"screen"})}}exports.NavigationTracker=a;
|
|
2
|
+
//# sourceMappingURL=navigationTracker-B2GMwyKk.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"navigationTracker-B2GMwyKk.cjs","sources":["../src/adapters/navigationTracker.ts"],"sourcesContent":["import { Telemetry } from \"../core/telemetry\";\n\nexport class NavigationTracker {\n private telemetry: Telemetry;\n\n constructor(telemetry: Telemetry) {\n this.telemetry = telemetry;\n }\n\n // Route change → v3 `navigation`. Baseline keys follow the reference/Angular shape;\n // iOS (screen/previous_screen/type/kind) reconciliation is OPEN (see additions ledger).\n recordRouteChange(from: string, to: string) {\n this.telemetry.log(\"navigation\", {\n \"navigation.from_screen\": from,\n \"navigation.to_screen\": to,\n \"navigation.method\": \"push\",\n \"navigation.route_type\": \"screen\",\n });\n }\n}\n"],"names":["NavigationTracker","telemetry","from","to"],"mappings":"aAEO,MAAMA,CAAkB,CAG3B,YAAYC,EAAsB,CAC9B,KAAK,UAAYA,CACrB,CAIA,kBAAkBC,EAAcC,EAAY,CACxC,KAAK,UAAU,IAAI,aAAc,CAC7B,yBAA0BD,EAC1B,uBAAwBC,EACxB,oBAAqB,OACrB,wBAAyB,QAAA,CAC5B,CACL,CACJ"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
class n {
|
|
2
|
+
constructor(e) {
|
|
3
|
+
this.telemetry = e;
|
|
4
|
+
}
|
|
5
|
+
// Route change → v3 `navigation`. Baseline keys follow the reference/Angular shape;
|
|
6
|
+
// iOS (screen/previous_screen/type/kind) reconciliation is OPEN (see additions ledger).
|
|
7
|
+
recordRouteChange(e, t) {
|
|
8
|
+
this.telemetry.log("navigation", {
|
|
9
|
+
"navigation.from_screen": e,
|
|
10
|
+
"navigation.to_screen": t,
|
|
11
|
+
"navigation.method": "push",
|
|
12
|
+
"navigation.route_type": "screen"
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
export {
|
|
17
|
+
n as N
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=navigationTracker-Cts68dgG.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"navigationTracker-Cts68dgG.js","sources":["../src/adapters/navigationTracker.ts"],"sourcesContent":["import { Telemetry } from \"../core/telemetry\";\n\nexport class NavigationTracker {\n private telemetry: Telemetry;\n\n constructor(telemetry: Telemetry) {\n this.telemetry = telemetry;\n }\n\n // Route change → v3 `navigation`. Baseline keys follow the reference/Angular shape;\n // iOS (screen/previous_screen/type/kind) reconciliation is OPEN (see additions ledger).\n recordRouteChange(from: string, to: string) {\n this.telemetry.log(\"navigation\", {\n \"navigation.from_screen\": from,\n \"navigation.to_screen\": to,\n \"navigation.method\": \"push\",\n \"navigation.route_type\": \"screen\",\n });\n }\n}\n"],"names":["NavigationTracker","telemetry","from","to"],"mappings":"AAEO,MAAMA,EAAkB;AAAA,EAG3B,YAAYC,GAAsB;AAC9B,SAAK,YAAYA;AAAA,EACrB;AAAA;AAAA;AAAA,EAIA,kBAAkBC,GAAcC,GAAY;AACxC,SAAK,UAAU,IAAI,cAAc;AAAA,MAC7B,0BAA0BD;AAAA,MAC1B,wBAAwBC;AAAA,MACxB,qBAAqB;AAAA,MACrB,yBAAyB;AAAA,IAAA,CAC5B;AAAA,EACL;AACJ;"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const n=require("./navigationTracker-B2GMwyKk.cjs");class s{constructor(t){this.telemetry=t,this.tracker=new n.NavigationTracker(t),this.currentPath=""}start(){return new Promise(t=>{this.currentPath=window.location.pathname+window.location.search,this.patchHistory(),this.listenPopState(),t()})}patchHistory(){const t=history.pushState.bind(history),o=history.replaceState.bind(history),i=()=>{const e=window.location.pathname+window.location.search;this.tracker.recordRouteChange(this.currentPath,e),this.currentPath=e};history.pushState=((e,a,r)=>{t(e,a,r),i()}),history.replaceState=((e,a,r)=>{o(e,a,r),i()})}listenPopState(){window.addEventListener("popstate",()=>{const t=window.location.pathname+window.location.search;this.tracker.recordRouteChange(this.currentPath,t),this.currentPath=t})}}exports.NavigationTrackerWeb=s;
|
|
2
|
+
//# sourceMappingURL=navigationWeb.web-B0necr5j.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"navigationWeb.web-B0necr5j.cjs","sources":["../src/adapters/web/navigationWeb.web.ts"],"sourcesContent":["import { Telemetry } from \"../../core/telemetry\";\nimport { NavigationTracker } from \"../navigationTracker\";\n\n/**\n * Tracks navigation route changes in web environments by patching\n * history API methods and listening to popstate events.\n * Logs route transitions using an internal NavigationTracker instance.\n */\nexport class NavigationTrackerWeb {\n private tracker: NavigationTracker;\n private currentPath: string;\n\n constructor(private telemetry: Telemetry) {\n this.tracker = new NavigationTracker(telemetry);\n this.currentPath = \"\"; // Will be initialized on start\n }\n\n /**\n * Initializes tracking by patching history methods and listening\n * to popstate events. Should be called once after instantiation.\n *\n * @returns Promise<void> resolves immediately after setup\n */\n start(): Promise<void> {\n return new Promise((resolve) => {\n this.currentPath = window.location.pathname + window.location.search;\n this.patchHistory();\n this.listenPopState();\n resolve();\n });\n }\n\n /**\n * Patches history.pushState and history.replaceState to intercept\n * route changes and notify the NavigationTracker.\n */\n private patchHistory(): void {\n const origPush = history.pushState.bind(history);\n const origReplace = history.replaceState.bind(history);\n\n const handleChange = () => {\n const newPath = window.location.pathname + window.location.search;\n this.tracker.recordRouteChange(this.currentPath, newPath);\n this.currentPath = newPath;\n };\n\n history.pushState = (\n (data: any, unused: string, url?: string | URL | null) => {\n origPush(data, unused, url);\n handleChange();\n }\n ) as typeof history.pushState;\n\n history.replaceState = (\n (data: any, unused: string, url?: string | URL | null) => {\n origReplace(data, unused, url);\n handleChange();\n }\n ) as typeof history.replaceState;\n }\n\n /**\n * Sets up an event listener for popstate events (back/forward navigation)\n * to detect route changes triggered by browser controls.\n */\n private listenPopState(): void {\n window.addEventListener(\"popstate\", () => {\n const newPath = window.location.pathname + window.location.search;\n this.tracker.recordRouteChange(this.currentPath, newPath);\n this.currentPath = newPath;\n });\n }\n}\n"],"names":["NavigationTrackerWeb","telemetry","NavigationTracker","resolve","origPush","origReplace","handleChange","newPath","data","unused","url"],"mappings":"oIAQO,MAAMA,CAAqB,CAI9B,YAAoBC,EAAsB,CAAtB,KAAA,UAAAA,EAChB,KAAK,QAAU,IAAIC,EAAAA,kBAAkBD,CAAS,EAC9C,KAAK,YAAc,EACvB,CAQA,OAAuB,CACnB,OAAO,IAAI,QAASE,GAAY,CAC5B,KAAK,YAAc,OAAO,SAAS,SAAW,OAAO,SAAS,OAC9D,KAAK,aAAA,EACL,KAAK,eAAA,EACLA,EAAA,CACJ,CAAC,CACL,CAMQ,cAAqB,CACzB,MAAMC,EAAW,QAAQ,UAAU,KAAK,OAAO,EACzCC,EAAc,QAAQ,aAAa,KAAK,OAAO,EAE/CC,EAAe,IAAM,CACvB,MAAMC,EAAU,OAAO,SAAS,SAAW,OAAO,SAAS,OAC3D,KAAK,QAAQ,kBAAkB,KAAK,YAAaA,CAAO,EACxD,KAAK,YAAcA,CACvB,EAEA,QAAQ,WACJ,CAACC,EAAWC,EAAgBC,IAA8B,CACtDN,EAASI,EAAMC,EAAQC,CAAG,EAC1BJ,EAAA,CACJ,GAGJ,QAAQ,cACJ,CAACE,EAAWC,EAAgBC,IAA8B,CACtDL,EAAYG,EAAMC,EAAQC,CAAG,EAC7BJ,EAAA,CACJ,EAER,CAMQ,gBAAuB,CAC3B,OAAO,iBAAiB,WAAY,IAAM,CACtC,MAAMC,EAAU,OAAO,SAAS,SAAW,OAAO,SAAS,OAC3D,KAAK,QAAQ,kBAAkB,KAAK,YAAaA,CAAO,EACxD,KAAK,YAAcA,CACvB,CAAC,CACL,CACJ"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { N as n } from "./navigationTracker-Cts68dgG.js";
|
|
2
|
+
class c {
|
|
3
|
+
constructor(t) {
|
|
4
|
+
this.telemetry = t, this.tracker = new n(t), this.currentPath = "";
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Initializes tracking by patching history methods and listening
|
|
8
|
+
* to popstate events. Should be called once after instantiation.
|
|
9
|
+
*
|
|
10
|
+
* @returns Promise<void> resolves immediately after setup
|
|
11
|
+
*/
|
|
12
|
+
start() {
|
|
13
|
+
return new Promise((t) => {
|
|
14
|
+
this.currentPath = window.location.pathname + window.location.search, this.patchHistory(), this.listenPopState(), t();
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Patches history.pushState and history.replaceState to intercept
|
|
19
|
+
* route changes and notify the NavigationTracker.
|
|
20
|
+
*/
|
|
21
|
+
patchHistory() {
|
|
22
|
+
const t = history.pushState.bind(history), i = history.replaceState.bind(history), o = () => {
|
|
23
|
+
const a = window.location.pathname + window.location.search;
|
|
24
|
+
this.tracker.recordRouteChange(this.currentPath, a), this.currentPath = a;
|
|
25
|
+
};
|
|
26
|
+
history.pushState = ((a, e, r) => {
|
|
27
|
+
t(a, e, r), o();
|
|
28
|
+
}), history.replaceState = ((a, e, r) => {
|
|
29
|
+
i(a, e, r), o();
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Sets up an event listener for popstate events (back/forward navigation)
|
|
34
|
+
* to detect route changes triggered by browser controls.
|
|
35
|
+
*/
|
|
36
|
+
listenPopState() {
|
|
37
|
+
window.addEventListener("popstate", () => {
|
|
38
|
+
const t = window.location.pathname + window.location.search;
|
|
39
|
+
this.tracker.recordRouteChange(this.currentPath, t), this.currentPath = t;
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
export {
|
|
44
|
+
c as NavigationTrackerWeb
|
|
45
|
+
};
|
|
46
|
+
//# sourceMappingURL=navigationWeb.web-CORzE_Id.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"navigationWeb.web-CORzE_Id.js","sources":["../src/adapters/web/navigationWeb.web.ts"],"sourcesContent":["import { Telemetry } from \"../../core/telemetry\";\nimport { NavigationTracker } from \"../navigationTracker\";\n\n/**\n * Tracks navigation route changes in web environments by patching\n * history API methods and listening to popstate events.\n * Logs route transitions using an internal NavigationTracker instance.\n */\nexport class NavigationTrackerWeb {\n private tracker: NavigationTracker;\n private currentPath: string;\n\n constructor(private telemetry: Telemetry) {\n this.tracker = new NavigationTracker(telemetry);\n this.currentPath = \"\"; // Will be initialized on start\n }\n\n /**\n * Initializes tracking by patching history methods and listening\n * to popstate events. Should be called once after instantiation.\n *\n * @returns Promise<void> resolves immediately after setup\n */\n start(): Promise<void> {\n return new Promise((resolve) => {\n this.currentPath = window.location.pathname + window.location.search;\n this.patchHistory();\n this.listenPopState();\n resolve();\n });\n }\n\n /**\n * Patches history.pushState and history.replaceState to intercept\n * route changes and notify the NavigationTracker.\n */\n private patchHistory(): void {\n const origPush = history.pushState.bind(history);\n const origReplace = history.replaceState.bind(history);\n\n const handleChange = () => {\n const newPath = window.location.pathname + window.location.search;\n this.tracker.recordRouteChange(this.currentPath, newPath);\n this.currentPath = newPath;\n };\n\n history.pushState = (\n (data: any, unused: string, url?: string | URL | null) => {\n origPush(data, unused, url);\n handleChange();\n }\n ) as typeof history.pushState;\n\n history.replaceState = (\n (data: any, unused: string, url?: string | URL | null) => {\n origReplace(data, unused, url);\n handleChange();\n }\n ) as typeof history.replaceState;\n }\n\n /**\n * Sets up an event listener for popstate events (back/forward navigation)\n * to detect route changes triggered by browser controls.\n */\n private listenPopState(): void {\n window.addEventListener(\"popstate\", () => {\n const newPath = window.location.pathname + window.location.search;\n this.tracker.recordRouteChange(this.currentPath, newPath);\n this.currentPath = newPath;\n });\n }\n}\n"],"names":["NavigationTrackerWeb","telemetry","NavigationTracker","resolve","origPush","origReplace","handleChange","newPath","data","unused","url"],"mappings":";AAQO,MAAMA,EAAqB;AAAA,EAI9B,YAAoBC,GAAsB;AAAtB,SAAA,YAAAA,GAChB,KAAK,UAAU,IAAIC,EAAkBD,CAAS,GAC9C,KAAK,cAAc;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,QAAuB;AACnB,WAAO,IAAI,QAAQ,CAACE,MAAY;AAC5B,WAAK,cAAc,OAAO,SAAS,WAAW,OAAO,SAAS,QAC9D,KAAK,aAAA,GACL,KAAK,eAAA,GACLA,EAAA;AAAA,IACJ,CAAC;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,eAAqB;AACzB,UAAMC,IAAW,QAAQ,UAAU,KAAK,OAAO,GACzCC,IAAc,QAAQ,aAAa,KAAK,OAAO,GAE/CC,IAAe,MAAM;AACvB,YAAMC,IAAU,OAAO,SAAS,WAAW,OAAO,SAAS;AAC3D,WAAK,QAAQ,kBAAkB,KAAK,aAAaA,CAAO,GACxD,KAAK,cAAcA;AAAA,IACvB;AAEA,YAAQ,aACJ,CAACC,GAAWC,GAAgBC,MAA8B;AACtD,MAAAN,EAASI,GAAMC,GAAQC,CAAG,GAC1BJ,EAAA;AAAA,IACJ,IAGJ,QAAQ,gBACJ,CAACE,GAAWC,GAAgBC,MAA8B;AACtD,MAAAL,EAAYG,GAAMC,GAAQC,CAAG,GAC7BJ,EAAA;AAAA,IACJ;AAAA,EAER;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,iBAAuB;AAC3B,WAAO,iBAAiB,YAAY,MAAM;AACtC,YAAMC,IAAU,OAAO,SAAS,WAAW,OAAO,SAAS;AAC3D,WAAK,QAAQ,kBAAkB,KAAK,aAAaA,CAAO,GACxD,KAAK,cAAcA;AAAA,IACvB,CAAC;AAAA,EACL;AACJ;"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";class o{constructor(e){this.telemetry=e}onSample(e){const t=this.previousType;t!==void 0&&t!==e&&this.telemetry.log("network_change",{"network.previous_type":t,"network.type":e}),this.previousType=e}}exports.NetworkChangeEmitter=o;
|
|
2
|
+
//# sourceMappingURL=networkChange-CUO1hRLj.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"networkChange-CUO1hRLj.cjs","sources":["../src/adapters/networkChange.ts"],"sourcesContent":["import { Telemetry } from \"../core/telemetry\";\n\n/**\n * Shared connectivity-transition emitter — the single source of truth so the web and\n * native network adapters stay in lockstep on the v3 `network_change` contract (#27).\n *\n * Feed it every connectivity sample via `onSample`. It emits `network_change` only on an\n * actual type transition, carrying `network.previous_type`; the current `network.*` context\n * rides on the event via the Context block (and is echoed here for an explicit at-emit value).\n */\nexport class NetworkChangeEmitter {\n private previousType?: string;\n\n constructor(private telemetry: Telemetry) {}\n\n onSample(currentType: string | undefined): void {\n const prev = this.previousType;\n if (prev !== undefined && prev !== currentType) {\n this.telemetry.log(\"network_change\", {\n \"network.previous_type\": prev,\n \"network.type\": currentType,\n });\n }\n this.previousType = currentType;\n }\n}\n"],"names":["NetworkChangeEmitter","telemetry","currentType","prev"],"mappings":"aAUO,MAAMA,CAAqB,CAGhC,YAAoBC,EAAsB,CAAtB,KAAA,UAAAA,CAAuB,CAE3C,SAASC,EAAuC,CAC9C,MAAMC,EAAO,KAAK,aACdA,IAAS,QAAaA,IAASD,GACjC,KAAK,UAAU,IAAI,iBAAkB,CACnC,wBAAyBC,EACzB,eAAgBD,CAAA,CACjB,EAEH,KAAK,aAAeA,CACtB,CACF"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
class s {
|
|
2
|
+
constructor(e) {
|
|
3
|
+
this.telemetry = e;
|
|
4
|
+
}
|
|
5
|
+
onSample(e) {
|
|
6
|
+
const t = this.previousType;
|
|
7
|
+
t !== void 0 && t !== e && this.telemetry.log("network_change", {
|
|
8
|
+
"network.previous_type": t,
|
|
9
|
+
"network.type": e
|
|
10
|
+
}), this.previousType = e;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export {
|
|
14
|
+
s as N
|
|
15
|
+
};
|
|
16
|
+
//# sourceMappingURL=networkChange-D39hdSb0.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"networkChange-D39hdSb0.js","sources":["../src/adapters/networkChange.ts"],"sourcesContent":["import { Telemetry } from \"../core/telemetry\";\n\n/**\n * Shared connectivity-transition emitter — the single source of truth so the web and\n * native network adapters stay in lockstep on the v3 `network_change` contract (#27).\n *\n * Feed it every connectivity sample via `onSample`. It emits `network_change` only on an\n * actual type transition, carrying `network.previous_type`; the current `network.*` context\n * rides on the event via the Context block (and is echoed here for an explicit at-emit value).\n */\nexport class NetworkChangeEmitter {\n private previousType?: string;\n\n constructor(private telemetry: Telemetry) {}\n\n onSample(currentType: string | undefined): void {\n const prev = this.previousType;\n if (prev !== undefined && prev !== currentType) {\n this.telemetry.log(\"network_change\", {\n \"network.previous_type\": prev,\n \"network.type\": currentType,\n });\n }\n this.previousType = currentType;\n }\n}\n"],"names":["NetworkChangeEmitter","telemetry","currentType","prev"],"mappings":"AAUO,MAAMA,EAAqB;AAAA,EAGhC,YAAoBC,GAAsB;AAAtB,SAAA,YAAAA;AAAA,EAAuB;AAAA,EAE3C,SAASC,GAAuC;AAC9C,UAAMC,IAAO,KAAK;AAClB,IAAIA,MAAS,UAAaA,MAASD,KACjC,KAAK,UAAU,IAAI,kBAAkB;AAAA,MACnC,yBAAyBC;AAAA,MACzB,gBAAgBD;AAAA,IAAA,CACjB,GAEH,KAAK,eAAeA;AAAA,EACtB;AACF;"}
|
|
@@ -0,0 +1,343 @@
|
|
|
1
|
+
import { useState as S, useEffect as H, useCallback as U } from "react";
|
|
2
|
+
import { NativeEventEmitter as A, Platform as M } from "react-native";
|
|
3
|
+
import { N as q } from "./networkChange-D39hdSb0.js";
|
|
4
|
+
const E = {
|
|
5
|
+
reachabilityUrl: "/",
|
|
6
|
+
reachabilityMethod: "HEAD",
|
|
7
|
+
reachabilityHeaders: {},
|
|
8
|
+
reachabilityTest: (t) => Promise.resolve(t.status === 200),
|
|
9
|
+
reachabilityShortTimeout: 5 * 1e3,
|
|
10
|
+
// 5s
|
|
11
|
+
reachabilityLongTimeout: 60 * 1e3,
|
|
12
|
+
// 60s
|
|
13
|
+
reachabilityRequestTimeout: 15 * 1e3,
|
|
14
|
+
// 15s
|
|
15
|
+
reachabilityShouldRun: () => !0,
|
|
16
|
+
shouldFetchWiFiSSID: !0,
|
|
17
|
+
useNativeReachability: !0
|
|
18
|
+
}, p = "netInfo.networkStatusDidChange";
|
|
19
|
+
let r;
|
|
20
|
+
(function(t) {
|
|
21
|
+
t.unknown = "unknown", t.none = "none", t.cellular = "cellular", t.wifi = "wifi", t.bluetooth = "bluetooth", t.ethernet = "ethernet", t.wimax = "wimax", t.vpn = "vpn", t.other = "other";
|
|
22
|
+
})(r || (r = {}));
|
|
23
|
+
let f;
|
|
24
|
+
(function(t) {
|
|
25
|
+
t["2g"] = "2g", t["3g"] = "3g", t["4g"] = "4g", t["5g"] = "5g";
|
|
26
|
+
})(f || (f = {}));
|
|
27
|
+
const y = typeof window < "u", u = y && !window.hasOwnProperty("tizen") && !window.hasOwnProperty("webOS") ? window.navigator.connection || window.navigator.mozConnection || window.navigator.webkitConnection : void 0, F = {
|
|
28
|
+
bluetooth: r.bluetooth,
|
|
29
|
+
cellular: r.cellular,
|
|
30
|
+
ethernet: r.ethernet,
|
|
31
|
+
none: r.none,
|
|
32
|
+
other: r.other,
|
|
33
|
+
unknown: r.unknown,
|
|
34
|
+
wifi: r.wifi,
|
|
35
|
+
wimax: r.wimax,
|
|
36
|
+
mixed: r.other
|
|
37
|
+
}, V = {
|
|
38
|
+
"2g": f["2g"],
|
|
39
|
+
"3g": f["3g"],
|
|
40
|
+
"4g": f["4g"],
|
|
41
|
+
"slow-2g": f["2g"]
|
|
42
|
+
}, k = (t) => {
|
|
43
|
+
const i = y ? navigator.onLine : !1, e = {
|
|
44
|
+
isInternetReachable: null
|
|
45
|
+
};
|
|
46
|
+
if (!u)
|
|
47
|
+
return i ? {
|
|
48
|
+
...e,
|
|
49
|
+
isConnected: !0,
|
|
50
|
+
type: r.other,
|
|
51
|
+
details: {
|
|
52
|
+
isConnectionExpensive: !1
|
|
53
|
+
}
|
|
54
|
+
} : {
|
|
55
|
+
...e,
|
|
56
|
+
isConnected: !1,
|
|
57
|
+
isInternetReachable: !1,
|
|
58
|
+
type: r.none,
|
|
59
|
+
details: null
|
|
60
|
+
};
|
|
61
|
+
const n = u.saveData, s = u.type ? F[u.type] : i ? r.other : r.unknown;
|
|
62
|
+
return s === r.bluetooth ? {
|
|
63
|
+
...e,
|
|
64
|
+
isConnected: !0,
|
|
65
|
+
type: s,
|
|
66
|
+
details: {
|
|
67
|
+
isConnectionExpensive: n
|
|
68
|
+
}
|
|
69
|
+
} : s === r.cellular ? {
|
|
70
|
+
...e,
|
|
71
|
+
isConnected: !0,
|
|
72
|
+
type: s,
|
|
73
|
+
details: {
|
|
74
|
+
isConnectionExpensive: n,
|
|
75
|
+
cellularGeneration: V[u.effectiveType] || null,
|
|
76
|
+
carrier: null
|
|
77
|
+
}
|
|
78
|
+
} : s === r.ethernet ? {
|
|
79
|
+
...e,
|
|
80
|
+
isConnected: !0,
|
|
81
|
+
type: s,
|
|
82
|
+
details: {
|
|
83
|
+
isConnectionExpensive: n,
|
|
84
|
+
ipAddress: null,
|
|
85
|
+
subnet: null
|
|
86
|
+
}
|
|
87
|
+
} : s === r.wifi ? {
|
|
88
|
+
...e,
|
|
89
|
+
isConnected: !0,
|
|
90
|
+
type: s,
|
|
91
|
+
details: {
|
|
92
|
+
isConnectionExpensive: n,
|
|
93
|
+
ssid: null,
|
|
94
|
+
bssid: null,
|
|
95
|
+
strength: null,
|
|
96
|
+
ipAddress: null,
|
|
97
|
+
subnet: null,
|
|
98
|
+
frequency: null,
|
|
99
|
+
linkSpeed: null,
|
|
100
|
+
rxLinkSpeed: null,
|
|
101
|
+
txLinkSpeed: null
|
|
102
|
+
}
|
|
103
|
+
} : s === r.wimax ? {
|
|
104
|
+
...e,
|
|
105
|
+
isConnected: !0,
|
|
106
|
+
type: s,
|
|
107
|
+
details: {
|
|
108
|
+
isConnectionExpensive: n
|
|
109
|
+
}
|
|
110
|
+
} : s === r.none ? {
|
|
111
|
+
...e,
|
|
112
|
+
isConnected: !1,
|
|
113
|
+
isInternetReachable: !1,
|
|
114
|
+
type: s,
|
|
115
|
+
details: null
|
|
116
|
+
} : s === r.unknown ? {
|
|
117
|
+
...e,
|
|
118
|
+
isConnected: i,
|
|
119
|
+
isInternetReachable: null,
|
|
120
|
+
type: s,
|
|
121
|
+
details: null
|
|
122
|
+
} : {
|
|
123
|
+
...e,
|
|
124
|
+
isConnected: !0,
|
|
125
|
+
type: r.other,
|
|
126
|
+
details: {
|
|
127
|
+
isConnectionExpensive: n
|
|
128
|
+
}
|
|
129
|
+
};
|
|
130
|
+
}, I = [], g = [], L = {
|
|
131
|
+
addListener(t, i) {
|
|
132
|
+
switch (t) {
|
|
133
|
+
case p: {
|
|
134
|
+
const e = () => {
|
|
135
|
+
i(k());
|
|
136
|
+
};
|
|
137
|
+
u ? u.addEventListener("change", e) : y && (window.addEventListener("online", e, !1), window.addEventListener("offline", e, !1)), I.push(i), g.push(e);
|
|
138
|
+
break;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
},
|
|
142
|
+
removeListeners(t, i) {
|
|
143
|
+
switch (t) {
|
|
144
|
+
case p: {
|
|
145
|
+
const e = I.indexOf(i), n = g[e];
|
|
146
|
+
u ? u.removeEventListener("change", n) : y && (window.removeEventListener("online", n), window.removeEventListener("offline", n)), I.splice(e, 1), g.splice(e, 1);
|
|
147
|
+
break;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
},
|
|
151
|
+
async getCurrentState(t) {
|
|
152
|
+
return k();
|
|
153
|
+
},
|
|
154
|
+
configure() {
|
|
155
|
+
}
|
|
156
|
+
}, x = new A();
|
|
157
|
+
L.addListener(p, (t) => {
|
|
158
|
+
x.emit(p, t);
|
|
159
|
+
});
|
|
160
|
+
const C = {
|
|
161
|
+
...L,
|
|
162
|
+
eventEmitter: x
|
|
163
|
+
};
|
|
164
|
+
function l(t, i, e) {
|
|
165
|
+
return i in t ? Object.defineProperty(t, i, { value: e, enumerable: !0, configurable: !0, writable: !0 }) : t[i] = e, t;
|
|
166
|
+
}
|
|
167
|
+
class z {
|
|
168
|
+
constructor(i, e) {
|
|
169
|
+
l(this, "_configuration", void 0), l(this, "_listener", void 0), l(this, "_isInternetReachable", void 0), l(this, "_currentInternetReachabilityCheckHandler", null), l(this, "_currentTimeoutHandle", null), l(this, "_setIsInternetReachable", (n) => {
|
|
170
|
+
this._isInternetReachable !== n && (this._isInternetReachable = n, this._listener(this._isInternetReachable));
|
|
171
|
+
}), l(this, "_setExpectsConnection", (n) => {
|
|
172
|
+
this._currentInternetReachabilityCheckHandler !== null && (this._currentInternetReachabilityCheckHandler.cancel(), this._currentInternetReachabilityCheckHandler = null), this._currentTimeoutHandle !== null && (clearTimeout(this._currentTimeoutHandle), this._currentTimeoutHandle = null), n && this._configuration.reachabilityShouldRun() ? (this._isInternetReachable || this._setIsInternetReachable(null), this._currentInternetReachabilityCheckHandler = this._checkInternetReachability()) : this._setIsInternetReachable(!1);
|
|
173
|
+
}), l(this, "_checkInternetReachability", () => {
|
|
174
|
+
const n = new AbortController(), s = fetch(this._configuration.reachabilityUrl, {
|
|
175
|
+
headers: this._configuration.reachabilityHeaders,
|
|
176
|
+
method: this._configuration.reachabilityMethod,
|
|
177
|
+
cache: "no-cache",
|
|
178
|
+
signal: n.signal
|
|
179
|
+
});
|
|
180
|
+
let d;
|
|
181
|
+
const c = new Promise((h, m) => {
|
|
182
|
+
d = setTimeout(() => m("timedout"), this._configuration.reachabilityRequestTimeout);
|
|
183
|
+
});
|
|
184
|
+
let b = () => {
|
|
185
|
+
};
|
|
186
|
+
const w = new Promise((h, m) => {
|
|
187
|
+
b = () => m("canceled");
|
|
188
|
+
});
|
|
189
|
+
return {
|
|
190
|
+
promise: Promise.race([s, c, w]).then((h) => this._configuration.reachabilityTest(h)).then((h) => {
|
|
191
|
+
this._setIsInternetReachable(h);
|
|
192
|
+
const m = this._isInternetReachable ? this._configuration.reachabilityLongTimeout : this._configuration.reachabilityShortTimeout;
|
|
193
|
+
this._currentTimeoutHandle = setTimeout(this._checkInternetReachability, m);
|
|
194
|
+
}).catch((h) => {
|
|
195
|
+
h === "canceled" ? n.abort() : (h === "timedout" && n.abort(), this._setIsInternetReachable(!1), this._currentTimeoutHandle = setTimeout(this._checkInternetReachability, this._configuration.reachabilityShortTimeout));
|
|
196
|
+
}).then(() => {
|
|
197
|
+
clearTimeout(d);
|
|
198
|
+
}, (h) => {
|
|
199
|
+
throw clearTimeout(d), h;
|
|
200
|
+
}),
|
|
201
|
+
cancel: b
|
|
202
|
+
};
|
|
203
|
+
}), l(this, "update", (n) => {
|
|
204
|
+
typeof n.isInternetReachable == "boolean" && this._configuration.useNativeReachability ? this._setIsInternetReachable(n.isInternetReachable) : this._setExpectsConnection(n.isConnected);
|
|
205
|
+
}), l(this, "currentState", () => this._isInternetReachable), l(this, "tearDown", () => {
|
|
206
|
+
this._currentInternetReachabilityCheckHandler !== null && (this._currentInternetReachabilityCheckHandler.cancel(), this._currentInternetReachabilityCheckHandler = null), this._currentTimeoutHandle !== null && (clearTimeout(this._currentTimeoutHandle), this._currentTimeoutHandle = null);
|
|
207
|
+
}), this._configuration = i, this._listener = e;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
function o(t, i, e) {
|
|
211
|
+
return i in t ? Object.defineProperty(t, i, { value: e, enumerable: !0, configurable: !0, writable: !0 }) : t[i] = e, t;
|
|
212
|
+
}
|
|
213
|
+
class P {
|
|
214
|
+
constructor(i) {
|
|
215
|
+
o(this, "_nativeEventSubscription", null), o(this, "_subscriptions", /* @__PURE__ */ new Set()), o(this, "_latestState", null), o(this, "_internetReachability", void 0), o(this, "_handleNativeStateUpdate", (e) => {
|
|
216
|
+
this._internetReachability.update(e);
|
|
217
|
+
const n = this._convertState(e);
|
|
218
|
+
this._latestState = n, this._subscriptions.forEach((s) => s(n));
|
|
219
|
+
}), o(this, "_handleInternetReachabilityUpdate", (e) => {
|
|
220
|
+
if (!this._latestState)
|
|
221
|
+
return;
|
|
222
|
+
const n = {
|
|
223
|
+
...this._latestState,
|
|
224
|
+
isInternetReachable: e
|
|
225
|
+
};
|
|
226
|
+
this._latestState = n, this._subscriptions.forEach((s) => s(n));
|
|
227
|
+
}), o(this, "_fetchCurrentState", async (e) => {
|
|
228
|
+
const n = await C.getCurrentState(e);
|
|
229
|
+
this._internetReachability.update(n);
|
|
230
|
+
const s = this._convertState(n);
|
|
231
|
+
return e || (this._latestState = s, this._subscriptions.forEach((d) => d(s))), s;
|
|
232
|
+
}), o(this, "_convertState", (e) => typeof e.isInternetReachable == "boolean" ? e : {
|
|
233
|
+
...e,
|
|
234
|
+
isInternetReachable: this._internetReachability.currentState()
|
|
235
|
+
}), o(this, "latest", (e) => e ? this._fetchCurrentState(e) : this._latestState ? Promise.resolve(this._latestState) : this._fetchCurrentState()), o(this, "add", (e) => {
|
|
236
|
+
this._subscriptions.add(e), this._latestState ? e(this._latestState) : this.latest().then(e);
|
|
237
|
+
}), o(this, "remove", (e) => {
|
|
238
|
+
this._subscriptions.delete(e);
|
|
239
|
+
}), o(this, "tearDown", () => {
|
|
240
|
+
this._internetReachability && this._internetReachability.tearDown(), this._nativeEventSubscription && this._nativeEventSubscription.remove(), this._subscriptions.clear();
|
|
241
|
+
}), this._internetReachability = new z(i, this._handleInternetReachabilityUpdate), this._nativeEventSubscription = C.eventEmitter.addListener(p, this._handleNativeStateUpdate), this._fetchCurrentState();
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
let N = E, a = null;
|
|
245
|
+
const v = () => new P(N);
|
|
246
|
+
let _ = !1, R = [];
|
|
247
|
+
function D(t) {
|
|
248
|
+
N = {
|
|
249
|
+
...E,
|
|
250
|
+
...t
|
|
251
|
+
}, a && (a.tearDown(), a = v()), M.OS === "ios" && C.configure(t);
|
|
252
|
+
}
|
|
253
|
+
function W(t) {
|
|
254
|
+
return a || (a = v()), a.latest(t);
|
|
255
|
+
}
|
|
256
|
+
function $() {
|
|
257
|
+
return a || (a = v()), _ ? new Promise((t) => {
|
|
258
|
+
R.push(t);
|
|
259
|
+
}) : (_ = !0, a._fetchCurrentState().then((t) => (R.forEach((i) => i(t)), R = [], t)).finally(() => {
|
|
260
|
+
_ = !1;
|
|
261
|
+
}));
|
|
262
|
+
}
|
|
263
|
+
function O(t) {
|
|
264
|
+
return a || (a = v()), a.add(t), () => {
|
|
265
|
+
a && a.remove(t);
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
function Q(t) {
|
|
269
|
+
t && D(t);
|
|
270
|
+
const [i, e] = S({
|
|
271
|
+
type: r.unknown,
|
|
272
|
+
isConnected: null,
|
|
273
|
+
isInternetReachable: null,
|
|
274
|
+
details: null
|
|
275
|
+
});
|
|
276
|
+
return H(() => {
|
|
277
|
+
const n = O(e);
|
|
278
|
+
return () => n();
|
|
279
|
+
}, []), i;
|
|
280
|
+
}
|
|
281
|
+
function Y(t = !1, i) {
|
|
282
|
+
const [e, n] = S(), [s, d] = S({
|
|
283
|
+
type: r.unknown,
|
|
284
|
+
isConnected: null,
|
|
285
|
+
isInternetReachable: null,
|
|
286
|
+
details: null
|
|
287
|
+
});
|
|
288
|
+
H(() => {
|
|
289
|
+
if (t)
|
|
290
|
+
return;
|
|
291
|
+
const b = {
|
|
292
|
+
...E,
|
|
293
|
+
...i
|
|
294
|
+
}, w = new P(b);
|
|
295
|
+
return n(w), w.add(d), w.tearDown;
|
|
296
|
+
}, [t, i]);
|
|
297
|
+
const c = U(() => {
|
|
298
|
+
e && !_ && (_ = !0, e._fetchCurrentState().finally(() => {
|
|
299
|
+
_ = !1;
|
|
300
|
+
}));
|
|
301
|
+
}, [e]);
|
|
302
|
+
return {
|
|
303
|
+
netInfo: s,
|
|
304
|
+
refresh: c
|
|
305
|
+
};
|
|
306
|
+
}
|
|
307
|
+
const T = {
|
|
308
|
+
configure: D,
|
|
309
|
+
fetch: W,
|
|
310
|
+
refresh: $,
|
|
311
|
+
addEventListener: O,
|
|
312
|
+
useNetInfo: Q,
|
|
313
|
+
useNetInfoInstance: Y
|
|
314
|
+
};
|
|
315
|
+
class X {
|
|
316
|
+
constructor() {
|
|
317
|
+
}
|
|
318
|
+
async collect() {
|
|
319
|
+
try {
|
|
320
|
+
const i = await T.fetch();
|
|
321
|
+
return {
|
|
322
|
+
type: i.type,
|
|
323
|
+
isConnected: i.isConnected ?? void 0
|
|
324
|
+
};
|
|
325
|
+
} catch {
|
|
326
|
+
return { type: "unknown", isConnected: void 0 };
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* collect() feeds the steady-state Context block on every event (no standalone
|
|
331
|
+
* network_info event, ADR-0002). A connectivity *transition* is still its own
|
|
332
|
+
* v3 `network_change` event, emitted via the shared NetworkChangeEmitter.
|
|
333
|
+
*/
|
|
334
|
+
async start(i) {
|
|
335
|
+
this.telemetry = i;
|
|
336
|
+
const e = new q(i), n = await this.collect();
|
|
337
|
+
return e.onSample(n.type), T.addEventListener((s) => e.onSample(s.type)), n;
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
export {
|
|
341
|
+
X as NetworkInfoTrackerNative
|
|
342
|
+
};
|
|
343
|
+
//# sourceMappingURL=networkInfo.native-BK5fpAOL.js.map
|