const http = require('http'); const url = require('url'); const fs = require('fs'); const ws = require('ws'); const mimetypes = require('./mime'); function WebManager(port) { const server = http.createServer(); const wss = new ws.WebSocketServer({ noServer: true }); this.clients = []; this.clientcnt = 0; wss.on('connection', (ws, request) => { var clientid = this.clientcnt; this.clientcnt++; this.clients.push(ws); ws.on('message', msg => { console.log(msg.toString('utf-8')); }); ws.on('close', () => { this.clients[clientid] = false; }); ws.on('error', () => { this.clients[clientid] = false; }); }); server.on('request', (req, rsp) => { const uri = url.parse(req.url).pathname; if (uri == '/') { filename = 'www/index.html'; } else { filename = 'www' + uri; } var ext = filename.match(/\.\w+$/); var mime = null; if (ext) { mime = mimetypes[ext[0]]; } if (!mime) { mime = 'application/octet-stream'; } try { if (!fs.existsSync(filename)) { rsp.writeHead(404); rsp.end('Not Found'); return; } var stat = fs.statSync(filename); if (!stat) { rsp.writeHead(403); rsp.end('Forbidden'); return; } rsp.writeHead(200, { 'Content-Length': stat.size, 'Content-Type': mime, }); rsp.end(fs.readFileSync(filename)); } catch (e) { console.error(e); rsp.writeHead(500); rsp.end(e.toString()); } }); server.on('upgrade', (request, socket, head) => { const uri = url.parse(request.url).pathname; if (uri == '/api') { wss.handleUpgrade(request, socket, head, ws => { wss.emit('connection', ws, request); }); } else { socket.destroy(); } }); server.listen(port); } WebManager.prototype.log = function(msg) { this.clients.forEach(ws => { if (!ws) return; ws.send(JSON.stringify({ t: 'log', m: msg })); }); }; module.exports = WebManager;