import type { AppCapability, CapabilitiesService, CapabilitySnapshot, } from "../app/types"; export const evaluateCapabilitySnapshot = ( snapshot: CapabilitySnapshot, ): AppCapability => { if (!snapshot.hasMediaDevices) { return { ...snapshot, canRunDemo: false, failureReason: "This browser does not expose microphone capture APIs.", }; } if (!snapshot.hasWebGPU) { return { ...snapshot, canRunDemo: false, failureReason: "WebGPU is unavailable, so local model execution cannot start.", }; } if (!snapshot.hasAudioWorklet) { return { ...snapshot, canRunDemo: false, failureReason: "AudioWorklet support is unavailable, so live capture is unreliable.", }; } return { ...snapshot, canRunDemo: true, failureReason: null, }; }; export class BrowserCapabilitiesService implements CapabilitiesService { async detect(): Promise { const snapshot: CapabilitySnapshot = { hasWebGPU: typeof navigator !== "undefined" && "gpu" in navigator, hasMediaDevices: typeof navigator !== "undefined" && typeof navigator.mediaDevices?.getUserMedia === "function", hasAudioWorklet: typeof window !== "undefined" && typeof window.AudioWorkletNode !== "undefined", hasCrossOriginIsolation: typeof globalThis !== "undefined" && globalThis.crossOriginIsolated === true, }; return evaluateCapabilitySnapshot(snapshot); } }