open-nomad/ui/app/utils/classes/exec-command-editor-xterm-adapter.js
2022-01-20 09:46:45 -05:00

57 lines
1.7 KiB
JavaScript

import KEYS from 'nomad-ui/utils/keys';
const REVERSE_WRAPAROUND_MODE = '\x1b[?45h';
const BACKSPACE_ONE_CHARACTER = '\x08 \x08';
// eslint-disable-next-line no-control-regex
const UNPRINTABLE_CHARACTERS_REGEX = /[\x00-\x1F]/g;
export default class ExecCommandEditorXtermAdapter {
constructor(terminal, setCommandCallback, command) {
this.terminal = terminal;
this.setCommandCallback = setCommandCallback;
this.command = command;
this.dataListener = terminal.onData((data) => {
this.handleDataEvent(data);
});
// Allows tests to bypass synthetic keyboard event restrictions
terminal.simulateCommandDataEvent = this.handleDataEvent.bind(this);
terminal.write(REVERSE_WRAPAROUND_MODE);
}
handleDataEvent(data) {
if (
data === KEYS.LEFT_ARROW ||
data === KEYS.UP_ARROW ||
data === KEYS.RIGHT_ARROW ||
data === KEYS.DOWN_ARROW
) {
// Ignore arrow keys
} else if (data === KEYS.CONTROL_U) {
this.terminal.write(BACKSPACE_ONE_CHARACTER.repeat(this.command.length));
this.command = '';
} else if (data === KEYS.ENTER) {
this.terminal.writeln('');
this.setCommandCallback(this.command);
this.dataListener.dispose();
} else if (data === KEYS.DELETE) {
if (this.command.length > 0) {
this.terminal.write(BACKSPACE_ONE_CHARACTER);
this.command = this.command.slice(0, -1);
}
} else if (data.length > 0) {
const strippedData = data.replace(UNPRINTABLE_CHARACTERS_REGEX, '');
this.terminal.write(strippedData);
this.command = `${this.command}${strippedData}`;
}
}
destroy() {
this.dataListener.dispose();
}
}