UNPKG

@100mslive/hms-video-store

Version:

@100mslive Core SDK which abstracts the complexities of webRTC while providing a reactive store for data management with a unidirectional data flow

68 lines (59 loc) 2.09 kB
import { DeviceMap, SelectedDevices } from '../interfaces'; import { LocalStorage } from '../utils/local-storage'; import HMSLogger from '../utils/logger'; type DeviceInfo = { deviceId?: string; groupId?: string }; /** * This class is to manage storing and retrieving selected devices * from localstorage * @internal */ class DeviceStorage { private storage = new LocalStorage<SelectedDevices>('hms-device-selection'); private remember = false; private devices?: DeviceMap; private readonly TAG = '[HMSDeviceStorage]'; setDevices(devices: DeviceMap) { this.devices = devices; } rememberDevices(value: boolean) { this.remember = value; } /** * This will update the passed in type value in storage * @param {string} type - One of audioInput | videoInput | audioOutput * @param {DeviceInfo} param * @returns {void} */ updateSelection(type: 'audioInput' | 'videoInput' | 'audioOutput', { deviceId, groupId }: DeviceInfo) { if (!this.devices || !this.remember) { return; } const newSelection = this.devices[type].find(device => this.isSame({ deviceId, groupId }, device)); if (!newSelection) { HMSLogger.w(this.TAG, `Could not find device with deviceId: ${deviceId}, groupId: ${groupId}`); return; } const selectedDevices = this.storage.get() || {}; if (type === 'audioOutput') { selectedDevices[type] = newSelection as MediaDeviceInfo; } else { selectedDevices[type] = newSelection as MediaDeviceInfo; } this.storage.set(selectedDevices); } getSelection() { if (!this.remember) { return undefined; } return this.storage.get(); } cleanup() { this.remember = false; this.devices = undefined; } private isSame(current: DeviceInfo, device: DeviceInfo) { // Safari doesn't give groupId from nativeTrack. Check if groupId's match or current groupId is not present return current.deviceId === device.deviceId && (current.groupId === device.groupId || !current.groupId); } } export const DeviceStorageManager = new DeviceStorage();