73 lines
11 KiB
JavaScript
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiV2ViU29ja2V0U2VydmVyQ29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Ii4vIiwic291cmNlcyI6WyJjb21wb25lbnRzL1dlYlNvY2tldFNlcnZlckNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSxPQUFPLG9CQUFvQixNQUFNLHlCQUF5QixDQUFDO0FBRTNELE9BQWtCLEVBQUMsTUFBTSxJQUFJLGVBQWUsRUFBQyxNQUFNLElBQUksQ0FBQztBQUN4RCxPQUFPLE1BQU0sTUFBTSxXQUFXLENBQUM7QUFDL0IsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sWUFBWSxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFNNUIsTUFBTSxDQUFDLE9BQU8sT0FBTyx3QkFBeUIsU0FBUSxvQkFBMEI7SUFPNUUsWUFBWSxXQUF3QixFQUFFLG1CQUF3QyxFQUFFLGNBQThCO1FBQzFHLEtBQUssRUFBRSxDQUFDO1FBQ1IsSUFBSSxDQUFDLG1CQUFtQixHQUFHLG1CQUFtQixDQUFDO1FBQy9DLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1FBQy9CLElBQUksQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFDO0lBQ3pDLENBQUM7SUFFWSxLQUFLLENBQUMsR0FBWSxFQUFFLE1BQWM7O1lBQzNDLE1BQU0sU0FBUyxHQUF1QyxJQUFJLENBQUMsV0FBVyxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFDL0YsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLGVBQWUsQ0FBQztnQkFDM0IsTUFBTSxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLEVBQUU7YUFDL0MsRUFBRSxHQUFHLEVBQUU7Z0JBQ0osTUFBTSxDQUFDLElBQUksQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO1lBQzVELENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRTtnQkFDbkIsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsNENBQTRDLENBQUMsQ0FBQztZQUNwRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsWUFBWSxFQUFFLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxFQUFFO2dCQUNwQyxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7Z0JBRTdELElBQUksQ0FBQyxRQUFRLEVBQUU7b0JBQ1gsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsa0JBQWtCLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO29CQUNwRCxPQUFPO2lCQUNWO3FCQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRTtvQkFDaEMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsd0NBQXdDLENBQUMsQ0FBQztvQkFDN0QsT0FBTztpQkFDVjtnQkFFRCxNQUFNLENBQUMsS0FBSyxDQUFDLGdCQUFnQixPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztnQkFFNUMsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUNyRCxNQUFNLEdBQUcsR0FBRyxZQUFZLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQztnQkFFNUYsSUFBSSxDQUFDLEdBQUcsRUFBRTtvQkFDTixNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNuQixPQUFPO2lCQUNWO2dCQUVELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQzdDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxFQUFFO29CQUM1QixJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRTt3QkFDakIsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsZ0RBQWdELENBQUMsQ0FBQzt3QkFDcEUsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQzt3QkFDbkIsT0FBTztxQkFDVjtvQkFFRCxPQUFPLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQztvQkFFakIsS0FBSyxDQUFDLGFBQWEsQ0FBVSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7b0JBQy9DLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUU7d0JBQ2xELE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLDhCQUE4QixDQUFDLENBQUM7b0JBQ3RELENBQUMsQ0FBQyxDQUFDO2dCQUNQLENBQUMsQ0FBQyxDQUFDO1lBQ1AsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDO0tBQUE7SUFFWSxJQUFJOztZQUNiLElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRTtnQkFDVixNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ2xFO1FBQ0wsQ0FBQztLQUFBO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQXBwbGljYXRpb25Db21wb25lbnQgZnJvbSBcIi4uL0FwcGxpY2F0aW9uQ29tcG9uZW50XCI7XG5pbXBvcnQge0V4cHJlc3MsIFJlcXVlc3QsIFJvdXRlcn0gZnJvbSBcImV4cHJlc3NcIjtcbmltcG9ydCBXZWJTb2NrZXQsIHtTZXJ2ZXIgYXMgV2ViU29ja2V0U2VydmVyfSBmcm9tIFwid3NcIjtcbmltcG9ydCBMb2dnZXIgZnJvbSBcIi4uL0xvZ2dlclwiO1xuaW1wb3J0IGNvb2tpZSBmcm9tIFwiY29va2llXCI7XG5pbXBvcnQgY29va2llUGFyc2VyIGZyb20gXCJjb29raWUtcGFyc2VyXCI7XG5pbXBvcnQgY29uZmlnIGZyb20gXCJjb25maWdcIjtcbmltcG9ydCBFeHByZXNzQXBwQ29tcG9uZW50IGZyb20gXCIuL0V4cHJlc3NBcHBDb21wb25lbnRcIjtcbmltcG9ydCBBcHBsaWNhdGlvbiBmcm9tIFwiLi4vQXBwbGljYXRpb25cIjtcbmltcG9ydCBSZWRpc0NvbXBvbmVudCBmcm9tIFwiLi9SZWRpc0NvbXBvbmVudFwiO1xuaW1wb3J0IFdlYlNvY2tldExpc3RlbmVyIGZyb20gXCIuLi9XZWJTb2NrZXRMaXN0ZW5lclwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBXZWJTb2NrZXRTZXJ2Z
|