@elevenlabs/client 0.15.1 → 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 -8
  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 -8
  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 +2 -3
  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 +21 -15
  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 -42
  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,155 @@
1
+ import { BaseConnection, parseFormat, } from "./BaseConnection";
2
+ import { sourceInfo } from "../sourceInfo";
3
+ import { isValidSocketEvent, } from "./events";
4
+ import { constructOverrides } from "./overrides";
5
+ import { SessionConnectionError } from "./errors";
6
+ const MAIN_PROTOCOL = "convai";
7
+ const WSS_API_ORIGIN = "wss://api.elevenlabs.io";
8
+ const WSS_API_PATHNAME = "/v1/convai/conversation?agent_id=";
9
+ export class WebSocketConnection extends BaseConnection {
10
+ socket;
11
+ conversationId;
12
+ inputFormat;
13
+ outputFormat;
14
+ outputListeners = new Set();
15
+ constructor(socket, conversationId, inputFormat, outputFormat) {
16
+ super();
17
+ this.socket = socket;
18
+ this.conversationId = conversationId;
19
+ this.inputFormat = inputFormat;
20
+ this.outputFormat = outputFormat;
21
+ this.socket.addEventListener("error", event => {
22
+ // In case the error event is followed by a close event, we want the
23
+ // latter to be the one that disconnects the session as it contains more
24
+ // useful information.
25
+ setTimeout(() => this.disconnect({
26
+ reason: "error",
27
+ message: "The connection was closed due to a socket error.",
28
+ context: event,
29
+ }), 0);
30
+ });
31
+ this.socket.addEventListener("close", event => {
32
+ this.disconnect(event.code === 1000
33
+ ? {
34
+ reason: "agent",
35
+ context: event,
36
+ closeCode: event.code,
37
+ closeReason: event.reason || undefined,
38
+ }
39
+ : {
40
+ reason: "error",
41
+ message: event.reason || "The connection was closed by the server.",
42
+ context: event,
43
+ closeCode: event.code,
44
+ closeReason: event.reason || undefined,
45
+ });
46
+ });
47
+ this.socket.addEventListener("message", event => {
48
+ try {
49
+ const parsedEvent = JSON.parse(event.data);
50
+ if (!isValidSocketEvent(parsedEvent)) {
51
+ this.debug({
52
+ type: "invalid_event",
53
+ message: "Received invalid socket event",
54
+ data: event.data,
55
+ });
56
+ return;
57
+ }
58
+ this.handleMessage(parsedEvent);
59
+ }
60
+ catch (error) {
61
+ this.debug({
62
+ type: "parsing_error",
63
+ message: "Failed to parse socket message",
64
+ error: error instanceof Error ? error.message : String(error),
65
+ data: event.data,
66
+ });
67
+ }
68
+ });
69
+ }
70
+ static async create(config) {
71
+ let socket = null;
72
+ try {
73
+ const origin = config.origin ?? WSS_API_ORIGIN;
74
+ let url;
75
+ const { name: source, version } = sourceInfo;
76
+ if (config.signedUrl) {
77
+ const separator = config.signedUrl.includes("?") ? "&" : "?";
78
+ url = `${config.signedUrl}${separator}source=${source}&version=${version}`;
79
+ }
80
+ else {
81
+ url = `${origin}${WSS_API_PATHNAME}${config.agentId}&source=${source}&version=${version}`;
82
+ }
83
+ const protocols = [MAIN_PROTOCOL];
84
+ if (config.authorization) {
85
+ protocols.push(`bearer.${config.authorization}`);
86
+ }
87
+ socket = new WebSocket(url, protocols);
88
+ const conversationConfig = await new Promise((resolve, reject) => {
89
+ socket.addEventListener("open", () => {
90
+ const overridesEvent = constructOverrides(config);
91
+ socket?.send(JSON.stringify(overridesEvent));
92
+ }, { once: true });
93
+ socket.addEventListener("error", event => {
94
+ // In case the error event is followed by a close event, we want the
95
+ // latter to be the one that rejects the promise as it contains more
96
+ // useful information.
97
+ setTimeout(() => reject(new SessionConnectionError("The connection was closed due to a socket error.")), 0);
98
+ });
99
+ socket.addEventListener("close", (event) => {
100
+ const message = event.reason ||
101
+ (event.code === 1000
102
+ ? "Connection closed normally before session could be established."
103
+ : "Connection closed unexpectedly before session could be established.");
104
+ reject(new SessionConnectionError(message, {
105
+ closeCode: event.code,
106
+ closeReason: event.reason || undefined,
107
+ }));
108
+ });
109
+ socket.addEventListener("message", (event) => {
110
+ const message = JSON.parse(event.data);
111
+ if (!isValidSocketEvent(message)) {
112
+ return;
113
+ }
114
+ if (message.type === "conversation_initiation_metadata") {
115
+ resolve(message.conversation_initiation_metadata_event);
116
+ }
117
+ else {
118
+ console.warn("First received message is not conversation metadata.");
119
+ }
120
+ }, { once: true });
121
+ });
122
+ const { conversation_id, agent_output_audio_format, user_input_audio_format, } = conversationConfig;
123
+ const inputFormat = parseFormat(user_input_audio_format ?? "pcm_16000");
124
+ const outputFormat = parseFormat(agent_output_audio_format);
125
+ return new WebSocketConnection(socket, conversation_id, inputFormat, outputFormat);
126
+ }
127
+ catch (error) {
128
+ socket?.close();
129
+ throw error;
130
+ }
131
+ }
132
+ close() {
133
+ this.socket.close(1000, "User ended conversation");
134
+ }
135
+ sendMessage(message) {
136
+ this.socket.send(JSON.stringify(message));
137
+ }
138
+ addListener(listener) {
139
+ this.outputListeners.add(listener);
140
+ }
141
+ removeListener(listener) {
142
+ this.outputListeners.delete(listener);
143
+ }
144
+ handleMessage(parsedEvent) {
145
+ super.handleMessage(parsedEvent);
146
+ // Emit audio events to output listeners
147
+ if (parsedEvent.type === "audio" && parsedEvent.audio_event.audio_base_64) {
148
+ const audioEvent = {
149
+ audio_base_64: parsedEvent.audio_event.audio_base_64,
150
+ };
151
+ this.outputListeners.forEach(listener => listener(audioEvent));
152
+ }
153
+ }
154
+ }
155
+ //# sourceMappingURL=WebSocketConnection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WebSocketConnection.js","sourceRoot":"","sources":["../../src/utils/WebSocketConnection.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,3 @@
1
1
  import type { DelayConfig } from "./connection";
2
2
  export declare function applyDelay(delayConfig?: DelayConfig): Promise<void>;
3
+ //# sourceMappingURL=applyDelay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"applyDelay.d.ts","sourceRoot":"","sources":["../../src/utils/applyDelay.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD,wBAAsB,UAAU,CAC9B,WAAW,GAAE,WAIZ,iBAYF"}
@@ -0,0 +1,18 @@
1
+ import { isAndroidDevice, isIosDevice } from "./compatibility";
2
+ export async function applyDelay(delayConfig = {
3
+ default: 0,
4
+ // Give the Android AudioManager enough time to switch to the correct audio mode
5
+ android: 3_000,
6
+ }) {
7
+ let delay = delayConfig.default;
8
+ if (isAndroidDevice()) {
9
+ delay = delayConfig.android ?? delay;
10
+ }
11
+ else if (isIosDevice()) {
12
+ delay = delayConfig.ios ?? delay;
13
+ }
14
+ if (delay > 0) {
15
+ await new Promise(resolve => setTimeout(resolve, delay));
16
+ }
17
+ }
18
+ //# sourceMappingURL=applyDelay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"applyDelay.js","sourceRoot":"","sources":["../../src/utils/applyDelay.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAG/D,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,cAA2B;IACzB,OAAO,EAAE,CAAC;IACV,gFAAgF;IAChF,OAAO,EAAE,KAAK;CACf;IAED,IAAI,KAAK,GAAG,WAAW,CAAC,OAAO,CAAC;IAChC,IAAI,eAAe,EAAE,EAAE,CAAC;QACtB,KAAK,GAAG,WAAW,CAAC,OAAO,IAAI,KAAK,CAAC;IACvC,CAAC;SAAM,IAAI,WAAW,EAAE,EAAE,CAAC;QACzB,KAAK,GAAG,WAAW,CAAC,GAAG,IAAI,KAAK,CAAC;IACnC,CAAC;IAED,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACd,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;IAC3D,CAAC;AACH,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { OutputEventTarget } from "./output";
2
+ export declare function attachConnectionToOutput(connection: OutputEventTarget, output: {
3
+ playAudio(chunk: ArrayBuffer): void;
4
+ }): () => void;
5
+ //# sourceMappingURL=attachConnectionToOutput.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachConnectionToOutput.d.ts","sourceRoot":"","sources":["../../src/utils/attachConnectionToOutput.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAkB,MAAM,UAAU,CAAC;AAGlE,wBAAgB,wBAAwB,CACtC,UAAU,EAAE,iBAAiB,EAC7B,MAAM,EAAE;IAAE,SAAS,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,CAAA;CAAE,GAC9C,MAAM,IAAI,CAUZ"}
@@ -0,0 +1,11 @@
1
+ import { base64ToArrayBuffer } from "./audio";
2
+ export function attachConnectionToOutput(connection, output) {
3
+ const listener = event => {
4
+ output.playAudio(base64ToArrayBuffer(event.audio_base_64));
5
+ };
6
+ connection.addListener(listener);
7
+ return () => {
8
+ connection.removeListener(listener);
9
+ };
10
+ }
11
+ //# sourceMappingURL=attachConnectionToOutput.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachConnectionToOutput.js","sourceRoot":"","sources":["../../src/utils/attachConnectionToOutput.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAE9C,MAAM,UAAU,wBAAwB,CACtC,UAA6B,EAC7B,MAA+C;IAE/C,MAAM,QAAQ,GAAmB,KAAK,CAAC,EAAE;QACvC,MAAM,CAAC,SAAS,CAAC,mBAAmB,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC;IAC7D,CAAC,CAAC;IAEF,UAAU,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IAEjC,OAAO,GAAG,EAAE;QACV,UAAU,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;IACtC,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { InputEventTarget } from "./input";
2
+ import type { UserAudioEvent } from "./events";
3
+ export declare function attachInputToConnection(input: InputEventTarget, connection: {
4
+ sendMessage(message: UserAudioEvent): void;
5
+ }): () => void;
6
+ //# sourceMappingURL=attachInputToConnection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachInputToConnection.d.ts","sourceRoot":"","sources":["../../src/utils/attachInputToConnection.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAiB,MAAM,SAAS,CAAC;AAC/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE/C,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,gBAAgB,EACvB,UAAU,EAAE;IACV,WAAW,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,CAAC;CAC5C,GACA,MAAM,IAAI,CAeZ"}
@@ -0,0 +1,16 @@
1
+ import { arrayBufferToBase64 } from "./audio";
2
+ export function attachInputToConnection(input, connection) {
3
+ const listener = event => {
4
+ const rawAudioPcmData = event.data[0];
5
+ // TODO: When supported, maxVolume can be used to avoid sending silent audio
6
+ // const maxVolume = event.data[1];
7
+ connection.sendMessage({
8
+ user_audio_chunk: arrayBufferToBase64(rawAudioPcmData.buffer),
9
+ });
10
+ };
11
+ input.addListener(listener);
12
+ return () => {
13
+ input.removeListener(listener);
14
+ };
15
+ }
16
+ //# sourceMappingURL=attachInputToConnection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachInputToConnection.js","sourceRoot":"","sources":["../../src/utils/attachInputToConnection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAI9C,MAAM,UAAU,uBAAuB,CACrC,KAAuB,EACvB,UAEC;IAED,MAAM,QAAQ,GAAkB,KAAK,CAAC,EAAE;QACtC,MAAM,eAAe,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAEtC,4EAA4E;QAC5E,mCAAmC;QAEnC,UAAU,CAAC,WAAW,CAAC;YACrB,gBAAgB,EAAE,mBAAmB,CAAC,eAAe,CAAC,MAAM,CAAC;SAC9D,CAAC,CAAC;IACL,CAAC,CAAC;IACF,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC5B,OAAO,GAAG,EAAE;QACV,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;IACjC,CAAC,CAAC;AACJ,CAAC"}
@@ -1,2 +1,3 @@
1
1
  export declare function arrayBufferToBase64(b: ArrayBufferLike): string;
2
2
  export declare function base64ToArrayBuffer(base64: string): ArrayBuffer;
3
+ //# sourceMappingURL=audio.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audio.d.ts","sourceRoot":"","sources":["../../src/utils/audio.ts"],"names":[],"mappings":"AAAA,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,eAAe,UAKrD;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,CAQ/D"}
@@ -0,0 +1,16 @@
1
+ export function arrayBufferToBase64(b) {
2
+ const buffer = new Uint8Array(b);
3
+ // @ts-ignore
4
+ const base64Data = window.btoa(String.fromCharCode(...buffer));
5
+ return base64Data;
6
+ }
7
+ export function base64ToArrayBuffer(base64) {
8
+ const binaryString = window.atob(base64);
9
+ const len = binaryString.length;
10
+ const bytes = new Uint8Array(len);
11
+ for (let i = 0; i < len; i++) {
12
+ bytes[i] = binaryString.charCodeAt(i);
13
+ }
14
+ return bytes.buffer;
15
+ }
16
+ //# sourceMappingURL=audio.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audio.js","sourceRoot":"","sources":["../../src/utils/audio.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,mBAAmB,CAAC,CAAkB;IACpD,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;IACjC,aAAa;IACb,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;IAC/D,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,MAAc;IAChD,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACzC,MAAM,GAAG,GAAG,YAAY,CAAC,MAAM,CAAC;IAChC,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC;IAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,KAAK,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IACxC,CAAC;IACD,OAAO,KAAK,CAAC,MAAM,CAAC;AACtB,CAAC"}
@@ -1 +1,2 @@
1
1
  export declare const loadAudioConcatProcessor: (worklet: AudioWorklet, path?: string) => Promise<void>;
2
+ //# sourceMappingURL=audioConcatProcessor.generated.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audioConcatProcessor.generated.d.ts","sourceRoot":"","sources":["../../src/utils/audioConcatProcessor.generated.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,wBAAwB,yDAgGpC,CAAC"}
@@ -1,10 +1,14 @@
1
- /*
1
+ // AUTO-GENERATED BY packages/client/scripts/generateWorklets.js
2
+ import { createWorkletModuleLoader } from "./createWorkletModuleLoader";
3
+ export const loadAudioConcatProcessor = createWorkletModuleLoader("audioConcatProcessor",
4
+ // language=JavaScript
5
+ `/*
2
6
  * ulaw decoding logic taken from the wavefile library
3
7
  * https://github.com/rochars/wavefile/blob/master/lib/codecs/mulaw.js
4
8
  * USED BY @elevenlabs/client
5
9
  */
6
10
 
7
- const decodeTable = [0, 132, 396, 924, 1980, 4092, 8316, 16764];
11
+ const decodeTable = [0,132,396,924,1980,4092,8316,16764];
8
12
 
9
13
  function decodeSample(muLawSample) {
10
14
  let sign;
@@ -12,10 +16,10 @@ function decodeSample(muLawSample) {
12
16
  let mantissa;
13
17
  let sample;
14
18
  muLawSample = ~muLawSample;
15
- sign = muLawSample & 0x80;
19
+ sign = (muLawSample & 0x80);
16
20
  exponent = (muLawSample >> 4) & 0x07;
17
- mantissa = muLawSample & 0x0f;
18
- sample = decodeTable[exponent] + (mantissa << (exponent + 3));
21
+ mantissa = muLawSample & 0x0F;
22
+ sample = decodeTable[exponent] + (mantissa << (exponent+3));
19
23
  if (sign !== 0) sample = -sample;
20
24
 
21
25
  return sample;
@@ -29,20 +33,11 @@ class AudioConcatProcessor extends AudioWorkletProcessor {
29
33
  this.currentBuffer = null;
30
34
  this.wasInterrupted = false;
31
35
  this.finished = false;
32
-
36
+
33
37
  this.port.onmessage = ({ data }) => {
34
38
  switch (data.type) {
35
39
  case "setFormat":
36
40
  this.format = data.format;
37
- if (globalThis.LibSampleRate && sampleRate !== data.sampleRate) {
38
- globalThis.LibSampleRate.create(
39
- 1,
40
- data.sampleRate,
41
- sampleRate
42
- ).then(resampler => {
43
- this.resampler = resampler;
44
- });
45
- }
46
41
  break;
47
42
  case "buffer":
48
43
  this.wasInterrupted = false;
@@ -74,9 +69,6 @@ class AudioConcatProcessor extends AudioWorkletProcessor {
74
69
  break;
75
70
  }
76
71
  this.currentBuffer = this.buffers.shift();
77
- if (this.resampler) {
78
- this.currentBuffer = this.resampler.full(this.currentBuffer);
79
- }
80
72
  this.cursor = 0;
81
73
  }
82
74
 
@@ -102,3 +94,5 @@ class AudioConcatProcessor extends AudioWorkletProcessor {
102
94
  }
103
95
 
104
96
  registerProcessor("audioConcatProcessor", AudioConcatProcessor);
97
+ `);
98
+ //# sourceMappingURL=audioConcatProcessor.generated.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audioConcatProcessor.generated.js","sourceRoot":"","sources":["../../src/utils/audioConcatProcessor.generated.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAChE,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AAExE,MAAM,CAAC,MAAM,wBAAwB,GAAG,yBAAyB,CAC/D,sBAAsB;AACtB,sBAAsB;AACtB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4FD,CACA,CAAC"}
@@ -1,2 +1,3 @@
1
1
  export declare function isIosDevice(): boolean;
2
2
  export declare function isAndroidDevice(): boolean;
3
+ //# sourceMappingURL=compatibility.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compatibility.d.ts","sourceRoot":"","sources":["../../src/utils/compatibility.ts"],"names":[],"mappings":"AAAA,wBAAgB,WAAW,YAa1B;AAED,wBAAgB,eAAe,YAE9B"}
@@ -0,0 +1,16 @@
1
+ export function isIosDevice() {
2
+ return ([
3
+ "iPad Simulator",
4
+ "iPhone Simulator",
5
+ "iPod Simulator",
6
+ "iPad",
7
+ "iPhone",
8
+ "iPod",
9
+ ].includes(navigator.platform) ||
10
+ // iPad on iOS 13 detection
11
+ (navigator.userAgent.includes("Mac") && "ontouchend" in document));
12
+ }
13
+ export function isAndroidDevice() {
14
+ return /android/i.test(navigator.userAgent);
15
+ }
16
+ //# sourceMappingURL=compatibility.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compatibility.js","sourceRoot":"","sources":["../../src/utils/compatibility.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,WAAW;IACzB,OAAO,CACL;QACE,gBAAgB;QAChB,kBAAkB;QAClB,gBAAgB;QAChB,MAAM;QACN,QAAQ;QACR,MAAM;KACP,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC;QAC9B,2BAA2B;QAC3B,CAAC,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,YAAY,IAAI,QAAQ,CAAC,CAClE,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;AAC9C,CAAC"}
@@ -0,0 +1,11 @@
1
+ export { Language, DelayConfig, FormatConfig, DisconnectionDetails, OnDisconnectCallback, OnMessageCallback, SessionConfig, parseFormat, } from "./BaseConnection";
2
+ import { createConnection } from "./ConnectionFactory";
3
+ export { createConnection };
4
+ export { WebSocketConnection } from "./WebSocketConnection";
5
+ export { WebRTCConnection } from "./WebRTCConnection";
6
+ export { BaseConnection } from "./BaseConnection";
7
+ import type { SessionConfig } from "./BaseConnection";
8
+ export declare class Connection {
9
+ static create(config: SessionConfig): Promise<import("./BaseConnection").BaseConnection>;
10
+ }
11
+ //# sourceMappingURL=connection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../src/utils/connection.ts"],"names":[],"mappings":"AACA,OAAO,EACL,QAAQ,EACR,WAAW,EACX,YAAY,EACZ,oBAAoB,EACpB,oBAAoB,EACpB,iBAAiB,EACjB,aAAa,EACb,WAAW,GACZ,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,CAAC;AAC5B,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAGtD,qBAAa,UAAU;WACD,MAAM,CAAC,MAAM,EAAE,aAAa;CAGjD"}
@@ -0,0 +1,14 @@
1
+ // Re-export from the new connection architecture for backward compatibility
2
+ export { parseFormat, } from "./BaseConnection";
3
+ import { createConnection } from "./ConnectionFactory";
4
+ export { createConnection };
5
+ export { WebSocketConnection } from "./WebSocketConnection";
6
+ export { WebRTCConnection } from "./WebRTCConnection";
7
+ export { BaseConnection } from "./BaseConnection";
8
+ // Legacy Connection class that uses the factory
9
+ export class Connection {
10
+ static async create(config) {
11
+ return createConnection(config);
12
+ }
13
+ }
14
+ //# sourceMappingURL=connection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection.js","sourceRoot":"","sources":["../../src/utils/connection.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,OAAO,EAQL,WAAW,GACZ,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,CAAC;AAC5B,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAGlD,gDAAgD;AAChD,MAAM,OAAO,UAAU;IACd,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAqB;QAC9C,OAAO,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAClC,CAAC;CACF"}
@@ -1 +1,2 @@
1
1
  export declare function createWorkletModuleLoader(name: string, sourceCode: string): (worklet: AudioWorklet, path?: string) => Promise<void>;
2
+ //# sourceMappingURL=createWorkletModuleLoader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createWorkletModuleLoader.d.ts","sourceRoot":"","sources":["../../src/utils/createWorkletModuleLoader.ts"],"names":[],"mappings":"AAEA,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,IAC1D,SAAS,YAAY,EAAE,OAAO,MAAM,mBA2CnD"}
@@ -0,0 +1,43 @@
1
+ const URLCache = new Map();
2
+ export function createWorkletModuleLoader(name, sourceCode) {
3
+ return async (worklet, path) => {
4
+ const cachedUrl = URLCache.get(name);
5
+ if (cachedUrl) {
6
+ return worklet.addModule(cachedUrl);
7
+ }
8
+ // If a path is provided, use it directly (CSP-friendly approach)
9
+ if (path) {
10
+ try {
11
+ await worklet.addModule(path);
12
+ URLCache.set(name, path);
13
+ return;
14
+ }
15
+ catch (error) {
16
+ throw new Error(`Failed to load the ${name} worklet module from path: ${path}. Error: ${error}`);
17
+ }
18
+ }
19
+ const blob = new Blob([sourceCode], { type: "application/javascript" });
20
+ const blobURL = URL.createObjectURL(blob);
21
+ try {
22
+ await worklet.addModule(blobURL);
23
+ URLCache.set(name, blobURL);
24
+ return;
25
+ }
26
+ catch {
27
+ URL.revokeObjectURL(blobURL);
28
+ }
29
+ try {
30
+ // Attempting to start a conversation in Safari inside an iframe will
31
+ // throw a CORS error because the blob:// protocol is considered
32
+ // cross-origin. In such cases, fall back to using a base64 data URL:
33
+ const base64 = btoa(sourceCode);
34
+ const moduleURL = `data:application/javascript;base64,${base64}`;
35
+ await worklet.addModule(moduleURL);
36
+ URLCache.set(name, moduleURL);
37
+ }
38
+ catch (error) {
39
+ throw new Error(`Failed to load the ${name} worklet module. Make sure the browser supports AudioWorklets. If you are using a strict CSP, you may need to self-host the worklet files.`);
40
+ }
41
+ };
42
+ }
43
+ //# sourceMappingURL=createWorkletModuleLoader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createWorkletModuleLoader.js","sourceRoot":"","sources":["../../src/utils/createWorkletModuleLoader.ts"],"names":[],"mappings":"AAAA,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;AAE3C,MAAM,UAAU,yBAAyB,CAAC,IAAY,EAAE,UAAkB;IACxE,OAAO,KAAK,EAAE,OAAqB,EAAE,IAAa,EAAE,EAAE;QACpD,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,SAAS,EAAE,CAAC;YACd,OAAO,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACtC,CAAC;QAED,iEAAiE;QACjE,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,CAAC;gBACH,MAAM,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;gBAC9B,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBACzB,OAAO;YACT,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,IAAI,KAAK,CACb,sBAAsB,IAAI,8BAA8B,IAAI,YAAY,KAAK,EAAE,CAChF,CAAC;YACJ,CAAC;QACH,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,UAAU,CAAC,EAAE,EAAE,IAAI,EAAE,wBAAwB,EAAE,CAAC,CAAC;QACxE,MAAM,OAAO,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAC1C,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YACjC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAC5B,OAAO;QACT,CAAC;QAAC,MAAM,CAAC;YACP,GAAG,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QAC/B,CAAC;QAED,IAAI,CAAC;YACH,qEAAqE;YACrE,gEAAgE;YAChE,qEAAqE;YACrE,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC;YAChC,MAAM,SAAS,GAAG,sCAAsC,MAAM,EAAE,CAAC;YACjE,MAAM,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YACnC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAChC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CACb,sBAAsB,IAAI,4IAA4I,CACvK,CAAC;QACJ,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
@@ -6,3 +6,4 @@ export declare class SessionConnectionError extends Error {
6
6
  closeReason?: string;
7
7
  });
8
8
  }
9
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,sBAAuB,SAAQ,KAAK;IAC/C,SAAgB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnC,SAAgB,WAAW,CAAC,EAAE,MAAM,CAAC;gBAGnC,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE;CAOzD"}
@@ -0,0 +1,11 @@
1
+ export class SessionConnectionError extends Error {
2
+ closeCode;
3
+ closeReason;
4
+ constructor(message, options) {
5
+ super(message);
6
+ this.name = "SessionConnectionError";
7
+ this.closeCode = options?.closeCode;
8
+ this.closeReason = options?.closeReason;
9
+ }
10
+ }
11
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IAC/B,SAAS,CAAU;IACnB,WAAW,CAAU;IAErC,YACE,OAAe,EACf,OAAsD;QAEtD,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;QACrC,IAAI,CAAC,SAAS,GAAG,OAAO,EAAE,SAAS,CAAC;QACpC,IAAI,CAAC,WAAW,GAAG,OAAO,EAAE,WAAW,CAAC;IAC1C,CAAC;CACF"}
@@ -1,6 +1,4 @@
1
- import { Outgoing } from "@elevenlabs/types";
2
- import type { AudioAlignmentEvent } from "@elevenlabs/types";
3
- import { AgentChatResponsePartClientEvent, AgentResponse, AgentResponseCorrection, AgentToolResponseClientEvent, AsrInitiationMetadataEvent as AsrMetadataEvent, Audio, AgentToolRequestClientEvent, ClientToolCallMessage, ConversationMetadata, ErrorMessage, Interruption, McpConnectionStatusClientEvent, McpToolCall, Ping, InternalTentativeAgentResponse as TentativeAgentResponseInternal, UserTranscript, VadScore } from "@elevenlabs/types/generated/types/asyncapi-types";
1
+ import type { AgentChatResponsePartClientEvent, AgentResponse, AgentResponseCorrection, AgentToolResponseClientEvent, AsrInitiationMetadataEvent as AsrMetadataEvent, Audio, AudioAlignmentEvent, AgentToolRequestClientEvent, ClientToolCallMessage, ConversationMetadata, ErrorMessage, Interruption, McpConnectionStatusClientEvent, McpToolCall, Outgoing, Ping, InternalTentativeAgentResponse as TentativeAgentResponseInternal, UserTranscript, VadScore } from "@elevenlabs/types";
4
2
  export type UserTranscriptionEvent = UserTranscript;
5
3
  export type AgentResponseEvent = AgentResponse;
6
4
  export type AgentAudioEvent = Audio;
@@ -32,3 +30,4 @@ export type UserActivityEvent = Outgoing.UserActivityClientToOrchestratorEvent;
32
30
  export type MCPToolApprovalResultEvent = Outgoing.McpToolApprovalResultClientToOrchestratorEvent;
33
31
  export type OutgoingSocketEvent = PongEvent | UserAudioEvent | InitiationClientDataEvent | UserFeedbackEvent | ClientToolResultEvent | ContextualUpdateEvent | UserMessageEvent | UserActivityEvent | MCPToolApprovalResultEvent;
34
32
  export declare function isValidSocketEvent(event: any): event is IncomingSocketEvent;
33
+ //# sourceMappingURL=events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/utils/events.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gCAAgC,EAChC,aAAa,EACb,uBAAuB,EACvB,4BAA4B,EAC5B,0BAA0B,IAAI,gBAAgB,EAC9C,KAAK,EACL,mBAAmB,EACnB,2BAA2B,EAC3B,qBAAqB,EACrB,oBAAoB,EACpB,YAAY,EACZ,YAAY,EACZ,8BAA8B,EAC9B,WAAW,EACX,QAAQ,EACR,IAAI,EACJ,8BAA8B,IAAI,8BAA8B,EAChE,cAAc,EACd,QAAQ,EACT,MAAM,mBAAmB,CAAC;AAG3B,MAAM,MAAM,sBAAsB,GAAG,cAAc,CAAC;AACpD,MAAM,MAAM,kBAAkB,GAAG,aAAa,CAAC;AAC/C,MAAM,MAAM,eAAe,GAAG,KAAK,CAAC;AACpC,MAAM,MAAM,iBAAiB,GAAG,YAAY,CAAC;AAC7C,MAAM,MAAM,mCAAmC,GAC7C,8BAA8B,CAAC;AACjC,MAAM,MAAM,WAAW,GAAG,oBAAoB,CAAC;AAC/C,MAAM,MAAM,SAAS,GAAG,IAAI,CAAC;AAC7B,MAAM,MAAM,mBAAmB,GAAG,qBAAqB,CAAC;AACxD,MAAM,MAAM,aAAa,GAAG,QAAQ,CAAC;AACrC,MAAM,MAAM,sBAAsB,GAAG,WAAW,CAAC;AACjD,MAAM,MAAM,4BAA4B,GAAG,uBAAuB,CAAC;AACnE,MAAM,MAAM,qBAAqB,GAAG,2BAA2B,CAAC;AAChE,MAAM,MAAM,sBAAsB,GAAG,4BAA4B,CAAC;AAClE,MAAM,MAAM,yBAAyB,GAAG,oBAAoB,CAAC;AAC7D,MAAM,MAAM,0BAA0B,GAAG,gBAAgB,CAAC;AAC1D,MAAM,MAAM,wBAAwB,GAAG,8BAA8B,CAAC;AACtE,MAAM,MAAM,0BAA0B,GAAG,gCAAgC,CAAC;AAC1E,MAAM,MAAM,iBAAiB,GAAG,YAAY,CAAC;AAC7C,YAAY,EAAE,mBAAmB,EAAE,CAAC;AAEpC,MAAM,MAAM,mBAAmB,GAC3B,sBAAsB,GACtB,kBAAkB,GAClB,4BAA4B,GAC5B,eAAe,GACf,iBAAiB,GACjB,mCAAmC,GACnC,WAAW,GACX,SAAS,GACT,mBAAmB,GACnB,aAAa,GACb,sBAAsB,GACtB,qBAAqB,GACrB,sBAAsB,GACtB,yBAAyB,GACzB,0BAA0B,GAC1B,wBAAwB,GACxB,0BAA0B,GAC1B,iBAAiB,CAAC;AAGtB,MAAM,MAAM,SAAS,GAAG,QAAQ,CAAC,6BAA6B,CAAC;AAC/D,MAAM,MAAM,cAAc,GAAG,QAAQ,CAAC,SAAS,CAAC;AAChD,MAAM,MAAM,iBAAiB,GAAG,QAAQ,CAAC,qCAAqC,CAAC;AAC/E,MAAM,MAAM,qBAAqB,GAC/B,QAAQ,CAAC,yCAAyC,CAAC;AACrD,MAAM,MAAM,yBAAyB,GACnC,QAAQ,CAAC,+CAA+C,CAAC;AAC3D,MAAM,MAAM,qBAAqB,GAC/B,QAAQ,CAAC,yCAAyC,CAAC;AACrD,MAAM,MAAM,gBAAgB,GAAG,QAAQ,CAAC,oCAAoC,CAAC;AAC7E,MAAM,MAAM,iBAAiB,GAAG,QAAQ,CAAC,qCAAqC,CAAC;AAC/E,MAAM,MAAM,0BAA0B,GACpC,QAAQ,CAAC,8CAA8C,CAAC;AAE1D,MAAM,MAAM,mBAAmB,GAC3B,SAAS,GACT,cAAc,GACd,yBAAyB,GACzB,iBAAiB,GACjB,qBAAqB,GACrB,qBAAqB,GACrB,gBAAgB,GAChB,iBAAiB,GACjB,0BAA0B,CAAC;AAE/B,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,GAAG,GAAG,KAAK,IAAI,mBAAmB,CAE3E"}
@@ -0,0 +1,4 @@
1
+ export function isValidSocketEvent(event) {
2
+ return !!event.type;
3
+ }
4
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/utils/events.ts"],"names":[],"mappings":"AA0FA,MAAM,UAAU,kBAAkB,CAAC,KAAU;IAC3C,OAAO,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;AACtB,CAAC"}
@@ -1,25 +1,36 @@
1
1
  import type { FormatConfig } from "./connection";
2
2
  import type { AudioWorkletConfig } from "../BaseConversation";
3
- export type InputConfig = {
4
- preferHeadphonesForIosDevices?: boolean;
5
- inputDeviceId?: string;
3
+ import type { InputController, InputDeviceConfig } from "../InputController";
4
+ export type InputConfig = InputDeviceConfig & {
6
5
  onError?(message: string, context?: unknown): void;
7
6
  };
8
- export declare class Input {
9
- readonly context: AudioContext;
10
- readonly analyser: AnalyserNode;
11
- readonly worklet: AudioWorkletNode;
12
- inputStream: MediaStream;
7
+ export type InputMessageEvent = MessageEvent<[Uint8Array, number]>;
8
+ export type InputListener = (event: InputMessageEvent) => void;
9
+ export type InputEventTarget = {
10
+ addListener(listener: InputListener): void;
11
+ removeListener(listener: InputListener): void;
12
+ };
13
+ export declare class MediaDeviceInput implements InputController, InputEventTarget {
14
+ private readonly context;
15
+ private readonly analyser;
16
+ private readonly worklet;
17
+ private inputStream;
13
18
  private mediaStreamSource;
14
19
  private permissions;
15
20
  private onError;
16
- static create({ sampleRate, format, preferHeadphonesForIosDevices, inputDeviceId, workletPaths, libsampleratePath, onError, }: FormatConfig & InputConfig & AudioWorkletConfig): Promise<Input>;
21
+ static create({ sampleRate, format, preferHeadphonesForIosDevices, inputDeviceId, workletPaths, libsampleratePath, onError, }: FormatConfig & InputConfig & AudioWorkletConfig): Promise<MediaDeviceInput>;
17
22
  private static getDeviceIdConstraint;
23
+ private muted;
18
24
  private constructor();
25
+ getAnalyser(): AnalyserNode;
26
+ isMuted(): boolean;
27
+ addListener(listener: InputListener): void;
28
+ removeListener(listener: InputListener): void;
19
29
  private forgetInputStreamAndSource;
20
30
  close(): Promise<void>;
21
- setMuted(isMuted: boolean): void;
31
+ setMuted(isMuted: boolean): Promise<void>;
22
32
  private settingInput;
23
- setInputDevice(inputDeviceId?: string): Promise<void>;
33
+ setDevice(config?: Partial<FormatConfig> & InputDeviceConfig): Promise<void>;
24
34
  private handlePermissionsChange;
25
35
  }
36
+ //# sourceMappingURL=input.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input.d.ts","sourceRoot":"","sources":["../../src/utils/input.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAE7E,MAAM,MAAM,WAAW,GAAG,iBAAiB,GAAG;IAC5C,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;CACpD,CAAC;AAcF,MAAM,MAAM,iBAAiB,GAAG,YAAY,CAAC,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;AACnE,MAAM,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC;AAE/D,MAAM,MAAM,gBAAgB,GAAG;IAC7B,WAAW,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI,CAAC;IAC3C,cAAc,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI,CAAC;CAC/C,CAAC;AAEF,qBAAa,gBAAiB,YAAW,eAAe,EAAE,gBAAgB;IA4GtE,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,WAAW;IACnB,OAAO,CAAC,iBAAiB;IACzB,OAAO,CAAC,WAAW;IACnB,OAAO,CAAC,OAAO;WAjHG,MAAM,CAAC,EACzB,UAAU,EACV,MAAM,EACN,6BAA6B,EAC7B,aAAa,EACb,YAAY,EACZ,iBAAiB,EACjB,OAAO,GACR,EAAE,YAAY,GACb,WAAW,GACX,kBAAkB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAqFhD,OAAO,CAAC,MAAM,CAAC,qBAAqB;IASpC,OAAO,CAAC,KAAK,CAAS;IAEtB,OAAO;IAkBA,WAAW,IAAI,YAAY;IAI3B,OAAO,IAAI,OAAO;IAIlB,WAAW,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI;IAI1C,cAAc,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI;IAIpD,OAAO,CAAC,0BAA0B;IAOrB,KAAK;IASL,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAKtD,OAAO,CAAC,YAAY,CAAkB;IACzB,SAAS,CACpB,MAAM,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,iBAAiB,GACjD,OAAO,CAAC,IAAI,CAAC;IAkDhB,OAAO,CAAC,uBAAuB,CAe7B;CACH"}