@jellyfish-dev/browser-media-utils
Version:
Facilitates the use of getUserMedia and enumerateDevices.
49 lines (48 loc) • 2.2 kB
JavaScript
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),
};
};