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.
| Option | Type | Required | Description |
|---|---|---|---|
httpServer | http.Server | Yes | HTTP server for Socket.IO |
redis | ioredis | Yes | Redis client |
socketIO | Object | No | Socket.IO options |
callbacks | Object | No | { onEnd? } |
cloudflare | Object | No | Cloudflare 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