export enum Key { CTRL_C = "ctrl_c", LEFT_ARROW = "left_arrow", RIGHT_ARROW = "right_arrow", } const keyToBuffer: Record = { [Key.CTRL_C]: Buffer.from("\u0003"), [Key.LEFT_ARROW]: Buffer.from("\u001b[D"), [Key.RIGHT_ARROW]: Buffer.from("\u001b[C"), }; export const createAndBindHandler = ( onInput: (key: Key) => any, onExit: () => any ) => { process.stdin.setRawMode(true); let seq = Buffer.alloc(0); process.stdin.on("data", (inputBuffer) => { seq = Buffer.concat([seq, inputBuffer]); for (const [key, buffer] of Object.entries(keyToBuffer) as [ Key, Buffer ][]) { if ( !( seq.length >= buffer.length && seq.slice(-buffer.length).equals(buffer) ) ) { continue; } { if (key === Key.CTRL_C) { onExit(); } else { onInput(key); } seq = Buffer.alloc(0); return; } } if (seq.length > 6) { seq = Buffer.alloc(0); } }); process.stdin.resume(); };