![Create React App Officially Deprecated Amid React 19 Compatibility Issues](https://cdn.sanity.io/images/cgdhsj6q/production/04fa08cf844d798abc0e1a6391c129363cc7e2ab-1024x1024.webp?w=400&fit=max&auto=format)
Security News
Create React App Officially Deprecated Amid React 19 Compatibility Issues
Create React App is officially deprecated due to React 19 issues and lack of maintenance—developers should switch to Vite or other modern alternatives.
livekit-client
Advanced tools
livekit-client
is the official client SDK for LiveKit. With it, you can add real time video and audio to your web apps.
Docs and guides at https://docs.livekit.io
yarn add livekit-client
npm install livekit-client --save
Examples below are in TypeScript, if using JS/CommonJS imports replace import with:
const LiveKit = require('livekit-client');
LiveKit.connect(...);
import {
connect,
RoomEvent,
RemoteParticipant,
RemoteTrackPublication,
RemoteTrack,
Participant,
} from 'livekit-client';
connect('ws://localhost:7800', token, {
audio: true,
video: true,
}).then((room) => {
console.log('connected to room', room.name);
console.log('participants in room:', room.participants.size);
room
.on(RoomEvent.TrackSubscribed, handleTrackSubscribed)
.on(RoomEvent.TrackUnsubscribed, handleTrackUnsubscribed)
.on(RoomEvent.ActiveSpeakersChanged, handleActiveSpeakerChange)
.on(RoomEvent.Disconnected, handleDisconnect);
});
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 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 access token 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 sid
const p = room.participants.get('participant-sid');
if (p) {
// if the other user has enabled their camera, attach it to a new HTMLVideoElement
if (p.isCameraEnabled) {
const track = p.getTrack(Track.Source.Camera);
if (track?.isSubscribed) {
const videoElement = track.attach()
// do something with the element
}
}
}
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 this should be treated like a camera feed, tag it as such
// supported known sources are .Camera, .Microphone, .ScreenShare
source: Track.Source.Camera,
})
// you may mute or unpublish the track later
pub.setMuted(true);
room.localParticipant.unpublishTrack(mediaStreamTrack)
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',
});
Browsers can be restrictive with regards to audio playback that is not initiated by user interaction. What each browser considers as user interaction can vary by vendor (for example, Safari on iOS is very restrictive).
LiveKit will attempt to autoplay all audio tracks when you attach them to audio elements. However, if that fails, we'll notify you via RoomEvent.AudioPlaybackStatusChanged
. Room.canPlayAudio
will indicate if audio playback is permitted. LiveKit takes an optimistic approach so it's possible for this value to change from true
to false
when we encounter a browser error.
In the case user interaction is required, LiveKit provides Room.startAudio
to start audio playback. This function must be triggered in an onclick or ontap event handler. In the same session, once audio playback is successful, additional audio tracks can be played without further user interactions.
room.on(RoomEvent.AudioPlaybackStatusChanged, () => {
if (!room.canPlayAudio) {
// UI is necessary.
...
button.onclick = () => {
// startAudio *must* be called in an click/tap handler.
room.startAudio().then(() => {
// successful, UI can be removed now
button.remove();
});
}
}
});
This library uses loglevel for its internal logs. You can change the effective log level with the logLevel
field in ConnectOptions
.
example/sample.ts contains a demo webapp that uses the SDK. Run it with yarn sample
Browser | Desktop OS | Mobile OS |
---|---|---|
Chrome | Windows, macOS, Linux | Android |
Firefox | Windows, macOS, Linux | Android |
Safari | macOS | iOS |
Edge (Chromium) | Windows, macOS |
FAQs
JavaScript/TypeScript client SDK for LiveKit
The npm package livekit-client receives a total of 70,118 weekly downloads. As such, livekit-client popularity was classified as popular.
We found that livekit-client demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 29 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
Create React App is officially deprecated due to React 19 issues and lack of maintenance—developers should switch to Vite or other modern alternatives.
Security News
Oracle seeks to dismiss fraud claims in the JavaScript trademark dispute, delaying the case and avoiding questions about its right to the name.
Security News
The Linux Foundation is warning open source developers that compliance with global sanctions is mandatory, highlighting legal risks and restrictions on contributions.