diff options
Diffstat (limited to 'server/src/server.ts')
-rw-r--r-- | server/src/server.ts | 90 |
1 files changed, 73 insertions, 17 deletions
diff --git a/server/src/server.ts b/server/src/server.ts index 18829e4..713d3ed 100644 --- a/server/src/server.ts +++ b/server/src/server.ts @@ -4,50 +4,106 @@ import { WallBounds, Physics, Collision, + NetworkUpdate, MessageQueueProvider, MessagePublisher, } from "@engine/systems"; import { Grid } from "@engine/structures"; import { Miscellaneous } from "@engine/config"; +import { Server } from "bun"; -const TICK_RATE = 60 / 1000; +class ServerSocketMessageReceiver implements MessageQueueProvider { + private messages: any[]; -const game = new Game(); + constructor() { + this.messages = []; + } -[ - new Physics(), - new Collision(new Grid()), - new WallBounds(Miscellaneous.WIDTH), -].forEach((system) => game.addSystem(system)); + addMessage(message: any) { + this.messages.push(message); + } -[new Floor(160), new Player()].forEach((entity) => game.addEntity(entity)); + getNewMessages() { + return this.messages; + } -game.start(); + clearMessages() { + this.messages = []; + } +} -setInterval(() => { - game.doGameLoop(performance.now()); -}, TICK_RATE); +class ServerSocketMessagePublisher implements MessagePublisher { + private server: Server; + private messages: any[]; + + constructor(server: Server) { + this.server = server; + this.messages = []; + } + + addMessage(_message: any) {} -const server = Bun.serve({ + publish() {} +} + +const game = new Game(); + +const messageReceiver = new ServerSocketMessageReceiver(); + +const server = Bun.serve<{ sessionId: string }>({ port: 8080, fetch: async (req, server): Promise<string> => { - const sessionId = Math.floor(Math.random() * 1e10).toString(); + const sessionId = crypto.randomUUID(); server.upgrade(req, { headers: { "Set-Cookie": `SessionId=${sessionId}`, }, + data: { + sessionId, + }, }); - return "200 OK"; + return sessionId; }, websocket: { - open(ws) {}, + open(ws) { + const { sessionId } = ws.data; + + if (sessionControllableEntities.has(sessionId)) { + return; + } + + const player = new Player(); + game.addEntity(player); + + sessionControllableEntities.set(sessionId, new Set(player.id)); + }, message(ws, message) { - console.log(message); + console.log(JSON.parse(message)); + messageReceiver.addMessage(message); }, close(ws) {}, }, }); +const messagePublisher = new ServerSocketMessagePublisher(server); + +[ + new Physics(), + new Collision(new Grid()), + new WallBounds(Miscellaneous.WIDTH), + new NetworkUpdate(messageReceiver, messagePublisher), +].forEach((system) => game.addSystem(system)); + +[new Floor(160), new Player()].forEach((entity) => game.addEntity(entity)); + +game.start(); + +setInterval(() => { + game.doGameLoop(performance.now()); +}, Miscellaneous.SERVER_TICK_RATE); + +const sessionControllableEntities: Map<string, Set<string>> = new Map(); + console.log(`Listening on ${server.hostname}:${server.port}`); |