Try and make websockets work

This commit is contained in:
2025-10-08 23:05:55 +02:00
parent 7c60489991
commit bec28ec5c1
2 changed files with 132 additions and 50 deletions

View File

@@ -1,52 +1,54 @@
import type { Player, Settings, WebSocketMessage } from './types';
export function createWebSocketClient() {
let socket: WebSocket | null = null;
let connected = false;
let players: Player[] = [];
let gameSettings: Settings = {
export class WebsocketClient {
connected = false;
players: Player[] = [];
gameSettings: Settings = {
maxPlayers: 8,
gameMode: 'classic',
selectedPlaylistId: 1
};
socket: WebSocket | null = null;
function connect(url: string): void {
if (socket) socket.close();
connect(url: string): void {
if (this.socket) this.socket.close();
socket = new WebSocket(url);
this.socket = new WebSocket(url);
socket.onopen = () => {
connected = true;
this.socket.onopen = () => {
console.log('Connected to websocket');
this.connected = true;
};
socket.onclose = () => {
connected = false;
this.socket.onclose = () => {
this.connected = false;
};
socket.onerror = (error) => {
this.socket.onerror = (error) => {
console.error('WebSocket error:', error);
};
socket.onmessage = (event: MessageEvent) => {
this.socket.onmessage = (event: MessageEvent) => {
try {
const message = JSON.parse(event.data) as WebSocketMessage;
console.log(`Received message ${JSON.stringify(message)}`);
switch (message.type) {
case 'playerJoin':
players = [...players, message.player];
this.players = [...this.players, message.player];
break;
case 'playerLeave':
players = players.filter(p => p.id !== message.playerId);
this.players = this.players.filter((p) => p.id !== message.playerId);
break;
case 'playerList':
players = message.players;
this.players = message.players;
break;
case 'settingsUpdate':
gameSettings = message.settings;
this.gameSettings = message.settings;
break;
}
} catch (error) {
@@ -55,29 +57,105 @@ export function createWebSocketClient() {
};
}
function sendMessage(message: WebSocketMessage): void {
if (socket && socket.readyState === WebSocket.OPEN) {
socket.send(JSON.stringify(message));
sendMessage(message: WebSocketMessage): void {
if (this.socket && this.socket.readyState === WebSocket.OPEN) {
this.socket.send(JSON.stringify(message));
} else {
console.warn('Cannot send message, WebSocket is not connected');
}
}
function disconnect(): void {
if (socket) {
socket.close();
socket = null;
disconnect(): void {
if (this.socket) {
this.socket.close();
this.socket = null;
}
connected = false;
players = [];
this.connected = false;
this.players = [];
}
return {
connected,
players,
gameSettings,
connect,
sendMessage,
disconnect
};
}
//
// export function createWebSocketClient() {
// let socket: WebSocket | null = null;
//
// let connected = false;
// let players: Player[] = [];
// let gameSettings: Settings = {
// maxPlayers: 8,
// gameMode: 'classic',
// selectedPlaylistId: 1
// };
//
// function connect(url: string): void {
// if (socket) socket.close();
//
// socket = new WebSocket(url);
//
// socket.onopen = () => {
// console.log('Connected to websocket');
// connected = true;
// };
//
// socket.onclose = () => {
// connected = false;
// };
//
// socket.onerror = (error) => {
// console.error('WebSocket error:', error);
// };
//
// socket.onmessage = (event: MessageEvent) => {
// try {
// const message = JSON.parse(event.data) as WebSocketMessage;
//
// console.log(`Received message ${JSON.stringify(message)}`);
//
// switch (message.type) {
// case 'playerJoin':
// players = [...players, message.player];
// break;
//
// case 'playerLeave':
// players = players.filter((p) => p.id !== message.playerId);
// break;
//
// case 'playerList':
// players = message.players;
// break;
//
// case 'settingsUpdate':
// gameSettings = message.settings;
// break;
// }
// } catch (error) {
// console.error('Failed to parse WebSocket message:', error);
// }
// };
// }
//
// function sendMessage(message: WebSocketMessage): void {
// if (socket && socket.readyState === WebSocket.OPEN) {
// socket.send(JSON.stringify(message));
// } else {
// console.warn('Cannot send message, WebSocket is not connected');
// }
// }
//
// function disconnect(): void {
// if (socket) {
// socket.close();
// socket = null;
// }
// connected = false;
// players = [];
// }
//
// return {
// connected: connected,
// players: players,
// gameSettings: gameSettings,
// connect: connect,
// sendMessage: sendMessage,
// disconnect: disconnect
// };
// }