@buoy-gg/network 3.0.2 → 4.0.1
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/lib/commonjs/index.js +25 -0
- package/lib/commonjs/network/components/NetworkModal.js +14 -126
- package/lib/module/index.js +8 -0
- package/lib/module/network/components/NetworkModal.js +13 -127
- package/lib/typescript/index.d.ts +2 -1
- package/lib/typescript/index.d.ts.map +1 -1
- package/lib/typescript/network/components/NetworkModal.d.ts.map +1 -1
- package/lib/typescript/network/types/index.d.ts +4 -12
- package/lib/typescript/network/types/index.d.ts.map +1 -1
- package/package.json +2 -2
package/lib/commonjs/index.js
CHANGED
|
@@ -63,6 +63,18 @@ Object.defineProperty(exports, "formatHttpStatus", {
|
|
|
63
63
|
return _formatting.formatHttpStatus;
|
|
64
64
|
}
|
|
65
65
|
});
|
|
66
|
+
Object.defineProperty(exports, "ignoredPatternsStore", {
|
|
67
|
+
enumerable: true,
|
|
68
|
+
get: function () {
|
|
69
|
+
return _sharedUi.ignoredPatternsStore;
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
Object.defineProperty(exports, "isUrlIgnored", {
|
|
73
|
+
enumerable: true,
|
|
74
|
+
get: function () {
|
|
75
|
+
return _sharedUi.isUrlIgnored;
|
|
76
|
+
}
|
|
77
|
+
});
|
|
66
78
|
Object.defineProperty(exports, "networkEventStore", {
|
|
67
79
|
enumerable: true,
|
|
68
80
|
get: function () {
|
|
@@ -93,6 +105,18 @@ Object.defineProperty(exports, "removeAllNetworkListeners", {
|
|
|
93
105
|
return _networkListener.removeAllNetworkListeners;
|
|
94
106
|
}
|
|
95
107
|
});
|
|
108
|
+
Object.defineProperty(exports, "urlMatchesIgnoredPattern", {
|
|
109
|
+
enumerable: true,
|
|
110
|
+
get: function () {
|
|
111
|
+
return _sharedUi.urlMatchesIgnoredPattern;
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
Object.defineProperty(exports, "useIgnoredPatterns", {
|
|
115
|
+
enumerable: true,
|
|
116
|
+
get: function () {
|
|
117
|
+
return _sharedUi.useIgnoredPatterns;
|
|
118
|
+
}
|
|
119
|
+
});
|
|
96
120
|
Object.defineProperty(exports, "useNetworkEvents", {
|
|
97
121
|
enumerable: true,
|
|
98
122
|
get: function () {
|
|
@@ -112,6 +136,7 @@ var _NetworkEventItemCompact = require("./network/components/NetworkEventItemCom
|
|
|
112
136
|
var _useNetworkEvents = require("./network/hooks/useNetworkEvents");
|
|
113
137
|
var _useTickEveryMinute = require("./network/hooks/useTickEveryMinute");
|
|
114
138
|
var _formatting = require("./network/utils/formatting");
|
|
139
|
+
var _sharedUi = require("@buoy-gg/shared-ui");
|
|
115
140
|
var _networkSyncAdapter = require("./network/sync/networkSyncAdapter");
|
|
116
141
|
var _networkBodyResolver = require("./network/sync/networkBodyResolver");
|
|
117
142
|
var _networkEventStore = require("./network/utils/networkEventStore");
|
|
@@ -15,33 +15,6 @@ var _NetworkCopySettingsView = require("./NetworkCopySettingsView");
|
|
|
15
15
|
var _useNetworkEvents = require("../hooks/useNetworkEvents");
|
|
16
16
|
var _formatting = require("../utils/formatting");
|
|
17
17
|
var _jsxRuntime = require("react/jsx-runtime");
|
|
18
|
-
/**
|
|
19
|
-
* Returns true when `url` matches the ignored `pattern` according to its mode.
|
|
20
|
-
*
|
|
21
|
-
* `contains` → case-insensitive substring on the full URL (legacy behavior).
|
|
22
|
-
* `exact` → smart equality: pattern starting with `/` compares URL.pathname,
|
|
23
|
-
* full URLs compare origin+pathname (ignoring query/hash), bare
|
|
24
|
-
* values compare URL.host. Falls back to literal equality if URL
|
|
25
|
-
* parsing fails (e.g. relative URLs).
|
|
26
|
-
*/function urlMatchesIgnoredPattern(url, pattern) {
|
|
27
|
-
const lowerUrl = url.toLowerCase();
|
|
28
|
-
const lowerValue = pattern.value.toLowerCase();
|
|
29
|
-
if (pattern.mode === "contains") {
|
|
30
|
-
return lowerUrl.includes(lowerValue);
|
|
31
|
-
}
|
|
32
|
-
try {
|
|
33
|
-
const parsed = new URL(url);
|
|
34
|
-
if (lowerValue.startsWith("/")) {
|
|
35
|
-
return parsed.pathname.toLowerCase() === lowerValue;
|
|
36
|
-
}
|
|
37
|
-
if (lowerValue.startsWith("http://") || lowerValue.startsWith("https://")) {
|
|
38
|
-
return `${parsed.origin}${parsed.pathname}`.toLowerCase() === lowerValue;
|
|
39
|
-
}
|
|
40
|
-
return parsed.host.toLowerCase() === lowerValue;
|
|
41
|
-
} catch {
|
|
42
|
-
return lowerUrl === lowerValue;
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
18
|
// Decompose by Responsibility: Extract empty state component
|
|
46
19
|
function EmptyState({
|
|
47
20
|
isEnabled
|
|
@@ -104,15 +77,20 @@ function NetworkModalInner({
|
|
|
104
77
|
const [searchText, setSearchText] = (0, _react.useState)("");
|
|
105
78
|
const [isSearchActive, setIsSearchActive] = (0, _react.useState)(false);
|
|
106
79
|
const searchInputRef = (0, _react.useRef)(null);
|
|
107
|
-
|
|
108
|
-
//
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
80
|
+
// Ignored domains/URL patterns now live in a shared, persisted singleton store
|
|
81
|
+
// (@buoy-gg/shared-ui) so the Network tool and the Events tool stay in sync and
|
|
82
|
+
// share the exact same filter logic. The four handlers below are thin wrappers
|
|
83
|
+
// exposed by the hook; `values` is the derived Set used for presence checks.
|
|
84
|
+
const {
|
|
85
|
+
patterns: ignoredPatterns,
|
|
86
|
+
values: ignoredPatternValues,
|
|
87
|
+
add: addIgnoredPattern,
|
|
88
|
+
remove: removeIgnoredPattern,
|
|
89
|
+
toggle: toggleIgnoredPattern,
|
|
90
|
+
toggleMode: toggleIgnoredPatternMode
|
|
91
|
+
} = (0, _sharedUi.useIgnoredPatterns)();
|
|
113
92
|
const [copySettings, setCopySettings] = (0, _react.useState)(_NetworkCopySettingsView.DEFAULT_COPY_SETTINGS);
|
|
114
93
|
const flatListRef = (0, _react.useRef)(null);
|
|
115
|
-
const hasLoadedFilters = (0, _react.useRef)(false);
|
|
116
94
|
const hasLoadedCopySettings = (0, _react.useRef)(false);
|
|
117
95
|
const [showUpgradeModal, setShowUpgradeModal] = (0, _react.useState)(false);
|
|
118
96
|
|
|
@@ -123,62 +101,6 @@ function NetworkModalInner({
|
|
|
123
101
|
}
|
|
124
102
|
}, [showUpgradeModal, isPro]);
|
|
125
103
|
|
|
126
|
-
// Load persisted filters on mount
|
|
127
|
-
(0, _react.useEffect)(() => {
|
|
128
|
-
if (!visible || hasLoadedFilters.current) return;
|
|
129
|
-
const loadFilters = async () => {
|
|
130
|
-
try {
|
|
131
|
-
const storedPatterns = await _sharedUi.persistentStorage.getItem(_sharedUi.devToolsStorageKeys.network.ignoredDomains());
|
|
132
|
-
if (storedPatterns) {
|
|
133
|
-
// Tolerate legacy string[] format — entries without a mode default to "contains".
|
|
134
|
-
const raw = JSON.parse(storedPatterns);
|
|
135
|
-
const migrated = [];
|
|
136
|
-
for (const entry of raw) {
|
|
137
|
-
if (typeof entry === "string" && entry.trim()) {
|
|
138
|
-
migrated.push({
|
|
139
|
-
value: entry,
|
|
140
|
-
mode: "contains"
|
|
141
|
-
});
|
|
142
|
-
} else if (entry && typeof entry === "object" && typeof entry.value === "string") {
|
|
143
|
-
const e = entry;
|
|
144
|
-
migrated.push({
|
|
145
|
-
value: e.value,
|
|
146
|
-
mode: e.mode === "exact" ? "exact" : "contains"
|
|
147
|
-
});
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
// Always ensure Buoy license API is hidden
|
|
151
|
-
if (!migrated.some(p => p.value === "api.keygen.sh")) {
|
|
152
|
-
migrated.push({
|
|
153
|
-
value: "api.keygen.sh",
|
|
154
|
-
mode: "contains"
|
|
155
|
-
});
|
|
156
|
-
}
|
|
157
|
-
setIgnoredPatterns(migrated);
|
|
158
|
-
}
|
|
159
|
-
} catch (_error) {
|
|
160
|
-
// Silently fail - filters will use defaults
|
|
161
|
-
} finally {
|
|
162
|
-
hasLoadedFilters.current = true;
|
|
163
|
-
}
|
|
164
|
-
};
|
|
165
|
-
loadFilters();
|
|
166
|
-
}, [visible]);
|
|
167
|
-
|
|
168
|
-
// Save filters when they change
|
|
169
|
-
(0, _react.useEffect)(() => {
|
|
170
|
-
if (!hasLoadedFilters.current) return; // Don't save on initial load
|
|
171
|
-
|
|
172
|
-
const saveFilters = async () => {
|
|
173
|
-
try {
|
|
174
|
-
await _sharedUi.persistentStorage.setItem(_sharedUi.devToolsStorageKeys.network.ignoredDomains(), JSON.stringify(ignoredPatterns));
|
|
175
|
-
} catch (_error) {
|
|
176
|
-
// Silently fail - filters will remain in memory
|
|
177
|
-
}
|
|
178
|
-
};
|
|
179
|
-
saveFilters();
|
|
180
|
-
}, [ignoredPatterns]);
|
|
181
|
-
|
|
182
104
|
// Load persisted copy settings on mount
|
|
183
105
|
(0, _react.useEffect)(() => {
|
|
184
106
|
if (!visible || hasLoadedCopySettings.current) return;
|
|
@@ -234,49 +156,15 @@ function NetworkModalInner({
|
|
|
234
156
|
}
|
|
235
157
|
}, [isSearchActive]);
|
|
236
158
|
|
|
237
|
-
// Derived set of pattern values (for components that only care about presence).
|
|
238
|
-
const ignoredPatternValues = (0, _react.useMemo)(() => new Set(ignoredPatterns.map(p => p.value)), [ignoredPatterns]);
|
|
239
|
-
|
|
240
159
|
// Filter events based on ignored patterns (mode-aware)
|
|
241
160
|
const filteredEvents = (0, _react.useMemo)(() => {
|
|
242
161
|
if (ignoredPatterns.length === 0) return events;
|
|
243
162
|
return events.filter(event => {
|
|
244
|
-
const isFiltered = ignoredPatterns.some(pattern => urlMatchesIgnoredPattern(event.url, pattern));
|
|
163
|
+
const isFiltered = ignoredPatterns.some(pattern => (0, _sharedUi.urlMatchesIgnoredPattern)(event.url, pattern));
|
|
245
164
|
return !isFiltered;
|
|
246
165
|
});
|
|
247
166
|
}, [events, ignoredPatterns]);
|
|
248
167
|
|
|
249
|
-
// Add or no-op (used by add-pattern UI and suggested-items taps)
|
|
250
|
-
const addIgnoredPattern = (0, _react.useCallback)(pattern => {
|
|
251
|
-
const value = pattern.value.trim();
|
|
252
|
-
if (!value) return;
|
|
253
|
-
setIgnoredPatterns(prev => prev.some(p => p.value === value) ? prev : [...prev, {
|
|
254
|
-
value,
|
|
255
|
-
mode: pattern.mode
|
|
256
|
-
}]);
|
|
257
|
-
}, []);
|
|
258
|
-
|
|
259
|
-
// Remove by value (used by the filter list X button and the detail view chips)
|
|
260
|
-
const removeIgnoredPattern = (0, _react.useCallback)(value => {
|
|
261
|
-
setIgnoredPatterns(prev => prev.filter(p => p.value !== value));
|
|
262
|
-
}, []);
|
|
263
|
-
|
|
264
|
-
// Toggle presence (used by the detail-view domain/url chips — adds as contains)
|
|
265
|
-
const toggleIgnoredPattern = (0, _react.useCallback)(value => {
|
|
266
|
-
setIgnoredPatterns(prev => prev.some(p => p.value === value) ? prev.filter(p => p.value !== value) : [...prev, {
|
|
267
|
-
value,
|
|
268
|
-
mode: "contains"
|
|
269
|
-
}]);
|
|
270
|
-
}, []);
|
|
271
|
-
|
|
272
|
-
// Flip an existing pattern's mode between contains <-> exact
|
|
273
|
-
const toggleIgnoredPatternMode = (0, _react.useCallback)(value => {
|
|
274
|
-
setIgnoredPatterns(prev => prev.map(p => p.value === value ? {
|
|
275
|
-
...p,
|
|
276
|
-
mode: p.mode === "contains" ? "exact" : "contains"
|
|
277
|
-
} : p));
|
|
278
|
-
}, []);
|
|
279
|
-
|
|
280
168
|
// Helper to check if payload should be included based on size
|
|
281
169
|
const shouldIncludePayload = (0, _react.useCallback)(data => {
|
|
282
170
|
if (copySettings.bodySizeThreshold === -1) return true;
|
|
@@ -417,7 +305,7 @@ function NetworkModalInner({
|
|
|
417
305
|
let successful = 0;
|
|
418
306
|
let failed = 0;
|
|
419
307
|
let pending = 0;
|
|
420
|
-
const eventsForStats = ignoredPatterns.length === 0 ? allEvents : allEvents.filter(event => !ignoredPatterns.some(pattern => urlMatchesIgnoredPattern(event.url, pattern)));
|
|
308
|
+
const eventsForStats = ignoredPatterns.length === 0 ? allEvents : allEvents.filter(event => !ignoredPatterns.some(pattern => (0, _sharedUi.urlMatchesIgnoredPattern)(event.url, pattern)));
|
|
421
309
|
for (const event of eventsForStats) {
|
|
422
310
|
if (event.status && event.status >= 200 && event.status < 300) {
|
|
423
311
|
successful++;
|
package/lib/module/index.js
CHANGED
|
@@ -37,6 +37,14 @@ export { formatBytes, formatDuration, formatHttpStatus } from "./network/utils/f
|
|
|
37
37
|
// TYPES (For TypeScript users)
|
|
38
38
|
// =============================================================================
|
|
39
39
|
|
|
40
|
+
// =============================================================================
|
|
41
|
+
// SHARED IGNORED-PATTERN FILTERING
|
|
42
|
+
// Re-exported from @buoy-gg/shared-ui so consumers wiring the Network detail
|
|
43
|
+
// page into other tools (e.g. the Events tool) can share the exact same
|
|
44
|
+
// ignored-domains/URL filter store + matching logic.
|
|
45
|
+
// =============================================================================
|
|
46
|
+
export { useIgnoredPatterns, ignoredPatternsStore, urlMatchesIgnoredPattern, isUrlIgnored } from "@buoy-gg/shared-ui";
|
|
47
|
+
|
|
40
48
|
// =============================================================================
|
|
41
49
|
// EXTERNAL SYNC (Adapter for @buoy-gg/external-sync's useExternalSync)
|
|
42
50
|
// =============================================================================
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import { useState, useRef, useMemo, useCallback, useEffect } from "react";
|
|
4
4
|
import { View, Text, StyleSheet, TouchableOpacity, TextInput, FlatList } from "react-native";
|
|
5
|
-
import { Globe, Trash2, Power, Search, Filter, CheckCircle, XCircle, Clock, X, Copy, JsModal, ModalHeader, devToolsStorageKeys, macOSColors, persistentStorage, CopyButton, TabSelector, useFeatureGate, UpgradeModal, ProBadge, Zap, PowerToggleButton } from "@buoy-gg/shared-ui";
|
|
5
|
+
import { Globe, Trash2, Power, Search, Filter, CheckCircle, XCircle, Clock, X, Copy, JsModal, ModalHeader, devToolsStorageKeys, macOSColors, persistentStorage, CopyButton, TabSelector, useFeatureGate, UpgradeModal, ProBadge, Zap, PowerToggleButton, useIgnoredPatterns, urlMatchesIgnoredPattern } from "@buoy-gg/shared-ui";
|
|
6
6
|
import { NetworkEventItemCompact } from "./NetworkEventItemCompact";
|
|
7
7
|
import { NetworkFilterViewV3 } from "./NetworkFilterViewV3";
|
|
8
8
|
import { TickProvider } from "../hooks/useTickEveryMinute";
|
|
@@ -10,36 +10,7 @@ import { NetworkEventDetailView } from "./NetworkEventDetailView";
|
|
|
10
10
|
import { NetworkCopySettingsView, DEFAULT_COPY_SETTINGS } from "./NetworkCopySettingsView";
|
|
11
11
|
import { useNetworkEvents } from "../hooks/useNetworkEvents";
|
|
12
12
|
import { formatBytes } from "../utils/formatting";
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* Returns true when `url` matches the ignored `pattern` according to its mode.
|
|
16
|
-
*
|
|
17
|
-
* `contains` → case-insensitive substring on the full URL (legacy behavior).
|
|
18
|
-
* `exact` → smart equality: pattern starting with `/` compares URL.pathname,
|
|
19
|
-
* full URLs compare origin+pathname (ignoring query/hash), bare
|
|
20
|
-
* values compare URL.host. Falls back to literal equality if URL
|
|
21
|
-
* parsing fails (e.g. relative URLs).
|
|
22
|
-
*/
|
|
23
13
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
24
|
-
function urlMatchesIgnoredPattern(url, pattern) {
|
|
25
|
-
const lowerUrl = url.toLowerCase();
|
|
26
|
-
const lowerValue = pattern.value.toLowerCase();
|
|
27
|
-
if (pattern.mode === "contains") {
|
|
28
|
-
return lowerUrl.includes(lowerValue);
|
|
29
|
-
}
|
|
30
|
-
try {
|
|
31
|
-
const parsed = new URL(url);
|
|
32
|
-
if (lowerValue.startsWith("/")) {
|
|
33
|
-
return parsed.pathname.toLowerCase() === lowerValue;
|
|
34
|
-
}
|
|
35
|
-
if (lowerValue.startsWith("http://") || lowerValue.startsWith("https://")) {
|
|
36
|
-
return `${parsed.origin}${parsed.pathname}`.toLowerCase() === lowerValue;
|
|
37
|
-
}
|
|
38
|
-
return parsed.host.toLowerCase() === lowerValue;
|
|
39
|
-
} catch {
|
|
40
|
-
return lowerUrl === lowerValue;
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
14
|
// Decompose by Responsibility: Extract empty state component
|
|
44
15
|
function EmptyState({
|
|
45
16
|
isEnabled
|
|
@@ -102,15 +73,20 @@ function NetworkModalInner({
|
|
|
102
73
|
const [searchText, setSearchText] = useState("");
|
|
103
74
|
const [isSearchActive, setIsSearchActive] = useState(false);
|
|
104
75
|
const searchInputRef = useRef(null);
|
|
105
|
-
|
|
106
|
-
//
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
76
|
+
// Ignored domains/URL patterns now live in a shared, persisted singleton store
|
|
77
|
+
// (@buoy-gg/shared-ui) so the Network tool and the Events tool stay in sync and
|
|
78
|
+
// share the exact same filter logic. The four handlers below are thin wrappers
|
|
79
|
+
// exposed by the hook; `values` is the derived Set used for presence checks.
|
|
80
|
+
const {
|
|
81
|
+
patterns: ignoredPatterns,
|
|
82
|
+
values: ignoredPatternValues,
|
|
83
|
+
add: addIgnoredPattern,
|
|
84
|
+
remove: removeIgnoredPattern,
|
|
85
|
+
toggle: toggleIgnoredPattern,
|
|
86
|
+
toggleMode: toggleIgnoredPatternMode
|
|
87
|
+
} = useIgnoredPatterns();
|
|
111
88
|
const [copySettings, setCopySettings] = useState(DEFAULT_COPY_SETTINGS);
|
|
112
89
|
const flatListRef = useRef(null);
|
|
113
|
-
const hasLoadedFilters = useRef(false);
|
|
114
90
|
const hasLoadedCopySettings = useRef(false);
|
|
115
91
|
const [showUpgradeModal, setShowUpgradeModal] = useState(false);
|
|
116
92
|
|
|
@@ -121,62 +97,6 @@ function NetworkModalInner({
|
|
|
121
97
|
}
|
|
122
98
|
}, [showUpgradeModal, isPro]);
|
|
123
99
|
|
|
124
|
-
// Load persisted filters on mount
|
|
125
|
-
useEffect(() => {
|
|
126
|
-
if (!visible || hasLoadedFilters.current) return;
|
|
127
|
-
const loadFilters = async () => {
|
|
128
|
-
try {
|
|
129
|
-
const storedPatterns = await persistentStorage.getItem(devToolsStorageKeys.network.ignoredDomains());
|
|
130
|
-
if (storedPatterns) {
|
|
131
|
-
// Tolerate legacy string[] format — entries without a mode default to "contains".
|
|
132
|
-
const raw = JSON.parse(storedPatterns);
|
|
133
|
-
const migrated = [];
|
|
134
|
-
for (const entry of raw) {
|
|
135
|
-
if (typeof entry === "string" && entry.trim()) {
|
|
136
|
-
migrated.push({
|
|
137
|
-
value: entry,
|
|
138
|
-
mode: "contains"
|
|
139
|
-
});
|
|
140
|
-
} else if (entry && typeof entry === "object" && typeof entry.value === "string") {
|
|
141
|
-
const e = entry;
|
|
142
|
-
migrated.push({
|
|
143
|
-
value: e.value,
|
|
144
|
-
mode: e.mode === "exact" ? "exact" : "contains"
|
|
145
|
-
});
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
// Always ensure Buoy license API is hidden
|
|
149
|
-
if (!migrated.some(p => p.value === "api.keygen.sh")) {
|
|
150
|
-
migrated.push({
|
|
151
|
-
value: "api.keygen.sh",
|
|
152
|
-
mode: "contains"
|
|
153
|
-
});
|
|
154
|
-
}
|
|
155
|
-
setIgnoredPatterns(migrated);
|
|
156
|
-
}
|
|
157
|
-
} catch (_error) {
|
|
158
|
-
// Silently fail - filters will use defaults
|
|
159
|
-
} finally {
|
|
160
|
-
hasLoadedFilters.current = true;
|
|
161
|
-
}
|
|
162
|
-
};
|
|
163
|
-
loadFilters();
|
|
164
|
-
}, [visible]);
|
|
165
|
-
|
|
166
|
-
// Save filters when they change
|
|
167
|
-
useEffect(() => {
|
|
168
|
-
if (!hasLoadedFilters.current) return; // Don't save on initial load
|
|
169
|
-
|
|
170
|
-
const saveFilters = async () => {
|
|
171
|
-
try {
|
|
172
|
-
await persistentStorage.setItem(devToolsStorageKeys.network.ignoredDomains(), JSON.stringify(ignoredPatterns));
|
|
173
|
-
} catch (_error) {
|
|
174
|
-
// Silently fail - filters will remain in memory
|
|
175
|
-
}
|
|
176
|
-
};
|
|
177
|
-
saveFilters();
|
|
178
|
-
}, [ignoredPatterns]);
|
|
179
|
-
|
|
180
100
|
// Load persisted copy settings on mount
|
|
181
101
|
useEffect(() => {
|
|
182
102
|
if (!visible || hasLoadedCopySettings.current) return;
|
|
@@ -232,9 +152,6 @@ function NetworkModalInner({
|
|
|
232
152
|
}
|
|
233
153
|
}, [isSearchActive]);
|
|
234
154
|
|
|
235
|
-
// Derived set of pattern values (for components that only care about presence).
|
|
236
|
-
const ignoredPatternValues = useMemo(() => new Set(ignoredPatterns.map(p => p.value)), [ignoredPatterns]);
|
|
237
|
-
|
|
238
155
|
// Filter events based on ignored patterns (mode-aware)
|
|
239
156
|
const filteredEvents = useMemo(() => {
|
|
240
157
|
if (ignoredPatterns.length === 0) return events;
|
|
@@ -244,37 +161,6 @@ function NetworkModalInner({
|
|
|
244
161
|
});
|
|
245
162
|
}, [events, ignoredPatterns]);
|
|
246
163
|
|
|
247
|
-
// Add or no-op (used by add-pattern UI and suggested-items taps)
|
|
248
|
-
const addIgnoredPattern = useCallback(pattern => {
|
|
249
|
-
const value = pattern.value.trim();
|
|
250
|
-
if (!value) return;
|
|
251
|
-
setIgnoredPatterns(prev => prev.some(p => p.value === value) ? prev : [...prev, {
|
|
252
|
-
value,
|
|
253
|
-
mode: pattern.mode
|
|
254
|
-
}]);
|
|
255
|
-
}, []);
|
|
256
|
-
|
|
257
|
-
// Remove by value (used by the filter list X button and the detail view chips)
|
|
258
|
-
const removeIgnoredPattern = useCallback(value => {
|
|
259
|
-
setIgnoredPatterns(prev => prev.filter(p => p.value !== value));
|
|
260
|
-
}, []);
|
|
261
|
-
|
|
262
|
-
// Toggle presence (used by the detail-view domain/url chips — adds as contains)
|
|
263
|
-
const toggleIgnoredPattern = useCallback(value => {
|
|
264
|
-
setIgnoredPatterns(prev => prev.some(p => p.value === value) ? prev.filter(p => p.value !== value) : [...prev, {
|
|
265
|
-
value,
|
|
266
|
-
mode: "contains"
|
|
267
|
-
}]);
|
|
268
|
-
}, []);
|
|
269
|
-
|
|
270
|
-
// Flip an existing pattern's mode between contains <-> exact
|
|
271
|
-
const toggleIgnoredPatternMode = useCallback(value => {
|
|
272
|
-
setIgnoredPatterns(prev => prev.map(p => p.value === value ? {
|
|
273
|
-
...p,
|
|
274
|
-
mode: p.mode === "contains" ? "exact" : "contains"
|
|
275
|
-
} : p));
|
|
276
|
-
}, []);
|
|
277
|
-
|
|
278
164
|
// Helper to check if payload should be included based on size
|
|
279
165
|
const shouldIncludePayload = useCallback(data => {
|
|
280
166
|
if (copySettings.bodySizeThreshold === -1) return true;
|
|
@@ -14,7 +14,8 @@ export { NetworkEventItemCompact } from "./network/components/NetworkEventItemCo
|
|
|
14
14
|
export { useNetworkEvents } from "./network/hooks/useNetworkEvents";
|
|
15
15
|
export { TickProvider, useTickEveryMinute } from "./network/hooks/useTickEveryMinute";
|
|
16
16
|
export { formatBytes, formatDuration, formatHttpStatus, } from "./network/utils/formatting";
|
|
17
|
-
export type { NetworkEvent, NetworkStats, NetworkFilter, NetworkEventStatus, NetworkInsight, } from "./network/types";
|
|
17
|
+
export type { NetworkEvent, NetworkStats, NetworkFilter, NetworkEventStatus, NetworkInsight, IgnoredPattern, IgnoredPatternMatchMode, } from "./network/types";
|
|
18
|
+
export { useIgnoredPatterns, ignoredPatternsStore, urlMatchesIgnoredPattern, isUrlIgnored, } from "@buoy-gg/shared-ui";
|
|
18
19
|
export { networkSyncAdapter } from "./network/sync/networkSyncAdapter";
|
|
19
20
|
export { NetworkBodyResolverProvider, type NetworkBodyResolver, type ResolvedNetworkBody, } from "./network/sync/networkBodyResolver";
|
|
20
21
|
/** @internal */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAKhE,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AACjE,OAAO,EAAE,sBAAsB,EAAE,MAAM,6CAA6C,CAAC;AACrF,OAAO,EAAE,uBAAuB,EAAE,MAAM,8CAA8C,CAAC;AAKvF,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAKtF,OAAO,EACL,WAAW,EACX,cAAc,EACd,gBAAgB,GACjB,MAAM,4BAA4B,CAAC;AAKpC,YAAY,EACV,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,kBAAkB,EAClB,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAKhE,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AACjE,OAAO,EAAE,sBAAsB,EAAE,MAAM,6CAA6C,CAAC;AACrF,OAAO,EAAE,uBAAuB,EAAE,MAAM,8CAA8C,CAAC;AAKvF,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAKtF,OAAO,EACL,WAAW,EACX,cAAc,EACd,gBAAgB,GACjB,MAAM,4BAA4B,CAAC;AAKpC,YAAY,EACV,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,kBAAkB,EAClB,cAAc,EACd,cAAc,EACd,uBAAuB,GACxB,MAAM,iBAAiB,CAAC;AAQzB,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,wBAAwB,EACxB,YAAY,GACb,MAAM,oBAAoB,CAAC;AAK5B,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AACvE,OAAO,EACL,2BAA2B,EAC3B,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,GACzB,MAAM,oCAAoC,CAAC;AAO5C,gBAAgB;AAChB,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACtE,gBAAgB;AAChB,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,yBAAyB,GAC1B,MAAM,iCAAiC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NetworkModal.d.ts","sourceRoot":"","sources":["../../../../src/network/components/NetworkModal.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"NetworkModal.d.ts","sourceRoot":"","sources":["../../../../src/network/components/NetworkModal.tsx"],"names":[],"mappings":"AA8CA,UAAU,iBAAiB;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,UAAU,CAAC,EAAE,CAAC,UAAU,EAAE,GAAG,KAAK,IAAI,CAAC;IACvC,2BAA2B,CAAC,EAAE,OAAO,CAAC;CACvC;AAu/BD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,+BAMpD"}
|
|
@@ -76,19 +76,11 @@ export interface NetworkFilter {
|
|
|
76
76
|
/** Human readable status classifications derived from request/response metadata. */
|
|
77
77
|
export type NetworkEventStatus = "pending" | "success" | "error" | "timeout";
|
|
78
78
|
/**
|
|
79
|
-
*
|
|
80
|
-
*
|
|
81
|
-
*
|
|
82
|
-
* - `exact`: smart equality — if pattern starts with `/`, matches URL.pathname;
|
|
83
|
-
* if it starts with `http://`/`https://`, matches origin+pathname; otherwise
|
|
84
|
-
* matches URL.host.
|
|
79
|
+
* Ignored-pattern types now live in @buoy-gg/shared-ui so the Network and Events
|
|
80
|
+
* tools share one canonical definition + filter store. Re-exported here for
|
|
81
|
+
* backwards compatibility with existing `../types` imports.
|
|
85
82
|
*/
|
|
86
|
-
export type IgnoredPatternMatchMode
|
|
87
|
-
/** A single network-events exclude pattern with its match mode. */
|
|
88
|
-
export interface IgnoredPattern {
|
|
89
|
-
value: string;
|
|
90
|
-
mode: IgnoredPatternMatchMode;
|
|
91
|
-
}
|
|
83
|
+
export type { IgnoredPattern, IgnoredPatternMatchMode, } from "@buoy-gg/shared-ui";
|
|
92
84
|
/**
|
|
93
85
|
* Insight surfaces highlight notable traffic patterns or issues for the current session.
|
|
94
86
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/network/types/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EACF,KAAK,GACL,MAAM,GACN,KAAK,GACL,QAAQ,GACR,OAAO,GACP,MAAM,GACN,SAAS,GACT,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,OAAO,GAAG,OAAO,GAAG,KAAK,GAAG,SAAS,GAAG,UAAU,CAAC;IACnE;;;;;;;;;;OAUG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;;;;;;;;OAWG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC5C;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,CAAC,EAAE,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,KAAK,CAAC;IACjD,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,oFAAoF;AACpF,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC;AAE7E
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/network/types/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EACF,KAAK,GACL,MAAM,GACN,KAAK,GACL,QAAQ,GACR,OAAO,GACP,MAAM,GACN,SAAS,GACT,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,OAAO,GAAG,OAAO,GAAG,KAAK,GAAG,SAAS,GAAG,UAAU,CAAC;IACnE;;;;;;;;;;OAUG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;;;;;;;;OAWG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC5C;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,CAAC,EAAE,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,KAAK,CAAC;IACjD,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,oFAAoF;AACpF,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC;AAE7E;;;;GAIG;AACH,YAAY,EACV,cAAc,EACd,uBAAuB,GACxB,MAAM,oBAAoB,CAAC;AAE5B;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,aAAa,GAAG,OAAO,GAAG,UAAU,GAAG,cAAc,CAAC;IAC5D,QAAQ,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@buoy-gg/network",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "4.0.1",
|
|
4
4
|
"description": "network package",
|
|
5
5
|
"main": "lib/commonjs/index.js",
|
|
6
6
|
"module": "lib/module/index.js",
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
],
|
|
27
27
|
"sideEffects": false,
|
|
28
28
|
"dependencies": {
|
|
29
|
-
"@buoy-gg/shared-ui": "
|
|
29
|
+
"@buoy-gg/shared-ui": "4.0.1"
|
|
30
30
|
},
|
|
31
31
|
"peerDependencies": {
|
|
32
32
|
"react": "*",
|