import express from "express"; import mustache from "mustache"; import bodyParse from "body-parser"; import { readdirSync, readFileSync } from "fs"; import { Server } from "socket.io"; import http from "http"; const app = express(); app.use(express.static("./static")); app.use(bodyParse.urlencoded({ extended: true })); const port = 9779; const server = http.createServer(app); const io = new Server(server); class Room { id = 0 history = [] static newRoom() { const room = new Room(); room.id = db.roomsCount++; db.rooms.push(room); return room; } /** * * @param {String} type * @param {Array.} params */ addCmd(type, params) { this.history.push([Date.now(), type, params]); } } const db = { roomsCount: 0, /** @type {Array.} */ rooms: [], /** * * @param {Number} roomId */ findRoom(roomId) { let room = null; for (let _room of db.rooms) { if (_room.id === roomId) { room = _room; } } return room; } }; const templates = new Map(readdirSync("./templates").map(fn => [fn, readFileSync(`./templates/${fn}`, "utf-8")])); app.get("/", (req, res) => { res.send(mustache.render(templates.get("mainPage.html"), { db })); }); app.get("/createRoom", (req, res) => { let room = Room.newRoom(); res.redirect(`/room/${room.id}`); }); app.get("/room/:roomId", (req, res) => { let room = db.findRoom(parseInt(req.params.roomId)); if (room === null) { res.redirect("/"); } else { res.send(mustache.render(templates.get("roomPage.html"), { room })); } }); io.on("connection", (socket) => { socket.on("draw", (data) => { console.log(`data: ${JSON.stringify(data)}`); let room = db.findRoom(parseInt(data.roomId)); if (room === null) { console.error(`No room with id ${data.roomId}!`); } else { room.addCmd(data.type, data.params); io.emit("draw_sync", data); } }); socket.on("sync_me", (data) => { console.log(`data: ${JSON.stringify(data)}`); let room = db.findRoom(parseInt(data.roomId)); if (room === null) { console.error(`No room with id ${data.roomId}!`); } else { socket.emit("sync_history", { roomId: data.roomId, history: room.history }); } }); }); server.listen(port, () => console.log(`⚡️ Serving on port ${port}`));