Server.ts 1.37 KB
import express from "express";
import socketIo, { Server as IoServer } from "socket.io";
import { createServer as createServerHttps } from "https";
import { createServer as createServerHttp } from "http";
import { RoomManager } from "./room/RoomManager";
import { Connection } from "./connection/Connection";
import { SocketIoWrapper } from "./connection/SocketWrapper";
import { readFileSync } from "fs";

export class Server {
  public readonly port: number;
  private readonly io: IoServer;

  constructor(port: number) {
    this.port = port;

    console.log(`Running in ${process.env.NODE_ENV} mode.`);

    const app = express();
    let server;
    if (process.env.NODE_ENV === "development") {
      server = createServerHttp(app);
    } else {
      server = createServerHttps(
        {
          cert: readFileSync(process.env.SSL_CERT as string),
          key: readFileSync(process.env.SSL_KEY as string),
          ca: readFileSync(process.env.SSL_CA as string),
        },
        app
      );
    }
    this.io = new socketIo.Server(server, {
      cors: {
        origin: "*",
      },
    });

    const roomManager = new RoomManager();

    this.io.on("connection", (socket) => {
      new Connection(new SocketIoWrapper(socket), roomManager);
    });

    server.listen(port, () => console.log(`Listening on ${port}`));
  }

  public close(): void {
    this.io.close();
  }
}