const http = require('http'); const { createLog } = require('./lib/logger'); const handshake = require('./lib/handshake'); const constants = require('./lib/constants'); const Socket = require('./lib/Socket'); const handshakeLog = createLog([ 'Wormhole', 'Handshake' ]); class Wormhole { constructor({ urls=[ '/bruh' ], port=8080 }) { this._urls = urls; this._port = port; this._httpServer = http.createServer((req, res) => { if (req.method === 'GET' && req.url && this._urls.includes(req.url)) { handshakeLog(`Got connection request to ${req.url} on port ${this._port}`); const failConnection = (status=400) => { res.writeHead(status); res.end(); console.trace(); }; const websocketKey = req.headers['sec-websocket-key']; const upgradeHeader = req.headers['upgrade']; const websocketVersion = req.headers['sec-websocket-version']; if (upgradeHeader !== constants.upgradeHeaderRequirement) return failConnection(); if (websocketVersion !== constants.websocketVersionRequirement) return failConnection(); const websocketAccept = handshake.generateWebsocketAcceptValue(websocketKey); handshakeLog(websocketKey, websocketAccept); if (websocketAccept) { res.writeHead(101, { 'Upgrade': 'websocket', 'Connection': 'Upgrade', 'Sec-WebSocket-Accept': websocketAccept }); res.end(); const socket = new Socket({ socket: res.socket, initalState: 'CONNECTED' }); return true; } return failConnection(); } }); this._httpServer.listen(port); } } module.exports = Wormhole;