mirror of
https://github.com/SteamDeckHomebrew/decky-loader.git
synced 2026-07-11 06:01:58 +00:00
Add event handler
This commit is contained in:
@@ -34,7 +34,13 @@ interface ErrorMessage {
|
||||
id: number;
|
||||
}
|
||||
|
||||
type Message = CallMessage | ReplyMessage | ErrorMessage;
|
||||
interface EventMessage {
|
||||
type: MessageType.EVENT;
|
||||
event: string;
|
||||
args: any;
|
||||
}
|
||||
|
||||
type Message = CallMessage | ReplyMessage | ErrorMessage | EventMessage;
|
||||
|
||||
// Helper to resolve a promise from the outside
|
||||
interface PromiseResolver<T> {
|
||||
@@ -46,6 +52,7 @@ interface PromiseResolver<T> {
|
||||
export class WSRouter extends Logger {
|
||||
routes: Map<string, (...args: any) => any> = new Map();
|
||||
runningCalls: Map<number, PromiseResolver<any>> = new Map();
|
||||
eventListeners: Map<string, Set<(...args: any) => any>> = new Map();
|
||||
ws?: WebSocket;
|
||||
connectPromise?: Promise<void>;
|
||||
// Used to map results and errors to calls
|
||||
@@ -87,7 +94,7 @@ export class WSRouter extends Logger {
|
||||
this.ws?.send(JSON.stringify(data));
|
||||
}
|
||||
|
||||
addRoute(name: string, route: (args: any) => any) {
|
||||
addRoute(name: string, route: (...args: any) => any) {
|
||||
this.routes.set(name, route);
|
||||
}
|
||||
|
||||
@@ -95,6 +102,25 @@ export class WSRouter extends Logger {
|
||||
this.routes.delete(name);
|
||||
}
|
||||
|
||||
addEventListener(event: string, listener: (...args: any) => any) {
|
||||
if (!this.eventListeners.has(event)) {
|
||||
this.eventListeners.set(event, new Set([listener]));
|
||||
} else {
|
||||
this.eventListeners.get(event)?.add(listener);
|
||||
}
|
||||
return listener;
|
||||
}
|
||||
|
||||
removeEventListener(event: string, listener: (...args: any) => any) {
|
||||
if (this.eventListeners.has(event)) {
|
||||
const set = this.eventListeners.get(event);
|
||||
set?.delete(listener);
|
||||
if (set?.size === 0) {
|
||||
this.eventListeners.delete(event);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async onMessage(msg: MessageEvent) {
|
||||
try {
|
||||
const data = JSON.parse(msg.data) as Message;
|
||||
@@ -129,6 +155,20 @@ export class WSRouter extends Logger {
|
||||
}
|
||||
break;
|
||||
|
||||
case MessageType.EVENT:
|
||||
if (this.eventListeners.has(data.event)) {
|
||||
for (const listener of this.eventListeners.get(data.event)!) {
|
||||
try {
|
||||
listener(...data.args);
|
||||
} catch (e) {
|
||||
this.error(`error in event ${data.event}`, e, listener);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
this.debug(`event ${data.event} has no listeners`);
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
this.error('Unknown message type', data);
|
||||
break;
|
||||
|
||||
Reference in New Issue
Block a user