#!/usr/bin/env node const http = require("http"); const express = require("express"); const socketio = require("socket.io"); const child_process = require("child_process"); const PORT = 8080; const app = express(); const server = http.Server(app); const io = socketio(server); // gameid -> {pl: [socket]*{1,2}, started: Bool, nextServe: Int, score: [Int, Int]} const games = new Map(); app.get("/", (req, res) => { res.sendFile(__dirname + "/game.html"); }); const staticFiles = [ "/game.css", "/game.js", "/board.js", ]; app.get(staticFiles, (req, res) => { res.sendFile(__dirname + req.path); }); io.on("connection", (conn) => { let proc = null; conn.on("open", () => { console.log("open"); proc = child_process.spawn("../main", { stdio: ["pipe", "pipe", process.stderr] }); conn.emit("open"); let lineBuffer = ""; proc.stdout.on("data", (data) => { lineBuffer += data; let idx; while ((idx = lineBuffer.indexOf("\n")) != -1) { conn.emit("line", lineBuffer.slice(0, idx)); lineBuffer = lineBuffer.slice(idx + 1); } }); proc.on("close", () => { if (proc != null) { console.log("close"); conn.emit("close"); proc.kill(); proc = null; } }); proc.on("error", (err) => { if (proc != null) { console.log("close"); conn.emit("close"); conn.emit("message", "The AI process encountered an error."); proc = null; } }); }); conn.on("disconnect", () => { if (proc != null) { console.log("close"); proc.kill(); proc = null; } }); conn.on("line", (line) => { proc.stdin.write(line + "\n"); }); }); server.listen(PORT, () => console.log("Listening on port " + PORT));