@buoy-gg/network 7.0.40 → 7.0.42
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 +11 -79
- package/lib/commonjs/index.js +1 -325
- package/lib/commonjs/index.web.js +1 -420
- package/lib/commonjs/network/components/DataViewer.web.js +1 -879
- package/lib/commonjs/network/components/NetworkCopyScreen.web.js +1 -48
- package/lib/commonjs/network/components/NetworkCopySettingsView.js +27 -755
- package/lib/commonjs/network/components/NetworkCopySettingsView.web.js +14 -1242
- package/lib/commonjs/network/components/NetworkDetailScreen.web.js +1 -101
- package/lib/commonjs/network/components/NetworkDetailStepper.js +1 -108
- package/lib/commonjs/network/components/NetworkDetailStepper.web.js +1 -298
- package/lib/commonjs/network/components/NetworkEventDetailView.js +15 -1130
- package/lib/commonjs/network/components/NetworkEventDetailView.web.js +15 -1484
- package/lib/commonjs/network/components/NetworkEventItemCompact.js +2 -401
- package/lib/commonjs/network/components/NetworkEventItemCompact.web.js +2 -820
- package/lib/commonjs/network/components/NetworkFilterScreen.web.js +1 -55
- package/lib/commonjs/network/components/NetworkFilterViewV3.js +1 -442
- package/lib/commonjs/network/components/NetworkFilterViewV3.web.js +1 -1310
- package/lib/commonjs/network/components/NetworkHeaderLive.js +1 -375
- package/lib/commonjs/network/components/NetworkHeaderLive.web.js +1 -623
- package/lib/commonjs/network/components/NetworkHeaderMenu.js +1 -190
- package/lib/commonjs/network/components/NetworkListScreen.js +1 -404
- package/lib/commonjs/network/components/NetworkListScreen.web.js +1 -625
- package/lib/commonjs/network/components/NetworkModal.js +1 -786
- package/lib/commonjs/network/components/NetworkNumberPrompt.js +1 -178
- package/lib/commonjs/network/components/NetworkNumberPrompt.web.js +1 -232
- package/lib/commonjs/network/components/NetworkOverrideEditor.js +1 -814
- package/lib/commonjs/network/components/NetworkOverrideEditor.web.js +1 -942
- package/lib/commonjs/network/components/NetworkOverrideHeaderButton.js +1 -107
- package/lib/commonjs/network/components/NetworkOverrideHeaderButton.web.js +1 -133
- package/lib/commonjs/network/components/NetworkOverridesButton.js +1 -90
- package/lib/commonjs/network/components/NetworkOverridesButton.web.js +1 -143
- package/lib/commonjs/network/components/NetworkOverridesScreen.js +1 -543
- package/lib/commonjs/network/components/NetworkOverridesScreen.web.js +1 -830
- package/lib/commonjs/network/components/NetworkSavedScreen.js +1 -226
- package/lib/commonjs/network/components/NetworkSavedScreen.web.js +1 -463
- package/lib/commonjs/network/components/NetworkUpgradeBanner.js +1 -76
- package/lib/commonjs/network/components/response-editor/Explorer.js +1 -973
- package/lib/commonjs/network/components/response-editor/Explorer.web.js +1 -1136
- package/lib/commonjs/network/components/response-editor/deleteNestedDataByPath.js +1 -56
- package/lib/commonjs/network/components/response-editor/editorContext.js +1 -33
- package/lib/commonjs/network/components/response-editor/updateNestedDataByPath.js +1 -61
- package/lib/commonjs/network/conditions/NetworkConditionsControl.js +1 -235
- package/lib/commonjs/network/conditions/NetworkConditionsControl.test.js +1 -136
- package/lib/commonjs/network/conditions/NetworkConditionsIcon.js +1 -33
- package/lib/commonjs/network/conditions/NetworkFloatingTool.js +1 -310
- package/lib/commonjs/network/conditions/NetworkFloatingTool.test.js +1 -219
- package/lib/commonjs/network/conditions/store.js +1 -75
- package/lib/commonjs/network/conditions/wait.js +1 -43
- package/lib/commonjs/network/conditions/xhr.js +1 -110
- package/lib/commonjs/network/hooks/useLiveNetworkEvent.js +1 -62
- package/lib/commonjs/network/hooks/useNetworkBadgeCounts.js +1 -83
- package/lib/commonjs/network/hooks/useNetworkEventList.js +1 -108
- package/lib/commonjs/network/hooks/useNetworkEvents.js +1 -318
- package/lib/commonjs/network/hooks/useNetworkHasMatches.js +1 -56
- package/lib/commonjs/network/hooks/useNetworkSaved.js +1 -38
- package/lib/commonjs/network/hooks/useNetworkSelection.js +1 -53
- package/lib/commonjs/network/hooks/useOverrideRules.js +1 -36
- package/lib/commonjs/network/hooks/useTickEveryMinute.js +1 -21
- package/lib/commonjs/network/overrides/applyToFetch.js +1 -80
- package/lib/commonjs/network/overrides/applyToXhr.js +2 -453
- package/lib/commonjs/network/overrides/engine.js +1 -93
- package/lib/commonjs/network/overrides/matchRule.js +1 -81
- package/lib/commonjs/network/overrides/overriddenRows.js +1 -0
- package/lib/commonjs/network/overrides/overrideRulesStore.js +1 -550
- package/lib/commonjs/network/overrides/presets.js +1 -70
- package/lib/commonjs/network/overrides/resolveOverride.js +1 -158
- package/lib/commonjs/network/overrides/types.js +1 -90
- package/lib/commonjs/network/sync/networkBodyResolver.js +1 -39
- package/lib/commonjs/network/sync/networkSyncAdapter.js +1 -882
- package/lib/commonjs/network/sync/overrideHonesty.release.test.js +1 -36
- package/lib/commonjs/network/types/index.js +1 -5
- package/lib/commonjs/network/utils/extractOperationName.js +1 -80
- package/lib/commonjs/network/utils/filterNetworkEvents.js +1 -96
- package/lib/commonjs/network/utils/formatGraphQLVariables.js +1 -219
- package/lib/commonjs/network/utils/formatting.js +1 -30
- package/lib/commonjs/network/utils/generateCurl.js +2 -71
- package/lib/commonjs/network/utils/generateNetworkCopyText.js +37 -166
- package/lib/commonjs/network/utils/httpCompletion.js +1 -37
- package/lib/commonjs/network/utils/networkEventStore.js +1 -393
- package/lib/commonjs/network/utils/networkListener.js +4 -1259
- package/lib/commonjs/network/utils/networkSavedStore.js +3 -577
- package/lib/commonjs/network/utils/networkSelectionStore.js +1 -193
- package/lib/commonjs/network/utils/realNow.js +1 -0
- package/lib/commonjs/network/utils/requestId.js +1 -0
- package/lib/commonjs/network/utils/resolveRequestUrl.js +1 -0
- package/lib/commonjs/network/utils/selectSavedEvents.js +1 -39
- package/lib/commonjs/network/utils/startNetworkCapture.js +1 -0
- package/lib/commonjs/network/utils/withPinnedFirst.js +1 -32
- package/lib/commonjs/preset.js +1 -102
- package/lib/module/index.js +1 -103
- package/lib/module/index.web.js +1 -82
- package/lib/module/network/components/DataViewer.web.js +1 -875
- package/lib/module/network/components/NetworkCopyScreen.web.js +1 -44
- package/lib/module/network/components/NetworkCopySettingsView.js +27 -750
- package/lib/module/network/components/NetworkCopySettingsView.web.js +14 -1237
- package/lib/module/network/components/NetworkDetailScreen.web.js +1 -97
- package/lib/module/network/components/NetworkDetailStepper.js +1 -104
- package/lib/module/network/components/NetworkDetailStepper.web.js +1 -296
- package/lib/module/network/components/NetworkEventDetailView.js +15 -1129
- package/lib/module/network/components/NetworkEventDetailView.web.js +15 -1482
- package/lib/module/network/components/NetworkEventItemCompact.js +2 -398
- package/lib/module/network/components/NetworkEventItemCompact.web.js +2 -818
- package/lib/module/network/components/NetworkFilterScreen.web.js +1 -51
- package/lib/module/network/components/NetworkFilterViewV3.js +1 -438
- package/lib/module/network/components/NetworkFilterViewV3.web.js +1 -1306
- package/lib/module/network/components/NetworkHeaderLive.js +1 -366
- package/lib/module/network/components/NetworkHeaderLive.web.js +1 -617
- package/lib/module/network/components/NetworkHeaderMenu.js +1 -184
- package/lib/module/network/components/NetworkListScreen.js +1 -400
- package/lib/module/network/components/NetworkListScreen.web.js +1 -623
- package/lib/module/network/components/NetworkModal.js +1 -781
- package/lib/module/network/components/NetworkNumberPrompt.js +1 -174
- package/lib/module/network/components/NetworkNumberPrompt.web.js +1 -230
- package/lib/module/network/components/NetworkOverrideEditor.js +1 -811
- package/lib/module/network/components/NetworkOverrideEditor.web.js +1 -939
- package/lib/module/network/components/NetworkOverrideHeaderButton.js +1 -104
- package/lib/module/network/components/NetworkOverrideHeaderButton.web.js +1 -131
- package/lib/module/network/components/NetworkOverridesButton.js +1 -87
- package/lib/module/network/components/NetworkOverridesButton.web.js +1 -141
- package/lib/module/network/components/NetworkOverridesScreen.js +1 -539
- package/lib/module/network/components/NetworkOverridesScreen.web.js +1 -826
- package/lib/module/network/components/NetworkSavedScreen.js +1 -222
- package/lib/module/network/components/NetworkSavedScreen.web.js +1 -461
- package/lib/module/network/components/NetworkUpgradeBanner.js +1 -72
- package/lib/module/network/components/response-editor/Explorer.js +1 -972
- package/lib/module/network/components/response-editor/Explorer.web.js +1 -1133
- package/lib/module/network/components/response-editor/deleteNestedDataByPath.js +1 -51
- package/lib/module/network/components/response-editor/editorContext.js +1 -29
- package/lib/module/network/components/response-editor/updateNestedDataByPath.js +1 -56
- package/lib/module/network/conditions/NetworkConditionsControl.js +1 -231
- package/lib/module/network/conditions/NetworkConditionsControl.test.js +1 -135
- package/lib/module/network/conditions/NetworkConditionsIcon.js +1 -29
- package/lib/module/network/conditions/NetworkFloatingTool.js +1 -304
- package/lib/module/network/conditions/NetworkFloatingTool.test.js +1 -218
- package/lib/module/network/conditions/store.js +1 -65
- package/lib/module/network/conditions/wait.js +1 -38
- package/lib/module/network/conditions/xhr.js +1 -106
- package/lib/module/network/hooks/useLiveNetworkEvent.js +1 -58
- package/lib/module/network/hooks/useNetworkBadgeCounts.js +1 -79
- package/lib/module/network/hooks/useNetworkEventList.js +1 -104
- package/lib/module/network/hooks/useNetworkEvents.js +1 -314
- package/lib/module/network/hooks/useNetworkHasMatches.js +1 -52
- package/lib/module/network/hooks/useNetworkSaved.js +1 -34
- package/lib/module/network/hooks/useNetworkSelection.js +1 -46
- package/lib/module/network/hooks/useOverrideRules.js +1 -32
- package/lib/module/network/hooks/useTickEveryMinute.js +1 -11
- package/lib/module/network/overrides/applyToFetch.js +1 -72
- package/lib/module/network/overrides/applyToXhr.js +2 -446
- package/lib/module/network/overrides/engine.js +1 -85
- package/lib/module/network/overrides/matchRule.js +1 -75
- package/lib/module/network/overrides/overriddenRows.js +1 -0
- package/lib/module/network/overrides/overrideRulesStore.js +1 -547
- package/lib/module/network/overrides/presets.js +1 -65
- package/lib/module/network/overrides/resolveOverride.js +1 -152
- package/lib/module/network/overrides/types.js +1 -86
- package/lib/module/network/sync/networkBodyResolver.js +1 -34
- package/lib/module/network/sync/networkSyncAdapter.js +1 -880
- package/lib/module/network/sync/overrideHonesty.release.test.js +1 -35
- package/lib/module/network/types/index.js +1 -3
- package/lib/module/network/utils/extractOperationName.js +1 -76
- package/lib/module/network/utils/filterNetworkEvents.js +1 -92
- package/lib/module/network/utils/formatGraphQLVariables.js +1 -213
- package/lib/module/network/utils/formatting.js +1 -9
- package/lib/module/network/utils/generateCurl.js +2 -67
- package/lib/module/network/utils/generateNetworkCopyText.js +37 -162
- package/lib/module/network/utils/httpCompletion.js +1 -32
- package/lib/module/network/utils/networkEventStore.js +1 -391
- package/lib/module/network/utils/networkListener.js +4 -1249
- package/lib/module/network/utils/networkSavedStore.js +3 -572
- package/lib/module/network/utils/networkSelectionStore.js +1 -188
- package/lib/module/network/utils/realNow.js +1 -0
- package/lib/module/network/utils/requestId.js +1 -0
- package/lib/module/network/utils/resolveRequestUrl.js +1 -0
- package/lib/module/network/utils/selectSavedEvents.js +1 -35
- package/lib/module/network/utils/startNetworkCapture.js +1 -0
- package/lib/module/network/utils/withPinnedFirst.js +1 -28
- package/lib/module/preset.js +1 -100
- package/lib/typescript/index.d.ts +1 -0
- package/lib/typescript/network/overrides/applyToXhr.d.ts +1 -0
- package/lib/typescript/network/overrides/engine.d.ts +1 -1
- package/lib/typescript/network/overrides/matchRule.d.ts +1 -1
- package/lib/typescript/network/overrides/overriddenRows.d.ts +16 -0
- package/lib/typescript/network/overrides/resolveOverride.d.ts +2 -2
- package/lib/typescript/network/overrides/types.d.ts +9 -0
- package/lib/typescript/network/utils/networkListener.d.ts +14 -4
- package/lib/typescript/network/utils/networkSavedStore.d.ts +4 -4
- package/lib/typescript/network/utils/realNow.d.ts +18 -0
- package/lib/typescript/network/utils/requestId.d.ts +2 -0
- package/lib/typescript/network/utils/resolveRequestUrl.d.ts +3 -0
- package/lib/typescript/network/utils/startNetworkCapture.d.ts +6 -0
- package/lib/web/index.mjs +145 -0
- package/package.json +32 -10
- package/lib/typescript/index.d.ts.map +0 -1
- package/lib/typescript/index.web.d.ts.map +0 -1
- package/lib/typescript/network/components/DataViewer.web.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkCopyScreen.web.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkCopySettingsView.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkCopySettingsView.web.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkDetailScreen.web.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkDetailStepper.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkDetailStepper.web.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkEventDetailView.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkEventDetailView.web.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkEventItemCompact.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkEventItemCompact.web.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkFilterScreen.web.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkFilterViewV3.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkFilterViewV3.web.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkHeaderLive.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkHeaderLive.web.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkHeaderMenu.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkListScreen.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkListScreen.web.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkModal.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkNumberPrompt.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkNumberPrompt.web.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkOverrideEditor.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkOverrideEditor.web.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkOverrideHeaderButton.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkOverrideHeaderButton.web.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkOverridesButton.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkOverridesButton.web.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkOverridesScreen.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkOverridesScreen.web.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkSavedScreen.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkSavedScreen.web.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkUpgradeBanner.d.ts.map +0 -1
- package/lib/typescript/network/components/response-editor/Explorer.d.ts.map +0 -1
- package/lib/typescript/network/components/response-editor/Explorer.web.d.ts.map +0 -1
- package/lib/typescript/network/components/response-editor/deleteNestedDataByPath.d.ts.map +0 -1
- package/lib/typescript/network/components/response-editor/editorContext.d.ts.map +0 -1
- package/lib/typescript/network/components/response-editor/updateNestedDataByPath.d.ts.map +0 -1
- package/lib/typescript/network/conditions/NetworkConditionsControl.d.ts.map +0 -1
- package/lib/typescript/network/conditions/NetworkConditionsControl.test.d.ts.map +0 -1
- package/lib/typescript/network/conditions/NetworkConditionsIcon.d.ts.map +0 -1
- package/lib/typescript/network/conditions/NetworkFloatingTool.d.ts.map +0 -1
- package/lib/typescript/network/conditions/NetworkFloatingTool.test.d.ts.map +0 -1
- package/lib/typescript/network/conditions/store.d.ts.map +0 -1
- package/lib/typescript/network/conditions/wait.d.ts.map +0 -1
- package/lib/typescript/network/conditions/xhr.d.ts.map +0 -1
- package/lib/typescript/network/hooks/useLiveNetworkEvent.d.ts.map +0 -1
- package/lib/typescript/network/hooks/useNetworkBadgeCounts.d.ts.map +0 -1
- package/lib/typescript/network/hooks/useNetworkEventList.d.ts.map +0 -1
- package/lib/typescript/network/hooks/useNetworkEvents.d.ts.map +0 -1
- package/lib/typescript/network/hooks/useNetworkHasMatches.d.ts.map +0 -1
- package/lib/typescript/network/hooks/useNetworkSaved.d.ts.map +0 -1
- package/lib/typescript/network/hooks/useNetworkSelection.d.ts.map +0 -1
- package/lib/typescript/network/hooks/useOverrideRules.d.ts.map +0 -1
- package/lib/typescript/network/hooks/useTickEveryMinute.d.ts.map +0 -1
- package/lib/typescript/network/overrides/applyToFetch.d.ts.map +0 -1
- package/lib/typescript/network/overrides/applyToXhr.d.ts.map +0 -1
- package/lib/typescript/network/overrides/engine.d.ts.map +0 -1
- package/lib/typescript/network/overrides/matchRule.d.ts.map +0 -1
- package/lib/typescript/network/overrides/overrideRulesStore.d.ts.map +0 -1
- package/lib/typescript/network/overrides/presets.d.ts.map +0 -1
- package/lib/typescript/network/overrides/resolveOverride.d.ts.map +0 -1
- package/lib/typescript/network/overrides/types.d.ts.map +0 -1
- package/lib/typescript/network/sync/networkBodyResolver.d.ts.map +0 -1
- package/lib/typescript/network/sync/networkSyncAdapter.d.ts.map +0 -1
- package/lib/typescript/network/sync/overrideHonesty.release.test.d.ts.map +0 -1
- package/lib/typescript/network/types/index.d.ts.map +0 -1
- package/lib/typescript/network/utils/extractOperationName.d.ts.map +0 -1
- package/lib/typescript/network/utils/filterNetworkEvents.d.ts.map +0 -1
- package/lib/typescript/network/utils/formatGraphQLVariables.d.ts.map +0 -1
- package/lib/typescript/network/utils/formatting.d.ts.map +0 -1
- package/lib/typescript/network/utils/generateCurl.d.ts.map +0 -1
- package/lib/typescript/network/utils/generateNetworkCopyText.d.ts.map +0 -1
- package/lib/typescript/network/utils/httpCompletion.d.ts.map +0 -1
- package/lib/typescript/network/utils/networkEventStore.d.ts.map +0 -1
- package/lib/typescript/network/utils/networkListener.d.ts.map +0 -1
- package/lib/typescript/network/utils/networkSavedStore.d.ts.map +0 -1
- package/lib/typescript/network/utils/networkSelectionStore.d.ts.map +0 -1
- package/lib/typescript/network/utils/selectSavedEvents.d.ts.map +0 -1
- package/lib/typescript/network/utils/withPinnedFirst.d.ts.map +0 -1
- package/lib/typescript/preset.d.ts.map +0 -1
|
@@ -1,168 +1,39 @@
|
|
|
1
|
-
"use strict";
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.generateNetworkCopyText=generateNetworkCopyText;function formatBytes(n){if(n===void 0||n===null)return"N/A";if(n===0)return"0 B";const s=1024;const u=["B","KB","MB","GB","TB"];const a=Math.floor(Math.log(n)/Math.log(s));return`${(n/Math.pow(s,a)).toFixed(1)} ${u[a]}`}function shouldIncludePayload(n,s){if(s===-1)return true;if(!n)return true;try{const u=JSON.stringify(n).length;return u<s*1024}catch{return false}}function generateNetworkCopyText(n,s){let u=n;if(s.filterMode==="failed"){u=u.filter(e=>e.error||e.status&&e.status>=400)}else if(s.filterMode==="success"){u=u.filter(e=>e.status&&e.status>=200&&e.status<300)}if(u.length===0){return"No requests to copy"}if(s.format==="plaintext"){return u.map(e=>`${e.method} ${e.url}`).join("\n")}if(s.format==="json"){const e=u.map(i=>{const r={};if(s.includeMethod){r.method=i.method;r.url=i.url}if(s.includeStatus){r.status=i.status;r.statusText=i.statusText}if(s.includeDuration)r.duration=i.duration;if(i.condition)r.condition=i.condition;if(s.includeTimestamp)r.timestamp=i.timestamp;if(s.includeClient)r.requestClient=i.requestClient;if(s.includeSizes){r.requestSize=i.requestSize;r.responseSize=i.responseSize}if(s.includeErrors&&i.error)r.error=i.error;if(s.includeRequestHeaders){r.requestHeaders=i.requestHeaders}if(s.includeResponseHeaders){r.responseHeaders=i.responseHeaders}if(s.includeRequestBody&&shouldIncludePayload(i.requestData,s.bodySizeThreshold)){r.requestData=i.requestData}if(s.includeResponseBody&&shouldIncludePayload(i.responseData,s.bodySizeThreshold)){r.responseData=i.responseData}return r});return JSON.stringify(e,null,2)}const a=u.map((e,i)=>{let r=`# Request ${i+1}
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
});
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
3
|
+
`;if(s.includeMethod){r+=`**Method:** ${e.method}
|
|
4
|
+
`;r+=`**URL:** ${e.url}
|
|
5
|
+
`}if(s.includeStatus){const o=e.status||"Pending";r+=`**Status:** ${o}${e.statusText?` (${e.statusText})`:""}
|
|
6
|
+
`}if(s.includeClient&&e.requestClient){r+=`**Client:** ${e.requestClient}
|
|
7
|
+
`}if(e.condition)r+=`Conditions: ${e.condition.profile} (+${e.condition.delayMs} ms)
|
|
8
|
+
`;if(s.includeDuration&&e.duration){r+=`**Duration:** ${e.duration}ms
|
|
9
|
+
`}if(s.includeTimestamp){r+=`**Timestamp:** ${new Date(e.timestamp).toISOString()}
|
|
10
|
+
`}if(s.includeSizes){const o=e.requestSize?formatBytes(e.requestSize):"N/A";const t=e.responseSize?formatBytes(e.responseSize):"N/A";r+=`**Request Size:** ${o}
|
|
11
|
+
`;r+=`**Response Size:** ${t}
|
|
12
|
+
`}if(s.includeErrors&&e.error){r+=`**Error:** ${e.error}
|
|
13
|
+
`}if(s.includeRequestHeaders&&Object.keys(e.requestHeaders).length>0){r+=`
|
|
14
|
+
## Request Headers
|
|
15
|
+
\`\`\`json
|
|
16
|
+
${JSON.stringify(e.requestHeaders,null,2)}
|
|
17
|
+
\`\`\`
|
|
18
|
+
`}if(s.includeRequestBody){r+=`
|
|
19
|
+
## Request Data
|
|
20
|
+
`;if(shouldIncludePayload(e.requestData,s.bodySizeThreshold)){r+=`\`\`\`json
|
|
21
|
+
${JSON.stringify(e.requestData,null,2)}
|
|
22
|
+
\`\`\`
|
|
23
|
+
`}else{const o=e.requestSize?formatBytes(e.requestSize):"Unknown size";r+=`_Payload omitted (${o}). Exceeds ${s.bodySizeThreshold}KB threshold._
|
|
24
|
+
`}}if(s.includeResponseHeaders&&Object.keys(e.responseHeaders).length>0){r+=`
|
|
25
|
+
## Response Headers
|
|
26
|
+
\`\`\`json
|
|
27
|
+
${JSON.stringify(e.responseHeaders,null,2)}
|
|
28
|
+
\`\`\`
|
|
29
|
+
`}if(s.includeResponseBody){r+=`
|
|
30
|
+
## Response Data
|
|
31
|
+
`;if(shouldIncludePayload(e.responseData,s.bodySizeThreshold)){r+=`\`\`\`json
|
|
32
|
+
${JSON.stringify(e.responseData,null,2)}
|
|
33
|
+
\`\`\`
|
|
34
|
+
`}else{const o=e.responseSize?formatBytes(e.responseSize):"Unknown size";r+=`_Payload omitted (${o}). Exceeds ${s.bodySizeThreshold}KB threshold._
|
|
35
|
+
`}}r+=`
|
|
36
|
+
---
|
|
37
|
+
`;return r}).join("\n");const d=`# Network Requests (${u.length} total)
|
|
26
38
|
|
|
27
|
-
|
|
28
|
-
* What the copy exporter includes and how it formats it. Structurally
|
|
29
|
-
* identical to (and must stay in sync with) the `CopySettings` exported by
|
|
30
|
-
* NetworkCopySettingsView.tsx — see the platform-free note above for why the
|
|
31
|
-
* definition lives here.
|
|
32
|
-
*/
|
|
33
|
-
|
|
34
|
-
/** shared/src/utils/formatting/dataFormatting.ts `formatBytes` — verbatim. */
|
|
35
|
-
function formatBytes(bytes) {
|
|
36
|
-
if (bytes === undefined || bytes === null) return "N/A";
|
|
37
|
-
if (bytes === 0) return "0 B";
|
|
38
|
-
const k = 1024;
|
|
39
|
-
const sizes = ["B", "KB", "MB", "GB", "TB"];
|
|
40
|
-
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
41
|
-
return `${(bytes / Math.pow(k, i)).toFixed(1)} ${sizes[i]}`;
|
|
42
|
-
}
|
|
43
|
-
function shouldIncludePayload(data, bodySizeThresholdKb) {
|
|
44
|
-
if (bodySizeThresholdKb === -1) return true;
|
|
45
|
-
if (!data) return true;
|
|
46
|
-
try {
|
|
47
|
-
const size = JSON.stringify(data).length;
|
|
48
|
-
return size < bodySizeThresholdKb * 1024;
|
|
49
|
-
} catch {
|
|
50
|
-
return false;
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
function generateNetworkCopyText(events, copySettings) {
|
|
54
|
-
let eventsToUse = events;
|
|
55
|
-
|
|
56
|
-
// Apply filter mode
|
|
57
|
-
if (copySettings.filterMode === "failed") {
|
|
58
|
-
eventsToUse = eventsToUse.filter(e => e.error || e.status && e.status >= 400);
|
|
59
|
-
} else if (copySettings.filterMode === "success") {
|
|
60
|
-
eventsToUse = eventsToUse.filter(e => e.status && e.status >= 200 && e.status < 300);
|
|
61
|
-
}
|
|
62
|
-
if (eventsToUse.length === 0) {
|
|
63
|
-
return "No requests to copy";
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
// Plain text format (URLs only)
|
|
67
|
-
if (copySettings.format === "plaintext") {
|
|
68
|
-
return eventsToUse.map(event => `${event.method} ${event.url}`).join("\n");
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
// JSON format
|
|
72
|
-
if (copySettings.format === "json") {
|
|
73
|
-
const requests = eventsToUse.map(event => {
|
|
74
|
-
const obj = {};
|
|
75
|
-
if (copySettings.includeMethod) {
|
|
76
|
-
obj.method = event.method;
|
|
77
|
-
obj.url = event.url;
|
|
78
|
-
}
|
|
79
|
-
if (copySettings.includeStatus) {
|
|
80
|
-
obj.status = event.status;
|
|
81
|
-
obj.statusText = event.statusText;
|
|
82
|
-
}
|
|
83
|
-
if (copySettings.includeDuration) obj.duration = event.duration;
|
|
84
|
-
if (event.condition) obj.condition = event.condition;
|
|
85
|
-
if (copySettings.includeTimestamp) obj.timestamp = event.timestamp;
|
|
86
|
-
if (copySettings.includeClient) obj.requestClient = event.requestClient;
|
|
87
|
-
if (copySettings.includeSizes) {
|
|
88
|
-
obj.requestSize = event.requestSize;
|
|
89
|
-
obj.responseSize = event.responseSize;
|
|
90
|
-
}
|
|
91
|
-
if (copySettings.includeErrors && event.error) obj.error = event.error;
|
|
92
|
-
if (copySettings.includeRequestHeaders) {
|
|
93
|
-
obj.requestHeaders = event.requestHeaders;
|
|
94
|
-
}
|
|
95
|
-
if (copySettings.includeResponseHeaders) {
|
|
96
|
-
obj.responseHeaders = event.responseHeaders;
|
|
97
|
-
}
|
|
98
|
-
if (copySettings.includeRequestBody && shouldIncludePayload(event.requestData, copySettings.bodySizeThreshold)) {
|
|
99
|
-
obj.requestData = event.requestData;
|
|
100
|
-
}
|
|
101
|
-
if (copySettings.includeResponseBody && shouldIncludePayload(event.responseData, copySettings.bodySizeThreshold)) {
|
|
102
|
-
obj.responseData = event.responseData;
|
|
103
|
-
}
|
|
104
|
-
return obj;
|
|
105
|
-
});
|
|
106
|
-
return JSON.stringify(requests, null, 2);
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
// Markdown format
|
|
110
|
-
const requests = eventsToUse.map((event, index) => {
|
|
111
|
-
let md = `# Request ${index + 1}\n\n`;
|
|
112
|
-
if (copySettings.includeMethod) {
|
|
113
|
-
md += `**Method:** ${event.method}\n`;
|
|
114
|
-
md += `**URL:** ${event.url}\n`;
|
|
115
|
-
}
|
|
116
|
-
if (copySettings.includeStatus) {
|
|
117
|
-
const status = event.status || "Pending";
|
|
118
|
-
md += `**Status:** ${status}${event.statusText ? ` (${event.statusText})` : ""}\n`;
|
|
119
|
-
}
|
|
120
|
-
if (copySettings.includeClient && event.requestClient) {
|
|
121
|
-
md += `**Client:** ${event.requestClient}\n`;
|
|
122
|
-
}
|
|
123
|
-
if (event.condition) md += `Conditions: ${event.condition.profile} (+${event.condition.delayMs} ms)\n`;
|
|
124
|
-
if (copySettings.includeDuration && event.duration) {
|
|
125
|
-
md += `**Duration:** ${event.duration}ms\n`;
|
|
126
|
-
}
|
|
127
|
-
if (copySettings.includeTimestamp) {
|
|
128
|
-
md += `**Timestamp:** ${new Date(event.timestamp).toISOString()}\n`;
|
|
129
|
-
}
|
|
130
|
-
if (copySettings.includeSizes) {
|
|
131
|
-
const reqSize = event.requestSize ? formatBytes(event.requestSize) : "N/A";
|
|
132
|
-
const resSize = event.responseSize ? formatBytes(event.responseSize) : "N/A";
|
|
133
|
-
md += `**Request Size:** ${reqSize}\n`;
|
|
134
|
-
md += `**Response Size:** ${resSize}\n`;
|
|
135
|
-
}
|
|
136
|
-
if (copySettings.includeErrors && event.error) {
|
|
137
|
-
md += `**Error:** ${event.error}\n`;
|
|
138
|
-
}
|
|
139
|
-
if (copySettings.includeRequestHeaders && Object.keys(event.requestHeaders).length > 0) {
|
|
140
|
-
md += `\n## Request Headers\n\`\`\`json\n${JSON.stringify(event.requestHeaders, null, 2)}\n\`\`\`\n`;
|
|
141
|
-
}
|
|
142
|
-
if (copySettings.includeRequestBody) {
|
|
143
|
-
md += `\n## Request Data\n`;
|
|
144
|
-
if (shouldIncludePayload(event.requestData, copySettings.bodySizeThreshold)) {
|
|
145
|
-
md += `\`\`\`json\n${JSON.stringify(event.requestData, null, 2)}\n\`\`\`\n`;
|
|
146
|
-
} else {
|
|
147
|
-
const size = event.requestSize ? formatBytes(event.requestSize) : "Unknown size";
|
|
148
|
-
md += `_Payload omitted (${size}). Exceeds ${copySettings.bodySizeThreshold}KB threshold._\n`;
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
if (copySettings.includeResponseHeaders && Object.keys(event.responseHeaders).length > 0) {
|
|
152
|
-
md += `\n## Response Headers\n\`\`\`json\n${JSON.stringify(event.responseHeaders, null, 2)}\n\`\`\`\n`;
|
|
153
|
-
}
|
|
154
|
-
if (copySettings.includeResponseBody) {
|
|
155
|
-
md += `\n## Response Data\n`;
|
|
156
|
-
if (shouldIncludePayload(event.responseData, copySettings.bodySizeThreshold)) {
|
|
157
|
-
md += `\`\`\`json\n${JSON.stringify(event.responseData, null, 2)}\n\`\`\`\n`;
|
|
158
|
-
} else {
|
|
159
|
-
const size = event.responseSize ? formatBytes(event.responseSize) : "Unknown size";
|
|
160
|
-
md += `_Payload omitted (${size}). Exceeds ${copySettings.bodySizeThreshold}KB threshold._\n`;
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
md += `\n---\n`;
|
|
164
|
-
return md;
|
|
165
|
-
}).join("\n");
|
|
166
|
-
const header = `# Network Requests (${eventsToUse.length} total)\n\n`;
|
|
167
|
-
return header + requests;
|
|
168
|
-
}
|
|
39
|
+
`;return d+a}
|
|
@@ -1,37 +1 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.httpStatusText = httpStatusText;
|
|
7
|
-
exports.xhrCompletionKind = xhrCompletionKind;
|
|
8
|
-
/**
|
|
9
|
-
* Classify a completed XHR/fetch HTTP status.
|
|
10
|
-
*
|
|
11
|
-
* A 4xx/5xx is a *response*, not a transport error. RN's XHR leaves
|
|
12
|
-
* `statusText` empty, which used to become `event.error = "HTTP 500: "` and
|
|
13
|
-
* then MCP `ERR HTTP 500: no error`.
|
|
14
|
-
*/
|
|
15
|
-
|
|
16
|
-
const STATUS_TEXT = {
|
|
17
|
-
400: "Bad Request",
|
|
18
|
-
401: "Unauthorized",
|
|
19
|
-
403: "Forbidden",
|
|
20
|
-
404: "Not Found",
|
|
21
|
-
408: "Request Timeout",
|
|
22
|
-
429: "Too Many Requests",
|
|
23
|
-
500: "Internal Server Error",
|
|
24
|
-
502: "Bad Gateway",
|
|
25
|
-
503: "Service Unavailable",
|
|
26
|
-
504: "Gateway Timeout"
|
|
27
|
-
};
|
|
28
|
-
|
|
29
|
-
/** status 0 (or missing) means the request never got an HTTP response. */
|
|
30
|
-
function xhrCompletionKind(status) {
|
|
31
|
-
return typeof status === "number" && status > 0 ? "response" : "error";
|
|
32
|
-
}
|
|
33
|
-
function httpStatusText(status, statusText) {
|
|
34
|
-
const trimmed = (statusText ?? "").trim();
|
|
35
|
-
if (trimmed) return trimmed;
|
|
36
|
-
return STATUS_TEXT[status] ?? "";
|
|
37
|
-
}
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.httpStatusText=httpStatusText;exports.xhrCompletionKind=xhrCompletionKind;const STATUS_TEXT={400:"Bad Request",401:"Unauthorized",403:"Forbidden",404:"Not Found",408:"Request Timeout",429:"Too Many Requests",500:"Internal Server Error",502:"Bad Gateway",503:"Service Unavailable",504:"Gateway Timeout"};function xhrCompletionKind(e){return typeof e==="number"&&e>0?"response":"error"}function httpStatusText(e,r){const t=(r??"").trim();if(t)return t;return STATUS_TEXT[e]??""}
|
|
@@ -1,393 +1 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.networkEventStore = void 0;
|
|
7
|
-
var _sharedUi = require("@buoy-gg/shared-ui");
|
|
8
|
-
var _extractOperationName = require("./extractOperationName");
|
|
9
|
-
var _networkListener = require("./networkListener");
|
|
10
|
-
var _networkSavedStore = require("./networkSavedStore");
|
|
11
|
-
/**
|
|
12
|
-
* Network Event Store
|
|
13
|
-
*
|
|
14
|
-
* Store for managing captured network requests. Uses BaseEventStore pattern -
|
|
15
|
-
* the network listener automatically starts when the first subscriber joins
|
|
16
|
-
* and stops when the last subscriber leaves.
|
|
17
|
-
*
|
|
18
|
-
* @example
|
|
19
|
-
* ```typescript
|
|
20
|
-
* import { networkEventStore } from '@buoy-gg/network';
|
|
21
|
-
*
|
|
22
|
-
* // Subscribe to network events - automatically starts capturing!
|
|
23
|
-
* const unsubscribe = networkEventStore.subscribeToEvents((events) => {
|
|
24
|
-
* console.log('Network events:', events);
|
|
25
|
-
* });
|
|
26
|
-
*
|
|
27
|
-
* // Later, clean up - automatically stops if no other subscribers
|
|
28
|
-
* unsubscribe();
|
|
29
|
-
* ```
|
|
30
|
-
*/
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* Callback type for individual event notifications
|
|
34
|
-
*/
|
|
35
|
-
|
|
36
|
-
/**
|
|
37
|
-
* Callback type for full events array notifications
|
|
38
|
-
*/
|
|
39
|
-
|
|
40
|
-
/**
|
|
41
|
-
* Cap on raw events held in the boot buffer before the first consumer
|
|
42
|
-
* subscribes (request + response are separate raw events, so this is ~100
|
|
43
|
-
* requests). Old events are dropped first; a response whose request was
|
|
44
|
-
* evicted is simply ignored at flush (processNetworkEvent finds no match).
|
|
45
|
-
*/
|
|
46
|
-
const BOOT_BUFFER_MAX = 200;
|
|
47
|
-
class NetworkEventStore extends _sharedUi.BaseEventStore {
|
|
48
|
-
pendingRequests = new Map();
|
|
49
|
-
rawListenerUnsubscribe = null;
|
|
50
|
-
/** Raw events captured before the first consumer subscribed — see startBootCapture. */
|
|
51
|
-
bootBuffer = [];
|
|
52
|
-
bootBufferUnsubscribe = null;
|
|
53
|
-
/** Set by disableCapture (remote-mirror mode) — boot capture must never (re)start. */
|
|
54
|
-
mirrorMode = false;
|
|
55
|
-
constructor() {
|
|
56
|
-
super({
|
|
57
|
-
storeName: "network",
|
|
58
|
-
maxEvents: 500
|
|
59
|
-
});
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
/**
|
|
63
|
-
* Install the interceptor NOW and buffer raw events until the first real
|
|
64
|
-
* consumer subscribes.
|
|
65
|
-
*
|
|
66
|
-
* Why: capture normally starts with the first subscriber — the Network modal
|
|
67
|
-
* opening, a dashboard watch, an MCP watch — which is long after the app's
|
|
68
|
-
* startup requests (module-scope fetches, session bootstrap, the first
|
|
69
|
-
* query) have already fired. Those were unrecoverable: by the time anything
|
|
70
|
-
* subscribed, boot traffic was gone. Called as a dev-only import-time side
|
|
71
|
-
* effect from the preset, this hooks fetch/XHR at bundle-eval and parks the
|
|
72
|
-
* raw events in a bounded buffer; `startCapturing` flushes them into the
|
|
73
|
-
* store in order, so every consumer sees boot requests too.
|
|
74
|
-
*
|
|
75
|
-
* If no consumer EVER subscribes, nothing is flushed — the buffer just sits
|
|
76
|
-
* bounded at BOOT_BUFFER_MAX raw events (an explicit user "capture off"
|
|
77
|
-
* state therefore never gains events it didn't ask for).
|
|
78
|
-
*/
|
|
79
|
-
startBootCapture() {
|
|
80
|
-
if ((0, _sharedUi.getAccountAccess)().status === "locked") return;
|
|
81
|
-
if (this.mirrorMode || this.bootBufferUnsubscribe || this.isCapturing()) {
|
|
82
|
-
return;
|
|
83
|
-
}
|
|
84
|
-
const listener = (0, _networkListener.networkListener)();
|
|
85
|
-
if (!listener.isActive) {
|
|
86
|
-
listener.startListening();
|
|
87
|
-
}
|
|
88
|
-
this.bootBufferUnsubscribe = (0, _networkListener.addNetworkListener)(event => {
|
|
89
|
-
this.bootBuffer.push(event);
|
|
90
|
-
if (this.bootBuffer.length > BOOT_BUFFER_MAX) this.bootBuffer.shift();
|
|
91
|
-
});
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
/** Detach the boot-buffer listener; optionally hand back what it caught. */
|
|
95
|
-
takeBootBuffer() {
|
|
96
|
-
if (this.bootBufferUnsubscribe) {
|
|
97
|
-
this.bootBufferUnsubscribe();
|
|
98
|
-
this.bootBufferUnsubscribe = null;
|
|
99
|
-
}
|
|
100
|
-
const buffered = this.bootBuffer;
|
|
101
|
-
this.bootBuffer = [];
|
|
102
|
-
return buffered;
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
/**
|
|
106
|
-
* Start capturing network events
|
|
107
|
-
*/
|
|
108
|
-
startCapturing() {
|
|
109
|
-
const listener = (0, _networkListener.networkListener)();
|
|
110
|
-
|
|
111
|
-
// Start the network interceptor if not already active
|
|
112
|
-
if (!listener.isActive) {
|
|
113
|
-
listener.startListening();
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
// Flush boot-buffered events (in capture order) BEFORE attaching the live
|
|
117
|
-
// listener: the boot listener is detached first, so no event can be seen
|
|
118
|
-
// by both. All synchronous — nothing interleaves.
|
|
119
|
-
for (const event of this.takeBootBuffer()) {
|
|
120
|
-
this.processNetworkEvent(event);
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
// Add our listener to push raw events into the store
|
|
124
|
-
if (!this.rawListenerUnsubscribe) {
|
|
125
|
-
this.rawListenerUnsubscribe = (0, _networkListener.addNetworkListener)(event => {
|
|
126
|
-
this.processNetworkEvent(event);
|
|
127
|
-
});
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
/**
|
|
132
|
-
* Stop capturing network events
|
|
133
|
-
*/
|
|
134
|
-
stopCapturing() {
|
|
135
|
-
this.takeBootBuffer();
|
|
136
|
-
// Remove our raw listener
|
|
137
|
-
if (this.rawListenerUnsubscribe) {
|
|
138
|
-
this.rawListenerUnsubscribe();
|
|
139
|
-
this.rawListenerUnsubscribe = null;
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
// If no other listeners exist, stop the network interceptor
|
|
143
|
-
const listener = (0, _networkListener.networkListener)();
|
|
144
|
-
if (listener.listenerCount === 0) {
|
|
145
|
-
listener.stopListening();
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
/**
|
|
150
|
-
* Remote-mirror mode (desktop dashboard): on top of the base behavior, tear
|
|
151
|
-
* down boot capture and drop its buffer — a mirror must never intercept its
|
|
152
|
-
* OWN process's traffic, and must never flush host requests into the
|
|
153
|
-
* device-event list it mirrors.
|
|
154
|
-
*/
|
|
155
|
-
disableCapture() {
|
|
156
|
-
this.mirrorMode = true;
|
|
157
|
-
this.takeBootBuffer();
|
|
158
|
-
const listener = (0, _networkListener.networkListener)();
|
|
159
|
-
if (listener.listenerCount === 0 && listener.isActive) {
|
|
160
|
-
listener.stopListening();
|
|
161
|
-
}
|
|
162
|
-
super.disableCapture();
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
/**
|
|
166
|
-
* Check if the store is actively capturing network events
|
|
167
|
-
*/
|
|
168
|
-
isCapturing() {
|
|
169
|
-
return this.rawListenerUnsubscribe !== null;
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
/**
|
|
173
|
-
* Re-assert the interceptor if something re-assigned fetch/XHR since capture
|
|
174
|
-
* started (Expo's runtime, RN DevTools, a second dev server's tooling — see
|
|
175
|
-
* networkListener.startListening). A no-op costing two property reads when
|
|
176
|
-
* everything is healthy, and a no-op entirely unless this store is actively
|
|
177
|
-
* capturing — a mirror-mode dashboard must never install an interceptor in
|
|
178
|
-
* its own process.
|
|
179
|
-
*/
|
|
180
|
-
ensureInterception() {
|
|
181
|
-
if (!this.isCapturing()) return;
|
|
182
|
-
(0, _networkListener.networkListener)().startListening();
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
/**
|
|
186
|
-
* Every new consumer — the Network modal opening, a badge mounting, a
|
|
187
|
-
* dashboard watch attaching — is a chance to notice and repair a clobbered
|
|
188
|
-
* interceptor, which matters because a long-lived watch can hold the
|
|
189
|
-
* subscriber count above zero for the whole session (so the 0→1
|
|
190
|
-
* startCapturing path would never run again).
|
|
191
|
-
*/
|
|
192
|
-
subscribeToEvents(listener) {
|
|
193
|
-
const unsubscribe = super.subscribeToEvents(listener);
|
|
194
|
-
this.ensureInterception();
|
|
195
|
-
return unsubscribe;
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
/**
|
|
199
|
-
* Process a network listener event
|
|
200
|
-
*/
|
|
201
|
-
processNetworkEvent(event) {
|
|
202
|
-
if ((0, _sharedUi.getAccountAccess)().status === "locked") return;
|
|
203
|
-
const {
|
|
204
|
-
request
|
|
205
|
-
} = event;
|
|
206
|
-
if (event.type === "request") {
|
|
207
|
-
// Build full URL with query params if present
|
|
208
|
-
const queryString = request.params ? `?${new URLSearchParams(request.params).toString()}` : "";
|
|
209
|
-
const fullUrl = `${request.url}${queryString}`;
|
|
210
|
-
|
|
211
|
-
// Extract GraphQL operation name and variables for searchability
|
|
212
|
-
let operationName;
|
|
213
|
-
let graphqlVariables;
|
|
214
|
-
if (request.client === "graphql") {
|
|
215
|
-
const extracted = (0, _extractOperationName.extractOperationName)(request.data);
|
|
216
|
-
operationName = extracted || undefined;
|
|
217
|
-
if (request.data && typeof request.data === "object" && "variables" in request.data && request.data.variables && typeof request.data.variables === "object") {
|
|
218
|
-
graphqlVariables = request.data.variables;
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
const networkEvent = {
|
|
222
|
-
id: request.id,
|
|
223
|
-
method: request.method,
|
|
224
|
-
url: fullUrl,
|
|
225
|
-
host: this.extractHost(request.url),
|
|
226
|
-
path: this.extractPath(request.url),
|
|
227
|
-
query: queryString,
|
|
228
|
-
timestamp: event.timestamp.getTime(),
|
|
229
|
-
requestHeaders: request.headers || {},
|
|
230
|
-
requestData: request.data,
|
|
231
|
-
requestSize: this.getDataSize(request.data),
|
|
232
|
-
responseHeaders: {},
|
|
233
|
-
requestClient: request.client,
|
|
234
|
-
operationName,
|
|
235
|
-
graphqlVariables,
|
|
236
|
-
// Present when this request came straight through the XHR wrapper
|
|
237
|
-
// (axios, raw XHR). For `fetch` it arrives later — see the dedup branch.
|
|
238
|
-
override: event.override,
|
|
239
|
-
condition: event.condition
|
|
240
|
-
};
|
|
241
|
-
this.pendingRequests.set(request.id, networkEvent);
|
|
242
|
-
this.events = [networkEvent, ...this.events].slice(0, this.maxEvents);
|
|
243
|
-
this.notify(networkEvent);
|
|
244
|
-
this.notifyArrayListeners();
|
|
245
|
-
} else if (event.type === "response" || event.type === "error") {
|
|
246
|
-
const index = this.events.findIndex(e => e.id === request.id);
|
|
247
|
-
if (index !== -1) {
|
|
248
|
-
const updatedEvent = {
|
|
249
|
-
...this.events[index],
|
|
250
|
-
duration: event.duration,
|
|
251
|
-
// Left undefined when the interceptor couldn't measure it (e.g. a
|
|
252
|
-
// request that failed before headers). Consumers hide the breakdown
|
|
253
|
-
// in that case rather than rendering zeroes.
|
|
254
|
-
timings: event.timings
|
|
255
|
-
};
|
|
256
|
-
if (event.response) {
|
|
257
|
-
updatedEvent.status = event.response.status;
|
|
258
|
-
updatedEvent.statusText = event.response.statusText;
|
|
259
|
-
updatedEvent.responseHeaders = event.response.headers || {};
|
|
260
|
-
updatedEvent.responseData = event.response.body;
|
|
261
|
-
updatedEvent.responseSize = event.response.size || 0;
|
|
262
|
-
updatedEvent.responseType = event.response.headers?.["content-type"];
|
|
263
|
-
}
|
|
264
|
-
if (event.error) {
|
|
265
|
-
updatedEvent.error = event.error.message;
|
|
266
|
-
updatedEvent.status = updatedEvent.status || 0;
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
// A pure-XHR request carries its mark all the way through; a `fetch`
|
|
270
|
-
// one was marked at request time and is preserved by the spread above.
|
|
271
|
-
if (event.override) updatedEvent.override = event.override;
|
|
272
|
-
this.events = this.events.map((e, i) => i === index ? updatedEvent : e);
|
|
273
|
-
this.pendingRequests.delete(request.id);
|
|
274
|
-
// Refresh any pinned/saved snapshot of this request — a request pinned
|
|
275
|
-
// while in flight would otherwise stay frozen as "Pending" forever.
|
|
276
|
-
// No-ops on a single Set check when nothing is pinned.
|
|
277
|
-
_networkSavedStore.networkSavedStore.syncFromLive(updatedEvent);
|
|
278
|
-
this.notify(updatedEvent);
|
|
279
|
-
this.notifyArrayListeners();
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
extractHost(url) {
|
|
284
|
-
try {
|
|
285
|
-
const urlObj = new URL(url);
|
|
286
|
-
// @ts-ignore - this does exist on native
|
|
287
|
-
return urlObj.hostname;
|
|
288
|
-
} catch {
|
|
289
|
-
return "";
|
|
290
|
-
}
|
|
291
|
-
}
|
|
292
|
-
extractPath(url) {
|
|
293
|
-
try {
|
|
294
|
-
const urlObj = new URL(url);
|
|
295
|
-
// @ts-ignore - this does exist on native
|
|
296
|
-
return urlObj.pathname;
|
|
297
|
-
} catch {
|
|
298
|
-
return url;
|
|
299
|
-
}
|
|
300
|
-
}
|
|
301
|
-
getDataSize(data) {
|
|
302
|
-
if (!data) return 0;
|
|
303
|
-
if (typeof data === "string") return data.length;
|
|
304
|
-
try {
|
|
305
|
-
return JSON.stringify(data).length;
|
|
306
|
-
} catch {
|
|
307
|
-
return 0;
|
|
308
|
-
}
|
|
309
|
-
}
|
|
310
|
-
getEventById(id) {
|
|
311
|
-
return this.events.find(e => e.id === id);
|
|
312
|
-
}
|
|
313
|
-
|
|
314
|
-
/**
|
|
315
|
-
* Override clearEvents to also clear pending requests
|
|
316
|
-
*/
|
|
317
|
-
clearEvents() {
|
|
318
|
-
super.clearEvents();
|
|
319
|
-
this.pendingRequests.clear();
|
|
320
|
-
}
|
|
321
|
-
|
|
322
|
-
/**
|
|
323
|
-
* Subscribe to individual events with optional replay of existing events
|
|
324
|
-
*/
|
|
325
|
-
onEvent(callback, replayExisting = true) {
|
|
326
|
-
const unsubscribe = this.subscribe(callback);
|
|
327
|
-
|
|
328
|
-
// Replay existing events if requested
|
|
329
|
-
if (replayExisting && this.events.length > 0) {
|
|
330
|
-
const existingEvents = [...this.events].reverse();
|
|
331
|
-
for (const event of existingEvents) {
|
|
332
|
-
try {
|
|
333
|
-
callback(event);
|
|
334
|
-
} catch {
|
|
335
|
-
// Ignore callback errors
|
|
336
|
-
}
|
|
337
|
-
}
|
|
338
|
-
}
|
|
339
|
-
return unsubscribe;
|
|
340
|
-
}
|
|
341
|
-
getStats() {
|
|
342
|
-
const total = this.events.length;
|
|
343
|
-
const successful = this.events.filter(e => e.status && e.status >= 200 && e.status < 300).length;
|
|
344
|
-
const failed = this.events.filter(e => e.error || e.status && e.status >= 400).length;
|
|
345
|
-
const pending = this.events.filter(e => !e.status && !e.error).length;
|
|
346
|
-
const durations = this.events.filter(e => e.duration).map(e => e.duration);
|
|
347
|
-
const avgDuration = durations.length > 0 ? durations.reduce((a, b) => a + b, 0) / durations.length : 0;
|
|
348
|
-
const totalSent = this.events.reduce((sum, e) => sum + (e.requestSize || 0), 0);
|
|
349
|
-
const totalReceived = this.events.reduce((sum, e) => sum + (e.responseSize || 0), 0);
|
|
350
|
-
return {
|
|
351
|
-
totalRequests: total,
|
|
352
|
-
successfulRequests: successful,
|
|
353
|
-
failedRequests: failed,
|
|
354
|
-
pendingRequests: pending,
|
|
355
|
-
totalDataSent: totalSent,
|
|
356
|
-
totalDataReceived: totalReceived,
|
|
357
|
-
averageDuration: Math.round(avgDuration)
|
|
358
|
-
};
|
|
359
|
-
}
|
|
360
|
-
filterEvents(filter) {
|
|
361
|
-
let filtered = [...this.events];
|
|
362
|
-
if (filter.method) {
|
|
363
|
-
filtered = filtered.filter(e => e.method === filter.method);
|
|
364
|
-
}
|
|
365
|
-
if (filter.status) {
|
|
366
|
-
switch (filter.status) {
|
|
367
|
-
case "success":
|
|
368
|
-
filtered = filtered.filter(e => e.status && e.status >= 200 && e.status < 300);
|
|
369
|
-
break;
|
|
370
|
-
case "error":
|
|
371
|
-
filtered = filtered.filter(e => e.error || e.status && e.status >= 400);
|
|
372
|
-
break;
|
|
373
|
-
case "pending":
|
|
374
|
-
filtered = filtered.filter(e => !e.status && !e.error);
|
|
375
|
-
break;
|
|
376
|
-
}
|
|
377
|
-
}
|
|
378
|
-
if (filter.searchText) {
|
|
379
|
-
const search = filter.searchText.toLowerCase();
|
|
380
|
-
filtered = filtered.filter(e => e.url.toLowerCase().includes(search) || e.method.toLowerCase().includes(search) || e.error && e.error.toLowerCase().includes(search));
|
|
381
|
-
}
|
|
382
|
-
if (filter.host) {
|
|
383
|
-
filtered = filtered.filter(e => e.host === filter.host);
|
|
384
|
-
}
|
|
385
|
-
return filtered;
|
|
386
|
-
}
|
|
387
|
-
}
|
|
388
|
-
|
|
389
|
-
/**
|
|
390
|
-
* Singleton store that aggregates captured network traffic.
|
|
391
|
-
* Automatically starts/stops capturing based on subscriber count.
|
|
392
|
-
*/
|
|
393
|
-
const networkEventStore = exports.networkEventStore = new NetworkEventStore();
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.networkEventStore=void 0;var _sharedUi=require("@buoy-gg/shared-ui");var _extractOperationName=require("./extractOperationName");var _networkListener=require("./networkListener");var _networkSavedStore=require("./networkSavedStore");const BOOT_BUFFER_MAX=200;class NetworkEventStore extends _sharedUi.BaseEventStore{pendingRequests=new Map;rawListenerUnsubscribe=null;bootBuffer=[];bootBufferUnsubscribe=null;mirrorMode=false;constructor(){super({storeName:"network",maxEvents:500})}startBootCapture(){if((0,_sharedUi.getAccountAccess)().status==="locked")return;if(this.mirrorMode||this.bootBufferUnsubscribe||this.isCapturing()){return}const t=(0,_networkListener.networkListener)();if(!t.isActive){t.startListening()}this.bootBufferUnsubscribe=(0,_networkListener.addNetworkListener)(e=>{this.bootBuffer.push(e);if(this.bootBuffer.length>BOOT_BUFFER_MAX)this.bootBuffer.shift()})}takeBootBuffer(){if(this.bootBufferUnsubscribe){this.bootBufferUnsubscribe();this.bootBufferUnsubscribe=null}const t=this.bootBuffer;this.bootBuffer=[];return t}startCapturing(){const t=(0,_networkListener.networkListener)();if(!t.isActive){t.startListening()}for(const e of this.takeBootBuffer()){this.processNetworkEvent(e)}if(!this.rawListenerUnsubscribe){this.rawListenerUnsubscribe=(0,_networkListener.addNetworkListener)(e=>{this.processNetworkEvent(e)})}t.adoptEarlyRequests()}stopCapturing(){this.takeBootBuffer();if(this.rawListenerUnsubscribe){this.rawListenerUnsubscribe();this.rawListenerUnsubscribe=null}if((0,_networkListener.getNetworkListenerCount)()===0){(0,_networkListener.stopNetworkListener)()}}disableCapture(){this.mirrorMode=true;this.takeBootBuffer();if((0,_networkListener.getNetworkListenerCount)()===0){(0,_networkListener.stopNetworkListener)()}super.disableCapture()}isCapturing(){return this.rawListenerUnsubscribe!==null}ensureInterception(){if(!this.isCapturing())return;(0,_networkListener.networkListener)().startListening()}subscribeToEvents(t){const e=super.subscribeToEvents(t);this.ensureInterception();return e}processNetworkEvent(t){if((0,_sharedUi.getAccountAccess)().status==="locked")return;const{request:e}=t;if(t.type==="request"){if(this.events.some(u=>u.id===e.id))return;const r=e.params?`?${new URLSearchParams(e.params).toString()}`:"";const s=`${e.url}${r}`;let n;let o;if(e.client==="graphql"){const u=(0,_extractOperationName.extractOperationName)(e.data);n=u||void 0;if(e.data&&typeof e.data==="object"&&"variables"in e.data&&e.data.variables&&typeof e.data.variables==="object"){o=e.data.variables}}const a={id:e.id,method:e.method,url:s,host:this.extractHost(e.url),path:this.extractPath(e.url),query:r,timestamp:t.timestamp.getTime(),requestHeaders:e.headers||{},requestData:e.data,requestSize:this.getDataSize(e.data),responseHeaders:{},requestClient:e.client,operationName:n,graphqlVariables:o,override:t.override,condition:t.condition};this.pendingRequests.set(e.id,a);this.events=[a,...this.events].slice(0,this.maxEvents);this.notify(a);this.notifyArrayListeners()}else if(t.type==="request-body"){const r=this.events.find(n=>n.id===e.id);if(!r)return;const s={...r,requestData:e.data,requestSize:this.getDataSize(e.data)};if(e.client==="graphql"){s.operationName=(0,_extractOperationName.extractOperationName)(e.data)||void 0;const n=e.data?.variables;if(n&&typeof n==="object")s.graphqlVariables=n}this.events=this.events.map(n=>n.id===e.id?s:n);if(this.pendingRequests.has(e.id))this.pendingRequests.set(e.id,s);_networkSavedStore.networkSavedStore.syncFromLive(s);this.notify(s);this.notifyArrayListeners()}else if(t.type==="response"||t.type==="error"){const r=this.events.findIndex(s=>s.id===e.id);if(r!==-1){const s={...this.events[r],duration:t.duration,timings:t.timings};if(t.response){s.status=t.response.status;s.statusText=t.response.statusText;s.responseHeaders=t.response.headers||{};s.responseData=t.response.body;s.responseSize=t.response.size||0;s.responseType=t.response.headers?.["content-type"]}if(t.error){s.error=t.error.message;s.status=s.status||0}if(t.override)s.override=t.override;this.events=this.events.map((n,o)=>o===r?s:n);this.pendingRequests.delete(e.id);_networkSavedStore.networkSavedStore.syncFromLive(s);this.notify(s);this.notifyArrayListeners()}}}extractHost(t){try{const e=new URL(t);return e.hostname}catch{return""}}extractPath(t){try{const e=new URL(t);return e.pathname}catch{return t}}getDataSize(t){if(!t)return 0;if(typeof t==="string")return t.length;try{return JSON.stringify(t).length}catch{return 0}}getEventById(t){return this.events.find(e=>e.id===t)}clearEvents(){super.clearEvents();this.pendingRequests.clear()}onEvent(t,e=true){const r=this.subscribe(t);if(e&&this.events.length>0){const s=[...this.events].reverse();for(const n of s){try{t(n)}catch{}}}return r}getStats(){const t=this.events.length;const e=this.events.filter(i=>i.status&&i.status>=200&&i.status<300).length;const r=this.events.filter(i=>i.error||i.status&&i.status>=400).length;const s=this.events.filter(i=>!i.status&&!i.error).length;const n=this.events.filter(i=>i.duration).map(i=>i.duration);const o=n.length>0?n.reduce((i,c)=>i+c,0)/n.length:0;const a=this.events.reduce((i,c)=>i+(c.requestSize||0),0);const u=this.events.reduce((i,c)=>i+(c.responseSize||0),0);return{totalRequests:t,successfulRequests:e,failedRequests:r,pendingRequests:s,totalDataSent:a,totalDataReceived:u,averageDuration:Math.round(o)}}filterEvents(t){let e=[...this.events];if(t.method){e=e.filter(r=>r.method===t.method)}if(t.status){switch(t.status){case"success":e=e.filter(r=>r.status&&r.status>=200&&r.status<300);break;case"error":e=e.filter(r=>r.error||r.status&&r.status>=400);break;case"pending":e=e.filter(r=>!r.status&&!r.error);break}}if(t.searchText){const r=t.searchText.toLowerCase();e=e.filter(s=>s.url.toLowerCase().includes(r)||s.method.toLowerCase().includes(r)||s.error&&s.error.toLowerCase().includes(r))}if(t.host){e=e.filter(r=>r.host===t.host)}return e}}const networkEventStore=exports.networkEventStore=new NetworkEventStore;
|