webxash3d-mserver
Version:
WebXash3D MServer
111 lines (110 loc) • 4.56 kB
JavaScript
"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;