mirror of
https://github.com/nestriness/nestri.git
synced 2025-12-12 16:55:37 +02:00
## Description ### First commit Restructured protobuf schemas to make them easier to use across languages, switched to using them in-place of JSON for signaling as well, so there's no 2 different message formats flying about. Few new message types to deal with clients and nestri-servers better (not final format, may see changes still). General cleanup of dead/unused code along some bug squashing and package updates. TODO for future commits: - [x] Fix additional controllers not doing inputs (possibly needs vimputti changes) - [x] ~~Restructure relay protocols code a bit, to reduce bloatiness of the currently single file for them, more code re-use.~~ - Gonna keep this PR somewhat manageable without poking more at relay.. - [x] ~~Try to fix issue where with multiple clients, static stream content causes video to freeze until there's some movement.~~ - Was caused by server tuned profile being `throughput-performance`, causing CPU latency to be too high. - [x] Ponder the orb ### Second + third commit Redid the controller polling handling and fixed multi-controller handling in vimputti and nestri code sides. Remove some dead relay code as well to clean up the protocol source file, we'll revisit the meshing functionality later. <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Added software rendering option and MangoHud runtime config; controller sessions now support reconnection and batched state updates with persistent session IDs. * **Bug Fixes** * Restored previously-filtered NES-like gamepads so they connect correctly. * **Chores** * Modernized dependencies and protobuf tooling, migrated to protobuf-based messaging and streaming, and removed obsolete CUDA build steps. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Co-authored-by: DatCaptainHorse <DatCaptainHorse@users.noreply.github.com>
79 lines
2.2 KiB
TypeScript
79 lines
2.2 KiB
TypeScript
import { keyCodeToLinuxEventCode } from "./codes";
|
|
import { WebRTCStream } from "./webrtc-stream";
|
|
import { ProtoKeyDownSchema, ProtoKeyUpSchema } from "./proto/types_pb";
|
|
import { create, toBinary } from "@bufbuild/protobuf";
|
|
import { createMessage } from "./utils";
|
|
import { ProtoMessageSchema } from "./proto/messages_pb";
|
|
|
|
interface Props {
|
|
webrtc: WebRTCStream;
|
|
}
|
|
|
|
export class Keyboard {
|
|
protected wrtc: WebRTCStream;
|
|
protected connected!: boolean;
|
|
|
|
// Store references to event listeners
|
|
private readonly keydownListener: (e: KeyboardEvent) => void;
|
|
private readonly keyupListener: (e: KeyboardEvent) => void;
|
|
|
|
constructor({ webrtc }: Props) {
|
|
this.wrtc = webrtc;
|
|
this.keydownListener = this.createKeyboardListener((e: any) =>
|
|
create(ProtoKeyDownSchema, {
|
|
key: this.keyToVirtualKeyCode(e.code),
|
|
}),
|
|
);
|
|
this.keyupListener = this.createKeyboardListener((e: any) =>
|
|
create(ProtoKeyUpSchema, {
|
|
key: this.keyToVirtualKeyCode(e.code),
|
|
}),
|
|
);
|
|
this.run();
|
|
}
|
|
|
|
private run() {
|
|
if (this.connected) this.stop();
|
|
|
|
this.connected = true;
|
|
document.addEventListener("keydown", this.keydownListener, {
|
|
passive: false,
|
|
});
|
|
document.addEventListener("keyup", this.keyupListener, { passive: false });
|
|
}
|
|
|
|
private stop() {
|
|
document.removeEventListener("keydown", this.keydownListener);
|
|
document.removeEventListener("keyup", this.keyupListener);
|
|
this.connected = false;
|
|
}
|
|
|
|
// Helper function to create and return mouse listeners
|
|
private createKeyboardListener(
|
|
dataCreator: (e: Event) => any,
|
|
): (e: Event) => void {
|
|
return (e: Event) => {
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
// Prevent repeated key events from being sent (important for games)
|
|
if ((e as any).repeat) return;
|
|
|
|
const data = dataCreator(e as any);
|
|
|
|
const message = createMessage(data, "input");
|
|
this.wrtc.sendBinary(toBinary(ProtoMessageSchema, message));
|
|
};
|
|
}
|
|
|
|
public dispose() {
|
|
this.stop();
|
|
this.connected = false;
|
|
}
|
|
|
|
private keyToVirtualKeyCode(code: string) {
|
|
// Treat Home key as Escape - TODO: Make user-configurable
|
|
if (code === "Home") return 1;
|
|
return keyCodeToLinuxEventCode[code] || undefined;
|
|
}
|
|
}
|