wormhole/index.js

58 lines
1.9 KiB
JavaScript
Raw Normal View History

2021-01-26 12:04:53 +02:00
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;