@rozenite/network-activity-plugin 1.10.0 → 1.12.0
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/CHANGELOG.md +28 -0
- package/dist/devtools/App.html +2 -2
- package/dist/devtools/assets/{App-DsimzJvx.js → App-2rukIHdY.js} +1013 -264
- package/dist/devtools/assets/{App-CUXU0mup.css → App-xppYUJvX.css} +94 -0
- package/dist/rozenite.json +1 -1
- package/package.json +6 -6
- package/src/ui/components/FilterBar.tsx +13 -45
- package/src/ui/components/NetworkTimeline.tsx +422 -0
- package/src/ui/components/RequestList.tsx +6 -185
- package/src/ui/components/Toolbar.tsx +13 -1
- package/src/ui/hooks/useNetworkActivitySessionExport.ts +39 -0
- package/src/ui/state/__tests__/store.test.ts +77 -0
- package/src/ui/state/derived.ts +2 -0
- package/src/ui/state/filter.ts +49 -0
- package/src/ui/state/hooks.ts +2 -2
- package/src/ui/state/model.ts +1 -0
- package/src/ui/state/store.ts +24 -2
- package/src/ui/utils/__tests__/requestFilters.test.ts +32 -0
- package/src/ui/utils/__tests__/sessionExport.test.ts +174 -0
- package/src/ui/utils/__tests__/symbolication.test.ts +73 -0
- package/src/ui/utils/__tests__/timelineModel.test.ts +170 -0
- package/src/ui/utils/download.ts +7 -0
- package/src/ui/utils/requestFilters.ts +183 -0
- package/src/ui/utils/sessionExport.ts +185 -0
- package/src/ui/utils/symbolication.ts +37 -10
- package/src/ui/utils/timelineModel.ts +352 -0
- package/src/ui/views/InspectorView.tsx +40 -8
|
@@ -574,6 +574,9 @@ video {
|
|
|
574
574
|
max-width: 1536px;
|
|
575
575
|
}
|
|
576
576
|
}
|
|
577
|
+
.pointer-events-none {
|
|
578
|
+
pointer-events: none;
|
|
579
|
+
}
|
|
577
580
|
.visible {
|
|
578
581
|
visibility: visible;
|
|
579
582
|
}
|
|
@@ -589,12 +592,38 @@ video {
|
|
|
589
592
|
.sticky {
|
|
590
593
|
position: sticky;
|
|
591
594
|
}
|
|
595
|
+
.inset-0 {
|
|
596
|
+
inset: 0px;
|
|
597
|
+
}
|
|
598
|
+
.inset-x-0 {
|
|
599
|
+
left: 0px;
|
|
600
|
+
right: 0px;
|
|
601
|
+
}
|
|
602
|
+
.inset-y-0 {
|
|
603
|
+
top: 0px;
|
|
604
|
+
bottom: 0px;
|
|
605
|
+
}
|
|
606
|
+
.bottom-0 {
|
|
607
|
+
bottom: 0px;
|
|
608
|
+
}
|
|
609
|
+
.bottom-1 {
|
|
610
|
+
bottom: 0.25rem;
|
|
611
|
+
}
|
|
612
|
+
.left-1 {
|
|
613
|
+
left: 0.25rem;
|
|
614
|
+
}
|
|
592
615
|
.left-2 {
|
|
593
616
|
left: 0.5rem;
|
|
594
617
|
}
|
|
618
|
+
.right-1 {
|
|
619
|
+
right: 0.25rem;
|
|
620
|
+
}
|
|
595
621
|
.top-0 {
|
|
596
622
|
top: 0px;
|
|
597
623
|
}
|
|
624
|
+
.top-1 {
|
|
625
|
+
top: 0.25rem;
|
|
626
|
+
}
|
|
598
627
|
.z-10 {
|
|
599
628
|
z-index: 10;
|
|
600
629
|
}
|
|
@@ -965,6 +994,10 @@ video {
|
|
|
965
994
|
.border {
|
|
966
995
|
border-width: 1px;
|
|
967
996
|
}
|
|
997
|
+
.border-x {
|
|
998
|
+
border-left-width: 1px;
|
|
999
|
+
border-right-width: 1px;
|
|
1000
|
+
}
|
|
968
1001
|
.border-b {
|
|
969
1002
|
border-bottom-width: 1px;
|
|
970
1003
|
}
|
|
@@ -977,6 +1010,9 @@ video {
|
|
|
977
1010
|
.border-t {
|
|
978
1011
|
border-top-width: 1px;
|
|
979
1012
|
}
|
|
1013
|
+
.border-blue-300\/70 {
|
|
1014
|
+
border-color: rgb(147 197 253 / 0.7);
|
|
1015
|
+
}
|
|
980
1016
|
.border-blue-500\/50 {
|
|
981
1017
|
border-color: rgb(59 130 246 / 0.5);
|
|
982
1018
|
}
|
|
@@ -1025,6 +1061,12 @@ video {
|
|
|
1025
1061
|
.bg-background {
|
|
1026
1062
|
background-color: hsl(var(--background));
|
|
1027
1063
|
}
|
|
1064
|
+
.bg-blue-400\/10 {
|
|
1065
|
+
background-color: rgb(96 165 250 / 0.1);
|
|
1066
|
+
}
|
|
1067
|
+
.bg-blue-400\/15 {
|
|
1068
|
+
background-color: rgb(96 165 250 / 0.15);
|
|
1069
|
+
}
|
|
1028
1070
|
.bg-blue-500\/30 {
|
|
1029
1071
|
background-color: rgb(59 130 246 / 0.3);
|
|
1030
1072
|
}
|
|
@@ -1044,6 +1086,18 @@ video {
|
|
|
1044
1086
|
.bg-destructive {
|
|
1045
1087
|
background-color: hsl(var(--destructive));
|
|
1046
1088
|
}
|
|
1089
|
+
.bg-gray-200 {
|
|
1090
|
+
--tw-bg-opacity: 1;
|
|
1091
|
+
background-color: rgb(229 231 235 / var(--tw-bg-opacity, 1));
|
|
1092
|
+
}
|
|
1093
|
+
.bg-gray-400 {
|
|
1094
|
+
--tw-bg-opacity: 1;
|
|
1095
|
+
background-color: rgb(156 163 175 / var(--tw-bg-opacity, 1));
|
|
1096
|
+
}
|
|
1097
|
+
.bg-gray-500 {
|
|
1098
|
+
--tw-bg-opacity: 1;
|
|
1099
|
+
background-color: rgb(107 114 128 / var(--tw-bg-opacity, 1));
|
|
1100
|
+
}
|
|
1047
1101
|
.bg-gray-600 {
|
|
1048
1102
|
--tw-bg-opacity: 1;
|
|
1049
1103
|
background-color: rgb(75 85 99 / var(--tw-bg-opacity, 1));
|
|
@@ -1063,6 +1117,9 @@ video {
|
|
|
1063
1117
|
--tw-bg-opacity: 1;
|
|
1064
1118
|
background-color: rgb(17 24 39 / var(--tw-bg-opacity, 1));
|
|
1065
1119
|
}
|
|
1120
|
+
.bg-gray-900\/95 {
|
|
1121
|
+
background-color: rgb(17 24 39 / 0.95);
|
|
1122
|
+
}
|
|
1066
1123
|
.bg-gray-950 {
|
|
1067
1124
|
--tw-bg-opacity: 1;
|
|
1068
1125
|
background-color: rgb(3 7 18 / var(--tw-bg-opacity, 1));
|
|
@@ -1089,6 +1146,10 @@ video {
|
|
|
1089
1146
|
--tw-bg-opacity: 1;
|
|
1090
1147
|
background-color: rgb(147 51 234 / var(--tw-bg-opacity, 1));
|
|
1091
1148
|
}
|
|
1149
|
+
.bg-red-400 {
|
|
1150
|
+
--tw-bg-opacity: 1;
|
|
1151
|
+
background-color: rgb(248 113 113 / var(--tw-bg-opacity, 1));
|
|
1152
|
+
}
|
|
1092
1153
|
.bg-red-950\/30 {
|
|
1093
1154
|
background-color: rgb(69 10 10 / 0.3);
|
|
1094
1155
|
}
|
|
@@ -1117,9 +1178,15 @@ video {
|
|
|
1117
1178
|
.p-0 {
|
|
1118
1179
|
padding: 0px;
|
|
1119
1180
|
}
|
|
1181
|
+
.p-0\.5 {
|
|
1182
|
+
padding: 0.125rem;
|
|
1183
|
+
}
|
|
1120
1184
|
.p-1 {
|
|
1121
1185
|
padding: 0.25rem;
|
|
1122
1186
|
}
|
|
1187
|
+
.p-1\.5 {
|
|
1188
|
+
padding: 0.375rem;
|
|
1189
|
+
}
|
|
1123
1190
|
.p-2 {
|
|
1124
1191
|
padding: 0.5rem;
|
|
1125
1192
|
}
|
|
@@ -1228,6 +1295,10 @@ video {
|
|
|
1228
1295
|
.italic {
|
|
1229
1296
|
font-style: italic;
|
|
1230
1297
|
}
|
|
1298
|
+
.tabular-nums {
|
|
1299
|
+
--tw-numeric-spacing: tabular-nums;
|
|
1300
|
+
font-variant-numeric: var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction);
|
|
1301
|
+
}
|
|
1231
1302
|
.leading-snug {
|
|
1232
1303
|
line-height: 1.375;
|
|
1233
1304
|
}
|
|
@@ -1377,12 +1448,27 @@ video {
|
|
|
1377
1448
|
.outline {
|
|
1378
1449
|
outline-style: solid;
|
|
1379
1450
|
}
|
|
1451
|
+
.ring-1 {
|
|
1452
|
+
--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
|
|
1453
|
+
--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);
|
|
1454
|
+
box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);
|
|
1455
|
+
}
|
|
1456
|
+
.ring-blue-300 {
|
|
1457
|
+
--tw-ring-opacity: 1;
|
|
1458
|
+
--tw-ring-color: rgb(147 197 253 / var(--tw-ring-opacity, 1));
|
|
1459
|
+
}
|
|
1460
|
+
.ring-offset-1 {
|
|
1461
|
+
--tw-ring-offset-width: 1px;
|
|
1462
|
+
}
|
|
1380
1463
|
.ring-offset-background {
|
|
1381
1464
|
--tw-ring-offset-color: hsl(var(--background));
|
|
1382
1465
|
}
|
|
1383
1466
|
.ring-offset-blue-500 {
|
|
1384
1467
|
--tw-ring-offset-color: #3b82f6;
|
|
1385
1468
|
}
|
|
1469
|
+
.ring-offset-gray-950 {
|
|
1470
|
+
--tw-ring-offset-color: #030712;
|
|
1471
|
+
}
|
|
1386
1472
|
.\!filter {
|
|
1387
1473
|
filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow) !important;
|
|
1388
1474
|
}
|
|
@@ -1399,6 +1485,11 @@ video {
|
|
|
1399
1485
|
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
|
|
1400
1486
|
transition-duration: 150ms;
|
|
1401
1487
|
}
|
|
1488
|
+
.transition-opacity {
|
|
1489
|
+
transition-property: opacity;
|
|
1490
|
+
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
|
|
1491
|
+
transition-duration: 150ms;
|
|
1492
|
+
}
|
|
1402
1493
|
@keyframes enter {
|
|
1403
1494
|
|
|
1404
1495
|
from {
|
|
@@ -1516,6 +1607,9 @@ video {
|
|
|
1516
1607
|
.hover\:underline:hover {
|
|
1517
1608
|
text-decoration-line: underline;
|
|
1518
1609
|
}
|
|
1610
|
+
.hover\:opacity-80:hover {
|
|
1611
|
+
opacity: 0.8;
|
|
1612
|
+
}
|
|
1519
1613
|
.focus\:bg-gray-700:focus {
|
|
1520
1614
|
--tw-bg-opacity: 1;
|
|
1521
1615
|
background-color: rgb(55 65 81 / var(--tw-bg-opacity, 1));
|
package/dist/rozenite.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"@rozenite/network-activity-plugin","version":"1.
|
|
1
|
+
{"name":"@rozenite/network-activity-plugin","version":"1.12.0","description":"Network Activity for Rozenite.","panels":[{"name":"Network Activity","source":"/devtools/App.html"}]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rozenite/network-activity-plugin",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.12.0",
|
|
4
4
|
"description": "Network Activity for Rozenite.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/react-native/index.cjs",
|
|
@@ -16,9 +16,9 @@
|
|
|
16
16
|
},
|
|
17
17
|
"dependencies": {
|
|
18
18
|
"nanoevents": "^9.1.0",
|
|
19
|
-
"@rozenite/agent-shared": "1.
|
|
20
|
-
"@rozenite/agent-bridge": "1.
|
|
21
|
-
"@rozenite/plugin-bridge": "1.
|
|
19
|
+
"@rozenite/agent-shared": "1.12.0",
|
|
20
|
+
"@rozenite/agent-bridge": "1.12.0",
|
|
21
|
+
"@rozenite/plugin-bridge": "1.12.0"
|
|
22
22
|
},
|
|
23
23
|
"devDependencies": {
|
|
24
24
|
"@floating-ui/react": "^0.26.0",
|
|
@@ -53,8 +53,8 @@
|
|
|
53
53
|
"typescript": "~5.9.3",
|
|
54
54
|
"vite": "^7.3.1",
|
|
55
55
|
"zustand": "^5.0.6",
|
|
56
|
-
"@rozenite/vite-plugin": "1.
|
|
57
|
-
"rozenite": "1.
|
|
56
|
+
"@rozenite/vite-plugin": "1.12.0",
|
|
57
|
+
"rozenite": "1.12.0"
|
|
58
58
|
},
|
|
59
59
|
"peerDependencies": {
|
|
60
60
|
"react-native-nitro-fetch": "*",
|
|
@@ -16,35 +16,21 @@ import { Input } from './Input';
|
|
|
16
16
|
import { Button } from './Button';
|
|
17
17
|
import { X, Filter, ChevronDown, Check } from 'lucide-react';
|
|
18
18
|
import type { HttpMethod, NetworkEventSource } from '../../shared/client';
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
inFlightOnly: boolean;
|
|
29
|
-
overriddenOnly: boolean;
|
|
30
|
-
minSize: string;
|
|
31
|
-
maxSize: string;
|
|
32
|
-
minDuration: string;
|
|
33
|
-
maxDuration: string;
|
|
34
|
-
};
|
|
35
|
-
|
|
36
|
-
export type FilterState = {
|
|
37
|
-
text: string;
|
|
38
|
-
types: Set<RequestTypeFilter>;
|
|
39
|
-
advanced: AdvancedFilterState;
|
|
40
|
-
};
|
|
19
|
+
import {
|
|
20
|
+
createDefaultFilter,
|
|
21
|
+
DEFAULT_REQUEST_TYPES,
|
|
22
|
+
} from '../state/filter';
|
|
23
|
+
import type {
|
|
24
|
+
AdvancedFilterState,
|
|
25
|
+
FilterState,
|
|
26
|
+
RequestTypeFilter,
|
|
27
|
+
} from '../state/filter';
|
|
41
28
|
|
|
42
29
|
type FilterBarProps = {
|
|
43
30
|
filter: FilterState;
|
|
44
31
|
onFilterChange: (filter: FilterState) => void;
|
|
45
32
|
};
|
|
46
33
|
|
|
47
|
-
const REQUEST_TYPES: RequestTypeFilter[] = ['http', 'sse', 'websocket'];
|
|
48
34
|
const HTTP_METHODS: HttpMethod[] = [
|
|
49
35
|
'GET',
|
|
50
36
|
'POST',
|
|
@@ -55,25 +41,6 @@ const HTTP_METHODS: HttpMethod[] = [
|
|
|
55
41
|
];
|
|
56
42
|
const SOURCES: NetworkEventSource[] = ['builtin', 'nitro'];
|
|
57
43
|
|
|
58
|
-
export const createDefaultFilter = (): FilterState => ({
|
|
59
|
-
text: '',
|
|
60
|
-
types: new Set(),
|
|
61
|
-
advanced: {
|
|
62
|
-
methods: new Set(),
|
|
63
|
-
sources: new Set(),
|
|
64
|
-
status: '',
|
|
65
|
-
domain: '',
|
|
66
|
-
contentType: '',
|
|
67
|
-
failedOnly: false,
|
|
68
|
-
inFlightOnly: false,
|
|
69
|
-
overriddenOnly: false,
|
|
70
|
-
minSize: '',
|
|
71
|
-
maxSize: '',
|
|
72
|
-
minDuration: '',
|
|
73
|
-
maxDuration: '',
|
|
74
|
-
},
|
|
75
|
-
});
|
|
76
|
-
|
|
77
44
|
const getTypeLabel = (type: RequestTypeFilter) => {
|
|
78
45
|
switch (type) {
|
|
79
46
|
case 'http':
|
|
@@ -112,7 +79,8 @@ const getAdvancedFilterCount = (advanced: AdvancedFilterState) => {
|
|
|
112
79
|
};
|
|
113
80
|
|
|
114
81
|
const getActiveFilterCount = (filter: FilterState) => {
|
|
115
|
-
const typeFilterCount =
|
|
82
|
+
const typeFilterCount =
|
|
83
|
+
filter.types.size < DEFAULT_REQUEST_TYPES.length ? 1 : 0;
|
|
116
84
|
|
|
117
85
|
return typeFilterCount + getAdvancedFilterCount(filter.advanced);
|
|
118
86
|
};
|
|
@@ -250,7 +218,7 @@ export const FilterBar = ({ filter, onFilterChange }: FilterBarProps) => {
|
|
|
250
218
|
};
|
|
251
219
|
|
|
252
220
|
const activeFilterCount = getActiveFilterCount(filter);
|
|
253
|
-
const hasActiveFilters = filter.text !== '' || activeFilterCount > 0;
|
|
221
|
+
const hasActiveFilters = filter.text.trim() !== '' || activeFilterCount > 0;
|
|
254
222
|
|
|
255
223
|
return (
|
|
256
224
|
<div className="flex items-center gap-2 p-2 border-b border-gray-700 bg-gray-800">
|
|
@@ -293,7 +261,7 @@ export const FilterBar = ({ filter, onFilterChange }: FilterBarProps) => {
|
|
|
293
261
|
{...getFloatingProps()}
|
|
294
262
|
>
|
|
295
263
|
<FilterPanelLabel>Request Type</FilterPanelLabel>
|
|
296
|
-
{
|
|
264
|
+
{DEFAULT_REQUEST_TYPES.map((type) => (
|
|
297
265
|
<FilterCheckbox
|
|
298
266
|
key={type}
|
|
299
267
|
checked={filter.types.has(type)}
|