@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,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
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.generateNetworkCopyText = generateNetworkCopyText;
7
- /**
8
- * Pure copy-text generation for the network tool (rule3: reusable logic
9
- * extracted from the modal). Ported verbatim from the `generateCopyText`
10
- * callback previously inlined in NetworkModal — kept pure so the header
11
- * CopyButton can resolve it LAZILY at copy time (CopyButton accepts a
12
- * function value) instead of rebuilding the string on every event.
13
- *
14
- * PLATFORM-FREE ON PURPOSE: this module is reused verbatim by the web ports
15
- * (webview shims resolve `@buoy-gg/shared-ui` to a minimal storage-only shim),
16
- * so it must not reach the RN component graph or the shared-ui barrel. That is
17
- * why:
18
- * - `CopySettings` is defined HERE rather than imported from
19
- * NetworkCopySettingsView.tsx (which pulls in react-native + shared-ui RN
20
- * chrome). The RN view keeps its own structurally-identical definition —
21
- * keep the two shapes in sync.
22
- * - `formatBytes` is a verbatim copy of
23
- * shared/src/utils/formatting/dataFormatting.ts rather than the
24
- * `./formatting` re-export of `@buoy-gg/shared-ui` (not in the web shim).
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,411 +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
- if ((0, _networkListener.getNetworkListenerCount)() === 0) {
144
- (0, _networkListener.stopNetworkListener)();
145
- }
146
- }
147
-
148
- /**
149
- * Remote-mirror mode (desktop dashboard): on top of the base behavior, tear
150
- * down boot capture and drop its buffer — a mirror must never intercept its
151
- * OWN process's traffic, and must never flush host requests into the
152
- * device-event list it mirrors.
153
- */
154
- disableCapture() {
155
- this.mirrorMode = true;
156
- this.takeBootBuffer();
157
- if ((0, _networkListener.getNetworkListenerCount)() === 0) {
158
- (0, _networkListener.stopNetworkListener)();
159
- }
160
- super.disableCapture();
161
- }
162
-
163
- /**
164
- * Check if the store is actively capturing network events
165
- */
166
- isCapturing() {
167
- return this.rawListenerUnsubscribe !== null;
168
- }
169
-
170
- /**
171
- * Re-assert the interceptor if something re-assigned fetch/XHR since capture
172
- * started (Expo's runtime, RN DevTools, a second dev server's tooling — see
173
- * networkListener.startListening). A no-op costing two property reads when
174
- * everything is healthy, and a no-op entirely unless this store is actively
175
- * capturing — a mirror-mode dashboard must never install an interceptor in
176
- * its own process.
177
- */
178
- ensureInterception() {
179
- if (!this.isCapturing()) return;
180
- (0, _networkListener.networkListener)().startListening();
181
- }
182
-
183
- /**
184
- * Every new consumer — the Network modal opening, a badge mounting, a
185
- * dashboard watch attaching — is a chance to notice and repair a clobbered
186
- * interceptor, which matters because a long-lived watch can hold the
187
- * subscriber count above zero for the whole session (so the 0→1
188
- * startCapturing path would never run again).
189
- */
190
- subscribeToEvents(listener) {
191
- const unsubscribe = super.subscribeToEvents(listener);
192
- this.ensureInterception();
193
- return unsubscribe;
194
- }
195
-
196
- /**
197
- * Process a network listener event
198
- */
199
- processNetworkEvent(event) {
200
- if ((0, _sharedUi.getAccountAccess)().status === "locked") return;
201
- const {
202
- request
203
- } = event;
204
- if (event.type === "request") {
205
- // Replayed request notifications must not reset a completed row or add a second key.
206
- if (this.events.some(item => item.id === request.id)) return;
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 === "request-body") {
246
- const current = this.events.find(item => item.id === request.id);
247
- if (!current) return;
248
- const updated = {
249
- ...current,
250
- requestData: request.data,
251
- requestSize: this.getDataSize(request.data)
252
- };
253
- if (request.client === "graphql") {
254
- updated.operationName = (0, _extractOperationName.extractOperationName)(request.data) || undefined;
255
- const variables = request.data?.variables;
256
- if (variables && typeof variables === "object") updated.graphqlVariables = variables;
257
- }
258
- this.events = this.events.map(item => item.id === request.id ? updated : item);
259
- if (this.pendingRequests.has(request.id)) this.pendingRequests.set(request.id, updated);
260
- _networkSavedStore.networkSavedStore.syncFromLive(updated);
261
- this.notify(updated);
262
- this.notifyArrayListeners();
263
- } else if (event.type === "response" || event.type === "error") {
264
- const index = this.events.findIndex(e => e.id === request.id);
265
- if (index !== -1) {
266
- const updatedEvent = {
267
- ...this.events[index],
268
- duration: event.duration,
269
- // Left undefined when the interceptor couldn't measure it (e.g. a
270
- // request that failed before headers). Consumers hide the breakdown
271
- // in that case rather than rendering zeroes.
272
- timings: event.timings
273
- };
274
- if (event.response) {
275
- updatedEvent.status = event.response.status;
276
- updatedEvent.statusText = event.response.statusText;
277
- updatedEvent.responseHeaders = event.response.headers || {};
278
- updatedEvent.responseData = event.response.body;
279
- updatedEvent.responseSize = event.response.size || 0;
280
- updatedEvent.responseType = event.response.headers?.["content-type"];
281
- }
282
- if (event.error) {
283
- updatedEvent.error = event.error.message;
284
- updatedEvent.status = updatedEvent.status || 0;
285
- }
286
-
287
- // A pure-XHR request carries its mark all the way through; a `fetch`
288
- // one was marked at request time and is preserved by the spread above.
289
- if (event.override) updatedEvent.override = event.override;
290
- this.events = this.events.map((e, i) => i === index ? updatedEvent : e);
291
- this.pendingRequests.delete(request.id);
292
- // Refresh any pinned/saved snapshot of this request — a request pinned
293
- // while in flight would otherwise stay frozen as "Pending" forever.
294
- // No-ops on a single Set check when nothing is pinned.
295
- _networkSavedStore.networkSavedStore.syncFromLive(updatedEvent);
296
- this.notify(updatedEvent);
297
- this.notifyArrayListeners();
298
- }
299
- }
300
- }
301
- extractHost(url) {
302
- try {
303
- const urlObj = new URL(url);
304
- // @ts-ignore - this does exist on native
305
- return urlObj.hostname;
306
- } catch {
307
- return "";
308
- }
309
- }
310
- extractPath(url) {
311
- try {
312
- const urlObj = new URL(url);
313
- // @ts-ignore - this does exist on native
314
- return urlObj.pathname;
315
- } catch {
316
- return url;
317
- }
318
- }
319
- getDataSize(data) {
320
- if (!data) return 0;
321
- if (typeof data === "string") return data.length;
322
- try {
323
- return JSON.stringify(data).length;
324
- } catch {
325
- return 0;
326
- }
327
- }
328
- getEventById(id) {
329
- return this.events.find(e => e.id === id);
330
- }
331
-
332
- /**
333
- * Override clearEvents to also clear pending requests
334
- */
335
- clearEvents() {
336
- super.clearEvents();
337
- this.pendingRequests.clear();
338
- }
339
-
340
- /**
341
- * Subscribe to individual events with optional replay of existing events
342
- */
343
- onEvent(callback, replayExisting = true) {
344
- const unsubscribe = this.subscribe(callback);
345
-
346
- // Replay existing events if requested
347
- if (replayExisting && this.events.length > 0) {
348
- const existingEvents = [...this.events].reverse();
349
- for (const event of existingEvents) {
350
- try {
351
- callback(event);
352
- } catch {
353
- // Ignore callback errors
354
- }
355
- }
356
- }
357
- return unsubscribe;
358
- }
359
- getStats() {
360
- const total = this.events.length;
361
- const successful = this.events.filter(e => e.status && e.status >= 200 && e.status < 300).length;
362
- const failed = this.events.filter(e => e.error || e.status && e.status >= 400).length;
363
- const pending = this.events.filter(e => !e.status && !e.error).length;
364
- const durations = this.events.filter(e => e.duration).map(e => e.duration);
365
- const avgDuration = durations.length > 0 ? durations.reduce((a, b) => a + b, 0) / durations.length : 0;
366
- const totalSent = this.events.reduce((sum, e) => sum + (e.requestSize || 0), 0);
367
- const totalReceived = this.events.reduce((sum, e) => sum + (e.responseSize || 0), 0);
368
- return {
369
- totalRequests: total,
370
- successfulRequests: successful,
371
- failedRequests: failed,
372
- pendingRequests: pending,
373
- totalDataSent: totalSent,
374
- totalDataReceived: totalReceived,
375
- averageDuration: Math.round(avgDuration)
376
- };
377
- }
378
- filterEvents(filter) {
379
- let filtered = [...this.events];
380
- if (filter.method) {
381
- filtered = filtered.filter(e => e.method === filter.method);
382
- }
383
- if (filter.status) {
384
- switch (filter.status) {
385
- case "success":
386
- filtered = filtered.filter(e => e.status && e.status >= 200 && e.status < 300);
387
- break;
388
- case "error":
389
- filtered = filtered.filter(e => e.error || e.status && e.status >= 400);
390
- break;
391
- case "pending":
392
- filtered = filtered.filter(e => !e.status && !e.error);
393
- break;
394
- }
395
- }
396
- if (filter.searchText) {
397
- const search = filter.searchText.toLowerCase();
398
- filtered = filtered.filter(e => e.url.toLowerCase().includes(search) || e.method.toLowerCase().includes(search) || e.error && e.error.toLowerCase().includes(search));
399
- }
400
- if (filter.host) {
401
- filtered = filtered.filter(e => e.host === filter.host);
402
- }
403
- return filtered;
404
- }
405
- }
406
-
407
- /**
408
- * Singleton store that aggregates captured network traffic.
409
- * Automatically starts/stops capturing based on subscriber count.
410
- */
411
- 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;