WebRTC SFU — Playground

Configuration Step 1

Broadcast Room Tokens

Call Room Tokens

Broadcast Step 2

Publisher Publish
Idle
Camera preview
// 1. Create a broadcast room
const resp = await fetch(`${serverUrl}/v1/rooms`, {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'Authorization': `Bearer ${apiKey}`
  },
  body: JSON.stringify({ room_type: 'broadcast' })
});
const room = await resp.json();

// 2. Get camera & microphone
const stream = await navigator.mediaDevices.getUserMedia({
  video: true, audio: true
});

// 3. Publish via SDK
const lr = new LiveRelay({ server: serverUrl });
const session = await lr.publish({
  token: room.tokens.publish,
  stream: stream,
  onStateChange: (state) => console.log('Publisher:', state)
});

// 4. Stop when done
session.close();
Subscriber Subscribe
Idle
Waiting for stream
// Subscribe to a broadcast
const lr = new LiveRelay({ server: serverUrl });
const session = await lr.subscribe({
  token: room.tokens.subscribe,
  element: document.getElementById('my-video'),
  onStateChange: (state) => console.log('Subscriber:', state)
});

// Stop when done
session.close();

Call 1:1 Step 3

Peer A Caller
Idle
Local camera
Remote stream
Peer B Callee
Idle
Local camera
Remote stream
// 1. Create a call room
const resp = await fetch(`${serverUrl}/v1/rooms`, {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'Authorization': `Bearer ${apiKey}`
  },
  body: JSON.stringify({ room_type: 'call' })
});
const room = await resp.json();
// room.tokens.caller  → for Peer A
// room.tokens.callee  → for Peer B

// 2. Each peer joins with their token
const lr = new LiveRelay({ server: serverUrl });
const stream = await navigator.mediaDevices.getUserMedia({
  video: true, audio: true
});

const session = await lr.call({
  token: room.tokens.caller,   // or room.tokens.callee
  stream: stream,
  element: document.getElementById('remote-video'),
  localElement: document.getElementById('local-video'),
  onStateChange: (state) => console.log('Call:', state)
});

// 3. Hang up
session.close();

Logs