Neil and Orca
79ec57d045
perf(relay): keep the PTY replay window as chunks, not a re-sliced string ( #10900 )
...
* perf(relay): keep the PTY replay window as chunks, not a re-sliced string
appendReplayBuffer did `buffered += data` then `buffered.slice(-REPLAY_BUFFER_MAX)`
once over the 100KB cap. It runs per raw node-pty emission -- before batching --
so once a PTY saturates the window (which a long-lived shell does almost
immediately) every subsequent chunk copied the whole 100KB.
Reuse RecentPtyOutputBuffer, which already solved this shape in the main process:
keep chunks, drop from the head, defer the join to read(). The relay's three
readers are attach, adopt, and revive only.
66-205x on the append path, per PTY, on the user's SSH host.
RecentPtyOutputBuffer's limit is now configurable, because the relay retains
100KB where the main process retains 64KB. One arithmetic branch still used the
hardcoded constant after that change and silently under-retained (100,800 of
102,400 code units); the equivalence tests caught it before it shipped, and the
suite now pins the configured limit directly.
Co-authored-by: Orca <help@stably.ai >
* test(relay): exercise a real surrogate split; drop eval from the benchmark
Review feedback, both valid:
- The surrogate test never split a pair. The cap is even and a pair is two code
units, so an emoji run alone always cuts on a pair boundary. A trailing single
unit shifts the cut mid-pair, leaving a dangling low surrogate (0xDE00) --
asserted directly now, with the boundary-aligned case kept as its own test.
- Parse REPLAY_BUFFER_MAX as a product instead of eval(). The regex already
admits only digits, spaces and `*`, and eval tripped Biome's noGlobalEval
regardless of the eslint suppression.
Co-authored-by: Orca <help@stably.ai >
---------
Co-authored-by: Orca <help@stably.ai >
2026-07-27 16:40:59 -07:00
..
2026-07-10 19:08:12 -07:00
2026-07-20 14:34:53 -07:00
2026-07-26 13:20:23 -07:00
2026-07-12 23:43:07 -07:00
2026-06-22 19:13:32 -07:00
2026-07-12 23:43:07 -07:00
2026-06-09 15:59:17 -07:00
2026-06-29 23:37:30 -07:00
2026-07-27 16:36:39 -07:00
2026-07-27 16:36:39 -07:00
2026-07-12 02:13:41 -07:00
2026-07-08 22:21:40 -07:00
2026-07-20 19:09:18 -07:00
2026-07-13 18:58:21 -07:00
2026-07-15 13:26:42 -07:00
2026-06-29 23:37:30 -07:00
2026-07-06 17:12:27 -07:00
2026-07-06 17:12:27 -07:00
2026-07-26 22:28:19 -07:00
2026-07-26 22:28:19 -07:00
2026-07-03 22:32:11 -07:00
2026-07-03 19:58:07 -07:00
2026-05-20 10:38:23 -07:00
2026-06-03 16:59:02 -04:00
2026-07-13 00:48:51 -07:00
2026-07-13 00:48:51 -07:00
2026-07-23 17:44:43 -07:00
2026-07-27 03:08:19 -07:00
2026-06-09 15:59:17 -07:00
2026-07-20 14:34:53 -07:00
2026-07-20 14:34:53 -07:00
2026-07-20 14:34:53 -07:00
2026-07-26 20:20:12 -07:00
2026-06-22 19:13:32 -07:00
2026-07-23 18:35:31 -07:00
2026-07-22 11:43:01 -07:00
2026-06-07 17:49:01 -07:00
2026-06-07 17:49:01 -07:00
2026-07-03 20:53:16 -07:00
2026-07-03 20:53:16 -07:00
2026-07-19 20:25:52 -07:00
2026-07-27 12:31:37 -07:00
2026-07-27 12:31:37 -07:00
2026-06-02 11:49:00 -07:00
2026-07-27 16:36:39 -07:00
2026-07-27 13:32:29 -07:00
2026-07-27 13:32:29 -07:00
2026-07-27 13:32:29 -07:00
2026-07-19 21:59:22 -04:00
2026-07-19 21:59:22 -04:00
2026-06-05 01:15:54 -07:00
2026-07-22 11:43:01 -07:00
2026-07-22 11:43:01 -07:00
2026-07-24 23:29:55 -07:00
2026-07-24 23:29:55 -07:00
2026-07-10 17:27:47 -07:00
2026-07-10 17:27:47 -07:00
2026-07-22 23:10:19 -07:00
2026-07-27 13:32:29 -07:00
2026-07-26 20:31:52 -07:00
2026-06-28 21:16:02 -07:00
2026-06-15 12:56:22 -07:00
2026-06-29 23:37:30 -07:00
2026-07-27 13:32:29 -07:00
2026-07-27 13:32:29 -07:00
2026-06-03 23:42:33 -07:00
2026-06-04 16:11:51 -04:00
2026-06-03 12:48:00 -07:00
2026-06-28 19:43:18 -07:00
2026-06-28 19:43:18 -07:00
2026-06-28 19:43:18 -07:00
2026-06-18 21:26:12 -07:00
2026-07-24 00:26:39 -07:00
2026-07-24 00:26:39 -07:00
2026-06-17 15:14:35 -07:00
2026-06-17 19:21:42 -07:00
2026-06-19 15:52:05 -07:00
2026-06-21 21:23:36 -07:00
2026-07-25 19:43:29 -07:00
2026-06-29 23:37:30 -07:00
2026-06-19 15:52:05 -07:00
2026-06-09 15:59:17 -07:00
2026-06-09 15:59:17 -07:00
2026-06-19 17:14:55 -07:00
2026-06-29 11:56:26 -07:00
2026-06-17 15:14:35 -07:00
2026-06-17 15:14:35 -07:00
2026-06-19 15:52:05 -07:00
2026-06-29 11:56:26 -07:00
2026-06-10 19:24:16 -07:00
2026-06-17 15:14:35 -07:00
2026-07-12 23:43:07 -07:00
2026-06-19 15:52:05 -07:00
2026-06-16 10:41:50 -07:00
2026-06-17 15:14:35 -07:00
2026-06-09 15:59:17 -07:00
2026-07-17 17:25:55 -07:00
2026-07-10 19:08:12 -07:00
2026-07-27 16:36:39 -07:00
2026-07-27 16:36:39 -07:00
2026-06-02 21:15:00 -07:00
2026-05-28 20:41:10 -04:00
2026-06-28 21:19:10 -07:00
2026-06-28 23:40:55 -07:00
2026-07-26 20:31:55 -07:00
2026-06-22 01:07:16 -07:00
2026-06-22 01:07:16 -07:00
2026-07-20 19:09:18 -07:00
2026-07-22 11:43:01 -07:00
2026-05-15 05:44:25 -04:00
2026-07-27 12:31:37 -07:00
2026-07-27 12:31:37 -07:00
2026-07-22 11:43:01 -07:00
2026-07-27 12:31:37 -07:00
2026-07-27 13:32:29 -07:00
2026-07-27 13:32:29 -07:00
2026-07-27 16:26:43 -07:00
2026-07-27 13:32:29 -07:00
2026-07-27 13:32:29 -07:00
2026-07-27 13:32:29 -07:00
2026-05-30 13:09:17 -07:00
2026-05-30 21:46:13 -07:00
2026-05-30 21:46:13 -07:00
2026-07-22 00:22:36 -07:00
2026-07-22 00:22:36 -07:00
2026-07-27 16:40:59 -07:00
2026-07-12 21:34:59 -07:00
2026-06-30 16:36:59 -07:00
2026-07-25 03:50:25 -07:00
2026-07-25 03:50:25 -07:00
2026-07-23 20:20:00 -07:00
2026-07-23 20:20:00 -07:00
2026-07-23 20:20:00 -07:00
2026-07-23 20:20:00 -07:00
2026-07-23 20:20:00 -07:00
2026-07-12 23:43:07 -07:00
2026-07-26 13:19:23 -07:00
2026-07-02 18:41:23 -04:00
2026-07-27 15:48:39 -07:00
2026-07-27 15:48:39 -07:00
2026-07-20 14:34:53 -07:00
2026-07-20 14:34:53 -07:00
2026-06-22 01:07:16 -07:00
2026-07-27 12:31:37 -07:00
2026-07-27 13:32:29 -07:00
2026-07-22 18:52:37 -07:00
2026-07-20 14:34:53 -07:00
2026-06-29 23:37:30 -07:00
2026-05-16 17:44:42 -04:00
2026-07-20 21:36:15 -07:00
2026-07-10 17:27:47 -07:00
2026-07-22 18:25:05 -07:00
2026-06-30 16:36:59 -07:00
2026-06-22 16:42:20 -07:00
2026-06-07 04:15:26 -07:00
2026-07-12 23:50:00 -07:00
2026-06-07 11:01:02 -07:00
2026-07-10 17:27:47 -07:00
2026-07-10 17:27:47 -07:00
2026-06-22 01:07:16 -07:00
2026-07-12 18:15:15 -07:00
2026-07-15 15:23:35 -07:00
2026-07-21 18:23:20 -07:00
2026-07-12 02:13:41 -07:00
2026-07-26 22:26:49 -07:00
2026-07-27 01:02:48 -07:00
2026-07-10 17:27:47 -07:00
2026-06-22 19:13:32 -07:00
2026-07-27 02:20:56 -07:00
2026-06-29 22:38:29 -07:00
2026-06-22 19:13:32 -07:00
2026-06-22 19:13:32 -07:00
2026-07-10 17:27:47 -07:00
2026-07-26 15:32:33 -07:00
2026-06-29 23:37:30 -07:00
2026-06-29 23:37:30 -07:00
2026-06-29 23:37:30 -07:00
2026-07-13 00:26:22 -07:00
2026-06-28 22:58:27 -07:00
2026-07-23 18:35:31 -07:00
2026-06-07 17:49:01 -07:00
2026-07-22 19:11:44 -07:00
2026-07-22 19:11:44 -07:00
2026-07-20 14:34:53 -07:00
2026-07-27 01:14:33 -07:00
2026-07-27 01:14:33 -07:00
2026-06-29 23:37:30 -07:00
2026-04-09 12:28:52 -07:00
2026-07-09 16:09:09 -07:00
2026-07-09 16:09:09 -07:00
2026-07-27 01:14:33 -07:00
2026-07-27 01:14:33 -07:00
2026-07-05 23:56:37 -07:00
2026-06-22 01:07:16 -07:00
2026-07-16 14:47:28 -07:00
2026-06-29 23:37:30 -07:00
2026-06-29 22:38:29 -07:00
2026-07-02 12:11:58 -07:00
2026-07-02 12:11:58 -07:00
2026-07-19 11:27:29 -07:00
2026-07-19 20:25:52 -07:00
2026-07-27 15:48:39 -07:00
2026-07-20 19:09:18 -07:00
2026-06-09 10:43:04 -07:00