swaf/src/components/WebSocketServerComponent.ts

61 lines
2.0 KiB
TypeScript
Raw Permalink Normal View History

import config from "config";
import {Express, Router} from "express";
2021-11-08 00:52:33 +01:00
import {WebSocketServer} from "ws";
import Application from "../Application.js";
import ApplicationComponent from "../ApplicationComponent.js";
import {logger} from "../Logger.js";
import WebSocketListener from "../WebSocketListener.js";
import ExpressAppComponent from "./ExpressAppComponent.js";
import RedisComponent from "./RedisComponent.js";
2020-04-22 15:52:17 +02:00
export default class WebSocketServerComponent extends ApplicationComponent {
2021-11-08 00:52:33 +01:00
private wss?: WebSocketServer;
2020-04-22 15:52:17 +02:00
public async init(): Promise<void> {
const app = this.getApp();
2021-04-30 13:59:22 +02:00
app.require(ExpressAppComponent);
app.require(RedisComponent);
}
public async initRoutes(router: Router): Promise<void> {
router.use((req, res, next) => {
res.locals.websocketUrl = config.get('app.public_websocket_url');
next();
});
2020-04-22 15:52:17 +02:00
}
public async start(_app: Express): Promise<void> {
const app = this.getApp();
const listeners: { [p: string]: WebSocketListener<Application> } = app.getWebSocketListeners();
2021-11-08 00:52:33 +01:00
this.wss = new WebSocketServer({
server: app.as(ExpressAppComponent).getServer(),
2020-04-22 15:52:17 +02:00
}, () => {
logger.info(`Websocket server started over webserver.`);
2020-04-22 15:52:17 +02:00
}).on('error', (err) => {
logger.error(err, 'An error occurred in the websocket server.');
2020-04-22 15:52:17 +02:00
}).on('connection', (socket, request) => {
const listener = request.url ? listeners[request.url] : null;
if (!listener) {
socket.close(1002, `Path not found ${request.url}`);
return;
}
logger.debug(`Websocket on ${request.url}`);
listener.handle(socket, request).catch(err => {
logger.error(err, 'Error in websocket listener.');
2020-04-22 15:52:17 +02:00
});
});
}
public async stop(): Promise<void> {
const wss = this.wss;
if (wss) {
await this.close('WebSocket server', callback => wss.close(callback));
2020-04-22 15:52:17 +02:00
}
}
}