From 233160e17ff451e52621b10d5d00d99e7800c2db Mon Sep 17 00:00:00 2001 From: Tom Smeding Date: Sun, 1 Jul 2018 21:12:11 +0200 Subject: Interactor --- interactor/server.js | 85 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100755 interactor/server.js (limited to 'interactor/server.js') diff --git a/interactor/server.js b/interactor/server.js new file mode 100755 index 0000000..88e9f10 --- /dev/null +++ b/interactor/server.js @@ -0,0 +1,85 @@ +#!/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)); -- cgit v1.2.3-54-g00ecf