diff --git a/packages/hms-video-store/src/media/tracks/HMSLocalAudioTrack.ts b/packages/hms-video-store/src/media/tracks/HMSLocalAudioTrack.ts index 01fb67d057..84482be5e2 100644 --- a/packages/hms-video-store/src/media/tracks/HMSLocalAudioTrack.ts +++ b/packages/hms-video-store/src/media/tracks/HMSLocalAudioTrack.ts @@ -9,7 +9,7 @@ import { HMSAudioPlugin, HMSPluginSupportResult } from '../../plugins'; import { HMSAudioPluginsManager } from '../../plugins/audio'; import Room from '../../sdk/models/HMSRoom'; import HMSLogger from '../../utils/logger'; -import { getAudioTrack, isEmptyTrack } from '../../utils/track'; +import { getAudioTrack, isEmptyTrack, listenToPermissionChange } from '../../utils/track'; import { TrackAudioLevelMonitor } from '../../utils/track-audio-level-monitor'; import { HMSAudioTrackSettings, HMSAudioTrackSettingsBuilder } from '../settings'; import { HMSLocalStream } from '../streams'; @@ -317,15 +317,8 @@ export class HMSLocalAudioTrack extends HMSAudioTrack { } private trackPermissions = () => { - if (!navigator.permissions) { - HMSLogger.d(this.TAG, 'Permissions API not supported'); - return; - } - // @ts-ignore - navigator.permissions.query({ name: 'microphone' }).then(permission => { - permission.onchange = () => { - this.eventBus.analytics.publish(AnalyticsEventFactory.permissionChange('audio', permission.state)); - }; + listenToPermissionChange('microphone', (state: PermissionState) => { + this.eventBus.analytics.publish(AnalyticsEventFactory.permissionChange(this.type, state)); }); }; diff --git a/packages/hms-video-store/src/media/tracks/HMSLocalVideoTrack.ts b/packages/hms-video-store/src/media/tracks/HMSLocalVideoTrack.ts index a9a3c7ca2e..4e5c2a864e 100644 --- a/packages/hms-video-store/src/media/tracks/HMSLocalVideoTrack.ts +++ b/packages/hms-video-store/src/media/tracks/HMSLocalVideoTrack.ts @@ -20,7 +20,7 @@ import { LocalTrackManager } from '../../sdk/LocalTrackManager'; import Room from '../../sdk/models/HMSRoom'; import HMSLogger from '../../utils/logger'; import { isBrowser, isMobile } from '../../utils/support'; -import { getVideoTrack, isEmptyTrack } from '../../utils/track'; +import { getVideoTrack, isEmptyTrack, listenToPermissionChange } from '../../utils/track'; import { HMSVideoTrackSettings, HMSVideoTrackSettingsBuilder } from '../settings'; import { HMSLocalStream } from '../streams'; @@ -528,15 +528,8 @@ export class HMSLocalVideoTrack extends HMSVideoTrack { } private trackPermissions = () => { - if (!navigator.permissions) { - HMSLogger.d(this.TAG, 'Permissions API not supported'); - return; - } - // @ts-ignore - navigator.permissions.query({ name: 'camera' }).then(permission => { - permission.onchange = () => { - this.eventBus.analytics.publish(AnalyticsEventFactory.permissionChange('video', permission.state)); - }; + listenToPermissionChange('camera', (state: PermissionState) => { + this.eventBus.analytics.publish(AnalyticsEventFactory.permissionChange(this.type, state)); }); }; diff --git a/packages/hms-video-store/src/utils/track.ts b/packages/hms-video-store/src/utils/track.ts index 6af65ce30f..37a37c3957 100644 --- a/packages/hms-video-store/src/utils/track.ts +++ b/packages/hms-video-store/src/utils/track.ts @@ -1,3 +1,4 @@ +import HMSLogger from './logger'; import { BuildGetMediaError } from '../error/utils'; import { HMSAudioTrackSettings, HMSVideoTrackSettings } from '../media/settings'; import { HMSTrackExceptionTrackType } from '../media/tracks/HMSTrackExceptionTrackType'; @@ -29,3 +30,19 @@ export function isEmptyTrack(track: MediaStreamTrack) { // Firefox gives '' as label for empty track(created from audio context) return 'canvas' in track || track.label === 'MediaStreamAudioDestinationNode' || track.label === ''; } + +export const listenToPermissionChange = ( + permissionName: 'camera' | 'microphone', + onChange: (state: PermissionState) => any, +) => { + if (!navigator.permissions) { + HMSLogger.d('Permissions API not supported'); + return; + } + // @ts-ignore + navigator.permissions.query({ name: permissionName }).then(permission => { + permission.onchange = () => { + onChange(permission.state); + }; + }); +};