react-media-manager 0.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/context/MediaProvider.tsx","../src/hooks/useCamera.ts","../src/constants/index.ts","../src/utils/browser.ts","../src/utils/errors.ts","../src/utils/device.ts","../src/utils/permissions.ts","../src/utils/stream.ts","../src/hooks/useDeviceChange.ts","../src/hooks/useMediaDevices.ts","../src/hooks/useMediaRecorder.ts","../src/hooks/useMicrophone.ts","../src/hooks/usePermissions.ts","../src/hooks/useSpeaker.ts","../src/version.ts"],"names":["useEffect","useState","useRef"],"mappings":"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","sourcesContent":["import React, { createContext, useContext } from 'react';\n\nexport interface MediaProviderConfig {\n autoRefreshOnDeviceChange?: boolean;\n cameraConstraints?: MediaTrackConstraints;\n microphoneConstraints?: MediaTrackConstraints;\n monitorMicrophoneVolume?: boolean;\n}\n\nconst defaultConfig: Required<MediaProviderConfig> = {\n autoRefreshOnDeviceChange: true,\n cameraConstraints: {},\n microphoneConstraints: {},\n monitorMicrophoneVolume: true,\n};\n\nconst MediaConfigContext = createContext<Required<MediaProviderConfig>>(defaultConfig);\n\nexport interface MediaProviderProps {\n children: React.ReactNode;\n value?: MediaProviderConfig;\n}\n\nexport function MediaProvider({ children, value }: MediaProviderProps) {\n return <MediaConfigContext.Provider value={{ ...defaultConfig, ...value }}>{children}</MediaConfigContext.Provider>;\n}\n\nexport function useMediaProviderConfig() {\n return useContext(MediaConfigContext);\n}","import { useEffect, useRef, useState } from 'react';\nimport { DEFAULT_PERMISSION_STATE, DEFAULT_STATUS } from '../constants';\nimport { useMediaProviderConfig } from '../context/MediaProvider';\nimport type { HookPermissionState, MediaError, MediaStatus } from '../types/common';\nimport type { CameraDevice, UseCameraOptions, UseCameraResult } from '../types/camera';\nimport { isMediaDevicesSupported } from '../utils/browser';\nimport { emptyDevices, enumerateDevices, findDeviceById } from '../utils/device';\nimport { normalizeMediaError } from '../utils/errors';\nimport { queryPermissionState } from '../utils/permissions';\nimport { buildVideoConstraints, getTrackDeviceId, setStreamEnabled, stopStream } from '../utils/stream';\n\nexport function useCamera(options: UseCameraOptions = {}): UseCameraResult {\n const config = useMediaProviderConfig();\n const supported = isMediaDevicesSupported();\n const [cameras, setCameras] = useState<CameraDevice[]>([]);\n const [currentDeviceId, setCurrentDeviceId] = useState<string | null>(options.deviceId ?? null);\n const [stream, setStream] = useState<MediaStream | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<MediaError | null>(null);\n const [permission, setPermission] = useState<HookPermissionState>(DEFAULT_PERMISSION_STATE);\n const [status, setStatus] = useState<MediaStatus>(DEFAULT_STATUS);\n const [isPaused, setIsPaused] = useState(false);\n const destroyedRef = useRef(false);\n const currentDeviceIdRef = useRef<string | null>(options.deviceId ?? null);\n const streamRef = useRef<MediaStream | null>(null);\n\n const mergedConstraints = {\n ...config.cameraConstraints,\n ...options.constraints,\n };\n\n const currentCamera = findDeviceById(cameras, currentDeviceId);\n\n async function refreshDevices() {\n if (!supported || destroyedRef.current) {\n return;\n }\n\n try {\n const devices = await enumerateDevices();\n\n if (destroyedRef.current) {\n return;\n }\n\n setCameras(devices.cameras);\n\n const matchingDevice = findDeviceById(devices.cameras, currentDeviceIdRef.current);\n\n if (!matchingDevice && currentDeviceIdRef.current) {\n stop();\n setCurrentDeviceId(devices.cameras[0]?.deviceId ?? null);\n currentDeviceIdRef.current = devices.cameras[0]?.deviceId ?? null;\n setError(normalizeMediaError(new DOMException('Camera not found.', 'NotFoundError'), 'device-not-found'));\n return;\n }\n\n if (!currentDeviceIdRef.current && devices.cameras[0]) {\n setCurrentDeviceId(devices.cameras[0].deviceId);\n currentDeviceIdRef.current = devices.cameras[0].deviceId;\n }\n } catch (nextError) {\n setError(normalizeMediaError(nextError, 'browser-not-supported'));\n setCameras(emptyDevices().cameras);\n }\n }\n\n async function updatePermission() {\n if (!supported || destroyedRef.current) {\n return;\n }\n\n const nextPermission = await queryPermissionState('camera');\n\n if (!destroyedRef.current) {\n setPermission(nextPermission);\n }\n }\n\n function stop() {\n stopStream(streamRef.current);\n streamRef.current = null;\n setStream(null);\n setIsPaused(false);\n setStatus('stopped');\n }\n\n async function startStream(deviceIdOverride?: string | null, override: MediaTrackConstraints = {}) {\n if (!supported) {\n const nextError = normalizeMediaError(new Error('MediaDevices API is unavailable.'), 'browser-not-supported');\n setError(nextError);\n setStatus('error');\n return null;\n }\n\n setLoading(true);\n setError(null);\n setStatus('loading');\n\n try {\n const deviceId = deviceIdOverride ?? currentDeviceIdRef.current ?? options.deviceId;\n const constraints = buildVideoConstraints(deviceId ?? undefined, {\n ...mergedConstraints,\n ...override,\n ...(options.facingMode ? { facingMode: options.facingMode } : {}),\n });\n const nextStream = await navigator.mediaDevices.getUserMedia({ video: constraints, audio: false });\n const detectedDeviceId = getTrackDeviceId(nextStream, 'video') ?? deviceId ?? null;\n\n stopStream(streamRef.current);\n streamRef.current = nextStream;\n setStream(nextStream);\n setCurrentDeviceId(detectedDeviceId);\n currentDeviceIdRef.current = detectedDeviceId;\n setPermission('granted');\n setIsPaused(false);\n setStatus('active');\n\n return nextStream;\n } catch (nextError) {\n const normalized = normalizeMediaError(nextError, 'unknown');\n setError(normalized);\n setPermission(normalized.code === 'permission-denied' ? 'denied' : permission);\n setStatus('error');\n return null;\n } finally {\n setLoading(false);\n }\n }\n\n async function start(override: MediaTrackConstraints = {}) {\n return startStream(undefined, override);\n }\n\n function pause() {\n setStreamEnabled(streamRef.current, false);\n setIsPaused(true);\n setStatus('paused');\n }\n\n function resume() {\n setStreamEnabled(streamRef.current, true);\n setIsPaused(false);\n setStatus(streamRef.current ? 'active' : 'idle');\n }\n\n async function switchCamera(deviceId: string, override: MediaTrackConstraints = {}) {\n setCurrentDeviceId(deviceId);\n currentDeviceIdRef.current = deviceId;\n\n if (!streamRef.current) {\n return null;\n }\n\n return startStream(deviceId, override);\n }\n\n async function refresh() {\n await Promise.all([refreshDevices(), updatePermission()]);\n }\n\n function destroy() {\n destroyedRef.current = true;\n stop();\n setCameras([]);\n setError(null);\n setPermission(DEFAULT_PERMISSION_STATE);\n setStatus(DEFAULT_STATUS);\n currentDeviceIdRef.current = null;\n }\n\n useEffect(() => {\n destroyedRef.current = false;\n void refresh();\n\n if (config.autoRefreshOnDeviceChange && supported) {\n const handleDeviceChange = () => {\n void refreshDevices();\n };\n\n navigator.mediaDevices.addEventListener('devicechange', handleDeviceChange);\n\n return () => {\n destroyedRef.current = true;\n stopStream(streamRef.current);\n navigator.mediaDevices.removeEventListener('devicechange', handleDeviceChange);\n };\n }\n\n return () => {\n destroyedRef.current = true;\n stopStream(streamRef.current);\n };\n }, [config.autoRefreshOnDeviceChange, supported]);\n\n useEffect(() => {\n if (options.autoStart) {\n void start();\n }\n }, []);\n\n return {\n cameras,\n constraints: mergedConstraints,\n currentCamera,\n destroy,\n error,\n isActive: Boolean(stream),\n isLoading: loading,\n isPaused,\n loading,\n pause,\n permission,\n refresh,\n refreshDevices,\n resume,\n start,\n status,\n stop,\n stream,\n supported,\n switchCamera,\n };\n}","export const DEFAULT_PERMISSION_STATE = 'unknown';\nexport const DEFAULT_STATUS = 'idle';","export interface SinkIdMediaElement extends HTMLMediaElement {\n setSinkId?: (sinkId: string) => Promise<void>;\n sinkId?: string;\n}\n\nexport function canUseDOM(): boolean {\n return typeof window !== 'undefined' && typeof navigator !== 'undefined';\n}\n\nexport function getMediaDevices(): MediaDevices | null {\n if (!canUseDOM() || !navigator.mediaDevices) {\n return null;\n }\n\n return navigator.mediaDevices;\n}\n\nexport function isMediaDevicesSupported(): boolean {\n const mediaDevices = getMediaDevices();\n return Boolean(mediaDevices && mediaDevices.enumerateDevices && mediaDevices.getUserMedia);\n}\n\nexport function isPermissionsSupported(): boolean {\n return canUseDOM() && typeof navigator.permissions?.query === 'function';\n}\n\nexport function isMediaRecorderSupported(): boolean {\n return canUseDOM() && typeof window.MediaRecorder !== 'undefined';\n}\n\nexport function isSetSinkIdSupported(target?: HTMLMediaElement | null): target is SinkIdMediaElement {\n return Boolean(target && typeof (target as SinkIdMediaElement).setSinkId === 'function');\n}\n\nexport function getAudioContext(): typeof AudioContext | undefined {\n if (!canUseDOM()) {\n return undefined;\n }\n\n return window.AudioContext || (window as typeof window & { webkitAudioContext?: typeof AudioContext }).webkitAudioContext;\n}","import type { MediaError, MediaErrorCode } from '../types/common';\n\nconst ERROR_MESSAGES: Record<MediaErrorCode, string> = {\n abort: 'The media operation was aborted before it could complete.',\n 'browser-not-supported': 'This browser does not support the required media APIs.',\n 'device-in-use': 'The requested media device is already in use by another application.',\n 'device-not-found': 'The requested media device could not be found.',\n 'invalid-state': 'The media device is not in a valid state for this operation.',\n 'not-allowed': 'Access to the requested media device was blocked.',\n 'not-readable': 'The requested media device could not be read.',\n overconstrained: 'No device matched the requested media constraints.',\n 'permission-denied': 'Permission to access the requested media device was denied.',\n 'permission-query-failed': 'The browser could not report the current permission state.',\n 'recorder-not-supported': 'This browser does not support media recording.',\n 'speaker-not-supported': 'This browser does not support switching audio output devices.',\n unknown: 'An unexpected media error occurred.',\n};\n\nconst DOM_ERROR_CODE_MAP: Record<string, MediaErrorCode> = {\n AbortError: 'abort',\n InvalidStateError: 'invalid-state',\n NotAllowedError: 'permission-denied',\n NotFoundError: 'device-not-found',\n NotReadableError: 'not-readable',\n OverconstrainedError: 'overconstrained',\n SecurityError: 'not-allowed',\n TrackStartError: 'device-in-use',\n};\n\nexport function createMediaError(code: MediaErrorCode, cause?: unknown, name?: string): MediaError {\n return {\n code,\n cause,\n message: ERROR_MESSAGES[code],\n name,\n };\n}\n\nexport function normalizeMediaError(error: unknown, fallbackCode: MediaErrorCode = 'unknown'): MediaError {\n if (\n typeof error === 'object' &&\n error &&\n 'code' in error &&\n typeof (error as { code?: unknown }).code === 'string' &&\n 'message' in error\n ) {\n return error as MediaError;\n }\n\n if (error instanceof DOMException) {\n const code = DOM_ERROR_CODE_MAP[error.name] ?? fallbackCode;\n return createMediaError(code, error, error.name);\n }\n\n if (error instanceof Error) {\n const code = DOM_ERROR_CODE_MAP[error.name] ?? fallbackCode;\n return {\n code,\n cause: error,\n message: error.message || ERROR_MESSAGES[code],\n name: error.name,\n };\n }\n\n return createMediaError(fallbackCode, error);\n}","import type { CameraDevice } from '../types/camera';\nimport type { BaseMediaDevice, DeviceCollection, MediaDeviceCategory } from '../types/common';\nimport type { MicrophoneDevice } from '../types/microphone';\nimport type { SpeakerDevice } from '../types/speaker';\nimport { getMediaDevices, isMediaDevicesSupported } from './browser';\nimport { createMediaError } from './errors';\n\nfunction mapKind(kind: MediaDeviceKind): MediaDeviceCategory | null {\n if (kind === 'videoinput') {\n return 'camera';\n }\n\n if (kind === 'audioinput') {\n return 'microphone';\n }\n\n if (kind === 'audiooutput') {\n return 'speaker';\n }\n\n return null;\n}\n\nexport function inferFacingMode(label: string): 'user' | 'environment' | undefined {\n const normalized = label.toLowerCase();\n\n if (normalized.includes('front') || normalized.includes('user') || normalized.includes('facetime')) {\n return 'user';\n }\n\n if (normalized.includes('back') || normalized.includes('rear') || normalized.includes('environment')) {\n return 'environment';\n }\n\n return undefined;\n}\n\nexport function normalizeDevice(device: MediaDeviceInfo): BaseMediaDevice | null {\n const kind = mapKind(device.kind);\n\n if (!kind) {\n return null;\n }\n\n const base: BaseMediaDevice = {\n deviceId: device.deviceId,\n groupId: device.groupId,\n kind,\n label: device.label,\n raw: device,\n };\n\n if (kind === 'camera') {\n return {\n ...base,\n facingMode: inferFacingMode(device.label),\n } as CameraDevice;\n }\n\n return base;\n}\n\nexport function emptyDevices(): DeviceCollection {\n return {\n cameras: [],\n microphones: [],\n speakers: [],\n };\n}\n\nexport async function enumerateDevices(): Promise<DeviceCollection> {\n if (!isMediaDevicesSupported()) {\n throw createMediaError('browser-not-supported');\n }\n\n const rawDevices = await getMediaDevices()!.enumerateDevices();\n const grouped = emptyDevices();\n\n rawDevices.forEach((rawDevice) => {\n const device = normalizeDevice(rawDevice);\n\n if (!device) {\n return;\n }\n\n if (device.kind === 'camera') {\n grouped.cameras.push(device as CameraDevice);\n return;\n }\n\n if (device.kind === 'microphone') {\n grouped.microphones.push(device as MicrophoneDevice);\n return;\n }\n\n grouped.speakers.push(device as SpeakerDevice);\n });\n\n return grouped;\n}\n\nexport function flattenDevices(collection: DeviceCollection): BaseMediaDevice[] {\n return [...collection.cameras, ...collection.microphones, ...collection.speakers];\n}\n\nexport function findDeviceById<TDevice extends BaseMediaDevice>(\n devices: TDevice[],\n deviceId?: string | null,\n): TDevice | null {\n if (!deviceId) {\n return devices[0] ?? null;\n }\n\n return devices.find((device) => device.deviceId === deviceId) ?? null;\n}","import { isMediaDevicesSupported, isPermissionsSupported } from './browser';\n\nexport async function queryPermissionState(name: 'camera' | 'microphone') {\n if (!isPermissionsSupported()) {\n return 'unsupported' as const;\n }\n\n try {\n const status = await navigator.permissions.query({ name: name as PermissionName });\n return status.state;\n } catch {\n return 'unsupported' as const;\n }\n}\n\nexport async function watchPermissionState(\n name: 'camera' | 'microphone',\n onChange: (nextState: PermissionState) => void,\n): Promise<() => void> {\n if (!isPermissionsSupported()) {\n return () => undefined;\n }\n\n try {\n const status = await navigator.permissions.query({ name: name as PermissionName });\n const listener = () => onChange(status.state);\n\n status.addEventListener('change', listener);\n\n return () => status.removeEventListener('change', listener);\n } catch {\n return () => undefined;\n }\n}\n\nexport async function requestMediaPermission(constraints: MediaStreamConstraints): Promise<MediaStream> {\n if (!isMediaDevicesSupported()) {\n throw new Error('MediaDevices API is unavailable.');\n }\n\n return navigator.mediaDevices.getUserMedia(constraints);\n}","export function stopStream(stream: MediaStream | null | undefined): void {\n stream?.getTracks().forEach((track) => track.stop());\n}\n\nexport function setStreamEnabled(stream: MediaStream | null | undefined, enabled: boolean): void {\n stream?.getTracks().forEach((track) => {\n track.enabled = enabled;\n });\n}\n\nexport function buildVideoConstraints(\n deviceId?: string,\n constraints: MediaTrackConstraints = {},\n): MediaTrackConstraints {\n return {\n ...constraints,\n ...(deviceId ? { deviceId: { exact: deviceId } } : {}),\n };\n}\n\nexport function buildAudioConstraints(\n deviceId?: string,\n constraints: MediaTrackConstraints = {},\n): MediaTrackConstraints {\n return {\n ...constraints,\n ...(deviceId ? { deviceId: { exact: deviceId } } : {}),\n };\n}\n\nexport function getTrackDeviceId(stream: MediaStream | null, kind: 'audio' | 'video'): string | undefined {\n const track = kind === 'audio' ? stream?.getAudioTracks()[0] : stream?.getVideoTracks()[0];\n const settings = track?.getSettings();\n return settings?.deviceId;\n}","import { useEffect, useState } from 'react';\nimport { useMediaDevices } from './useMediaDevices';\nimport { isMediaDevicesSupported } from '../utils/browser';\n\nexport interface DeviceChangeHookResult {\n cameras: ReturnType<typeof useMediaDevices>['cameras'];\n changeCount: number;\n destroy: ReturnType<typeof useMediaDevices>['destroy'];\n devices: ReturnType<typeof useMediaDevices>['devices'];\n error: ReturnType<typeof useMediaDevices>['error'];\n lastChangeAt: number | null;\n loading: boolean;\n microphones: ReturnType<typeof useMediaDevices>['microphones'];\n refresh: ReturnType<typeof useMediaDevices>['refresh'];\n speakers: ReturnType<typeof useMediaDevices>['speakers'];\n supported: boolean;\n}\n\nexport function useDeviceChange(): DeviceChangeHookResult {\n const deviceState = useMediaDevices({ listen: false });\n const supported = isMediaDevicesSupported();\n const [changeCount, setChangeCount] = useState(0);\n const [lastChangeAt, setLastChangeAt] = useState<number | null>(null);\n\n useEffect(() => {\n if (!supported) {\n return undefined;\n }\n\n const handleDeviceChange = () => {\n setChangeCount((current) => current + 1);\n setLastChangeAt(Date.now());\n void deviceState.refresh();\n };\n\n navigator.mediaDevices.addEventListener('devicechange', handleDeviceChange);\n\n return () => {\n navigator.mediaDevices.removeEventListener('devicechange', handleDeviceChange);\n };\n }, [deviceState, supported]);\n\n return {\n ...deviceState,\n changeCount,\n lastChangeAt,\n supported,\n };\n}","import { useEffect, useRef, useState } from 'react';\nimport { emptyDevices, enumerateDevices, flattenDevices } from '../utils/device';\nimport { isMediaDevicesSupported } from '../utils/browser';\nimport { normalizeMediaError } from '../utils/errors';\nimport type { DeviceCollection, MediaDevicesHookResult, MediaError } from '../types/common';\nimport { useMediaProviderConfig } from '../context/MediaProvider';\n\nexport interface UseMediaDevicesOptions {\n listen?: boolean;\n}\n\nexport function useMediaDevices(options: UseMediaDevicesOptions = {}): MediaDevicesHookResult {\n const config = useMediaProviderConfig();\n const shouldListen = options.listen ?? config.autoRefreshOnDeviceChange;\n const supported = isMediaDevicesSupported();\n const [devices, setDevices] = useState<DeviceCollection>(emptyDevices);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<MediaError | null>(null);\n const destroyedRef = useRef(false);\n\n async function refresh() {\n if (!supported || destroyedRef.current) {\n return;\n }\n\n setLoading(true);\n setError(null);\n\n try {\n const nextDevices = await enumerateDevices();\n\n if (!destroyedRef.current) {\n setDevices(nextDevices);\n }\n } catch (nextError) {\n if (!destroyedRef.current) {\n setError(normalizeMediaError(nextError, 'browser-not-supported'));\n setDevices(emptyDevices());\n }\n } finally {\n if (!destroyedRef.current) {\n setLoading(false);\n }\n }\n }\n\n function destroy() {\n destroyedRef.current = true;\n setDevices(emptyDevices());\n setError(null);\n setLoading(false);\n }\n\n useEffect(() => {\n destroyedRef.current = false;\n void refresh();\n\n if (!supported || !shouldListen) {\n return () => {\n destroyedRef.current = true;\n };\n }\n\n const mediaDevices = navigator.mediaDevices;\n const handleDeviceChange = () => {\n void refresh();\n };\n\n mediaDevices.addEventListener('devicechange', handleDeviceChange);\n\n return () => {\n destroyedRef.current = true;\n mediaDevices.removeEventListener('devicechange', handleDeviceChange);\n };\n }, [shouldListen, supported]);\n\n return {\n ...devices,\n destroy,\n devices: flattenDevices(devices),\n error,\n loading,\n refresh,\n supported,\n };\n}","import { useEffect, useMemo, useRef, useState } from 'react';\nimport { isMediaRecorderSupported } from '../utils/browser';\nimport { normalizeMediaError } from '../utils/errors';\nimport type { BaseHookResult, MediaError, MediaStatus } from '../types/common';\n\nexport interface UseMediaRecorderResult extends BaseHookResult {\n blob: Blob | null;\n chunks: Blob[];\n isPaused: boolean;\n isRecording: boolean;\n start: (stream: MediaStream, options?: MediaRecorderOptions) => void;\n status: MediaStatus;\n stop: () => void;\n pause: () => void;\n resume: () => void;\n reset: () => void;\n download: (fileName?: string) => string | null;\n url: string | null;\n}\n\nexport function useMediaRecorder(): UseMediaRecorderResult {\n const supported = isMediaRecorderSupported();\n const [status, setStatus] = useState<MediaStatus>('idle');\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<MediaError | null>(null);\n const [chunks, setChunks] = useState<Blob[]>([]);\n const [blob, setBlob] = useState<Blob | null>(null);\n const recorderRef = useRef<MediaRecorder | null>(null);\n const destroyedRef = useRef(false);\n\n const url = useMemo(() => {\n if (!blob || typeof URL === 'undefined') {\n return null;\n }\n\n return URL.createObjectURL(blob);\n }, [blob]);\n\n function reset() {\n setChunks([]);\n setBlob(null);\n setError(null);\n setStatus('idle');\n }\n\n function destroy() {\n destroyedRef.current = true;\n recorderRef.current?.stop();\n recorderRef.current = null;\n reset();\n }\n\n function refresh() {\n return Promise.resolve();\n }\n\n function start(stream: MediaStream, options: MediaRecorderOptions = {}) {\n if (!supported || typeof window.MediaRecorder === 'undefined') {\n setError(normalizeMediaError(new Error('MediaRecorder is unavailable.'), 'recorder-not-supported'));\n setStatus('error');\n return;\n }\n\n setLoading(true);\n setError(null);\n setChunks([]);\n setBlob(null);\n\n try {\n const recorder = new window.MediaRecorder(stream, options);\n\n recorder.ondataavailable = (event) => {\n if (event.data && event.data.size > 0) {\n setChunks((current) => [...current, event.data]);\n }\n };\n\n recorder.onstop = () => {\n setStatus('stopped');\n setLoading(false);\n };\n\n recorder.onerror = (event) => {\n setError(normalizeMediaError((event as Event & { error?: unknown }).error, 'unknown'));\n setStatus('error');\n setLoading(false);\n };\n\n recorderRef.current = recorder;\n recorder.start();\n setStatus('active');\n } catch (nextError) {\n setError(normalizeMediaError(nextError, 'unknown'));\n setStatus('error');\n setLoading(false);\n }\n }\n\n function stop() {\n recorderRef.current?.stop();\n }\n\n function pause() {\n recorderRef.current?.pause();\n setStatus('paused');\n }\n\n function resume() {\n recorderRef.current?.resume();\n setStatus('active');\n }\n\n function download(fileName = 'recording.webm') {\n const nextBlob = blob ?? (chunks.length ? new Blob(chunks, { type: chunks[0]?.type || 'video/webm' }) : null);\n\n if (!nextBlob || typeof document === 'undefined' || typeof URL === 'undefined') {\n return null;\n }\n\n const nextUrl = URL.createObjectURL(nextBlob);\n const anchor = document.createElement('a');\n anchor.href = nextUrl;\n anchor.download = fileName;\n anchor.click();\n return nextUrl;\n }\n\n useEffect(() => {\n if (chunks.length) {\n setBlob(new Blob(chunks, { type: chunks[0]?.type || 'video/webm' }));\n }\n }, [chunks]);\n\n useEffect(() => {\n return () => {\n if (url) {\n URL.revokeObjectURL(url);\n }\n };\n }, [url]);\n\n useEffect(() => {\n return () => {\n destroyedRef.current = true;\n if (url) {\n URL.revokeObjectURL(url);\n }\n recorderRef.current = null;\n };\n }, [url]);\n\n return {\n blob,\n chunks,\n destroy,\n download,\n error,\n isPaused: status === 'paused',\n isRecording: status === 'active',\n loading,\n pause,\n refresh,\n reset,\n resume,\n start,\n status,\n stop,\n supported,\n url,\n };\n}","import { useEffect, useRef, useState } from 'react';\nimport { DEFAULT_PERMISSION_STATE, DEFAULT_STATUS } from '../constants';\nimport { useMediaProviderConfig } from '../context/MediaProvider';\nimport type { HookPermissionState, MediaError, MediaStatus } from '../types/common';\nimport type { MicrophoneDevice, UseMicrophoneOptions, UseMicrophoneResult } from '../types/microphone';\nimport { getAudioContext, isMediaDevicesSupported } from '../utils/browser';\nimport { emptyDevices, enumerateDevices, findDeviceById } from '../utils/device';\nimport { normalizeMediaError } from '../utils/errors';\nimport { queryPermissionState } from '../utils/permissions';\nimport { buildAudioConstraints, getTrackDeviceId, setStreamEnabled, stopStream } from '../utils/stream';\n\ntype AudioContextLike = AudioContext & {\n close: () => Promise<void>;\n};\n\nexport function useMicrophone(options: UseMicrophoneOptions = {}): UseMicrophoneResult {\n const config = useMediaProviderConfig();\n const supported = isMediaDevicesSupported();\n const [microphones, setMicrophones] = useState<MicrophoneDevice[]>([]);\n const [currentDeviceId, setCurrentDeviceId] = useState<string | null>(options.deviceId ?? null);\n const [stream, setStream] = useState<MediaStream | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<MediaError | null>(null);\n const [permission, setPermission] = useState<HookPermissionState>(DEFAULT_PERMISSION_STATE);\n const [status, setStatus] = useState<MediaStatus>(DEFAULT_STATUS);\n const [muted, setMuted] = useState(false);\n const [volume, setVolume] = useState(0);\n const destroyedRef = useRef(false);\n const currentDeviceIdRef = useRef<string | null>(options.deviceId ?? null);\n const streamRef = useRef<MediaStream | null>(null);\n const analyserContextRef = useRef<AudioContextLike | null>(null);\n const animationFrameRef = useRef<number | null>(null);\n\n const mergedConstraints = {\n ...config.microphoneConstraints,\n ...options.constraints,\n };\n\n const currentMicrophone = findDeviceById(microphones, currentDeviceId);\n\n function stopVolumeMonitor() {\n if (animationFrameRef.current) {\n cancelAnimationFrame(animationFrameRef.current);\n animationFrameRef.current = null;\n }\n\n if (analyserContextRef.current) {\n void analyserContextRef.current.close();\n analyserContextRef.current = null;\n }\n\n setVolume(0);\n }\n\n function startVolumeMonitor(nextStream: MediaStream) {\n if (!(options.monitorVolume ?? config.monitorMicrophoneVolume)) {\n return;\n }\n\n const AudioContextCtor = getAudioContext();\n\n if (!AudioContextCtor) {\n return;\n }\n\n const audioContext = new AudioContextCtor() as AudioContextLike;\n const analyser = audioContext.createAnalyser();\n const source = audioContext.createMediaStreamSource(nextStream);\n const sample = new Uint8Array(analyser.fftSize);\n\n analyser.smoothingTimeConstant = 0.8;\n source.connect(analyser);\n analyserContextRef.current = audioContext;\n\n const readVolume = () => {\n analyser.getByteTimeDomainData(sample);\n\n let sum = 0;\n\n sample.forEach((value) => {\n const normalized = (value - 128) / 128;\n sum += normalized * normalized;\n });\n\n setVolume(Number(Math.min(1, Math.sqrt(sum / sample.length)).toFixed(4)));\n animationFrameRef.current = requestAnimationFrame(readVolume);\n };\n\n animationFrameRef.current = requestAnimationFrame(readVolume);\n }\n\n async function refreshDevices() {\n if (!supported || destroyedRef.current) {\n return;\n }\n\n try {\n const devices = await enumerateDevices();\n\n if (destroyedRef.current) {\n return;\n }\n\n setMicrophones(devices.microphones);\n\n const matchingDevice = findDeviceById(devices.microphones, currentDeviceIdRef.current);\n\n if (!matchingDevice && currentDeviceIdRef.current) {\n stop();\n setCurrentDeviceId(devices.microphones[0]?.deviceId ?? null);\n currentDeviceIdRef.current = devices.microphones[0]?.deviceId ?? null;\n setError(normalizeMediaError(new DOMException('Microphone not found.', 'NotFoundError'), 'device-not-found'));\n return;\n }\n\n if (!currentDeviceIdRef.current && devices.microphones[0]) {\n setCurrentDeviceId(devices.microphones[0].deviceId);\n currentDeviceIdRef.current = devices.microphones[0].deviceId;\n }\n } catch (nextError) {\n setError(normalizeMediaError(nextError, 'browser-not-supported'));\n setMicrophones(emptyDevices().microphones);\n }\n }\n\n async function updatePermission() {\n if (!supported || destroyedRef.current) {\n return;\n }\n\n const nextPermission = await queryPermissionState('microphone');\n\n if (!destroyedRef.current) {\n setPermission(nextPermission);\n }\n }\n\n function stop() {\n stopVolumeMonitor();\n stopStream(streamRef.current);\n streamRef.current = null;\n setStream(null);\n setMuted(false);\n setStatus('stopped');\n }\n\n async function startStream(deviceIdOverride?: string | null, override: MediaTrackConstraints = {}) {\n if (!supported) {\n const nextError = normalizeMediaError(new Error('MediaDevices API is unavailable.'), 'browser-not-supported');\n setError(nextError);\n setStatus('error');\n return null;\n }\n\n setLoading(true);\n setError(null);\n setStatus('loading');\n\n try {\n const deviceId = deviceIdOverride ?? currentDeviceIdRef.current ?? options.deviceId;\n const constraints = buildAudioConstraints(deviceId ?? undefined, {\n ...mergedConstraints,\n ...override,\n });\n const nextStream = await navigator.mediaDevices.getUserMedia({ video: false, audio: constraints });\n const detectedDeviceId = getTrackDeviceId(nextStream, 'audio') ?? deviceId ?? null;\n\n stop();\n streamRef.current = nextStream;\n setStream(nextStream);\n setCurrentDeviceId(detectedDeviceId);\n currentDeviceIdRef.current = detectedDeviceId;\n setPermission('granted');\n setMuted(false);\n setStatus('active');\n startVolumeMonitor(nextStream);\n\n return nextStream;\n } catch (nextError) {\n const normalized = normalizeMediaError(nextError, 'unknown');\n setError(normalized);\n setPermission(normalized.code === 'permission-denied' ? 'denied' : permission);\n setStatus('error');\n return null;\n } finally {\n setLoading(false);\n }\n }\n\n async function start(override: MediaTrackConstraints = {}) {\n return startStream(undefined, override);\n }\n\n function mute() {\n setStreamEnabled(streamRef.current, false);\n setMuted(true);\n }\n\n function unmute() {\n setStreamEnabled(streamRef.current, true);\n setMuted(false);\n }\n\n async function switchMicrophone(deviceId: string, override: MediaTrackConstraints = {}) {\n setCurrentDeviceId(deviceId);\n currentDeviceIdRef.current = deviceId;\n\n if (!streamRef.current) {\n return null;\n }\n\n return startStream(deviceId, override);\n }\n\n async function refresh() {\n await Promise.all([refreshDevices(), updatePermission()]);\n }\n\n function destroy() {\n destroyedRef.current = true;\n stop();\n setMicrophones([]);\n setError(null);\n setPermission(DEFAULT_PERMISSION_STATE);\n setStatus(DEFAULT_STATUS);\n currentDeviceIdRef.current = null;\n }\n\n useEffect(() => {\n destroyedRef.current = false;\n void refresh();\n\n if (config.autoRefreshOnDeviceChange && supported) {\n const handleDeviceChange = () => {\n void refreshDevices();\n };\n\n navigator.mediaDevices.addEventListener('devicechange', handleDeviceChange);\n\n return () => {\n destroyedRef.current = true;\n stopVolumeMonitor();\n stopStream(streamRef.current);\n navigator.mediaDevices.removeEventListener('devicechange', handleDeviceChange);\n };\n }\n\n return () => {\n destroyedRef.current = true;\n stopVolumeMonitor();\n stopStream(streamRef.current);\n };\n }, [config.autoRefreshOnDeviceChange, supported]);\n\n useEffect(() => {\n if (options.autoStart) {\n void start();\n }\n }, []);\n\n return {\n currentMicrophone,\n destroy,\n error,\n isActive: Boolean(stream),\n isLoading: loading,\n loading,\n microphones,\n mute,\n muted,\n permission,\n refresh,\n refreshDevices,\n start,\n status,\n stop,\n stream,\n supported,\n switchMicrophone,\n unmute,\n volume,\n };\n}","import { useEffect, useRef, useState } from 'react';\nimport type { BaseHookResult, HookPermissionState, MediaError } from '../types/common';\nimport { DEFAULT_PERMISSION_STATE } from '../constants';\nimport { isMediaDevicesSupported, isPermissionsSupported } from '../utils/browser';\nimport { normalizeMediaError } from '../utils/errors';\nimport { queryPermissionState, requestMediaPermission, watchPermissionState } from '../utils/permissions';\nimport { stopStream } from '../utils/stream';\n\nexport interface UsePermissionsResult extends BaseHookResult {\n camera: HookPermissionState;\n microphone: HookPermissionState;\n requestAll: () => Promise<void>;\n requestCamera: () => Promise<void>;\n requestMicrophone: () => Promise<void>;\n}\n\nexport function usePermissions(): UsePermissionsResult {\n const supported = isMediaDevicesSupported();\n const permissionsSupported = isPermissionsSupported();\n const [camera, setCamera] = useState<HookPermissionState>(DEFAULT_PERMISSION_STATE);\n const [microphone, setMicrophone] = useState<HookPermissionState>(DEFAULT_PERMISSION_STATE);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<MediaError | null>(null);\n const destroyedRef = useRef(false);\n\n async function refresh() {\n if (!supported || destroyedRef.current) {\n return;\n }\n\n setLoading(true);\n setError(null);\n\n try {\n const [nextCamera, nextMicrophone] = await Promise.all([\n queryPermissionState('camera'),\n queryPermissionState('microphone'),\n ]);\n\n if (!destroyedRef.current) {\n setCamera(nextCamera);\n setMicrophone(nextMicrophone);\n }\n } catch (nextError) {\n if (!destroyedRef.current) {\n setError(normalizeMediaError(nextError, 'permission-query-failed'));\n }\n } finally {\n if (!destroyedRef.current) {\n setLoading(false);\n }\n }\n }\n\n async function requestCamera() {\n try {\n const stream = await requestMediaPermission({ video: true });\n stopStream(stream);\n await refresh();\n } catch (nextError) {\n setError(normalizeMediaError(nextError, 'permission-denied'));\n throw nextError;\n }\n }\n\n async function requestMicrophone() {\n try {\n const stream = await requestMediaPermission({ audio: true });\n stopStream(stream);\n await refresh();\n } catch (nextError) {\n setError(normalizeMediaError(nextError, 'permission-denied'));\n throw nextError;\n }\n }\n\n async function requestAll() {\n try {\n const stream = await requestMediaPermission({ audio: true, video: true });\n stopStream(stream);\n await refresh();\n } catch (nextError) {\n setError(normalizeMediaError(nextError, 'permission-denied'));\n throw nextError;\n }\n }\n\n function destroy() {\n destroyedRef.current = true;\n setCamera(DEFAULT_PERMISSION_STATE);\n setMicrophone(DEFAULT_PERMISSION_STATE);\n setError(null);\n setLoading(false);\n }\n\n useEffect(() => {\n destroyedRef.current = false;\n void refresh();\n\n if (!permissionsSupported) {\n setCamera('unsupported');\n setMicrophone('unsupported');\n return () => {\n destroyedRef.current = true;\n };\n }\n\n let cameraCleanup: () => void = () => undefined;\n let microphoneCleanup: () => void = () => undefined;\n\n void watchPermissionState('camera', (nextState) => {\n if (!destroyedRef.current) {\n setCamera(nextState);\n }\n }).then((cleanup) => {\n cameraCleanup = cleanup;\n });\n\n void watchPermissionState('microphone', (nextState) => {\n if (!destroyedRef.current) {\n setMicrophone(nextState);\n }\n }).then((cleanup) => {\n microphoneCleanup = cleanup;\n });\n\n return () => {\n destroyedRef.current = true;\n cameraCleanup();\n microphoneCleanup();\n };\n }, [permissionsSupported, supported]);\n\n return {\n camera,\n destroy,\n error,\n loading,\n microphone,\n refresh,\n requestAll,\n requestCamera,\n requestMicrophone,\n supported,\n };\n}","import { useEffect, useRef, useState } from 'react';\nimport type { RefObject } from 'react';\nimport type { HookPermissionState, MediaError } from '../types/common';\nimport type { SpeakerDevice, UseSpeakerResult } from '../types/speaker';\nimport { isMediaDevicesSupported, isSetSinkIdSupported, type SinkIdMediaElement } from '../utils/browser';\nimport { emptyDevices, enumerateDevices, findDeviceById } from '../utils/device';\nimport { normalizeMediaError } from '../utils/errors';\n\ntype SpeakerTarget = RefObject<HTMLMediaElement | null> | HTMLMediaElement | null;\n\nfunction resolveTarget(target: SpeakerTarget): HTMLMediaElement | null {\n if (!target) {\n return null;\n }\n\n if ('current' in target) {\n return target.current;\n }\n\n return target;\n}\n\nexport function useSpeaker(target: SpeakerTarget): UseSpeakerResult {\n const supported = isMediaDevicesSupported();\n const [speakers, setSpeakers] = useState<SpeakerDevice[]>([]);\n const [currentSpeakerId, setCurrentSpeakerId] = useState<string | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<MediaError | null>(null);\n const destroyedRef = useRef(false);\n const permission: HookPermissionState = 'unknown';\n\n const currentSpeaker = findDeviceById(speakers, currentSpeakerId);\n const mediaElement = resolveTarget(target);\n const sinkSupported = isSetSinkIdSupported(mediaElement);\n\n async function refresh() {\n if (!supported || destroyedRef.current) {\n return;\n }\n\n setLoading(true);\n setError(null);\n\n try {\n const devices = await enumerateDevices();\n\n if (!destroyedRef.current) {\n setSpeakers(devices.speakers);\n\n if (!currentSpeakerId && devices.speakers[0]) {\n setCurrentSpeakerId(devices.speakers[0].deviceId);\n }\n }\n } catch (nextError) {\n if (!destroyedRef.current) {\n setError(normalizeMediaError(nextError, 'browser-not-supported'));\n setSpeakers(emptyDevices().speakers);\n }\n } finally {\n if (!destroyedRef.current) {\n setLoading(false);\n }\n }\n }\n\n async function switchSpeaker(deviceId: string) {\n if (!mediaElement || !sinkSupported) {\n setError(normalizeMediaError(new Error('setSinkId is unavailable.'), 'speaker-not-supported'));\n return false;\n }\n\n try {\n await (mediaElement as SinkIdMediaElement).setSinkId!(deviceId);\n setCurrentSpeakerId(deviceId);\n setError(null);\n return true;\n } catch (nextError) {\n setError(normalizeMediaError(nextError, 'speaker-not-supported'));\n return false;\n }\n }\n\n function destroy() {\n destroyedRef.current = true;\n setSpeakers([]);\n setCurrentSpeakerId(null);\n setError(null);\n setLoading(false);\n }\n\n useEffect(() => {\n destroyedRef.current = false;\n void refresh();\n\n if (!supported) {\n return () => {\n destroyedRef.current = true;\n };\n }\n\n const handleDeviceChange = () => {\n void refresh();\n };\n\n navigator.mediaDevices.addEventListener('devicechange', handleDeviceChange);\n\n return () => {\n destroyedRef.current = true;\n navigator.mediaDevices.removeEventListener('devicechange', handleDeviceChange);\n };\n }, [supported]);\n\n return {\n currentSpeaker,\n destroy,\n error,\n isSupported: sinkSupported,\n loading,\n permission,\n refresh,\n speakers,\n supported,\n switchSpeaker,\n };\n}","export const version = '0.1.0';"]}