@mmmbuto/nexuscrew 0.9.39 → 0.9.40
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 +10 -0
- package/frontend/dist/assets/index-BJBurY16.js +169 -0
- package/frontend/dist/index.html +1 -1
- package/frontend/dist/version.json +1 -1
- package/lib/config.js +38 -4
- package/lib/proxy/federation.js +262 -5
- package/lib/server.js +27 -4
- package/lib/ws/bridge.js +64 -4
- package/package.json +1 -1
- package/frontend/dist/assets/index-Dhmlcepq.js +0 -167
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,16 @@ All notable changes to NexusCrew are tracked here.
|
|
|
4
4
|
|
|
5
5
|
## Unreleased
|
|
6
6
|
|
|
7
|
+
## 0.9.40 — 2026-09-21
|
|
8
|
+
|
|
9
|
+
- **Deck rail keeps its order while owners answer at different times.** A background owner refresh used to rebuild the list by appending that owner's decks, so with several owners answering at different moments each group jumped to the end on every answer and the rail visibly reshuffled. The merge now replaces each deck in place (same id, same index), appends only genuinely new decks, and still drops the ones the owner no longer lists.
|
|
10
|
+
- **A half-open terminal connection is now noticed by the client itself.** The client sends an application ping on a cadence and, if it sees neither data nor a pong within the silence budget, closes and reconnects instead of waiting for a close that a dead tunnel never sends. The bridge always answers a ping, even on a silent session, without touching the PTY.
|
|
11
|
+
- **The terminal stream resumes by sequence.** Output frames are numbered and the bridge keeps a bounded ring per session, so a client that comes back asks for just the missing stretch; when the gap is not covered, it asks for a repaint from the pane instead of being handed a partial delta. No duplicated output.
|
|
12
|
+
- **The hub keeps a federated attach alive while the client is away.** Wired into the server (one store per server, its grace and ring size from the config), on a client drop the upstream attach is retained for a grace window and its output is buffered, so a client returning with the same identity (same token fingerprint, same route, same session) resumes the same attach without opening a new one; a different identity, an unknown id or an expired grace opens a new attach. Bounded: at most eight retained attaches, the oldest closed first. If the upstream dies while the client is attached, the client is told at once with the same readable close instead of waiting for the liveness budget. The attach id is 128 random bits per session and node, kept in sessionStorage (never on disk) and carried only in the upgrade query — the proxy never unmasks frames — and the token is compared by fingerprint, never held in clear.
|
|
13
|
+
- **Keystrokes typed while the channel is down are queued, not lost.** Input is buffered up to a small cap and delivered in order when the link returns; beyond the cap it is refused explicitly rather than dropped silently. The reconnecting overlay states how much is queued.
|
|
14
|
+
- **The reconnecting overlay appears only after a second, and the view is preserved.** A shorter blip no longer makes the terminal flicker; after a repaint the reader keeps their scroll position instead of being pulled to the bottom, and a discreet boundary line marks the restore only when the overlay was actually shown.
|
|
15
|
+
- **The terminal parameters are configurable and they act.** Under `terminal` in the server config (per-key merge, exposed by the config API, with documented defaults): `retryBaseMs` and `retryMaxMs` (reconnect backoff), `pingMs` and `deadMs` (liveness and silence budget), `queuedInputBytes` (input queued during a reconnect), `overlayDelayMs` (when the reconnecting overlay appears), `captureLines` (how much the resync repaints from the pane), `outputRingBytes` (the resume ring on the owning node) and `hubGraceMs` (how long the hub retains a federated attach). A value that is missing, non-numeric or not positive falls back to its default, so a bad config degrades to the known behaviour instead of breaking the terminal.
|
|
16
|
+
|
|
7
17
|
## 0.9.39 — 2026-09-21
|
|
8
18
|
|
|
9
19
|
- **Deck rail and terminals stay put across topology blips and reconnects.** The owner list and the remote decks are now sticky state: a failed or empty poll never clears them, and an owner missing from a confirmed answer stays in the rail as stale until it is removed explicitly or a long grace expires. The deck refresh keeps the previous data (marked as a late update) instead of emptying the list, and a confirmed answer without the deck — or an explicit refusal — is what removes it. The last good deck list is cached so a page reload does not start from an empty rail.
|