JavaScript
This guide shows the main browser steps for a one-to-one audio call.
1. Get a session from your backend
const session = await fetch('/api/calls/session', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ receiverId: 'receiver-456' }),
}).then((response) => response.json())
2. Connect to WebSocket
const ws = new WebSocket(session.ws_url, ['jwt', session.token])
ws.onmessage = (event) => {
const message = JSON.parse(event.data)
console.log('call event', message)
}
3. Prepare audio
const localStream = await navigator.mediaDevices.getUserMedia({ audio: true })
4. Create peer connection
const pc = new RTCPeerConnection({
iceServers: session.ice_servers,
})
for (const track of localStream.getTracks()) {
pc.addTrack(track, localStream)
}
pc.onicecandidate = (event) => {
if (event.candidate) {
ws.send(JSON.stringify({
event: 'webrtc.ice_candidate',
request_id: crypto.randomUUID(),
data: {
call_uuid: activeCallUuid,
candidate: event.candidate,
},
}))
}
}
5. Send an invite
ws.send(JSON.stringify({
event: 'call.invite',
request_id: crypto.randomUUID(),
data: {
callee_user_id: 'receiver-456',
callee_role: 'receiver',
context_type: 'session',
context_id: 'SESSION-1001',
},
}))
6. Clean up
function cleanup() {
localStream?.getTracks().forEach((track) => track.stop())
pc?.close()
ws?.close()
}