createCall()
The SDK entry point. Returns a Call instance that wraps LiveKit.
ts
import { createCall } from '@rtcstack/sdk'
const call = createCall({
token: '<LiveKit JWT>',
url: 'wss://yourdomain.com/livekit',
// Optional: called before reconnect when token is near expiry
tokenRefresher: async () => {
const { token } = await fetch('/api/refresh-token', { method: 'POST' }).then(r => r.json())
return token
},
})
await call.connect()Options
| Option | Type | Required | Description |
|---|---|---|---|
token | string | ✅ | LiveKit JWT from POST /v1/token |
url | string | ✅ | LiveKit WSS URL (Caddy-proxied) |
tokenRefresher | () => Promise<string> | — | Called before reconnect when token expires |
State
ts
call.connectionState // 'idle' | 'connecting' | 'connected' | 'reconnecting' | 'disconnected'
call.participants // Map<string, Participant>
call.localParticipant // Participant | null
call.activeSpeakers // Participant[]
call.messages // Message[] (last 500)
call.devices // { audioinput, audiooutput, videoinput }
call.layout // 'grid' | 'speaker' | 'spotlight'
call.pinnedParticipant // string | null
call.tokenExpiresAt // DateMethods
ts
await call.connect()
await call.disconnect()
await call.toggleMic()
await call.toggleCamera()
await call.startScreenShare()
await call.stopScreenShare()
await call.switchDevice('audioinput', deviceId)
await call.sendMessage('hello', { to: ['userId'] })
await call.sendReaction('👏')
call.setLayout('speaker')
call.pin('participantId')Events
ts
call.on('connectionStateChanged', (state) => {})
call.on('participantJoined', (participant) => {})
call.on('participantLeft', (participant) => {})
call.on('activeSpeakerChanged', (speakers) => {})
call.on('messageReceived', (message) => {})
call.on('reactionReceived', (from, emoji) => {})
call.on('reconnecting', (attempt) => {})
call.on('reconnected', () => {})
call.on('disconnected', (reason) => {})
call.on('tokenExpired', () => {})
call.on('devicesChanged', (devices) => {})
