@cloudflare/realtimekit-react-native 0.2.1 → 0.2.2-staging.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/android/build.gradle +0 -2
  2. package/android/src/main/java/com/cloudflare/realtimekit/CoreModule.java +19 -0
  3. package/android/src/main/java/com/cloudflare/realtimekit/ForegroundService.java +2 -4
  4. package/android/src/main/java/com/cloudflare/realtimekit/RTKHelperModule.java +1 -2
  5. package/android/src/main/java/com/cloudflare/realtimekit/RTKLogger.java +116 -0
  6. package/android/src/main/java/com/cloudflare/realtimekit/incallmanager/AppRTCBluetoothManager.java +75 -74
  7. package/android/src/main/java/com/cloudflare/realtimekit/incallmanager/AppRTCUtils.java +10 -9
  8. package/android/src/main/java/com/cloudflare/realtimekit/incallmanager/InCallManagerModule.java +175 -872
  9. package/android/src/main/java/com/cloudflare/realtimekit/incallmanager/InCallProximityManager.java +9 -8
  10. package/android/src/main/java/com/cloudflare/realtimekit/incallmanager/InCallWakeLockUtils.java +8 -7
  11. package/ios/BroadcastEventEmitter.m +9 -0
  12. package/ios/Core.h +9 -1
  13. package/ios/Core.m +42 -0
  14. package/ios/RNInCallManager.m +639 -700
  15. package/ios/RTKLogger.h +51 -0
  16. package/ios/RTKLogger.m +107 -0
  17. package/ios/RTKRNBackgroundTimer.m +8 -7
  18. package/ios/RTKRNPermissionHandlerNotifications.m +12 -0
  19. package/ios/RTKRNPermissions.m +24 -1
  20. package/ios/RTKScreensharePickerView.m +6 -0
  21. package/ios/screenshare/RTKScreenshareHandler.swift +1 -1
  22. package/ios/screenshare/RTKScreenshareUploader.swift +3 -3
  23. package/ios/screenshare/RTKSocketConnection.swift +8 -8
  24. package/lib/commonjs/LocalMediaHandler.js +82 -24
  25. package/lib/commonjs/LocalMediaHandler.js.map +1 -1
  26. package/lib/commonjs/LocalMediaUtils.js +60 -5
  27. package/lib/commonjs/LocalMediaUtils.js.map +1 -1
  28. package/lib/commonjs/NativeAudioManager.js +7 -3
  29. package/lib/commonjs/NativeAudioManager.js.map +1 -1
  30. package/lib/commonjs/utils/version.js +1 -1
  31. package/lib/commonjs/utils/version.js.map +1 -1
  32. package/lib/module/LocalMediaHandler.js +82 -24
  33. package/lib/module/LocalMediaHandler.js.map +1 -1
  34. package/lib/module/LocalMediaUtils.js +60 -5
  35. package/lib/module/LocalMediaUtils.js.map +1 -1
  36. package/lib/module/NativeAudioManager.js +7 -3
  37. package/lib/module/NativeAudioManager.js.map +1 -1
  38. package/lib/module/utils/version.js +1 -1
  39. package/lib/module/utils/version.js.map +1 -1
  40. package/lib/typescript/LocalMediaHandler.d.ts +1 -0
  41. package/lib/typescript/LocalMediaUtils.d.ts +1 -0
  42. package/lib/typescript/NativeAudioManager.d.ts +1 -0
  43. package/lib/typescript/utils/version.d.ts +1 -1
  44. package/package.json +2 -4
@@ -1 +1 @@
1
- {"version":3,"names":["EventEmitter","LocalMediaUtils","AppState","NativeEventEmitter","NativeModules","PermissionsAndroid","Platform","BackgroundTimer","InCallManger","setupPermissions","RTKHelper","BroadcastEventEmitter","broadcastEmitter","MediaEvents","checkIfAudioTrackIsSilent","track","_localMediaUtils","WeakMap","_appState","_appStateSubscription","_interval","LocalMediaHandler","configureForeground","OS","val","isForegroundServiceRunning","Version","res","request","PERMISSIONS","POST_NOTIFICATIONS","RESULTS","GRANTED","console","warn","createNotificationChannel","startService","e","constructor","localMediaUtils","_classPrivateFieldInitSpec","_defineProperty","nextAppState","_classPrivateFieldGet","match","clearInterval","_classPrivateFieldSet","videoTrack","enabled","setTimeout","screenShareEnabled","_pendingScreenShare","setInterval","audioEnabled","videoEnabled","permissions","audio","video","screenShareTracks","undefined","currentDevices","speaker","onDeviceChange","changedDevices","addListener","oniOSBroadcastStart","oniOSBroadcastStop","start","conditionallyRestartAudio","Promise","race","resolve","_this$audioTrack","audioTrack","addEventListener","reacquireTrack","shouldReacquireTrack","_this$currentDevices$","removeMediaStreamTrackListeners","setupAudioStream","deviceId","addMediaStreamTrackListeners","emit","conditionallyRestartVideo","_this$videoTrack","setupVideoStream","kind","workaroundWebKitBug1208516","mediaStreamTrack","wasEnabled","rawAudioTrack","rawVideoTrack","isStopped","readyState","isInadvertentlyStopped","isSilentAudio","muted","removeDocumentEventListeners","onUnmute","ev","conditionallyRestart","removeEventListener","forceStopTrack","_this$currentDevices$2","audioDevices","getAudioDevices","length","audioDeviceId","getOperationalMicDeviceId","getDeviceById","_this$audioTrack2","_this$rawAudioTrack","stop","getAudioTrack","err","setAudioTrack","setDevice","repopulateAvailableDevices","device","onVisibilityChange","_this$currentDevices$3","videoDevices","getVideoDevices","videoDeviceId","getOperationalWebcamDeviceId","videoConstraints","getVideoConstraints","getVideoTrack","setVideoTrack","_this$videoTrack2","_this$rawVideoTrack","setupSpeaker","_this$currentDevices$4","speakerDevices","getSpeakerDevices","lastDeviceIndex","speakerDeviceId","isOperational","reverse","operationalDeviceId","deviceIndex","isSilent","release","setupStreams","permResult","camera","microphone","message","constraints","_handleAppStateChange","stopScreenShareTracks","tracks","_this$screenShareTrac","_this$screenShareTrac2","removeScreenShareTracks","_this$screenShareTrac3","onScreenShareEnded","stopAudioTrack","stopVideoTrack","setScreenShareTracks","_this$screenShareTrac4","bind","disableAudio","toggleAudio","enableAudio","_this$currentDevices$5","ex","enableVideo","toggleVideo","disableVideo","_this$currentDevices$6","setAudioDevice","setVideoDevice","setSpeakerDevice","route","chooseAudioRoute","getScreenShareTracks","toggleScreenShare","stopService","RTKScreensharePickerView","showScreenSharePickerView","enableScreenShare","disableScreenShare","getAllDevices","availableDevices","getCurrentDevices","forceDeviceChange","addedDevice","removedDevice","added","removed","init","_","event","args","on","listener","destruct","remove","_err","_this$rawAudioTrack2","_this$audioTrack3","_this$rawAudioTrack3","_this$audioTrack4","_this$rawVideoTrack2","_this$videoTrack3","_this$rawVideoTrack3","_this$videoTrack4"],"sources":["LocalMediaHandler.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-unused-vars */\nimport { EventEmitter } from 'events';\nimport LocalMediaUtils from './LocalMediaUtils';\nimport {\n RealtimeKitMediaStreamConstraints,\n MediaPermission,\n} from './LocalMediaInterfaces';\nimport type { MediaStreamTrack } from '@cloudflare/react-native-webrtc';\nimport type { MediaDeviceInfo } from './LocalMediaInterfaces';\nimport {\n AppState,\n NativeEventEmitter,\n NativeEventSubscription,\n NativeModules,\n PermissionsAndroid,\n Platform,\n} from 'react-native';\nimport BackgroundTimer from './BackgroundHandler';\nimport InCallManger from './NativeAudioManager';\nimport { setupPermissions } from './PermissionHandler';\n\nconst { RTKHelper, BroadcastEventEmitter } = NativeModules;\n\nconst broadcastEmitter = new NativeEventEmitter(BroadcastEventEmitter);\n\n// eslint-disable-next-line no-shadow\nexport enum MediaEvents {\n AUDIO_TRACK_CHANGE,\n VIDEO_TRACK_CHANGE,\n SCREENSHARE_TRACK_CHANGE,\n SCREENSHARE_ENDED,\n DEVICE_CHANGE,\n SCREENSHARE_STARTED,\n MEDIA_PERMISSION_UPDATE,\n DEVICE_LIST_UPDATED,\n}\n\nfunction checkIfAudioTrackIsSilent(track: MediaStreamTrack) {\n //TODO\n return !!track;\n}\n\nexport default class LocalMediaHandler extends EventEmitter {\n #localMediaUtils: LocalMediaUtils;\n\n #appState: string;\n\n #appStateSubscription: NativeEventSubscription;\n\n #interval: number;\n\n public audioTrack: MediaStreamTrack;\n\n public rawAudioTrack: MediaStreamTrack;\n\n public videoTrack: MediaStreamTrack;\n\n public rawVideoTrack: MediaStreamTrack;\n\n public screenShareTracks: {\n audio?: MediaStreamTrack;\n video?: MediaStreamTrack;\n };\n\n public audioEnabled: boolean;\n\n public videoEnabled: boolean;\n\n public screenShareEnabled: boolean;\n\n private _pendingScreenShare = false;\n\n public currentDevices: {\n audio?: MediaDeviceInfo;\n video?: MediaDeviceInfo;\n speaker?: MediaDeviceInfo;\n };\n\n public permissions: {\n audio?: MediaPermission;\n video?: MediaPermission;\n };\n\n _handleAppStateChange = (nextAppState) => {\n if (\n this.#appState.match(/inactive|background/) &&\n nextAppState === 'active'\n ) {\n BackgroundTimer.clearInterval(this.#interval);\n this.#interval = null;\n if (this.videoTrack) {\n this.videoTrack.enabled = false;\n setTimeout(() => {\n if (this.videoTrack) {\n this.videoTrack.enabled = true;\n }\n }, 100);\n }\n } else {\n if (this.#interval === null) {\n if (this.screenShareEnabled || this._pendingScreenShare) {\n this.configureForeground();\n }\n }\n this.#interval = BackgroundTimer.setInterval(() => {}, 1000);\n this.#appState = nextAppState;\n }\n };\n\n private async configureForeground() {\n if (Platform.OS !== 'android') return;\n const val = await RTKHelper.isForegroundServiceRunning();\n if (!val) {\n if ((Platform.Version as number) >= 33) {\n const res = await PermissionsAndroid.request(\n PermissionsAndroid.PERMISSIONS.POST_NOTIFICATIONS\n );\n if (res !== PermissionsAndroid.RESULTS.GRANTED) {\n console.warn('Permission required for screenshare notification');\n }\n }\n if ((Platform.Version as number) >= 26) {\n await RTKHelper.createNotificationChannel();\n }\n try {\n await RTKHelper.startService();\n } catch (e) {\n console.warn('Failed to start foreground service', e);\n }\n }\n }\n\n public constructor(localMediaUtils: LocalMediaUtils) {\n super();\n this.#localMediaUtils = localMediaUtils;\n this.#appState = '';\n this.audioEnabled = true;\n this.videoEnabled = true;\n this.screenShareEnabled = false;\n this.permissions = { audio: 'NOT_REQUESTED', video: 'NOT_REQUESTED' };\n this.screenShareTracks = {\n audio: undefined,\n video: undefined,\n };\n this.currentDevices = {\n audio: undefined,\n video: undefined,\n speaker: undefined,\n };\n // LocalMediaUtils onDeviceChange with callback from native onAudioDeviceChanged events\n this.#localMediaUtils.onDeviceChange(async (changedDevices) => {\n await this.onDeviceChange(changedDevices, false);\n });\n if (Platform.OS === 'ios') {\n broadcastEmitter.addListener('iOS_BroadcastStarted', () => {\n this.oniOSBroadcastStart();\n });\n broadcastEmitter.addListener('iOS_BroadcastStopped', () => {\n this.oniOSBroadcastStop();\n });\n }\n InCallManger.start({});\n }\n\n private async conditionallyRestartAudio() {\n if (!this.currentDevices.audio || !this.audioEnabled) {\n return;\n }\n // log.info('maybe_restart_audio: ');\n await Promise.race([\n new Promise((resolve) =>\n this.audioTrack?.addEventListener('unmute', (e) => {\n resolve(e);\n })\n ),\n new Promise((resolve) => setTimeout(resolve, 50)),\n ]);\n const reacquireTrack = await this.shouldReacquireTrack('audio');\n\n if (reacquireTrack) {\n this.removeMediaStreamTrackListeners(this.audioTrack);\n await this.setupAudioStream(this.currentDevices.audio?.deviceId);\n this.addMediaStreamTrackListeners(this.audioTrack);\n this.emit('AUDIO_TRACK_CHANGE');\n }\n }\n\n private async conditionallyRestartVideo() {\n if (!this.currentDevices.video || !this.videoEnabled) return;\n // log.info('maybe_restart_video');\n\n await Promise.race([\n new Promise((resolve) =>\n this.videoTrack?.addEventListener('unmute', resolve)\n ),\n new Promise((resolve) => setTimeout(resolve, 50)),\n ]);\n\n const reacquireTrack = await this.shouldReacquireTrack('video');\n\n if (reacquireTrack) {\n this.removeMediaStreamTrackListeners(this.videoTrack);\n await this.setupVideoStream(this.currentDevices.video.deviceId);\n this.addMediaStreamTrackListeners(this.videoTrack);\n this.emit('VIDEO_TRACK_CHANGE');\n }\n }\n\n private async shouldReacquireTrack(kind: 'audio' | 'video') {\n const workaroundWebKitBug1208516 = false;\n let mediaStreamTrack: MediaStreamTrack;\n let wasEnabled = false;\n\n if (kind === 'audio') {\n mediaStreamTrack = this.audioTrack;\n wasEnabled = this.audioEnabled;\n } else if (kind === 'video') {\n mediaStreamTrack = this.videoTrack;\n wasEnabled = this.videoEnabled;\n }\n\n if (!mediaStreamTrack) return false;\n if (!this.rawAudioTrack || !this.audioTrack) return true;\n if (!this.rawVideoTrack || !this.videoTrack) return true;\n const isStopped = mediaStreamTrack.readyState === 'ended';\n\n const isInadvertentlyStopped =\n isStopped && wasEnabled && workaroundWebKitBug1208516;\n\n let isSilentAudio = false;\n if (kind === 'audio') {\n isSilentAudio = await checkIfAudioTrackIsSilent(this.audioTrack);\n }\n\n return mediaStreamTrack.muted || isInadvertentlyStopped || isSilentAudio;\n }\n\n public async removeDocumentEventListeners() {}\n\n private onUnmute(ev) {\n // log.info('Track unmuted', ev);\n }\n\n private removeMediaStreamTrackListeners(mediaStreamTrack: MediaStreamTrack) {\n if (!mediaStreamTrack) {\n return undefined;\n }\n\n const conditionallyRestart =\n mediaStreamTrack.kind === 'audio'\n ? this.conditionallyRestartAudio\n : this.conditionallyRestartVideo;\n mediaStreamTrack.removeEventListener('ended', conditionallyRestart);\n mediaStreamTrack.removeEventListener('mute', conditionallyRestart);\n mediaStreamTrack.removeEventListener('unmute', this.onUnmute);\n return mediaStreamTrack;\n }\n\n private addMediaStreamTrackListeners(mediaStreamTrack: MediaStreamTrack) {\n if (!mediaStreamTrack) {\n return null;\n }\n const conditionallyRestart =\n mediaStreamTrack.kind === 'audio'\n ? this.conditionallyRestartAudio\n : this.conditionallyRestartVideo;\n mediaStreamTrack.addEventListener('ended', conditionallyRestart);\n mediaStreamTrack.addEventListener('mute', conditionallyRestart);\n mediaStreamTrack.addEventListener('unmute', this.onUnmute);\n\n return mediaStreamTrack;\n }\n\n public async setupAudioStream(\n deviceId?: string,\n forceStopTrack: boolean = false\n ) {\n const audioDevices = this.#localMediaUtils.getAudioDevices();\n\n if (!audioDevices.length) {\n return;\n }\n\n let audioDeviceId = deviceId;\n\n if (!audioDeviceId) {\n audioDeviceId = (await this.getOperationalMicDeviceId()).deviceId;\n }\n\n if (this.currentDevices.audio?.deviceId !== audioDeviceId) {\n this.currentDevices.audio = this.#localMediaUtils.getDeviceById(\n audioDeviceId,\n 'audioinput'\n );\n }\n if (forceStopTrack) {\n this.audioTrack?.stop();\n this.rawAudioTrack?.stop();\n }\n try {\n this.rawAudioTrack = await LocalMediaUtils.getAudioTrack();\n } catch (err) {\n console.warn('Failed to acquire audio track: ', err);\n this.rawAudioTrack = undefined;\n }\n this.setAudioTrack(this.rawAudioTrack);\n this.addMediaStreamTrackListeners(this.audioTrack);\n this.emit('AUDIO_TRACK_CHANGE');\n this.setDevice(this.currentDevices.audio);\n\n /**\n * NOTE(roerohan): Firefox does not show device labels until permissions are granted.\n * So, we need to repopulate the devices once permission is granted.\n */\n if (this.audioTrack && this.permissions.audio === 'NOT_REQUESTED') {\n await this.#localMediaUtils.repopulateAvailableDevices();\n }\n\n this.emit('DEVICE_CHANGE', {\n device: this.currentDevices.audio,\n });\n }\n\n private onVisibilityChange() {\n // pass\n }\n\n public async setupVideoStream(\n deviceId?: string,\n forceStopTrack: boolean = false\n ) {\n const videoDevices = this.#localMediaUtils.getVideoDevices();\n if (!videoDevices.length) {\n return;\n }\n\n let videoDeviceId = deviceId;\n if (!videoDeviceId) {\n videoDeviceId = (await this.getOperationalWebcamDeviceId()).deviceId;\n }\n\n if (this.currentDevices.video?.deviceId !== videoDeviceId) {\n this.currentDevices.video = this.#localMediaUtils.getDeviceById(\n videoDeviceId,\n 'videoinput'\n );\n }\n\n /**\n * NOTE(roerohan): this.videoEnabled is checked, so that upon device change,\n * the video track is not set when the user has turned off his camera.\n */\n if (this.videoEnabled) {\n const videoConstraints = LocalMediaUtils.getVideoConstraints({\n videoDeviceId,\n });\n if (!this.rawVideoTrack) {\n try {\n this.rawVideoTrack = await LocalMediaUtils.getVideoTrack(\n videoConstraints\n );\n } catch (err) {\n console.warn('Failed to acquire video track: ', err);\n this.rawVideoTrack = undefined;\n }\n }\n this.setVideoTrack(this.rawVideoTrack);\n this.addMediaStreamTrackListeners(this.rawVideoTrack);\n this.emit('VIDEO_TRACK_CHANGE');\n }\n\n if (forceStopTrack) {\n this.videoTrack?.stop();\n this.rawVideoTrack?.stop();\n }\n /**\n * NOTE(roerohan): Firefox does not show device labels until permissions are granted.\n * So, we need to repopulate the devices once permission is granted.\n */\n if (this.videoTrack && this.permissions.video === 'NOT_REQUESTED') {\n await this.#localMediaUtils.repopulateAvailableDevices();\n }\n this.emit('DEVICE_CHANGE', {\n device: this.currentDevices.video,\n });\n }\n\n public async setupSpeaker(deviceId?: string) {\n const speakerDevices = this.#localMediaUtils.getSpeakerDevices();\n if (!speakerDevices.length) {\n return;\n }\n const lastDeviceIndex = speakerDevices.length - 1;\n const speakerDeviceId =\n deviceId ?? speakerDevices[lastDeviceIndex].deviceId;\n if (this.currentDevices.speaker?.deviceId !== speakerDeviceId) {\n // Audio Input devices are same as output devices in mobile\n this.currentDevices.audio = this.#localMediaUtils.getDeviceById(\n speakerDeviceId,\n 'audioinput'\n );\n this.currentDevices.speaker = this.currentDevices.audio;\n }\n await this.setDevice(this.currentDevices.audio);\n this.emit('DEVICE_CHANGE', {\n device: this.currentDevices.speaker,\n });\n }\n\n public async getOperationalWebcamDeviceId(): Promise<{\n isOperational: boolean;\n deviceId: string;\n }> {\n let videoDevices = this.#localMediaUtils.getVideoDevices();\n if (!videoDevices.length) {\n return { isOperational: false, deviceId: null };\n }\n\n /*\n NOTE(ravindra-dyte): Usually external devices come at the bottom,\n By reversing the deviceList and breaking on first operational device\n We are giving preference to external device\n */\n\n videoDevices = [...videoDevices].reverse();\n\n let operationalDeviceId = null;\n for (\n let deviceIndex = 0;\n deviceIndex < videoDevices.length;\n deviceIndex += 1\n ) {\n try {\n operationalDeviceId = videoDevices[deviceIndex].deviceId;\n break;\n } catch (err) {}\n }\n\n return operationalDeviceId\n ? { isOperational: true, deviceId: operationalDeviceId }\n : { isOperational: false, deviceId: videoDevices[0].deviceId };\n }\n\n public async getOperationalMicDeviceId(): Promise<{\n isOperational: boolean;\n deviceId: string;\n }> {\n let audioDevices = this.#localMediaUtils.getAudioDevices();\n if (!audioDevices.length) {\n return { isOperational: false, deviceId: null };\n }\n /*\n NOTE(ravindra-dyte): Usually external devices come at the bottom,\n By reversing the deviceList and breaking on first operational device\n We are giving preference to external device\n */\n\n audioDevices = [...audioDevices].reverse();\n let operationalDeviceId = null;\n\n for (\n let deviceIndex = 0;\n deviceIndex < audioDevices.length;\n deviceIndex += 1\n ) {\n try {\n const audioTrack = await LocalMediaUtils.getAudioTrack();\n\n const isSilent = await checkIfAudioTrackIsSilent(audioTrack);\n audioTrack.stop();\n audioTrack.release();\n if (!isSilent) {\n operationalDeviceId = audioDevices[deviceIndex].deviceId;\n break;\n }\n } catch (err) {\n console.warn('Failed to acquire audio track: ', err);\n }\n }\n\n return operationalDeviceId\n ? { isOperational: true, deviceId: operationalDeviceId }\n : { isOperational: false, deviceId: audioDevices[0].deviceId };\n }\n\n public async setupStreams({\n audio,\n video,\n }: {\n audio: boolean;\n video: boolean;\n }) {\n try {\n const permResult = await setupPermissions(audio, video);\n this.permissions.video = permResult.camera;\n this.permissions.audio = permResult.microphone;\n } catch (val) {\n this.permissions.video = val.camera ?? false;\n this.permissions.audio = val.microphone ?? false;\n }\n this.emit('MEDIA_PERMISSION_UPDATE', {\n kind: 'audio',\n message: this.permissions.audio,\n });\n\n this.emit('MEDIA_PERMISSION_UPDATE', {\n kind: 'video',\n message: this.permissions.video,\n });\n const constraints: RealtimeKitMediaStreamConstraints = {};\n if (!this.currentDevices) {\n this.currentDevices = {\n audio: undefined,\n video: undefined,\n speaker: undefined,\n };\n }\n if (audio) {\n const audioDevices = this.#localMediaUtils.getAudioDevices();\n if (audioDevices.length !== 0) {\n const audioDeviceId = (await this.getOperationalMicDeviceId()).deviceId;\n this.currentDevices.audio = this.#localMediaUtils.getDeviceById(\n audioDeviceId,\n 'audioinput'\n );\n constraints.audio = true;\n }\n }\n\n if (video) {\n const videoDevices = this.#localMediaUtils.getVideoDevices();\n if (videoDevices.length !== 0) {\n const videoDeviceId = (await this.getOperationalWebcamDeviceId())\n .deviceId;\n this.currentDevices.video = this.#localMediaUtils.getDeviceById(\n videoDeviceId,\n 'videoinput'\n );\n\n const videoConstraints = LocalMediaUtils.getVideoConstraints({\n videoDeviceId,\n });\n constraints.video = videoConstraints.video;\n }\n }\n\n if (audio) await this.setupAudioStream();\n if (video) await this.setupVideoStream();\n\n if (this.audioTrack) this.audioEnabled = true;\n else this.audioEnabled = false;\n\n if (this.videoTrack) this.videoEnabled = true;\n else this.videoEnabled = false;\n\n this.screenShareEnabled = false;\n\n // Setting default audio output to speaker\n await this.setupSpeaker();\n\n // Setup Foreground Service after handling permissions\n if (Platform.OS === 'android') {\n this.#appStateSubscription = AppState.addEventListener(\n 'change',\n this._handleAppStateChange\n );\n }\n }\n\n private stopScreenShareTracks(\n tracks: { audio?: boolean; video?: boolean } = {}\n ) {\n const { audio = true, video = true } = tracks;\n if (audio) {\n this.screenShareTracks?.audio?.stop();\n }\n\n if (video) {\n this.screenShareTracks?.video?.stop();\n }\n\n if (audio && video) {\n this.screenShareEnabled = false;\n }\n }\n\n public removeScreenShareTracks(tracks?: {\n audio?: boolean;\n video?: boolean;\n }) {\n this.screenShareTracks.video?.removeEventListener(\n 'ended',\n this.onScreenShareEnded\n );\n this.stopScreenShareTracks(tracks);\n this.screenShareTracks = {\n audio: undefined,\n video: undefined,\n };\n }\n\n private setAudioTrack(audioTrack: MediaStreamTrack) {\n if (audioTrack === this.audioTrack) {\n return;\n }\n\n if (audioTrack === undefined) {\n this.stopAudioTrack();\n }\n\n this.audioTrack = audioTrack;\n }\n\n private setVideoTrack(videoTrack: MediaStreamTrack) {\n if (videoTrack === this.videoTrack) {\n return;\n }\n\n if (videoTrack === undefined) {\n this.stopVideoTrack();\n }\n\n this.videoTrack = videoTrack;\n }\n\n private setScreenShareTracks(tracks: {\n audio?: MediaStreamTrack;\n video?: MediaStreamTrack;\n }) {\n const { audio, video } = tracks;\n // console.log('SetScreenshare called');\n if (!audio || !video) {\n this.stopScreenShareTracks({ audio: !!audio, video: !!video });\n }\n\n this.screenShareTracks = tracks;\n this.screenShareTracks.video?.addEventListener(\n 'ended',\n this.onScreenShareEnded.bind(this)\n );\n }\n\n private onScreenShareEnded() {\n this.emit('SCREENSHARE_ENDED');\n }\n\n public async disableAudio() {\n await this.toggleAudio();\n }\n\n public async enableAudio() {\n await this.toggleAudio();\n }\n\n public async toggleAudio() {\n if (this.permissions.audio !== 'ACCEPTED') {\n try {\n const permResult = await setupPermissions(true, false);\n this.permissions.audio = permResult.microphone;\n } catch (val) {\n this.permissions.audio = val.microphone ?? false;\n }\n }\n this.emit('MEDIA_PERMISSION_UPDATE', {\n kind: 'audio',\n message: this.permissions.audio,\n });\n if (\n this.permissions.audio === 'DENIED' ||\n this.permissions.audio === 'NOT_REQUESTED'\n ) {\n this.audioEnabled = false;\n return;\n }\n if (this.audioEnabled) {\n this.audioEnabled = false;\n\n if (this.audioTrack) {\n this.audioTrack.enabled = this.audioEnabled;\n }\n return;\n }\n try {\n /**\n * NOTE (@madhugb): We need to setup new stream,\n * if the audio track is not preset or it has ended\n */\n if (!this.audioTrack || this.audioTrack.readyState === 'ended') {\n await this.setupAudioStream(this.currentDevices.audio?.deviceId);\n }\n // if we still can't get a track after setting up audio stream\n // do not toggle the audio state\n if (!this.audioTrack) {\n this.audioEnabled = false;\n return;\n }\n this.audioEnabled = true;\n } catch (ex) {\n this.audioEnabled = false;\n this.audioTrack = undefined;\n this.rawAudioTrack = undefined;\n }\n if (this.audioTrack) {\n this.audioTrack.enabled = true;\n }\n }\n\n public async enableVideo() {\n await this.toggleVideo();\n }\n\n public async disableVideo() {\n await this.toggleVideo();\n }\n\n public async toggleVideo() {\n if (this.permissions.video !== 'ACCEPTED') {\n try {\n const permResult = await setupPermissions(false, true);\n this.permissions.video = permResult.camera;\n } catch (val) {\n this.permissions.video = val.camera ?? false;\n }\n }\n this.emit('MEDIA_PERMISSION_UPDATE', {\n kind: 'video',\n message: this.permissions.video,\n });\n if (\n this.permissions.video === 'DENIED' ||\n this.permissions.video === 'NOT_REQUESTED'\n ) {\n this.videoEnabled = false;\n return;\n }\n if (this.videoEnabled) {\n this.stopVideoTrack();\n this.videoEnabled = false;\n return;\n }\n /**\n * NOTE(roerohan): The videoEnabled flag is used inside the setupVideoStream method\n * hence it must be set to true first.\n */\n this.videoEnabled = true;\n await this.setupVideoStream(this.currentDevices.video?.deviceId);\n }\n\n public async setAudioDevice(device: MediaDeviceInfo) {\n await this.setupAudioStream(device.deviceId);\n }\n\n public async setVideoDevice(device: MediaDeviceInfo) {\n if (this.videoEnabled) {\n this.stopVideoTrack();\n }\n await this.setupVideoStream(device.deviceId);\n }\n\n public async setSpeakerDevice(device?: MediaDeviceInfo) {\n await this.setupSpeaker(device.deviceId);\n }\n\n public async setDevice(route: MediaDeviceInfo) {\n await this.#localMediaUtils.chooseAudioRoute(route.deviceId);\n }\n\n private async oniOSBroadcastStart() {\n this.setScreenShareTracks(await LocalMediaUtils.getScreenShareTracks());\n this.screenShareEnabled = true;\n this.emit('SCREENSHARE_TRACK_CHANGE');\n }\n\n private async oniOSBroadcastStop() {\n if (this.screenShareEnabled) {\n this.removeScreenShareTracks();\n this.emit('SCREENSHARE_TRACK_CHANGE');\n return;\n }\n }\n\n public async toggleScreenShare() {\n if (this.screenShareEnabled && Platform.OS !== 'ios') {\n this.removeScreenShareTracks();\n try {\n const val = await RTKHelper.isForegroundServiceRunning();\n if (val) {\n await RTKHelper.stopService();\n }\n } catch (e) {\n console.warn('Failed to stop foreground service', e);\n }\n return;\n }\n if (Platform.OS === 'ios' && this.screenShareEnabled) {\n NativeModules.RTKScreensharePickerView.showScreenSharePickerView();\n return;\n }\n\n if (Platform.OS === 'android') {\n this._pendingScreenShare = true;\n await this.configureForeground();\n try {\n this.setScreenShareTracks(await LocalMediaUtils.getScreenShareTracks());\n this.screenShareEnabled = true;\n } catch (e) {\n console.warn('Failed to start screenshare', e);\n this.screenShareEnabled = false;\n const val = await RTKHelper.isForegroundServiceRunning();\n if (val) {\n await RTKHelper.stopService();\n }\n this._pendingScreenShare = false;\n } finally {\n this._pendingScreenShare = false;\n }\n }\n if (Platform.OS === 'ios') {\n NativeModules.RTKScreensharePickerView.showScreenSharePickerView();\n }\n }\n\n public async enableScreenShare() {\n await this.toggleScreenShare();\n }\n\n public async disableScreenShare() {\n await this.toggleScreenShare();\n }\n\n public getAllDevices() {\n return this.#localMediaUtils.availableDevices;\n }\n\n public getCurrentDevices() {\n return this.currentDevices;\n }\n\n public getDeviceById(\n deviceId: string,\n kind: 'audioinput' | 'audiooutput' | 'videoinput'\n ) {\n return this.#localMediaUtils.getDeviceById(deviceId, kind);\n }\n\n public getAudioDevices() {\n return this.#localMediaUtils.getAudioDevices();\n }\n\n public getVideoDevices() {\n return this.#localMediaUtils.getVideoDevices();\n }\n\n public getSpeakerDevices() {\n return this.#localMediaUtils.getSpeakerDevices();\n }\n\n public async onDeviceChange(\n changedDevices: {\n added: MediaDeviceInfo[];\n removed: MediaDeviceInfo[];\n },\n forceDeviceChange: boolean\n ) {\n let addedDevice: MediaDeviceInfo;\n let removedDevice: MediaDeviceInfo;\n if (changedDevices.added.length) [addedDevice] = changedDevices.added;\n\n if (changedDevices.removed.length) [removedDevice] = changedDevices.removed;\n\n /**\n * NOTE(roerohan): forceStopTrack is set required to be set to true for firefox.\n * https://stackoverflow.com/questions/59068146/navigator-mediadevices-getusermedia-api-rejecting-with-error-notreadableerror\n * forceStopTrack is the second argument of setupAudioStream and setupVideoStream.\n */\n if (addedDevice) {\n if (addedDevice.kind === 'audioinput') {\n if (\n this.permissions.audio === 'DENIED' ||\n this.permissions.audio === 'NOT_REQUESTED'\n ) {\n await this.setupSpeaker(addedDevice.deviceId);\n } else {\n await this.setupAudioStream(addedDevice.deviceId);\n }\n } else if (addedDevice.kind === 'videoinput') {\n await this.setupVideoStream(addedDevice.deviceId);\n } else if (addedDevice.kind === 'audiooutput') {\n await this.setupSpeaker(addedDevice.deviceId);\n }\n this.emit('AUDIO_TRACK_CHANGE');\n }\n\n if (removedDevice) {\n if (removedDevice.kind === 'audioinput') {\n if (\n this.permissions.audio === 'DENIED' ||\n this.permissions.audio === 'NOT_REQUESTED'\n ) {\n await this.setupSpeaker();\n } else {\n await this.setupAudioStream();\n }\n } else if (removedDevice.kind === 'videoinput') {\n await this.setupVideoStream();\n } else if (removedDevice.kind === 'audiooutput') {\n await this.setupSpeaker();\n }\n this.emit('AUDIO_TRACK_CHANGE');\n }\n\n if (changedDevices.added.length || changedDevices.removed.length) {\n this.emit('DEVICE_LIST_UPDATED', changedDevices);\n }\n }\n\n public static async init(_) {\n const localMediaUtils = await LocalMediaUtils.init();\n return new LocalMediaHandler(localMediaUtils);\n }\n\n public emit(event: keyof typeof MediaEvents, ...args: any[]) {\n return super.emit(event, ...args);\n }\n\n public on(\n event: keyof typeof MediaEvents,\n listener: (...args: any[]) => void\n ) {\n return super.on(event, listener);\n }\n\n public destruct() {\n // TODO: Do not remove native broadcast listeners when going OFF_STAGE in webinar\n // this.#localMediaUtils.destruct();\n if (Platform.OS === 'android') this.#appStateSubscription.remove();\n BackgroundTimer.stop();\n try {\n if (Platform.OS === 'android') RTKHelper.stopService();\n } catch (_err) {}\n // InCallManger.stop(undefined);\n }\n\n private stopAudioTrack() {\n this.rawAudioTrack?.stop();\n this.audioTrack?.stop();\n this.rawAudioTrack?.release();\n this.audioTrack?.release();\n this.audioEnabled = false;\n this.audioTrack = undefined;\n this.rawAudioTrack = undefined;\n }\n\n private stopVideoTrack() {\n this.rawVideoTrack?.stop();\n this.videoTrack?.stop();\n this.rawVideoTrack?.release();\n this.videoTrack?.release();\n this.videoTrack = undefined;\n this.rawVideoTrack = undefined;\n }\n}\n\nexport interface RNLocalMediaHandler {\n new (): LocalMediaHandler;\n}\n"],"mappings":";;;;;;;;AAAA;AACA,SAASA,YAAY,QAAQ,QAAQ;AACrC,OAAOC,eAAe,MAAM,mBAAmB;AAO/C,SACEC,QAAQ,EACRC,kBAAkB,EAElBC,aAAa,EACbC,kBAAkB,EAClBC,QAAQ,QACH,cAAc;AACrB,OAAOC,eAAe,MAAM,qBAAqB;AACjD,OAAOC,YAAY,MAAM,sBAAsB;AAC/C,SAASC,gBAAgB,QAAQ,qBAAqB;AAEtD,MAAM;EAAEC,SAAS;EAAEC;AAAsB,CAAC,GAAGP,aAAa;AAE1D,MAAMQ,gBAAgB,GAAG,IAAIT,kBAAkB,CAACQ,qBAAqB,CAAC;;AAEtE;AACA,WAAYE,WAAW,0BAAXA,WAAW;EAAXA,WAAW,CAAXA,WAAW;EAAXA,WAAW,CAAXA,WAAW;EAAXA,WAAW,CAAXA,WAAW;EAAXA,WAAW,CAAXA,WAAW;EAAXA,WAAW,CAAXA,WAAW;EAAXA,WAAW,CAAXA,WAAW;EAAXA,WAAW,CAAXA,WAAW;EAAXA,WAAW,CAAXA,WAAW;EAAA,OAAXA,WAAW;AAAA;AAWvB,SAASC,yBAAyBA,CAACC,KAAuB,EAAE;EAC1D;EACA,OAAO,CAAC,CAACA,KAAK;AAChB;AAAC,IAAAC,gBAAA,oBAAAC,OAAA;AAAA,IAAAC,SAAA,oBAAAD,OAAA;AAAA,IAAAE,qBAAA,oBAAAF,OAAA;AAAA,IAAAG,SAAA,oBAAAH,OAAA;AAED,eAAe,MAAMI,iBAAiB,SAASrB,YAAY,CAAC;EAmE1D,MAAcsB,mBAAmBA,CAAA,EAAG;IAClC,IAAIhB,QAAQ,CAACiB,EAAE,KAAK,SAAS,EAAE;IAC/B,MAAMC,GAAG,GAAG,MAAMd,SAAS,CAACe,0BAA0B,CAAC,CAAC;IACxD,IAAI,CAACD,GAAG,EAAE;MACR,IAAKlB,QAAQ,CAACoB,OAAO,IAAe,EAAE,EAAE;QACtC,MAAMC,GAAG,GAAG,MAAMtB,kBAAkB,CAACuB,OAAO,CAC1CvB,kBAAkB,CAACwB,WAAW,CAACC,kBACjC,CAAC;QACD,IAAIH,GAAG,KAAKtB,kBAAkB,CAAC0B,OAAO,CAACC,OAAO,EAAE;UAC9CC,OAAO,CAACC,IAAI,CAAC,kDAAkD,CAAC;QAClE;MACF;MACA,IAAK5B,QAAQ,CAACoB,OAAO,IAAe,EAAE,EAAE;QACtC,MAAMhB,SAAS,CAACyB,yBAAyB,CAAC,CAAC;MAC7C;MACA,IAAI;QACF,MAAMzB,SAAS,CAAC0B,YAAY,CAAC,CAAC;MAChC,CAAC,CAAC,OAAOC,CAAC,EAAE;QACVJ,OAAO,CAACC,IAAI,CAAC,oCAAoC,EAAEG,CAAC,CAAC;MACvD;IACF;EACF;EAEOC,WAAWA,CAACC,eAAgC,EAAE;IACnD,KAAK,CAAC,CAAC;IA1FTC,0BAAA,OAAAxB,gBAAgB;IAEhBwB,0BAAA,OAAAtB,SAAS;IAETsB,0BAAA,OAAArB,qBAAqB;IAErBqB,0BAAA,OAAApB,SAAS;IAASqB,eAAA;IAAAA,eAAA;IAAAA,eAAA;IAAAA,eAAA;IAAAA,eAAA;IAAAA,eAAA;IAAAA,eAAA;IAAAA,eAAA;IAAAA,eAAA,8BAqBY,KAAK;IAAAA,eAAA;IAAAA,eAAA;IAAAA,eAAA,gCAaVC,YAAY,IAAK;MACxC,IACEC,qBAAA,CAAKzB,SAAS,EAAd,IAAa,CAAC,CAAC0B,KAAK,CAAC,qBAAqB,CAAC,IAC3CF,YAAY,KAAK,QAAQ,EACzB;QACAnC,eAAe,CAACsC,aAAa,CAACF,qBAAA,CAAKvB,SAAS,EAAd,IAAa,CAAC,CAAC;QAC7C0B,qBAAA,CAAK1B,SAAS,EAAd,IAAI,EAAa,IAAJ,CAAC;QACd,IAAI,IAAI,CAAC2B,UAAU,EAAE;UACnB,IAAI,CAACA,UAAU,CAACC,OAAO,GAAG,KAAK;UAC/BC,UAAU,CAAC,MAAM;YACf,IAAI,IAAI,CAACF,UAAU,EAAE;cACnB,IAAI,CAACA,UAAU,CAACC,OAAO,GAAG,IAAI;YAChC;UACF,CAAC,EAAE,GAAG,CAAC;QACT;MACF,CAAC,MAAM;QACL,IAAIL,qBAAA,CAAKvB,SAAS,EAAd,IAAa,CAAC,KAAK,IAAI,EAAE;UAC3B,IAAI,IAAI,CAAC8B,kBAAkB,IAAI,IAAI,CAACC,mBAAmB,EAAE;YACvD,IAAI,CAAC7B,mBAAmB,CAAC,CAAC;UAC5B;QACF;QACAwB,qBAAA,CAAK1B,SAAS,EAAd,IAAI,EAAab,eAAe,CAAC6C,WAAW,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAA9C,CAAC;QACdN,qBAAA,CAAK5B,SAAS,EAAd,IAAI,EAAawB,YAAJ,CAAC;MAChB;IACF,CAAC;IA2BCI,qBAAA,CAAK9B,gBAAgB,EAArB,IAAI,EAAoBuB,eAAJ,CAAC;IACrBO,qBAAA,CAAK5B,SAAS,EAAd,IAAI,EAAa,EAAJ,CAAC;IACd,IAAI,CAACmC,YAAY,GAAG,IAAI;IACxB,IAAI,CAACC,YAAY,GAAG,IAAI;IACxB,IAAI,CAACJ,kBAAkB,GAAG,KAAK;IAC/B,IAAI,CAACK,WAAW,GAAG;MAAEC,KAAK,EAAE,eAAe;MAAEC,KAAK,EAAE;IAAgB,CAAC;IACrE,IAAI,CAACC,iBAAiB,GAAG;MACvBF,KAAK,EAAEG,SAAS;MAChBF,KAAK,EAAEE;IACT,CAAC;IACD,IAAI,CAACC,cAAc,GAAG;MACpBJ,KAAK,EAAEG,SAAS;MAChBF,KAAK,EAAEE,SAAS;MAChBE,OAAO,EAAEF;IACX,CAAC;IACD;IACAhB,qBAAA,CAAK3B,gBAAgB,EAArB,IAAoB,CAAC,CAAC8C,cAAc,CAAC,MAAOC,cAAc,IAAK;MAC7D,MAAM,IAAI,CAACD,cAAc,CAACC,cAAc,EAAE,KAAK,CAAC;IAClD,CAAC,CAAC;IACF,IAAIzD,QAAQ,CAACiB,EAAE,KAAK,KAAK,EAAE;MACzBX,gBAAgB,CAACoD,WAAW,CAAC,sBAAsB,EAAE,MAAM;QACzD,IAAI,CAACC,mBAAmB,CAAC,CAAC;MAC5B,CAAC,CAAC;MACFrD,gBAAgB,CAACoD,WAAW,CAAC,sBAAsB,EAAE,MAAM;QACzD,IAAI,CAACE,kBAAkB,CAAC,CAAC;MAC3B,CAAC,CAAC;IACJ;IACA1D,YAAY,CAAC2D,KAAK,CAAC,CAAC,CAAC,CAAC;EACxB;EAEA,MAAcC,yBAAyBA,CAAA,EAAG;IACxC,IAAI,CAAC,IAAI,CAACR,cAAc,CAACJ,KAAK,IAAI,CAAC,IAAI,CAACH,YAAY,EAAE;MACpD;IACF;IACA;IACA,MAAMgB,OAAO,CAACC,IAAI,CAAC,CACjB,IAAID,OAAO,CAAEE,OAAO;MAAA,IAAAC,gBAAA;MAAA,QAAAA,gBAAA,GAClB,IAAI,CAACC,UAAU,cAAAD,gBAAA,uBAAfA,gBAAA,CAAiBE,gBAAgB,CAAC,QAAQ,EAAGrC,CAAC,IAAK;QACjDkC,OAAO,CAAClC,CAAC,CAAC;MACZ,CAAC,CAAC;IAAA,CACJ,CAAC,EACD,IAAIgC,OAAO,CAAEE,OAAO,IAAKtB,UAAU,CAACsB,OAAO,EAAE,EAAE,CAAC,CAAC,CAClD,CAAC;IACF,MAAMI,cAAc,GAAG,MAAM,IAAI,CAACC,oBAAoB,CAAC,OAAO,CAAC;IAE/D,IAAID,cAAc,EAAE;MAAA,IAAAE,qBAAA;MAClB,IAAI,CAACC,+BAA+B,CAAC,IAAI,CAACL,UAAU,CAAC;MACrD,MAAM,IAAI,CAACM,gBAAgB,EAAAF,qBAAA,GAAC,IAAI,CAACjB,cAAc,CAACJ,KAAK,cAAAqB,qBAAA,uBAAzBA,qBAAA,CAA2BG,QAAQ,CAAC;MAChE,IAAI,CAACC,4BAA4B,CAAC,IAAI,CAACR,UAAU,CAAC;MAClD,IAAI,CAACS,IAAI,CAAC,oBAAoB,CAAC;IACjC;EACF;EAEA,MAAcC,yBAAyBA,CAAA,EAAG;IACxC,IAAI,CAAC,IAAI,CAACvB,cAAc,CAACH,KAAK,IAAI,CAAC,IAAI,CAACH,YAAY,EAAE;IACtD;;IAEA,MAAMe,OAAO,CAACC,IAAI,CAAC,CACjB,IAAID,OAAO,CAAEE,OAAO;MAAA,IAAAa,gBAAA;MAAA,QAAAA,gBAAA,GAClB,IAAI,CAACrC,UAAU,cAAAqC,gBAAA,uBAAfA,gBAAA,CAAiBV,gBAAgB,CAAC,QAAQ,EAAEH,OAAO,CAAC;IAAA,CACtD,CAAC,EACD,IAAIF,OAAO,CAAEE,OAAO,IAAKtB,UAAU,CAACsB,OAAO,EAAE,EAAE,CAAC,CAAC,CAClD,CAAC;IAEF,MAAMI,cAAc,GAAG,MAAM,IAAI,CAACC,oBAAoB,CAAC,OAAO,CAAC;IAE/D,IAAID,cAAc,EAAE;MAClB,IAAI,CAACG,+BAA+B,CAAC,IAAI,CAAC/B,UAAU,CAAC;MACrD,MAAM,IAAI,CAACsC,gBAAgB,CAAC,IAAI,CAACzB,cAAc,CAACH,KAAK,CAACuB,QAAQ,CAAC;MAC/D,IAAI,CAACC,4BAA4B,CAAC,IAAI,CAAClC,UAAU,CAAC;MAClD,IAAI,CAACmC,IAAI,CAAC,oBAAoB,CAAC;IACjC;EACF;EAEA,MAAcN,oBAAoBA,CAACU,IAAuB,EAAE;IAC1D,MAAMC,0BAA0B,GAAG,KAAK;IACxC,IAAIC,gBAAkC;IACtC,IAAIC,UAAU,GAAG,KAAK;IAEtB,IAAIH,IAAI,KAAK,OAAO,EAAE;MACpBE,gBAAgB,GAAG,IAAI,CAACf,UAAU;MAClCgB,UAAU,GAAG,IAAI,CAACpC,YAAY;IAChC,CAAC,MAAM,IAAIiC,IAAI,KAAK,OAAO,EAAE;MAC3BE,gBAAgB,GAAG,IAAI,CAACzC,UAAU;MAClC0C,UAAU,GAAG,IAAI,CAACnC,YAAY;IAChC;IAEA,IAAI,CAACkC,gBAAgB,EAAE,OAAO,KAAK;IACnC,IAAI,CAAC,IAAI,CAACE,aAAa,IAAI,CAAC,IAAI,CAACjB,UAAU,EAAE,OAAO,IAAI;IACxD,IAAI,CAAC,IAAI,CAACkB,aAAa,IAAI,CAAC,IAAI,CAAC5C,UAAU,EAAE,OAAO,IAAI;IACxD,MAAM6C,SAAS,GAAGJ,gBAAgB,CAACK,UAAU,KAAK,OAAO;IAEzD,MAAMC,sBAAsB,GAC1BF,SAAS,IAAIH,UAAU,IAAIF,0BAA0B;IAEvD,IAAIQ,aAAa,GAAG,KAAK;IACzB,IAAIT,IAAI,KAAK,OAAO,EAAE;MACpBS,aAAa,GAAG,MAAMjF,yBAAyB,CAAC,IAAI,CAAC2D,UAAU,CAAC;IAClE;IAEA,OAAOe,gBAAgB,CAACQ,KAAK,IAAIF,sBAAsB,IAAIC,aAAa;EAC1E;EAEA,MAAaE,4BAA4BA,CAAA,EAAG,CAAC;EAErCC,QAAQA,CAACC,EAAE,EAAE;IACnB;EAAA;EAGMrB,+BAA+BA,CAACU,gBAAkC,EAAE;IAC1E,IAAI,CAACA,gBAAgB,EAAE;MACrB,OAAO7B,SAAS;IAClB;IAEA,MAAMyC,oBAAoB,GACxBZ,gBAAgB,CAACF,IAAI,KAAK,OAAO,GAC7B,IAAI,CAAClB,yBAAyB,GAC9B,IAAI,CAACe,yBAAyB;IACpCK,gBAAgB,CAACa,mBAAmB,CAAC,OAAO,EAAED,oBAAoB,CAAC;IACnEZ,gBAAgB,CAACa,mBAAmB,CAAC,MAAM,EAAED,oBAAoB,CAAC;IAClEZ,gBAAgB,CAACa,mBAAmB,CAAC,QAAQ,EAAE,IAAI,CAACH,QAAQ,CAAC;IAC7D,OAAOV,gBAAgB;EACzB;EAEQP,4BAA4BA,CAACO,gBAAkC,EAAE;IACvE,IAAI,CAACA,gBAAgB,EAAE;MACrB,OAAO,IAAI;IACb;IACA,MAAMY,oBAAoB,GACxBZ,gBAAgB,CAACF,IAAI,KAAK,OAAO,GAC7B,IAAI,CAAClB,yBAAyB,GAC9B,IAAI,CAACe,yBAAyB;IACpCK,gBAAgB,CAACd,gBAAgB,CAAC,OAAO,EAAE0B,oBAAoB,CAAC;IAChEZ,gBAAgB,CAACd,gBAAgB,CAAC,MAAM,EAAE0B,oBAAoB,CAAC;IAC/DZ,gBAAgB,CAACd,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAACwB,QAAQ,CAAC;IAE1D,OAAOV,gBAAgB;EACzB;EAEA,MAAaT,gBAAgBA,CAC3BC,QAAiB,EACjBsB,cAAuB,GAAG,KAAK,EAC/B;IAAA,IAAAC,sBAAA;IACA,MAAMC,YAAY,GAAG7D,qBAAA,CAAK3B,gBAAgB,EAArB,IAAoB,CAAC,CAACyF,eAAe,CAAC,CAAC;IAE5D,IAAI,CAACD,YAAY,CAACE,MAAM,EAAE;MACxB;IACF;IAEA,IAAIC,aAAa,GAAG3B,QAAQ;IAE5B,IAAI,CAAC2B,aAAa,EAAE;MAClBA,aAAa,GAAG,CAAC,MAAM,IAAI,CAACC,yBAAyB,CAAC,CAAC,EAAE5B,QAAQ;IACnE;IAEA,IAAI,EAAAuB,sBAAA,OAAI,CAAC3C,cAAc,CAACJ,KAAK,cAAA+C,sBAAA,uBAAzBA,sBAAA,CAA2BvB,QAAQ,MAAK2B,aAAa,EAAE;MACzD,IAAI,CAAC/C,cAAc,CAACJ,KAAK,GAAGb,qBAAA,CAAK3B,gBAAgB,EAArB,IAAoB,CAAC,CAAC6F,aAAa,CAC7DF,aAAa,EACb,YACF,CAAC;IACH;IACA,IAAIL,cAAc,EAAE;MAAA,IAAAQ,iBAAA,EAAAC,mBAAA;MAClB,CAAAD,iBAAA,OAAI,CAACrC,UAAU,cAAAqC,iBAAA,eAAfA,iBAAA,CAAiBE,IAAI,CAAC,CAAC;MACvB,CAAAD,mBAAA,OAAI,CAACrB,aAAa,cAAAqB,mBAAA,eAAlBA,mBAAA,CAAoBC,IAAI,CAAC,CAAC;IAC5B;IACA,IAAI;MACF,IAAI,CAACtB,aAAa,GAAG,MAAMzF,eAAe,CAACgH,aAAa,CAAC,CAAC;IAC5D,CAAC,CAAC,OAAOC,GAAG,EAAE;MACZjF,OAAO,CAACC,IAAI,CAAC,iCAAiC,EAAEgF,GAAG,CAAC;MACpD,IAAI,CAACxB,aAAa,GAAG/B,SAAS;IAChC;IACA,IAAI,CAACwD,aAAa,CAAC,IAAI,CAACzB,aAAa,CAAC;IACtC,IAAI,CAACT,4BAA4B,CAAC,IAAI,CAACR,UAAU,CAAC;IAClD,IAAI,CAACS,IAAI,CAAC,oBAAoB,CAAC;IAC/B,IAAI,CAACkC,SAAS,CAAC,IAAI,CAACxD,cAAc,CAACJ,KAAK,CAAC;;IAEzC;AACJ;AACA;AACA;IACI,IAAI,IAAI,CAACiB,UAAU,IAAI,IAAI,CAAClB,WAAW,CAACC,KAAK,KAAK,eAAe,EAAE;MACjE,MAAMb,qBAAA,CAAK3B,gBAAgB,EAArB,IAAoB,CAAC,CAACqG,0BAA0B,CAAC,CAAC;IAC1D;IAEA,IAAI,CAACnC,IAAI,CAAC,eAAe,EAAE;MACzBoC,MAAM,EAAE,IAAI,CAAC1D,cAAc,CAACJ;IAC9B,CAAC,CAAC;EACJ;EAEQ+D,kBAAkBA,CAAA,EAAG;IAC3B;EAAA;EAGF,MAAalC,gBAAgBA,CAC3BL,QAAiB,EACjBsB,cAAuB,GAAG,KAAK,EAC/B;IAAA,IAAAkB,sBAAA;IACA,MAAMC,YAAY,GAAG9E,qBAAA,CAAK3B,gBAAgB,EAArB,IAAoB,CAAC,CAAC0G,eAAe,CAAC,CAAC;IAC5D,IAAI,CAACD,YAAY,CAACf,MAAM,EAAE;MACxB;IACF;IAEA,IAAIiB,aAAa,GAAG3C,QAAQ;IAC5B,IAAI,CAAC2C,aAAa,EAAE;MAClBA,aAAa,GAAG,CAAC,MAAM,IAAI,CAACC,4BAA4B,CAAC,CAAC,EAAE5C,QAAQ;IACtE;IAEA,IAAI,EAAAwC,sBAAA,OAAI,CAAC5D,cAAc,CAACH,KAAK,cAAA+D,sBAAA,uBAAzBA,sBAAA,CAA2BxC,QAAQ,MAAK2C,aAAa,EAAE;MACzD,IAAI,CAAC/D,cAAc,CAACH,KAAK,GAAGd,qBAAA,CAAK3B,gBAAgB,EAArB,IAAoB,CAAC,CAAC6F,aAAa,CAC7Dc,aAAa,EACb,YACF,CAAC;IACH;;IAEA;AACJ;AACA;AACA;IACI,IAAI,IAAI,CAACrE,YAAY,EAAE;MACrB,MAAMuE,gBAAgB,GAAG5H,eAAe,CAAC6H,mBAAmB,CAAC;QAC3DH;MACF,CAAC,CAAC;MACF,IAAI,CAAC,IAAI,CAAChC,aAAa,EAAE;QACvB,IAAI;UACF,IAAI,CAACA,aAAa,GAAG,MAAM1F,eAAe,CAAC8H,aAAa,CACtDF,gBACF,CAAC;QACH,CAAC,CAAC,OAAOX,GAAG,EAAE;UACZjF,OAAO,CAACC,IAAI,CAAC,iCAAiC,EAAEgF,GAAG,CAAC;UACpD,IAAI,CAACvB,aAAa,GAAGhC,SAAS;QAChC;MACF;MACA,IAAI,CAACqE,aAAa,CAAC,IAAI,CAACrC,aAAa,CAAC;MACtC,IAAI,CAACV,4BAA4B,CAAC,IAAI,CAACU,aAAa,CAAC;MACrD,IAAI,CAACT,IAAI,CAAC,oBAAoB,CAAC;IACjC;IAEA,IAAIoB,cAAc,EAAE;MAAA,IAAA2B,iBAAA,EAAAC,mBAAA;MAClB,CAAAD,iBAAA,OAAI,CAAClF,UAAU,cAAAkF,iBAAA,eAAfA,iBAAA,CAAiBjB,IAAI,CAAC,CAAC;MACvB,CAAAkB,mBAAA,OAAI,CAACvC,aAAa,cAAAuC,mBAAA,eAAlBA,mBAAA,CAAoBlB,IAAI,CAAC,CAAC;IAC5B;IACA;AACJ;AACA;AACA;IACI,IAAI,IAAI,CAACjE,UAAU,IAAI,IAAI,CAACQ,WAAW,CAACE,KAAK,KAAK,eAAe,EAAE;MACjE,MAAMd,qBAAA,CAAK3B,gBAAgB,EAArB,IAAoB,CAAC,CAACqG,0BAA0B,CAAC,CAAC;IAC1D;IACA,IAAI,CAACnC,IAAI,CAAC,eAAe,EAAE;MACzBoC,MAAM,EAAE,IAAI,CAAC1D,cAAc,CAACH;IAC9B,CAAC,CAAC;EACJ;EAEA,MAAa0E,YAAYA,CAACnD,QAAiB,EAAE;IAAA,IAAAoD,sBAAA;IAC3C,MAAMC,cAAc,GAAG1F,qBAAA,CAAK3B,gBAAgB,EAArB,IAAoB,CAAC,CAACsH,iBAAiB,CAAC,CAAC;IAChE,IAAI,CAACD,cAAc,CAAC3B,MAAM,EAAE;MAC1B;IACF;IACA,MAAM6B,eAAe,GAAGF,cAAc,CAAC3B,MAAM,GAAG,CAAC;IACjD,MAAM8B,eAAe,GACnBxD,QAAQ,IAAIqD,cAAc,CAACE,eAAe,CAAC,CAACvD,QAAQ;IACtD,IAAI,EAAAoD,sBAAA,OAAI,CAACxE,cAAc,CAACC,OAAO,cAAAuE,sBAAA,uBAA3BA,sBAAA,CAA6BpD,QAAQ,MAAKwD,eAAe,EAAE;MAC7D;MACA,IAAI,CAAC5E,cAAc,CAACJ,KAAK,GAAGb,qBAAA,CAAK3B,gBAAgB,EAArB,IAAoB,CAAC,CAAC6F,aAAa,CAC7D2B,eAAe,EACf,YACF,CAAC;MACD,IAAI,CAAC5E,cAAc,CAACC,OAAO,GAAG,IAAI,CAACD,cAAc,CAACJ,KAAK;IACzD;IACA,MAAM,IAAI,CAAC4D,SAAS,CAAC,IAAI,CAACxD,cAAc,CAACJ,KAAK,CAAC;IAC/C,IAAI,CAAC0B,IAAI,CAAC,eAAe,EAAE;MACzBoC,MAAM,EAAE,IAAI,CAAC1D,cAAc,CAACC;IAC9B,CAAC,CAAC;EACJ;EAEA,MAAa+D,4BAA4BA,CAAA,EAGtC;IACD,IAAIH,YAAY,GAAG9E,qBAAA,CAAK3B,gBAAgB,EAArB,IAAoB,CAAC,CAAC0G,eAAe,CAAC,CAAC;IAC1D,IAAI,CAACD,YAAY,CAACf,MAAM,EAAE;MACxB,OAAO;QAAE+B,aAAa,EAAE,KAAK;QAAEzD,QAAQ,EAAE;MAAK,CAAC;IACjD;;IAEA;AACJ;AACA;AACA;AACA;;IAEIyC,YAAY,GAAG,CAAC,GAAGA,YAAY,CAAC,CAACiB,OAAO,CAAC,CAAC;IAE1C,IAAIC,mBAAmB,GAAG,IAAI;IAC9B,KACE,IAAIC,WAAW,GAAG,CAAC,EACnBA,WAAW,GAAGnB,YAAY,CAACf,MAAM,EACjCkC,WAAW,IAAI,CAAC,EAChB;MACA,IAAI;QACFD,mBAAmB,GAAGlB,YAAY,CAACmB,WAAW,CAAC,CAAC5D,QAAQ;QACxD;MACF,CAAC,CAAC,OAAOkC,GAAG,EAAE,CAAC;IACjB;IAEA,OAAOyB,mBAAmB,GACtB;MAAEF,aAAa,EAAE,IAAI;MAAEzD,QAAQ,EAAE2D;IAAoB,CAAC,GACtD;MAAEF,aAAa,EAAE,KAAK;MAAEzD,QAAQ,EAAEyC,YAAY,CAAC,CAAC,CAAC,CAACzC;IAAS,CAAC;EAClE;EAEA,MAAa4B,yBAAyBA,CAAA,EAGnC;IACD,IAAIJ,YAAY,GAAG7D,qBAAA,CAAK3B,gBAAgB,EAArB,IAAoB,CAAC,CAACyF,eAAe,CAAC,CAAC;IAC1D,IAAI,CAACD,YAAY,CAACE,MAAM,EAAE;MACxB,OAAO;QAAE+B,aAAa,EAAE,KAAK;QAAEzD,QAAQ,EAAE;MAAK,CAAC;IACjD;IACA;AACJ;AACA;AACA;AACA;;IAEIwB,YAAY,GAAG,CAAC,GAAGA,YAAY,CAAC,CAACkC,OAAO,CAAC,CAAC;IAC1C,IAAIC,mBAAmB,GAAG,IAAI;IAE9B,KACE,IAAIC,WAAW,GAAG,CAAC,EACnBA,WAAW,GAAGpC,YAAY,CAACE,MAAM,EACjCkC,WAAW,IAAI,CAAC,EAChB;MACA,IAAI;QACF,MAAMnE,UAAU,GAAG,MAAMxE,eAAe,CAACgH,aAAa,CAAC,CAAC;QAExD,MAAM4B,QAAQ,GAAG,MAAM/H,yBAAyB,CAAC2D,UAAU,CAAC;QAC5DA,UAAU,CAACuC,IAAI,CAAC,CAAC;QACjBvC,UAAU,CAACqE,OAAO,CAAC,CAAC;QACpB,IAAI,CAACD,QAAQ,EAAE;UACbF,mBAAmB,GAAGnC,YAAY,CAACoC,WAAW,CAAC,CAAC5D,QAAQ;UACxD;QACF;MACF,CAAC,CAAC,OAAOkC,GAAG,EAAE;QACZjF,OAAO,CAACC,IAAI,CAAC,iCAAiC,EAAEgF,GAAG,CAAC;MACtD;IACF;IAEA,OAAOyB,mBAAmB,GACtB;MAAEF,aAAa,EAAE,IAAI;MAAEzD,QAAQ,EAAE2D;IAAoB,CAAC,GACtD;MAAEF,aAAa,EAAE,KAAK;MAAEzD,QAAQ,EAAEwB,YAAY,CAAC,CAAC,CAAC,CAACxB;IAAS,CAAC;EAClE;EAEA,MAAa+D,YAAYA,CAAC;IACxBvF,KAAK;IACLC;EAIF,CAAC,EAAE;IACD,IAAI;MACF,MAAMuF,UAAU,GAAG,MAAMvI,gBAAgB,CAAC+C,KAAK,EAAEC,KAAK,CAAC;MACvD,IAAI,CAACF,WAAW,CAACE,KAAK,GAAGuF,UAAU,CAACC,MAAM;MAC1C,IAAI,CAAC1F,WAAW,CAACC,KAAK,GAAGwF,UAAU,CAACE,UAAU;IAChD,CAAC,CAAC,OAAO1H,GAAG,EAAE;MACZ,IAAI,CAAC+B,WAAW,CAACE,KAAK,GAAGjC,GAAG,CAACyH,MAAM,IAAI,KAAK;MAC5C,IAAI,CAAC1F,WAAW,CAACC,KAAK,GAAGhC,GAAG,CAAC0H,UAAU,IAAI,KAAK;IAClD;IACA,IAAI,CAAChE,IAAI,CAAC,yBAAyB,EAAE;MACnCI,IAAI,EAAE,OAAO;MACb6D,OAAO,EAAE,IAAI,CAAC5F,WAAW,CAACC;IAC5B,CAAC,CAAC;IAEF,IAAI,CAAC0B,IAAI,CAAC,yBAAyB,EAAE;MACnCI,IAAI,EAAE,OAAO;MACb6D,OAAO,EAAE,IAAI,CAAC5F,WAAW,CAACE;IAC5B,CAAC,CAAC;IACF,MAAM2F,WAA8C,GAAG,CAAC,CAAC;IACzD,IAAI,CAAC,IAAI,CAACxF,cAAc,EAAE;MACxB,IAAI,CAACA,cAAc,GAAG;QACpBJ,KAAK,EAAEG,SAAS;QAChBF,KAAK,EAAEE,SAAS;QAChBE,OAAO,EAAEF;MACX,CAAC;IACH;IACA,IAAIH,KAAK,EAAE;MACT,MAAMgD,YAAY,GAAG7D,qBAAA,CAAK3B,gBAAgB,EAArB,IAAoB,CAAC,CAACyF,eAAe,CAAC,CAAC;MAC5D,IAAID,YAAY,CAACE,MAAM,KAAK,CAAC,EAAE;QAC7B,MAAMC,aAAa,GAAG,CAAC,MAAM,IAAI,CAACC,yBAAyB,CAAC,CAAC,EAAE5B,QAAQ;QACvE,IAAI,CAACpB,cAAc,CAACJ,KAAK,GAAGb,qBAAA,CAAK3B,gBAAgB,EAArB,IAAoB,CAAC,CAAC6F,aAAa,CAC7DF,aAAa,EACb,YACF,CAAC;QACDyC,WAAW,CAAC5F,KAAK,GAAG,IAAI;MAC1B;IACF;IAEA,IAAIC,KAAK,EAAE;MACT,MAAMgE,YAAY,GAAG9E,qBAAA,CAAK3B,gBAAgB,EAArB,IAAoB,CAAC,CAAC0G,eAAe,CAAC,CAAC;MAC5D,IAAID,YAAY,CAACf,MAAM,KAAK,CAAC,EAAE;QAC7B,MAAMiB,aAAa,GAAG,CAAC,MAAM,IAAI,CAACC,4BAA4B,CAAC,CAAC,EAC7D5C,QAAQ;QACX,IAAI,CAACpB,cAAc,CAACH,KAAK,GAAGd,qBAAA,CAAK3B,gBAAgB,EAArB,IAAoB,CAAC,CAAC6F,aAAa,CAC7Dc,aAAa,EACb,YACF,CAAC;QAED,MAAME,gBAAgB,GAAG5H,eAAe,CAAC6H,mBAAmB,CAAC;UAC3DH;QACF,CAAC,CAAC;QACFyB,WAAW,CAAC3F,KAAK,GAAGoE,gBAAgB,CAACpE,KAAK;MAC5C;IACF;IAEA,IAAID,KAAK,EAAE,MAAM,IAAI,CAACuB,gBAAgB,CAAC,CAAC;IACxC,IAAItB,KAAK,EAAE,MAAM,IAAI,CAAC4B,gBAAgB,CAAC,CAAC;IAExC,IAAI,IAAI,CAACZ,UAAU,EAAE,IAAI,CAACpB,YAAY,GAAG,IAAI,CAAC,KACzC,IAAI,CAACA,YAAY,GAAG,KAAK;IAE9B,IAAI,IAAI,CAACN,UAAU,EAAE,IAAI,CAACO,YAAY,GAAG,IAAI,CAAC,KACzC,IAAI,CAACA,YAAY,GAAG,KAAK;IAE9B,IAAI,CAACJ,kBAAkB,GAAG,KAAK;;IAE/B;IACA,MAAM,IAAI,CAACiF,YAAY,CAAC,CAAC;;IAEzB;IACA,IAAI7H,QAAQ,CAACiB,EAAE,KAAK,SAAS,EAAE;MAC7BuB,qBAAA,CAAK3B,qBAAqB,EAA1B,IAAI,EAAyBjB,QAAQ,CAACwE,gBAAgB,CACpD,QAAQ,EACR,IAAI,CAAC2E,qBACP,CAHyB,CAAC;IAI5B;EACF;EAEQC,qBAAqBA,CAC3BC,MAA4C,GAAG,CAAC,CAAC,EACjD;IACA,MAAM;MAAE/F,KAAK,GAAG,IAAI;MAAEC,KAAK,GAAG;IAAK,CAAC,GAAG8F,MAAM;IAC7C,IAAI/F,KAAK,EAAE;MAAA,IAAAgG,qBAAA;MACT,CAAAA,qBAAA,OAAI,CAAC9F,iBAAiB,cAAA8F,qBAAA,gBAAAA,qBAAA,GAAtBA,qBAAA,CAAwBhG,KAAK,cAAAgG,qBAAA,eAA7BA,qBAAA,CAA+BxC,IAAI,CAAC,CAAC;IACvC;IAEA,IAAIvD,KAAK,EAAE;MAAA,IAAAgG,sBAAA;MACT,CAAAA,sBAAA,OAAI,CAAC/F,iBAAiB,cAAA+F,sBAAA,gBAAAA,sBAAA,GAAtBA,sBAAA,CAAwBhG,KAAK,cAAAgG,sBAAA,eAA7BA,sBAAA,CAA+BzC,IAAI,CAAC,CAAC;IACvC;IAEA,IAAIxD,KAAK,IAAIC,KAAK,EAAE;MAClB,IAAI,CAACP,kBAAkB,GAAG,KAAK;IACjC;EACF;EAEOwG,uBAAuBA,CAACH,MAG9B,EAAE;IAAA,IAAAI,sBAAA;IACD,CAAAA,sBAAA,OAAI,CAACjG,iBAAiB,CAACD,KAAK,cAAAkG,sBAAA,eAA5BA,sBAAA,CAA8BtD,mBAAmB,CAC/C,OAAO,EACP,IAAI,CAACuD,kBACP,CAAC;IACD,IAAI,CAACN,qBAAqB,CAACC,MAAM,CAAC;IAClC,IAAI,CAAC7F,iBAAiB,GAAG;MACvBF,KAAK,EAAEG,SAAS;MAChBF,KAAK,EAAEE;IACT,CAAC;EACH;EAEQwD,aAAaA,CAAC1C,UAA4B,EAAE;IAClD,IAAIA,UAAU,KAAK,IAAI,CAACA,UAAU,EAAE;MAClC;IACF;IAEA,IAAIA,UAAU,KAAKd,SAAS,EAAE;MAC5B,IAAI,CAACkG,cAAc,CAAC,CAAC;IACvB;IAEA,IAAI,CAACpF,UAAU,GAAGA,UAAU;EAC9B;EAEQuD,aAAaA,CAACjF,UAA4B,EAAE;IAClD,IAAIA,UAAU,KAAK,IAAI,CAACA,UAAU,EAAE;MAClC;IACF;IAEA,IAAIA,UAAU,KAAKY,SAAS,EAAE;MAC5B,IAAI,CAACmG,cAAc,CAAC,CAAC;IACvB;IAEA,IAAI,CAAC/G,UAAU,GAAGA,UAAU;EAC9B;EAEQgH,oBAAoBA,CAACR,MAG5B,EAAE;IAAA,IAAAS,sBAAA;IACD,MAAM;MAAExG,KAAK;MAAEC;IAAM,CAAC,GAAG8F,MAAM;IAC/B;IACA,IAAI,CAAC/F,KAAK,IAAI,CAACC,KAAK,EAAE;MACpB,IAAI,CAAC6F,qBAAqB,CAAC;QAAE9F,KAAK,EAAE,CAAC,CAACA,KAAK;QAAEC,KAAK,EAAE,CAAC,CAACA;MAAM,CAAC,CAAC;IAChE;IAEA,IAAI,CAACC,iBAAiB,GAAG6F,MAAM;IAC/B,CAAAS,sBAAA,OAAI,CAACtG,iBAAiB,CAACD,KAAK,cAAAuG,sBAAA,eAA5BA,sBAAA,CAA8BtF,gBAAgB,CAC5C,OAAO,EACP,IAAI,CAACkF,kBAAkB,CAACK,IAAI,CAAC,IAAI,CACnC,CAAC;EACH;EAEQL,kBAAkBA,CAAA,EAAG;IAC3B,IAAI,CAAC1E,IAAI,CAAC,mBAAmB,CAAC;EAChC;EAEA,MAAagF,YAAYA,CAAA,EAAG;IAC1B,MAAM,IAAI,CAACC,WAAW,CAAC,CAAC;EAC1B;EAEA,MAAaC,WAAWA,CAAA,EAAG;IACzB,MAAM,IAAI,CAACD,WAAW,CAAC,CAAC;EAC1B;EAEA,MAAaA,WAAWA,CAAA,EAAG;IACzB,IAAI,IAAI,CAAC5G,WAAW,CAACC,KAAK,KAAK,UAAU,EAAE;MACzC,IAAI;QACF,MAAMwF,UAAU,GAAG,MAAMvI,gBAAgB,CAAC,IAAI,EAAE,KAAK,CAAC;QACtD,IAAI,CAAC8C,WAAW,CAACC,KAAK,GAAGwF,UAAU,CAACE,UAAU;MAChD,CAAC,CAAC,OAAO1H,GAAG,EAAE;QACZ,IAAI,CAAC+B,WAAW,CAACC,KAAK,GAAGhC,GAAG,CAAC0H,UAAU,IAAI,KAAK;MAClD;IACF;IACA,IAAI,CAAChE,IAAI,CAAC,yBAAyB,EAAE;MACnCI,IAAI,EAAE,OAAO;MACb6D,OAAO,EAAE,IAAI,CAAC5F,WAAW,CAACC;IAC5B,CAAC,CAAC;IACF,IACE,IAAI,CAACD,WAAW,CAACC,KAAK,KAAK,QAAQ,IACnC,IAAI,CAACD,WAAW,CAACC,KAAK,KAAK,eAAe,EAC1C;MACA,IAAI,CAACH,YAAY,GAAG,KAAK;MACzB;IACF;IACA,IAAI,IAAI,CAACA,YAAY,EAAE;MACrB,IAAI,CAACA,YAAY,GAAG,KAAK;MAEzB,IAAI,IAAI,CAACoB,UAAU,EAAE;QACnB,IAAI,CAACA,UAAU,CAACzB,OAAO,GAAG,IAAI,CAACK,YAAY;MAC7C;MACA;IACF;IACA,IAAI;MACF;AACN;AACA;AACA;MACM,IAAI,CAAC,IAAI,CAACoB,UAAU,IAAI,IAAI,CAACA,UAAU,CAACoB,UAAU,KAAK,OAAO,EAAE;QAAA,IAAAwE,sBAAA;QAC9D,MAAM,IAAI,CAACtF,gBAAgB,EAAAsF,sBAAA,GAAC,IAAI,CAACzG,cAAc,CAACJ,KAAK,cAAA6G,sBAAA,uBAAzBA,sBAAA,CAA2BrF,QAAQ,CAAC;MAClE;MACA;MACA;MACA,IAAI,CAAC,IAAI,CAACP,UAAU,EAAE;QACpB,IAAI,CAACpB,YAAY,GAAG,KAAK;QACzB;MACF;MACA,IAAI,CAACA,YAAY,GAAG,IAAI;IAC1B,CAAC,CAAC,OAAOiH,EAAE,EAAE;MACX,IAAI,CAACjH,YAAY,GAAG,KAAK;MACzB,IAAI,CAACoB,UAAU,GAAGd,SAAS;MAC3B,IAAI,CAAC+B,aAAa,GAAG/B,SAAS;IAChC;IACA,IAAI,IAAI,CAACc,UAAU,EAAE;MACnB,IAAI,CAACA,UAAU,CAACzB,OAAO,GAAG,IAAI;IAChC;EACF;EAEA,MAAauH,WAAWA,CAAA,EAAG;IACzB,MAAM,IAAI,CAACC,WAAW,CAAC,CAAC;EAC1B;EAEA,MAAaC,YAAYA,CAAA,EAAG;IAC1B,MAAM,IAAI,CAACD,WAAW,CAAC,CAAC;EAC1B;EAEA,MAAaA,WAAWA,CAAA,EAAG;IAAA,IAAAE,sBAAA;IACzB,IAAI,IAAI,CAACnH,WAAW,CAACE,KAAK,KAAK,UAAU,EAAE;MACzC,IAAI;QACF,MAAMuF,UAAU,GAAG,MAAMvI,gBAAgB,CAAC,KAAK,EAAE,IAAI,CAAC;QACtD,IAAI,CAAC8C,WAAW,CAACE,KAAK,GAAGuF,UAAU,CAACC,MAAM;MAC5C,CAAC,CAAC,OAAOzH,GAAG,EAAE;QACZ,IAAI,CAAC+B,WAAW,CAACE,KAAK,GAAGjC,GAAG,CAACyH,MAAM,IAAI,KAAK;MAC9C;IACF;IACA,IAAI,CAAC/D,IAAI,CAAC,yBAAyB,EAAE;MACnCI,IAAI,EAAE,OAAO;MACb6D,OAAO,EAAE,IAAI,CAAC5F,WAAW,CAACE;IAC5B,CAAC,CAAC;IACF,IACE,IAAI,CAACF,WAAW,CAACE,KAAK,KAAK,QAAQ,IACnC,IAAI,CAACF,WAAW,CAACE,KAAK,KAAK,eAAe,EAC1C;MACA,IAAI,CAACH,YAAY,GAAG,KAAK;MACzB;IACF;IACA,IAAI,IAAI,CAACA,YAAY,EAAE;MACrB,IAAI,CAACwG,cAAc,CAAC,CAAC;MACrB,IAAI,CAACxG,YAAY,GAAG,KAAK;MACzB;IACF;IACA;AACJ;AACA;AACA;IACI,IAAI,CAACA,YAAY,GAAG,IAAI;IACxB,MAAM,IAAI,CAAC+B,gBAAgB,EAAAqF,sBAAA,GAAC,IAAI,CAAC9G,cAAc,CAACH,KAAK,cAAAiH,sBAAA,uBAAzBA,sBAAA,CAA2B1F,QAAQ,CAAC;EAClE;EAEA,MAAa2F,cAAcA,CAACrD,MAAuB,EAAE;IACnD,MAAM,IAAI,CAACvC,gBAAgB,CAACuC,MAAM,CAACtC,QAAQ,CAAC;EAC9C;EAEA,MAAa4F,cAAcA,CAACtD,MAAuB,EAAE;IACnD,IAAI,IAAI,CAAChE,YAAY,EAAE;MACrB,IAAI,CAACwG,cAAc,CAAC,CAAC;IACvB;IACA,MAAM,IAAI,CAACzE,gBAAgB,CAACiC,MAAM,CAACtC,QAAQ,CAAC;EAC9C;EAEA,MAAa6F,gBAAgBA,CAACvD,MAAwB,EAAE;IACtD,MAAM,IAAI,CAACa,YAAY,CAACb,MAAM,CAACtC,QAAQ,CAAC;EAC1C;EAEA,MAAaoC,SAASA,CAAC0D,KAAsB,EAAE;IAC7C,MAAMnI,qBAAA,CAAK3B,gBAAgB,EAArB,IAAoB,CAAC,CAAC+J,gBAAgB,CAACD,KAAK,CAAC9F,QAAQ,CAAC;EAC9D;EAEA,MAAcf,mBAAmBA,CAAA,EAAG;IAClC,IAAI,CAAC8F,oBAAoB,CAAC,MAAM9J,eAAe,CAAC+K,oBAAoB,CAAC,CAAC,CAAC;IACvE,IAAI,CAAC9H,kBAAkB,GAAG,IAAI;IAC9B,IAAI,CAACgC,IAAI,CAAC,0BAA0B,CAAC;EACvC;EAEA,MAAchB,kBAAkBA,CAAA,EAAG;IACjC,IAAI,IAAI,CAAChB,kBAAkB,EAAE;MAC3B,IAAI,CAACwG,uBAAuB,CAAC,CAAC;MAC9B,IAAI,CAACxE,IAAI,CAAC,0BAA0B,CAAC;MACrC;IACF;EACF;EAEA,MAAa+F,iBAAiBA,CAAA,EAAG;IAC/B,IAAI,IAAI,CAAC/H,kBAAkB,IAAI5C,QAAQ,CAACiB,EAAE,KAAK,KAAK,EAAE;MACpD,IAAI,CAACmI,uBAAuB,CAAC,CAAC;MAC9B,IAAI;QACF,MAAMlI,GAAG,GAAG,MAAMd,SAAS,CAACe,0BAA0B,CAAC,CAAC;QACxD,IAAID,GAAG,EAAE;UACP,MAAMd,SAAS,CAACwK,WAAW,CAAC,CAAC;QAC/B;MACF,CAAC,CAAC,OAAO7I,CAAC,EAAE;QACVJ,OAAO,CAACC,IAAI,CAAC,mCAAmC,EAAEG,CAAC,CAAC;MACtD;MACA;IACF;IACA,IAAI/B,QAAQ,CAACiB,EAAE,KAAK,KAAK,IAAI,IAAI,CAAC2B,kBAAkB,EAAE;MACpD9C,aAAa,CAAC+K,wBAAwB,CAACC,yBAAyB,CAAC,CAAC;MAClE;IACF;IAEA,IAAI9K,QAAQ,CAACiB,EAAE,KAAK,SAAS,EAAE;MAC7B,IAAI,CAAC4B,mBAAmB,GAAG,IAAI;MAC/B,MAAM,IAAI,CAAC7B,mBAAmB,CAAC,CAAC;MAChC,IAAI;QACF,IAAI,CAACyI,oBAAoB,CAAC,MAAM9J,eAAe,CAAC+K,oBAAoB,CAAC,CAAC,CAAC;QACvE,IAAI,CAAC9H,kBAAkB,GAAG,IAAI;MAChC,CAAC,CAAC,OAAOb,CAAC,EAAE;QACVJ,OAAO,CAACC,IAAI,CAAC,6BAA6B,EAAEG,CAAC,CAAC;QAC9C,IAAI,CAACa,kBAAkB,GAAG,KAAK;QAC/B,MAAM1B,GAAG,GAAG,MAAMd,SAAS,CAACe,0BAA0B,CAAC,CAAC;QACxD,IAAID,GAAG,EAAE;UACP,MAAMd,SAAS,CAACwK,WAAW,CAAC,CAAC;QAC/B;QACA,IAAI,CAAC/H,mBAAmB,GAAG,KAAK;MAClC,CAAC,SAAS;QACR,IAAI,CAACA,mBAAmB,GAAG,KAAK;MAClC;IACF;IACA,IAAI7C,QAAQ,CAACiB,EAAE,KAAK,KAAK,EAAE;MACzBnB,aAAa,CAAC+K,wBAAwB,CAACC,yBAAyB,CAAC,CAAC;IACpE;EACF;EAEA,MAAaC,iBAAiBA,CAAA,EAAG;IAC/B,MAAM,IAAI,CAACJ,iBAAiB,CAAC,CAAC;EAChC;EAEA,MAAaK,kBAAkBA,CAAA,EAAG;IAChC,MAAM,IAAI,CAACL,iBAAiB,CAAC,CAAC;EAChC;EAEOM,aAAaA,CAAA,EAAG;IACrB,OAAO5I,qBAAA,CAAK3B,gBAAgB,EAArB,IAAoB,CAAC,CAACwK,gBAAgB;EAC/C;EAEOC,iBAAiBA,CAAA,EAAG;IACzB,OAAO,IAAI,CAAC7H,cAAc;EAC5B;EAEOiD,aAAaA,CAClB7B,QAAgB,EAChBM,IAAiD,EACjD;IACA,OAAO3C,qBAAA,CAAK3B,gBAAgB,EAArB,IAAoB,CAAC,CAAC6F,aAAa,CAAC7B,QAAQ,EAAEM,IAAI,CAAC;EAC5D;EAEOmB,eAAeA,CAAA,EAAG;IACvB,OAAO9D,qBAAA,CAAK3B,gBAAgB,EAArB,IAAoB,CAAC,CAACyF,eAAe,CAAC,CAAC;EAChD;EAEOiB,eAAeA,CAAA,EAAG;IACvB,OAAO/E,qBAAA,CAAK3B,gBAAgB,EAArB,IAAoB,CAAC,CAAC0G,eAAe,CAAC,CAAC;EAChD;EAEOY,iBAAiBA,CAAA,EAAG;IACzB,OAAO3F,qBAAA,CAAK3B,gBAAgB,EAArB,IAAoB,CAAC,CAACsH,iBAAiB,CAAC,CAAC;EAClD;EAEA,MAAaxE,cAAcA,CACzBC,cAGC,EACD2H,iBAA0B,EAC1B;IACA,IAAIC,WAA4B;IAChC,IAAIC,aAA8B;IAClC,IAAI7H,cAAc,CAAC8H,KAAK,CAACnF,MAAM,EAAE,CAACiF,WAAW,CAAC,GAAG5H,cAAc,CAAC8H,KAAK;IAErE,IAAI9H,cAAc,CAAC+H,OAAO,CAACpF,MAAM,EAAE,CAACkF,aAAa,CAAC,GAAG7H,cAAc,CAAC+H,OAAO;;IAE3E;AACJ;AACA;AACA;AACA;IACI,IAAIH,WAAW,EAAE;MACf,IAAIA,WAAW,CAACrG,IAAI,KAAK,YAAY,EAAE;QACrC,IACE,IAAI,CAAC/B,WAAW,CAACC,KAAK,KAAK,QAAQ,IACnC,IAAI,CAACD,WAAW,CAACC,KAAK,KAAK,eAAe,EAC1C;UACA,MAAM,IAAI,CAAC2E,YAAY,CAACwD,WAAW,CAAC3G,QAAQ,CAAC;QAC/C,CAAC,MAAM;UACL,MAAM,IAAI,CAACD,gBAAgB,CAAC4G,WAAW,CAAC3G,QAAQ,CAAC;QACnD;MACF,CAAC,MAAM,IAAI2G,WAAW,CAACrG,IAAI,KAAK,YAAY,EAAE;QAC5C,MAAM,IAAI,CAACD,gBAAgB,CAACsG,WAAW,CAAC3G,QAAQ,CAAC;MACnD,CAAC,MAAM,IAAI2G,WAAW,CAACrG,IAAI,KAAK,aAAa,EAAE;QAC7C,MAAM,IAAI,CAAC6C,YAAY,CAACwD,WAAW,CAAC3G,QAAQ,CAAC;MAC/C;MACA,IAAI,CAACE,IAAI,CAAC,oBAAoB,CAAC;IACjC;IAEA,IAAI0G,aAAa,EAAE;MACjB,IAAIA,aAAa,CAACtG,IAAI,KAAK,YAAY,EAAE;QACvC,IACE,IAAI,CAAC/B,WAAW,CAACC,KAAK,KAAK,QAAQ,IACnC,IAAI,CAACD,WAAW,CAACC,KAAK,KAAK,eAAe,EAC1C;UACA,MAAM,IAAI,CAAC2E,YAAY,CAAC,CAAC;QAC3B,CAAC,MAAM;UACL,MAAM,IAAI,CAACpD,gBAAgB,CAAC,CAAC;QAC/B;MACF,CAAC,MAAM,IAAI6G,aAAa,CAACtG,IAAI,KAAK,YAAY,EAAE;QAC9C,MAAM,IAAI,CAACD,gBAAgB,CAAC,CAAC;MAC/B,CAAC,MAAM,IAAIuG,aAAa,CAACtG,IAAI,KAAK,aAAa,EAAE;QAC/C,MAAM,IAAI,CAAC6C,YAAY,CAAC,CAAC;MAC3B;MACA,IAAI,CAACjD,IAAI,CAAC,oBAAoB,CAAC;IACjC;IAEA,IAAInB,cAAc,CAAC8H,KAAK,CAACnF,MAAM,IAAI3C,cAAc,CAAC+H,OAAO,CAACpF,MAAM,EAAE;MAChE,IAAI,CAACxB,IAAI,CAAC,qBAAqB,EAAEnB,cAAc,CAAC;IAClD;EACF;EAEA,aAAoBgI,IAAIA,CAACC,CAAC,EAAE;IAC1B,MAAMzJ,eAAe,GAAG,MAAMtC,eAAe,CAAC8L,IAAI,CAAC,CAAC;IACpD,OAAO,IAAI1K,iBAAiB,CAACkB,eAAe,CAAC;EAC/C;EAEO2C,IAAIA,CAAC+G,KAA+B,EAAE,GAAGC,IAAW,EAAE;IAC3D,OAAO,KAAK,CAAChH,IAAI,CAAC+G,KAAK,EAAE,GAAGC,IAAI,CAAC;EACnC;EAEOC,EAAEA,CACPF,KAA+B,EAC/BG,QAAkC,EAClC;IACA,OAAO,KAAK,CAACD,EAAE,CAACF,KAAK,EAAEG,QAAQ,CAAC;EAClC;EAEOC,QAAQA,CAAA,EAAG;IAChB;IACA;IACA,IAAI/L,QAAQ,CAACiB,EAAE,KAAK,SAAS,EAAEoB,qBAAA,CAAKxB,qBAAqB,EAA1B,IAAyB,CAAC,CAACmL,MAAM,CAAC,CAAC;IAClE/L,eAAe,CAACyG,IAAI,CAAC,CAAC;IACtB,IAAI;MACF,IAAI1G,QAAQ,CAACiB,EAAE,KAAK,SAAS,EAAEb,SAAS,CAACwK,WAAW,CAAC,CAAC;IACxD,CAAC,CAAC,OAAOqB,IAAI,EAAE,CAAC;IAChB;EACF;EAEQ1C,cAAcA,CAAA,EAAG;IAAA,IAAA2C,oBAAA,EAAAC,iBAAA,EAAAC,oBAAA,EAAAC,iBAAA;IACvB,CAAAH,oBAAA,OAAI,CAAC9G,aAAa,cAAA8G,oBAAA,eAAlBA,oBAAA,CAAoBxF,IAAI,CAAC,CAAC;IAC1B,CAAAyF,iBAAA,OAAI,CAAChI,UAAU,cAAAgI,iBAAA,eAAfA,iBAAA,CAAiBzF,IAAI,CAAC,CAAC;IACvB,CAAA0F,oBAAA,OAAI,CAAChH,aAAa,cAAAgH,oBAAA,eAAlBA,oBAAA,CAAoB5D,OAAO,CAAC,CAAC;IAC7B,CAAA6D,iBAAA,OAAI,CAAClI,UAAU,cAAAkI,iBAAA,eAAfA,iBAAA,CAAiB7D,OAAO,CAAC,CAAC;IAC1B,IAAI,CAACzF,YAAY,GAAG,KAAK;IACzB,IAAI,CAACoB,UAAU,GAAGd,SAAS;IAC3B,IAAI,CAAC+B,aAAa,GAAG/B,SAAS;EAChC;EAEQmG,cAAcA,CAAA,EAAG;IAAA,IAAA8C,oBAAA,EAAAC,iBAAA,EAAAC,oBAAA,EAAAC,iBAAA;IACvB,CAAAH,oBAAA,OAAI,CAACjH,aAAa,cAAAiH,oBAAA,eAAlBA,oBAAA,CAAoB5F,IAAI,CAAC,CAAC;IAC1B,CAAA6F,iBAAA,OAAI,CAAC9J,UAAU,cAAA8J,iBAAA,eAAfA,iBAAA,CAAiB7F,IAAI,CAAC,CAAC;IACvB,CAAA8F,oBAAA,OAAI,CAACnH,aAAa,cAAAmH,oBAAA,eAAlBA,oBAAA,CAAoBhE,OAAO,CAAC,CAAC;IAC7B,CAAAiE,iBAAA,OAAI,CAAChK,UAAU,cAAAgK,iBAAA,eAAfA,iBAAA,CAAiBjE,OAAO,CAAC,CAAC;IAC1B,IAAI,CAAC/F,UAAU,GAAGY,SAAS;IAC3B,IAAI,CAACgC,aAAa,GAAGhC,SAAS;EAChC;AACF","ignoreList":[]}
1
+ {"version":3,"names":["EventEmitter","LocalMediaUtils","AppState","NativeEventEmitter","NativeModules","PermissionsAndroid","Platform","BackgroundTimer","InCallManger","setupPermissions","RTKHelper","BroadcastEventEmitter","broadcastEmitter","MediaEvents","checkIfAudioTrackIsSilent","track","_localMediaUtils","WeakMap","_appState","_appStateSubscription","_interval","_deviceRemovalTimeout","LocalMediaHandler","configureForeground","OS","val","isForegroundServiceRunning","Version","res","request","PERMISSIONS","POST_NOTIFICATIONS","RESULTS","GRANTED","console","warn","createNotificationChannel","startService","e","constructor","localMediaUtils","_classPrivateFieldInitSpec","_defineProperty","nextAppState","_classPrivateFieldGet","match","clearInterval","_classPrivateFieldSet","videoTrack","enabled","setTimeout","screenShareEnabled","_pendingScreenShare","setInterval","audioEnabled","videoEnabled","permissions","audio","video","screenShareTracks","undefined","currentDevices","speaker","onDeviceChange","changedDevices","addListener","oniOSBroadcastStart","oniOSBroadcastStop","start","media","conditionallyRestartAudio","Promise","race","resolve","_this$audioTrack","audioTrack","addEventListener","reacquireTrack","shouldReacquireTrack","_this$currentDevices$","removeMediaStreamTrackListeners","setupAudioStream","deviceId","addMediaStreamTrackListeners","emit","conditionallyRestartVideo","_this$videoTrack","setupVideoStream","kind","workaroundWebKitBug1208516","mediaStreamTrack","wasEnabled","rawAudioTrack","rawVideoTrack","isStopped","readyState","isInadvertentlyStopped","isSilentAudio","muted","removeDocumentEventListeners","onUnmute","ev","conditionallyRestart","removeEventListener","forceStopTrack","_this$currentDevices$2","audioDevices","getAudioDevices","length","audioDeviceId","getOperationalMicDeviceId","getDeviceById","_this$audioTrack2","_this$rawAudioTrack","stop","getAudioTrack","err","setAudioTrack","setDevice","repopulateAvailableDevices","forceUpdateAudioDevices","device","onVisibilityChange","_this$currentDevices$3","videoDevices","getVideoDevices","videoDeviceId","getOperationalWebcamDeviceId","videoConstraints","getVideoConstraints","getVideoTrack","setVideoTrack","_this$videoTrack2","_this$rawVideoTrack","setupSpeaker","_this$currentDevices$5","speakerDevices","getSpeakerDevices","speakerDeviceId","currentDeviceStillAvailable","find","d","_this$currentDevices$4","bluetoothDevice","wiredDevice","speakerDevice","isOperational","reverse","operationalDeviceId","deviceIndex","isSilent","release","setupStreams","permResult","camera","microphone","message","constraints","_handleAppStateChange","stopScreenShareTracks","tracks","_this$screenShareTrac","_this$screenShareTrac2","removeScreenShareTracks","_this$screenShareTrac3","onScreenShareEnded","stopAudioTrack","stopVideoTrack","setScreenShareTracks","_this$screenShareTrac4","bind","disableAudio","toggleAudio","enableAudio","_this$currentDevices$6","ex","enableVideo","toggleVideo","disableVideo","_this$currentDevices$7","setAudioDevice","setVideoDevice","setSpeakerDevice","route","chooseAudioRoute","getScreenShareTracks","toggleScreenShare","stopService","RTKScreensharePickerView","showScreenSharePickerView","enableScreenShare","disableScreenShare","getAllDevices","availableDevices","getCurrentDevices","forceDeviceChange","addedDevice","removedDevice","added","removed","selectedDevice","selectedDeviceInfo","clearTimeout","isBluetoothRemoved","handleRemoval","hasDeviceListChanged","hasSelectedDeviceInfo","init","_","event","args","on","listener","destruct","remove","_err","_this$rawAudioTrack2","_this$audioTrack3","_this$rawAudioTrack3","_this$audioTrack4","_this$rawVideoTrack2","_this$videoTrack3","_this$rawVideoTrack3","_this$videoTrack4"],"sources":["LocalMediaHandler.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-unused-vars */\nimport { EventEmitter } from 'events';\nimport LocalMediaUtils from './LocalMediaUtils';\nimport {\n RealtimeKitMediaStreamConstraints,\n MediaPermission,\n} from './LocalMediaInterfaces';\nimport type { MediaStreamTrack } from '@cloudflare/react-native-webrtc';\nimport type { MediaDeviceInfo } from './LocalMediaInterfaces';\nimport {\n AppState,\n NativeEventEmitter,\n NativeEventSubscription,\n NativeModules,\n PermissionsAndroid,\n Platform,\n} from 'react-native';\nimport BackgroundTimer from './BackgroundHandler';\nimport InCallManger from './NativeAudioManager';\nimport { setupPermissions } from './PermissionHandler';\n\nconst { RTKHelper, BroadcastEventEmitter } = NativeModules;\n\nconst broadcastEmitter = new NativeEventEmitter(BroadcastEventEmitter);\n\n// eslint-disable-next-line no-shadow\nexport enum MediaEvents {\n AUDIO_TRACK_CHANGE,\n VIDEO_TRACK_CHANGE,\n SCREENSHARE_TRACK_CHANGE,\n SCREENSHARE_ENDED,\n DEVICE_CHANGE,\n SCREENSHARE_STARTED,\n MEDIA_PERMISSION_UPDATE,\n DEVICE_LIST_UPDATED,\n}\n\nfunction checkIfAudioTrackIsSilent(track: MediaStreamTrack) {\n //TODO\n return !!track;\n}\n\nexport default class LocalMediaHandler extends EventEmitter {\n #localMediaUtils: LocalMediaUtils;\n\n #appState: string;\n\n #appStateSubscription: NativeEventSubscription;\n\n #interval: number;\n\n public audioTrack: MediaStreamTrack;\n\n public rawAudioTrack: MediaStreamTrack;\n\n public videoTrack: MediaStreamTrack;\n\n public rawVideoTrack: MediaStreamTrack;\n\n public screenShareTracks: {\n audio?: MediaStreamTrack;\n video?: MediaStreamTrack;\n };\n\n public audioEnabled: boolean;\n\n public videoEnabled: boolean;\n\n public screenShareEnabled: boolean;\n\n private _pendingScreenShare = false;\n\n public currentDevices: {\n audio?: MediaDeviceInfo;\n video?: MediaDeviceInfo;\n speaker?: MediaDeviceInfo;\n };\n\n public permissions: {\n audio?: MediaPermission;\n video?: MediaPermission;\n };\n\n #deviceRemovalTimeout: NodeJS.Timeout | null = null;\n\n _handleAppStateChange = (nextAppState) => {\n if (\n this.#appState.match(/inactive|background/) &&\n nextAppState === 'active'\n ) {\n BackgroundTimer.clearInterval(this.#interval);\n this.#interval = null;\n if (this.videoTrack) {\n this.videoTrack.enabled = false;\n setTimeout(() => {\n if (this.videoTrack) {\n this.videoTrack.enabled = true;\n }\n }, 100);\n }\n } else {\n if (this.#interval === null) {\n if (this.screenShareEnabled || this._pendingScreenShare) {\n this.configureForeground();\n }\n }\n this.#interval = BackgroundTimer.setInterval(() => {}, 1000);\n this.#appState = nextAppState;\n }\n };\n\n private async configureForeground() {\n if (Platform.OS !== 'android') return;\n const val = await RTKHelper.isForegroundServiceRunning();\n if (!val) {\n if ((Platform.Version as number) >= 33) {\n const res = await PermissionsAndroid.request(\n PermissionsAndroid.PERMISSIONS.POST_NOTIFICATIONS\n );\n if (res !== PermissionsAndroid.RESULTS.GRANTED) {\n console.warn('Permission required for screenshare notification');\n }\n }\n if ((Platform.Version as number) >= 26) {\n await RTKHelper.createNotificationChannel();\n }\n try {\n await RTKHelper.startService();\n } catch (e) {\n console.warn('Failed to start foreground service', e);\n }\n }\n }\n\n public constructor(localMediaUtils: LocalMediaUtils) {\n super();\n this.#localMediaUtils = localMediaUtils;\n this.#appState = '';\n this.audioEnabled = true;\n this.videoEnabled = true;\n this.screenShareEnabled = false;\n this.permissions = { audio: 'NOT_REQUESTED', video: 'NOT_REQUESTED' };\n this.screenShareTracks = {\n audio: undefined,\n video: undefined,\n };\n this.currentDevices = {\n audio: undefined,\n video: undefined,\n speaker: undefined,\n };\n // LocalMediaUtils onDeviceChange with callback from native onAudioDeviceChanged events\n this.#localMediaUtils.onDeviceChange(async (changedDevices) => {\n await this.onDeviceChange(changedDevices, false);\n });\n if (Platform.OS === 'ios') {\n broadcastEmitter.addListener('iOS_BroadcastStarted', () => {\n this.oniOSBroadcastStart();\n });\n broadcastEmitter.addListener('iOS_BroadcastStopped', () => {\n this.oniOSBroadcastStop();\n });\n }\n InCallManger.start({ media: 'video' });\n }\n\n private async conditionallyRestartAudio() {\n if (!this.currentDevices.audio || !this.audioEnabled) {\n return;\n }\n await Promise.race([\n new Promise((resolve) =>\n this.audioTrack?.addEventListener('unmute', (e) => {\n resolve(e);\n })\n ),\n new Promise((resolve) => setTimeout(resolve, 50)),\n ]);\n const reacquireTrack = await this.shouldReacquireTrack('audio');\n\n if (reacquireTrack) {\n this.removeMediaStreamTrackListeners(this.audioTrack);\n await this.setupAudioStream(this.currentDevices.audio?.deviceId);\n this.addMediaStreamTrackListeners(this.audioTrack);\n this.emit('AUDIO_TRACK_CHANGE');\n }\n }\n\n private async conditionallyRestartVideo() {\n if (!this.currentDevices.video || !this.videoEnabled) return;\n\n await Promise.race([\n new Promise((resolve) =>\n this.videoTrack?.addEventListener('unmute', resolve)\n ),\n new Promise((resolve) => setTimeout(resolve, 50)),\n ]);\n\n const reacquireTrack = await this.shouldReacquireTrack('video');\n\n if (reacquireTrack) {\n this.removeMediaStreamTrackListeners(this.videoTrack);\n await this.setupVideoStream(this.currentDevices.video.deviceId);\n this.addMediaStreamTrackListeners(this.videoTrack);\n this.emit('VIDEO_TRACK_CHANGE');\n }\n }\n\n private async shouldReacquireTrack(kind: 'audio' | 'video') {\n const workaroundWebKitBug1208516 = false;\n let mediaStreamTrack: MediaStreamTrack;\n let wasEnabled = false;\n\n if (kind === 'audio') {\n mediaStreamTrack = this.audioTrack;\n wasEnabled = this.audioEnabled;\n } else if (kind === 'video') {\n mediaStreamTrack = this.videoTrack;\n wasEnabled = this.videoEnabled;\n }\n\n if (!mediaStreamTrack) return false;\n if (!this.rawAudioTrack || !this.audioTrack) return true;\n if (!this.rawVideoTrack || !this.videoTrack) return true;\n const isStopped = mediaStreamTrack.readyState === 'ended';\n\n const isInadvertentlyStopped =\n isStopped && wasEnabled && workaroundWebKitBug1208516;\n\n let isSilentAudio = false;\n if (kind === 'audio') {\n isSilentAudio = await checkIfAudioTrackIsSilent(this.audioTrack);\n }\n\n return mediaStreamTrack.muted || isInadvertentlyStopped || isSilentAudio;\n }\n\n public async removeDocumentEventListeners() {}\n\n private onUnmute(ev) {\n // log.info('Track unmuted', ev);\n }\n\n private removeMediaStreamTrackListeners(mediaStreamTrack: MediaStreamTrack) {\n if (!mediaStreamTrack) {\n return undefined;\n }\n\n const conditionallyRestart =\n mediaStreamTrack.kind === 'audio'\n ? this.conditionallyRestartAudio\n : this.conditionallyRestartVideo;\n mediaStreamTrack.removeEventListener('ended', conditionallyRestart);\n mediaStreamTrack.removeEventListener('mute', conditionallyRestart);\n mediaStreamTrack.removeEventListener('unmute', this.onUnmute);\n return mediaStreamTrack;\n }\n\n private addMediaStreamTrackListeners(mediaStreamTrack: MediaStreamTrack) {\n if (!mediaStreamTrack) {\n return null;\n }\n const conditionallyRestart =\n mediaStreamTrack.kind === 'audio'\n ? this.conditionallyRestartAudio\n : this.conditionallyRestartVideo;\n mediaStreamTrack.addEventListener('ended', conditionallyRestart);\n mediaStreamTrack.addEventListener('mute', conditionallyRestart);\n mediaStreamTrack.addEventListener('unmute', this.onUnmute);\n\n return mediaStreamTrack;\n }\n\n public async setupAudioStream(\n deviceId?: string,\n forceStopTrack: boolean = false\n ) {\n const audioDevices = this.#localMediaUtils.getAudioDevices();\n\n if (!audioDevices.length) {\n return;\n }\n\n let audioDeviceId = deviceId;\n\n if (!audioDeviceId) {\n audioDeviceId = (await this.getOperationalMicDeviceId()).deviceId;\n }\n\n if (this.currentDevices.audio?.deviceId !== audioDeviceId) {\n this.currentDevices.audio = this.#localMediaUtils.getDeviceById(\n audioDeviceId,\n 'audioinput'\n );\n }\n if (forceStopTrack) {\n this.audioTrack?.stop();\n this.rawAudioTrack?.stop();\n }\n try {\n this.rawAudioTrack = await LocalMediaUtils.getAudioTrack();\n } catch (err) {\n console.warn('Failed to acquire audio track: ', err);\n this.rawAudioTrack = undefined;\n }\n this.setAudioTrack(this.rawAudioTrack);\n this.addMediaStreamTrackListeners(this.audioTrack);\n this.emit('AUDIO_TRACK_CHANGE');\n this.setDevice(this.currentDevices.audio);\n\n /**\n * NOTE(roerohan): Firefox does not show device labels until permissions are granted.\n * So, we need to repopulate the devices once permission is granted.\n */\n if (this.audioTrack && this.permissions.audio === 'NOT_REQUESTED') {\n await this.#localMediaUtils.repopulateAvailableDevices();\n }\n\n // Force update audio devices on iOS after audio session is active\n // This ensures route change notifications start firing\n InCallManger.forceUpdateAudioDevices();\n\n this.emit('DEVICE_CHANGE', {\n device: this.currentDevices.audio,\n });\n }\n\n private onVisibilityChange() {\n // pass\n }\n\n public async setupVideoStream(\n deviceId?: string,\n forceStopTrack: boolean = false\n ) {\n const videoDevices = this.#localMediaUtils.getVideoDevices();\n if (!videoDevices.length) {\n return;\n }\n\n let videoDeviceId = deviceId;\n if (!videoDeviceId) {\n videoDeviceId = (await this.getOperationalWebcamDeviceId()).deviceId;\n }\n\n if (this.currentDevices.video?.deviceId !== videoDeviceId) {\n this.currentDevices.video = this.#localMediaUtils.getDeviceById(\n videoDeviceId,\n 'videoinput'\n );\n }\n\n /**\n * NOTE(roerohan): this.videoEnabled is checked, so that upon device change,\n * the video track is not set when the user has turned off his camera.\n */\n if (this.videoEnabled) {\n const videoConstraints = LocalMediaUtils.getVideoConstraints({\n videoDeviceId,\n });\n if (!this.rawVideoTrack) {\n try {\n this.rawVideoTrack = await LocalMediaUtils.getVideoTrack(\n videoConstraints\n );\n } catch (err) {\n console.warn('Failed to acquire video track: ', err);\n this.rawVideoTrack = undefined;\n }\n }\n this.setVideoTrack(this.rawVideoTrack);\n this.addMediaStreamTrackListeners(this.rawVideoTrack);\n this.emit('VIDEO_TRACK_CHANGE');\n }\n\n if (forceStopTrack) {\n this.videoTrack?.stop();\n this.rawVideoTrack?.stop();\n }\n /**\n * NOTE(roerohan): Firefox does not show device labels until permissions are granted.\n * So, we need to repopulate the devices once permission is granted.\n */\n if (this.videoTrack && this.permissions.video === 'NOT_REQUESTED') {\n await this.#localMediaUtils.repopulateAvailableDevices();\n }\n this.emit('DEVICE_CHANGE', {\n device: this.currentDevices.video,\n });\n }\n\n public async setupSpeaker(deviceId?: string) {\n const speakerDevices = this.#localMediaUtils.getSpeakerDevices();\n if (!speakerDevices.length) {\n return;\n }\n\n let speakerDeviceId: string;\n\n if (deviceId) {\n // If explicit deviceId provided, use it\n speakerDeviceId = deviceId;\n } else {\n // Prefer current device if it's still available\n const currentDeviceStillAvailable = speakerDevices.find(\n (d) => d.deviceId === this.currentDevices.speaker?.deviceId\n );\n\n if (currentDeviceStillAvailable) {\n // Keep current device if it's still connected\n speakerDeviceId = this.currentDevices.speaker.deviceId;\n } else {\n // Otherwise, prefer Bluetooth > Wired > Speaker > Earpiece\n const bluetoothDevice = speakerDevices.find(\n (d) => d.deviceId === 'bluetooth'\n );\n const wiredDevice = speakerDevices.find((d) => d.deviceId === 'wired');\n const speakerDevice = speakerDevices.find(\n (d) => d.deviceId === 'speaker'\n );\n\n speakerDeviceId =\n bluetoothDevice?.deviceId ??\n wiredDevice?.deviceId ??\n speakerDevice?.deviceId ??\n speakerDevices[0].deviceId;\n }\n }\n\n if (this.currentDevices.speaker?.deviceId !== speakerDeviceId) {\n // Audio Input devices are same as output devices in mobile\n this.currentDevices.audio = this.#localMediaUtils.getDeviceById(\n speakerDeviceId,\n 'audioinput'\n );\n this.currentDevices.speaker = this.currentDevices.audio;\n }\n await this.setDevice(this.currentDevices.audio);\n this.emit('DEVICE_CHANGE', {\n device: this.currentDevices.speaker,\n });\n }\n\n public async getOperationalWebcamDeviceId(): Promise<{\n isOperational: boolean;\n deviceId: string;\n }> {\n let videoDevices = this.#localMediaUtils.getVideoDevices();\n if (!videoDevices.length) {\n return { isOperational: false, deviceId: null };\n }\n\n /*\n NOTE(ravindra-dyte): Usually external devices come at the bottom,\n By reversing the deviceList and breaking on first operational device\n We are giving preference to external device\n */\n\n videoDevices = [...videoDevices].reverse();\n\n let operationalDeviceId = null;\n for (\n let deviceIndex = 0;\n deviceIndex < videoDevices.length;\n deviceIndex += 1\n ) {\n try {\n operationalDeviceId = videoDevices[deviceIndex].deviceId;\n break;\n } catch (err) {}\n }\n\n return operationalDeviceId\n ? { isOperational: true, deviceId: operationalDeviceId }\n : { isOperational: false, deviceId: videoDevices[0].deviceId };\n }\n\n public async getOperationalMicDeviceId(): Promise<{\n isOperational: boolean;\n deviceId: string;\n }> {\n let audioDevices = this.#localMediaUtils.getAudioDevices();\n if (!audioDevices.length) {\n return { isOperational: false, deviceId: null };\n }\n /*\n NOTE(ravindra-dyte): Usually external devices come at the bottom,\n By reversing the deviceList and breaking on first operational device\n We are giving preference to external device\n */\n\n audioDevices = [...audioDevices].reverse();\n let operationalDeviceId = null;\n\n for (\n let deviceIndex = 0;\n deviceIndex < audioDevices.length;\n deviceIndex += 1\n ) {\n try {\n const audioTrack = await LocalMediaUtils.getAudioTrack();\n\n const isSilent = await checkIfAudioTrackIsSilent(audioTrack);\n audioTrack.stop();\n audioTrack.release();\n if (!isSilent) {\n operationalDeviceId = audioDevices[deviceIndex].deviceId;\n break;\n }\n } catch (err) {\n console.warn('Failed to acquire audio track: ', err);\n }\n }\n\n return operationalDeviceId\n ? { isOperational: true, deviceId: operationalDeviceId }\n : { isOperational: false, deviceId: audioDevices[0].deviceId };\n }\n\n public async setupStreams({\n audio,\n video,\n }: {\n audio: boolean;\n video: boolean;\n }) {\n try {\n const permResult = await setupPermissions(audio, video);\n this.permissions.video = permResult.camera;\n this.permissions.audio = permResult.microphone;\n } catch (val) {\n this.permissions.video = val.camera ?? false;\n this.permissions.audio = val.microphone ?? false;\n }\n this.emit('MEDIA_PERMISSION_UPDATE', {\n kind: 'audio',\n message: this.permissions.audio,\n });\n\n this.emit('MEDIA_PERMISSION_UPDATE', {\n kind: 'video',\n message: this.permissions.video,\n });\n const constraints: RealtimeKitMediaStreamConstraints = {};\n if (!this.currentDevices) {\n this.currentDevices = {\n audio: undefined,\n video: undefined,\n speaker: undefined,\n };\n }\n if (audio) {\n const audioDevices = this.#localMediaUtils.getAudioDevices();\n if (audioDevices.length !== 0) {\n const audioDeviceId = (await this.getOperationalMicDeviceId()).deviceId;\n this.currentDevices.audio = this.#localMediaUtils.getDeviceById(\n audioDeviceId,\n 'audioinput'\n );\n constraints.audio = true;\n }\n }\n\n if (video) {\n const videoDevices = this.#localMediaUtils.getVideoDevices();\n if (videoDevices.length !== 0) {\n const videoDeviceId = (await this.getOperationalWebcamDeviceId())\n .deviceId;\n this.currentDevices.video = this.#localMediaUtils.getDeviceById(\n videoDeviceId,\n 'videoinput'\n );\n\n const videoConstraints = LocalMediaUtils.getVideoConstraints({\n videoDeviceId,\n });\n constraints.video = videoConstraints.video;\n }\n }\n\n if (audio) await this.setupAudioStream();\n if (video) await this.setupVideoStream();\n\n if (this.audioTrack) this.audioEnabled = true;\n else this.audioEnabled = false;\n\n if (this.videoTrack) this.videoEnabled = true;\n else this.videoEnabled = false;\n\n this.screenShareEnabled = false;\n\n // Setting default audio output to speaker\n await this.setupSpeaker();\n\n // Setup Foreground Service after handling permissions\n if (Platform.OS === 'android') {\n this.#appStateSubscription = AppState.addEventListener(\n 'change',\n this._handleAppStateChange\n );\n }\n }\n\n private stopScreenShareTracks(\n tracks: { audio?: boolean; video?: boolean } = {}\n ) {\n const { audio = true, video = true } = tracks;\n if (audio) {\n this.screenShareTracks?.audio?.stop();\n }\n\n if (video) {\n this.screenShareTracks?.video?.stop();\n }\n\n if (audio && video) {\n this.screenShareEnabled = false;\n }\n }\n\n public removeScreenShareTracks(tracks?: {\n audio?: boolean;\n video?: boolean;\n }) {\n this.screenShareTracks.video?.removeEventListener(\n 'ended',\n this.onScreenShareEnded\n );\n this.stopScreenShareTracks(tracks);\n this.screenShareTracks = {\n audio: undefined,\n video: undefined,\n };\n }\n\n private setAudioTrack(audioTrack: MediaStreamTrack) {\n if (audioTrack === this.audioTrack) {\n return;\n }\n\n if (audioTrack === undefined) {\n this.stopAudioTrack();\n }\n\n this.audioTrack = audioTrack;\n }\n\n private setVideoTrack(videoTrack: MediaStreamTrack) {\n if (videoTrack === this.videoTrack) {\n return;\n }\n\n if (videoTrack === undefined) {\n this.stopVideoTrack();\n }\n\n this.videoTrack = videoTrack;\n }\n\n private setScreenShareTracks(tracks: {\n audio?: MediaStreamTrack;\n video?: MediaStreamTrack;\n }) {\n const { audio, video } = tracks;\n if (!audio || !video) {\n this.stopScreenShareTracks({ audio: !!audio, video: !!video });\n }\n\n this.screenShareTracks = tracks;\n this.screenShareTracks.video?.addEventListener(\n 'ended',\n this.onScreenShareEnded.bind(this)\n );\n }\n\n private onScreenShareEnded() {\n this.emit('SCREENSHARE_ENDED');\n }\n\n public async disableAudio() {\n await this.toggleAudio();\n }\n\n public async enableAudio() {\n await this.toggleAudio();\n }\n\n public async toggleAudio() {\n if (this.permissions.audio !== 'ACCEPTED') {\n try {\n const permResult = await setupPermissions(true, false);\n this.permissions.audio = permResult.microphone;\n } catch (val) {\n this.permissions.audio = val.microphone ?? false;\n }\n }\n this.emit('MEDIA_PERMISSION_UPDATE', {\n kind: 'audio',\n message: this.permissions.audio,\n });\n if (\n this.permissions.audio === 'DENIED' ||\n this.permissions.audio === 'NOT_REQUESTED'\n ) {\n this.audioEnabled = false;\n return;\n }\n if (this.audioEnabled) {\n this.audioEnabled = false;\n\n if (this.audioTrack) {\n this.audioTrack.enabled = this.audioEnabled;\n }\n return;\n }\n try {\n /**\n * NOTE (@madhugb): We need to setup new stream,\n * if the audio track is not preset or it has ended\n */\n if (!this.audioTrack || this.audioTrack.readyState === 'ended') {\n await this.setupAudioStream(this.currentDevices.audio?.deviceId);\n }\n // if we still can't get a track after setting up audio stream\n // do not toggle the audio state\n if (!this.audioTrack) {\n this.audioEnabled = false;\n return;\n }\n this.audioEnabled = true;\n } catch (ex) {\n this.audioEnabled = false;\n this.audioTrack = undefined;\n this.rawAudioTrack = undefined;\n }\n if (this.audioTrack) {\n this.audioTrack.enabled = true;\n }\n }\n\n public async enableVideo() {\n await this.toggleVideo();\n }\n\n public async disableVideo() {\n await this.toggleVideo();\n }\n\n public async toggleVideo() {\n if (this.permissions.video !== 'ACCEPTED') {\n try {\n const permResult = await setupPermissions(false, true);\n this.permissions.video = permResult.camera;\n } catch (val) {\n this.permissions.video = val.camera ?? false;\n }\n }\n this.emit('MEDIA_PERMISSION_UPDATE', {\n kind: 'video',\n message: this.permissions.video,\n });\n if (\n this.permissions.video === 'DENIED' ||\n this.permissions.video === 'NOT_REQUESTED'\n ) {\n this.videoEnabled = false;\n return;\n }\n if (this.videoEnabled) {\n this.stopVideoTrack();\n this.videoEnabled = false;\n return;\n }\n /**\n * NOTE(roerohan): The videoEnabled flag is used inside the setupVideoStream method\n * hence it must be set to true first.\n */\n this.videoEnabled = true;\n await this.setupVideoStream(this.currentDevices.video?.deviceId);\n }\n\n public async setAudioDevice(device: MediaDeviceInfo) {\n await this.setupAudioStream(device.deviceId);\n }\n\n public async setVideoDevice(device: MediaDeviceInfo) {\n if (this.videoEnabled) {\n this.stopVideoTrack();\n }\n await this.setupVideoStream(device.deviceId);\n }\n\n public async setSpeakerDevice(device?: MediaDeviceInfo) {\n await this.setupSpeaker(device.deviceId);\n }\n\n public async setDevice(route: MediaDeviceInfo) {\n await this.#localMediaUtils.chooseAudioRoute(route.deviceId);\n }\n\n private async oniOSBroadcastStart() {\n this.setScreenShareTracks(await LocalMediaUtils.getScreenShareTracks());\n this.screenShareEnabled = true;\n this.emit('SCREENSHARE_TRACK_CHANGE');\n }\n\n private async oniOSBroadcastStop() {\n if (this.screenShareEnabled) {\n this.removeScreenShareTracks();\n this.emit('SCREENSHARE_TRACK_CHANGE');\n return;\n }\n }\n\n public async toggleScreenShare() {\n if (this.screenShareEnabled && Platform.OS !== 'ios') {\n this.removeScreenShareTracks();\n try {\n const val = await RTKHelper.isForegroundServiceRunning();\n if (val) {\n await RTKHelper.stopService();\n }\n } catch (e) {\n console.warn('Failed to stop foreground service', e);\n }\n return;\n }\n if (Platform.OS === 'ios' && this.screenShareEnabled) {\n NativeModules.RTKScreensharePickerView.showScreenSharePickerView();\n return;\n }\n\n if (Platform.OS === 'android') {\n this._pendingScreenShare = true;\n await this.configureForeground();\n try {\n this.setScreenShareTracks(await LocalMediaUtils.getScreenShareTracks());\n this.screenShareEnabled = true;\n } catch (e) {\n console.warn('Failed to start screenshare', e);\n this.screenShareEnabled = false;\n const val = await RTKHelper.isForegroundServiceRunning();\n if (val) {\n await RTKHelper.stopService();\n }\n this._pendingScreenShare = false;\n } finally {\n this._pendingScreenShare = false;\n }\n }\n if (Platform.OS === 'ios') {\n NativeModules.RTKScreensharePickerView.showScreenSharePickerView();\n }\n }\n\n public async enableScreenShare() {\n await this.toggleScreenShare();\n }\n\n public async disableScreenShare() {\n await this.toggleScreenShare();\n }\n\n public getAllDevices() {\n return this.#localMediaUtils.availableDevices;\n }\n\n public getCurrentDevices() {\n return this.currentDevices;\n }\n\n public getDeviceById(\n deviceId: string,\n kind: 'audioinput' | 'audiooutput' | 'videoinput'\n ) {\n return this.#localMediaUtils.getDeviceById(deviceId, kind);\n }\n\n public getAudioDevices() {\n return this.#localMediaUtils.getAudioDevices();\n }\n\n public getVideoDevices() {\n return this.#localMediaUtils.getVideoDevices();\n }\n\n public getSpeakerDevices() {\n return this.#localMediaUtils.getSpeakerDevices();\n }\n\n public async onDeviceChange(\n changedDevices: {\n added: MediaDeviceInfo[];\n removed: MediaDeviceInfo[];\n selectedDevice?: string;\n },\n forceDeviceChange: boolean\n ) {\n let addedDevice: MediaDeviceInfo;\n let removedDevice: MediaDeviceInfo;\n if (changedDevices.added.length) [addedDevice] = changedDevices.added;\n\n if (changedDevices.removed.length) [removedDevice] = changedDevices.removed;\n\n // Update currentDevices.speaker when platform reports selected device change\n if (changedDevices.selectedDevice) {\n const selectedDeviceInfo = this.#localMediaUtils.getDeviceById(\n changedDevices.selectedDevice,\n 'audioinput'\n );\n\n if (selectedDeviceInfo) {\n this.currentDevices.speaker = selectedDeviceInfo;\n this.currentDevices.audio = selectedDeviceInfo;\n }\n }\n\n /**\n * NOTE(roerohan): forceStopTrack is set required to be set to true for firefox.\n * https://stackoverflow.com/questions/59068146/navigator-mediadevices-getusermedia-api-rejecting-with-error-notreadableerror\n * forceStopTrack is the second argument of setupAudioStream and setupVideoStream.\n */\n if (addedDevice) {\n // Clear any pending device removal timeout when a device is added\n if (this.#deviceRemovalTimeout) {\n clearTimeout(this.#deviceRemovalTimeout);\n this.#deviceRemovalTimeout = null;\n }\n\n if (addedDevice.kind === 'audioinput') {\n if (\n this.permissions.audio === 'DENIED' ||\n this.permissions.audio === 'NOT_REQUESTED'\n ) {\n await this.setupSpeaker(addedDevice.deviceId);\n } else {\n await this.setupAudioStream(addedDevice.deviceId);\n }\n } else if (addedDevice.kind === 'videoinput') {\n await this.setupVideoStream(addedDevice.deviceId);\n } else if (addedDevice.kind === 'audiooutput') {\n await this.setupSpeaker(addedDevice.deviceId);\n }\n this.emit('AUDIO_TRACK_CHANGE');\n }\n\n // Only handle device removal if no device was added\n // This prevents switching away from newly connected devices (e.g., Bluetooth)\n if (removedDevice && !addedDevice) {\n // For Bluetooth devices, add a delay to handle rapid reconnections\n // (e.g., when AirPods are put in ears, they briefly disconnect then reconnect)\n const isBluetoothRemoved = removedDevice.deviceId === 'bluetooth';\n\n const handleRemoval = async () => {\n if (removedDevice.kind === 'audioinput') {\n if (\n this.permissions.audio === 'DENIED' ||\n this.permissions.audio === 'NOT_REQUESTED'\n ) {\n await this.setupSpeaker();\n } else {\n await this.setupAudioStream();\n }\n } else if (removedDevice.kind === 'videoinput') {\n await this.setupVideoStream();\n } else if (removedDevice.kind === 'audiooutput') {\n await this.setupSpeaker();\n }\n this.emit('AUDIO_TRACK_CHANGE');\n };\n\n if (isBluetoothRemoved) {\n // Wait 500ms before switching away from Bluetooth to allow for reconnection\n this.#deviceRemovalTimeout = setTimeout(handleRemoval, 500);\n } else {\n // For other devices, handle removal immediately\n await handleRemoval();\n }\n }\n\n // Emit DEVICE_LIST_UPDATED if:\n // 1. Devices were added or removed, OR\n // 2. Selected device changed (platform routed to a different device)\n const hasDeviceListChanged =\n changedDevices.added.length || changedDevices.removed.length;\n const hasSelectedDeviceInfo = changedDevices.selectedDevice !== undefined;\n\n if (hasDeviceListChanged || hasSelectedDeviceInfo) {\n this.emit('DEVICE_LIST_UPDATED', changedDevices);\n }\n }\n\n public static async init(_) {\n const localMediaUtils = await LocalMediaUtils.init();\n return new LocalMediaHandler(localMediaUtils);\n }\n\n public emit(event: keyof typeof MediaEvents, ...args: any[]) {\n return super.emit(event, ...args);\n }\n\n public on(\n event: keyof typeof MediaEvents,\n listener: (...args: any[]) => void\n ) {\n return super.on(event, listener);\n }\n\n public destruct() {\n // TODO: Do not remove native broadcast listeners when going OFF_STAGE in webinar\n // this.#localMediaUtils.destruct();\n if (Platform.OS === 'android') this.#appStateSubscription.remove();\n BackgroundTimer.stop();\n try {\n if (Platform.OS === 'android') RTKHelper.stopService();\n } catch (_err) {}\n // InCallManger.stop(undefined);\n }\n\n private stopAudioTrack() {\n this.rawAudioTrack?.stop();\n this.audioTrack?.stop();\n this.rawAudioTrack?.release();\n this.audioTrack?.release();\n this.audioEnabled = false;\n this.audioTrack = undefined;\n this.rawAudioTrack = undefined;\n }\n\n private stopVideoTrack() {\n this.rawVideoTrack?.stop();\n this.videoTrack?.stop();\n this.rawVideoTrack?.release();\n this.videoTrack?.release();\n this.videoTrack = undefined;\n this.rawVideoTrack = undefined;\n }\n}\n\nexport interface RNLocalMediaHandler {\n new (): LocalMediaHandler;\n}\n"],"mappings":"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","ignoreList":[]}
@@ -49,10 +49,12 @@ export const VIDEO_CONSTRAINTS = {
49
49
  */
50
50
  var _availableDevices = /*#__PURE__*/new WeakMap();
51
51
  var _nativeEventEmitter = /*#__PURE__*/new WeakMap();
52
+ var _previouslySelectedDevice = /*#__PURE__*/new WeakMap();
52
53
  export default class LocalMediaUtils {
53
54
  constructor(availableDevices) {
54
55
  _classPrivateFieldInitSpec(this, _availableDevices, void 0);
55
56
  _classPrivateFieldInitSpec(this, _nativeEventEmitter, void 0);
57
+ _classPrivateFieldInitSpec(this, _previouslySelectedDevice, null);
56
58
  _classPrivateFieldSet(_availableDevices, this, availableDevices);
57
59
  _classPrivateFieldSet(_nativeEventEmitter, this, new NativeEventEmitter(NativeModules.InCallManager));
58
60
  }
@@ -207,18 +209,47 @@ export default class LocalMediaUtils {
207
209
  const checkDeviceId = _id => {
208
210
  if (_id.toLowerCase().includes('speaker')) return 'speaker';else return _id;
209
211
  };
212
+
213
+ // Extract selected device from event
214
+ const selectedDevice = deviceData.selectedAudioDevice;
215
+ const hasSelectedDeviceChanged = selectedDevice && _classPrivateFieldGet(_previouslySelectedDevice, this) !== null && selectedDevice !== _classPrivateFieldGet(_previouslySelectedDevice, this);
216
+
217
+ // On first event, we need to initialize previouslySelectedDevice and fire callback
218
+ const isFirstDeviceEvent = selectedDevice && _classPrivateFieldGet(_previouslySelectedDevice, this) === null;
219
+
220
+ // Update previouslySelectedDevice IMMEDIATELY after detection to avoid race conditions
221
+ // This must happen BEFORE any async operations
222
+ if (selectedDevice) {
223
+ _classPrivateFieldSet(_previouslySelectedDevice, this, selectedDevice);
224
+ }
210
225
  const previouslyAvailableDevices = _classPrivateFieldGet(_availableDevices, this).filter(device => device.kind === 'audioinput' || device.kind === 'audiooutput');
211
226
  const previouslyAvailableDeviceIds = previouslyAvailableDevices.map(device => checkDeviceId(device.deviceId));
227
+
228
+ // Parse available device list from event to detect list changes
229
+ let availableDeviceListFromEvent = [];
212
230
  const len = deviceData.availableAudioDeviceList.length;
231
+ if (typeof deviceData.availableAudioDeviceList === 'string') {
232
+ try {
233
+ availableDeviceListFromEvent = JSON.parse(deviceData.availableAudioDeviceList);
234
+ } catch (e) {
235
+ // If parsing fails, fall back to empty array
236
+ availableDeviceListFromEvent = [];
237
+ }
238
+ }
213
239
  if (len === 0) {
214
240
  const currentlyAvailableDevices = await LocalMediaUtils.enumerateAudioDevices();
215
241
  const currentlyAvailableDeviceIds = currentlyAvailableDevices.map(device => checkDeviceId(device.deviceId));
216
242
  const changedDevices = {
217
243
  added: currentlyAvailableDevices.filter(device => !previouslyAvailableDeviceIds.includes(checkDeviceId(device.deviceId))),
218
- removed: previouslyAvailableDevices.filter(device => !currentlyAvailableDeviceIds.includes(device.deviceId))
244
+ removed: previouslyAvailableDevices.filter(device => !currentlyAvailableDeviceIds.includes(device.deviceId)),
245
+ selectedDevice: selectedDevice
219
246
  };
247
+
248
+ // Check if available device list changed
249
+ const hasAvailableListChanged = availableDeviceListFromEvent.length > 0 && (availableDeviceListFromEvent.length !== previouslyAvailableDeviceIds.length || !availableDeviceListFromEvent.every(device => previouslyAvailableDeviceIds.includes(device)));
220
250
  this.repopulateAvailableDevices().then(() => {
221
- if (changedDevices.added.length || changedDevices.removed.length) {
251
+ const shouldFireCallback = changedDevices.added.length || changedDevices.removed.length || hasSelectedDeviceChanged || isFirstDeviceEvent || hasAvailableListChanged;
252
+ if (shouldFireCallback) {
222
253
  callback(changedDevices, false);
223
254
  }
224
255
  });
@@ -228,10 +259,15 @@ export default class LocalMediaUtils {
228
259
  const availableAudioDevices = await LocalMediaUtils.enumerateAudioDevices();
229
260
  const changedDevices = {
230
261
  added: availableAudioDevices.filter(device => !previouslyAvailableDeviceIds.includes(checkDeviceId(device.deviceId))),
231
- removed: previouslyAvailableDevices.filter(device => !currentlyAvailableDeviceIds.includes(device.deviceId))
262
+ removed: previouslyAvailableDevices.filter(device => !currentlyAvailableDeviceIds.includes(device.deviceId)),
263
+ selectedDevice: selectedDevice
232
264
  };
265
+
266
+ // Check if available device list changed
267
+ const hasAvailableListChanged = availableDeviceListFromEvent.length > 0 && (availableDeviceListFromEvent.length !== previouslyAvailableDeviceIds.length || !availableDeviceListFromEvent.every(device => previouslyAvailableDeviceIds.includes(device)));
233
268
  this.repopulateAvailableDevices().then(() => {
234
- if (changedDevices.added.length || changedDevices.removed.length) {
269
+ const shouldFireCallback = changedDevices.added.length || changedDevices.removed.length || hasSelectedDeviceChanged || isFirstDeviceEvent || hasAvailableListChanged;
270
+ if (shouldFireCallback) {
235
271
  callback(changedDevices, false);
236
272
  }
237
273
  });
@@ -256,7 +292,26 @@ export default class LocalMediaUtils {
256
292
  return _classPrivateFieldGet(_availableDevices, this).filter(device => device.kind === kind);
257
293
  }
258
294
  getDeviceById(deviceId, kind) {
259
- return _classPrivateFieldGet(_availableDevices, this).find(device => device.deviceId === deviceId && device.kind === kind);
295
+ const normalizedDeviceId = deviceId.toLowerCase();
296
+ return _classPrivateFieldGet(_availableDevices, this).find(device => {
297
+ if (device.kind !== kind) return false;
298
+ const deviceIdLower = device.deviceId.toLowerCase();
299
+
300
+ // Exact match first
301
+ if (device.deviceId === deviceId) return true;
302
+
303
+ // iOS special cases
304
+ if (normalizedDeviceId === 'speaker' && deviceIdLower.includes('speaker')) {
305
+ return true;
306
+ }
307
+ if (normalizedDeviceId === 'bluetooth' && deviceIdLower.includes('bluetooth')) {
308
+ return true;
309
+ }
310
+ if (normalizedDeviceId === 'earpiece' && deviceIdLower.includes('earpiece')) {
311
+ return true;
312
+ }
313
+ return false;
314
+ });
260
315
  }
261
316
 
262
317
  /**
@@ -1 +1 @@
1
- {"version":3,"names":["NativeEventEmitter","NativeModules","LogBox","mediaDevices","LocalMediaError","NativeAudioManager","ignoreLogs","VIDEO_CONSTRAINTS","qvga","width","ideal","height","vga","hd","hd_cropped","_availableDevices","WeakMap","_nativeEventEmitter","LocalMediaUtils","constructor","availableDevices","_classPrivateFieldInitSpec","_classPrivateFieldSet","InCallManager","init","availableVideoDevices","enumerateVideoDevices","availableAudioDevices","enumerateAudioDevices","concat","destruct","_classPrivateFieldGet","removeAllListeners","isDeviceListAvailable","deviceMem","videoDevices","enumerateDevices","filter","d","kind","facing","error","audioDevices","earpiece","connected","haveMic","speaker","bluetooth","wired","isWiredHeadphonesConnected","getIsWiredHeadsetPluggedIn","isBluetoothHeadsetConnected","resp","Object","keys","map","audioDevice","audioDeviceProps","deviceId","label","getVideoConstraints","options","constraints","videoDeviceId","videoTrackConstraints","facingMode","frameRate","max","video","getUserMediaWithTimeout","timeout","getUserMedia","Promise","race","_resolve","reject","setTimeout","err","getAudioTrack","mediaStream","audio","getAudioTracks","getVideoTrack","getVideoTracks","getScreenShareTracks","stream","getDisplayMedia","getAudioAndVideoTrack","audioTrack","videoTrack","onDeviceChange","callback","onChange","deviceData","checkDeviceId","_id","toLowerCase","includes","previouslyAvailableDevices","device","previouslyAvailableDeviceIds","len","availableAudioDeviceList","length","currentlyAvailableDevices","currentlyAvailableDeviceIds","changedDevices","added","removed","repopulateAvailableDevices","then","listenerCount","addListener","chooseAudioRoute","route","getAvailableDevicesByKind","getDeviceById","find","getAudioDevices","getVideoDevices","getSpeakerDevices","speakerDevices"],"sources":["LocalMediaUtils.ts"],"sourcesContent":["import { NativeEventEmitter, NativeModules, LogBox } from 'react-native';\nimport { mediaDevices, MediaStream } from '@cloudflare/react-native-webrtc';\nimport LocalMediaError from './LocalMediaError';\nimport {\n ConstrainDouble,\n RealtimeKitMediaStreamConstraints,\n RealtimeKitMediaTrackConstraints,\n MediaDeviceInfo,\n} from './LocalMediaInterfaces';\nimport NativeAudioManager from './NativeAudioManager';\nLogBox.ignoreLogs(['new NativeEventEmitter']);\nexport interface LocalAudioOptions {\n // Disables all audio processing\n disableAP?: boolean;\n\n // Disables Acoustic Echo Cancellation\n disableAEC?: boolean;\n\n // Disables Noise Suppression\n disableNS?: boolean;\n\n // Disables Automatic Gain Control\n disableAGC?: boolean;\n\n // Disables Highpass Filter\n disableHPF?: boolean;\n}\n\nexport const VIDEO_CONSTRAINTS = {\n qvga: { width: { ideal: 320 }, height: { ideal: 240 } },\n vga: { width: { ideal: 640 }, height: { ideal: 480 } },\n hd: { width: { ideal: 1280 }, height: { ideal: 720 } },\n hd_cropped: { width: { ideal: 900 }, height: { ideal: 720 } },\n};\n\n/**\n * To initialize an instance of this class, use the\n * `.init()` static method.\n */\nexport default class LocalMediaUtils {\n #availableDevices: MediaDeviceInfo[];\n\n #nativeEventEmitter: NativeEventEmitter;\n\n private constructor(availableDevices: MediaDeviceInfo[]) {\n this.#availableDevices = availableDevices;\n this.#nativeEventEmitter = new NativeEventEmitter(\n NativeModules.InCallManager\n );\n }\n\n public static async init() {\n const availableVideoDevices = await LocalMediaUtils.enumerateVideoDevices();\n const availableAudioDevices = await LocalMediaUtils.enumerateAudioDevices();\n return new LocalMediaUtils(\n availableAudioDevices.concat(availableVideoDevices)\n );\n }\n\n public async destruct() {\n this.#nativeEventEmitter.removeAllListeners('onAudioDeviceChanged');\n }\n\n public static isDeviceListAvailable() {\n return true;\n }\n\n private static async enumerateVideoDevices(): Promise<MediaDeviceInfo[]> {\n try {\n const deviceMem = {};\n const videoDevices =\n (await mediaDevices.enumerateDevices()) as MediaDeviceInfo[];\n return videoDevices.filter((d) => {\n if (d.kind === 'videoinput' && !deviceMem[d.facing]) {\n deviceMem[d.facing] = true;\n return d;\n }\n return false;\n });\n } catch (error) {\n return [];\n }\n }\n\n private static async enumerateAudioDevices(): Promise<MediaDeviceInfo[]> {\n let audioDevices = {\n earpiece: {\n connected: true,\n haveMic: true,\n },\n speaker: {\n connected: true,\n haveMic: true,\n },\n bluetooth: {\n connected: false,\n haveMic: false,\n },\n wired: {\n connected: false,\n haveMic: false,\n },\n };\n const isWiredHeadphonesConnected =\n await NativeAudioManager.getIsWiredHeadsetPluggedIn();\n audioDevices.wired = isWiredHeadphonesConnected\n ? {\n connected: true,\n haveMic: true,\n }\n : {\n connected: false,\n haveMic: false,\n };\n const isBluetoothHeadsetConnected =\n await NativeAudioManager.isBluetoothHeadsetConnected();\n audioDevices.bluetooth = isBluetoothHeadsetConnected\n ? {\n connected: true,\n haveMic: true,\n }\n : {\n connected: false,\n haveMic: false,\n };\n const resp = Object.keys(audioDevices)\n .map((audioDevice) => {\n const audioDeviceProps = audioDevices[audioDevice];\n return {\n ...audioDeviceProps,\n deviceId: audioDevice,\n label: audioDevice,\n kind: 'audioinput',\n };\n })\n .filter((audioDevice) => audioDevice.connected);\n return resp as MediaDeviceInfo[];\n }\n\n public static getVideoConstraints(options?: {\n videoDeviceId?: string;\n videoTrackConstraints?: boolean | RealtimeKitMediaTrackConstraints;\n facingMode?: string;\n frameRate?: ConstrainDouble;\n }) {\n const constraints: RealtimeKitMediaStreamConstraints = {};\n const {\n videoDeviceId,\n videoTrackConstraints,\n facingMode = 'user',\n frameRate = { ideal: 24, max: 30 },\n } = options;\n\n constraints.video = videoTrackConstraints || VIDEO_CONSTRAINTS.vga;\n if (typeof constraints.video === 'boolean') {\n return constraints;\n }\n\n constraints.video.deviceId = videoDeviceId;\n constraints.video.facingMode = facingMode;\n constraints.video.frameRate = frameRate;\n return constraints;\n }\n\n private static async getUserMediaWithTimeout(\n constraints: RealtimeKitMediaStreamConstraints = {},\n timeout: number = 0\n ) {\n try {\n if (!timeout) {\n return await mediaDevices.getUserMedia(constraints);\n }\n\n // NOTE(roerohan): The await is required to catch errors (if any).\n return Promise.race<Promise<unknown>>([\n mediaDevices.getUserMedia(constraints),\n\n new Promise<MediaStream>((_resolve, reject) => {\n setTimeout(\n () =>\n reject(\n new LocalMediaError(\n 'Get user media timed out',\n 'ERR_GUM_TIMEOUT'\n )\n ),\n timeout\n );\n }),\n ]);\n } catch (err) {\n throw err;\n }\n }\n\n public static async getAudioTrack() {\n const mediaStream = (await LocalMediaUtils.getUserMediaWithTimeout({\n audio: true,\n timeout: 5000,\n })) as MediaStream;\n return mediaStream.getAudioTracks()[0];\n }\n\n public static async getVideoTrack(\n constraints: RealtimeKitMediaStreamConstraints\n ) {\n const mediaStream = (await LocalMediaUtils.getUserMediaWithTimeout({\n ...constraints,\n timeout: 5000,\n })) as MediaStream;\n return mediaStream.getVideoTracks()[0];\n }\n\n public static async getScreenShareTracks() {\n /**\n * getDisplayMedia is not defined on type MediaDevices.\n * Need to update this when a fix\n * is made: https://github.com/microsoft/TypeScript/issues/33232\n */\n const stream: MediaStream =\n (await mediaDevices.getDisplayMedia()) as MediaStream;\n return {\n video: stream.getVideoTracks()[0],\n audio: stream.getAudioTracks()[0],\n };\n }\n\n public static async getAudioAndVideoTrack(\n constraints: RealtimeKitMediaStreamConstraints\n ) {\n try {\n const mediaStream = (await LocalMediaUtils.getUserMediaWithTimeout({\n ...constraints,\n timeout: 5000,\n })) as MediaStream;\n return {\n audioTrack: mediaStream.getAudioTracks()[0],\n videoTrack: mediaStream.getVideoTracks()[0],\n };\n } catch (err) {\n throw err;\n }\n }\n\n public onDeviceChange(\n callback: (\n changedDevices: {\n added: MediaDeviceInfo[];\n removed: MediaDeviceInfo[];\n },\n forceDeviceChange?: boolean\n ) => void\n ) {\n const onChange = async (deviceData) => {\n const checkDeviceId = (_id: string) => {\n if (_id.toLowerCase().includes('speaker')) return 'speaker';\n else return _id;\n };\n const previouslyAvailableDevices = this.#availableDevices.filter(\n (device) =>\n device.kind === 'audioinput' || device.kind === 'audiooutput'\n );\n const previouslyAvailableDeviceIds = previouslyAvailableDevices.map(\n (device) => checkDeviceId(device.deviceId)\n );\n const len = deviceData.availableAudioDeviceList.length;\n if (len === 0) {\n const currentlyAvailableDevices =\n await LocalMediaUtils.enumerateAudioDevices();\n const currentlyAvailableDeviceIds = currentlyAvailableDevices.map(\n (device) => checkDeviceId(device.deviceId)\n );\n\n const changedDevices = {\n added: currentlyAvailableDevices.filter(\n (device) =>\n !previouslyAvailableDeviceIds.includes(\n checkDeviceId(device.deviceId)\n )\n ),\n removed: previouslyAvailableDevices.filter(\n (device) => !currentlyAvailableDeviceIds.includes(device.deviceId)\n ),\n };\n this.repopulateAvailableDevices().then(() => {\n if (changedDevices.added.length || changedDevices.removed.length) {\n callback(changedDevices, false);\n }\n });\n } else {\n const currentlyAvailableDevices =\n await LocalMediaUtils.enumerateAudioDevices();\n const currentlyAvailableDeviceIds = currentlyAvailableDevices.map(\n (device) => checkDeviceId(device.deviceId)\n );\n const availableAudioDevices =\n await LocalMediaUtils.enumerateAudioDevices();\n\n const changedDevices = {\n added: availableAudioDevices.filter(\n (device) =>\n !previouslyAvailableDeviceIds.includes(\n checkDeviceId(device.deviceId)\n )\n ),\n removed: previouslyAvailableDevices.filter(\n (device) => !currentlyAvailableDeviceIds.includes(device.deviceId)\n ),\n };\n\n this.repopulateAvailableDevices().then(() => {\n if (changedDevices.added.length || changedDevices.removed.length) {\n callback(changedDevices, false);\n }\n });\n }\n };\n if (this.#nativeEventEmitter.listenerCount('onAudioDeviceChanged') === 0) {\n this.#nativeEventEmitter.addListener('onAudioDeviceChanged', onChange);\n }\n }\n\n public async repopulateAvailableDevices() {\n const videoDevices = await LocalMediaUtils.enumerateVideoDevices();\n const audioDevices = await LocalMediaUtils.enumerateAudioDevices();\n this.#availableDevices = videoDevices.concat(audioDevices);\n }\n\n public async chooseAudioRoute(route: String) {\n return await NativeAudioManager.chooseAudioRoute(route);\n }\n\n public get availableDevices() {\n return this.#availableDevices;\n }\n\n public getAvailableDevicesByKind(kind: string) {\n return this.#availableDevices.filter((device) => device.kind === kind);\n }\n\n public getDeviceById(\n deviceId: string,\n kind: 'audioinput' | 'audiooutput' | 'videoinput'\n ) {\n return this.#availableDevices.find(\n (device) => device.deviceId === deviceId && device.kind === kind\n );\n }\n\n /**\n * Returns all audio input devices (microphone devices).\n */\n public getAudioDevices() {\n return this.getAvailableDevicesByKind('audioinput');\n }\n\n /**\n * Returns all video input devices.\n */\n public getVideoDevices() {\n return this.getAvailableDevicesByKind('videoinput');\n }\n\n /**\n * Returns all audio output devices (speaker devices).\n */\n public getSpeakerDevices() {\n const speakerDevices = this.#availableDevices;\n // In Mobile, speaker devices are the same as audio input devices\n return speakerDevices\n .filter((device) => device.kind === 'audioinput')\n .map((device) => ({\n ...device,\n deviceId: device.deviceId,\n label: device.label,\n kind: 'audiooutput',\n }));\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["NativeEventEmitter","NativeModules","LogBox","mediaDevices","LocalMediaError","NativeAudioManager","ignoreLogs","VIDEO_CONSTRAINTS","qvga","width","ideal","height","vga","hd","hd_cropped","_availableDevices","WeakMap","_nativeEventEmitter","_previouslySelectedDevice","LocalMediaUtils","constructor","availableDevices","_classPrivateFieldInitSpec","_classPrivateFieldSet","InCallManager","init","availableVideoDevices","enumerateVideoDevices","availableAudioDevices","enumerateAudioDevices","concat","destruct","_classPrivateFieldGet","removeAllListeners","isDeviceListAvailable","deviceMem","videoDevices","enumerateDevices","filter","d","kind","facing","error","audioDevices","earpiece","connected","haveMic","speaker","bluetooth","wired","isWiredHeadphonesConnected","getIsWiredHeadsetPluggedIn","isBluetoothHeadsetConnected","resp","Object","keys","map","audioDevice","audioDeviceProps","deviceId","label","getVideoConstraints","options","constraints","videoDeviceId","videoTrackConstraints","facingMode","frameRate","max","video","getUserMediaWithTimeout","timeout","getUserMedia","Promise","race","_resolve","reject","setTimeout","err","getAudioTrack","mediaStream","audio","getAudioTracks","getVideoTrack","getVideoTracks","getScreenShareTracks","stream","getDisplayMedia","getAudioAndVideoTrack","audioTrack","videoTrack","onDeviceChange","callback","onChange","deviceData","checkDeviceId","_id","toLowerCase","includes","selectedDevice","selectedAudioDevice","hasSelectedDeviceChanged","isFirstDeviceEvent","previouslyAvailableDevices","device","previouslyAvailableDeviceIds","availableDeviceListFromEvent","len","availableAudioDeviceList","length","JSON","parse","e","currentlyAvailableDevices","currentlyAvailableDeviceIds","changedDevices","added","removed","hasAvailableListChanged","every","repopulateAvailableDevices","then","shouldFireCallback","listenerCount","addListener","chooseAudioRoute","route","getAvailableDevicesByKind","getDeviceById","normalizedDeviceId","find","deviceIdLower","getAudioDevices","getVideoDevices","getSpeakerDevices","speakerDevices"],"sources":["LocalMediaUtils.ts"],"sourcesContent":["import { NativeEventEmitter, NativeModules, LogBox } from 'react-native';\nimport { mediaDevices, MediaStream } from '@cloudflare/react-native-webrtc';\nimport LocalMediaError from './LocalMediaError';\nimport {\n ConstrainDouble,\n RealtimeKitMediaStreamConstraints,\n RealtimeKitMediaTrackConstraints,\n MediaDeviceInfo,\n} from './LocalMediaInterfaces';\nimport NativeAudioManager from './NativeAudioManager';\nLogBox.ignoreLogs(['new NativeEventEmitter']);\nexport interface LocalAudioOptions {\n // Disables all audio processing\n disableAP?: boolean;\n\n // Disables Acoustic Echo Cancellation\n disableAEC?: boolean;\n\n // Disables Noise Suppression\n disableNS?: boolean;\n\n // Disables Automatic Gain Control\n disableAGC?: boolean;\n\n // Disables Highpass Filter\n disableHPF?: boolean;\n}\n\nexport const VIDEO_CONSTRAINTS = {\n qvga: { width: { ideal: 320 }, height: { ideal: 240 } },\n vga: { width: { ideal: 640 }, height: { ideal: 480 } },\n hd: { width: { ideal: 1280 }, height: { ideal: 720 } },\n hd_cropped: { width: { ideal: 900 }, height: { ideal: 720 } },\n};\n\n/**\n * To initialize an instance of this class, use the\n * `.init()` static method.\n */\nexport default class LocalMediaUtils {\n #availableDevices: MediaDeviceInfo[];\n\n #nativeEventEmitter: NativeEventEmitter;\n\n #previouslySelectedDevice: string | null = null;\n\n private constructor(availableDevices: MediaDeviceInfo[]) {\n this.#availableDevices = availableDevices;\n this.#nativeEventEmitter = new NativeEventEmitter(\n NativeModules.InCallManager\n );\n }\n\n public static async init() {\n const availableVideoDevices = await LocalMediaUtils.enumerateVideoDevices();\n const availableAudioDevices = await LocalMediaUtils.enumerateAudioDevices();\n return new LocalMediaUtils(\n availableAudioDevices.concat(availableVideoDevices)\n );\n }\n\n public async destruct() {\n this.#nativeEventEmitter.removeAllListeners('onAudioDeviceChanged');\n }\n\n public static isDeviceListAvailable() {\n return true;\n }\n\n private static async enumerateVideoDevices(): Promise<MediaDeviceInfo[]> {\n try {\n const deviceMem = {};\n const videoDevices =\n (await mediaDevices.enumerateDevices()) as MediaDeviceInfo[];\n return videoDevices.filter((d) => {\n if (d.kind === 'videoinput' && !deviceMem[d.facing]) {\n deviceMem[d.facing] = true;\n return d;\n }\n return false;\n });\n } catch (error) {\n return [];\n }\n }\n\n private static async enumerateAudioDevices(): Promise<MediaDeviceInfo[]> {\n let audioDevices = {\n earpiece: {\n connected: true,\n haveMic: true,\n },\n speaker: {\n connected: true,\n haveMic: true,\n },\n bluetooth: {\n connected: false,\n haveMic: false,\n },\n wired: {\n connected: false,\n haveMic: false,\n },\n };\n const isWiredHeadphonesConnected =\n await NativeAudioManager.getIsWiredHeadsetPluggedIn();\n audioDevices.wired = isWiredHeadphonesConnected\n ? {\n connected: true,\n haveMic: true,\n }\n : {\n connected: false,\n haveMic: false,\n };\n const isBluetoothHeadsetConnected =\n await NativeAudioManager.isBluetoothHeadsetConnected();\n audioDevices.bluetooth = isBluetoothHeadsetConnected\n ? {\n connected: true,\n haveMic: true,\n }\n : {\n connected: false,\n haveMic: false,\n };\n const resp = Object.keys(audioDevices)\n .map((audioDevice) => {\n const audioDeviceProps = audioDevices[audioDevice];\n return {\n ...audioDeviceProps,\n deviceId: audioDevice,\n label: audioDevice,\n kind: 'audioinput',\n };\n })\n .filter((audioDevice) => audioDevice.connected);\n return resp as MediaDeviceInfo[];\n }\n\n public static getVideoConstraints(options?: {\n videoDeviceId?: string;\n videoTrackConstraints?: boolean | RealtimeKitMediaTrackConstraints;\n facingMode?: string;\n frameRate?: ConstrainDouble;\n }) {\n const constraints: RealtimeKitMediaStreamConstraints = {};\n const {\n videoDeviceId,\n videoTrackConstraints,\n facingMode = 'user',\n frameRate = { ideal: 24, max: 30 },\n } = options;\n\n constraints.video = videoTrackConstraints || VIDEO_CONSTRAINTS.vga;\n if (typeof constraints.video === 'boolean') {\n return constraints;\n }\n\n constraints.video.deviceId = videoDeviceId;\n constraints.video.facingMode = facingMode;\n constraints.video.frameRate = frameRate;\n return constraints;\n }\n\n private static async getUserMediaWithTimeout(\n constraints: RealtimeKitMediaStreamConstraints = {},\n timeout: number = 0\n ) {\n try {\n if (!timeout) {\n return await mediaDevices.getUserMedia(constraints);\n }\n\n // NOTE(roerohan): The await is required to catch errors (if any).\n return Promise.race<Promise<unknown>>([\n mediaDevices.getUserMedia(constraints),\n\n new Promise<MediaStream>((_resolve, reject) => {\n setTimeout(\n () =>\n reject(\n new LocalMediaError(\n 'Get user media timed out',\n 'ERR_GUM_TIMEOUT'\n )\n ),\n timeout\n );\n }),\n ]);\n } catch (err) {\n throw err;\n }\n }\n\n public static async getAudioTrack() {\n const mediaStream = (await LocalMediaUtils.getUserMediaWithTimeout({\n audio: true,\n timeout: 5000,\n })) as MediaStream;\n return mediaStream.getAudioTracks()[0];\n }\n\n public static async getVideoTrack(\n constraints: RealtimeKitMediaStreamConstraints\n ) {\n const mediaStream = (await LocalMediaUtils.getUserMediaWithTimeout({\n ...constraints,\n timeout: 5000,\n })) as MediaStream;\n return mediaStream.getVideoTracks()[0];\n }\n\n public static async getScreenShareTracks() {\n /**\n * getDisplayMedia is not defined on type MediaDevices.\n * Need to update this when a fix\n * is made: https://github.com/microsoft/TypeScript/issues/33232\n */\n const stream: MediaStream =\n (await mediaDevices.getDisplayMedia()) as MediaStream;\n return {\n video: stream.getVideoTracks()[0],\n audio: stream.getAudioTracks()[0],\n };\n }\n\n public static async getAudioAndVideoTrack(\n constraints: RealtimeKitMediaStreamConstraints\n ) {\n try {\n const mediaStream = (await LocalMediaUtils.getUserMediaWithTimeout({\n ...constraints,\n timeout: 5000,\n })) as MediaStream;\n return {\n audioTrack: mediaStream.getAudioTracks()[0],\n videoTrack: mediaStream.getVideoTracks()[0],\n };\n } catch (err) {\n throw err;\n }\n }\n\n public onDeviceChange(\n callback: (\n changedDevices: {\n added: MediaDeviceInfo[];\n removed: MediaDeviceInfo[];\n selectedDevice?: string;\n },\n forceDeviceChange?: boolean\n ) => void\n ) {\n const onChange = async (deviceData) => {\n const checkDeviceId = (_id: string) => {\n if (_id.toLowerCase().includes('speaker')) return 'speaker';\n else return _id;\n };\n\n // Extract selected device from event\n const selectedDevice = deviceData.selectedAudioDevice;\n const hasSelectedDeviceChanged =\n selectedDevice &&\n this.#previouslySelectedDevice !== null &&\n selectedDevice !== this.#previouslySelectedDevice;\n\n // On first event, we need to initialize previouslySelectedDevice and fire callback\n const isFirstDeviceEvent =\n selectedDevice && this.#previouslySelectedDevice === null;\n\n // Update previouslySelectedDevice IMMEDIATELY after detection to avoid race conditions\n // This must happen BEFORE any async operations\n if (selectedDevice) {\n this.#previouslySelectedDevice = selectedDevice;\n }\n\n const previouslyAvailableDevices = this.#availableDevices.filter(\n (device) =>\n device.kind === 'audioinput' || device.kind === 'audiooutput'\n );\n const previouslyAvailableDeviceIds = previouslyAvailableDevices.map(\n (device) => checkDeviceId(device.deviceId)\n );\n\n // Parse available device list from event to detect list changes\n let availableDeviceListFromEvent: string[] = [];\n const len = deviceData.availableAudioDeviceList.length;\n if (typeof deviceData.availableAudioDeviceList === 'string') {\n try {\n availableDeviceListFromEvent = JSON.parse(\n deviceData.availableAudioDeviceList\n );\n } catch (e) {\n // If parsing fails, fall back to empty array\n availableDeviceListFromEvent = [];\n }\n }\n if (len === 0) {\n const currentlyAvailableDevices =\n await LocalMediaUtils.enumerateAudioDevices();\n const currentlyAvailableDeviceIds = currentlyAvailableDevices.map(\n (device) => checkDeviceId(device.deviceId)\n );\n\n const changedDevices = {\n added: currentlyAvailableDevices.filter(\n (device) =>\n !previouslyAvailableDeviceIds.includes(\n checkDeviceId(device.deviceId)\n )\n ),\n removed: previouslyAvailableDevices.filter(\n (device) => !currentlyAvailableDeviceIds.includes(device.deviceId)\n ),\n selectedDevice: selectedDevice,\n };\n\n // Check if available device list changed\n const hasAvailableListChanged =\n availableDeviceListFromEvent.length > 0 &&\n (availableDeviceListFromEvent.length !==\n previouslyAvailableDeviceIds.length ||\n !availableDeviceListFromEvent.every((device) =>\n previouslyAvailableDeviceIds.includes(device)\n ));\n\n this.repopulateAvailableDevices().then(() => {\n const shouldFireCallback =\n changedDevices.added.length ||\n changedDevices.removed.length ||\n hasSelectedDeviceChanged ||\n isFirstDeviceEvent ||\n hasAvailableListChanged;\n\n if (shouldFireCallback) {\n callback(changedDevices, false);\n }\n });\n } else {\n const currentlyAvailableDevices =\n await LocalMediaUtils.enumerateAudioDevices();\n const currentlyAvailableDeviceIds = currentlyAvailableDevices.map(\n (device) => checkDeviceId(device.deviceId)\n );\n const availableAudioDevices =\n await LocalMediaUtils.enumerateAudioDevices();\n\n const changedDevices = {\n added: availableAudioDevices.filter(\n (device) =>\n !previouslyAvailableDeviceIds.includes(\n checkDeviceId(device.deviceId)\n )\n ),\n removed: previouslyAvailableDevices.filter(\n (device) => !currentlyAvailableDeviceIds.includes(device.deviceId)\n ),\n selectedDevice: selectedDevice,\n };\n\n // Check if available device list changed\n const hasAvailableListChanged =\n availableDeviceListFromEvent.length > 0 &&\n (availableDeviceListFromEvent.length !==\n previouslyAvailableDeviceIds.length ||\n !availableDeviceListFromEvent.every((device) =>\n previouslyAvailableDeviceIds.includes(device)\n ));\n\n this.repopulateAvailableDevices().then(() => {\n const shouldFireCallback =\n changedDevices.added.length ||\n changedDevices.removed.length ||\n hasSelectedDeviceChanged ||\n isFirstDeviceEvent ||\n hasAvailableListChanged;\n\n if (shouldFireCallback) {\n callback(changedDevices, false);\n }\n });\n }\n };\n if (this.#nativeEventEmitter.listenerCount('onAudioDeviceChanged') === 0) {\n this.#nativeEventEmitter.addListener('onAudioDeviceChanged', onChange);\n }\n }\n\n public async repopulateAvailableDevices() {\n const videoDevices = await LocalMediaUtils.enumerateVideoDevices();\n const audioDevices = await LocalMediaUtils.enumerateAudioDevices();\n this.#availableDevices = videoDevices.concat(audioDevices);\n }\n\n public async chooseAudioRoute(route: String) {\n return await NativeAudioManager.chooseAudioRoute(route);\n }\n\n public get availableDevices() {\n return this.#availableDevices;\n }\n\n public getAvailableDevicesByKind(kind: string) {\n return this.#availableDevices.filter((device) => device.kind === kind);\n }\n\n public getDeviceById(\n deviceId: string,\n kind: 'audioinput' | 'audiooutput' | 'videoinput'\n ) {\n const normalizedDeviceId = deviceId.toLowerCase();\n\n return this.#availableDevices.find((device) => {\n if (device.kind !== kind) return false;\n\n const deviceIdLower = device.deviceId.toLowerCase();\n\n // Exact match first\n if (device.deviceId === deviceId) return true;\n\n // iOS special cases\n if (\n normalizedDeviceId === 'speaker' &&\n deviceIdLower.includes('speaker')\n ) {\n return true;\n }\n if (\n normalizedDeviceId === 'bluetooth' &&\n deviceIdLower.includes('bluetooth')\n ) {\n return true;\n }\n if (\n normalizedDeviceId === 'earpiece' &&\n deviceIdLower.includes('earpiece')\n ) {\n return true;\n }\n\n return false;\n });\n }\n\n /**\n * Returns all audio input devices (microphone devices).\n */\n public getAudioDevices() {\n return this.getAvailableDevicesByKind('audioinput');\n }\n\n /**\n * Returns all video input devices.\n */\n public getVideoDevices() {\n return this.getAvailableDevicesByKind('videoinput');\n }\n\n /**\n * Returns all audio output devices (speaker devices).\n */\n public getSpeakerDevices() {\n const speakerDevices = this.#availableDevices;\n // In Mobile, speaker devices are the same as audio input devices\n return speakerDevices\n .filter((device) => device.kind === 'audioinput')\n .map((device) => ({\n ...device,\n deviceId: device.deviceId,\n label: device.label,\n kind: 'audiooutput',\n }));\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -7,10 +7,9 @@ class InCallManager {
7
7
  }
8
8
  start(setup) {
9
9
  setup = setup === undefined ? {} : setup;
10
- const auto = setup.auto !== false;
11
10
  const media = setup.media === 'video' ? 'video' : 'audio';
12
- const ringback = setup.ringback ? typeof setup.ringback === 'string' ? setup.ringback : '' : '';
13
- _InCallManager.start(media, auto, ringback);
11
+ _InCallManager.start();
12
+ if (media === 'audio') _InCallManager.setVoiceCallMode();
14
13
  }
15
14
  stop(setup) {
16
15
  setup = setup === undefined ? {} : setup;
@@ -60,6 +59,11 @@ class InCallManager {
60
59
  return await _InCallManager.abandonAudioFocusJS();
61
60
  }
62
61
  }
62
+ forceUpdateAudioDevices() {
63
+ if (Platform.OS === 'ios') {
64
+ _InCallManager.forceUpdateAudioDevices();
65
+ }
66
+ }
63
67
  }
64
68
  export default new InCallManager();
65
69
  //# sourceMappingURL=NativeAudioManager.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["Platform","NativeModules","_InCallManager","InCallManager","constructor","vibrate","start","setup","undefined","auto","media","ringback","stop","busytone","getIsWiredHeadsetPluggedIn","e","isBluetoothHeadsetConnected","setKeepScreenOn","enable","setSpeakerphoneOn","setForceSpeakerphoneOn","_flag","flag","setMicrophoneMute","chooseAudioRoute","route","requestAudioFocus","OS","requestAudioFocusJS","abandonAudioFocus","abandonAudioFocusJS"],"sources":["NativeAudioManager.ts"],"sourcesContent":["// @ts-nocheck\nimport { Platform, NativeModules } from 'react-native';\n\nconst _InCallManager = NativeModules.InCallManager;\n\nclass InCallManager {\n constructor() {\n this.vibrate = false;\n }\n\n start(setup) {\n setup = setup === undefined ? {} : setup;\n const auto = setup.auto !== false;\n const media = setup.media === 'video' ? 'video' : 'audio';\n const ringback = setup.ringback\n ? typeof setup.ringback === 'string'\n ? setup.ringback\n : ''\n : '';\n _InCallManager.start(media, auto, ringback);\n }\n\n stop(setup) {\n setup = setup === undefined ? {} : setup;\n const busytone = setup.busytone\n ? typeof setup.busytone === 'string'\n ? setup.busytone\n : ''\n : '';\n _InCallManager.stop(busytone);\n }\n\n async getIsWiredHeadsetPluggedIn() {\n try {\n return await _InCallManager.getIsWiredHeadsetPluggedIn();\n } catch (e) {\n return {};\n }\n }\n\n async isBluetoothHeadsetConnected() {\n try {\n return await _InCallManager.isBluetoothHeadsetConnected();\n } catch (e) {\n return {};\n }\n }\n\n setKeepScreenOn(enable) {\n enable = enable === true;\n _InCallManager.setKeepScreenOn(enable);\n }\n\n setSpeakerphoneOn(enable) {\n enable = enable === true;\n _InCallManager.setSpeakerphoneOn(enable);\n }\n\n setForceSpeakerphoneOn(_flag) {\n const flag = typeof _flag === 'boolean' ? (_flag ? 1 : -1) : 0;\n _InCallManager.setForceSpeakerphoneOn(flag);\n }\n\n setMicrophoneMute(enable) {\n enable = enable === true;\n _InCallManager.setMicrophoneMute(enable);\n }\n\n async chooseAudioRoute(route: String) {\n return await _InCallManager.chooseAudioRoute(route);\n }\n\n async requestAudioFocus() {\n if (Platform.OS === 'android') {\n return await _InCallManager.requestAudioFocusJS();\n }\n }\n\n async abandonAudioFocus() {\n if (Platform.OS === 'android') {\n return await _InCallManager.abandonAudioFocusJS();\n }\n }\n}\n\nexport default new InCallManager();\n"],"mappings":"AAAA;AACA,SAASA,QAAQ,EAAEC,aAAa,QAAQ,cAAc;AAEtD,MAAMC,cAAc,GAAGD,aAAa,CAACE,aAAa;AAElD,MAAMA,aAAa,CAAC;EAClBC,WAAWA,CAAA,EAAG;IACZ,IAAI,CAACC,OAAO,GAAG,KAAK;EACtB;EAEAC,KAAKA,CAACC,KAAK,EAAE;IACXA,KAAK,GAAGA,KAAK,KAAKC,SAAS,GAAG,CAAC,CAAC,GAAGD,KAAK;IACxC,MAAME,IAAI,GAAGF,KAAK,CAACE,IAAI,KAAK,KAAK;IACjC,MAAMC,KAAK,GAAGH,KAAK,CAACG,KAAK,KAAK,OAAO,GAAG,OAAO,GAAG,OAAO;IACzD,MAAMC,QAAQ,GAAGJ,KAAK,CAACI,QAAQ,GAC3B,OAAOJ,KAAK,CAACI,QAAQ,KAAK,QAAQ,GAChCJ,KAAK,CAACI,QAAQ,GACd,EAAE,GACJ,EAAE;IACNT,cAAc,CAACI,KAAK,CAACI,KAAK,EAAED,IAAI,EAAEE,QAAQ,CAAC;EAC7C;EAEAC,IAAIA,CAACL,KAAK,EAAE;IACVA,KAAK,GAAGA,KAAK,KAAKC,SAAS,GAAG,CAAC,CAAC,GAAGD,KAAK;IACxC,MAAMM,QAAQ,GAAGN,KAAK,CAACM,QAAQ,GAC3B,OAAON,KAAK,CAACM,QAAQ,KAAK,QAAQ,GAChCN,KAAK,CAACM,QAAQ,GACd,EAAE,GACJ,EAAE;IACNX,cAAc,CAACU,IAAI,CAACC,QAAQ,CAAC;EAC/B;EAEA,MAAMC,0BAA0BA,CAAA,EAAG;IACjC,IAAI;MACF,OAAO,MAAMZ,cAAc,CAACY,0BAA0B,CAAC,CAAC;IAC1D,CAAC,CAAC,OAAOC,CAAC,EAAE;MACV,OAAO,CAAC,CAAC;IACX;EACF;EAEA,MAAMC,2BAA2BA,CAAA,EAAG;IAClC,IAAI;MACF,OAAO,MAAMd,cAAc,CAACc,2BAA2B,CAAC,CAAC;IAC3D,CAAC,CAAC,OAAOD,CAAC,EAAE;MACV,OAAO,CAAC,CAAC;IACX;EACF;EAEAE,eAAeA,CAACC,MAAM,EAAE;IACtBA,MAAM,GAAGA,MAAM,KAAK,IAAI;IACxBhB,cAAc,CAACe,eAAe,CAACC,MAAM,CAAC;EACxC;EAEAC,iBAAiBA,CAACD,MAAM,EAAE;IACxBA,MAAM,GAAGA,MAAM,KAAK,IAAI;IACxBhB,cAAc,CAACiB,iBAAiB,CAACD,MAAM,CAAC;EAC1C;EAEAE,sBAAsBA,CAACC,KAAK,EAAE;IAC5B,MAAMC,IAAI,GAAG,OAAOD,KAAK,KAAK,SAAS,GAAIA,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,GAAI,CAAC;IAC9DnB,cAAc,CAACkB,sBAAsB,CAACE,IAAI,CAAC;EAC7C;EAEAC,iBAAiBA,CAACL,MAAM,EAAE;IACxBA,MAAM,GAAGA,MAAM,KAAK,IAAI;IACxBhB,cAAc,CAACqB,iBAAiB,CAACL,MAAM,CAAC;EAC1C;EAEA,MAAMM,gBAAgBA,CAACC,KAAa,EAAE;IACpC,OAAO,MAAMvB,cAAc,CAACsB,gBAAgB,CAACC,KAAK,CAAC;EACrD;EAEA,MAAMC,iBAAiBA,CAAA,EAAG;IACxB,IAAI1B,QAAQ,CAAC2B,EAAE,KAAK,SAAS,EAAE;MAC7B,OAAO,MAAMzB,cAAc,CAAC0B,mBAAmB,CAAC,CAAC;IACnD;EACF;EAEA,MAAMC,iBAAiBA,CAAA,EAAG;IACxB,IAAI7B,QAAQ,CAAC2B,EAAE,KAAK,SAAS,EAAE;MAC7B,OAAO,MAAMzB,cAAc,CAAC4B,mBAAmB,CAAC,CAAC;IACnD;EACF;AACF;AAEA,eAAe,IAAI3B,aAAa,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["Platform","NativeModules","_InCallManager","InCallManager","constructor","vibrate","start","setup","undefined","media","setVoiceCallMode","stop","busytone","getIsWiredHeadsetPluggedIn","e","isBluetoothHeadsetConnected","setKeepScreenOn","enable","setSpeakerphoneOn","setForceSpeakerphoneOn","_flag","flag","setMicrophoneMute","chooseAudioRoute","route","requestAudioFocus","OS","requestAudioFocusJS","abandonAudioFocus","abandonAudioFocusJS","forceUpdateAudioDevices"],"sources":["NativeAudioManager.ts"],"sourcesContent":["// @ts-nocheck\nimport { Platform, NativeModules } from 'react-native';\n\nconst _InCallManager = NativeModules.InCallManager;\n\nclass InCallManager {\n constructor() {\n this.vibrate = false;\n }\n\n start(setup) {\n setup = setup === undefined ? {} : setup;\n const media = setup.media === 'video' ? 'video' : 'audio';\n _InCallManager.start();\n if (media === 'audio') _InCallManager.setVoiceCallMode();\n }\n\n stop(setup) {\n setup = setup === undefined ? {} : setup;\n const busytone = setup.busytone\n ? typeof setup.busytone === 'string'\n ? setup.busytone\n : ''\n : '';\n _InCallManager.stop(busytone);\n }\n\n async getIsWiredHeadsetPluggedIn() {\n try {\n return await _InCallManager.getIsWiredHeadsetPluggedIn();\n } catch (e) {\n return {};\n }\n }\n\n async isBluetoothHeadsetConnected() {\n try {\n return await _InCallManager.isBluetoothHeadsetConnected();\n } catch (e) {\n return {};\n }\n }\n\n setKeepScreenOn(enable) {\n enable = enable === true;\n _InCallManager.setKeepScreenOn(enable);\n }\n\n setSpeakerphoneOn(enable) {\n enable = enable === true;\n _InCallManager.setSpeakerphoneOn(enable);\n }\n\n setForceSpeakerphoneOn(_flag) {\n const flag = typeof _flag === 'boolean' ? (_flag ? 1 : -1) : 0;\n _InCallManager.setForceSpeakerphoneOn(flag);\n }\n\n setMicrophoneMute(enable) {\n enable = enable === true;\n _InCallManager.setMicrophoneMute(enable);\n }\n\n async chooseAudioRoute(route: String) {\n return await _InCallManager.chooseAudioRoute(route);\n }\n\n async requestAudioFocus() {\n if (Platform.OS === 'android') {\n return await _InCallManager.requestAudioFocusJS();\n }\n }\n\n async abandonAudioFocus() {\n if (Platform.OS === 'android') {\n return await _InCallManager.abandonAudioFocusJS();\n }\n }\n\n forceUpdateAudioDevices() {\n if (Platform.OS === 'ios') {\n _InCallManager.forceUpdateAudioDevices();\n }\n }\n}\n\nexport default new InCallManager();\n"],"mappings":"AAAA;AACA,SAASA,QAAQ,EAAEC,aAAa,QAAQ,cAAc;AAEtD,MAAMC,cAAc,GAAGD,aAAa,CAACE,aAAa;AAElD,MAAMA,aAAa,CAAC;EAClBC,WAAWA,CAAA,EAAG;IACZ,IAAI,CAACC,OAAO,GAAG,KAAK;EACtB;EAEAC,KAAKA,CAACC,KAAK,EAAE;IACXA,KAAK,GAAGA,KAAK,KAAKC,SAAS,GAAG,CAAC,CAAC,GAAGD,KAAK;IACxC,MAAME,KAAK,GAAGF,KAAK,CAACE,KAAK,KAAK,OAAO,GAAG,OAAO,GAAG,OAAO;IACzDP,cAAc,CAACI,KAAK,CAAC,CAAC;IACtB,IAAIG,KAAK,KAAK,OAAO,EAAEP,cAAc,CAACQ,gBAAgB,CAAC,CAAC;EAC1D;EAEAC,IAAIA,CAACJ,KAAK,EAAE;IACVA,KAAK,GAAGA,KAAK,KAAKC,SAAS,GAAG,CAAC,CAAC,GAAGD,KAAK;IACxC,MAAMK,QAAQ,GAAGL,KAAK,CAACK,QAAQ,GAC3B,OAAOL,KAAK,CAACK,QAAQ,KAAK,QAAQ,GAChCL,KAAK,CAACK,QAAQ,GACd,EAAE,GACJ,EAAE;IACNV,cAAc,CAACS,IAAI,CAACC,QAAQ,CAAC;EAC/B;EAEA,MAAMC,0BAA0BA,CAAA,EAAG;IACjC,IAAI;MACF,OAAO,MAAMX,cAAc,CAACW,0BAA0B,CAAC,CAAC;IAC1D,CAAC,CAAC,OAAOC,CAAC,EAAE;MACV,OAAO,CAAC,CAAC;IACX;EACF;EAEA,MAAMC,2BAA2BA,CAAA,EAAG;IAClC,IAAI;MACF,OAAO,MAAMb,cAAc,CAACa,2BAA2B,CAAC,CAAC;IAC3D,CAAC,CAAC,OAAOD,CAAC,EAAE;MACV,OAAO,CAAC,CAAC;IACX;EACF;EAEAE,eAAeA,CAACC,MAAM,EAAE;IACtBA,MAAM,GAAGA,MAAM,KAAK,IAAI;IACxBf,cAAc,CAACc,eAAe,CAACC,MAAM,CAAC;EACxC;EAEAC,iBAAiBA,CAACD,MAAM,EAAE;IACxBA,MAAM,GAAGA,MAAM,KAAK,IAAI;IACxBf,cAAc,CAACgB,iBAAiB,CAACD,MAAM,CAAC;EAC1C;EAEAE,sBAAsBA,CAACC,KAAK,EAAE;IAC5B,MAAMC,IAAI,GAAG,OAAOD,KAAK,KAAK,SAAS,GAAIA,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,GAAI,CAAC;IAC9DlB,cAAc,CAACiB,sBAAsB,CAACE,IAAI,CAAC;EAC7C;EAEAC,iBAAiBA,CAACL,MAAM,EAAE;IACxBA,MAAM,GAAGA,MAAM,KAAK,IAAI;IACxBf,cAAc,CAACoB,iBAAiB,CAACL,MAAM,CAAC;EAC1C;EAEA,MAAMM,gBAAgBA,CAACC,KAAa,EAAE;IACpC,OAAO,MAAMtB,cAAc,CAACqB,gBAAgB,CAACC,KAAK,CAAC;EACrD;EAEA,MAAMC,iBAAiBA,CAAA,EAAG;IACxB,IAAIzB,QAAQ,CAAC0B,EAAE,KAAK,SAAS,EAAE;MAC7B,OAAO,MAAMxB,cAAc,CAACyB,mBAAmB,CAAC,CAAC;IACnD;EACF;EAEA,MAAMC,iBAAiBA,CAAA,EAAG;IACxB,IAAI5B,QAAQ,CAAC0B,EAAE,KAAK,SAAS,EAAE;MAC7B,OAAO,MAAMxB,cAAc,CAAC2B,mBAAmB,CAAC,CAAC;IACnD;EACF;EAEAC,uBAAuBA,CAAA,EAAG;IACxB,IAAI9B,QAAQ,CAAC0B,EAAE,KAAK,KAAK,EAAE;MACzBxB,cAAc,CAAC4B,uBAAuB,CAAC,CAAC;IAC1C;EACF;AACF;AAEA,eAAe,IAAI3B,aAAa,CAAC,CAAC","ignoreList":[]}
@@ -1,2 +1,2 @@
1
- export const SDK_VERSION = '0.2.1';
1
+ export const SDK_VERSION = '0.2.2-staging.2';
2
2
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["SDK_VERSION"],"sources":["version.ts"],"sourcesContent":["export const SDK_VERSION = '0.2.1';\n"],"mappings":"AAAA,OAAO,MAAMA,WAAW,GAAG,OAAO","ignoreList":[]}
1
+ {"version":3,"names":["SDK_VERSION"],"sources":["version.ts"],"sourcesContent":["export const SDK_VERSION = '0.2.2-staging.2';\n"],"mappings":"AAAA,OAAO,MAAMA,WAAW,GAAG,iBAAiB","ignoreList":[]}
@@ -106,6 +106,7 @@ export default class LocalMediaHandler extends EventEmitter {
106
106
  onDeviceChange(changedDevices: {
107
107
  added: MediaDeviceInfo[];
108
108
  removed: MediaDeviceInfo[];
109
+ selectedDevice?: string;
109
110
  }, forceDeviceChange: boolean): Promise<void>;
110
111
  static init(_: any): Promise<LocalMediaHandler>;
111
112
  emit(event: keyof typeof MediaEvents, ...args: any[]): boolean;