@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 +31 -0
- package/dist/index.d.ts +36 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +287 -0
- package/dist/index.js.map +1 -0
- package/dist/index.module.js +266 -0
- package/dist/index.module.js.map +1 -0
- package/package.json +40 -0
package/README.md
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# Pipecat's Real-Time Voice Inference - Daily Transport
|
|
2
|
+
|
|
3
|
+
[](https://docs.pipecat.ai/client/introduction)
|
|
4
|
+

|
|
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).
|
package/dist/index.d.ts
ADDED
|
@@ -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
|
+
}
|