@pipecat-ai/client-react 1.0.1 → 1.1.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/dist/index.d.ts +33 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +68 -2
- package/dist/index.js.map +1 -1
- package/dist/index.module.js +67 -3
- package/dist/index.module.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -78,6 +78,39 @@ interface PipecatClientMicToggleProps {
|
|
|
78
78
|
* Headless component for controlling microphone state
|
|
79
79
|
*/
|
|
80
80
|
export const PipecatClientMicToggle: React.FC<PipecatClientMicToggleProps>;
|
|
81
|
+
/**
|
|
82
|
+
* Hook to control screen share state using React Context
|
|
83
|
+
* This provides a simpler interface for basic screen share control
|
|
84
|
+
* For more advanced state management with Jotai atoms, use usePipecatClientScreenShare
|
|
85
|
+
*/
|
|
86
|
+
export const usePipecatClientScreenShareControl: () => {
|
|
87
|
+
enableScreenShare: (enabled: boolean) => void;
|
|
88
|
+
isScreenShareEnabled: boolean;
|
|
89
|
+
};
|
|
90
|
+
interface PipecatClientScreenShareToggleProps {
|
|
91
|
+
/**
|
|
92
|
+
* Callback when screen share state changes
|
|
93
|
+
*/
|
|
94
|
+
onScreenShareEnabledChanged?: (enabled: boolean) => void;
|
|
95
|
+
/**
|
|
96
|
+
* Optional prop to disable the screen share toggle.
|
|
97
|
+
* When disabled, changes are not applied to the client.
|
|
98
|
+
* @default false
|
|
99
|
+
*/
|
|
100
|
+
disabled?: boolean;
|
|
101
|
+
/**
|
|
102
|
+
* Render prop that provides state and handlers to the children
|
|
103
|
+
*/
|
|
104
|
+
children: (props: {
|
|
105
|
+
disabled?: boolean;
|
|
106
|
+
isScreenShareEnabled: boolean;
|
|
107
|
+
onClick: () => void;
|
|
108
|
+
}) => React.ReactNode;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Headless component for controlling screen share state
|
|
112
|
+
*/
|
|
113
|
+
export const PipecatClientScreenShareToggle: React.FC<PipecatClientScreenShareToggleProps>;
|
|
81
114
|
interface PipecatClientVideoInterface {
|
|
82
115
|
aspectRatio: number;
|
|
83
116
|
height: number;
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"mappings":";;;;ACWA,OAAO,MAAM,qBAAsB,CAAC,SAAS,SAAS,EACpD,OAAO,CAAC,EACR,SAAS,iBAAiB,CAAC,CAAC,SAU7B,CAAC;AEAF;IACE,MAAM,EAAE,aAAa,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,cAAc,CAAC,eAAoB,CAAC,CAAC,OAAO,CAAC,CAAC;CAClE;AAYD,OAAO,MAAM,uBAAuB,MAAM,EAAE,CAC1C,MAAM,iBAAiB,CAAC,KAAK,CAAC,CAoF/B,CAAC;ACjHF,OAAO,MAAM,iDAGZ,CAAC;ACEF,uBAAuB,MAAM,MAAM,CAAC;AACpC,iBAAiB,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;AA4BvC,OAAO,MAAM,6BACX,WAAW,SAAS,EACpB,iBAAiB,eAAe,4BA+DjC,CAAC;ACjGF,OAAO,MAAM;;;CA6BZ,CAAC;AChCF;;GAEG;AACH,OAAO,MAAM;;;CAC6B,CAAC;ACT3C;IACE;;OAEG;IACH,mBAAmB,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAEjD;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB;;OAEG;IACH,QAAQ,EAAE,CAAC,KAAK,EAAE;QAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,YAAY,EAAE,OAAO,CAAC;QACtB,OAAO,EAAE,MAAM,IAAI,CAAC;KACrB,KAAK,MAAM,SAAS,CAAC;CACvB;AAED;;GAEG;AACH,OAAO,MAAM,wBAAwB,MAAM,EAAE,CAAC,2BAA2B,CAwBxE,CAAC;AC5CF;;GAEG;AACH,OAAO,MAAM;;;CAC6B,CAAC;ACV3C;IACE;;OAEG;IACH,mBAAmB,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAEjD;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB;;OAEG;IACH,QAAQ,EAAE,CAAC,KAAK,EAAE;QAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,YAAY,EAAE,OAAO,CAAC;QACtB,OAAO,EAAE,MAAM,IAAI,CAAC;KACrB,KAAK,MAAM,SAAS,CAAC;CACvB;AAED;;GAEG;AACH,OAAO,MAAM,wBAAwB,MAAM,EAAE,CAAC,2BAA2B,CAwBxE,CAAC;
|
|
1
|
+
{"mappings":"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","sources":["client-react/src/src/RTVIEventContext.ts","client-react/src/src/useRTVIClientEvent.ts","client-react/src/src/PipecatClientState.tsx","client-react/src/src/PipecatClientProvider.tsx","client-react/src/src/usePipecatClient.ts","client-react/src/src/usePipecatClientMediaTrack.ts","client-react/src/src/PipecatClientAudio.tsx","client-react/src/src/usePipecatClientCamControl.ts","client-react/src/src/PipecatClientCamToggle.tsx","client-react/src/src/usePipecatClientMicControl.ts","client-react/src/src/PipecatClientMicToggle.tsx","client-react/src/src/usePipecatClientScreenShareControl.ts","client-react/src/src/PipecatClientScreenShareToggle.tsx","client-react/src/src/useMergedRef.ts","client-react/src/src/PipecatClientVideo.tsx","client-react/src/src/usePipecatClientMediaDevices.ts","client-react/src/src/usePipecatClientTransportState.ts","client-react/src/src/VoiceVisualizer.tsx","client-react/src/src/index.ts","client-react/src/index.ts"],"sourcesContent":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,"/**\n * Copyright (c) 2024, Daily.\n *\n * SPDX-License-Identifier: BSD-2-Clause\n */\n\nimport { PipecatClientAudio } from \"./PipecatClientAudio\";\nimport { PipecatClientCamToggle } from \"./PipecatClientCamToggle\";\nimport { PipecatClientMicToggle } from \"./PipecatClientMicToggle\";\nimport { PipecatClientProvider } from \"./PipecatClientProvider\";\nimport { PipecatClientScreenShareToggle } from \"./PipecatClientScreenShareToggle\";\nimport { PipecatClientVideo } from \"./PipecatClientVideo\";\nimport { usePipecatClient } from \"./usePipecatClient\";\nimport { usePipecatClientCamControl } from \"./usePipecatClientCamControl\";\nimport { usePipecatClientMediaDevices } from \"./usePipecatClientMediaDevices\";\nimport { usePipecatClientMediaTrack } from \"./usePipecatClientMediaTrack\";\nimport { usePipecatClientMicControl } from \"./usePipecatClientMicControl\";\nimport { usePipecatClientScreenShareControl } from \"./usePipecatClientScreenShareControl\";\nimport { usePipecatClientTransportState } from \"./usePipecatClientTransportState\";\nimport { useRTVIClientEvent } from \"./useRTVIClientEvent\";\nimport { VoiceVisualizer } from \"./VoiceVisualizer\";\n\nexport {\n PipecatClientAudio,\n PipecatClientCamToggle,\n PipecatClientMicToggle,\n PipecatClientProvider,\n PipecatClientScreenShareToggle,\n PipecatClientVideo,\n usePipecatClient,\n usePipecatClientCamControl,\n usePipecatClientMediaDevices,\n usePipecatClientMediaTrack,\n usePipecatClientMicControl,\n usePipecatClientScreenShareControl,\n usePipecatClientTransportState,\n useRTVIClientEvent,\n VoiceVisualizer,\n};\n"],"names":[],"version":3,"file":"index.d.ts.map"}
|
package/dist/index.js
CHANGED
|
@@ -18,12 +18,14 @@ $parcel$export(module.exports, "PipecatClientAudio", () => $a2a1c5f475114d56$exp
|
|
|
18
18
|
$parcel$export(module.exports, "PipecatClientCamToggle", () => $666ceba11158b494$export$dc9a029eeca8213f);
|
|
19
19
|
$parcel$export(module.exports, "PipecatClientMicToggle", () => $1a9931980e271aa3$export$bc8133b69ff660a2);
|
|
20
20
|
$parcel$export(module.exports, "PipecatClientProvider", () => $8df0e777e4d7dd49$export$bb43666ced7a20d0);
|
|
21
|
+
$parcel$export(module.exports, "PipecatClientScreenShareToggle", () => $0a9d1dc5be2e1cc2$export$93764714dfab3a46);
|
|
21
22
|
$parcel$export(module.exports, "PipecatClientVideo", () => $0f97689637ada1d8$export$85974db6d0cc43b3);
|
|
22
23
|
$parcel$export(module.exports, "usePipecatClient", () => $172f489fc5d91d99$export$777fa8498be78705);
|
|
23
24
|
$parcel$export(module.exports, "usePipecatClientCamControl", () => $d9b24817de62910a$export$3ea2601427f0430f);
|
|
24
25
|
$parcel$export(module.exports, "usePipecatClientMediaDevices", () => $9bd3e7d3a9d7acd1$export$642bc4d2d2a376f1);
|
|
25
26
|
$parcel$export(module.exports, "usePipecatClientMediaTrack", () => $630203d8dad1dd45$export$9813dcd2d0c26814);
|
|
26
27
|
$parcel$export(module.exports, "usePipecatClientMicControl", () => $4af0eba414c586fd$export$388e706586309ef0);
|
|
28
|
+
$parcel$export(module.exports, "usePipecatClientScreenShareControl", () => $5fc67d7ca05dec34$export$be63b19bd7f7d4f5);
|
|
27
29
|
$parcel$export(module.exports, "usePipecatClientTransportState", () => $810478f6ae107062$export$30aee278309a867b);
|
|
28
30
|
$parcel$export(module.exports, "useRTVIClientEvent", () => $8a6b68ebf0332682$export$33a6ac53b8f02625);
|
|
29
31
|
$parcel$export(module.exports, "VoiceVisualizer", () => $a1dfa75b13e6bb9b$export$59bf27bd43679db6);
|
|
@@ -53,7 +55,7 @@ $parcel$export(module.exports, "VoiceVisualizer", () => $a1dfa75b13e6bb9b$export
|
|
|
53
55
|
|
|
54
56
|
|
|
55
57
|
var $d1f89db81f967f39$exports = {};
|
|
56
|
-
$d1f89db81f967f39$exports = JSON.parse("{\"name\":\"@pipecat-ai/client-react\",\"version\":\"1.0
|
|
58
|
+
$d1f89db81f967f39$exports = JSON.parse("{\"name\":\"@pipecat-ai/client-react\",\"version\":\"1.1.0\",\"license\":\"BSD-2-Clause\",\"main\":\"dist/index.js\",\"module\":\"dist/index.module.js\",\"types\":\"dist/index.d.ts\",\"source\":\"src/index.ts\",\"repository\":{\"type\":\"git\",\"url\":\"git+https://github.com/pipecat-ai/pipecat-client-web.git\"},\"files\":[\"dist\",\"package.json\",\"README.md\"],\"scripts\":{\"build\":\"parcel build --no-cache\",\"dev\":\"parcel watch\",\"lint\":\"eslint . --report-unused-disable-directives --max-warnings 0 --ignore-pattern 'dist/'\"},\"devDependencies\":{\"@pipecat-ai/client-js\":\"*\",\"@types/react\":\"^18.3.3\",\"@types/react-dom\":\"^18.3.0\",\"@typescript-eslint/eslint-plugin\":\"^8.32.0\",\"eslint\":\"^9.11.1\",\"eslint-config-prettier\":\"^9.1.0\",\"eslint-plugin-react-hooks\":\"^5.2.0\",\"eslint-plugin-simple-import-sort\":\"^12.1.1\",\"parcel\":\"^2.12.0\",\"react\":\"^18.3.1\",\"react-dom\":\"^18.3.1\",\"typescript\":\"^5.2.2\"},\"peerDependencies\":{\"@pipecat-ai/client-js\":\"*\",\"react\":\">=18\",\"react-dom\":\">=18\"},\"dependencies\":{\"jotai\":\"^2.9.0\"}}");
|
|
57
59
|
|
|
58
60
|
|
|
59
61
|
|
|
@@ -100,17 +102,25 @@ const $44c6278d186dd94f$export$802b42df0e0d8153 = /*#__PURE__*/ (0, $5Zyvw$react
|
|
|
100
102
|
},
|
|
101
103
|
isMicEnabled: false
|
|
102
104
|
});
|
|
105
|
+
const $44c6278d186dd94f$export$8e633e67c760098b = /*#__PURE__*/ (0, $5Zyvw$react.createContext)({
|
|
106
|
+
enableScreenShare: ()=>{
|
|
107
|
+
throw new Error("PipecatClientScreenShareStateContext: enableScreenShare() called outside of provider");
|
|
108
|
+
},
|
|
109
|
+
isScreenShareEnabled: false
|
|
110
|
+
});
|
|
103
111
|
const $44c6278d186dd94f$export$db79fdf85ddd6b65 = /*#__PURE__*/ (0, $5Zyvw$react.createContext)("disconnected");
|
|
104
112
|
const $44c6278d186dd94f$export$4777554fda61c378 = ({ children: children })=>{
|
|
105
113
|
const client = (0, $172f489fc5d91d99$export$777fa8498be78705)();
|
|
106
114
|
const [isCamEnabled, setIsCamEnabled] = (0, $5Zyvw$react.useState)(false);
|
|
107
115
|
const [isMicEnabled, setIsMicEnabled] = (0, $5Zyvw$react.useState)(false);
|
|
116
|
+
const [isScreenShareEnabled, setIsScreenShareEnabled] = (0, $5Zyvw$react.useState)(false);
|
|
108
117
|
const [transportState, setTransportState] = (0, $5Zyvw$react.useState)("disconnected");
|
|
109
118
|
(0, $8a6b68ebf0332682$export$33a6ac53b8f02625)((0, $5Zyvw$pipecataiclientjs.RTVIEvent).TransportStateChanged, (state)=>{
|
|
110
119
|
setTransportState(state);
|
|
111
120
|
if (state === "initialized" && client) {
|
|
112
121
|
setIsCamEnabled(client.isCamEnabled ?? false);
|
|
113
122
|
setIsMicEnabled(client.isMicEnabled ?? false);
|
|
123
|
+
setIsScreenShareEnabled(client.isSharingScreen ?? false);
|
|
114
124
|
}
|
|
115
125
|
});
|
|
116
126
|
const enableCam = (0, $5Zyvw$react.useCallback)((enabled)=>{
|
|
@@ -125,6 +135,17 @@ const $44c6278d186dd94f$export$4777554fda61c378 = ({ children: children })=>{
|
|
|
125
135
|
}, [
|
|
126
136
|
client
|
|
127
137
|
]);
|
|
138
|
+
const enableScreenShare = (0, $5Zyvw$react.useCallback)((enabled)=>{
|
|
139
|
+
client?.enableScreenShare?.(enabled);
|
|
140
|
+
}, [
|
|
141
|
+
client
|
|
142
|
+
]);
|
|
143
|
+
(0, $8a6b68ebf0332682$export$33a6ac53b8f02625)((0, $5Zyvw$pipecataiclientjs.RTVIEvent).ScreenTrackStarted, (_track, participant)=>{
|
|
144
|
+
if (participant?.local) setIsScreenShareEnabled(true);
|
|
145
|
+
});
|
|
146
|
+
(0, $8a6b68ebf0332682$export$33a6ac53b8f02625)((0, $5Zyvw$pipecataiclientjs.RTVIEvent).ScreenTrackStopped, (_track, participant)=>{
|
|
147
|
+
if (participant?.local) setIsScreenShareEnabled(false);
|
|
148
|
+
});
|
|
128
149
|
return (0, $5Zyvw$reactjsxruntime.jsx)($44c6278d186dd94f$export$db79fdf85ddd6b65.Provider, {
|
|
129
150
|
value: transportState,
|
|
130
151
|
children: (0, $5Zyvw$reactjsxruntime.jsx)($44c6278d186dd94f$export$d6bdcccacef16204.Provider, {
|
|
@@ -137,7 +158,13 @@ const $44c6278d186dd94f$export$4777554fda61c378 = ({ children: children })=>{
|
|
|
137
158
|
enableMic: enableMic,
|
|
138
159
|
isMicEnabled: isMicEnabled
|
|
139
160
|
},
|
|
140
|
-
children:
|
|
161
|
+
children: (0, $5Zyvw$reactjsxruntime.jsx)($44c6278d186dd94f$export$8e633e67c760098b.Provider, {
|
|
162
|
+
value: {
|
|
163
|
+
enableScreenShare: enableScreenShare,
|
|
164
|
+
isScreenShareEnabled: isScreenShareEnabled
|
|
165
|
+
},
|
|
166
|
+
children: children
|
|
167
|
+
})
|
|
141
168
|
})
|
|
142
169
|
})
|
|
143
170
|
});
|
|
@@ -378,6 +405,44 @@ var $1a9931980e271aa3$export$2e2bcd8739ae039 = $1a9931980e271aa3$export$bc8133b6
|
|
|
378
405
|
|
|
379
406
|
|
|
380
407
|
|
|
408
|
+
/**
|
|
409
|
+
* Copyright (c) 2025, Daily.
|
|
410
|
+
*
|
|
411
|
+
* SPDX-License-Identifier: BSD-2-Clause
|
|
412
|
+
*/
|
|
413
|
+
|
|
414
|
+
const $5fc67d7ca05dec34$export$be63b19bd7f7d4f5 = ()=>(0, $5Zyvw$react.useContext)((0, $44c6278d186dd94f$export$8e633e67c760098b));
|
|
415
|
+
|
|
416
|
+
|
|
417
|
+
const $0a9d1dc5be2e1cc2$export$93764714dfab3a46 = ({ onScreenShareEnabledChanged: onScreenShareEnabledChanged, disabled: disabled = false, children: children })=>{
|
|
418
|
+
const { enableScreenShare: enableScreenShare, isScreenShareEnabled: isScreenShareEnabled } = (0, $5fc67d7ca05dec34$export$be63b19bd7f7d4f5)();
|
|
419
|
+
const handleToggleScreenShare = (0, $5Zyvw$react.useCallback)(()=>{
|
|
420
|
+
if (disabled) return;
|
|
421
|
+
enableScreenShare(!isScreenShareEnabled);
|
|
422
|
+
}, [
|
|
423
|
+
disabled,
|
|
424
|
+
enableScreenShare,
|
|
425
|
+
isScreenShareEnabled
|
|
426
|
+
]);
|
|
427
|
+
(0, $5Zyvw$react.useEffect)(()=>{
|
|
428
|
+
onScreenShareEnabledChanged?.(isScreenShareEnabled);
|
|
429
|
+
}, [
|
|
430
|
+
isScreenShareEnabled,
|
|
431
|
+
onScreenShareEnabledChanged
|
|
432
|
+
]);
|
|
433
|
+
return (0, $5Zyvw$reactjsxruntime.jsx)((0, $5Zyvw$reactjsxruntime.Fragment), {
|
|
434
|
+
children: children({
|
|
435
|
+
isScreenShareEnabled: isScreenShareEnabled,
|
|
436
|
+
onClick: handleToggleScreenShare,
|
|
437
|
+
disabled: disabled
|
|
438
|
+
})
|
|
439
|
+
});
|
|
440
|
+
};
|
|
441
|
+
var $0a9d1dc5be2e1cc2$export$2e2bcd8739ae039 = $0a9d1dc5be2e1cc2$export$93764714dfab3a46;
|
|
442
|
+
|
|
443
|
+
|
|
444
|
+
|
|
445
|
+
|
|
381
446
|
/**
|
|
382
447
|
* Copyright (c) 2024, Daily.
|
|
383
448
|
*
|
|
@@ -612,6 +677,7 @@ const $9bd3e7d3a9d7acd1$export$642bc4d2d2a376f1 = ()=>{
|
|
|
612
677
|
|
|
613
678
|
|
|
614
679
|
|
|
680
|
+
|
|
615
681
|
/**
|
|
616
682
|
* Copyright (c) 2024, Daily.
|
|
617
683
|
*
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"mappings":"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","sources":["client-react/src/index.ts","client-react/src/PipecatClientAudio.tsx","client-react/src/usePipecatClientMediaTrack.ts","client-react/src/usePipecatClient.ts","client-react/src/PipecatClientProvider.tsx","client-react/package.json","client-react/src/PipecatClientState.tsx","client-react/src/useRTVIClientEvent.ts","client-react/src/RTVIEventContext.ts","client-react/src/PipecatClientCamToggle.tsx","client-react/src/usePipecatClientCamControl.ts","client-react/src/PipecatClientMicToggle.tsx","client-react/src/usePipecatClientMicControl.ts","client-react/src/PipecatClientVideo.tsx","client-react/src/useMergedRef.ts","client-react/src/usePipecatClientMediaDevices.ts","client-react/src/usePipecatClientTransportState.ts","client-react/src/VoiceVisualizer.tsx"],"sourcesContent":["/**\n * Copyright (c) 2024, Daily.\n *\n * SPDX-License-Identifier: BSD-2-Clause\n */\n\nimport { PipecatClientAudio } from \"./PipecatClientAudio\";\nimport { PipecatClientCamToggle } from \"./PipecatClientCamToggle\";\nimport { PipecatClientMicToggle } from \"./PipecatClientMicToggle\";\nimport { PipecatClientProvider } from \"./PipecatClientProvider\";\nimport { PipecatClientVideo } from \"./PipecatClientVideo\";\nimport { usePipecatClient } from \"./usePipecatClient\";\nimport { usePipecatClientCamControl } from \"./usePipecatClientCamControl\";\nimport { usePipecatClientMediaDevices } from \"./usePipecatClientMediaDevices\";\nimport { usePipecatClientMediaTrack } from \"./usePipecatClientMediaTrack\";\nimport { usePipecatClientMicControl } from \"./usePipecatClientMicControl\";\nimport { usePipecatClientTransportState } from \"./usePipecatClientTransportState\";\nimport { useRTVIClientEvent } from \"./useRTVIClientEvent\";\nimport { VoiceVisualizer } from \"./VoiceVisualizer\";\n\nexport {\n PipecatClientAudio,\n PipecatClientCamToggle,\n PipecatClientMicToggle,\n PipecatClientProvider,\n PipecatClientVideo,\n usePipecatClient,\n usePipecatClientCamControl,\n usePipecatClientMediaDevices,\n usePipecatClientMediaTrack,\n usePipecatClientMicControl,\n usePipecatClientTransportState,\n useRTVIClientEvent,\n VoiceVisualizer,\n};\n","/**\n * Copyright (c) 2024, Daily.\n *\n * SPDX-License-Identifier: BSD-2-Clause\n */\n\nimport { RTVIEvent } from \"@pipecat-ai/client-js\";\nimport { useCallback, useEffect, useRef } from \"react\";\n\nimport { usePipecatClientMediaTrack } from \"./usePipecatClientMediaTrack\";\nimport { useRTVIClientEvent } from \"./useRTVIClientEvent\";\n\nexport const PipecatClientAudio = () => {\n const botAudioRef = useRef<HTMLAudioElement>(null);\n const botAudioTrack = usePipecatClientMediaTrack(\"audio\", \"bot\");\n\n useEffect(() => {\n if (!botAudioRef.current || !botAudioTrack) return;\n if (botAudioRef.current.srcObject) {\n const oldTrack = (\n botAudioRef.current.srcObject as MediaStream\n ).getAudioTracks()[0];\n if (oldTrack.id === botAudioTrack.id) return;\n }\n botAudioRef.current.srcObject = new MediaStream([botAudioTrack]);\n }, [botAudioTrack]);\n\n useRTVIClientEvent(\n RTVIEvent.SpeakerUpdated,\n useCallback((speaker: MediaDeviceInfo) => {\n if (!botAudioRef.current) return;\n if (typeof botAudioRef.current.setSinkId !== \"function\") return;\n botAudioRef.current.setSinkId(speaker.deviceId);\n }, [])\n );\n\n return (\n <>\n <audio ref={botAudioRef} autoPlay />\n </>\n );\n};\nPipecatClientAudio.displayName = \"PipecatClientAudio\";\n","/**\n * Copyright (c) 2024, Daily.\n *\n * SPDX-License-Identifier: BSD-2-Clause\n */\n\nimport { Participant, RTVIEvent, Tracks } from \"@pipecat-ai/client-js\";\nimport { atom, useAtomValue } from \"jotai\";\nimport { atomFamily, useAtomCallback } from \"jotai/utils\";\nimport { PrimitiveAtom } from \"jotai/vanilla\";\nimport { useCallback, useEffect } from \"react\";\n\nimport { usePipecatClient } from \"./usePipecatClient\";\nimport { useRTVIClientEvent } from \"./useRTVIClientEvent\";\n\ntype ParticipantType = keyof Tracks;\ntype TrackType = keyof Tracks[\"local\"];\n\nconst localAudioTrackAtom = atom<MediaStreamTrack | null>(null);\nconst localVideoTrackAtom = atom<MediaStreamTrack | null>(null);\nconst localScreenAudioTrackAtom = atom<MediaStreamTrack | null>(null);\nconst localScreenVideoTrackAtom = atom<MediaStreamTrack | null>(null);\nconst botAudioTrackAtom = atom<MediaStreamTrack | null>(null);\nconst botVideoTrackAtom = atom<MediaStreamTrack | null>(null);\n\nconst trackAtom = atomFamily<\n { local: boolean; trackType: TrackType },\n PrimitiveAtom<MediaStreamTrack | null>\n>(({ local, trackType }) => {\n if (local) {\n switch (trackType) {\n case \"audio\":\n return localAudioTrackAtom;\n case \"screenAudio\":\n return localScreenAudioTrackAtom;\n case \"screenVideo\":\n return localScreenVideoTrackAtom;\n case \"video\":\n return localVideoTrackAtom;\n }\n }\n return trackType === \"audio\" ? botAudioTrackAtom : botVideoTrackAtom;\n});\n\nexport const usePipecatClientMediaTrack = (\n trackType: TrackType,\n participantType: ParticipantType\n) => {\n const client = usePipecatClient();\n const track = useAtomValue(\n trackAtom({ local: participantType === \"local\", trackType })\n );\n\n const updateTrack = useAtomCallback(\n useCallback(\n (\n get,\n set,\n track: MediaStreamTrack,\n trackType: TrackType,\n local: boolean\n ) => {\n const atom = trackAtom({\n local,\n trackType,\n });\n const oldTrack = get(atom);\n if (oldTrack?.id === track.id) return;\n set(atom, track);\n },\n []\n )\n );\n\n useRTVIClientEvent(\n RTVIEvent.TrackStarted,\n useCallback(\n (track: MediaStreamTrack, participant?: Participant) => {\n updateTrack(\n track,\n track.kind as TrackType,\n Boolean(participant?.local)\n );\n },\n [updateTrack]\n )\n );\n\n useRTVIClientEvent(\n RTVIEvent.ScreenTrackStarted,\n useCallback(\n (track: MediaStreamTrack, participant?: Participant) => {\n const trackType =\n track.kind === \"audio\" ? \"screenAudio\" : \"screenVideo\";\n updateTrack(track, trackType, Boolean(participant?.local));\n },\n [updateTrack]\n )\n );\n\n useEffect(() => {\n if (!client) return;\n const tracks = client.tracks();\n const track = tracks?.[participantType]?.[trackType];\n if (!track) return;\n updateTrack(track, trackType, participantType === \"local\");\n }, [participantType, trackType, updateTrack, client]);\n\n return track;\n};\n","/**\n * Copyright (c) 2024, Daily.\n *\n * SPDX-License-Identifier: BSD-2-Clause\n */\n\nimport { useContext } from \"react\";\n\nimport { PipecatClientContext } from \"./PipecatClientProvider\";\n\nexport const usePipecatClient = () => {\n const { client } = useContext(PipecatClientContext);\n return client;\n};\n","/**\n * Copyright (c) 2024, Daily.\n *\n * SPDX-License-Identifier: BSD-2-Clause\n */\n\nimport {\n PipecatClient,\n RTVIEvent,\n RTVIEventHandler,\n setAboutClient,\n} from \"@pipecat-ai/client-js\";\nimport { createStore } from \"jotai\";\nimport { Provider as JotaiProvider } from \"jotai/react\";\nimport React, { createContext, useCallback, useEffect, useRef } from \"react\";\n\nimport {\n name as packageName,\n version as packageVersion,\n} from \"../package.json\";\nimport { PipecatClientStateProvider } from \"./PipecatClientState\";\nimport { RTVIEventContext } from \"./RTVIEventContext\";\n\nexport interface Props {\n client: PipecatClient;\n jotaiStore?: React.ComponentProps<typeof JotaiProvider>[\"store\"];\n}\n\nconst defaultStore = createStore();\n\nexport const PipecatClientContext = createContext<{ client?: PipecatClient }>(\n {}\n);\n\ntype EventHandlersMap = {\n [E in RTVIEvent]?: Set<RTVIEventHandler<E>>;\n};\n\nexport const PipecatClientProvider: React.FC<\n React.PropsWithChildren<Props>\n> = ({ children, client, jotaiStore = defaultStore }) => {\n useEffect(() => {\n setAboutClient({\n library: packageName,\n library_version: packageVersion,\n });\n }, []);\n\n const eventHandlersMap = useRef<EventHandlersMap>({});\n\n useEffect(() => {\n if (!client) return;\n\n const allEvents = Object.values(RTVIEvent).filter((value) =>\n isNaN(Number(value))\n ) as RTVIEvent[];\n\n const allHandlers: Partial<\n Record<\n RTVIEvent,\n (\n ...args: Parameters<Exclude<RTVIEventHandler<RTVIEvent>, undefined>>\n ) => void\n >\n > = {};\n\n allEvents.forEach((event) => {\n type E = typeof event;\n type Handler = Exclude<RTVIEventHandler<E>, undefined>; // Remove undefined\n type Payload = Parameters<Handler>; // Will always be a tuple\n\n const handler = (...payload: Payload) => {\n const handlers = eventHandlersMap.current[event] as\n | Set<Handler>\n | undefined;\n if (!handlers) return;\n handlers.forEach((h) => {\n (\n h as (\n ...args: Parameters<Exclude<RTVIEventHandler<E>, undefined>>\n ) => void\n )(...payload);\n });\n };\n\n allHandlers[event] = handler;\n\n client.on(event, handler);\n });\n\n return () => {\n allEvents.forEach((event) => {\n client.off(event, allHandlers[event]);\n });\n };\n }, [client]);\n\n const on = useCallback(\n <E extends RTVIEvent>(event: E, handler: RTVIEventHandler<E>) => {\n if (!eventHandlersMap.current[event]) {\n eventHandlersMap.current[event] = new Set();\n }\n eventHandlersMap.current[event]!.add(handler);\n },\n []\n );\n\n const off = useCallback(\n <E extends RTVIEvent>(event: E, handler: RTVIEventHandler<E>) => {\n eventHandlersMap.current[event]?.delete(handler);\n },\n []\n );\n\n return (\n <JotaiProvider store={jotaiStore}>\n <PipecatClientContext.Provider value={{ client }}>\n <RTVIEventContext.Provider value={{ on, off }}>\n <PipecatClientStateProvider>{children}</PipecatClientStateProvider>\n </RTVIEventContext.Provider>\n </PipecatClientContext.Provider>\n </JotaiProvider>\n );\n};\nPipecatClientProvider.displayName = \"PipecatClientProvider\";\n","{\n \"name\": \"@pipecat-ai/client-react\",\n \"version\": \"1.0.1\",\n \"license\": \"BSD-2-Clause\",\n \"main\": \"dist/index.js\",\n \"module\": \"dist/index.module.js\",\n \"types\": \"dist/index.d.ts\",\n \"source\": \"src/index.ts\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/pipecat-ai/pipecat-client-web.git\"\n },\n \"files\": [\n \"dist\",\n \"package.json\",\n \"README.md\"\n ],\n \"scripts\": {\n \"build\": \"parcel build --no-cache\",\n \"dev\": \"parcel watch\",\n \"lint\": \"eslint . --report-unused-disable-directives --max-warnings 0 --ignore-pattern 'dist/'\"\n },\n \"devDependencies\": {\n \"@pipecat-ai/client-js\": \"*\",\n \"@types/react\": \"^18.3.3\",\n \"@types/react-dom\": \"^18.3.0\",\n \"@typescript-eslint/eslint-plugin\": \"^8.32.0\",\n \"eslint\": \"^9.11.1\",\n \"eslint-config-prettier\": \"^9.1.0\",\n \"eslint-plugin-react-hooks\": \"^5.2.0\",\n \"eslint-plugin-simple-import-sort\": \"^12.1.1\",\n \"parcel\": \"^2.12.0\",\n \"react\": \"^18.3.1\",\n \"react-dom\": \"^18.3.1\",\n \"typescript\": \"^5.2.2\"\n },\n \"peerDependencies\": {\n \"@pipecat-ai/client-js\": \"*\",\n \"react\": \">=18\",\n \"react-dom\": \">=18\"\n },\n \"dependencies\": {\n \"jotai\": \"^2.9.0\"\n }\n}\n","/**\n * Copyright (c) 2024, Daily.\n *\n * SPDX-License-Identifier: BSD-2-Clause\n */\n\nimport { RTVIEvent, TransportState } from \"@pipecat-ai/client-js\";\nimport React, { createContext, useCallback, useState } from \"react\";\n\nimport { usePipecatClient } from \"./usePipecatClient\";\nimport { useRTVIClientEvent } from \"./useRTVIClientEvent\";\n\nexport const PipecatClientCamStateContext = createContext<{\n enableCam: (enabled: boolean) => void;\n isCamEnabled: boolean;\n}>({\n enableCam: () => {\n throw new Error(\n \"PipecatClientCamStateContext: enableCam() called outside of provider\"\n );\n },\n isCamEnabled: false,\n});\nexport const PipecatClientMicStateContext = createContext<{\n enableMic: (enabled: boolean) => void;\n isMicEnabled: boolean;\n}>({\n enableMic: () => {\n throw new Error(\n \"PipecatClientMicStateContext: enableMic() called outside of provider\"\n );\n },\n isMicEnabled: false,\n});\nexport const PipecatClientTransportStateContext =\n createContext<TransportState>(\"disconnected\");\n\nexport const PipecatClientStateProvider: React.FC<React.PropsWithChildren> = ({\n children,\n}) => {\n const client = usePipecatClient();\n const [isCamEnabled, setIsCamEnabled] = useState(false);\n const [isMicEnabled, setIsMicEnabled] = useState(false);\n const [transportState, setTransportState] =\n useState<TransportState>(\"disconnected\");\n\n useRTVIClientEvent(RTVIEvent.TransportStateChanged, (state) => {\n setTransportState(state);\n if (state === \"initialized\" && client) {\n setIsCamEnabled(client.isCamEnabled ?? false);\n setIsMicEnabled(client.isMicEnabled ?? false);\n }\n });\n\n const enableCam = useCallback(\n (enabled: boolean) => {\n setIsCamEnabled(enabled);\n client?.enableCam?.(enabled);\n },\n [client]\n );\n\n const enableMic = useCallback(\n (enabled: boolean) => {\n setIsMicEnabled(enabled);\n client?.enableMic?.(enabled);\n },\n [client]\n );\n\n return (\n <PipecatClientTransportStateContext.Provider value={transportState}>\n <PipecatClientCamStateContext.Provider\n value={{ enableCam, isCamEnabled }}\n >\n <PipecatClientMicStateContext.Provider\n value={{ enableMic, isMicEnabled }}\n >\n {children}\n </PipecatClientMicStateContext.Provider>\n </PipecatClientCamStateContext.Provider>\n </PipecatClientTransportStateContext.Provider>\n );\n};\n","/**\n * Copyright (c) 2024, Daily.\n *\n * SPDX-License-Identifier: BSD-2-Clause\n */\n\nimport { RTVIEvent, RTVIEventHandler } from \"@pipecat-ai/client-js\";\nimport { useContext, useEffect } from \"react\";\n\nimport { RTVIEventContext } from \"./RTVIEventContext\";\n\nexport const useRTVIClientEvent = <E extends RTVIEvent>(\n event: E,\n handler: RTVIEventHandler<E>\n) => {\n const { on, off } = useContext(RTVIEventContext);\n\n useEffect(() => {\n on(event, handler);\n return () => {\n off(event, handler);\n };\n }, [event, handler, on, off]);\n};\n","/**\n * Copyright (c) 2024, Daily.\n *\n * SPDX-License-Identifier: BSD-2-Clause\n */\nimport { RTVIEvent, RTVIEventHandler } from \"@pipecat-ai/client-js\";\nimport { createContext } from \"react\";\n\nexport const RTVIEventContext = createContext<{\n on: <E extends RTVIEvent>(event: E, handler: RTVIEventHandler<E>) => void;\n off: <E extends RTVIEvent>(event: E, handler: RTVIEventHandler<E>) => void;\n}>({\n on: () => {},\n off: () => {},\n});\n","import React, { useCallback } from \"react\";\n\nimport { usePipecatClientCamControl } from \"./usePipecatClientCamControl\";\n\nexport interface PipecatClientCamToggleProps {\n /**\n * Callback fired when camera state changes\n */\n onCamEnabledChanged?: (enabled: boolean) => void;\n\n /**\n * Optional prop to disable the cam toggle.\n * When disabled, changes are not applied to the client.\n * @default false\n */\n disabled?: boolean;\n\n /**\n * Render prop that provides state and handlers to the children\n */\n children: (props: {\n disabled?: boolean;\n isCamEnabled: boolean;\n onClick: () => void;\n }) => React.ReactNode;\n}\n\n/**\n * Headless component for controlling camera state\n */\nexport const PipecatClientCamToggle: React.FC<PipecatClientCamToggleProps> = ({\n onCamEnabledChanged,\n disabled = false,\n children,\n}) => {\n const { isCamEnabled, enableCam } = usePipecatClientCamControl();\n\n const handleToggleCam = useCallback(() => {\n if (disabled) return;\n\n const newEnabledState = !isCamEnabled;\n enableCam(newEnabledState);\n onCamEnabledChanged?.(newEnabledState);\n }, [disabled, enableCam, isCamEnabled, onCamEnabledChanged]);\n\n return (\n <>\n {children({\n isCamEnabled,\n onClick: handleToggleCam,\n disabled,\n })}\n </>\n );\n};\n\nexport default PipecatClientCamToggle;\n","/**\n * Copyright (c) 2024, Daily.\n *\n * SPDX-License-Identifier: BSD-2-Clause\n */\nimport { useContext } from \"react\";\n\nimport { PipecatClientCamStateContext } from \"./PipecatClientState\";\n\n/**\n * Hook to control camera state\n */\nexport const usePipecatClientCamControl = () =>\n useContext(PipecatClientCamStateContext);\n","import React, { useCallback } from \"react\";\n\nimport { usePipecatClientMicControl } from \"./usePipecatClientMicControl\";\n\nexport interface PipecatClientMicToggleProps {\n /**\n * Callback fired when microphone state changes\n */\n onMicEnabledChanged?: (enabled: boolean) => void;\n\n /**\n * Optional prop to disable the mic toggle.\n * When disabled, changes are not applied to the client.\n * @default false\n */\n disabled?: boolean;\n\n /**\n * Render prop that provides state and handlers to the children\n */\n children: (props: {\n disabled?: boolean;\n isMicEnabled: boolean;\n onClick: () => void;\n }) => React.ReactNode;\n}\n\n/**\n * Headless component for controlling microphone state\n */\nexport const PipecatClientMicToggle: React.FC<PipecatClientMicToggleProps> = ({\n onMicEnabledChanged,\n disabled = false,\n children,\n}) => {\n const { enableMic, isMicEnabled } = usePipecatClientMicControl();\n\n const handleToggleMic = useCallback(() => {\n if (disabled) return;\n\n const newEnabledState = !isMicEnabled;\n enableMic(newEnabledState);\n onMicEnabledChanged?.(newEnabledState);\n }, [disabled, enableMic, isMicEnabled, onMicEnabledChanged]);\n\n return (\n <>\n {children({\n isMicEnabled,\n onClick: handleToggleMic,\n disabled,\n })}\n </>\n );\n};\n\nexport default PipecatClientMicToggle;\n","/**\n * Copyright (c) 2024, Daily.\n *\n * SPDX-License-Identifier: BSD-2-Clause\n */\n\nimport { useContext } from \"react\";\n\nimport { PipecatClientMicStateContext } from \"./PipecatClientState\";\n\n/**\n * Hook to control microphone state\n */\nexport const usePipecatClientMicControl = () =>\n useContext(PipecatClientMicStateContext);\n","/**\n * Copyright (c) 2024, Daily.\n *\n * SPDX-License-Identifier: BSD-2-Clause\n */\n\nimport React, { forwardRef, useEffect, useRef } from \"react\";\n\nimport useMergedRef from \"./useMergedRef\";\nimport { usePipecatClientMediaTrack } from \"./usePipecatClientMediaTrack\";\n\ninterface PipecatClientVideoInterface {\n aspectRatio: number;\n height: number;\n width: number;\n}\n\nexport interface Props\n extends Omit<React.VideoHTMLAttributes<HTMLVideoElement>, \"onResize\"> {\n participant: \"local\" | \"bot\";\n\n /**\n * Defines the video track type to display. Default: 'video'.\n */\n trackType?: \"screenVideo\" | \"video\";\n\n /**\n * Defines whether the video should be fully contained or cover the box. Default: 'contain'.\n */\n fit?: \"contain\" | \"cover\";\n /**\n * Forces the video to be mirrored, if set.\n */\n mirror?: boolean;\n\n /**\n * Optional callback, which is triggered whenever the video's rendered width or height changes.\n * Returns the video's native width, height and aspectRatio.\n */\n onResize?(dimensions: PipecatClientVideoInterface): void;\n}\n\nexport const PipecatClientVideo = forwardRef<HTMLVideoElement, Props>(\n function VoiceClientVideo(\n {\n participant = \"local\",\n fit = \"contain\",\n mirror,\n onResize,\n style = {},\n trackType = \"video\",\n ...props\n },\n ref\n ) {\n const videoTrack: MediaStreamTrack | null = usePipecatClientMediaTrack(\n trackType,\n participant\n );\n\n const videoEl = useRef<HTMLVideoElement>(null);\n const videoRef = useMergedRef<HTMLVideoElement>(videoEl, ref);\n\n /**\n * Handle canplay & picture-in-picture events.\n */\n useEffect(function setupVideoEvents() {\n const video = videoEl.current;\n if (!video) return;\n\n const playVideo = () => {\n const promise = video.play();\n if (promise !== undefined) {\n promise\n .then(() => {\n // All good, playback started.\n video.controls = false;\n })\n .catch((error) => {\n // Auto-play was prevented. Show video controls, so user can play video manually.\n video.controls = true;\n console.warn(\"Failed to play video\", error);\n });\n }\n };\n\n const handleCanPlay = () => {\n if (!video.paused) return;\n playVideo();\n };\n const handleEnterPIP = () => {\n video.style.transform = \"scale(1)\";\n };\n const handleLeavePIP = () => {\n video.style.transform = \"\";\n setTimeout(() => {\n if (video.paused) playVideo();\n }, 100);\n };\n const handleVisibilityChange = () => {\n if (document.visibilityState === \"hidden\") return;\n if (!video.paused) return;\n playVideo();\n };\n video.addEventListener(\"canplay\", handleCanPlay);\n video.addEventListener(\"enterpictureinpicture\", handleEnterPIP);\n video.addEventListener(\"leavepictureinpicture\", handleLeavePIP);\n\n // Videos can be paused if media was played in another app on iOS.\n document.addEventListener(\"visibilitychange\", handleVisibilityChange);\n return () => {\n video.removeEventListener(\"canplay\", handleCanPlay);\n video.removeEventListener(\"enterpictureinpicture\", handleEnterPIP);\n video.removeEventListener(\"leavepictureinpicture\", handleLeavePIP);\n document.removeEventListener(\n \"visibilitychange\",\n handleVisibilityChange\n );\n };\n }, []);\n\n /**\n * Update srcObject.\n */\n useEffect(\n function updateSrcObject() {\n const video = videoEl.current;\n if (!video || !videoTrack) return;\n video.srcObject = new MediaStream([videoTrack]);\n video.load();\n return () => {\n // clean up when unmounted\n video.srcObject = null;\n video.load();\n };\n },\n [videoTrack, videoTrack?.id]\n );\n\n /**\n * Add optional event listener for resize event so the parent component\n * can know the video's native aspect ratio.\n */\n useEffect(\n function reportVideoDimensions() {\n const video = videoEl.current;\n if (!onResize || !video) return;\n\n let frame: ReturnType<typeof requestAnimationFrame>;\n function handleResize() {\n if (frame) cancelAnimationFrame(frame);\n frame = requestAnimationFrame(() => {\n const video = videoEl.current;\n if (!video || document.hidden) return;\n const videoWidth = video.videoWidth;\n const videoHeight = video.videoHeight;\n if (videoWidth && videoHeight) {\n onResize?.({\n aspectRatio: videoWidth / videoHeight,\n height: videoHeight,\n width: videoWidth,\n });\n }\n });\n }\n\n handleResize();\n video.addEventListener(\"loadedmetadata\", handleResize);\n video.addEventListener(\"resize\", handleResize);\n\n return () => {\n if (frame) cancelAnimationFrame(frame);\n video.removeEventListener(\"loadedmetadata\", handleResize);\n video.removeEventListener(\"resize\", handleResize);\n };\n },\n [onResize]\n );\n\n return (\n <video\n autoPlay\n muted\n playsInline\n ref={videoRef}\n style={{\n objectFit: fit,\n transform: mirror ? \"scale(-1, 1)\" : \"\",\n ...style,\n }}\n {...props}\n />\n );\n }\n);\nPipecatClientVideo.displayName = \"PipecatClientVideo\";\n","/**\n * Copyright (c) 2024, Daily.\n *\n * SPDX-License-Identifier: BSD-2-Clause\n *\n * This file contains code derived from:\n * https://github.com/jaredLunde/react-hook/blob/master/packages/merged-ref/src/index.tsx\n * Original author: Jared Lunde (https://github.com/jaredLunde)\n * Original license: MIT (https://github.com/jaredLunde/react-hook/blob/master/LICENSE)\n */\n\nimport React, { useCallback } from \"react\";\n\nfunction useMergedRef<T>(...refs: React.Ref<T>[]): React.RefCallback<T> {\n return useCallback(\n (element: T) => {\n for (let i = 0; i < refs.length; i++) {\n const ref = refs[i];\n if (typeof ref === \"function\") ref(element);\n else if (ref && typeof ref === \"object\")\n (ref as React.MutableRefObject<T>).current = element;\n }\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n refs\n );\n}\n\nexport default useMergedRef;\n","/**\n * Copyright (c) 2024, Daily.\n *\n * SPDX-License-Identifier: BSD-2-Clause\n */\nimport { RTVIEvent } from \"@pipecat-ai/client-js\";\nimport { atom, useAtomValue } from \"jotai\";\nimport { useAtomCallback } from \"jotai/utils\";\nimport { useCallback, useEffect } from \"react\";\n\nimport { usePipecatClient } from \"./usePipecatClient\";\nimport { useRTVIClientEvent } from \"./useRTVIClientEvent\";\n\ntype OptionalMediaDeviceInfo = MediaDeviceInfo | Record<string, never>;\n\nconst availableMicsAtom = atom<MediaDeviceInfo[]>([]);\nconst availableCamsAtom = atom<MediaDeviceInfo[]>([]);\nconst availableSpeakersAtom = atom<MediaDeviceInfo[]>([]);\nconst selectedMicAtom = atom<OptionalMediaDeviceInfo>({});\nconst selectedCamAtom = atom<OptionalMediaDeviceInfo>({});\nconst selectedSpeakerAtom = atom<OptionalMediaDeviceInfo>({});\n\nexport const usePipecatClientMediaDevices = () => {\n const client = usePipecatClient();\n\n const availableCams = useAtomValue(availableCamsAtom);\n const availableMics = useAtomValue(availableMicsAtom);\n const availableSpeakers = useAtomValue(availableSpeakersAtom);\n const selectedCam = useAtomValue(selectedCamAtom);\n const selectedMic = useAtomValue(selectedMicAtom);\n const selectedSpeaker = useAtomValue(selectedSpeakerAtom);\n\n const initDevices = useAtomCallback(\n useCallback(\n async (_get, set) => {\n if (!client) return;\n\n const availableCams = await client.getAllCams();\n const availableMics = await client.getAllMics();\n const availableSpeakers = await client.getAllSpeakers();\n\n set(availableCamsAtom, availableCams);\n set(availableMicsAtom, availableMics);\n set(availableSpeakersAtom, availableSpeakers);\n\n set(selectedCamAtom, client.selectedCam);\n set(selectedMicAtom, client.selectedMic);\n set(selectedSpeakerAtom, client.selectedSpeaker);\n },\n [client]\n )\n );\n\n useEffect(() => {\n initDevices();\n }, [initDevices]);\n\n useRTVIClientEvent(\n RTVIEvent.AvailableCamsUpdated,\n useAtomCallback(\n useCallback((_get, set, cams) => {\n set(availableCamsAtom, cams);\n }, [])\n )\n );\n useRTVIClientEvent(\n RTVIEvent.AvailableMicsUpdated,\n useAtomCallback(\n useCallback((_get, set, mics) => {\n set(availableMicsAtom, mics);\n }, [])\n )\n );\n useRTVIClientEvent(\n RTVIEvent.AvailableSpeakersUpdated,\n useAtomCallback(\n useCallback((_get, set, speakers) => {\n set(availableSpeakersAtom, speakers);\n }, [])\n )\n );\n useRTVIClientEvent(\n RTVIEvent.CamUpdated,\n useAtomCallback(\n useCallback((_get, set, cam) => {\n set(selectedCamAtom, cam);\n }, [])\n )\n );\n useRTVIClientEvent(\n RTVIEvent.MicUpdated,\n useAtomCallback(\n useCallback((_get, set, mic) => {\n set(selectedMicAtom, mic);\n }, [])\n )\n );\n useRTVIClientEvent(\n RTVIEvent.SpeakerUpdated,\n useAtomCallback(\n useCallback((_get, set, speaker) => {\n set(selectedSpeakerAtom, speaker);\n }, [])\n )\n );\n\n const updateCam = useCallback(\n (id: string) => {\n client?.updateCam(id);\n },\n [client]\n );\n const updateMic = useCallback(\n (id: string) => {\n client?.updateMic(id);\n },\n [client]\n );\n const updateSpeaker = useCallback(\n (id: string) => {\n client?.updateSpeaker(id);\n },\n [client]\n );\n\n return {\n availableCams,\n availableMics,\n availableSpeakers,\n selectedCam,\n selectedMic,\n selectedSpeaker,\n updateCam,\n updateMic,\n updateSpeaker,\n };\n};\n","/**\n * Copyright (c) 2024, Daily.\n *\n * SPDX-License-Identifier: BSD-2-Clause\n */\n\nimport { useContext } from \"react\";\n\nimport { PipecatClientTransportStateContext } from \"./PipecatClientState\";\n\nexport const usePipecatClientTransportState = () =>\n useContext(PipecatClientTransportStateContext);\n","/**\n * Copyright (c) 2024, Daily.\n *\n * SPDX-License-Identifier: BSD-2-Clause\n */\n\nimport React, { useEffect, useRef } from \"react\";\n\nimport { usePipecatClientMediaTrack } from \"./usePipecatClientMediaTrack\";\n\ntype ParticipantType = Parameters<typeof usePipecatClientMediaTrack>[1];\n\ninterface Props {\n backgroundColor?: string;\n barColor?: string;\n barCount?: number;\n barGap?: number;\n barLineCap?: \"round\" | \"square\";\n barMaxHeight?: number;\n barOrigin?: \"top\" | \"bottom\" | \"center\";\n barWidth?: number;\n participantType: ParticipantType;\n}\n\nexport const VoiceVisualizer: React.FC<Props> = React.memo(\n ({\n backgroundColor = \"transparent\",\n barColor = \"black\",\n barCount = 5,\n barGap = 12,\n barLineCap = \"round\",\n barMaxHeight = 120,\n barOrigin = \"center\",\n barWidth = 30,\n participantType,\n }) => {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n\n const track: MediaStreamTrack | null = usePipecatClientMediaTrack(\n \"audio\",\n participantType\n );\n\n useEffect(() => {\n if (!canvasRef.current) return;\n\n const canvasWidth = barCount * barWidth + (barCount - 1) * barGap;\n const canvasHeight = barMaxHeight;\n\n const canvas = canvasRef.current;\n\n const scaleFactor = 2;\n\n // Make canvas fill the width and height of its container\n const resizeCanvas = () => {\n canvas.width = canvasWidth * scaleFactor;\n canvas.height = canvasHeight * scaleFactor;\n\n canvas.style.width = `${canvasWidth}px`;\n canvas.style.height = `${canvasHeight}px`;\n\n canvasCtx.lineCap = barLineCap;\n canvasCtx.scale(scaleFactor, scaleFactor);\n };\n\n const canvasCtx = canvas.getContext(\"2d\")!;\n resizeCanvas();\n\n if (!track) return;\n\n const audioContext = new AudioContext();\n const source = audioContext.createMediaStreamSource(\n new MediaStream([track])\n );\n const analyser = audioContext.createAnalyser();\n\n analyser.fftSize = 1024;\n\n source.connect(analyser);\n\n const frequencyData = new Uint8Array(analyser.frequencyBinCount);\n\n canvasCtx.lineCap = barLineCap;\n\n // Create frequency bands based on barCount\n const bands = Array.from({ length: barCount }, (_, i) => {\n // Use improved logarithmic scale for better frequency distribution\n const minFreq = barCount > 20 ? 200 : 80; // Adjust min frequency based on bar count\n const maxFreq = 10000; // Cover most important audio frequencies\n\n // Use Mel scale inspired approach for more perceptually uniform distribution\n // This helps with a large number of bars by placing fewer in the very low range\n // https://en.wikipedia.org/wiki/Mel_scale\n const melMin = 2595 * Math.log10(1 + minFreq / 700);\n const melMax = 2595 * Math.log10(1 + maxFreq / 700);\n const melStep = (melMax - melMin) / barCount;\n\n const melValue = melMin + i * melStep;\n const startFreq = 700 * (Math.pow(10, melValue / 2595) - 1);\n const endFreq = 700 * (Math.pow(10, (melValue + melStep) / 2595) - 1);\n\n return {\n startFreq,\n endFreq,\n smoothValue: 0,\n };\n });\n\n const getFrequencyBinIndex = (frequency: number) => {\n const nyquist = audioContext.sampleRate / 2;\n return Math.round(\n (frequency / nyquist) * (analyser.frequencyBinCount - 1)\n );\n };\n\n function drawSpectrum() {\n analyser.getByteFrequencyData(frequencyData);\n canvasCtx.clearRect(\n 0,\n 0,\n canvas.width / scaleFactor,\n canvas.height / scaleFactor\n );\n canvasCtx.fillStyle = backgroundColor;\n canvasCtx.fillRect(\n 0,\n 0,\n canvas.width / scaleFactor,\n canvas.height / scaleFactor\n );\n\n let isActive = false;\n\n const totalBarsWidth =\n bands.length * barWidth + (bands.length - 1) * barGap;\n const startX = (canvas.width / scaleFactor - totalBarsWidth) / 2; // Center bars\n\n const adjustedCircleRadius = barWidth / 2; // Fixed radius for reset circles\n\n bands.forEach((band, i) => {\n const startIndex = getFrequencyBinIndex(band.startFreq);\n const endIndex = getFrequencyBinIndex(band.endFreq);\n const bandData = frequencyData.slice(startIndex, endIndex);\n const bandValue =\n bandData.reduce((acc, val) => acc + val, 0) / bandData.length;\n\n const smoothingFactor = 0.2;\n\n if (bandValue < 1) {\n band.smoothValue = Math.max(\n band.smoothValue - smoothingFactor * 5,\n 0\n );\n } else {\n band.smoothValue =\n band.smoothValue +\n (bandValue - band.smoothValue) * smoothingFactor;\n isActive = true;\n }\n\n const x = startX + i * (barWidth + barGap);\n // Calculate bar height with a maximum cap\n const minHeight = 0;\n const barHeight = Math.max(\n minHeight,\n Math.min((band.smoothValue / 255) * barMaxHeight, barMaxHeight)\n );\n\n let yTop, yBottom;\n const canvasHeight = canvas.height / scaleFactor;\n\n switch (barOrigin) {\n case \"top\":\n yTop = adjustedCircleRadius;\n yBottom = Math.min(\n adjustedCircleRadius + barHeight,\n canvasHeight - adjustedCircleRadius\n );\n break;\n case \"bottom\":\n yBottom = canvasHeight - adjustedCircleRadius;\n yTop = Math.max(yBottom - barHeight, adjustedCircleRadius);\n break;\n case \"center\":\n default:\n yTop = Math.max(\n canvasHeight / 2 - barHeight / 2,\n adjustedCircleRadius\n );\n yBottom = Math.min(\n canvasHeight / 2 + barHeight / 2,\n canvasHeight - adjustedCircleRadius\n );\n break;\n }\n\n if (band.smoothValue > 0) {\n canvasCtx.beginPath();\n canvasCtx.moveTo(x + barWidth / 2, yTop);\n canvasCtx.lineTo(x + barWidth / 2, yBottom);\n canvasCtx.lineWidth = barWidth;\n canvasCtx.strokeStyle = barColor;\n canvasCtx.stroke();\n } else {\n drawInactiveCircle(adjustedCircleRadius, barColor, x, yTop);\n }\n });\n\n if (!isActive) {\n drawInactiveCircles(adjustedCircleRadius, barColor);\n }\n\n requestAnimationFrame(drawSpectrum);\n }\n\n function drawInactiveCircle(\n circleRadius: number,\n color: string,\n x: number,\n y: number\n ) {\n switch (barLineCap) {\n case \"square\":\n canvasCtx.fillStyle = color;\n canvasCtx.fillRect(\n x + barWidth / 2 - circleRadius,\n y - circleRadius,\n circleRadius * 2,\n circleRadius * 2\n );\n break;\n case \"round\":\n default:\n canvasCtx.beginPath();\n canvasCtx.arc(x + barWidth / 2, y, circleRadius, 0, 2 * Math.PI);\n canvasCtx.fillStyle = color;\n canvasCtx.fill();\n canvasCtx.closePath();\n break;\n }\n }\n\n function drawInactiveCircles(circleRadius: number, color: string) {\n const totalBarsWidth =\n bands.length * barWidth + (bands.length - 1) * barGap;\n const startX = (canvas.width / scaleFactor - totalBarsWidth) / 2;\n const canvasHeight = canvas.height / scaleFactor;\n\n let y;\n switch (barOrigin) {\n case \"top\":\n y = circleRadius;\n break;\n case \"bottom\":\n y = canvasHeight - circleRadius;\n break;\n case \"center\":\n default:\n y = canvasHeight / 2;\n break;\n }\n\n bands.forEach((_, i) => {\n const x = startX + i * (barWidth + barGap);\n drawInactiveCircle(circleRadius, color, x, y);\n });\n }\n\n drawSpectrum();\n\n // Handle resizing\n window.addEventListener(\"resize\", resizeCanvas);\n\n return () => {\n audioContext.close();\n window.removeEventListener(\"resize\", resizeCanvas);\n };\n }, [\n backgroundColor,\n barColor,\n barCount,\n barGap,\n barLineCap,\n barMaxHeight,\n barOrigin,\n barWidth,\n track,\n ]);\n\n return (\n <canvas\n ref={canvasRef}\n style={{\n display: \"block\",\n width: \"100%\",\n height: \"100%\",\n }}\n />\n );\n }\n);\n\nVoiceVisualizer.displayName = \"VoiceVisualizer\";\n"],"names":[],"version":3,"file":"index.js.map"}
|
|
1
|
+
{"mappings":"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","sources":["client-react/src/index.ts","client-react/src/PipecatClientAudio.tsx","client-react/src/usePipecatClientMediaTrack.ts","client-react/src/usePipecatClient.ts","client-react/src/PipecatClientProvider.tsx","client-react/package.json","client-react/src/PipecatClientState.tsx","client-react/src/useRTVIClientEvent.ts","client-react/src/RTVIEventContext.ts","client-react/src/PipecatClientCamToggle.tsx","client-react/src/usePipecatClientCamControl.ts","client-react/src/PipecatClientMicToggle.tsx","client-react/src/usePipecatClientMicControl.ts","client-react/src/PipecatClientScreenShareToggle.tsx","client-react/src/usePipecatClientScreenShareControl.ts","client-react/src/PipecatClientVideo.tsx","client-react/src/useMergedRef.ts","client-react/src/usePipecatClientMediaDevices.ts","client-react/src/usePipecatClientTransportState.ts","client-react/src/VoiceVisualizer.tsx"],"sourcesContent":["/**\n * Copyright (c) 2024, Daily.\n *\n * SPDX-License-Identifier: BSD-2-Clause\n */\n\nimport { PipecatClientAudio } from \"./PipecatClientAudio\";\nimport { PipecatClientCamToggle } from \"./PipecatClientCamToggle\";\nimport { PipecatClientMicToggle } from \"./PipecatClientMicToggle\";\nimport { PipecatClientProvider } from \"./PipecatClientProvider\";\nimport { PipecatClientScreenShareToggle } from \"./PipecatClientScreenShareToggle\";\nimport { PipecatClientVideo } from \"./PipecatClientVideo\";\nimport { usePipecatClient } from \"./usePipecatClient\";\nimport { usePipecatClientCamControl } from \"./usePipecatClientCamControl\";\nimport { usePipecatClientMediaDevices } from \"./usePipecatClientMediaDevices\";\nimport { usePipecatClientMediaTrack } from \"./usePipecatClientMediaTrack\";\nimport { usePipecatClientMicControl } from \"./usePipecatClientMicControl\";\nimport { usePipecatClientScreenShareControl } from \"./usePipecatClientScreenShareControl\";\nimport { usePipecatClientTransportState } from \"./usePipecatClientTransportState\";\nimport { useRTVIClientEvent } from \"./useRTVIClientEvent\";\nimport { VoiceVisualizer } from \"./VoiceVisualizer\";\n\nexport {\n PipecatClientAudio,\n PipecatClientCamToggle,\n PipecatClientMicToggle,\n PipecatClientProvider,\n PipecatClientScreenShareToggle,\n PipecatClientVideo,\n usePipecatClient,\n usePipecatClientCamControl,\n usePipecatClientMediaDevices,\n usePipecatClientMediaTrack,\n usePipecatClientMicControl,\n usePipecatClientScreenShareControl,\n usePipecatClientTransportState,\n useRTVIClientEvent,\n VoiceVisualizer,\n};\n","/**\n * Copyright (c) 2024, Daily.\n *\n * SPDX-License-Identifier: BSD-2-Clause\n */\n\nimport { RTVIEvent } from \"@pipecat-ai/client-js\";\nimport { useCallback, useEffect, useRef } from \"react\";\n\nimport { usePipecatClientMediaTrack } from \"./usePipecatClientMediaTrack\";\nimport { useRTVIClientEvent } from \"./useRTVIClientEvent\";\n\nexport const PipecatClientAudio = () => {\n const botAudioRef = useRef<HTMLAudioElement>(null);\n const botAudioTrack = usePipecatClientMediaTrack(\"audio\", \"bot\");\n\n useEffect(() => {\n if (!botAudioRef.current || !botAudioTrack) return;\n if (botAudioRef.current.srcObject) {\n const oldTrack = (\n botAudioRef.current.srcObject as MediaStream\n ).getAudioTracks()[0];\n if (oldTrack.id === botAudioTrack.id) return;\n }\n botAudioRef.current.srcObject = new MediaStream([botAudioTrack]);\n }, [botAudioTrack]);\n\n useRTVIClientEvent(\n RTVIEvent.SpeakerUpdated,\n useCallback((speaker: MediaDeviceInfo) => {\n if (!botAudioRef.current) return;\n if (typeof botAudioRef.current.setSinkId !== \"function\") return;\n botAudioRef.current.setSinkId(speaker.deviceId);\n }, [])\n );\n\n return (\n <>\n <audio ref={botAudioRef} autoPlay />\n </>\n );\n};\nPipecatClientAudio.displayName = \"PipecatClientAudio\";\n","/**\n * Copyright (c) 2024, Daily.\n *\n * SPDX-License-Identifier: BSD-2-Clause\n */\n\nimport { Participant, RTVIEvent, Tracks } from \"@pipecat-ai/client-js\";\nimport { atom, useAtomValue } from \"jotai\";\nimport { atomFamily, useAtomCallback } from \"jotai/utils\";\nimport { PrimitiveAtom } from \"jotai/vanilla\";\nimport { useCallback, useEffect } from \"react\";\n\nimport { usePipecatClient } from \"./usePipecatClient\";\nimport { useRTVIClientEvent } from \"./useRTVIClientEvent\";\n\ntype ParticipantType = keyof Tracks;\ntype TrackType = keyof Tracks[\"local\"];\n\nconst localAudioTrackAtom = atom<MediaStreamTrack | null>(null);\nconst localVideoTrackAtom = atom<MediaStreamTrack | null>(null);\nconst localScreenAudioTrackAtom = atom<MediaStreamTrack | null>(null);\nconst localScreenVideoTrackAtom = atom<MediaStreamTrack | null>(null);\nconst botAudioTrackAtom = atom<MediaStreamTrack | null>(null);\nconst botVideoTrackAtom = atom<MediaStreamTrack | null>(null);\n\nconst trackAtom = atomFamily<\n { local: boolean; trackType: TrackType },\n PrimitiveAtom<MediaStreamTrack | null>\n>(({ local, trackType }) => {\n if (local) {\n switch (trackType) {\n case \"audio\":\n return localAudioTrackAtom;\n case \"screenAudio\":\n return localScreenAudioTrackAtom;\n case \"screenVideo\":\n return localScreenVideoTrackAtom;\n case \"video\":\n return localVideoTrackAtom;\n }\n }\n return trackType === \"audio\" ? botAudioTrackAtom : botVideoTrackAtom;\n});\n\nexport const usePipecatClientMediaTrack = (\n trackType: TrackType,\n participantType: ParticipantType\n) => {\n const client = usePipecatClient();\n const track = useAtomValue(\n trackAtom({ local: participantType === \"local\", trackType })\n );\n\n const updateTrack = useAtomCallback(\n useCallback(\n (\n get,\n set,\n track: MediaStreamTrack,\n trackType: TrackType,\n local: boolean\n ) => {\n const atom = trackAtom({\n local,\n trackType,\n });\n const oldTrack = get(atom);\n if (oldTrack?.id === track.id) return;\n set(atom, track);\n },\n []\n )\n );\n\n useRTVIClientEvent(\n RTVIEvent.TrackStarted,\n useCallback(\n (track: MediaStreamTrack, participant?: Participant) => {\n updateTrack(\n track,\n track.kind as TrackType,\n Boolean(participant?.local)\n );\n },\n [updateTrack]\n )\n );\n\n useRTVIClientEvent(\n RTVIEvent.ScreenTrackStarted,\n useCallback(\n (track: MediaStreamTrack, participant?: Participant) => {\n const trackType =\n track.kind === \"audio\" ? \"screenAudio\" : \"screenVideo\";\n updateTrack(track, trackType, Boolean(participant?.local));\n },\n [updateTrack]\n )\n );\n\n useEffect(() => {\n if (!client) return;\n const tracks = client.tracks();\n const track = tracks?.[participantType]?.[trackType];\n if (!track) return;\n updateTrack(track, trackType, participantType === \"local\");\n }, [participantType, trackType, updateTrack, client]);\n\n return track;\n};\n","/**\n * Copyright (c) 2024, Daily.\n *\n * SPDX-License-Identifier: BSD-2-Clause\n */\n\nimport { useContext } from \"react\";\n\nimport { PipecatClientContext } from \"./PipecatClientProvider\";\n\nexport const usePipecatClient = () => {\n const { client } = useContext(PipecatClientContext);\n return client;\n};\n","/**\n * Copyright (c) 2024, Daily.\n *\n * SPDX-License-Identifier: BSD-2-Clause\n */\n\nimport {\n PipecatClient,\n RTVIEvent,\n RTVIEventHandler,\n setAboutClient,\n} from \"@pipecat-ai/client-js\";\nimport { createStore } from \"jotai\";\nimport { Provider as JotaiProvider } from \"jotai/react\";\nimport React, { createContext, useCallback, useEffect, useRef } from \"react\";\n\nimport {\n name as packageName,\n version as packageVersion,\n} from \"../package.json\";\nimport { PipecatClientStateProvider } from \"./PipecatClientState\";\nimport { RTVIEventContext } from \"./RTVIEventContext\";\n\nexport interface Props {\n client: PipecatClient;\n jotaiStore?: React.ComponentProps<typeof JotaiProvider>[\"store\"];\n}\n\nconst defaultStore = createStore();\n\nexport const PipecatClientContext = createContext<{ client?: PipecatClient }>(\n {}\n);\n\ntype EventHandlersMap = {\n [E in RTVIEvent]?: Set<RTVIEventHandler<E>>;\n};\n\nexport const PipecatClientProvider: React.FC<\n React.PropsWithChildren<Props>\n> = ({ children, client, jotaiStore = defaultStore }) => {\n useEffect(() => {\n setAboutClient({\n library: packageName,\n library_version: packageVersion,\n });\n }, []);\n\n const eventHandlersMap = useRef<EventHandlersMap>({});\n\n useEffect(() => {\n if (!client) return;\n\n const allEvents = Object.values(RTVIEvent).filter((value) =>\n isNaN(Number(value))\n ) as RTVIEvent[];\n\n const allHandlers: Partial<\n Record<\n RTVIEvent,\n (\n ...args: Parameters<Exclude<RTVIEventHandler<RTVIEvent>, undefined>>\n ) => void\n >\n > = {};\n\n allEvents.forEach((event) => {\n type E = typeof event;\n type Handler = Exclude<RTVIEventHandler<E>, undefined>; // Remove undefined\n type Payload = Parameters<Handler>; // Will always be a tuple\n\n const handler = (...payload: Payload) => {\n const handlers = eventHandlersMap.current[event] as\n | Set<Handler>\n | undefined;\n if (!handlers) return;\n handlers.forEach((h) => {\n (\n h as (\n ...args: Parameters<Exclude<RTVIEventHandler<E>, undefined>>\n ) => void\n )(...payload);\n });\n };\n\n allHandlers[event] = handler;\n\n client.on(event, handler);\n });\n\n return () => {\n allEvents.forEach((event) => {\n client.off(event, allHandlers[event]);\n });\n };\n }, [client]);\n\n const on = useCallback(\n <E extends RTVIEvent>(event: E, handler: RTVIEventHandler<E>) => {\n if (!eventHandlersMap.current[event]) {\n eventHandlersMap.current[event] = new Set();\n }\n eventHandlersMap.current[event]!.add(handler);\n },\n []\n );\n\n const off = useCallback(\n <E extends RTVIEvent>(event: E, handler: RTVIEventHandler<E>) => {\n eventHandlersMap.current[event]?.delete(handler);\n },\n []\n );\n\n return (\n <JotaiProvider store={jotaiStore}>\n <PipecatClientContext.Provider value={{ client }}>\n <RTVIEventContext.Provider value={{ on, off }}>\n <PipecatClientStateProvider>{children}</PipecatClientStateProvider>\n </RTVIEventContext.Provider>\n </PipecatClientContext.Provider>\n </JotaiProvider>\n );\n};\nPipecatClientProvider.displayName = \"PipecatClientProvider\";\n","{\n \"name\": \"@pipecat-ai/client-react\",\n \"version\": \"1.1.0\",\n \"license\": \"BSD-2-Clause\",\n \"main\": \"dist/index.js\",\n \"module\": \"dist/index.module.js\",\n \"types\": \"dist/index.d.ts\",\n \"source\": \"src/index.ts\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/pipecat-ai/pipecat-client-web.git\"\n },\n \"files\": [\n \"dist\",\n \"package.json\",\n \"README.md\"\n ],\n \"scripts\": {\n \"build\": \"parcel build --no-cache\",\n \"dev\": \"parcel watch\",\n \"lint\": \"eslint . --report-unused-disable-directives --max-warnings 0 --ignore-pattern 'dist/'\"\n },\n \"devDependencies\": {\n \"@pipecat-ai/client-js\": \"*\",\n \"@types/react\": \"^18.3.3\",\n \"@types/react-dom\": \"^18.3.0\",\n \"@typescript-eslint/eslint-plugin\": \"^8.32.0\",\n \"eslint\": \"^9.11.1\",\n \"eslint-config-prettier\": \"^9.1.0\",\n \"eslint-plugin-react-hooks\": \"^5.2.0\",\n \"eslint-plugin-simple-import-sort\": \"^12.1.1\",\n \"parcel\": \"^2.12.0\",\n \"react\": \"^18.3.1\",\n \"react-dom\": \"^18.3.1\",\n \"typescript\": \"^5.2.2\"\n },\n \"peerDependencies\": {\n \"@pipecat-ai/client-js\": \"*\",\n \"react\": \">=18\",\n \"react-dom\": \">=18\"\n },\n \"dependencies\": {\n \"jotai\": \"^2.9.0\"\n }\n}\n","/**\n * Copyright (c) 2024, Daily.\n *\n * SPDX-License-Identifier: BSD-2-Clause\n */\n\nimport { RTVIEvent, TransportState } from \"@pipecat-ai/client-js\";\nimport React, { createContext, useCallback, useState } from \"react\";\n\nimport { usePipecatClient } from \"./usePipecatClient\";\nimport { useRTVIClientEvent } from \"./useRTVIClientEvent\";\n\nexport const PipecatClientCamStateContext = createContext<{\n enableCam: (enabled: boolean) => void;\n isCamEnabled: boolean;\n}>({\n enableCam: () => {\n throw new Error(\n \"PipecatClientCamStateContext: enableCam() called outside of provider\"\n );\n },\n isCamEnabled: false,\n});\nexport const PipecatClientMicStateContext = createContext<{\n enableMic: (enabled: boolean) => void;\n isMicEnabled: boolean;\n}>({\n enableMic: () => {\n throw new Error(\n \"PipecatClientMicStateContext: enableMic() called outside of provider\"\n );\n },\n isMicEnabled: false,\n});\nexport const PipecatClientScreenShareStateContext = createContext<{\n enableScreenShare: (enabled: boolean) => void;\n isScreenShareEnabled: boolean;\n}>({\n enableScreenShare: () => {\n throw new Error(\n \"PipecatClientScreenShareStateContext: enableScreenShare() called outside of provider\"\n );\n },\n isScreenShareEnabled: false,\n});\nexport const PipecatClientTransportStateContext =\n createContext<TransportState>(\"disconnected\");\n\nexport const PipecatClientStateProvider: React.FC<React.PropsWithChildren> = ({\n children,\n}) => {\n const client = usePipecatClient();\n const [isCamEnabled, setIsCamEnabled] = useState(false);\n const [isMicEnabled, setIsMicEnabled] = useState(false);\n const [isScreenShareEnabled, setIsScreenShareEnabled] = useState(false);\n const [transportState, setTransportState] =\n useState<TransportState>(\"disconnected\");\n\n useRTVIClientEvent(RTVIEvent.TransportStateChanged, (state) => {\n setTransportState(state);\n if (state === \"initialized\" && client) {\n setIsCamEnabled(client.isCamEnabled ?? false);\n setIsMicEnabled(client.isMicEnabled ?? false);\n setIsScreenShareEnabled(client.isSharingScreen ?? false);\n }\n });\n\n const enableCam = useCallback(\n (enabled: boolean) => {\n setIsCamEnabled(enabled);\n client?.enableCam?.(enabled);\n },\n [client]\n );\n\n const enableMic = useCallback(\n (enabled: boolean) => {\n setIsMicEnabled(enabled);\n client?.enableMic?.(enabled);\n },\n [client]\n );\n\n const enableScreenShare = useCallback(\n (enabled: boolean) => {\n client?.enableScreenShare?.(enabled);\n },\n [client]\n );\n\n useRTVIClientEvent(RTVIEvent.ScreenTrackStarted, (_track, participant) => {\n if (participant?.local) {\n setIsScreenShareEnabled(true);\n }\n });\n\n useRTVIClientEvent(RTVIEvent.ScreenTrackStopped, (_track, participant) => {\n if (participant?.local) {\n setIsScreenShareEnabled(false);\n }\n });\n\n return (\n <PipecatClientTransportStateContext.Provider value={transportState}>\n <PipecatClientCamStateContext.Provider\n value={{ enableCam, isCamEnabled }}\n >\n <PipecatClientMicStateContext.Provider\n value={{ enableMic, isMicEnabled }}\n >\n <PipecatClientScreenShareStateContext.Provider\n value={{ enableScreenShare, isScreenShareEnabled }}\n >\n {children}\n </PipecatClientScreenShareStateContext.Provider>\n </PipecatClientMicStateContext.Provider>\n </PipecatClientCamStateContext.Provider>\n </PipecatClientTransportStateContext.Provider>\n );\n};\n","/**\n * Copyright (c) 2024, Daily.\n *\n * SPDX-License-Identifier: BSD-2-Clause\n */\n\nimport { RTVIEvent, RTVIEventHandler } from \"@pipecat-ai/client-js\";\nimport { useContext, useEffect } from \"react\";\n\nimport { RTVIEventContext } from \"./RTVIEventContext\";\n\nexport const useRTVIClientEvent = <E extends RTVIEvent>(\n event: E,\n handler: RTVIEventHandler<E>\n) => {\n const { on, off } = useContext(RTVIEventContext);\n\n useEffect(() => {\n on(event, handler);\n return () => {\n off(event, handler);\n };\n }, [event, handler, on, off]);\n};\n","/**\n * Copyright (c) 2024, Daily.\n *\n * SPDX-License-Identifier: BSD-2-Clause\n */\nimport { RTVIEvent, RTVIEventHandler } from \"@pipecat-ai/client-js\";\nimport { createContext } from \"react\";\n\nexport const RTVIEventContext = createContext<{\n on: <E extends RTVIEvent>(event: E, handler: RTVIEventHandler<E>) => void;\n off: <E extends RTVIEvent>(event: E, handler: RTVIEventHandler<E>) => void;\n}>({\n on: () => {},\n off: () => {},\n});\n","import React, { useCallback } from \"react\";\n\nimport { usePipecatClientCamControl } from \"./usePipecatClientCamControl\";\n\nexport interface PipecatClientCamToggleProps {\n /**\n * Callback fired when camera state changes\n */\n onCamEnabledChanged?: (enabled: boolean) => void;\n\n /**\n * Optional prop to disable the cam toggle.\n * When disabled, changes are not applied to the client.\n * @default false\n */\n disabled?: boolean;\n\n /**\n * Render prop that provides state and handlers to the children\n */\n children: (props: {\n disabled?: boolean;\n isCamEnabled: boolean;\n onClick: () => void;\n }) => React.ReactNode;\n}\n\n/**\n * Headless component for controlling camera state\n */\nexport const PipecatClientCamToggle: React.FC<PipecatClientCamToggleProps> = ({\n onCamEnabledChanged,\n disabled = false,\n children,\n}) => {\n const { isCamEnabled, enableCam } = usePipecatClientCamControl();\n\n const handleToggleCam = useCallback(() => {\n if (disabled) return;\n\n const newEnabledState = !isCamEnabled;\n enableCam(newEnabledState);\n onCamEnabledChanged?.(newEnabledState);\n }, [disabled, enableCam, isCamEnabled, onCamEnabledChanged]);\n\n return (\n <>\n {children({\n isCamEnabled,\n onClick: handleToggleCam,\n disabled,\n })}\n </>\n );\n};\n\nexport default PipecatClientCamToggle;\n","/**\n * Copyright (c) 2024, Daily.\n *\n * SPDX-License-Identifier: BSD-2-Clause\n */\nimport { useContext } from \"react\";\n\nimport { PipecatClientCamStateContext } from \"./PipecatClientState\";\n\n/**\n * Hook to control camera state\n */\nexport const usePipecatClientCamControl = () =>\n useContext(PipecatClientCamStateContext);\n","import React, { useCallback } from \"react\";\n\nimport { usePipecatClientMicControl } from \"./usePipecatClientMicControl\";\n\nexport interface PipecatClientMicToggleProps {\n /**\n * Callback fired when microphone state changes\n */\n onMicEnabledChanged?: (enabled: boolean) => void;\n\n /**\n * Optional prop to disable the mic toggle.\n * When disabled, changes are not applied to the client.\n * @default false\n */\n disabled?: boolean;\n\n /**\n * Render prop that provides state and handlers to the children\n */\n children: (props: {\n disabled?: boolean;\n isMicEnabled: boolean;\n onClick: () => void;\n }) => React.ReactNode;\n}\n\n/**\n * Headless component for controlling microphone state\n */\nexport const PipecatClientMicToggle: React.FC<PipecatClientMicToggleProps> = ({\n onMicEnabledChanged,\n disabled = false,\n children,\n}) => {\n const { enableMic, isMicEnabled } = usePipecatClientMicControl();\n\n const handleToggleMic = useCallback(() => {\n if (disabled) return;\n\n const newEnabledState = !isMicEnabled;\n enableMic(newEnabledState);\n onMicEnabledChanged?.(newEnabledState);\n }, [disabled, enableMic, isMicEnabled, onMicEnabledChanged]);\n\n return (\n <>\n {children({\n isMicEnabled,\n onClick: handleToggleMic,\n disabled,\n })}\n </>\n );\n};\n\nexport default PipecatClientMicToggle;\n","/**\n * Copyright (c) 2024, Daily.\n *\n * SPDX-License-Identifier: BSD-2-Clause\n */\n\nimport { useContext } from \"react\";\n\nimport { PipecatClientMicStateContext } from \"./PipecatClientState\";\n\n/**\n * Hook to control microphone state\n */\nexport const usePipecatClientMicControl = () =>\n useContext(PipecatClientMicStateContext);\n","/**\n * Copyright (c) 2025, Daily.\n *\n * SPDX-License-Identifier: BSD-2-Clause\n */\n\nimport React, { useCallback, useEffect } from \"react\";\n\nimport { usePipecatClientScreenShareControl } from \"./usePipecatClientScreenShareControl\";\n\nexport interface PipecatClientScreenShareToggleProps {\n /**\n * Callback when screen share state changes\n */\n onScreenShareEnabledChanged?: (enabled: boolean) => void;\n\n /**\n * Optional prop to disable the screen share toggle.\n * When disabled, changes are not applied to the client.\n * @default false\n */\n disabled?: boolean;\n\n /**\n * Render prop that provides state and handlers to the children\n */\n children: (props: {\n disabled?: boolean;\n isScreenShareEnabled: boolean;\n onClick: () => void;\n }) => React.ReactNode;\n}\n\n/**\n * Headless component for controlling screen share state\n */\nexport const PipecatClientScreenShareToggle: React.FC<\n PipecatClientScreenShareToggleProps\n> = ({ onScreenShareEnabledChanged, disabled = false, children }) => {\n const { enableScreenShare, isScreenShareEnabled } =\n usePipecatClientScreenShareControl();\n\n const handleToggleScreenShare = useCallback(() => {\n if (disabled) return;\n enableScreenShare(!isScreenShareEnabled);\n }, [disabled, enableScreenShare, isScreenShareEnabled]);\n\n useEffect(() => {\n onScreenShareEnabledChanged?.(isScreenShareEnabled);\n }, [isScreenShareEnabled, onScreenShareEnabledChanged]);\n\n return (\n <>\n {children({\n isScreenShareEnabled,\n onClick: handleToggleScreenShare,\n disabled,\n })}\n </>\n );\n};\n\nexport default PipecatClientScreenShareToggle;\n","/**\n * Copyright (c) 2025, Daily.\n *\n * SPDX-License-Identifier: BSD-2-Clause\n */\n\nimport { useContext } from \"react\";\n\nimport { PipecatClientScreenShareStateContext } from \"./PipecatClientState\";\n\n/**\n * Hook to control screen share state using React Context\n * This provides a simpler interface for basic screen share control\n * For more advanced state management with Jotai atoms, use usePipecatClientScreenShare\n */\nexport const usePipecatClientScreenShareControl = () =>\n useContext(PipecatClientScreenShareStateContext);\n","/**\n * Copyright (c) 2024, Daily.\n *\n * SPDX-License-Identifier: BSD-2-Clause\n */\n\nimport React, { forwardRef, useEffect, useRef } from \"react\";\n\nimport useMergedRef from \"./useMergedRef\";\nimport { usePipecatClientMediaTrack } from \"./usePipecatClientMediaTrack\";\n\ninterface PipecatClientVideoInterface {\n aspectRatio: number;\n height: number;\n width: number;\n}\n\nexport interface Props\n extends Omit<React.VideoHTMLAttributes<HTMLVideoElement>, \"onResize\"> {\n participant: \"local\" | \"bot\";\n\n /**\n * Defines the video track type to display. Default: 'video'.\n */\n trackType?: \"screenVideo\" | \"video\";\n\n /**\n * Defines whether the video should be fully contained or cover the box. Default: 'contain'.\n */\n fit?: \"contain\" | \"cover\";\n /**\n * Forces the video to be mirrored, if set.\n */\n mirror?: boolean;\n\n /**\n * Optional callback, which is triggered whenever the video's rendered width or height changes.\n * Returns the video's native width, height and aspectRatio.\n */\n onResize?(dimensions: PipecatClientVideoInterface): void;\n}\n\nexport const PipecatClientVideo = forwardRef<HTMLVideoElement, Props>(\n function VoiceClientVideo(\n {\n participant = \"local\",\n fit = \"contain\",\n mirror,\n onResize,\n style = {},\n trackType = \"video\",\n ...props\n },\n ref\n ) {\n const videoTrack: MediaStreamTrack | null = usePipecatClientMediaTrack(\n trackType,\n participant\n );\n\n const videoEl = useRef<HTMLVideoElement>(null);\n const videoRef = useMergedRef<HTMLVideoElement>(videoEl, ref);\n\n /**\n * Handle canplay & picture-in-picture events.\n */\n useEffect(function setupVideoEvents() {\n const video = videoEl.current;\n if (!video) return;\n\n const playVideo = () => {\n const promise = video.play();\n if (promise !== undefined) {\n promise\n .then(() => {\n // All good, playback started.\n video.controls = false;\n })\n .catch((error) => {\n // Auto-play was prevented. Show video controls, so user can play video manually.\n video.controls = true;\n console.warn(\"Failed to play video\", error);\n });\n }\n };\n\n const handleCanPlay = () => {\n if (!video.paused) return;\n playVideo();\n };\n const handleEnterPIP = () => {\n video.style.transform = \"scale(1)\";\n };\n const handleLeavePIP = () => {\n video.style.transform = \"\";\n setTimeout(() => {\n if (video.paused) playVideo();\n }, 100);\n };\n const handleVisibilityChange = () => {\n if (document.visibilityState === \"hidden\") return;\n if (!video.paused) return;\n playVideo();\n };\n video.addEventListener(\"canplay\", handleCanPlay);\n video.addEventListener(\"enterpictureinpicture\", handleEnterPIP);\n video.addEventListener(\"leavepictureinpicture\", handleLeavePIP);\n\n // Videos can be paused if media was played in another app on iOS.\n document.addEventListener(\"visibilitychange\", handleVisibilityChange);\n return () => {\n video.removeEventListener(\"canplay\", handleCanPlay);\n video.removeEventListener(\"enterpictureinpicture\", handleEnterPIP);\n video.removeEventListener(\"leavepictureinpicture\", handleLeavePIP);\n document.removeEventListener(\n \"visibilitychange\",\n handleVisibilityChange\n );\n };\n }, []);\n\n /**\n * Update srcObject.\n */\n useEffect(\n function updateSrcObject() {\n const video = videoEl.current;\n if (!video || !videoTrack) return;\n video.srcObject = new MediaStream([videoTrack]);\n video.load();\n return () => {\n // clean up when unmounted\n video.srcObject = null;\n video.load();\n };\n },\n [videoTrack, videoTrack?.id]\n );\n\n /**\n * Add optional event listener for resize event so the parent component\n * can know the video's native aspect ratio.\n */\n useEffect(\n function reportVideoDimensions() {\n const video = videoEl.current;\n if (!onResize || !video) return;\n\n let frame: ReturnType<typeof requestAnimationFrame>;\n function handleResize() {\n if (frame) cancelAnimationFrame(frame);\n frame = requestAnimationFrame(() => {\n const video = videoEl.current;\n if (!video || document.hidden) return;\n const videoWidth = video.videoWidth;\n const videoHeight = video.videoHeight;\n if (videoWidth && videoHeight) {\n onResize?.({\n aspectRatio: videoWidth / videoHeight,\n height: videoHeight,\n width: videoWidth,\n });\n }\n });\n }\n\n handleResize();\n video.addEventListener(\"loadedmetadata\", handleResize);\n video.addEventListener(\"resize\", handleResize);\n\n return () => {\n if (frame) cancelAnimationFrame(frame);\n video.removeEventListener(\"loadedmetadata\", handleResize);\n video.removeEventListener(\"resize\", handleResize);\n };\n },\n [onResize]\n );\n\n return (\n <video\n autoPlay\n muted\n playsInline\n ref={videoRef}\n style={{\n objectFit: fit,\n transform: mirror ? \"scale(-1, 1)\" : \"\",\n ...style,\n }}\n {...props}\n />\n );\n }\n);\nPipecatClientVideo.displayName = \"PipecatClientVideo\";\n","/**\n * Copyright (c) 2024, Daily.\n *\n * SPDX-License-Identifier: BSD-2-Clause\n *\n * This file contains code derived from:\n * https://github.com/jaredLunde/react-hook/blob/master/packages/merged-ref/src/index.tsx\n * Original author: Jared Lunde (https://github.com/jaredLunde)\n * Original license: MIT (https://github.com/jaredLunde/react-hook/blob/master/LICENSE)\n */\n\nimport React, { useCallback } from \"react\";\n\nfunction useMergedRef<T>(...refs: React.Ref<T>[]): React.RefCallback<T> {\n return useCallback(\n (element: T) => {\n for (let i = 0; i < refs.length; i++) {\n const ref = refs[i];\n if (typeof ref === \"function\") ref(element);\n else if (ref && typeof ref === \"object\")\n (ref as React.MutableRefObject<T>).current = element;\n }\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n refs\n );\n}\n\nexport default useMergedRef;\n","/**\n * Copyright (c) 2024, Daily.\n *\n * SPDX-License-Identifier: BSD-2-Clause\n */\nimport { RTVIEvent } from \"@pipecat-ai/client-js\";\nimport { atom, useAtomValue } from \"jotai\";\nimport { useAtomCallback } from \"jotai/utils\";\nimport { useCallback, useEffect } from \"react\";\n\nimport { usePipecatClient } from \"./usePipecatClient\";\nimport { useRTVIClientEvent } from \"./useRTVIClientEvent\";\n\ntype OptionalMediaDeviceInfo = MediaDeviceInfo | Record<string, never>;\n\nconst availableMicsAtom = atom<MediaDeviceInfo[]>([]);\nconst availableCamsAtom = atom<MediaDeviceInfo[]>([]);\nconst availableSpeakersAtom = atom<MediaDeviceInfo[]>([]);\nconst selectedMicAtom = atom<OptionalMediaDeviceInfo>({});\nconst selectedCamAtom = atom<OptionalMediaDeviceInfo>({});\nconst selectedSpeakerAtom = atom<OptionalMediaDeviceInfo>({});\n\nexport const usePipecatClientMediaDevices = () => {\n const client = usePipecatClient();\n\n const availableCams = useAtomValue(availableCamsAtom);\n const availableMics = useAtomValue(availableMicsAtom);\n const availableSpeakers = useAtomValue(availableSpeakersAtom);\n const selectedCam = useAtomValue(selectedCamAtom);\n const selectedMic = useAtomValue(selectedMicAtom);\n const selectedSpeaker = useAtomValue(selectedSpeakerAtom);\n\n const initDevices = useAtomCallback(\n useCallback(\n async (_get, set) => {\n if (!client) return;\n\n const availableCams = await client.getAllCams();\n const availableMics = await client.getAllMics();\n const availableSpeakers = await client.getAllSpeakers();\n\n set(availableCamsAtom, availableCams);\n set(availableMicsAtom, availableMics);\n set(availableSpeakersAtom, availableSpeakers);\n\n set(selectedCamAtom, client.selectedCam);\n set(selectedMicAtom, client.selectedMic);\n set(selectedSpeakerAtom, client.selectedSpeaker);\n },\n [client]\n )\n );\n\n useEffect(() => {\n initDevices();\n }, [initDevices]);\n\n useRTVIClientEvent(\n RTVIEvent.AvailableCamsUpdated,\n useAtomCallback(\n useCallback((_get, set, cams) => {\n set(availableCamsAtom, cams);\n }, [])\n )\n );\n useRTVIClientEvent(\n RTVIEvent.AvailableMicsUpdated,\n useAtomCallback(\n useCallback((_get, set, mics) => {\n set(availableMicsAtom, mics);\n }, [])\n )\n );\n useRTVIClientEvent(\n RTVIEvent.AvailableSpeakersUpdated,\n useAtomCallback(\n useCallback((_get, set, speakers) => {\n set(availableSpeakersAtom, speakers);\n }, [])\n )\n );\n useRTVIClientEvent(\n RTVIEvent.CamUpdated,\n useAtomCallback(\n useCallback((_get, set, cam) => {\n set(selectedCamAtom, cam);\n }, [])\n )\n );\n useRTVIClientEvent(\n RTVIEvent.MicUpdated,\n useAtomCallback(\n useCallback((_get, set, mic) => {\n set(selectedMicAtom, mic);\n }, [])\n )\n );\n useRTVIClientEvent(\n RTVIEvent.SpeakerUpdated,\n useAtomCallback(\n useCallback((_get, set, speaker) => {\n set(selectedSpeakerAtom, speaker);\n }, [])\n )\n );\n\n const updateCam = useCallback(\n (id: string) => {\n client?.updateCam(id);\n },\n [client]\n );\n const updateMic = useCallback(\n (id: string) => {\n client?.updateMic(id);\n },\n [client]\n );\n const updateSpeaker = useCallback(\n (id: string) => {\n client?.updateSpeaker(id);\n },\n [client]\n );\n\n return {\n availableCams,\n availableMics,\n availableSpeakers,\n selectedCam,\n selectedMic,\n selectedSpeaker,\n updateCam,\n updateMic,\n updateSpeaker,\n };\n};\n","/**\n * Copyright (c) 2024, Daily.\n *\n * SPDX-License-Identifier: BSD-2-Clause\n */\n\nimport { useContext } from \"react\";\n\nimport { PipecatClientTransportStateContext } from \"./PipecatClientState\";\n\nexport const usePipecatClientTransportState = () =>\n useContext(PipecatClientTransportStateContext);\n","/**\n * Copyright (c) 2024, Daily.\n *\n * SPDX-License-Identifier: BSD-2-Clause\n */\n\nimport React, { useEffect, useRef } from \"react\";\n\nimport { usePipecatClientMediaTrack } from \"./usePipecatClientMediaTrack\";\n\ntype ParticipantType = Parameters<typeof usePipecatClientMediaTrack>[1];\n\ninterface Props {\n backgroundColor?: string;\n barColor?: string;\n barCount?: number;\n barGap?: number;\n barLineCap?: \"round\" | \"square\";\n barMaxHeight?: number;\n barOrigin?: \"top\" | \"bottom\" | \"center\";\n barWidth?: number;\n participantType: ParticipantType;\n}\n\nexport const VoiceVisualizer: React.FC<Props> = React.memo(\n ({\n backgroundColor = \"transparent\",\n barColor = \"black\",\n barCount = 5,\n barGap = 12,\n barLineCap = \"round\",\n barMaxHeight = 120,\n barOrigin = \"center\",\n barWidth = 30,\n participantType,\n }) => {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n\n const track: MediaStreamTrack | null = usePipecatClientMediaTrack(\n \"audio\",\n participantType\n );\n\n useEffect(() => {\n if (!canvasRef.current) return;\n\n const canvasWidth = barCount * barWidth + (barCount - 1) * barGap;\n const canvasHeight = barMaxHeight;\n\n const canvas = canvasRef.current;\n\n const scaleFactor = 2;\n\n // Make canvas fill the width and height of its container\n const resizeCanvas = () => {\n canvas.width = canvasWidth * scaleFactor;\n canvas.height = canvasHeight * scaleFactor;\n\n canvas.style.width = `${canvasWidth}px`;\n canvas.style.height = `${canvasHeight}px`;\n\n canvasCtx.lineCap = barLineCap;\n canvasCtx.scale(scaleFactor, scaleFactor);\n };\n\n const canvasCtx = canvas.getContext(\"2d\")!;\n resizeCanvas();\n\n if (!track) return;\n\n const audioContext = new AudioContext();\n const source = audioContext.createMediaStreamSource(\n new MediaStream([track])\n );\n const analyser = audioContext.createAnalyser();\n\n analyser.fftSize = 1024;\n\n source.connect(analyser);\n\n const frequencyData = new Uint8Array(analyser.frequencyBinCount);\n\n canvasCtx.lineCap = barLineCap;\n\n // Create frequency bands based on barCount\n const bands = Array.from({ length: barCount }, (_, i) => {\n // Use improved logarithmic scale for better frequency distribution\n const minFreq = barCount > 20 ? 200 : 80; // Adjust min frequency based on bar count\n const maxFreq = 10000; // Cover most important audio frequencies\n\n // Use Mel scale inspired approach for more perceptually uniform distribution\n // This helps with a large number of bars by placing fewer in the very low range\n // https://en.wikipedia.org/wiki/Mel_scale\n const melMin = 2595 * Math.log10(1 + minFreq / 700);\n const melMax = 2595 * Math.log10(1 + maxFreq / 700);\n const melStep = (melMax - melMin) / barCount;\n\n const melValue = melMin + i * melStep;\n const startFreq = 700 * (Math.pow(10, melValue / 2595) - 1);\n const endFreq = 700 * (Math.pow(10, (melValue + melStep) / 2595) - 1);\n\n return {\n startFreq,\n endFreq,\n smoothValue: 0,\n };\n });\n\n const getFrequencyBinIndex = (frequency: number) => {\n const nyquist = audioContext.sampleRate / 2;\n return Math.round(\n (frequency / nyquist) * (analyser.frequencyBinCount - 1)\n );\n };\n\n function drawSpectrum() {\n analyser.getByteFrequencyData(frequencyData);\n canvasCtx.clearRect(\n 0,\n 0,\n canvas.width / scaleFactor,\n canvas.height / scaleFactor\n );\n canvasCtx.fillStyle = backgroundColor;\n canvasCtx.fillRect(\n 0,\n 0,\n canvas.width / scaleFactor,\n canvas.height / scaleFactor\n );\n\n let isActive = false;\n\n const totalBarsWidth =\n bands.length * barWidth + (bands.length - 1) * barGap;\n const startX = (canvas.width / scaleFactor - totalBarsWidth) / 2; // Center bars\n\n const adjustedCircleRadius = barWidth / 2; // Fixed radius for reset circles\n\n bands.forEach((band, i) => {\n const startIndex = getFrequencyBinIndex(band.startFreq);\n const endIndex = getFrequencyBinIndex(band.endFreq);\n const bandData = frequencyData.slice(startIndex, endIndex);\n const bandValue =\n bandData.reduce((acc, val) => acc + val, 0) / bandData.length;\n\n const smoothingFactor = 0.2;\n\n if (bandValue < 1) {\n band.smoothValue = Math.max(\n band.smoothValue - smoothingFactor * 5,\n 0\n );\n } else {\n band.smoothValue =\n band.smoothValue +\n (bandValue - band.smoothValue) * smoothingFactor;\n isActive = true;\n }\n\n const x = startX + i * (barWidth + barGap);\n // Calculate bar height with a maximum cap\n const minHeight = 0;\n const barHeight = Math.max(\n minHeight,\n Math.min((band.smoothValue / 255) * barMaxHeight, barMaxHeight)\n );\n\n let yTop, yBottom;\n const canvasHeight = canvas.height / scaleFactor;\n\n switch (barOrigin) {\n case \"top\":\n yTop = adjustedCircleRadius;\n yBottom = Math.min(\n adjustedCircleRadius + barHeight,\n canvasHeight - adjustedCircleRadius\n );\n break;\n case \"bottom\":\n yBottom = canvasHeight - adjustedCircleRadius;\n yTop = Math.max(yBottom - barHeight, adjustedCircleRadius);\n break;\n case \"center\":\n default:\n yTop = Math.max(\n canvasHeight / 2 - barHeight / 2,\n adjustedCircleRadius\n );\n yBottom = Math.min(\n canvasHeight / 2 + barHeight / 2,\n canvasHeight - adjustedCircleRadius\n );\n break;\n }\n\n if (band.smoothValue > 0) {\n canvasCtx.beginPath();\n canvasCtx.moveTo(x + barWidth / 2, yTop);\n canvasCtx.lineTo(x + barWidth / 2, yBottom);\n canvasCtx.lineWidth = barWidth;\n canvasCtx.strokeStyle = barColor;\n canvasCtx.stroke();\n } else {\n drawInactiveCircle(adjustedCircleRadius, barColor, x, yTop);\n }\n });\n\n if (!isActive) {\n drawInactiveCircles(adjustedCircleRadius, barColor);\n }\n\n requestAnimationFrame(drawSpectrum);\n }\n\n function drawInactiveCircle(\n circleRadius: number,\n color: string,\n x: number,\n y: number\n ) {\n switch (barLineCap) {\n case \"square\":\n canvasCtx.fillStyle = color;\n canvasCtx.fillRect(\n x + barWidth / 2 - circleRadius,\n y - circleRadius,\n circleRadius * 2,\n circleRadius * 2\n );\n break;\n case \"round\":\n default:\n canvasCtx.beginPath();\n canvasCtx.arc(x + barWidth / 2, y, circleRadius, 0, 2 * Math.PI);\n canvasCtx.fillStyle = color;\n canvasCtx.fill();\n canvasCtx.closePath();\n break;\n }\n }\n\n function drawInactiveCircles(circleRadius: number, color: string) {\n const totalBarsWidth =\n bands.length * barWidth + (bands.length - 1) * barGap;\n const startX = (canvas.width / scaleFactor - totalBarsWidth) / 2;\n const canvasHeight = canvas.height / scaleFactor;\n\n let y;\n switch (barOrigin) {\n case \"top\":\n y = circleRadius;\n break;\n case \"bottom\":\n y = canvasHeight - circleRadius;\n break;\n case \"center\":\n default:\n y = canvasHeight / 2;\n break;\n }\n\n bands.forEach((_, i) => {\n const x = startX + i * (barWidth + barGap);\n drawInactiveCircle(circleRadius, color, x, y);\n });\n }\n\n drawSpectrum();\n\n // Handle resizing\n window.addEventListener(\"resize\", resizeCanvas);\n\n return () => {\n audioContext.close();\n window.removeEventListener(\"resize\", resizeCanvas);\n };\n }, [\n backgroundColor,\n barColor,\n barCount,\n barGap,\n barLineCap,\n barMaxHeight,\n barOrigin,\n barWidth,\n track,\n ]);\n\n return (\n <canvas\n ref={canvasRef}\n style={{\n display: \"block\",\n width: \"100%\",\n height: \"100%\",\n }}\n />\n );\n }\n);\n\nVoiceVisualizer.displayName = \"VoiceVisualizer\";\n"],"names":[],"version":3,"file":"index.js.map"}
|
package/dist/index.module.js
CHANGED
|
@@ -31,7 +31,7 @@ import {Provider as $h9lXz$Provider} from "jotai/react";
|
|
|
31
31
|
|
|
32
32
|
|
|
33
33
|
var $ad20387e24e513d4$exports = {};
|
|
34
|
-
$ad20387e24e513d4$exports = JSON.parse("{\"name\":\"@pipecat-ai/client-react\",\"version\":\"1.0
|
|
34
|
+
$ad20387e24e513d4$exports = JSON.parse("{\"name\":\"@pipecat-ai/client-react\",\"version\":\"1.1.0\",\"license\":\"BSD-2-Clause\",\"main\":\"dist/index.js\",\"module\":\"dist/index.module.js\",\"types\":\"dist/index.d.ts\",\"source\":\"src/index.ts\",\"repository\":{\"type\":\"git\",\"url\":\"git+https://github.com/pipecat-ai/pipecat-client-web.git\"},\"files\":[\"dist\",\"package.json\",\"README.md\"],\"scripts\":{\"build\":\"parcel build --no-cache\",\"dev\":\"parcel watch\",\"lint\":\"eslint . --report-unused-disable-directives --max-warnings 0 --ignore-pattern 'dist/'\"},\"devDependencies\":{\"@pipecat-ai/client-js\":\"*\",\"@types/react\":\"^18.3.3\",\"@types/react-dom\":\"^18.3.0\",\"@typescript-eslint/eslint-plugin\":\"^8.32.0\",\"eslint\":\"^9.11.1\",\"eslint-config-prettier\":\"^9.1.0\",\"eslint-plugin-react-hooks\":\"^5.2.0\",\"eslint-plugin-simple-import-sort\":\"^12.1.1\",\"parcel\":\"^2.12.0\",\"react\":\"^18.3.1\",\"react-dom\":\"^18.3.1\",\"typescript\":\"^5.2.2\"},\"peerDependencies\":{\"@pipecat-ai/client-js\":\"*\",\"react\":\">=18\",\"react-dom\":\">=18\"},\"dependencies\":{\"jotai\":\"^2.9.0\"}}");
|
|
35
35
|
|
|
36
36
|
|
|
37
37
|
|
|
@@ -78,17 +78,25 @@ const $a90aa7250c094218$export$802b42df0e0d8153 = /*#__PURE__*/ (0, $h9lXz$creat
|
|
|
78
78
|
},
|
|
79
79
|
isMicEnabled: false
|
|
80
80
|
});
|
|
81
|
+
const $a90aa7250c094218$export$8e633e67c760098b = /*#__PURE__*/ (0, $h9lXz$createContext)({
|
|
82
|
+
enableScreenShare: ()=>{
|
|
83
|
+
throw new Error("PipecatClientScreenShareStateContext: enableScreenShare() called outside of provider");
|
|
84
|
+
},
|
|
85
|
+
isScreenShareEnabled: false
|
|
86
|
+
});
|
|
81
87
|
const $a90aa7250c094218$export$db79fdf85ddd6b65 = /*#__PURE__*/ (0, $h9lXz$createContext)("disconnected");
|
|
82
88
|
const $a90aa7250c094218$export$4777554fda61c378 = ({ children: children })=>{
|
|
83
89
|
const client = (0, $034a56e7ee1b7bed$export$777fa8498be78705)();
|
|
84
90
|
const [isCamEnabled, setIsCamEnabled] = (0, $h9lXz$useState)(false);
|
|
85
91
|
const [isMicEnabled, setIsMicEnabled] = (0, $h9lXz$useState)(false);
|
|
92
|
+
const [isScreenShareEnabled, setIsScreenShareEnabled] = (0, $h9lXz$useState)(false);
|
|
86
93
|
const [transportState, setTransportState] = (0, $h9lXz$useState)("disconnected");
|
|
87
94
|
(0, $824ea64b5f757259$export$33a6ac53b8f02625)((0, $h9lXz$RTVIEvent).TransportStateChanged, (state)=>{
|
|
88
95
|
setTransportState(state);
|
|
89
96
|
if (state === "initialized" && client) {
|
|
90
97
|
setIsCamEnabled(client.isCamEnabled ?? false);
|
|
91
98
|
setIsMicEnabled(client.isMicEnabled ?? false);
|
|
99
|
+
setIsScreenShareEnabled(client.isSharingScreen ?? false);
|
|
92
100
|
}
|
|
93
101
|
});
|
|
94
102
|
const enableCam = (0, $h9lXz$useCallback)((enabled)=>{
|
|
@@ -103,6 +111,17 @@ const $a90aa7250c094218$export$4777554fda61c378 = ({ children: children })=>{
|
|
|
103
111
|
}, [
|
|
104
112
|
client
|
|
105
113
|
]);
|
|
114
|
+
const enableScreenShare = (0, $h9lXz$useCallback)((enabled)=>{
|
|
115
|
+
client?.enableScreenShare?.(enabled);
|
|
116
|
+
}, [
|
|
117
|
+
client
|
|
118
|
+
]);
|
|
119
|
+
(0, $824ea64b5f757259$export$33a6ac53b8f02625)((0, $h9lXz$RTVIEvent).ScreenTrackStarted, (_track, participant)=>{
|
|
120
|
+
if (participant?.local) setIsScreenShareEnabled(true);
|
|
121
|
+
});
|
|
122
|
+
(0, $824ea64b5f757259$export$33a6ac53b8f02625)((0, $h9lXz$RTVIEvent).ScreenTrackStopped, (_track, participant)=>{
|
|
123
|
+
if (participant?.local) setIsScreenShareEnabled(false);
|
|
124
|
+
});
|
|
106
125
|
return (0, $h9lXz$jsx)($a90aa7250c094218$export$db79fdf85ddd6b65.Provider, {
|
|
107
126
|
value: transportState,
|
|
108
127
|
children: (0, $h9lXz$jsx)($a90aa7250c094218$export$d6bdcccacef16204.Provider, {
|
|
@@ -115,7 +134,13 @@ const $a90aa7250c094218$export$4777554fda61c378 = ({ children: children })=>{
|
|
|
115
134
|
enableMic: enableMic,
|
|
116
135
|
isMicEnabled: isMicEnabled
|
|
117
136
|
},
|
|
118
|
-
children:
|
|
137
|
+
children: (0, $h9lXz$jsx)($a90aa7250c094218$export$8e633e67c760098b.Provider, {
|
|
138
|
+
value: {
|
|
139
|
+
enableScreenShare: enableScreenShare,
|
|
140
|
+
isScreenShareEnabled: isScreenShareEnabled
|
|
141
|
+
},
|
|
142
|
+
children: children
|
|
143
|
+
})
|
|
119
144
|
})
|
|
120
145
|
})
|
|
121
146
|
});
|
|
@@ -356,6 +381,44 @@ var $2984fdfc31bad375$export$2e2bcd8739ae039 = $2984fdfc31bad375$export$bc8133b6
|
|
|
356
381
|
|
|
357
382
|
|
|
358
383
|
|
|
384
|
+
/**
|
|
385
|
+
* Copyright (c) 2025, Daily.
|
|
386
|
+
*
|
|
387
|
+
* SPDX-License-Identifier: BSD-2-Clause
|
|
388
|
+
*/
|
|
389
|
+
|
|
390
|
+
const $d39c0bc3744ea030$export$be63b19bd7f7d4f5 = ()=>(0, $h9lXz$useContext)((0, $a90aa7250c094218$export$8e633e67c760098b));
|
|
391
|
+
|
|
392
|
+
|
|
393
|
+
const $d6dc7e80e6e976a0$export$93764714dfab3a46 = ({ onScreenShareEnabledChanged: onScreenShareEnabledChanged, disabled: disabled = false, children: children })=>{
|
|
394
|
+
const { enableScreenShare: enableScreenShare, isScreenShareEnabled: isScreenShareEnabled } = (0, $d39c0bc3744ea030$export$be63b19bd7f7d4f5)();
|
|
395
|
+
const handleToggleScreenShare = (0, $h9lXz$useCallback)(()=>{
|
|
396
|
+
if (disabled) return;
|
|
397
|
+
enableScreenShare(!isScreenShareEnabled);
|
|
398
|
+
}, [
|
|
399
|
+
disabled,
|
|
400
|
+
enableScreenShare,
|
|
401
|
+
isScreenShareEnabled
|
|
402
|
+
]);
|
|
403
|
+
(0, $h9lXz$useEffect)(()=>{
|
|
404
|
+
onScreenShareEnabledChanged?.(isScreenShareEnabled);
|
|
405
|
+
}, [
|
|
406
|
+
isScreenShareEnabled,
|
|
407
|
+
onScreenShareEnabledChanged
|
|
408
|
+
]);
|
|
409
|
+
return (0, $h9lXz$jsx)((0, $h9lXz$Fragment), {
|
|
410
|
+
children: children({
|
|
411
|
+
isScreenShareEnabled: isScreenShareEnabled,
|
|
412
|
+
onClick: handleToggleScreenShare,
|
|
413
|
+
disabled: disabled
|
|
414
|
+
})
|
|
415
|
+
});
|
|
416
|
+
};
|
|
417
|
+
var $d6dc7e80e6e976a0$export$2e2bcd8739ae039 = $d6dc7e80e6e976a0$export$93764714dfab3a46;
|
|
418
|
+
|
|
419
|
+
|
|
420
|
+
|
|
421
|
+
|
|
359
422
|
/**
|
|
360
423
|
* Copyright (c) 2024, Daily.
|
|
361
424
|
*
|
|
@@ -590,6 +653,7 @@ const $f934f1f8b10aaf19$export$642bc4d2d2a376f1 = ()=>{
|
|
|
590
653
|
|
|
591
654
|
|
|
592
655
|
|
|
656
|
+
|
|
593
657
|
/**
|
|
594
658
|
* Copyright (c) 2024, Daily.
|
|
595
659
|
*
|
|
@@ -782,5 +846,5 @@ $993a744193844a95$export$59bf27bd43679db6.displayName = "VoiceVisualizer";
|
|
|
782
846
|
|
|
783
847
|
|
|
784
848
|
|
|
785
|
-
export {$f209aa7ddb77dcb2$export$b52250cb73ff4de1 as PipecatClientAudio, $7cb2ce2c4cbfb401$export$dc9a029eeca8213f as PipecatClientCamToggle, $2984fdfc31bad375$export$bc8133b69ff660a2 as PipecatClientMicToggle, $d2e362c5a07ee3c5$export$bb43666ced7a20d0 as PipecatClientProvider, $6a65deb8615a2ad7$export$85974db6d0cc43b3 as PipecatClientVideo, $034a56e7ee1b7bed$export$777fa8498be78705 as usePipecatClient, $e76ee2f021b54325$export$3ea2601427f0430f as usePipecatClientCamControl, $f934f1f8b10aaf19$export$642bc4d2d2a376f1 as usePipecatClientMediaDevices, $4b4b9099cdb5b776$export$9813dcd2d0c26814 as usePipecatClientMediaTrack, $5905c001b0dc8d25$export$388e706586309ef0 as usePipecatClientMicControl, $33f3729bbe9f09df$export$30aee278309a867b as usePipecatClientTransportState, $824ea64b5f757259$export$33a6ac53b8f02625 as useRTVIClientEvent, $993a744193844a95$export$59bf27bd43679db6 as VoiceVisualizer};
|
|
849
|
+
export {$f209aa7ddb77dcb2$export$b52250cb73ff4de1 as PipecatClientAudio, $7cb2ce2c4cbfb401$export$dc9a029eeca8213f as PipecatClientCamToggle, $2984fdfc31bad375$export$bc8133b69ff660a2 as PipecatClientMicToggle, $d2e362c5a07ee3c5$export$bb43666ced7a20d0 as PipecatClientProvider, $d6dc7e80e6e976a0$export$93764714dfab3a46 as PipecatClientScreenShareToggle, $6a65deb8615a2ad7$export$85974db6d0cc43b3 as PipecatClientVideo, $034a56e7ee1b7bed$export$777fa8498be78705 as usePipecatClient, $e76ee2f021b54325$export$3ea2601427f0430f as usePipecatClientCamControl, $f934f1f8b10aaf19$export$642bc4d2d2a376f1 as usePipecatClientMediaDevices, $4b4b9099cdb5b776$export$9813dcd2d0c26814 as usePipecatClientMediaTrack, $5905c001b0dc8d25$export$388e706586309ef0 as usePipecatClientMicControl, $d39c0bc3744ea030$export$be63b19bd7f7d4f5 as usePipecatClientScreenShareControl, $33f3729bbe9f09df$export$30aee278309a867b as usePipecatClientTransportState, $824ea64b5f757259$export$33a6ac53b8f02625 as useRTVIClientEvent, $993a744193844a95$export$59bf27bd43679db6 as VoiceVisualizer};
|
|
786
850
|
//# sourceMappingURL=index.module.js.map
|
package/dist/index.module.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"mappings":"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","sources":["client-react/src/index.ts","client-react/src/PipecatClientAudio.tsx","client-react/src/usePipecatClientMediaTrack.ts","client-react/src/usePipecatClient.ts","client-react/src/PipecatClientProvider.tsx","client-react/package.json","client-react/src/PipecatClientState.tsx","client-react/src/useRTVIClientEvent.ts","client-react/src/RTVIEventContext.ts","client-react/src/PipecatClientCamToggle.tsx","client-react/src/usePipecatClientCamControl.ts","client-react/src/PipecatClientMicToggle.tsx","client-react/src/usePipecatClientMicControl.ts","client-react/src/PipecatClientVideo.tsx","client-react/src/useMergedRef.ts","client-react/src/usePipecatClientMediaDevices.ts","client-react/src/usePipecatClientTransportState.ts","client-react/src/VoiceVisualizer.tsx"],"sourcesContent":["/**\n * Copyright (c) 2024, Daily.\n *\n * SPDX-License-Identifier: BSD-2-Clause\n */\n\nimport { PipecatClientAudio } from \"./PipecatClientAudio\";\nimport { PipecatClientCamToggle } from \"./PipecatClientCamToggle\";\nimport { PipecatClientMicToggle } from \"./PipecatClientMicToggle\";\nimport { PipecatClientProvider } from \"./PipecatClientProvider\";\nimport { PipecatClientVideo } from \"./PipecatClientVideo\";\nimport { usePipecatClient } from \"./usePipecatClient\";\nimport { usePipecatClientCamControl } from \"./usePipecatClientCamControl\";\nimport { usePipecatClientMediaDevices } from \"./usePipecatClientMediaDevices\";\nimport { usePipecatClientMediaTrack } from \"./usePipecatClientMediaTrack\";\nimport { usePipecatClientMicControl } from \"./usePipecatClientMicControl\";\nimport { usePipecatClientTransportState } from \"./usePipecatClientTransportState\";\nimport { useRTVIClientEvent } from \"./useRTVIClientEvent\";\nimport { VoiceVisualizer } from \"./VoiceVisualizer\";\n\nexport {\n PipecatClientAudio,\n PipecatClientCamToggle,\n PipecatClientMicToggle,\n PipecatClientProvider,\n PipecatClientVideo,\n usePipecatClient,\n usePipecatClientCamControl,\n usePipecatClientMediaDevices,\n usePipecatClientMediaTrack,\n usePipecatClientMicControl,\n usePipecatClientTransportState,\n useRTVIClientEvent,\n VoiceVisualizer,\n};\n","/**\n * Copyright (c) 2024, Daily.\n *\n * SPDX-License-Identifier: BSD-2-Clause\n */\n\nimport { RTVIEvent } from \"@pipecat-ai/client-js\";\nimport { useCallback, useEffect, useRef } from \"react\";\n\nimport { usePipecatClientMediaTrack } from \"./usePipecatClientMediaTrack\";\nimport { useRTVIClientEvent } from \"./useRTVIClientEvent\";\n\nexport const PipecatClientAudio = () => {\n const botAudioRef = useRef<HTMLAudioElement>(null);\n const botAudioTrack = usePipecatClientMediaTrack(\"audio\", \"bot\");\n\n useEffect(() => {\n if (!botAudioRef.current || !botAudioTrack) return;\n if (botAudioRef.current.srcObject) {\n const oldTrack = (\n botAudioRef.current.srcObject as MediaStream\n ).getAudioTracks()[0];\n if (oldTrack.id === botAudioTrack.id) return;\n }\n botAudioRef.current.srcObject = new MediaStream([botAudioTrack]);\n }, [botAudioTrack]);\n\n useRTVIClientEvent(\n RTVIEvent.SpeakerUpdated,\n useCallback((speaker: MediaDeviceInfo) => {\n if (!botAudioRef.current) return;\n if (typeof botAudioRef.current.setSinkId !== \"function\") return;\n botAudioRef.current.setSinkId(speaker.deviceId);\n }, [])\n );\n\n return (\n <>\n <audio ref={botAudioRef} autoPlay />\n </>\n );\n};\nPipecatClientAudio.displayName = \"PipecatClientAudio\";\n","/**\n * Copyright (c) 2024, Daily.\n *\n * SPDX-License-Identifier: BSD-2-Clause\n */\n\nimport { Participant, RTVIEvent, Tracks } from \"@pipecat-ai/client-js\";\nimport { atom, useAtomValue } from \"jotai\";\nimport { atomFamily, useAtomCallback } from \"jotai/utils\";\nimport { PrimitiveAtom } from \"jotai/vanilla\";\nimport { useCallback, useEffect } from \"react\";\n\nimport { usePipecatClient } from \"./usePipecatClient\";\nimport { useRTVIClientEvent } from \"./useRTVIClientEvent\";\n\ntype ParticipantType = keyof Tracks;\ntype TrackType = keyof Tracks[\"local\"];\n\nconst localAudioTrackAtom = atom<MediaStreamTrack | null>(null);\nconst localVideoTrackAtom = atom<MediaStreamTrack | null>(null);\nconst localScreenAudioTrackAtom = atom<MediaStreamTrack | null>(null);\nconst localScreenVideoTrackAtom = atom<MediaStreamTrack | null>(null);\nconst botAudioTrackAtom = atom<MediaStreamTrack | null>(null);\nconst botVideoTrackAtom = atom<MediaStreamTrack | null>(null);\n\nconst trackAtom = atomFamily<\n { local: boolean; trackType: TrackType },\n PrimitiveAtom<MediaStreamTrack | null>\n>(({ local, trackType }) => {\n if (local) {\n switch (trackType) {\n case \"audio\":\n return localAudioTrackAtom;\n case \"screenAudio\":\n return localScreenAudioTrackAtom;\n case \"screenVideo\":\n return localScreenVideoTrackAtom;\n case \"video\":\n return localVideoTrackAtom;\n }\n }\n return trackType === \"audio\" ? botAudioTrackAtom : botVideoTrackAtom;\n});\n\nexport const usePipecatClientMediaTrack = (\n trackType: TrackType,\n participantType: ParticipantType\n) => {\n const client = usePipecatClient();\n const track = useAtomValue(\n trackAtom({ local: participantType === \"local\", trackType })\n );\n\n const updateTrack = useAtomCallback(\n useCallback(\n (\n get,\n set,\n track: MediaStreamTrack,\n trackType: TrackType,\n local: boolean\n ) => {\n const atom = trackAtom({\n local,\n trackType,\n });\n const oldTrack = get(atom);\n if (oldTrack?.id === track.id) return;\n set(atom, track);\n },\n []\n )\n );\n\n useRTVIClientEvent(\n RTVIEvent.TrackStarted,\n useCallback(\n (track: MediaStreamTrack, participant?: Participant) => {\n updateTrack(\n track,\n track.kind as TrackType,\n Boolean(participant?.local)\n );\n },\n [updateTrack]\n )\n );\n\n useRTVIClientEvent(\n RTVIEvent.ScreenTrackStarted,\n useCallback(\n (track: MediaStreamTrack, participant?: Participant) => {\n const trackType =\n track.kind === \"audio\" ? \"screenAudio\" : \"screenVideo\";\n updateTrack(track, trackType, Boolean(participant?.local));\n },\n [updateTrack]\n )\n );\n\n useEffect(() => {\n if (!client) return;\n const tracks = client.tracks();\n const track = tracks?.[participantType]?.[trackType];\n if (!track) return;\n updateTrack(track, trackType, participantType === \"local\");\n }, [participantType, trackType, updateTrack, client]);\n\n return track;\n};\n","/**\n * Copyright (c) 2024, Daily.\n *\n * SPDX-License-Identifier: BSD-2-Clause\n */\n\nimport { useContext } from \"react\";\n\nimport { PipecatClientContext } from \"./PipecatClientProvider\";\n\nexport const usePipecatClient = () => {\n const { client } = useContext(PipecatClientContext);\n return client;\n};\n","/**\n * Copyright (c) 2024, Daily.\n *\n * SPDX-License-Identifier: BSD-2-Clause\n */\n\nimport {\n PipecatClient,\n RTVIEvent,\n RTVIEventHandler,\n setAboutClient,\n} from \"@pipecat-ai/client-js\";\nimport { createStore } from \"jotai\";\nimport { Provider as JotaiProvider } from \"jotai/react\";\nimport React, { createContext, useCallback, useEffect, useRef } from \"react\";\n\nimport {\n name as packageName,\n version as packageVersion,\n} from \"../package.json\";\nimport { PipecatClientStateProvider } from \"./PipecatClientState\";\nimport { RTVIEventContext } from \"./RTVIEventContext\";\n\nexport interface Props {\n client: PipecatClient;\n jotaiStore?: React.ComponentProps<typeof JotaiProvider>[\"store\"];\n}\n\nconst defaultStore = createStore();\n\nexport const PipecatClientContext = createContext<{ client?: PipecatClient }>(\n {}\n);\n\ntype EventHandlersMap = {\n [E in RTVIEvent]?: Set<RTVIEventHandler<E>>;\n};\n\nexport const PipecatClientProvider: React.FC<\n React.PropsWithChildren<Props>\n> = ({ children, client, jotaiStore = defaultStore }) => {\n useEffect(() => {\n setAboutClient({\n library: packageName,\n library_version: packageVersion,\n });\n }, []);\n\n const eventHandlersMap = useRef<EventHandlersMap>({});\n\n useEffect(() => {\n if (!client) return;\n\n const allEvents = Object.values(RTVIEvent).filter((value) =>\n isNaN(Number(value))\n ) as RTVIEvent[];\n\n const allHandlers: Partial<\n Record<\n RTVIEvent,\n (\n ...args: Parameters<Exclude<RTVIEventHandler<RTVIEvent>, undefined>>\n ) => void\n >\n > = {};\n\n allEvents.forEach((event) => {\n type E = typeof event;\n type Handler = Exclude<RTVIEventHandler<E>, undefined>; // Remove undefined\n type Payload = Parameters<Handler>; // Will always be a tuple\n\n const handler = (...payload: Payload) => {\n const handlers = eventHandlersMap.current[event] as\n | Set<Handler>\n | undefined;\n if (!handlers) return;\n handlers.forEach((h) => {\n (\n h as (\n ...args: Parameters<Exclude<RTVIEventHandler<E>, undefined>>\n ) => void\n )(...payload);\n });\n };\n\n allHandlers[event] = handler;\n\n client.on(event, handler);\n });\n\n return () => {\n allEvents.forEach((event) => {\n client.off(event, allHandlers[event]);\n });\n };\n }, [client]);\n\n const on = useCallback(\n <E extends RTVIEvent>(event: E, handler: RTVIEventHandler<E>) => {\n if (!eventHandlersMap.current[event]) {\n eventHandlersMap.current[event] = new Set();\n }\n eventHandlersMap.current[event]!.add(handler);\n },\n []\n );\n\n const off = useCallback(\n <E extends RTVIEvent>(event: E, handler: RTVIEventHandler<E>) => {\n eventHandlersMap.current[event]?.delete(handler);\n },\n []\n );\n\n return (\n <JotaiProvider store={jotaiStore}>\n <PipecatClientContext.Provider value={{ client }}>\n <RTVIEventContext.Provider value={{ on, off }}>\n <PipecatClientStateProvider>{children}</PipecatClientStateProvider>\n </RTVIEventContext.Provider>\n </PipecatClientContext.Provider>\n </JotaiProvider>\n );\n};\nPipecatClientProvider.displayName = \"PipecatClientProvider\";\n","{\n \"name\": \"@pipecat-ai/client-react\",\n \"version\": \"1.0.1\",\n \"license\": \"BSD-2-Clause\",\n \"main\": \"dist/index.js\",\n \"module\": \"dist/index.module.js\",\n \"types\": \"dist/index.d.ts\",\n \"source\": \"src/index.ts\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/pipecat-ai/pipecat-client-web.git\"\n },\n \"files\": [\n \"dist\",\n \"package.json\",\n \"README.md\"\n ],\n \"scripts\": {\n \"build\": \"parcel build --no-cache\",\n \"dev\": \"parcel watch\",\n \"lint\": \"eslint . --report-unused-disable-directives --max-warnings 0 --ignore-pattern 'dist/'\"\n },\n \"devDependencies\": {\n \"@pipecat-ai/client-js\": \"*\",\n \"@types/react\": \"^18.3.3\",\n \"@types/react-dom\": \"^18.3.0\",\n \"@typescript-eslint/eslint-plugin\": \"^8.32.0\",\n \"eslint\": \"^9.11.1\",\n \"eslint-config-prettier\": \"^9.1.0\",\n \"eslint-plugin-react-hooks\": \"^5.2.0\",\n \"eslint-plugin-simple-import-sort\": \"^12.1.1\",\n \"parcel\": \"^2.12.0\",\n \"react\": \"^18.3.1\",\n \"react-dom\": \"^18.3.1\",\n \"typescript\": \"^5.2.2\"\n },\n \"peerDependencies\": {\n \"@pipecat-ai/client-js\": \"*\",\n \"react\": \">=18\",\n \"react-dom\": \">=18\"\n },\n \"dependencies\": {\n \"jotai\": \"^2.9.0\"\n }\n}\n","/**\n * Copyright (c) 2024, Daily.\n *\n * SPDX-License-Identifier: BSD-2-Clause\n */\n\nimport { RTVIEvent, TransportState } from \"@pipecat-ai/client-js\";\nimport React, { createContext, useCallback, useState } from \"react\";\n\nimport { usePipecatClient } from \"./usePipecatClient\";\nimport { useRTVIClientEvent } from \"./useRTVIClientEvent\";\n\nexport const PipecatClientCamStateContext = createContext<{\n enableCam: (enabled: boolean) => void;\n isCamEnabled: boolean;\n}>({\n enableCam: () => {\n throw new Error(\n \"PipecatClientCamStateContext: enableCam() called outside of provider\"\n );\n },\n isCamEnabled: false,\n});\nexport const PipecatClientMicStateContext = createContext<{\n enableMic: (enabled: boolean) => void;\n isMicEnabled: boolean;\n}>({\n enableMic: () => {\n throw new Error(\n \"PipecatClientMicStateContext: enableMic() called outside of provider\"\n );\n },\n isMicEnabled: false,\n});\nexport const PipecatClientTransportStateContext =\n createContext<TransportState>(\"disconnected\");\n\nexport const PipecatClientStateProvider: React.FC<React.PropsWithChildren> = ({\n children,\n}) => {\n const client = usePipecatClient();\n const [isCamEnabled, setIsCamEnabled] = useState(false);\n const [isMicEnabled, setIsMicEnabled] = useState(false);\n const [transportState, setTransportState] =\n useState<TransportState>(\"disconnected\");\n\n useRTVIClientEvent(RTVIEvent.TransportStateChanged, (state) => {\n setTransportState(state);\n if (state === \"initialized\" && client) {\n setIsCamEnabled(client.isCamEnabled ?? false);\n setIsMicEnabled(client.isMicEnabled ?? false);\n }\n });\n\n const enableCam = useCallback(\n (enabled: boolean) => {\n setIsCamEnabled(enabled);\n client?.enableCam?.(enabled);\n },\n [client]\n );\n\n const enableMic = useCallback(\n (enabled: boolean) => {\n setIsMicEnabled(enabled);\n client?.enableMic?.(enabled);\n },\n [client]\n );\n\n return (\n <PipecatClientTransportStateContext.Provider value={transportState}>\n <PipecatClientCamStateContext.Provider\n value={{ enableCam, isCamEnabled }}\n >\n <PipecatClientMicStateContext.Provider\n value={{ enableMic, isMicEnabled }}\n >\n {children}\n </PipecatClientMicStateContext.Provider>\n </PipecatClientCamStateContext.Provider>\n </PipecatClientTransportStateContext.Provider>\n );\n};\n","/**\n * Copyright (c) 2024, Daily.\n *\n * SPDX-License-Identifier: BSD-2-Clause\n */\n\nimport { RTVIEvent, RTVIEventHandler } from \"@pipecat-ai/client-js\";\nimport { useContext, useEffect } from \"react\";\n\nimport { RTVIEventContext } from \"./RTVIEventContext\";\n\nexport const useRTVIClientEvent = <E extends RTVIEvent>(\n event: E,\n handler: RTVIEventHandler<E>\n) => {\n const { on, off } = useContext(RTVIEventContext);\n\n useEffect(() => {\n on(event, handler);\n return () => {\n off(event, handler);\n };\n }, [event, handler, on, off]);\n};\n","/**\n * Copyright (c) 2024, Daily.\n *\n * SPDX-License-Identifier: BSD-2-Clause\n */\nimport { RTVIEvent, RTVIEventHandler } from \"@pipecat-ai/client-js\";\nimport { createContext } from \"react\";\n\nexport const RTVIEventContext = createContext<{\n on: <E extends RTVIEvent>(event: E, handler: RTVIEventHandler<E>) => void;\n off: <E extends RTVIEvent>(event: E, handler: RTVIEventHandler<E>) => void;\n}>({\n on: () => {},\n off: () => {},\n});\n","import React, { useCallback } from \"react\";\n\nimport { usePipecatClientCamControl } from \"./usePipecatClientCamControl\";\n\nexport interface PipecatClientCamToggleProps {\n /**\n * Callback fired when camera state changes\n */\n onCamEnabledChanged?: (enabled: boolean) => void;\n\n /**\n * Optional prop to disable the cam toggle.\n * When disabled, changes are not applied to the client.\n * @default false\n */\n disabled?: boolean;\n\n /**\n * Render prop that provides state and handlers to the children\n */\n children: (props: {\n disabled?: boolean;\n isCamEnabled: boolean;\n onClick: () => void;\n }) => React.ReactNode;\n}\n\n/**\n * Headless component for controlling camera state\n */\nexport const PipecatClientCamToggle: React.FC<PipecatClientCamToggleProps> = ({\n onCamEnabledChanged,\n disabled = false,\n children,\n}) => {\n const { isCamEnabled, enableCam } = usePipecatClientCamControl();\n\n const handleToggleCam = useCallback(() => {\n if (disabled) return;\n\n const newEnabledState = !isCamEnabled;\n enableCam(newEnabledState);\n onCamEnabledChanged?.(newEnabledState);\n }, [disabled, enableCam, isCamEnabled, onCamEnabledChanged]);\n\n return (\n <>\n {children({\n isCamEnabled,\n onClick: handleToggleCam,\n disabled,\n })}\n </>\n );\n};\n\nexport default PipecatClientCamToggle;\n","/**\n * Copyright (c) 2024, Daily.\n *\n * SPDX-License-Identifier: BSD-2-Clause\n */\nimport { useContext } from \"react\";\n\nimport { PipecatClientCamStateContext } from \"./PipecatClientState\";\n\n/**\n * Hook to control camera state\n */\nexport const usePipecatClientCamControl = () =>\n useContext(PipecatClientCamStateContext);\n","import React, { useCallback } from \"react\";\n\nimport { usePipecatClientMicControl } from \"./usePipecatClientMicControl\";\n\nexport interface PipecatClientMicToggleProps {\n /**\n * Callback fired when microphone state changes\n */\n onMicEnabledChanged?: (enabled: boolean) => void;\n\n /**\n * Optional prop to disable the mic toggle.\n * When disabled, changes are not applied to the client.\n * @default false\n */\n disabled?: boolean;\n\n /**\n * Render prop that provides state and handlers to the children\n */\n children: (props: {\n disabled?: boolean;\n isMicEnabled: boolean;\n onClick: () => void;\n }) => React.ReactNode;\n}\n\n/**\n * Headless component for controlling microphone state\n */\nexport const PipecatClientMicToggle: React.FC<PipecatClientMicToggleProps> = ({\n onMicEnabledChanged,\n disabled = false,\n children,\n}) => {\n const { enableMic, isMicEnabled } = usePipecatClientMicControl();\n\n const handleToggleMic = useCallback(() => {\n if (disabled) return;\n\n const newEnabledState = !isMicEnabled;\n enableMic(newEnabledState);\n onMicEnabledChanged?.(newEnabledState);\n }, [disabled, enableMic, isMicEnabled, onMicEnabledChanged]);\n\n return (\n <>\n {children({\n isMicEnabled,\n onClick: handleToggleMic,\n disabled,\n })}\n </>\n );\n};\n\nexport default PipecatClientMicToggle;\n","/**\n * Copyright (c) 2024, Daily.\n *\n * SPDX-License-Identifier: BSD-2-Clause\n */\n\nimport { useContext } from \"react\";\n\nimport { PipecatClientMicStateContext } from \"./PipecatClientState\";\n\n/**\n * Hook to control microphone state\n */\nexport const usePipecatClientMicControl = () =>\n useContext(PipecatClientMicStateContext);\n","/**\n * Copyright (c) 2024, Daily.\n *\n * SPDX-License-Identifier: BSD-2-Clause\n */\n\nimport React, { forwardRef, useEffect, useRef } from \"react\";\n\nimport useMergedRef from \"./useMergedRef\";\nimport { usePipecatClientMediaTrack } from \"./usePipecatClientMediaTrack\";\n\ninterface PipecatClientVideoInterface {\n aspectRatio: number;\n height: number;\n width: number;\n}\n\nexport interface Props\n extends Omit<React.VideoHTMLAttributes<HTMLVideoElement>, \"onResize\"> {\n participant: \"local\" | \"bot\";\n\n /**\n * Defines the video track type to display. Default: 'video'.\n */\n trackType?: \"screenVideo\" | \"video\";\n\n /**\n * Defines whether the video should be fully contained or cover the box. Default: 'contain'.\n */\n fit?: \"contain\" | \"cover\";\n /**\n * Forces the video to be mirrored, if set.\n */\n mirror?: boolean;\n\n /**\n * Optional callback, which is triggered whenever the video's rendered width or height changes.\n * Returns the video's native width, height and aspectRatio.\n */\n onResize?(dimensions: PipecatClientVideoInterface): void;\n}\n\nexport const PipecatClientVideo = forwardRef<HTMLVideoElement, Props>(\n function VoiceClientVideo(\n {\n participant = \"local\",\n fit = \"contain\",\n mirror,\n onResize,\n style = {},\n trackType = \"video\",\n ...props\n },\n ref\n ) {\n const videoTrack: MediaStreamTrack | null = usePipecatClientMediaTrack(\n trackType,\n participant\n );\n\n const videoEl = useRef<HTMLVideoElement>(null);\n const videoRef = useMergedRef<HTMLVideoElement>(videoEl, ref);\n\n /**\n * Handle canplay & picture-in-picture events.\n */\n useEffect(function setupVideoEvents() {\n const video = videoEl.current;\n if (!video) return;\n\n const playVideo = () => {\n const promise = video.play();\n if (promise !== undefined) {\n promise\n .then(() => {\n // All good, playback started.\n video.controls = false;\n })\n .catch((error) => {\n // Auto-play was prevented. Show video controls, so user can play video manually.\n video.controls = true;\n console.warn(\"Failed to play video\", error);\n });\n }\n };\n\n const handleCanPlay = () => {\n if (!video.paused) return;\n playVideo();\n };\n const handleEnterPIP = () => {\n video.style.transform = \"scale(1)\";\n };\n const handleLeavePIP = () => {\n video.style.transform = \"\";\n setTimeout(() => {\n if (video.paused) playVideo();\n }, 100);\n };\n const handleVisibilityChange = () => {\n if (document.visibilityState === \"hidden\") return;\n if (!video.paused) return;\n playVideo();\n };\n video.addEventListener(\"canplay\", handleCanPlay);\n video.addEventListener(\"enterpictureinpicture\", handleEnterPIP);\n video.addEventListener(\"leavepictureinpicture\", handleLeavePIP);\n\n // Videos can be paused if media was played in another app on iOS.\n document.addEventListener(\"visibilitychange\", handleVisibilityChange);\n return () => {\n video.removeEventListener(\"canplay\", handleCanPlay);\n video.removeEventListener(\"enterpictureinpicture\", handleEnterPIP);\n video.removeEventListener(\"leavepictureinpicture\", handleLeavePIP);\n document.removeEventListener(\n \"visibilitychange\",\n handleVisibilityChange\n );\n };\n }, []);\n\n /**\n * Update srcObject.\n */\n useEffect(\n function updateSrcObject() {\n const video = videoEl.current;\n if (!video || !videoTrack) return;\n video.srcObject = new MediaStream([videoTrack]);\n video.load();\n return () => {\n // clean up when unmounted\n video.srcObject = null;\n video.load();\n };\n },\n [videoTrack, videoTrack?.id]\n );\n\n /**\n * Add optional event listener for resize event so the parent component\n * can know the video's native aspect ratio.\n */\n useEffect(\n function reportVideoDimensions() {\n const video = videoEl.current;\n if (!onResize || !video) return;\n\n let frame: ReturnType<typeof requestAnimationFrame>;\n function handleResize() {\n if (frame) cancelAnimationFrame(frame);\n frame = requestAnimationFrame(() => {\n const video = videoEl.current;\n if (!video || document.hidden) return;\n const videoWidth = video.videoWidth;\n const videoHeight = video.videoHeight;\n if (videoWidth && videoHeight) {\n onResize?.({\n aspectRatio: videoWidth / videoHeight,\n height: videoHeight,\n width: videoWidth,\n });\n }\n });\n }\n\n handleResize();\n video.addEventListener(\"loadedmetadata\", handleResize);\n video.addEventListener(\"resize\", handleResize);\n\n return () => {\n if (frame) cancelAnimationFrame(frame);\n video.removeEventListener(\"loadedmetadata\", handleResize);\n video.removeEventListener(\"resize\", handleResize);\n };\n },\n [onResize]\n );\n\n return (\n <video\n autoPlay\n muted\n playsInline\n ref={videoRef}\n style={{\n objectFit: fit,\n transform: mirror ? \"scale(-1, 1)\" : \"\",\n ...style,\n }}\n {...props}\n />\n );\n }\n);\nPipecatClientVideo.displayName = \"PipecatClientVideo\";\n","/**\n * Copyright (c) 2024, Daily.\n *\n * SPDX-License-Identifier: BSD-2-Clause\n *\n * This file contains code derived from:\n * https://github.com/jaredLunde/react-hook/blob/master/packages/merged-ref/src/index.tsx\n * Original author: Jared Lunde (https://github.com/jaredLunde)\n * Original license: MIT (https://github.com/jaredLunde/react-hook/blob/master/LICENSE)\n */\n\nimport React, { useCallback } from \"react\";\n\nfunction useMergedRef<T>(...refs: React.Ref<T>[]): React.RefCallback<T> {\n return useCallback(\n (element: T) => {\n for (let i = 0; i < refs.length; i++) {\n const ref = refs[i];\n if (typeof ref === \"function\") ref(element);\n else if (ref && typeof ref === \"object\")\n (ref as React.MutableRefObject<T>).current = element;\n }\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n refs\n );\n}\n\nexport default useMergedRef;\n","/**\n * Copyright (c) 2024, Daily.\n *\n * SPDX-License-Identifier: BSD-2-Clause\n */\nimport { RTVIEvent } from \"@pipecat-ai/client-js\";\nimport { atom, useAtomValue } from \"jotai\";\nimport { useAtomCallback } from \"jotai/utils\";\nimport { useCallback, useEffect } from \"react\";\n\nimport { usePipecatClient } from \"./usePipecatClient\";\nimport { useRTVIClientEvent } from \"./useRTVIClientEvent\";\n\ntype OptionalMediaDeviceInfo = MediaDeviceInfo | Record<string, never>;\n\nconst availableMicsAtom = atom<MediaDeviceInfo[]>([]);\nconst availableCamsAtom = atom<MediaDeviceInfo[]>([]);\nconst availableSpeakersAtom = atom<MediaDeviceInfo[]>([]);\nconst selectedMicAtom = atom<OptionalMediaDeviceInfo>({});\nconst selectedCamAtom = atom<OptionalMediaDeviceInfo>({});\nconst selectedSpeakerAtom = atom<OptionalMediaDeviceInfo>({});\n\nexport const usePipecatClientMediaDevices = () => {\n const client = usePipecatClient();\n\n const availableCams = useAtomValue(availableCamsAtom);\n const availableMics = useAtomValue(availableMicsAtom);\n const availableSpeakers = useAtomValue(availableSpeakersAtom);\n const selectedCam = useAtomValue(selectedCamAtom);\n const selectedMic = useAtomValue(selectedMicAtom);\n const selectedSpeaker = useAtomValue(selectedSpeakerAtom);\n\n const initDevices = useAtomCallback(\n useCallback(\n async (_get, set) => {\n if (!client) return;\n\n const availableCams = await client.getAllCams();\n const availableMics = await client.getAllMics();\n const availableSpeakers = await client.getAllSpeakers();\n\n set(availableCamsAtom, availableCams);\n set(availableMicsAtom, availableMics);\n set(availableSpeakersAtom, availableSpeakers);\n\n set(selectedCamAtom, client.selectedCam);\n set(selectedMicAtom, client.selectedMic);\n set(selectedSpeakerAtom, client.selectedSpeaker);\n },\n [client]\n )\n );\n\n useEffect(() => {\n initDevices();\n }, [initDevices]);\n\n useRTVIClientEvent(\n RTVIEvent.AvailableCamsUpdated,\n useAtomCallback(\n useCallback((_get, set, cams) => {\n set(availableCamsAtom, cams);\n }, [])\n )\n );\n useRTVIClientEvent(\n RTVIEvent.AvailableMicsUpdated,\n useAtomCallback(\n useCallback((_get, set, mics) => {\n set(availableMicsAtom, mics);\n }, [])\n )\n );\n useRTVIClientEvent(\n RTVIEvent.AvailableSpeakersUpdated,\n useAtomCallback(\n useCallback((_get, set, speakers) => {\n set(availableSpeakersAtom, speakers);\n }, [])\n )\n );\n useRTVIClientEvent(\n RTVIEvent.CamUpdated,\n useAtomCallback(\n useCallback((_get, set, cam) => {\n set(selectedCamAtom, cam);\n }, [])\n )\n );\n useRTVIClientEvent(\n RTVIEvent.MicUpdated,\n useAtomCallback(\n useCallback((_get, set, mic) => {\n set(selectedMicAtom, mic);\n }, [])\n )\n );\n useRTVIClientEvent(\n RTVIEvent.SpeakerUpdated,\n useAtomCallback(\n useCallback((_get, set, speaker) => {\n set(selectedSpeakerAtom, speaker);\n }, [])\n )\n );\n\n const updateCam = useCallback(\n (id: string) => {\n client?.updateCam(id);\n },\n [client]\n );\n const updateMic = useCallback(\n (id: string) => {\n client?.updateMic(id);\n },\n [client]\n );\n const updateSpeaker = useCallback(\n (id: string) => {\n client?.updateSpeaker(id);\n },\n [client]\n );\n\n return {\n availableCams,\n availableMics,\n availableSpeakers,\n selectedCam,\n selectedMic,\n selectedSpeaker,\n updateCam,\n updateMic,\n updateSpeaker,\n };\n};\n","/**\n * Copyright (c) 2024, Daily.\n *\n * SPDX-License-Identifier: BSD-2-Clause\n */\n\nimport { useContext } from \"react\";\n\nimport { PipecatClientTransportStateContext } from \"./PipecatClientState\";\n\nexport const usePipecatClientTransportState = () =>\n useContext(PipecatClientTransportStateContext);\n","/**\n * Copyright (c) 2024, Daily.\n *\n * SPDX-License-Identifier: BSD-2-Clause\n */\n\nimport React, { useEffect, useRef } from \"react\";\n\nimport { usePipecatClientMediaTrack } from \"./usePipecatClientMediaTrack\";\n\ntype ParticipantType = Parameters<typeof usePipecatClientMediaTrack>[1];\n\ninterface Props {\n backgroundColor?: string;\n barColor?: string;\n barCount?: number;\n barGap?: number;\n barLineCap?: \"round\" | \"square\";\n barMaxHeight?: number;\n barOrigin?: \"top\" | \"bottom\" | \"center\";\n barWidth?: number;\n participantType: ParticipantType;\n}\n\nexport const VoiceVisualizer: React.FC<Props> = React.memo(\n ({\n backgroundColor = \"transparent\",\n barColor = \"black\",\n barCount = 5,\n barGap = 12,\n barLineCap = \"round\",\n barMaxHeight = 120,\n barOrigin = \"center\",\n barWidth = 30,\n participantType,\n }) => {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n\n const track: MediaStreamTrack | null = usePipecatClientMediaTrack(\n \"audio\",\n participantType\n );\n\n useEffect(() => {\n if (!canvasRef.current) return;\n\n const canvasWidth = barCount * barWidth + (barCount - 1) * barGap;\n const canvasHeight = barMaxHeight;\n\n const canvas = canvasRef.current;\n\n const scaleFactor = 2;\n\n // Make canvas fill the width and height of its container\n const resizeCanvas = () => {\n canvas.width = canvasWidth * scaleFactor;\n canvas.height = canvasHeight * scaleFactor;\n\n canvas.style.width = `${canvasWidth}px`;\n canvas.style.height = `${canvasHeight}px`;\n\n canvasCtx.lineCap = barLineCap;\n canvasCtx.scale(scaleFactor, scaleFactor);\n };\n\n const canvasCtx = canvas.getContext(\"2d\")!;\n resizeCanvas();\n\n if (!track) return;\n\n const audioContext = new AudioContext();\n const source = audioContext.createMediaStreamSource(\n new MediaStream([track])\n );\n const analyser = audioContext.createAnalyser();\n\n analyser.fftSize = 1024;\n\n source.connect(analyser);\n\n const frequencyData = new Uint8Array(analyser.frequencyBinCount);\n\n canvasCtx.lineCap = barLineCap;\n\n // Create frequency bands based on barCount\n const bands = Array.from({ length: barCount }, (_, i) => {\n // Use improved logarithmic scale for better frequency distribution\n const minFreq = barCount > 20 ? 200 : 80; // Adjust min frequency based on bar count\n const maxFreq = 10000; // Cover most important audio frequencies\n\n // Use Mel scale inspired approach for more perceptually uniform distribution\n // This helps with a large number of bars by placing fewer in the very low range\n // https://en.wikipedia.org/wiki/Mel_scale\n const melMin = 2595 * Math.log10(1 + minFreq / 700);\n const melMax = 2595 * Math.log10(1 + maxFreq / 700);\n const melStep = (melMax - melMin) / barCount;\n\n const melValue = melMin + i * melStep;\n const startFreq = 700 * (Math.pow(10, melValue / 2595) - 1);\n const endFreq = 700 * (Math.pow(10, (melValue + melStep) / 2595) - 1);\n\n return {\n startFreq,\n endFreq,\n smoothValue: 0,\n };\n });\n\n const getFrequencyBinIndex = (frequency: number) => {\n const nyquist = audioContext.sampleRate / 2;\n return Math.round(\n (frequency / nyquist) * (analyser.frequencyBinCount - 1)\n );\n };\n\n function drawSpectrum() {\n analyser.getByteFrequencyData(frequencyData);\n canvasCtx.clearRect(\n 0,\n 0,\n canvas.width / scaleFactor,\n canvas.height / scaleFactor\n );\n canvasCtx.fillStyle = backgroundColor;\n canvasCtx.fillRect(\n 0,\n 0,\n canvas.width / scaleFactor,\n canvas.height / scaleFactor\n );\n\n let isActive = false;\n\n const totalBarsWidth =\n bands.length * barWidth + (bands.length - 1) * barGap;\n const startX = (canvas.width / scaleFactor - totalBarsWidth) / 2; // Center bars\n\n const adjustedCircleRadius = barWidth / 2; // Fixed radius for reset circles\n\n bands.forEach((band, i) => {\n const startIndex = getFrequencyBinIndex(band.startFreq);\n const endIndex = getFrequencyBinIndex(band.endFreq);\n const bandData = frequencyData.slice(startIndex, endIndex);\n const bandValue =\n bandData.reduce((acc, val) => acc + val, 0) / bandData.length;\n\n const smoothingFactor = 0.2;\n\n if (bandValue < 1) {\n band.smoothValue = Math.max(\n band.smoothValue - smoothingFactor * 5,\n 0\n );\n } else {\n band.smoothValue =\n band.smoothValue +\n (bandValue - band.smoothValue) * smoothingFactor;\n isActive = true;\n }\n\n const x = startX + i * (barWidth + barGap);\n // Calculate bar height with a maximum cap\n const minHeight = 0;\n const barHeight = Math.max(\n minHeight,\n Math.min((band.smoothValue / 255) * barMaxHeight, barMaxHeight)\n );\n\n let yTop, yBottom;\n const canvasHeight = canvas.height / scaleFactor;\n\n switch (barOrigin) {\n case \"top\":\n yTop = adjustedCircleRadius;\n yBottom = Math.min(\n adjustedCircleRadius + barHeight,\n canvasHeight - adjustedCircleRadius\n );\n break;\n case \"bottom\":\n yBottom = canvasHeight - adjustedCircleRadius;\n yTop = Math.max(yBottom - barHeight, adjustedCircleRadius);\n break;\n case \"center\":\n default:\n yTop = Math.max(\n canvasHeight / 2 - barHeight / 2,\n adjustedCircleRadius\n );\n yBottom = Math.min(\n canvasHeight / 2 + barHeight / 2,\n canvasHeight - adjustedCircleRadius\n );\n break;\n }\n\n if (band.smoothValue > 0) {\n canvasCtx.beginPath();\n canvasCtx.moveTo(x + barWidth / 2, yTop);\n canvasCtx.lineTo(x + barWidth / 2, yBottom);\n canvasCtx.lineWidth = barWidth;\n canvasCtx.strokeStyle = barColor;\n canvasCtx.stroke();\n } else {\n drawInactiveCircle(adjustedCircleRadius, barColor, x, yTop);\n }\n });\n\n if (!isActive) {\n drawInactiveCircles(adjustedCircleRadius, barColor);\n }\n\n requestAnimationFrame(drawSpectrum);\n }\n\n function drawInactiveCircle(\n circleRadius: number,\n color: string,\n x: number,\n y: number\n ) {\n switch (barLineCap) {\n case \"square\":\n canvasCtx.fillStyle = color;\n canvasCtx.fillRect(\n x + barWidth / 2 - circleRadius,\n y - circleRadius,\n circleRadius * 2,\n circleRadius * 2\n );\n break;\n case \"round\":\n default:\n canvasCtx.beginPath();\n canvasCtx.arc(x + barWidth / 2, y, circleRadius, 0, 2 * Math.PI);\n canvasCtx.fillStyle = color;\n canvasCtx.fill();\n canvasCtx.closePath();\n break;\n }\n }\n\n function drawInactiveCircles(circleRadius: number, color: string) {\n const totalBarsWidth =\n bands.length * barWidth + (bands.length - 1) * barGap;\n const startX = (canvas.width / scaleFactor - totalBarsWidth) / 2;\n const canvasHeight = canvas.height / scaleFactor;\n\n let y;\n switch (barOrigin) {\n case \"top\":\n y = circleRadius;\n break;\n case \"bottom\":\n y = canvasHeight - circleRadius;\n break;\n case \"center\":\n default:\n y = canvasHeight / 2;\n break;\n }\n\n bands.forEach((_, i) => {\n const x = startX + i * (barWidth + barGap);\n drawInactiveCircle(circleRadius, color, x, y);\n });\n }\n\n drawSpectrum();\n\n // Handle resizing\n window.addEventListener(\"resize\", resizeCanvas);\n\n return () => {\n audioContext.close();\n window.removeEventListener(\"resize\", resizeCanvas);\n };\n }, [\n backgroundColor,\n barColor,\n barCount,\n barGap,\n barLineCap,\n barMaxHeight,\n barOrigin,\n barWidth,\n track,\n ]);\n\n return (\n <canvas\n ref={canvasRef}\n style={{\n display: \"block\",\n width: \"100%\",\n height: \"100%\",\n }}\n />\n );\n }\n);\n\nVoiceVisualizer.displayName = \"VoiceVisualizer\";\n"],"names":[],"version":3,"file":"index.module.js.map"}
|
|
1
|
+
{"mappings":"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","sources":["client-react/src/index.ts","client-react/src/PipecatClientAudio.tsx","client-react/src/usePipecatClientMediaTrack.ts","client-react/src/usePipecatClient.ts","client-react/src/PipecatClientProvider.tsx","client-react/package.json","client-react/src/PipecatClientState.tsx","client-react/src/useRTVIClientEvent.ts","client-react/src/RTVIEventContext.ts","client-react/src/PipecatClientCamToggle.tsx","client-react/src/usePipecatClientCamControl.ts","client-react/src/PipecatClientMicToggle.tsx","client-react/src/usePipecatClientMicControl.ts","client-react/src/PipecatClientScreenShareToggle.tsx","client-react/src/usePipecatClientScreenShareControl.ts","client-react/src/PipecatClientVideo.tsx","client-react/src/useMergedRef.ts","client-react/src/usePipecatClientMediaDevices.ts","client-react/src/usePipecatClientTransportState.ts","client-react/src/VoiceVisualizer.tsx"],"sourcesContent":["/**\n * Copyright (c) 2024, Daily.\n *\n * SPDX-License-Identifier: BSD-2-Clause\n */\n\nimport { PipecatClientAudio } from \"./PipecatClientAudio\";\nimport { PipecatClientCamToggle } from \"./PipecatClientCamToggle\";\nimport { PipecatClientMicToggle } from \"./PipecatClientMicToggle\";\nimport { PipecatClientProvider } from \"./PipecatClientProvider\";\nimport { PipecatClientScreenShareToggle } from \"./PipecatClientScreenShareToggle\";\nimport { PipecatClientVideo } from \"./PipecatClientVideo\";\nimport { usePipecatClient } from \"./usePipecatClient\";\nimport { usePipecatClientCamControl } from \"./usePipecatClientCamControl\";\nimport { usePipecatClientMediaDevices } from \"./usePipecatClientMediaDevices\";\nimport { usePipecatClientMediaTrack } from \"./usePipecatClientMediaTrack\";\nimport { usePipecatClientMicControl } from \"./usePipecatClientMicControl\";\nimport { usePipecatClientScreenShareControl } from \"./usePipecatClientScreenShareControl\";\nimport { usePipecatClientTransportState } from \"./usePipecatClientTransportState\";\nimport { useRTVIClientEvent } from \"./useRTVIClientEvent\";\nimport { VoiceVisualizer } from \"./VoiceVisualizer\";\n\nexport {\n PipecatClientAudio,\n PipecatClientCamToggle,\n PipecatClientMicToggle,\n PipecatClientProvider,\n PipecatClientScreenShareToggle,\n PipecatClientVideo,\n usePipecatClient,\n usePipecatClientCamControl,\n usePipecatClientMediaDevices,\n usePipecatClientMediaTrack,\n usePipecatClientMicControl,\n usePipecatClientScreenShareControl,\n usePipecatClientTransportState,\n useRTVIClientEvent,\n VoiceVisualizer,\n};\n","/**\n * Copyright (c) 2024, Daily.\n *\n * SPDX-License-Identifier: BSD-2-Clause\n */\n\nimport { RTVIEvent } from \"@pipecat-ai/client-js\";\nimport { useCallback, useEffect, useRef } from \"react\";\n\nimport { usePipecatClientMediaTrack } from \"./usePipecatClientMediaTrack\";\nimport { useRTVIClientEvent } from \"./useRTVIClientEvent\";\n\nexport const PipecatClientAudio = () => {\n const botAudioRef = useRef<HTMLAudioElement>(null);\n const botAudioTrack = usePipecatClientMediaTrack(\"audio\", \"bot\");\n\n useEffect(() => {\n if (!botAudioRef.current || !botAudioTrack) return;\n if (botAudioRef.current.srcObject) {\n const oldTrack = (\n botAudioRef.current.srcObject as MediaStream\n ).getAudioTracks()[0];\n if (oldTrack.id === botAudioTrack.id) return;\n }\n botAudioRef.current.srcObject = new MediaStream([botAudioTrack]);\n }, [botAudioTrack]);\n\n useRTVIClientEvent(\n RTVIEvent.SpeakerUpdated,\n useCallback((speaker: MediaDeviceInfo) => {\n if (!botAudioRef.current) return;\n if (typeof botAudioRef.current.setSinkId !== \"function\") return;\n botAudioRef.current.setSinkId(speaker.deviceId);\n }, [])\n );\n\n return (\n <>\n <audio ref={botAudioRef} autoPlay />\n </>\n );\n};\nPipecatClientAudio.displayName = \"PipecatClientAudio\";\n","/**\n * Copyright (c) 2024, Daily.\n *\n * SPDX-License-Identifier: BSD-2-Clause\n */\n\nimport { Participant, RTVIEvent, Tracks } from \"@pipecat-ai/client-js\";\nimport { atom, useAtomValue } from \"jotai\";\nimport { atomFamily, useAtomCallback } from \"jotai/utils\";\nimport { PrimitiveAtom } from \"jotai/vanilla\";\nimport { useCallback, useEffect } from \"react\";\n\nimport { usePipecatClient } from \"./usePipecatClient\";\nimport { useRTVIClientEvent } from \"./useRTVIClientEvent\";\n\ntype ParticipantType = keyof Tracks;\ntype TrackType = keyof Tracks[\"local\"];\n\nconst localAudioTrackAtom = atom<MediaStreamTrack | null>(null);\nconst localVideoTrackAtom = atom<MediaStreamTrack | null>(null);\nconst localScreenAudioTrackAtom = atom<MediaStreamTrack | null>(null);\nconst localScreenVideoTrackAtom = atom<MediaStreamTrack | null>(null);\nconst botAudioTrackAtom = atom<MediaStreamTrack | null>(null);\nconst botVideoTrackAtom = atom<MediaStreamTrack | null>(null);\n\nconst trackAtom = atomFamily<\n { local: boolean; trackType: TrackType },\n PrimitiveAtom<MediaStreamTrack | null>\n>(({ local, trackType }) => {\n if (local) {\n switch (trackType) {\n case \"audio\":\n return localAudioTrackAtom;\n case \"screenAudio\":\n return localScreenAudioTrackAtom;\n case \"screenVideo\":\n return localScreenVideoTrackAtom;\n case \"video\":\n return localVideoTrackAtom;\n }\n }\n return trackType === \"audio\" ? botAudioTrackAtom : botVideoTrackAtom;\n});\n\nexport const usePipecatClientMediaTrack = (\n trackType: TrackType,\n participantType: ParticipantType\n) => {\n const client = usePipecatClient();\n const track = useAtomValue(\n trackAtom({ local: participantType === \"local\", trackType })\n );\n\n const updateTrack = useAtomCallback(\n useCallback(\n (\n get,\n set,\n track: MediaStreamTrack,\n trackType: TrackType,\n local: boolean\n ) => {\n const atom = trackAtom({\n local,\n trackType,\n });\n const oldTrack = get(atom);\n if (oldTrack?.id === track.id) return;\n set(atom, track);\n },\n []\n )\n );\n\n useRTVIClientEvent(\n RTVIEvent.TrackStarted,\n useCallback(\n (track: MediaStreamTrack, participant?: Participant) => {\n updateTrack(\n track,\n track.kind as TrackType,\n Boolean(participant?.local)\n );\n },\n [updateTrack]\n )\n );\n\n useRTVIClientEvent(\n RTVIEvent.ScreenTrackStarted,\n useCallback(\n (track: MediaStreamTrack, participant?: Participant) => {\n const trackType =\n track.kind === \"audio\" ? \"screenAudio\" : \"screenVideo\";\n updateTrack(track, trackType, Boolean(participant?.local));\n },\n [updateTrack]\n )\n );\n\n useEffect(() => {\n if (!client) return;\n const tracks = client.tracks();\n const track = tracks?.[participantType]?.[trackType];\n if (!track) return;\n updateTrack(track, trackType, participantType === \"local\");\n }, [participantType, trackType, updateTrack, client]);\n\n return track;\n};\n","/**\n * Copyright (c) 2024, Daily.\n *\n * SPDX-License-Identifier: BSD-2-Clause\n */\n\nimport { useContext } from \"react\";\n\nimport { PipecatClientContext } from \"./PipecatClientProvider\";\n\nexport const usePipecatClient = () => {\n const { client } = useContext(PipecatClientContext);\n return client;\n};\n","/**\n * Copyright (c) 2024, Daily.\n *\n * SPDX-License-Identifier: BSD-2-Clause\n */\n\nimport {\n PipecatClient,\n RTVIEvent,\n RTVIEventHandler,\n setAboutClient,\n} from \"@pipecat-ai/client-js\";\nimport { createStore } from \"jotai\";\nimport { Provider as JotaiProvider } from \"jotai/react\";\nimport React, { createContext, useCallback, useEffect, useRef } from \"react\";\n\nimport {\n name as packageName,\n version as packageVersion,\n} from \"../package.json\";\nimport { PipecatClientStateProvider } from \"./PipecatClientState\";\nimport { RTVIEventContext } from \"./RTVIEventContext\";\n\nexport interface Props {\n client: PipecatClient;\n jotaiStore?: React.ComponentProps<typeof JotaiProvider>[\"store\"];\n}\n\nconst defaultStore = createStore();\n\nexport const PipecatClientContext = createContext<{ client?: PipecatClient }>(\n {}\n);\n\ntype EventHandlersMap = {\n [E in RTVIEvent]?: Set<RTVIEventHandler<E>>;\n};\n\nexport const PipecatClientProvider: React.FC<\n React.PropsWithChildren<Props>\n> = ({ children, client, jotaiStore = defaultStore }) => {\n useEffect(() => {\n setAboutClient({\n library: packageName,\n library_version: packageVersion,\n });\n }, []);\n\n const eventHandlersMap = useRef<EventHandlersMap>({});\n\n useEffect(() => {\n if (!client) return;\n\n const allEvents = Object.values(RTVIEvent).filter((value) =>\n isNaN(Number(value))\n ) as RTVIEvent[];\n\n const allHandlers: Partial<\n Record<\n RTVIEvent,\n (\n ...args: Parameters<Exclude<RTVIEventHandler<RTVIEvent>, undefined>>\n ) => void\n >\n > = {};\n\n allEvents.forEach((event) => {\n type E = typeof event;\n type Handler = Exclude<RTVIEventHandler<E>, undefined>; // Remove undefined\n type Payload = Parameters<Handler>; // Will always be a tuple\n\n const handler = (...payload: Payload) => {\n const handlers = eventHandlersMap.current[event] as\n | Set<Handler>\n | undefined;\n if (!handlers) return;\n handlers.forEach((h) => {\n (\n h as (\n ...args: Parameters<Exclude<RTVIEventHandler<E>, undefined>>\n ) => void\n )(...payload);\n });\n };\n\n allHandlers[event] = handler;\n\n client.on(event, handler);\n });\n\n return () => {\n allEvents.forEach((event) => {\n client.off(event, allHandlers[event]);\n });\n };\n }, [client]);\n\n const on = useCallback(\n <E extends RTVIEvent>(event: E, handler: RTVIEventHandler<E>) => {\n if (!eventHandlersMap.current[event]) {\n eventHandlersMap.current[event] = new Set();\n }\n eventHandlersMap.current[event]!.add(handler);\n },\n []\n );\n\n const off = useCallback(\n <E extends RTVIEvent>(event: E, handler: RTVIEventHandler<E>) => {\n eventHandlersMap.current[event]?.delete(handler);\n },\n []\n );\n\n return (\n <JotaiProvider store={jotaiStore}>\n <PipecatClientContext.Provider value={{ client }}>\n <RTVIEventContext.Provider value={{ on, off }}>\n <PipecatClientStateProvider>{children}</PipecatClientStateProvider>\n </RTVIEventContext.Provider>\n </PipecatClientContext.Provider>\n </JotaiProvider>\n );\n};\nPipecatClientProvider.displayName = \"PipecatClientProvider\";\n","{\n \"name\": \"@pipecat-ai/client-react\",\n \"version\": \"1.1.0\",\n \"license\": \"BSD-2-Clause\",\n \"main\": \"dist/index.js\",\n \"module\": \"dist/index.module.js\",\n \"types\": \"dist/index.d.ts\",\n \"source\": \"src/index.ts\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/pipecat-ai/pipecat-client-web.git\"\n },\n \"files\": [\n \"dist\",\n \"package.json\",\n \"README.md\"\n ],\n \"scripts\": {\n \"build\": \"parcel build --no-cache\",\n \"dev\": \"parcel watch\",\n \"lint\": \"eslint . --report-unused-disable-directives --max-warnings 0 --ignore-pattern 'dist/'\"\n },\n \"devDependencies\": {\n \"@pipecat-ai/client-js\": \"*\",\n \"@types/react\": \"^18.3.3\",\n \"@types/react-dom\": \"^18.3.0\",\n \"@typescript-eslint/eslint-plugin\": \"^8.32.0\",\n \"eslint\": \"^9.11.1\",\n \"eslint-config-prettier\": \"^9.1.0\",\n \"eslint-plugin-react-hooks\": \"^5.2.0\",\n \"eslint-plugin-simple-import-sort\": \"^12.1.1\",\n \"parcel\": \"^2.12.0\",\n \"react\": \"^18.3.1\",\n \"react-dom\": \"^18.3.1\",\n \"typescript\": \"^5.2.2\"\n },\n \"peerDependencies\": {\n \"@pipecat-ai/client-js\": \"*\",\n \"react\": \">=18\",\n \"react-dom\": \">=18\"\n },\n \"dependencies\": {\n \"jotai\": \"^2.9.0\"\n }\n}\n","/**\n * Copyright (c) 2024, Daily.\n *\n * SPDX-License-Identifier: BSD-2-Clause\n */\n\nimport { RTVIEvent, TransportState } from \"@pipecat-ai/client-js\";\nimport React, { createContext, useCallback, useState } from \"react\";\n\nimport { usePipecatClient } from \"./usePipecatClient\";\nimport { useRTVIClientEvent } from \"./useRTVIClientEvent\";\n\nexport const PipecatClientCamStateContext = createContext<{\n enableCam: (enabled: boolean) => void;\n isCamEnabled: boolean;\n}>({\n enableCam: () => {\n throw new Error(\n \"PipecatClientCamStateContext: enableCam() called outside of provider\"\n );\n },\n isCamEnabled: false,\n});\nexport const PipecatClientMicStateContext = createContext<{\n enableMic: (enabled: boolean) => void;\n isMicEnabled: boolean;\n}>({\n enableMic: () => {\n throw new Error(\n \"PipecatClientMicStateContext: enableMic() called outside of provider\"\n );\n },\n isMicEnabled: false,\n});\nexport const PipecatClientScreenShareStateContext = createContext<{\n enableScreenShare: (enabled: boolean) => void;\n isScreenShareEnabled: boolean;\n}>({\n enableScreenShare: () => {\n throw new Error(\n \"PipecatClientScreenShareStateContext: enableScreenShare() called outside of provider\"\n );\n },\n isScreenShareEnabled: false,\n});\nexport const PipecatClientTransportStateContext =\n createContext<TransportState>(\"disconnected\");\n\nexport const PipecatClientStateProvider: React.FC<React.PropsWithChildren> = ({\n children,\n}) => {\n const client = usePipecatClient();\n const [isCamEnabled, setIsCamEnabled] = useState(false);\n const [isMicEnabled, setIsMicEnabled] = useState(false);\n const [isScreenShareEnabled, setIsScreenShareEnabled] = useState(false);\n const [transportState, setTransportState] =\n useState<TransportState>(\"disconnected\");\n\n useRTVIClientEvent(RTVIEvent.TransportStateChanged, (state) => {\n setTransportState(state);\n if (state === \"initialized\" && client) {\n setIsCamEnabled(client.isCamEnabled ?? false);\n setIsMicEnabled(client.isMicEnabled ?? false);\n setIsScreenShareEnabled(client.isSharingScreen ?? false);\n }\n });\n\n const enableCam = useCallback(\n (enabled: boolean) => {\n setIsCamEnabled(enabled);\n client?.enableCam?.(enabled);\n },\n [client]\n );\n\n const enableMic = useCallback(\n (enabled: boolean) => {\n setIsMicEnabled(enabled);\n client?.enableMic?.(enabled);\n },\n [client]\n );\n\n const enableScreenShare = useCallback(\n (enabled: boolean) => {\n client?.enableScreenShare?.(enabled);\n },\n [client]\n );\n\n useRTVIClientEvent(RTVIEvent.ScreenTrackStarted, (_track, participant) => {\n if (participant?.local) {\n setIsScreenShareEnabled(true);\n }\n });\n\n useRTVIClientEvent(RTVIEvent.ScreenTrackStopped, (_track, participant) => {\n if (participant?.local) {\n setIsScreenShareEnabled(false);\n }\n });\n\n return (\n <PipecatClientTransportStateContext.Provider value={transportState}>\n <PipecatClientCamStateContext.Provider\n value={{ enableCam, isCamEnabled }}\n >\n <PipecatClientMicStateContext.Provider\n value={{ enableMic, isMicEnabled }}\n >\n <PipecatClientScreenShareStateContext.Provider\n value={{ enableScreenShare, isScreenShareEnabled }}\n >\n {children}\n </PipecatClientScreenShareStateContext.Provider>\n </PipecatClientMicStateContext.Provider>\n </PipecatClientCamStateContext.Provider>\n </PipecatClientTransportStateContext.Provider>\n );\n};\n","/**\n * Copyright (c) 2024, Daily.\n *\n * SPDX-License-Identifier: BSD-2-Clause\n */\n\nimport { RTVIEvent, RTVIEventHandler } from \"@pipecat-ai/client-js\";\nimport { useContext, useEffect } from \"react\";\n\nimport { RTVIEventContext } from \"./RTVIEventContext\";\n\nexport const useRTVIClientEvent = <E extends RTVIEvent>(\n event: E,\n handler: RTVIEventHandler<E>\n) => {\n const { on, off } = useContext(RTVIEventContext);\n\n useEffect(() => {\n on(event, handler);\n return () => {\n off(event, handler);\n };\n }, [event, handler, on, off]);\n};\n","/**\n * Copyright (c) 2024, Daily.\n *\n * SPDX-License-Identifier: BSD-2-Clause\n */\nimport { RTVIEvent, RTVIEventHandler } from \"@pipecat-ai/client-js\";\nimport { createContext } from \"react\";\n\nexport const RTVIEventContext = createContext<{\n on: <E extends RTVIEvent>(event: E, handler: RTVIEventHandler<E>) => void;\n off: <E extends RTVIEvent>(event: E, handler: RTVIEventHandler<E>) => void;\n}>({\n on: () => {},\n off: () => {},\n});\n","import React, { useCallback } from \"react\";\n\nimport { usePipecatClientCamControl } from \"./usePipecatClientCamControl\";\n\nexport interface PipecatClientCamToggleProps {\n /**\n * Callback fired when camera state changes\n */\n onCamEnabledChanged?: (enabled: boolean) => void;\n\n /**\n * Optional prop to disable the cam toggle.\n * When disabled, changes are not applied to the client.\n * @default false\n */\n disabled?: boolean;\n\n /**\n * Render prop that provides state and handlers to the children\n */\n children: (props: {\n disabled?: boolean;\n isCamEnabled: boolean;\n onClick: () => void;\n }) => React.ReactNode;\n}\n\n/**\n * Headless component for controlling camera state\n */\nexport const PipecatClientCamToggle: React.FC<PipecatClientCamToggleProps> = ({\n onCamEnabledChanged,\n disabled = false,\n children,\n}) => {\n const { isCamEnabled, enableCam } = usePipecatClientCamControl();\n\n const handleToggleCam = useCallback(() => {\n if (disabled) return;\n\n const newEnabledState = !isCamEnabled;\n enableCam(newEnabledState);\n onCamEnabledChanged?.(newEnabledState);\n }, [disabled, enableCam, isCamEnabled, onCamEnabledChanged]);\n\n return (\n <>\n {children({\n isCamEnabled,\n onClick: handleToggleCam,\n disabled,\n })}\n </>\n );\n};\n\nexport default PipecatClientCamToggle;\n","/**\n * Copyright (c) 2024, Daily.\n *\n * SPDX-License-Identifier: BSD-2-Clause\n */\nimport { useContext } from \"react\";\n\nimport { PipecatClientCamStateContext } from \"./PipecatClientState\";\n\n/**\n * Hook to control camera state\n */\nexport const usePipecatClientCamControl = () =>\n useContext(PipecatClientCamStateContext);\n","import React, { useCallback } from \"react\";\n\nimport { usePipecatClientMicControl } from \"./usePipecatClientMicControl\";\n\nexport interface PipecatClientMicToggleProps {\n /**\n * Callback fired when microphone state changes\n */\n onMicEnabledChanged?: (enabled: boolean) => void;\n\n /**\n * Optional prop to disable the mic toggle.\n * When disabled, changes are not applied to the client.\n * @default false\n */\n disabled?: boolean;\n\n /**\n * Render prop that provides state and handlers to the children\n */\n children: (props: {\n disabled?: boolean;\n isMicEnabled: boolean;\n onClick: () => void;\n }) => React.ReactNode;\n}\n\n/**\n * Headless component for controlling microphone state\n */\nexport const PipecatClientMicToggle: React.FC<PipecatClientMicToggleProps> = ({\n onMicEnabledChanged,\n disabled = false,\n children,\n}) => {\n const { enableMic, isMicEnabled } = usePipecatClientMicControl();\n\n const handleToggleMic = useCallback(() => {\n if (disabled) return;\n\n const newEnabledState = !isMicEnabled;\n enableMic(newEnabledState);\n onMicEnabledChanged?.(newEnabledState);\n }, [disabled, enableMic, isMicEnabled, onMicEnabledChanged]);\n\n return (\n <>\n {children({\n isMicEnabled,\n onClick: handleToggleMic,\n disabled,\n })}\n </>\n );\n};\n\nexport default PipecatClientMicToggle;\n","/**\n * Copyright (c) 2024, Daily.\n *\n * SPDX-License-Identifier: BSD-2-Clause\n */\n\nimport { useContext } from \"react\";\n\nimport { PipecatClientMicStateContext } from \"./PipecatClientState\";\n\n/**\n * Hook to control microphone state\n */\nexport const usePipecatClientMicControl = () =>\n useContext(PipecatClientMicStateContext);\n","/**\n * Copyright (c) 2025, Daily.\n *\n * SPDX-License-Identifier: BSD-2-Clause\n */\n\nimport React, { useCallback, useEffect } from \"react\";\n\nimport { usePipecatClientScreenShareControl } from \"./usePipecatClientScreenShareControl\";\n\nexport interface PipecatClientScreenShareToggleProps {\n /**\n * Callback when screen share state changes\n */\n onScreenShareEnabledChanged?: (enabled: boolean) => void;\n\n /**\n * Optional prop to disable the screen share toggle.\n * When disabled, changes are not applied to the client.\n * @default false\n */\n disabled?: boolean;\n\n /**\n * Render prop that provides state and handlers to the children\n */\n children: (props: {\n disabled?: boolean;\n isScreenShareEnabled: boolean;\n onClick: () => void;\n }) => React.ReactNode;\n}\n\n/**\n * Headless component for controlling screen share state\n */\nexport const PipecatClientScreenShareToggle: React.FC<\n PipecatClientScreenShareToggleProps\n> = ({ onScreenShareEnabledChanged, disabled = false, children }) => {\n const { enableScreenShare, isScreenShareEnabled } =\n usePipecatClientScreenShareControl();\n\n const handleToggleScreenShare = useCallback(() => {\n if (disabled) return;\n enableScreenShare(!isScreenShareEnabled);\n }, [disabled, enableScreenShare, isScreenShareEnabled]);\n\n useEffect(() => {\n onScreenShareEnabledChanged?.(isScreenShareEnabled);\n }, [isScreenShareEnabled, onScreenShareEnabledChanged]);\n\n return (\n <>\n {children({\n isScreenShareEnabled,\n onClick: handleToggleScreenShare,\n disabled,\n })}\n </>\n );\n};\n\nexport default PipecatClientScreenShareToggle;\n","/**\n * Copyright (c) 2025, Daily.\n *\n * SPDX-License-Identifier: BSD-2-Clause\n */\n\nimport { useContext } from \"react\";\n\nimport { PipecatClientScreenShareStateContext } from \"./PipecatClientState\";\n\n/**\n * Hook to control screen share state using React Context\n * This provides a simpler interface for basic screen share control\n * For more advanced state management with Jotai atoms, use usePipecatClientScreenShare\n */\nexport const usePipecatClientScreenShareControl = () =>\n useContext(PipecatClientScreenShareStateContext);\n","/**\n * Copyright (c) 2024, Daily.\n *\n * SPDX-License-Identifier: BSD-2-Clause\n */\n\nimport React, { forwardRef, useEffect, useRef } from \"react\";\n\nimport useMergedRef from \"./useMergedRef\";\nimport { usePipecatClientMediaTrack } from \"./usePipecatClientMediaTrack\";\n\ninterface PipecatClientVideoInterface {\n aspectRatio: number;\n height: number;\n width: number;\n}\n\nexport interface Props\n extends Omit<React.VideoHTMLAttributes<HTMLVideoElement>, \"onResize\"> {\n participant: \"local\" | \"bot\";\n\n /**\n * Defines the video track type to display. Default: 'video'.\n */\n trackType?: \"screenVideo\" | \"video\";\n\n /**\n * Defines whether the video should be fully contained or cover the box. Default: 'contain'.\n */\n fit?: \"contain\" | \"cover\";\n /**\n * Forces the video to be mirrored, if set.\n */\n mirror?: boolean;\n\n /**\n * Optional callback, which is triggered whenever the video's rendered width or height changes.\n * Returns the video's native width, height and aspectRatio.\n */\n onResize?(dimensions: PipecatClientVideoInterface): void;\n}\n\nexport const PipecatClientVideo = forwardRef<HTMLVideoElement, Props>(\n function VoiceClientVideo(\n {\n participant = \"local\",\n fit = \"contain\",\n mirror,\n onResize,\n style = {},\n trackType = \"video\",\n ...props\n },\n ref\n ) {\n const videoTrack: MediaStreamTrack | null = usePipecatClientMediaTrack(\n trackType,\n participant\n );\n\n const videoEl = useRef<HTMLVideoElement>(null);\n const videoRef = useMergedRef<HTMLVideoElement>(videoEl, ref);\n\n /**\n * Handle canplay & picture-in-picture events.\n */\n useEffect(function setupVideoEvents() {\n const video = videoEl.current;\n if (!video) return;\n\n const playVideo = () => {\n const promise = video.play();\n if (promise !== undefined) {\n promise\n .then(() => {\n // All good, playback started.\n video.controls = false;\n })\n .catch((error) => {\n // Auto-play was prevented. Show video controls, so user can play video manually.\n video.controls = true;\n console.warn(\"Failed to play video\", error);\n });\n }\n };\n\n const handleCanPlay = () => {\n if (!video.paused) return;\n playVideo();\n };\n const handleEnterPIP = () => {\n video.style.transform = \"scale(1)\";\n };\n const handleLeavePIP = () => {\n video.style.transform = \"\";\n setTimeout(() => {\n if (video.paused) playVideo();\n }, 100);\n };\n const handleVisibilityChange = () => {\n if (document.visibilityState === \"hidden\") return;\n if (!video.paused) return;\n playVideo();\n };\n video.addEventListener(\"canplay\", handleCanPlay);\n video.addEventListener(\"enterpictureinpicture\", handleEnterPIP);\n video.addEventListener(\"leavepictureinpicture\", handleLeavePIP);\n\n // Videos can be paused if media was played in another app on iOS.\n document.addEventListener(\"visibilitychange\", handleVisibilityChange);\n return () => {\n video.removeEventListener(\"canplay\", handleCanPlay);\n video.removeEventListener(\"enterpictureinpicture\", handleEnterPIP);\n video.removeEventListener(\"leavepictureinpicture\", handleLeavePIP);\n document.removeEventListener(\n \"visibilitychange\",\n handleVisibilityChange\n );\n };\n }, []);\n\n /**\n * Update srcObject.\n */\n useEffect(\n function updateSrcObject() {\n const video = videoEl.current;\n if (!video || !videoTrack) return;\n video.srcObject = new MediaStream([videoTrack]);\n video.load();\n return () => {\n // clean up when unmounted\n video.srcObject = null;\n video.load();\n };\n },\n [videoTrack, videoTrack?.id]\n );\n\n /**\n * Add optional event listener for resize event so the parent component\n * can know the video's native aspect ratio.\n */\n useEffect(\n function reportVideoDimensions() {\n const video = videoEl.current;\n if (!onResize || !video) return;\n\n let frame: ReturnType<typeof requestAnimationFrame>;\n function handleResize() {\n if (frame) cancelAnimationFrame(frame);\n frame = requestAnimationFrame(() => {\n const video = videoEl.current;\n if (!video || document.hidden) return;\n const videoWidth = video.videoWidth;\n const videoHeight = video.videoHeight;\n if (videoWidth && videoHeight) {\n onResize?.({\n aspectRatio: videoWidth / videoHeight,\n height: videoHeight,\n width: videoWidth,\n });\n }\n });\n }\n\n handleResize();\n video.addEventListener(\"loadedmetadata\", handleResize);\n video.addEventListener(\"resize\", handleResize);\n\n return () => {\n if (frame) cancelAnimationFrame(frame);\n video.removeEventListener(\"loadedmetadata\", handleResize);\n video.removeEventListener(\"resize\", handleResize);\n };\n },\n [onResize]\n );\n\n return (\n <video\n autoPlay\n muted\n playsInline\n ref={videoRef}\n style={{\n objectFit: fit,\n transform: mirror ? \"scale(-1, 1)\" : \"\",\n ...style,\n }}\n {...props}\n />\n );\n }\n);\nPipecatClientVideo.displayName = \"PipecatClientVideo\";\n","/**\n * Copyright (c) 2024, Daily.\n *\n * SPDX-License-Identifier: BSD-2-Clause\n *\n * This file contains code derived from:\n * https://github.com/jaredLunde/react-hook/blob/master/packages/merged-ref/src/index.tsx\n * Original author: Jared Lunde (https://github.com/jaredLunde)\n * Original license: MIT (https://github.com/jaredLunde/react-hook/blob/master/LICENSE)\n */\n\nimport React, { useCallback } from \"react\";\n\nfunction useMergedRef<T>(...refs: React.Ref<T>[]): React.RefCallback<T> {\n return useCallback(\n (element: T) => {\n for (let i = 0; i < refs.length; i++) {\n const ref = refs[i];\n if (typeof ref === \"function\") ref(element);\n else if (ref && typeof ref === \"object\")\n (ref as React.MutableRefObject<T>).current = element;\n }\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n refs\n );\n}\n\nexport default useMergedRef;\n","/**\n * Copyright (c) 2024, Daily.\n *\n * SPDX-License-Identifier: BSD-2-Clause\n */\nimport { RTVIEvent } from \"@pipecat-ai/client-js\";\nimport { atom, useAtomValue } from \"jotai\";\nimport { useAtomCallback } from \"jotai/utils\";\nimport { useCallback, useEffect } from \"react\";\n\nimport { usePipecatClient } from \"./usePipecatClient\";\nimport { useRTVIClientEvent } from \"./useRTVIClientEvent\";\n\ntype OptionalMediaDeviceInfo = MediaDeviceInfo | Record<string, never>;\n\nconst availableMicsAtom = atom<MediaDeviceInfo[]>([]);\nconst availableCamsAtom = atom<MediaDeviceInfo[]>([]);\nconst availableSpeakersAtom = atom<MediaDeviceInfo[]>([]);\nconst selectedMicAtom = atom<OptionalMediaDeviceInfo>({});\nconst selectedCamAtom = atom<OptionalMediaDeviceInfo>({});\nconst selectedSpeakerAtom = atom<OptionalMediaDeviceInfo>({});\n\nexport const usePipecatClientMediaDevices = () => {\n const client = usePipecatClient();\n\n const availableCams = useAtomValue(availableCamsAtom);\n const availableMics = useAtomValue(availableMicsAtom);\n const availableSpeakers = useAtomValue(availableSpeakersAtom);\n const selectedCam = useAtomValue(selectedCamAtom);\n const selectedMic = useAtomValue(selectedMicAtom);\n const selectedSpeaker = useAtomValue(selectedSpeakerAtom);\n\n const initDevices = useAtomCallback(\n useCallback(\n async (_get, set) => {\n if (!client) return;\n\n const availableCams = await client.getAllCams();\n const availableMics = await client.getAllMics();\n const availableSpeakers = await client.getAllSpeakers();\n\n set(availableCamsAtom, availableCams);\n set(availableMicsAtom, availableMics);\n set(availableSpeakersAtom, availableSpeakers);\n\n set(selectedCamAtom, client.selectedCam);\n set(selectedMicAtom, client.selectedMic);\n set(selectedSpeakerAtom, client.selectedSpeaker);\n },\n [client]\n )\n );\n\n useEffect(() => {\n initDevices();\n }, [initDevices]);\n\n useRTVIClientEvent(\n RTVIEvent.AvailableCamsUpdated,\n useAtomCallback(\n useCallback((_get, set, cams) => {\n set(availableCamsAtom, cams);\n }, [])\n )\n );\n useRTVIClientEvent(\n RTVIEvent.AvailableMicsUpdated,\n useAtomCallback(\n useCallback((_get, set, mics) => {\n set(availableMicsAtom, mics);\n }, [])\n )\n );\n useRTVIClientEvent(\n RTVIEvent.AvailableSpeakersUpdated,\n useAtomCallback(\n useCallback((_get, set, speakers) => {\n set(availableSpeakersAtom, speakers);\n }, [])\n )\n );\n useRTVIClientEvent(\n RTVIEvent.CamUpdated,\n useAtomCallback(\n useCallback((_get, set, cam) => {\n set(selectedCamAtom, cam);\n }, [])\n )\n );\n useRTVIClientEvent(\n RTVIEvent.MicUpdated,\n useAtomCallback(\n useCallback((_get, set, mic) => {\n set(selectedMicAtom, mic);\n }, [])\n )\n );\n useRTVIClientEvent(\n RTVIEvent.SpeakerUpdated,\n useAtomCallback(\n useCallback((_get, set, speaker) => {\n set(selectedSpeakerAtom, speaker);\n }, [])\n )\n );\n\n const updateCam = useCallback(\n (id: string) => {\n client?.updateCam(id);\n },\n [client]\n );\n const updateMic = useCallback(\n (id: string) => {\n client?.updateMic(id);\n },\n [client]\n );\n const updateSpeaker = useCallback(\n (id: string) => {\n client?.updateSpeaker(id);\n },\n [client]\n );\n\n return {\n availableCams,\n availableMics,\n availableSpeakers,\n selectedCam,\n selectedMic,\n selectedSpeaker,\n updateCam,\n updateMic,\n updateSpeaker,\n };\n};\n","/**\n * Copyright (c) 2024, Daily.\n *\n * SPDX-License-Identifier: BSD-2-Clause\n */\n\nimport { useContext } from \"react\";\n\nimport { PipecatClientTransportStateContext } from \"./PipecatClientState\";\n\nexport const usePipecatClientTransportState = () =>\n useContext(PipecatClientTransportStateContext);\n","/**\n * Copyright (c) 2024, Daily.\n *\n * SPDX-License-Identifier: BSD-2-Clause\n */\n\nimport React, { useEffect, useRef } from \"react\";\n\nimport { usePipecatClientMediaTrack } from \"./usePipecatClientMediaTrack\";\n\ntype ParticipantType = Parameters<typeof usePipecatClientMediaTrack>[1];\n\ninterface Props {\n backgroundColor?: string;\n barColor?: string;\n barCount?: number;\n barGap?: number;\n barLineCap?: \"round\" | \"square\";\n barMaxHeight?: number;\n barOrigin?: \"top\" | \"bottom\" | \"center\";\n barWidth?: number;\n participantType: ParticipantType;\n}\n\nexport const VoiceVisualizer: React.FC<Props> = React.memo(\n ({\n backgroundColor = \"transparent\",\n barColor = \"black\",\n barCount = 5,\n barGap = 12,\n barLineCap = \"round\",\n barMaxHeight = 120,\n barOrigin = \"center\",\n barWidth = 30,\n participantType,\n }) => {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n\n const track: MediaStreamTrack | null = usePipecatClientMediaTrack(\n \"audio\",\n participantType\n );\n\n useEffect(() => {\n if (!canvasRef.current) return;\n\n const canvasWidth = barCount * barWidth + (barCount - 1) * barGap;\n const canvasHeight = barMaxHeight;\n\n const canvas = canvasRef.current;\n\n const scaleFactor = 2;\n\n // Make canvas fill the width and height of its container\n const resizeCanvas = () => {\n canvas.width = canvasWidth * scaleFactor;\n canvas.height = canvasHeight * scaleFactor;\n\n canvas.style.width = `${canvasWidth}px`;\n canvas.style.height = `${canvasHeight}px`;\n\n canvasCtx.lineCap = barLineCap;\n canvasCtx.scale(scaleFactor, scaleFactor);\n };\n\n const canvasCtx = canvas.getContext(\"2d\")!;\n resizeCanvas();\n\n if (!track) return;\n\n const audioContext = new AudioContext();\n const source = audioContext.createMediaStreamSource(\n new MediaStream([track])\n );\n const analyser = audioContext.createAnalyser();\n\n analyser.fftSize = 1024;\n\n source.connect(analyser);\n\n const frequencyData = new Uint8Array(analyser.frequencyBinCount);\n\n canvasCtx.lineCap = barLineCap;\n\n // Create frequency bands based on barCount\n const bands = Array.from({ length: barCount }, (_, i) => {\n // Use improved logarithmic scale for better frequency distribution\n const minFreq = barCount > 20 ? 200 : 80; // Adjust min frequency based on bar count\n const maxFreq = 10000; // Cover most important audio frequencies\n\n // Use Mel scale inspired approach for more perceptually uniform distribution\n // This helps with a large number of bars by placing fewer in the very low range\n // https://en.wikipedia.org/wiki/Mel_scale\n const melMin = 2595 * Math.log10(1 + minFreq / 700);\n const melMax = 2595 * Math.log10(1 + maxFreq / 700);\n const melStep = (melMax - melMin) / barCount;\n\n const melValue = melMin + i * melStep;\n const startFreq = 700 * (Math.pow(10, melValue / 2595) - 1);\n const endFreq = 700 * (Math.pow(10, (melValue + melStep) / 2595) - 1);\n\n return {\n startFreq,\n endFreq,\n smoothValue: 0,\n };\n });\n\n const getFrequencyBinIndex = (frequency: number) => {\n const nyquist = audioContext.sampleRate / 2;\n return Math.round(\n (frequency / nyquist) * (analyser.frequencyBinCount - 1)\n );\n };\n\n function drawSpectrum() {\n analyser.getByteFrequencyData(frequencyData);\n canvasCtx.clearRect(\n 0,\n 0,\n canvas.width / scaleFactor,\n canvas.height / scaleFactor\n );\n canvasCtx.fillStyle = backgroundColor;\n canvasCtx.fillRect(\n 0,\n 0,\n canvas.width / scaleFactor,\n canvas.height / scaleFactor\n );\n\n let isActive = false;\n\n const totalBarsWidth =\n bands.length * barWidth + (bands.length - 1) * barGap;\n const startX = (canvas.width / scaleFactor - totalBarsWidth) / 2; // Center bars\n\n const adjustedCircleRadius = barWidth / 2; // Fixed radius for reset circles\n\n bands.forEach((band, i) => {\n const startIndex = getFrequencyBinIndex(band.startFreq);\n const endIndex = getFrequencyBinIndex(band.endFreq);\n const bandData = frequencyData.slice(startIndex, endIndex);\n const bandValue =\n bandData.reduce((acc, val) => acc + val, 0) / bandData.length;\n\n const smoothingFactor = 0.2;\n\n if (bandValue < 1) {\n band.smoothValue = Math.max(\n band.smoothValue - smoothingFactor * 5,\n 0\n );\n } else {\n band.smoothValue =\n band.smoothValue +\n (bandValue - band.smoothValue) * smoothingFactor;\n isActive = true;\n }\n\n const x = startX + i * (barWidth + barGap);\n // Calculate bar height with a maximum cap\n const minHeight = 0;\n const barHeight = Math.max(\n minHeight,\n Math.min((band.smoothValue / 255) * barMaxHeight, barMaxHeight)\n );\n\n let yTop, yBottom;\n const canvasHeight = canvas.height / scaleFactor;\n\n switch (barOrigin) {\n case \"top\":\n yTop = adjustedCircleRadius;\n yBottom = Math.min(\n adjustedCircleRadius + barHeight,\n canvasHeight - adjustedCircleRadius\n );\n break;\n case \"bottom\":\n yBottom = canvasHeight - adjustedCircleRadius;\n yTop = Math.max(yBottom - barHeight, adjustedCircleRadius);\n break;\n case \"center\":\n default:\n yTop = Math.max(\n canvasHeight / 2 - barHeight / 2,\n adjustedCircleRadius\n );\n yBottom = Math.min(\n canvasHeight / 2 + barHeight / 2,\n canvasHeight - adjustedCircleRadius\n );\n break;\n }\n\n if (band.smoothValue > 0) {\n canvasCtx.beginPath();\n canvasCtx.moveTo(x + barWidth / 2, yTop);\n canvasCtx.lineTo(x + barWidth / 2, yBottom);\n canvasCtx.lineWidth = barWidth;\n canvasCtx.strokeStyle = barColor;\n canvasCtx.stroke();\n } else {\n drawInactiveCircle(adjustedCircleRadius, barColor, x, yTop);\n }\n });\n\n if (!isActive) {\n drawInactiveCircles(adjustedCircleRadius, barColor);\n }\n\n requestAnimationFrame(drawSpectrum);\n }\n\n function drawInactiveCircle(\n circleRadius: number,\n color: string,\n x: number,\n y: number\n ) {\n switch (barLineCap) {\n case \"square\":\n canvasCtx.fillStyle = color;\n canvasCtx.fillRect(\n x + barWidth / 2 - circleRadius,\n y - circleRadius,\n circleRadius * 2,\n circleRadius * 2\n );\n break;\n case \"round\":\n default:\n canvasCtx.beginPath();\n canvasCtx.arc(x + barWidth / 2, y, circleRadius, 0, 2 * Math.PI);\n canvasCtx.fillStyle = color;\n canvasCtx.fill();\n canvasCtx.closePath();\n break;\n }\n }\n\n function drawInactiveCircles(circleRadius: number, color: string) {\n const totalBarsWidth =\n bands.length * barWidth + (bands.length - 1) * barGap;\n const startX = (canvas.width / scaleFactor - totalBarsWidth) / 2;\n const canvasHeight = canvas.height / scaleFactor;\n\n let y;\n switch (barOrigin) {\n case \"top\":\n y = circleRadius;\n break;\n case \"bottom\":\n y = canvasHeight - circleRadius;\n break;\n case \"center\":\n default:\n y = canvasHeight / 2;\n break;\n }\n\n bands.forEach((_, i) => {\n const x = startX + i * (barWidth + barGap);\n drawInactiveCircle(circleRadius, color, x, y);\n });\n }\n\n drawSpectrum();\n\n // Handle resizing\n window.addEventListener(\"resize\", resizeCanvas);\n\n return () => {\n audioContext.close();\n window.removeEventListener(\"resize\", resizeCanvas);\n };\n }, [\n backgroundColor,\n barColor,\n barCount,\n barGap,\n barLineCap,\n barMaxHeight,\n barOrigin,\n barWidth,\n track,\n ]);\n\n return (\n <canvas\n ref={canvasRef}\n style={{\n display: \"block\",\n width: \"100%\",\n height: \"100%\",\n }}\n />\n );\n }\n);\n\nVoiceVisualizer.displayName = \"VoiceVisualizer\";\n"],"names":[],"version":3,"file":"index.module.js.map"}
|