@convai/web-sdk 0.3.1-beta.3 → 0.3.2-beta.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 (263) hide show
  1. package/README.md +535 -1077
  2. package/dist/core/AudioManager.d.ts.map +1 -0
  3. package/dist/core/AudioManager.js +262 -0
  4. package/dist/core/AudioManager.js.map +1 -0
  5. package/dist/core/BlendshapeQueue.d.ts +112 -0
  6. package/dist/core/BlendshapeQueue.d.ts.map +1 -0
  7. package/dist/core/BlendshapeQueue.js +172 -0
  8. package/dist/core/BlendshapeQueue.js.map +1 -0
  9. package/dist/{types/core → core}/ConvaiClient.d.ts +5 -15
  10. package/dist/core/ConvaiClient.d.ts.map +1 -0
  11. package/dist/core/ConvaiClient.js +602 -0
  12. package/dist/core/ConvaiClient.js.map +1 -0
  13. package/dist/core/EventEmitter.d.ts.map +1 -0
  14. package/dist/core/EventEmitter.js +68 -0
  15. package/dist/core/EventEmitter.js.map +1 -0
  16. package/dist/{types/core → core}/MessageHandler.d.ts +7 -0
  17. package/dist/core/MessageHandler.d.ts.map +1 -0
  18. package/dist/core/MessageHandler.js +332 -0
  19. package/dist/core/MessageHandler.js.map +1 -0
  20. package/dist/core/ScreenShareManager.d.ts.map +1 -0
  21. package/dist/core/ScreenShareManager.js +207 -0
  22. package/dist/core/ScreenShareManager.js.map +1 -0
  23. package/dist/core/VideoManager.d.ts.map +1 -0
  24. package/dist/core/VideoManager.js +205 -0
  25. package/dist/core/VideoManager.js.map +1 -0
  26. package/dist/{types/core → core}/index.d.ts +1 -0
  27. package/dist/core/index.d.ts.map +1 -0
  28. package/dist/core/index.js +14 -1970
  29. package/dist/core/index.js.map +1 -0
  30. package/dist/{types/core → core}/types.d.ts +9 -23
  31. package/dist/core/types.d.ts.map +1 -0
  32. package/dist/core/types.js +2 -0
  33. package/dist/core/types.js.map +1 -0
  34. package/dist/dev.d.ts +12 -0
  35. package/dist/dev.d.ts.map +1 -0
  36. package/dist/dev.js +12 -0
  37. package/dist/dev.js.map +1 -0
  38. package/dist/index.d.ts +4 -0
  39. package/dist/index.d.ts.map +1 -0
  40. package/dist/index.js +6 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/lipsync-helpers/arkitOrder61.d.ts.map +1 -0
  43. package/dist/lipsync-helpers/arkitOrder61.js +287 -0
  44. package/dist/lipsync-helpers/arkitOrder61.js.map +1 -0
  45. package/dist/lipsync-helpers/createBlendshapeQueue.d.ts +86 -0
  46. package/dist/lipsync-helpers/createBlendshapeQueue.d.ts.map +1 -0
  47. package/dist/lipsync-helpers/createBlendshapeQueue.js +126 -0
  48. package/dist/lipsync-helpers/createBlendshapeQueue.js.map +1 -0
  49. package/dist/lipsync-helpers/declarativeMapping.d.ts +93 -0
  50. package/dist/lipsync-helpers/declarativeMapping.d.ts.map +1 -0
  51. package/dist/lipsync-helpers/declarativeMapping.js +228 -0
  52. package/dist/lipsync-helpers/declarativeMapping.js.map +1 -0
  53. package/dist/lipsync-helpers/index.d.ts +15 -0
  54. package/dist/lipsync-helpers/index.d.ts.map +1 -0
  55. package/dist/lipsync-helpers/index.js +31 -1164
  56. package/dist/lipsync-helpers/index.js.map +1 -0
  57. package/dist/lipsync-helpers/mappingTypes.d.ts +64 -0
  58. package/dist/lipsync-helpers/mappingTypes.d.ts.map +1 -0
  59. package/dist/lipsync-helpers/mappingTypes.js +28 -0
  60. package/dist/lipsync-helpers/mappingTypes.js.map +1 -0
  61. package/dist/lipsync-helpers/metahumanOrder251.d.ts +115 -0
  62. package/dist/lipsync-helpers/metahumanOrder251.d.ts.map +1 -0
  63. package/dist/lipsync-helpers/metahumanOrder251.js +432 -0
  64. package/dist/lipsync-helpers/metahumanOrder251.js.map +1 -0
  65. package/dist/lipsync-helpers/presetMappers.d.ts +24 -0
  66. package/dist/lipsync-helpers/presetMappers.d.ts.map +1 -0
  67. package/dist/lipsync-helpers/presetMappers.js +38 -0
  68. package/dist/lipsync-helpers/presetMappers.js.map +1 -0
  69. package/dist/react/components/ConvaiWidget.d.ts +68 -0
  70. package/dist/react/components/ConvaiWidget.d.ts.map +1 -0
  71. package/dist/react/components/ConvaiWidget.js +505 -0
  72. package/dist/react/components/ConvaiWidget.js.map +1 -0
  73. package/dist/react/components/index.d.ts +2 -0
  74. package/dist/react/components/index.d.ts.map +1 -0
  75. package/dist/react/components/index.js +3 -0
  76. package/dist/react/components/index.js.map +1 -0
  77. package/dist/react/components/rtc-widget/components/AudioSettingsPanel.d.ts +10 -0
  78. package/dist/react/components/rtc-widget/components/AudioSettingsPanel.d.ts.map +1 -0
  79. package/dist/react/components/rtc-widget/components/AudioSettingsPanel.js +316 -0
  80. package/dist/react/components/rtc-widget/components/AudioSettingsPanel.js.map +1 -0
  81. package/dist/react/components/rtc-widget/components/AudioVisualizer.d.ts +36 -0
  82. package/dist/react/components/rtc-widget/components/AudioVisualizer.d.ts.map +1 -0
  83. package/dist/react/components/rtc-widget/components/AudioVisualizer.js +259 -0
  84. package/dist/react/components/rtc-widget/components/AudioVisualizer.js.map +1 -0
  85. package/dist/react/components/rtc-widget/components/ConviMessage.d.ts +10 -0
  86. package/dist/react/components/rtc-widget/components/ConviMessage.d.ts.map +1 -0
  87. package/dist/react/components/rtc-widget/components/ConviMessage.js +14 -0
  88. package/dist/react/components/rtc-widget/components/ConviMessage.js.map +1 -0
  89. package/dist/react/components/rtc-widget/components/FloatingVideo.d.ts +9 -0
  90. package/dist/react/components/rtc-widget/components/FloatingVideo.d.ts.map +1 -0
  91. package/dist/react/components/rtc-widget/components/FloatingVideo.js +122 -0
  92. package/dist/react/components/rtc-widget/components/FloatingVideo.js.map +1 -0
  93. package/dist/react/components/rtc-widget/components/MarkdownRenderer.d.ts +7 -0
  94. package/dist/react/components/rtc-widget/components/MarkdownRenderer.d.ts.map +1 -0
  95. package/dist/react/components/rtc-widget/components/MarkdownRenderer.js +68 -0
  96. package/dist/react/components/rtc-widget/components/MarkdownRenderer.js.map +1 -0
  97. package/dist/react/components/rtc-widget/components/MessageBubble.d.ts +10 -0
  98. package/dist/react/components/rtc-widget/components/MessageBubble.d.ts.map +1 -0
  99. package/dist/react/components/rtc-widget/components/MessageBubble.js +23 -0
  100. package/dist/react/components/rtc-widget/components/MessageBubble.js.map +1 -0
  101. package/dist/react/components/rtc-widget/components/MessageList.d.ts +11 -0
  102. package/dist/react/components/rtc-widget/components/MessageList.d.ts.map +1 -0
  103. package/dist/react/components/rtc-widget/components/MessageList.js +89 -0
  104. package/dist/react/components/rtc-widget/components/MessageList.js.map +1 -0
  105. package/dist/react/components/rtc-widget/components/UserMessage.d.ts +9 -0
  106. package/dist/react/components/rtc-widget/components/UserMessage.d.ts.map +1 -0
  107. package/dist/react/components/rtc-widget/components/UserMessage.js +15 -0
  108. package/dist/react/components/rtc-widget/components/UserMessage.js.map +1 -0
  109. package/dist/react/components/rtc-widget/components/conviComponents/ConviButton.d.ts +6 -0
  110. package/dist/react/components/rtc-widget/components/conviComponents/ConviButton.d.ts.map +1 -0
  111. package/dist/react/components/rtc-widget/components/conviComponents/ConviButton.js +15 -0
  112. package/dist/react/components/rtc-widget/components/conviComponents/ConviButton.js.map +1 -0
  113. package/dist/react/components/rtc-widget/components/conviComponents/ConviFooter.d.ts +25 -0
  114. package/dist/react/components/rtc-widget/components/conviComponents/ConviFooter.d.ts.map +1 -0
  115. package/dist/react/components/rtc-widget/components/conviComponents/ConviFooter.js +172 -0
  116. package/dist/react/components/rtc-widget/components/conviComponents/ConviFooter.js.map +1 -0
  117. package/dist/react/components/rtc-widget/components/conviComponents/ConviHeader.d.ts +17 -0
  118. package/dist/react/components/rtc-widget/components/conviComponents/ConviHeader.d.ts.map +1 -0
  119. package/dist/react/components/rtc-widget/components/conviComponents/ConviHeader.js +66 -0
  120. package/dist/react/components/rtc-widget/components/conviComponents/ConviHeader.js.map +1 -0
  121. package/dist/react/components/rtc-widget/components/conviComponents/SettingsTray.d.ts +12 -0
  122. package/dist/react/components/rtc-widget/components/conviComponents/SettingsTray.d.ts.map +1 -0
  123. package/dist/react/components/rtc-widget/components/conviComponents/SettingsTray.js +68 -0
  124. package/dist/react/components/rtc-widget/components/conviComponents/SettingsTray.js.map +1 -0
  125. package/dist/react/components/rtc-widget/components/conviComponents/VoiceModeOverlay.d.ts +12 -0
  126. package/dist/react/components/rtc-widget/components/conviComponents/VoiceModeOverlay.d.ts.map +1 -0
  127. package/dist/react/components/rtc-widget/components/conviComponents/VoiceModeOverlay.js +255 -0
  128. package/dist/react/components/rtc-widget/components/conviComponents/VoiceModeOverlay.js.map +1 -0
  129. package/dist/react/components/rtc-widget/components/conviComponents/index.d.ts +6 -0
  130. package/dist/react/components/rtc-widget/components/conviComponents/index.d.ts.map +1 -0
  131. package/dist/react/components/rtc-widget/components/conviComponents/index.js +6 -0
  132. package/dist/react/components/rtc-widget/components/conviComponents/index.js.map +1 -0
  133. package/dist/react/components/rtc-widget/components/index.d.ts +9 -0
  134. package/dist/react/components/rtc-widget/components/index.d.ts.map +1 -0
  135. package/dist/react/components/rtc-widget/components/index.js +15 -0
  136. package/dist/react/components/rtc-widget/components/index.js.map +1 -0
  137. package/dist/react/components/rtc-widget/index.d.ts +6 -0
  138. package/dist/react/components/rtc-widget/index.d.ts.map +1 -0
  139. package/dist/react/components/rtc-widget/index.js +9 -0
  140. package/dist/react/components/rtc-widget/index.js.map +1 -0
  141. package/dist/react/components/rtc-widget/styles/framerConfig.d.ts +116 -0
  142. package/dist/react/components/rtc-widget/styles/framerConfig.d.ts.map +1 -0
  143. package/dist/react/components/rtc-widget/styles/framerConfig.js +73 -0
  144. package/dist/react/components/rtc-widget/styles/framerConfig.js.map +1 -0
  145. package/dist/react/components/rtc-widget/styles/icons.d.ts +28 -0
  146. package/dist/react/components/rtc-widget/styles/icons.d.ts.map +1 -0
  147. package/dist/react/components/rtc-widget/styles/icons.js +257 -0
  148. package/dist/react/components/rtc-widget/styles/icons.js.map +1 -0
  149. package/dist/react/components/rtc-widget/styles/index.d.ts +6 -0
  150. package/dist/react/components/rtc-widget/styles/index.d.ts.map +1 -0
  151. package/dist/react/components/rtc-widget/styles/index.js +9 -0
  152. package/dist/react/components/rtc-widget/styles/index.js.map +1 -0
  153. package/dist/react/components/rtc-widget/styles/styledComponents.d.ts +90 -0
  154. package/dist/react/components/rtc-widget/styles/styledComponents.d.ts.map +1 -0
  155. package/dist/react/components/rtc-widget/styles/styledComponents.js +663 -0
  156. package/dist/react/components/rtc-widget/styles/styledComponents.js.map +1 -0
  157. package/dist/react/components/rtc-widget/styles/theme.d.ts +188 -0
  158. package/dist/react/components/rtc-widget/styles/theme.d.ts.map +1 -0
  159. package/dist/react/components/rtc-widget/styles/theme.js +290 -0
  160. package/dist/react/components/rtc-widget/styles/theme.js.map +1 -0
  161. package/dist/react/components/rtc-widget/types/index.d.ts +60 -0
  162. package/dist/react/components/rtc-widget/types/index.d.ts.map +1 -0
  163. package/dist/react/components/rtc-widget/types/index.js +2 -0
  164. package/dist/react/components/rtc-widget/types/index.js.map +1 -0
  165. package/dist/react/hooks/index.d.ts +4 -0
  166. package/dist/react/hooks/index.d.ts.map +1 -0
  167. package/dist/react/hooks/index.js +6 -0
  168. package/dist/react/hooks/index.js.map +1 -0
  169. package/dist/react/hooks/useCharacterInfo.d.ts +17 -0
  170. package/dist/react/hooks/useCharacterInfo.d.ts.map +1 -0
  171. package/dist/react/hooks/useCharacterInfo.js +60 -0
  172. package/dist/react/hooks/useCharacterInfo.js.map +1 -0
  173. package/dist/react/hooks/useConvaiClient.d.ts +35 -0
  174. package/dist/react/hooks/useConvaiClient.d.ts.map +1 -0
  175. package/dist/react/hooks/useConvaiClient.js +179 -0
  176. package/dist/react/hooks/useConvaiClient.js.map +1 -0
  177. package/dist/react/hooks/useLocalCameraTrack.d.ts +22 -0
  178. package/dist/react/hooks/useLocalCameraTrack.d.ts.map +1 -0
  179. package/dist/react/hooks/useLocalCameraTrack.js +34 -0
  180. package/dist/react/hooks/useLocalCameraTrack.js.map +1 -0
  181. package/dist/react/index.d.ts +7 -0
  182. package/dist/react/index.d.ts.map +1 -0
  183. package/dist/react/index.js +13 -0
  184. package/dist/react/index.js.map +1 -0
  185. package/dist/types/index.d.ts.map +1 -0
  186. package/dist/types/index.js +2 -0
  187. package/dist/types/index.js.map +1 -0
  188. package/dist/utils/LatencyMonitor.d.ts.map +1 -0
  189. package/dist/utils/LatencyMonitor.js +136 -0
  190. package/dist/utils/LatencyMonitor.js.map +1 -0
  191. package/dist/utils/logger.d.ts.map +1 -0
  192. package/dist/utils/logger.js +96 -0
  193. package/dist/utils/logger.js.map +1 -0
  194. package/dist/utils/speakerManagement.d.ts.map +1 -0
  195. package/dist/utils/speakerManagement.js +64 -0
  196. package/dist/utils/speakerManagement.js.map +1 -0
  197. package/dist/{types/vanilla → vanilla}/AudioRenderer.d.ts +5 -0
  198. package/dist/vanilla/AudioRenderer.d.ts.map +1 -0
  199. package/dist/vanilla/AudioRenderer.js +135 -0
  200. package/dist/vanilla/AudioRenderer.js.map +1 -0
  201. package/dist/{types/vanilla → vanilla}/ConvaiWidget.d.ts +13 -6
  202. package/dist/vanilla/ConvaiWidget.d.ts.map +1 -0
  203. package/dist/vanilla/ConvaiWidget.js +1823 -0
  204. package/dist/vanilla/ConvaiWidget.js.map +1 -0
  205. package/dist/vanilla/icons.d.ts.map +1 -0
  206. package/dist/vanilla/icons.js +222 -0
  207. package/dist/vanilla/icons.js.map +1 -0
  208. package/dist/{types/vanilla → vanilla}/index.d.ts +1 -3
  209. package/dist/vanilla/index.d.ts.map +1 -0
  210. package/dist/vanilla/index.js +20 -5509
  211. package/dist/vanilla/index.js.map +1 -0
  212. package/dist/vanilla/styles.d.ts.map +1 -0
  213. package/dist/vanilla/styles.js +287 -0
  214. package/dist/vanilla/styles.js.map +1 -0
  215. package/dist/vanilla/types.d.ts +63 -0
  216. package/dist/vanilla/types.d.ts.map +1 -0
  217. package/dist/vanilla/types.js +2 -0
  218. package/dist/vanilla/types.js.map +1 -0
  219. package/package.json +33 -38
  220. package/CHANGELOG.md +0 -165
  221. package/dist/core/index.cjs +0 -1977
  222. package/dist/lipsync-helpers/index.cjs +0 -1195
  223. package/dist/types/core/AudioManager.d.ts.map +0 -1
  224. package/dist/types/core/ConvaiClient.d.ts.map +0 -1
  225. package/dist/types/core/EventEmitter.d.ts.map +0 -1
  226. package/dist/types/core/MessageHandler.d.ts.map +0 -1
  227. package/dist/types/core/ScreenShareManager.d.ts.map +0 -1
  228. package/dist/types/core/VideoManager.d.ts.map +0 -1
  229. package/dist/types/core/index.d.ts.map +0 -1
  230. package/dist/types/core/types.d.ts.map +0 -1
  231. package/dist/types/lipsync-helpers/arkitBlendshapeHelpers.d.ts +0 -80
  232. package/dist/types/lipsync-helpers/arkitBlendshapeHelpers.d.ts.map +0 -1
  233. package/dist/types/lipsync-helpers/arkitOrder61.d.ts.map +0 -1
  234. package/dist/types/lipsync-helpers/arkitPhonemeReference.d.ts +0 -155
  235. package/dist/types/lipsync-helpers/arkitPhonemeReference.d.ts.map +0 -1
  236. package/dist/types/lipsync-helpers/index.d.ts +0 -9
  237. package/dist/types/lipsync-helpers/index.d.ts.map +0 -1
  238. package/dist/types/lipsync-helpers/neurosyncBlendshapeMapper.d.ts +0 -30
  239. package/dist/types/lipsync-helpers/neurosyncBlendshapeMapper.d.ts.map +0 -1
  240. package/dist/types/types/index.d.ts.map +0 -1
  241. package/dist/types/utils/LatencyMonitor.d.ts.map +0 -1
  242. package/dist/types/utils/logger.d.ts.map +0 -1
  243. package/dist/types/utils/speakerManagement.d.ts.map +0 -1
  244. package/dist/types/vanilla/AudioRenderer.d.ts.map +0 -1
  245. package/dist/types/vanilla/ConvaiWidget.d.ts.map +0 -1
  246. package/dist/types/vanilla/icons.d.ts.map +0 -1
  247. package/dist/types/vanilla/index.d.ts.map +0 -1
  248. package/dist/types/vanilla/styles.d.ts.map +0 -1
  249. package/dist/types/vanilla/types.d.ts +0 -106
  250. package/dist/types/vanilla/types.d.ts.map +0 -1
  251. package/dist/umd/convai.umd.js +0 -1
  252. package/dist/vanilla/index.cjs +0 -5559
  253. /package/dist/{types/core → core}/AudioManager.d.ts +0 -0
  254. /package/dist/{types/core → core}/EventEmitter.d.ts +0 -0
  255. /package/dist/{types/core → core}/ScreenShareManager.d.ts +0 -0
  256. /package/dist/{types/core → core}/VideoManager.d.ts +0 -0
  257. /package/dist/{types/lipsync-helpers → lipsync-helpers}/arkitOrder61.d.ts +0 -0
  258. /package/dist/types/{types/index.d.ts → index.d.ts} +0 -0
  259. /package/dist/{types/utils → utils}/LatencyMonitor.d.ts +0 -0
  260. /package/dist/{types/utils → utils}/logger.d.ts +0 -0
  261. /package/dist/{types/utils → utils}/speakerManagement.d.ts +0 -0
  262. /package/dist/{types/vanilla → vanilla}/icons.d.ts +0 -0
  263. /package/dist/{types/vanilla → vanilla}/styles.d.ts +0 -0
@@ -0,0 +1,68 @@
1
+ export class EventEmitter {
2
+ constructor() {
3
+ this.events = new Map();
4
+ }
5
+ /**
6
+ * Subscribe to an event
7
+ * @param event Event name
8
+ * @param callback Callback function
9
+ * @returns Unsubscribe function
10
+ */
11
+ on(event, callback) {
12
+ if (!this.events.has(event)) {
13
+ this.events.set(event, new Set());
14
+ }
15
+ this.events.get(event).add(callback);
16
+ // Return unsubscribe function
17
+ return () => {
18
+ this.off(event, callback);
19
+ };
20
+ }
21
+ /**
22
+ * Unsubscribe from an event
23
+ * @param event Event name
24
+ * @param callback Callback function to remove
25
+ */
26
+ off(event, callback) {
27
+ const callbacks = this.events.get(event);
28
+ if (callbacks) {
29
+ callbacks.delete(callback);
30
+ if (callbacks.size === 0) {
31
+ this.events.delete(event);
32
+ }
33
+ }
34
+ }
35
+ /**
36
+ * Emit an event to all subscribers
37
+ * @param event Event name
38
+ * @param args Arguments to pass to callbacks
39
+ */
40
+ emit(event, ...args) {
41
+ const callbacks = this.events.get(event);
42
+ if (callbacks) {
43
+ callbacks.forEach((callback) => {
44
+ try {
45
+ callback(...args);
46
+ }
47
+ catch (error) {
48
+ console.error(`Error in event handler for "${event}":`, error);
49
+ }
50
+ });
51
+ }
52
+ }
53
+ /**
54
+ * Remove all event listeners
55
+ */
56
+ removeAllListeners() {
57
+ this.events.clear();
58
+ }
59
+ /**
60
+ * Get the number of listeners for an event
61
+ * @param event Event name
62
+ * @returns Number of listeners
63
+ */
64
+ listenerCount(event) {
65
+ return this.events.get(event)?.size ?? 0;
66
+ }
67
+ }
68
+ //# sourceMappingURL=EventEmitter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EventEmitter.js","sourceRoot":"","sources":["../../src/core/EventEmitter.ts"],"names":[],"mappings":"AAMA,MAAM,OAAO,YAAY;IAAzB;QACU,WAAM,GAAoC,IAAI,GAAG,EAAE,CAAC;IAqE9D,CAAC;IAnEC;;;;;OAKG;IACH,EAAE,CAAC,KAAa,EAAE,QAAuB;QACvC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;QACpC,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAEtC,8BAA8B;QAC9B,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAC5B,CAAC,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACH,GAAG,CAAC,KAAa,EAAE,QAAuB;QACxC,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACzC,IAAI,SAAS,EAAE,CAAC;YACd,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC3B,IAAI,SAAS,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;gBACzB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,IAAI,CAAC,KAAa,EAAE,GAAG,IAAW;QAChC,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACzC,IAAI,SAAS,EAAE,CAAC;YACd,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;gBAC7B,IAAI,CAAC;oBACH,QAAQ,CAAC,GAAG,IAAI,CAAC,CAAC;gBACpB,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,OAAO,CAAC,KAAK,CAAC,+BAA+B,KAAK,IAAI,EAAE,KAAK,CAAC,CAAC;gBACjE,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED;;OAEG;IACH,kBAAkB;QAChB,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IACtB,CAAC;IAED;;;;OAIG;IACH,aAAa,CAAC,KAAa;QACzB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,IAAI,IAAI,CAAC,CAAC;IAC3C,CAAC;CACF"}
@@ -2,6 +2,7 @@ import { Room } from "livekit-client";
2
2
  import { ChatMessage } from "./types";
3
3
  import { EventEmitter } from "./EventEmitter";
4
4
  import { LatencyMonitor } from "../utils/LatencyMonitor";
5
+ import { BlendshapeQueue } from "./BlendshapeQueue";
5
6
  /**
6
7
  * Handles incoming messages from Convai
7
8
  * Processes various message types from the AI assistant and updates chat history
@@ -13,7 +14,13 @@ export declare class MessageHandler extends EventEmitter {
13
14
  private isBotResponding;
14
15
  private isSpeaking;
15
16
  private latencyMonitor;
17
+ private totalBlendshapesReceived;
18
+ private blendshapeQueue;
16
19
  constructor(room?: Room, latencyMonitor?: LatencyMonitor);
20
+ /**
21
+ * Get the blendshape queue instance
22
+ */
23
+ getBlendshapeQueue(): BlendshapeQueue;
17
24
  /**
18
25
  * Set the latency monitor
19
26
  */
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MessageHandler.d.ts","sourceRoot":"","sources":["../../src/core/MessageHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAa,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAEtC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD;;;GAGG;AACH,qBAAa,cAAe,SAAQ,YAAY;IAC9C,OAAO,CAAC,IAAI,CAAqB;IACjC,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,iBAAiB,CAAc;IACvC,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,UAAU,CAAkB;IACpC,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,wBAAwB,CAAa;IAC7C,OAAO,CAAC,eAAe,CAAkB;gBAE7B,IAAI,CAAC,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,cAAc;IAWxD;;OAEG;IACH,kBAAkB,IAAI,eAAe;IAIrC;;OAEG;IACH,iBAAiB,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;IAIhD;;OAEG;IACH,eAAe,IAAI,WAAW,EAAE;IAIhC;;OAEG;IACH,oBAAoB,IAAI,MAAM;IAI9B;;OAEG;IACH,kBAAkB,IAAI,OAAO;IAI7B;;OAEG;IACH,aAAa,IAAI,OAAO;IAIxB;;OAEG;IACH,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;IAUzB;;OAEG;IACH,OAAO,CAAC,cAAc;IAMtB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAMxB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAiQ1B;;OAEG;IACH,KAAK,IAAI,IAAI;CAYd"}
@@ -0,0 +1,332 @@
1
+ import { RoomEvent } from "livekit-client";
2
+ import { EventEmitter } from "./EventEmitter";
3
+ import { BlendshapeQueue } from "./BlendshapeQueue";
4
+ /**
5
+ * Handles incoming messages from Convai
6
+ * Processes various message types from the AI assistant and updates chat history
7
+ */
8
+ export class MessageHandler extends EventEmitter {
9
+ constructor(room, latencyMonitor) {
10
+ super();
11
+ this.room = null;
12
+ this.chatMessages = [];
13
+ this.userTranscription = "";
14
+ this.isBotResponding = false;
15
+ this.isSpeaking = false;
16
+ this.latencyMonitor = null;
17
+ this.totalBlendshapesReceived = 0;
18
+ this.blendshapeQueue = new BlendshapeQueue();
19
+ if (latencyMonitor) {
20
+ this.latencyMonitor = latencyMonitor;
21
+ }
22
+ if (room) {
23
+ this.setRoom(room);
24
+ }
25
+ }
26
+ /**
27
+ * Get the blendshape queue instance
28
+ */
29
+ getBlendshapeQueue() {
30
+ return this.blendshapeQueue;
31
+ }
32
+ /**
33
+ * Set the latency monitor
34
+ */
35
+ setLatencyMonitor(monitor) {
36
+ this.latencyMonitor = monitor;
37
+ }
38
+ /**
39
+ * Get current chat messages
40
+ */
41
+ getChatMessages() {
42
+ return this.chatMessages;
43
+ }
44
+ /**
45
+ * Get current user transcription
46
+ */
47
+ getUserTranscription() {
48
+ return this.userTranscription;
49
+ }
50
+ /**
51
+ * Get bot responding state
52
+ */
53
+ getIsBotResponding() {
54
+ return this.isBotResponding;
55
+ }
56
+ /**
57
+ * Get speaking state
58
+ */
59
+ getIsSpeaking() {
60
+ return this.isSpeaking;
61
+ }
62
+ /**
63
+ * Set the LiveKit room instance
64
+ */
65
+ setRoom(room) {
66
+ // Clean up previous room listeners
67
+ if (this.room) {
68
+ this.cleanupListeners();
69
+ }
70
+ this.room = room;
71
+ this.setupListeners();
72
+ }
73
+ /**
74
+ * Setup message listeners
75
+ */
76
+ setupListeners() {
77
+ if (!this.room)
78
+ return;
79
+ this.room.on(RoomEvent.DataReceived, this.handleDataReceived.bind(this));
80
+ }
81
+ /**
82
+ * Clean up message listeners
83
+ */
84
+ cleanupListeners() {
85
+ if (!this.room)
86
+ return;
87
+ this.room.off(RoomEvent.DataReceived, this.handleDataReceived.bind(this));
88
+ }
89
+ /**
90
+ * Handle incoming data message
91
+ */
92
+ handleDataReceived(payload, participant) {
93
+ try {
94
+ // Decode bytes to string
95
+ const decoder = new TextDecoder();
96
+ const messageString = decoder.decode(payload);
97
+ // Parse JSON
98
+ const messageData = JSON.parse(messageString);
99
+ // Extract and categorize messages for chat display
100
+ const timestamp = new Date().toISOString();
101
+ const messageId = `${messageData.type}-${Date.now()}-${Math.random()}`;
102
+ // Handle different message types
103
+ switch (messageData.type) {
104
+ // User text messages - Skip these, only allow user-transcription
105
+ case "user_text_message":
106
+ case "user-llm-text":
107
+ case "text-input":
108
+ case "user-input":
109
+ case "text-message":
110
+ case "chat-message":
111
+ case "input-text":
112
+ case "message":
113
+ // Skip user text messages - only allow user-transcription
114
+ break;
115
+ // Bot Ready - Bot is ready, connection should be true
116
+ case "bot-ready":
117
+ this.emit("botReady");
118
+ break;
119
+ // Bot LLM Started - Begin streaming response
120
+ case "bot-llm-started":
121
+ this.isBotResponding = true;
122
+ this.emit("botRespondingChange", true);
123
+ // Mark any accumulated user message as final before starting bot response
124
+ const lastMsg = this.chatMessages[this.chatMessages.length - 1];
125
+ if (lastMsg &&
126
+ lastMsg.type === "user-transcription" &&
127
+ lastMsg.isFinal) {
128
+ this.chatMessages[this.chatMessages.length - 1] = {
129
+ ...lastMsg,
130
+ isFinal: false,
131
+ };
132
+ }
133
+ // Add initial streaming message to chat
134
+ const streamingMessage = {
135
+ id: messageId,
136
+ type: "bot-llm-text",
137
+ content: "",
138
+ timestamp: timestamp,
139
+ isFinal: true,
140
+ };
141
+ this.chatMessages.push(streamingMessage);
142
+ this.emit("messagesChange", this.chatMessages);
143
+ break;
144
+ // Bot LLM Text Messages - Streaming chunks
145
+ case "bot-llm-text":
146
+ if (messageData.data?.text) {
147
+ const newChunk = messageData.data.text;
148
+ // Update the streaming message in chat
149
+ const lastMessage = this.chatMessages[this.chatMessages.length - 1];
150
+ if (lastMessage && lastMessage.isFinal) {
151
+ this.chatMessages[this.chatMessages.length - 1] = {
152
+ ...lastMessage,
153
+ content: lastMessage.content + newChunk,
154
+ };
155
+ }
156
+ else {
157
+ // If no streaming message exists yet, create one
158
+ const streamingMsg = {
159
+ id: `${messageData.type}-${Date.now()}-${Math.random()}`,
160
+ type: "bot-llm-text",
161
+ content: newChunk,
162
+ timestamp: new Date().toISOString(),
163
+ isFinal: true,
164
+ };
165
+ this.chatMessages.push(streamingMsg);
166
+ }
167
+ this.emit("messagesChange", this.chatMessages);
168
+ }
169
+ break;
170
+ // Bot LLM Stopped - Complete streaming response
171
+ case "bot-llm-stopped":
172
+ const lastBotMsg = this.chatMessages[this.chatMessages.length - 1];
173
+ if (lastBotMsg && lastBotMsg.isFinal) {
174
+ this.chatMessages[this.chatMessages.length - 1] = {
175
+ ...lastBotMsg,
176
+ isFinal: false,
177
+ };
178
+ }
179
+ // Clear streaming state
180
+ this.isBotResponding = false;
181
+ this.emit("botRespondingChange", false);
182
+ this.emit("messagesChange", this.chatMessages);
183
+ break;
184
+ // User Transcription Messages
185
+ case "user-transcription":
186
+ if (messageData.data?.text) {
187
+ const messageContent = messageData.data.text;
188
+ if (messageData.data?.final) {
189
+ // Final transcription - accumulate in single bubble until bot responds
190
+ const lastUserMsg = this.chatMessages[this.chatMessages.length - 1];
191
+ // Start latency measurement for voice when user finishes speaking
192
+ if (this.latencyMonitor) {
193
+ this.latencyMonitor.startMeasurement("voice", messageContent);
194
+ }
195
+ // Check if last message is an accumulating user message (isFinal=true)
196
+ if (lastUserMsg &&
197
+ lastUserMsg.type === "user-transcription" &&
198
+ lastUserMsg.isFinal === true) {
199
+ // Accumulate: append new content to existing message with space
200
+ const accumulatedContent = lastUserMsg.content.trim() + " " + messageContent.trim();
201
+ this.chatMessages[this.chatMessages.length - 1] = {
202
+ ...lastUserMsg,
203
+ content: accumulatedContent,
204
+ timestamp: timestamp,
205
+ };
206
+ }
207
+ else {
208
+ // Start new accumulating message (isFinal=true means "still accumulating")
209
+ const userMessage = {
210
+ id: messageId,
211
+ type: "user-transcription",
212
+ content: messageContent,
213
+ timestamp: timestamp,
214
+ isFinal: true,
215
+ };
216
+ this.chatMessages.push(userMessage);
217
+ }
218
+ this.emit("messagesChange", this.chatMessages);
219
+ // Clear live transcription when final
220
+ this.userTranscription = "";
221
+ this.emit("userTranscriptionChange", "");
222
+ }
223
+ else {
224
+ // Non-final transcription - show in input field
225
+ this.userTranscription = messageContent;
226
+ this.emit("userTranscriptionChange", messageContent);
227
+ }
228
+ }
229
+ break;
230
+ // Bot Emotion Messages
231
+ case "bot-emotion":
232
+ if (messageData.data?.emotion) {
233
+ const emotionMessage = {
234
+ id: messageId,
235
+ type: "bot-emotion",
236
+ content: `${messageData.data.emotion} (scale: ${messageData.data.scale || 1})`,
237
+ timestamp,
238
+ };
239
+ this.chatMessages.push(emotionMessage);
240
+ this.emit("messagesChange", this.chatMessages);
241
+ }
242
+ break;
243
+ // Bot Started Speaking
244
+ case "bot-started-speaking":
245
+ this.isSpeaking = true;
246
+ this.totalBlendshapesReceived = 0; // Reset counter when bot starts speaking
247
+ this.blendshapeQueue.startConversation(); // Mark conversation start in queue
248
+ this.emit("speakingChange", true);
249
+ break;
250
+ // Bot Stopped Speaking
251
+ case "bot-stopped-speaking":
252
+ this.isSpeaking = false;
253
+ this.emit("speakingChange", false);
254
+ break;
255
+ // Action Response Messages
256
+ case "action-response":
257
+ if (messageData.data?.actions) {
258
+ const actionMessage = {
259
+ id: messageId,
260
+ type: "action",
261
+ content: `Actions: ${messageData.data.actions.join(", ")}`,
262
+ timestamp,
263
+ };
264
+ this.chatMessages.push(actionMessage);
265
+ this.emit("messagesChange", this.chatMessages);
266
+ }
267
+ break;
268
+ // Behavior Tree Response Messages
269
+ case "behavior-tree-response":
270
+ if (messageData.data?.narrative_section_id) {
271
+ const behaviorMessage = {
272
+ id: messageId,
273
+ type: "behavior-tree",
274
+ content: `Narrative Section: ${messageData.data.narrative_section_id}`,
275
+ timestamp,
276
+ };
277
+ this.chatMessages.push(behaviorMessage);
278
+ this.emit("messagesChange", this.chatMessages);
279
+ }
280
+ break;
281
+ // Server Message - Contains various data types like blendshapes
282
+ case "server-message":
283
+ if (messageData.data) {
284
+ const serverData = messageData.data;
285
+ // Check if this is blendshape turn stats (marks end of conversation)
286
+ if (serverData.type === "blendshape-turn-stats") {
287
+ this.blendshapeQueue.endConversation();
288
+ this.emit("blendshapeStatsReceived", serverData);
289
+ console.log("conversation ended", serverData);
290
+ }
291
+ // Check if this is blendshape data
292
+ if (serverData.type === "chunked-neurosync-blendshapes" &&
293
+ serverData.blendshapes) {
294
+ // Add to queue for buffering
295
+ this.blendshapeQueue.addChunk(serverData.blendshapes);
296
+ // Accumulate total blendshapes count
297
+ this.totalBlendshapesReceived += serverData.blendshapes.length;
298
+ // Emit event for external listeners (backward compatibility)
299
+ this.emit("blendshapes", serverData);
300
+ }
301
+ }
302
+ break;
303
+ // Silently ignore other message types
304
+ case "moderation-response":
305
+ case "trigger-message":
306
+ case "update-template-keys":
307
+ case "update-dynamic-info":
308
+ case "interrupt-bot":
309
+ break;
310
+ }
311
+ }
312
+ catch (error) {
313
+ // Silently handle parse errors
314
+ }
315
+ }
316
+ /**
317
+ * Reset message state
318
+ */
319
+ reset() {
320
+ this.chatMessages = [];
321
+ this.userTranscription = "";
322
+ this.isBotResponding = false;
323
+ this.isSpeaking = false;
324
+ this.totalBlendshapesReceived = 0;
325
+ this.blendshapeQueue.reset();
326
+ this.emit("messagesChange", this.chatMessages);
327
+ this.emit("userTranscriptionChange", "");
328
+ this.emit("botRespondingChange", false);
329
+ this.emit("speakingChange", false);
330
+ }
331
+ }
332
+ //# sourceMappingURL=MessageHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MessageHandler.js","sourceRoot":"","sources":["../../src/core/MessageHandler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScreenShareManager.d.ts","sourceRoot":"","sources":["../../src/core/ScreenShareManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAE9C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C;;;;GAIG;AACH,qBAAa,kBAAmB,SAAQ,YAAa,YAAW,mBAAmB;IACjF,OAAO,CAAC,IAAI,CAAqB;IACjC,OAAO,CAAC,qBAAqB,CAAkB;IAC/C,OAAO,CAAC,oBAAoB,CAAkB;gBAElC,IAAI,CAAC,EAAE,IAAI;IAOvB,IAAI,oBAAoB,IAAI,OAAO,CAElC;IAED,IAAI,mBAAmB,IAAI,OAAO,CAEjC;IAED;;OAEG;IACH,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;IAczB;;OAEG;IACH,OAAO,CAAC,cAAc;IAuCtB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAKxB;;OAEG;IACH,OAAO,CAAC,WAAW;IAYnB;;OAEG;IACG,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;IAqBxC;;OAEG;IACG,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC;IAezC;;OAEG;IACG,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;IAQxC;;OAEG;IACG,0BAA0B,IAAI,OAAO,CAAC,IAAI,CAAC;IA2BjD;;OAEG;IACG,oBAAoB,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAsB5C;;OAEG;IACH,KAAK,IAAI,IAAI;CAQd"}
@@ -0,0 +1,207 @@
1
+ import { logger } from "../utils/logger";
2
+ import { EventEmitter } from "./EventEmitter";
3
+ /**
4
+ * Manages screen sharing controls for LiveKit room
5
+ * Provides methods to enable/disable screen sharing, manage screen share state,
6
+ * and handle screen sharing with audio support.
7
+ */
8
+ export class ScreenShareManager extends EventEmitter {
9
+ constructor(room) {
10
+ super();
11
+ this.room = null;
12
+ this._isScreenShareEnabled = false;
13
+ this._isScreenShareActive = false;
14
+ if (room) {
15
+ this.setRoom(room);
16
+ }
17
+ }
18
+ get isScreenShareEnabled() {
19
+ return this._isScreenShareEnabled;
20
+ }
21
+ get isScreenShareActive() {
22
+ return this._isScreenShareActive;
23
+ }
24
+ /**
25
+ * Set the LiveKit room instance
26
+ */
27
+ setRoom(room) {
28
+ // Clean up previous room listeners
29
+ if (this.room) {
30
+ this.cleanupListeners();
31
+ }
32
+ this.room = room;
33
+ if (room && room.state !== 'disconnected') {
34
+ this.setupListeners();
35
+ this.updateState();
36
+ }
37
+ }
38
+ /**
39
+ * Setup event listeners for room
40
+ */
41
+ setupListeners() {
42
+ if (!this.room)
43
+ return;
44
+ const localParticipant = this.room.localParticipant;
45
+ const handleTrackPublished = (track) => {
46
+ if (track.source === 'screen_share') {
47
+ this._isScreenShareActive = true;
48
+ this.emit('screenShareStateChange', { isScreenShareActive: true });
49
+ }
50
+ };
51
+ const handleTrackUnpublished = (track) => {
52
+ if (track.source === 'screen_share') {
53
+ this._isScreenShareActive = false;
54
+ this.emit('screenShareStateChange', { isScreenShareActive: false });
55
+ }
56
+ };
57
+ const handleTrackMuted = (track) => {
58
+ if (track.source === 'screen_share') {
59
+ this._isScreenShareActive = false;
60
+ this.emit('screenShareStateChange', { isScreenShareActive: false });
61
+ }
62
+ };
63
+ const handleTrackUnmuted = (track) => {
64
+ if (track.source === 'screen_share') {
65
+ this._isScreenShareActive = true;
66
+ this.emit('screenShareStateChange', { isScreenShareActive: true });
67
+ }
68
+ };
69
+ localParticipant.on('trackPublished', handleTrackPublished);
70
+ localParticipant.on('trackUnpublished', handleTrackUnpublished);
71
+ localParticipant.on('trackMuted', handleTrackMuted);
72
+ localParticipant.on('trackUnmuted', handleTrackUnmuted);
73
+ }
74
+ /**
75
+ * Clean up event listeners
76
+ */
77
+ cleanupListeners() {
78
+ if (!this.room)
79
+ return;
80
+ // LiveKit handles cleanup automatically when participant is removed
81
+ }
82
+ /**
83
+ * Update screen share state from room
84
+ */
85
+ updateState() {
86
+ if (!this.room || this.room.state === 'disconnected') {
87
+ this._isScreenShareEnabled = false;
88
+ this._isScreenShareActive = false;
89
+ return;
90
+ }
91
+ const localParticipant = this.room.localParticipant;
92
+ this._isScreenShareEnabled = localParticipant.isScreenShareEnabled;
93
+ this._isScreenShareActive = localParticipant.isScreenShareEnabled;
94
+ }
95
+ /**
96
+ * Enable screen share
97
+ */
98
+ async enableScreenShare() {
99
+ if (!this.room) {
100
+ throw new Error('Room not initialized');
101
+ }
102
+ try {
103
+ // Use setScreenShareEnabled with options to include current tab
104
+ await this.room.localParticipant.setScreenShareEnabled(true, {
105
+ // @ts-ignore - selfBrowserSurface is a valid Chrome option but may not be in types
106
+ selfBrowserSurface: "include",
107
+ surfaceSwitching: "include",
108
+ systemAudio: "include",
109
+ });
110
+ this._isScreenShareEnabled = true;
111
+ this._isScreenShareActive = true;
112
+ this.emit('screenShareStateChange', { isScreenShareEnabled: true, isScreenShareActive: true });
113
+ }
114
+ catch (error) {
115
+ throw error;
116
+ }
117
+ }
118
+ /**
119
+ * Disable screen share
120
+ */
121
+ async disableScreenShare() {
122
+ if (!this.room) {
123
+ throw new Error('Room not initialized');
124
+ }
125
+ try {
126
+ await this.room.localParticipant.setScreenShareEnabled(false);
127
+ this._isScreenShareEnabled = false;
128
+ this._isScreenShareActive = false;
129
+ this.emit('screenShareStateChange', { isScreenShareEnabled: false, isScreenShareActive: false });
130
+ }
131
+ catch (error) {
132
+ throw error;
133
+ }
134
+ }
135
+ /**
136
+ * Toggle screen share
137
+ */
138
+ async toggleScreenShare() {
139
+ if (this._isScreenShareEnabled) {
140
+ await this.disableScreenShare();
141
+ }
142
+ else {
143
+ await this.enableScreenShare();
144
+ }
145
+ }
146
+ /**
147
+ * Enable screen share with audio
148
+ */
149
+ async enableScreenShareWithAudio() {
150
+ if (!this.room) {
151
+ throw new Error('Room not initialized');
152
+ }
153
+ try {
154
+ // Create screen tracks with audio enabled and include current tab
155
+ const tracks = await this.room.localParticipant.createScreenTracks({
156
+ audio: true,
157
+ // @ts-ignore - selfBrowserSurface is a valid Chrome option but may not be in types
158
+ selfBrowserSurface: "include",
159
+ surfaceSwitching: "include",
160
+ systemAudio: "include",
161
+ });
162
+ // Publish each track
163
+ tracks.forEach((track) => {
164
+ this.room.localParticipant.publishTrack(track);
165
+ });
166
+ this._isScreenShareEnabled = true;
167
+ }
168
+ catch (error) {
169
+ logger.error("Failed to enable screen share with audio:", error);
170
+ throw error;
171
+ }
172
+ }
173
+ /**
174
+ * Get screen share tracks
175
+ */
176
+ async getScreenShareTracks() {
177
+ if (!this.room) {
178
+ return [];
179
+ }
180
+ try {
181
+ const localParticipant = this.room.localParticipant;
182
+ const screenShareTracks = [];
183
+ // Get all published tracks
184
+ localParticipant.trackPublications.forEach((publication) => {
185
+ if (publication.source === 'screen_share' && publication.track) {
186
+ screenShareTracks.push(publication.track);
187
+ }
188
+ });
189
+ return screenShareTracks;
190
+ }
191
+ catch (error) {
192
+ throw error;
193
+ }
194
+ }
195
+ /**
196
+ * Reset state on disconnect
197
+ */
198
+ reset() {
199
+ this._isScreenShareEnabled = false;
200
+ this._isScreenShareActive = false;
201
+ this.emit('screenShareStateChange', {
202
+ isScreenShareEnabled: false,
203
+ isScreenShareActive: false
204
+ });
205
+ }
206
+ }
207
+ //# sourceMappingURL=ScreenShareManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScreenShareManager.js","sourceRoot":"","sources":["../../src/core/ScreenShareManager.ts"],"names":[],"mappings":"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"}