in src/widgets/dialogs/PodsTerminal/index.tsx [166:223]
function onData(xtermc: XTerminalConnected, bytes: ArrayBuffer) {
const xterm = xtermc.xterm;
// Only show data from stdout, stderr and server error channel.
const channel: Channel = new Int8Array(bytes.slice(0, 1))[0];
if (channel < Channel.StdOut || channel > Channel.ServerError) {
return;
}
// The first byte is discarded because it just identifies whether
// this data is from stderr, stdout, or stdin.
const data = bytes.slice(1);
let text = decoder.decode(data);
// to check if we are connecting to the socket for the first time
let firstConnect = false;
// Send resize command to server once connection is establised.
if (!xtermc.connected) {
xterm.clear();
(async function () {
send(4, `{"Width":${xterm.cols},"Height":${xterm.rows}}`);
})();
// On server error, don't set it as connected
if (channel !== Channel.ServerError) {
xtermc.connected = true;
firstConnect = true;
console.debug('Terminal is now connected');
}
}
if (isSuccessfulExitError(channel, text)) {
if (!!closeDialog) {
closeDialog();
}
if (execOrAttachRef.current) {
execOrAttachRef.current?.cancel();
}
return;
}
if (isShellNotFoundError(channel, text)) {
shellConnectFailed(xtermc);
return;
}
if (isAttach) {
// in case of attach if we didn't recieve any data from the process we should notify the user that if any data comes
// we will be showing it in the terminal
if (firstConnect && !text) {
text =
t(
"Any new output for this container's process should be shown below. In case it doesn't show up, press enter…"
) + '\r\n';
}
text = text.replace(/\r\n/g, '\n').replace(/\n/g, '\r\n');
}
xterm.write(text);
}