fix: Adds (slightly broken) fixed backspace support.
This commit is contained in:
parent
e447c0f9e1
commit
0e60efceee
1 changed files with 31 additions and 5 deletions
|
@ -19,6 +19,10 @@ const axios = baseAxios.create({
|
||||||
async function readFromKeyboard(stream: ssh2.ServerChannel, disableEcho: boolean = false): Promise<string> {
|
async function readFromKeyboard(stream: ssh2.ServerChannel, disableEcho: boolean = false): Promise<string> {
|
||||||
const leftEscape = "\x1B[D";
|
const leftEscape = "\x1B[D";
|
||||||
const rightEscape = "\x1B[C";
|
const rightEscape = "\x1B[C";
|
||||||
|
|
||||||
|
const ourBackspace = "\u0008";
|
||||||
|
|
||||||
|
// \x7F = Ascii escape code for backspace (client side)
|
||||||
|
|
||||||
let line = "";
|
let line = "";
|
||||||
let lineIndex = 0;
|
let lineIndex = 0;
|
||||||
|
@ -34,10 +38,28 @@ async function readFromKeyboard(stream: ssh2.ServerChannel, disableEcho: boolean
|
||||||
|
|
||||||
return;
|
return;
|
||||||
} else if (readStreamData.includes("\x7F")) {
|
} else if (readStreamData.includes("\x7F")) {
|
||||||
// \x7F = Ascii escape code for backspace (client side)
|
// TODO (greysoh): investigate maybe potential deltaCursor overflow (haven't tested)
|
||||||
// \u0008 = Ascii escape code for backspace (server side)
|
// TODO (greysoh): investigate deltaCursor underflow
|
||||||
line = line.substring(0, line.length - 1);
|
// TODO (greysoh): make it not run like shit (I don't know how to describe it)
|
||||||
if (!disableEcho) stream.write("\u0008 \u0008");
|
|
||||||
|
if (line.length == 0) return setTimeout(eventLoop, 5); // Here because if we do it in the parent if statement, shit breaks
|
||||||
|
line = line.substring(0, lineIndex - 1) + line.substring(lineIndex);
|
||||||
|
|
||||||
|
if (!disableEcho) {
|
||||||
|
let deltaCursor = line.length - lineIndex;
|
||||||
|
|
||||||
|
// wtf?
|
||||||
|
if (deltaCursor < 0) {
|
||||||
|
console.log("FIXME: somehow, our deltaCursor value is negative! please investigate me");
|
||||||
|
return setTimeout(eventLoop, 5);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Jump forward to the front, and remove the last character
|
||||||
|
stream.write(rightEscape.repeat(deltaCursor) + " " + ourBackspace);
|
||||||
|
|
||||||
|
// Go backwards & rerender text & go backwards again (wtf?)
|
||||||
|
stream.write(leftEscape.repeat(deltaCursor + 1) + line.substring(lineIndex - 1) + leftEscape.repeat(deltaCursor + 1));
|
||||||
|
}
|
||||||
} else if (readStreamData.includes("\x1B")) {
|
} else if (readStreamData.includes("\x1B")) {
|
||||||
if (readStreamData.includes(rightEscape)) {
|
if (readStreamData.includes(rightEscape)) {
|
||||||
if (lineIndex + 1 > line.length) return setTimeout(eventLoop, 5);
|
if (lineIndex + 1 > line.length) return setTimeout(eventLoop, 5);
|
||||||
|
@ -151,7 +173,11 @@ server.on("connection", client => {
|
||||||
const line = await readFromKeyboard(stream);
|
const line = await readFromKeyboard(stream);
|
||||||
stream.write("\r\n");
|
stream.write("\r\n");
|
||||||
|
|
||||||
if (line == "") continue;
|
if (line == "") {
|
||||||
|
stream.write(`~$ `);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
const argv = parseArgsStringToArgv(line);
|
const argv = parseArgsStringToArgv(line);
|
||||||
|
|
||||||
if (argv[0] == "exit") {
|
if (argv[0] == "exit") {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue