@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 @@
|
|
|
1
|
+
{"version":3,"file":"index.native.js","sources":["../src/createTelemetry.native.ts","../src/index.native.ts"],"sourcesContent":["import { TelemetryNative } from \"./index.native\";\n\nexport type TelemetryOpts = {\n apiKey: string; // required; must start with \"edge_\"\n sender?: any;\n batchSize?: number;\n flushIntervalMs?: number;\n endpoint?: string;\n captureConsole?: boolean; // funnel console.error/warn into app.crash (default on, opt-out)\n debug?: boolean; // SDK-internal diagnostics; off by default (#23)\n};\n\nexport function assertApiKey(apiKey?: string) {\n if (!apiKey || !apiKey.startsWith(\"edge_\")) {\n throw new Error(\"createTelemetry: apiKey is required and must start with 'edge_'\");\n }\n}\n\n/**\n * Cross-platform factory for telemetry. The platform is chosen by the bundler\n * via the .web / .native file split — no runtime navigator sniffing.\n */\nexport function createTelemetry(opts: TelemetryOpts) {\n assertApiKey(opts?.apiKey);\n return new TelemetryNative(opts);\n}\n","// React Native telemetry implementation\nimport { TelemetryBase } from \"./index.base\";\nimport { debug, setDebug } from \"./core/debug\";\n\nexport { createTelemetry, type TelemetryOpts } from \"./createTelemetry.native\";\n\nexport class TelemetryNative extends TelemetryBase {\n constructor(opts?: {\n apiKey?: string;\n sender?: any;\n batchSize?: number;\n flushIntervalMs?: number;\n endpoint?: string;\n captureConsole?: boolean;\n debug?: boolean;\n }) {\n setDebug(opts?.debug ?? false); // gate SDK console noise before anything logs (#23)\n super();\n\n debug.log(\"🌍 Running Native Telemetry\");\n this.instancePromise = (async () => {\n const { Telemetry } = await import(\"./core/telemetry\");\n const { nativeSender } = await import(\"./adapters/nativeSender\");\n\n const { replayFailedNative } = await import(\"./adapters/nativeSender\");\n const { DeviceInfoTrackerNative } = await import(\"./adapters/native/deviceInfo.native\");\n const { NetworkInfoTrackerNative } = await import(\"./adapters/native/networkInfo.native\");\n\n // device OS forms the device/session id suffix (ios|android)\n let platform: string | undefined;\n try {\n ({ Platform: { OS: platform } } = await import(\"react-native\") as any);\n } catch { /* non-RN context (e.g. tests) — omit the suffix */ }\n\n const networkInfoTrackerNative = new NetworkInfoTrackerNative();\n const deviceInfoTrackerNative = new DeviceInfoTrackerNative();\n\n const sender = opts?.sender ?? nativeSender(opts?.endpoint, opts?.apiKey);\n\n const telemetry = new Telemetry({\n sender,\n batchSize: opts?.batchSize,\n flushIntervalMs: opts?.flushIntervalMs,\n endpoint: opts?.endpoint,\n platform,\n deviceInfoHandler: deviceInfoTrackerNative,\n networkInfoHandler: networkInfoTrackerNative,\n });\n\n // 🔄 recover failed events right after init\n replayFailedNative(opts?.endpoint, opts?.apiKey).catch(err => {\n debug.warn(\"Native replay failed:\", err);\n });\n\n return telemetry;\n })();\n\n // session.started on init; AppState drives background→finalize, foreground→new session (#29)\n this.startSessionOnInit().catch(err => debug.warn(\"Native startSession failed:\", err));\n this.attachAppState().catch(err => debug.warn(\"Native AppState attach failed:\", err));\n\n // app_lifecycle on foreground/background (#30)\n this.attachAppLifecycle().catch(err => {\n debug.log(\"Native attachAppLifecycle errors\", err);\n });\n\n this.trackErrors({ captureConsole: opts?.captureConsole }).catch(err => {\n debug.warn(\"Native trackErrors failed:\", err);\n });\n\n this.trackFrameDrops().catch(err => {\n debug.log(\"Native trackFrameDrops errors\", err);\n });\n this.trackNetworkRequests().catch(err => {\n debug.log(\"Native trackNetworkRequests errors\", err);\n });\n this.trackMemoryUsage().catch(err => {\n debug.log(\"Native trackMemoryUsage errors\", err);\n });\n }\n\n private async startSessionOnInit() {\n const inst = await this.instancePromise;\n await inst.startSession();\n }\n\n // Background → finalize (immediate flush). Foreground after background → fresh session. (#29)\n private async attachAppState() {\n const { AppState } = await import(\"react-native\") as any;\n const inst = await this.instancePromise;\n let prev: string = AppState.currentState;\n AppState.addEventListener(\"change\", (next: string) => {\n if (next === \"background\") {\n inst.finalizeSession().catch((e: any) => debug.warn(\"finalizeSession failed:\", e));\n } else if (next === \"active\" && prev === \"background\") {\n inst.newSession().catch((e: any) => debug.warn(\"newSession failed:\", e));\n }\n prev = next;\n });\n }\n\n // app_lifecycle on foreground/background via RN AppState (#30)\n async attachAppLifecycle() {\n const { AppState } = await import(\"react-native\") as any;\n const inst = await this.instancePromise;\n const { AppLifecycleEmitter } = await import(\"./adapters/appLifecycle\");\n const emitter = new AppLifecycleEmitter(inst);\n emitter.onState(AppState.currentState === \"active\"); // seed current state\n AppState.addEventListener(\"change\", (next: string) => emitter.onState(next === \"active\"));\n }\n\n async getDeviceInfo() {\n const { DeviceInfoTrackerNative } = await import(\"./adapters/native/deviceInfo.native\");\n const inst = await this.instancePromise;\n const deviceInfoTrackerNative = new DeviceInfoTrackerNative();\n return inst.getDeviceInfo(deviceInfoTrackerNative);\n }\n\n async getNetworkInfo() {\n const { NetworkInfoTrackerNative } = await import(\"./adapters/native/networkInfo.native\");\n const inst = await this.instancePromise;\n const networkInfoTrackerNative = new NetworkInfoTrackerNative();\n return inst.getNetworkInfo(networkInfoTrackerNative);\n }\n\n async trackFrameDrops() {\n const { FrameDropTrackerNative } = await import(\"./adapters/native/frameDropsNative.native\");\n const inst = await this.instancePromise;\n const frameDropTracker = new FrameDropTrackerNative(inst);\n return inst.trackFrameDrops(frameDropTracker);\n }\n\n async trackNetworkRequests() {\n const { NetworkTrackerNative } = await import(\"./adapters/native/interceptFetchNative.native\");\n const inst = await this.instancePromise;\n const networkTracker = new NetworkTrackerNative(inst);\n return inst.trackNetworkRequests(networkTracker);\n }\n\n async trackMemoryUsage() {\n const { TelemetryMemoryUsageNative } = await import(\"./adapters/native/memoryNative.native\");\n const inst = await this.instancePromise;\n const memoryTracker = new TelemetryMemoryUsageNative(inst);\n return inst.trackMemoryUsage(memoryTracker);\n }\n\n // ---------- Screen Management ----------\n\n async screenStart(name: string) {\n const inst = await this.instancePromise;\n inst.screens.startScreen(name);\n }\n\n async screenEnd(name: string) {\n const inst = await this.instancePromise;\n inst.screens.endScreen(name);\n }\n\n async trackRoute(from: string, to: string) {\n const inst = await this.instancePromise;\n inst.recordRouteChange(from, to);\n }\n\n // Best-effort native taps → user.interaction (#33). Spread the returned props on your\n // app root <View>; each tap emits user.interaction with the current screen when known.\n // const props = await telemetry.interactionProps();\n // <View {...props}>{app}</View>\n async interactionProps() {\n const inst = await this.instancePromise;\n const { InteractionEmitter } = await import(\"./adapters/interaction\");\n return new InteractionEmitter(inst).responderProps();\n }\n\n async attachNavigation(navigationRef: any) {\n debug.log(\"Attaching navigation tracker\");\n if (!navigationRef) {\n debug.warn(\"Navigation reference is undefined. Cannot attach navigation tracker.\");\n return;\n }\n const inst = await this.instancePromise;\n const { NavigationTrackerNative } = await import(\"./adapters/native/navigationNative.native\");\n const tracker = new NavigationTrackerNative(inst);\n tracker.attach(navigationRef);\n }\n}\n"],"names":["assertApiKey","apiKey","createTelemetry","opts","TelemetryNative","TelemetryBase","setDebug","debug","Telemetry","nativeSender","replayFailedNative","DeviceInfoTrackerNative","NetworkInfoTrackerNative","platform","networkInfoTrackerNative","deviceInfoTrackerNative","sender","telemetry","err","AppState","inst","prev","next","e","AppLifecycleEmitter","emitter","FrameDropTrackerNative","frameDropTracker","NetworkTrackerNative","networkTracker","TelemetryMemoryUsageNative","memoryTracker","name","from","to","InteractionEmitter","navigationRef","NavigationTrackerNative"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const n=require("./debug-rnOOxFpN.cjs");function m(s){if(!s||!s.startsWith("edge_"))throw new Error("createTelemetry: apiKey is required and must start with 'edge_'")}function w(s){return m(s?.apiKey),new i(s)}class i extends n.TelemetryBase{constructor(t){n.setDebug(t?.debug??!1),super(),n.debug.log("🌍 Running Web Telemetry"),this.instancePromise=(async()=>{const{Telemetry:e}=await Promise.resolve().then(()=>require("./telemetry-Co4MYdwa.cjs")),{webSender:r}=await Promise.resolve().then(()=>require("./webSender-BWi4x1df.cjs")),{DeviceInfoTrackerWeb:a}=await Promise.resolve().then(()=>require("./deviceInfo.web-ByNAlEJh.cjs")),{NetworkInfoTrackerWeb:o}=await Promise.resolve().then(()=>require("./networkInfo.web-DJmw1sNK.cjs")),c=new a,u=new o,l=t?.sender??r(t?.endpoint,t?.apiKey);return new e({sender:l,batchSize:t?.batchSize,flushIntervalMs:t?.flushIntervalMs,endpoint:t?.endpoint,deviceInfoHandler:c,networkInfoHandler:u})})(),this.startSessionOnInit().catch(e=>n.debug.warn("Web startSession failed:",e)),this.trackErrors({captureConsole:t?.captureConsole}).catch(e=>{n.debug.warn("Web trackErrors failed:",e)}),this.trackFrameDrops().catch(e=>{n.debug.log("Web trackFrameDrops errors",e)}),this.trackNetworkRequests().catch(e=>{n.debug.log("Web trackNetworkRequests errors",e)}),this.trackMemoryUsage().catch(e=>{n.debug.log("Web trackMemoryUsage errors",e)}),this.autoTrackNavigation().catch(e=>{n.debug.log("Web autoTrackNavigation errors",e)}),this.attachAppLifecycle().catch(e=>{n.debug.log("Web attachAppLifecycle errors",e)})}async attachAppLifecycle(){if(typeof document>"u")return;const t=await this.instancePromise,{AppLifecycleEmitter:e}=await Promise.resolve().then(()=>require("./appLifecycle-DvJIt7ym.cjs")),r=new e(t);r.onState(document.visibilityState==="visible"),document.addEventListener("visibilitychange",()=>r.onState(document.visibilityState==="visible"))}async trackErrors(t){const{CrashHandler:e}=await Promise.resolve().then(()=>require("./crashHandler.web-BSxDpFTo.cjs")),r=await this.instancePromise,a=new e(r);return r.trackErrors(a,t)}async startSessionOnInit(){await(await this.instancePromise).startSession()}async trackFrameDrops(){const{FrameDropTrackerWeb:t}=await Promise.resolve().then(()=>require("./frameDropsWeb.web-azpwQCUz.cjs")),e=await this.instancePromise,r=new t(e);return e.trackFrameDrops(r)}async trackNetworkRequests(){const{NetworkTrackerWeb:t}=await Promise.resolve().then(()=>require("./interceptFetchWeb.web-DFzZliik.cjs")),e=await this.instancePromise,r=new t(e);return e.trackNetworkRequests(r)}async trackMemoryUsage(){const{TelemetryMemoryUsageWeb:t}=await Promise.resolve().then(()=>require("./memoryWeb.web-CheXAcJn.cjs")),e=await this.instancePromise,r=new t(e);return e.trackMemoryUsage(r)}async autoTrackNavigation(){const{NavigationTrackerWeb:t}=await Promise.resolve().then(()=>require("./navigationWeb.web-B0necr5j.cjs")),e=await this.instancePromise,r=new t(e);return e.start(r)}async getDeviceInfo(){const{DeviceInfoTrackerWeb:t}=await Promise.resolve().then(()=>require("./deviceInfo.web-ByNAlEJh.cjs")),e=await this.instancePromise,r=new t;return e.getDeviceInfo(r)}async getNetworkInfo(){const{NetworkInfoTrackerWeb:t}=await Promise.resolve().then(()=>require("./networkInfo.web-DJmw1sNK.cjs")),e=await this.instancePromise,r=new t;return e.getNetworkInfo(r)}}exports.TelemetryWeb=i;exports.createTelemetry=w;
|
|
2
|
+
//# sourceMappingURL=index.web.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.web.cjs","sources":["../src/createTelemetry.web.ts","../src/index.web.ts"],"sourcesContent":["import { TelemetryWeb } from \"./index.web\";\n\nexport type TelemetryOpts = {\n apiKey: string; // required; must start with \"edge_\"\n sender?: any;\n batchSize?: number;\n flushIntervalMs?: number;\n endpoint?: string;\n captureConsole?: boolean; // funnel console.error/warn into app.crash (default on, opt-out)\n debug?: boolean; // SDK-internal diagnostics; off by default (#23)\n};\n\nexport function assertApiKey(apiKey?: string) {\n if (!apiKey || !apiKey.startsWith(\"edge_\")) {\n throw new Error(\"createTelemetry: apiKey is required and must start with 'edge_'\");\n }\n}\n\n/**\n * Cross-platform factory for telemetry. The platform is chosen by the bundler\n * via the .web / .native file split — no runtime navigator sniffing.\n */\nexport function createTelemetry(opts: TelemetryOpts) {\n assertApiKey(opts?.apiKey);\n return new TelemetryWeb(opts);\n}\n","// src/index.web.ts\nimport { TelemetryBase } from \"./index.base\";\nimport { debug, setDebug } from \"./core/debug\";\n\nexport { createTelemetry, type TelemetryOpts } from \"./createTelemetry.web\";\n\nexport class TelemetryWeb extends TelemetryBase {\n constructor(opts?: {\n apiKey?: string;\n sender?: any;\n batchSize?: number;\n flushIntervalMs?: number;\n endpoint?: string;\n captureConsole?: boolean;\n debug?: boolean;\n }) {\n setDebug(opts?.debug ?? false); // gate SDK console noise before anything logs (#23)\n super();\n\n debug.log(\"🌍 Running Web Telemetry\");\n\n this.instancePromise = (async () => {\n const { Telemetry } = await import(\"./core/telemetry\");\n const { webSender } = await import(\"./adapters/webSender\");\n\n const { DeviceInfoTrackerWeb } = await import(\"./adapters/web/deviceInfo.web\");\n const { NetworkInfoTrackerWeb } = await import(\"./adapters/web/networkInfo.web\");\n const deviceInfoTrackerWeb = new DeviceInfoTrackerWeb();\n const networkInfoTrackerWeb = new NetworkInfoTrackerWeb();\n\n const sender = opts?.sender ?? webSender(opts?.endpoint, opts?.apiKey);\n\n const telemetry = new Telemetry({\n sender,\n batchSize: opts?.batchSize,\n flushIntervalMs: opts?.flushIntervalMs,\n endpoint: opts?.endpoint,\n // no id suffix on web: the contract suffix is ios|android only.\n // device.platform=\"web\" still rides as an attribute from the adapter.\n deviceInfoHandler: deviceInfoTrackerWeb,\n networkInfoHandler: networkInfoTrackerWeb,\n });\n\n return telemetry;\n })();\n\n // session.started on init (#29). Background/foreground via AppState is native-only.\n this.startSessionOnInit().catch(err => debug.warn(\"Web startSession failed:\", err));\n\n this.trackErrors({ captureConsole: opts?.captureConsole }).catch(err => {\n debug.warn(\"Web trackErrors failed:\", err);\n });\n\n this.trackFrameDrops().catch(err => {\n debug.log(\"Web trackFrameDrops errors\", err);\n });\n this.trackNetworkRequests().catch(err => {\n debug.log(\"Web trackNetworkRequests errors\", err);\n });\n this.trackMemoryUsage().catch(err => {\n debug.log(\"Web trackMemoryUsage errors\", err);\n });\n this.autoTrackNavigation().catch(err => {\n debug.log(\"Web autoTrackNavigation errors\", err);\n });\n this.attachAppLifecycle().catch(err => {\n debug.log(\"Web attachAppLifecycle errors\", err);\n });\n }\n\n // app_lifecycle on tab visibility change — web equivalent of native AppState (#30)\n async attachAppLifecycle() {\n if (typeof document === \"undefined\") return;\n const inst = await this.instancePromise;\n const { AppLifecycleEmitter } = await import(\"./adapters/appLifecycle\");\n const emitter = new AppLifecycleEmitter(inst);\n emitter.onState(document.visibilityState === \"visible\"); // seed current state\n document.addEventListener(\"visibilitychange\", () =>\n emitter.onState(document.visibilityState === \"visible\"));\n }\n\n // Web uses the web crash handler (window.onerror/onunhandledrejection), not the native one.\n async trackErrors(options?: { captureConsole?: boolean }) {\n const { CrashHandler } = await import(\"./adapters/web/crashHandler.web\");\n const inst = await this.instancePromise;\n const crashHandler = new CrashHandler(inst);\n return inst.trackErrors(crashHandler, options);\n }\n\n private async startSessionOnInit() {\n const inst = await this.instancePromise;\n await inst.startSession();\n }\n\n async trackFrameDrops() {\n const { FrameDropTrackerWeb } = await import(\"./adapters/web/frameDropsWeb.web\");\n const inst = await this.instancePromise;\n const frameDropTracker = new FrameDropTrackerWeb(inst);\n return inst.trackFrameDrops(frameDropTracker);\n }\n\n async trackNetworkRequests() {\n const { NetworkTrackerWeb } = await import(\"./adapters/web/interceptFetchWeb.web\");\n const inst = await this.instancePromise;\n const networkTracker = new NetworkTrackerWeb(inst);\n return inst.trackNetworkRequests(networkTracker);\n }\n\n async trackMemoryUsage() {\n const { TelemetryMemoryUsageWeb } = await import(\"./adapters/web/memoryWeb.web\");\n const inst = await this.instancePromise;\n const memoryTracker = new TelemetryMemoryUsageWeb(inst);\n return inst.trackMemoryUsage(memoryTracker);\n }\n\n async autoTrackNavigation() {\n const { NavigationTrackerWeb } = await import(\"./adapters/web/navigationWeb.web\");\n const inst = await this.instancePromise;\n const navigationTracker = new NavigationTrackerWeb(inst);\n return inst.start(navigationTracker);\n }\n\n async getDeviceInfo() {\n const { DeviceInfoTrackerWeb } = await import(\"./adapters/web/deviceInfo.web\");\n const inst = await this.instancePromise;\n const deviceInfoTrackerWeb = new DeviceInfoTrackerWeb();\n return inst.getDeviceInfo(deviceInfoTrackerWeb);\n }\n\n async getNetworkInfo() {\n const { NetworkInfoTrackerWeb } = await import(\"./adapters/web/networkInfo.web\");\n const inst = await this.instancePromise;\n const networkInfoTrackerWeb = new NetworkInfoTrackerWeb();\n return inst.getNetworkInfo(networkInfoTrackerWeb);\n }\n}\n"],"names":["assertApiKey","apiKey","createTelemetry","opts","TelemetryWeb","TelemetryBase","setDebug","debug","Telemetry","webSender","DeviceInfoTrackerWeb","NetworkInfoTrackerWeb","deviceInfoTrackerWeb","networkInfoTrackerWeb","sender","err","inst","AppLifecycleEmitter","emitter","options","CrashHandler","crashHandler","FrameDropTrackerWeb","frameDropTracker","NetworkTrackerWeb","networkTracker","TelemetryMemoryUsageWeb","memoryTracker","NavigationTrackerWeb","navigationTracker"],"mappings":"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"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { T as w, s as k, d as a } from "./debug-DsvQ9y3W.js";
|
|
2
|
+
function l(n) {
|
|
3
|
+
if (!n || !n.startsWith("edge_"))
|
|
4
|
+
throw new Error("createTelemetry: apiKey is required and must start with 'edge_'");
|
|
5
|
+
}
|
|
6
|
+
function b(n) {
|
|
7
|
+
return l(n?.apiKey), new h(n);
|
|
8
|
+
}
|
|
9
|
+
class h extends w {
|
|
10
|
+
constructor(t) {
|
|
11
|
+
k(t?.debug ?? !1), super(), a.log("🌍 Running Web Telemetry"), this.instancePromise = (async () => {
|
|
12
|
+
const { Telemetry: e } = await import("./telemetry-KI0x4gzC.js"), { webSender: r } = await import("./webSender-B27tmT1w.js"), { DeviceInfoTrackerWeb: s } = await import("./deviceInfo.web-DzQyEku6.js"), { NetworkInfoTrackerWeb: i } = await import("./networkInfo.web-twcNn_hc.js"), c = new s(), o = new i(), m = t?.sender ?? r(t?.endpoint, t?.apiKey);
|
|
13
|
+
return new e({
|
|
14
|
+
sender: m,
|
|
15
|
+
batchSize: t?.batchSize,
|
|
16
|
+
flushIntervalMs: t?.flushIntervalMs,
|
|
17
|
+
endpoint: t?.endpoint,
|
|
18
|
+
// no id suffix on web: the contract suffix is ios|android only.
|
|
19
|
+
// device.platform="web" still rides as an attribute from the adapter.
|
|
20
|
+
deviceInfoHandler: c,
|
|
21
|
+
networkInfoHandler: o
|
|
22
|
+
});
|
|
23
|
+
})(), this.startSessionOnInit().catch((e) => a.warn("Web startSession failed:", e)), this.trackErrors({ captureConsole: t?.captureConsole }).catch((e) => {
|
|
24
|
+
a.warn("Web trackErrors failed:", e);
|
|
25
|
+
}), this.trackFrameDrops().catch((e) => {
|
|
26
|
+
a.log("Web trackFrameDrops errors", e);
|
|
27
|
+
}), this.trackNetworkRequests().catch((e) => {
|
|
28
|
+
a.log("Web trackNetworkRequests errors", e);
|
|
29
|
+
}), this.trackMemoryUsage().catch((e) => {
|
|
30
|
+
a.log("Web trackMemoryUsage errors", e);
|
|
31
|
+
}), this.autoTrackNavigation().catch((e) => {
|
|
32
|
+
a.log("Web autoTrackNavigation errors", e);
|
|
33
|
+
}), this.attachAppLifecycle().catch((e) => {
|
|
34
|
+
a.log("Web attachAppLifecycle errors", e);
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
// app_lifecycle on tab visibility change — web equivalent of native AppState (#30)
|
|
38
|
+
async attachAppLifecycle() {
|
|
39
|
+
if (typeof document > "u") return;
|
|
40
|
+
const t = await this.instancePromise, { AppLifecycleEmitter: e } = await import("./appLifecycle-Cynw0kAv.js"), r = new e(t);
|
|
41
|
+
r.onState(document.visibilityState === "visible"), document.addEventListener("visibilitychange", () => r.onState(document.visibilityState === "visible"));
|
|
42
|
+
}
|
|
43
|
+
// Web uses the web crash handler (window.onerror/onunhandledrejection), not the native one.
|
|
44
|
+
async trackErrors(t) {
|
|
45
|
+
const { CrashHandler: e } = await import("./crashHandler.web-D59bmhg9.js"), r = await this.instancePromise, s = new e(r);
|
|
46
|
+
return r.trackErrors(s, t);
|
|
47
|
+
}
|
|
48
|
+
async startSessionOnInit() {
|
|
49
|
+
await (await this.instancePromise).startSession();
|
|
50
|
+
}
|
|
51
|
+
async trackFrameDrops() {
|
|
52
|
+
const { FrameDropTrackerWeb: t } = await import("./frameDropsWeb.web-C9Lt3Fuj.js"), e = await this.instancePromise, r = new t(e);
|
|
53
|
+
return e.trackFrameDrops(r);
|
|
54
|
+
}
|
|
55
|
+
async trackNetworkRequests() {
|
|
56
|
+
const { NetworkTrackerWeb: t } = await import("./interceptFetchWeb.web-DfsMfoRP.js"), e = await this.instancePromise, r = new t(e);
|
|
57
|
+
return e.trackNetworkRequests(r);
|
|
58
|
+
}
|
|
59
|
+
async trackMemoryUsage() {
|
|
60
|
+
const { TelemetryMemoryUsageWeb: t } = await import("./memoryWeb.web-B3YuV-cB.js"), e = await this.instancePromise, r = new t(e);
|
|
61
|
+
return e.trackMemoryUsage(r);
|
|
62
|
+
}
|
|
63
|
+
async autoTrackNavigation() {
|
|
64
|
+
const { NavigationTrackerWeb: t } = await import("./navigationWeb.web-CORzE_Id.js"), e = await this.instancePromise, r = new t(e);
|
|
65
|
+
return e.start(r);
|
|
66
|
+
}
|
|
67
|
+
async getDeviceInfo() {
|
|
68
|
+
const { DeviceInfoTrackerWeb: t } = await import("./deviceInfo.web-DzQyEku6.js"), e = await this.instancePromise, r = new t();
|
|
69
|
+
return e.getDeviceInfo(r);
|
|
70
|
+
}
|
|
71
|
+
async getNetworkInfo() {
|
|
72
|
+
const { NetworkInfoTrackerWeb: t } = await import("./networkInfo.web-twcNn_hc.js"), e = await this.instancePromise, r = new t();
|
|
73
|
+
return e.getNetworkInfo(r);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
export {
|
|
77
|
+
h as TelemetryWeb,
|
|
78
|
+
b as createTelemetry
|
|
79
|
+
};
|
|
80
|
+
//# sourceMappingURL=index.web.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.web.js","sources":["../src/createTelemetry.web.ts","../src/index.web.ts"],"sourcesContent":["import { TelemetryWeb } from \"./index.web\";\n\nexport type TelemetryOpts = {\n apiKey: string; // required; must start with \"edge_\"\n sender?: any;\n batchSize?: number;\n flushIntervalMs?: number;\n endpoint?: string;\n captureConsole?: boolean; // funnel console.error/warn into app.crash (default on, opt-out)\n debug?: boolean; // SDK-internal diagnostics; off by default (#23)\n};\n\nexport function assertApiKey(apiKey?: string) {\n if (!apiKey || !apiKey.startsWith(\"edge_\")) {\n throw new Error(\"createTelemetry: apiKey is required and must start with 'edge_'\");\n }\n}\n\n/**\n * Cross-platform factory for telemetry. The platform is chosen by the bundler\n * via the .web / .native file split — no runtime navigator sniffing.\n */\nexport function createTelemetry(opts: TelemetryOpts) {\n assertApiKey(opts?.apiKey);\n return new TelemetryWeb(opts);\n}\n","// src/index.web.ts\nimport { TelemetryBase } from \"./index.base\";\nimport { debug, setDebug } from \"./core/debug\";\n\nexport { createTelemetry, type TelemetryOpts } from \"./createTelemetry.web\";\n\nexport class TelemetryWeb extends TelemetryBase {\n constructor(opts?: {\n apiKey?: string;\n sender?: any;\n batchSize?: number;\n flushIntervalMs?: number;\n endpoint?: string;\n captureConsole?: boolean;\n debug?: boolean;\n }) {\n setDebug(opts?.debug ?? false); // gate SDK console noise before anything logs (#23)\n super();\n\n debug.log(\"🌍 Running Web Telemetry\");\n\n this.instancePromise = (async () => {\n const { Telemetry } = await import(\"./core/telemetry\");\n const { webSender } = await import(\"./adapters/webSender\");\n\n const { DeviceInfoTrackerWeb } = await import(\"./adapters/web/deviceInfo.web\");\n const { NetworkInfoTrackerWeb } = await import(\"./adapters/web/networkInfo.web\");\n const deviceInfoTrackerWeb = new DeviceInfoTrackerWeb();\n const networkInfoTrackerWeb = new NetworkInfoTrackerWeb();\n\n const sender = opts?.sender ?? webSender(opts?.endpoint, opts?.apiKey);\n\n const telemetry = new Telemetry({\n sender,\n batchSize: opts?.batchSize,\n flushIntervalMs: opts?.flushIntervalMs,\n endpoint: opts?.endpoint,\n // no id suffix on web: the contract suffix is ios|android only.\n // device.platform=\"web\" still rides as an attribute from the adapter.\n deviceInfoHandler: deviceInfoTrackerWeb,\n networkInfoHandler: networkInfoTrackerWeb,\n });\n\n return telemetry;\n })();\n\n // session.started on init (#29). Background/foreground via AppState is native-only.\n this.startSessionOnInit().catch(err => debug.warn(\"Web startSession failed:\", err));\n\n this.trackErrors({ captureConsole: opts?.captureConsole }).catch(err => {\n debug.warn(\"Web trackErrors failed:\", err);\n });\n\n this.trackFrameDrops().catch(err => {\n debug.log(\"Web trackFrameDrops errors\", err);\n });\n this.trackNetworkRequests().catch(err => {\n debug.log(\"Web trackNetworkRequests errors\", err);\n });\n this.trackMemoryUsage().catch(err => {\n debug.log(\"Web trackMemoryUsage errors\", err);\n });\n this.autoTrackNavigation().catch(err => {\n debug.log(\"Web autoTrackNavigation errors\", err);\n });\n this.attachAppLifecycle().catch(err => {\n debug.log(\"Web attachAppLifecycle errors\", err);\n });\n }\n\n // app_lifecycle on tab visibility change — web equivalent of native AppState (#30)\n async attachAppLifecycle() {\n if (typeof document === \"undefined\") return;\n const inst = await this.instancePromise;\n const { AppLifecycleEmitter } = await import(\"./adapters/appLifecycle\");\n const emitter = new AppLifecycleEmitter(inst);\n emitter.onState(document.visibilityState === \"visible\"); // seed current state\n document.addEventListener(\"visibilitychange\", () =>\n emitter.onState(document.visibilityState === \"visible\"));\n }\n\n // Web uses the web crash handler (window.onerror/onunhandledrejection), not the native one.\n async trackErrors(options?: { captureConsole?: boolean }) {\n const { CrashHandler } = await import(\"./adapters/web/crashHandler.web\");\n const inst = await this.instancePromise;\n const crashHandler = new CrashHandler(inst);\n return inst.trackErrors(crashHandler, options);\n }\n\n private async startSessionOnInit() {\n const inst = await this.instancePromise;\n await inst.startSession();\n }\n\n async trackFrameDrops() {\n const { FrameDropTrackerWeb } = await import(\"./adapters/web/frameDropsWeb.web\");\n const inst = await this.instancePromise;\n const frameDropTracker = new FrameDropTrackerWeb(inst);\n return inst.trackFrameDrops(frameDropTracker);\n }\n\n async trackNetworkRequests() {\n const { NetworkTrackerWeb } = await import(\"./adapters/web/interceptFetchWeb.web\");\n const inst = await this.instancePromise;\n const networkTracker = new NetworkTrackerWeb(inst);\n return inst.trackNetworkRequests(networkTracker);\n }\n\n async trackMemoryUsage() {\n const { TelemetryMemoryUsageWeb } = await import(\"./adapters/web/memoryWeb.web\");\n const inst = await this.instancePromise;\n const memoryTracker = new TelemetryMemoryUsageWeb(inst);\n return inst.trackMemoryUsage(memoryTracker);\n }\n\n async autoTrackNavigation() {\n const { NavigationTrackerWeb } = await import(\"./adapters/web/navigationWeb.web\");\n const inst = await this.instancePromise;\n const navigationTracker = new NavigationTrackerWeb(inst);\n return inst.start(navigationTracker);\n }\n\n async getDeviceInfo() {\n const { DeviceInfoTrackerWeb } = await import(\"./adapters/web/deviceInfo.web\");\n const inst = await this.instancePromise;\n const deviceInfoTrackerWeb = new DeviceInfoTrackerWeb();\n return inst.getDeviceInfo(deviceInfoTrackerWeb);\n }\n\n async getNetworkInfo() {\n const { NetworkInfoTrackerWeb } = await import(\"./adapters/web/networkInfo.web\");\n const inst = await this.instancePromise;\n const networkInfoTrackerWeb = new NetworkInfoTrackerWeb();\n return inst.getNetworkInfo(networkInfoTrackerWeb);\n }\n}\n"],"names":["assertApiKey","apiKey","createTelemetry","opts","TelemetryWeb","TelemetryBase","setDebug","debug","Telemetry","webSender","DeviceInfoTrackerWeb","NetworkInfoTrackerWeb","deviceInfoTrackerWeb","networkInfoTrackerWeb","sender","err","inst","AppLifecycleEmitter","emitter","options","CrashHandler","crashHandler","FrameDropTrackerWeb","frameDropTracker","NetworkTrackerWeb","networkTracker","TelemetryMemoryUsageWeb","memoryTracker","NavigationTrackerWeb","navigationTracker"],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
class o {
|
|
2
|
+
constructor(e) {
|
|
3
|
+
this.telemetry = e;
|
|
4
|
+
}
|
|
5
|
+
record(e = "tap", r) {
|
|
6
|
+
const t = this.telemetry.currentScreen;
|
|
7
|
+
return this.telemetry.log("user.interaction", {
|
|
8
|
+
"interaction.type": e,
|
|
9
|
+
...t ? { "interaction.screen": t } : {},
|
|
10
|
+
...r
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
// Spread onto the app root <View>: each tap → user.interaction, gesture never stolen.
|
|
14
|
+
responderProps() {
|
|
15
|
+
return {
|
|
16
|
+
onStartShouldSetResponderCapture: () => (this.record("tap"), !1)
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export {
|
|
21
|
+
o as InteractionEmitter
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=interaction-CH8yoY5-.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interaction-CH8yoY5-.js","sources":["../src/adapters/interaction.ts"],"sourcesContent":["import { Telemetry } from \"../core/telemetry\";\n\n/**\n * Best-effort native tap capture → v3 `user.interaction` (#33). No DOM `target_tag`/\n * `target_class` — those are web-only; their absence on native is intentional, not an error.\n *\n * RN has no global tap stream, so `responderProps()` returns a top-level responder-capture\n * handler the consumer spreads onto their app root <View>. It records the tap and returns\n * false, so it observes the gesture without ever claiming it.\n */\nexport class InteractionEmitter {\n constructor(private telemetry: Telemetry) {}\n\n record(type: string = \"tap\", extra?: Record<string, any>): Promise<void> {\n const screen = (this.telemetry as any).currentScreen;\n return this.telemetry.log(\"user.interaction\", {\n \"interaction.type\": type,\n ...(screen ? { \"interaction.screen\": screen } : {}),\n ...extra,\n });\n }\n\n // Spread onto the app root <View>: each tap → user.interaction, gesture never stolen.\n responderProps() {\n return {\n onStartShouldSetResponderCapture: () => {\n this.record(\"tap\");\n return false;\n },\n };\n }\n}\n"],"names":["InteractionEmitter","telemetry","type","extra","screen"],"mappings":"AAUO,MAAMA,EAAmB;AAAA,EAC9B,YAAoBC,GAAsB;AAAtB,SAAA,YAAAA;AAAA,EAAuB;AAAA,EAE3C,OAAOC,IAAe,OAAOC,GAA4C;AACvE,UAAMC,IAAU,KAAK,UAAkB;AACvC,WAAO,KAAK,UAAU,IAAI,oBAAoB;AAAA,MAC5C,oBAAoBF;AAAA,MACpB,GAAIE,IAAS,EAAE,sBAAsBA,EAAA,IAAW,CAAA;AAAA,MAChD,GAAGD;AAAA,IAAA,CACJ;AAAA,EACH;AAAA;AAAA,EAGA,iBAAiB;AACf,WAAO;AAAA,MACL,kCAAkC,OAChC,KAAK,OAAO,KAAK,GACV;AAAA,IACT;AAAA,EAEJ;AACF;"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});class n{constructor(e){this.telemetry=e}record(e="tap",r){const t=this.telemetry.currentScreen;return this.telemetry.log("user.interaction",{"interaction.type":e,...t?{"interaction.screen":t}:{},...r})}responderProps(){return{onStartShouldSetResponderCapture:()=>(this.record("tap"),!1)}}}exports.InteractionEmitter=n;
|
|
2
|
+
//# sourceMappingURL=interaction-DcNFBW7a.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interaction-DcNFBW7a.cjs","sources":["../src/adapters/interaction.ts"],"sourcesContent":["import { Telemetry } from \"../core/telemetry\";\n\n/**\n * Best-effort native tap capture → v3 `user.interaction` (#33). No DOM `target_tag`/\n * `target_class` — those are web-only; their absence on native is intentional, not an error.\n *\n * RN has no global tap stream, so `responderProps()` returns a top-level responder-capture\n * handler the consumer spreads onto their app root <View>. It records the tap and returns\n * false, so it observes the gesture without ever claiming it.\n */\nexport class InteractionEmitter {\n constructor(private telemetry: Telemetry) {}\n\n record(type: string = \"tap\", extra?: Record<string, any>): Promise<void> {\n const screen = (this.telemetry as any).currentScreen;\n return this.telemetry.log(\"user.interaction\", {\n \"interaction.type\": type,\n ...(screen ? { \"interaction.screen\": screen } : {}),\n ...extra,\n });\n }\n\n // Spread onto the app root <View>: each tap → user.interaction, gesture never stolen.\n responderProps() {\n return {\n onStartShouldSetResponderCapture: () => {\n this.record(\"tap\");\n return false;\n },\n };\n }\n}\n"],"names":["InteractionEmitter","telemetry","type","extra","screen"],"mappings":"gFAUO,MAAMA,CAAmB,CAC9B,YAAoBC,EAAsB,CAAtB,KAAA,UAAAA,CAAuB,CAE3C,OAAOC,EAAe,MAAOC,EAA4C,CACvE,MAAMC,EAAU,KAAK,UAAkB,cACvC,OAAO,KAAK,UAAU,IAAI,mBAAoB,CAC5C,mBAAoBF,EACpB,GAAIE,EAAS,CAAE,qBAAsBA,CAAA,EAAW,CAAA,EAChD,GAAGD,CAAA,CACJ,CACH,CAGA,gBAAiB,CACf,MAAO,CACL,iCAAkC,KAChC,KAAK,OAAO,KAAK,EACV,GACT,CAEJ,CACF"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { b as d } from "./httpAttributes-BV50UKQU.js";
|
|
2
|
+
class b {
|
|
3
|
+
constructor(r) {
|
|
4
|
+
this.telemetry = r, this.originalFetch = global.fetch.bind(global);
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Starts intercepting global fetch requests.
|
|
8
|
+
* Wraps `global.fetch` with telemetry logging.
|
|
9
|
+
*
|
|
10
|
+
* @returns Promise<void> resolves immediately after interception is set up.
|
|
11
|
+
*/
|
|
12
|
+
start() {
|
|
13
|
+
return new Promise((r) => {
|
|
14
|
+
global.fetch = async (e, o) => {
|
|
15
|
+
const i = Date.now();
|
|
16
|
+
let t = null, n = null;
|
|
17
|
+
try {
|
|
18
|
+
return t = await this.originalFetch(e, o), t;
|
|
19
|
+
} catch (s) {
|
|
20
|
+
throw n = s, s;
|
|
21
|
+
} finally {
|
|
22
|
+
const c = Date.now() - i, l = typeof e == "string" ? e : e.toString(), a = this.telemetry.getEndpoint?.();
|
|
23
|
+
if (!(a && l.startsWith(a))) {
|
|
24
|
+
const h = t ? Number(t.headers.get("content-length") ?? 0) : 0;
|
|
25
|
+
this.telemetry.log("http.request", d({
|
|
26
|
+
url: l,
|
|
27
|
+
method: o?.method ?? "GET",
|
|
28
|
+
statusCode: t?.status ?? 0,
|
|
29
|
+
durationMs: c,
|
|
30
|
+
error: n,
|
|
31
|
+
requestBody: o?.body,
|
|
32
|
+
responseSize: h
|
|
33
|
+
}));
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}, r();
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Restores the original fetch function, removing the interception.
|
|
41
|
+
*/
|
|
42
|
+
stop() {
|
|
43
|
+
global.fetch = this.originalFetch;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
export {
|
|
47
|
+
b as NetworkTrackerNative
|
|
48
|
+
};
|
|
49
|
+
//# sourceMappingURL=interceptFetchNative.native-VlhtMG-U.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interceptFetchNative.native-VlhtMG-U.js","sources":["../src/adapters/native/interceptFetchNative.native.ts"],"sourcesContent":["import { Telemetry } from \"../../core/telemetry\";\nimport { buildHttpAttributes } from \"../httpAttributes\";\n\n/**\n * Intercepts global `fetch` calls in React Native to log detailed telemetry data\n * about network requests, including timing, method, status, payload sizes, and errors.\n *\n * Use the `start()` method to begin interception.\n */\nexport class NetworkTrackerNative {\n private originalFetch: typeof fetch;\n\n constructor(private telemetry: Telemetry) {\n this.originalFetch = global.fetch.bind(global);\n }\n\n /**\n * Starts intercepting global fetch requests.\n * Wraps `global.fetch` with telemetry logging.\n *\n * @returns Promise<void> resolves immediately after interception is set up.\n */\n public start(): Promise<void> {\n return new Promise((resolve) => {\n global.fetch = async (\n input: string | URL | Request,\n init?: RequestInit\n ): Promise<Response> => {\n const start = Date.now();\n let response: Response | null = null;\n let error: unknown = null;\n\n try {\n response = await this.originalFetch(input, init);\n return response;\n } catch (err) {\n error = err;\n throw err;\n } finally {\n const end = Date.now();\n const durationMs = end - start;\n\n const url = typeof input === \"string\" ? input : input.toString();\n\n // Never self-capture the SDK's own collector POST\n const endpoint = this.telemetry.getEndpoint?.();\n if (!(endpoint && url.startsWith(endpoint))) {\n const responseSize = response\n ? Number(response.headers.get(\"content-length\") ?? 0)\n : 0;\n\n this.telemetry.log(\"http.request\", buildHttpAttributes({\n url,\n method: init?.method ?? \"GET\",\n statusCode: response?.status ?? 0,\n durationMs,\n error,\n requestBody: init?.body,\n responseSize,\n }));\n }\n }\n };\n\n resolve();\n });\n }\n\n /**\n * Restores the original fetch function, removing the interception.\n */\n public stop(): void {\n global.fetch = this.originalFetch;\n }\n}\n"],"names":["NetworkTrackerNative","telemetry","resolve","input","init","start","response","error","err","durationMs","url","endpoint","responseSize","buildHttpAttributes"],"mappings":";AASO,MAAMA,EAAqB;AAAA,EAG9B,YAAoBC,GAAsB;AAAtB,SAAA,YAAAA,GAChB,KAAK,gBAAgB,OAAO,MAAM,KAAK,MAAM;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,QAAuB;AAC1B,WAAO,IAAI,QAAQ,CAACC,MAAY;AAC5B,aAAO,QAAQ,OACXC,GACAC,MACoB;AACpB,cAAMC,IAAQ,KAAK,IAAA;AACnB,YAAIC,IAA4B,MAC5BC,IAAiB;AAErB,YAAI;AACA,iBAAAD,IAAW,MAAM,KAAK,cAAcH,GAAOC,CAAI,GACxCE;AAAA,QACX,SAASE,GAAK;AACV,gBAAAD,IAAQC,GACFA;AAAA,QACV,UAAA;AAEI,gBAAMC,IADM,KAAK,IAAA,IACQJ,GAEnBK,IAAM,OAAOP,KAAU,WAAWA,IAAQA,EAAM,SAAA,GAGhDQ,IAAW,KAAK,UAAU,cAAA;AAChC,cAAI,EAAEA,KAAYD,EAAI,WAAWC,CAAQ,IAAI;AACzC,kBAAMC,IAAeN,IACf,OAAOA,EAAS,QAAQ,IAAI,gBAAgB,KAAK,CAAC,IAClD;AAEN,iBAAK,UAAU,IAAI,gBAAgBO,EAAoB;AAAA,cACnD,KAAAH;AAAA,cACA,QAAQN,GAAM,UAAU;AAAA,cACxB,YAAYE,GAAU,UAAU;AAAA,cAChC,YAAAG;AAAA,cACA,OAAAF;AAAA,cACA,aAAaH,GAAM;AAAA,cACnB,cAAAQ;AAAA,YAAA,CACH,CAAC;AAAA,UACN;AAAA,QACJ;AAAA,MACJ,GAEAV,EAAA;AAAA,IACJ,CAAC;AAAA,EACL;AAAA;AAAA;AAAA;AAAA,EAKO,OAAa;AAChB,WAAO,QAAQ,KAAK;AAAA,EACxB;AACJ;"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const u=require("./httpAttributes-xXOD9trQ.cjs");class d{constructor(r){this.telemetry=r,this.originalFetch=global.fetch.bind(global)}start(){return new Promise(r=>{global.fetch=async(e,o)=>{const i=Date.now();let t=null,n=null;try{return t=await this.originalFetch(e,o),t}catch(s){throw n=s,s}finally{const c=Date.now()-i,l=typeof e=="string"?e:e.toString(),a=this.telemetry.getEndpoint?.();if(!(a&&l.startsWith(a))){const h=t?Number(t.headers.get("content-length")??0):0;this.telemetry.log("http.request",u.buildHttpAttributes({url:l,method:o?.method??"GET",statusCode:t?.status??0,durationMs:c,error:n,requestBody:o?.body,responseSize:h}))}}},r()})}stop(){global.fetch=this.originalFetch}}exports.NetworkTrackerNative=d;
|
|
2
|
+
//# sourceMappingURL=interceptFetchNative.native-jEAldH14.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interceptFetchNative.native-jEAldH14.cjs","sources":["../src/adapters/native/interceptFetchNative.native.ts"],"sourcesContent":["import { Telemetry } from \"../../core/telemetry\";\nimport { buildHttpAttributes } from \"../httpAttributes\";\n\n/**\n * Intercepts global `fetch` calls in React Native to log detailed telemetry data\n * about network requests, including timing, method, status, payload sizes, and errors.\n *\n * Use the `start()` method to begin interception.\n */\nexport class NetworkTrackerNative {\n private originalFetch: typeof fetch;\n\n constructor(private telemetry: Telemetry) {\n this.originalFetch = global.fetch.bind(global);\n }\n\n /**\n * Starts intercepting global fetch requests.\n * Wraps `global.fetch` with telemetry logging.\n *\n * @returns Promise<void> resolves immediately after interception is set up.\n */\n public start(): Promise<void> {\n return new Promise((resolve) => {\n global.fetch = async (\n input: string | URL | Request,\n init?: RequestInit\n ): Promise<Response> => {\n const start = Date.now();\n let response: Response | null = null;\n let error: unknown = null;\n\n try {\n response = await this.originalFetch(input, init);\n return response;\n } catch (err) {\n error = err;\n throw err;\n } finally {\n const end = Date.now();\n const durationMs = end - start;\n\n const url = typeof input === \"string\" ? input : input.toString();\n\n // Never self-capture the SDK's own collector POST\n const endpoint = this.telemetry.getEndpoint?.();\n if (!(endpoint && url.startsWith(endpoint))) {\n const responseSize = response\n ? Number(response.headers.get(\"content-length\") ?? 0)\n : 0;\n\n this.telemetry.log(\"http.request\", buildHttpAttributes({\n url,\n method: init?.method ?? \"GET\",\n statusCode: response?.status ?? 0,\n durationMs,\n error,\n requestBody: init?.body,\n responseSize,\n }));\n }\n }\n };\n\n resolve();\n });\n }\n\n /**\n * Restores the original fetch function, removing the interception.\n */\n public stop(): void {\n global.fetch = this.originalFetch;\n }\n}\n"],"names":["NetworkTrackerNative","telemetry","resolve","input","init","start","response","error","err","durationMs","url","endpoint","responseSize","buildHttpAttributes"],"mappings":"iIASO,MAAMA,CAAqB,CAG9B,YAAoBC,EAAsB,CAAtB,KAAA,UAAAA,EAChB,KAAK,cAAgB,OAAO,MAAM,KAAK,MAAM,CACjD,CAQO,OAAuB,CAC1B,OAAO,IAAI,QAASC,GAAY,CAC5B,OAAO,MAAQ,MACXC,EACAC,IACoB,CACpB,MAAMC,EAAQ,KAAK,IAAA,EACnB,IAAIC,EAA4B,KAC5BC,EAAiB,KAErB,GAAI,CACA,OAAAD,EAAW,MAAM,KAAK,cAAcH,EAAOC,CAAI,EACxCE,CACX,OAASE,EAAK,CACV,MAAAD,EAAQC,EACFA,CACV,QAAA,CAEI,MAAMC,EADM,KAAK,IAAA,EACQJ,EAEnBK,EAAM,OAAOP,GAAU,SAAWA,EAAQA,EAAM,SAAA,EAGhDQ,EAAW,KAAK,UAAU,cAAA,EAChC,GAAI,EAAEA,GAAYD,EAAI,WAAWC,CAAQ,GAAI,CACzC,MAAMC,EAAeN,EACf,OAAOA,EAAS,QAAQ,IAAI,gBAAgB,GAAK,CAAC,EAClD,EAEN,KAAK,UAAU,IAAI,eAAgBO,EAAAA,oBAAoB,CACnD,IAAAH,EACA,OAAQN,GAAM,QAAU,MACxB,WAAYE,GAAU,QAAU,EAChC,WAAAG,EACA,MAAAF,EACA,YAAaH,GAAM,KACnB,aAAAQ,CAAA,CACH,CAAC,CACN,CACJ,CACJ,EAEAV,EAAA,CACJ,CAAC,CACL,CAKO,MAAa,CAChB,OAAO,MAAQ,KAAK,aACxB,CACJ"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const p=require("./httpAttributes-xXOD9trQ.cjs");class g{constructor(o){this.telemetry=o}start(){return new Promise(o=>{const n=this.telemetry,c=window.fetch;if(window.fetch=async(r,t)=>{const u=Date.now();let e=null,s=null;try{return e=await c(r,t),e}catch(i){throw s=i,i}finally{const i=Date.now(),a=typeof r=="string"?r:r.toString(),d=n.getEndpoint?.();if(!(d&&a.startsWith(d))){const y=e?Number(e.headers.get("content-length")??0):0;n.log("http.request",p.buildHttpAttributes({url:a,method:t?.method??"GET",statusCode:e?.status??0,durationMs:i-u,error:s,requestBody:t?.body,responseSize:y}))}}},typeof XMLHttpRequest>"u"){o();return}const l=XMLHttpRequest.prototype.open,h=XMLHttpRequest.prototype.send;XMLHttpRequest.prototype.open=function(r,t,u,e,s){return this._telemetry={method:r,url:t,start:0},l.apply(this,arguments)},XMLHttpRequest.prototype.send=function(r){const t=this._telemetry;return t.start=Date.now(),this.addEventListener("loadend",()=>{const u=Date.now()-t.start,e=n.getEndpoint?.();if(e&&String(t.url).startsWith(e))return;const s=Number(this.getResponseHeader("content-length")??0);n.log("http.request",p.buildHttpAttributes({url:t.url,method:t.method,statusCode:this.status,durationMs:u,error:this.status===0?"Network error":null,requestBody:r,responseSize:s}))}),h.apply(this,arguments)},o()})}}exports.NetworkTrackerWeb=g;
|
|
2
|
+
//# sourceMappingURL=interceptFetchWeb.web-DFzZliik.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interceptFetchWeb.web-DFzZliik.cjs","sources":["../src/adapters/web/interceptFetchWeb.web.ts"],"sourcesContent":["// interceptHttp.web.ts\nimport { Telemetry } from \"../../core/telemetry\";\nimport { buildHttpAttributes } from \"../httpAttributes\";\n\n/**\n * NetworkTrackerWeb intercepts all HTTP requests made through\n * `window.fetch` and `XMLHttpRequest` in a browser environment.\n * \n * It logs detailed telemetry data such as request URL, HTTP method,\n * response status, request and response body sizes, request duration,\n * and error information, if any.\n * \n * This class should be instantiated once and the `start` method called\n * during application initialization to begin interception.\n */\nexport class NetworkTrackerWeb {\n private telemetry: Telemetry;\n\n /**\n * Create a NetworkTrackerWeb instance.\n * @param telemetry - An instance of Telemetry used for logging network events.\n */\n constructor(telemetry: Telemetry) {\n this.telemetry = telemetry;\n }\n\n /**\n * Starts intercepting HTTP requests made through `fetch` and `XMLHttpRequest`.\n * \n * This method patches the global `fetch` function and `XMLHttpRequest` methods\n * `open` and `send` to gather telemetry and log it asynchronously.\n * \n * @returns A Promise that resolves immediately once interception is setup.\n */\n public start(): Promise<void> {\n return new Promise((resolve) => {\n // Capture telemetry instance to use inside patched functions\n const telemetry = this.telemetry;\n\n // --- Patch window.fetch ---\n const originalFetch = window.fetch;\n window.fetch = async (\n input: RequestInfo | URL,\n init?: RequestInit\n ): Promise<Response> => {\n const start = Date.now();\n let response: Response | null = null;\n let error: any = null;\n\n try {\n response = await originalFetch(input, init);\n return response;\n } catch (err) {\n error = err;\n throw err;\n } finally {\n const end = Date.now();\n const url = typeof input === \"string\" ? input : input.toString();\n\n // Never self-capture the SDK's own collector POST\n const endpoint = telemetry.getEndpoint?.();\n if (!(endpoint && url.startsWith(endpoint))) {\n const responseSize = response\n ? Number(response.headers.get(\"content-length\") ?? 0)\n : 0;\n\n telemetry.log(\"http.request\", buildHttpAttributes({\n url,\n method: init?.method ?? \"GET\",\n statusCode: response?.status ?? 0,\n durationMs: end - start,\n error,\n requestBody: init?.body,\n responseSize,\n }));\n }\n }\n };\n\n // --- Patch XMLHttpRequest methods (absent in some RN-Web runtimes) ---\n if (typeof XMLHttpRequest === \"undefined\") { resolve(); return; }\n const origOpen = XMLHttpRequest.prototype.open;\n const origSend = XMLHttpRequest.prototype.send;\n\n /**\n * Patch XMLHttpRequest.open to capture HTTP method and URL.\n * Stores telemetry data on the XMLHttpRequest instance.\n */\n XMLHttpRequest.prototype.open = function (\n method: string,\n url: string,\n async?: boolean,\n user?: string | null,\n password?: string | null\n ) {\n // Store telemetry info on the xhr instance\n (this as any)._telemetry = {\n method,\n url,\n start: 0,\n };\n return origOpen.apply(this, arguments as any);\n };\n\n /**\n * Patch XMLHttpRequest.send to start timing and listen for completion.\n * Logs telemetry when the request finishes.\n */\n XMLHttpRequest.prototype.send = function (body?: Document | BodyInit | null) {\n const t = (this as any)._telemetry;\n t.start = Date.now();\n\n this.addEventListener(\"loadend\", () => {\n const durationMs = Date.now() - t.start;\n\n // Never self-capture the SDK's own collector POST\n const endpoint = telemetry.getEndpoint?.();\n if (endpoint && String(t.url).startsWith(endpoint)) return;\n\n const responseSize = Number(this.getResponseHeader(\"content-length\") ?? 0);\n\n telemetry.log(\"http.request\", buildHttpAttributes({\n url: t.url,\n method: t.method,\n statusCode: this.status,\n durationMs,\n error: this.status === 0 ? \"Network error\" : null,\n requestBody: body,\n responseSize,\n }));\n });\n\n return origSend.apply(this, arguments as any);\n };\n\n // Resolve immediately since interception setup is synchronous\n resolve();\n });\n }\n}\n"],"names":["NetworkTrackerWeb","telemetry","resolve","originalFetch","input","init","start","response","error","err","end","url","endpoint","responseSize","buildHttpAttributes","origOpen","origSend","method","async","user","password","body","durationMs"],"mappings":"iIAeO,MAAMA,CAAkB,CAO3B,YAAYC,EAAsB,CAC9B,KAAK,UAAYA,CACrB,CAUO,OAAuB,CAC1B,OAAO,IAAI,QAASC,GAAY,CAE5B,MAAMD,EAAY,KAAK,UAGjBE,EAAgB,OAAO,MAwC7B,GAvCA,OAAO,MAAQ,MACXC,EACAC,IACoB,CACpB,MAAMC,EAAQ,KAAK,IAAA,EACnB,IAAIC,EAA4B,KAC5BC,EAAa,KAEjB,GAAI,CACA,OAAAD,EAAW,MAAMJ,EAAcC,EAAOC,CAAI,EACnCE,CACX,OAASE,EAAK,CACV,MAAAD,EAAQC,EACFA,CACV,QAAA,CACI,MAAMC,EAAM,KAAK,IAAA,EACXC,EAAM,OAAOP,GAAU,SAAWA,EAAQA,EAAM,SAAA,EAGhDQ,EAAWX,EAAU,cAAA,EAC3B,GAAI,EAAEW,GAAYD,EAAI,WAAWC,CAAQ,GAAI,CACzC,MAAMC,EAAeN,EACf,OAAOA,EAAS,QAAQ,IAAI,gBAAgB,GAAK,CAAC,EAClD,EAENN,EAAU,IAAI,eAAgBa,sBAAoB,CAC9C,IAAAH,EACA,OAAQN,GAAM,QAAU,MACxB,WAAYE,GAAU,QAAU,EAChC,WAAYG,EAAMJ,EAClB,MAAAE,EACA,YAAaH,GAAM,KACnB,aAAAQ,CAAA,CACH,CAAC,CACN,CACJ,CACJ,EAGI,OAAO,eAAmB,IAAa,CAAEX,EAAA,EAAW,MAAQ,CAChE,MAAMa,EAAW,eAAe,UAAU,KACpCC,EAAW,eAAe,UAAU,KAM1C,eAAe,UAAU,KAAO,SAC5BC,EACAN,EACAO,EACAC,EACAC,EACF,CAEG,YAAa,WAAa,CACvB,OAAAH,EACA,IAAAN,EACA,MAAO,CAAA,EAEJI,EAAS,MAAM,KAAM,SAAgB,CAChD,EAMA,eAAe,UAAU,KAAO,SAAUM,EAAmC,CACzE,MAAM,EAAK,KAAa,WACxB,SAAE,MAAQ,KAAK,IAAA,EAEf,KAAK,iBAAiB,UAAW,IAAM,CACnC,MAAMC,EAAa,KAAK,IAAA,EAAQ,EAAE,MAG5BV,EAAWX,EAAU,cAAA,EAC3B,GAAIW,GAAY,OAAO,EAAE,GAAG,EAAE,WAAWA,CAAQ,EAAG,OAEpD,MAAMC,EAAe,OAAO,KAAK,kBAAkB,gBAAgB,GAAK,CAAC,EAEzEZ,EAAU,IAAI,eAAgBa,sBAAoB,CAC9C,IAAK,EAAE,IACP,OAAQ,EAAE,OACV,WAAY,KAAK,OACjB,WAAAQ,EACA,MAAO,KAAK,SAAW,EAAI,gBAAkB,KAC7C,YAAaD,EACb,aAAAR,CAAA,CACH,CAAC,CACN,CAAC,EAEMG,EAAS,MAAM,KAAM,SAAgB,CAChD,EAGAd,EAAA,CACJ,CAAC,CACL,CACJ"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { b as d } from "./httpAttributes-BV50UKQU.js";
|
|
2
|
+
class w {
|
|
3
|
+
/**
|
|
4
|
+
* Create a NetworkTrackerWeb instance.
|
|
5
|
+
* @param telemetry - An instance of Telemetry used for logging network events.
|
|
6
|
+
*/
|
|
7
|
+
constructor(o) {
|
|
8
|
+
this.telemetry = o;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Starts intercepting HTTP requests made through `fetch` and `XMLHttpRequest`.
|
|
12
|
+
*
|
|
13
|
+
* This method patches the global `fetch` function and `XMLHttpRequest` methods
|
|
14
|
+
* `open` and `send` to gather telemetry and log it asynchronously.
|
|
15
|
+
*
|
|
16
|
+
* @returns A Promise that resolves immediately once interception is setup.
|
|
17
|
+
*/
|
|
18
|
+
start() {
|
|
19
|
+
return new Promise((o) => {
|
|
20
|
+
const n = this.telemetry, c = window.fetch;
|
|
21
|
+
if (window.fetch = async (r, t) => {
|
|
22
|
+
const a = Date.now();
|
|
23
|
+
let e = null, s = null;
|
|
24
|
+
try {
|
|
25
|
+
return e = await c(r, t), e;
|
|
26
|
+
} catch (u) {
|
|
27
|
+
throw s = u, u;
|
|
28
|
+
} finally {
|
|
29
|
+
const u = Date.now(), i = typeof r == "string" ? r : r.toString(), p = n.getEndpoint?.();
|
|
30
|
+
if (!(p && i.startsWith(p))) {
|
|
31
|
+
const y = e ? Number(e.headers.get("content-length") ?? 0) : 0;
|
|
32
|
+
n.log("http.request", d({
|
|
33
|
+
url: i,
|
|
34
|
+
method: t?.method ?? "GET",
|
|
35
|
+
statusCode: e?.status ?? 0,
|
|
36
|
+
durationMs: u - a,
|
|
37
|
+
error: s,
|
|
38
|
+
requestBody: t?.body,
|
|
39
|
+
responseSize: y
|
|
40
|
+
}));
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}, typeof XMLHttpRequest > "u") {
|
|
44
|
+
o();
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
const l = XMLHttpRequest.prototype.open, h = XMLHttpRequest.prototype.send;
|
|
48
|
+
XMLHttpRequest.prototype.open = function(r, t, a, e, s) {
|
|
49
|
+
return this._telemetry = {
|
|
50
|
+
method: r,
|
|
51
|
+
url: t,
|
|
52
|
+
start: 0
|
|
53
|
+
}, l.apply(this, arguments);
|
|
54
|
+
}, XMLHttpRequest.prototype.send = function(r) {
|
|
55
|
+
const t = this._telemetry;
|
|
56
|
+
return t.start = Date.now(), this.addEventListener("loadend", () => {
|
|
57
|
+
const a = Date.now() - t.start, e = n.getEndpoint?.();
|
|
58
|
+
if (e && String(t.url).startsWith(e)) return;
|
|
59
|
+
const s = Number(this.getResponseHeader("content-length") ?? 0);
|
|
60
|
+
n.log("http.request", d({
|
|
61
|
+
url: t.url,
|
|
62
|
+
method: t.method,
|
|
63
|
+
statusCode: this.status,
|
|
64
|
+
durationMs: a,
|
|
65
|
+
error: this.status === 0 ? "Network error" : null,
|
|
66
|
+
requestBody: r,
|
|
67
|
+
responseSize: s
|
|
68
|
+
}));
|
|
69
|
+
}), h.apply(this, arguments);
|
|
70
|
+
}, o();
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
export {
|
|
75
|
+
w as NetworkTrackerWeb
|
|
76
|
+
};
|
|
77
|
+
//# sourceMappingURL=interceptFetchWeb.web-DfsMfoRP.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interceptFetchWeb.web-DfsMfoRP.js","sources":["../src/adapters/web/interceptFetchWeb.web.ts"],"sourcesContent":["// interceptHttp.web.ts\nimport { Telemetry } from \"../../core/telemetry\";\nimport { buildHttpAttributes } from \"../httpAttributes\";\n\n/**\n * NetworkTrackerWeb intercepts all HTTP requests made through\n * `window.fetch` and `XMLHttpRequest` in a browser environment.\n * \n * It logs detailed telemetry data such as request URL, HTTP method,\n * response status, request and response body sizes, request duration,\n * and error information, if any.\n * \n * This class should be instantiated once and the `start` method called\n * during application initialization to begin interception.\n */\nexport class NetworkTrackerWeb {\n private telemetry: Telemetry;\n\n /**\n * Create a NetworkTrackerWeb instance.\n * @param telemetry - An instance of Telemetry used for logging network events.\n */\n constructor(telemetry: Telemetry) {\n this.telemetry = telemetry;\n }\n\n /**\n * Starts intercepting HTTP requests made through `fetch` and `XMLHttpRequest`.\n * \n * This method patches the global `fetch` function and `XMLHttpRequest` methods\n * `open` and `send` to gather telemetry and log it asynchronously.\n * \n * @returns A Promise that resolves immediately once interception is setup.\n */\n public start(): Promise<void> {\n return new Promise((resolve) => {\n // Capture telemetry instance to use inside patched functions\n const telemetry = this.telemetry;\n\n // --- Patch window.fetch ---\n const originalFetch = window.fetch;\n window.fetch = async (\n input: RequestInfo | URL,\n init?: RequestInit\n ): Promise<Response> => {\n const start = Date.now();\n let response: Response | null = null;\n let error: any = null;\n\n try {\n response = await originalFetch(input, init);\n return response;\n } catch (err) {\n error = err;\n throw err;\n } finally {\n const end = Date.now();\n const url = typeof input === \"string\" ? input : input.toString();\n\n // Never self-capture the SDK's own collector POST\n const endpoint = telemetry.getEndpoint?.();\n if (!(endpoint && url.startsWith(endpoint))) {\n const responseSize = response\n ? Number(response.headers.get(\"content-length\") ?? 0)\n : 0;\n\n telemetry.log(\"http.request\", buildHttpAttributes({\n url,\n method: init?.method ?? \"GET\",\n statusCode: response?.status ?? 0,\n durationMs: end - start,\n error,\n requestBody: init?.body,\n responseSize,\n }));\n }\n }\n };\n\n // --- Patch XMLHttpRequest methods (absent in some RN-Web runtimes) ---\n if (typeof XMLHttpRequest === \"undefined\") { resolve(); return; }\n const origOpen = XMLHttpRequest.prototype.open;\n const origSend = XMLHttpRequest.prototype.send;\n\n /**\n * Patch XMLHttpRequest.open to capture HTTP method and URL.\n * Stores telemetry data on the XMLHttpRequest instance.\n */\n XMLHttpRequest.prototype.open = function (\n method: string,\n url: string,\n async?: boolean,\n user?: string | null,\n password?: string | null\n ) {\n // Store telemetry info on the xhr instance\n (this as any)._telemetry = {\n method,\n url,\n start: 0,\n };\n return origOpen.apply(this, arguments as any);\n };\n\n /**\n * Patch XMLHttpRequest.send to start timing and listen for completion.\n * Logs telemetry when the request finishes.\n */\n XMLHttpRequest.prototype.send = function (body?: Document | BodyInit | null) {\n const t = (this as any)._telemetry;\n t.start = Date.now();\n\n this.addEventListener(\"loadend\", () => {\n const durationMs = Date.now() - t.start;\n\n // Never self-capture the SDK's own collector POST\n const endpoint = telemetry.getEndpoint?.();\n if (endpoint && String(t.url).startsWith(endpoint)) return;\n\n const responseSize = Number(this.getResponseHeader(\"content-length\") ?? 0);\n\n telemetry.log(\"http.request\", buildHttpAttributes({\n url: t.url,\n method: t.method,\n statusCode: this.status,\n durationMs,\n error: this.status === 0 ? \"Network error\" : null,\n requestBody: body,\n responseSize,\n }));\n });\n\n return origSend.apply(this, arguments as any);\n };\n\n // Resolve immediately since interception setup is synchronous\n resolve();\n });\n }\n}\n"],"names":["NetworkTrackerWeb","telemetry","resolve","originalFetch","input","init","start","response","error","err","end","url","endpoint","responseSize","buildHttpAttributes","origOpen","origSend","method","async","user","password","body","durationMs"],"mappings":";AAeO,MAAMA,EAAkB;AAAA;AAAA;AAAA;AAAA;AAAA,EAO3B,YAAYC,GAAsB;AAC9B,SAAK,YAAYA;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUO,QAAuB;AAC1B,WAAO,IAAI,QAAQ,CAACC,MAAY;AAE5B,YAAMD,IAAY,KAAK,WAGjBE,IAAgB,OAAO;AAwC7B,UAvCA,OAAO,QAAQ,OACXC,GACAC,MACoB;AACpB,cAAMC,IAAQ,KAAK,IAAA;AACnB,YAAIC,IAA4B,MAC5BC,IAAa;AAEjB,YAAI;AACA,iBAAAD,IAAW,MAAMJ,EAAcC,GAAOC,CAAI,GACnCE;AAAA,QACX,SAASE,GAAK;AACV,gBAAAD,IAAQC,GACFA;AAAA,QACV,UAAA;AACI,gBAAMC,IAAM,KAAK,IAAA,GACXC,IAAM,OAAOP,KAAU,WAAWA,IAAQA,EAAM,SAAA,GAGhDQ,IAAWX,EAAU,cAAA;AAC3B,cAAI,EAAEW,KAAYD,EAAI,WAAWC,CAAQ,IAAI;AACzC,kBAAMC,IAAeN,IACf,OAAOA,EAAS,QAAQ,IAAI,gBAAgB,KAAK,CAAC,IAClD;AAEN,YAAAN,EAAU,IAAI,gBAAgBa,EAAoB;AAAA,cAC9C,KAAAH;AAAA,cACA,QAAQN,GAAM,UAAU;AAAA,cACxB,YAAYE,GAAU,UAAU;AAAA,cAChC,YAAYG,IAAMJ;AAAA,cAClB,OAAAE;AAAA,cACA,aAAaH,GAAM;AAAA,cACnB,cAAAQ;AAAA,YAAA,CACH,CAAC;AAAA,UACN;AAAA,QACJ;AAAA,MACJ,GAGI,OAAO,iBAAmB,KAAa;AAAE,QAAAX,EAAA;AAAW;AAAA,MAAQ;AAChE,YAAMa,IAAW,eAAe,UAAU,MACpCC,IAAW,eAAe,UAAU;AAM1C,qBAAe,UAAU,OAAO,SAC5BC,GACAN,GACAO,GACAC,GACAC,GACF;AAEG,oBAAa,aAAa;AAAA,UACvB,QAAAH;AAAA,UACA,KAAAN;AAAA,UACA,OAAO;AAAA,QAAA,GAEJI,EAAS,MAAM,MAAM,SAAgB;AAAA,MAChD,GAMA,eAAe,UAAU,OAAO,SAAUM,GAAmC;AACzE,cAAM,IAAK,KAAa;AACxB,iBAAE,QAAQ,KAAK,IAAA,GAEf,KAAK,iBAAiB,WAAW,MAAM;AACnC,gBAAMC,IAAa,KAAK,IAAA,IAAQ,EAAE,OAG5BV,IAAWX,EAAU,cAAA;AAC3B,cAAIW,KAAY,OAAO,EAAE,GAAG,EAAE,WAAWA,CAAQ,EAAG;AAEpD,gBAAMC,IAAe,OAAO,KAAK,kBAAkB,gBAAgB,KAAK,CAAC;AAEzE,UAAAZ,EAAU,IAAI,gBAAgBa,EAAoB;AAAA,YAC9C,KAAK,EAAE;AAAA,YACP,QAAQ,EAAE;AAAA,YACV,YAAY,KAAK;AAAA,YACjB,YAAAQ;AAAA,YACA,OAAO,KAAK,WAAW,IAAI,kBAAkB;AAAA,YAC7C,aAAaD;AAAA,YACb,cAAAR;AAAA,UAAA,CACH,CAAC;AAAA,QACN,CAAC,GAEMG,EAAS,MAAM,MAAM,SAAgB;AAAA,MAChD,GAGAd,EAAA;AAAA,IACJ,CAAC;AAAA,EACL;AACJ;"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { Platform as o } from "react-native";
|
|
2
|
+
function m() {
|
|
3
|
+
const r = global.performance;
|
|
4
|
+
return r && r.memory && typeof r.memory.usedJSHeapSize == "number" ? r.memory.usedJSHeapSize / (1024 * 1024) : null;
|
|
5
|
+
}
|
|
6
|
+
class l {
|
|
7
|
+
constructor(e) {
|
|
8
|
+
this.telemetry = e, this.intervalId = null;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Records a memory_usage metric (value = used heap MB) per sample, on the v3 metric path.
|
|
12
|
+
*/
|
|
13
|
+
recordMemoryUsage() {
|
|
14
|
+
const e = m();
|
|
15
|
+
if (e == null) return;
|
|
16
|
+
const t = e < 256 ? "low" : e < 512 ? "moderate" : "high";
|
|
17
|
+
this.telemetry.logMetric("memory_usage", e, {
|
|
18
|
+
"memory.usage_mb": e,
|
|
19
|
+
"memory.pressure_level": t,
|
|
20
|
+
"memory.unit": "MB",
|
|
21
|
+
"memory.type": "heap",
|
|
22
|
+
"memory.source": o.OS
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Starts periodic memory usage logging at the given interval.
|
|
27
|
+
* Returns a resolved Promise for async startup flows.
|
|
28
|
+
*
|
|
29
|
+
* @param intervalMs Sampling interval in milliseconds (default: 30s)
|
|
30
|
+
*/
|
|
31
|
+
start(e = 3e4) {
|
|
32
|
+
return new Promise((t) => {
|
|
33
|
+
this.recordMemoryUsage(), this.intervalId = setInterval(() => {
|
|
34
|
+
this.recordMemoryUsage();
|
|
35
|
+
}, e), t();
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Stops the periodic memory logging if it was started.
|
|
40
|
+
*/
|
|
41
|
+
stop() {
|
|
42
|
+
this.intervalId !== null && (clearInterval(this.intervalId), this.intervalId = null);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
export {
|
|
46
|
+
l as TelemetryMemoryUsageNative
|
|
47
|
+
};
|
|
48
|
+
//# sourceMappingURL=memoryNative.native-BWLh2S9L.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memoryNative.native-BWLh2S9L.js","sources":["../src/adapters/native/memoryNative.native.ts"],"sourcesContent":["// telemetryMemoryUsage.native.ts\nimport { Telemetry } from \"../../core/telemetry\";\nimport { Platform } from \"react-native\";\n\n/**\n * Attempts to retrieve JavaScript heap memory usage in MB.\n * Note: This is only supported on some JavaScript engines (e.g., Hermes).\n * Returns null if not available.\n */\nfunction getNativeMemoryUsage(): number | null {\n const perf: any = global.performance;\n if (perf && perf.memory && typeof perf.memory.usedJSHeapSize === \"number\") {\n return perf.memory.usedJSHeapSize / (1024 * 1024); // Convert bytes to MB\n }\n return null;\n}\n\ntype MemoryPressureLevel = \"low\" | \"moderate\" | \"high\";\n\n/**\n * Logs JavaScript memory usage and pressure level at regular intervals\n * in a React Native environment.\n */\nexport class TelemetryMemoryUsageNative {\n private intervalId: NodeJS.Timeout | null = null;\n\n constructor(private telemetry: Telemetry) { }\n\n /**\n * Records a memory_usage metric (value = used heap MB) per sample, on the v3 metric path.\n */\n recordMemoryUsage(): void {\n const usedMb = getNativeMemoryUsage();\n if (usedMb == null) return; // Skip if unsupported\n\n // Classify pressure level based on used heap memory (in MB)\n const pressureLevel: MemoryPressureLevel =\n usedMb < 256 ? \"low\" : usedMb < 512 ? \"moderate\" : \"high\";\n\n this.telemetry.logMetric(\"memory_usage\", usedMb, {\n \"memory.usage_mb\": usedMb,\n \"memory.pressure_level\": pressureLevel,\n \"memory.unit\": \"MB\",\n \"memory.type\": \"heap\",\n \"memory.source\": Platform.OS,\n });\n }\n\n /**\n * Starts periodic memory usage logging at the given interval.\n * Returns a resolved Promise for async startup flows.\n * \n * @param intervalMs Sampling interval in milliseconds (default: 30s)\n */\n start(intervalMs: number = 30000): Promise<void> {\n return new Promise((resolve) => {\n this.recordMemoryUsage();\n\n this.intervalId = setInterval(() => {\n this.recordMemoryUsage();\n }, intervalMs);\n\n resolve();\n });\n }\n\n /**\n * Stops the periodic memory logging if it was started.\n */\n stop(): void {\n if (this.intervalId !== null) {\n clearInterval(this.intervalId);\n this.intervalId = null;\n }\n }\n}\n"],"names":["getNativeMemoryUsage","perf","TelemetryMemoryUsageNative","telemetry","usedMb","pressureLevel","Platform","intervalMs","resolve"],"mappings":";AASA,SAASA,IAAsC;AAC3C,QAAMC,IAAY,OAAO;AACzB,SAAIA,KAAQA,EAAK,UAAU,OAAOA,EAAK,OAAO,kBAAmB,WACtDA,EAAK,OAAO,kBAAkB,OAAO,QAEzC;AACX;AAQO,MAAMC,EAA2B;AAAA,EAGpC,YAAoBC,GAAsB;AAAtB,SAAA,YAAAA,GAFpB,KAAQ,aAAoC;AAAA,EAEA;AAAA;AAAA;AAAA;AAAA,EAK5C,oBAA0B;AACtB,UAAMC,IAASJ,EAAA;AACf,QAAII,KAAU,KAAM;AAGpB,UAAMC,IACFD,IAAS,MAAM,QAAQA,IAAS,MAAM,aAAa;AAEvD,SAAK,UAAU,UAAU,gBAAgBA,GAAQ;AAAA,MAC7C,mBAAmBA;AAAA,MACnB,yBAAyBC;AAAA,MACzB,eAAe;AAAA,MACf,eAAe;AAAA,MACf,iBAAiBC,EAAS;AAAA,IAAA,CAC7B;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAMC,IAAqB,KAAsB;AAC7C,WAAO,IAAI,QAAQ,CAACC,MAAY;AAC5B,WAAK,kBAAA,GAEL,KAAK,aAAa,YAAY,MAAM;AAChC,aAAK,kBAAA;AAAA,MACT,GAAGD,CAAU,GAEbC,EAAA;AAAA,IACJ,CAAC;AAAA,EACL;AAAA;AAAA;AAAA;AAAA,EAKA,OAAa;AACT,IAAI,KAAK,eAAe,SACpB,cAAc,KAAK,UAAU,GAC7B,KAAK,aAAa;AAAA,EAE1B;AACJ;"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=require("react-native");function s(){const r=global.performance;return r&&r.memory&&typeof r.memory.usedJSHeapSize=="number"?r.memory.usedJSHeapSize/(1024*1024):null}class m{constructor(e){this.telemetry=e,this.intervalId=null}recordMemoryUsage(){const e=s();if(e==null)return;const t=e<256?"low":e<512?"moderate":"high";this.telemetry.logMetric("memory_usage",e,{"memory.usage_mb":e,"memory.pressure_level":t,"memory.unit":"MB","memory.type":"heap","memory.source":o.Platform.OS})}start(e=3e4){return new Promise(t=>{this.recordMemoryUsage(),this.intervalId=setInterval(()=>{this.recordMemoryUsage()},e),t()})}stop(){this.intervalId!==null&&(clearInterval(this.intervalId),this.intervalId=null)}}exports.TelemetryMemoryUsageNative=m;
|
|
2
|
+
//# sourceMappingURL=memoryNative.native-DCXSOd4Q.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memoryNative.native-DCXSOd4Q.cjs","sources":["../src/adapters/native/memoryNative.native.ts"],"sourcesContent":["// telemetryMemoryUsage.native.ts\nimport { Telemetry } from \"../../core/telemetry\";\nimport { Platform } from \"react-native\";\n\n/**\n * Attempts to retrieve JavaScript heap memory usage in MB.\n * Note: This is only supported on some JavaScript engines (e.g., Hermes).\n * Returns null if not available.\n */\nfunction getNativeMemoryUsage(): number | null {\n const perf: any = global.performance;\n if (perf && perf.memory && typeof perf.memory.usedJSHeapSize === \"number\") {\n return perf.memory.usedJSHeapSize / (1024 * 1024); // Convert bytes to MB\n }\n return null;\n}\n\ntype MemoryPressureLevel = \"low\" | \"moderate\" | \"high\";\n\n/**\n * Logs JavaScript memory usage and pressure level at regular intervals\n * in a React Native environment.\n */\nexport class TelemetryMemoryUsageNative {\n private intervalId: NodeJS.Timeout | null = null;\n\n constructor(private telemetry: Telemetry) { }\n\n /**\n * Records a memory_usage metric (value = used heap MB) per sample, on the v3 metric path.\n */\n recordMemoryUsage(): void {\n const usedMb = getNativeMemoryUsage();\n if (usedMb == null) return; // Skip if unsupported\n\n // Classify pressure level based on used heap memory (in MB)\n const pressureLevel: MemoryPressureLevel =\n usedMb < 256 ? \"low\" : usedMb < 512 ? \"moderate\" : \"high\";\n\n this.telemetry.logMetric(\"memory_usage\", usedMb, {\n \"memory.usage_mb\": usedMb,\n \"memory.pressure_level\": pressureLevel,\n \"memory.unit\": \"MB\",\n \"memory.type\": \"heap\",\n \"memory.source\": Platform.OS,\n });\n }\n\n /**\n * Starts periodic memory usage logging at the given interval.\n * Returns a resolved Promise for async startup flows.\n * \n * @param intervalMs Sampling interval in milliseconds (default: 30s)\n */\n start(intervalMs: number = 30000): Promise<void> {\n return new Promise((resolve) => {\n this.recordMemoryUsage();\n\n this.intervalId = setInterval(() => {\n this.recordMemoryUsage();\n }, intervalMs);\n\n resolve();\n });\n }\n\n /**\n * Stops the periodic memory logging if it was started.\n */\n stop(): void {\n if (this.intervalId !== null) {\n clearInterval(this.intervalId);\n this.intervalId = null;\n }\n }\n}\n"],"names":["getNativeMemoryUsage","perf","TelemetryMemoryUsageNative","telemetry","usedMb","pressureLevel","Platform","intervalMs","resolve"],"mappings":"gHASA,SAASA,GAAsC,CAC3C,MAAMC,EAAY,OAAO,YACzB,OAAIA,GAAQA,EAAK,QAAU,OAAOA,EAAK,OAAO,gBAAmB,SACtDA,EAAK,OAAO,gBAAkB,KAAO,MAEzC,IACX,CAQO,MAAMC,CAA2B,CAGpC,YAAoBC,EAAsB,CAAtB,KAAA,UAAAA,EAFpB,KAAQ,WAAoC,IAEA,CAK5C,mBAA0B,CACtB,MAAMC,EAASJ,EAAA,EACf,GAAII,GAAU,KAAM,OAGpB,MAAMC,EACFD,EAAS,IAAM,MAAQA,EAAS,IAAM,WAAa,OAEvD,KAAK,UAAU,UAAU,eAAgBA,EAAQ,CAC7C,kBAAmBA,EACnB,wBAAyBC,EACzB,cAAe,KACf,cAAe,OACf,gBAAiBC,EAAAA,SAAS,EAAA,CAC7B,CACL,CAQA,MAAMC,EAAqB,IAAsB,CAC7C,OAAO,IAAI,QAASC,GAAY,CAC5B,KAAK,kBAAA,EAEL,KAAK,WAAa,YAAY,IAAM,CAChC,KAAK,kBAAA,CACT,EAAGD,CAAU,EAEbC,EAAA,CACJ,CAAC,CACL,CAKA,MAAa,CACL,KAAK,aAAe,OACpB,cAAc,KAAK,UAAU,EAC7B,KAAK,WAAa,KAE1B,CACJ"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
function o() {
|
|
2
|
+
const r = performance;
|
|
3
|
+
return r && r.memory && typeof r.memory.usedJSHeapSize == "number" ? r.memory.usedJSHeapSize / (1024 * 1024) : null;
|
|
4
|
+
}
|
|
5
|
+
class m {
|
|
6
|
+
constructor(e) {
|
|
7
|
+
this.telemetry = e, this.intervalId = null;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Records a memory_usage metric (value = used heap MB) per sample, on the v3 metric path.
|
|
11
|
+
*/
|
|
12
|
+
recordMemoryUsage() {
|
|
13
|
+
const e = o();
|
|
14
|
+
if (e == null) return;
|
|
15
|
+
const t = e < 256 ? "low" : e < 512 ? "moderate" : "high";
|
|
16
|
+
this.telemetry.logMetric("memory_usage", e, {
|
|
17
|
+
"memory.usage_mb": e,
|
|
18
|
+
"memory.pressure_level": t,
|
|
19
|
+
"memory.unit": "MB",
|
|
20
|
+
"memory.type": "heap",
|
|
21
|
+
"memory.source": "performance.memory"
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Starts periodic memory usage logging at the specified interval.
|
|
26
|
+
* Returns a Promise that resolves immediately for async compatibility.
|
|
27
|
+
*
|
|
28
|
+
* @param intervalMs Interval in milliseconds between samples (default 30s)
|
|
29
|
+
* @returns Promise<void>
|
|
30
|
+
*/
|
|
31
|
+
start(e = 3e4) {
|
|
32
|
+
return new Promise((t) => {
|
|
33
|
+
this.recordMemoryUsage(), this.intervalId = window.setInterval(() => {
|
|
34
|
+
this.recordMemoryUsage();
|
|
35
|
+
}, e), t();
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Stops the periodic memory logging if running.
|
|
40
|
+
*/
|
|
41
|
+
stop() {
|
|
42
|
+
this.intervalId !== null && (clearInterval(this.intervalId), this.intervalId = null);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
export {
|
|
46
|
+
m as TelemetryMemoryUsageWeb
|
|
47
|
+
};
|
|
48
|
+
//# sourceMappingURL=memoryWeb.web-B3YuV-cB.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memoryWeb.web-B3YuV-cB.js","sources":["../src/adapters/web/memoryWeb.web.ts"],"sourcesContent":["import { Telemetry } from \"../../core/telemetry\";\n\n/**\n * Attempts to retrieve JavaScript heap memory usage in MB from the browser's\n * performance API. Returns null if unsupported.\n */\nfunction getWebMemoryUsage(): number | null {\n const perf: any = performance;\n if (perf && perf.memory && typeof perf.memory.usedJSHeapSize === \"number\") {\n return perf.memory.usedJSHeapSize / (1024 * 1024); // bytes to MB\n }\n return null;\n}\n\ntype MemoryPressureLevel = \"low\" | \"moderate\" | \"high\";\n\n/**\n * Logs JavaScript heap memory usage and pressure level at regular intervals\n * in browser environments using the Performance API.\n */\nexport class TelemetryMemoryUsageWeb {\n private intervalId: number | null = null;\n\n constructor(private telemetry: Telemetry) { }\n\n /**\n * Records a memory_usage metric (value = used heap MB) per sample, on the v3 metric path.\n */\n recordMemoryUsage(): void {\n const usedMb = getWebMemoryUsage();\n if (usedMb == null) return; // Unsupported in this browser\n\n // Define pressure levels based on used heap size (MB)\n const pressureLevel: MemoryPressureLevel =\n usedMb < 256 ? \"low\" : usedMb < 512 ? \"moderate\" : \"high\";\n\n this.telemetry.logMetric(\"memory_usage\", usedMb, {\n \"memory.usage_mb\": usedMb,\n \"memory.pressure_level\": pressureLevel,\n \"memory.unit\": \"MB\",\n \"memory.type\": \"heap\",\n \"memory.source\": \"performance.memory\",\n });\n }\n\n /**\n * Starts periodic memory usage logging at the specified interval.\n * Returns a Promise that resolves immediately for async compatibility.\n *\n * @param intervalMs Interval in milliseconds between samples (default 30s)\n * @returns Promise<void>\n */\n start(intervalMs: number = 30000): Promise<void> {\n return new Promise((resolve) => {\n this.recordMemoryUsage();\n\n this.intervalId = window.setInterval(() => {\n this.recordMemoryUsage();\n }, intervalMs);\n\n resolve();\n });\n }\n\n /**\n * Stops the periodic memory logging if running.\n */\n stop(): void {\n if (this.intervalId !== null) {\n clearInterval(this.intervalId);\n this.intervalId = null;\n }\n }\n}\n"],"names":["getWebMemoryUsage","perf","TelemetryMemoryUsageWeb","telemetry","usedMb","pressureLevel","intervalMs","resolve"],"mappings":"AAMA,SAASA,IAAmC;AACxC,QAAMC,IAAY;AAClB,SAAIA,KAAQA,EAAK,UAAU,OAAOA,EAAK,OAAO,kBAAmB,WACtDA,EAAK,OAAO,kBAAkB,OAAO,QAEzC;AACX;AAQO,MAAMC,EAAwB;AAAA,EAGjC,YAAoBC,GAAsB;AAAtB,SAAA,YAAAA,GAFpB,KAAQ,aAA4B;AAAA,EAEQ;AAAA;AAAA;AAAA;AAAA,EAK5C,oBAA0B;AACtB,UAAMC,IAASJ,EAAA;AACf,QAAII,KAAU,KAAM;AAGpB,UAAMC,IACFD,IAAS,MAAM,QAAQA,IAAS,MAAM,aAAa;AAEvD,SAAK,UAAU,UAAU,gBAAgBA,GAAQ;AAAA,MAC7C,mBAAmBA;AAAA,MACnB,yBAAyBC;AAAA,MACzB,eAAe;AAAA,MACf,eAAe;AAAA,MACf,iBAAiB;AAAA,IAAA,CACpB;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAMC,IAAqB,KAAsB;AAC7C,WAAO,IAAI,QAAQ,CAACC,MAAY;AAC5B,WAAK,kBAAA,GAEL,KAAK,aAAa,OAAO,YAAY,MAAM;AACvC,aAAK,kBAAA;AAAA,MACT,GAAGD,CAAU,GAEbC,EAAA;AAAA,IACJ,CAAC;AAAA,EACL;AAAA;AAAA;AAAA;AAAA,EAKA,OAAa;AACT,IAAI,KAAK,eAAe,SACpB,cAAc,KAAK,UAAU,GAC7B,KAAK,aAAa;AAAA,EAE1B;AACJ;"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});function o(){const r=performance;return r&&r.memory&&typeof r.memory.usedJSHeapSize=="number"?r.memory.usedJSHeapSize/(1024*1024):null}class m{constructor(e){this.telemetry=e,this.intervalId=null}recordMemoryUsage(){const e=o();if(e==null)return;const t=e<256?"low":e<512?"moderate":"high";this.telemetry.logMetric("memory_usage",e,{"memory.usage_mb":e,"memory.pressure_level":t,"memory.unit":"MB","memory.type":"heap","memory.source":"performance.memory"})}start(e=3e4){return new Promise(t=>{this.recordMemoryUsage(),this.intervalId=window.setInterval(()=>{this.recordMemoryUsage()},e),t()})}stop(){this.intervalId!==null&&(clearInterval(this.intervalId),this.intervalId=null)}}exports.TelemetryMemoryUsageWeb=m;
|
|
2
|
+
//# sourceMappingURL=memoryWeb.web-CheXAcJn.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memoryWeb.web-CheXAcJn.cjs","sources":["../src/adapters/web/memoryWeb.web.ts"],"sourcesContent":["import { Telemetry } from \"../../core/telemetry\";\n\n/**\n * Attempts to retrieve JavaScript heap memory usage in MB from the browser's\n * performance API. Returns null if unsupported.\n */\nfunction getWebMemoryUsage(): number | null {\n const perf: any = performance;\n if (perf && perf.memory && typeof perf.memory.usedJSHeapSize === \"number\") {\n return perf.memory.usedJSHeapSize / (1024 * 1024); // bytes to MB\n }\n return null;\n}\n\ntype MemoryPressureLevel = \"low\" | \"moderate\" | \"high\";\n\n/**\n * Logs JavaScript heap memory usage and pressure level at regular intervals\n * in browser environments using the Performance API.\n */\nexport class TelemetryMemoryUsageWeb {\n private intervalId: number | null = null;\n\n constructor(private telemetry: Telemetry) { }\n\n /**\n * Records a memory_usage metric (value = used heap MB) per sample, on the v3 metric path.\n */\n recordMemoryUsage(): void {\n const usedMb = getWebMemoryUsage();\n if (usedMb == null) return; // Unsupported in this browser\n\n // Define pressure levels based on used heap size (MB)\n const pressureLevel: MemoryPressureLevel =\n usedMb < 256 ? \"low\" : usedMb < 512 ? \"moderate\" : \"high\";\n\n this.telemetry.logMetric(\"memory_usage\", usedMb, {\n \"memory.usage_mb\": usedMb,\n \"memory.pressure_level\": pressureLevel,\n \"memory.unit\": \"MB\",\n \"memory.type\": \"heap\",\n \"memory.source\": \"performance.memory\",\n });\n }\n\n /**\n * Starts periodic memory usage logging at the specified interval.\n * Returns a Promise that resolves immediately for async compatibility.\n *\n * @param intervalMs Interval in milliseconds between samples (default 30s)\n * @returns Promise<void>\n */\n start(intervalMs: number = 30000): Promise<void> {\n return new Promise((resolve) => {\n this.recordMemoryUsage();\n\n this.intervalId = window.setInterval(() => {\n this.recordMemoryUsage();\n }, intervalMs);\n\n resolve();\n });\n }\n\n /**\n * Stops the periodic memory logging if running.\n */\n stop(): void {\n if (this.intervalId !== null) {\n clearInterval(this.intervalId);\n this.intervalId = null;\n }\n }\n}\n"],"names":["getWebMemoryUsage","perf","TelemetryMemoryUsageWeb","telemetry","usedMb","pressureLevel","intervalMs","resolve"],"mappings":"gFAMA,SAASA,GAAmC,CACxC,MAAMC,EAAY,YAClB,OAAIA,GAAQA,EAAK,QAAU,OAAOA,EAAK,OAAO,gBAAmB,SACtDA,EAAK,OAAO,gBAAkB,KAAO,MAEzC,IACX,CAQO,MAAMC,CAAwB,CAGjC,YAAoBC,EAAsB,CAAtB,KAAA,UAAAA,EAFpB,KAAQ,WAA4B,IAEQ,CAK5C,mBAA0B,CACtB,MAAMC,EAASJ,EAAA,EACf,GAAII,GAAU,KAAM,OAGpB,MAAMC,EACFD,EAAS,IAAM,MAAQA,EAAS,IAAM,WAAa,OAEvD,KAAK,UAAU,UAAU,eAAgBA,EAAQ,CAC7C,kBAAmBA,EACnB,wBAAyBC,EACzB,cAAe,KACf,cAAe,OACf,gBAAiB,oBAAA,CACpB,CACL,CASA,MAAMC,EAAqB,IAAsB,CAC7C,OAAO,IAAI,QAASC,GAAY,CAC5B,KAAK,kBAAA,EAEL,KAAK,WAAa,OAAO,YAAY,IAAM,CACvC,KAAK,kBAAA,CACT,EAAGD,CAAU,EAEbC,EAAA,CACJ,CAAC,CACL,CAKA,MAAa,CACL,KAAK,aAAe,OACpB,cAAc,KAAK,UAAU,EAC7B,KAAK,WAAa,KAE1B,CACJ"}
|