@rezi-ui/node 0.1.0-alpha.3 → 0.1.0-alpha.31

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 (73) hide show
  1. package/README.md +26 -6
  2. package/dist/backend/emojiWidthPolicy.d.ts +15 -0
  3. package/dist/backend/emojiWidthPolicy.d.ts.map +1 -0
  4. package/dist/backend/emojiWidthPolicy.js +229 -0
  5. package/dist/backend/emojiWidthPolicy.js.map +1 -0
  6. package/dist/backend/nodeBackend.d.ts +29 -1
  7. package/dist/backend/nodeBackend.d.ts.map +1 -1
  8. package/dist/backend/nodeBackend.js +186 -16
  9. package/dist/backend/nodeBackend.js.map +1 -1
  10. package/dist/backend/nodeBackendInline.d.ts.map +1 -1
  11. package/dist/backend/nodeBackendInline.js +175 -15
  12. package/dist/backend/nodeBackendInline.js.map +1 -1
  13. package/dist/backend/terminalProfile.d.ts +5 -0
  14. package/dist/backend/terminalProfile.d.ts.map +1 -0
  15. package/dist/backend/terminalProfile.js +117 -0
  16. package/dist/backend/terminalProfile.js.map +1 -0
  17. package/dist/dev/hotStateReload.d.ts +65 -0
  18. package/dist/dev/hotStateReload.d.ts.map +1 -0
  19. package/dist/dev/hotStateReload.js +438 -0
  20. package/dist/dev/hotStateReload.js.map +1 -0
  21. package/dist/dev/nodeAppHotReload.d.ts +11 -0
  22. package/dist/dev/nodeAppHotReload.d.ts.map +1 -0
  23. package/dist/dev/nodeAppHotReload.js +78 -0
  24. package/dist/dev/nodeAppHotReload.js.map +1 -0
  25. package/dist/image.d.ts +2 -0
  26. package/dist/image.d.ts.map +1 -0
  27. package/dist/image.js +16 -0
  28. package/dist/image.js.map +1 -0
  29. package/dist/index.d.ts +44 -0
  30. package/dist/index.d.ts.map +1 -1
  31. package/dist/index.js +189 -0
  32. package/dist/index.js.map +1 -1
  33. package/dist/repro/index.d.ts +3 -0
  34. package/dist/repro/index.d.ts.map +1 -0
  35. package/dist/repro/index.js +2 -0
  36. package/dist/repro/index.js.map +1 -0
  37. package/dist/repro/recorder.d.ts +31 -0
  38. package/dist/repro/recorder.d.ts.map +1 -0
  39. package/dist/repro/recorder.js +326 -0
  40. package/dist/repro/recorder.js.map +1 -0
  41. package/dist/streams/tail.d.ts +6 -0
  42. package/dist/streams/tail.d.ts.map +1 -0
  43. package/dist/streams/tail.js +113 -0
  44. package/dist/streams/tail.js.map +1 -0
  45. package/dist/worker/engineWorker.js +28 -0
  46. package/dist/worker/engineWorker.js.map +1 -1
  47. package/dist/worker/protocol.d.ts +3 -0
  48. package/dist/worker/protocol.d.ts.map +1 -1
  49. package/dist/worker/testShims/invalidPollBytesNative.d.ts +22 -0
  50. package/dist/worker/testShims/invalidPollBytesNative.d.ts.map +1 -0
  51. package/dist/worker/testShims/invalidPollBytesNative.js +65 -0
  52. package/dist/worker/testShims/invalidPollBytesNative.js.map +1 -0
  53. package/dist/worker/testShims/limitsExpectNative.d.ts +22 -0
  54. package/dist/worker/testShims/limitsExpectNative.d.ts.map +1 -0
  55. package/dist/worker/testShims/limitsExpectNative.js +85 -0
  56. package/dist/worker/testShims/limitsExpectNative.js.map +1 -0
  57. package/dist/worker/testShims/limitsNative.d.ts +22 -0
  58. package/dist/worker/testShims/limitsNative.d.ts.map +1 -0
  59. package/dist/worker/testShims/limitsNative.js +90 -0
  60. package/dist/worker/testShims/limitsNative.js.map +1 -0
  61. package/package.json +12 -8
  62. package/dist/__e2e__/fixtures/terminal-app.d.ts +0 -2
  63. package/dist/__e2e__/fixtures/terminal-app.d.ts.map +0 -1
  64. package/dist/__e2e__/fixtures/terminal-app.js +0 -42
  65. package/dist/__e2e__/fixtures/terminal-app.js.map +0 -1
  66. package/dist/__e2e__/terminal-render.e2e.test.d.ts +0 -2
  67. package/dist/__e2e__/terminal-render.e2e.test.d.ts.map +0 -1
  68. package/dist/__e2e__/terminal-render.e2e.test.js +0 -125
  69. package/dist/__e2e__/terminal-render.e2e.test.js.map +0 -1
  70. package/dist/__tests__/worker_integration.test.d.ts +0 -2
  71. package/dist/__tests__/worker_integration.test.d.ts.map +0 -1
  72. package/dist/__tests__/worker_integration.test.js +0 -569
  73. package/dist/__tests__/worker_integration.test.js.map +0 -1
@@ -0,0 +1,326 @@
1
+ import { performance } from "node:perf_hooks";
2
+ import { BACKEND_DRAWLIST_V2_MARKER, BACKEND_FPS_CAP_MARKER, BACKEND_MAX_EVENT_BYTES_MARKER, REPRO_BUNDLE_SCHEMA_V1, REPRO_EVENT_CAPTURE_ORDERING_POLL, REPRO_EVENT_CAPTURE_TIMING_STEP_DELTA_MS, REPRO_EVENT_CAPTURE_TRUNCATION_MODE_DROP_TAIL_BATCH, REPRO_TIMING_CLOCK_MONOTONIC_MS, REPRO_TIMING_MODEL_KIND_DETERMINISTIC, REPRO_TIMING_REPLAY_STRATEGY_RECORDED_DELTA, REPRO_TIMING_UNIT_MS, exportReproBundleBytes, parseEventBatchV1, } from "@rezi-ui/core";
3
+ const DEFAULT_MAX_BATCHES = 256;
4
+ const DEFAULT_MAX_EVENTS = 8192;
5
+ const DEFAULT_MAX_BYTES = 4 * 1024 * 1024;
6
+ const DEFAULT_MAX_EVENT_BYTES = 1024 * 1024;
7
+ const DEFAULT_FPS_CAP = 60;
8
+ function normalizeNonNegativeInteger(value, fallback) {
9
+ if (typeof value !== "number")
10
+ return fallback;
11
+ if (!Number.isFinite(value))
12
+ return fallback;
13
+ if (!Number.isInteger(value))
14
+ return fallback;
15
+ if (value < 0)
16
+ return fallback;
17
+ return value;
18
+ }
19
+ function normalizePositiveInteger(value, fallback) {
20
+ if (typeof value !== "number")
21
+ return fallback;
22
+ if (!Number.isFinite(value))
23
+ return fallback;
24
+ if (!Number.isInteger(value))
25
+ return fallback;
26
+ if (value <= 0)
27
+ return fallback;
28
+ return value;
29
+ }
30
+ function normalizeClockSample(value) {
31
+ if (!Number.isFinite(value))
32
+ return 0;
33
+ const floored = Math.floor(value);
34
+ if (floored < 0)
35
+ return 0;
36
+ return floored;
37
+ }
38
+ function toLowerHex(bytes) {
39
+ const out = new Array(bytes.byteLength);
40
+ for (let i = 0; i < bytes.byteLength; i++) {
41
+ out[i] = bytes[i]?.toString(16).padStart(2, "0") ?? "00";
42
+ }
43
+ return out.join("");
44
+ }
45
+ function cloneTerminalCaps(caps) {
46
+ if (caps === null)
47
+ return null;
48
+ return {
49
+ colorMode: caps.colorMode,
50
+ supportsMouse: caps.supportsMouse,
51
+ supportsBracketedPaste: caps.supportsBracketedPaste,
52
+ supportsFocusEvents: caps.supportsFocusEvents,
53
+ supportsOsc52: caps.supportsOsc52,
54
+ supportsSyncUpdate: caps.supportsSyncUpdate,
55
+ supportsScrollRegion: caps.supportsScrollRegion,
56
+ supportsCursorShape: caps.supportsCursorShape,
57
+ supportsOutputWaitWritable: caps.supportsOutputWaitWritable,
58
+ supportsUnderlineStyles: caps.supportsUnderlineStyles,
59
+ supportsColoredUnderlines: caps.supportsColoredUnderlines,
60
+ supportsHyperlinks: caps.supportsHyperlinks,
61
+ sgrAttrsSupported: caps.sgrAttrsSupported,
62
+ };
63
+ }
64
+ function buildBackendCapsSnapshot(backend, bounds, overrides) {
65
+ const rec = backend;
66
+ const markerMaxEventBytes = rec[BACKEND_MAX_EVENT_BYTES_MARKER];
67
+ const markerFpsCap = rec[BACKEND_FPS_CAP_MARKER];
68
+ const markerUseV2 = rec[BACKEND_DRAWLIST_V2_MARKER] === true;
69
+ const maxEventBytes = normalizePositiveInteger(overrides?.maxEventBytes ?? markerMaxEventBytes, bounds.maxBytes > 0 ? bounds.maxBytes : DEFAULT_MAX_EVENT_BYTES);
70
+ const fpsCap = normalizePositiveInteger(overrides?.fpsCap ?? markerFpsCap, DEFAULT_FPS_CAP);
71
+ const cursorProtocolVersion = overrides?.cursorProtocolVersion === 1 || overrides?.cursorProtocolVersion === 2
72
+ ? overrides.cursorProtocolVersion
73
+ : markerUseV2
74
+ ? 2
75
+ : 1;
76
+ return {
77
+ maxEventBytes,
78
+ fpsCap,
79
+ cursorProtocolVersion,
80
+ };
81
+ }
82
+ function createMutableState() {
83
+ return {
84
+ batches: [],
85
+ capturedBatches: 0,
86
+ capturedEvents: 0,
87
+ capturedBytes: 0,
88
+ omittedBatches: 0,
89
+ omittedEvents: 0,
90
+ omittedBytes: 0,
91
+ runtimeDroppedBatches: 0,
92
+ truncated: false,
93
+ truncationReason: null,
94
+ firstOmittedStep: null,
95
+ baseTimeMs: null,
96
+ lastCapturedTimeMs: null,
97
+ };
98
+ }
99
+ function buildEventCaptureSnapshot(state, bounds) {
100
+ return {
101
+ ordering: REPRO_EVENT_CAPTURE_ORDERING_POLL,
102
+ timing: REPRO_EVENT_CAPTURE_TIMING_STEP_DELTA_MS,
103
+ bounds: {
104
+ maxBatches: bounds.maxBatches,
105
+ maxEvents: bounds.maxEvents,
106
+ maxBytes: bounds.maxBytes,
107
+ },
108
+ totals: {
109
+ capturedBatches: state.capturedBatches,
110
+ capturedEvents: state.capturedEvents,
111
+ capturedBytes: state.capturedBytes,
112
+ runtimeDroppedBatches: state.runtimeDroppedBatches,
113
+ omittedBatches: state.omittedBatches,
114
+ omittedEvents: state.omittedEvents,
115
+ omittedBytes: state.omittedBytes,
116
+ },
117
+ truncation: {
118
+ mode: REPRO_EVENT_CAPTURE_TRUNCATION_MODE_DROP_TAIL_BATCH,
119
+ truncated: state.truncated,
120
+ reason: state.truncationReason,
121
+ firstOmittedStep: state.firstOmittedStep,
122
+ },
123
+ batches: state.batches.slice(),
124
+ };
125
+ }
126
+ function parseBatchMetadata(bytes) {
127
+ const parsed = parseEventBatchV1(bytes);
128
+ if (!parsed.ok) {
129
+ return {
130
+ eventCount: 0,
131
+ resizeEvents: [],
132
+ };
133
+ }
134
+ const events = parsed.value.events;
135
+ const resizeEvents = [];
136
+ for (let i = 0; i < events.length; i++) {
137
+ const event = events[i];
138
+ if (event?.kind !== "resize")
139
+ continue;
140
+ resizeEvents.push({
141
+ eventIndex: i,
142
+ cols: event.cols,
143
+ rows: event.rows,
144
+ timeMs: normalizeClockSample(event.timeMs),
145
+ });
146
+ }
147
+ return {
148
+ eventCount: events.length,
149
+ resizeEvents,
150
+ };
151
+ }
152
+ function copyBatchBytes(batch) {
153
+ const out = new Uint8Array(batch.bytes.byteLength);
154
+ out.set(batch.bytes);
155
+ return out;
156
+ }
157
+ export function createReproRecorder(backend, options = {}) {
158
+ const bounds = {
159
+ maxBatches: normalizeNonNegativeInteger(options.bounds?.maxBatches, DEFAULT_MAX_BATCHES),
160
+ maxEvents: normalizeNonNegativeInteger(options.bounds?.maxEvents, DEFAULT_MAX_EVENTS),
161
+ maxBytes: normalizeNonNegativeInteger(options.bounds?.maxBytes, DEFAULT_MAX_BYTES),
162
+ };
163
+ const backendCaps = buildBackendCapsSnapshot(backend, bounds, options.backendCaps);
164
+ const now = options.clock ?? (() => performance.now());
165
+ let cachedTerminalCaps = options.terminalCaps !== undefined ? cloneTerminalCaps(options.terminalCaps) : undefined;
166
+ const state = createMutableState();
167
+ const originalPollEvents = backend.pollEvents.bind(backend);
168
+ const originalGetCaps = backend.getCaps.bind(backend);
169
+ async function resolveTerminalCaps() {
170
+ if (cachedTerminalCaps !== undefined) {
171
+ return cloneTerminalCaps(cachedTerminalCaps);
172
+ }
173
+ try {
174
+ const caps = await originalGetCaps();
175
+ cachedTerminalCaps = cloneTerminalCaps(caps);
176
+ return cloneTerminalCaps(cachedTerminalCaps);
177
+ }
178
+ catch {
179
+ cachedTerminalCaps = null;
180
+ return null;
181
+ }
182
+ }
183
+ function appendOmittedBatch(eventCount, byteLength) {
184
+ state.omittedBatches += 1;
185
+ state.omittedEvents += eventCount;
186
+ state.omittedBytes += byteLength;
187
+ }
188
+ function markTruncated(reason) {
189
+ if (state.truncated)
190
+ return;
191
+ state.truncated = true;
192
+ state.truncationReason = reason;
193
+ state.firstOmittedStep = state.capturedBatches;
194
+ }
195
+ function recordCapturedBatch(byteLength, bytesHex, droppedBatches, eventCount, resizeEvents) {
196
+ const nowMs = normalizeClockSample(now());
197
+ if (state.baseTimeMs === null) {
198
+ state.baseTimeMs = nowMs;
199
+ }
200
+ const deltaMs = state.lastCapturedTimeMs === null ? 0 : Math.max(0, nowMs - state.lastCapturedTimeMs);
201
+ state.lastCapturedTimeMs = nowMs;
202
+ state.batches.push({
203
+ step: state.capturedBatches,
204
+ deltaMs,
205
+ byteLength,
206
+ bytesHex,
207
+ eventCount,
208
+ droppedBatches,
209
+ resizeEvents: resizeEvents.slice(),
210
+ });
211
+ state.capturedBatches += 1;
212
+ state.capturedEvents += eventCount;
213
+ state.capturedBytes += byteLength;
214
+ }
215
+ function observeBatch(bytes, droppedBatches) {
216
+ const byteLength = bytes.byteLength;
217
+ const { eventCount, resizeEvents } = parseBatchMetadata(bytes);
218
+ state.runtimeDroppedBatches += droppedBatches;
219
+ if (state.truncated) {
220
+ appendOmittedBatch(eventCount, byteLength);
221
+ return;
222
+ }
223
+ if (state.capturedBatches >= bounds.maxBatches) {
224
+ markTruncated("max-batches");
225
+ appendOmittedBatch(eventCount, byteLength);
226
+ return;
227
+ }
228
+ if (state.capturedEvents + eventCount > bounds.maxEvents) {
229
+ markTruncated("max-events");
230
+ appendOmittedBatch(eventCount, byteLength);
231
+ return;
232
+ }
233
+ if (state.capturedBytes + byteLength > bounds.maxBytes) {
234
+ markTruncated("max-bytes");
235
+ appendOmittedBatch(eventCount, byteLength);
236
+ return;
237
+ }
238
+ recordCapturedBatch(byteLength, toLowerHex(bytes), droppedBatches, eventCount, resizeEvents);
239
+ }
240
+ const wrapped = Object.create(Object.getPrototypeOf(backend));
241
+ Object.defineProperties(wrapped, Object.getOwnPropertyDescriptors(backend));
242
+ Object.defineProperties(wrapped, {
243
+ pollEvents: {
244
+ value: async () => {
245
+ const batch = await originalPollEvents();
246
+ observeBatch(copyBatchBytes(batch), batch.droppedBatches);
247
+ return batch;
248
+ },
249
+ writable: false,
250
+ enumerable: true,
251
+ configurable: true,
252
+ },
253
+ getCaps: {
254
+ value: async () => {
255
+ const caps = await originalGetCaps();
256
+ cachedTerminalCaps = cloneTerminalCaps(caps);
257
+ return caps;
258
+ },
259
+ writable: false,
260
+ enumerable: true,
261
+ configurable: true,
262
+ },
263
+ });
264
+ async function buildBundle() {
265
+ const terminalCaps = await resolveTerminalCaps();
266
+ const eventCapture = buildEventCaptureSnapshot(state, bounds);
267
+ return {
268
+ schema: REPRO_BUNDLE_SCHEMA_V1,
269
+ captureConfig: {
270
+ captureRawEvents: true,
271
+ captureDrawlistBytes: false,
272
+ maxEventBytes: backendCaps.maxEventBytes,
273
+ maxDrawlistBytes: 0,
274
+ maxFrames: bounds.maxBatches,
275
+ fpsCap: backendCaps.fpsCap,
276
+ cursorProtocolVersion: backendCaps.cursorProtocolVersion,
277
+ },
278
+ capsSnapshot: {
279
+ terminalCaps,
280
+ backendCaps,
281
+ },
282
+ timingModel: {
283
+ kind: REPRO_TIMING_MODEL_KIND_DETERMINISTIC,
284
+ clock: REPRO_TIMING_CLOCK_MONOTONIC_MS,
285
+ replayStrategy: REPRO_TIMING_REPLAY_STRATEGY_RECORDED_DELTA,
286
+ timeUnit: REPRO_TIMING_UNIT_MS,
287
+ baseTimeMs: state.baseTimeMs ?? 0,
288
+ },
289
+ eventCapture,
290
+ };
291
+ }
292
+ async function buildBytes() {
293
+ return exportReproBundleBytes(await buildBundle());
294
+ }
295
+ async function build() {
296
+ const bundle = await buildBundle();
297
+ return {
298
+ bundle,
299
+ bytes: exportReproBundleBytes(bundle),
300
+ };
301
+ }
302
+ function reset() {
303
+ state.batches.length = 0;
304
+ state.capturedBatches = 0;
305
+ state.capturedEvents = 0;
306
+ state.capturedBytes = 0;
307
+ state.omittedBatches = 0;
308
+ state.omittedEvents = 0;
309
+ state.omittedBytes = 0;
310
+ state.runtimeDroppedBatches = 0;
311
+ state.truncated = false;
312
+ state.truncationReason = null;
313
+ state.firstOmittedStep = null;
314
+ state.baseTimeMs = null;
315
+ state.lastCapturedTimeMs = null;
316
+ }
317
+ return {
318
+ backend: wrapped,
319
+ buildBundle,
320
+ buildBytes,
321
+ build,
322
+ snapshot: () => buildEventCaptureSnapshot(state, bounds),
323
+ reset,
324
+ };
325
+ }
326
+ //# sourceMappingURL=recorder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recorder.js","sourceRoot":"","sources":["../../src/repro/recorder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { TailSourceFactory } from "@rezi-ui/core";
2
+ /**
3
+ * Node.js tail source factory for `useTail`.
4
+ */
5
+ export declare const createNodeTailSource: TailSourceFactory<string>;
6
+ //# sourceMappingURL=tail.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tail.d.ts","sourceRoot":"","sources":["../../src/streams/tail.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAc,iBAAiB,EAAE,MAAM,eAAe,CAAC;AA2CnE;;GAEG;AACH,eAAO,MAAM,oBAAoB,EAAE,iBAAiB,CAAC,MAAM,CAmF1D,CAAC"}
@@ -0,0 +1,113 @@
1
+ import { open, stat } from "node:fs/promises";
2
+ const DEFAULT_POLL_MS = 200;
3
+ const READ_CHUNK_BYTES = 64 * 1024;
4
+ function normalizePositiveInteger(value, fallback) {
5
+ if (!Number.isFinite(value) || value <= 0)
6
+ return fallback;
7
+ return Math.floor(value);
8
+ }
9
+ function isNodeErrorWithCode(error) {
10
+ if (!error || typeof error !== "object")
11
+ return false;
12
+ const code = error.code;
13
+ return typeof code === "string";
14
+ }
15
+ async function readUtf8Slice(filePath, start, end) {
16
+ if (end <= start)
17
+ return "";
18
+ const handle = await open(filePath, "r");
19
+ let offset = start;
20
+ let output = "";
21
+ try {
22
+ while (offset < end) {
23
+ const bytesToRead = Math.min(READ_CHUNK_BYTES, end - offset);
24
+ const buffer = Buffer.allocUnsafe(bytesToRead);
25
+ const { bytesRead } = await handle.read(buffer, 0, bytesToRead, offset);
26
+ if (bytesRead <= 0)
27
+ break;
28
+ output += buffer.toString("utf8", 0, bytesRead);
29
+ offset += bytesRead;
30
+ }
31
+ return output;
32
+ }
33
+ finally {
34
+ await handle.close();
35
+ }
36
+ }
37
+ /**
38
+ * Node.js tail source factory for `useTail`.
39
+ */
40
+ export const createNodeTailSource = (filePath, options) => {
41
+ const pollMs = normalizePositiveInteger(options.pollMs, DEFAULT_POLL_MS);
42
+ const fromEnd = options.fromEnd;
43
+ let closed = false;
44
+ let sleepState = { timer: null, resolve: null };
45
+ const wakeSleep = () => {
46
+ if (sleepState.timer !== null) {
47
+ clearTimeout(sleepState.timer);
48
+ }
49
+ if (sleepState.resolve) {
50
+ sleepState.resolve();
51
+ }
52
+ sleepState = { timer: null, resolve: null };
53
+ };
54
+ const sleep = async (ms) => {
55
+ if (ms <= 0)
56
+ return;
57
+ await new Promise((resolve) => {
58
+ const timer = setTimeout(() => {
59
+ sleepState = { timer: null, resolve: null };
60
+ resolve();
61
+ }, ms);
62
+ sleepState = { timer, resolve };
63
+ });
64
+ };
65
+ async function* iterator() {
66
+ let initialized = false;
67
+ let offset = 0;
68
+ let carry = "";
69
+ while (!closed) {
70
+ let fileSize;
71
+ try {
72
+ const stats = await stat(filePath);
73
+ fileSize = Number(stats.size);
74
+ }
75
+ catch (error) {
76
+ if (isNodeErrorWithCode(error) && error.code === "ENOENT") {
77
+ await sleep(pollMs);
78
+ continue;
79
+ }
80
+ throw error;
81
+ }
82
+ if (!initialized) {
83
+ initialized = true;
84
+ offset = fromEnd ? fileSize : 0;
85
+ }
86
+ if (fileSize < offset) {
87
+ // File was truncated/rotated.
88
+ offset = 0;
89
+ carry = "";
90
+ }
91
+ if (fileSize > offset) {
92
+ const delta = await readUtf8Slice(filePath, offset, fileSize);
93
+ offset = fileSize;
94
+ const segments = `${carry}${delta}`.split(/\r?\n/);
95
+ carry = segments.pop() ?? "";
96
+ for (const line of segments) {
97
+ if (closed)
98
+ return;
99
+ yield line;
100
+ }
101
+ }
102
+ await sleep(pollMs);
103
+ }
104
+ }
105
+ return {
106
+ [Symbol.asyncIterator]: iterator,
107
+ close: () => {
108
+ closed = true;
109
+ wakeSleep();
110
+ },
111
+ };
112
+ };
113
+ //# sourceMappingURL=tail.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tail.js","sourceRoot":"","sources":["../../src/streams/tail.ts"],"names":[],"mappings":"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"}
@@ -13,6 +13,8 @@ import { EVENT_POOL_SIZE, FRAME_SAB_CONTROL_CONSUMED_SEQ_WORD, FRAME_SAB_CONTROL
13
13
  * Only active when REZI_PERF=1.
14
14
  */
15
15
  const PERF_ENABLED = process.env.REZI_PERF === "1";
16
+ const ZR_ERR_LIMIT = -3;
17
+ const IS_BUN_RUNTIME = typeof globalThis.Bun !== "undefined";
16
18
  const perfSamples = [];
17
19
  const PERF_MAX_SAMPLES = 1024;
18
20
  function perfRecord(phase, durationMs) {
@@ -437,6 +439,13 @@ function shutdownNow() {
437
439
  // Let worker thread exit naturally once handles are cleared.
438
440
  if (parentPort !== null)
439
441
  parentPort.close();
442
+ // Bun worker_threads can keep the worker alive after parentPort.close().
443
+ // Force a clean worker exit after sending shutdownComplete.
444
+ if (IS_BUN_RUNTIME) {
445
+ setImmediate(() => {
446
+ process.exit(0);
447
+ });
448
+ }
440
449
  }
441
450
  function tick() {
442
451
  if (!running)
@@ -569,6 +578,22 @@ function tick() {
569
578
  if (PERF_ENABLED) {
570
579
  perfRecord("event_poll", performance.now() - pollStart);
571
580
  }
581
+ if (written === ZR_ERR_LIMIT) {
582
+ if (outBuf !== discard)
583
+ eventPool.push(outBuf);
584
+ // Oversized event batch for configured maxEventBytes: recover by dropping
585
+ // this batch and continuing the pump without aborting the backend.
586
+ droppedSinceLast++;
587
+ didEventWork = true;
588
+ break;
589
+ }
590
+ if (!Number.isInteger(written) || written > outBuf.byteLength) {
591
+ if (outBuf !== discard)
592
+ eventPool.push(outBuf);
593
+ fatal("enginePollEvents", -1, `engine_poll_events returned invalid byte count: written=${String(written)} capacity=${String(outBuf.byteLength)}`);
594
+ running = false;
595
+ return;
596
+ }
572
597
  if (written < 0) {
573
598
  if (outBuf !== discard)
574
599
  eventPool.push(outBuf);
@@ -816,6 +841,9 @@ function onMessage(msg) {
816
841
  supportsScrollRegion: caps.supportsScrollRegion,
817
842
  supportsCursorShape: caps.supportsCursorShape,
818
843
  supportsOutputWaitWritable: caps.supportsOutputWaitWritable,
844
+ supportsUnderlineStyles: caps.supportsUnderlineStyles ?? false,
845
+ supportsColoredUnderlines: caps.supportsColoredUnderlines ?? false,
846
+ supportsHyperlinks: caps.supportsHyperlinks ?? false,
819
847
  sgrAttrsSupported: caps.sgrAttrsSupported,
820
848
  });
821
849
  }