Running many WebSocket servers

At Woovi, we have 7 frontends, and each frontend has their own server.
To provide a better DX, we run all the servers inside only one server in development.
Our solution to handle many WebSocket servers in the same server is to have 1 WebSocket server …


This content originally appeared on DEV Community and was authored by Sibelius Seraphini

At Woovi, we have 7 frontends, and each frontend has their own server.
To provide a better DX, we run all the servers inside only one server in development.
Our solution to handle many WebSocket servers in the same server is to have 1 WebSocket server per endpoint.

WebSocket Server per endpoint

import http from 'http';

import WebSocket, { WebSocketServer as WSWebSocketServer } from 'ws';

// work with commonjs and esm
const WebSocketServer = WebSocket.Server || WSWebSocketServer;

export const createWebsocketMiddleware = (
  propertyName = 'ws',
  options = {},
) => {
  if (options instanceof http.Server) options = { server: options };

  const wsServers = {};

  const getOrCreateWebsocketServer = (url: string) => {
    const server = wsServers[url];

    if (server) {
      return server;
    }

    const newServer = new WebSocketServer({
      ...(options.wsOptions || {}),
      noServer: true,
    });

    wsServers[url] = newServer;

    return newServer;
  };

  const websocketMiddleware = async (ctx, next) => {
    const upgradeHeader = (ctx.request.headers.upgrade || '')
      .split(',')
      .map((s) => s.trim());

    if (~upgradeHeader.indexOf('websocket')) {
      const wss = getOrCreateWebsocketServer(ctx.url);

      ctx[propertyName] = () =>
        new Promise((resolve) => {
          wss.handleUpgrade(
            ctx.req,
            ctx.request.socket,
            Buffer.alloc(0),
            (ws) => {
              wss.emit('connection', ws, ctx.req);
              resolve(ws);
            },
          );
          ctx.respond = false;
        });
      ctx.wss = wss;
    }

    await next();
  };

  return websocketMiddleware;
};

Usage

const app = new Koa();

app.use(createWebsocketMiddleware());

const routes = new Router();

routes.all('/ws', async (ctx) => {
   if (ctx.wss) { // check if this is a websocket connection
      // connect to websocket - upgrade
      const client = await ctx.ws(); 
   }
});

Let's deep dive:

getOrCreateWebsocketServer get an existing WebSocket Server or create a new one based on URL
upgradeHeader checks if the request wants to use WebSocket
wss.handleUpgrade upgrades the requests to use WebSocket

To sum up

This is a generic approach, that let you have many WebSocket Server in a single server per endpoint.
It can be used in localhost to improve DX or even in production if you don't have much traffic.

Woovi
Woovi is a Startup that enables shoppers to pay as they like. To make this possible, Woovi provides instant payment solutions for merchants to accept orders.

If you want to work with us, we are hiring!

Photo by Tanbir Mahmud on Unsplash


This content originally appeared on DEV Community and was authored by Sibelius Seraphini


Print Share Comment Cite Upload Translate Updates
APA

Sibelius Seraphini | Sciencx (2023-04-20T13:37:01+00:00) Running many WebSocket servers. Retrieved from https://www.scien.cx/2023/04/20/running-many-websocket-servers/

MLA
" » Running many WebSocket servers." Sibelius Seraphini | Sciencx - Thursday April 20, 2023, https://www.scien.cx/2023/04/20/running-many-websocket-servers/
HARVARD
Sibelius Seraphini | Sciencx Thursday April 20, 2023 » Running many WebSocket servers., viewed ,<https://www.scien.cx/2023/04/20/running-many-websocket-servers/>
VANCOUVER
Sibelius Seraphini | Sciencx - » Running many WebSocket servers. [Internet]. [Accessed ]. Available from: https://www.scien.cx/2023/04/20/running-many-websocket-servers/
CHICAGO
" » Running many WebSocket servers." Sibelius Seraphini | Sciencx - Accessed . https://www.scien.cx/2023/04/20/running-many-websocket-servers/
IEEE
" » Running many WebSocket servers." Sibelius Seraphini | Sciencx [Online]. Available: https://www.scien.cx/2023/04/20/running-many-websocket-servers/. [Accessed: ]
rf:citation
» Running many WebSocket servers | Sibelius Seraphini | Sciencx | https://www.scien.cx/2023/04/20/running-many-websocket-servers/ |

Please log in to upload a file.




There are no updates yet.
Click the Upload button above to add an update.

You must be logged in to translate posts. Please log in or register.