All files / app server.ts

0% Statements 0/61
0% Branches 0/1
0% Functions 0/1
0% Lines 0/61

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62                                                                                                                           
import http from 'http';
import { ListenOptions, Socket } from 'node:net';
import app from './app.js';
import { RedisClientInstance } from './storage/redisClient.js';
import { Logger } from './utils/logger.js';

const port = parseInt(process.env.PORT || '3000', 10);

const connections = new Map<string, Socket>();

const server = http.createServer(app);

const promisifyListen = (serverInstance: http.Server, options: ListenOptions) => {
  return new Promise((resolve) => {
    serverInstance.listen(options, () => {
      return resolve(serverInstance);
    });
  });
};

const storeConnections = (server: http.Server) => {
  server.on('connection', (conn: Socket) => {
    const key = `${conn.remoteAddress}:${conn.remotePort}`;
    connections.set(key, conn);

    conn.on('close', () => {
      connections.delete(key);
    });
  });
};

const releaseConnections = () => {
  server.close();

  connections.forEach((conn) => {
    conn.destroy();
  });
};

const serverWrapper = {
  async start() {
    await promisifyListen(server, { port });

    Logger.log(`️Server is running at PORT: ${port}`);

    storeConnections(server);

    return this;
  },

  async stop() {
    releaseConnections();
    await RedisClientInstance.disconnectClient();

    Logger.log('Connections are closed. Process is exiting');

    process.exit();
  },
};

export default serverWrapper;