UNPKG

@jellyfish-dev/browser-media-utils

Version:

Facilitates the use of getUserMedia and enumerateDevices.

49 lines (48 loc) 2.2 kB
import { isAudio, isNotGranted, isVideo, prepareReturn, toMediaTrackConstraints } from "./utils"; /** * Get all available media devices that match provided constraints. * * @param videoParam - boolean or MediaTrackConstraints with configuration for video device * @param audioParam - boolean or MediaTrackConstraints with configuration for audio device * @returns Promise with object containing arrays of objects for each kind of media device * * @example * enumerateDevices(true, true).then((devices) => { * console.log(devices); * }); */ export const enumerateDevices = async (videoParam, audioParam) => { if (!navigator?.mediaDevices) throw Error("Navigator is available only in secure contexts"); const objAudio = toMediaTrackConstraints(audioParam); const objVideo = toMediaTrackConstraints(videoParam); const booleanAudio = !!audioParam; const booleanVideo = !!videoParam; let mediaDeviceInfos = await navigator.mediaDevices.enumerateDevices(); const videoNotGranted = mediaDeviceInfos.filter(isVideo).some(isNotGranted); const audioNotGranted = mediaDeviceInfos.filter(isAudio).some(isNotGranted); const constraints = { video: booleanVideo && videoNotGranted && objVideo, audio: booleanAudio && audioNotGranted && objAudio, }; let audioError = null; let videoError = null; try { if (constraints.audio || constraints.video) { const requestedDevices = await navigator.mediaDevices.getUserMedia(constraints); mediaDeviceInfos = await navigator.mediaDevices.enumerateDevices(); requestedDevices.getTracks().forEach((track) => { track.stop(); }); } } catch (error) { // https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia#exceptions videoError = booleanVideo && videoNotGranted ? error.name : null; audioError = booleanAudio && audioNotGranted ? error.name : null; } return { video: prepareReturn(booleanVideo, mediaDeviceInfos.filter(isVideo), videoError), audio: prepareReturn(booleanAudio, mediaDeviceInfos.filter(isAudio), audioError), }; };