@elevenlabs/client 0.15.2 → 1.0.0-rc.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (160) hide show
  1. package/README.md +20 -836
  2. package/dist/BaseConversation.d.ts +10 -12
  3. package/dist/BaseConversation.d.ts.map +1 -0
  4. package/dist/BaseConversation.js +392 -0
  5. package/dist/BaseConversation.js.map +1 -0
  6. package/dist/InputController.d.ts +13 -0
  7. package/dist/InputController.d.ts.map +1 -0
  8. package/dist/InputController.js +2 -0
  9. package/dist/InputController.js.map +1 -0
  10. package/dist/OutputController.d.ts +12 -0
  11. package/dist/OutputController.d.ts.map +1 -0
  12. package/dist/OutputController.js +2 -0
  13. package/dist/OutputController.js.map +1 -0
  14. package/dist/TextConversation.d.ts +7 -0
  15. package/dist/TextConversation.d.ts.map +1 -0
  16. package/dist/TextConversation.js +53 -0
  17. package/dist/TextConversation.js.map +1 -0
  18. package/dist/VoiceConversation.d.ts +14 -12
  19. package/dist/VoiceConversation.d.ts.map +1 -0
  20. package/dist/VoiceConversation.js +225 -0
  21. package/dist/VoiceConversation.js.map +1 -0
  22. package/dist/index.d.ts +11 -6
  23. package/dist/index.d.ts.map +1 -0
  24. package/dist/index.js +20 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/internal.d.ts +8 -0
  27. package/dist/internal.d.ts.map +1 -0
  28. package/dist/internal.js +6 -0
  29. package/dist/internal.js.map +1 -0
  30. package/dist/lib.iife.js +23493 -0
  31. package/dist/lib.iife.js.map +1 -0
  32. package/dist/platform/VoiceSessionSetup.d.ts +35 -0
  33. package/dist/platform/VoiceSessionSetup.d.ts.map +1 -0
  34. package/dist/platform/VoiceSessionSetup.js +74 -0
  35. package/dist/platform/VoiceSessionSetup.js.map +1 -0
  36. package/dist/scribe/connection.d.ts +1 -0
  37. package/dist/scribe/connection.d.ts.map +1 -0
  38. package/dist/scribe/connection.js +363 -0
  39. package/dist/scribe/connection.js.map +1 -0
  40. package/dist/scribe/index.d.ts +1 -0
  41. package/dist/scribe/index.d.ts.map +1 -0
  42. package/dist/scribe/index.js +8 -0
  43. package/dist/scribe/index.js.map +1 -0
  44. package/dist/scribe/scribe.d.ts +1 -0
  45. package/dist/scribe/scribe.d.ts.map +1 -0
  46. package/dist/scribe/scribe.js +193 -0
  47. package/dist/scribe/scribe.js.map +1 -0
  48. package/dist/sourceInfo.d.ts +7 -0
  49. package/dist/sourceInfo.d.ts.map +1 -0
  50. package/dist/sourceInfo.js +9 -0
  51. package/dist/sourceInfo.js.map +1 -0
  52. package/dist/utils/BaseConnection.d.ts +2 -9
  53. package/dist/utils/BaseConnection.d.ts.map +1 -0
  54. package/dist/utils/BaseConnection.js +73 -0
  55. package/dist/utils/BaseConnection.js.map +1 -0
  56. package/dist/utils/ConnectionFactory.d.ts +1 -0
  57. package/dist/utils/ConnectionFactory.d.ts.map +1 -0
  58. package/dist/utils/ConnectionFactory.js +26 -0
  59. package/dist/utils/ConnectionFactory.js.map +1 -0
  60. package/dist/utils/WebRTCConnection.d.ts +6 -1
  61. package/dist/utils/WebRTCConnection.d.ts.map +1 -0
  62. package/dist/utils/WebRTCConnection.js +494 -0
  63. package/dist/utils/WebRTCConnection.js.map +1 -0
  64. package/dist/utils/WebSocketConnection.d.ts +8 -3
  65. package/dist/utils/WebSocketConnection.d.ts.map +1 -0
  66. package/dist/utils/WebSocketConnection.js +155 -0
  67. package/dist/utils/WebSocketConnection.js.map +1 -0
  68. package/dist/utils/applyDelay.d.ts +1 -0
  69. package/dist/utils/applyDelay.d.ts.map +1 -0
  70. package/dist/utils/applyDelay.js +18 -0
  71. package/dist/utils/applyDelay.js.map +1 -0
  72. package/dist/utils/attachConnectionToOutput.d.ts +5 -0
  73. package/dist/utils/attachConnectionToOutput.d.ts.map +1 -0
  74. package/dist/utils/attachConnectionToOutput.js +11 -0
  75. package/dist/utils/attachConnectionToOutput.js.map +1 -0
  76. package/dist/utils/attachInputToConnection.d.ts +6 -0
  77. package/dist/utils/attachInputToConnection.d.ts.map +1 -0
  78. package/dist/utils/attachInputToConnection.js +16 -0
  79. package/dist/utils/attachInputToConnection.js.map +1 -0
  80. package/dist/utils/audio.d.ts +1 -0
  81. package/dist/utils/audio.d.ts.map +1 -0
  82. package/dist/utils/audio.js +16 -0
  83. package/dist/utils/audio.js.map +1 -0
  84. package/dist/utils/audioConcatProcessor.generated.d.ts +1 -0
  85. package/dist/utils/audioConcatProcessor.generated.d.ts.map +1 -0
  86. package/{worklets/audioConcatProcessor.js → dist/utils/audioConcatProcessor.generated.js} +12 -18
  87. package/dist/utils/audioConcatProcessor.generated.js.map +1 -0
  88. package/dist/utils/compatibility.d.ts +1 -0
  89. package/dist/utils/compatibility.d.ts.map +1 -0
  90. package/dist/utils/compatibility.js +16 -0
  91. package/dist/utils/compatibility.js.map +1 -0
  92. package/dist/utils/connection.d.ts +11 -0
  93. package/dist/utils/connection.d.ts.map +1 -0
  94. package/dist/utils/connection.js +14 -0
  95. package/dist/utils/connection.js.map +1 -0
  96. package/dist/utils/createWorkletModuleLoader.d.ts +1 -0
  97. package/dist/utils/createWorkletModuleLoader.d.ts.map +1 -0
  98. package/dist/utils/createWorkletModuleLoader.js +43 -0
  99. package/dist/utils/createWorkletModuleLoader.js.map +1 -0
  100. package/dist/utils/errors.d.ts +1 -0
  101. package/dist/utils/errors.d.ts.map +1 -0
  102. package/dist/utils/errors.js +11 -0
  103. package/dist/utils/errors.js.map +1 -0
  104. package/dist/utils/events.d.ts +3 -5
  105. package/dist/utils/events.d.ts.map +1 -0
  106. package/dist/utils/events.js +4 -0
  107. package/dist/utils/events.js.map +1 -0
  108. package/dist/utils/input.d.ts +22 -11
  109. package/dist/utils/input.d.ts.map +1 -0
  110. package/dist/utils/input.js +181 -0
  111. package/dist/utils/input.js.map +1 -0
  112. package/dist/utils/location.d.ts +5 -0
  113. package/dist/utils/location.d.ts.map +1 -0
  114. package/dist/utils/location.js +31 -0
  115. package/dist/utils/location.js.map +1 -0
  116. package/dist/utils/mergeOptions.d.ts +11 -0
  117. package/dist/utils/mergeOptions.d.ts.map +1 -0
  118. package/dist/utils/mergeOptions.js +38 -0
  119. package/dist/utils/mergeOptions.js.map +1 -0
  120. package/dist/utils/output.d.ts +36 -10
  121. package/dist/utils/output.d.ts.map +1 -0
  122. package/dist/utils/output.js +127 -0
  123. package/dist/utils/output.js.map +1 -0
  124. package/dist/utils/overrides.d.ts +1 -0
  125. package/dist/utils/overrides.d.ts.map +1 -0
  126. package/dist/utils/overrides.js +40 -0
  127. package/dist/utils/overrides.js.map +1 -0
  128. package/dist/utils/postOverallFeedback.d.ts +1 -0
  129. package/dist/utils/postOverallFeedback.d.ts.map +1 -0
  130. package/dist/utils/postOverallFeedback.js +19 -0
  131. package/dist/utils/postOverallFeedback.js.map +1 -0
  132. package/dist/utils/rawAudioProcessor.generated.d.ts +1 -0
  133. package/dist/utils/rawAudioProcessor.generated.d.ts.map +1 -0
  134. package/{worklets/rawAudioProcessor.js → dist/utils/rawAudioProcessor.generated.js} +7 -1
  135. package/dist/utils/rawAudioProcessor.generated.js.map +1 -0
  136. package/dist/utils/scribeAudioProcessor.generated.d.ts +1 -0
  137. package/dist/utils/scribeAudioProcessor.generated.d.ts.map +1 -0
  138. package/{worklets/scribeAudioProcessor.js → dist/utils/scribeAudioProcessor.generated.js} +7 -1
  139. package/dist/utils/scribeAudioProcessor.generated.js.map +1 -0
  140. package/dist/version.d.ts +2 -1
  141. package/dist/version.d.ts.map +1 -0
  142. package/dist/version.js +3 -0
  143. package/dist/version.js.map +1 -0
  144. package/package.json +22 -16
  145. package/.turbo/turbo-build.log +0 -13
  146. package/.turbo/turbo-generate-version.log +0 -4
  147. package/.turbo/turbo-generate-worklets.log +0 -9
  148. package/.turbo/turbo-lint$colon$es.log +0 -6
  149. package/.turbo/turbo-lint$colon$prettier.log +0 -6
  150. package/CHANGELOG.md +0 -50
  151. package/dist/lib.cjs +0 -2
  152. package/dist/lib.cjs.map +0 -1
  153. package/dist/lib.modern.js +0 -2
  154. package/dist/lib.modern.js.map +0 -1
  155. package/dist/lib.module.js +0 -2
  156. package/dist/lib.module.js.map +0 -1
  157. package/dist/lib.umd.js +0 -2
  158. package/dist/lib.umd.js.map +0 -1
  159. package/dist/utils/addLibsamplerateModule.d.ts +0 -1
  160. package/scripts/generateWorklets.js +0 -59
@@ -0,0 +1,494 @@
1
+ import { BaseConnection, parseFormat, } from "./BaseConnection";
2
+ import { sourceInfo } from "../sourceInfo";
3
+ import { isValidSocketEvent } from "./events";
4
+ import { Room, RoomEvent, Track, ConnectionState, createLocalAudioTrack, } from "livekit-client";
5
+ import { constructOverrides, CONVERSATION_INITIATION_CLIENT_DATA_TYPE, } from "./overrides";
6
+ import { arrayBufferToBase64 } from "./audio";
7
+ import { loadRawAudioProcessor } from "./rawAudioProcessor.generated";
8
+ const DEFAULT_LIVEKIT_WS_URL = "wss://livekit.rtc.elevenlabs.io";
9
+ const HTTPS_API_ORIGIN = "https://api.elevenlabs.io";
10
+ // Convert WSS origin to HTTPS for API calls
11
+ function convertWssToHttps(origin) {
12
+ return origin.replace(/^wss:\/\//, "https://");
13
+ }
14
+ export class WebRTCConnection extends BaseConnection {
15
+ conversationId;
16
+ inputFormat;
17
+ outputFormat;
18
+ room;
19
+ isConnected = false;
20
+ audioEventId = 1;
21
+ audioCaptureContext = null;
22
+ audioElements = [];
23
+ outputDeviceId = null;
24
+ outputAnalyser = null;
25
+ outputFrequencyData = null;
26
+ // InputController state
27
+ _isMuted = false;
28
+ // InputController interface exposed as a property
29
+ input = {
30
+ close: async () => {
31
+ // Close only microphone tracks, not the entire connection
32
+ if (this.isConnected) {
33
+ try {
34
+ this.room.localParticipant.audioTrackPublications.forEach(publication => {
35
+ if (publication.track) {
36
+ publication.track.stop();
37
+ }
38
+ });
39
+ }
40
+ catch (error) {
41
+ console.warn("Error stopping local tracks:", error);
42
+ }
43
+ }
44
+ },
45
+ setDevice: async (config) => {
46
+ // WebRTC only supports changing inputDeviceId
47
+ // sampleRate, format, and preferHeadphonesForIosDevices are not supported
48
+ if (config?.sampleRate !== undefined ||
49
+ config?.format !== undefined ||
50
+ config?.preferHeadphonesForIosDevices !== undefined) {
51
+ throw new Error("WebRTC input device does not support sampleRate, format, or preferHeadphonesForIosDevices options");
52
+ }
53
+ const inputDeviceId = config?.inputDeviceId;
54
+ if (!inputDeviceId) {
55
+ // No device ID specified - this is a no-op for WebRTC
56
+ // The default device is already being used
57
+ return;
58
+ }
59
+ await this.setAudioInputDevice(inputDeviceId);
60
+ },
61
+ setMuted: async (isMuted) => {
62
+ if (!this.isConnected || !this.room.localParticipant) {
63
+ console.warn("Cannot set microphone muted: room not connected or no local participant");
64
+ return;
65
+ }
66
+ // Get the microphone track publication
67
+ const micTrackPublication = this.room.localParticipant.getTrackPublication(Track.Source.Microphone);
68
+ if (micTrackPublication?.track) {
69
+ try {
70
+ // Use LiveKit's built-in track muting
71
+ if (isMuted) {
72
+ await micTrackPublication.track.mute();
73
+ }
74
+ else {
75
+ await micTrackPublication.track.unmute();
76
+ }
77
+ }
78
+ catch (_error) {
79
+ // If track muting fails, fall back to participant-level control
80
+ await this.room.localParticipant.setMicrophoneEnabled(!isMuted);
81
+ }
82
+ }
83
+ else {
84
+ // No track found, use participant-level control directly
85
+ await this.room.localParticipant.setMicrophoneEnabled(!isMuted);
86
+ }
87
+ this._isMuted = isMuted;
88
+ },
89
+ isMuted: () => this._isMuted,
90
+ getAnalyser: () => undefined, // WebRTC doesn't provide input analyser
91
+ };
92
+ // OutputController interface exposed as a property
93
+ output = {
94
+ close: async () => {
95
+ // No-op for WebRTC - LiveKit handles cleanup
96
+ // Audio elements are cleaned up when the connection closes
97
+ },
98
+ setDevice: async (config) => {
99
+ // WebRTC only supports changing outputDeviceId
100
+ // sampleRate and format are not supported
101
+ if (config?.sampleRate !== undefined || config?.format !== undefined) {
102
+ throw new Error("WebRTC output device does not support sampleRate or format options");
103
+ }
104
+ const outputDeviceId = config?.outputDeviceId;
105
+ if (!outputDeviceId) {
106
+ // No device ID specified - this is a no-op for WebRTC
107
+ // The default device is already being used
108
+ return;
109
+ }
110
+ await this.setAudioOutputDevice(outputDeviceId);
111
+ },
112
+ setVolume: (volume) => {
113
+ this.setAudioVolume(volume);
114
+ },
115
+ interrupt: (_resetDuration) => {
116
+ // No-op for WebRTC - LiveKit handles audio playback and interruption
117
+ // Audio interruption is managed by the server/agent
118
+ },
119
+ getAnalyser: () => this.outputAnalyser ?? undefined,
120
+ };
121
+ constructor(room, conversationId, inputFormat, outputFormat, config = {}) {
122
+ super(config);
123
+ this.room = room;
124
+ this.conversationId = conversationId;
125
+ this.inputFormat = inputFormat;
126
+ this.outputFormat = outputFormat;
127
+ this.setupRoomEventListeners();
128
+ }
129
+ static async create(config) {
130
+ let conversationToken;
131
+ // Handle different authentication scenarios
132
+ if ("conversationToken" in config && config.conversationToken) {
133
+ // Direct token provided
134
+ conversationToken = config.conversationToken;
135
+ }
136
+ else if ("agentId" in config && config.agentId) {
137
+ // Agent ID provided - fetch token from API
138
+ try {
139
+ const { name: source, version } = sourceInfo;
140
+ const configOrigin = config.origin ?? HTTPS_API_ORIGIN;
141
+ const origin = convertWssToHttps(configOrigin); //origin is wss, not https
142
+ const url = `${origin}/v1/convai/conversation/token?agent_id=${config.agentId}&source=${source}&version=${version}`;
143
+ const response = await fetch(url);
144
+ if (!response.ok) {
145
+ throw new Error(`ElevenLabs API returned ${response.status} ${response.statusText}`);
146
+ }
147
+ const data = await response.json();
148
+ conversationToken = data.token;
149
+ if (!conversationToken) {
150
+ throw new Error("No conversation token received from API");
151
+ }
152
+ }
153
+ catch (error) {
154
+ let msg = error instanceof Error ? error.message : String(error);
155
+ if (error instanceof Error && error.message.includes("401")) {
156
+ msg =
157
+ "Your agent has authentication enabled, but no signed URL or conversation token was provided.";
158
+ }
159
+ throw new Error(`Failed to fetch conversation token for agent ${config.agentId}: ${msg}`);
160
+ }
161
+ }
162
+ else {
163
+ throw new Error("Either conversationToken or agentId is required for WebRTC connection");
164
+ }
165
+ const room = new Room();
166
+ try {
167
+ // Create connection instance first to set up event listeners
168
+ const conversationId = `room_${Date.now()}`;
169
+ const inputFormat = parseFormat("pcm_48000");
170
+ const outputFormat = parseFormat("pcm_48000");
171
+ const connection = new WebRTCConnection(room, conversationId, inputFormat, outputFormat, config);
172
+ // Use configurable LiveKit URL or default if not provided
173
+ const livekitUrl = config.livekitUrl || DEFAULT_LIVEKIT_WS_URL;
174
+ // Enable microphone on SignalConnected (before room.connect resolves).
175
+ // The server may wait for the client to publish audio before fully
176
+ // establishing the subscriber peer connection, matching the behaviour
177
+ // of @livekit/components-react's useLiveKitRoom hook.
178
+ const micEnabled = config.textOnly
179
+ ? Promise.resolve()
180
+ : new Promise((resolve, reject) => {
181
+ room.once(RoomEvent.SignalConnected, () => {
182
+ room.localParticipant
183
+ .setMicrophoneEnabled(true)
184
+ .then(() => resolve())
185
+ .catch(reject);
186
+ });
187
+ });
188
+ // Connect to the LiveKit room
189
+ await room.connect(livekitUrl, conversationToken);
190
+ // Wait for the Connected event to ensure isConnected is true
191
+ await new Promise(resolve => {
192
+ if (connection.isConnected) {
193
+ resolve();
194
+ }
195
+ else {
196
+ const onConnected = () => {
197
+ room.off(RoomEvent.Connected, onConnected);
198
+ resolve();
199
+ };
200
+ room.on(RoomEvent.Connected, onConnected);
201
+ }
202
+ });
203
+ // Ensure the microphone was successfully enabled
204
+ await micEnabled;
205
+ if (room.name) {
206
+ connection.conversationId =
207
+ room.name.match(/(conv_[a-zA-Z0-9]+)/)?.[0] || room.name;
208
+ }
209
+ const overridesEvent = constructOverrides(config);
210
+ connection.debug({
211
+ type: CONVERSATION_INITIATION_CLIENT_DATA_TYPE,
212
+ message: overridesEvent,
213
+ });
214
+ await connection.sendMessage(overridesEvent);
215
+ return connection;
216
+ }
217
+ catch (error) {
218
+ await room.disconnect();
219
+ throw error;
220
+ }
221
+ }
222
+ setupRoomEventListeners() {
223
+ this.room.on(RoomEvent.Connected, async () => {
224
+ this.isConnected = true;
225
+ });
226
+ this.room.on(RoomEvent.Disconnected, reason => {
227
+ this.isConnected = false;
228
+ this.disconnect({
229
+ reason: "agent",
230
+ context: new CloseEvent("close", { reason: reason?.toString() }),
231
+ });
232
+ });
233
+ this.room.on(RoomEvent.ConnectionStateChanged, state => {
234
+ if (state === ConnectionState.Disconnected) {
235
+ this.isConnected = false;
236
+ this.disconnect({
237
+ reason: "error",
238
+ message: `LiveKit connection state changed to ${state}`,
239
+ context: new Event("connection_state_changed"),
240
+ });
241
+ }
242
+ });
243
+ // Handle incoming data messages
244
+ this.room.on(RoomEvent.DataReceived, (payload, _participant) => {
245
+ try {
246
+ const message = JSON.parse(new TextDecoder().decode(payload));
247
+ // Filter out audio messages for WebRTC - they're handled via audio tracks
248
+ if (message.type === "audio") {
249
+ return;
250
+ }
251
+ if (isValidSocketEvent(message)) {
252
+ this.handleMessage(message);
253
+ }
254
+ else {
255
+ console.warn("Invalid socket event received:", message);
256
+ }
257
+ }
258
+ catch (error) {
259
+ console.warn("Failed to parse incoming data message:", error);
260
+ console.warn("Raw payload:", new TextDecoder().decode(payload));
261
+ }
262
+ });
263
+ this.room.on(RoomEvent.TrackSubscribed, async (track, _publication, participant) => {
264
+ if (track.kind === Track.Kind.Audio &&
265
+ participant.identity.includes("agent")) {
266
+ // Play the audio track
267
+ const remoteAudioTrack = track;
268
+ const audioElement = remoteAudioTrack.attach();
269
+ audioElement.autoplay = true;
270
+ audioElement.controls = false;
271
+ // Set output device if one was previously selected
272
+ if (this.outputDeviceId && audioElement.setSinkId) {
273
+ try {
274
+ await audioElement.setSinkId(this.outputDeviceId);
275
+ }
276
+ catch (error) {
277
+ console.warn("Failed to set output device for new audio element:", error);
278
+ }
279
+ }
280
+ // Add to DOM (hidden) to ensure it plays
281
+ audioElement.style.display = "none";
282
+ document.body.appendChild(audioElement);
283
+ // Store reference for volume control
284
+ this.audioElements.push(audioElement);
285
+ // Apply current volume if it exists (for when volume was set before audio track arrived)
286
+ if (this.audioElements.length === 1) {
287
+ // First audio element - trigger a callback to sync with current volume
288
+ this.onDebug?.({ type: "audio_element_ready" });
289
+ }
290
+ // Set up audio capture for onAudio callback
291
+ await this.setupAudioCapture(remoteAudioTrack);
292
+ }
293
+ });
294
+ this.room.on(RoomEvent.ActiveSpeakersChanged, async (speakers) => {
295
+ if (speakers.length > 0) {
296
+ this.updateMode(speakers[0].identity.startsWith("agent") ? "speaking" : "listening");
297
+ }
298
+ else {
299
+ this.updateMode("listening");
300
+ }
301
+ });
302
+ this.room.on(RoomEvent.ParticipantDisconnected, (participant) => {
303
+ if (participant.identity?.startsWith("agent")) {
304
+ this.disconnect({
305
+ reason: "agent",
306
+ context: new CloseEvent("close", { reason: "agent disconnected" }),
307
+ });
308
+ }
309
+ });
310
+ }
311
+ close() {
312
+ if (this.isConnected) {
313
+ try {
314
+ // Explicitly stop all local tracks before disconnecting to ensure microphone is released
315
+ this.room.localParticipant.audioTrackPublications.forEach(publication => {
316
+ if (publication.track) {
317
+ publication.track.stop();
318
+ }
319
+ });
320
+ }
321
+ catch (error) {
322
+ console.warn("Error stopping local tracks:", error);
323
+ }
324
+ // Clean up audio capture context (non-blocking)
325
+ if (this.audioCaptureContext) {
326
+ this.audioCaptureContext.close().catch(error => {
327
+ console.warn("Error closing audio capture context:", error);
328
+ });
329
+ this.audioCaptureContext = null;
330
+ }
331
+ // Clean up audio elements
332
+ this.audioElements.forEach(element => {
333
+ if (element.parentNode) {
334
+ element.parentNode.removeChild(element);
335
+ }
336
+ });
337
+ this.audioElements = [];
338
+ this.room.disconnect();
339
+ }
340
+ }
341
+ async sendMessage(message) {
342
+ if (!this.isConnected || !this.room.localParticipant) {
343
+ console.warn("Cannot send message: room not connected or no local participant");
344
+ return;
345
+ }
346
+ // In WebRTC mode, audio is sent via published tracks, not data messages
347
+ if ("user_audio_chunk" in message) {
348
+ // Ignore audio data messages - audio flows through WebRTC tracks
349
+ return;
350
+ }
351
+ try {
352
+ const encoder = new TextEncoder();
353
+ const data = encoder.encode(JSON.stringify(message));
354
+ await this.room.localParticipant.publishData(data, { reliable: true });
355
+ }
356
+ catch (error) {
357
+ this.debug({
358
+ type: "send_message_error",
359
+ message: {
360
+ message,
361
+ error,
362
+ },
363
+ });
364
+ console.error("Failed to send message via WebRTC:", error);
365
+ }
366
+ }
367
+ // Get the room instance for advanced usage
368
+ getRoom() {
369
+ return this.room;
370
+ }
371
+ async setupAudioCapture(track) {
372
+ try {
373
+ // Create audio context for processing
374
+ const audioContext = new AudioContext();
375
+ this.audioCaptureContext = audioContext;
376
+ // Create analyser for frequency data
377
+ this.outputAnalyser = audioContext.createAnalyser();
378
+ this.outputAnalyser.fftSize = 2048;
379
+ this.outputAnalyser.smoothingTimeConstant = 0.8;
380
+ // Create MediaStream from the track
381
+ const mediaStream = new MediaStream([track.mediaStreamTrack]);
382
+ // Create audio source from the stream
383
+ const source = audioContext.createMediaStreamSource(mediaStream);
384
+ // Connect source to analyser
385
+ source.connect(this.outputAnalyser);
386
+ await loadRawAudioProcessor(audioContext.audioWorklet);
387
+ const worklet = new AudioWorkletNode(audioContext, "rawAudioProcessor");
388
+ // Connect analyser to worklet for processing
389
+ this.outputAnalyser.connect(worklet);
390
+ // Configure the processor for the output format
391
+ worklet.port.postMessage({
392
+ type: "setFormat",
393
+ format: this.outputFormat.format,
394
+ sampleRate: this.outputFormat.sampleRate,
395
+ });
396
+ // Handle processed audio data
397
+ worklet.port.onmessage = (event) => {
398
+ const [audioData, maxVolume] = event.data;
399
+ // Only send audio if there's significant volume (not just silence)
400
+ const volumeThreshold = 0.01;
401
+ if (maxVolume > volumeThreshold) {
402
+ // Convert to base64
403
+ const base64Audio = arrayBufferToBase64(audioData.buffer);
404
+ // Use sequential event ID for proper feedback tracking
405
+ const eventId = this.audioEventId++;
406
+ // Trigger the onAudio callback by simulating an audio event
407
+ this.handleMessage({
408
+ type: "audio",
409
+ audio_event: {
410
+ audio_base_64: base64Audio,
411
+ event_id: eventId,
412
+ },
413
+ });
414
+ }
415
+ };
416
+ // Connect the audio processing chain
417
+ source.connect(worklet);
418
+ }
419
+ catch (error) {
420
+ console.warn("Failed to set up audio capture:", error);
421
+ }
422
+ }
423
+ setAudioVolume(volume) {
424
+ this.audioElements.forEach(element => {
425
+ element.volume = volume;
426
+ });
427
+ }
428
+ async setAudioOutputDevice(deviceId) {
429
+ if (!("setSinkId" in HTMLAudioElement.prototype)) {
430
+ throw new Error("setSinkId is not supported in this browser");
431
+ }
432
+ // Set output device for all existing audio elements
433
+ const promises = this.audioElements.map(async (element) => {
434
+ try {
435
+ await element.setSinkId(deviceId);
436
+ }
437
+ catch (error) {
438
+ console.error("Failed to set sink ID for audio element:", error);
439
+ throw error;
440
+ }
441
+ });
442
+ await Promise.all(promises);
443
+ // Store the device ID for future audio elements
444
+ this.outputDeviceId = deviceId;
445
+ }
446
+ async setAudioInputDevice(deviceId) {
447
+ if (!this.isConnected || !this.room.localParticipant) {
448
+ throw new Error("Cannot change input device: room not connected or no local participant");
449
+ }
450
+ try {
451
+ // Get the current microphone track publication
452
+ const currentMicTrackPublication = this.room.localParticipant.getTrackPublication(Track.Source.Microphone);
453
+ // Stop the current microphone track if it exists
454
+ if (currentMicTrackPublication?.track) {
455
+ await currentMicTrackPublication.track.stop();
456
+ await this.room.localParticipant.unpublishTrack(currentMicTrackPublication.track);
457
+ }
458
+ // Create constraints for the new input device
459
+ const audioConstraints = {
460
+ deviceId: { exact: deviceId },
461
+ echoCancellation: true,
462
+ noiseSuppression: true,
463
+ autoGainControl: true,
464
+ channelCount: { ideal: 1 },
465
+ };
466
+ // Create new audio track with the specified device
467
+ const audioTrack = await createLocalAudioTrack(audioConstraints);
468
+ // Publish the new microphone track
469
+ await this.room.localParticipant.publishTrack(audioTrack, {
470
+ name: "microphone",
471
+ source: Track.Source.Microphone,
472
+ });
473
+ }
474
+ catch (error) {
475
+ console.error("Failed to change input device:", error);
476
+ // Try to re-enable default microphone on failure
477
+ try {
478
+ await this.room.localParticipant.setMicrophoneEnabled(true);
479
+ }
480
+ catch (recoveryError) {
481
+ console.error("Failed to recover microphone after device switch error:", recoveryError);
482
+ }
483
+ throw error;
484
+ }
485
+ }
486
+ getOutputByteFrequencyData() {
487
+ if (!this.outputAnalyser)
488
+ return null;
489
+ this.outputFrequencyData ??= new Uint8Array(this.outputAnalyser.frequencyBinCount);
490
+ this.outputAnalyser.getByteFrequencyData(this.outputFrequencyData);
491
+ return this.outputFrequencyData;
492
+ }
493
+ }
494
+ //# sourceMappingURL=WebRTCConnection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WebRTCConnection.js","sourceRoot":"","sources":["../../src/utils/WebRTCConnection.ts"],"names":[],"mappings":"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"}
@@ -1,13 +1,18 @@
1
1
  import { BaseConnection, type SessionConfig, type FormatConfig } from "./BaseConnection";
2
- import { type OutgoingSocketEvent } from "./events";
3
- export declare class WebSocketConnection extends BaseConnection {
2
+ import { type OutgoingSocketEvent, type IncomingSocketEvent } from "./events";
3
+ import type { OutputEventTarget, OutputListener } from "./output";
4
+ export declare class WebSocketConnection extends BaseConnection implements OutputEventTarget {
4
5
  private readonly socket;
5
6
  readonly conversationId: string;
6
7
  readonly inputFormat: FormatConfig;
7
8
  readonly outputFormat: FormatConfig;
9
+ private outputListeners;
8
10
  private constructor();
9
11
  static create(config: SessionConfig): Promise<WebSocketConnection>;
10
12
  close(): void;
11
13
  sendMessage(message: OutgoingSocketEvent): void;
12
- setMicMuted(isMuted: boolean): Promise<void>;
14
+ addListener(listener: OutputListener): void;
15
+ removeListener(listener: OutputListener): void;
16
+ protected handleMessage(parsedEvent: IncomingSocketEvent): void;
13
17
  }
18
+ //# sourceMappingURL=WebSocketConnection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WebSocketConnection.d.ts","sourceRoot":"","sources":["../../src/utils/WebSocketConnection.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,KAAK,aAAa,EAClB,KAAK,YAAY,EAElB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAGL,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACzB,MAAM,UAAU,CAAC;AAGlB,OAAO,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAMlE,qBAAa,mBACX,SAAQ,cACR,YAAW,iBAAiB;IAS1B,OAAO,CAAC,QAAQ,CAAC,MAAM;IAPzB,SAAgB,cAAc,EAAE,MAAM,CAAC;IACvC,SAAgB,WAAW,EAAE,YAAY,CAAC;IAC1C,SAAgB,YAAY,EAAE,YAAY,CAAC;IAE3C,OAAO,CAAC,eAAe,CAAkC;IAEzD,OAAO;WAqEa,MAAM,CACxB,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,mBAAmB,CAAC;IA0GxB,KAAK;IAIL,WAAW,CAAC,OAAO,EAAE,mBAAmB;IAIxC,WAAW,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI;IAI3C,cAAc,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI;cAIlC,aAAa,CAAC,WAAW,EAAE,mBAAmB;CAWlE"}