@alloy-js/core 0.23.0-dev.10 → 0.23.0-dev.11
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/dist/devtools/index.html +29 -17
- package/dist/src/binder.d.ts.map +1 -1
- package/dist/src/binder.js +5 -0
- package/dist/src/binder.js.map +1 -1
- package/dist/src/components/For.d.ts.map +1 -1
- package/dist/src/components/For.js +1 -1
- package/dist/src/components/For.js.map +1 -1
- package/dist/src/components/List.d.ts.map +1 -1
- package/dist/src/components/List.js +1 -1
- package/dist/src/components/List.js.map +1 -1
- package/dist/src/components/Switch.d.ts.map +1 -1
- package/dist/src/components/Switch.js +1 -1
- package/dist/src/components/Switch.js.map +1 -1
- package/dist/src/debug/diagnostics.test.js +3 -2
- package/dist/src/debug/diagnostics.test.js.map +1 -1
- package/dist/src/debug/effects.d.ts +12 -4
- package/dist/src/debug/effects.d.ts.map +1 -1
- package/dist/src/debug/effects.js +182 -52
- package/dist/src/debug/effects.js.map +1 -1
- package/dist/src/debug/effects.test.js +213 -41
- package/dist/src/debug/effects.test.js.map +1 -1
- package/dist/src/debug/files.d.ts.map +1 -1
- package/dist/src/debug/files.js +7 -18
- package/dist/src/debug/files.js.map +1 -1
- package/dist/src/debug/files.test.js +13 -36
- package/dist/src/debug/files.test.js.map +1 -1
- package/dist/src/debug/index.d.ts +4 -2
- package/dist/src/debug/index.d.ts.map +1 -1
- package/dist/src/debug/index.js +4 -2
- package/dist/src/debug/index.js.map +1 -1
- package/dist/src/debug/message-format.test.d.ts +2 -0
- package/dist/src/debug/message-format.test.d.ts.map +1 -0
- package/dist/src/debug/message-format.test.js +700 -0
- package/dist/src/debug/message-format.test.js.map +1 -0
- package/dist/src/debug/render-tree-orphans.test.d.ts +2 -0
- package/dist/src/debug/render-tree-orphans.test.d.ts.map +1 -0
- package/dist/src/debug/render-tree-orphans.test.js +297 -0
- package/dist/src/debug/render-tree-orphans.test.js.map +1 -0
- package/dist/src/debug/render.d.ts.map +1 -1
- package/dist/src/debug/render.js +83 -130
- package/dist/src/debug/render.js.map +1 -1
- package/dist/src/debug/render.test.js +91 -128
- package/dist/src/debug/render.test.js.map +1 -1
- package/dist/src/debug/symbols.d.ts +6 -5
- package/dist/src/debug/symbols.d.ts.map +1 -1
- package/dist/src/debug/symbols.js +46 -23
- package/dist/src/debug/symbols.js.map +1 -1
- package/dist/src/debug/symbols.test.js +15 -26
- package/dist/src/debug/symbols.test.js.map +1 -1
- package/dist/src/debug/trace-writer.d.ts +55 -0
- package/dist/src/debug/trace-writer.d.ts.map +1 -0
- package/dist/src/debug/trace-writer.js +658 -0
- package/dist/src/debug/trace-writer.js.map +1 -0
- package/dist/src/debug/trace.d.ts +10 -10
- package/dist/src/debug/trace.d.ts.map +1 -1
- package/dist/src/debug/trace.js +23 -20
- package/dist/src/debug/trace.js.map +1 -1
- package/dist/src/devtools/devtools-protocol.d.ts +318 -161
- package/dist/src/devtools/devtools-protocol.d.ts.map +1 -1
- package/dist/src/devtools/devtools-server.browser.d.ts +0 -5
- package/dist/src/devtools/devtools-server.browser.d.ts.map +1 -1
- package/dist/src/devtools/devtools-server.browser.js +0 -3
- package/dist/src/devtools/devtools-server.browser.js.map +1 -1
- package/dist/src/devtools/devtools-server.d.ts +0 -6
- package/dist/src/devtools/devtools-server.d.ts.map +1 -1
- package/dist/src/devtools/devtools-server.js +212 -24
- package/dist/src/devtools/devtools-server.js.map +1 -1
- package/dist/src/devtools/devtools-transport.d.ts +2 -2
- package/dist/src/devtools/devtools-transport.d.ts.map +1 -1
- package/dist/src/devtools/devtools-transport.js +2 -2
- package/dist/src/devtools/devtools-transport.js.map +1 -1
- package/dist/src/devtools-entry.browser.d.ts +1 -1
- package/dist/src/devtools-entry.browser.d.ts.map +1 -1
- package/dist/src/devtools-entry.browser.js.map +1 -1
- package/dist/src/devtools-entry.d.ts +1 -1
- package/dist/src/devtools-entry.d.ts.map +1 -1
- package/dist/src/devtools-entry.js.map +1 -1
- package/dist/src/diagnostics.d.ts.map +1 -1
- package/dist/src/diagnostics.js +5 -5
- package/dist/src/diagnostics.js.map +1 -1
- package/dist/src/reactivity.d.ts +13 -2
- package/dist/src/reactivity.d.ts.map +1 -1
- package/dist/src/reactivity.js +96 -13
- package/dist/src/reactivity.js.map +1 -1
- package/dist/src/render.d.ts.map +1 -1
- package/dist/src/render.js +84 -30
- package/dist/src/render.js.map +1 -1
- package/dist/src/scheduler.d.ts +5 -0
- package/dist/src/scheduler.d.ts.map +1 -1
- package/dist/src/scheduler.js +94 -23
- package/dist/src/scheduler.js.map +1 -1
- package/dist/src/utils.d.ts.map +1 -1
- package/dist/src/utils.js +11 -5
- package/dist/src/utils.js.map +1 -1
- package/dist/testing/devtools-utils.d.ts +12 -3
- package/dist/testing/devtools-utils.d.ts.map +1 -1
- package/dist/testing/devtools-utils.js +26 -4
- package/dist/testing/devtools-utils.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/binder.ts +47 -38
- package/src/components/For.tsx +14 -10
- package/src/components/List.tsx +7 -4
- package/src/components/Switch.tsx +11 -7
- package/src/debug/diagnostics.test.tsx +3 -2
- package/src/debug/effects.test.tsx +248 -36
- package/src/debug/effects.ts +276 -62
- package/src/debug/files.test.tsx +15 -35
- package/src/debug/files.ts +11 -11
- package/src/debug/index.ts +4 -0
- package/src/debug/message-format.test.tsx +759 -0
- package/src/debug/render-tree-orphans.test.tsx +344 -0
- package/src/debug/render.test.tsx +96 -118
- package/src/debug/render.ts +183 -124
- package/src/debug/symbols.test.tsx +19 -20
- package/src/debug/symbols.ts +106 -23
- package/src/debug/trace-writer.ts +969 -0
- package/src/debug/trace.ts +25 -28
- package/src/devtools/devtools-protocol.ts +361 -176
- package/src/devtools/devtools-server.browser.ts +0 -9
- package/src/devtools/devtools-server.ts +210 -32
- package/src/devtools/devtools-transport.ts +4 -4
- package/src/devtools-entry.browser.ts +11 -15
- package/src/devtools-entry.ts +9 -15
- package/src/diagnostics.ts +14 -5
- package/src/reactivity.ts +113 -17
- package/src/render.ts +104 -30
- package/src/scheduler.ts +145 -26
- package/src/utils.tsx +7 -4
- package/temp/api.json +142 -20
- package/testing/devtools-utils.ts +46 -4
|
@@ -7,7 +7,6 @@ import {
|
|
|
7
7
|
} from "../../testing/devtools-utils.js";
|
|
8
8
|
import { For } from "../components/For.jsx";
|
|
9
9
|
import { Output } from "../components/Output.jsx";
|
|
10
|
-
import { Show } from "../components/Show.jsx";
|
|
11
10
|
import {
|
|
12
11
|
enableDevtools,
|
|
13
12
|
resetDevtoolsServerForTests,
|
|
@@ -38,7 +37,7 @@ afterEach(async () => {
|
|
|
38
37
|
});
|
|
39
38
|
|
|
40
39
|
it("emits render:complete on successful render", async () => {
|
|
41
|
-
const collector = createMessageCollector(socket!);
|
|
40
|
+
const collector = await createMessageCollector(socket!);
|
|
42
41
|
|
|
43
42
|
await renderAsync(<Output />);
|
|
44
43
|
|
|
@@ -53,7 +52,7 @@ it("emits render:error on render failure", async () => {
|
|
|
53
52
|
throw new Error("Boom");
|
|
54
53
|
}
|
|
55
54
|
|
|
56
|
-
const collector = createMessageCollector(socket!);
|
|
55
|
+
const collector = await createMessageCollector(socket!);
|
|
57
56
|
|
|
58
57
|
await expect(
|
|
59
58
|
renderAsync(
|
|
@@ -71,7 +70,6 @@ it("emits render:error on render failure", async () => {
|
|
|
71
70
|
type: "render:error",
|
|
72
71
|
name: expect.any(String),
|
|
73
72
|
message: expect.any(String),
|
|
74
|
-
componentStack: expect.any(Array),
|
|
75
73
|
});
|
|
76
74
|
collector.stop();
|
|
77
75
|
});
|
|
@@ -87,7 +85,7 @@ it("sends render tree messages during render", async () => {
|
|
|
87
85
|
);
|
|
88
86
|
}
|
|
89
87
|
|
|
90
|
-
const collector = createMessageCollector(socket!);
|
|
88
|
+
const collector = await createMessageCollector(socket!);
|
|
91
89
|
|
|
92
90
|
await renderAsync(
|
|
93
91
|
<Output>
|
|
@@ -100,74 +98,61 @@ it("sends render tree messages during render", async () => {
|
|
|
100
98
|
collector.stop();
|
|
101
99
|
|
|
102
100
|
expect(renderMessages[0]).toMatchObject({ type: "render:reset" });
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
101
|
+
|
|
102
|
+
const nodeAdded = renderMessages.filter(
|
|
103
|
+
(m) => m.type === "render:node_added",
|
|
104
|
+
);
|
|
105
|
+
expect(nodeAdded[0]).toMatchObject({
|
|
106
|
+
type: "render:node_added",
|
|
107
|
+
parent_id: null,
|
|
107
108
|
});
|
|
108
|
-
expect(
|
|
109
|
-
type: "render:
|
|
110
|
-
|
|
111
|
-
name: "Output",
|
|
112
|
-
},
|
|
109
|
+
expect(nodeAdded[1]).toMatchObject({
|
|
110
|
+
type: "render:node_added",
|
|
111
|
+
name: "Output",
|
|
113
112
|
});
|
|
114
|
-
expect(
|
|
115
|
-
type: "render:
|
|
116
|
-
|
|
117
|
-
name: "Context Binder",
|
|
118
|
-
},
|
|
113
|
+
expect(nodeAdded[2]).toMatchObject({
|
|
114
|
+
type: "render:node_added",
|
|
115
|
+
name: "Context Binder",
|
|
119
116
|
});
|
|
120
|
-
expect(
|
|
121
|
-
type: "render:
|
|
122
|
-
node: {},
|
|
117
|
+
expect(nodeAdded[3]).toMatchObject({
|
|
118
|
+
type: "render:node_added",
|
|
123
119
|
});
|
|
124
|
-
expect(
|
|
125
|
-
type: "render:
|
|
126
|
-
|
|
127
|
-
name: "Context FormatOptions.*",
|
|
128
|
-
},
|
|
120
|
+
expect(nodeAdded[4]).toMatchObject({
|
|
121
|
+
type: "render:node_added",
|
|
122
|
+
name: expect.stringMatching(/^Context FormatOptions/),
|
|
129
123
|
});
|
|
130
|
-
expect(
|
|
131
|
-
type: "render:
|
|
132
|
-
node: {},
|
|
124
|
+
expect(nodeAdded[5]).toMatchObject({
|
|
125
|
+
type: "render:node_added",
|
|
133
126
|
});
|
|
134
|
-
expect(
|
|
135
|
-
type: "render:
|
|
136
|
-
|
|
137
|
-
name: "SourceDirectory",
|
|
138
|
-
},
|
|
127
|
+
expect(nodeAdded[6]).toMatchObject({
|
|
128
|
+
type: "render:node_added",
|
|
129
|
+
name: "SourceDirectory",
|
|
139
130
|
});
|
|
140
|
-
expect(
|
|
141
|
-
type: "render:
|
|
142
|
-
|
|
143
|
-
name: "Context SourceDirectory",
|
|
144
|
-
},
|
|
131
|
+
expect(nodeAdded[7]).toMatchObject({
|
|
132
|
+
type: "render:node_added",
|
|
133
|
+
name: "Context SourceDirectory",
|
|
145
134
|
});
|
|
146
|
-
expect(
|
|
147
|
-
type: "render:
|
|
148
|
-
node: {},
|
|
135
|
+
expect(nodeAdded[8]).toMatchObject({
|
|
136
|
+
type: "render:node_added",
|
|
149
137
|
});
|
|
150
|
-
expect(
|
|
151
|
-
type: "render:
|
|
152
|
-
|
|
153
|
-
name: "Foo",
|
|
154
|
-
},
|
|
138
|
+
expect(nodeAdded[9]).toMatchObject({
|
|
139
|
+
type: "render:node_added",
|
|
140
|
+
name: "Foo",
|
|
155
141
|
});
|
|
156
|
-
expect(
|
|
157
|
-
type: "render:
|
|
158
|
-
|
|
142
|
+
expect(nodeAdded[10]).toMatchObject({
|
|
143
|
+
type: "render:node_added",
|
|
144
|
+
value: "Hello",
|
|
159
145
|
});
|
|
160
|
-
expect(
|
|
161
|
-
type: "render:
|
|
162
|
-
|
|
146
|
+
expect(nodeAdded[11]).toMatchObject({
|
|
147
|
+
type: "render:node_added",
|
|
148
|
+
name: "br",
|
|
163
149
|
});
|
|
164
|
-
expect(
|
|
165
|
-
type: "render:
|
|
166
|
-
node: {},
|
|
150
|
+
expect(nodeAdded[12]).toMatchObject({
|
|
151
|
+
type: "render:node_added",
|
|
167
152
|
});
|
|
168
|
-
expect(
|
|
169
|
-
type: "render:
|
|
170
|
-
|
|
153
|
+
expect(nodeAdded[13]).toMatchObject({
|
|
154
|
+
type: "render:node_added",
|
|
155
|
+
value: "World",
|
|
171
156
|
});
|
|
172
157
|
});
|
|
173
158
|
|
|
@@ -179,7 +164,7 @@ it("rerenders when devtools requests rerender", async () => {
|
|
|
179
164
|
return "Hi";
|
|
180
165
|
}
|
|
181
166
|
|
|
182
|
-
const collector = createMessageCollector(socket!);
|
|
167
|
+
const collector = await createMessageCollector(socket!);
|
|
183
168
|
|
|
184
169
|
await renderAsync(
|
|
185
170
|
<Output>
|
|
@@ -191,15 +176,14 @@ it("rerenders when devtools requests rerender", async () => {
|
|
|
191
176
|
const renderMessages = filterRenderTreeMessages(messages);
|
|
192
177
|
const displayNode = renderMessages.find(
|
|
193
178
|
(message: DevtoolsMessage) =>
|
|
194
|
-
message.type === "render:
|
|
195
|
-
|
|
196
|
-
) as { node?: { id?: number } } | undefined;
|
|
179
|
+
message.type === "render:node_added" && message.name === "Display",
|
|
180
|
+
);
|
|
197
181
|
|
|
198
182
|
expect(renderCount).toBe(1);
|
|
199
|
-
expect(displayNode?.
|
|
183
|
+
expect(displayNode?.id).toEqual(expect.any(Number));
|
|
200
184
|
|
|
201
185
|
socket!.send(
|
|
202
|
-
JSON.stringify({ type: "render:rerender", id: displayNode!.
|
|
186
|
+
JSON.stringify({ type: "render:rerender", id: displayNode!.id }),
|
|
203
187
|
);
|
|
204
188
|
|
|
205
189
|
await collector.waitForFlush();
|
|
@@ -209,7 +193,7 @@ it("rerenders when devtools requests rerender", async () => {
|
|
|
209
193
|
});
|
|
210
194
|
|
|
211
195
|
it("sends render tree messages during render with For component", async () => {
|
|
212
|
-
const collector = createMessageCollector(socket!);
|
|
196
|
+
const collector = await createMessageCollector(socket!);
|
|
213
197
|
function Display(props: any) {
|
|
214
198
|
return <>item {props.item}</>;
|
|
215
199
|
}
|
|
@@ -227,24 +211,23 @@ it("sends render tree messages during render with For component", async () => {
|
|
|
227
211
|
expect(renderMessages).toEqual(
|
|
228
212
|
expect.arrayContaining([
|
|
229
213
|
expect.objectContaining({
|
|
230
|
-
type: "render:
|
|
231
|
-
|
|
214
|
+
type: "render:node_added",
|
|
215
|
+
name: "For",
|
|
232
216
|
}),
|
|
233
217
|
expect.objectContaining({
|
|
234
|
-
type: "render:
|
|
235
|
-
|
|
218
|
+
type: "render:node_added",
|
|
219
|
+
value: "a",
|
|
236
220
|
}),
|
|
237
221
|
expect.objectContaining({
|
|
238
|
-
type: "render:
|
|
239
|
-
|
|
222
|
+
type: "render:node_added",
|
|
223
|
+
value: "b",
|
|
240
224
|
}),
|
|
241
225
|
]),
|
|
242
226
|
);
|
|
243
227
|
});
|
|
244
228
|
|
|
245
|
-
it("emits nodeUpdated
|
|
246
|
-
const
|
|
247
|
-
const collector = createMessageCollector(socket!);
|
|
229
|
+
it("emits nodeUpdated during render for context updates", async () => {
|
|
230
|
+
const collector = await createMessageCollector(socket!);
|
|
248
231
|
|
|
249
232
|
function Counter(props: { value: number }) {
|
|
250
233
|
return `Count: ${props.value}`;
|
|
@@ -252,66 +235,61 @@ it("emits nodeUpdated when component props change", async () => {
|
|
|
252
235
|
|
|
253
236
|
await renderAsync(
|
|
254
237
|
<Output>
|
|
255
|
-
<Counter value={
|
|
238
|
+
<Counter value={1} />
|
|
256
239
|
</Output>,
|
|
257
240
|
);
|
|
258
241
|
|
|
259
|
-
await collector.waitForRender();
|
|
260
|
-
|
|
261
|
-
count.value += 1;
|
|
262
|
-
await flushJobsAsync();
|
|
263
|
-
|
|
264
|
-
const updateMessages = await collector.waitForFlush();
|
|
265
|
-
const updateRenderMessages = filterRenderTreeMessages(updateMessages);
|
|
242
|
+
const messages = await collector.waitForRender();
|
|
243
|
+
const renderMessages = filterRenderTreeMessages(messages);
|
|
266
244
|
|
|
267
|
-
|
|
268
|
-
|
|
245
|
+
// Context updates during the initial render produce render:node_updated messages
|
|
246
|
+
const nodeUpdated = renderMessages.filter(
|
|
247
|
+
(m: DevtoolsMessage) => m.type === "render:node_updated",
|
|
269
248
|
);
|
|
270
249
|
|
|
250
|
+
expect(nodeUpdated.length).toBeGreaterThan(0);
|
|
271
251
|
expect(nodeUpdated[0]).toMatchObject({
|
|
272
|
-
type: "render:
|
|
252
|
+
type: "render:node_updated",
|
|
273
253
|
id: expect.any(Number),
|
|
274
254
|
});
|
|
275
255
|
collector.stop();
|
|
276
256
|
});
|
|
277
257
|
|
|
278
|
-
it("
|
|
279
|
-
const
|
|
280
|
-
const collector = createMessageCollector(socket!);
|
|
281
|
-
|
|
282
|
-
function Maybe() {
|
|
283
|
-
return <Show when={show.value}>hi</Show>;
|
|
284
|
-
}
|
|
258
|
+
it("tracks render tree nodes during initial render", async () => {
|
|
259
|
+
const items = ref(["a", "b", "c"]);
|
|
260
|
+
const collector = await createMessageCollector(socket!);
|
|
285
261
|
|
|
286
262
|
await renderAsync(
|
|
287
263
|
<Output>
|
|
288
|
-
<
|
|
264
|
+
<For each={items}>{(item) => <>{item}</>}</For>
|
|
289
265
|
</Output>,
|
|
290
266
|
);
|
|
291
267
|
|
|
292
|
-
await collector.waitForRender();
|
|
293
|
-
|
|
294
|
-
show.value = false;
|
|
295
|
-
await flushJobsAsync();
|
|
296
|
-
|
|
297
|
-
const updateMessages = await collector.waitForFlush();
|
|
298
|
-
const updateRenderMessages = filterRenderTreeMessages(updateMessages);
|
|
268
|
+
const messages = await collector.waitForRender();
|
|
269
|
+
const renderMessages = filterRenderTreeMessages(messages);
|
|
299
270
|
|
|
300
|
-
|
|
301
|
-
|
|
271
|
+
// The initial render should include node_added messages for all items
|
|
272
|
+
const nodeAdded = renderMessages.filter(
|
|
273
|
+
(m: DevtoolsMessage) => m.type === "render:node_added",
|
|
302
274
|
);
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
275
|
+
expect(nodeAdded.length).toBeGreaterThan(0);
|
|
276
|
+
|
|
277
|
+
// Verify specific items appear in the tree
|
|
278
|
+
const itemValues = nodeAdded
|
|
279
|
+
.filter(
|
|
280
|
+
(m: DevtoolsMessage) =>
|
|
281
|
+
m.value === "a" || m.value === "b" || m.value === "c",
|
|
282
|
+
)
|
|
283
|
+
.map((m: DevtoolsMessage) => m.value);
|
|
284
|
+
expect(itemValues).toContain("a");
|
|
285
|
+
expect(itemValues).toContain("b");
|
|
286
|
+
expect(itemValues).toContain("c");
|
|
309
287
|
collector.stop();
|
|
310
288
|
});
|
|
311
289
|
|
|
312
290
|
it("emits proper events when items are added/removed in For component", async () => {
|
|
313
291
|
const items = ref(["a", "b"]);
|
|
314
|
-
const collector = createMessageCollector(socket!);
|
|
292
|
+
const collector = await createMessageCollector(socket!);
|
|
315
293
|
|
|
316
294
|
function Display(props: any) {
|
|
317
295
|
return <>item {props.item}</>;
|
|
@@ -332,14 +310,14 @@ it("emits proper events when items are added/removed in For component", async ()
|
|
|
332
310
|
|
|
333
311
|
function processMessages(messages: any[]) {
|
|
334
312
|
for (const msg of messages) {
|
|
335
|
-
if (msg.type === "render:
|
|
336
|
-
const nodeId = msg.
|
|
337
|
-
const parentId = msg.
|
|
313
|
+
if (msg.type === "render:node_added") {
|
|
314
|
+
const nodeId = msg.id;
|
|
315
|
+
const parentId = msg.parent_id;
|
|
338
316
|
|
|
339
317
|
// Root node has null parent, otherwise parent must exist
|
|
340
318
|
if (parentId !== null && !activeNodes.has(parentId)) {
|
|
341
319
|
throw new Error(
|
|
342
|
-
`Node ${nodeId} (${msg.
|
|
320
|
+
`Node ${nodeId} (${msg.kind}${msg.name ? `: ${msg.name}` : ""}) ` +
|
|
343
321
|
`added with parent ${parentId} but parent is not in active nodes. ` +
|
|
344
322
|
`Active nodes: ${[...activeNodes.keys()].join(", ")}`,
|
|
345
323
|
);
|
|
@@ -347,10 +325,10 @@ it("emits proper events when items are added/removed in For component", async ()
|
|
|
347
325
|
|
|
348
326
|
activeNodes.set(nodeId, {
|
|
349
327
|
parentId,
|
|
350
|
-
kind: msg.
|
|
351
|
-
name: msg.
|
|
328
|
+
kind: msg.kind,
|
|
329
|
+
name: msg.name,
|
|
352
330
|
});
|
|
353
|
-
} else if (msg.type === "render:
|
|
331
|
+
} else if (msg.type === "render:node_removed") {
|
|
354
332
|
const nodeId = msg.id;
|
|
355
333
|
if (!activeNodes.has(nodeId)) {
|
|
356
334
|
throw new Error(
|