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