@pipecat-ai/daily-transport 0.3.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.
package/README.md ADDED
@@ -0,0 +1,31 @@
1
+ # Pipecat's Real-Time Voice Inference - Daily Transport
2
+
3
+ [![Docs](https://img.shields.io/badge/documentation-blue)](https://docs.pipecat.ai/client/introduction)
4
+ ![NPM Version](https://img.shields.io/npm/v/@pipecat-ai/daily-transport)
5
+
6
+ Daily transport package for use with `@pipecat-ai/client-js`.
7
+
8
+ ## How to use
9
+
10
+ #### Install relevant packages
11
+
12
+ ```bash
13
+ npm install @pipecat-ai/client-js @pipecat-ai/daily-transport
14
+ ```
15
+
16
+ #### Import and pass transport to your RTVI client
17
+ ```typescript
18
+ import { RTVIClient } from "@pipecat-ai/client-js";
19
+ import { DailyTransport } from "@pipecat-ai/daily-transport";
20
+
21
+ const rtviClient = new RTVIClient({
22
+ transport: new DailyTransport(),
23
+ // ... your RTVI config here
24
+ });
25
+
26
+ await rtviClient.connect();
27
+ ```
28
+
29
+ ###Documentation
30
+
31
+ Please refer to the RTVI documentation [here](https://docs.pipecat.ai/client/introduction).
@@ -0,0 +1,36 @@
1
+ import { DailyFactoryOptions, DailyMediaDeviceInfo } from "@daily-co/daily-js";
2
+ import { RTVIClientOptions, RTVIMessage, Tracks, Transport, TransportState } from "@pipecat-ai/client-js";
3
+ export interface DailyTransportAuthBundle {
4
+ room_url: string;
5
+ token: string;
6
+ }
7
+ export interface DailyTransportConstructorOptions {
8
+ dailyFactoryOptions?: DailyFactoryOptions;
9
+ }
10
+ export class DailyTransport extends Transport {
11
+ constructor({ dailyFactoryOptions, }?: DailyTransportConstructorOptions);
12
+ initialize(options: RTVIClientOptions, messageHandler: (ev: RTVIMessage) => void): void;
13
+ get state(): TransportState;
14
+ private set state(value);
15
+ getAllCams(): Promise<DailyMediaDeviceInfo[]>;
16
+ updateCam(camId: string): void;
17
+ get selectedCam(): MediaDeviceInfo | Record<string, never>;
18
+ getAllMics(): Promise<DailyMediaDeviceInfo[]>;
19
+ updateMic(micId: string): void;
20
+ get selectedMic(): MediaDeviceInfo | Record<string, never>;
21
+ getAllSpeakers(): Promise<DailyMediaDeviceInfo[]>;
22
+ updateSpeaker(speakerId: string): void;
23
+ get selectedSpeaker(): MediaDeviceInfo | Record<string, never>;
24
+ enableMic(enable: boolean): void;
25
+ get isMicEnabled(): boolean;
26
+ enableCam(enable: boolean): void;
27
+ get isCamEnabled(): boolean;
28
+ tracks(): Tracks;
29
+ initDevices(): Promise<void>;
30
+ connect(authBundle: DailyTransportAuthBundle, abortController: AbortController): Promise<void>;
31
+ sendReadyMessage(): Promise<void>;
32
+ disconnect(): Promise<void>;
33
+ sendMessage(message: RTVIMessage): void;
34
+ }
35
+
36
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"mappings":";;AAyBA;IACE,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;AAED;IACE,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;CAC3C;AAED,2BAA4B,SAAQ,SAAS;gBAQ/B,EACV,mBAAwB,GACzB,GAAE,gCAAqC;IAKjC,UAAU,CACf,OAAO,EAAE,iBAAiB,EAC1B,cAAc,EAAE,CAAC,EAAE,EAAE,WAAW,KAAK,IAAI,GACxC,IAAI;IAyBP,IAAI,KAAK,IAAI,cAAc,CAE1B;IAED,OAAO,KAAK,KAAK,QAKhB;IAEK,UAAU;IAKhB,SAAS,CAAC,KAAK,EAAE,MAAM;IAUvB,IAAI,WAAW,4CAEd;IAEK,UAAU;IAKhB,SAAS,CAAC,KAAK,EAAE,MAAM;IAUvB,IAAI,WAAW,4CAEd;IAEK,cAAc;IAKpB,aAAa,CAAC,SAAS,EAAE,MAAM;IAQ/B,IAAI,eAAe,4CAElB;IAED,SAAS,CAAC,MAAM,EAAE,OAAO;IAIzB,IAAI,YAAY,YAEf;IAED,SAAS,CAAC,MAAM,EAAE,OAAO;IAIzB,IAAI,YAAY,YAEf;IAED,MAAM;IAqBA,WAAW;IA+BX,OAAO,CACX,UAAU,EAAE,wBAAwB,EACpC,eAAe,EAAE,eAAe;IAgC5B,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IAwCjC,UAAU;IAQT,WAAW,CAAC,OAAO,EAAE,WAAW;CA4GxC","sources":["transports/daily/src/src/transport.ts","transports/daily/src/src/index.ts","transports/daily/src/index.ts"],"sourcesContent":[null,null,"export * from \"./transport\";\n"],"names":[],"version":3,"file":"index.d.ts.map"}
package/dist/index.js ADDED
@@ -0,0 +1,287 @@
1
+ var $jrPAn$dailycodailyjs = require("@daily-co/daily-js");
2
+ var $jrPAn$pipecataiclientjs = require("@pipecat-ai/client-js");
3
+
4
+
5
+ function $parcel$exportWildcard(dest, source) {
6
+ Object.keys(source).forEach(function(key) {
7
+ if (key === 'default' || key === '__esModule' || Object.prototype.hasOwnProperty.call(dest, key)) {
8
+ return;
9
+ }
10
+
11
+ Object.defineProperty(dest, key, {
12
+ enumerable: true,
13
+ get: function get() {
14
+ return source[key];
15
+ }
16
+ });
17
+ });
18
+
19
+ return dest;
20
+ }
21
+
22
+ function $parcel$interopDefault(a) {
23
+ return a && a.__esModule ? a.default : a;
24
+ }
25
+
26
+ function $parcel$export(e, n, v, s) {
27
+ Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});
28
+ }
29
+ var $28bdeb35415d61e8$exports = {};
30
+
31
+ $parcel$export($28bdeb35415d61e8$exports, "DailyTransport", () => $28bdeb35415d61e8$export$b1ca982aa1e488c1);
32
+
33
+
34
+ class $28bdeb35415d61e8$export$b1ca982aa1e488c1 extends (0, $jrPAn$pipecataiclientjs.Transport) {
35
+ constructor({ dailyFactoryOptions: dailyFactoryOptions = {} } = {}){
36
+ super();
37
+ this._botId = "";
38
+ this._selectedCam = {};
39
+ this._selectedMic = {};
40
+ this._selectedSpeaker = {};
41
+ this._dailyFactoryOptions = dailyFactoryOptions;
42
+ }
43
+ initialize(options, messageHandler) {
44
+ this._callbacks = options.callbacks ?? {};
45
+ this._onMessage = messageHandler;
46
+ const existingInstance = (0, ($parcel$interopDefault($jrPAn$dailycodailyjs))).getCallInstance();
47
+ if (existingInstance) existingInstance.destroy();
48
+ this._daily = (0, ($parcel$interopDefault($jrPAn$dailycodailyjs))).createCallObject({
49
+ ...this._dailyFactoryOptions,
50
+ // Default is cam off
51
+ startVideoOff: options.enableCam != true,
52
+ // Default is mic on
53
+ startAudioOff: options.enableMic == false,
54
+ allowMultipleCallInstances: true
55
+ });
56
+ this.attachEventListeners();
57
+ this.state = "disconnected";
58
+ (0, $jrPAn$pipecataiclientjs.logger).debug("[RTVI Transport] Initialized");
59
+ }
60
+ get state() {
61
+ return this._state;
62
+ }
63
+ set state(state) {
64
+ if (this._state === state) return;
65
+ this._state = state;
66
+ this._callbacks.onTransportStateChanged?.(state);
67
+ }
68
+ async getAllCams() {
69
+ const { devices: devices } = await this._daily.enumerateDevices();
70
+ return devices.filter((d)=>d.kind === "videoinput");
71
+ }
72
+ updateCam(camId) {
73
+ this._daily.setInputDevicesAsync({
74
+ videoDeviceId: camId
75
+ }).then((infos)=>{
76
+ this._selectedCam = infos.camera;
77
+ });
78
+ }
79
+ get selectedCam() {
80
+ return this._selectedCam;
81
+ }
82
+ async getAllMics() {
83
+ const { devices: devices } = await this._daily.enumerateDevices();
84
+ return devices.filter((d)=>d.kind === "audioinput");
85
+ }
86
+ updateMic(micId) {
87
+ this._daily.setInputDevicesAsync({
88
+ audioDeviceId: micId
89
+ }).then((infos)=>{
90
+ this._selectedMic = infos.mic;
91
+ });
92
+ }
93
+ get selectedMic() {
94
+ return this._selectedMic;
95
+ }
96
+ async getAllSpeakers() {
97
+ const { devices: devices } = await this._daily.enumerateDevices();
98
+ return devices.filter((d)=>d.kind === "audiooutput");
99
+ }
100
+ updateSpeaker(speakerId) {
101
+ this._daily.setOutputDeviceAsync({
102
+ outputDeviceId: speakerId
103
+ }).then((infos)=>{
104
+ this._selectedSpeaker = infos.speaker;
105
+ });
106
+ }
107
+ get selectedSpeaker() {
108
+ return this._selectedSpeaker;
109
+ }
110
+ enableMic(enable) {
111
+ this._daily.setLocalAudio(enable);
112
+ }
113
+ get isMicEnabled() {
114
+ return this._daily.localAudio();
115
+ }
116
+ enableCam(enable) {
117
+ this._daily.setLocalVideo(enable);
118
+ }
119
+ get isCamEnabled() {
120
+ return this._daily.localVideo();
121
+ }
122
+ tracks() {
123
+ const participants = this._daily?.participants() ?? {};
124
+ const bot = participants?.[this._botId];
125
+ const tracks = {
126
+ local: {
127
+ audio: participants?.local?.tracks?.audio?.persistentTrack,
128
+ video: participants?.local?.tracks?.video?.persistentTrack
129
+ }
130
+ };
131
+ if (bot) tracks.bot = {
132
+ audio: bot?.tracks?.audio?.persistentTrack,
133
+ video: bot?.tracks?.video?.persistentTrack
134
+ };
135
+ return tracks;
136
+ }
137
+ async initDevices() {
138
+ if (!this._daily) throw new (0, $jrPAn$pipecataiclientjs.RTVIError)("Transport instance not initialized");
139
+ this.state = "initializing";
140
+ const infos = await this._daily.startCamera();
141
+ const { devices: devices } = await this._daily.enumerateDevices();
142
+ const cams = devices.filter((d)=>d.kind === "videoinput");
143
+ const mics = devices.filter((d)=>d.kind === "audioinput");
144
+ const speakers = devices.filter((d)=>d.kind === "audiooutput");
145
+ this._callbacks.onAvailableCamsUpdated?.(cams);
146
+ this._callbacks.onAvailableMicsUpdated?.(mics);
147
+ this._callbacks.onAvailableSpeakersUpdated?.(speakers);
148
+ this._selectedCam = infos.camera;
149
+ this._callbacks.onCamUpdated?.(infos.camera);
150
+ this._selectedMic = infos.mic;
151
+ this._callbacks.onMicUpdated?.(infos.mic);
152
+ this._selectedSpeaker = infos.speaker;
153
+ this._callbacks.onSpeakerUpdated?.(infos.speaker);
154
+ // Instantiate audio observers
155
+ if (!this._daily.isLocalAudioLevelObserverRunning()) await this._daily.startLocalAudioLevelObserver(100);
156
+ if (!this._daily.isRemoteParticipantsAudioLevelObserverRunning()) await this._daily.startRemoteParticipantsAudioLevelObserver(100);
157
+ this.state = "initialized";
158
+ }
159
+ async connect(authBundle, abortController) {
160
+ if (!this._daily) throw new (0, $jrPAn$pipecataiclientjs.RTVIError)("Transport instance not initialized");
161
+ if (abortController.signal.aborted) return;
162
+ this.state = "connecting";
163
+ try {
164
+ await this._daily.join({
165
+ url: authBundle.room_url,
166
+ token: authBundle.token
167
+ });
168
+ const room = await this._daily.room();
169
+ if (room && "id" in room) this._expiry = room.config?.exp;
170
+ } catch (e) {
171
+ this.state = "error";
172
+ throw new (0, $jrPAn$pipecataiclientjs.TransportStartError)();
173
+ }
174
+ if (abortController.signal.aborted) return;
175
+ this.state = "connected";
176
+ this._callbacks.onConnected?.();
177
+ }
178
+ async sendReadyMessage() {
179
+ return new Promise((resolve)=>{
180
+ (async ()=>{
181
+ this._daily.on("track-started", (ev)=>{
182
+ if (!ev.participant?.local) {
183
+ this.state = "ready";
184
+ this.sendMessage((0, $jrPAn$pipecataiclientjs.RTVIMessage).clientReady());
185
+ resolve();
186
+ }
187
+ });
188
+ })();
189
+ });
190
+ }
191
+ attachEventListeners() {
192
+ this._daily.on("available-devices-updated", this.handleAvailableDevicesUpdated.bind(this));
193
+ this._daily.on("selected-devices-updated", this.handleSelectedDevicesUpdated.bind(this));
194
+ this._daily.on("track-started", this.handleTrackStarted.bind(this));
195
+ this._daily.on("track-stopped", this.handleTrackStopped.bind(this));
196
+ this._daily.on("participant-joined", this.handleParticipantJoined.bind(this));
197
+ this._daily.on("participant-left", this.handleParticipantLeft.bind(this));
198
+ this._daily.on("local-audio-level", this.handleLocalAudioLevel.bind(this));
199
+ this._daily.on("remote-participants-audio-level", this.handleRemoteAudioLevel.bind(this));
200
+ this._daily.on("app-message", this.handleAppMessage.bind(this));
201
+ this._daily.on("left-meeting", this.handleLeftMeeting.bind(this));
202
+ }
203
+ async disconnect() {
204
+ this._daily.stopLocalAudioLevelObserver();
205
+ this._daily.stopRemoteParticipantsAudioLevelObserver();
206
+ await this._daily.leave();
207
+ await this._daily.destroy();
208
+ }
209
+ sendMessage(message) {
210
+ this._daily.sendAppMessage(message, "*");
211
+ }
212
+ handleAppMessage(ev) {
213
+ // Bubble any messages with rtvi-ai label
214
+ if (ev.data.label === "rtvi-ai") this._onMessage({
215
+ id: ev.data.id,
216
+ type: ev.data.type,
217
+ data: ev.data.data
218
+ });
219
+ }
220
+ handleAvailableDevicesUpdated(ev) {
221
+ this._callbacks.onAvailableCamsUpdated?.(ev.availableDevices.filter((d)=>d.kind === "videoinput"));
222
+ this._callbacks.onAvailableMicsUpdated?.(ev.availableDevices.filter((d)=>d.kind === "audioinput"));
223
+ this._callbacks.onAvailableSpeakersUpdated?.(ev.availableDevices.filter((d)=>d.kind === "audiooutput"));
224
+ }
225
+ handleSelectedDevicesUpdated(ev) {
226
+ if (this._selectedCam?.deviceId !== ev.devices.camera) {
227
+ this._selectedCam = ev.devices.camera;
228
+ this._callbacks.onCamUpdated?.(ev.devices.camera);
229
+ }
230
+ if (this._selectedMic?.deviceId !== ev.devices.mic) {
231
+ this._selectedMic = ev.devices.mic;
232
+ this._callbacks.onMicUpdated?.(ev.devices.mic);
233
+ }
234
+ if (this._selectedSpeaker?.deviceId !== ev.devices.speaker) {
235
+ this._selectedSpeaker = ev.devices.speaker;
236
+ this._callbacks.onSpeakerUpdated?.(ev.devices.speaker);
237
+ }
238
+ }
239
+ handleTrackStarted(ev) {
240
+ this._callbacks.onTrackStarted?.(ev.track, ev.participant ? $28bdeb35415d61e8$var$dailyParticipantToParticipant(ev.participant) : undefined);
241
+ }
242
+ handleTrackStopped(ev) {
243
+ this._callbacks.onTrackStopped?.(ev.track, ev.participant ? $28bdeb35415d61e8$var$dailyParticipantToParticipant(ev.participant) : undefined);
244
+ }
245
+ handleParticipantJoined(ev) {
246
+ const p = $28bdeb35415d61e8$var$dailyParticipantToParticipant(ev.participant);
247
+ this._callbacks.onParticipantJoined?.(p);
248
+ if (p.local) return;
249
+ this._botId = ev.participant.session_id;
250
+ this._callbacks.onBotConnected?.(p);
251
+ }
252
+ handleParticipantLeft(ev) {
253
+ const p = $28bdeb35415d61e8$var$dailyParticipantToParticipant(ev.participant);
254
+ this._callbacks.onParticipantLeft?.(p);
255
+ if (p.local) return;
256
+ this._botId = "";
257
+ this._callbacks.onBotDisconnected?.(p);
258
+ }
259
+ handleLocalAudioLevel(ev) {
260
+ this._callbacks.onLocalAudioLevel?.(ev.audioLevel);
261
+ }
262
+ handleRemoteAudioLevel(ev) {
263
+ const participants = this._daily.participants();
264
+ const ids = Object.keys(ev.participantsAudioLevel);
265
+ for(let i = 0; i < ids.length; i++){
266
+ const id = ids[i];
267
+ const level = ev.participantsAudioLevel[id];
268
+ this._callbacks.onRemoteAudioLevel?.(level, $28bdeb35415d61e8$var$dailyParticipantToParticipant(participants[id]));
269
+ }
270
+ }
271
+ handleLeftMeeting() {
272
+ this.state = "disconnecting";
273
+ this._botId = "";
274
+ this._callbacks.onDisconnected?.();
275
+ }
276
+ }
277
+ const $28bdeb35415d61e8$var$dailyParticipantToParticipant = (p)=>({
278
+ id: p.user_id,
279
+ local: p.local,
280
+ name: p.user_name
281
+ });
282
+
283
+
284
+ $parcel$exportWildcard(module.exports, $28bdeb35415d61e8$exports);
285
+
286
+
287
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"mappings":"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","sources":["transports/daily/src/index.ts","transports/daily/src/transport.ts"],"sourcesContent":["export * from \"./transport\";\n","import Daily, {\n DailyCall,\n DailyEventObjectAppMessage,\n DailyEventObjectAvailableDevicesUpdated,\n DailyEventObjectLocalAudioLevel,\n DailyEventObjectParticipant,\n DailyEventObjectParticipantLeft,\n DailyEventObjectRemoteParticipantsAudioLevel,\n DailyEventObjectSelectedDevicesUpdated,\n DailyEventObjectTrack,\n DailyFactoryOptions,\n DailyParticipant,\n} from \"@daily-co/daily-js\";\nimport {\n Participant,\n RTVIClientOptions,\n RTVIError,\n RTVIMessage,\n Tracks,\n Transport,\n TransportStartError,\n TransportState,\n logger,\n} from \"@pipecat-ai/client-js\";\n\nexport interface DailyTransportAuthBundle {\n room_url: string;\n token: string;\n}\n\nexport interface DailyTransportConstructorOptions {\n dailyFactoryOptions?: DailyFactoryOptions;\n}\n\nexport class DailyTransport extends Transport {\n private declare _daily: DailyCall;\n private _dailyFactoryOptions: DailyFactoryOptions;\n private _botId: string = \"\";\n private _selectedCam: MediaDeviceInfo | Record<string, never> = {};\n private _selectedMic: MediaDeviceInfo | Record<string, never> = {};\n private _selectedSpeaker: MediaDeviceInfo | Record<string, never> = {};\n\n constructor({\n dailyFactoryOptions = {},\n }: DailyTransportConstructorOptions = {}) {\n super();\n this._dailyFactoryOptions = dailyFactoryOptions;\n }\n\n public initialize(\n options: RTVIClientOptions,\n messageHandler: (ev: RTVIMessage) => void\n ): void {\n this._callbacks = options.callbacks ?? {};\n this._onMessage = messageHandler;\n\n const existingInstance = Daily.getCallInstance();\n if (existingInstance) {\n void existingInstance.destroy();\n }\n\n this._daily = Daily.createCallObject({\n ...this._dailyFactoryOptions,\n // Default is cam off\n startVideoOff: options.enableCam != true,\n // Default is mic on\n startAudioOff: options.enableMic == false,\n allowMultipleCallInstances: true,\n });\n\n this.attachEventListeners();\n\n this.state = \"disconnected\";\n\n logger.debug(\"[RTVI Transport] Initialized\");\n }\n\n get state(): TransportState {\n return this._state;\n }\n\n private set state(state: TransportState) {\n if (this._state === state) return;\n\n this._state = state;\n this._callbacks.onTransportStateChanged?.(state);\n }\n\n async getAllCams() {\n const { devices } = await this._daily.enumerateDevices();\n return devices.filter((d) => d.kind === \"videoinput\");\n }\n\n updateCam(camId: string) {\n this._daily\n .setInputDevicesAsync({\n videoDeviceId: camId,\n })\n .then((infos) => {\n this._selectedCam = infos.camera;\n });\n }\n\n get selectedCam() {\n return this._selectedCam;\n }\n\n async getAllMics() {\n const { devices } = await this._daily.enumerateDevices();\n return devices.filter((d) => d.kind === \"audioinput\");\n }\n\n updateMic(micId: string) {\n this._daily\n .setInputDevicesAsync({\n audioDeviceId: micId,\n })\n .then((infos) => {\n this._selectedMic = infos.mic;\n });\n }\n\n get selectedMic() {\n return this._selectedMic;\n }\n\n async getAllSpeakers() {\n const { devices } = await this._daily.enumerateDevices();\n return devices.filter((d) => d.kind === \"audiooutput\");\n }\n\n updateSpeaker(speakerId: string) {\n this._daily\n .setOutputDeviceAsync({ outputDeviceId: speakerId })\n .then((infos) => {\n this._selectedSpeaker = infos.speaker;\n });\n }\n\n get selectedSpeaker() {\n return this._selectedSpeaker;\n }\n\n enableMic(enable: boolean) {\n this._daily.setLocalAudio(enable);\n }\n\n get isMicEnabled() {\n return this._daily.localAudio();\n }\n\n enableCam(enable: boolean) {\n this._daily.setLocalVideo(enable);\n }\n\n get isCamEnabled() {\n return this._daily.localVideo();\n }\n\n tracks() {\n const participants = this._daily?.participants() ?? {};\n const bot = participants?.[this._botId];\n\n const tracks: Tracks = {\n local: {\n audio: participants?.local?.tracks?.audio?.persistentTrack,\n video: participants?.local?.tracks?.video?.persistentTrack,\n },\n };\n\n if (bot) {\n tracks.bot = {\n audio: bot?.tracks?.audio?.persistentTrack,\n video: bot?.tracks?.video?.persistentTrack,\n };\n }\n\n return tracks;\n }\n\n async initDevices() {\n if (!this._daily) {\n throw new RTVIError(\"Transport instance not initialized\");\n }\n\n this.state = \"initializing\";\n\n const infos = await this._daily.startCamera();\n const { devices } = await this._daily.enumerateDevices();\n const cams = devices.filter((d) => d.kind === \"videoinput\");\n const mics = devices.filter((d) => d.kind === \"audioinput\");\n const speakers = devices.filter((d) => d.kind === \"audiooutput\");\n this._callbacks.onAvailableCamsUpdated?.(cams);\n this._callbacks.onAvailableMicsUpdated?.(mics);\n this._callbacks.onAvailableSpeakersUpdated?.(speakers);\n this._selectedCam = infos.camera;\n this._callbacks.onCamUpdated?.(infos.camera as MediaDeviceInfo);\n this._selectedMic = infos.mic;\n this._callbacks.onMicUpdated?.(infos.mic as MediaDeviceInfo);\n this._selectedSpeaker = infos.speaker;\n this._callbacks.onSpeakerUpdated?.(infos.speaker as MediaDeviceInfo);\n\n // Instantiate audio observers\n if (!this._daily.isLocalAudioLevelObserverRunning())\n await this._daily.startLocalAudioLevelObserver(100);\n if (!this._daily.isRemoteParticipantsAudioLevelObserverRunning())\n await this._daily.startRemoteParticipantsAudioLevelObserver(100);\n\n this.state = \"initialized\";\n }\n\n async connect(\n authBundle: DailyTransportAuthBundle,\n abortController: AbortController\n ) {\n if (!this._daily) {\n throw new RTVIError(\"Transport instance not initialized\");\n }\n\n if (abortController.signal.aborted) return;\n\n this.state = \"connecting\";\n\n try {\n await this._daily.join({\n url: authBundle.room_url,\n token: authBundle.token,\n });\n\n const room = await this._daily.room();\n if (room && \"id\" in room) {\n this._expiry = room.config?.exp;\n }\n } catch (e) {\n this.state = \"error\";\n throw new TransportStartError();\n }\n\n if (abortController.signal.aborted) return;\n\n this.state = \"connected\";\n\n this._callbacks.onConnected?.();\n }\n\n async sendReadyMessage(): Promise<void> {\n return new Promise<void>((resolve) => {\n (async () => {\n this._daily.on(\"track-started\", (ev) => {\n if (!ev.participant?.local) {\n this.state = \"ready\";\n this.sendMessage(RTVIMessage.clientReady());\n resolve();\n }\n });\n })();\n });\n }\n\n private attachEventListeners() {\n this._daily.on(\n \"available-devices-updated\",\n this.handleAvailableDevicesUpdated.bind(this)\n );\n this._daily.on(\n \"selected-devices-updated\",\n this.handleSelectedDevicesUpdated.bind(this)\n );\n\n this._daily.on(\"track-started\", this.handleTrackStarted.bind(this));\n this._daily.on(\"track-stopped\", this.handleTrackStopped.bind(this));\n this._daily.on(\n \"participant-joined\",\n this.handleParticipantJoined.bind(this)\n );\n this._daily.on(\"participant-left\", this.handleParticipantLeft.bind(this));\n this._daily.on(\"local-audio-level\", this.handleLocalAudioLevel.bind(this));\n this._daily.on(\n \"remote-participants-audio-level\",\n this.handleRemoteAudioLevel.bind(this)\n );\n this._daily.on(\"app-message\", this.handleAppMessage.bind(this));\n this._daily.on(\"left-meeting\", this.handleLeftMeeting.bind(this));\n }\n\n async disconnect() {\n this._daily.stopLocalAudioLevelObserver();\n this._daily.stopRemoteParticipantsAudioLevelObserver();\n\n await this._daily.leave();\n await this._daily.destroy();\n }\n\n public sendMessage(message: RTVIMessage) {\n this._daily.sendAppMessage(message, \"*\");\n }\n\n private handleAppMessage(ev: DailyEventObjectAppMessage) {\n // Bubble any messages with rtvi-ai label\n if (ev.data.label === \"rtvi-ai\") {\n this._onMessage({\n id: ev.data.id,\n type: ev.data.type,\n data: ev.data.data,\n } as RTVIMessage);\n }\n }\n\n private handleAvailableDevicesUpdated(\n ev: DailyEventObjectAvailableDevicesUpdated\n ) {\n this._callbacks.onAvailableCamsUpdated?.(\n ev.availableDevices.filter((d) => d.kind === \"videoinput\")\n );\n this._callbacks.onAvailableMicsUpdated?.(\n ev.availableDevices.filter((d) => d.kind === \"audioinput\")\n );\n this._callbacks.onAvailableSpeakersUpdated?.(\n ev.availableDevices.filter((d) => d.kind === \"audiooutput\")\n );\n }\n\n private handleSelectedDevicesUpdated(\n ev: DailyEventObjectSelectedDevicesUpdated\n ) {\n if (this._selectedCam?.deviceId !== ev.devices.camera) {\n this._selectedCam = ev.devices.camera;\n this._callbacks.onCamUpdated?.(ev.devices.camera as MediaDeviceInfo);\n }\n if (this._selectedMic?.deviceId !== ev.devices.mic) {\n this._selectedMic = ev.devices.mic;\n this._callbacks.onMicUpdated?.(ev.devices.mic as MediaDeviceInfo);\n }\n if (this._selectedSpeaker?.deviceId !== ev.devices.speaker) {\n this._selectedSpeaker = ev.devices.speaker;\n this._callbacks.onSpeakerUpdated?.(ev.devices.speaker as MediaDeviceInfo);\n }\n }\n\n private handleTrackStarted(ev: DailyEventObjectTrack) {\n this._callbacks.onTrackStarted?.(\n ev.track,\n ev.participant ? dailyParticipantToParticipant(ev.participant) : undefined\n );\n }\n\n private handleTrackStopped(ev: DailyEventObjectTrack) {\n this._callbacks.onTrackStopped?.(\n ev.track,\n ev.participant ? dailyParticipantToParticipant(ev.participant) : undefined\n );\n }\n\n private handleParticipantJoined(ev: DailyEventObjectParticipant) {\n const p = dailyParticipantToParticipant(ev.participant);\n\n this._callbacks.onParticipantJoined?.(p);\n\n if (p.local) return;\n\n this._botId = ev.participant.session_id;\n\n this._callbacks.onBotConnected?.(p);\n }\n\n private handleParticipantLeft(ev: DailyEventObjectParticipantLeft) {\n const p = dailyParticipantToParticipant(ev.participant);\n\n this._callbacks.onParticipantLeft?.(p);\n\n if (p.local) return;\n\n this._botId = \"\";\n\n this._callbacks.onBotDisconnected?.(p);\n }\n\n private handleLocalAudioLevel(ev: DailyEventObjectLocalAudioLevel) {\n this._callbacks.onLocalAudioLevel?.(ev.audioLevel);\n }\n\n private handleRemoteAudioLevel(\n ev: DailyEventObjectRemoteParticipantsAudioLevel\n ) {\n const participants = this._daily.participants();\n const ids = Object.keys(ev.participantsAudioLevel);\n for (let i = 0; i < ids.length; i++) {\n const id = ids[i];\n const level = ev.participantsAudioLevel[id];\n this._callbacks.onRemoteAudioLevel?.(\n level,\n dailyParticipantToParticipant(participants[id])\n );\n }\n }\n\n private handleLeftMeeting() {\n this.state = \"disconnecting\";\n this._botId = \"\";\n this._callbacks.onDisconnected?.();\n }\n}\n\nconst dailyParticipantToParticipant = (p: DailyParticipant): Participant => ({\n id: p.user_id,\n local: p.local,\n name: p.user_name,\n});\n"],"names":[],"version":3,"file":"index.js.map"}
@@ -0,0 +1,266 @@
1
+ import $7zbD8$dailycodailyjs from "@daily-co/daily-js";
2
+ import {logger as $7zbD8$logger, RTVIError as $7zbD8$RTVIError, TransportStartError as $7zbD8$TransportStartError, RTVIMessage as $7zbD8$RTVIMessage, Transport as $7zbD8$Transport} from "@pipecat-ai/client-js";
3
+
4
+
5
+ function $parcel$export(e, n, v, s) {
6
+ Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});
7
+ }
8
+ var $683f111f61e07358$exports = {};
9
+
10
+ $parcel$export($683f111f61e07358$exports, "DailyTransport", () => $683f111f61e07358$export$b1ca982aa1e488c1);
11
+
12
+
13
+ class $683f111f61e07358$export$b1ca982aa1e488c1 extends (0, $7zbD8$Transport) {
14
+ constructor({ dailyFactoryOptions: dailyFactoryOptions = {} } = {}){
15
+ super();
16
+ this._botId = "";
17
+ this._selectedCam = {};
18
+ this._selectedMic = {};
19
+ this._selectedSpeaker = {};
20
+ this._dailyFactoryOptions = dailyFactoryOptions;
21
+ }
22
+ initialize(options, messageHandler) {
23
+ this._callbacks = options.callbacks ?? {};
24
+ this._onMessage = messageHandler;
25
+ const existingInstance = (0, $7zbD8$dailycodailyjs).getCallInstance();
26
+ if (existingInstance) existingInstance.destroy();
27
+ this._daily = (0, $7zbD8$dailycodailyjs).createCallObject({
28
+ ...this._dailyFactoryOptions,
29
+ // Default is cam off
30
+ startVideoOff: options.enableCam != true,
31
+ // Default is mic on
32
+ startAudioOff: options.enableMic == false,
33
+ allowMultipleCallInstances: true
34
+ });
35
+ this.attachEventListeners();
36
+ this.state = "disconnected";
37
+ (0, $7zbD8$logger).debug("[RTVI Transport] Initialized");
38
+ }
39
+ get state() {
40
+ return this._state;
41
+ }
42
+ set state(state) {
43
+ if (this._state === state) return;
44
+ this._state = state;
45
+ this._callbacks.onTransportStateChanged?.(state);
46
+ }
47
+ async getAllCams() {
48
+ const { devices: devices } = await this._daily.enumerateDevices();
49
+ return devices.filter((d)=>d.kind === "videoinput");
50
+ }
51
+ updateCam(camId) {
52
+ this._daily.setInputDevicesAsync({
53
+ videoDeviceId: camId
54
+ }).then((infos)=>{
55
+ this._selectedCam = infos.camera;
56
+ });
57
+ }
58
+ get selectedCam() {
59
+ return this._selectedCam;
60
+ }
61
+ async getAllMics() {
62
+ const { devices: devices } = await this._daily.enumerateDevices();
63
+ return devices.filter((d)=>d.kind === "audioinput");
64
+ }
65
+ updateMic(micId) {
66
+ this._daily.setInputDevicesAsync({
67
+ audioDeviceId: micId
68
+ }).then((infos)=>{
69
+ this._selectedMic = infos.mic;
70
+ });
71
+ }
72
+ get selectedMic() {
73
+ return this._selectedMic;
74
+ }
75
+ async getAllSpeakers() {
76
+ const { devices: devices } = await this._daily.enumerateDevices();
77
+ return devices.filter((d)=>d.kind === "audiooutput");
78
+ }
79
+ updateSpeaker(speakerId) {
80
+ this._daily.setOutputDeviceAsync({
81
+ outputDeviceId: speakerId
82
+ }).then((infos)=>{
83
+ this._selectedSpeaker = infos.speaker;
84
+ });
85
+ }
86
+ get selectedSpeaker() {
87
+ return this._selectedSpeaker;
88
+ }
89
+ enableMic(enable) {
90
+ this._daily.setLocalAudio(enable);
91
+ }
92
+ get isMicEnabled() {
93
+ return this._daily.localAudio();
94
+ }
95
+ enableCam(enable) {
96
+ this._daily.setLocalVideo(enable);
97
+ }
98
+ get isCamEnabled() {
99
+ return this._daily.localVideo();
100
+ }
101
+ tracks() {
102
+ const participants = this._daily?.participants() ?? {};
103
+ const bot = participants?.[this._botId];
104
+ const tracks = {
105
+ local: {
106
+ audio: participants?.local?.tracks?.audio?.persistentTrack,
107
+ video: participants?.local?.tracks?.video?.persistentTrack
108
+ }
109
+ };
110
+ if (bot) tracks.bot = {
111
+ audio: bot?.tracks?.audio?.persistentTrack,
112
+ video: bot?.tracks?.video?.persistentTrack
113
+ };
114
+ return tracks;
115
+ }
116
+ async initDevices() {
117
+ if (!this._daily) throw new (0, $7zbD8$RTVIError)("Transport instance not initialized");
118
+ this.state = "initializing";
119
+ const infos = await this._daily.startCamera();
120
+ const { devices: devices } = await this._daily.enumerateDevices();
121
+ const cams = devices.filter((d)=>d.kind === "videoinput");
122
+ const mics = devices.filter((d)=>d.kind === "audioinput");
123
+ const speakers = devices.filter((d)=>d.kind === "audiooutput");
124
+ this._callbacks.onAvailableCamsUpdated?.(cams);
125
+ this._callbacks.onAvailableMicsUpdated?.(mics);
126
+ this._callbacks.onAvailableSpeakersUpdated?.(speakers);
127
+ this._selectedCam = infos.camera;
128
+ this._callbacks.onCamUpdated?.(infos.camera);
129
+ this._selectedMic = infos.mic;
130
+ this._callbacks.onMicUpdated?.(infos.mic);
131
+ this._selectedSpeaker = infos.speaker;
132
+ this._callbacks.onSpeakerUpdated?.(infos.speaker);
133
+ // Instantiate audio observers
134
+ if (!this._daily.isLocalAudioLevelObserverRunning()) await this._daily.startLocalAudioLevelObserver(100);
135
+ if (!this._daily.isRemoteParticipantsAudioLevelObserverRunning()) await this._daily.startRemoteParticipantsAudioLevelObserver(100);
136
+ this.state = "initialized";
137
+ }
138
+ async connect(authBundle, abortController) {
139
+ if (!this._daily) throw new (0, $7zbD8$RTVIError)("Transport instance not initialized");
140
+ if (abortController.signal.aborted) return;
141
+ this.state = "connecting";
142
+ try {
143
+ await this._daily.join({
144
+ url: authBundle.room_url,
145
+ token: authBundle.token
146
+ });
147
+ const room = await this._daily.room();
148
+ if (room && "id" in room) this._expiry = room.config?.exp;
149
+ } catch (e) {
150
+ this.state = "error";
151
+ throw new (0, $7zbD8$TransportStartError)();
152
+ }
153
+ if (abortController.signal.aborted) return;
154
+ this.state = "connected";
155
+ this._callbacks.onConnected?.();
156
+ }
157
+ async sendReadyMessage() {
158
+ return new Promise((resolve)=>{
159
+ (async ()=>{
160
+ this._daily.on("track-started", (ev)=>{
161
+ if (!ev.participant?.local) {
162
+ this.state = "ready";
163
+ this.sendMessage((0, $7zbD8$RTVIMessage).clientReady());
164
+ resolve();
165
+ }
166
+ });
167
+ })();
168
+ });
169
+ }
170
+ attachEventListeners() {
171
+ this._daily.on("available-devices-updated", this.handleAvailableDevicesUpdated.bind(this));
172
+ this._daily.on("selected-devices-updated", this.handleSelectedDevicesUpdated.bind(this));
173
+ this._daily.on("track-started", this.handleTrackStarted.bind(this));
174
+ this._daily.on("track-stopped", this.handleTrackStopped.bind(this));
175
+ this._daily.on("participant-joined", this.handleParticipantJoined.bind(this));
176
+ this._daily.on("participant-left", this.handleParticipantLeft.bind(this));
177
+ this._daily.on("local-audio-level", this.handleLocalAudioLevel.bind(this));
178
+ this._daily.on("remote-participants-audio-level", this.handleRemoteAudioLevel.bind(this));
179
+ this._daily.on("app-message", this.handleAppMessage.bind(this));
180
+ this._daily.on("left-meeting", this.handleLeftMeeting.bind(this));
181
+ }
182
+ async disconnect() {
183
+ this._daily.stopLocalAudioLevelObserver();
184
+ this._daily.stopRemoteParticipantsAudioLevelObserver();
185
+ await this._daily.leave();
186
+ await this._daily.destroy();
187
+ }
188
+ sendMessage(message) {
189
+ this._daily.sendAppMessage(message, "*");
190
+ }
191
+ handleAppMessage(ev) {
192
+ // Bubble any messages with rtvi-ai label
193
+ if (ev.data.label === "rtvi-ai") this._onMessage({
194
+ id: ev.data.id,
195
+ type: ev.data.type,
196
+ data: ev.data.data
197
+ });
198
+ }
199
+ handleAvailableDevicesUpdated(ev) {
200
+ this._callbacks.onAvailableCamsUpdated?.(ev.availableDevices.filter((d)=>d.kind === "videoinput"));
201
+ this._callbacks.onAvailableMicsUpdated?.(ev.availableDevices.filter((d)=>d.kind === "audioinput"));
202
+ this._callbacks.onAvailableSpeakersUpdated?.(ev.availableDevices.filter((d)=>d.kind === "audiooutput"));
203
+ }
204
+ handleSelectedDevicesUpdated(ev) {
205
+ if (this._selectedCam?.deviceId !== ev.devices.camera) {
206
+ this._selectedCam = ev.devices.camera;
207
+ this._callbacks.onCamUpdated?.(ev.devices.camera);
208
+ }
209
+ if (this._selectedMic?.deviceId !== ev.devices.mic) {
210
+ this._selectedMic = ev.devices.mic;
211
+ this._callbacks.onMicUpdated?.(ev.devices.mic);
212
+ }
213
+ if (this._selectedSpeaker?.deviceId !== ev.devices.speaker) {
214
+ this._selectedSpeaker = ev.devices.speaker;
215
+ this._callbacks.onSpeakerUpdated?.(ev.devices.speaker);
216
+ }
217
+ }
218
+ handleTrackStarted(ev) {
219
+ this._callbacks.onTrackStarted?.(ev.track, ev.participant ? $683f111f61e07358$var$dailyParticipantToParticipant(ev.participant) : undefined);
220
+ }
221
+ handleTrackStopped(ev) {
222
+ this._callbacks.onTrackStopped?.(ev.track, ev.participant ? $683f111f61e07358$var$dailyParticipantToParticipant(ev.participant) : undefined);
223
+ }
224
+ handleParticipantJoined(ev) {
225
+ const p = $683f111f61e07358$var$dailyParticipantToParticipant(ev.participant);
226
+ this._callbacks.onParticipantJoined?.(p);
227
+ if (p.local) return;
228
+ this._botId = ev.participant.session_id;
229
+ this._callbacks.onBotConnected?.(p);
230
+ }
231
+ handleParticipantLeft(ev) {
232
+ const p = $683f111f61e07358$var$dailyParticipantToParticipant(ev.participant);
233
+ this._callbacks.onParticipantLeft?.(p);
234
+ if (p.local) return;
235
+ this._botId = "";
236
+ this._callbacks.onBotDisconnected?.(p);
237
+ }
238
+ handleLocalAudioLevel(ev) {
239
+ this._callbacks.onLocalAudioLevel?.(ev.audioLevel);
240
+ }
241
+ handleRemoteAudioLevel(ev) {
242
+ const participants = this._daily.participants();
243
+ const ids = Object.keys(ev.participantsAudioLevel);
244
+ for(let i = 0; i < ids.length; i++){
245
+ const id = ids[i];
246
+ const level = ev.participantsAudioLevel[id];
247
+ this._callbacks.onRemoteAudioLevel?.(level, $683f111f61e07358$var$dailyParticipantToParticipant(participants[id]));
248
+ }
249
+ }
250
+ handleLeftMeeting() {
251
+ this.state = "disconnecting";
252
+ this._botId = "";
253
+ this._callbacks.onDisconnected?.();
254
+ }
255
+ }
256
+ const $683f111f61e07358$var$dailyParticipantToParticipant = (p)=>({
257
+ id: p.user_id,
258
+ local: p.local,
259
+ name: p.user_name
260
+ });
261
+
262
+
263
+
264
+
265
+ export {$683f111f61e07358$export$b1ca982aa1e488c1 as DailyTransport};
266
+ //# sourceMappingURL=index.module.js.map
@@ -0,0 +1 @@
1
+ {"mappings":"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","sources":["transports/daily/src/index.ts","transports/daily/src/transport.ts"],"sourcesContent":["export * from \"./transport\";\n","import Daily, {\n DailyCall,\n DailyEventObjectAppMessage,\n DailyEventObjectAvailableDevicesUpdated,\n DailyEventObjectLocalAudioLevel,\n DailyEventObjectParticipant,\n DailyEventObjectParticipantLeft,\n DailyEventObjectRemoteParticipantsAudioLevel,\n DailyEventObjectSelectedDevicesUpdated,\n DailyEventObjectTrack,\n DailyFactoryOptions,\n DailyParticipant,\n} from \"@daily-co/daily-js\";\nimport {\n Participant,\n RTVIClientOptions,\n RTVIError,\n RTVIMessage,\n Tracks,\n Transport,\n TransportStartError,\n TransportState,\n logger,\n} from \"@pipecat-ai/client-js\";\n\nexport interface DailyTransportAuthBundle {\n room_url: string;\n token: string;\n}\n\nexport interface DailyTransportConstructorOptions {\n dailyFactoryOptions?: DailyFactoryOptions;\n}\n\nexport class DailyTransport extends Transport {\n private declare _daily: DailyCall;\n private _dailyFactoryOptions: DailyFactoryOptions;\n private _botId: string = \"\";\n private _selectedCam: MediaDeviceInfo | Record<string, never> = {};\n private _selectedMic: MediaDeviceInfo | Record<string, never> = {};\n private _selectedSpeaker: MediaDeviceInfo | Record<string, never> = {};\n\n constructor({\n dailyFactoryOptions = {},\n }: DailyTransportConstructorOptions = {}) {\n super();\n this._dailyFactoryOptions = dailyFactoryOptions;\n }\n\n public initialize(\n options: RTVIClientOptions,\n messageHandler: (ev: RTVIMessage) => void\n ): void {\n this._callbacks = options.callbacks ?? {};\n this._onMessage = messageHandler;\n\n const existingInstance = Daily.getCallInstance();\n if (existingInstance) {\n void existingInstance.destroy();\n }\n\n this._daily = Daily.createCallObject({\n ...this._dailyFactoryOptions,\n // Default is cam off\n startVideoOff: options.enableCam != true,\n // Default is mic on\n startAudioOff: options.enableMic == false,\n allowMultipleCallInstances: true,\n });\n\n this.attachEventListeners();\n\n this.state = \"disconnected\";\n\n logger.debug(\"[RTVI Transport] Initialized\");\n }\n\n get state(): TransportState {\n return this._state;\n }\n\n private set state(state: TransportState) {\n if (this._state === state) return;\n\n this._state = state;\n this._callbacks.onTransportStateChanged?.(state);\n }\n\n async getAllCams() {\n const { devices } = await this._daily.enumerateDevices();\n return devices.filter((d) => d.kind === \"videoinput\");\n }\n\n updateCam(camId: string) {\n this._daily\n .setInputDevicesAsync({\n videoDeviceId: camId,\n })\n .then((infos) => {\n this._selectedCam = infos.camera;\n });\n }\n\n get selectedCam() {\n return this._selectedCam;\n }\n\n async getAllMics() {\n const { devices } = await this._daily.enumerateDevices();\n return devices.filter((d) => d.kind === \"audioinput\");\n }\n\n updateMic(micId: string) {\n this._daily\n .setInputDevicesAsync({\n audioDeviceId: micId,\n })\n .then((infos) => {\n this._selectedMic = infos.mic;\n });\n }\n\n get selectedMic() {\n return this._selectedMic;\n }\n\n async getAllSpeakers() {\n const { devices } = await this._daily.enumerateDevices();\n return devices.filter((d) => d.kind === \"audiooutput\");\n }\n\n updateSpeaker(speakerId: string) {\n this._daily\n .setOutputDeviceAsync({ outputDeviceId: speakerId })\n .then((infos) => {\n this._selectedSpeaker = infos.speaker;\n });\n }\n\n get selectedSpeaker() {\n return this._selectedSpeaker;\n }\n\n enableMic(enable: boolean) {\n this._daily.setLocalAudio(enable);\n }\n\n get isMicEnabled() {\n return this._daily.localAudio();\n }\n\n enableCam(enable: boolean) {\n this._daily.setLocalVideo(enable);\n }\n\n get isCamEnabled() {\n return this._daily.localVideo();\n }\n\n tracks() {\n const participants = this._daily?.participants() ?? {};\n const bot = participants?.[this._botId];\n\n const tracks: Tracks = {\n local: {\n audio: participants?.local?.tracks?.audio?.persistentTrack,\n video: participants?.local?.tracks?.video?.persistentTrack,\n },\n };\n\n if (bot) {\n tracks.bot = {\n audio: bot?.tracks?.audio?.persistentTrack,\n video: bot?.tracks?.video?.persistentTrack,\n };\n }\n\n return tracks;\n }\n\n async initDevices() {\n if (!this._daily) {\n throw new RTVIError(\"Transport instance not initialized\");\n }\n\n this.state = \"initializing\";\n\n const infos = await this._daily.startCamera();\n const { devices } = await this._daily.enumerateDevices();\n const cams = devices.filter((d) => d.kind === \"videoinput\");\n const mics = devices.filter((d) => d.kind === \"audioinput\");\n const speakers = devices.filter((d) => d.kind === \"audiooutput\");\n this._callbacks.onAvailableCamsUpdated?.(cams);\n this._callbacks.onAvailableMicsUpdated?.(mics);\n this._callbacks.onAvailableSpeakersUpdated?.(speakers);\n this._selectedCam = infos.camera;\n this._callbacks.onCamUpdated?.(infos.camera as MediaDeviceInfo);\n this._selectedMic = infos.mic;\n this._callbacks.onMicUpdated?.(infos.mic as MediaDeviceInfo);\n this._selectedSpeaker = infos.speaker;\n this._callbacks.onSpeakerUpdated?.(infos.speaker as MediaDeviceInfo);\n\n // Instantiate audio observers\n if (!this._daily.isLocalAudioLevelObserverRunning())\n await this._daily.startLocalAudioLevelObserver(100);\n if (!this._daily.isRemoteParticipantsAudioLevelObserverRunning())\n await this._daily.startRemoteParticipantsAudioLevelObserver(100);\n\n this.state = \"initialized\";\n }\n\n async connect(\n authBundle: DailyTransportAuthBundle,\n abortController: AbortController\n ) {\n if (!this._daily) {\n throw new RTVIError(\"Transport instance not initialized\");\n }\n\n if (abortController.signal.aborted) return;\n\n this.state = \"connecting\";\n\n try {\n await this._daily.join({\n url: authBundle.room_url,\n token: authBundle.token,\n });\n\n const room = await this._daily.room();\n if (room && \"id\" in room) {\n this._expiry = room.config?.exp;\n }\n } catch (e) {\n this.state = \"error\";\n throw new TransportStartError();\n }\n\n if (abortController.signal.aborted) return;\n\n this.state = \"connected\";\n\n this._callbacks.onConnected?.();\n }\n\n async sendReadyMessage(): Promise<void> {\n return new Promise<void>((resolve) => {\n (async () => {\n this._daily.on(\"track-started\", (ev) => {\n if (!ev.participant?.local) {\n this.state = \"ready\";\n this.sendMessage(RTVIMessage.clientReady());\n resolve();\n }\n });\n })();\n });\n }\n\n private attachEventListeners() {\n this._daily.on(\n \"available-devices-updated\",\n this.handleAvailableDevicesUpdated.bind(this)\n );\n this._daily.on(\n \"selected-devices-updated\",\n this.handleSelectedDevicesUpdated.bind(this)\n );\n\n this._daily.on(\"track-started\", this.handleTrackStarted.bind(this));\n this._daily.on(\"track-stopped\", this.handleTrackStopped.bind(this));\n this._daily.on(\n \"participant-joined\",\n this.handleParticipantJoined.bind(this)\n );\n this._daily.on(\"participant-left\", this.handleParticipantLeft.bind(this));\n this._daily.on(\"local-audio-level\", this.handleLocalAudioLevel.bind(this));\n this._daily.on(\n \"remote-participants-audio-level\",\n this.handleRemoteAudioLevel.bind(this)\n );\n this._daily.on(\"app-message\", this.handleAppMessage.bind(this));\n this._daily.on(\"left-meeting\", this.handleLeftMeeting.bind(this));\n }\n\n async disconnect() {\n this._daily.stopLocalAudioLevelObserver();\n this._daily.stopRemoteParticipantsAudioLevelObserver();\n\n await this._daily.leave();\n await this._daily.destroy();\n }\n\n public sendMessage(message: RTVIMessage) {\n this._daily.sendAppMessage(message, \"*\");\n }\n\n private handleAppMessage(ev: DailyEventObjectAppMessage) {\n // Bubble any messages with rtvi-ai label\n if (ev.data.label === \"rtvi-ai\") {\n this._onMessage({\n id: ev.data.id,\n type: ev.data.type,\n data: ev.data.data,\n } as RTVIMessage);\n }\n }\n\n private handleAvailableDevicesUpdated(\n ev: DailyEventObjectAvailableDevicesUpdated\n ) {\n this._callbacks.onAvailableCamsUpdated?.(\n ev.availableDevices.filter((d) => d.kind === \"videoinput\")\n );\n this._callbacks.onAvailableMicsUpdated?.(\n ev.availableDevices.filter((d) => d.kind === \"audioinput\")\n );\n this._callbacks.onAvailableSpeakersUpdated?.(\n ev.availableDevices.filter((d) => d.kind === \"audiooutput\")\n );\n }\n\n private handleSelectedDevicesUpdated(\n ev: DailyEventObjectSelectedDevicesUpdated\n ) {\n if (this._selectedCam?.deviceId !== ev.devices.camera) {\n this._selectedCam = ev.devices.camera;\n this._callbacks.onCamUpdated?.(ev.devices.camera as MediaDeviceInfo);\n }\n if (this._selectedMic?.deviceId !== ev.devices.mic) {\n this._selectedMic = ev.devices.mic;\n this._callbacks.onMicUpdated?.(ev.devices.mic as MediaDeviceInfo);\n }\n if (this._selectedSpeaker?.deviceId !== ev.devices.speaker) {\n this._selectedSpeaker = ev.devices.speaker;\n this._callbacks.onSpeakerUpdated?.(ev.devices.speaker as MediaDeviceInfo);\n }\n }\n\n private handleTrackStarted(ev: DailyEventObjectTrack) {\n this._callbacks.onTrackStarted?.(\n ev.track,\n ev.participant ? dailyParticipantToParticipant(ev.participant) : undefined\n );\n }\n\n private handleTrackStopped(ev: DailyEventObjectTrack) {\n this._callbacks.onTrackStopped?.(\n ev.track,\n ev.participant ? dailyParticipantToParticipant(ev.participant) : undefined\n );\n }\n\n private handleParticipantJoined(ev: DailyEventObjectParticipant) {\n const p = dailyParticipantToParticipant(ev.participant);\n\n this._callbacks.onParticipantJoined?.(p);\n\n if (p.local) return;\n\n this._botId = ev.participant.session_id;\n\n this._callbacks.onBotConnected?.(p);\n }\n\n private handleParticipantLeft(ev: DailyEventObjectParticipantLeft) {\n const p = dailyParticipantToParticipant(ev.participant);\n\n this._callbacks.onParticipantLeft?.(p);\n\n if (p.local) return;\n\n this._botId = \"\";\n\n this._callbacks.onBotDisconnected?.(p);\n }\n\n private handleLocalAudioLevel(ev: DailyEventObjectLocalAudioLevel) {\n this._callbacks.onLocalAudioLevel?.(ev.audioLevel);\n }\n\n private handleRemoteAudioLevel(\n ev: DailyEventObjectRemoteParticipantsAudioLevel\n ) {\n const participants = this._daily.participants();\n const ids = Object.keys(ev.participantsAudioLevel);\n for (let i = 0; i < ids.length; i++) {\n const id = ids[i];\n const level = ev.participantsAudioLevel[id];\n this._callbacks.onRemoteAudioLevel?.(\n level,\n dailyParticipantToParticipant(participants[id])\n );\n }\n }\n\n private handleLeftMeeting() {\n this.state = \"disconnecting\";\n this._botId = \"\";\n this._callbacks.onDisconnected?.();\n }\n}\n\nconst dailyParticipantToParticipant = (p: DailyParticipant): Participant => ({\n id: p.user_id,\n local: p.local,\n name: p.user_name,\n});\n"],"names":[],"version":3,"file":"index.module.js.map"}
package/package.json ADDED
@@ -0,0 +1,40 @@
1
+ {
2
+ "name": "@pipecat-ai/daily-transport",
3
+ "version": "0.3.0",
4
+ "license": "BSD-2-Clause",
5
+ "main": "dist/index.js",
6
+ "module": "dist/index.module.js",
7
+ "types": "dist/index.d.ts",
8
+ "source": "src/index.ts",
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "git+https://github.com/pipecat-ai/pipecat-client-web-transports.git"
12
+ },
13
+ "files": [
14
+ "dist",
15
+ "package.json",
16
+ "README.md"
17
+ ],
18
+ "scripts": {
19
+ "build": "parcel build --no-cache",
20
+ "dev": "parcel watch",
21
+ "lint": "eslint . --ext ts --report-unused-disable-directives --max-warnings 0"
22
+ },
23
+ "devDependencies": {
24
+ "@typescript-eslint/eslint-plugin": "^7.16.0",
25
+ "@typescript-eslint/parser": "^7.16.0",
26
+ "eslint": "9.11.1",
27
+ "eslint-config-prettier": "^9.1.0",
28
+ "eslint-plugin-simple-import-sort": "^12.1.1"
29
+ },
30
+ "dependencies": {
31
+ "@daily-co/daily-js": "^0.73.0",
32
+ "@pipecat-ai/client-js": "0.3.0"
33
+ },
34
+ "description": "Pipecat Daily Transport Package",
35
+ "author": "Daily.co",
36
+ "bugs": {
37
+ "url": "https://github.com/pipecat-ai/pipecat-client-web-transports/issues"
38
+ },
39
+ "homepage": "https://github.com/pipecat-ai/pipecat-client-web-transports/blob/main/transports/daily-webrtc/README.md"
40
+ }