diff --git a/companion-bridge/index.js b/companion-bridge/index.js index f1f2102d77d..e33ed85046d 100644 --- a/companion-bridge/index.js +++ b/companion-bridge/index.js @@ -1,27 +1,22 @@ /* eslint-disable no-console */ -const { GlobalKeyboardListener } = require("node-global-key-listener"); +const { uIOhook, UiohookKey } = require("uiohook-napi"); const { WebSocketServer } = require("ws"); const PORT = 6969; const pressedKeys = new Set(); const ToggleBindings = new Map([ - ["INSERT", "TOGGLE_MUTE"], - ["NUMPAD0", "TOGGLE_MUTE"], - ["HOME", "TOGGLE_DEAFEN"], - ["NUMPAD7", "TOGGLE_DEAFEN"] + [UiohookKey.Insert, "TOGGLE_MUTE"], + [UiohookKey.Numpad0, "TOGGLE_MUTE"], + [UiohookKey.Home, "TOGGLE_DEAFEN"], + [UiohookKey.Numpad7, "TOGGLE_DEAFEN"] ]); const wss = new WebSocketServer({ host: "127.0.0.1", port: PORT }); -const keyboard = new GlobalKeyboardListener({ - windows: { - onError: errorCode => console.error("Companion bridge keyboard error:", errorCode), - onInfo: info => console.info("Companion bridge keyboard info:", info) - } -}); function broadcast(action) { const payload = JSON.stringify({ action }); + console.log(`Companion bridge broadcasting ${action} to ${wss.clients.size} client(s).`); for (const client of wss.clients) { if (client.readyState === client.OPEN) { @@ -30,31 +25,37 @@ function broadcast(action) { } } -function handleKeyDown(name) { - if (pressedKeys.has(name)) return; +function resolveAction(event) { + return ToggleBindings.get(event.keycode) ?? null; +} + +function handleKeyDown(event) { + console.log(`Companion bridge keydown: keycode=${event.keycode}`); + + if (pressedKeys.has(event.keycode)) return; - pressedKeys.add(name); + pressedKeys.add(event.keycode); - const action = ToggleBindings.get(name); + const action = resolveAction(event); if (action) { broadcast(action); } } -function handleKeyUp(name) { - pressedKeys.delete(name); +function handleKeyUp(event) { + console.log(`Companion bridge keyup: keycode=${event.keycode}`); + pressedKeys.delete(event.keycode); } -keyboard.addListener(event => { - if (event.state === "DOWN") { - handleKeyDown(event.name); - return; - } +uIOhook.on("keydown", handleKeyDown); +uIOhook.on("keyup", handleKeyUp); - if (event.state === "UP") { - handleKeyUp(event.name); - } -}); +try { + uIOhook.start(); + console.log("Companion bridge keyboard listener started."); +} catch (error) { + console.error("Companion bridge failed to start keyboard listener:", error); +} wss.on("listening", () => { console.log(`Companion bridge listening on ws://localhost:${PORT}`); @@ -77,7 +78,12 @@ wss.on("error", error => { }); function shutdown() { - keyboard.kill(); + try { + uIOhook.stop(); + } catch (error) { + console.error("Companion bridge failed to stop keyboard listener:", error); + } + wss.close(() => { process.exit(0); }); diff --git a/companion-bridge/package.json b/companion-bridge/package.json index 386134fae53..3971673b47a 100644 --- a/companion-bridge/package.json +++ b/companion-bridge/package.json @@ -9,7 +9,7 @@ "start": "node index.js" }, "dependencies": { - "node-global-key-listener": "^0.3.0", + "uiohook-napi": "^1.5.4", "ws": "^8.18.3" } }