react-native-nitro-fetch 1.3.3 → 1.4.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.
@@ -1,175 +1,183 @@
1
1
  import { generateCurl } from './CurlGenerator';
2
2
  class NetworkInspectorImpl {
3
- _enabled = false;
4
- _entries = [];
5
- _maxEntries = 500;
6
- _maxBodyCapture = 4096;
7
- _listeners = new Set();
8
- enable(options) {
9
- this._enabled = true;
10
- if (options?.maxEntries != null) this._maxEntries = options.maxEntries;
11
- if (options?.maxBodyCapture != null)
12
- this._maxBodyCapture = options.maxBodyCapture;
13
- }
14
- disable() {
15
- this._enabled = false;
16
- }
17
- isEnabled() {
18
- return this._enabled;
19
- }
20
- getEntries() {
21
- return this._entries;
22
- }
23
- getHttpEntries() {
24
- return this._entries.filter((e) => e.type === 'http');
25
- }
26
- getWebSocketEntries() {
27
- return this._entries.filter((e) => e.type === 'websocket');
28
- }
29
- getEntry(id) {
30
- return this._entries.find((e) => e.id === id);
31
- }
32
- clear() {
33
- this._entries = [];
34
- }
35
- onEntry(callback) {
36
- this._listeners.add(callback);
37
- return () => {
38
- this._listeners.delete(callback);
39
- };
40
- }
41
- _notify(entry) {
42
- for (const cb of this._listeners) {
43
- try {
44
- cb(entry);
45
- } catch {
46
- // swallow listener errors
47
- }
48
- }
49
- }
50
- _trimEntries() {
51
- if (this._entries.length > this._maxEntries) {
52
- this._entries.shift();
53
- }
54
- }
55
- // --- HTTP recording ---
56
- _recordStart(id, url, method, headers, body) {
57
- if (!this._enabled) return;
58
- const bodySize = body ? body.length : 0;
59
- const entry = {
60
- id,
61
- type: 'http',
62
- url,
63
- method,
64
- requestHeaders: headers.map((h) => ({ key: h.key, value: h.value })),
65
- requestBody: body ? body.slice(0, this._maxBodyCapture) : undefined,
66
- requestBodySize: bodySize,
67
- status: 0,
68
- statusText: '',
69
- responseHeaders: [],
70
- responseBodySize: 0,
71
- startTime: performance.now(),
72
- endTime: 0,
73
- duration: 0,
74
- curl: generateCurl({ url, method, headers, body }),
75
- };
76
- this._entries.push(entry);
77
- this._trimEntries();
78
- }
79
- _recordEnd(id, status, statusText, headers, bodySize, error, responseBody) {
80
- if (!this._enabled) return;
81
- const entry = this._entries.find((e) => e.id === id && e.type === 'http');
82
- if (!entry) return;
83
- entry.status = status;
84
- entry.statusText = statusText;
85
- entry.responseHeaders = headers.map((h) => ({
86
- key: h.key,
87
- value: h.value,
88
- }));
89
- entry.responseBodySize = bodySize;
90
- entry.endTime = performance.now();
91
- entry.duration = entry.endTime - entry.startTime;
92
- if (error) entry.error = error;
93
- if (responseBody != null) {
94
- entry.responseBody = responseBody.slice(0, this._maxBodyCapture);
95
- }
96
- this._notify(entry);
97
- }
98
- // --- WebSocket recording ---
99
- _recordWsOpen(id, url, protocols, headers) {
100
- if (!this._enabled) return;
101
- const entry = {
102
- id,
103
- type: 'websocket',
104
- url,
105
- protocols,
106
- requestHeaders: headers.map((h) => ({ key: h.key, value: h.value })),
107
- startTime: performance.now(),
108
- endTime: 0,
109
- duration: 0,
110
- readyState: 'CONNECTING',
111
- messages: [],
112
- messagesSent: 0,
113
- messagesReceived: 0,
114
- bytesSent: 0,
115
- bytesReceived: 0,
116
- };
117
- this._entries.push(entry);
118
- this._trimEntries();
119
- this._notify(entry);
120
- }
121
- _recordWsConnected(id) {
122
- if (!this._enabled) return;
123
- const entry = this._entries.find(
124
- (e) => e.id === id && e.type === 'websocket'
125
- );
126
- if (!entry) return;
127
- entry.readyState = 'OPEN';
128
- this._notify(entry);
129
- }
130
- _recordWsMessage(id, direction, data, size, isBinary) {
131
- if (!this._enabled) return;
132
- const entry = this._entries.find(
133
- (e) => e.id === id && e.type === 'websocket'
134
- );
135
- if (!entry) return;
136
- entry.messages.push({
137
- direction,
138
- data: data.slice(0, this._maxBodyCapture),
139
- size,
140
- isBinary,
141
- timestamp: performance.now(),
142
- });
143
- if (direction === 'sent') {
144
- entry.messagesSent++;
145
- entry.bytesSent += size;
146
- } else {
147
- entry.messagesReceived++;
148
- entry.bytesReceived += size;
149
- }
150
- this._notify(entry);
151
- }
152
- _recordWsClose(id, code, reason) {
153
- if (!this._enabled) return;
154
- const entry = this._entries.find(
155
- (e) => e.id === id && e.type === 'websocket'
156
- );
157
- if (!entry) return;
158
- entry.readyState = 'CLOSED';
159
- entry.closeCode = code;
160
- entry.closeReason = reason;
161
- entry.endTime = performance.now();
162
- entry.duration = entry.endTime - entry.startTime;
163
- this._notify(entry);
164
- }
165
- _recordWsError(id, error) {
166
- if (!this._enabled) return;
167
- const entry = this._entries.find(
168
- (e) => e.id === id && e.type === 'websocket'
169
- );
170
- if (!entry) return;
171
- entry.error = error;
172
- this._notify(entry);
173
- }
3
+ _enabled = false;
4
+ _entries = [];
5
+ _maxEntries = 500;
6
+ _maxBodyCapture = 4096;
7
+ _listeners = new Set();
8
+ enable(options) {
9
+ this._enabled = true;
10
+ if (options?.maxEntries != null)
11
+ this._maxEntries = options.maxEntries;
12
+ if (options?.maxBodyCapture != null)
13
+ this._maxBodyCapture = options.maxBodyCapture;
14
+ }
15
+ disable() {
16
+ this._enabled = false;
17
+ }
18
+ isEnabled() {
19
+ return this._enabled;
20
+ }
21
+ getEntries() {
22
+ return this._entries;
23
+ }
24
+ getHttpEntries() {
25
+ return this._entries.filter((e) => e.type === 'http');
26
+ }
27
+ getWebSocketEntries() {
28
+ return this._entries.filter((e) => e.type === 'websocket');
29
+ }
30
+ getEntry(id) {
31
+ return this._entries.find((e) => e.id === id);
32
+ }
33
+ clear() {
34
+ this._entries = [];
35
+ }
36
+ onEntry(callback) {
37
+ this._listeners.add(callback);
38
+ return () => {
39
+ this._listeners.delete(callback);
40
+ };
41
+ }
42
+ _notify(entry) {
43
+ for (const cb of this._listeners) {
44
+ try {
45
+ cb(entry);
46
+ }
47
+ catch {
48
+ // swallow listener errors
49
+ }
50
+ }
51
+ }
52
+ _trimEntries() {
53
+ if (this._entries.length > this._maxEntries) {
54
+ this._entries.shift();
55
+ }
56
+ }
57
+ // --- HTTP recording ---
58
+ _recordStart(id, url, method, headers, body) {
59
+ if (!this._enabled)
60
+ return;
61
+ const bodySize = body ? body.length : 0;
62
+ const entry = {
63
+ id,
64
+ type: 'http',
65
+ url,
66
+ method,
67
+ requestHeaders: headers.map((h) => ({ key: h.key, value: h.value })),
68
+ requestBody: body ? body.slice(0, this._maxBodyCapture) : undefined,
69
+ requestBodySize: bodySize,
70
+ status: 0,
71
+ statusText: '',
72
+ responseHeaders: [],
73
+ responseBodySize: 0,
74
+ startTime: performance.now(),
75
+ endTime: 0,
76
+ duration: 0,
77
+ curl: generateCurl({ url, method, headers, body }),
78
+ };
79
+ this._entries.push(entry);
80
+ this._trimEntries();
81
+ }
82
+ _recordEnd(id, status, statusText, headers, bodySize, error, responseBody) {
83
+ if (!this._enabled)
84
+ return;
85
+ const entry = this._entries.find((e) => e.id === id && e.type === 'http');
86
+ if (!entry)
87
+ return;
88
+ entry.status = status;
89
+ entry.statusText = statusText;
90
+ entry.responseHeaders = headers.map((h) => ({
91
+ key: h.key,
92
+ value: h.value,
93
+ }));
94
+ entry.responseBodySize = bodySize;
95
+ entry.endTime = performance.now();
96
+ entry.duration = entry.endTime - entry.startTime;
97
+ if (error)
98
+ entry.error = error;
99
+ if (responseBody != null) {
100
+ entry.responseBody = responseBody.slice(0, this._maxBodyCapture);
101
+ }
102
+ this._notify(entry);
103
+ }
104
+ // --- WebSocket recording ---
105
+ _recordWsOpen(id, url, protocols, headers) {
106
+ if (!this._enabled)
107
+ return;
108
+ const entry = {
109
+ id,
110
+ type: 'websocket',
111
+ url,
112
+ protocols,
113
+ requestHeaders: headers.map((h) => ({ key: h.key, value: h.value })),
114
+ startTime: performance.now(),
115
+ endTime: 0,
116
+ duration: 0,
117
+ readyState: 'CONNECTING',
118
+ messages: [],
119
+ messagesSent: 0,
120
+ messagesReceived: 0,
121
+ bytesSent: 0,
122
+ bytesReceived: 0,
123
+ };
124
+ this._entries.push(entry);
125
+ this._trimEntries();
126
+ this._notify(entry);
127
+ }
128
+ _recordWsConnected(id) {
129
+ if (!this._enabled)
130
+ return;
131
+ const entry = this._entries.find((e) => e.id === id && e.type === 'websocket');
132
+ if (!entry)
133
+ return;
134
+ entry.readyState = 'OPEN';
135
+ this._notify(entry);
136
+ }
137
+ _recordWsMessage(id, direction, data, size, isBinary) {
138
+ if (!this._enabled)
139
+ return;
140
+ const entry = this._entries.find((e) => e.id === id && e.type === 'websocket');
141
+ if (!entry)
142
+ return;
143
+ entry.messages.push({
144
+ direction,
145
+ data: data.slice(0, this._maxBodyCapture),
146
+ size,
147
+ isBinary,
148
+ timestamp: performance.now(),
149
+ });
150
+ if (direction === 'sent') {
151
+ entry.messagesSent++;
152
+ entry.bytesSent += size;
153
+ }
154
+ else {
155
+ entry.messagesReceived++;
156
+ entry.bytesReceived += size;
157
+ }
158
+ this._notify(entry);
159
+ }
160
+ _recordWsClose(id, code, reason) {
161
+ if (!this._enabled)
162
+ return;
163
+ const entry = this._entries.find((e) => e.id === id && e.type === 'websocket');
164
+ if (!entry)
165
+ return;
166
+ entry.readyState = 'CLOSED';
167
+ entry.closeCode = code;
168
+ entry.closeReason = reason;
169
+ entry.endTime = performance.now();
170
+ entry.duration = entry.endTime - entry.startTime;
171
+ this._notify(entry);
172
+ }
173
+ _recordWsError(id, error) {
174
+ if (!this._enabled)
175
+ return;
176
+ const entry = this._entries.find((e) => e.id === id && e.type === 'websocket');
177
+ if (!entry)
178
+ return;
179
+ entry.error = error;
180
+ this._notify(entry);
181
+ }
174
182
  }
175
183
  export const NetworkInspector = new NetworkInspectorImpl();
@@ -3,5 +3,4 @@ import { NitroModules } from 'react-native-nitro-modules';
3
3
  export const NitroFetch = NitroModules.createHybridObject('NitroFetch');
4
4
  export const NativeStorage = NitroModules.createHybridObject('NativeStorage');
5
5
  export const boxedNitroFetch = NitroModules.box(NitroFetch);
6
- export const NitroCronetSingleton =
7
- NitroModules.createHybridObject('NitroCronet');
6
+ export const NitroCronetSingleton = NitroModules.createHybridObject('NitroCronet');