Configuring WebSocket Server

1. Setting Server Options

OptionDefaultDescription
portListen port (omit with server)
backlog511TCP backlog queue
maxPayload100 MiBMax message size
clientTrackingtrueMaintain wss.clients Set
perMessageDeflatefalseCompression
handleProtocolsSubprotocol selector
verifyClientSync/async accept gate
skipUTF8ValidationfalseSkip UTF-8 check (faster, risky)

2. Configuring Connection Limits

LimitWhere
Max connectionsApp-level count in connection
Per-IPTrack IP→count map
File descriptorsulimit -n ≥ N+overhead
BacklogOS somaxconn

Example: Reject over limit

const MAX = 10000;
wss.on("connection", (ws) => {
  if (wss.clients.size > MAX) ws.close(1013, "server-busy");
});

3. Setting Timeout Options

TimeoutDetail
Handshakeserver.headersTimeout / requestTimeout
IdleApp heartbeat detects + closes
LB idleTypically 60s; ping < that
TCP keep-alivesocket.setKeepAlive(true, ms)

4. Enabling Compression

Example: permessage-deflate

new WebSocketServer({
  port: 8080,
  perMessageDeflate: {
    zlibDeflateOptions: { chunkSize: 1024, memLevel: 7, level: 3 },
    threshold: 1024,        // only compress >1KB
    concurrencyLimit: 10,
    clientNoContextTakeover: true,
    serverNoContextTakeover: true
  }
});
OptionDetail
thresholdMin size to compress
level1 (fast) – 9 (max)
*NoContextTakeoverTrade ratio for memory

5. Configuring Compression Options

ParameterEffect
server_max_window_bitsWindow size (8-15)
client_max_window_bitsSame, for client
server_no_context_takeoverReset state per message
client_no_context_takeoverSame, for client
Warning: Without noContextTakeover, each connection holds zlib state ~256 KB → 10k clients ≈ 2.5 GB RAM.

6. Setting Client Tracking

ModeWhen
clientTracking: trueNeed broadcast
clientTracking: falseCustom registry, save memory

7. Configuring Verify Client

Example: Async accept

new WebSocketServer({
  port: 8080,
  verifyClient: async ({ req }, cb) => {
    const ok = await isAuthorized(req);
    cb(ok, ok ? undefined : 401, ok ? undefined : "unauthorized");
  }
});
SignatureUse
(info) syncBoolean accept
(info, cb) asynccb(ok, code, reason)

8. Handling Upgrade Request

Example: Manual upgrade

const wss = new WebSocketServer({ noServer: true });
httpServer.on("upgrade", async (req, sock, head) => {
  if (!await authenticate(req)) {
    sock.write("HTTP/1.1 401 Unauthorized\r\n\r\n"); sock.destroy(); return;
  }
  wss.handleUpgrade(req, sock, head, (ws) => wss.emit("connection", ws, req));
});
StepDetail
Inspect reqURL, headers, cookies
AuthenticateJWT, session
AuthorizeRBAC, route
handleUpgradeFinalize WS or destroy socket

9. Setting No Server Mode

BenefitDetail
RoutingMultiple WSS on one HTTP server
Auth before upgradeReject with HTTP status
Custom errorsWrite HTTP response manually

10. Configuring Environment Variables

VarUse
PORTListen port
WS_MAX_PAYLOADLimit override
REDIS_URLPub/sub backplane
JWT_SECRETToken verify
NODE_ENVToggle debug/log levels