swaf/dist/components/WebSocketServerComponent.js

73 lines
11 KiB
JavaScript

var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
import ApplicationComponent from "../ApplicationComponent";
import { Server as WebSocketServer } from "ws";
import Logger from "../Logger";
import cookie from "cookie";
import cookieParser from "cookie-parser";
import config from "config";
export default class WebSocketServerComponent extends ApplicationComponent {
constructor(application, expressAppComponent, storeComponent) {
super();
this.expressAppComponent = expressAppComponent;
this.application = application;
this.storeComponent = storeComponent;
}
start(app, router) {
return __awaiter(this, void 0, void 0, function* () {
const listeners = this.application.getWebSocketListeners();
this.wss = new WebSocketServer({
server: this.expressAppComponent.getServer(),
}, () => {
Logger.info(`Websocket server started over webserver.`);
}).on('error', (err) => {
Logger.error(err, 'An error occurred in the websocket server.');
}).on('connection', (socket, request) => {
const listener = request.url ? listeners[request.url] : null;
if (!listener) {
socket.close(1002, `Path not found ${request.url}`);
return;
}
else if (!request.headers.cookie) {
socket.close(1002, `Can't process request without cookies.`);
return;
}
Logger.debug(`Websocket on ${request.url}`);
const cookies = cookie.parse(request.headers.cookie);
const sid = cookieParser.signedCookie(cookies['connect.sid'], config.get('session.secret'));
if (!sid) {
socket.close(1002);
return;
}
const store = this.storeComponent.getStore();
store.get(sid, (err, session) => {
if (err || !session) {
Logger.error(err, 'Error while initializing session in websocket.');
socket.close(1011);
return;
}
session.id = sid;
store.createSession(request, session);
listener.handle(socket, request, session).catch(err => {
Logger.error(err, 'Error in websocket listener.');
});
});
});
});
}
stop() {
return __awaiter(this, void 0, void 0, function* () {
if (this.wss) {
yield this.close('WebSocket server', this.wss, this.wss.close);
}
});
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiV2ViU29ja2V0U2VydmVyQ29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Ii4vIiwic291cmNlcyI6WyJjb21wb25lbnRzL1dlYlNvY2tldFNlcnZlckNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSxPQUFPLG9CQUFvQixNQUFNLHlCQUF5QixDQUFDO0FBRTNELE9BQWtCLEVBQUMsTUFBTSxJQUFJLGVBQWUsRUFBQyxNQUFNLElBQUksQ0FBQztBQUN4RCxPQUFPLE1BQU0sTUFBTSxXQUFXLENBQUM7QUFDL0IsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sWUFBWSxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFNNUIsTUFBTSxDQUFDLE9BQU8sT0FBTyx3QkFBeUIsU0FBUSxvQkFBMEI7SUFPNUUsWUFBWSxXQUF3QixFQUFFLG1CQUF3QyxFQUFFLGNBQThCO1FBQzFHLEtBQUssRUFBRSxDQUFDO1FBQ1IsSUFBSSxDQUFDLG1CQUFtQixHQUFHLG1CQUFtQixDQUFDO1FBQy9DLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1FBQy9CLElBQUksQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFDO0lBQ3pDLENBQUM7SUFFWSxLQUFLLENBQUMsR0FBWSxFQUFFLE1BQWM7O1lBQzNDLE1BQU0sU0FBUyxHQUF1QyxJQUFJLENBQUMsV0FBVyxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFDL0YsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLGVBQWUsQ0FBQztnQkFDM0IsTUFBTSxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLEVBQUU7YUFDL0MsRUFBRSxHQUFHLEVBQUU7Z0JBQ0osTUFBTSxDQUFDLElBQUksQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO1lBQzVELENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRTtnQkFDbkIsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsNENBQTRDLENBQUMsQ0FBQztZQUNwRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsWUFBWSxFQUFFLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxFQUFFO2dCQUNwQyxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7Z0JBRTdELElBQUksQ0FBQyxRQUFRLEVBQUU7b0JBQ1gsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsa0JBQWtCLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO29CQUNwRCxPQUFPO2lCQUNWO3FCQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRTtvQkFDaEMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsd0NBQXdDLENBQUMsQ0FBQztvQkFDN0QsT0FBTztpQkFDVjtnQkFFRCxNQUFNLENBQUMsS0FBSyxDQUFDLGdCQUFnQixPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztnQkFFNUMsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUNyRCxNQUFNLEdBQUcsR0FBRyxZQUFZLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQztnQkFFNUYsSUFBSSxDQUFDLEdBQUcsRUFBRTtvQkFDTixNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNuQixPQUFPO2lCQUNWO2dCQUVELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQzdDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxFQUFFO29CQUM1QixJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRTt3QkFDakIsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsZ0RBQWdELENBQUMsQ0FBQzt3QkFDcEUsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQzt3QkFDbkIsT0FBTztxQkFDVjtvQkFFRCxPQUFPLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQztvQkFFakIsS0FBSyxDQUFDLGFBQWEsQ0FBVSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7b0JBQy9DLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUU7d0JBQ2xELE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLDhCQUE4QixDQUFDLENBQUM7b0JBQ3RELENBQUMsQ0FBQyxDQUFDO2dCQUNQLENBQUMsQ0FBQyxDQUFDO1lBQ1AsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDO0tBQUE7SUFFWSxJQUFJOztZQUNiLElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRTtnQkFDVixNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ2xFO1FBQ0wsQ0FBQztLQUFBO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQXBwbGljYXRpb25Db21wb25lbnQgZnJvbSBcIi4uL0FwcGxpY2F0aW9uQ29tcG9uZW50XCI7XG5pbXBvcnQge0V4cHJlc3MsIFJlcXVlc3QsIFJvdXRlcn0gZnJvbSBcImV4cHJlc3NcIjtcbmltcG9ydCBXZWJTb2NrZXQsIHtTZXJ2ZXIgYXMgV2ViU29ja2V0U2VydmVyfSBmcm9tIFwid3NcIjtcbmltcG9ydCBMb2dnZXIgZnJvbSBcIi4uL0xvZ2dlclwiO1xuaW1wb3J0IGNvb2tpZSBmcm9tIFwiY29va2llXCI7XG5pbXBvcnQgY29va2llUGFyc2VyIGZyb20gXCJjb29raWUtcGFyc2VyXCI7XG5pbXBvcnQgY29uZmlnIGZyb20gXCJjb25maWdcIjtcbmltcG9ydCBFeHByZXNzQXBwQ29tcG9uZW50IGZyb20gXCIuL0V4cHJlc3NBcHBDb21wb25lbnRcIjtcbmltcG9ydCBBcHBsaWNhdGlvbiBmcm9tIFwiLi4vQXBwbGljYXRpb25cIjtcbmltcG9ydCBSZWRpc0NvbXBvbmVudCBmcm9tIFwiLi9SZWRpc0NvbXBvbmVudFwiO1xuaW1wb3J0IFdlYlNvY2tldExpc3RlbmVyIGZyb20gXCIuLi9XZWJTb2NrZXRMaXN0ZW5lclwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBXZWJTb2NrZXRTZXJ2ZXJDb21wb25lbnQgZXh0ZW5kcyBBcHBsaWNhdGlvbkNvbXBvbmVudDx2b2lkPiB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBhcHBsaWNhdGlvbjogQXBwbGljYXRpb247XG4gICAgcHJpdmF0ZSByZWFkb25seSBleHByZXNzQXBwQ29tcG9uZW50OiBFeHByZXNzQXBwQ29tcG9uZW50O1xuICAgIHByaXZhdGUgcmVhZG9ubHkgc3RvcmVDb21wb25lbnQ6IFJlZGlzQ29tcG9uZW50O1xuXG4gICAgcHJpdmF0ZSB3c3M/OiBXZWJTb2NrZXQuU2VydmVyO1xuXG4gICAgY29uc3RydWN0b3IoYXBwbGljYXRpb246IEFwcGxpY2F0aW9uLCBleHByZXNzQXBwQ29tcG9uZW50OiBFeHByZXNzQXBwQ29tcG9uZW50LCBzdG9yZUNvbXBvbmVudDogUmVkaXNDb21wb25lbnQpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5leHByZXNzQXBwQ29tcG9uZW50ID0gZXhwcmVzc0FwcENvbXBvbmVudDtcbiAgICAgICAgdGhpcy5hcHBsaWNhdGlvbiA9IGFwcGxpY2F0aW9uO1xuICAgICAgICB0aGlzLnN0b3JlQ29tcG9uZW50ID0gc3RvcmVDb21wb25lbnQ7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHN0YXJ0KGFwcDogRXhwcmVzcywgcm91dGVyOiBSb3V0ZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgbGlzdGVuZXJzOiB7IFtwOiBzdHJpbmddOiBXZWJTb2NrZXRMaXN0ZW5lciB9ID0gdGhpcy5hcHBsaWNhdGlvbi5nZXRXZWJTb2NrZXRMaXN0ZW5lcnMoKTtcbiAgICAgICAgdGhpcy53c3MgPSBuZXcgV2ViU29ja2V0U2VydmVyKHtcbiAgICAgICAgICAgIHNlcnZlcjogdGhpcy5leHByZXNzQXBwQ29tcG9uZW50LmdldFNlcnZlcigpLFxuICAgICAgICB9LCAoKSA9PiB7XG4gICAgICAgICAgICBMb2dnZXIuaW5mbyhgV2Vic29ja2V0IHNlcnZlciBzdGFydGVkIG92ZXIgd2Vic2VydmVyLmApO1xuICAgICAgICB9KS5vbignZXJyb3InLCAoZXJyKSA9PiB7XG4gICAgICAgICAgICBMb2dnZXIuZXJyb3IoZXJyLCAnQW4gZXJyb3Igb2NjdXJyZWQgaW4gdGhlIHdlYnNvY2tldCBzZXJ2ZXIuJyk7XG4gICAgICAgIH0pLm9uKCdjb25uZWN0aW9uJywgKHNvY2tldCwgcmVxdWVzdCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbGlzdGVuZXIgPSByZXF1ZXN0LnVybCA/IGxpc3RlbmVyc1tyZXF1ZXN0LnVybF0gOiBudWxsO1xuXG4gICAgICAgICAgICBpZiAoIWxpc3RlbmVyKSB7XG4gICAgICAgICAgICAgICAgc29ja2V0LmNsb3NlKDEwMDIsIGBQYXRoIG5vdCBmb3VuZCAke3JlcXVlc3QudXJsfWApO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIXJlcXVlc3QuaGVhZGVycy5jb29raWUpIHtcbiAgICAgICAgICAgICAgICBzb2NrZXQuY2xvc2UoMTAwMiwgYENhbid0IHByb2Nlc3MgcmVxdWVzdCB3aXRob3V0IGNvb2tpZXMuYCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBMb2dnZXIuZGVidWcoYFdlYnNvY2tldCBvbiAke3JlcXVlc3QudXJsfWApO1xuXG4gICAgICAgICAgICBjb25zdCBjb29raWVzID0gY29va2llLnBhcnNlKHJlcXVlc3QuaGVhZGVycy5jb29raWUpO1xuICAgICAgICAgICAgY29uc3Qgc2lkID0gY29va2llUGFyc2VyLnNpZ25lZENvb2tpZShjb29raWVzWydjb25uZWN0LnNpZCddLCBjb25maWcuZ2V0KCdzZXNzaW9uLnNlY3JldCcpKTtcblxuICAgICAgICAgICAgaWYgKCFzaWQpIHtcbiAgICAgICAgICAgICAgICBzb2NrZXQuY2xvc2UoMTAwMik7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBzdG9yZSA9IHRoaXMuc3RvcmVDb21wb25lbnQuZ2V0U3RvcmUoKTtcbiAgICAgICAgICAgIHN0b3JlLmdldChzaWQsIChlcnIsIHNlc3Npb24pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyIHx8ICFzZXNzaW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIExvZ2dlci5lcnJvcihlcnIsICdFcnJvciB3aGlsZSBpbml0aWFsaXppbmcgc2Vzc2lvbiBpbiB3ZWJzb2NrZXQuJyk7XG4gICAgICAgICAgICAgICAgICAgIHNvY2tldC5jbG9zZSgxMDExKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHNlc3Npb24uaWQgPSBzaWQ7XG5cbiAgICAgICAgICAgICAgICBzdG9yZS5jcmVhdGVTZXNzaW9uKDxSZXF1ZXN0PnJlcXVlc3QsIHNlc3Npb24pO1xuICAgICAgICAgICAgICAgIGxpc3RlbmVyLmhhbmRsZShzb2NrZXQsIHJlcXVlc3QsIHNlc3Npb24pLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIExvZ2dlci5lcnJvcihlcnIsICdFcnJvciBpbiB3ZWJzb2NrZXQgbGlzdGVuZXIuJyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHN0b3AoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLndzcykge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5jbG9zZSgnV2ViU29ja2V0IHNlcnZlcicsIHRoaXMud3NzLCB0aGlzLndzcy5jbG9zZSk7XG4gICAgICAgIH1cbiAgICB9XG59Il19