From ffcdb8b126c5267040ddc8f0304b153fa88755e5 Mon Sep 17 00:00:00 2001 From: Kai Stevenson Date: Sat, 28 Jun 2025 18:41:15 -0700 Subject: local play, some physics --- src/ui/inputHandler.ts | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 src/ui/inputHandler.ts (limited to 'src/ui/inputHandler.ts') diff --git a/src/ui/inputHandler.ts b/src/ui/inputHandler.ts new file mode 100644 index 0000000..74bfdd8 --- /dev/null +++ b/src/ui/inputHandler.ts @@ -0,0 +1,53 @@ +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(); +}; -- cgit v1.2.3-70-g09d2