import { Input } from "$lib/proto/input-event" import { InputEvent } from "$lib/proto/input" import { Builder } from "flatbuffers"; export enum KeyAction { DOWN, UP, } export async function sendKeyboardEvent( writer: WritableStreamDefaultWriter, event: KeyboardEvent, keyAction: KeyAction, ) { const builder = new Builder(1024); InputEvent.KeyboardInput.startKeyboardInput(builder); // Have to use keyCode even though it's deprecated beacuse .code is a unhelpful string :sigh: InputEvent.KeyboardInput.addKeyCode(builder, event.keyCode); InputEvent.KeyboardInput.addKeyAction(builder, keyAction); const modifierState = InputEvent.ModifierState.createModifierState( builder, event.shiftKey, event.ctrlKey, event.altKey, event.metaKey ); InputEvent.KeyboardInput.addModifiers(builder, modifierState); const keyboardInput = InputEvent.KeyboardInput.endKeyboardInput(builder); // Create InputEvent table with union InputEvent.InputEvent.startInputEvent(builder); InputEvent.InputEvent.addInputType(builder, Input.Keyboard); InputEvent.InputEvent.addInput(builder, keyboardInput); const inputEvent = InputEvent.InputEvent.endInputEvent(builder); // Finish the buffer builder.finish(inputEvent); // Get the buffer data const bufferData = builder.asUint8Array(); // Create size prefix as big-endian u32 const sizePrefix = new Uint8Array(4); const size = bufferData.length; sizePrefix[0] = (size >> 24) & 0xFF; // Most significant byte sizePrefix[1] = (size >> 16) & 0xFF; sizePrefix[2] = (size >> 8) & 0xFF; sizePrefix[3] = size & 0xFF; // Least significant byte // Create combined buffer with size prefix + flatbuffer data const combined = new Uint8Array(sizePrefix.length + bufferData.length); combined.set(sizePrefix, 0); combined.set(bufferData, sizePrefix.length); // Write to stream await writer.write(combined); } export async function sendMouseMoveEvent( writer: WritableStreamDefaultWriter, event: MouseEvent, ) { const builder = new Builder(1024); const mouseMovement = InputEvent.MouseMovement.createMouseMovement(builder, event.movementX, event.movementY); // Create InputEvent table with union InputEvent.InputEvent.startInputEvent(builder); InputEvent.InputEvent.addInputType(builder, Input.MouseMovement); InputEvent.InputEvent.addInput(builder, mouseMovement); const inputEvent = InputEvent.InputEvent.endInputEvent(builder); // Finish the buffer builder.finish(inputEvent); // Get the buffer data const bufferData = builder.asUint8Array(); // Create size prefix as big-endian u32 const sizePrefix = new Uint8Array(4); const size = bufferData.length; sizePrefix[0] = (size >> 24) & 0xFF; // Most significant byte sizePrefix[1] = (size >> 16) & 0xFF; sizePrefix[2] = (size >> 8) & 0xFF; sizePrefix[3] = size & 0xFF; // Least significant byte // Create combined buffer with size prefix + flatbuffer data const combined = new Uint8Array(sizePrefix.length + bufferData.length); combined.set(sizePrefix, 0); combined.set(bufferData, sizePrefix.length); // Write to stream await writer.write(combined); } export async function sendMouseInputEvent( writer: WritableStreamDefaultWriter, event: MouseEvent, keyAction: KeyAction, ) { const builder = new Builder(1024); var mouseButton: InputEvent.MouseButton; switch (event.button) { case 0: mouseButton = InputEvent.MouseButton.LEFT; break; case 1: mouseButton = InputEvent.MouseButton.MIDDLE; break; case 2: mouseButton = InputEvent.MouseButton.RIGHT; break; default: console.log(`Unknown mouse button ${event.button}, defaulting to LEFT`); mouseButton = InputEvent.MouseButton.LEFT; break; } const mouseInput = InputEvent.MouseInput.createMouseInput(builder, mouseButton, keyAction); // Create InputEvent table with union InputEvent.InputEvent.startInputEvent(builder); InputEvent.InputEvent.addInputType(builder, Input.MouseInput); InputEvent.InputEvent.addInput(builder, mouseInput); const inputEvent = InputEvent.InputEvent.endInputEvent(builder); // Finish the buffer builder.finish(inputEvent); // Get the buffer data const bufferData = builder.asUint8Array(); // Create size prefix as big-endian u32 const sizePrefix = new Uint8Array(4); const size = bufferData.length; sizePrefix[0] = (size >> 24) & 0xFF; // Most significant byte sizePrefix[1] = (size >> 16) & 0xFF; sizePrefix[2] = (size >> 8) & 0xFF; sizePrefix[3] = size & 0xFF; // Least significant byte // Create combined buffer with size prefix + flatbuffer data const combined = new Uint8Array(sizePrefix.length + bufferData.length); combined.set(sizePrefix, 0); combined.set(bufferData, sizePrefix.length); // Write to stream await writer.write(combined); }