@voxket-ai/voxket-live
Version:
A React widget for embedding Voxket-powered audio/video/chat experiences.
203 lines (202 loc) • 8.95 kB
TypeScript
import { Room, ConnectionState } from 'livekit-client';
import { VoxketEventEmitter } from './event-emitter';
import { PluginManager } from '../plugins/plugin-system';
import { RenderUIOptions } from './ui-renderer';
import { LiveAvatarManager, LiveAvatarClientConfig } from './liveavatar-manager';
import { VoxketConfig, SessionConfig, VoxketSession, VoxketEvents, SessionState, SessionMetrics, AgentInfo, ParticipantInfo, ChatMessage, TranscriptionSegment, ModalityValue, VoxketError } from '../types/core';
import { VoxketInteractiveView, ViewPresentationMode, InteractiveUIState, RpcEvents } from '../types/rpc';
export interface VoxketClientConfig extends VoxketConfig {
agentId?: string;
participantName?: string;
modalities?: ModalityValue[];
participantMetadata?: Record<string, any>;
/** LiveAvatar FULL mode configuration — when provided, video modality uses LiveAvatar */
liveAvatarConfig?: LiveAvatarClientConfig;
/**
* Existing Voxket session ID to join instead of creating a new one.
* When set, fetchConnectionDetails() calls the join endpoint instead of create.
*/
sessionId?: string;
onConnected?: () => void;
onDisconnected?: (reason?: string) => void;
onError?: (error: VoxketError) => void;
onMessageReceived?: (message: ChatMessage) => void;
onTranscriptionReceived?: (transcription: TranscriptionSegment) => void;
onSessionStateChanged?: (state: SessionState) => void;
onSessionStart?: (sessionId: string) => void;
onSessionEnd?: (metrics: any) => void;
onUserJoined?: (userId: string) => void;
onUserLeft?: (userId: string) => void;
}
/**
* VoxketClient
*
* Main client class that orchestrates all Voxket functionality.
* Uses specialized managers for different concerns:
* - ChatManager: Chat messages and attachments
* - MediaManager: Camera, microphone, screen share
* - ConnectionManager: Room connection and participants
* - StreamHandlerManager: Text/byte stream handlers
* - UIRenderer: React UI rendering
* - AgentManager: Agent state and info
* - RpcManager: RPC method handling
* - PluginManager: Plugin system
*/
export declare class VoxketClient extends VoxketEventEmitter<VoxketEvents & RpcEvents> {
private config;
private pluginManager;
private rpcManager;
private chatManager;
private mediaManager;
private connectionManager;
private streamHandlerManager;
private uiRenderer;
private agentManager;
private liveAvatarManager;
private currentSession;
constructor(config: VoxketClientConfig);
/**
* Setup event listeners for various events
*/
private setupEventListeners;
/**
* Setup RPC event forwarding from RpcManager
*/
private setupRpcEventForwarding;
addConsentLog(consentType: string, consentVersion: string, agentId: string, modalities: ModalityValue[]): Promise<any>;
connect(agentId?: string, participantName?: string, modalities?: ModalityValue[], participantMetadata?: Record<string, any>): Promise<{
serverUrl: string;
participantToken: string;
voxketSessionId: string;
agentInfo?: AgentInfo;
}>;
disconnect(): Promise<void>;
createSession(config: SessionConfig): Promise<VoxketSession>;
startSession(agentId?: string, options?: {
participantName?: string;
modalities?: ModalityValue[];
metadata?: Record<string, any>;
participantMetadata?: Record<string, any>;
}): Promise<VoxketSession>;
endSession(): Promise<SessionMetrics | null>;
getCurrentSession(): VoxketSession | null;
getSessionMetrics(): SessionMetrics | null;
sendMessage(message: string, metadata?: Record<string, any>): Promise<void>;
sendChatMessage(message: string, metadata?: Record<string, any>): Promise<void>;
sendAttachments(files: File[], metadata?: Record<string, any>): Promise<void>;
sendAttachment(file: File, metadata?: Record<string, any>): Promise<void>;
getChatMessages(): ChatMessage[];
addChatMessage(message: ChatMessage): void;
updateChatMessage(updatedMessage: ChatMessage): void;
clearChatMessages(): void;
toggleMicrophone(enabled?: boolean): Promise<void>;
setMicrophoneEnabled(enabled: boolean): Promise<void>;
toggleCamera(enabled?: boolean): Promise<void>;
setCameraEnabled(enabled: boolean): Promise<void>;
enableCamera(): Promise<void>;
disableCamera(): Promise<void>;
switchCamera(): Promise<void>;
getCurrentCameraFacingMode(): 'user' | 'environment';
startScreenShare(): Promise<void>;
stopScreenShare(): Promise<void>;
getAudioInputDevices(): Promise<MediaDeviceInfo[]>;
getVideoInputDevices(): Promise<MediaDeviceInfo[]>;
setAudioInputDevice(deviceId: string): Promise<void>;
setVideoInputDevice(deviceId: string): Promise<void>;
get isMicrophoneEnabled(): boolean;
get isCameraEnabled(): boolean;
get isScreenShareEnabled(): boolean;
getMicrophoneTrack(): import('livekit-client').LocalTrack<import("livekit-client").Track.Kind> | null | undefined;
getCameraTrack(): import('livekit-client').LocalTrack<import("livekit-client").Track.Kind> | null | undefined;
getScreenShareTrack(): import('livekit-client').LocalTrack<import("livekit-client").Track.Kind> | null | undefined;
getAgentAudioTrack(): {
source: import("livekit-client").Track.Source;
participant: import('livekit-client').RemoteParticipant;
publication: import('livekit-client').RemoteTrackPublication;
} | null;
getAgentVideoTrack(): {
source: import("livekit-client").Track.Source;
participant: import('livekit-client').RemoteParticipant;
publication: import('livekit-client').RemoteTrackPublication;
} | null;
getVideoTrackRefs(): {
source: import("livekit-client").Track.Source;
participant: any;
publication: any;
}[];
getCameraTrackRefs(): {
source: import("livekit-client").Track.Source;
participant: any;
publication: any;
}[];
getScreenShareTrackRefs(): {
source: import("livekit-client").Track.Source;
participant: any;
publication: any;
}[];
getPublishPermissions(): {
camera: boolean;
microphone: boolean;
screenShare: boolean;
data: boolean;
};
canPublishSource(source: 'camera' | 'microphone' | 'screenShare'): boolean;
getLocalParticipant(): import('livekit-client').LocalParticipant | null;
getRemoteParticipants(): import('livekit-client').RemoteParticipant[];
getParticipants(): ParticipantInfo[];
getRoom(): Room | null;
getConnectionState(): ConnectionState;
get connected(): boolean;
getCurrentAgentInfo(): AgentInfo | null;
getIsAgentConnected(): boolean;
getAgentState(): 'idle' | 'thinking' | 'speaking';
renderUI(options?: RenderUIOptions): void;
removeUI(target?: string | HTMLElement): void;
removeAllUI(): void;
registerFrontendRPC(methodName: string, component: VoxketInteractiveView, presentationMode?: ViewPresentationMode): Promise<void>;
getCurrentInteraction(): InteractiveUIState | null;
dismissCurrentInteraction(): void;
getRegisteredRpcMethods(): string[];
unregisterRpcMethod(methodName: string): void;
/**
* Get the LiveAvatarManager instance
*/
getLiveAvatarManager(): LiveAvatarManager;
/**
* Set LiveAvatar config on an existing client instance.
* Useful when a pre-created VoxketClient is passed to the widget
* and liveAvatarConfig needs to be applied after construction.
*/
setLiveAvatarConfig(config: LiveAvatarClientConfig): void;
/**
* Check if the current session is using LiveAvatar
*/
isLiveAvatarSession(): boolean;
/**
* Attach the LiveAvatar video/audio stream to an HTML media element
*/
attachLiveAvatar(element: HTMLMediaElement): void;
/**
* Send a message to the LiveAvatar (triggers LLM response)
*/
sendLiveAvatarMessage(message: string): void;
/**
* Make the LiveAvatar repeat specific text (TTS only)
*/
repeatLiveAvatar(text: string): void;
/**
* Interrupt the LiveAvatar's current speech
*/
interruptLiveAvatar(): void;
registerPlugin(plugin: any): void;
getPluginManager(): PluginManager;
registerEventListener<K extends keyof (VoxketEvents & RpcEvents)>(eventName: K, callback: (data: any) => void): () => void;
registerEventEmitter(topic: string, handler: (data: string) => void): void;
getRegisteredEventEmitters(): string[];
hasEventEmitter(topic: string): boolean;
updateConfig(updates: Partial<VoxketClientConfig>): void;
setParticipantMetadata(metadata: Record<string, any>): void;
getParticipantMetadata(): Record<string, any> | undefined;
startRecording(): Promise<void>;
stopRecording(): Promise<void>;
}