@estuary-ai/sdk 0.1.2 → 0.1.4
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.
- package/dist/index.d.mts +31 -1
- package/dist/index.js +79 -2
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +74 -4
- package/dist/index.mjs.map +1 -1
- package/dist/{livekit-voice-2WOL2XRV.mjs → livekit-voice-H6WZ44LM.mjs} +7 -3
- package/dist/livekit-voice-H6WZ44LM.mjs.map +1 -0
- package/package.json +1 -1
- package/dist/livekit-voice-2WOL2XRV.mjs.map +0 -1
|
@@ -26,7 +26,11 @@ var LiveKitVoiceManager = class {
|
|
|
26
26
|
let RoomEvent;
|
|
27
27
|
let Track;
|
|
28
28
|
try {
|
|
29
|
-
const
|
|
29
|
+
const specifier = ["livekit", "client"].join("-");
|
|
30
|
+
const lk = await import(
|
|
31
|
+
/* @vite-ignore */
|
|
32
|
+
specifier
|
|
33
|
+
);
|
|
30
34
|
Room = lk.Room;
|
|
31
35
|
RoomEvent = lk.RoomEvent;
|
|
32
36
|
Track = lk.Track;
|
|
@@ -148,5 +152,5 @@ var LiveKitVoiceManager = class {
|
|
|
148
152
|
};
|
|
149
153
|
|
|
150
154
|
export { LiveKitVoiceManager };
|
|
151
|
-
//# sourceMappingURL=livekit-voice-
|
|
152
|
-
//# sourceMappingURL=livekit-voice-
|
|
155
|
+
//# sourceMappingURL=livekit-voice-H6WZ44LM.mjs.map
|
|
156
|
+
//# sourceMappingURL=livekit-voice-H6WZ44LM.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/voice/livekit-voice.ts"],"names":[],"mappings":"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","file":"livekit-voice-H6WZ44LM.mjs","sourcesContent":["import type { VoiceManager, LiveKitTokenResponse } from '../types';\nimport type { SocketManager } from '../connection/socket-manager';\nimport type { Logger } from '../utils/logger';\nimport { EstuaryError, ErrorCode } from '../errors';\n\nexport class LiveKitVoiceManager implements VoiceManager {\n private socketManager: SocketManager;\n private logger: Logger;\n private room: any = null; // livekit-client Room (dynamically imported)\n private _isMuted = false;\n private _isActive = false;\n\n constructor(socketManager: SocketManager, logger: Logger) {\n this.socketManager = socketManager;\n this.logger = logger;\n }\n\n get isMuted(): boolean {\n return this._isMuted;\n }\n\n get isActive(): boolean {\n return this._isActive;\n }\n\n async start(): Promise<void> {\n if (this._isActive) {\n throw new EstuaryError(ErrorCode.VOICE_ALREADY_ACTIVE, 'Voice is already active');\n }\n\n let Room: any;\n let RoomEvent: any;\n let Track: any;\n try {\n const specifier = ['livekit', 'client'].join('-');\n const lk = await import(/* @vite-ignore */ specifier);\n Room = lk.Room;\n RoomEvent = lk.RoomEvent;\n Track = lk.Track;\n } catch {\n throw new EstuaryError(\n ErrorCode.LIVEKIT_UNAVAILABLE,\n 'livekit-client package is not installed',\n );\n }\n\n // Request token from server\n const tokenData = await this.requestToken();\n\n // Create and configure room\n this.room = new Room({\n adaptiveStream: true,\n dynacast: true,\n audioCaptureDefaults: {\n echoCancellation: true,\n noiseSuppression: true,\n autoGainControl: true,\n },\n });\n\n // Handle remote audio tracks (bot audio)\n this.room.on(RoomEvent.TrackSubscribed, (\n track: any,\n _publication: any,\n participant: any,\n ) => {\n if (track.kind === Track.Kind.Audio) {\n this.logger.debug('Bot audio track subscribed from', participant.identity);\n const audioElement = track.attach();\n audioElement.autoplay = true;\n audioElement.style.display = 'none';\n if (typeof document !== 'undefined') {\n document.body.appendChild(audioElement);\n }\n audioElement.play().catch(() => {});\n }\n });\n\n this.room.on(RoomEvent.TrackUnsubscribed, (track: any) => {\n if (track.kind === Track.Kind.Audio) {\n track.detach().forEach((el: HTMLMediaElement) => el.remove());\n }\n });\n\n this.room.on(RoomEvent.Disconnected, () => {\n this.logger.debug('LiveKit room disconnected');\n this._isActive = false;\n });\n\n // Connect to room\n try {\n await this.room.connect(tokenData.url, tokenData.token);\n this.logger.debug('Connected to LiveKit room:', tokenData.room);\n } catch (err) {\n this.room = null;\n throw new EstuaryError(\n ErrorCode.CONNECTION_FAILED,\n 'Failed to connect to LiveKit room',\n err,\n );\n }\n\n // Enable microphone\n try {\n await this.room.localParticipant.setMicrophoneEnabled(true);\n this.logger.debug('Microphone enabled');\n } catch (err) {\n this.room.disconnect();\n this.room = null;\n throw new EstuaryError(\n ErrorCode.MICROPHONE_DENIED,\n 'Failed to enable microphone',\n err,\n );\n }\n\n // Notify backend\n this.socketManager.emitEvent('livekit_join', { room: tokenData.room });\n this._isActive = true;\n this.logger.debug('LiveKit voice started');\n }\n\n async stop(): Promise<void> {\n if (!this._isActive) return;\n\n try {\n this.socketManager.emitEvent('livekit_leave');\n } catch {\n // May not be connected\n }\n\n if (this.room) {\n // Stop local tracks\n for (const [, publication] of this.room.localParticipant.trackPublications) {\n if (publication.track) {\n publication.track.stop();\n }\n }\n this.room.disconnect();\n this.room = null;\n }\n\n this._isActive = false;\n this._isMuted = false;\n this.logger.debug('LiveKit voice stopped');\n }\n\n toggleMute(): void {\n if (!this._isActive || !this.room) return;\n this._isMuted = !this._isMuted;\n this.room.localParticipant.setMicrophoneEnabled(!this._isMuted);\n this.logger.debug('Mute toggled:', this._isMuted);\n }\n\n dispose(): void {\n if (this.room) {\n this.room.disconnect();\n this.room = null;\n }\n this._isActive = false;\n this._isMuted = false;\n }\n\n private requestToken(): Promise<LiveKitTokenResponse> {\n return new Promise<LiveKitTokenResponse>((resolve, reject) => {\n const timeout = setTimeout(() => {\n this.socketManager.onLiveKitToken(() => {}); // clear callback\n reject(new EstuaryError(\n ErrorCode.CONNECTION_TIMEOUT,\n 'Timed out waiting for LiveKit token',\n ));\n }, 10000);\n\n this.socketManager.onLiveKitToken((data: LiveKitTokenResponse) => {\n clearTimeout(timeout);\n resolve(data);\n });\n\n this.socketManager.emitEvent('livekit_token');\n });\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/voice/livekit-voice.ts"],"names":[],"mappings":"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","file":"livekit-voice-2WOL2XRV.mjs","sourcesContent":["import type { VoiceManager, LiveKitTokenResponse } from '../types';\nimport type { SocketManager } from '../connection/socket-manager';\nimport type { Logger } from '../utils/logger';\nimport { EstuaryError, ErrorCode } from '../errors';\n\nexport class LiveKitVoiceManager implements VoiceManager {\n private socketManager: SocketManager;\n private logger: Logger;\n private room: any = null; // livekit-client Room (dynamically imported)\n private _isMuted = false;\n private _isActive = false;\n\n constructor(socketManager: SocketManager, logger: Logger) {\n this.socketManager = socketManager;\n this.logger = logger;\n }\n\n get isMuted(): boolean {\n return this._isMuted;\n }\n\n get isActive(): boolean {\n return this._isActive;\n }\n\n async start(): Promise<void> {\n if (this._isActive) {\n throw new EstuaryError(ErrorCode.VOICE_ALREADY_ACTIVE, 'Voice is already active');\n }\n\n let Room: any;\n let RoomEvent: any;\n let Track: any;\n try {\n const lk = await import('livekit-client');\n Room = lk.Room;\n RoomEvent = lk.RoomEvent;\n Track = lk.Track;\n } catch {\n throw new EstuaryError(\n ErrorCode.LIVEKIT_UNAVAILABLE,\n 'livekit-client package is not installed',\n );\n }\n\n // Request token from server\n const tokenData = await this.requestToken();\n\n // Create and configure room\n this.room = new Room({\n adaptiveStream: true,\n dynacast: true,\n audioCaptureDefaults: {\n echoCancellation: true,\n noiseSuppression: true,\n autoGainControl: true,\n },\n });\n\n // Handle remote audio tracks (bot audio)\n this.room.on(RoomEvent.TrackSubscribed, (\n track: any,\n _publication: any,\n participant: any,\n ) => {\n if (track.kind === Track.Kind.Audio) {\n this.logger.debug('Bot audio track subscribed from', participant.identity);\n const audioElement = track.attach();\n audioElement.autoplay = true;\n audioElement.style.display = 'none';\n if (typeof document !== 'undefined') {\n document.body.appendChild(audioElement);\n }\n audioElement.play().catch(() => {});\n }\n });\n\n this.room.on(RoomEvent.TrackUnsubscribed, (track: any) => {\n if (track.kind === Track.Kind.Audio) {\n track.detach().forEach((el: HTMLMediaElement) => el.remove());\n }\n });\n\n this.room.on(RoomEvent.Disconnected, () => {\n this.logger.debug('LiveKit room disconnected');\n this._isActive = false;\n });\n\n // Connect to room\n try {\n await this.room.connect(tokenData.url, tokenData.token);\n this.logger.debug('Connected to LiveKit room:', tokenData.room);\n } catch (err) {\n this.room = null;\n throw new EstuaryError(\n ErrorCode.CONNECTION_FAILED,\n 'Failed to connect to LiveKit room',\n err,\n );\n }\n\n // Enable microphone\n try {\n await this.room.localParticipant.setMicrophoneEnabled(true);\n this.logger.debug('Microphone enabled');\n } catch (err) {\n this.room.disconnect();\n this.room = null;\n throw new EstuaryError(\n ErrorCode.MICROPHONE_DENIED,\n 'Failed to enable microphone',\n err,\n );\n }\n\n // Notify backend\n this.socketManager.emitEvent('livekit_join', { room: tokenData.room });\n this._isActive = true;\n this.logger.debug('LiveKit voice started');\n }\n\n async stop(): Promise<void> {\n if (!this._isActive) return;\n\n try {\n this.socketManager.emitEvent('livekit_leave');\n } catch {\n // May not be connected\n }\n\n if (this.room) {\n // Stop local tracks\n for (const [, publication] of this.room.localParticipant.trackPublications) {\n if (publication.track) {\n publication.track.stop();\n }\n }\n this.room.disconnect();\n this.room = null;\n }\n\n this._isActive = false;\n this._isMuted = false;\n this.logger.debug('LiveKit voice stopped');\n }\n\n toggleMute(): void {\n if (!this._isActive || !this.room) return;\n this._isMuted = !this._isMuted;\n this.room.localParticipant.setMicrophoneEnabled(!this._isMuted);\n this.logger.debug('Mute toggled:', this._isMuted);\n }\n\n dispose(): void {\n if (this.room) {\n this.room.disconnect();\n this.room = null;\n }\n this._isActive = false;\n this._isMuted = false;\n }\n\n private requestToken(): Promise<LiveKitTokenResponse> {\n return new Promise<LiveKitTokenResponse>((resolve, reject) => {\n const timeout = setTimeout(() => {\n this.socketManager.onLiveKitToken(() => {}); // clear callback\n reject(new EstuaryError(\n ErrorCode.CONNECTION_TIMEOUT,\n 'Timed out waiting for LiveKit token',\n ));\n }, 10000);\n\n this.socketManager.onLiveKitToken((data: LiveKitTokenResponse) => {\n clearTimeout(timeout);\n resolve(data);\n });\n\n this.socketManager.emitEvent('livekit_token');\n });\n }\n}\n"]}
|