@buoy-gg/network 2.1.14 → 2.1.16
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/network/components/NetworkEventItemCompact.js +3 -3
- package/lib/commonjs/network/components/NetworkFilterViewV3.js +156 -11
- package/lib/commonjs/network/components/NetworkModal.js +100 -44
- package/lib/commonjs/network/utils/networkListener.js +8 -3
- package/lib/module/network/components/NetworkEventItemCompact.js +3 -3
- package/lib/module/network/components/NetworkFilterViewV3.js +158 -13
- package/lib/module/network/components/NetworkModal.js +102 -44
- package/lib/module/network/utils/networkListener.js +8 -3
- package/lib/typescript/network/components/NetworkEventItemCompact.d.ts.map +1 -1
- package/lib/typescript/network/components/NetworkFilterViewV3.d.ts +9 -5
- package/lib/typescript/network/components/NetworkFilterViewV3.d.ts.map +1 -1
- package/lib/typescript/network/components/NetworkModal.d.ts.map +1 -1
- package/lib/typescript/network/index.d.ts +1 -1
- package/lib/typescript/network/index.d.ts.map +1 -1
- package/lib/typescript/network/types/index.d.ts +15 -1
- package/lib/typescript/network/types/index.d.ts.map +1 -1
- package/lib/typescript/network/utils/networkListener.d.ts +1 -1
- package/lib/typescript/network/utils/networkListener.d.ts.map +1 -1
- package/package.json +2 -2
|
@@ -161,13 +161,13 @@ const NetworkEventItemCompact = exports.NetworkEventItemCompact = /*#__PURE__*/(
|
|
|
161
161
|
statusColor: statusColor
|
|
162
162
|
}), event.requestClient && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
|
|
163
163
|
style: [styles.topRightBadge, {
|
|
164
|
-
backgroundColor: event.requestClient === "fetch" ? "rgba(74, 144, 226, 0.15)" : event.requestClient === "graphql" ? "rgba(229, 53, 171, 0.15)" : event.requestClient === "grpc-web" ? "rgba(16, 185, 129, 0.15)" : "rgba(147, 51, 234, 0.15)"
|
|
164
|
+
backgroundColor: event.requestClient === "fetch" ? "rgba(74, 144, 226, 0.15)" : event.requestClient === "graphql" ? "rgba(229, 53, 171, 0.15)" : event.requestClient === "grpc-web" ? "rgba(16, 185, 129, 0.15)" : event.requestClient === "xhr" ? "rgba(245, 158, 11, 0.15)" : "rgba(147, 51, 234, 0.15)"
|
|
165
165
|
}],
|
|
166
166
|
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
|
|
167
167
|
style: [styles.clientText, {
|
|
168
|
-
color: event.requestClient === "fetch" ? "#4A90E2" : event.requestClient === "graphql" ? "#E535AB" : event.requestClient === "grpc-web" ? "#10B981" : "#9333EA"
|
|
168
|
+
color: event.requestClient === "fetch" ? "#4A90E2" : event.requestClient === "graphql" ? "#E535AB" : event.requestClient === "grpc-web" ? "#10B981" : event.requestClient === "xhr" ? "#F59E0B" : "#9333EA"
|
|
169
169
|
}],
|
|
170
|
-
children: event.requestClient === "graphql" ? "GQL" : event.requestClient === "grpc-web" ? "gRPC" : event.requestClient
|
|
170
|
+
children: event.requestClient === "graphql" ? "GQL" : event.requestClient === "grpc-web" ? "gRPC" : event.requestClient === "xhr" ? "XHR" : event.requestClient
|
|
171
171
|
})
|
|
172
172
|
})]
|
|
173
173
|
}), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
|
|
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
exports.NetworkFilterViewV3 = NetworkFilterViewV3;
|
|
7
7
|
var _sharedUi = require("@buoy-gg/shared-ui");
|
|
8
8
|
var _react = require("react");
|
|
9
|
+
var _reactNative = require("react-native");
|
|
9
10
|
var _jsxRuntime = require("react/jsx-runtime");
|
|
10
11
|
function getContentType(event) {
|
|
11
12
|
const headers = event.responseHeaders || event.requestHeaders;
|
|
@@ -90,10 +91,91 @@ function NetworkFilterViewV3({
|
|
|
90
91
|
events,
|
|
91
92
|
filter,
|
|
92
93
|
onFilterChange,
|
|
93
|
-
ignoredPatterns =
|
|
94
|
-
|
|
95
|
-
onAddPattern = () => {}
|
|
94
|
+
ignoredPatterns = [],
|
|
95
|
+
onRemovePattern = () => {},
|
|
96
|
+
onAddPattern = () => {},
|
|
97
|
+
onTogglePatternMode = () => {}
|
|
96
98
|
}) {
|
|
99
|
+
// Mode applied when the user submits the "Add pattern" input. Defaults to
|
|
100
|
+
// `contains` so behavior matches the previous implementation until the user
|
|
101
|
+
// opts into `exact`.
|
|
102
|
+
const [nextPatternMode, setNextPatternMode] = (0, _react.useState)("contains");
|
|
103
|
+
const patternModes = (0, _react.useMemo)(() => {
|
|
104
|
+
const map = new Map();
|
|
105
|
+
for (const p of ignoredPatterns) map.set(p.value, p.mode);
|
|
106
|
+
return map;
|
|
107
|
+
}, [ignoredPatterns]);
|
|
108
|
+
const activePatternsSet = (0, _react.useMemo)(() => new Set(ignoredPatterns.map(p => p.value)), [ignoredPatterns]);
|
|
109
|
+
const handlePatternAdd = (0, _react.useCallback)(pattern => {
|
|
110
|
+
onAddPattern({
|
|
111
|
+
value: pattern,
|
|
112
|
+
mode: nextPatternMode
|
|
113
|
+
});
|
|
114
|
+
}, [onAddPattern, nextPatternMode]);
|
|
115
|
+
const renderPatternMeta = (0, _react.useCallback)(pattern => {
|
|
116
|
+
const mode = patternModes.get(pattern) ?? "contains";
|
|
117
|
+
const isExact = mode === "exact";
|
|
118
|
+
const color = isExact ? _sharedUi.macOSColors.semantic.warning : _sharedUi.macOSColors.semantic.info;
|
|
119
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
|
|
120
|
+
accessibilityRole: "button",
|
|
121
|
+
accessibilityLabel: `Match mode: ${mode}. Tap to toggle.`,
|
|
122
|
+
onPress: () => onTogglePatternMode(pattern),
|
|
123
|
+
style: [styles.modeBadge, {
|
|
124
|
+
borderColor: `${color}60`,
|
|
125
|
+
backgroundColor: `${color}15`
|
|
126
|
+
}],
|
|
127
|
+
hitSlop: {
|
|
128
|
+
top: 6,
|
|
129
|
+
bottom: 6,
|
|
130
|
+
left: 6,
|
|
131
|
+
right: 6
|
|
132
|
+
},
|
|
133
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
|
|
134
|
+
style: [styles.modeBadgeText, {
|
|
135
|
+
color
|
|
136
|
+
}],
|
|
137
|
+
children: isExact ? "EXACT" : "CONTAINS"
|
|
138
|
+
})
|
|
139
|
+
});
|
|
140
|
+
}, [patternModes, onTogglePatternMode]);
|
|
141
|
+
const renderAddFilterExtra = (0, _react.useCallback)(() => {
|
|
142
|
+
const options = [{
|
|
143
|
+
label: "Contains",
|
|
144
|
+
value: "contains",
|
|
145
|
+
hint: "substring"
|
|
146
|
+
}, {
|
|
147
|
+
label: "Exact",
|
|
148
|
+
value: "exact",
|
|
149
|
+
hint: "whole path/host/url"
|
|
150
|
+
}];
|
|
151
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
|
|
152
|
+
style: styles.modeToggleRow,
|
|
153
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
|
|
154
|
+
style: styles.modeToggleLabel,
|
|
155
|
+
children: "Match:"
|
|
156
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
|
|
157
|
+
style: styles.modeToggleGroup,
|
|
158
|
+
children: options.map(opt => {
|
|
159
|
+
const isActive = nextPatternMode === opt.value;
|
|
160
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.TouchableOpacity, {
|
|
161
|
+
onPress: () => setNextPatternMode(opt.value),
|
|
162
|
+
style: [styles.modeToggleButton, isActive && styles.modeToggleButtonActive],
|
|
163
|
+
accessibilityRole: "button",
|
|
164
|
+
accessibilityState: {
|
|
165
|
+
selected: isActive
|
|
166
|
+
},
|
|
167
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
|
|
168
|
+
style: [styles.modeToggleButtonText, isActive && styles.modeToggleButtonTextActive],
|
|
169
|
+
children: opt.label
|
|
170
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
|
|
171
|
+
style: styles.modeToggleButtonHint,
|
|
172
|
+
children: opt.hint
|
|
173
|
+
})]
|
|
174
|
+
}, opt.value);
|
|
175
|
+
})
|
|
176
|
+
})]
|
|
177
|
+
});
|
|
178
|
+
}, [nextPatternMode]);
|
|
97
179
|
const statusCounts = (0, _react.useMemo)(() => {
|
|
98
180
|
const counts = {
|
|
99
181
|
all: events.length,
|
|
@@ -271,7 +353,8 @@ function NetworkFilterViewV3({
|
|
|
271
353
|
enabled: true,
|
|
272
354
|
placeholder: "Enter domain or URL pattern...",
|
|
273
355
|
title: "ACTIVE FILTERS",
|
|
274
|
-
icon: _sharedUi.Filter
|
|
356
|
+
icon: _sharedUi.Filter,
|
|
357
|
+
renderExtra: renderAddFilterExtra
|
|
275
358
|
},
|
|
276
359
|
availableItemsSection: {
|
|
277
360
|
enabled: true,
|
|
@@ -282,16 +365,78 @@ function NetworkFilterViewV3({
|
|
|
282
365
|
howItWorksSection: {
|
|
283
366
|
enabled: true,
|
|
284
367
|
title: "HOW NETWORK FILTERS WORK",
|
|
285
|
-
description: "Patterns hide matching requests from the network event list.
|
|
286
|
-
examples: ["• example.com →
|
|
368
|
+
description: "Patterns hide matching requests from the network event list. Each pattern has a match mode you can toggle on its badge: CONTAINS hides any URL containing the text; EXACT hides only an exact path/host/url match.",
|
|
369
|
+
examples: ["• example.com (CONTAINS) → any request whose URL contains example.com", "• example.com (EXACT) → only requests served by that exact host", "• /v1 (CONTAINS) → any URL containing /v1 (e.g. /v1, /v1/users)", "• /v1 (EXACT) → only requests whose pathname is exactly /v1"],
|
|
287
370
|
icon: _sharedUi.Filter
|
|
288
371
|
},
|
|
289
372
|
onFilterChange: handleDynamicFilterChange,
|
|
290
|
-
onPatternAdd:
|
|
291
|
-
onPatternToggle:
|
|
292
|
-
activePatterns:
|
|
293
|
-
|
|
373
|
+
onPatternAdd: handlePatternAdd,
|
|
374
|
+
onPatternToggle: onRemovePattern,
|
|
375
|
+
activePatterns: activePatternsSet,
|
|
376
|
+
renderPatternMeta
|
|
377
|
+
}), [activePatternsSet, filterSections, handleDynamicFilterChange, handlePatternAdd, onRemovePattern, renderAddFilterExtra, renderPatternMeta, suggestionItems]);
|
|
294
378
|
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.DynamicFilterView, {
|
|
295
379
|
...dynamicFilterConfig
|
|
296
380
|
});
|
|
297
|
-
}
|
|
381
|
+
}
|
|
382
|
+
const styles = _reactNative.StyleSheet.create({
|
|
383
|
+
modeBadge: {
|
|
384
|
+
paddingHorizontal: 8,
|
|
385
|
+
paddingVertical: 3,
|
|
386
|
+
borderRadius: 6,
|
|
387
|
+
borderWidth: 1
|
|
388
|
+
},
|
|
389
|
+
modeBadgeText: {
|
|
390
|
+
fontSize: 9,
|
|
391
|
+
fontFamily: "monospace",
|
|
392
|
+
fontWeight: "700",
|
|
393
|
+
letterSpacing: 0.5
|
|
394
|
+
},
|
|
395
|
+
modeToggleRow: {
|
|
396
|
+
flexDirection: "row",
|
|
397
|
+
alignItems: "center",
|
|
398
|
+
gap: 8,
|
|
399
|
+
marginBottom: 8
|
|
400
|
+
},
|
|
401
|
+
modeToggleLabel: {
|
|
402
|
+
fontSize: 11,
|
|
403
|
+
fontWeight: "600",
|
|
404
|
+
color: _sharedUi.macOSColors.text.secondary,
|
|
405
|
+
fontFamily: "monospace",
|
|
406
|
+
letterSpacing: 0.3
|
|
407
|
+
},
|
|
408
|
+
modeToggleGroup: {
|
|
409
|
+
flexDirection: "row",
|
|
410
|
+
gap: 6,
|
|
411
|
+
flex: 1
|
|
412
|
+
},
|
|
413
|
+
modeToggleButton: {
|
|
414
|
+
flex: 1,
|
|
415
|
+
paddingVertical: 6,
|
|
416
|
+
paddingHorizontal: 10,
|
|
417
|
+
borderRadius: 8,
|
|
418
|
+
borderWidth: 1,
|
|
419
|
+
borderColor: _sharedUi.macOSColors.border.default,
|
|
420
|
+
backgroundColor: _sharedUi.macOSColors.background.hover,
|
|
421
|
+
alignItems: "center"
|
|
422
|
+
},
|
|
423
|
+
modeToggleButtonActive: {
|
|
424
|
+
borderColor: _sharedUi.macOSColors.semantic.info,
|
|
425
|
+
backgroundColor: `${_sharedUi.macOSColors.semantic.info}22`
|
|
426
|
+
},
|
|
427
|
+
modeToggleButtonText: {
|
|
428
|
+
fontSize: 11,
|
|
429
|
+
fontWeight: "700",
|
|
430
|
+
color: _sharedUi.macOSColors.text.secondary,
|
|
431
|
+
fontFamily: "monospace",
|
|
432
|
+
letterSpacing: 0.3
|
|
433
|
+
},
|
|
434
|
+
modeToggleButtonTextActive: {
|
|
435
|
+
color: _sharedUi.macOSColors.semantic.info
|
|
436
|
+
},
|
|
437
|
+
modeToggleButtonHint: {
|
|
438
|
+
fontSize: 9,
|
|
439
|
+
color: _sharedUi.macOSColors.text.muted,
|
|
440
|
+
marginTop: 1
|
|
441
|
+
}
|
|
442
|
+
});
|
|
@@ -15,6 +15,33 @@ 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
|
+
}
|
|
18
45
|
// Decompose by Responsibility: Extract empty state component
|
|
19
46
|
function EmptyState({
|
|
20
47
|
isEnabled
|
|
@@ -77,8 +104,12 @@ function NetworkModalInner({
|
|
|
77
104
|
const [searchText, setSearchText] = (0, _react.useState)("");
|
|
78
105
|
const [isSearchActive, setIsSearchActive] = (0, _react.useState)(false);
|
|
79
106
|
const searchInputRef = (0, _react.useRef)(null);
|
|
80
|
-
const [ignoredPatterns, setIgnoredPatterns] = (0, _react.useState)(
|
|
81
|
-
|
|
107
|
+
const [ignoredPatterns, setIgnoredPatterns] = (0, _react.useState)([
|
|
108
|
+
// Auto-hide Buoy license API requests by default
|
|
109
|
+
{
|
|
110
|
+
value: "api.keygen.sh",
|
|
111
|
+
mode: "contains"
|
|
112
|
+
}]);
|
|
82
113
|
const [copySettings, setCopySettings] = (0, _react.useState)(_NetworkCopySettingsView.DEFAULT_COPY_SETTINGS);
|
|
83
114
|
const flatListRef = (0, _react.useRef)(null);
|
|
84
115
|
const hasLoadedFilters = (0, _react.useRef)(false);
|
|
@@ -97,15 +128,33 @@ function NetworkModalInner({
|
|
|
97
128
|
if (!visible || hasLoadedFilters.current) return;
|
|
98
129
|
const loadFilters = async () => {
|
|
99
130
|
try {
|
|
100
|
-
// Load ignored patterns (using domains key for now)
|
|
101
131
|
const storedPatterns = await _sharedUi.persistentStorage.getItem(_sharedUi.devToolsStorageKeys.network.ignoredDomains());
|
|
102
132
|
if (storedPatterns) {
|
|
103
|
-
|
|
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
|
+
}
|
|
104
150
|
// Always ensure Buoy license API is hidden
|
|
105
|
-
if (!
|
|
106
|
-
|
|
151
|
+
if (!migrated.some(p => p.value === "api.keygen.sh")) {
|
|
152
|
+
migrated.push({
|
|
153
|
+
value: "api.keygen.sh",
|
|
154
|
+
mode: "contains"
|
|
155
|
+
});
|
|
107
156
|
}
|
|
108
|
-
setIgnoredPatterns(
|
|
157
|
+
setIgnoredPatterns(migrated);
|
|
109
158
|
}
|
|
110
159
|
} catch (_error) {
|
|
111
160
|
// Silently fail - filters will use defaults
|
|
@@ -122,9 +171,7 @@ function NetworkModalInner({
|
|
|
122
171
|
|
|
123
172
|
const saveFilters = async () => {
|
|
124
173
|
try {
|
|
125
|
-
|
|
126
|
-
const patterns = Array.from(ignoredPatterns);
|
|
127
|
-
await _sharedUi.persistentStorage.setItem(_sharedUi.devToolsStorageKeys.network.ignoredDomains(), JSON.stringify(patterns));
|
|
174
|
+
await _sharedUi.persistentStorage.setItem(_sharedUi.devToolsStorageKeys.network.ignoredDomains(), JSON.stringify(ignoredPatterns));
|
|
128
175
|
} catch (_error) {
|
|
129
176
|
// Silently fail - filters will remain in memory
|
|
130
177
|
}
|
|
@@ -187,18 +234,49 @@ function NetworkModalInner({
|
|
|
187
234
|
}
|
|
188
235
|
}, [isSearchActive]);
|
|
189
236
|
|
|
190
|
-
//
|
|
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
|
+
// Filter events based on ignored patterns (mode-aware)
|
|
191
241
|
const filteredEvents = (0, _react.useMemo)(() => {
|
|
192
|
-
if (ignoredPatterns.
|
|
242
|
+
if (ignoredPatterns.length === 0) return events;
|
|
193
243
|
return events.filter(event => {
|
|
194
|
-
const
|
|
195
|
-
|
|
196
|
-
// Check if any pattern matches the URL
|
|
197
|
-
const isFiltered = Array.from(ignoredPatterns).some(pattern => url.includes(pattern.toLowerCase()));
|
|
244
|
+
const isFiltered = ignoredPatterns.some(pattern => urlMatchesIgnoredPattern(event.url, pattern));
|
|
198
245
|
return !isFiltered;
|
|
199
246
|
});
|
|
200
247
|
}, [events, ignoredPatterns]);
|
|
201
248
|
|
|
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
|
+
|
|
202
280
|
// Helper to check if payload should be included based on size
|
|
203
281
|
const shouldIncludePayload = (0, _react.useCallback)(data => {
|
|
204
282
|
if (copySettings.bodySizeThreshold === -1) return true;
|
|
@@ -339,10 +417,7 @@ function NetworkModalInner({
|
|
|
339
417
|
let successful = 0;
|
|
340
418
|
let failed = 0;
|
|
341
419
|
let pending = 0;
|
|
342
|
-
const eventsForStats = ignoredPatterns.
|
|
343
|
-
const url = event.url.toLowerCase();
|
|
344
|
-
return !Array.from(ignoredPatterns).some(pattern => url.includes(pattern.toLowerCase()));
|
|
345
|
-
});
|
|
420
|
+
const eventsForStats = ignoredPatterns.length === 0 ? allEvents : allEvents.filter(event => !ignoredPatterns.some(pattern => urlMatchesIgnoredPattern(event.url, pattern)));
|
|
346
421
|
for (const event of eventsForStats) {
|
|
347
422
|
if (event.status && event.status >= 200 && event.status < 300) {
|
|
348
423
|
successful++;
|
|
@@ -611,16 +686,8 @@ function NetworkModalInner({
|
|
|
611
686
|
/* Show detail view if event is selected */
|
|
612
687
|
(0, _jsxRuntime.jsx)(_NetworkEventDetailView.NetworkEventDetailView, {
|
|
613
688
|
event: selectedEvent,
|
|
614
|
-
ignoredPatterns:
|
|
615
|
-
onTogglePattern:
|
|
616
|
-
const newPatterns = new Set(ignoredPatterns);
|
|
617
|
-
if (newPatterns.has(pattern)) {
|
|
618
|
-
newPatterns.delete(pattern);
|
|
619
|
-
} else {
|
|
620
|
-
newPatterns.add(pattern);
|
|
621
|
-
}
|
|
622
|
-
setIgnoredPatterns(newPatterns);
|
|
623
|
-
}
|
|
689
|
+
ignoredPatterns: ignoredPatternValues,
|
|
690
|
+
onTogglePattern: toggleIgnoredPattern
|
|
624
691
|
}) : showFilterView ? (/* Show filter/copy view based on active tab */
|
|
625
692
|
activeTab === "copy" ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_NetworkCopySettingsView.NetworkCopySettingsView, {
|
|
626
693
|
settings: copySettings,
|
|
@@ -631,20 +698,9 @@ function NetworkModalInner({
|
|
|
631
698
|
filter: filter,
|
|
632
699
|
onFilterChange: setFilter,
|
|
633
700
|
ignoredPatterns: ignoredPatterns,
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
newPatterns.delete(pattern);
|
|
638
|
-
} else {
|
|
639
|
-
newPatterns.add(pattern);
|
|
640
|
-
}
|
|
641
|
-
setIgnoredPatterns(newPatterns);
|
|
642
|
-
},
|
|
643
|
-
onAddPattern: pattern => {
|
|
644
|
-
const newPatterns = new Set(ignoredPatterns);
|
|
645
|
-
newPatterns.add(pattern);
|
|
646
|
-
setIgnoredPatterns(newPatterns);
|
|
647
|
-
}
|
|
701
|
+
onRemovePattern: removeIgnoredPattern,
|
|
702
|
+
onAddPattern: addIgnoredPattern,
|
|
703
|
+
onTogglePatternMode: toggleIgnoredPatternMode
|
|
648
704
|
})) : /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
|
|
649
705
|
children: [!isEnabled ? /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
|
|
650
706
|
style: styles.disabledBanner,
|
|
@@ -203,7 +203,7 @@ class NetworkListener {
|
|
|
203
203
|
* Handle XMLHttpRequest response processing
|
|
204
204
|
* This method processes the response and emits appropriate events
|
|
205
205
|
*/
|
|
206
|
-
handleXHRResponse(xhr, requestId, cleanUrl, method, requestHeaders, requestData, params, startTime, isError = false, clientType = "
|
|
206
|
+
handleXHRResponse(xhr, requestId, cleanUrl, method, requestHeaders, requestData, params, startTime, isError = false, clientType = "xhr") {
|
|
207
207
|
const duration = startTime ? Date.now() - startTime : 0;
|
|
208
208
|
if (isError || xhr.status === 0) {
|
|
209
209
|
// Network error or aborted request
|
|
@@ -590,8 +590,13 @@ class NetworkListener {
|
|
|
590
590
|
}
|
|
591
591
|
}
|
|
592
592
|
|
|
593
|
-
// Determine client type
|
|
594
|
-
|
|
593
|
+
// Determine client type. Honor an explicit X-Request-Client header first.
|
|
594
|
+
// Otherwise sniff axios via its default Accept header and fall back to
|
|
595
|
+
// "xhr" — defaulting to "axios" misclassified every raw XMLHttpRequest.
|
|
596
|
+
const explicitClient = requestHeaders["X-Request-Client"] || requestHeaders["x-request-client"];
|
|
597
|
+
const acceptHeader = requestHeaders["Accept"] || requestHeaders["accept"] || "";
|
|
598
|
+
const looksLikeAxios = acceptHeader.includes("application/json") && acceptHeader.includes("text/plain") && acceptHeader.includes("*/*");
|
|
599
|
+
const clientType = explicitClient || (looksLikeAxios ? "axios" : "xhr");
|
|
595
600
|
|
|
596
601
|
// Emit request event
|
|
597
602
|
self.emit({
|
|
@@ -158,13 +158,13 @@ export const NetworkEventItemCompact = /*#__PURE__*/memo(({
|
|
|
158
158
|
statusColor: statusColor
|
|
159
159
|
}), event.requestClient && /*#__PURE__*/_jsx(View, {
|
|
160
160
|
style: [styles.topRightBadge, {
|
|
161
|
-
backgroundColor: event.requestClient === "fetch" ? "rgba(74, 144, 226, 0.15)" : event.requestClient === "graphql" ? "rgba(229, 53, 171, 0.15)" : event.requestClient === "grpc-web" ? "rgba(16, 185, 129, 0.15)" : "rgba(147, 51, 234, 0.15)"
|
|
161
|
+
backgroundColor: event.requestClient === "fetch" ? "rgba(74, 144, 226, 0.15)" : event.requestClient === "graphql" ? "rgba(229, 53, 171, 0.15)" : event.requestClient === "grpc-web" ? "rgba(16, 185, 129, 0.15)" : event.requestClient === "xhr" ? "rgba(245, 158, 11, 0.15)" : "rgba(147, 51, 234, 0.15)"
|
|
162
162
|
}],
|
|
163
163
|
children: /*#__PURE__*/_jsx(Text, {
|
|
164
164
|
style: [styles.clientText, {
|
|
165
|
-
color: event.requestClient === "fetch" ? "#4A90E2" : event.requestClient === "graphql" ? "#E535AB" : event.requestClient === "grpc-web" ? "#10B981" : "#9333EA"
|
|
165
|
+
color: event.requestClient === "fetch" ? "#4A90E2" : event.requestClient === "graphql" ? "#E535AB" : event.requestClient === "grpc-web" ? "#10B981" : event.requestClient === "xhr" ? "#F59E0B" : "#9333EA"
|
|
166
166
|
}],
|
|
167
|
-
children: event.requestClient === "graphql" ? "GQL" : event.requestClient === "grpc-web" ? "gRPC" : event.requestClient
|
|
167
|
+
children: event.requestClient === "graphql" ? "GQL" : event.requestClient === "grpc-web" ? "gRPC" : event.requestClient === "xhr" ? "XHR" : event.requestClient
|
|
168
168
|
})
|
|
169
169
|
})]
|
|
170
170
|
}), /*#__PURE__*/_jsxs(View, {
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
import { CheckCircle, Clock, DynamicFilterView, Film, FileJson, FileText, Filter, Globe, Image, macOSColors, Music, XCircle } from "@buoy-gg/shared-ui";
|
|
4
|
-
import { useCallback, useMemo } from "react";
|
|
5
|
-
import {
|
|
4
|
+
import { useCallback, useMemo, useState } from "react";
|
|
5
|
+
import { StyleSheet, Text, TouchableOpacity, View } from "react-native";
|
|
6
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
6
7
|
function getContentType(event) {
|
|
7
8
|
const headers = event.responseHeaders || event.requestHeaders;
|
|
8
9
|
const contentType = headers?.["content-type"] || headers?.["Content-Type"] || "";
|
|
@@ -86,10 +87,91 @@ export function NetworkFilterViewV3({
|
|
|
86
87
|
events,
|
|
87
88
|
filter,
|
|
88
89
|
onFilterChange,
|
|
89
|
-
ignoredPatterns =
|
|
90
|
-
|
|
91
|
-
onAddPattern = () => {}
|
|
90
|
+
ignoredPatterns = [],
|
|
91
|
+
onRemovePattern = () => {},
|
|
92
|
+
onAddPattern = () => {},
|
|
93
|
+
onTogglePatternMode = () => {}
|
|
92
94
|
}) {
|
|
95
|
+
// Mode applied when the user submits the "Add pattern" input. Defaults to
|
|
96
|
+
// `contains` so behavior matches the previous implementation until the user
|
|
97
|
+
// opts into `exact`.
|
|
98
|
+
const [nextPatternMode, setNextPatternMode] = useState("contains");
|
|
99
|
+
const patternModes = useMemo(() => {
|
|
100
|
+
const map = new Map();
|
|
101
|
+
for (const p of ignoredPatterns) map.set(p.value, p.mode);
|
|
102
|
+
return map;
|
|
103
|
+
}, [ignoredPatterns]);
|
|
104
|
+
const activePatternsSet = useMemo(() => new Set(ignoredPatterns.map(p => p.value)), [ignoredPatterns]);
|
|
105
|
+
const handlePatternAdd = useCallback(pattern => {
|
|
106
|
+
onAddPattern({
|
|
107
|
+
value: pattern,
|
|
108
|
+
mode: nextPatternMode
|
|
109
|
+
});
|
|
110
|
+
}, [onAddPattern, nextPatternMode]);
|
|
111
|
+
const renderPatternMeta = useCallback(pattern => {
|
|
112
|
+
const mode = patternModes.get(pattern) ?? "contains";
|
|
113
|
+
const isExact = mode === "exact";
|
|
114
|
+
const color = isExact ? macOSColors.semantic.warning : macOSColors.semantic.info;
|
|
115
|
+
return /*#__PURE__*/_jsx(TouchableOpacity, {
|
|
116
|
+
accessibilityRole: "button",
|
|
117
|
+
accessibilityLabel: `Match mode: ${mode}. Tap to toggle.`,
|
|
118
|
+
onPress: () => onTogglePatternMode(pattern),
|
|
119
|
+
style: [styles.modeBadge, {
|
|
120
|
+
borderColor: `${color}60`,
|
|
121
|
+
backgroundColor: `${color}15`
|
|
122
|
+
}],
|
|
123
|
+
hitSlop: {
|
|
124
|
+
top: 6,
|
|
125
|
+
bottom: 6,
|
|
126
|
+
left: 6,
|
|
127
|
+
right: 6
|
|
128
|
+
},
|
|
129
|
+
children: /*#__PURE__*/_jsx(Text, {
|
|
130
|
+
style: [styles.modeBadgeText, {
|
|
131
|
+
color
|
|
132
|
+
}],
|
|
133
|
+
children: isExact ? "EXACT" : "CONTAINS"
|
|
134
|
+
})
|
|
135
|
+
});
|
|
136
|
+
}, [patternModes, onTogglePatternMode]);
|
|
137
|
+
const renderAddFilterExtra = useCallback(() => {
|
|
138
|
+
const options = [{
|
|
139
|
+
label: "Contains",
|
|
140
|
+
value: "contains",
|
|
141
|
+
hint: "substring"
|
|
142
|
+
}, {
|
|
143
|
+
label: "Exact",
|
|
144
|
+
value: "exact",
|
|
145
|
+
hint: "whole path/host/url"
|
|
146
|
+
}];
|
|
147
|
+
return /*#__PURE__*/_jsxs(View, {
|
|
148
|
+
style: styles.modeToggleRow,
|
|
149
|
+
children: [/*#__PURE__*/_jsx(Text, {
|
|
150
|
+
style: styles.modeToggleLabel,
|
|
151
|
+
children: "Match:"
|
|
152
|
+
}), /*#__PURE__*/_jsx(View, {
|
|
153
|
+
style: styles.modeToggleGroup,
|
|
154
|
+
children: options.map(opt => {
|
|
155
|
+
const isActive = nextPatternMode === opt.value;
|
|
156
|
+
return /*#__PURE__*/_jsxs(TouchableOpacity, {
|
|
157
|
+
onPress: () => setNextPatternMode(opt.value),
|
|
158
|
+
style: [styles.modeToggleButton, isActive && styles.modeToggleButtonActive],
|
|
159
|
+
accessibilityRole: "button",
|
|
160
|
+
accessibilityState: {
|
|
161
|
+
selected: isActive
|
|
162
|
+
},
|
|
163
|
+
children: [/*#__PURE__*/_jsx(Text, {
|
|
164
|
+
style: [styles.modeToggleButtonText, isActive && styles.modeToggleButtonTextActive],
|
|
165
|
+
children: opt.label
|
|
166
|
+
}), /*#__PURE__*/_jsx(Text, {
|
|
167
|
+
style: styles.modeToggleButtonHint,
|
|
168
|
+
children: opt.hint
|
|
169
|
+
})]
|
|
170
|
+
}, opt.value);
|
|
171
|
+
})
|
|
172
|
+
})]
|
|
173
|
+
});
|
|
174
|
+
}, [nextPatternMode]);
|
|
93
175
|
const statusCounts = useMemo(() => {
|
|
94
176
|
const counts = {
|
|
95
177
|
all: events.length,
|
|
@@ -267,7 +349,8 @@ export function NetworkFilterViewV3({
|
|
|
267
349
|
enabled: true,
|
|
268
350
|
placeholder: "Enter domain or URL pattern...",
|
|
269
351
|
title: "ACTIVE FILTERS",
|
|
270
|
-
icon: Filter
|
|
352
|
+
icon: Filter,
|
|
353
|
+
renderExtra: renderAddFilterExtra
|
|
271
354
|
},
|
|
272
355
|
availableItemsSection: {
|
|
273
356
|
enabled: true,
|
|
@@ -278,16 +361,78 @@ export function NetworkFilterViewV3({
|
|
|
278
361
|
howItWorksSection: {
|
|
279
362
|
enabled: true,
|
|
280
363
|
title: "HOW NETWORK FILTERS WORK",
|
|
281
|
-
description: "Patterns hide matching requests from the network event list.
|
|
282
|
-
examples: ["• example.com →
|
|
364
|
+
description: "Patterns hide matching requests from the network event list. Each pattern has a match mode you can toggle on its badge: CONTAINS hides any URL containing the text; EXACT hides only an exact path/host/url match.",
|
|
365
|
+
examples: ["• example.com (CONTAINS) → any request whose URL contains example.com", "• example.com (EXACT) → only requests served by that exact host", "• /v1 (CONTAINS) → any URL containing /v1 (e.g. /v1, /v1/users)", "• /v1 (EXACT) → only requests whose pathname is exactly /v1"],
|
|
283
366
|
icon: Filter
|
|
284
367
|
},
|
|
285
368
|
onFilterChange: handleDynamicFilterChange,
|
|
286
|
-
onPatternAdd:
|
|
287
|
-
onPatternToggle:
|
|
288
|
-
activePatterns:
|
|
289
|
-
|
|
369
|
+
onPatternAdd: handlePatternAdd,
|
|
370
|
+
onPatternToggle: onRemovePattern,
|
|
371
|
+
activePatterns: activePatternsSet,
|
|
372
|
+
renderPatternMeta
|
|
373
|
+
}), [activePatternsSet, filterSections, handleDynamicFilterChange, handlePatternAdd, onRemovePattern, renderAddFilterExtra, renderPatternMeta, suggestionItems]);
|
|
290
374
|
return /*#__PURE__*/_jsx(DynamicFilterView, {
|
|
291
375
|
...dynamicFilterConfig
|
|
292
376
|
});
|
|
293
|
-
}
|
|
377
|
+
}
|
|
378
|
+
const styles = StyleSheet.create({
|
|
379
|
+
modeBadge: {
|
|
380
|
+
paddingHorizontal: 8,
|
|
381
|
+
paddingVertical: 3,
|
|
382
|
+
borderRadius: 6,
|
|
383
|
+
borderWidth: 1
|
|
384
|
+
},
|
|
385
|
+
modeBadgeText: {
|
|
386
|
+
fontSize: 9,
|
|
387
|
+
fontFamily: "monospace",
|
|
388
|
+
fontWeight: "700",
|
|
389
|
+
letterSpacing: 0.5
|
|
390
|
+
},
|
|
391
|
+
modeToggleRow: {
|
|
392
|
+
flexDirection: "row",
|
|
393
|
+
alignItems: "center",
|
|
394
|
+
gap: 8,
|
|
395
|
+
marginBottom: 8
|
|
396
|
+
},
|
|
397
|
+
modeToggleLabel: {
|
|
398
|
+
fontSize: 11,
|
|
399
|
+
fontWeight: "600",
|
|
400
|
+
color: macOSColors.text.secondary,
|
|
401
|
+
fontFamily: "monospace",
|
|
402
|
+
letterSpacing: 0.3
|
|
403
|
+
},
|
|
404
|
+
modeToggleGroup: {
|
|
405
|
+
flexDirection: "row",
|
|
406
|
+
gap: 6,
|
|
407
|
+
flex: 1
|
|
408
|
+
},
|
|
409
|
+
modeToggleButton: {
|
|
410
|
+
flex: 1,
|
|
411
|
+
paddingVertical: 6,
|
|
412
|
+
paddingHorizontal: 10,
|
|
413
|
+
borderRadius: 8,
|
|
414
|
+
borderWidth: 1,
|
|
415
|
+
borderColor: macOSColors.border.default,
|
|
416
|
+
backgroundColor: macOSColors.background.hover,
|
|
417
|
+
alignItems: "center"
|
|
418
|
+
},
|
|
419
|
+
modeToggleButtonActive: {
|
|
420
|
+
borderColor: macOSColors.semantic.info,
|
|
421
|
+
backgroundColor: `${macOSColors.semantic.info}22`
|
|
422
|
+
},
|
|
423
|
+
modeToggleButtonText: {
|
|
424
|
+
fontSize: 11,
|
|
425
|
+
fontWeight: "700",
|
|
426
|
+
color: macOSColors.text.secondary,
|
|
427
|
+
fontFamily: "monospace",
|
|
428
|
+
letterSpacing: 0.3
|
|
429
|
+
},
|
|
430
|
+
modeToggleButtonTextActive: {
|
|
431
|
+
color: macOSColors.semantic.info
|
|
432
|
+
},
|
|
433
|
+
modeToggleButtonHint: {
|
|
434
|
+
fontSize: 9,
|
|
435
|
+
color: macOSColors.text.muted,
|
|
436
|
+
marginTop: 1
|
|
437
|
+
}
|
|
438
|
+
});
|
|
@@ -10,7 +10,36 @@ 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
|
+
*/
|
|
13
23
|
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
|
+
}
|
|
14
43
|
// Decompose by Responsibility: Extract empty state component
|
|
15
44
|
function EmptyState({
|
|
16
45
|
isEnabled
|
|
@@ -73,8 +102,12 @@ function NetworkModalInner({
|
|
|
73
102
|
const [searchText, setSearchText] = useState("");
|
|
74
103
|
const [isSearchActive, setIsSearchActive] = useState(false);
|
|
75
104
|
const searchInputRef = useRef(null);
|
|
76
|
-
const [ignoredPatterns, setIgnoredPatterns] = useState(
|
|
77
|
-
|
|
105
|
+
const [ignoredPatterns, setIgnoredPatterns] = useState([
|
|
106
|
+
// Auto-hide Buoy license API requests by default
|
|
107
|
+
{
|
|
108
|
+
value: "api.keygen.sh",
|
|
109
|
+
mode: "contains"
|
|
110
|
+
}]);
|
|
78
111
|
const [copySettings, setCopySettings] = useState(DEFAULT_COPY_SETTINGS);
|
|
79
112
|
const flatListRef = useRef(null);
|
|
80
113
|
const hasLoadedFilters = useRef(false);
|
|
@@ -93,15 +126,33 @@ function NetworkModalInner({
|
|
|
93
126
|
if (!visible || hasLoadedFilters.current) return;
|
|
94
127
|
const loadFilters = async () => {
|
|
95
128
|
try {
|
|
96
|
-
// Load ignored patterns (using domains key for now)
|
|
97
129
|
const storedPatterns = await persistentStorage.getItem(devToolsStorageKeys.network.ignoredDomains());
|
|
98
130
|
if (storedPatterns) {
|
|
99
|
-
|
|
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
|
+
}
|
|
100
148
|
// Always ensure Buoy license API is hidden
|
|
101
|
-
if (!
|
|
102
|
-
|
|
149
|
+
if (!migrated.some(p => p.value === "api.keygen.sh")) {
|
|
150
|
+
migrated.push({
|
|
151
|
+
value: "api.keygen.sh",
|
|
152
|
+
mode: "contains"
|
|
153
|
+
});
|
|
103
154
|
}
|
|
104
|
-
setIgnoredPatterns(
|
|
155
|
+
setIgnoredPatterns(migrated);
|
|
105
156
|
}
|
|
106
157
|
} catch (_error) {
|
|
107
158
|
// Silently fail - filters will use defaults
|
|
@@ -118,9 +169,7 @@ function NetworkModalInner({
|
|
|
118
169
|
|
|
119
170
|
const saveFilters = async () => {
|
|
120
171
|
try {
|
|
121
|
-
|
|
122
|
-
const patterns = Array.from(ignoredPatterns);
|
|
123
|
-
await persistentStorage.setItem(devToolsStorageKeys.network.ignoredDomains(), JSON.stringify(patterns));
|
|
172
|
+
await persistentStorage.setItem(devToolsStorageKeys.network.ignoredDomains(), JSON.stringify(ignoredPatterns));
|
|
124
173
|
} catch (_error) {
|
|
125
174
|
// Silently fail - filters will remain in memory
|
|
126
175
|
}
|
|
@@ -183,18 +232,49 @@ function NetworkModalInner({
|
|
|
183
232
|
}
|
|
184
233
|
}, [isSearchActive]);
|
|
185
234
|
|
|
186
|
-
//
|
|
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
|
+
// Filter events based on ignored patterns (mode-aware)
|
|
187
239
|
const filteredEvents = useMemo(() => {
|
|
188
|
-
if (ignoredPatterns.
|
|
240
|
+
if (ignoredPatterns.length === 0) return events;
|
|
189
241
|
return events.filter(event => {
|
|
190
|
-
const
|
|
191
|
-
|
|
192
|
-
// Check if any pattern matches the URL
|
|
193
|
-
const isFiltered = Array.from(ignoredPatterns).some(pattern => url.includes(pattern.toLowerCase()));
|
|
242
|
+
const isFiltered = ignoredPatterns.some(pattern => urlMatchesIgnoredPattern(event.url, pattern));
|
|
194
243
|
return !isFiltered;
|
|
195
244
|
});
|
|
196
245
|
}, [events, ignoredPatterns]);
|
|
197
246
|
|
|
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
|
+
|
|
198
278
|
// Helper to check if payload should be included based on size
|
|
199
279
|
const shouldIncludePayload = useCallback(data => {
|
|
200
280
|
if (copySettings.bodySizeThreshold === -1) return true;
|
|
@@ -335,10 +415,7 @@ function NetworkModalInner({
|
|
|
335
415
|
let successful = 0;
|
|
336
416
|
let failed = 0;
|
|
337
417
|
let pending = 0;
|
|
338
|
-
const eventsForStats = ignoredPatterns.
|
|
339
|
-
const url = event.url.toLowerCase();
|
|
340
|
-
return !Array.from(ignoredPatterns).some(pattern => url.includes(pattern.toLowerCase()));
|
|
341
|
-
});
|
|
418
|
+
const eventsForStats = ignoredPatterns.length === 0 ? allEvents : allEvents.filter(event => !ignoredPatterns.some(pattern => urlMatchesIgnoredPattern(event.url, pattern)));
|
|
342
419
|
for (const event of eventsForStats) {
|
|
343
420
|
if (event.status && event.status >= 200 && event.status < 300) {
|
|
344
421
|
successful++;
|
|
@@ -607,16 +684,8 @@ function NetworkModalInner({
|
|
|
607
684
|
/* Show detail view if event is selected */
|
|
608
685
|
_jsx(NetworkEventDetailView, {
|
|
609
686
|
event: selectedEvent,
|
|
610
|
-
ignoredPatterns:
|
|
611
|
-
onTogglePattern:
|
|
612
|
-
const newPatterns = new Set(ignoredPatterns);
|
|
613
|
-
if (newPatterns.has(pattern)) {
|
|
614
|
-
newPatterns.delete(pattern);
|
|
615
|
-
} else {
|
|
616
|
-
newPatterns.add(pattern);
|
|
617
|
-
}
|
|
618
|
-
setIgnoredPatterns(newPatterns);
|
|
619
|
-
}
|
|
687
|
+
ignoredPatterns: ignoredPatternValues,
|
|
688
|
+
onTogglePattern: toggleIgnoredPattern
|
|
620
689
|
}) : showFilterView ? (/* Show filter/copy view based on active tab */
|
|
621
690
|
activeTab === "copy" ? /*#__PURE__*/_jsx(NetworkCopySettingsView, {
|
|
622
691
|
settings: copySettings,
|
|
@@ -627,20 +696,9 @@ function NetworkModalInner({
|
|
|
627
696
|
filter: filter,
|
|
628
697
|
onFilterChange: setFilter,
|
|
629
698
|
ignoredPatterns: ignoredPatterns,
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
newPatterns.delete(pattern);
|
|
634
|
-
} else {
|
|
635
|
-
newPatterns.add(pattern);
|
|
636
|
-
}
|
|
637
|
-
setIgnoredPatterns(newPatterns);
|
|
638
|
-
},
|
|
639
|
-
onAddPattern: pattern => {
|
|
640
|
-
const newPatterns = new Set(ignoredPatterns);
|
|
641
|
-
newPatterns.add(pattern);
|
|
642
|
-
setIgnoredPatterns(newPatterns);
|
|
643
|
-
}
|
|
699
|
+
onRemovePattern: removeIgnoredPattern,
|
|
700
|
+
onAddPattern: addIgnoredPattern,
|
|
701
|
+
onTogglePatternMode: toggleIgnoredPatternMode
|
|
644
702
|
})) : /*#__PURE__*/_jsxs(_Fragment, {
|
|
645
703
|
children: [!isEnabled ? /*#__PURE__*/_jsxs(View, {
|
|
646
704
|
style: styles.disabledBanner,
|
|
@@ -199,7 +199,7 @@ class NetworkListener {
|
|
|
199
199
|
* Handle XMLHttpRequest response processing
|
|
200
200
|
* This method processes the response and emits appropriate events
|
|
201
201
|
*/
|
|
202
|
-
handleXHRResponse(xhr, requestId, cleanUrl, method, requestHeaders, requestData, params, startTime, isError = false, clientType = "
|
|
202
|
+
handleXHRResponse(xhr, requestId, cleanUrl, method, requestHeaders, requestData, params, startTime, isError = false, clientType = "xhr") {
|
|
203
203
|
const duration = startTime ? Date.now() - startTime : 0;
|
|
204
204
|
if (isError || xhr.status === 0) {
|
|
205
205
|
// Network error or aborted request
|
|
@@ -586,8 +586,13 @@ class NetworkListener {
|
|
|
586
586
|
}
|
|
587
587
|
}
|
|
588
588
|
|
|
589
|
-
// Determine client type
|
|
590
|
-
|
|
589
|
+
// Determine client type. Honor an explicit X-Request-Client header first.
|
|
590
|
+
// Otherwise sniff axios via its default Accept header and fall back to
|
|
591
|
+
// "xhr" — defaulting to "axios" misclassified every raw XMLHttpRequest.
|
|
592
|
+
const explicitClient = requestHeaders["X-Request-Client"] || requestHeaders["x-request-client"];
|
|
593
|
+
const acceptHeader = requestHeaders["Accept"] || requestHeaders["accept"] || "";
|
|
594
|
+
const looksLikeAxios = acceptHeader.includes("application/json") && acceptHeader.includes("text/plain") && acceptHeader.includes("*/*");
|
|
595
|
+
const clientType = explicitClient || (looksLikeAxios ? "axios" : "xhr");
|
|
591
596
|
|
|
592
597
|
// Emit request event
|
|
593
598
|
self.emit({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NetworkEventItemCompact.d.ts","sourceRoot":"","sources":["../../../../src/network/components/NetworkEventItemCompact.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAM7C,UAAU,4BAA4B;IACpC,KAAK,EAAE,YAAY,CAAC;IACpB,OAAO,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;CACxC;AA8FD;;;GAGG;AACH,eAAO,MAAM,uBAAuB,
|
|
1
|
+
{"version":3,"file":"NetworkEventItemCompact.d.ts","sourceRoot":"","sources":["../../../../src/network/components/NetworkEventItemCompact.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAM7C,UAAU,4BAA4B;IACpC,KAAK,EAAE,YAAY,CAAC;IACpB,OAAO,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;CACxC;AA8FD;;;GAGG;AACH,eAAO,MAAM,uBAAuB,oEAuInC,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { NetworkEvent } from "../types";
|
|
1
|
+
import type { IgnoredPattern, NetworkEvent } from "../types";
|
|
2
2
|
interface NetworkFilter {
|
|
3
3
|
status?: "all" | "success" | "error" | "pending";
|
|
4
4
|
method?: string[];
|
|
@@ -9,14 +9,18 @@ interface NetworkFilterViewV3Props {
|
|
|
9
9
|
events: NetworkEvent[];
|
|
10
10
|
filter: NetworkFilter;
|
|
11
11
|
onFilterChange: (filter: NetworkFilter) => void;
|
|
12
|
-
ignoredPatterns?:
|
|
13
|
-
|
|
14
|
-
|
|
12
|
+
ignoredPatterns?: IgnoredPattern[];
|
|
13
|
+
/** Remove a pattern by its value. */
|
|
14
|
+
onRemovePattern?: (pattern: string) => void;
|
|
15
|
+
/** Add a new pattern with the user-selected mode. */
|
|
16
|
+
onAddPattern?: (pattern: IgnoredPattern) => void;
|
|
17
|
+
/** Flip a pattern's mode between `contains` and `exact`. */
|
|
18
|
+
onTogglePatternMode?: (pattern: string) => void;
|
|
15
19
|
}
|
|
16
20
|
/**
|
|
17
21
|
* Control panel for filtering captured network events by status, method, host, and content type.
|
|
18
22
|
* Provides quick toggles, stats, and ignored-pattern management reminiscent of desktop tooling.
|
|
19
23
|
*/
|
|
20
|
-
export declare function NetworkFilterViewV3({ events, filter, onFilterChange, ignoredPatterns,
|
|
24
|
+
export declare function NetworkFilterViewV3({ events, filter, onFilterChange, ignoredPatterns, onRemovePattern, onAddPattern, onTogglePatternMode, }: NetworkFilterViewV3Props): import("react").JSX.Element;
|
|
21
25
|
export {};
|
|
22
26
|
//# sourceMappingURL=NetworkFilterViewV3.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NetworkFilterViewV3.d.ts","sourceRoot":"","sources":["../../../../src/network/components/NetworkFilterViewV3.tsx"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"NetworkFilterViewV3.d.ts","sourceRoot":"","sources":["../../../../src/network/components/NetworkFilterViewV3.tsx"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,cAAc,EAA2B,YAAY,EAAE,MAAM,UAAU,CAAC;AAItF,UAAU,aAAa;IACrB,MAAM,CAAC,EAAE,KAAK,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC;IACjD,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,UAAU,wBAAwB;IAChC,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,MAAM,EAAE,aAAa,CAAC;IACtB,cAAc,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,IAAI,CAAC;IAChD,eAAe,CAAC,EAAE,cAAc,EAAE,CAAC;IACnC,qCAAqC;IACrC,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,qDAAqD;IACrD,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,CAAC;IACjD,4DAA4D;IAC5D,mBAAmB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACjD;AA8DD;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,EAClC,MAAM,EACN,MAAM,EACN,cAAc,EACd,eAAoB,EACpB,eAA0B,EAC1B,YAAuB,EACvB,mBAA8B,GAC/B,EAAE,wBAAwB,+BA0V1B"}
|
|
@@ -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":"AA2EA,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;AAslCD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,+BAMpD"}
|
|
@@ -9,5 +9,5 @@ export { TickProvider, useTickEveryMinute } from "./hooks/useTickEveryMinute";
|
|
|
9
9
|
export { networkListener, startNetworkListener, stopNetworkListener, addNetworkListener, removeAllNetworkListeners, isNetworkListening, getNetworkListenerCount, } from "./utils/networkListener";
|
|
10
10
|
export { networkEventStore, type NetworkEventCallback } from "./utils/networkEventStore";
|
|
11
11
|
export { formatBytes, formatDuration, formatHttpStatus, } from "./utils/formatting";
|
|
12
|
-
export type { NetworkEvent, NetworkStats, NetworkFilter, NetworkEventStatus, NetworkInsight, } from "./types";
|
|
12
|
+
export type { NetworkEvent, NetworkStats, NetworkFilter, NetworkEventStatus, NetworkInsight, IgnoredPattern, IgnoredPatternMatchMode, } from "./types";
|
|
13
13
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/network/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAC;AAC7E,OAAO,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AAG/E,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAG9E,OAAO,EACL,eAAe,EACf,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,EAClB,yBAAyB,EACzB,kBAAkB,EAClB,uBAAuB,GACxB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,KAAK,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACzF,OAAO,EACL,WAAW,EACX,cAAc,EACd,gBAAgB,GACjB,MAAM,oBAAoB,CAAC;AAG5B,YAAY,EACV,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,kBAAkB,EAClB,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/network/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAC;AAC7E,OAAO,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AAG/E,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAG9E,OAAO,EACL,eAAe,EACf,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,EAClB,yBAAyB,EACzB,kBAAkB,EAClB,uBAAuB,GACxB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,KAAK,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACzF,OAAO,EACL,WAAW,EACX,cAAc,EACd,gBAAgB,GACjB,MAAM,oBAAoB,CAAC;AAG5B,YAAY,EACV,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,kBAAkB,EAClB,cAAc,EACd,cAAc,EACd,uBAAuB,GACxB,MAAM,SAAS,CAAC"}
|
|
@@ -24,7 +24,7 @@ export interface NetworkEvent {
|
|
|
24
24
|
query?: string;
|
|
25
25
|
responseType?: string;
|
|
26
26
|
cached?: boolean;
|
|
27
|
-
requestClient?: "fetch" | "axios" | "graphql" | "grpc-web";
|
|
27
|
+
requestClient?: "fetch" | "axios" | "xhr" | "graphql" | "grpc-web";
|
|
28
28
|
/**
|
|
29
29
|
* GraphQL operation name extracted from request data.
|
|
30
30
|
*
|
|
@@ -75,6 +75,20 @@ export interface NetworkFilter {
|
|
|
75
75
|
}
|
|
76
76
|
/** Human readable status classifications derived from request/response metadata. */
|
|
77
77
|
export type NetworkEventStatus = "pending" | "success" | "error" | "timeout";
|
|
78
|
+
/**
|
|
79
|
+
* How an ignored-pattern entry should be compared against captured URLs.
|
|
80
|
+
*
|
|
81
|
+
* - `contains`: case-insensitive substring match on the full URL (legacy behavior).
|
|
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.
|
|
85
|
+
*/
|
|
86
|
+
export type IgnoredPatternMatchMode = "contains" | "exact";
|
|
87
|
+
/** A single network-events exclude pattern with its match mode. */
|
|
88
|
+
export interface IgnoredPattern {
|
|
89
|
+
value: string;
|
|
90
|
+
mode: IgnoredPatternMatchMode;
|
|
91
|
+
}
|
|
78
92
|
/**
|
|
79
93
|
* Insight surfaces highlight notable traffic patterns or issues for the current session.
|
|
80
94
|
*/
|
|
@@ -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,SAAS,GAAG,UAAU,CAAC;
|
|
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;;;;;;;GAOG;AACH,MAAM,MAAM,uBAAuB,GAAG,UAAU,GAAG,OAAO,CAAC;AAE3D,mEAAmE;AACnE,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,uBAAuB,CAAC;CAC/B;AAED;;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"}
|
|
@@ -13,7 +13,7 @@ export interface NetworkingEvent {
|
|
|
13
13
|
headers?: Record<string, string>;
|
|
14
14
|
data?: unknown;
|
|
15
15
|
params?: Record<string, string>;
|
|
16
|
-
client?: "fetch" | "axios" | "graphql" | "grpc-web";
|
|
16
|
+
client?: "fetch" | "axios" | "xhr" | "graphql" | "grpc-web";
|
|
17
17
|
};
|
|
18
18
|
response?: {
|
|
19
19
|
status: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"networkListener.d.ts","sourceRoot":"","sources":["../../../../src/network/utils/networkListener.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAaH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,SAAS,GAAG,UAAU,GAAG,OAAO,CAAC;IACvC,SAAS,EAAE,IAAI,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE;QACP,EAAE,EAAE,MAAM,CAAC;QACX,GAAG,EAAE,MAAM,CAAC;QACZ,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACjC,IAAI,CAAC,EAAE,OAAO,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAChC,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO,GAAG,SAAS,GAAG,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"networkListener.d.ts","sourceRoot":"","sources":["../../../../src/network/utils/networkListener.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAaH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,SAAS,GAAG,UAAU,GAAG,OAAO,CAAC;IACvC,SAAS,EAAE,IAAI,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE;QACP,EAAE,EAAE,MAAM,CAAC;QACX,GAAG,EAAE,MAAM,CAAC;QACZ,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACjC,IAAI,CAAC,EAAE,OAAO,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAChC,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO,GAAG,KAAK,GAAG,SAAS,GAAG,UAAU,CAAC;KAC7D,CAAC;IACF,QAAQ,CAAC,EAAE;QACT,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACjC,IAAI,CAAC,EAAE,OAAO,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;IACF,KAAK,CAAC,EAAE;QACN,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAED,MAAM,MAAM,uBAAuB,GAAG,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAC;AAEvE;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,cAAM,eAAe;IACnB,OAAO,CAAC,SAAS,CAAiC;IAClD,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,cAAc,CAAQ;IAG9B,OAAO,CAAC,WAAW,CASjB;IAGF,OAAO,CAAC,aAAa,CAAe;IACpC,OAAO,CAAC,eAAe,CAAuC;IAC9D,OAAO,CAAC,eAAe,CAAuC;IAC9D,OAAO,CAAC,2BAA2B,CAAmD;;IAWtF;;;;;;;;OAQG;IACH,OAAO,CAAC,eAAe;IAKvB,OAAO,CAAC,IAAI;IAUZ;;;;;;;OAOG;IACH,OAAO,CAAC,QAAQ;IA0BhB;;;;;OAKG;YACW,mBAAmB;IA2DjC;;;;OAIG;IACH,OAAO,CAAC,WAAW;IASnB,OAAO,CAAC,eAAe;IAavB;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IA6MzB;;;;;;;;;;OAUG;IACH,cAAc;IAyTd;;;;;OAKG;IACH,aAAa;IAkBb;;;;;OAKG;IACH,WAAW,CAAC,QAAQ,EAAE,uBAAuB;IAa7C,kBAAkB;IAKlB,IAAI,QAAQ,YAEX;IAGD,IAAI,aAAa,WAEhB;CACF;AAsBD;;;;GAIG;AACH,eAAO,MAAM,eAAe,uBAAqB,CAAC;AAElD;;;;;;;;GAQG;AACH,eAAO,MAAM,oBAAoB,YAA8C,CAAC;AAEhF;;GAEG;AACH,eAAO,MAAM,mBAAmB,YAA6C,CAAC;AAE9E;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,kBAAkB,GAAI,UAAU,uBAAuB,eACxB,CAAC;AAE7C;;GAEG;AACH,eAAO,MAAM,yBAAyB,YACK,CAAC;AAE5C;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,eAAsC,CAAC;AAEtE;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,cAA2C,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@buoy-gg/network",
|
|
3
|
-
"version": "2.1.
|
|
3
|
+
"version": "2.1.16",
|
|
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": "2.
|
|
29
|
+
"@buoy-gg/shared-ui": "2.2.0"
|
|
30
30
|
},
|
|
31
31
|
"peerDependencies": {
|
|
32
32
|
"react": "*",
|