@rozenite/network-activity-plugin 1.11.0 → 1.13.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 CHANGED
@@ -1,5 +1,25 @@
1
1
  # @rozenite/network-activity-plugin
2
2
 
3
+ ## 1.13.0
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies [[`7b00844`](https://github.com/callstackincubator/rozenite/commit/7b00844e6439bb7447bc2b61519a6aa6fc1c270f)]:
8
+ - @rozenite/agent-shared@1.13.0
9
+ - @rozenite/agent-bridge@1.13.0
10
+ - @rozenite/plugin-bridge@1.13.0
11
+
12
+ ## 1.12.0
13
+
14
+ ### Patch Changes
15
+
16
+ - [#298](https://github.com/callstackincubator/rozenite/pull/298) [`a39eabd`](https://github.com/callstackincubator/rozenite/commit/a39eabd827aec9d7249086f7b318f64230f556b2) Thanks [@V3RON](https://github.com/V3RON)! - Filter Hermes internal bytecode frames out of Network Activity initiator symbolication requests so Metro no longer tries to read pseudo-files like `address at InternalBytecode.js`.
17
+
18
+ - Updated dependencies []:
19
+ - @rozenite/agent-bridge@1.12.0
20
+ - @rozenite/agent-shared@1.12.0
21
+ - @rozenite/plugin-bridge@1.12.0
22
+
3
23
  ## 1.11.0
4
24
 
5
25
  ### Minor Changes
@@ -22,7 +22,7 @@
22
22
  <script>
23
23
  var __ROZENITE_PANEL__ = true;
24
24
  </script>
25
- <script type="module" crossorigin src="../devtools/assets/App-CEESZAW_.js"></script>
25
+ <script type="module" crossorigin src="../devtools/assets/App-2rukIHdY.js"></script>
26
26
  <link rel="stylesheet" crossorigin href="../devtools/assets/App-xppYUJvX.css">
27
27
  </head>
28
28
  <body>
@@ -20836,12 +20836,13 @@ const getGeneratedFrameLocation$1 = (frame) => ({
20836
20836
  columnNumber: frame.generatedColumnNumber ?? frame.columnNumber
20837
20837
  });
20838
20838
  const isGeneratedBundleUrl = (url) => /[^/]+\.bundle(?:[/?#]|$)/.test(url);
20839
+ const isMetroSymbolicatableUrl = (url) => url?.startsWith("http") ?? false;
20839
20840
  const canSymbolicateStack = (stack) => stack?.some(
20840
- (frame) => getGeneratedFrameLocation$1(frame).url?.startsWith("http")
20841
+ (frame) => isMetroSymbolicatableUrl(getGeneratedFrameLocation$1(frame).url)
20841
20842
  ) ?? false;
20842
20843
  const toReactNativeStackFrame = (frame) => {
20843
20844
  const generatedLocation = getGeneratedFrameLocation$1(frame);
20844
- if (!generatedLocation.url) {
20845
+ if (!isMetroSymbolicatableUrl(generatedLocation.url)) {
20845
20846
  return null;
20846
20847
  }
20847
20848
  return {
@@ -20934,14 +20935,36 @@ const symbolicateInitiator = async (initiator, symbolicateStackTrace = symbolica
20934
20935
  if (!canSymbolicateStack(initiator.stack)) {
20935
20936
  return null;
20936
20937
  }
20937
- const generatedStackFrames = initiator.stack?.map(toReactNativeStackFrame).filter((frame) => frame !== null) ?? [];
20938
+ const originalStack = initiator.stack ?? [];
20939
+ const generatedStackFrames = originalStack.flatMap(
20940
+ (originalFrame, originalIndex) => {
20941
+ const frame = toReactNativeStackFrame(originalFrame);
20942
+ return frame ? [{ frame, originalIndex }] : [];
20943
+ }
20944
+ );
20938
20945
  if (generatedStackFrames.length === 0) {
20939
20946
  return null;
20940
20947
  }
20941
20948
  try {
20942
- const symbolicatedStackTrace = await symbolicateStackTrace(generatedStackFrames);
20943
- const symbolicatedStack = symbolicatedStackTrace.stack.map(
20944
- (frame, index2) => fromSymbolicatedStackFrame(frame, initiator.stack?.[index2])
20949
+ const symbolicatedStackTrace = await symbolicateStackTrace(
20950
+ generatedStackFrames.map((entry) => entry.frame)
20951
+ );
20952
+ const symbolicatedFramesByOriginalIndex = /* @__PURE__ */ new Map();
20953
+ symbolicatedStackTrace.stack.forEach((frame, index2) => {
20954
+ const generatedFrame = generatedStackFrames[index2];
20955
+ if (!generatedFrame) {
20956
+ return;
20957
+ }
20958
+ symbolicatedFramesByOriginalIndex.set(
20959
+ generatedFrame.originalIndex,
20960
+ fromSymbolicatedStackFrame(
20961
+ frame,
20962
+ originalStack[generatedFrame.originalIndex]
20963
+ )
20964
+ );
20965
+ });
20966
+ const symbolicatedStack = originalStack.map(
20967
+ (frame, index2) => symbolicatedFramesByOriginalIndex.get(index2) ?? frame
20945
20968
  );
20946
20969
  const sourceFrame = getPreferredSourceFrame(
20947
20970
  symbolicatedStack,
@@ -1 +1 @@
1
- {"name":"@rozenite/network-activity-plugin","version":"1.11.0","description":"Network Activity for Rozenite.","panels":[{"name":"Network Activity","source":"/devtools/App.html"}]}
1
+ {"name":"@rozenite/network-activity-plugin","version":"1.13.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.11.0",
3
+ "version": "1.13.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.11.0",
20
- "@rozenite/agent-bridge": "1.11.0",
21
- "@rozenite/plugin-bridge": "1.11.0"
19
+ "@rozenite/agent-shared": "1.13.0",
20
+ "@rozenite/agent-bridge": "1.13.0",
21
+ "@rozenite/plugin-bridge": "1.13.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.11.0",
57
- "rozenite": "1.11.0"
56
+ "@rozenite/vite-plugin": "1.13.0",
57
+ "rozenite": "1.13.0"
58
58
  },
59
59
  "peerDependencies": {
60
60
  "react-native-nitro-fetch": "*",
@@ -126,6 +126,79 @@ describe('symbolication', () => {
126
126
  });
127
127
  });
128
128
 
129
+ it('keeps internal Hermes frames out of the Metro symbolication request', async () => {
130
+ const initiator: Initiator = {
131
+ type: 'script',
132
+ generatedUrl: 'address at InternalBytecode.js',
133
+ generatedLineNumber: 1,
134
+ generatedColumnNumber: 12345,
135
+ symbolicationStatus: 'pending',
136
+ stack: [
137
+ {
138
+ functionName: 'anonymous',
139
+ generatedUrl: 'address at InternalBytecode.js',
140
+ generatedLineNumber: 1,
141
+ generatedColumnNumber: 12345,
142
+ },
143
+ {
144
+ functionName: 'loadUsers',
145
+ generatedUrl: 'http://localhost:8081/index.bundle',
146
+ generatedLineNumber: 1,
147
+ generatedColumnNumber: 200,
148
+ },
149
+ ],
150
+ };
151
+ const symbolicateStackTrace = vi.fn().mockResolvedValue({
152
+ stack: [
153
+ {
154
+ methodName: 'loadUsers',
155
+ file: 'apps/playground/src/app/api.ts',
156
+ lineNumber: 30,
157
+ column: 6,
158
+ },
159
+ ],
160
+ });
161
+
162
+ const symbolicatedInitiator = await symbolicateInitiator(
163
+ initiator,
164
+ symbolicateStackTrace,
165
+ );
166
+
167
+ expect(symbolicateStackTrace).toHaveBeenCalledWith([
168
+ {
169
+ methodName: 'loadUsers',
170
+ file: 'http://localhost:8081/index.bundle',
171
+ lineNumber: 1,
172
+ column: 200,
173
+ },
174
+ ]);
175
+ expect(symbolicatedInitiator).toMatchObject({
176
+ type: 'script',
177
+ functionName: 'loadUsers',
178
+ url: 'apps/playground/src/app/api.ts',
179
+ lineNumber: 30,
180
+ columnNumber: 6,
181
+ symbolicationStatus: 'complete',
182
+ stack: [
183
+ {
184
+ functionName: 'anonymous',
185
+ generatedUrl: 'address at InternalBytecode.js',
186
+ generatedLineNumber: 1,
187
+ generatedColumnNumber: 12345,
188
+ },
189
+ {
190
+ functionName: 'loadUsers',
191
+ url: 'apps/playground/src/app/api.ts',
192
+ lineNumber: 30,
193
+ columnNumber: 6,
194
+ generatedUrl: 'http://localhost:8081/index.bundle',
195
+ generatedLineNumber: 1,
196
+ generatedColumnNumber: 200,
197
+ },
198
+ ],
199
+ });
200
+ });
201
+
129
202
  it('reports symbolication failures on the initiator', async () => {
130
203
  const initiator: Initiator = {
131
204
  type: 'script',
@@ -37,9 +37,12 @@ const getGeneratedFrameLocation = (frame: InitiatorStackFrame) => ({
37
37
  const isGeneratedBundleUrl = (url: string) =>
38
38
  /[^/]+\.bundle(?:[/?#]|$)/.test(url);
39
39
 
40
+ const isMetroSymbolicatableUrl = (url?: string) =>
41
+ url?.startsWith('http') ?? false;
42
+
40
43
  const canSymbolicateStack = (stack?: InitiatorStackFrame[]) =>
41
44
  stack?.some((frame) =>
42
- getGeneratedFrameLocation(frame).url?.startsWith('http'),
45
+ isMetroSymbolicatableUrl(getGeneratedFrameLocation(frame).url),
43
46
  ) ?? false;
44
47
 
45
48
  const toReactNativeStackFrame = (
@@ -47,7 +50,7 @@ const toReactNativeStackFrame = (
47
50
  ): ReactNativeStackFrame | null => {
48
51
  const generatedLocation = getGeneratedFrameLocation(frame);
49
52
 
50
- if (!generatedLocation.url) {
53
+ if (!isMetroSymbolicatableUrl(generatedLocation.url)) {
51
54
  return null;
52
55
  }
53
56
 
@@ -195,21 +198,45 @@ export const symbolicateInitiator = async (
195
198
  return null;
196
199
  }
197
200
 
198
- const generatedStackFrames =
199
- initiator.stack
200
- ?.map(toReactNativeStackFrame)
201
- .filter((frame): frame is ReactNativeStackFrame => frame !== null) ?? [];
201
+ const originalStack = initiator.stack ?? [];
202
+ const generatedStackFrames = originalStack.flatMap(
203
+ (originalFrame, originalIndex) => {
204
+ const frame = toReactNativeStackFrame(originalFrame);
205
+ return frame ? [{ frame, originalIndex }] : [];
206
+ },
207
+ );
202
208
 
203
209
  if (generatedStackFrames.length === 0) {
204
210
  return null;
205
211
  }
206
212
 
207
213
  try {
208
- const symbolicatedStackTrace =
209
- await symbolicateStackTrace(generatedStackFrames);
214
+ const symbolicatedStackTrace = await symbolicateStackTrace(
215
+ generatedStackFrames.map((entry) => entry.frame),
216
+ );
210
217
 
211
- const symbolicatedStack = symbolicatedStackTrace.stack.map((frame, index) =>
212
- fromSymbolicatedStackFrame(frame, initiator.stack?.[index]),
218
+ const symbolicatedFramesByOriginalIndex = new Map<
219
+ number,
220
+ InitiatorStackFrame
221
+ >();
222
+
223
+ symbolicatedStackTrace.stack.forEach((frame, index) => {
224
+ const generatedFrame = generatedStackFrames[index];
225
+ if (!generatedFrame) {
226
+ return;
227
+ }
228
+
229
+ symbolicatedFramesByOriginalIndex.set(
230
+ generatedFrame.originalIndex,
231
+ fromSymbolicatedStackFrame(
232
+ frame,
233
+ originalStack[generatedFrame.originalIndex],
234
+ ),
235
+ );
236
+ });
237
+
238
+ const symbolicatedStack = originalStack.map(
239
+ (frame, index) => symbolicatedFramesByOriginalIndex.get(index) ?? frame,
213
240
  );
214
241
  const sourceFrame = getPreferredSourceFrame(
215
242
  symbolicatedStack,