From fa661f6093c484297d3b53ab171886e031389549 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kr=C3=A6n=20Hansen?= Date: Thu, 7 May 2026 14:21:29 +0200 Subject: [PATCH] Update conversation subclasses to use emit and remove no-op defaults - Replace this.options.onAudio/onAudioAlignment/onError in VoiceConversation with this.emit() calls - Remove no-op callback defaults from getFullOptions (the emitter handles the no-listeners case) - Keep pre-instance callbacks (onStatusChange, onConnect) as direct calls since errors during startSession must propagate to the caller Co-Authored-By: Claude Opus 4.6 --- packages/client/src/BaseConversation.ts | 11 ----------- packages/client/src/VoiceConversation.ts | 8 ++++---- 2 files changed, 4 insertions(+), 15 deletions(-) diff --git a/packages/client/src/BaseConversation.ts b/packages/client/src/BaseConversation.ts index d43e8606c..4f9e44a1d 100644 --- a/packages/client/src/BaseConversation.ts +++ b/packages/client/src/BaseConversation.ts @@ -132,17 +132,6 @@ export abstract class BaseConversation { const textOnly = isTextOnly(partialOptions); return { clientTools: {}, - onConnect: () => {}, - onDebug: () => {}, - onDisconnect: () => {}, - onError: () => {}, - onMessage: () => {}, - onAudio: () => {}, - onModeChange: () => {}, - onStatusChange: () => {}, - onCanSendFeedbackChange: () => {}, - onInterruption: () => {}, - onAgentResponseCorrection: () => {}, ...partialOptions, textOnly, overrides: { diff --git a/packages/client/src/VoiceConversation.ts b/packages/client/src/VoiceConversation.ts index b0a379d4a..198eb46b4 100644 --- a/packages/client/src/VoiceConversation.ts +++ b/packages/client/src/VoiceConversation.ts @@ -176,13 +176,13 @@ export class VoiceConversation extends BaseConversation { protected override handleAudio(event: AgentAudioEvent) { super.handleAudio(event); - if (event.audio_event.alignment && this.options.onAudioAlignment) { - this.options.onAudioAlignment(event.audio_event.alignment); + if (event.audio_event.alignment) { + this.emit("audio-alignment", event.audio_event.alignment); } if (this.lastInterruptTimestamp <= event.audio_event.event_id) { if (event.audio_event.audio_base_64) { - this.options.onAudio?.(event.audio_event.audio_base_64); + this.emit("audio", event.audio_event.audio_base_64); // Audio routing is handled by attachConnectionToOutput for WebSocket // WebRTC handles audio playback directly through LiveKit tracks } @@ -197,7 +197,7 @@ export class VoiceConversation extends BaseConversation { public setMicMuted(isMuted: boolean) { this.input.setMuted(isMuted).catch(error => { - this.options.onError?.("Failed to set input muted state", error); + this.emit("error", "Failed to set input muted state", error); }); }