@rozenite/network-activity-plugin 1.11.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 +11 -0
- package/dist/devtools/App.html +1 -1
- package/dist/devtools/assets/{App-CEESZAW_.js → App-2rukIHdY.js} +29 -6
- package/dist/rozenite.json +1 -1
- package/package.json +6 -6
- package/src/ui/utils/__tests__/symbolication.test.ts +73 -0
- package/src/ui/utils/symbolication.ts +37 -10
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,16 @@
|
|
|
1
1
|
# @rozenite/network-activity-plugin
|
|
2
2
|
|
|
3
|
+
## 1.12.0
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [#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`.
|
|
8
|
+
|
|
9
|
+
- Updated dependencies []:
|
|
10
|
+
- @rozenite/agent-bridge@1.12.0
|
|
11
|
+
- @rozenite/agent-shared@1.12.0
|
|
12
|
+
- @rozenite/plugin-bridge@1.12.0
|
|
13
|
+
|
|
3
14
|
## 1.11.0
|
|
4
15
|
|
|
5
16
|
### Minor Changes
|
package/dist/devtools/App.html
CHANGED
|
@@ -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-
|
|
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
|
|
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
|
|
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(
|
|
20943
|
-
|
|
20944
|
-
|
|
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,
|
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": "*",
|
|
@@ -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
|
|
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
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
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
|
-
|
|
214
|
+
const symbolicatedStackTrace = await symbolicateStackTrace(
|
|
215
|
+
generatedStackFrames.map((entry) => entry.frame),
|
|
216
|
+
);
|
|
210
217
|
|
|
211
|
-
const
|
|
212
|
-
|
|
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,
|