UNPKG

infobip-rtc

Version:

Infobip RTC JavaScript SDK - Infobip WebRTC API Implementation

60 lines 2.77 kB
import { uniqBy } from 'lodash-es'; import { MediaDevice } from "./device/MediaDevice"; const AUDIO_INPUT = "audioinput"; const AUDIO_OUTPUT = "audiooutput"; const VIDEO_INPUT = "videoinput"; export class RTCMediaDevice { static getAudioInputDevices() { return RTCMediaDevice.requestPermission({ audio: true, video: false }) .then(() => RTCMediaDevice.getDevices(mediaDeviceInfo => mediaDeviceInfo.kind === AUDIO_INPUT)); } static getAudioOutputDevices() { return RTCMediaDevice.getDevices(mediaDeviceInfo => mediaDeviceInfo.kind === AUDIO_OUTPUT); } static getVideoInputDevices() { return RTCMediaDevice.requestPermission({ audio: false, video: true }) .then(() => RTCMediaDevice.getDevices(mediaDeviceInfo => mediaDeviceInfo.kind === VIDEO_INPUT)); } static getMediaStream(deviceId) { return RTCMediaDevice.getDevices(mediaDeviceInfo => mediaDeviceInfo.deviceId === deviceId) .then(devices => RTCMediaDevice.getMediaStreamForDevice(devices[0])); } static getAudioMediaStream(deviceId) { const constraints = { audio: { deviceId: deviceId ?? undefined }, video: false }; return navigator.mediaDevices.getUserMedia(constraints); } static getVideoMediaStream(deviceId, cameraOrientation) { const constraints = { audio: false, video: { deviceId: deviceId ?? undefined, facingMode: cameraOrientation } }; return navigator.mediaDevices.getUserMedia(constraints); } static closeMediaStream(mediaStream) { mediaStream.getTracks().forEach(track => track.stop()); } static getDevices(filterPredicate) { return navigator.mediaDevices.enumerateDevices() .then(devices => uniqBy(devices, 'deviceId')) .then(mediaDeviceInfos => mediaDeviceInfos.filter(filterPredicate).map(RTCMediaDevice.toMediaDevice)); } static getMediaStreamForDevice(mediaDevice) { if (mediaDevice.kind.endsWith("output")) { return Promise.reject("Cannot get media stream for output device."); } if (mediaDevice.kind.startsWith("video")) { return RTCMediaDevice.getVideoMediaStream(mediaDevice.deviceId); } else { return RTCMediaDevice.getAudioMediaStream(mediaDevice.deviceId); } } static toMediaDevice(mediaDeviceInfo) { return new MediaDevice(mediaDeviceInfo.deviceId, mediaDeviceInfo.groupId, mediaDeviceInfo.kind, mediaDeviceInfo.label); } static async requestPermission(constraints) { let stream = await navigator.mediaDevices.getUserMedia(constraints); RTCMediaDevice.closeMediaStream(stream); } } //# sourceMappingURL=RTCMediaDevice.js.map