UNPKG

webxash3d-mserver

Version:
111 lines (110 loc) 4.56 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.HTTPMServer = void 0; const fastify_1 = __importDefault(require("fastify")); const websocket_1 = __importDefault(require("@fastify/websocket")); const swagger_1 = __importDefault(require("@fastify/swagger")); const swagger_ui_1 = __importDefault(require("@fastify/swagger-ui")); const ajv_1 = __importDefault(require("ajv")); const mserver_1 = require("./mserver"); const schemas_1 = require("./schemas"); const package_json_1 = __importDefault(require("../package.json")); class HTTPMServer extends mserver_1.MServer { constructor(config) { super(); this.wsConnections = new Map; this.wsRoutes = async (fastify) => { fastify.get('/ws', { websocket: true }, (connection, req) => { const client = this.onClient(); connection.on('message', (message) => { try { const msg = typeof message === 'string' ? message : message.toString(); const data = JSON.parse(msg); if (!this.wsMessageValidate(data)) return; const [event, payload] = data; switch (event) { case 'v1:server.register': this.register(client.id, payload); break; case 'v1:server.unregister': this.unregister(client.id); break; case 'v1:signalling.description': case 'v1:signalling.candidate': const dataToSend = payload; const toClient = this.wsConnections.get(dataToSend.to); if (toClient) { dataToSend.from = client.id; toClient.send(JSON.stringify([event, dataToSend])); } break; } } catch (e) { req.log.error(e); } }); connection.on('close', () => { this.onClientDisconnect(client.id); }); connection.send(JSON.stringify(['v1:connect', { id: client.id }])); }); }; this.httpRoutes = async (fastify) => { fastify.get('/', { schema: schemas_1.ROOT_SCHEMA }, async () => { return { time: Math.floor(Date.now() / 1000) }; }); fastify.get('/v1/servers', { schema: schemas_1.V1_GET_SERVERS_SCHEMA }, async (request) => { return this.fetchServers(request.query); }); }; this.ajv = new ajv_1.default(); this.wsMessageValidate = this.ajv.compile(schemas_1.WS_MESSAGE_SCHEMA); this.config = config; this.fastify = (0, fastify_1.default)({ logger: { transport: config.enablePrettyLogs ? { target: 'pino-pretty', } : undefined, level: config.logLevel, } }); this.fastify.register(websocket_1.default); if (!this.config.disableDocs) { this.fastify.register(swagger_1.default, { swagger: { info: { title: package_json_1.default.name, description: package_json_1.default.description, version: package_json_1.default.version, }, }, }); this.fastify.register(swagger_ui_1.default, { routePrefix: '/docs', uiConfig: { docExpansion: 'full', deepLinking: false } }); } this.fastify.register(this.httpRoutes); this.fastify.register(this.wsRoutes); } async start() { await this.fastify.listen({ port: this.config.port }); } } exports.HTTPMServer = HTTPMServer;