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

View File

@@ -1,12 +1,14 @@
<script lang="ts"> <script lang="ts">
import { onMount, onDestroy } from 'svelte'; import { onMount, onDestroy } from 'svelte';
import { createWebSocketClient } from '$lib/websocketClient'; import { WebsocketClient } from '$lib/websocketClient';
import type { Settings, GameMode, Playlist } from '$lib/types'; import type { Settings, GameMode, Playlist } from '$lib/types';
import PlayerList from '$lib/components/PlayerList.svelte'; import PlayerList from '$lib/components/PlayerList.svelte';
import GameSettings from '$lib/components/GameSettings.svelte'; import GameSettings from '$lib/components/GameSettings.svelte';
// Create WebSocket client // Create WebSocket client
let wsClient = $state(createWebSocketClient());
let wsClient = new WebsocketClient();
let connected = $state(wsClient.connected);
// Current user state // Current user state
let isHost = $state(true); // Assume current user is host for this example let isHost = $state(true); // Assume current user is host for this example
@@ -57,23 +59,25 @@
// Initialize mock data for demo // Initialize mock data for demo
function initializeMockData() { function initializeMockData() {
// Simulate WebSocket connection and receiving initial player data // Simulate WebSocket connection and receiving initial player data
setTimeout(() => { // setTimeout(() => {
console.log("Init mock data"); // console.log("Init mock data");
wsClient.players = [ // wsClient.players = [
{ id: 1, name: 'YourName', isHost: true }, // { id: 1, name: 'YourName', isHost: true },
{ id: 2, name: 'Player2', isHost: false }, // { id: 2, name: 'Player2', isHost: false },
{ id: 3, name: 'GamerX', isHost: false } // { id: 3, name: 'GamerX', isHost: false }
]; // ];
wsClient.connected = true; // wsClient.connected = true;
}, 500); // }, 500);
} }
onMount(() => { onMount(() => {
// In a real app, connect to WebSocket server // In a real app, connect to WebSocket server
// wsClient.connect('ws://example.com/game-lobby'); // wsClient.connect('ws://example.com/game-lobby');
wsClient.connect('ws://localhost:3000/ws?lobby_id=test');
// For demo purposes, we'll simulate a connection // For demo purposes, we'll simulate a connection
initializeMockData(); // initializeMockData();
}); });
onDestroy(() => { onDestroy(() => {
@@ -107,7 +111,7 @@
<div class="grid grid-cols-1 md:grid-cols-3 gap-6"> <div class="grid grid-cols-1 md:grid-cols-3 gap-6">
<!-- Left column: Player list --> <!-- Left column: Player list -->
<div class="md:col-span-1"> <div class="md:col-span-1">
{#if wsClient.connected} {#if connected}
<PlayerList <PlayerList
players={wsClient.players} players={wsClient.players}
maxPlayers={wsClient.gameSettings.maxPlayers} maxPlayers={wsClient.gameSettings.maxPlayers}