export enum SocketConnectionType { NONE = "NONE", HOST = "HOST", DISPLAY = "DISPLAY" } const messages: string[] = $state([]); let connectionType = $state(SocketConnectionType.NONE); let socket: WebSocket | undefined; const connectAsHost = () => { if (socket !== undefined) return; socket = new WebSocket("ws://127.0.0.1:12345"); socket.addEventListener("open", onOpen(SocketConnectionType.HOST)); socket.addEventListener("message", onFirstMessage); socket.addEventListener("close", onClose); socket.addEventListener("error", onError); }; const connectAsDisplay = () => { if (socket !== undefined) return; socket = new WebSocket("ws://127.0.0.1:12345"); socket.addEventListener("open", onOpen(SocketConnectionType.DISPLAY)); socket.addEventListener("message", onFirstMessage); }; const sendMessage = (obj: unknown) => { if (socket === undefined) return; if (socket.readyState <= 1) { try { socket.send(JSON.stringify(obj)); } catch { console.error(`Could not send ${obj}`); } } }; function onOpen(type: SocketConnectionType) { return (event: Event) => { console.log("Connection established"); console.log(event); if (socket === undefined) return; socket.send(type.toString()); }; } // eslint-disable-next-line @typescript-eslint/no-explicit-any function onFirstMessage(event: MessageEvent) { if (socket === undefined) return; console.log(event.data); if (event.data === SocketConnectionType.HOST) { connectionType = SocketConnectionType.HOST; socket.removeEventListener("message", onFirstMessage); socket.addEventListener("message", onMessage); } else if (event.data === SocketConnectionType.DISPLAY) { connectionType = SocketConnectionType.DISPLAY; socket.removeEventListener("message", onFirstMessage); socket.addEventListener("message", onMessage); } else { console.error("Failed to register"); socket.close(); socket = undefined; } } // eslint-disable-next-line @typescript-eslint/no-explicit-any function onMessage(event: MessageEvent) { messages.push(event.data); } function onClose(event: CloseEvent) { console.log("Connection closed"); console.log(event); connectionType = SocketConnectionType.NONE; if (socket === undefined) return; socket.close(); socket = undefined; } function onError(event: Event) { console.error("Websocket error occured"); console.error(event); connectionType = SocketConnectionType.NONE; if (socket === undefined) return; socket.close(); socket = undefined; } export default { get message() { return messages[0]; }, nextMessage() { return messages.shift(); }, get messageNum() { return messages.length; }, get connectionType() { return connectionType; }, sendMessage, connectAsHost, connectAsDisplay };