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();