#!/usr/bin/env node const fs=require("fs"); const net=require("net"); const https=require("https"); const WebSocket=require("uws"); const PORT=29546; const upstream={ host: "localhost", port: 29536 }; let httpsConfig=null; if(process.argv.length>=4){ console.log("Reading keys for https"); httpsConfig={ key: fs.readFileSync(process.argv[2]), cert: fs.readFileSync(process.argv[3]), }; } if(process.getuid()==0){ console.log(`Old uid: ${process.getuid()}, old gid: ${process.getgid()}; setting to nobody...`); process.setgid("nobody"); process.setuid("nobody"); console.log(`New uid: ${process.getuid()}, new gid: ${process.getgid()}`); } let httpsServer,wsServer; if(httpsConfig){ httpsServer=https.createServer(httpsConfig,(req,res)=>{ console.log("Got request in httpsServer?"); // req.socket.end(); // ? }); wsServer=new WebSocket.Server({server:httpsServer},()=>{ console.log(`Bound websocket server to https server`); }); } else { wsServer=new WebSocket.Server({port:PORT},()=>{ console.log(`Listening for websocket http requests on port ${PORT}`); }); } wsServer.on("connection",(sock)=>{ let netconn=null; let buffer=[]; let linebuf=""; netconn=net.connect(upstream.port,upstream.host,()=>{ for(const item of buffer){ netconn.write(item+"\n"); } buffer=[]; }); netconn.on("close",()=>{ sock.close(); }); netconn.on("data",(data)=>{ linebuf+=data; let idx; while((idx=linebuf.indexOf("\n"))!=-1){ sock.send(linebuf.slice(0,idx)); linebuf=linebuf.slice(idx+1); } }); sock.on("close",()=>{ netconn.end(); }); sock.on("message",(data)=>{ if(netconn.connecting)buffer.push(data); else netconn.write(data+"\n"); }); }); if(httpsConfig){ httpsServer.listen(PORT,()=>{ console.log(`HTTPS server bound on port ${PORT}`); }); } process.on("SIGINT",()=>{ console.log("Closing server..."); wsServer.close(); if(httpsConfig)httpsServer.close(); });