Server Integration (webrtc-server-library)

Server-side WebRTC signaling and room management. Manages Socket.IO connections and RTC sessions. Does not handle media; media is peer-to-peer or via SFU.

Overview

Responsibilities

  • Socket.IO connection handling and event routing
  • RTC session lifecycle (create, join, leave, end)
  • Redis-backed session state for multi-instance scaling
  • Optional: Cloudflare Workers SFU orchestration

The library creates a Socket.IO server, configures the Redis adapter for scaling, and registers handlers for all signaling events.

Redis: Required for session state and Socket.IO adapter. Stateless server: All session state is stored in Redis. Any instance can handle any connection.

Backend SDK structure (webrtc-server-library)

In the downloaded SDK package, the backend lives in webrtc-server-library/:

webrtc-server-library/
├── package.json   # main: "index.js"
├── index.js       # createWebRTCServer(opts), WebRTCServer
└── examples/
    └── index.js   # Minimal server: new WebRTCServer(), config, start()

Run npm install in this folder to install dependencies (e.g. socket.io, ioredis, express). Then require('webrtc-server-library') or point your app at this path. See the Public API section below for createWebRTCServer and WebRTCServer.

Public API

createWebRTCServer(opts)

Plugin-style setup. Does not create HTTP server or call listen. Attach to an existing HTTP server.

OptionTypeRequiredDescription
httpServerhttp.ServerYesHTTP server for Socket.IO
redisioredisYesRedis client
socketIOObjectNoSocket.IO options
callbacksObjectNo{ onEnd? }
cloudflareObjectNoCloudflare SFU config

Returns: { router, io, socketManager } — router has POST /rtc-session/leave-beacon; mount via app.use('/api', router).

Example: Plugin mode (Express)

const express = require('express');
const http = require('http');
const Redis = require('ioredis');
const { createWebRTCServer } = require('webrtc-server-library');

const app = express();
const httpServer = http.createServer(app);
const redis = new Redis({ host: 'localhost', port: 6379 });

const { router, io } = createWebRTCServer({
  httpServer,
  redis,
  callbacks: {
    onEnd: ({ rtc_session_id }) => console.log('Session ended:', rtc_session_id),
  },
});

app.use('/api', router);
httpServer.listen(3000);

Example: Standalone mode

const { WebRTCServer } = require('webrtc-server-library');

const server = new WebRTCServer();
server.config.port = 3000;
server.config.redis = { host: 'localhost', port: 6379 };

await server.start();
// Server listens on port 3000

WebRTCServer

Standalone server that creates app, HTTP server, and Redis.

Config: config.port (default 3000), config.redis, config.socketIO, config.cloudflare, config.callbacks.

Methods: start(), stop(), getIO(), getRedis(), getSocketManager().

Callbacks

onEnd({ rtc_session_id }) — Called after a session is ended (e.g. for licensing or metrics).

Examples

webrtc-server-library includes a minimal example server in examples/:

const WebRTCServer = require('webrtc-server-library');

const server = new WebRTCServer();
server.config.port = 3000;
server.config.redis = { host: 'localhost', port: 6379, db: 2 };
server.config.socketIO = {
  transports: ['websocket'],
  cors: { origin: '*', credentials: true },
};

server.start().then(() => console.log('Server on port 3000'));

Run: From webrtc-server-library root: npm run build then node examples/index.js. Requires Redis on localhost:6379 (db 2).

Pair with the client SDK examples (webrtc-library examples/vanilla/ or examples/react/) — point the client to http://localhost:3000.

Authentication

Rejects connections without id in handshake query. id is the user ID; name and image are optional. No token validation in the library; validate in Express middleware before Socket.IO upgrade, or in custom Socket.IO middleware.

Events & Lifecycle

Client connects with query: id, name?, image?, token?. Client emits rtc-session:join; response via rtc-session:join:response. Client emits rtc-session:leave to leave.

Deployment

Use HTTPS with a reverse proxy. Forward WebSocket upgrade headers. Default port 3000. Leave beacon: POST /api/rtc-session/leave-beacon with user_session_id.

Not Included

  • TURN server — Provide your own; add TURN to client rtcConfig.iceServers
  • Media transcoding — Media is peer-to-peer or SFU; no transcoding on this server
  • Media recording — Not implemented
  • Built-in auth — Validate tokens in your middleware