diff --git a/client-js/client/client.ts b/client-js/client/client.ts index 3d04b06..f8537a6 100644 --- a/client-js/client/client.ts +++ b/client-js/client/client.ts @@ -15,6 +15,7 @@ import { BotReadyData, BotTTSTextData, ClientMessageData, + DeviceState, ErrorData, LLMContextMessage, LLMFunctionCallData, @@ -61,6 +62,7 @@ export type RTVIEventCallbacks = Partial<{ onDisconnected: () => void; onError: (message: RTVIMessage) => void; onTransportStateChanged: (state: TransportState) => void; + onDeviceStateChanged: (state: DeviceState) => void; onBotConnected: (participant: Participant) => void; onBotReady: (botReadyData: BotReadyData) => void; @@ -199,6 +201,10 @@ export class PipecatClient extends RTVIEventEmitter { options?.callbacks?.onTransportStateChanged?.(state); this.emit(RTVIEvent.TransportStateChanged, state); }, + onDeviceStateChanged: (state: DeviceState) => { + options?.callbacks?.onDeviceStateChanged?.(state); + this.emit(RTVIEvent.DeviceStateChanged, state); + }, onParticipantJoined: (p) => { options?.callbacks?.onParticipantJoined?.(p); this.emit(RTVIEvent.ParticipantConnected, p); @@ -484,6 +490,10 @@ export class PipecatClient extends RTVIEventEmitter { return this._transport.state; } + public get deviceState(): DeviceState { + return this._transport.deviceState; + } + public get version(): string { return packageJson.version; } diff --git a/client-js/client/transport.ts b/client-js/client/transport.ts index 5f0ecb9..1d52c65 100644 --- a/client-js/client/transport.ts +++ b/client-js/client/transport.ts @@ -4,7 +4,7 @@ * SPDX-License-Identifier: BSD-2-Clause */ -import { RTVIError, RTVIMessage, TransportState } from "../rtvi"; +import { DeviceState, RTVIError, RTVIMessage, TransportState } from "../rtvi"; import { PipecatClientOptions, RTVIEventCallbacks } from "./client"; export type Tracks = { @@ -30,6 +30,7 @@ export abstract class Transport { protected declare _callbacks: RTVIEventCallbacks; protected declare _abortController: AbortController | undefined; protected _state: TransportState = "disconnected"; + protected _deviceState: DeviceState = "not_ready"; constructor() {} @@ -86,6 +87,9 @@ export abstract class Transport { abstract get state(): TransportState; abstract set state(state: TransportState); + abstract get deviceState(): DeviceState; + abstract set deviceState(state: DeviceState); + abstract getAllMics(): Promise; abstract getAllCams(): Promise; abstract getAllSpeakers(): Promise; diff --git a/client-js/rtvi/common_types.ts b/client-js/rtvi/common_types.ts index 52fe36c..b0717f6 100644 --- a/client-js/rtvi/common_types.ts +++ b/client-js/rtvi/common_types.ts @@ -1,7 +1,5 @@ export type TransportState = | "disconnected" - | "initializing" - | "initialized" | "authenticating" | "authenticated" | "connecting" @@ -12,8 +10,6 @@ export type TransportState = export enum TransportStateEnum { DISCONNECTED = "disconnected", - INITIALIZING = "initializing", - INITIALIZED = "initialized", AUTHENTICATING = "authenticating", AUTHENTICATED = "authenticated", CONNECTING = "connecting", @@ -23,6 +19,15 @@ export enum TransportStateEnum { ERROR = "error", } +export type DeviceState = "not_ready" | "initializing" | "ready" | "blocked"; + +export enum DeviceStateEnum { + NOT_READY = "not_ready", + INITIALIZING = "initializing", + READY = "ready", + BLOCKED = "blocked", +} + export type Participant = { id: string; name: string; diff --git a/client-js/rtvi/events.ts b/client-js/rtvi/events.ts index 1117e21..a890b0c 100644 --- a/client-js/rtvi/events.ts +++ b/client-js/rtvi/events.ts @@ -4,7 +4,7 @@ * SPDX-License-Identifier: BSD-2-Clause */ -import { Participant, TransportState } from "./common_types"; +import { DeviceState, Participant, TransportState } from "./common_types"; import { DeviceError } from "./errors"; import { BotLLMSearchResponseData, @@ -22,6 +22,7 @@ export enum RTVIEvent { Connected = "connected", Disconnected = "disconnected", TransportStateChanged = "transportStateChanged", + DeviceStateChanged = "deviceStateChanged", /** remote connection state events */ BotConnected = "botConnected", @@ -90,6 +91,7 @@ export type RTVIEvents = Partial<{ connected: () => void; disconnected: () => void; transportStateChanged: (state: TransportState) => void; + deviceStateChanged: (state: DeviceState) => void; /** remote connection state events */ botConnected: (participant: Participant) => void;