71 lines
2.0 KiB
TypeScript
71 lines
2.0 KiB
TypeScript
import express from "express";
|
|
import { Server } from "net";
|
|
import { IClient } from "./models/client";
|
|
import { IMessage } from "./models/message";
|
|
import { Realm } from "./models/realm";
|
|
import { IRealm } from "./models/realm";
|
|
import { CheckBrokenConnections } from "./services/checkBrokenConnections";
|
|
import { IMessagesExpire, MessagesExpire } from "./services/messagesExpire";
|
|
import { IWebSocketServer, WebSocketServer } from "./services/webSocketServer";
|
|
import { MessageHandler } from "./messageHandler";
|
|
import { Api } from "./api";
|
|
import { IConfig } from "./config";
|
|
|
|
export const createInstance = ({ app, server, options }: {
|
|
app: express.Application,
|
|
server: Server,
|
|
options: IConfig;
|
|
}): void => {
|
|
const config = options;
|
|
const realm: IRealm = new Realm();
|
|
const messageHandler = new MessageHandler(realm);
|
|
|
|
const api = Api({ config, realm, messageHandler });
|
|
const messagesExpire: IMessagesExpire = new MessagesExpire({ realm, config, messageHandler });
|
|
const checkBrokenConnections = new CheckBrokenConnections({
|
|
realm,
|
|
config,
|
|
onClose: client => {
|
|
app.emit("disconnect", client);
|
|
}
|
|
});
|
|
|
|
app.use(options.path, api);
|
|
|
|
const wss: IWebSocketServer = new WebSocketServer({
|
|
server,
|
|
realm,
|
|
config
|
|
});
|
|
|
|
wss.on("connection", (client: IClient) => {
|
|
const messageQueue = realm.getMessageQueueById(client.getId());
|
|
|
|
if (messageQueue) {
|
|
let message: IMessage | undefined;
|
|
|
|
while (message = messageQueue.readMessage()) {
|
|
messageHandler.handle(client, message);
|
|
}
|
|
realm.clearMessageQueue(client.getId());
|
|
}
|
|
|
|
app.emit("connection", client);
|
|
});
|
|
|
|
wss.on("message", (client: IClient, message: IMessage) => {
|
|
app.emit("message", client, message);
|
|
messageHandler.handle(client, message);
|
|
});
|
|
|
|
wss.on("close", (client: IClient) => {
|
|
app.emit("disconnect", client);
|
|
});
|
|
|
|
wss.on("error", (error: Error) => {
|
|
app.emit("error", error);
|
|
});
|
|
|
|
messagesExpire.startMessagesExpiration();
|
|
checkBrokenConnections.start();
|
|
}; |