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