@buoy-gg/network 7.0.41 → 7.0.43
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -85
- package/lib/commonjs/index.js +1 -332
- package/lib/commonjs/index.web.js +1 -420
- package/lib/commonjs/network/components/DataViewer.web.js +1 -879
- package/lib/commonjs/network/components/NetworkCopyScreen.web.js +1 -48
- package/lib/commonjs/network/components/NetworkCopySettingsView.js +27 -755
- package/lib/commonjs/network/components/NetworkCopySettingsView.web.js +14 -1242
- package/lib/commonjs/network/components/NetworkDetailScreen.web.js +1 -101
- package/lib/commonjs/network/components/NetworkDetailStepper.js +1 -108
- package/lib/commonjs/network/components/NetworkDetailStepper.web.js +1 -298
- package/lib/commonjs/network/components/NetworkEventDetailView.js +15 -1130
- package/lib/commonjs/network/components/NetworkEventDetailView.web.js +15 -1484
- package/lib/commonjs/network/components/NetworkEventItemCompact.js +2 -401
- package/lib/commonjs/network/components/NetworkEventItemCompact.web.js +2 -820
- package/lib/commonjs/network/components/NetworkFilterScreen.web.js +1 -55
- package/lib/commonjs/network/components/NetworkFilterViewV3.js +1 -442
- package/lib/commonjs/network/components/NetworkFilterViewV3.web.js +1 -1310
- package/lib/commonjs/network/components/NetworkHeaderLive.js +1 -375
- package/lib/commonjs/network/components/NetworkHeaderLive.web.js +1 -623
- package/lib/commonjs/network/components/NetworkHeaderMenu.js +1 -190
- package/lib/commonjs/network/components/NetworkListScreen.js +1 -403
- package/lib/commonjs/network/components/NetworkListScreen.web.js +1 -624
- package/lib/commonjs/network/components/NetworkModal.js +1 -786
- package/lib/commonjs/network/components/NetworkNumberPrompt.js +1 -178
- package/lib/commonjs/network/components/NetworkNumberPrompt.web.js +1 -232
- package/lib/commonjs/network/components/NetworkOverrideEditor.js +1 -814
- package/lib/commonjs/network/components/NetworkOverrideEditor.web.js +1 -942
- package/lib/commonjs/network/components/NetworkOverrideHeaderButton.js +1 -107
- package/lib/commonjs/network/components/NetworkOverrideHeaderButton.web.js +1 -133
- package/lib/commonjs/network/components/NetworkOverridesButton.js +1 -90
- package/lib/commonjs/network/components/NetworkOverridesButton.web.js +1 -143
- package/lib/commonjs/network/components/NetworkOverridesScreen.js +1 -543
- package/lib/commonjs/network/components/NetworkOverridesScreen.web.js +1 -830
- package/lib/commonjs/network/components/NetworkSavedScreen.js +1 -226
- package/lib/commonjs/network/components/NetworkSavedScreen.web.js +1 -463
- package/lib/commonjs/network/components/NetworkUpgradeBanner.js +1 -76
- package/lib/commonjs/network/components/response-editor/Explorer.js +1 -973
- package/lib/commonjs/network/components/response-editor/Explorer.web.js +1 -1136
- package/lib/commonjs/network/components/response-editor/deleteNestedDataByPath.js +1 -56
- package/lib/commonjs/network/components/response-editor/editorContext.js +1 -33
- package/lib/commonjs/network/components/response-editor/updateNestedDataByPath.js +1 -61
- package/lib/commonjs/network/conditions/NetworkConditionsControl.js +1 -235
- package/lib/commonjs/network/conditions/NetworkConditionsControl.test.js +1 -136
- package/lib/commonjs/network/conditions/NetworkConditionsIcon.js +1 -33
- package/lib/commonjs/network/conditions/NetworkFloatingTool.js +1 -310
- package/lib/commonjs/network/conditions/NetworkFloatingTool.test.js +1 -219
- package/lib/commonjs/network/conditions/store.js +1 -75
- package/lib/commonjs/network/conditions/wait.js +1 -43
- package/lib/commonjs/network/conditions/xhr.js +1 -135
- package/lib/commonjs/network/hooks/useLiveNetworkEvent.js +1 -62
- package/lib/commonjs/network/hooks/useNetworkBadgeCounts.js +1 -83
- package/lib/commonjs/network/hooks/useNetworkEventList.js +1 -108
- package/lib/commonjs/network/hooks/useNetworkEvents.js +1 -318
- package/lib/commonjs/network/hooks/useNetworkHasMatches.js +1 -56
- package/lib/commonjs/network/hooks/useNetworkSaved.js +1 -38
- package/lib/commonjs/network/hooks/useNetworkSelection.js +1 -53
- package/lib/commonjs/network/hooks/useOverrideRules.js +1 -36
- package/lib/commonjs/network/hooks/useTickEveryMinute.js +1 -21
- package/lib/commonjs/network/overrides/applyToFetch.js +1 -80
- package/lib/commonjs/network/overrides/applyToXhr.js +2 -510
- package/lib/commonjs/network/overrides/engine.js +1 -93
- package/lib/commonjs/network/overrides/matchRule.js +1 -87
- package/lib/commonjs/network/overrides/overriddenRows.js +1 -37
- package/lib/commonjs/network/overrides/overrideRulesStore.js +1 -550
- package/lib/commonjs/network/overrides/presets.js +1 -70
- package/lib/commonjs/network/overrides/resolveOverride.js +1 -158
- package/lib/commonjs/network/overrides/types.js +1 -90
- package/lib/commonjs/network/sync/networkBodyResolver.js +1 -39
- package/lib/commonjs/network/sync/networkSyncAdapter.js +1 -882
- package/lib/commonjs/network/sync/overrideHonesty.release.test.js +1 -36
- package/lib/commonjs/network/types/index.js +1 -5
- package/lib/commonjs/network/utils/extractOperationName.js +1 -80
- package/lib/commonjs/network/utils/filterNetworkEvents.js +1 -96
- package/lib/commonjs/network/utils/formatGraphQLVariables.js +1 -219
- package/lib/commonjs/network/utils/formatting.js +1 -30
- package/lib/commonjs/network/utils/generateCurl.js +2 -71
- package/lib/commonjs/network/utils/generateNetworkCopyText.js +37 -166
- package/lib/commonjs/network/utils/httpCompletion.js +1 -37
- package/lib/commonjs/network/utils/networkEventStore.js +1 -411
- package/lib/commonjs/network/utils/networkListener.js +4 -1352
- package/lib/commonjs/network/utils/networkSavedStore.js +3 -577
- package/lib/commonjs/network/utils/networkSelectionStore.js +1 -193
- package/lib/commonjs/network/utils/realNow.js +1 -0
- package/lib/commonjs/network/utils/requestId.js +1 -16
- package/lib/commonjs/network/utils/resolveRequestUrl.js +1 -15
- package/lib/commonjs/network/utils/selectSavedEvents.js +1 -39
- package/lib/commonjs/network/utils/startNetworkCapture.js +1 -24
- package/lib/commonjs/network/utils/withPinnedFirst.js +1 -32
- package/lib/commonjs/preset.js +1 -93
- package/lib/module/index.js +1 -104
- package/lib/module/index.web.js +1 -82
- package/lib/module/network/components/DataViewer.web.js +1 -875
- package/lib/module/network/components/NetworkCopyScreen.web.js +1 -44
- package/lib/module/network/components/NetworkCopySettingsView.js +27 -750
- package/lib/module/network/components/NetworkCopySettingsView.web.js +14 -1237
- package/lib/module/network/components/NetworkDetailScreen.web.js +1 -97
- package/lib/module/network/components/NetworkDetailStepper.js +1 -104
- package/lib/module/network/components/NetworkDetailStepper.web.js +1 -296
- package/lib/module/network/components/NetworkEventDetailView.js +15 -1129
- package/lib/module/network/components/NetworkEventDetailView.web.js +15 -1482
- package/lib/module/network/components/NetworkEventItemCompact.js +2 -398
- package/lib/module/network/components/NetworkEventItemCompact.web.js +2 -818
- package/lib/module/network/components/NetworkFilterScreen.web.js +1 -51
- package/lib/module/network/components/NetworkFilterViewV3.js +1 -438
- package/lib/module/network/components/NetworkFilterViewV3.web.js +1 -1306
- package/lib/module/network/components/NetworkHeaderLive.js +1 -366
- package/lib/module/network/components/NetworkHeaderLive.web.js +1 -617
- package/lib/module/network/components/NetworkHeaderMenu.js +1 -184
- package/lib/module/network/components/NetworkListScreen.js +1 -399
- package/lib/module/network/components/NetworkListScreen.web.js +1 -622
- package/lib/module/network/components/NetworkModal.js +1 -781
- package/lib/module/network/components/NetworkNumberPrompt.js +1 -174
- package/lib/module/network/components/NetworkNumberPrompt.web.js +1 -230
- package/lib/module/network/components/NetworkOverrideEditor.js +1 -811
- package/lib/module/network/components/NetworkOverrideEditor.web.js +1 -939
- package/lib/module/network/components/NetworkOverrideHeaderButton.js +1 -104
- package/lib/module/network/components/NetworkOverrideHeaderButton.web.js +1 -131
- package/lib/module/network/components/NetworkOverridesButton.js +1 -87
- package/lib/module/network/components/NetworkOverridesButton.web.js +1 -141
- package/lib/module/network/components/NetworkOverridesScreen.js +1 -539
- package/lib/module/network/components/NetworkOverridesScreen.web.js +1 -826
- package/lib/module/network/components/NetworkSavedScreen.js +1 -222
- package/lib/module/network/components/NetworkSavedScreen.web.js +1 -461
- package/lib/module/network/components/NetworkUpgradeBanner.js +1 -72
- package/lib/module/network/components/response-editor/Explorer.js +1 -972
- package/lib/module/network/components/response-editor/Explorer.web.js +1 -1133
- package/lib/module/network/components/response-editor/deleteNestedDataByPath.js +1 -51
- package/lib/module/network/components/response-editor/editorContext.js +1 -29
- package/lib/module/network/components/response-editor/updateNestedDataByPath.js +1 -56
- package/lib/module/network/conditions/NetworkConditionsControl.js +1 -231
- package/lib/module/network/conditions/NetworkConditionsControl.test.js +1 -135
- package/lib/module/network/conditions/NetworkConditionsIcon.js +1 -29
- package/lib/module/network/conditions/NetworkFloatingTool.js +1 -304
- package/lib/module/network/conditions/NetworkFloatingTool.test.js +1 -218
- package/lib/module/network/conditions/store.js +1 -65
- package/lib/module/network/conditions/wait.js +1 -38
- package/lib/module/network/conditions/xhr.js +1 -131
- package/lib/module/network/hooks/useLiveNetworkEvent.js +1 -58
- package/lib/module/network/hooks/useNetworkBadgeCounts.js +1 -79
- package/lib/module/network/hooks/useNetworkEventList.js +1 -104
- package/lib/module/network/hooks/useNetworkEvents.js +1 -314
- package/lib/module/network/hooks/useNetworkHasMatches.js +1 -52
- package/lib/module/network/hooks/useNetworkSaved.js +1 -34
- package/lib/module/network/hooks/useNetworkSelection.js +1 -46
- package/lib/module/network/hooks/useOverrideRules.js +1 -32
- package/lib/module/network/hooks/useTickEveryMinute.js +1 -11
- package/lib/module/network/overrides/applyToFetch.js +1 -72
- package/lib/module/network/overrides/applyToXhr.js +2 -502
- package/lib/module/network/overrides/engine.js +1 -85
- package/lib/module/network/overrides/matchRule.js +1 -81
- package/lib/module/network/overrides/overriddenRows.js +1 -33
- package/lib/module/network/overrides/overrideRulesStore.js +1 -547
- package/lib/module/network/overrides/presets.js +1 -65
- package/lib/module/network/overrides/resolveOverride.js +1 -152
- package/lib/module/network/overrides/types.js +1 -86
- package/lib/module/network/sync/networkBodyResolver.js +1 -34
- package/lib/module/network/sync/networkSyncAdapter.js +1 -880
- package/lib/module/network/sync/overrideHonesty.release.test.js +1 -35
- package/lib/module/network/types/index.js +1 -3
- package/lib/module/network/utils/extractOperationName.js +1 -76
- package/lib/module/network/utils/filterNetworkEvents.js +1 -92
- package/lib/module/network/utils/formatGraphQLVariables.js +1 -213
- package/lib/module/network/utils/formatting.js +1 -9
- package/lib/module/network/utils/generateCurl.js +2 -67
- package/lib/module/network/utils/generateNetworkCopyText.js +37 -162
- package/lib/module/network/utils/httpCompletion.js +1 -32
- package/lib/module/network/utils/networkEventStore.js +1 -409
- package/lib/module/network/utils/networkListener.js +4 -1341
- package/lib/module/network/utils/networkSavedStore.js +3 -572
- package/lib/module/network/utils/networkSelectionStore.js +1 -188
- package/lib/module/network/utils/realNow.js +1 -0
- package/lib/module/network/utils/requestId.js +1 -12
- package/lib/module/network/utils/resolveRequestUrl.js +1 -11
- package/lib/module/network/utils/selectSavedEvents.js +1 -35
- package/lib/module/network/utils/startNetworkCapture.js +1 -21
- package/lib/module/network/utils/withPinnedFirst.js +1 -28
- package/lib/module/preset.js +1 -91
- package/lib/typescript/network/overrides/engine.d.ts +1 -1
- package/lib/typescript/network/overrides/matchRule.d.ts +1 -1
- package/lib/typescript/network/overrides/resolveOverride.d.ts +2 -2
- package/lib/typescript/network/overrides/types.d.ts +9 -0
- package/lib/typescript/network/utils/networkListener.d.ts +11 -0
- package/lib/typescript/network/utils/realNow.d.ts +18 -0
- package/lib/web/index.mjs +73 -74
- package/package.json +3 -6
- package/lib/typescript/index.d.ts.map +0 -1
- package/lib/typescript/index.web.d.ts.map +0 -1
- package/lib/typescript/network/components/DataViewer.web.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkCopyScreen.web.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkCopySettingsView.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkCopySettingsView.web.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkDetailScreen.web.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkDetailStepper.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkDetailStepper.web.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkEventDetailView.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkEventDetailView.web.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkEventItemCompact.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkEventItemCompact.web.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkFilterScreen.web.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkFilterViewV3.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkFilterViewV3.web.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkHeaderLive.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkHeaderLive.web.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkHeaderMenu.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkListScreen.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkListScreen.web.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkModal.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkNumberPrompt.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkNumberPrompt.web.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkOverrideEditor.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkOverrideEditor.web.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkOverrideHeaderButton.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkOverrideHeaderButton.web.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkOverridesButton.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkOverridesButton.web.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkOverridesScreen.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkOverridesScreen.web.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkSavedScreen.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkSavedScreen.web.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkUpgradeBanner.d.ts.map +0 -1
- package/lib/typescript/network/components/response-editor/Explorer.d.ts.map +0 -1
- package/lib/typescript/network/components/response-editor/Explorer.web.d.ts.map +0 -1
- package/lib/typescript/network/components/response-editor/deleteNestedDataByPath.d.ts.map +0 -1
- package/lib/typescript/network/components/response-editor/editorContext.d.ts.map +0 -1
- package/lib/typescript/network/components/response-editor/updateNestedDataByPath.d.ts.map +0 -1
- package/lib/typescript/network/conditions/NetworkConditionsControl.d.ts.map +0 -1
- package/lib/typescript/network/conditions/NetworkConditionsControl.test.d.ts.map +0 -1
- package/lib/typescript/network/conditions/NetworkConditionsIcon.d.ts.map +0 -1
- package/lib/typescript/network/conditions/NetworkFloatingTool.d.ts.map +0 -1
- package/lib/typescript/network/conditions/NetworkFloatingTool.test.d.ts.map +0 -1
- package/lib/typescript/network/conditions/store.d.ts.map +0 -1
- package/lib/typescript/network/conditions/wait.d.ts.map +0 -1
- package/lib/typescript/network/conditions/xhr.d.ts.map +0 -1
- package/lib/typescript/network/hooks/useLiveNetworkEvent.d.ts.map +0 -1
- package/lib/typescript/network/hooks/useNetworkBadgeCounts.d.ts.map +0 -1
- package/lib/typescript/network/hooks/useNetworkEventList.d.ts.map +0 -1
- package/lib/typescript/network/hooks/useNetworkEvents.d.ts.map +0 -1
- package/lib/typescript/network/hooks/useNetworkHasMatches.d.ts.map +0 -1
- package/lib/typescript/network/hooks/useNetworkSaved.d.ts.map +0 -1
- package/lib/typescript/network/hooks/useNetworkSelection.d.ts.map +0 -1
- package/lib/typescript/network/hooks/useOverrideRules.d.ts.map +0 -1
- package/lib/typescript/network/hooks/useTickEveryMinute.d.ts.map +0 -1
- package/lib/typescript/network/overrides/applyToFetch.d.ts.map +0 -1
- package/lib/typescript/network/overrides/applyToXhr.d.ts.map +0 -1
- package/lib/typescript/network/overrides/engine.d.ts.map +0 -1
- package/lib/typescript/network/overrides/matchRule.d.ts.map +0 -1
- package/lib/typescript/network/overrides/overriddenRows.d.ts.map +0 -1
- package/lib/typescript/network/overrides/overrideRulesStore.d.ts.map +0 -1
- package/lib/typescript/network/overrides/presets.d.ts.map +0 -1
- package/lib/typescript/network/overrides/resolveOverride.d.ts.map +0 -1
- package/lib/typescript/network/overrides/types.d.ts.map +0 -1
- package/lib/typescript/network/sync/networkBodyResolver.d.ts.map +0 -1
- package/lib/typescript/network/sync/networkSyncAdapter.d.ts.map +0 -1
- package/lib/typescript/network/sync/overrideHonesty.release.test.d.ts.map +0 -1
- package/lib/typescript/network/types/index.d.ts.map +0 -1
- package/lib/typescript/network/utils/extractOperationName.d.ts.map +0 -1
- package/lib/typescript/network/utils/filterNetworkEvents.d.ts.map +0 -1
- package/lib/typescript/network/utils/formatGraphQLVariables.d.ts.map +0 -1
- package/lib/typescript/network/utils/formatting.d.ts.map +0 -1
- package/lib/typescript/network/utils/generateCurl.d.ts.map +0 -1
- package/lib/typescript/network/utils/generateNetworkCopyText.d.ts.map +0 -1
- package/lib/typescript/network/utils/httpCompletion.d.ts.map +0 -1
- package/lib/typescript/network/utils/networkEventStore.d.ts.map +0 -1
- package/lib/typescript/network/utils/networkListener.d.ts.map +0 -1
- package/lib/typescript/network/utils/networkSavedStore.d.ts.map +0 -1
- package/lib/typescript/network/utils/networkSelectionStore.d.ts.map +0 -1
- package/lib/typescript/network/utils/requestId.d.ts.map +0 -1
- package/lib/typescript/network/utils/resolveRequestUrl.d.ts.map +0 -1
- package/lib/typescript/network/utils/selectSavedEvents.d.ts.map +0 -1
- package/lib/typescript/network/utils/startNetworkCapture.d.ts.map +0 -1
- package/lib/typescript/network/utils/withPinnedFirst.d.ts.map +0 -1
- package/lib/typescript/preset.d.ts.map +0 -1
|
@@ -1,318 +1 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.FREE_TIER_REQUEST_LIMIT = void 0;
|
|
7
|
-
exports.useNetworkEvents = useNetworkEvents;
|
|
8
|
-
var _react = require("react");
|
|
9
|
-
var _networkEventStore = require("../utils/networkEventStore");
|
|
10
|
-
var _sharedUi = require("@buoy-gg/shared-ui");
|
|
11
|
-
var _formatGraphQLVariables = require("../utils/formatGraphQLVariables");
|
|
12
|
-
/**
|
|
13
|
-
* Hook for accessing network events and controls
|
|
14
|
-
*
|
|
15
|
-
* Uses self-managing Subscribable pattern - the network listener automatically
|
|
16
|
-
* starts when this hook mounts and stops when all subscribers unmount.
|
|
17
|
-
*/
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* @deprecated Read the live limit with `useLimit("network.requests")` — this
|
|
21
|
-
* only reports the FREE tier's value and ignores the Weekend Pass. Kept
|
|
22
|
-
* because it is part of the package's public exports.
|
|
23
|
-
*/
|
|
24
|
-
const FREE_TIER_REQUEST_LIMIT = exports.FREE_TIER_REQUEST_LIMIT = _sharedUi.TIER_LIMITS["network.requests"].free;
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* Custom hook for accessing network events and controls
|
|
28
|
-
*
|
|
29
|
-
* This hook provides a complete interface for network monitoring, including
|
|
30
|
-
* event filtering, statistics calculation, and interception control.
|
|
31
|
-
*
|
|
32
|
-
* The network listener automatically starts when this hook mounts and stops
|
|
33
|
-
* when all components using it unmount (Subscribable pattern from TanStack Query).
|
|
34
|
-
*
|
|
35
|
-
* @returns Object containing filtered events, statistics, controls, and utilities
|
|
36
|
-
*
|
|
37
|
-
* @example
|
|
38
|
-
* ```typescript
|
|
39
|
-
* function NetworkMonitor() {
|
|
40
|
-
* const {
|
|
41
|
-
* events,
|
|
42
|
-
* stats,
|
|
43
|
-
* filter,
|
|
44
|
-
* setFilter,
|
|
45
|
-
* clearEvents,
|
|
46
|
-
* isCapturing
|
|
47
|
-
* } = useNetworkEvents();
|
|
48
|
-
*
|
|
49
|
-
* return (
|
|
50
|
-
* <div>
|
|
51
|
-
* <p>Total requests: {stats.totalRequests}</p>
|
|
52
|
-
* <p>Success rate: {stats.successfulRequests}/{stats.totalRequests}</p>
|
|
53
|
-
* <p>Capturing: {isCapturing ? 'Yes' : 'No'}</p>
|
|
54
|
-
* </div>
|
|
55
|
-
* );
|
|
56
|
-
* }
|
|
57
|
-
* ```
|
|
58
|
-
*
|
|
59
|
-
* @performance Uses memoization for expensive filtering and statistics calculations
|
|
60
|
-
* @performance Optimizes string operations and array processing for large datasets
|
|
61
|
-
* @performance Includes Set-based lookups for O(1) filter matching
|
|
62
|
-
*
|
|
63
|
-
* @param options.isPro - Force the unlimited view. Defaults to false, in
|
|
64
|
-
* which case the current tier's limit from `useLimit("network.requests")`
|
|
65
|
-
* applies.
|
|
66
|
-
*/
|
|
67
|
-
function useNetworkEvents(options = {}) {
|
|
68
|
-
const {
|
|
69
|
-
isPro = false
|
|
70
|
-
} = options;
|
|
71
|
-
const tierLimit = (0, _sharedUi.useLimit)("network.requests");
|
|
72
|
-
// `isPro` stays an option so callers can force the unlimited view.
|
|
73
|
-
const requestLimit = isPro ? Infinity : tierLimit;
|
|
74
|
-
const [events, setEvents] = (0, _react.useState)([]);
|
|
75
|
-
const [filter, setFilter] = (0, _react.useState)({});
|
|
76
|
-
const [isCapturing, setIsCapturing] = (0, _react.useState)(true);
|
|
77
|
-
const unsubscribeRef = (0, _react.useRef)(null);
|
|
78
|
-
|
|
79
|
-
// Subscribe/unsubscribe to event store based on isCapturing state.
|
|
80
|
-
// Each subscriber is independent — pausing this hook's subscription
|
|
81
|
-
// does not affect other subscribers (e.g. the events tool).
|
|
82
|
-
(0, _react.useEffect)(() => {
|
|
83
|
-
if (isCapturing) {
|
|
84
|
-
unsubscribeRef.current = _networkEventStore.networkEventStore.subscribeToEvents(setEvents);
|
|
85
|
-
}
|
|
86
|
-
return () => {
|
|
87
|
-
if (unsubscribeRef.current) {
|
|
88
|
-
unsubscribeRef.current();
|
|
89
|
-
unsubscribeRef.current = null;
|
|
90
|
-
}
|
|
91
|
-
};
|
|
92
|
-
}, [isCapturing]);
|
|
93
|
-
|
|
94
|
-
// Clear all events (also update local state in case we're paused/unsubscribed)
|
|
95
|
-
const clearEvents = (0, _react.useCallback)(() => {
|
|
96
|
-
_networkEventStore.networkEventStore.clearEvents();
|
|
97
|
-
setEvents([]);
|
|
98
|
-
}, []);
|
|
99
|
-
|
|
100
|
-
// Pause: unsubscribe this hook from the store (other subscribers unaffected)
|
|
101
|
-
const pauseCapturing = (0, _react.useCallback)(() => {
|
|
102
|
-
setIsCapturing(false);
|
|
103
|
-
}, []);
|
|
104
|
-
|
|
105
|
-
// Resume: resubscribe this hook to the store
|
|
106
|
-
const resumeCapturing = (0, _react.useCallback)(() => {
|
|
107
|
-
setIsCapturing(true);
|
|
108
|
-
}, []);
|
|
109
|
-
|
|
110
|
-
// Memoize search text processing to avoid repeated toLowerCase calls
|
|
111
|
-
// Performance: Expensive string operations repeated for every event on every filter
|
|
112
|
-
const searchLower = (0, _react.useMemo)(() => {
|
|
113
|
-
return filter.searchText ? filter.searchText.toLowerCase() : null;
|
|
114
|
-
}, [filter.searchText]);
|
|
115
|
-
|
|
116
|
-
// Memoize method filter Set for O(1) lookup instead of Array.includes
|
|
117
|
-
// Performance: Converting array.includes to Set.has for faster lookups with large method lists
|
|
118
|
-
const methodSet = (0, _react.useMemo)(() => {
|
|
119
|
-
return filter.method && filter.method.length > 0 ? new Set(filter.method) : null;
|
|
120
|
-
}, [filter.method]);
|
|
121
|
-
|
|
122
|
-
// Memoize content type Set for O(1) lookup
|
|
123
|
-
// Performance: Converting array.some to Set.has for faster content type matching
|
|
124
|
-
const contentTypeSet = (0, _react.useMemo)(() => {
|
|
125
|
-
return filter.contentType && filter.contentType.length > 0 ? new Set(filter.contentType) : null;
|
|
126
|
-
}, [filter.contentType]);
|
|
127
|
-
|
|
128
|
-
// Filter events with optimized string operations and Set lookups
|
|
129
|
-
// Performance: Complex multi-stage filtering with string operations and content type matching
|
|
130
|
-
const filteredEvents = (0, _react.useMemo)(() => {
|
|
131
|
-
let filtered = [...events];
|
|
132
|
-
if (methodSet) {
|
|
133
|
-
filtered = filtered.filter(e => methodSet.has(e.method));
|
|
134
|
-
}
|
|
135
|
-
if (filter.status && filter.status !== "all") {
|
|
136
|
-
switch (filter.status) {
|
|
137
|
-
case "success":
|
|
138
|
-
filtered = filtered.filter(e => e.status && e.status >= 200 && e.status < 300);
|
|
139
|
-
break;
|
|
140
|
-
case "error":
|
|
141
|
-
filtered = filtered.filter(e => e.error || e.status && e.status >= 400);
|
|
142
|
-
break;
|
|
143
|
-
case "pending":
|
|
144
|
-
filtered = filtered.filter(e => !e.status && !e.error);
|
|
145
|
-
break;
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
if (searchLower) {
|
|
149
|
-
filtered = filtered.filter(e => e.url.toLowerCase().includes(searchLower) || e.method.toLowerCase().includes(searchLower) || e.path?.toLowerCase().includes(searchLower) || e.host?.toLowerCase().includes(searchLower) || e.error && e.error.toLowerCase().includes(searchLower) ||
|
|
150
|
-
// Search by GraphQL operation name (e.g., "GetUser", "CreatePost")
|
|
151
|
-
e.operationName && e.operationName.toLowerCase().includes(searchLower) ||
|
|
152
|
-
// Search by GraphQL variable values (e.g., "Sandshrew", "123", "true")
|
|
153
|
-
// This enables finding specific requests like "GetPokemon › Sandshrew" by typing "Sandshrew"
|
|
154
|
-
(0, _formatGraphQLVariables.searchGraphQLVariables)(e.graphqlVariables, searchLower));
|
|
155
|
-
}
|
|
156
|
-
if (filter.host) {
|
|
157
|
-
filtered = filtered.filter(e => e.host === filter.host);
|
|
158
|
-
}
|
|
159
|
-
if (contentTypeSet) {
|
|
160
|
-
filtered = filtered.filter(e => {
|
|
161
|
-
const headers = e.responseHeaders || e.requestHeaders;
|
|
162
|
-
const contentType = headers?.["content-type"] || headers?.["Content-Type"] || "";
|
|
163
|
-
for (const type of contentTypeSet) {
|
|
164
|
-
switch (type) {
|
|
165
|
-
case "JSON":
|
|
166
|
-
if (contentType.includes("json")) return true;
|
|
167
|
-
break;
|
|
168
|
-
case "XML":
|
|
169
|
-
if (contentType.includes("xml")) return true;
|
|
170
|
-
break;
|
|
171
|
-
case "HTML":
|
|
172
|
-
if (contentType.includes("html")) return true;
|
|
173
|
-
break;
|
|
174
|
-
case "TEXT":
|
|
175
|
-
if (contentType.includes("text")) return true;
|
|
176
|
-
break;
|
|
177
|
-
case "IMAGE":
|
|
178
|
-
if (contentType.includes("image")) return true;
|
|
179
|
-
break;
|
|
180
|
-
case "VIDEO":
|
|
181
|
-
if (contentType.includes("video")) return true;
|
|
182
|
-
break;
|
|
183
|
-
case "AUDIO":
|
|
184
|
-
if (contentType.includes("audio")) return true;
|
|
185
|
-
break;
|
|
186
|
-
case "FORM":
|
|
187
|
-
if (contentType.includes("form")) return true;
|
|
188
|
-
break;
|
|
189
|
-
case "OTHER":
|
|
190
|
-
if (!contentType || !contentType.includes("json") && !contentType.includes("xml") && !contentType.includes("html") && !contentType.includes("text") && !contentType.includes("image") && !contentType.includes("video") && !contentType.includes("audio") && !contentType.includes("form")) {
|
|
191
|
-
return true;
|
|
192
|
-
}
|
|
193
|
-
break;
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
return false;
|
|
197
|
-
});
|
|
198
|
-
}
|
|
199
|
-
return filtered;
|
|
200
|
-
}, [events, filter, searchLower, methodSet, contentTypeSet]);
|
|
201
|
-
|
|
202
|
-
// Events beyond the tier limit are "locked". Keyed off the ORIGINAL event
|
|
203
|
-
// order, not the filtered results, so locked events stay locked when
|
|
204
|
-
// searching. slice(Infinity) is empty, so Pro locks nothing.
|
|
205
|
-
const lockedEventIds = (0, _react.useMemo)(() => {
|
|
206
|
-
const lockedIds = new Set();
|
|
207
|
-
events.slice(requestLimit).forEach(event => {
|
|
208
|
-
lockedIds.add(event.id);
|
|
209
|
-
});
|
|
210
|
-
return lockedIds;
|
|
211
|
-
}, [events, requestLimit]);
|
|
212
|
-
|
|
213
|
-
// Check if there are locked events in the current filtered results
|
|
214
|
-
const lockedEventsInFilter = (0, _react.useMemo)(() => {
|
|
215
|
-
return filteredEvents.filter(event => lockedEventIds.has(event.id));
|
|
216
|
-
}, [filteredEvents, lockedEventIds]);
|
|
217
|
-
const hasLockedEvents = lockedEventsInFilter.length > 0;
|
|
218
|
-
const lockedEventCount = lockedEventsInFilter.length;
|
|
219
|
-
|
|
220
|
-
// Helper to check if a specific event is locked
|
|
221
|
-
const isEventLocked = (0, _react.useCallback)(eventId => {
|
|
222
|
-
return lockedEventIds.has(eventId);
|
|
223
|
-
}, [lockedEventIds]);
|
|
224
|
-
|
|
225
|
-
// Memoize expensive statistics calculation by categorizing events in single pass
|
|
226
|
-
// Performance: Multiple array.filter operations replaced with single loop for better performance
|
|
227
|
-
const stats = (0, _react.useMemo)(() => {
|
|
228
|
-
let successful = 0;
|
|
229
|
-
let failed = 0;
|
|
230
|
-
let pending = 0;
|
|
231
|
-
let totalSent = 0;
|
|
232
|
-
let totalReceived = 0;
|
|
233
|
-
let durationSum = 0;
|
|
234
|
-
let durationCount = 0;
|
|
235
|
-
|
|
236
|
-
// Single pass through events for all statistics
|
|
237
|
-
for (const event of events) {
|
|
238
|
-
// Categorize status
|
|
239
|
-
if (event.status && event.status >= 200 && event.status < 300) {
|
|
240
|
-
successful++;
|
|
241
|
-
} else if (event.error || event.status && event.status >= 400) {
|
|
242
|
-
failed++;
|
|
243
|
-
} else if (!event.status && !event.error) {
|
|
244
|
-
pending++;
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
// Accumulate data sizes
|
|
248
|
-
totalSent += event.requestSize || 0;
|
|
249
|
-
totalReceived += event.responseSize || 0;
|
|
250
|
-
|
|
251
|
-
// Accumulate durations
|
|
252
|
-
if (event.duration) {
|
|
253
|
-
durationSum += event.duration;
|
|
254
|
-
durationCount++;
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
const avgDuration = durationCount > 0 ? durationSum / durationCount : 0;
|
|
258
|
-
return {
|
|
259
|
-
totalRequests: events.length,
|
|
260
|
-
successfulRequests: successful,
|
|
261
|
-
failedRequests: failed,
|
|
262
|
-
pendingRequests: pending,
|
|
263
|
-
totalDataSent: totalSent,
|
|
264
|
-
totalDataReceived: totalReceived,
|
|
265
|
-
averageDuration: Math.round(avgDuration)
|
|
266
|
-
};
|
|
267
|
-
}, [events]);
|
|
268
|
-
|
|
269
|
-
// Memoize unique hosts extraction with single pass instead of map + filter + Set
|
|
270
|
-
// Performance: Avoiding array.map().filter() chain, using single loop with Set for deduplication
|
|
271
|
-
const hosts = (0, _react.useMemo)(() => {
|
|
272
|
-
const hostSet = new Set();
|
|
273
|
-
for (const event of events) {
|
|
274
|
-
if (event.host) {
|
|
275
|
-
hostSet.add(event.host);
|
|
276
|
-
}
|
|
277
|
-
}
|
|
278
|
-
return Array.from(hostSet);
|
|
279
|
-
}, [events]);
|
|
280
|
-
|
|
281
|
-
// Memoize unique methods extraction with single pass
|
|
282
|
-
// Performance: Avoiding array.map() + Set constructor, using single loop for better performance
|
|
283
|
-
const methods = (0, _react.useMemo)(() => {
|
|
284
|
-
const methodSet = new Set();
|
|
285
|
-
for (const event of events) {
|
|
286
|
-
methodSet.add(event.method);
|
|
287
|
-
}
|
|
288
|
-
return Array.from(methodSet);
|
|
289
|
-
}, [events]);
|
|
290
|
-
return {
|
|
291
|
-
/** Filtered events (all shown, but some may be locked for free users) */
|
|
292
|
-
events: filteredEvents,
|
|
293
|
-
/** All events before filtering (for stats) */
|
|
294
|
-
allEvents: events,
|
|
295
|
-
stats,
|
|
296
|
-
filter,
|
|
297
|
-
setFilter,
|
|
298
|
-
clearEvents,
|
|
299
|
-
/** Whether this hook is subscribed and receiving network events */
|
|
300
|
-
isCapturing,
|
|
301
|
-
/** Unsubscribe this hook from the network store (other subscribers unaffected) */
|
|
302
|
-
pauseCapturing,
|
|
303
|
-
/** Resubscribe this hook to the network store */
|
|
304
|
-
resumeCapturing,
|
|
305
|
-
hosts,
|
|
306
|
-
methods,
|
|
307
|
-
/** Whether there are locked events due to free tier limit */
|
|
308
|
-
hasLockedEvents,
|
|
309
|
-
/** Number of events locked due to free tier limit */
|
|
310
|
-
lockedEventCount,
|
|
311
|
-
/** Check if a specific event is locked (by ID) */
|
|
312
|
-
isEventLocked,
|
|
313
|
-
/** The live request limit for this tier (Infinity when unlimited). */
|
|
314
|
-
requestLimit,
|
|
315
|
-
/** Get subscriber counts for debugging */
|
|
316
|
-
getSubscriberCounts: () => _networkEventStore.networkEventStore.getSubscriberCounts()
|
|
317
|
-
};
|
|
318
|
-
}
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.FREE_TIER_REQUEST_LIMIT=void 0;exports.useNetworkEvents=useNetworkEvents;var _react=require("react");var _networkEventStore=require("../utils/networkEventStore");var _sharedUi=require("@buoy-gg/shared-ui");var _formatGraphQLVariables=require("../utils/formatGraphQLVariables");const FREE_TIER_REQUEST_LIMIT=exports.FREE_TIER_REQUEST_LIMIT=_sharedUi.TIER_LIMITS["network.requests"].free;function useNetworkEvents(T={}){const{isPro:w=false}=T;const L=(0,_sharedUi.useLimit)("network.requests");const d=w?Infinity:L;const[n,k]=(0,_react.useState)([]);const[r,g]=(0,_react.useState)({});const[f,p]=(0,_react.useState)(true);const i=(0,_react.useRef)(null);(0,_react.useEffect)(()=>{if(f){i.current=_networkEventStore.networkEventStore.subscribeToEvents(k)}return()=>{if(i.current){i.current();i.current=null}}},[f]);const C=(0,_react.useCallback)(()=>{_networkEventStore.networkEventStore.clearEvents();k([])},[]);const I=(0,_react.useCallback)(()=>{p(false)},[]);const R=(0,_react.useCallback)(()=>{p(true)},[]);const u=(0,_react.useMemo)(()=>{return r.searchText?r.searchText.toLowerCase():null},[r.searchText]);const h=(0,_react.useMemo)(()=>{return r.method&&r.method.length>0?new Set(r.method):null},[r.method]);const E=(0,_react.useMemo)(()=>{return r.contentType&&r.contentType.length>0?new Set(r.contentType):null},[r.contentType]);const m=(0,_react.useMemo)(()=>{let t=[...n];if(h){t=t.filter(e=>h.has(e.method))}if(r.status&&r.status!=="all"){switch(r.status){case"success":t=t.filter(e=>e.status&&e.status>=200&&e.status<300);break;case"error":t=t.filter(e=>e.error||e.status&&e.status>=400);break;case"pending":t=t.filter(e=>!e.status&&!e.error);break}}if(u){t=t.filter(e=>e.url.toLowerCase().includes(u)||e.method.toLowerCase().includes(u)||e.path?.toLowerCase().includes(u)||e.host?.toLowerCase().includes(u)||e.error&&e.error.toLowerCase().includes(u)||e.operationName&&e.operationName.toLowerCase().includes(u)||(0,_formatGraphQLVariables.searchGraphQLVariables)(e.graphqlVariables,u))}if(r.host){t=t.filter(e=>e.host===r.host)}if(E){t=t.filter(e=>{const a=e.responseHeaders||e.requestHeaders;const s=a?.["content-type"]||a?.["Content-Type"]||"";for(const l of E){switch(l){case"JSON":if(s.includes("json"))return true;break;case"XML":if(s.includes("xml"))return true;break;case"HTML":if(s.includes("html"))return true;break;case"TEXT":if(s.includes("text"))return true;break;case"IMAGE":if(s.includes("image"))return true;break;case"VIDEO":if(s.includes("video"))return true;break;case"AUDIO":if(s.includes("audio"))return true;break;case"FORM":if(s.includes("form"))return true;break;case"OTHER":if(!s||!s.includes("json")&&!s.includes("xml")&&!s.includes("html")&&!s.includes("text")&&!s.includes("image")&&!s.includes("video")&&!s.includes("audio")&&!s.includes("form")){return true}break}}return false})}return t},[n,r,u,h,E]);const c=(0,_react.useMemo)(()=>{const t=new Set;n.slice(d).forEach(e=>{t.add(e.id)});return t},[n,d]);const b=(0,_react.useMemo)(()=>{return m.filter(t=>c.has(t.id))},[m,c]);const M=b.length>0;const _=b.length;const q=(0,_react.useCallback)(t=>{return c.has(t)},[c]);const y=(0,_react.useMemo)(()=>{let t=0;let e=0;let a=0;let s=0;let l=0;let S=0;let v=0;for(const o of n){if(o.status&&o.status>=200&&o.status<300){t++}else if(o.error||o.status&&o.status>=400){e++}else if(!o.status&&!o.error){a++}s+=o.requestSize||0;l+=o.responseSize||0;if(o.duration){S+=o.duration;v++}}const F=v>0?S/v:0;return{totalRequests:n.length,successfulRequests:t,failedRequests:e,pendingRequests:a,totalDataSent:s,totalDataReceived:l,averageDuration:Math.round(F)}},[n]);const x=(0,_react.useMemo)(()=>{const t=new Set;for(const e of n){if(e.host){t.add(e.host)}}return Array.from(t)},[n]);const D=(0,_react.useMemo)(()=>{const t=new Set;for(const e of n){t.add(e.method)}return Array.from(t)},[n]);return{events:m,allEvents:n,stats:y,filter:r,setFilter:g,clearEvents:C,isCapturing:f,pauseCapturing:I,resumeCapturing:R,hosts:x,methods:D,hasLockedEvents:M,lockedEventCount:_,isEventLocked:q,requestLimit:d,getSubscriberCounts:()=>_networkEventStore.networkEventStore.getSubscriberCounts()}}
|
|
@@ -1,56 +1 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.useNetworkHasEvents = useNetworkHasEvents;
|
|
7
|
-
exports.useNetworkHasMatches = useNetworkHasMatches;
|
|
8
|
-
var _react = require("react");
|
|
9
|
-
var _networkEventStore = require("../utils/networkEventStore");
|
|
10
|
-
var _filterNetworkEvents = require("../utils/filterNetworkEvents");
|
|
11
|
-
/**
|
|
12
|
-
* Narrowest possible subscription: a BOOLEAN that flips when the store
|
|
13
|
-
* goes between "has events matching this filter" and "empty". Used by
|
|
14
|
-
* header buttons (clear/copy) whose only live dependency is their
|
|
15
|
-
* enabled state — with the full counts hook they re-rendered on every
|
|
16
|
-
* count change (32× in a 25-request run, tool-bench 2026-07-06); with a
|
|
17
|
-
* flip-guarded boolean they render ~twice per session.
|
|
18
|
-
*/
|
|
19
|
-
|
|
20
|
-
/** True while the store has ANY events (clear button's enabled state). */
|
|
21
|
-
function useNetworkHasEvents(options) {
|
|
22
|
-
const {
|
|
23
|
-
paused
|
|
24
|
-
} = options;
|
|
25
|
-
const [hasEvents, setHasEvents] = (0, _react.useState)(() => _networkEventStore.networkEventStore.getEvents().length > 0);
|
|
26
|
-
(0, _react.useEffect)(() => {
|
|
27
|
-
if (paused) return undefined;
|
|
28
|
-
return _networkEventStore.networkEventStore.subscribeToEvents(events => {
|
|
29
|
-
const next = events.length > 0;
|
|
30
|
-
setHasEvents(prev => prev === next ? prev : next);
|
|
31
|
-
});
|
|
32
|
-
}, [paused]);
|
|
33
|
-
(0, _react.useEffect)(() => _networkEventStore.networkEventStore.onClear(() => setHasEvents(false)), []);
|
|
34
|
-
return hasEvents;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
/** True while the store has events matching the current filter (copy
|
|
38
|
-
* button's enabled state). The filter pass runs per emission but a
|
|
39
|
-
* re-render only happens when the boolean flips. */
|
|
40
|
-
function useNetworkHasMatches(options) {
|
|
41
|
-
const {
|
|
42
|
-
filter,
|
|
43
|
-
ignoredPatterns,
|
|
44
|
-
paused
|
|
45
|
-
} = options;
|
|
46
|
-
const [hasMatches, setHasMatches] = (0, _react.useState)(() => (0, _filterNetworkEvents.filterNetworkEvents)((0, _filterNetworkEvents.applyIgnoredPatterns)(_networkEventStore.networkEventStore.getEvents(), ignoredPatterns), filter).length > 0);
|
|
47
|
-
(0, _react.useEffect)(() => {
|
|
48
|
-
if (paused) return undefined;
|
|
49
|
-
return _networkEventStore.networkEventStore.subscribeToEvents(events => {
|
|
50
|
-
const next = (0, _filterNetworkEvents.filterNetworkEvents)((0, _filterNetworkEvents.applyIgnoredPatterns)(events, ignoredPatterns), filter).length > 0;
|
|
51
|
-
setHasMatches(prev => prev === next ? prev : next);
|
|
52
|
-
});
|
|
53
|
-
}, [paused, filter, ignoredPatterns]);
|
|
54
|
-
(0, _react.useEffect)(() => _networkEventStore.networkEventStore.onClear(() => setHasMatches(false)), []);
|
|
55
|
-
return hasMatches;
|
|
56
|
-
}
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.useNetworkHasEvents=useNetworkHasEvents;exports.useNetworkHasMatches=useNetworkHasMatches;var _react=require("react");var _networkEventStore=require("../utils/networkEventStore");var _filterNetworkEvents=require("../utils/filterNetworkEvents");function useNetworkHasEvents(o){const{paused:e}=o;const[t,r]=(0,_react.useState)(()=>_networkEventStore.networkEventStore.getEvents().length>0);(0,_react.useEffect)(()=>{if(e)return void 0;return _networkEventStore.networkEventStore.subscribeToEvents(u=>{const n=u.length>0;r(s=>s===n?s:n)})},[e]);(0,_react.useEffect)(()=>_networkEventStore.networkEventStore.onClear(()=>r(false)),[]);return t}function useNetworkHasMatches(o){const{filter:e,ignoredPatterns:t,paused:r}=o;const[u,n]=(0,_react.useState)(()=>(0,_filterNetworkEvents.filterNetworkEvents)((0,_filterNetworkEvents.applyIgnoredPatterns)(_networkEventStore.networkEventStore.getEvents(),t),e).length>0);(0,_react.useEffect)(()=>{if(r)return void 0;return _networkEventStore.networkEventStore.subscribeToEvents(s=>{const a=(0,_filterNetworkEvents.filterNetworkEvents)((0,_filterNetworkEvents.applyIgnoredPatterns)(s,t),e).length>0;n(E=>E===a?E:a)})},[r,e,t]);(0,_react.useEffect)(()=>_networkEventStore.networkEventStore.onClear(()=>n(false)),[]);return u}
|
|
@@ -1,38 +1 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.useNetworkSaved = useNetworkSaved;
|
|
7
|
-
var _react = require("react");
|
|
8
|
-
var _networkSavedStore = require("../utils/networkSavedStore");
|
|
9
|
-
/**
|
|
10
|
-
* Narrow subscription to the pinned/saved store.
|
|
11
|
-
*
|
|
12
|
-
* The store rebuilds its derived view once per mutation, so the object this
|
|
13
|
-
* returns keeps a stable identity between pins — memoized rows don't re-render
|
|
14
|
-
* because a network event arrived, only because the user pinned something.
|
|
15
|
-
*
|
|
16
|
-
* Mutations happen through module-scope callbacks (stable identities), so
|
|
17
|
-
* passing them into memoized rows costs nothing.
|
|
18
|
-
*/
|
|
19
|
-
|
|
20
|
-
const togglePin = event => _networkSavedStore.networkSavedStore.togglePin(event);
|
|
21
|
-
const toggleSave = event => _networkSavedStore.networkSavedStore.toggleSave(event);
|
|
22
|
-
const remove = key => _networkSavedStore.networkSavedStore.remove(key);
|
|
23
|
-
const clearSaved = () => _networkSavedStore.networkSavedStore.clearSaved();
|
|
24
|
-
const clearPinned = () => _networkSavedStore.networkSavedStore.clearPinned();
|
|
25
|
-
function useNetworkSaved() {
|
|
26
|
-
const [state, setState] = (0, _react.useState)(() => _networkSavedStore.networkSavedStore.getState());
|
|
27
|
-
(0, _react.useEffect)(() => _networkSavedStore.networkSavedStore.subscribe(() => {
|
|
28
|
-
setState(_networkSavedStore.networkSavedStore.getState());
|
|
29
|
-
}), []);
|
|
30
|
-
return {
|
|
31
|
-
...state,
|
|
32
|
-
togglePin,
|
|
33
|
-
toggleSave,
|
|
34
|
-
remove,
|
|
35
|
-
clearSaved,
|
|
36
|
-
clearPinned
|
|
37
|
-
};
|
|
38
|
-
}
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.useNetworkSaved=useNetworkSaved;var _react=require("react");var _networkSavedStore=require("../utils/networkSavedStore");const togglePin=e=>_networkSavedStore.networkSavedStore.togglePin(e);const toggleSave=e=>_networkSavedStore.networkSavedStore.toggleSave(e);const remove=e=>_networkSavedStore.networkSavedStore.remove(e);const clearSaved=()=>_networkSavedStore.networkSavedStore.clearSaved();const clearPinned=()=>_networkSavedStore.networkSavedStore.clearPinned();function useNetworkSaved(){const[e,t]=(0,_react.useState)(()=>_networkSavedStore.networkSavedStore.getState());(0,_react.useEffect)(()=>_networkSavedStore.networkSavedStore.subscribe(()=>{t(_networkSavedStore.networkSavedStore.getState())}),[]);return{...e,togglePin,toggleSave,remove,clearSaved,clearPinned}}
|
|
@@ -1,53 +1 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.useHasNetworkSelection = useHasNetworkSelection;
|
|
7
|
-
exports.useNetworkBodyEventId = useNetworkBodyEventId;
|
|
8
|
-
exports.useNetworkCursor = useNetworkCursor;
|
|
9
|
-
exports.useSelectedNetworkEventId = useSelectedNetworkEventId;
|
|
10
|
-
var _react = require("react");
|
|
11
|
-
var _networkSelectionStore = require("../utils/networkSelectionStore");
|
|
12
|
-
/**
|
|
13
|
-
* Narrow subscriptions to the prev/next cursor (`networkSelectionStore`).
|
|
14
|
-
*
|
|
15
|
-
* One hook per consumer, each returning the SMALLEST value that consumer
|
|
16
|
-
* renders — that is the whole point of moving the cursor into a store. The
|
|
17
|
-
* modal root takes `useHasNetworkSelection()` (a boolean that flips twice a
|
|
18
|
-
* session), so a step no longer re-renders `JsModal`, the header and all five
|
|
19
|
-
* screens; the footer and the body take the parts that actually change.
|
|
20
|
-
*/
|
|
21
|
-
|
|
22
|
-
const subscribe = onChange => _networkSelectionStore.networkSelectionStore.subscribe(onChange);
|
|
23
|
-
const getState = () => _networkSelectionStore.networkSelectionStore.getState();
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* Is ANYTHING selected — i.e. is the detail screen up?
|
|
27
|
-
*
|
|
28
|
-
* `useSyncExternalStore` compares the selector's result, so the root only
|
|
29
|
-
* re-renders when this boolean flips, not on every step.
|
|
30
|
-
*/
|
|
31
|
-
function useHasNetworkSelection() {
|
|
32
|
-
return (0, _react.useSyncExternalStore)(subscribe, () => getState().selectedId != null, () => getState().selectedId != null);
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
/** Where the USER is. Moves synchronously on tap — footer, header pin actions. */
|
|
36
|
-
function useSelectedNetworkEventId() {
|
|
37
|
-
return (0, _react.useSyncExternalStore)(subscribe, () => getState().selectedId, () => getState().selectedId);
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
/** What the BODY may render. Lags `selectedId` — see networkSelectionStore. */
|
|
41
|
-
function useNetworkBodyEventId() {
|
|
42
|
-
return (0, _react.useSyncExternalStore)(subscribe, () => getState().bodyId, () => getState().bodyId);
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
/** Cursor position + list length, for the "REQUEST n OF m" counter. */
|
|
46
|
-
function useNetworkCursor() {
|
|
47
|
-
const index = (0, _react.useSyncExternalStore)(subscribe, () => getState().index, () => getState().index);
|
|
48
|
-
const total = (0, _react.useSyncExternalStore)(subscribe, () => getState().ids.length, () => getState().ids.length);
|
|
49
|
-
return {
|
|
50
|
-
index,
|
|
51
|
-
total
|
|
52
|
-
};
|
|
53
|
-
}
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.useHasNetworkSelection=useHasNetworkSelection;exports.useNetworkBodyEventId=useNetworkBodyEventId;exports.useNetworkCursor=useNetworkCursor;exports.useSelectedNetworkEventId=useSelectedNetworkEventId;var _react=require("react");var _networkSelectionStore=require("../utils/networkSelectionStore");const subscribe=e=>_networkSelectionStore.networkSelectionStore.subscribe(e);const getState=()=>_networkSelectionStore.networkSelectionStore.getState();function useHasNetworkSelection(){return(0,_react.useSyncExternalStore)(subscribe,()=>getState().selectedId!=null,()=>getState().selectedId!=null)}function useSelectedNetworkEventId(){return(0,_react.useSyncExternalStore)(subscribe,()=>getState().selectedId,()=>getState().selectedId)}function useNetworkBodyEventId(){return(0,_react.useSyncExternalStore)(subscribe,()=>getState().bodyId,()=>getState().bodyId)}function useNetworkCursor(){const e=(0,_react.useSyncExternalStore)(subscribe,()=>getState().index,()=>getState().index);const t=(0,_react.useSyncExternalStore)(subscribe,()=>getState().ids.length,()=>getState().ids.length);return{index:e,total:t}}
|
|
@@ -1,36 +1 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.useOverrideRules = useOverrideRules;
|
|
7
|
-
var _react = require("react");
|
|
8
|
-
var _overrideRulesStore = require("../overrides/overrideRulesStore");
|
|
9
|
-
var _resolveOverride = require("../overrides/resolveOverride");
|
|
10
|
-
/**
|
|
11
|
-
* Read + mutate the override rule list.
|
|
12
|
-
*
|
|
13
|
-
* `useSyncExternalStore` over the store's own subscribe/getState, which already
|
|
14
|
-
* hands out a stable state object per mutation (see `rebuild`) — so this can't
|
|
15
|
-
* tear and doesn't need a selector to stay cheap.
|
|
16
|
-
*/
|
|
17
|
-
function useOverrideRules() {
|
|
18
|
-
const state = (0, _react.useSyncExternalStore)((0, _react.useCallback)(listener => _overrideRulesStore.overrideRulesStore.subscribe(listener), []), () => _overrideRulesStore.overrideRulesStore.getState(), () => _overrideRulesStore.overrideRulesStore.getState());
|
|
19
|
-
const setEnabled = (0, _react.useCallback)(enabled => _overrideRulesStore.overrideRulesStore.setEnabled(enabled), []);
|
|
20
|
-
const upsertRule = (0, _react.useCallback)(draft => _overrideRulesStore.overrideRulesStore.upsertRule(draft), []);
|
|
21
|
-
const setRuleEnabled = (0, _react.useCallback)((id, enabled) => _overrideRulesStore.overrideRulesStore.setRuleEnabled(id, enabled), []);
|
|
22
|
-
const removeRule = (0, _react.useCallback)(id => _overrideRulesStore.overrideRulesStore.removeRule(id), []);
|
|
23
|
-
const clearRules = (0, _react.useCallback)(() => _overrideRulesStore.overrideRulesStore.clearRules(), []);
|
|
24
|
-
return {
|
|
25
|
-
enabled: state.enabled,
|
|
26
|
-
rules: state.rules,
|
|
27
|
-
autoPaused: state.autoPaused,
|
|
28
|
-
activeCount: _overrideRulesStore.overrideRulesStore.activeCount(),
|
|
29
|
-
setEnabled,
|
|
30
|
-
upsertRule,
|
|
31
|
-
setRuleEnabled,
|
|
32
|
-
removeRule,
|
|
33
|
-
clearRules,
|
|
34
|
-
isRuleSpent: _resolveOverride.isSpent
|
|
35
|
-
};
|
|
36
|
-
}
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.useOverrideRules=useOverrideRules;var _react=require("react");var _overrideRulesStore=require("../overrides/overrideRulesStore");var _resolveOverride=require("../overrides/resolveOverride");function useOverrideRules(){const r=(0,_react.useSyncExternalStore)((0,_react.useCallback)(e=>_overrideRulesStore.overrideRulesStore.subscribe(e),[]),()=>_overrideRulesStore.overrideRulesStore.getState(),()=>_overrideRulesStore.overrideRulesStore.getState());const s=(0,_react.useCallback)(e=>_overrideRulesStore.overrideRulesStore.setEnabled(e),[]);const t=(0,_react.useCallback)(e=>_overrideRulesStore.overrideRulesStore.upsertRule(e),[]);const u=(0,_react.useCallback)((e,a)=>_overrideRulesStore.overrideRulesStore.setRuleEnabled(e,a),[]);const l=(0,_react.useCallback)(e=>_overrideRulesStore.overrideRulesStore.removeRule(e),[]);const o=(0,_react.useCallback)(()=>_overrideRulesStore.overrideRulesStore.clearRules(),[]);return{enabled:r.enabled,rules:r.rules,autoPaused:r.autoPaused,activeCount:_overrideRulesStore.overrideRulesStore.activeCount(),setEnabled:s,upsertRule:t,setRuleEnabled:u,removeRule:l,clearRules:o,isRuleSpent:_resolveOverride.isSpent}}
|
|
@@ -1,21 +1 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
Object.defineProperty(exports, "TickProvider", {
|
|
7
|
-
enumerable: true,
|
|
8
|
-
get: function () {
|
|
9
|
-
return _sharedUi.TickProvider;
|
|
10
|
-
}
|
|
11
|
-
});
|
|
12
|
-
exports.useTickEveryMinute = useTickEveryMinute;
|
|
13
|
-
var _sharedUi = require("@buoy-gg/shared-ui");
|
|
14
|
-
// Re-export TickProvider from shared package
|
|
15
|
-
|
|
16
|
-
// Re-export useTick as useTickEveryMinute for backward compatibility.
|
|
17
|
-
// Falls back to Date.now() when no provider is present (matches original behavior).
|
|
18
|
-
|
|
19
|
-
function useTickEveryMinute() {
|
|
20
|
-
return (0, _sharedUi.useTick)() ?? Date.now();
|
|
21
|
-
}
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"TickProvider",{enumerable:true,get:function(){return _sharedUi.TickProvider}});exports.useTickEveryMinute=useTickEveryMinute;var _sharedUi=require("@buoy-gg/shared-ui");function useTickEveryMinute(){return(0,_sharedUi.useTick)()??Date.now()}
|
|
@@ -1,80 +1 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.canSynthesizeResponse = canSynthesizeResponse;
|
|
7
|
-
exports.sleep = void 0;
|
|
8
|
-
exports.synthesizeFetchError = synthesizeFetchError;
|
|
9
|
-
exports.synthesizeResponse = synthesizeResponse;
|
|
10
|
-
/**
|
|
11
|
-
* Perform an override outcome against `fetch`.
|
|
12
|
-
*
|
|
13
|
-
* WHY THIS EXISTS — and why "XHR is the single choke point" is WRONG:
|
|
14
|
-
*
|
|
15
|
-
* In bare React Native, `Libraries/Network/fetch.js` is `require('whatwg-fetch')`,
|
|
16
|
-
* so `fetch` really is a polyfill over XMLHttpRequest and hooking XHR alone
|
|
17
|
-
* would cover everything. But **Expo replaces it**: `expo/src/winter/runtime.native.ts`
|
|
18
|
-
* installs `expo/fetch` — a NATIVE fetch over `ExpoFetchModule` — as
|
|
19
|
-
* `globalThis.fetch` unless `EXPO_PUBLIC_USE_RN_FETCH=1`. Those requests never
|
|
20
|
-
* construct an XMLHttpRequest, so an XHR-only override silently does nothing on
|
|
21
|
-
* the majority of real apps.
|
|
22
|
-
*
|
|
23
|
-
* Verified the hard way on Expo SDK 56 / RN 0.85.3: rule matched, engine
|
|
24
|
-
* healthy, interceptor installed, and the request still came back a real 200.
|
|
25
|
-
*
|
|
26
|
-
* So overrides hook BOTH layers. `axios` still needs the XHR path (it uses
|
|
27
|
-
* XMLHttpRequest on every platform), and this covers `fetch` on both flavours.
|
|
28
|
-
*/
|
|
29
|
-
|
|
30
|
-
const sleep = ms => ms > 0 ? new Promise(resolve => setTimeout(resolve, ms)) : Promise.resolve();
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* Can we build a `Response` in this runtime?
|
|
34
|
-
*
|
|
35
|
-
* React Native installs the whatwg-fetch `Response` global via `setUpXHR`, and
|
|
36
|
-
* Expo deliberately keeps it (it only swaps `fetch`). Feature-detected anyway:
|
|
37
|
-
* without it, the honest thing is to let the request run for real.
|
|
38
|
-
*/
|
|
39
|
-
exports.sleep = sleep;
|
|
40
|
-
function canSynthesizeResponse() {
|
|
41
|
-
return typeof Response === "function";
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
/**
|
|
45
|
-
* Build the fake `Response` an overridden `fetch` resolves with.
|
|
46
|
-
*
|
|
47
|
-
* Note the status range: whatwg-fetch's `Response` constructor THROWS
|
|
48
|
-
* `RangeError` outside [200, 599], which would crash the caller instead of
|
|
49
|
-
* overriding it. `resolveOverride` clamps before we ever get here.
|
|
50
|
-
*/
|
|
51
|
-
function synthesizeResponse(url, outcome) {
|
|
52
|
-
const response = new Response(outcome.body, {
|
|
53
|
-
status: outcome.status,
|
|
54
|
-
statusText: outcome.statusText,
|
|
55
|
-
headers: outcome.headers
|
|
56
|
-
});
|
|
57
|
-
// `Response.url` is not settable through the constructor, and consumers do
|
|
58
|
-
// read it (redirect checks, cache keys). whatwg-fetch stores it as a plain
|
|
59
|
-
// property, so assigning is both possible and correct.
|
|
60
|
-
try {
|
|
61
|
-
Object.defineProperty(response, "url", {
|
|
62
|
-
value: url,
|
|
63
|
-
configurable: true
|
|
64
|
-
});
|
|
65
|
-
} catch {
|
|
66
|
-
// Sealed implementation — an empty url is cosmetic, not worth failing over.
|
|
67
|
-
}
|
|
68
|
-
return response;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
/**
|
|
72
|
-
* The error a failed `fetch` rejects with.
|
|
73
|
-
*
|
|
74
|
-
* These are the exact messages whatwg-fetch produces for a dead connection and
|
|
75
|
-
* a timeout, so app code that string-matches on them (plenty does) behaves the
|
|
76
|
-
* same way it would against a real failure.
|
|
77
|
-
*/
|
|
78
|
-
function synthesizeFetchError(outcome) {
|
|
79
|
-
return new TypeError(outcome.failKind === "timeout" ? "Network request timed out" : "Network request failed");
|
|
80
|
-
}
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.canSynthesizeResponse=canSynthesizeResponse;exports.sleep=void 0;exports.synthesizeFetchError=synthesizeFetchError;exports.synthesizeResponse=synthesizeResponse;const sleep=e=>e>0?new Promise(s=>setTimeout(s,e)):Promise.resolve();exports.sleep=sleep;function canSynthesizeResponse(){return typeof Response==="function"}function synthesizeResponse(e,s){const t=new Response(s.body,{status:s.status,statusText:s.statusText,headers:s.headers});try{Object.defineProperty(t,"url",{value:e,configurable:true})}catch{}return t}function synthesizeFetchError(e){return new TypeError(e.failKind==="timeout"?"Network request timed out":"Network request failed")}
|