@convai/web-sdk 1.8.0-beta.7 → 1.8.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 (106) hide show
  1. package/README.md +44 -194
  2. package/dist/core/ConvaiClient.d.ts +1 -190
  3. package/dist/core/ConvaiClient.d.ts.map +1 -1
  4. package/dist/core/ConvaiClient.js +286 -1306
  5. package/dist/core/ConvaiClient.js.map +1 -1
  6. package/dist/core/MessageHandler.d.ts +1 -19
  7. package/dist/core/MessageHandler.d.ts.map +1 -1
  8. package/dist/core/MessageHandler.js +27 -378
  9. package/dist/core/MessageHandler.js.map +1 -1
  10. package/dist/core/connectRequest.d.ts +4 -17
  11. package/dist/core/connectRequest.d.ts.map +1 -1
  12. package/dist/core/connectRequest.js +17 -28
  13. package/dist/core/connectRequest.js.map +1 -1
  14. package/dist/core/index.d.ts +1 -6
  15. package/dist/core/index.d.ts.map +1 -1
  16. package/dist/core/index.js +1 -7
  17. package/dist/core/index.js.map +1 -1
  18. package/dist/core/logicalTurn.d.ts +6 -4
  19. package/dist/core/logicalTurn.d.ts.map +1 -1
  20. package/dist/core/logicalTurn.js +4 -29
  21. package/dist/core/logicalTurn.js.map +1 -1
  22. package/dist/core/modelOutput.d.ts.map +1 -1
  23. package/dist/core/modelOutput.js +2 -2
  24. package/dist/core/modelOutput.js.map +1 -1
  25. package/dist/core/types.d.ts +22 -860
  26. package/dist/core/types.d.ts.map +1 -1
  27. package/dist/core/types.js.map +1 -1
  28. package/dist/embed/chat-embed-v1.js +9 -10
  29. package/dist/embed/chat-embed-v1.js.map +4 -4
  30. package/dist/react/components/ConvaiWidget.d.ts.map +1 -1
  31. package/dist/react/components/ConvaiWidget.js +1 -6
  32. package/dist/react/components/ConvaiWidget.js.map +1 -1
  33. package/dist/react/components/rtc-widget/components/AudioVisualizer.d.ts.map +1 -1
  34. package/dist/react/components/rtc-widget/components/AudioVisualizer.js +1 -28
  35. package/dist/react/components/rtc-widget/components/AudioVisualizer.js.map +1 -1
  36. package/dist/react/components/rtc-widget/components/MarkdownRenderer.d.ts.map +1 -1
  37. package/dist/react/components/rtc-widget/components/MarkdownRenderer.js +44 -39
  38. package/dist/react/components/rtc-widget/components/MarkdownRenderer.js.map +1 -1
  39. package/dist/react/components/rtc-widget/components/conviComponents/VoiceModeOverlay.d.ts.map +1 -1
  40. package/dist/react/components/rtc-widget/components/conviComponents/VoiceModeOverlay.js +49 -93
  41. package/dist/react/components/rtc-widget/components/conviComponents/VoiceModeOverlay.js.map +1 -1
  42. package/dist/react/hooks/useConvaiClient.d.ts.map +1 -1
  43. package/dist/react/hooks/useConvaiClient.js +2 -17
  44. package/dist/react/hooks/useConvaiClient.js.map +1 -1
  45. package/dist/react/index.d.ts +1 -1
  46. package/dist/react/index.d.ts.map +1 -1
  47. package/dist/react/index.js +1 -1
  48. package/dist/react/index.js.map +1 -1
  49. package/dist/vanilla/AudioRenderer.d.ts +1 -3
  50. package/dist/vanilla/AudioRenderer.d.ts.map +1 -1
  51. package/dist/vanilla/AudioRenderer.js +2 -8
  52. package/dist/vanilla/AudioRenderer.js.map +1 -1
  53. package/dist/vanilla/ConvaiWidget.d.ts.map +1 -1
  54. package/dist/vanilla/ConvaiWidget.js +300 -994
  55. package/dist/vanilla/ConvaiWidget.js.map +1 -1
  56. package/dist/vanilla/WidgetEventSubscriptions.d.ts +1 -1
  57. package/dist/vanilla/WidgetEventSubscriptions.d.ts.map +1 -1
  58. package/dist/vanilla/WidgetEventSubscriptions.js +0 -5
  59. package/dist/vanilla/WidgetEventSubscriptions.js.map +1 -1
  60. package/dist/vanilla/icons.d.ts.map +1 -1
  61. package/dist/vanilla/icons.js +15 -62
  62. package/dist/vanilla/icons.js.map +1 -1
  63. package/dist/vanilla/index.d.ts +2 -4
  64. package/dist/vanilla/index.d.ts.map +1 -1
  65. package/dist/vanilla/index.js +1 -3
  66. package/dist/vanilla/index.js.map +1 -1
  67. package/dist/vanilla/styles.d.ts +1 -18
  68. package/dist/vanilla/styles.d.ts.map +1 -1
  69. package/dist/vanilla/styles.js +29 -129
  70. package/dist/vanilla/styles.js.map +1 -1
  71. package/dist/vanilla/types.d.ts +0 -74
  72. package/dist/vanilla/types.d.ts.map +1 -1
  73. package/dist/vanilla/types.js.map +1 -1
  74. package/dist/version.d.ts +1 -1
  75. package/dist/version.d.ts.map +1 -1
  76. package/dist/version.js +1 -1
  77. package/dist/version.js.map +1 -1
  78. package/package.json +8 -13
  79. package/dist/core/CharacterRoster.d.ts +0 -84
  80. package/dist/core/CharacterRoster.d.ts.map +0 -1
  81. package/dist/core/CharacterRoster.js +0 -348
  82. package/dist/core/CharacterRoster.js.map +0 -1
  83. package/dist/core/CharacterVersionManager.d.ts +0 -100
  84. package/dist/core/CharacterVersionManager.d.ts.map +0 -1
  85. package/dist/core/CharacterVersionManager.js +0 -227
  86. package/dist/core/CharacterVersionManager.js.map +0 -1
  87. package/dist/core/ConvaiRoomError.d.ts +0 -48
  88. package/dist/core/ConvaiRoomError.d.ts.map +0 -1
  89. package/dist/core/ConvaiRoomError.js +0 -111
  90. package/dist/core/ConvaiRoomError.js.map +0 -1
  91. package/dist/core/SSESession.d.ts +0 -59
  92. package/dist/core/SSESession.d.ts.map +0 -1
  93. package/dist/core/SSESession.js +0 -289
  94. package/dist/core/SSESession.js.map +0 -1
  95. package/dist/core/characterReference.d.ts +0 -40
  96. package/dist/core/characterReference.d.ts.map +0 -1
  97. package/dist/core/characterReference.js +0 -72
  98. package/dist/core/characterReference.js.map +0 -1
  99. package/dist/core/rosterRequest.d.ts +0 -57
  100. package/dist/core/rosterRequest.d.ts.map +0 -1
  101. package/dist/core/rosterRequest.js +0 -210
  102. package/dist/core/rosterRequest.js.map +0 -1
  103. package/dist/utils/inlineMarkdown.d.ts +0 -38
  104. package/dist/utils/inlineMarkdown.d.ts.map +0 -1
  105. package/dist/utils/inlineMarkdown.js +0 -106
  106. package/dist/utils/inlineMarkdown.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"AudioRenderer.js","sourceRoot":"","sources":["../../src/vanilla/AudioRenderer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,SAAS,EAA6C,MAAM,gBAAgB,CAAC;AAC5F,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAEzC;;;;GAIG;AACH,MAAM,OAAO,aAAa;IAYxB,YAAY,IAAU,EAAE,OAAqC;QAVrD,kBAAa,GAAkC,IAAI,GAAG,EAAE,CAAC;QAGzD,kBAAa,GAAqB,IAAI,GAAG,EAAE,CAAC,CAAC,yBAAyB;QAiJtE,oBAAe,GAA4B,IAAI,CAAC;QAzItD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,UAAU,GAAG,YAAY,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QAEtF,gDAAgD;QAChD,IAAI,CAAC,0BAA0B,GAAG,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxE,IAAI,CAAC,4BAA4B,GAAG,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5E,IAAI,CAAC,kCAAkC,GAAG,IAAI,CAAC,6BAA6B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAExF,+CAA+C;QAC/C,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC/C,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,yBAAyB,IAAI,CAAC,UAAU,EAAE,CAAC;QAC/D,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;QACtC,CAAC,OAAO,EAAE,SAAS,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAElE,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3B,IAAI,CAAC,oBAAoB,EAAE,CAAC;IAC9B,CAAC;IAED;;OAEG;IACK,mBAAmB;QACzB,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,eAAe,EAAE,IAAI,CAAC,0BAA0B,CAAC,CAAC;QACzE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,iBAAiB,EAAE,IAAI,CAAC,4BAA4B,CAAC,CAAC;QAC7E,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,uBAAuB,EAAE,IAAI,CAAC,kCAAkC,CAAC,CAAC;IAC3F,CAAC;IAED;;OAEG;IACK,oBAAoB;QAC1B,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,EAAE;YACnD,WAAW,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,EAAE;gBACzD,IAAI,WAAW,CAAC,KAAK,IAAI,WAAW,CAAC,YAAY,EAAE,CAAC;oBAClD,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;gBAClD,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACK,qBAAqB,CAC3B,KAAU,EACV,WAAmC,EACnC,WAA8B;QAE9B,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC3B,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IAED;;OAEG;IACK,uBAAuB,CAC7B,KAAU,EACV,WAAmC,EACnC,WAA8B;QAE9B,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC3B,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IAED;;OAEG;IACK,6BAA6B,CAAC,WAA8B;QAClE,WAAW,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,EAAE;YACzD,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACK,gBAAgB,CACtB,WAAmC,EACnC,WAA8B;QAE9B,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC;QAChC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO;YAAE,OAAO;QAE7C,MAAM,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC;QAEtC,2BAA2B;QAC3B,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YACrC,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,uBAAuB;YACvB,MAAM,YAAY,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YACrD,YAAY,CAAC,EAAE,GAAG,SAAS,QAAQ,EAAE,CAAC;YACtC,mEAAmE;YACnE,mEAAmE;YACnE,YAAY,CAAC,OAAO,CAAC,mBAAmB,GAAG,WAAW,CAAC,QAAQ,CAAC;YAChE,IAAI,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;gBAClD,YAAY,CAAC,OAAO,CAAC,YAAY,GAAG,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;YACtF,CAAC;YACD,YAAY,CAAC,QAAQ,GAAG,IAAI,CAAC;YAE7B,mDAAmD;YACnD,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;YAE3B,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;YACzC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;YAC/C,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC1C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,+BAA+B,EAAE,KAAK,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IAED;;OAEG;IACK,gBAAgB,CAAC,QAAgB;QACvC,uBAAuB;QACvB,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACtD,IAAI,YAAY,EAAE,CAAC;YACjB,4BAA4B;YAC5B,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACtD,IAAI,YAAY,EAAE,CAAC;gBACjB,YAAY,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;gBAClC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YACtC,CAAC;YAED,YAAY,CAAC,KAAK,EAAE,CAAC;YACrB,YAAY,CAAC,SAAS,GAAG,IAAI,CAAC;YAC9B,YAAY,CAAC,MAAM,EAAE,CAAC;QACxB,CAAC;QAED,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACtC,CAAC;IAID;;OAEG;IACH,oBAAoB,CAAC,KAAuB;QAC1C,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC5B,MAAM,EAAE,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAC3C,EAAE,CAAC,QAAQ,GAAG,IAAI,CAAC;QACnB,EAAE,CAAC,SAAS,GAAG,IAAI,WAAW,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;QACxC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QAC/B,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC;IAC5B,CAAC;IAED,oBAAoB;QAClB,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;YAC7B,IAAI,CAAC,eAAe,CAAC,SAAS,GAAG,IAAI,CAAC;YACtC,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,CAAC;YAC9B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC9B,CAAC;IACH,CAAC;IAED;;OAEG;IACH,OAAO;QACL,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAE5B,4BAA4B;QAC5B,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,EAAE;YAC/C,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;QAE3B,mBAAmB;QACnB,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,CAAC;YACnD,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;QAC1B,CAAC;QAED,uDAAuD;QACvD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,eAAe,EAAE,IAAI,CAAC,0BAA0B,CAAC,CAAC;QAC1E,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,iBAAiB,EAAE,IAAI,CAAC,4BAA4B,CAAC,CAAC;QAC9E,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,uBAAuB,EAAE,IAAI,CAAC,kCAAkC,CAAC,CAAC;IAC5F,CAAC;CACF","sourcesContent":["import { Room, RoomEvent, RemoteTrackPublication, RemoteParticipant } from 'livekit-client';\nimport { logger } from '../utils/logger';\n\n/**\n * AudioRenderer - Manages audio playback for remote participants\n * Automatically creates and attaches audio elements for remote audio tracks\n * This replaces React's RoomAudioRenderer for vanilla implementations\n */\nexport class AudioRenderer {\n private room: Room;\n private audioElements: Map<string, HTMLAudioElement> = new Map();\n private container: HTMLElement;\n private rendererId: string; // Unique ID for debugging\n private livekitTracks: Map<string, any> = new Map(); // Store track references\n\n // Store bound event handlers so we can properly remove them\n private boundHandleTrackSubscribed: any;\n private boundHandleTrackUnsubscribed: any;\n private boundHandleParticipantDisconnected: any;\n\n constructor(room: Room, options?: { container?: HTMLElement }) {\n this.room = room;\n this.rendererId = `renderer-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n \n // Bind event handlers once and store references\n this.boundHandleTrackSubscribed = this.handleTrackSubscribed.bind(this);\n this.boundHandleTrackUnsubscribed = this.handleTrackUnsubscribed.bind(this);\n this.boundHandleParticipantDisconnected = this.handleParticipantDisconnected.bind(this);\n \n // Create a hidden container for audio elements\n this.container = document.createElement('div');\n this.container.id = `convai-audio-renderer-${this.rendererId}`;\n this.container.style.display = 'none';\n (options?.container ?? document.body).appendChild(this.container);\n\n this.setupEventListeners();\n this.attachExistingTracks();\n }\n\n /**\n * Setup event listeners for room events\n */\n private setupEventListeners(): void {\n this.room.on(RoomEvent.TrackSubscribed, this.boundHandleTrackSubscribed);\n this.room.on(RoomEvent.TrackUnsubscribed, this.boundHandleTrackUnsubscribed);\n this.room.on(RoomEvent.ParticipantDisconnected, this.boundHandleParticipantDisconnected);\n }\n\n /**\n * Attach audio elements for existing tracks (if any)\n */\n private attachExistingTracks(): void {\n this.room.remoteParticipants.forEach((participant) => {\n participant.audioTrackPublications.forEach((publication) => {\n if (publication.track && publication.isSubscribed) {\n this.attachAudioTrack(publication, participant);\n }\n });\n });\n }\n\n /**\n * Handle track subscribed event\n */\n private handleTrackSubscribed(\n track: any,\n publication: RemoteTrackPublication,\n participant: RemoteParticipant\n ): void {\n if (track.kind === 'audio') {\n this.attachAudioTrack(publication, participant);\n }\n }\n\n /**\n * Handle track unsubscribed event\n */\n private handleTrackUnsubscribed(\n track: any,\n publication: RemoteTrackPublication,\n participant: RemoteParticipant\n ): void {\n if (track.kind === 'audio') {\n this.detachAudioTrack(publication.trackSid);\n }\n }\n\n /**\n * Handle participant disconnected event\n */\n private handleParticipantDisconnected(participant: RemoteParticipant): void {\n participant.audioTrackPublications.forEach((publication) => {\n this.detachAudioTrack(publication.trackSid);\n });\n }\n\n /**\n * Attach an audio track to an audio element\n */\n private attachAudioTrack(\n publication: RemoteTrackPublication,\n participant: RemoteParticipant\n ): void {\n const track = publication.track;\n if (!track || track.kind !== 'audio') return;\n\n const trackSid = publication.trackSid;\n\n // Skip if already attached\n if (this.audioElements.has(trackSid)) {\n return;\n }\n\n try {\n // Create audio element\n const audioElement = document.createElement('audio');\n audioElement.id = `audio-${trackSid}`;\n // Expose who owns this element, so a host page can find a member's\n // audio by identity (`character:{membershipId}` in a roster room).\n audioElement.dataset.participantIdentity = participant.identity;\n if (participant.identity.startsWith('character:')) {\n audioElement.dataset.membershipId = participant.identity.slice('character:'.length);\n }\n audioElement.autoplay = true;\n \n // Direct track attachment - play audio immediately\n track.attach(audioElement);\n \n this.container.appendChild(audioElement);\n this.audioElements.set(trackSid, audioElement);\n this.livekitTracks.set(trackSid, track);\n } catch (error) {\n logger.error('Failed to attach audio track:', error);\n }\n }\n\n /**\n * Detach an audio track and remove its element\n */\n private detachAudioTrack(trackSid: string): void {\n // Remove audio element\n const audioElement = this.audioElements.get(trackSid);\n if (audioElement) {\n // Detach from LiveKit track\n const livekitTrack = this.livekitTracks.get(trackSid);\n if (livekitTrack) {\n livekitTrack.detach(audioElement);\n this.livekitTracks.delete(trackSid);\n }\n\n audioElement.pause();\n audioElement.srcObject = null;\n audioElement.remove();\n }\n \n this.audioElements.delete(trackSid);\n }\n\n private _wsAudioElement: HTMLAudioElement | null = null;\n\n /**\n * Attach a MediaStreamTrack from WebSocket transport for bot audio playback.\n */\n attachWebSocketTrack(track: MediaStreamTrack): void {\n this.detachWebSocketTrack();\n const el = document.createElement('audio');\n el.autoplay = true;\n el.srcObject = new MediaStream([track]);\n this.container.appendChild(el);\n this._wsAudioElement = el;\n }\n\n detachWebSocketTrack(): void {\n if (this._wsAudioElement) {\n this._wsAudioElement.pause();\n this._wsAudioElement.srcObject = null;\n this._wsAudioElement.remove();\n this._wsAudioElement = null;\n }\n }\n\n /**\n * Cleanup and destroy the audio renderer\n */\n destroy(): void {\n this.detachWebSocketTrack();\n\n // Remove all audio elements\n this.audioElements.forEach((element, trackSid) => {\n this.detachAudioTrack(trackSid);\n });\n this.audioElements.clear();\n\n // Remove container\n if (this.container && this.container.parentElement) {\n this.container.remove();\n }\n\n // Remove event listeners using stored bound references\n this.room.off(RoomEvent.TrackSubscribed, this.boundHandleTrackSubscribed);\n this.room.off(RoomEvent.TrackUnsubscribed, this.boundHandleTrackUnsubscribed);\n this.room.off(RoomEvent.ParticipantDisconnected, this.boundHandleParticipantDisconnected);\n }\n}\n\n"]}
1
+ {"version":3,"file":"AudioRenderer.js","sourceRoot":"","sources":["../../src/vanilla/AudioRenderer.ts"],"names":[],"mappings":"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","sourcesContent":["import { Room, RoomEvent, RemoteTrackPublication, RemoteParticipant } from 'livekit-client';\nimport { logger } from '../utils/logger';\n\n/**\n * AudioRenderer - Manages audio playback for remote participants\n * Automatically creates and attaches audio elements for remote audio tracks\n * This replaces React's RoomAudioRenderer for vanilla implementations\n */\nexport class AudioRenderer {\n private room: Room;\n private audioElements: Map<string, HTMLAudioElement> = new Map();\n private container: HTMLElement;\n private rendererId: string; // Unique ID for debugging\n private livekitTracks: Map<string, any> = new Map(); // Store track references\n\n // Store bound event handlers so we can properly remove them\n private boundHandleTrackSubscribed: any;\n private boundHandleTrackUnsubscribed: any;\n private boundHandleParticipantDisconnected: any;\n\n constructor(room: Room) {\n this.room = room;\n this.rendererId = `renderer-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n \n // Bind event handlers once and store references\n this.boundHandleTrackSubscribed = this.handleTrackSubscribed.bind(this);\n this.boundHandleTrackUnsubscribed = this.handleTrackUnsubscribed.bind(this);\n this.boundHandleParticipantDisconnected = this.handleParticipantDisconnected.bind(this);\n \n // Create a hidden container for audio elements\n this.container = document.createElement('div');\n this.container.id = `convai-audio-renderer-${this.rendererId}`;\n this.container.style.display = 'none';\n document.body.appendChild(this.container);\n\n this.setupEventListeners();\n this.attachExistingTracks();\n }\n\n /**\n * Setup event listeners for room events\n */\n private setupEventListeners(): void {\n this.room.on(RoomEvent.TrackSubscribed, this.boundHandleTrackSubscribed);\n this.room.on(RoomEvent.TrackUnsubscribed, this.boundHandleTrackUnsubscribed);\n this.room.on(RoomEvent.ParticipantDisconnected, this.boundHandleParticipantDisconnected);\n }\n\n /**\n * Attach audio elements for existing tracks (if any)\n */\n private attachExistingTracks(): void {\n this.room.remoteParticipants.forEach((participant) => {\n participant.audioTrackPublications.forEach((publication) => {\n if (publication.track && publication.isSubscribed) {\n this.attachAudioTrack(publication, participant);\n }\n });\n });\n }\n\n /**\n * Handle track subscribed event\n */\n private handleTrackSubscribed(\n track: any,\n publication: RemoteTrackPublication,\n participant: RemoteParticipant\n ): void {\n if (track.kind === 'audio') {\n this.attachAudioTrack(publication, participant);\n }\n }\n\n /**\n * Handle track unsubscribed event\n */\n private handleTrackUnsubscribed(\n track: any,\n publication: RemoteTrackPublication,\n participant: RemoteParticipant\n ): void {\n if (track.kind === 'audio') {\n this.detachAudioTrack(publication.trackSid);\n }\n }\n\n /**\n * Handle participant disconnected event\n */\n private handleParticipantDisconnected(participant: RemoteParticipant): void {\n participant.audioTrackPublications.forEach((publication) => {\n this.detachAudioTrack(publication.trackSid);\n });\n }\n\n /**\n * Attach an audio track to an audio element\n */\n private attachAudioTrack(\n publication: RemoteTrackPublication,\n participant: RemoteParticipant\n ): void {\n const track = publication.track;\n if (!track || track.kind !== 'audio') return;\n\n const trackSid = publication.trackSid;\n\n // Skip if already attached\n if (this.audioElements.has(trackSid)) {\n return;\n }\n\n try {\n // Create audio element\n const audioElement = document.createElement('audio');\n audioElement.id = `audio-${trackSid}`;\n audioElement.autoplay = true;\n \n // Direct track attachment - play audio immediately\n track.attach(audioElement);\n \n this.container.appendChild(audioElement);\n this.audioElements.set(trackSid, audioElement);\n this.livekitTracks.set(trackSid, track);\n } catch (error) {\n logger.error('Failed to attach audio track:', error);\n }\n }\n\n /**\n * Detach an audio track and remove its element\n */\n private detachAudioTrack(trackSid: string): void {\n // Remove audio element\n const audioElement = this.audioElements.get(trackSid);\n if (audioElement) {\n // Detach from LiveKit track\n const livekitTrack = this.livekitTracks.get(trackSid);\n if (livekitTrack) {\n livekitTrack.detach(audioElement);\n this.livekitTracks.delete(trackSid);\n }\n\n audioElement.pause();\n audioElement.srcObject = null;\n audioElement.remove();\n }\n \n this.audioElements.delete(trackSid);\n }\n\n private _wsAudioElement: HTMLAudioElement | null = null;\n\n /**\n * Attach a MediaStreamTrack from WebSocket transport for bot audio playback.\n */\n attachWebSocketTrack(track: MediaStreamTrack): void {\n this.detachWebSocketTrack();\n const el = document.createElement('audio');\n el.autoplay = true;\n el.srcObject = new MediaStream([track]);\n this.container.appendChild(el);\n this._wsAudioElement = el;\n }\n\n detachWebSocketTrack(): void {\n if (this._wsAudioElement) {\n this._wsAudioElement.pause();\n this._wsAudioElement.srcObject = null;\n this._wsAudioElement.remove();\n this._wsAudioElement = null;\n }\n }\n\n /**\n * Cleanup and destroy the audio renderer\n */\n destroy(): void {\n this.detachWebSocketTrack();\n\n // Remove all audio elements\n this.audioElements.forEach((element, trackSid) => {\n this.detachAudioTrack(trackSid);\n });\n this.audioElements.clear();\n\n // Remove container\n if (this.container && this.container.parentElement) {\n this.container.remove();\n }\n\n // Remove event listeners using stored bound references\n this.room.off(RoomEvent.TrackSubscribed, this.boundHandleTrackSubscribed);\n this.room.off(RoomEvent.TrackUnsubscribed, this.boundHandleTrackUnsubscribed);\n this.room.off(RoomEvent.ParticipantDisconnected, this.boundHandleParticipantDisconnected);\n }\n}\n\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"ConvaiWidget.d.ts","sourceRoot":"","sources":["../../src/vanilla/ConvaiWidget.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAYH,OAAO,KAAK,EACV,oBAAoB,EACpB,aAAa,EAEd,MAAM,SAAS,CAAC;AA4HjB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,WAAW,EACtB,OAAO,EAAE,oBAAoB,GAC5B,aAAa,CA2wFf;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAE/D"}
1
+ {"version":3,"file":"ConvaiWidget.d.ts","sourceRoot":"","sources":["../../src/vanilla/ConvaiWidget.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,KAAK,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAanE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,WAAW,EACtB,OAAO,EAAE,oBAAoB,GAC5B,aAAa,CAqqEf;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAE/D"}