const fs = require("fs"); const path = require("path"); const https = require("https"); const express = require("express"); const WebSocket = require("ws"); const config = require("./config/config"); const FluidNCClient = require("./fluidnc/FluidNCClient"); const app = express(); // Serve frontend app.use(express.static(path.join(__dirname, "../web"))); // HTTPS server const server = https.createServer( { key: fs.readFileSync(path.join(__dirname, "../cert/key.pem")), cert: fs.readFileSync(path.join(__dirname, "../cert/cert.pem")) }, app); // Websocket server (browser connections) const wss = new WebSocket.Server({ server }); // Create FluidNC WebSocket client const fluid = new FluidNCClient(config.fluidnc); // Connected browser clients let clients = []; wss.on("connection", (ws) => { console.log("[WS] Browser connected"); clients.push(ws); ws.on("message", (msg) => { try { const data = JSON.parse(msg); console.log("Message from WSS: " + msg); if (data.type === "jog") { fluid.jog(data.relative, data.axis, data.value); } if (data.type === "gcode") { fluid.sendGcode(data.cmd); } } catch (e) { console.log("[WS] Error parsing:", e); } }); ws.on("close", () => { clients = clients.filter(c => c !== ws); console.log("[WS] Browser disconnected"); }); }); // FluidNC → Browser broadcasting fluid.onMessage((msg) => { clients.forEach(c => { if (c.readyState === WebSocket.OPEN) { c.send(msg.toString()); } }); }); // Status polling ("?" every 1000ms) setInterval(() => { fluid.requestStatus(); }, 3000); server.listen(config.server.port, () => { console.log("[Server] Running at:"); console.log(`https://localhost:${config.server.port}`); });