@rozenite/network-activity-plugin 1.1.0 → 1.3.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/.turbo/turbo-build.log +16 -0
- package/.turbo/turbo-lint.log +5 -0
- package/.turbo/turbo-typecheck.log +5 -0
- package/CHANGELOG.md +10 -0
- package/README.md +9 -0
- package/dist/App.html +1 -1
- package/dist/assets/{App-Kyi7zHUX.js → App-CGt4qucR.js} +12139 -6795
- package/dist/boot-recording.cjs +1087 -0
- package/dist/boot-recording.js +1086 -0
- package/dist/react-native.cjs +3 -0
- package/dist/react-native.d.ts +3 -0
- package/dist/react-native.js +5 -1
- package/dist/rozenite.json +1 -1
- package/dist/src/react-native/boot-recording.d.ts +41 -0
- package/dist/src/react-native/config.d.ts +7 -4
- package/dist/src/react-native/events-listener.d.ts +44 -0
- package/dist/src/react-native/http/http-inspector.d.ts +10 -0
- package/dist/src/react-native/http/http-utils.d.ts +15 -0
- package/dist/src/react-native/inspector.d.ts +7 -0
- package/dist/src/react-native/network-inspector.d.ts +16 -0
- package/dist/src/react-native/sse/sse-inspector.d.ts +4 -7
- package/dist/src/react-native/useHttpInspector.d.ts +3 -0
- package/dist/src/react-native/useSSEInspector.d.ts +3 -0
- package/dist/src/react-native/useWebSocketInspector.d.ts +3 -0
- package/dist/src/react-native/websocket/websocket-inspector.d.ts +4 -7
- package/dist/src/react-native/websocket/websocket-interceptor.d.ts +0 -1
- package/dist/src/shared/client.d.ts +3 -105
- package/dist/src/shared/http-events.d.ts +106 -0
- package/dist/src/shared/sse-events.d.ts +1 -1
- package/dist/src/ui/state/hooks.d.ts +3 -3
- package/dist/useNetworkActivityDevTools.cjs +116 -1017
- package/dist/useNetworkActivityDevTools.js +115 -1014
- package/package.json +16 -11
- package/react-native.ts +9 -0
- package/src/react-native/boot-recording.ts +90 -0
- package/src/react-native/config.ts +9 -4
- package/src/react-native/events-listener.ts +102 -0
- package/src/react-native/http/http-inspector.ts +174 -0
- package/src/react-native/http/http-utils.ts +216 -0
- package/src/react-native/inspector.ts +10 -0
- package/src/react-native/network-inspector.ts +78 -0
- package/src/react-native/sse/sse-inspector.ts +12 -10
- package/src/react-native/useHttpInspector.ts +59 -0
- package/src/react-native/useNetworkActivityDevTools.ts +60 -115
- package/src/react-native/useSSEInspector.ts +35 -0
- package/src/react-native/useWebSocketInspector.ts +35 -0
- package/src/react-native/websocket/websocket-inspector.ts +18 -10
- package/src/shared/client.ts +4 -140
- package/src/shared/http-events.ts +140 -0
- package/src/shared/sse-events.ts +1 -1
- package/src/ui/components/RequestList.tsx +9 -5
- package/src/ui/hooks/useCopyToClipboard.ts +9 -3
- package/src/ui/state/derived.ts +7 -3
- package/src/ui/state/store.ts +4 -3
- package/dist/src/react-native/http/network-inspector.d.ts +0 -8
- package/project.json +0 -12
- package/src/react-native/http/network-inspector.ts +0 -408
- package/tsconfig.tsbuildinfo +0 -1
- /package/src/react-native/websocket/{websocket-interceptor.d.ts → websocket-interceptor-types.d.ts} +0 -0
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
export type HttpHeaders = Record<string, string | string[]>;
|
|
2
|
+
export type XHRHeaders = NonNullable<XMLHttpRequest['responseHeaders']>;
|
|
3
|
+
|
|
4
|
+
export type HttpMethod = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH' | 'HEAD';
|
|
5
|
+
|
|
6
|
+
export type RequestId = string;
|
|
7
|
+
export type Timestamp = number;
|
|
8
|
+
|
|
9
|
+
export type XHRPostData =
|
|
10
|
+
| string
|
|
11
|
+
| Blob
|
|
12
|
+
| FormData
|
|
13
|
+
| ArrayBuffer
|
|
14
|
+
| ArrayBufferView
|
|
15
|
+
| unknown
|
|
16
|
+
| null
|
|
17
|
+
| undefined;
|
|
18
|
+
|
|
19
|
+
export type RequestTextPostData = {
|
|
20
|
+
type: 'text';
|
|
21
|
+
value: string;
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
export type RequestBinaryPostData = {
|
|
25
|
+
type: 'binary';
|
|
26
|
+
value: {
|
|
27
|
+
size: number;
|
|
28
|
+
type?: string;
|
|
29
|
+
name?: string;
|
|
30
|
+
};
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
export type RequestFormDataPostData = {
|
|
34
|
+
type: 'form-data';
|
|
35
|
+
value: Record<string, RequestTextPostData | RequestBinaryPostData>;
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
export type RequestPostData =
|
|
39
|
+
| RequestTextPostData
|
|
40
|
+
| RequestFormDataPostData
|
|
41
|
+
| RequestBinaryPostData
|
|
42
|
+
| null
|
|
43
|
+
| undefined;
|
|
44
|
+
|
|
45
|
+
export type Cookie = {
|
|
46
|
+
name: string;
|
|
47
|
+
value: string;
|
|
48
|
+
domain?: string;
|
|
49
|
+
path?: string;
|
|
50
|
+
expires?: string;
|
|
51
|
+
maxAge?: string;
|
|
52
|
+
secure?: boolean;
|
|
53
|
+
httpOnly?: boolean;
|
|
54
|
+
sameSite?: string;
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
export type Request = {
|
|
58
|
+
url: string;
|
|
59
|
+
method: HttpMethod;
|
|
60
|
+
headers: HttpHeaders;
|
|
61
|
+
postData?: RequestPostData;
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
export type Response = {
|
|
65
|
+
url: string;
|
|
66
|
+
status: number;
|
|
67
|
+
statusText: string;
|
|
68
|
+
headers: HttpHeaders;
|
|
69
|
+
contentType: string;
|
|
70
|
+
size: number | null;
|
|
71
|
+
responseTime: Timestamp;
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
export type Initiator = {
|
|
75
|
+
type: string;
|
|
76
|
+
url?: string;
|
|
77
|
+
lineNumber?: number;
|
|
78
|
+
columnNumber?: number;
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
export type ResourceType = 'XHR' | 'Fetch' | 'Other';
|
|
82
|
+
|
|
83
|
+
export type RequestOverride = {
|
|
84
|
+
status?: number;
|
|
85
|
+
body?: string;
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
export type HttpEventMap = {
|
|
89
|
+
'request-sent': {
|
|
90
|
+
requestId: RequestId;
|
|
91
|
+
request: Request;
|
|
92
|
+
timestamp: Timestamp;
|
|
93
|
+
initiator: Initiator;
|
|
94
|
+
type: ResourceType;
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
'response-received': {
|
|
98
|
+
requestId: RequestId;
|
|
99
|
+
timestamp: Timestamp;
|
|
100
|
+
type: ResourceType;
|
|
101
|
+
response: Response;
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
'request-completed': {
|
|
105
|
+
requestId: RequestId;
|
|
106
|
+
timestamp: Timestamp;
|
|
107
|
+
duration: number;
|
|
108
|
+
size: number | null;
|
|
109
|
+
ttfb: number;
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
'request-failed': {
|
|
113
|
+
requestId: RequestId;
|
|
114
|
+
timestamp: Timestamp;
|
|
115
|
+
type: ResourceType;
|
|
116
|
+
error: string;
|
|
117
|
+
canceled: boolean;
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
'request-progress': {
|
|
121
|
+
requestId: RequestId;
|
|
122
|
+
timestamp: Timestamp;
|
|
123
|
+
loaded: number;
|
|
124
|
+
total: number;
|
|
125
|
+
lengthComputable: boolean;
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
'get-response-body': {
|
|
129
|
+
requestId: RequestId;
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
'response-body': {
|
|
133
|
+
requestId: RequestId;
|
|
134
|
+
body: string | null;
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
'set-overrides': {
|
|
138
|
+
overrides: [string, RequestOverride][];
|
|
139
|
+
};
|
|
140
|
+
};
|
package/src/shared/sse-events.ts
CHANGED
|
@@ -61,7 +61,7 @@ const formatStartTime = (startTime: number): string => {
|
|
|
61
61
|
};
|
|
62
62
|
|
|
63
63
|
const extractDomainAndPath = (
|
|
64
|
-
url: string
|
|
64
|
+
url: string,
|
|
65
65
|
): { domain: string; path: string } => {
|
|
66
66
|
try {
|
|
67
67
|
const { hostname, pathname, search, hash, port } = new URL(url);
|
|
@@ -80,7 +80,7 @@ const generateName = (url: string, showEntirePathName = false): string => {
|
|
|
80
80
|
const urlObj = new URL(url);
|
|
81
81
|
const pathname = urlObj.pathname;
|
|
82
82
|
const filename = showEntirePathName ? undefined : pathname.split('/').pop();
|
|
83
|
-
|
|
83
|
+
|
|
84
84
|
return filename || pathname || urlObj.hostname;
|
|
85
85
|
} catch {
|
|
86
86
|
return url;
|
|
@@ -128,7 +128,7 @@ const sortTime: SortingFn<NetworkRequest> = (rowA, rowB, columnId) => {
|
|
|
128
128
|
const processNetworkRequests = (
|
|
129
129
|
processedRequests: ProcessedRequest[],
|
|
130
130
|
overrides: Map<string, RequestOverride>,
|
|
131
|
-
showEntirePathAsName = false
|
|
131
|
+
showEntirePathAsName = false,
|
|
132
132
|
): NetworkRequest[] => {
|
|
133
133
|
return processedRequests.map((request): NetworkRequest => {
|
|
134
134
|
const { domain, path } = extractDomainAndPath(request.name);
|
|
@@ -262,7 +262,11 @@ export const RequestList = ({ filter }: RequestListProps) => {
|
|
|
262
262
|
}, [processedRequests, filter]);
|
|
263
263
|
|
|
264
264
|
const requests = useMemo(() => {
|
|
265
|
-
return processNetworkRequests(
|
|
265
|
+
return processNetworkRequests(
|
|
266
|
+
filteredRequests,
|
|
267
|
+
overrides,
|
|
268
|
+
clientUISettings?.showUrlAsName,
|
|
269
|
+
);
|
|
266
270
|
}, [filteredRequests, overrides, clientUISettings?.showUrlAsName]);
|
|
267
271
|
|
|
268
272
|
const table = useReactTable({
|
|
@@ -302,7 +306,7 @@ export const RequestList = ({ filter }: RequestListProps) => {
|
|
|
302
306
|
? null
|
|
303
307
|
: flexRender(
|
|
304
308
|
header.column.columnDef.header,
|
|
305
|
-
header.getContext()
|
|
309
|
+
header.getContext(),
|
|
306
310
|
)}
|
|
307
311
|
{header.column.getCanSort() && (
|
|
308
312
|
<span className="text-gray-500">
|
|
@@ -5,10 +5,14 @@ import { copyToClipboard } from '../utils/copyToClipboard';
|
|
|
5
5
|
export function useCopyToClipboard() {
|
|
6
6
|
const [isCopied, setIsCopied] = useState(false);
|
|
7
7
|
|
|
8
|
-
const timeoutRef = useRef<NodeJS.Timeout>();
|
|
8
|
+
const timeoutRef = useRef<NodeJS.Timeout>(null);
|
|
9
9
|
|
|
10
10
|
useEffect(() => {
|
|
11
|
-
return () =>
|
|
11
|
+
return () => {
|
|
12
|
+
if (timeoutRef.current) {
|
|
13
|
+
clearTimeout(timeoutRef.current);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
12
16
|
}, []);
|
|
13
17
|
|
|
14
18
|
const copy = useCallback(async (value: string) => {
|
|
@@ -17,7 +21,9 @@ export function useCopyToClipboard() {
|
|
|
17
21
|
|
|
18
22
|
setIsCopied(true);
|
|
19
23
|
|
|
20
|
-
|
|
24
|
+
if (timeoutRef.current) {
|
|
25
|
+
clearTimeout(timeoutRef.current);
|
|
26
|
+
}
|
|
21
27
|
timeoutRef.current = setTimeout(() => setIsCopied(false), 1000);
|
|
22
28
|
} catch (error) {
|
|
23
29
|
console.error('Failed to copy:', error);
|
package/src/ui/state/derived.ts
CHANGED
|
@@ -21,7 +21,7 @@ export const getProcessedRequests = memoize((state: NetworkActivityState) => {
|
|
|
21
21
|
status: httpEntry.status,
|
|
22
22
|
timestamp: httpEntry.timestamp,
|
|
23
23
|
duration: httpEntry.duration,
|
|
24
|
-
size: httpEntry.size,
|
|
24
|
+
size: httpEntry.size ?? null,
|
|
25
25
|
method: httpEntry.request.method,
|
|
26
26
|
httpStatus: httpEntry.response?.status,
|
|
27
27
|
progress: httpEntry.progress,
|
|
@@ -35,6 +35,7 @@ export const getProcessedRequests = memoize((state: NetworkActivityState) => {
|
|
|
35
35
|
status: wsEntry.status,
|
|
36
36
|
timestamp: wsEntry.timestamp,
|
|
37
37
|
duration: wsEntry.duration,
|
|
38
|
+
size: null,
|
|
38
39
|
method: 'WS',
|
|
39
40
|
httpStatus: 0,
|
|
40
41
|
});
|
|
@@ -47,6 +48,7 @@ export const getProcessedRequests = memoize((state: NetworkActivityState) => {
|
|
|
47
48
|
status: sseEntry.status,
|
|
48
49
|
timestamp: sseEntry.timestamp,
|
|
49
50
|
duration: sseEntry.duration,
|
|
51
|
+
size: null,
|
|
50
52
|
method: 'SSE',
|
|
51
53
|
httpStatus: 0,
|
|
52
54
|
});
|
|
@@ -63,7 +65,7 @@ export const getSelectedRequest = memoize((state: NetworkActivityState) => {
|
|
|
63
65
|
});
|
|
64
66
|
|
|
65
67
|
export const getRequestSummary = (
|
|
66
|
-
requestId: string
|
|
68
|
+
requestId: string,
|
|
67
69
|
): ((state: NetworkActivityState) => ProcessedRequest | null) =>
|
|
68
70
|
memoize((state: NetworkActivityState) => {
|
|
69
71
|
const { networkEntries } = state;
|
|
@@ -79,7 +81,7 @@ export const getRequestSummary = (
|
|
|
79
81
|
status: httpEntry.status,
|
|
80
82
|
timestamp: httpEntry.timestamp,
|
|
81
83
|
duration: httpEntry.duration,
|
|
82
|
-
size: httpEntry.size,
|
|
84
|
+
size: httpEntry.size ?? null,
|
|
83
85
|
method: httpEntry.request.method,
|
|
84
86
|
httpStatus: httpEntry.response?.status || 0,
|
|
85
87
|
progress: httpEntry.progress,
|
|
@@ -93,6 +95,7 @@ export const getRequestSummary = (
|
|
|
93
95
|
status: wsEntry.status,
|
|
94
96
|
timestamp: wsEntry.timestamp,
|
|
95
97
|
duration: wsEntry.duration,
|
|
98
|
+
size: null,
|
|
96
99
|
method: 'WS',
|
|
97
100
|
httpStatus: 0,
|
|
98
101
|
};
|
|
@@ -105,6 +108,7 @@ export const getRequestSummary = (
|
|
|
105
108
|
status: sseEntry.status,
|
|
106
109
|
timestamp: sseEntry.timestamp,
|
|
107
110
|
duration: sseEntry.duration,
|
|
111
|
+
size: null,
|
|
108
112
|
method: 'SSE',
|
|
109
113
|
httpStatus: 0,
|
|
110
114
|
};
|
package/src/ui/state/store.ts
CHANGED
|
@@ -65,7 +65,7 @@ export const createNetworkActivityStore = () =>
|
|
|
65
65
|
persist(
|
|
66
66
|
(set, get) => ({
|
|
67
67
|
// Initial state
|
|
68
|
-
isRecording:
|
|
68
|
+
isRecording: true,
|
|
69
69
|
selectedRequestId: null,
|
|
70
70
|
networkEntries: new Map(),
|
|
71
71
|
websocketMessages: new Map(),
|
|
@@ -684,9 +684,10 @@ export const createNetworkActivityStore = () =>
|
|
|
684
684
|
typeof value === 'object' &&
|
|
685
685
|
value !== null &&
|
|
686
686
|
'_type' in value &&
|
|
687
|
-
value._type === 'map'
|
|
687
|
+
value._type === 'map' &&
|
|
688
|
+
'value' in value
|
|
688
689
|
) {
|
|
689
|
-
return new Map(value.value);
|
|
690
|
+
return new Map(value.value as [string, RequestOverride][]);
|
|
690
691
|
}
|
|
691
692
|
return value;
|
|
692
693
|
},
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import { NetworkActivityDevToolsClient } from '../../shared/client';
|
|
2
|
-
export type NetworkInspector = {
|
|
3
|
-
enable: () => void;
|
|
4
|
-
disable: () => void;
|
|
5
|
-
isEnabled: () => boolean;
|
|
6
|
-
dispose: () => void;
|
|
7
|
-
};
|
|
8
|
-
export declare const getNetworkInspector: (pluginClient: NetworkActivityDevToolsClient) => NetworkInspector;
|
package/project.json
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "../../node_modules/nx/schemas/project-schema.json",
|
|
3
|
-
"name": "@rozenite/network-activity-plugin",
|
|
4
|
-
"targets": {
|
|
5
|
-
"build": {
|
|
6
|
-
"cache": true,
|
|
7
|
-
"dependsOn": ["^build"],
|
|
8
|
-
"inputs": ["{projectRoot}/src/**/*"],
|
|
9
|
-
"outputs": ["{projectRoot}/dist"]
|
|
10
|
-
}
|
|
11
|
-
}
|
|
12
|
-
}
|