MCPcopy Index your code
hub / github.com/CapSoftware/Cap / createStableDevicesQuery

Function createStableDevicesQuery

apps/desktop/src/utils/devices.ts:96–238  ·  view source on GitHub ↗
(
	enabled: Accessor<boolean> = () => true,
)

Source from the content-addressed store, hash-verified

94}
95
96export function createStableDevicesQuery(
97 enabled: Accessor<boolean> = () => true,
98) {
99 const query = createDevicesQuery(enabled);
100
101 const [cameras, setCameras] = createStore<CameraWithDetails[]>([]);
102 const [microphones, setMicrophones] = createStore<MicrophoneWithDetails[]>(
103 [],
104 );
105
106 const cameraDetailsCache: CameraDetailsCache = {};
107 const micDetailsCache: MicDetailsCache = {};
108 const pendingCameraFetches = new Set<string>();
109 const pendingMicFetches = new Set<string>();
110
111 createEffect(() => {
112 const rawCameras = query.data?.cameras ?? [];
113
114 const currentCameras = untrack(() => cameras);
115 const hasListChanged = cameraListChanged(currentCameras, rawCameras);
116
117 if (hasListChanged) {
118 const existingMap = new Map(
119 currentCameras.map((c) => [
120 c.device_id,
121 { bestFormat: c.bestFormat, formats: c.formats },
122 ]),
123 );
124
125 const newCameras: CameraWithDetails[] = rawCameras.map((c) => ({
126 ...c,
127 ...(cameraDetailsCache[c.device_id] ?? existingMap.get(c.device_id)),
128 }));
129
130 setCameras(newCameras);
131 }
132
133 for (const camera of rawCameras) {
134 if (
135 !cameraDetailsCache[camera.device_id] &&
136 !pendingCameraFetches.has(camera.device_id)
137 ) {
138 pendingCameraFetches.add(camera.device_id);
139 commands.getCameraFormats(camera.device_id).then((formats) => {
140 pendingCameraFetches.delete(camera.device_id);
141 if (formats) {
142 const details = {
143 bestFormat: formats.bestFormat ?? undefined,
144 formats: formats.formats,
145 };
146 cameraDetailsCache[camera.device_id] = details;
147 setCameras(
148 produce((cams) => {
149 const cam = cams.find((c) => c.device_id === camera.device_id);
150 if (cam) {
151 cam.bestFormat = details.bestFormat;
152 cam.formats = details.formats;
153 }

Callers 1

PageFunction · 0.90

Calls 4

createDevicesQueryFunction · 0.85
createStoreFunction · 0.85
cameraListChangedFunction · 0.85
micListChangedFunction · 0.85

Tested by

no test coverage detected