Skip to content

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

OptionTypeRequiredDescription
tokenstringLiveKit JWT from POST /v1/token
urlstringLiveKit 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     // Date

Methods

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) => {})