58 lines
No EOL
1.9 KiB
JavaScript
58 lines
No EOL
1.9 KiB
JavaScript
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; |