Files
openchamber/packages/web/server/lib/terminal/index.js
T
YifanandBohdan Triapitsyn 2b70ec6f3a feat(terminal): switch terminal transport to pure websocket with fallback (#762)
* feat(terminal): add resumable websocket transport

Unify terminal input and stream traffic on `/api/terminal/ws` with a v2 control-frame protocol and advertised transport capabilities.

Buffer recent PTY output on the server so rebinding clients can replay missed chunks after reconnects or startup races, while keeping SSE as a fallback stream path.

Update the web terminal client and store to negotiate the new transport, track tab lifecycle, and avoid reopening exited sessions when restoring tabs.

* fix(terminal): retry rehydrated websocket reconnects

* fix(terminal): keep reconnect retries silent

* fix(terminal): wire ws stream output and replay in runtime

* fix(web): enable ws proxy for /api in dev

---------

Co-authored-by: Bohdan Triapitsyn <artmore@protonmail.com>
2026-04-01 19:31:21 +03:00

32 lines
1.1 KiB
JavaScript

export {
TERMINAL_WS_PATH,
TERMINAL_WS_CONTROL_TAG_JSON,
TERMINAL_WS_MAX_PAYLOAD_BYTES,
isTerminalWsPathname,
parseRequestPathname,
normalizeTerminalWsMessageToBuffer,
normalizeTerminalWsMessageToText,
readTerminalWsControlFrame,
createTerminalWsControlFrame,
pruneRebindTimestamps,
isRebindRateLimited,
} from './terminal-ws-protocol.js';
export {
TERMINAL_WS_PATH as TERMINAL_INPUT_WS_PATH,
TERMINAL_WS_CONTROL_TAG_JSON as TERMINAL_INPUT_WS_CONTROL_TAG_JSON,
TERMINAL_WS_MAX_PAYLOAD_BYTES as TERMINAL_INPUT_WS_MAX_PAYLOAD_BYTES,
normalizeTerminalWsMessageToBuffer as normalizeTerminalInputWsMessageToBuffer,
normalizeTerminalWsMessageToText as normalizeTerminalInputWsMessageToText,
readTerminalWsControlFrame as readTerminalInputWsControlFrame,
createTerminalWsControlFrame as createTerminalInputWsControlFrame,
} from './terminal-ws-protocol.js';
export {
TERMINAL_OUTPUT_REPLAY_MAX_BYTES,
createTerminalOutputReplayBuffer,
appendTerminalOutputReplayChunk,
listTerminalOutputReplayChunksSince,
getLatestTerminalOutputReplayChunkId,
} from './output-replay-buffer.js';