@rezi-ui/node 0.1.0-alpha.1

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.
Files changed (42) hide show
  1. package/README.md +17 -0
  2. package/dist/__e2e__/fixtures/terminal-app.d.ts +2 -0
  3. package/dist/__e2e__/fixtures/terminal-app.d.ts.map +1 -0
  4. package/dist/__e2e__/fixtures/terminal-app.js +42 -0
  5. package/dist/__e2e__/fixtures/terminal-app.js.map +1 -0
  6. package/dist/__e2e__/terminal-render.e2e.test.d.ts +2 -0
  7. package/dist/__e2e__/terminal-render.e2e.test.d.ts.map +1 -0
  8. package/dist/__e2e__/terminal-render.e2e.test.js +125 -0
  9. package/dist/__e2e__/terminal-render.e2e.test.js.map +1 -0
  10. package/dist/__tests__/worker_integration.test.d.ts +2 -0
  11. package/dist/__tests__/worker_integration.test.d.ts.map +1 -0
  12. package/dist/__tests__/worker_integration.test.js +569 -0
  13. package/dist/__tests__/worker_integration.test.js.map +1 -0
  14. package/dist/backend/nodeBackend.d.ts +62 -0
  15. package/dist/backend/nodeBackend.d.ts.map +1 -0
  16. package/dist/backend/nodeBackend.js +942 -0
  17. package/dist/backend/nodeBackend.js.map +1 -0
  18. package/dist/backend/nodeBackendInline.d.ts +10 -0
  19. package/dist/backend/nodeBackendInline.d.ts.map +1 -0
  20. package/dist/backend/nodeBackendInline.js +702 -0
  21. package/dist/backend/nodeBackendInline.js.map +1 -0
  22. package/dist/index.d.ts +5 -0
  23. package/dist/index.d.ts.map +1 -0
  24. package/dist/index.js +5 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/worker/engineWorker.d.ts +9 -0
  27. package/dist/worker/engineWorker.d.ts.map +1 -0
  28. package/dist/worker/engineWorker.js +1001 -0
  29. package/dist/worker/engineWorker.js.map +1 -0
  30. package/dist/worker/protocol.d.ts +242 -0
  31. package/dist/worker/protocol.d.ts.map +1 -0
  32. package/dist/worker/protocol.js +23 -0
  33. package/dist/worker/protocol.js.map +1 -0
  34. package/dist/worker/testShims/mockNative.d.ts +48 -0
  35. package/dist/worker/testShims/mockNative.d.ts.map +1 -0
  36. package/dist/worker/testShims/mockNative.js +216 -0
  37. package/dist/worker/testShims/mockNative.js.map +1 -0
  38. package/dist/worker/testShims/targetFpsNative.d.ts +22 -0
  39. package/dist/worker/testShims/targetFpsNative.d.ts.map +1 -0
  40. package/dist/worker/testShims/targetFpsNative.js +74 -0
  41. package/dist/worker/testShims/targetFpsNative.js.map +1 -0
  42. package/package.json +37 -0
@@ -0,0 +1,569 @@
1
+ import assert from "node:assert/strict";
2
+ import { once } from "node:events";
3
+ import test from "node:test";
4
+ import { Worker } from "node:worker_threads";
5
+ import { DEFAULT_TERMINAL_CAPS, ZrUiError, parseEventBatchV1 } from "@rezi-ui/core";
6
+ import { createNodeBackendInternal } from "../backend/nodeBackend.js";
7
+ import { FRAME_SAB_CONTROL_CONSUMED_SEQ_WORD, FRAME_SAB_CONTROL_HEADER_WORDS, FRAME_SAB_CONTROL_PUBLISHED_BYTES_WORD, FRAME_SAB_CONTROL_PUBLISHED_SEQ_WORD, FRAME_SAB_CONTROL_PUBLISHED_SLOT_WORD, FRAME_SAB_CONTROL_PUBLISHED_TOKEN_WORD, FRAME_SAB_CONTROL_WORDS_PER_SLOT, FRAME_SAB_SLOT_STATE_FREE, FRAME_SAB_SLOT_STATE_READY, FRAME_TRANSPORT_SAB_V1, FRAME_TRANSPORT_VERSION, } from "../worker/protocol.js";
8
+ function delay(ms) {
9
+ return new Promise((resolve) => setTimeout(resolve, ms));
10
+ }
11
+ function makeWorker() {
12
+ const entry = new URL("../worker/engineWorker.js", import.meta.url);
13
+ const shim = new URL("../worker/testShims/mockNative.js", import.meta.url).href;
14
+ return new Worker(entry, { workerData: { nativeShimModule: shim } });
15
+ }
16
+ function waitFor(worker, pred) {
17
+ return new Promise((resolve, reject) => {
18
+ const onMsg = (m) => {
19
+ if (typeof m !== "object" || m === null)
20
+ return;
21
+ const type = m.type;
22
+ if (typeof type !== "string")
23
+ return;
24
+ const msg = m;
25
+ if (msg.type === "fatal") {
26
+ cleanup();
27
+ reject(new Error(`worker fatal: ${msg.where} (${msg.code}): ${msg.detail}`));
28
+ return;
29
+ }
30
+ if (pred(msg)) {
31
+ cleanup();
32
+ resolve(msg);
33
+ }
34
+ };
35
+ const onExit = (code) => {
36
+ cleanup();
37
+ reject(new Error(`worker exited before expected message: code=${String(code)}`));
38
+ };
39
+ const cleanup = () => {
40
+ worker.off("message", onMsg);
41
+ worker.off("exit", onExit);
42
+ };
43
+ worker.on("message", onMsg);
44
+ worker.on("exit", onExit);
45
+ });
46
+ }
47
+ function post(worker, msg, transfer) {
48
+ if (transfer !== undefined) {
49
+ worker.postMessage(msg, transfer);
50
+ return;
51
+ }
52
+ worker.postMessage(msg);
53
+ }
54
+ test("worker: init/ready + latest-wins transfer mailbox avoids stale fatal", async () => {
55
+ const worker = makeWorker();
56
+ try {
57
+ // Frame #1 would fatal if submitted; frame #2 is valid. With latest-wins
58
+ // mailbox semantics and back-to-back queueing before first tick, only #2
59
+ // should be consumed.
60
+ const stale = Uint8Array.from([0xff, 1, 2, 3]);
61
+ const latest = Uint8Array.from([9, 8, 7, 6]);
62
+ const ab1 = stale.buffer.slice(0);
63
+ const ab2 = latest.buffer.slice(0);
64
+ // Queue init + frames before awaiting "ready" so frame messages are
65
+ // coalesced before the first worker tick.
66
+ post(worker, { type: "init", config: { maxEventBytes: 1024, fpsCap: 1000 } });
67
+ post(worker, { type: "frame", frameSeq: 1, drawlist: ab1, byteLen: stale.byteLength }, [ab1]);
68
+ post(worker, { type: "frame", frameSeq: 2, drawlist: ab2, byteLen: latest.byteLength }, [ab2]);
69
+ await waitFor(worker, (m) => m.type === "ready");
70
+ await delay(25);
71
+ post(worker, { type: "shutdown" });
72
+ await waitFor(worker, (m) => m.type === "shutdownComplete");
73
+ await once(worker, "exit");
74
+ }
75
+ finally {
76
+ await worker.terminate();
77
+ }
78
+ });
79
+ test("worker: SAB transport mailbox latest-wins + slot release", async () => {
80
+ const worker = makeWorker();
81
+ const slotCount = 2;
82
+ const slotBytes = 32;
83
+ const control = new SharedArrayBuffer((FRAME_SAB_CONTROL_HEADER_WORDS + slotCount * FRAME_SAB_CONTROL_WORDS_PER_SLOT) *
84
+ Int32Array.BYTES_PER_ELEMENT);
85
+ const header = new Int32Array(control, 0, FRAME_SAB_CONTROL_HEADER_WORDS);
86
+ const states = new Int32Array(control, FRAME_SAB_CONTROL_HEADER_WORDS * Int32Array.BYTES_PER_ELEMENT, slotCount);
87
+ const tokens = new Int32Array(control, (FRAME_SAB_CONTROL_HEADER_WORDS + slotCount) * Int32Array.BYTES_PER_ELEMENT, slotCount);
88
+ const data = new SharedArrayBuffer(slotCount * slotBytes);
89
+ const dataView = new Uint8Array(data);
90
+ const publishSabFrame = (slotIndex, bytes, frameSeq, slotToken = frameSeq) => {
91
+ const off = slotIndex * slotBytes;
92
+ dataView.fill(0, off, off + slotBytes);
93
+ dataView.set(bytes, off);
94
+ Atomics.store(tokens, slotIndex, slotToken);
95
+ Atomics.store(states, slotIndex, FRAME_SAB_SLOT_STATE_READY);
96
+ Atomics.store(header, FRAME_SAB_CONTROL_PUBLISHED_SLOT_WORD, slotIndex);
97
+ Atomics.store(header, FRAME_SAB_CONTROL_PUBLISHED_BYTES_WORD, bytes.byteLength);
98
+ Atomics.store(header, FRAME_SAB_CONTROL_PUBLISHED_TOKEN_WORD, slotToken);
99
+ Atomics.store(header, FRAME_SAB_CONTROL_PUBLISHED_SEQ_WORD, frameSeq);
100
+ };
101
+ try {
102
+ post(worker, {
103
+ type: "init",
104
+ config: {
105
+ maxEventBytes: 1024,
106
+ fpsCap: 1000,
107
+ frameTransport: {
108
+ kind: FRAME_TRANSPORT_SAB_V1,
109
+ version: FRAME_TRANSPORT_VERSION,
110
+ slotCount,
111
+ slotBytes,
112
+ control,
113
+ data,
114
+ },
115
+ },
116
+ });
117
+ await waitFor(worker, (m) => m.type === "ready");
118
+ publishSabFrame(0, Uint8Array.from([0xff, 1, 2, 3]), 1, 11);
119
+ publishSabFrame(1, Uint8Array.from([8, 7, 6, 5, 4, 3, 2, 1]), 2, 22);
120
+ post(worker, { type: "frameKick", frameSeq: 2 });
121
+ const frameStatus = (await waitFor(worker, (m) => m.type === "frameStatus" && m.completedSeq === 2));
122
+ assert.equal(frameStatus.acceptedSeq, 2);
123
+ assert.equal(frameStatus.completedResult, 0);
124
+ assert.equal(Atomics.load(states, 1), FRAME_SAB_SLOT_STATE_FREE);
125
+ assert.notEqual(Atomics.load(states, 0), 1);
126
+ post(worker, { type: "shutdown" });
127
+ await waitFor(worker, (m) => m.type === "shutdownComplete");
128
+ await once(worker, "exit");
129
+ }
130
+ finally {
131
+ await worker.terminate();
132
+ }
133
+ });
134
+ test("worker: SAB stale token frame is dropped without fatal and latest token wins", async () => {
135
+ const worker = makeWorker();
136
+ const slotCount = 1;
137
+ const slotBytes = 32;
138
+ const control = new SharedArrayBuffer((FRAME_SAB_CONTROL_HEADER_WORDS + slotCount * FRAME_SAB_CONTROL_WORDS_PER_SLOT) *
139
+ Int32Array.BYTES_PER_ELEMENT);
140
+ const header = new Int32Array(control, 0, FRAME_SAB_CONTROL_HEADER_WORDS);
141
+ const states = new Int32Array(control, FRAME_SAB_CONTROL_HEADER_WORDS * Int32Array.BYTES_PER_ELEMENT, slotCount);
142
+ const tokens = new Int32Array(control, (FRAME_SAB_CONTROL_HEADER_WORDS + slotCount) * Int32Array.BYTES_PER_ELEMENT, slotCount);
143
+ const data = new SharedArrayBuffer(slotCount * slotBytes);
144
+ const dataView = new Uint8Array(data);
145
+ const writeSabSlot = (bytes, slotToken) => {
146
+ dataView.fill(0, 0, slotBytes);
147
+ dataView.set(bytes, 0);
148
+ Atomics.store(tokens, 0, slotToken);
149
+ Atomics.store(states, 0, FRAME_SAB_SLOT_STATE_READY);
150
+ };
151
+ try {
152
+ post(worker, {
153
+ type: "init",
154
+ config: {
155
+ maxEventBytes: 1024,
156
+ fpsCap: 1000,
157
+ frameTransport: {
158
+ kind: FRAME_TRANSPORT_SAB_V1,
159
+ version: FRAME_TRANSPORT_VERSION,
160
+ slotCount,
161
+ slotBytes,
162
+ control,
163
+ data,
164
+ },
165
+ },
166
+ });
167
+ await waitFor(worker, (m) => m.type === "ready");
168
+ // Simulate a stale message (slot token advanced before this message is consumed).
169
+ writeSabSlot(Uint8Array.from([9, 9, 9, 9]), 22);
170
+ post(worker, {
171
+ type: "frame",
172
+ frameSeq: 1,
173
+ byteLen: 4,
174
+ transport: FRAME_TRANSPORT_SAB_V1,
175
+ slotIndex: 0,
176
+ slotToken: 21,
177
+ });
178
+ // Deliver the latest frame for the current token.
179
+ writeSabSlot(Uint8Array.from([1, 2, 3, 4]), 22);
180
+ post(worker, {
181
+ type: "frame",
182
+ frameSeq: 2,
183
+ byteLen: 4,
184
+ transport: FRAME_TRANSPORT_SAB_V1,
185
+ slotIndex: 0,
186
+ slotToken: 22,
187
+ });
188
+ post(worker, { type: "frameKick", frameSeq: 2 });
189
+ await delay(25);
190
+ assert.ok(Atomics.load(header, FRAME_SAB_CONTROL_CONSUMED_SEQ_WORD) >= 0);
191
+ assert.equal(Atomics.load(states, 0), FRAME_SAB_SLOT_STATE_FREE);
192
+ post(worker, { type: "shutdown" });
193
+ await waitFor(worker, (m) => m.type === "shutdownComplete");
194
+ await once(worker, "exit");
195
+ }
196
+ finally {
197
+ await worker.terminate();
198
+ }
199
+ });
200
+ test("worker: event pool backpressure + droppedSinceLast", async () => {
201
+ const worker = makeWorker();
202
+ try {
203
+ post(worker, { type: "init", config: { maxEventBytes: 1024, fpsCap: 1000 } });
204
+ await waitFor(worker, (m) => m.type === "ready");
205
+ const payloadA = new Uint8Array(new ArrayBuffer(3));
206
+ payloadA.set([1, 2, 3]);
207
+ post(worker, { type: "postUserEvent", tag: 111, payload: payloadA.buffer, byteLen: payloadA.byteLength }, [payloadA.buffer]);
208
+ const payloadB = new Uint8Array(new ArrayBuffer(2));
209
+ payloadB.set([4, 5]);
210
+ post(worker, { type: "postUserEvent", tag: 222, payload: payloadB.buffer, byteLen: payloadB.byteLength }, [payloadB.buffer]);
211
+ const e1 = await waitFor(worker, (m) => m.type === "events");
212
+ const e2 = await waitFor(worker, (m) => m.type === "events");
213
+ assert.equal(e1.type, "events");
214
+ assert.equal(e2.type, "events");
215
+ assert.equal(e1.droppedSinceLast, 0);
216
+ assert.equal(e2.droppedSinceLast, 0);
217
+ const p1 = parseEventBatchV1(new Uint8Array(e1.batch, 0, e1.byteLen));
218
+ const p2 = parseEventBatchV1(new Uint8Array(e2.batch, 0, e2.byteLen));
219
+ assert.equal(p1.ok, true);
220
+ assert.equal(p2.ok, true);
221
+ // Exhaust EVENT_POOL_SIZE (2) by withholding both acks, then generate drops.
222
+ const dropped = 5;
223
+ for (let i = 0; i < dropped; i++) {
224
+ const payload = new Uint8Array(new ArrayBuffer(1));
225
+ payload[0] = i;
226
+ post(worker, {
227
+ type: "postUserEvent",
228
+ tag: 900 + i,
229
+ payload: payload.buffer,
230
+ byteLen: payload.byteLength,
231
+ }, [payload.buffer]);
232
+ }
233
+ // Barrier: ensure at least one tick ran after the drop-queue was populated.
234
+ await delay(25);
235
+ // Return one buffer, then emit one more event; next sent batch must include droppedSinceLast.
236
+ post(worker, { type: "eventsAck", buffer: e1.batch }, [e1.batch]);
237
+ const payloadC = new Uint8Array(new ArrayBuffer(4));
238
+ payloadC.set([6, 7, 8, 9]);
239
+ const payloadCExp = Array.from(payloadC);
240
+ post(worker, { type: "postUserEvent", tag: 333, payload: payloadC.buffer, byteLen: payloadC.byteLength }, [payloadC.buffer]);
241
+ const e3 = await waitFor(worker, (m) => m.type === "events");
242
+ assert.equal(e3.type, "events");
243
+ assert.equal(e3.droppedSinceLast, dropped);
244
+ const p3 = parseEventBatchV1(new Uint8Array(e3.batch, 0, e3.byteLen));
245
+ assert.equal(p3.ok, true);
246
+ if (p3.ok) {
247
+ assert.equal(p3.value.events.length, 1);
248
+ const ev0 = p3.value.events[0];
249
+ assert.ok(ev0 !== undefined);
250
+ const ev = ev0;
251
+ assert.equal(ev.kind, "user");
252
+ if (ev.kind !== "user")
253
+ throw new Error("expected user event");
254
+ assert.equal(ev.tag, 333);
255
+ assert.deepEqual(Array.from(ev.payload), payloadCExp);
256
+ }
257
+ // Cleanup: return remaining buffers.
258
+ post(worker, { type: "eventsAck", buffer: e2.batch }, [e2.batch]);
259
+ post(worker, { type: "eventsAck", buffer: e3.batch }, [e3.batch]);
260
+ }
261
+ finally {
262
+ await worker.terminate();
263
+ }
264
+ });
265
+ test("worker: deterministic shutdownComplete + exit", async () => {
266
+ const worker = makeWorker();
267
+ try {
268
+ post(worker, { type: "init", config: { maxEventBytes: 1024, fpsCap: 1000 } });
269
+ await waitFor(worker, (m) => m.type === "ready");
270
+ post(worker, { type: "shutdown" });
271
+ await waitFor(worker, (m) => m.type === "shutdownComplete");
272
+ await once(worker, "exit");
273
+ }
274
+ finally {
275
+ await worker.terminate();
276
+ }
277
+ });
278
+ test("backend: createNodeBackendInternal integrates worker buffers + release", async () => {
279
+ const shim = new URL("../worker/testShims/mockNative.js", import.meta.url).href;
280
+ const backend = createNodeBackendInternal({
281
+ config: { fpsCap: 1000, maxEventBytes: 1024 },
282
+ nativeShimModule: shim,
283
+ });
284
+ await backend.start();
285
+ const payload = new Uint8Array(new ArrayBuffer(3));
286
+ payload.set([10, 11, 12]);
287
+ backend.postUserEvent(4242, payload);
288
+ const batch = await backend.pollEvents();
289
+ const parsed = parseEventBatchV1(batch.bytes);
290
+ assert.equal(parsed.ok, true);
291
+ if (parsed.ok) {
292
+ assert.equal(parsed.value.events.length, 1);
293
+ const ev0 = parsed.value.events[0];
294
+ assert.ok(ev0 !== undefined);
295
+ const ev = ev0;
296
+ assert.equal(ev.kind, "user");
297
+ if (ev.kind !== "user")
298
+ throw new Error("expected user event");
299
+ assert.equal(ev.tag, 4242);
300
+ assert.deepEqual(Array.from(ev.payload), [10, 11, 12]);
301
+ }
302
+ batch.release();
303
+ batch.release();
304
+ const drawlist = new Uint8Array(new ArrayBuffer(8));
305
+ drawlist.set([1, 1, 2, 3, 5, 8, 13, 21]);
306
+ await backend.requestFrame(drawlist);
307
+ await backend.stop();
308
+ backend.dispose();
309
+ });
310
+ test("backend: maps fpsCap to native targetFps during init", async () => {
311
+ const shim = new URL("../worker/testShims/targetFpsNative.js", import.meta.url).href;
312
+ const backend = createNodeBackendInternal({
313
+ config: { fpsCap: 777, maxEventBytes: 1024 },
314
+ nativeShimModule: shim,
315
+ });
316
+ await backend.start();
317
+ await backend.stop();
318
+ backend.dispose();
319
+ });
320
+ test("backend: mailbox resolves coalesced frame sequences", async () => {
321
+ const shim = new URL("../worker/testShims/mockNative.js", import.meta.url).href;
322
+ const backend = createNodeBackendInternal({
323
+ config: { fpsCap: 1000, maxEventBytes: 1024 },
324
+ nativeShimModule: shim,
325
+ });
326
+ await backend.start();
327
+ const a = Uint8Array.from([1, 2, 3, 4]);
328
+ const b = Uint8Array.from([5, 6, 7, 8]);
329
+ await Promise.all([backend.requestFrame(a), backend.requestFrame(b)]);
330
+ await backend.stop();
331
+ backend.dispose();
332
+ });
333
+ test("backend: requestFrame settles asynchronously after worker completion", async () => {
334
+ const shim = new URL("../worker/testShims/mockNative.js", import.meta.url).href;
335
+ const backend = createNodeBackendInternal({
336
+ config: { fpsCap: 1000, maxEventBytes: 1024 },
337
+ nativeShimModule: shim,
338
+ });
339
+ await backend.start();
340
+ const drawlist = Uint8Array.from([1, 2, 3, 4]);
341
+ let settled = false;
342
+ const inFlight = backend.requestFrame(drawlist).then(() => {
343
+ settled = true;
344
+ });
345
+ // requestFrame must not settle on publish; completion arrives from the worker.
346
+ await Promise.resolve();
347
+ assert.equal(settled, false);
348
+ await inFlight;
349
+ assert.equal(settled, true);
350
+ await backend.stop();
351
+ backend.dispose();
352
+ });
353
+ test("backend: requestFrame accepts subarray views without detaching input", async () => {
354
+ const shim = new URL("../worker/testShims/mockNative.js", import.meta.url).href;
355
+ const backend = createNodeBackendInternal({
356
+ config: { fpsCap: 1000, maxEventBytes: 1024, frameTransport: "transfer" },
357
+ nativeShimModule: shim,
358
+ });
359
+ await backend.start();
360
+ const full = new Uint8Array(new ArrayBuffer(8));
361
+ full.set([1, 2, 3, 4, 5, 6, 7, 8]);
362
+ const view = full.subarray(2, 6);
363
+ await backend.requestFrame(view);
364
+ assert.equal(full.byteLength, 8);
365
+ assert.deepEqual(Array.from(full), [1, 2, 3, 4, 5, 6, 7, 8]);
366
+ await backend.stop();
367
+ backend.dispose();
368
+ });
369
+ test("backend: requestFrame does not detach full-buffer inputs", async () => {
370
+ const shim = new URL("../worker/testShims/mockNative.js", import.meta.url).href;
371
+ const backend = createNodeBackendInternal({
372
+ config: { fpsCap: 1000, maxEventBytes: 1024, frameTransport: "transfer" },
373
+ nativeShimModule: shim,
374
+ });
375
+ await backend.start();
376
+ const full = new Uint8Array(new ArrayBuffer(8));
377
+ full.set([1, 2, 3, 4, 5, 6, 7, 8]);
378
+ await backend.requestFrame(full);
379
+ assert.equal(full.byteLength, 8);
380
+ assert.deepEqual(Array.from(full), [1, 2, 3, 4, 5, 6, 7, 8]);
381
+ await backend.stop();
382
+ backend.dispose();
383
+ });
384
+ test("backend:inline: requestFrame keeps caller buffers attached", async () => {
385
+ const shim = new URL("../worker/testShims/mockNative.js", import.meta.url).href;
386
+ const backend = createNodeBackendInternal({
387
+ config: { executionMode: "inline", fpsCap: 1000, maxEventBytes: 1024 },
388
+ nativeShimModule: shim,
389
+ });
390
+ await backend.start();
391
+ const full = new Uint8Array(new ArrayBuffer(8));
392
+ full.set([1, 2, 3, 4, 5, 6, 7, 8]);
393
+ const view = full.subarray(1, 7);
394
+ await backend.requestFrame(view);
395
+ assert.equal(full.byteLength, 8);
396
+ assert.deepEqual(Array.from(full), [1, 2, 3, 4, 5, 6, 7, 8]);
397
+ await backend.stop();
398
+ backend.dispose();
399
+ });
400
+ test("backend: SAB requestFrame keeps caller buffers attached", async () => {
401
+ const shim = new URL("../worker/testShims/mockNative.js", import.meta.url).href;
402
+ const backend = createNodeBackendInternal({
403
+ config: {
404
+ fpsCap: 1000,
405
+ maxEventBytes: 1024,
406
+ frameTransport: "sab",
407
+ frameSabSlotCount: 2,
408
+ frameSabSlotBytes: 64,
409
+ },
410
+ nativeShimModule: shim,
411
+ });
412
+ await backend.start();
413
+ const full = new Uint8Array(new ArrayBuffer(8));
414
+ full.set([1, 2, 3, 4, 5, 6, 7, 8]);
415
+ const view = full.subarray(2, 7);
416
+ await backend.requestFrame(view);
417
+ assert.equal(full.byteLength, 8);
418
+ assert.deepEqual(Array.from(full), [1, 2, 3, 4, 5, 6, 7, 8]);
419
+ await backend.stop();
420
+ backend.dispose();
421
+ });
422
+ test("backend: SAB transport falls back to transfer for oversized frames", async () => {
423
+ const shim = new URL("../worker/testShims/mockNative.js", import.meta.url).href;
424
+ const backend = createNodeBackendInternal({
425
+ config: {
426
+ fpsCap: 1000,
427
+ maxEventBytes: 1024,
428
+ frameTransport: "sab",
429
+ frameSabSlotCount: 2,
430
+ frameSabSlotBytes: 4,
431
+ },
432
+ nativeShimModule: shim,
433
+ });
434
+ await backend.start();
435
+ const full = new Uint8Array(new ArrayBuffer(8));
436
+ full.set([8, 7, 6, 5, 4, 3, 2, 1]);
437
+ await backend.requestFrame(full);
438
+ assert.equal(full.byteLength, 8);
439
+ assert.deepEqual(Array.from(full), [8, 7, 6, 5, 4, 3, 2, 1]);
440
+ await backend.stop();
441
+ backend.dispose();
442
+ });
443
+ test("backend: stop rejects pollEvents and blocks subsequent requestFrame deterministically", async () => {
444
+ const shim = new URL("../worker/testShims/mockNative.js", import.meta.url).href;
445
+ const backend = createNodeBackendInternal({
446
+ config: { fpsCap: 1, maxEventBytes: 1024 },
447
+ nativeShimModule: shim,
448
+ });
449
+ await backend.start();
450
+ const pEvents = backend.pollEvents();
451
+ const pEventsAssert = assert.rejects(pEvents, /stopped/);
452
+ await backend.stop();
453
+ await pEventsAssert;
454
+ const dl = new Uint8Array(new ArrayBuffer(8));
455
+ dl.set([1, 2, 3, 4, 5, 6, 7, 8]);
456
+ await assert.rejects(backend.requestFrame(dl), /stopped/);
457
+ backend.dispose();
458
+ });
459
+ test("backend:inline: stop rejects pollEvents and blocks subsequent requestFrame", async () => {
460
+ const shim = new URL("../worker/testShims/mockNative.js", import.meta.url).href;
461
+ const backend = createNodeBackendInternal({
462
+ config: { executionMode: "inline", fpsCap: 1000, maxEventBytes: 1024 },
463
+ nativeShimModule: shim,
464
+ });
465
+ await backend.start();
466
+ await backend.stop();
467
+ await assert.rejects(backend.pollEvents(), /stopped/);
468
+ const dl = new Uint8Array(new ArrayBuffer(8));
469
+ dl.set([1, 2, 3, 4, 5, 6, 7, 8]);
470
+ await assert.rejects(backend.requestFrame(dl), /stopped/);
471
+ backend.dispose();
472
+ });
473
+ test("backend: frame submission failure becomes fatal ZRUI_BACKEND_ERROR", async () => {
474
+ const shim = new URL("../worker/testShims/mockNative.js", import.meta.url).href;
475
+ const backend = createNodeBackendInternal({
476
+ config: { fpsCap: 1000, maxEventBytes: 1024 },
477
+ nativeShimModule: shim,
478
+ });
479
+ await backend.start();
480
+ const dl = new Uint8Array(new ArrayBuffer(4));
481
+ dl.set([0xff, 1, 2, 3]); // triggers deterministic failure in mockNative
482
+ // requestFrame now settles on worker completion/failure.
483
+ await assert.rejects(backend.requestFrame(dl), (err) => {
484
+ return err instanceof ZrUiError && err.code === "ZRUI_BACKEND_ERROR";
485
+ });
486
+ // Subsequent operations should fail due to fatal state
487
+ await assert.rejects(backend.requestFrame(new Uint8Array(4)), (err) => {
488
+ return err instanceof ZrUiError && err.code === "ZRUI_BACKEND_ERROR";
489
+ });
490
+ backend.dispose();
491
+ });
492
+ test("backend: getCaps returns defaults before start and worker caps after start", async () => {
493
+ const shim = new URL("../worker/testShims/mockNative.js", import.meta.url).href;
494
+ const backend = createNodeBackendInternal({
495
+ config: { fpsCap: 1000, maxEventBytes: 1024 },
496
+ nativeShimModule: shim,
497
+ });
498
+ const pre = await backend.getCaps();
499
+ assert.deepEqual(pre, DEFAULT_TERMINAL_CAPS);
500
+ await backend.start();
501
+ const caps = await backend.getCaps();
502
+ assert.deepEqual(caps, {
503
+ colorMode: 2,
504
+ supportsMouse: true,
505
+ supportsBracketedPaste: true,
506
+ supportsFocusEvents: true,
507
+ supportsOsc52: false,
508
+ supportsSyncUpdate: true,
509
+ supportsScrollRegion: true,
510
+ supportsCursorShape: true,
511
+ supportsOutputWaitWritable: true,
512
+ sgrAttrsSupported: 0xffffffff,
513
+ });
514
+ await backend.stop();
515
+ backend.dispose();
516
+ });
517
+ test("backend: debugQuery clamps maxRecords to avoid large allocations", async () => {
518
+ const shim = new URL("../worker/testShims/mockNative.js", import.meta.url).href;
519
+ const backend = createNodeBackendInternal({
520
+ config: { fpsCap: 1000, maxEventBytes: 1024 },
521
+ nativeShimModule: shim,
522
+ });
523
+ await backend.start();
524
+ await backend.debug.debugEnable({ enabled: true });
525
+ const out = await backend.debug.debugQuery({ maxRecords: 1_000_000_000 });
526
+ assert.equal(out.result.recordsReturned, 16384);
527
+ assert.equal(out.headers.byteLength, 16384 * 40);
528
+ await backend.stop();
529
+ backend.dispose();
530
+ });
531
+ test("backend: perfSnapshot returns valid structure when REZI_PERF is enabled", async () => {
532
+ const shim = new URL("../worker/testShims/mockNative.js", import.meta.url).href;
533
+ const backend = createNodeBackendInternal({
534
+ config: { fpsCap: 1000, maxEventBytes: 1024 },
535
+ nativeShimModule: shim,
536
+ });
537
+ await backend.start();
538
+ // Submit a frame to generate some perf data in the worker
539
+ const drawlist = new Uint8Array(new ArrayBuffer(8));
540
+ drawlist.set([1, 2, 3, 4, 5, 6, 7, 8]);
541
+ await backend.requestFrame(drawlist);
542
+ // Get perf snapshot
543
+ const snapshot = await backend.perf.perfSnapshot();
544
+ // Verify structure
545
+ assert.ok(snapshot !== null && typeof snapshot === "object");
546
+ assert.ok("phases" in snapshot);
547
+ assert.ok(typeof snapshot.phases === "object");
548
+ // Each phase should have the expected structure if present
549
+ for (const [phase, stats] of Object.entries(snapshot.phases)) {
550
+ assert.ok(typeof phase === "string");
551
+ assert.ok(stats !== null && typeof stats === "object");
552
+ if (stats) {
553
+ const s = stats;
554
+ if (s.count !== undefined)
555
+ assert.ok(typeof s.count === "number" && s.count >= 0);
556
+ if (s.avg !== undefined)
557
+ assert.ok(typeof s.avg === "number");
558
+ if (s.p50 !== undefined)
559
+ assert.ok(typeof s.p50 === "number");
560
+ if (s.p95 !== undefined)
561
+ assert.ok(typeof s.p95 === "number");
562
+ if (s.max !== undefined)
563
+ assert.ok(typeof s.max === "number");
564
+ }
565
+ }
566
+ await backend.stop();
567
+ backend.dispose();
568
+ });
569
+ //# sourceMappingURL=worker_integration.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker_integration.test.js","sourceRoot":"","sources":["../../src/__tests__/worker_integration.test.ts"],"names":[],"mappings":"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"}