From d1c067709b56b1bb7533154510443d4bd012b0fe Mon Sep 17 00:00:00 2001 From: Celia Amador Date: Thu, 6 Aug 2026 09:00:26 +0200 Subject: [PATCH] EDM-4987: Do not send wrong frame that causes the session logout Made-with: Cursor --- libs/ui-components/src/hooks/terminalWsUtils.ts | 9 --------- .../src/hooks/useAppConsoleWebSocket.ts | 13 +++++-------- libs/ui-components/src/hooks/useWebSocket.ts | 15 +++++++++++++-- 3 files changed, 18 insertions(+), 19 deletions(-) delete mode 100644 libs/ui-components/src/hooks/terminalWsUtils.ts diff --git a/libs/ui-components/src/hooks/terminalWsUtils.ts b/libs/ui-components/src/hooks/terminalWsUtils.ts deleted file mode 100644 index 0e0b627aa..000000000 --- a/libs/ui-components/src/hooks/terminalWsUtils.ts +++ /dev/null @@ -1,9 +0,0 @@ -/** Prefix WebSocket payload with a k8s-style channel byte (0x00 stdin, 0x04 resize). */ -export const msgToBytes = (msg: string, resize?: boolean) => { - const encoder = new TextEncoder(); - const encodedData = encoder.encode(msg); - const result = new Uint8Array(encodedData.length + 1); - result[0] = resize ? 0x4 : 0x00; - result.set(encodedData, 1); - return result; -}; diff --git a/libs/ui-components/src/hooks/useAppConsoleWebSocket.ts b/libs/ui-components/src/hooks/useAppConsoleWebSocket.ts index 5c38ed40d..8a9c5de0a 100644 --- a/libs/ui-components/src/hooks/useAppConsoleWebSocket.ts +++ b/libs/ui-components/src/hooks/useAppConsoleWebSocket.ts @@ -1,6 +1,5 @@ import * as React from 'react'; import { useAppContext } from './useAppContext'; -import { msgToBytes } from './terminalWsUtils'; const APP_CONSOLE_CLOSE_CODE = 1000; const APP_CONSOLE_CLOSE_REASON = 'client disconnect'; @@ -100,16 +99,14 @@ export const useAppConsoleWebSocket = ( const forceConnectRef = React.useRef(false); const sendMessage = React.useCallback((data: string, resize?: boolean) => { - const ws = wsRef.current; - if (ws?.readyState !== WebSocket.OPEN) { - return; - } - // Serial stdin is raw bytes; resize uses device-console channel framing (0x4 + size JSON). + // App console uses raw serial websocket (raw bytes, not k8s channels). Resize is not supported if (resize) { - ws.send(msgToBytes(data, true)); return; } - ws.send(new TextEncoder().encode(data)); + const ws = wsRef.current; + if (ws?.readyState === WebSocket.OPEN) { + ws.send(new TextEncoder().encode(data)); + } }, []); const disconnect = React.useCallback(() => { diff --git a/libs/ui-components/src/hooks/useWebSocket.ts b/libs/ui-components/src/hooks/useWebSocket.ts index f384cf35e..34faafb6e 100644 --- a/libs/ui-components/src/hooks/useWebSocket.ts +++ b/libs/ui-components/src/hooks/useWebSocket.ts @@ -1,10 +1,21 @@ import * as React from 'react'; import { useTranslation } from './useTranslation'; import { useAppContext } from './useAppContext'; -import { msgToBytes } from './terminalWsUtils'; const isErrorCloseEvent = (evt: CloseEvent) => evt.code !== 1000 && evt.code !== 1001; +const k8sStreamChannel = 0x00; +const k8sResizeChannel = 0x04; + +/** Device console uses k8s stream channels */ +const encodeK8sChannelFrame = (msg: string, resize?: boolean): Uint8Array => { + const encodedData = new TextEncoder().encode(msg); + const frame = new Uint8Array(new ArrayBuffer(encodedData.length + 1)); + frame[0] = resize ? k8sResizeChannel : k8sStreamChannel; + frame.set(encodedData, 1); + return frame; +}; + type WsMetadata = { tty: boolean; term: string; @@ -42,7 +53,7 @@ export const useWebSocket = ( const sendMessage = React.useCallback((data: string, resize?: boolean) => { const ws = wsRef.current; if (ws?.readyState === WebSocket.OPEN) { - ws.send(msgToBytes(data, resize)); + ws.send(encodeK8sChannelFrame(data, resize)); } }, []);