@elevenlabs/client 1.7.1 → 1.8.1

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 (162) hide show
  1. package/dist/BaseConversation.d.ts +2 -2
  2. package/dist/BaseConversation.d.ts.map +1 -1
  3. package/dist/BaseConversation.js +18 -15
  4. package/dist/BaseConversation.js.map +1 -1
  5. package/dist/InputController.d.ts +9 -0
  6. package/dist/InputController.d.ts.map +1 -1
  7. package/dist/OutputController.d.ts +18 -0
  8. package/dist/OutputController.d.ts.map +1 -1
  9. package/dist/TextConversation.js +2 -2
  10. package/dist/TextConversation.js.map +1 -1
  11. package/dist/VoiceConversation.d.ts +3 -6
  12. package/dist/VoiceConversation.d.ts.map +1 -1
  13. package/dist/VoiceConversation.js +15 -69
  14. package/dist/VoiceConversation.js.map +1 -1
  15. package/dist/WebRTCAudioAdapter.d.ts +52 -0
  16. package/dist/WebRTCAudioAdapter.d.ts.map +1 -0
  17. package/dist/WebRTCAudioAdapter.js +17 -0
  18. package/dist/WebRTCAudioAdapter.js.map +1 -0
  19. package/dist/index.d.ts +3 -5
  20. package/dist/index.d.ts.map +1 -1
  21. package/dist/index.js +3 -1
  22. package/dist/index.js.map +1 -1
  23. package/dist/internal.d.ts +6 -1
  24. package/dist/internal.d.ts.map +1 -1
  25. package/dist/internal.js +4 -1
  26. package/dist/internal.js.map +1 -1
  27. package/dist/lib.iife.js +3519 -3220
  28. package/dist/lib.iife.js.map +1 -1
  29. package/dist/platform/VoiceSessionSetup.d.ts +10 -15
  30. package/dist/platform/VoiceSessionSetup.d.ts.map +1 -1
  31. package/dist/platform/VoiceSessionSetup.js +20 -62
  32. package/dist/platform/VoiceSessionSetup.js.map +1 -1
  33. package/dist/platform/tsconfig.test.tsbuildinfo +1 -0
  34. package/dist/platform/web/VoiceSessionSetup.d.ts +9 -0
  35. package/dist/platform/web/VoiceSessionSetup.d.ts.map +1 -0
  36. package/dist/platform/web/VoiceSessionSetup.js +166 -0
  37. package/dist/platform/web/VoiceSessionSetup.js.map +1 -0
  38. package/dist/platform/web/addLibsamplerateModule.d.ts.map +1 -0
  39. package/dist/platform/web/addLibsamplerateModule.js.map +1 -0
  40. package/dist/platform/web/audioConcatProcessor.generated.d.ts.map +1 -0
  41. package/dist/platform/web/audioConcatProcessor.generated.js.map +1 -0
  42. package/dist/platform/web/audioUnlock.d.ts +11 -0
  43. package/dist/platform/web/audioUnlock.d.ts.map +1 -0
  44. package/dist/platform/web/audioUnlock.js +74 -0
  45. package/dist/platform/web/audioUnlock.js.map +1 -0
  46. package/dist/platform/web/compatibility.d.ts.map +1 -0
  47. package/dist/platform/web/compatibility.js.map +1 -0
  48. package/dist/platform/web/createWorkletModuleLoader.d.ts.map +1 -0
  49. package/dist/platform/web/createWorkletModuleLoader.js.map +1 -0
  50. package/dist/platform/web/index.d.ts +3 -0
  51. package/dist/platform/web/index.d.ts.map +1 -0
  52. package/dist/platform/web/index.js +18 -0
  53. package/dist/platform/web/index.js.map +1 -0
  54. package/dist/{utils → platform/web}/input.d.ts +3 -12
  55. package/dist/platform/web/input.d.ts.map +1 -0
  56. package/dist/platform/web/input.js.map +1 -0
  57. package/dist/platform/web/output.d.ts +29 -0
  58. package/dist/platform/web/output.d.ts.map +1 -0
  59. package/dist/{utils → platform/web}/output.js +29 -3
  60. package/dist/platform/web/output.js.map +1 -0
  61. package/dist/platform/web/rawAudioProcessor.generated.d.ts.map +1 -0
  62. package/dist/platform/web/rawAudioProcessor.generated.js.map +1 -0
  63. package/dist/platform/web/scribeAudioProcessor.generated.d.ts.map +1 -0
  64. package/dist/platform/web/scribeAudioProcessor.generated.js.map +1 -0
  65. package/dist/platform/web/scribeMicrophone.d.ts +10 -0
  66. package/dist/platform/web/scribeMicrophone.d.ts.map +1 -0
  67. package/dist/platform/web/scribeMicrophone.js +65 -0
  68. package/dist/platform/web/scribeMicrophone.js.map +1 -0
  69. package/dist/platform/web/volumeProvider.d.ts +4 -0
  70. package/dist/platform/web/volumeProvider.d.ts.map +1 -0
  71. package/dist/platform/web/volumeProvider.js +24 -0
  72. package/dist/platform/web/volumeProvider.js.map +1 -0
  73. package/dist/platform/web/webAudioAdapter.d.ts +23 -0
  74. package/dist/platform/web/webAudioAdapter.d.ts.map +1 -0
  75. package/dist/platform/web/webAudioAdapter.js +127 -0
  76. package/dist/platform/web/webAudioAdapter.js.map +1 -0
  77. package/dist/runtime.d.ts +181 -0
  78. package/dist/runtime.d.ts.map +1 -0
  79. package/dist/runtime.js +34 -0
  80. package/dist/runtime.js.map +1 -0
  81. package/dist/scribe/microphone.d.ts +31 -0
  82. package/dist/scribe/microphone.d.ts.map +1 -0
  83. package/dist/scribe/microphone.js +23 -0
  84. package/dist/scribe/microphone.js.map +1 -0
  85. package/dist/scribe/scribe.d.ts +1 -1
  86. package/dist/scribe/scribe.d.ts.map +1 -1
  87. package/dist/scribe/scribe.js +6 -62
  88. package/dist/scribe/scribe.js.map +1 -1
  89. package/dist/types.d.ts +12 -2
  90. package/dist/types.d.ts.map +1 -1
  91. package/dist/types.js.map +1 -1
  92. package/dist/utils/BaseConnection.d.ts +1 -1
  93. package/dist/utils/BaseConnection.d.ts.map +1 -1
  94. package/dist/utils/WebRTCConnection.d.ts +4 -7
  95. package/dist/utils/WebRTCConnection.d.ts.map +1 -1
  96. package/dist/utils/WebRTCConnection.js +51 -128
  97. package/dist/utils/WebRTCConnection.js.map +1 -1
  98. package/dist/utils/WebSocketConnection.d.ts +2 -1
  99. package/dist/utils/WebSocketConnection.d.ts.map +1 -1
  100. package/dist/utils/WebSocketConnection.js +29 -12
  101. package/dist/utils/WebSocketConnection.js.map +1 -1
  102. package/dist/utils/applyDelay.d.ts +3 -2
  103. package/dist/utils/applyDelay.d.ts.map +1 -1
  104. package/dist/utils/applyDelay.js +18 -12
  105. package/dist/utils/applyDelay.js.map +1 -1
  106. package/dist/utils/assert.d.ts +3 -0
  107. package/dist/utils/assert.d.ts.map +1 -0
  108. package/dist/utils/assert.js +9 -0
  109. package/dist/utils/assert.js.map +1 -0
  110. package/dist/utils/attachConnectionToOutput.d.ts +1 -1
  111. package/dist/utils/attachConnectionToOutput.d.ts.map +1 -1
  112. package/dist/utils/attachInputToConnection.d.ts +1 -1
  113. package/dist/utils/attachInputToConnection.d.ts.map +1 -1
  114. package/dist/utils/audio.d.ts.map +1 -1
  115. package/dist/utils/audio.js +2 -3
  116. package/dist/utils/audio.js.map +1 -1
  117. package/dist/utils/connection.d.ts +1 -1
  118. package/dist/utils/connection.d.ts.map +1 -1
  119. package/dist/utils/connection.js.map +1 -1
  120. package/dist/utils/errors.d.ts.map +1 -1
  121. package/dist/utils/errors.js +5 -1
  122. package/dist/utils/errors.js.map +1 -1
  123. package/dist/utils/mergeOptions.d.ts.map +1 -1
  124. package/dist/utils/mergeOptions.js +1 -3
  125. package/dist/utils/mergeOptions.js.map +1 -1
  126. package/dist/utils/volumeProvider.d.ts +0 -1
  127. package/dist/utils/volumeProvider.d.ts.map +1 -1
  128. package/dist/utils/volumeProvider.js +0 -22
  129. package/dist/utils/volumeProvider.js.map +1 -1
  130. package/dist/version.d.ts +1 -1
  131. package/dist/version.js +1 -1
  132. package/package.json +3 -2
  133. package/dist/utils/addLibsamplerateModule.d.ts.map +0 -1
  134. package/dist/utils/addLibsamplerateModule.js.map +0 -1
  135. package/dist/utils/audioConcatProcessor.generated.d.ts.map +0 -1
  136. package/dist/utils/audioConcatProcessor.generated.js.map +0 -1
  137. package/dist/utils/compatibility.d.ts.map +0 -1
  138. package/dist/utils/compatibility.js.map +0 -1
  139. package/dist/utils/createWorkletModuleLoader.d.ts.map +0 -1
  140. package/dist/utils/createWorkletModuleLoader.js.map +0 -1
  141. package/dist/utils/input.d.ts.map +0 -1
  142. package/dist/utils/input.js.map +0 -1
  143. package/dist/utils/output.d.ts +0 -45
  144. package/dist/utils/output.d.ts.map +0 -1
  145. package/dist/utils/output.js.map +0 -1
  146. package/dist/utils/rawAudioProcessor.generated.d.ts.map +0 -1
  147. package/dist/utils/rawAudioProcessor.generated.js.map +0 -1
  148. package/dist/utils/scribeAudioProcessor.generated.d.ts.map +0 -1
  149. package/dist/utils/scribeAudioProcessor.generated.js.map +0 -1
  150. /package/dist/{utils → platform/web}/addLibsamplerateModule.d.ts +0 -0
  151. /package/dist/{utils → platform/web}/addLibsamplerateModule.js +0 -0
  152. /package/dist/{utils → platform/web}/audioConcatProcessor.generated.d.ts +0 -0
  153. /package/dist/{utils → platform/web}/audioConcatProcessor.generated.js +0 -0
  154. /package/dist/{utils → platform/web}/compatibility.d.ts +0 -0
  155. /package/dist/{utils → platform/web}/compatibility.js +0 -0
  156. /package/dist/{utils → platform/web}/createWorkletModuleLoader.d.ts +0 -0
  157. /package/dist/{utils → platform/web}/createWorkletModuleLoader.js +0 -0
  158. /package/dist/{utils → platform/web}/input.js +0 -0
  159. /package/dist/{utils → platform/web}/rawAudioProcessor.generated.d.ts +0 -0
  160. /package/dist/{utils → platform/web}/rawAudioProcessor.generated.js +0 -0
  161. /package/dist/{utils → platform/web}/scribeAudioProcessor.generated.d.ts +0 -0
  162. /package/dist/{utils → platform/web}/scribeAudioProcessor.generated.js +0 -0
@@ -0,0 +1,74 @@
1
+ import { isIosDevice } from "./compatibility.js";
2
+ const STASH_TTL_MS = 30_000;
3
+ const UNLOCK_EVENTS = ["touchstart", "touchend", "click"];
4
+ let stashedAudioContext = null;
5
+ let discardTimer = null;
6
+ let unlockListenerInstalled = false;
7
+ function unlockAudioContext(ctx) {
8
+ const buffer = ctx.createBuffer(1, 1, 22050);
9
+ const source = ctx.createBufferSource();
10
+ source.buffer = buffer;
11
+ source.connect(ctx.destination);
12
+ source.start(0);
13
+ void ctx.resume().catch(() => { });
14
+ }
15
+ function scheduleStashDiscard() {
16
+ if (discardTimer) {
17
+ clearTimeout(discardTimer);
18
+ }
19
+ discardTimer = setTimeout(() => {
20
+ discardTimer = null;
21
+ discardStashedAudioContext();
22
+ }, STASH_TTL_MS);
23
+ }
24
+ function clearStashDiscardTimer() {
25
+ if (!discardTimer) {
26
+ return;
27
+ }
28
+ clearTimeout(discardTimer);
29
+ discardTimer = null;
30
+ }
31
+ /** Unlock iOS audio during a user gesture. No-op on non-iOS. */
32
+ export function unlockIosAudioForSession() {
33
+ if (!isIosDevice() || stashedAudioContext) {
34
+ return;
35
+ }
36
+ const ctx = new AudioContext();
37
+ unlockAudioContext(ctx);
38
+ stashedAudioContext = ctx;
39
+ scheduleStashDiscard();
40
+ }
41
+ /**
42
+ * Listen for the first user interaction on the page and unlock iOS audio in
43
+ * the capture phase, before application click handlers run. Covers callers
44
+ * (such as the convai widget) that `await` before `Conversation.startSession`.
45
+ */
46
+ export function installIosAudioUnlockListener() {
47
+ if (!isIosDevice() ||
48
+ unlockListenerInstalled ||
49
+ typeof document === "undefined") {
50
+ return;
51
+ }
52
+ unlockListenerInstalled = true;
53
+ const onUserGesture = () => {
54
+ unlockIosAudioForSession();
55
+ };
56
+ for (const event of UNLOCK_EVENTS) {
57
+ document.addEventListener(event, onUserGesture, true);
58
+ }
59
+ }
60
+ export function takeUnlockedAudioContext() {
61
+ const ctx = stashedAudioContext;
62
+ stashedAudioContext = null;
63
+ clearStashDiscardTimer();
64
+ return ctx;
65
+ }
66
+ export function discardStashedAudioContext() {
67
+ if (!stashedAudioContext) {
68
+ return;
69
+ }
70
+ void stashedAudioContext.close().catch(() => { });
71
+ stashedAudioContext = null;
72
+ clearStashDiscardTimer();
73
+ }
74
+ //# sourceMappingURL=audioUnlock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audioUnlock.js","sourceRoot":"","sources":["../../../src/platform/web/audioUnlock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,YAAY,GAAG,MAAM,CAAC;AAC5B,MAAM,aAAa,GAAG,CAAC,YAAY,EAAE,UAAU,EAAE,OAAO,CAAU,CAAC;AAEnE,IAAI,mBAAmB,GAAwB,IAAI,CAAC;AACpD,IAAI,YAAY,GAAyC,IAAI,CAAC;AAC9D,IAAI,uBAAuB,GAAG,KAAK,CAAC;AAEpC,SAAS,kBAAkB,CAAC,GAAiB;IAC3C,MAAM,MAAM,GAAG,GAAG,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,GAAG,CAAC,kBAAkB,EAAE,CAAC;IACxC,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAChC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAChB,KAAK,GAAG,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;AACpC,CAAC;AAED,SAAS,oBAAoB;IAC3B,IAAI,YAAY,EAAE,CAAC;QACjB,YAAY,CAAC,YAAY,CAAC,CAAC;IAC7B,CAAC;IACD,YAAY,GAAG,UAAU,CAAC,GAAG,EAAE;QAC7B,YAAY,GAAG,IAAI,CAAC;QACpB,0BAA0B,EAAE,CAAC;IAC/B,CAAC,EAAE,YAAY,CAAC,CAAC;AACnB,CAAC;AAED,SAAS,sBAAsB;IAC7B,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO;IACT,CAAC;IACD,YAAY,CAAC,YAAY,CAAC,CAAC;IAC3B,YAAY,GAAG,IAAI,CAAC;AACtB,CAAC;AAED,gEAAgE;AAChE,MAAM,UAAU,wBAAwB;IACtC,IAAI,CAAC,WAAW,EAAE,IAAI,mBAAmB,EAAE,CAAC;QAC1C,OAAO;IACT,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,YAAY,EAAE,CAAC;IAC/B,kBAAkB,CAAC,GAAG,CAAC,CAAC;IACxB,mBAAmB,GAAG,GAAG,CAAC;IAC1B,oBAAoB,EAAE,CAAC;AACzB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,6BAA6B;IAC3C,IACE,CAAC,WAAW,EAAE;QACd,uBAAuB;QACvB,OAAO,QAAQ,KAAK,WAAW,EAC/B,CAAC;QACD,OAAO;IACT,CAAC;IAED,uBAAuB,GAAG,IAAI,CAAC;IAC/B,MAAM,aAAa,GAAG,GAAG,EAAE;QACzB,wBAAwB,EAAE,CAAC;IAC7B,CAAC,CAAC;IAEF,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE,CAAC;QAClC,QAAQ,CAAC,gBAAgB,CAAC,KAAK,EAAE,aAAa,EAAE,IAAI,CAAC,CAAC;IACxD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,wBAAwB;IACtC,MAAM,GAAG,GAAG,mBAAmB,CAAC;IAChC,mBAAmB,GAAG,IAAI,CAAC;IAC3B,sBAAsB,EAAE,CAAC;IACzB,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,0BAA0B;IACxC,IAAI,CAAC,mBAAmB,EAAE,CAAC;QACzB,OAAO;IACT,CAAC;IACD,KAAK,mBAAmB,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACjD,mBAAmB,GAAG,IAAI,CAAC;IAC3B,sBAAsB,EAAE,CAAC;AAC3B,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compatibility.d.ts","sourceRoot":"","sources":["../../../src/platform/web/compatibility.ts"],"names":[],"mappings":"AAAA,wBAAgB,WAAW,YAa1B;AAED,wBAAgB,eAAe,YAE9B"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compatibility.js","sourceRoot":"","sources":["../../../src/platform/web/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 @@
1
+ {"version":3,"file":"createWorkletModuleLoader.d.ts","sourceRoot":"","sources":["../../../src/platform/web/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 @@
1
+ {"version":3,"file":"createWorkletModuleLoader.js","sourceRoot":"","sources":["../../../src/platform/web/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"}
@@ -0,0 +1,3 @@
1
+ import "./VoiceSessionSetup.js";
2
+ export * from "../../index.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/platform/web/index.ts"],"names":[],"mappings":"AACA,OAAO,wBAAwB,CAAC;AAmBhC,cAAc,gBAAgB,CAAC"}
@@ -0,0 +1,18 @@
1
+ // Side-effect: registers the web voice session setup strategy
2
+ import "./VoiceSessionSetup.js";
3
+ // Side-effect: arms iOS audio unlock on first user gesture (no-op on other
4
+ // platforms). Needed because the convai widget awaits other promises (terms
5
+ // modal etc.) between the user's tap and Conversation.startSession, by which
6
+ // point the gesture has been consumed.
7
+ import { installIosAudioUnlockListener } from "./audioUnlock.js";
8
+ installIosAudioUnlockListener();
9
+ // Side-effect: registers the web audio adapter for WebRTC connections
10
+ import { setWebRTCAudioAdapterFactory } from "../../WebRTCAudioAdapter.js";
11
+ import { WebAudioAdapter } from "./webAudioAdapter.js";
12
+ setWebRTCAudioAdapterFactory(() => new WebAudioAdapter());
13
+ // Side-effect: registers the web Scribe microphone implementation
14
+ import { setScribeMicrophoneSetup } from "../../scribe/microphone.js";
15
+ import { webScribeMicrophoneSetup } from "./scribeMicrophone.js";
16
+ setScribeMicrophoneSetup(webScribeMicrophoneSetup);
17
+ export * from "../../index.js";
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/platform/web/index.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,OAAO,wBAAwB,CAAC;AAEhC,2EAA2E;AAC3E,4EAA4E;AAC5E,6EAA6E;AAC7E,uCAAuC;AACvC,OAAO,EAAE,6BAA6B,EAAE,MAAM,kBAAkB,CAAC;AACjE,6BAA6B,EAAE,CAAC;AAEhC,sEAAsE;AACtE,OAAO,EAAE,4BAA4B,EAAE,MAAM,6BAA6B,CAAC;AAC3E,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,4BAA4B,CAAC,GAAG,EAAE,CAAC,IAAI,eAAe,EAAE,CAAC,CAAC;AAE1D,kEAAkE;AAClE,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AACjE,wBAAwB,CAAC,wBAAwB,CAAC,CAAC;AAEnD,cAAc,gBAAgB,CAAC"}
@@ -1,15 +1,6 @@
1
- import type { FormatConfig } from "./connection.js";
2
- import type { AudioWorkletConfig } from "../BaseConversation.js";
3
- import type { InputController, InputDeviceConfig } from "../InputController.js";
4
- export type InputConfig = InputDeviceConfig & {
5
- onError?(message: string, context?: unknown): void;
6
- };
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
- };
1
+ import type { FormatConfig } from "../../utils/BaseConnection.js";
2
+ import type { AudioWorkletConfig } from "../../BaseConversation.js";
3
+ import type { InputController, InputDeviceConfig, InputConfig, InputEventTarget, InputListener } from "../../InputController.js";
13
4
  export declare class MediaDeviceInput implements InputController, InputEventTarget {
14
5
  private readonly context;
15
6
  private readonly analyser;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input.d.ts","sourceRoot":"","sources":["../../../src/platform/web/input.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAElE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAEpE,OAAO,KAAK,EACV,eAAe,EACf,iBAAiB,EACjB,WAAW,EACX,gBAAgB,EAChB,aAAa,EACd,MAAM,0BAA0B,CAAC;AAelC,qBAAa,gBAAiB,YAAW,eAAe,EAAE,gBAAgB;IA2GtE,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;WAhHG,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;IAmFhD,OAAO,CAAC,MAAM,CAAC,qBAAqB;IASpC,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAEhD,OAAO;IAsBA,WAAW,IAAI,YAAY;IAI3B,SAAS,IAAI,MAAM;IAKnB,oBAAoB,CAAC,MAAM,EAAE,UAAU,CAAC,WAAW,CAAC,GAAG,IAAI;IAQ3D,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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input.js","sourceRoot":"","sources":["../../../src/platform/web/input.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import type { FormatConfig } from "../../utils/BaseConnection.js";
2
+ import type { AudioWorkletConfig } from "../../BaseConversation.js";
3
+ import type { OutputController, OutputDeviceConfig, OutputConfig, PlaybackEventTarget, PlaybackListener } from "../../OutputController.js";
4
+ export declare class MediaDeviceOutput implements OutputController, PlaybackEventTarget {
5
+ private readonly context;
6
+ private readonly analyser;
7
+ private readonly gain;
8
+ private readonly worklet;
9
+ private readonly audioElement;
10
+ static create({ sampleRate, format, outputDeviceId, workletPaths, libsampleratePath, audioContext, }: FormatConfig & OutputConfig & AudioWorkletConfig & {
11
+ audioContext?: AudioContext;
12
+ }): Promise<MediaDeviceOutput>;
13
+ private volume;
14
+ private interrupted;
15
+ private interruptTimeout;
16
+ private readonly volumeProvider;
17
+ private constructor();
18
+ getAnalyser(): AnalyserNode;
19
+ getVolume(): number;
20
+ getByteFrequencyData(buffer: Uint8Array<ArrayBuffer>): void;
21
+ addListener(listener: PlaybackListener): void;
22
+ removeListener(listener: PlaybackListener): void;
23
+ setVolume(volume: number): void;
24
+ playAudio(chunk: ArrayBuffer): void;
25
+ interrupt(resetDuration?: number): void;
26
+ setDevice(config?: Partial<FormatConfig> & OutputDeviceConfig): Promise<void>;
27
+ close(): Promise<void>;
28
+ }
29
+ //# sourceMappingURL=output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../../src/platform/web/output.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAEpE,OAAO,KAAK,EACV,gBAAgB,EAChB,kBAAkB,EAClB,YAAY,EACZ,mBAAmB,EACnB,gBAAgB,EACjB,MAAM,2BAA2B,CAAC;AA0CnC,qBAAa,iBACX,YAAW,gBAAgB,EAAE,mBAAmB;IAkG9C,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,YAAY;WApGX,MAAM,CAAC,EACzB,UAAU,EACV,MAAM,EACN,cAAc,EACd,YAAY,EACZ,iBAAiB,EACjB,YAAY,GACb,EAAE,YAAY,GACb,YAAY,GACZ,kBAAkB,GAAG;QACnB,YAAY,CAAC,EAAE,YAAY,CAAC;KAC7B,GAAG,OAAO,CAAC,iBAAiB,CAAC;IA+EhC,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,gBAAgB,CAA8C;IACtE,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAEhD,OAAO;IAgBA,WAAW,IAAI,YAAY;IAI3B,SAAS,IAAI,MAAM;IAInB,oBAAoB,CAAC,MAAM,EAAE,UAAU,CAAC,WAAW,CAAC,GAAG,IAAI;IAI3D,WAAW,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI;IAI7C,cAAc,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI;IAIhD,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAK/B,SAAS,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI;IAWnC,SAAS,CAAC,aAAa,SAAO,GAAG,IAAI;IA2B/B,SAAS,CACpB,MAAM,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,kBAAkB,GAClD,OAAO,CAAC,IAAI,CAAC;IAgBH,KAAK;CAcnB"}
@@ -1,18 +1,43 @@
1
1
  import { loadAudioConcatProcessor } from "./audioConcatProcessor.generated.js";
2
2
  import { addLibsamplerateModule } from "./addLibsamplerateModule.js";
3
3
  import { createAnalyserVolumeProvider, } from "./volumeProvider.js";
4
+ import { isIosDevice } from "./compatibility.js";
5
+ function maybePrimeIosPlayback({ sampleRate, format, worklet, audioElement, }) {
6
+ if (!isIosDevice()) {
7
+ return;
8
+ }
9
+ // ~100ms of silence is enough to flush the worklet → MediaStream → audio
10
+ // element pipeline so iOS treats the element as "playing media" and won't
11
+ // stall the first real audio chunk.
12
+ const PRIME_DURATION_MS = 100;
13
+ const primeFrameCount = Math.floor((sampleRate * PRIME_DURATION_MS) / 1000);
14
+ // μ-law silence is 0xFF, not 0x00. The worklet decodes 0x00 to ~-32124
15
+ // (near full-scale negative DC), which would emit a loud pop instead of
16
+ // priming with silence. PCM silence is plain zero, so the zero-filled
17
+ // Int16Array is correct as-is.
18
+ const silentBuffer = format === "ulaw"
19
+ ? new Uint8Array(primeFrameCount).fill(0xff)
20
+ : new Int16Array(primeFrameCount);
21
+ worklet.port.postMessage({
22
+ type: "buffer",
23
+ buffer: silentBuffer.buffer,
24
+ });
25
+ void audioElement.play().catch(() => { });
26
+ }
4
27
  export class MediaDeviceOutput {
5
28
  context;
6
29
  analyser;
7
30
  gain;
8
31
  worklet;
9
32
  audioElement;
10
- static async create({ sampleRate, format, outputDeviceId, workletPaths, libsampleratePath, }) {
11
- let context = null;
33
+ static async create({ sampleRate, format, outputDeviceId, workletPaths, libsampleratePath, audioContext, }) {
34
+ let context = audioContext ?? null;
12
35
  let audioElement = null;
13
36
  try {
14
37
  const supportsSampleRateConstraint = navigator.mediaDevices.getSupportedConstraints().sampleRate;
15
- context = new AudioContext(supportsSampleRateConstraint ? { sampleRate } : {});
38
+ if (!context) {
39
+ context = new AudioContext(supportsSampleRateConstraint ? { sampleRate } : {});
40
+ }
16
41
  const analyser = context.createAnalyser();
17
42
  const gain = context.createGain();
18
43
  // Always create an audio element for device switching capability
@@ -38,6 +63,7 @@ export class MediaDeviceOutput {
38
63
  worklet.port.postMessage({ type: "setFormat", format, sampleRate });
39
64
  worklet.connect(gain);
40
65
  await context.resume();
66
+ maybePrimeIosPlayback({ sampleRate, format, worklet, audioElement });
41
67
  // Set initial output device if provided
42
68
  if (outputDeviceId && audioElement.setSinkId) {
43
69
  await audioElement.setSinkId(outputDeviceId);
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../../../src/platform/web/output.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rawAudioProcessor.generated.d.ts","sourceRoot":"","sources":["../../../src/platform/web/rawAudioProcessor.generated.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,qBAAqB,yDAgIjC,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rawAudioProcessor.generated.js","sourceRoot":"","sources":["../../../src/platform/web/rawAudioProcessor.generated.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAChE,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAE3E,MAAM,CAAC,MAAM,qBAAqB,GAAG,yBAAyB,CAC5D,mBAAmB;AACnB,sBAAsB;AACtB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4HD,CACA,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scribeAudioProcessor.generated.d.ts","sourceRoot":"","sources":["../../../src/platform/web/scribeAudioProcessor.generated.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,wBAAwB,yDA8GpC,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scribeAudioProcessor.generated.js","sourceRoot":"","sources":["../../../src/platform/web/scribeAudioProcessor.generated.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAChE,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAE3E,MAAM,CAAC,MAAM,wBAAwB,GAAG,yBAAyB,CAC/D,sBAAsB;AACtB,sBAAsB;AACtB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0GD,CACA,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { ScribeMicrophoneSetup } from "../../scribe/microphone.js";
2
+ /**
3
+ * Web implementation of Scribe microphone streaming.
4
+ *
5
+ * Uses `navigator.mediaDevices.getUserMedia`, `AudioContext`, and an
6
+ * `AudioWorkletNode` to capture, resample, and encode microphone audio
7
+ * as base64 PCM16 chunks.
8
+ */
9
+ export declare const webScribeMicrophoneSetup: ScribeMicrophoneSetup;
10
+ //# sourceMappingURL=scribeMicrophone.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scribeMicrophone.d.ts","sourceRoot":"","sources":["../../../src/platform/web/scribeMicrophone.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,qBAAqB,EACtB,MAAM,4BAA4B,CAAC;AAMpC;;;;;;GAMG;AACH,eAAO,MAAM,wBAAwB,EAAE,qBAmEtC,CAAC"}
@@ -0,0 +1,65 @@
1
+ import { arrayBufferToBase64 } from "../../utils/audio.js";
2
+ import { loadScribeAudioProcessor } from "./scribeAudioProcessor.generated.js";
3
+ const TARGET_SAMPLE_RATE = 16000;
4
+ /**
5
+ * Web implementation of Scribe microphone streaming.
6
+ *
7
+ * Uses `navigator.mediaDevices.getUserMedia`, `AudioContext`, and an
8
+ * `AudioWorkletNode` to capture, resample, and encode microphone audio
9
+ * as base64 PCM16 chunks.
10
+ */
11
+ export const webScribeMicrophoneSetup = async (config, onAudioData) => {
12
+ // Get microphone access
13
+ const stream = await navigator.mediaDevices.getUserMedia({
14
+ audio: {
15
+ deviceId: config.deviceId,
16
+ echoCancellation: config.echoCancellation ?? true,
17
+ noiseSuppression: config.noiseSuppression ?? true,
18
+ autoGainControl: config.autoGainControl ?? true,
19
+ channelCount: config.channelCount ?? 1,
20
+ sampleRate: { ideal: TARGET_SAMPLE_RATE },
21
+ },
22
+ });
23
+ // Get the actual sample rate from the stream — the ideal may not have been honored
24
+ const [audioTrack] = stream.getAudioTracks();
25
+ const streamSampleRate = audioTrack?.getSettings().sampleRate;
26
+ // Create audio context matching the stream's sample rate to avoid Firefox errors.
27
+ // Firefox requires the AudioContext to match the microphone's native sample rate.
28
+ const audioContext = new AudioContext(streamSampleRate ? { sampleRate: streamSampleRate } : {});
29
+ // Load scribe worklet
30
+ await loadScribeAudioProcessor(audioContext.audioWorklet);
31
+ // Set up audio pipeline
32
+ const source = audioContext.createMediaStreamSource(stream);
33
+ const scribeNode = new AudioWorkletNode(audioContext, "scribeAudioProcessor");
34
+ // Configure the worklet with sample rate info for resampling
35
+ // (only needed when AudioContext sample rate differs from target)
36
+ if (audioContext.sampleRate !== TARGET_SAMPLE_RATE) {
37
+ scribeNode.port.postMessage({
38
+ type: "configure",
39
+ inputSampleRate: audioContext.sampleRate,
40
+ outputSampleRate: TARGET_SAMPLE_RATE,
41
+ });
42
+ }
43
+ // Handle audio data from worklet
44
+ scribeNode.port.onmessage = event => {
45
+ onAudioData(arrayBufferToBase64(event.data.audioData));
46
+ };
47
+ // Connect audio pipeline
48
+ source.connect(scribeNode);
49
+ // Resume audio context if needed
50
+ if (audioContext.state === "suspended") {
51
+ await audioContext.resume();
52
+ }
53
+ return {
54
+ mediaStreamTrack: audioTrack,
55
+ cleanup: () => {
56
+ for (const track of stream.getTracks()) {
57
+ track.stop();
58
+ }
59
+ source.disconnect();
60
+ scribeNode.disconnect();
61
+ void audioContext.close();
62
+ },
63
+ };
64
+ };
65
+ //# sourceMappingURL=scribeMicrophone.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scribeMicrophone.js","sourceRoot":"","sources":["../../../src/platform/web/scribeMicrophone.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,wBAAwB,EAAE,MAAM,qCAAqC,CAAC;AAE/E,MAAM,kBAAkB,GAAG,KAAK,CAAC;AAEjC;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAA0B,KAAK,EAClE,MAA8B,EAC9B,WAA0C,EACT,EAAE;IACnC,wBAAwB;IACxB,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,YAAY,CAAC,YAAY,CAAC;QACvD,KAAK,EAAE;YACL,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,gBAAgB,EAAE,MAAM,CAAC,gBAAgB,IAAI,IAAI;YACjD,gBAAgB,EAAE,MAAM,CAAC,gBAAgB,IAAI,IAAI;YACjD,eAAe,EAAE,MAAM,CAAC,eAAe,IAAI,IAAI;YAC/C,YAAY,EAAE,MAAM,CAAC,YAAY,IAAI,CAAC;YACtC,UAAU,EAAE,EAAE,KAAK,EAAE,kBAAkB,EAAE;SAC1C;KACF,CAAC,CAAC;IAEH,mFAAmF;IACnF,MAAM,CAAC,UAAU,CAAC,GAAG,MAAM,CAAC,cAAc,EAAE,CAAC;IAC7C,MAAM,gBAAgB,GAAG,UAAU,EAAE,WAAW,EAAE,CAAC,UAAU,CAAC;IAE9D,kFAAkF;IAClF,kFAAkF;IAClF,MAAM,YAAY,GAAG,IAAI,YAAY,CACnC,gBAAgB,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CACzD,CAAC;IAEF,sBAAsB;IACtB,MAAM,wBAAwB,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;IAE1D,wBAAwB;IACxB,MAAM,MAAM,GAAG,YAAY,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC;IAC5D,MAAM,UAAU,GAAG,IAAI,gBAAgB,CAAC,YAAY,EAAE,sBAAsB,CAAC,CAAC;IAE9E,6DAA6D;IAC7D,kEAAkE;IAClE,IAAI,YAAY,CAAC,UAAU,KAAK,kBAAkB,EAAE,CAAC;QACnD,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC;YAC1B,IAAI,EAAE,WAAW;YACjB,eAAe,EAAE,YAAY,CAAC,UAAU;YACxC,gBAAgB,EAAE,kBAAkB;SACrC,CAAC,CAAC;IACL,CAAC;IAED,iCAAiC;IACjC,UAAU,CAAC,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,EAAE;QAClC,WAAW,CAAC,mBAAmB,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;IACzD,CAAC,CAAC;IAEF,yBAAyB;IACzB,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAE3B,iCAAiC;IACjC,IAAI,YAAY,CAAC,KAAK,KAAK,WAAW,EAAE,CAAC;QACvC,MAAM,YAAY,CAAC,MAAM,EAAE,CAAC;IAC9B,CAAC;IAED,OAAO;QACL,gBAAgB,EAAE,UAAU;QAC5B,OAAO,EAAE,GAAG,EAAE;YACZ,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,SAAS,EAAE,EAAE,CAAC;gBACvC,KAAK,CAAC,IAAI,EAAE,CAAC;YACf,CAAC;YACD,MAAM,CAAC,UAAU,EAAE,CAAC;YACpB,UAAU,CAAC,UAAU,EAAE,CAAC;YACxB,KAAK,YAAY,CAAC,KAAK,EAAE,CAAC;QAC5B,CAAC;KACF,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { type VolumeProvider } from "../../utils/volumeProvider.js";
2
+ export { type VolumeProvider } from "../../utils/volumeProvider.js";
3
+ export declare function createAnalyserVolumeProvider(analyser: AnalyserNode, sampleRate: number): VolumeProvider;
4
+ //# sourceMappingURL=volumeProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"volumeProvider.d.ts","sourceRoot":"","sources":["../../../src/platform/web/volumeProvider.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,cAAc,EAEpB,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAEpE,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,YAAY,EACtB,UAAU,EAAE,MAAM,GACjB,cAAc,CAqBhB"}
@@ -0,0 +1,24 @@
1
+ import { calculateVolume } from "../../utils/calculateVolume.js";
2
+ import { resampleVoiceRange, } from "../../utils/volumeProvider.js";
3
+ export function createAnalyserVolumeProvider(analyser, sampleRate) {
4
+ const binCount = analyser.frequencyBinCount;
5
+ let rawData;
6
+ // Resampled buffer used by getVolume() so the scalar is computed from the
7
+ // voice-frequency range only, matching RN's RMS processor behaviour.
8
+ let voiceData;
9
+ return {
10
+ getVolume() {
11
+ rawData ??= new Uint8Array(binCount);
12
+ voiceData ??= new Uint8Array(binCount);
13
+ analyser.getByteFrequencyData(rawData);
14
+ resampleVoiceRange(rawData, voiceData, sampleRate);
15
+ return calculateVolume(voiceData);
16
+ },
17
+ getByteFrequencyData(buffer) {
18
+ rawData ??= new Uint8Array(binCount);
19
+ analyser.getByteFrequencyData(rawData);
20
+ resampleVoiceRange(rawData, buffer, sampleRate);
21
+ },
22
+ };
23
+ }
24
+ //# sourceMappingURL=volumeProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"volumeProvider.js","sourceRoot":"","sources":["../../../src/platform/web/volumeProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAEL,kBAAkB,GACnB,MAAM,+BAA+B,CAAC;AAIvC,MAAM,UAAU,4BAA4B,CAC1C,QAAsB,EACtB,UAAkB;IAElB,MAAM,QAAQ,GAAG,QAAQ,CAAC,iBAAiB,CAAC;IAC5C,IAAI,OAA4C,CAAC;IACjD,0EAA0E;IAC1E,qEAAqE;IACrE,IAAI,SAA8C,CAAC;IAEnD,OAAO;QACL,SAAS;YACP,OAAO,KAAK,IAAI,UAAU,CAAC,QAAQ,CAA4B,CAAC;YAChE,SAAS,KAAK,IAAI,UAAU,CAAC,QAAQ,CAA4B,CAAC;YAClE,QAAQ,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;YACvC,kBAAkB,CAAC,OAAO,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;YACnD,OAAO,eAAe,CAAC,SAAS,CAAC,CAAC;QACpC,CAAC;QACD,oBAAoB,CAAC,MAA+B;YAClD,OAAO,KAAK,IAAI,UAAU,CAAC,QAAQ,CAA4B,CAAC;YAChE,QAAQ,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;YACvC,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;QAClD,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,23 @@
1
+ import type { RemoteAudioTrack } from "livekit-client";
2
+ import type { FormatConfig } from "../../utils/BaseConnection.js";
3
+ import type { WebRTCAudioAdapter, AnalysisResult } from "../../WebRTCAudioAdapter.js";
4
+ /**
5
+ * Web implementation of {@link WebRTCAudioAdapter}.
6
+ *
7
+ * Uses AudioContext, HTMLAudioElement, and AudioWorkletNode to:
8
+ * - Attach remote audio tracks for playback via the DOM
9
+ * - Analyse input/output volume via AnalyserNode
10
+ * - Capture raw output audio via an AudioWorklet for the `onAudio` callback
11
+ */
12
+ export declare class WebAudioAdapter implements WebRTCAudioAdapter {
13
+ private audioElements;
14
+ private inputAudioContext;
15
+ private audioCaptureContext;
16
+ attachRemoteTrack(track: RemoteAudioTrack, outputDeviceId: string | null): Promise<void>;
17
+ setupInputAnalysis(mediaStreamTrack: MediaStreamTrack): AnalysisResult;
18
+ setupOutputAnalysis(track: RemoteAudioTrack, format: FormatConfig, onAudioData: (audioData: ArrayBuffer, maxVolume: number) => void): Promise<AnalysisResult>;
19
+ setVolume(volume: number): void;
20
+ setOutputDevice(deviceId: string): Promise<void>;
21
+ cleanup(): void;
22
+ }
23
+ //# sourceMappingURL=webAudioAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webAudioAdapter.d.ts","sourceRoot":"","sources":["../../../src/platform/web/webAudioAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,KAAK,EACV,kBAAkB,EAClB,cAAc,EACf,MAAM,6BAA6B,CAAC;AAIrC;;;;;;;GAOG;AACH,qBAAa,eAAgB,YAAW,kBAAkB;IACxD,OAAO,CAAC,aAAa,CAA0B;IAE/C,OAAO,CAAC,iBAAiB,CAA6B;IACtD,OAAO,CAAC,mBAAmB,CAA6B;IAElD,iBAAiB,CACrB,KAAK,EAAE,gBAAgB,EACvB,cAAc,EAAE,MAAM,GAAG,IAAI,GAC5B,OAAO,CAAC,IAAI,CAAC;IAyBhB,kBAAkB,CAAC,gBAAgB,EAAE,gBAAgB,GAAG,cAAc;IAsBhE,mBAAmB,CACvB,KAAK,EAAE,gBAAgB,EACvB,MAAM,EAAE,YAAY,EACpB,WAAW,EAAE,CAAC,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,GAC/D,OAAO,CAAC,cAAc,CAAC;IAgD1B,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAMzB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBtD,OAAO,IAAI,IAAI;CAuBhB"}
@@ -0,0 +1,127 @@
1
+ import { loadRawAudioProcessor } from "./rawAudioProcessor.generated.js";
2
+ import { createAnalyserVolumeProvider } from "./volumeProvider.js";
3
+ /**
4
+ * Web implementation of {@link WebRTCAudioAdapter}.
5
+ *
6
+ * Uses AudioContext, HTMLAudioElement, and AudioWorkletNode to:
7
+ * - Attach remote audio tracks for playback via the DOM
8
+ * - Analyse input/output volume via AnalyserNode
9
+ * - Capture raw output audio via an AudioWorklet for the `onAudio` callback
10
+ */
11
+ export class WebAudioAdapter {
12
+ audioElements = [];
13
+ inputAudioContext = null;
14
+ audioCaptureContext = null;
15
+ async attachRemoteTrack(track, outputDeviceId) {
16
+ const audioElement = track.attach();
17
+ audioElement.autoplay = true;
18
+ audioElement.controls = false;
19
+ // Set output device if one was previously selected
20
+ if (outputDeviceId && audioElement.setSinkId) {
21
+ try {
22
+ await audioElement.setSinkId(outputDeviceId);
23
+ }
24
+ catch (error) {
25
+ console.warn("Failed to set output device for new audio element:", error);
26
+ }
27
+ }
28
+ // Add to DOM (hidden) to ensure it plays
29
+ audioElement.style.display = "none";
30
+ document.body.appendChild(audioElement);
31
+ // Store reference for volume control and cleanup
32
+ this.audioElements.push(audioElement);
33
+ }
34
+ setupInputAnalysis(mediaStreamTrack) {
35
+ // Clean up previous input audio context
36
+ if (this.inputAudioContext) {
37
+ this.inputAudioContext.close().catch(() => { });
38
+ this.inputAudioContext = null;
39
+ }
40
+ const ctx = new AudioContext();
41
+ const analyser = ctx.createAnalyser();
42
+ const source = ctx.createMediaStreamSource(new MediaStream([mediaStreamTrack]));
43
+ source.connect(analyser);
44
+ this.inputAudioContext = ctx;
45
+ return {
46
+ volumeProvider: createAnalyserVolumeProvider(analyser, ctx.sampleRate),
47
+ analyser,
48
+ };
49
+ }
50
+ async setupOutputAnalysis(track, format, onAudioData) {
51
+ // Clean up previous audio capture context
52
+ if (this.audioCaptureContext) {
53
+ this.audioCaptureContext.close().catch(() => { });
54
+ this.audioCaptureContext = null;
55
+ }
56
+ // Create audio context for processing
57
+ const audioContext = new AudioContext();
58
+ this.audioCaptureContext = audioContext;
59
+ // Create analyser for frequency data
60
+ const analyser = audioContext.createAnalyser();
61
+ analyser.fftSize = 2048;
62
+ analyser.smoothingTimeConstant = 0.8;
63
+ // Create MediaStream from the track
64
+ const mediaStream = new MediaStream([track.mediaStreamTrack]);
65
+ // Create audio source from the stream
66
+ const source = audioContext.createMediaStreamSource(mediaStream);
67
+ const volumeProvider = createAnalyserVolumeProvider(analyser, audioContext.sampleRate);
68
+ await loadRawAudioProcessor(audioContext.audioWorklet);
69
+ const worklet = new AudioWorkletNode(audioContext, "rawAudioProcessor");
70
+ // Configure the processor and set up the message listener
71
+ // before connecting the graph, so no early messages are missed.
72
+ worklet.port.postMessage({
73
+ type: "setFormat",
74
+ format: format.format,
75
+ sampleRate: format.sampleRate,
76
+ });
77
+ worklet.port.onmessage = (event) => {
78
+ const [audioData, maxVolume] = event.data;
79
+ onAudioData(audioData.buffer, maxVolume);
80
+ };
81
+ // Connect the audio graph: source → analyser → worklet
82
+ source.connect(analyser);
83
+ analyser.connect(worklet);
84
+ return { volumeProvider, analyser };
85
+ }
86
+ setVolume(volume) {
87
+ for (const element of this.audioElements) {
88
+ element.volume = volume;
89
+ }
90
+ }
91
+ async setOutputDevice(deviceId) {
92
+ if (!("setSinkId" in HTMLAudioElement.prototype)) {
93
+ throw new Error("setSinkId is not supported in this browser");
94
+ }
95
+ await Promise.all(this.audioElements.map(async (element) => {
96
+ try {
97
+ await element.setSinkId(deviceId);
98
+ }
99
+ catch (error) {
100
+ console.error("Failed to set sink ID for audio element:", error);
101
+ throw error;
102
+ }
103
+ }));
104
+ }
105
+ cleanup() {
106
+ // Clean up input audio context
107
+ if (this.inputAudioContext) {
108
+ this.inputAudioContext.close().catch(error => {
109
+ console.warn("Error closing input audio context:", error);
110
+ });
111
+ this.inputAudioContext = null;
112
+ }
113
+ // Clean up audio capture context
114
+ if (this.audioCaptureContext) {
115
+ this.audioCaptureContext.close().catch(error => {
116
+ console.warn("Error closing audio capture context:", error);
117
+ });
118
+ this.audioCaptureContext = null;
119
+ }
120
+ // Clean up audio elements
121
+ for (const element of this.audioElements) {
122
+ element.remove();
123
+ }
124
+ this.audioElements = [];
125
+ }
126
+ }
127
+ //# sourceMappingURL=webAudioAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webAudioAdapter.js","sourceRoot":"","sources":["../../../src/platform/web/webAudioAdapter.ts"],"names":[],"mappings":"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"}