Skip to main content

Web SDK

TgoRTC Web (JavaScript/React) SDK for real-time audio/video communication based on LiveKit.

Installation

npm install tgortc-js-sdk
# or
yarn add tgortc-js-sdk
# or
pnpm add tgortc-js-sdk

Peer Dependencies

npm install react react-dom

Quick Start

1. Initialize SDK

import { TgoRTC } from 'tgortc-js-sdk';

// Initialize with options
TgoRTC.instance.init({
debug: true, // Enable debug logging
mirror: false, // Enable video mirroring
});

2. Create Room Info and Join

import { RoomInfo, RTCType } from 'tgortc-js-sdk';

// Create room info
const roomInfo = new RoomInfo(
'room-name', // Room name
'your-token', // LiveKit Token
'wss://your-server', // LiveKit server URL
'local-user-id', // Current user ID
'creator-user-id' // Room creator ID
);

// Optional: Configure room settings
roomInfo.maxParticipants = 4;
roomInfo.rtcType = RTCType.Video;
roomInfo.timeout = 30; // Participant join timeout in seconds

// Join room
await TgoRTC.instance.roomManager.joinRoom(roomInfo, {
micEnabled: true,
cameraEnabled: true,
screenShareEnabled: false,
});

3. Listen to Connection Status

import { ConnectStatus } from 'tgortc-js-sdk';

const handleConnectStatus = (
roomName: string,
status: ConnectStatus,
reason: string
) => {
console.log(`Room ${roomName}: ${status} - ${reason}`);

switch (status) {
case ConnectStatus.Connected:
console.log('Connected to room');
break;
case ConnectStatus.Disconnected:
console.log('Disconnected from room');
break;
case ConnectStatus.Reconnecting:
console.log('Reconnecting...');
break;
}
};

// Add listener
TgoRTC.instance.roomManager.addConnectListener(handleConnectStatus);

// Remove listener
TgoRTC.instance.roomManager.removeConnectListener(handleConnectStatus);

4. Get Participants

// Get local participant
const localParticipant = TgoRTC.instance.participantManager.getLocalParticipant();

// Get all remote participants
const remoteParticipants = TgoRTC.instance.participantManager.getRemoteParticipants();

// Get all participants (local + remote)
const allParticipants = TgoRTC.instance.participantManager.getAllParticipants();

// Listen for new participants
TgoRTC.instance.participantManager.addNewParticipantListener((participant) => {
console.log('New participant joined:', participant.uid);
});

5. Media Control and Events

Media control is only available for local participants.

const participant = TgoRTC.instance.participantManager.getLocalParticipant();

if (participant) {
// ========== Media Control ==========

// Toggle microphone (local participant only)
await participant.setMicrophoneEnabled(true);

// Toggle camera (local participant only)
await participant.setCameraEnabled(true);

// Toggle screen share (local participant only)
await participant.setScreenShareEnabled(true);

// Switch camera front/back (local participant only)
await participant.switchCamera();

// Toggle speakerphone (local participant only)
await participant.toggleSpeakerphone();

// Check media status
const micEnabled = participant.getMicrophoneEnabled();
const cameraEnabled = participant.getCameraEnabled();
const speakerEnabled = participant.getSpeakerEnabled();

// ========== Event Listeners ==========

// Microphone status change
participant.addMicrophoneStatusListener((enabled) => {
console.log('Microphone:', enabled ? 'on' : 'off');
});

// Camera status change
participant.addCameraStatusListener((enabled) => {
console.log('Camera:', enabled ? 'on' : 'off');
});

// Speaker status change
participant.addSpeakerStatusListener((enabled) => {
console.log('Speaker:', enabled ? 'on' : 'off');
});

// Speaking status change
participant.addSpeakingListener((isSpeaking) => {
console.log('Speaking:', isSpeaking);
});

// Connection quality change (good / poor / unknown)
participant.addConnQualityListener((quality) => {
console.log('Connection quality:', quality);
});

// Participant joined room
participant.addJoinedListener(() => {
console.log('Participant joined');
});

// Participant left room
participant.addLeaveListener(() => {
console.log('Participant left');
});

// Participant timeout (did not join within specified time)
participant.addTimeoutListener(() => {
console.log('Participant timeout');
});

// Video info change (resolution, bitrate, etc.)
participant.addVideoInfoListener((info) => {
console.log('Video info:', info.width, 'x', info.height, info.frameRate, 'fps');
});

// ========== Remove Listeners ==========

// Always remove listeners when page is disposed to avoid memory leaks
participant.removeMicrophoneStatusListener(listener);
participant.removeCameraStatusListener(listener);
participant.removeSpeakerStatusListener(listener);
participant.removeConnQualityListener(listener);
participant.removeJoinedListener(listener);
participant.removeLeaveListener(listener);
participant.removeTimeoutListener(listener);
participant.removeVideoInfoListener(listener);
}

6. Render Video Track (React Component)

import { useRef, useState, useEffect } from 'react';
import {
TgoTrackRenderer,
TgoTrackRendererHandle,
TgoParticipant,
TgoRTC
} from 'tgortc-js-sdk';
import { Track } from 'livekit-client';

function VideoView() {
const rendererRef = useRef<TgoTrackRendererHandle>(null);
const [participant, setParticipant] = useState<TgoParticipant | null>(null);

useEffect(() => {
const local = TgoRTC.instance.participantManager.getLocalParticipant();
setParticipant(local);
}, []);

return (
<TgoTrackRenderer
ref={rendererRef}
participant={participant}
source={Track.Source.Camera}
fit="cover"
mirror={true}
placeholder={<div>Waiting for video...</div>}
onTrackChange={(hasTrack) => {
console.log('Track available:', hasTrack);
}}
/>
);
}

7. Audio Device Management

// Get audio devices
const inputDevices = await TgoRTC.instance.audioManager.getAudioInputDevices();
const outputDevices = await TgoRTC.instance.audioManager.getAudioOutputDevices();

// Listen to device changes
TgoRTC.instance.audioManager.addDeviceChangeListener((devices) => {
console.log('Devices changed:', devices);
});

// Toggle speakerphone
await TgoRTC.instance.audioManager.toggleSpeakerphone();

8. Leave Room

await TgoRTC.instance.roomManager.leaveRoom();

API Reference

TgoRTC

Main SDK entry point (singleton).

PropertyTypeDescription
instanceTgoRTCSingleton instance
optionsOptionsSDK configuration
roomManagerTgoRoomManagerRoom management
participantManagerTgoParticipantManagerParticipant management
audioManagerTgoAudioManagerAudio device management

TgoRoomManager

MethodDescription
joinRoom(roomInfo, options?)Join a room
leaveRoom()Leave current room
addConnectListener(listener)Add connection status listener
removeConnectListener(listener)Remove connection status listener

TgoParticipantManager

MethodDescription
getLocalParticipant()Get local participant
getRemoteParticipants(includeTimeout?)Get remote participants
getAllParticipants(includeTimeout?)Get all participants
inviteParticipant(uids)Invite participants by UID
addNewParticipantListener(listener)Listen for new participants

TgoParticipant

Media Control Methods

MethodDescription
setMicrophoneEnabled(enabled)Enable/disable microphone
setCameraEnabled(enabled)Enable/disable camera
setScreenShareEnabled(enabled)Enable/disable screen share
switchCamera()Switch front/back camera
toggleSpeakerphone()Toggle speakerphone

Status Methods

MethodDescription
getMicrophoneEnabled()Get microphone status
getCameraEnabled()Get camera status
getScreenShareEnabled()Get screen share status
getSpeakerEnabled()Get speakerphone status
getVideoTrack(source?)Get video track
getAudioLevel()Get audio level (0-1)
getIsSpeaking()Check if speaking

Event Listener Methods

MethodDescription
addMicrophoneStatusListener(listener)Listen for microphone changes
addCameraStatusListener(listener)Listen for camera changes
addSpeakerStatusListener(listener)Listen for speaker changes
addSpeakingListener(listener)Listen for speaking status
addConnQualityListener(listener)Listen for connection quality
addJoinedListener(listener)Listen for participant join
addLeaveListener(listener)Listen for participant leave
addTimeoutListener(listener)Listen for participant timeout
addVideoInfoListener(listener)Listen for video info changes
remove...Listener(listener)Remove corresponding listener

Properties

PropertyTypeDescription
uidstringParticipant ID
isLocalbooleanIs local participant
hasJoinedbooleanHas joined room
isTimeoutbooleanHas timed out
currentVideoInfoVideoInfoCurrent video info

TgoTrackRenderer (React Component)

PropTypeDefaultDescription
participantTgoParticipant | null-Participant to render
sourceTrack.SourceCameraTrack source type
fit'cover' | 'contain' | 'fill''cover'Video fit mode
mirrorbooleanSDK optionMirror video
placeholderReactNode-Placeholder when no video
onTrackChange(hasTrack: boolean) => void-Track change callback
Ref MethodDescription
refresh()Manually refresh video track
setParticipant(participant)Update participant

Enums

ConnectStatus

enum ConnectStatus {
Connecting = 'connecting', // Connecting
Connected = 'connected', // Connected
Reconnecting = 'reconnecting', // Reconnecting
Reconnected = 'reconnected', // Reconnected
Disconnected = 'disconnected', // Disconnected
}

RTCType

enum RTCType {
Audio = 'audio', // Audio only
Video = 'video', // Audio + Video
}

TgoConnectionQuality

enum TgoConnectionQuality {
Unknown = 'unknown', // Unknown
Excellent = 'excellent', // Excellent
Good = 'good', // Good
Poor = 'poor', // Poor
Lost = 'lost', // Lost
}

TgoCameraPosition

enum TgoCameraPosition {
Front = 'front', // Front camera
Back = 'back', // Back camera
}

RoomInfo Class

Room information class for configuring room connections.

class RoomInfo {
roomName: string; // Room name
token: string; // LiveKit Token
url: string; // LiveKit server URL
loginUID: string; // Current user ID
creatorUID: string; // Room creator ID
maxParticipants: number; // Max participants (default 2)
rtcType: RTCType; // Call type (default Audio)
isP2P: boolean; // Is P2P (default true)
uidList: string[]; // Participant list
timeout: number; // Timeout in seconds (default 30)

// Methods
getP2PToUID(): string; // Get P2P target user
isCreator(): boolean; // Check if creator
}

Configuration Options

interface Options {
mirror: boolean; // Video mirroring (default false)
debug: boolean; // Debug mode (default true)
}

Best Practices

Use useRef to Store Participant Reference

In React, use useRef to store participant reference to avoid stale closures in event listeners:

import { useRef, useEffect, useCallback } from 'react';
import { TgoRTC, TgoParticipant } from 'tgortc-js-sdk';

function CallPage({ roomInfo }) {
const localParticipantRef = useRef<TgoParticipant | null>(null);
const cleanupRef = useRef<(() => void) | null>(null);

useEffect(() => {
const joinRoom = async () => {
await TgoRTC.instance.roomManager.joinRoom(roomInfo, {
micEnabled: true,
cameraEnabled: true,
});

// Store participant reference
const participant = TgoRTC.instance.participantManager.getLocalParticipant();
localParticipantRef.current = participant;

// Add listeners and save cleanup function
if (participant) {
const onMicChange = (enabled: boolean) => console.log('Mic:', enabled);
const onCameraChange = (enabled: boolean) => console.log('Camera:', enabled);

participant.addMicrophoneStatusListener(onMicChange);
participant.addCameraStatusListener(onCameraChange);

cleanupRef.current = () => {
participant.removeMicrophoneStatusListener(onMicChange);
participant.removeCameraStatusListener(onCameraChange);
};
}
};

joinRoom();

return () => {
// Cleanup listeners
cleanupRef.current?.();
// Leave room
TgoRTC.instance.roomManager.leaveRoom();
};
}, [roomInfo]);

const handleMicToggle = useCallback(async () => {
const participant = localParticipantRef.current;
if (participant) {
const current = participant.getMicrophoneEnabled();
await participant.setMicrophoneEnabled(!current);
}
}, []);

return <button onClick={handleMicToggle}>Toggle Mic</button>;
}

Listen for Remote Participants

Use addNewParticipantListener to listen for new participants and add event listeners:

const participantManager = TgoRTC.instance.participantManager;

// Listen for new participants
participantManager.addNewParticipantListener((participant) => {
console.log('New participant:', participant.uid);

// Listen to remote participant events
participant.addJoinedListener(() => {
console.log(`${participant.uid} joined`);
});

participant.addLeaveListener(() => {
console.log(`${participant.uid} left`);
});

participant.addCameraStatusListener((enabled) => {
console.log(`${participant.uid} camera:`, enabled);
});
});

Handle Timeout

Use addTimeoutListener to handle participant timeout (did not join within specified time):

// Listen for remote participant timeout
remoteParticipant.addTimeoutListener(() => {
console.log('Remote user did not answer, ending call');
handleHangup();
});

// Listen for local timeout (room connection timeout)
localParticipant.addTimeoutListener(() => {
console.log('Connection timeout');
handleHangup();
});