Reading the repo
Opening the box…
Reading the repo
Opening the box…
How to install on Windows
LiveKit browser client SDK (javascript)
Saved setup from 5 h ago
Will it work on Windows?
Users may have multiple input and output devices available. LiveKit will automatically use the one that's deemed as the default device on the system. You may also list and specify an alternative device to use.
We use the same deviceId as one returned by MediaDevices.enumerateDevices().
// list all microphone devices
const devices = await Room.getLocalDevices('audioinput');
// select last device
const device = devices[devices.length - 1];
// in the current room, switch to the selected device and set
// it as default audioinput in the future.
await room.switchActiveDevice('audioinput', device.deviceId);
You can also switch devices given a constraint. This could be useful on mobile devices to switch to a back-facing camera:
await videoTrack.restartTrack({
facingMode: 'environment',
});
When creating tracks using LiveKit APIs (connect, createLocalTracks, setCameraEnabled, etc), it's possible to encounter errors with the underlying media device. In those cases, LiveKit will emit RoomEvent.MediaDevicesError.
You can use the helper MediaDeviceFailure.getFailure(error) to determine specific reason for the error.
PermissionDenied - the user disallowed capturing devicesNotFound - the particular device isn't availableDeviceInUse - device is in use by another process (happens on Windows)These distinctions enables you to provide more specific messaging to the user.
You could also retrieve the last error with LocalParticipant.lastCameraError and LocalParticipant.lastMicrophoneError.
Then run powershell -ExecutionPolicy Bypass -File .\setup.ps1. It stops at the first error and is safe to run again. Servers and tests aren't started; it lists them at the end. Read it first.
Compare yours with the README's “Device management APIs” list above before installing anything.
Needs Git: winget install Git.Git. The repo uses git submodules, so the clone fetches them too.
git clone --recurse-submodules https://github.com/livekit/client-sdk-js.git cd client-sdk-js
Node.js 24
winget install CoreyButler.NVMforWindows nvm install 24 nvm use 24
corepack enable pnpm install
pnpm dev
pnpm test
Examples below are in TypeScript, if using JS/CommonJS imports replace import with:
const livekit = require('livekit-client');
const room = new livekit.Room(...);
// call this some time before actually connecting to speed up the actual connection
room.prepareConnection(url, token);
await room.connect(...);
import {
LocalParticipant,
LocalTrackPublication,
Participant,
RemoteParticipant,
RemoteTrack,
RemoteTrackPublication,
Room,
RoomEvent,
Track,
VideoPresets,
} from 'livekit-client';
// creates a new room with options
const room = new Room({
// automatically manage subscribed video quality
adaptiveStream: true,
// optimize publishing bandwidth and CPU for published tracks
dynacast: true,
// default capture settings
videoCaptureDefaults: {
resolution: VideoPresets.h720.resolution,
},
});
// get your url from livekit's dashboard, or point it at a self hosted livekit deployment
const url = 'ws://localhost:7800';
// generate a token by making a request to a endpoint using the livekit server sdk or
// using a prebuilt TokenSource (documented below)
const token = '...';
// pre-warm connection, this can be called as early as your page is loaded
room.prepareConnection(url, token);
// set up event listeners
room
.on(RoomEvent.TrackSubscribed, handleTrackSubscribed)
.on(RoomEvent.TrackUnsubscribed, handleTrackUnsubscribed)
.on(RoomEvent.ActiveSpeakersChanged, handleActiveSpeakerChange)
.on(RoomEvent.Disconnected, handleDisconnect)
.on(RoomEvent.LocalTrackUnpublished, handleLocalTrackUnpublished);
// connect to room
await room.connect(url, token);
console.log('connected to room', room.name);
// publish local camera and mic tracks
await room.localParticipant.enableCameraAndMicrophone();
function handleTrackSubscribed(
track: RemoteTrack,
publication: RemoteTrackPublication,
participant: RemoteParticipant,
) {
if (track.kind === Track.Kind.Video || track.kind === Track.Kind.Audio) {
// attach it to a new HTMLVideoElement or HTMLAudioElement
const element = track.attach();
parentElement.appendChild(element);
}
}
function handleTrackUnsubscribed(
track: RemoteTrack,
publication: RemoteTrackPublication,
participant: RemoteParticipant,
) {
// remove tracks from all attached elements
track.detach();
}
function handleLocalTrackUnpublished(
publication: LocalTrackPublication,
participant: LocalParticipant,
) {
// when local tracks are ended, update UI to remove them from rendering
publication.track.detach();
}
function handleActiveSpeakerChange(speakers: Participant[]) {
// show UI indicators when participant is speaking
}
function handleDisconnect() {
console.log('disconnected from room');
}
In order to connect to a room, you need to first create an access token.
See authentication docs for details
While LiveKit is designed to be flexible, we've added a few shortcuts that makes working with common track types simple. For a user's camera, microphone, and screen share, you can enable them with the following LocalParticipant methods:
const p = room.localParticipant;
// turn on the local user's camera and mic, this may trigger a browser prompt
// to ensure permissions are granted
await p.setCameraEnabled(true);
await p.setMicrophoneEnabled(true);
// start sharing the user's screen, this will trigger a browser prompt to select
// the screen to share.
await p.setScreenShareEnabled(true);
// disable camera to mute them, when muted, the user's camera indicator will be turned off
await p.setCameraEnabled(false);
Similarly, you can access these common track types on the other participants' end.
// get a RemoteParticipant by their identity
const p = room.remoteParticipants.get('participant-identity');
if (p) {
// if the other user has enabled their camera, attach it to a new HTMLVideoElement
if (p.isCameraEnabled) {
const publication = p.getTrackPublication(Track.Source.Camera);
if (publication?.isSubscribed) {
const videoElement = publication.videoTrack?.attach();
// do something with the element
}
}
}
In some cases, it may be useful to create a track before creating a room. For example, when building a staging area so the user may check their own camera.
You can use our global track creation functions for this:
const tracks = await createLocalTracks({
audio: true,
video: true,
});
LiveKit lets you publish any track as long as it can be represented by a MediaStreamTrack. You can specify a name on the track in order to identify it later.
const pub = await room.localParticipant.publishTrack(mediaStreamTrack, {
name: 'mytrack',
simulcast: true,
// if t
…
No reports for Windows yet.
GitManual AI Agent reads the 11 key files and writes a step-by-step guide for Windows. Once written, it's saved for everyone.