@cloudflare/realtimekit-react-native 1.2.0-staging.3 → 1.2.0-staging.4
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.
- package/lib/commonjs/LocalMediaHandler.js +6 -3
- package/lib/commonjs/LocalMediaHandler.js.map +1 -1
- package/lib/commonjs/utils/version.js +1 -1
- package/lib/commonjs/utils/version.js.map +1 -1
- package/lib/module/LocalMediaHandler.js +6 -3
- package/lib/module/LocalMediaHandler.js.map +1 -1
- package/lib/module/utils/version.js +1 -1
- package/lib/module/utils/version.js.map +1 -1
- package/lib/typescript/utils/version.d.ts +1 -1
- package/package.json +1 -1
|
@@ -603,9 +603,13 @@ class LocalMediaHandler extends _events.EventEmitter {
|
|
|
603
603
|
}
|
|
604
604
|
try {
|
|
605
605
|
/**
|
|
606
|
-
* NOTE
|
|
607
|
-
*
|
|
606
|
+
* NOTE: audioEnabled is set to true BEFORE setupAudioStream so that the
|
|
607
|
+
* AUDIO_TRACK_CHANGE event (emitted inside setupAudioStream) sees the
|
|
608
|
+
* correct enabled state and the Self.ts handler calls shareMic()
|
|
609
|
+
* immediately.
|
|
610
|
+
* If track acquisition fails, audioEnabled is rolled back to false below.
|
|
608
611
|
*/
|
|
612
|
+
this.audioEnabled = true;
|
|
609
613
|
if (!this.audioTrack || this.audioTrack.readyState === 'ended') {
|
|
610
614
|
var _this$currentDevices$6;
|
|
611
615
|
await this.setupAudioStream((_this$currentDevices$6 = this.currentDevices.audio) === null || _this$currentDevices$6 === void 0 ? void 0 : _this$currentDevices$6.deviceId);
|
|
@@ -616,7 +620,6 @@ class LocalMediaHandler extends _events.EventEmitter {
|
|
|
616
620
|
this.audioEnabled = false;
|
|
617
621
|
return;
|
|
618
622
|
}
|
|
619
|
-
this.audioEnabled = true;
|
|
620
623
|
} catch (ex) {
|
|
621
624
|
this.audioEnabled = false;
|
|
622
625
|
this.audioTrack = undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_events","require","_LocalMediaUtils","_interopRequireDefault","_reactNative","_BackgroundHandler","_NativeAudioManager","_PermissionHandler","e","__esModule","default","_defineProperty","r","t","_toPropertyKey","Object","defineProperty","value","enumerable","configurable","writable","i","_toPrimitive","Symbol","toPrimitive","call","TypeError","String","Number","_classPrivateFieldInitSpec","a","_checkPrivateRedeclaration","set","has","_classPrivateFieldSet","s","_assertClassBrand","_classPrivateFieldGet","get","n","arguments","length","RTKHelper","BroadcastEventEmitter","NativeModules","broadcastEmitter","exports","NativeEventEmitter","_meetingServiceConfig","enabled","title","text","channelId","channelName","MediaEvents","checkIfAudioTrackIsSilent","track","_localMediaUtils","WeakMap","_appState","_appStateSubscription","_interval","_screenShareState","_deviceRemovalTimeout","_broadcastEmitter","_broadcastStartedSubscription","_broadcastStoppedSubscription","LocalMediaHandler","EventEmitter","constructor","localMediaUtils","nextAppState","prevAppState","match","BackgroundTimer","clearInterval","videoTrack","setTimeout","setInterval","emit","audioEnabled","videoEnabled","screenShareEnabled","permissions","audio","video","screenShareTracks","undefined","currentDevices","speaker","onDeviceChange","changedDevices","Platform","OS","addListener","oniOSBroadcastStart","oniOSBroadcastStop","NativeAudioManager","start","media","conditionallyRestartAudio","Promise","race","resolve","_this$audioTrack","audioTrack","addEventListener","reacquireTrack","shouldReacquireTrack","_this$currentDevices$","removeMediaStreamTrackListeners","setupAudioStream","deviceId","addMediaStreamTrackListeners","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","audioDeviceId","getOperationalMicDeviceId","getDeviceById","_this$audioTrack2","_this$rawAudioTrack","stop","LocalMediaUtils","getAudioTrack","err","console","warn","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","setupPermissions","camera","microphone","val","message","constraints","AppState","_handleAppStateChange","startMeetingService","stopScreenShareTracks","tracks","_this$screenShareTrac","_this$screenShareTrac2","_this$screenShareTrac3","_this$screenShareTrac4","removeScreenShareTracks","_this$screenShareTrac5","onScreenShareEnded","_this$rawAudioTrack2","_this$rawAudioTrack3","_this$rawVideoTrack2","_this$rawVideoTrack3","setScreenShareTracks","_this$screenShareTrac6","disableAudio","toggleAudio","enableAudio","_this$currentDevices$6","ex","enableVideo","toggleVideo","disableVideo","_this$currentDevices$7","_this$rawVideoTrack4","_this$rawVideoTrack5","setAudioDevice","setVideoDevice","_this$rawVideoTrack6","_this$rawVideoTrack7","setSpeakerDevice","route","chooseAudioRoute","getScreenShareTracks","enableScreenShare","_pendingScreenShare","RTKScreensharePickerView","showScreenSharePickerView","reject","timeoutId","time","disableScreenShare","getAllDevices","availableDevices","getCurrentDevices","devices","currentDeviceId","getCurrentAudioDevice","currentDevice","forceDeviceChange","addedDevice","removedDevice","added","removed","selectedDevice","selectedDeviceInfo","clearTimeout","isBluetoothRemoved","handleRemoval","hasDeviceListChanged","hasSelectedDeviceInfo","configure","config","init","_","Version","PermissionsAndroid","request","PERMISSIONS","POST_NOTIFICATIONS","event","args","on","listener","destruct","_classPrivateFieldGet2","stopAudioTrack","stopVideoTrack","remove","_this$rawAudioTrack4","_this$audioTrack3","_this$rawAudioTrack5","_this$audioTrack4","_this$rawVideoTrack8","_this$videoTrack3","_this$rawVideoTrack9","_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 AppStateStatus,\n NativeEventEmitter,\n NativeEventSubscription,\n NativeModules,\n PermissionsAndroid,\n Platform,\n} from 'react-native';\nimport BackgroundTimer from './BackgroundHandler';\nimport NativeAudioManager from './NativeAudioManager';\nimport { setupPermissions } from './PermissionHandler';\n\nconst { RTKHelper, BroadcastEventEmitter } = NativeModules;\n\nexport const broadcastEmitter = new NativeEventEmitter(BroadcastEventEmitter);\n\n// ---------------------------------------------------------------------------\n// Meeting foreground service config\n// Set by LocalMediaHandler.configure() before the first init() call.\n// ---------------------------------------------------------------------------\n\nexport interface MeetingServiceConfig {\n /** Whether to start the Android meeting foreground service. Default: true. */\n enabled: boolean;\n /** Notification title. Default: \"In a call\". */\n title?: string;\n /** Notification body text. Default: \"Tap to return to your meeting\". */\n text?: string;\n channelId?: string;\n channelName?: string;\n}\n\nlet _meetingServiceConfig: MeetingServiceConfig = {\n enabled: true,\n title: 'In a call',\n text: 'Tap to return to your meeting',\n channelId: 'rtk_meeting',\n channelName: 'Ongoing Meeting',\n};\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 | undefined;\n\n #interval: number;\n\n #screenShareState: 'STARTED' | 'STOPPED' | 'PENDING' | 'NOT_STARTED';\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 #broadcastEmitter: NativeEventEmitter;\n\n #broadcastStartedSubscription: NativeEventSubscription;\n\n #broadcastStoppedSubscription: NativeEventSubscription;\n\n _handleAppStateChange = (nextAppState: AppStateStatus) => {\n const prevAppState = this.#appState;\n this.#appState = nextAppState;\n\n if (\n prevAppState.match(/inactive|background/) &&\n nextAppState === 'active'\n ) {\n // App returned to foreground — stop the background keep-alive timer\n // and kick the video track to recover the camera feed.\n if (this.#interval !== null) {\n BackgroundTimer.clearInterval(this.#interval);\n this.#interval = null;\n }\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 if (nextAppState.match(/inactive|background/)) {\n // App moved to background — start a recurring no-op timer to keep the\n // JS thread alive so WebRTC/native events continue to be processed.\n // Clear any existing interval first to avoid accumulation.\n if (this.#interval !== null) {\n BackgroundTimer.clearInterval(this.#interval);\n }\n this.#interval = BackgroundTimer.setInterval(() => {}, 1000);\n }\n };\n\n public constructor(localMediaUtils: LocalMediaUtils) {\n super();\n this.#localMediaUtils = localMediaUtils;\n this.#broadcastEmitter = broadcastEmitter;\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 this.#broadcastStartedSubscription = this.#broadcastEmitter.addListener(\n 'iOS_BroadcastStarted',\n () => {\n this.oniOSBroadcastStart();\n }\n );\n this.#broadcastStoppedSubscription = this.#broadcastEmitter.addListener(\n 'iOS_BroadcastStopped',\n () => {\n this.oniOSBroadcastStop();\n }\n );\n }\n NativeAudioManager.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 = await 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 NativeAudioManager.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 = await 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.videoTrack);\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 = await 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 = await 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 = await 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 = await 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 = await 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 // Start the meeting foreground service so Android keeps the app alive\n // in the background during a call. The app is guaranteed to be in the\n // foreground at this point (user just tapped join / setup screen).\n await this.startMeetingService();\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 this.screenShareTracks?.audio?.release();\n }\n\n if (video) {\n this.screenShareTracks?.video?.stop();\n this.screenShareTracks?.video?.release();\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.rawAudioTrack?.stop();\n this.rawAudioTrack?.release();\n this.rawAudioTrack = undefined;\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.rawVideoTrack?.stop();\n this.rawVideoTrack?.release();\n this.rawVideoTrack = undefined;\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\n );\n }\n\n // Arrow function so `this` is stable — the same reference is used in both\n // addEventListener (setScreenShareTracks) and removeEventListener\n // (removeScreenShareTracks). A regular method + .bind(this) creates a new\n // function object on every call, making removeEventListener a no-op.\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.rawVideoTrack?.stop();\n this.rawVideoTrack?.release();\n this.rawVideoTrack = undefined;\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.rawVideoTrack?.stop();\n this.rawVideoTrack?.release();\n this.rawVideoTrack = undefined;\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.#screenShareState = 'STARTED';\n }\n\n private async oniOSBroadcastStop() {\n this.#screenShareState = 'STOPPED';\n if (this.screenShareEnabled) {\n this.removeScreenShareTracks();\n return;\n }\n }\n\n public async enableScreenShare() {\n // Guard: do nothing if already sharing or a consent dialog is in flight.\n if (this.screenShareEnabled || this._pendingScreenShare) return;\n\n if (Platform.OS === 'android') {\n this._pendingScreenShare = true;\n try {\n // getScreenShareTracks() manages the full flow:\n // consent dialog → start MediaProjectionService → create MediaStream\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 } finally {\n this._pendingScreenShare = false;\n }\n }\n\n if (Platform.OS === 'ios') {\n this.#screenShareState = 'PENDING';\n NativeModules.RTKScreensharePickerView.showScreenSharePickerView();\n await new Promise<void>((resolve, reject) => {\n let timeoutId: NodeJS.Timeout;\n let time: number = 0;\n timeoutId = setInterval(() => {\n if (this.#screenShareState === 'STARTED') {\n clearInterval(timeoutId);\n resolve();\n }\n time = time + 100;\n if (time > 20000) {\n clearInterval(timeoutId);\n reject('Timeout exceeded for enableScreenShare()');\n }\n }, 100);\n });\n }\n }\n\n public async disableScreenShare() {\n // Guard: nothing to stop if not sharing and no consent dialog is pending.\n if (!this.screenShareEnabled && !this._pendingScreenShare) return;\n\n if (Platform.OS !== 'ios') {\n this.removeScreenShareTracks();\n return;\n }\n\n // iOS: trigger the broadcast picker to stop the extension.\n NativeModules.RTKScreensharePickerView.showScreenSharePickerView();\n this.#screenShareState = 'PENDING';\n await new Promise<void>((resolve, reject) => {\n let timeoutId: NodeJS.Timeout;\n let time: number = 0;\n timeoutId = setInterval(() => {\n if (this.#screenShareState === 'STOPPED') {\n clearInterval(timeoutId);\n resolve();\n }\n time = time + 100;\n if (time > 20000) {\n clearInterval(timeoutId);\n reject('Timeout exceeded for disableScreenShare()');\n }\n }, 100);\n });\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 async getAudioDevices() {\n const devices = await this.#localMediaUtils.getAudioDevices();\n\n // Update current audio device from native layer\n try {\n const currentDeviceId = await NativeAudioManager.getCurrentAudioDevice();\n if (currentDeviceId) {\n const currentDevice = this.#localMediaUtils.getDeviceById(\n currentDeviceId,\n 'audioinput'\n );\n if (currentDevice) {\n this.currentDevices.audio = currentDevice;\n }\n }\n } catch (e) {\n console.warn('Failed to update current audio device:', e);\n }\n\n return devices;\n }\n\n public async getVideoDevices() {\n return await this.#localMediaUtils.getVideoDevices();\n }\n\n public async getSpeakerDevices() {\n const devices = await this.#localMediaUtils.getSpeakerDevices();\n\n // Update current speaker device from native layer\n try {\n const currentDeviceId = await NativeAudioManager.getCurrentAudioDevice();\n if (currentDeviceId) {\n const currentDevice = this.#localMediaUtils.getDeviceById(\n currentDeviceId,\n 'audioinput'\n );\n if (currentDevice) {\n this.currentDevices.speaker = currentDevice;\n this.currentDevices.audio = currentDevice;\n }\n }\n } catch (e) {\n console.warn('Failed to update current speaker device:', e);\n }\n\n return devices;\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.length > 0;\n\n if (hasDeviceListChanged || hasSelectedDeviceInfo) {\n this.emit('DEVICE_LIST_UPDATED', changedDevices);\n }\n }\n\n /**\n * Override the meeting foreground service config before the first meeting\n * session. Called by useRealtimeKitClient when keepAliveService is set.\n */\n public static configure(config: Partial<MeetingServiceConfig>) {\n _meetingServiceConfig = { ..._meetingServiceConfig, ...config };\n }\n\n public static async init(_) {\n const localMediaUtils = await LocalMediaUtils.init();\n return new LocalMediaHandler(localMediaUtils);\n }\n\n private async startMeetingService() {\n if (Platform.OS !== 'android') return;\n if (!_meetingServiceConfig.enabled) return;\n\n // Android 13+ (API 33): request POST_NOTIFICATIONS so the foreground-service\n // notification appears in the shade.\n if (Number(Platform.Version) >= 33) {\n try {\n await PermissionsAndroid.request(\n PermissionsAndroid.PERMISSIONS.POST_NOTIFICATIONS\n );\n } catch (e) {\n console.warn('Failed to request POST_NOTIFICATIONS permission', e);\n }\n }\n\n try {\n await RTKHelper.startMeetingService({\n title: _meetingServiceConfig.title,\n text: _meetingServiceConfig.text,\n channelId: _meetingServiceConfig.channelId,\n channelName: _meetingServiceConfig.channelName,\n });\n } catch (e) {\n console.warn('Failed to start KeepAliveService', e);\n }\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 this.stopAudioTrack();\n this.stopVideoTrack();\n this.stopScreenShareTracks();\n if (Platform.OS === 'android') this.#appStateSubscription?.remove();\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":[]}
|
|
1
|
+
{"version":3,"names":["_events","require","_LocalMediaUtils","_interopRequireDefault","_reactNative","_BackgroundHandler","_NativeAudioManager","_PermissionHandler","e","__esModule","default","_defineProperty","r","t","_toPropertyKey","Object","defineProperty","value","enumerable","configurable","writable","i","_toPrimitive","Symbol","toPrimitive","call","TypeError","String","Number","_classPrivateFieldInitSpec","a","_checkPrivateRedeclaration","set","has","_classPrivateFieldSet","s","_assertClassBrand","_classPrivateFieldGet","get","n","arguments","length","RTKHelper","BroadcastEventEmitter","NativeModules","broadcastEmitter","exports","NativeEventEmitter","_meetingServiceConfig","enabled","title","text","channelId","channelName","MediaEvents","checkIfAudioTrackIsSilent","track","_localMediaUtils","WeakMap","_appState","_appStateSubscription","_interval","_screenShareState","_deviceRemovalTimeout","_broadcastEmitter","_broadcastStartedSubscription","_broadcastStoppedSubscription","LocalMediaHandler","EventEmitter","constructor","localMediaUtils","nextAppState","prevAppState","match","BackgroundTimer","clearInterval","videoTrack","setTimeout","setInterval","emit","audioEnabled","videoEnabled","screenShareEnabled","permissions","audio","video","screenShareTracks","undefined","currentDevices","speaker","onDeviceChange","changedDevices","Platform","OS","addListener","oniOSBroadcastStart","oniOSBroadcastStop","NativeAudioManager","start","media","conditionallyRestartAudio","Promise","race","resolve","_this$audioTrack","audioTrack","addEventListener","reacquireTrack","shouldReacquireTrack","_this$currentDevices$","removeMediaStreamTrackListeners","setupAudioStream","deviceId","addMediaStreamTrackListeners","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","audioDeviceId","getOperationalMicDeviceId","getDeviceById","_this$audioTrack2","_this$rawAudioTrack","stop","LocalMediaUtils","getAudioTrack","err","console","warn","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","setupPermissions","camera","microphone","val","message","constraints","AppState","_handleAppStateChange","startMeetingService","stopScreenShareTracks","tracks","_this$screenShareTrac","_this$screenShareTrac2","_this$screenShareTrac3","_this$screenShareTrac4","removeScreenShareTracks","_this$screenShareTrac5","onScreenShareEnded","_this$rawAudioTrack2","_this$rawAudioTrack3","_this$rawVideoTrack2","_this$rawVideoTrack3","setScreenShareTracks","_this$screenShareTrac6","disableAudio","toggleAudio","enableAudio","_this$currentDevices$6","ex","enableVideo","toggleVideo","disableVideo","_this$currentDevices$7","_this$rawVideoTrack4","_this$rawVideoTrack5","setAudioDevice","setVideoDevice","_this$rawVideoTrack6","_this$rawVideoTrack7","setSpeakerDevice","route","chooseAudioRoute","getScreenShareTracks","enableScreenShare","_pendingScreenShare","RTKScreensharePickerView","showScreenSharePickerView","reject","timeoutId","time","disableScreenShare","getAllDevices","availableDevices","getCurrentDevices","devices","currentDeviceId","getCurrentAudioDevice","currentDevice","forceDeviceChange","addedDevice","removedDevice","added","removed","selectedDevice","selectedDeviceInfo","clearTimeout","isBluetoothRemoved","handleRemoval","hasDeviceListChanged","hasSelectedDeviceInfo","configure","config","init","_","Version","PermissionsAndroid","request","PERMISSIONS","POST_NOTIFICATIONS","event","args","on","listener","destruct","_classPrivateFieldGet2","stopAudioTrack","stopVideoTrack","remove","_this$rawAudioTrack4","_this$audioTrack3","_this$rawAudioTrack5","_this$audioTrack4","_this$rawVideoTrack8","_this$videoTrack3","_this$rawVideoTrack9","_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 AppStateStatus,\n NativeEventEmitter,\n NativeEventSubscription,\n NativeModules,\n PermissionsAndroid,\n Platform,\n} from 'react-native';\nimport BackgroundTimer from './BackgroundHandler';\nimport NativeAudioManager from './NativeAudioManager';\nimport { setupPermissions } from './PermissionHandler';\n\nconst { RTKHelper, BroadcastEventEmitter } = NativeModules;\n\nexport const broadcastEmitter = new NativeEventEmitter(BroadcastEventEmitter);\n\n// ---------------------------------------------------------------------------\n// Meeting foreground service config\n// Set by LocalMediaHandler.configure() before the first init() call.\n// ---------------------------------------------------------------------------\n\nexport interface MeetingServiceConfig {\n /** Whether to start the Android meeting foreground service. Default: true. */\n enabled: boolean;\n /** Notification title. Default: \"In a call\". */\n title?: string;\n /** Notification body text. Default: \"Tap to return to your meeting\". */\n text?: string;\n channelId?: string;\n channelName?: string;\n}\n\nlet _meetingServiceConfig: MeetingServiceConfig = {\n enabled: true,\n title: 'In a call',\n text: 'Tap to return to your meeting',\n channelId: 'rtk_meeting',\n channelName: 'Ongoing Meeting',\n};\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 | undefined;\n\n #interval: number;\n\n #screenShareState: 'STARTED' | 'STOPPED' | 'PENDING' | 'NOT_STARTED';\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 #broadcastEmitter: NativeEventEmitter;\n\n #broadcastStartedSubscription: NativeEventSubscription;\n\n #broadcastStoppedSubscription: NativeEventSubscription;\n\n _handleAppStateChange = (nextAppState: AppStateStatus) => {\n const prevAppState = this.#appState;\n this.#appState = nextAppState;\n\n if (\n prevAppState.match(/inactive|background/) &&\n nextAppState === 'active'\n ) {\n // App returned to foreground — stop the background keep-alive timer\n // and kick the video track to recover the camera feed.\n if (this.#interval !== null) {\n BackgroundTimer.clearInterval(this.#interval);\n this.#interval = null;\n }\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 if (nextAppState.match(/inactive|background/)) {\n // App moved to background — start a recurring no-op timer to keep the\n // JS thread alive so WebRTC/native events continue to be processed.\n // Clear any existing interval first to avoid accumulation.\n if (this.#interval !== null) {\n BackgroundTimer.clearInterval(this.#interval);\n }\n this.#interval = BackgroundTimer.setInterval(() => {}, 1000);\n }\n };\n\n public constructor(localMediaUtils: LocalMediaUtils) {\n super();\n this.#localMediaUtils = localMediaUtils;\n this.#broadcastEmitter = broadcastEmitter;\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 this.#broadcastStartedSubscription = this.#broadcastEmitter.addListener(\n 'iOS_BroadcastStarted',\n () => {\n this.oniOSBroadcastStart();\n }\n );\n this.#broadcastStoppedSubscription = this.#broadcastEmitter.addListener(\n 'iOS_BroadcastStopped',\n () => {\n this.oniOSBroadcastStop();\n }\n );\n }\n NativeAudioManager.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 = await 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 NativeAudioManager.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 = await 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.videoTrack);\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 = await 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 = await 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 = await 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 = await 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 = await 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 // Start the meeting foreground service so Android keeps the app alive\n // in the background during a call. The app is guaranteed to be in the\n // foreground at this point (user just tapped join / setup screen).\n await this.startMeetingService();\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 this.screenShareTracks?.audio?.release();\n }\n\n if (video) {\n this.screenShareTracks?.video?.stop();\n this.screenShareTracks?.video?.release();\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.rawAudioTrack?.stop();\n this.rawAudioTrack?.release();\n this.rawAudioTrack = undefined;\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.rawVideoTrack?.stop();\n this.rawVideoTrack?.release();\n this.rawVideoTrack = undefined;\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\n );\n }\n\n // Arrow function so `this` is stable — the same reference is used in both\n // addEventListener (setScreenShareTracks) and removeEventListener\n // (removeScreenShareTracks). A regular method + .bind(this) creates a new\n // function object on every call, making removeEventListener a no-op.\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: audioEnabled is set to true BEFORE setupAudioStream so that the\n * AUDIO_TRACK_CHANGE event (emitted inside setupAudioStream) sees the\n * correct enabled state and the Self.ts handler calls shareMic()\n * immediately.\n * If track acquisition fails, audioEnabled is rolled back to false below.\n */\n this.audioEnabled = true;\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 } 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.rawVideoTrack?.stop();\n this.rawVideoTrack?.release();\n this.rawVideoTrack = undefined;\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.rawVideoTrack?.stop();\n this.rawVideoTrack?.release();\n this.rawVideoTrack = undefined;\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.#screenShareState = 'STARTED';\n }\n\n private async oniOSBroadcastStop() {\n this.#screenShareState = 'STOPPED';\n if (this.screenShareEnabled) {\n this.removeScreenShareTracks();\n return;\n }\n }\n\n public async enableScreenShare() {\n // Guard: do nothing if already sharing or a consent dialog is in flight.\n if (this.screenShareEnabled || this._pendingScreenShare) return;\n\n if (Platform.OS === 'android') {\n this._pendingScreenShare = true;\n try {\n // getScreenShareTracks() manages the full flow:\n // consent dialog → start MediaProjectionService → create MediaStream\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 } finally {\n this._pendingScreenShare = false;\n }\n }\n\n if (Platform.OS === 'ios') {\n this.#screenShareState = 'PENDING';\n NativeModules.RTKScreensharePickerView.showScreenSharePickerView();\n await new Promise<void>((resolve, reject) => {\n let timeoutId: NodeJS.Timeout;\n let time: number = 0;\n timeoutId = setInterval(() => {\n if (this.#screenShareState === 'STARTED') {\n clearInterval(timeoutId);\n resolve();\n }\n time = time + 100;\n if (time > 20000) {\n clearInterval(timeoutId);\n reject('Timeout exceeded for enableScreenShare()');\n }\n }, 100);\n });\n }\n }\n\n public async disableScreenShare() {\n // Guard: nothing to stop if not sharing and no consent dialog is pending.\n if (!this.screenShareEnabled && !this._pendingScreenShare) return;\n\n if (Platform.OS !== 'ios') {\n this.removeScreenShareTracks();\n return;\n }\n\n // iOS: trigger the broadcast picker to stop the extension.\n NativeModules.RTKScreensharePickerView.showScreenSharePickerView();\n this.#screenShareState = 'PENDING';\n await new Promise<void>((resolve, reject) => {\n let timeoutId: NodeJS.Timeout;\n let time: number = 0;\n timeoutId = setInterval(() => {\n if (this.#screenShareState === 'STOPPED') {\n clearInterval(timeoutId);\n resolve();\n }\n time = time + 100;\n if (time > 20000) {\n clearInterval(timeoutId);\n reject('Timeout exceeded for disableScreenShare()');\n }\n }, 100);\n });\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 async getAudioDevices() {\n const devices = await this.#localMediaUtils.getAudioDevices();\n\n // Update current audio device from native layer\n try {\n const currentDeviceId = await NativeAudioManager.getCurrentAudioDevice();\n if (currentDeviceId) {\n const currentDevice = this.#localMediaUtils.getDeviceById(\n currentDeviceId,\n 'audioinput'\n );\n if (currentDevice) {\n this.currentDevices.audio = currentDevice;\n }\n }\n } catch (e) {\n console.warn('Failed to update current audio device:', e);\n }\n\n return devices;\n }\n\n public async getVideoDevices() {\n return await this.#localMediaUtils.getVideoDevices();\n }\n\n public async getSpeakerDevices() {\n const devices = await this.#localMediaUtils.getSpeakerDevices();\n\n // Update current speaker device from native layer\n try {\n const currentDeviceId = await NativeAudioManager.getCurrentAudioDevice();\n if (currentDeviceId) {\n const currentDevice = this.#localMediaUtils.getDeviceById(\n currentDeviceId,\n 'audioinput'\n );\n if (currentDevice) {\n this.currentDevices.speaker = currentDevice;\n this.currentDevices.audio = currentDevice;\n }\n }\n } catch (e) {\n console.warn('Failed to update current speaker device:', e);\n }\n\n return devices;\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.length > 0;\n\n if (hasDeviceListChanged || hasSelectedDeviceInfo) {\n this.emit('DEVICE_LIST_UPDATED', changedDevices);\n }\n }\n\n /**\n * Override the meeting foreground service config before the first meeting\n * session. Called by useRealtimeKitClient when keepAliveService is set.\n */\n public static configure(config: Partial<MeetingServiceConfig>) {\n _meetingServiceConfig = { ..._meetingServiceConfig, ...config };\n }\n\n public static async init(_) {\n const localMediaUtils = await LocalMediaUtils.init();\n return new LocalMediaHandler(localMediaUtils);\n }\n\n private async startMeetingService() {\n if (Platform.OS !== 'android') return;\n if (!_meetingServiceConfig.enabled) return;\n\n // Android 13+ (API 33): request POST_NOTIFICATIONS so the foreground-service\n // notification appears in the shade.\n if (Number(Platform.Version) >= 33) {\n try {\n await PermissionsAndroid.request(\n PermissionsAndroid.PERMISSIONS.POST_NOTIFICATIONS\n );\n } catch (e) {\n console.warn('Failed to request POST_NOTIFICATIONS permission', e);\n }\n }\n\n try {\n await RTKHelper.startMeetingService({\n title: _meetingServiceConfig.title,\n text: _meetingServiceConfig.text,\n channelId: _meetingServiceConfig.channelId,\n channelName: _meetingServiceConfig.channelName,\n });\n } catch (e) {\n console.warn('Failed to start KeepAliveService', e);\n }\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 this.stopAudioTrack();\n this.stopVideoTrack();\n this.stopScreenShareTracks();\n if (Platform.OS === 'android') this.#appStateSubscription?.remove();\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":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["SDK_VERSION","exports"],"sources":["version.ts"],"sourcesContent":["export const SDK_VERSION = '1.2.0-staging.
|
|
1
|
+
{"version":3,"names":["SDK_VERSION","exports"],"sources":["version.ts"],"sourcesContent":["export const SDK_VERSION = '1.2.0-staging.4';\n"],"mappings":";;;;;;AAAO,MAAMA,WAAW,GAAAC,OAAA,CAAAD,WAAA,GAAG,iBAAiB","ignoreList":[]}
|
|
@@ -597,9 +597,13 @@ export default class LocalMediaHandler extends EventEmitter {
|
|
|
597
597
|
}
|
|
598
598
|
try {
|
|
599
599
|
/**
|
|
600
|
-
* NOTE
|
|
601
|
-
*
|
|
600
|
+
* NOTE: audioEnabled is set to true BEFORE setupAudioStream so that the
|
|
601
|
+
* AUDIO_TRACK_CHANGE event (emitted inside setupAudioStream) sees the
|
|
602
|
+
* correct enabled state and the Self.ts handler calls shareMic()
|
|
603
|
+
* immediately.
|
|
604
|
+
* If track acquisition fails, audioEnabled is rolled back to false below.
|
|
602
605
|
*/
|
|
606
|
+
this.audioEnabled = true;
|
|
603
607
|
if (!this.audioTrack || this.audioTrack.readyState === 'ended') {
|
|
604
608
|
var _this$currentDevices$6;
|
|
605
609
|
await this.setupAudioStream((_this$currentDevices$6 = this.currentDevices.audio) === null || _this$currentDevices$6 === void 0 ? void 0 : _this$currentDevices$6.deviceId);
|
|
@@ -610,7 +614,6 @@ export default class LocalMediaHandler extends EventEmitter {
|
|
|
610
614
|
this.audioEnabled = false;
|
|
611
615
|
return;
|
|
612
616
|
}
|
|
613
|
-
this.audioEnabled = true;
|
|
614
617
|
} catch (ex) {
|
|
615
618
|
this.audioEnabled = false;
|
|
616
619
|
this.audioTrack = undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["EventEmitter","LocalMediaUtils","AppState","NativeEventEmitter","NativeModules","PermissionsAndroid","Platform","BackgroundTimer","NativeAudioManager","setupPermissions","RTKHelper","BroadcastEventEmitter","broadcastEmitter","_meetingServiceConfig","enabled","title","text","channelId","channelName","MediaEvents","checkIfAudioTrackIsSilent","track","_localMediaUtils","WeakMap","_appState","_appStateSubscription","_interval","_screenShareState","_deviceRemovalTimeout","_broadcastEmitter","_broadcastStartedSubscription","_broadcastStoppedSubscription","LocalMediaHandler","constructor","localMediaUtils","_classPrivateFieldInitSpec","_defineProperty","nextAppState","prevAppState","_classPrivateFieldGet","_classPrivateFieldSet","match","clearInterval","videoTrack","setTimeout","setInterval","emit","audioEnabled","videoEnabled","screenShareEnabled","permissions","audio","video","screenShareTracks","undefined","currentDevices","speaker","onDeviceChange","changedDevices","OS","addListener","oniOSBroadcastStart","oniOSBroadcastStop","start","media","conditionallyRestartAudio","Promise","race","resolve","_this$audioTrack","audioTrack","addEventListener","e","reacquireTrack","shouldReacquireTrack","_this$currentDevices$","removeMediaStreamTrackListeners","setupAudioStream","deviceId","addMediaStreamTrackListeners","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","console","warn","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","val","message","constraints","_handleAppStateChange","startMeetingService","stopScreenShareTracks","tracks","_this$screenShareTrac","_this$screenShareTrac2","_this$screenShareTrac3","_this$screenShareTrac4","removeScreenShareTracks","_this$screenShareTrac5","onScreenShareEnded","_this$rawAudioTrack2","_this$rawAudioTrack3","_this$rawVideoTrack2","_this$rawVideoTrack3","setScreenShareTracks","_this$screenShareTrac6","disableAudio","toggleAudio","enableAudio","_this$currentDevices$6","ex","enableVideo","toggleVideo","disableVideo","_this$currentDevices$7","_this$rawVideoTrack4","_this$rawVideoTrack5","setAudioDevice","setVideoDevice","_this$rawVideoTrack6","_this$rawVideoTrack7","setSpeakerDevice","route","chooseAudioRoute","getScreenShareTracks","enableScreenShare","_pendingScreenShare","RTKScreensharePickerView","showScreenSharePickerView","reject","timeoutId","time","disableScreenShare","getAllDevices","availableDevices","getCurrentDevices","devices","currentDeviceId","getCurrentAudioDevice","currentDevice","forceDeviceChange","addedDevice","removedDevice","added","removed","selectedDevice","selectedDeviceInfo","clearTimeout","isBluetoothRemoved","handleRemoval","hasDeviceListChanged","hasSelectedDeviceInfo","configure","config","init","_","Number","Version","request","PERMISSIONS","POST_NOTIFICATIONS","event","args","on","listener","destruct","_classPrivateFieldGet2","stopAudioTrack","stopVideoTrack","remove","_this$rawAudioTrack4","_this$audioTrack3","_this$rawAudioTrack5","_this$audioTrack4","_this$rawVideoTrack8","_this$videoTrack3","_this$rawVideoTrack9","_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 AppStateStatus,\n NativeEventEmitter,\n NativeEventSubscription,\n NativeModules,\n PermissionsAndroid,\n Platform,\n} from 'react-native';\nimport BackgroundTimer from './BackgroundHandler';\nimport NativeAudioManager from './NativeAudioManager';\nimport { setupPermissions } from './PermissionHandler';\n\nconst { RTKHelper, BroadcastEventEmitter } = NativeModules;\n\nexport const broadcastEmitter = new NativeEventEmitter(BroadcastEventEmitter);\n\n// ---------------------------------------------------------------------------\n// Meeting foreground service config\n// Set by LocalMediaHandler.configure() before the first init() call.\n// ---------------------------------------------------------------------------\n\nexport interface MeetingServiceConfig {\n /** Whether to start the Android meeting foreground service. Default: true. */\n enabled: boolean;\n /** Notification title. Default: \"In a call\". */\n title?: string;\n /** Notification body text. Default: \"Tap to return to your meeting\". */\n text?: string;\n channelId?: string;\n channelName?: string;\n}\n\nlet _meetingServiceConfig: MeetingServiceConfig = {\n enabled: true,\n title: 'In a call',\n text: 'Tap to return to your meeting',\n channelId: 'rtk_meeting',\n channelName: 'Ongoing Meeting',\n};\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 | undefined;\n\n #interval: number;\n\n #screenShareState: 'STARTED' | 'STOPPED' | 'PENDING' | 'NOT_STARTED';\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 #broadcastEmitter: NativeEventEmitter;\n\n #broadcastStartedSubscription: NativeEventSubscription;\n\n #broadcastStoppedSubscription: NativeEventSubscription;\n\n _handleAppStateChange = (nextAppState: AppStateStatus) => {\n const prevAppState = this.#appState;\n this.#appState = nextAppState;\n\n if (\n prevAppState.match(/inactive|background/) &&\n nextAppState === 'active'\n ) {\n // App returned to foreground — stop the background keep-alive timer\n // and kick the video track to recover the camera feed.\n if (this.#interval !== null) {\n BackgroundTimer.clearInterval(this.#interval);\n this.#interval = null;\n }\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 if (nextAppState.match(/inactive|background/)) {\n // App moved to background — start a recurring no-op timer to keep the\n // JS thread alive so WebRTC/native events continue to be processed.\n // Clear any existing interval first to avoid accumulation.\n if (this.#interval !== null) {\n BackgroundTimer.clearInterval(this.#interval);\n }\n this.#interval = BackgroundTimer.setInterval(() => {}, 1000);\n }\n };\n\n public constructor(localMediaUtils: LocalMediaUtils) {\n super();\n this.#localMediaUtils = localMediaUtils;\n this.#broadcastEmitter = broadcastEmitter;\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 this.#broadcastStartedSubscription = this.#broadcastEmitter.addListener(\n 'iOS_BroadcastStarted',\n () => {\n this.oniOSBroadcastStart();\n }\n );\n this.#broadcastStoppedSubscription = this.#broadcastEmitter.addListener(\n 'iOS_BroadcastStopped',\n () => {\n this.oniOSBroadcastStop();\n }\n );\n }\n NativeAudioManager.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 = await 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 NativeAudioManager.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 = await 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.videoTrack);\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 = await 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 = await 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 = await 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 = await 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 = await 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 // Start the meeting foreground service so Android keeps the app alive\n // in the background during a call. The app is guaranteed to be in the\n // foreground at this point (user just tapped join / setup screen).\n await this.startMeetingService();\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 this.screenShareTracks?.audio?.release();\n }\n\n if (video) {\n this.screenShareTracks?.video?.stop();\n this.screenShareTracks?.video?.release();\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.rawAudioTrack?.stop();\n this.rawAudioTrack?.release();\n this.rawAudioTrack = undefined;\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.rawVideoTrack?.stop();\n this.rawVideoTrack?.release();\n this.rawVideoTrack = undefined;\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\n );\n }\n\n // Arrow function so `this` is stable — the same reference is used in both\n // addEventListener (setScreenShareTracks) and removeEventListener\n // (removeScreenShareTracks). A regular method + .bind(this) creates a new\n // function object on every call, making removeEventListener a no-op.\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.rawVideoTrack?.stop();\n this.rawVideoTrack?.release();\n this.rawVideoTrack = undefined;\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.rawVideoTrack?.stop();\n this.rawVideoTrack?.release();\n this.rawVideoTrack = undefined;\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.#screenShareState = 'STARTED';\n }\n\n private async oniOSBroadcastStop() {\n this.#screenShareState = 'STOPPED';\n if (this.screenShareEnabled) {\n this.removeScreenShareTracks();\n return;\n }\n }\n\n public async enableScreenShare() {\n // Guard: do nothing if already sharing or a consent dialog is in flight.\n if (this.screenShareEnabled || this._pendingScreenShare) return;\n\n if (Platform.OS === 'android') {\n this._pendingScreenShare = true;\n try {\n // getScreenShareTracks() manages the full flow:\n // consent dialog → start MediaProjectionService → create MediaStream\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 } finally {\n this._pendingScreenShare = false;\n }\n }\n\n if (Platform.OS === 'ios') {\n this.#screenShareState = 'PENDING';\n NativeModules.RTKScreensharePickerView.showScreenSharePickerView();\n await new Promise<void>((resolve, reject) => {\n let timeoutId: NodeJS.Timeout;\n let time: number = 0;\n timeoutId = setInterval(() => {\n if (this.#screenShareState === 'STARTED') {\n clearInterval(timeoutId);\n resolve();\n }\n time = time + 100;\n if (time > 20000) {\n clearInterval(timeoutId);\n reject('Timeout exceeded for enableScreenShare()');\n }\n }, 100);\n });\n }\n }\n\n public async disableScreenShare() {\n // Guard: nothing to stop if not sharing and no consent dialog is pending.\n if (!this.screenShareEnabled && !this._pendingScreenShare) return;\n\n if (Platform.OS !== 'ios') {\n this.removeScreenShareTracks();\n return;\n }\n\n // iOS: trigger the broadcast picker to stop the extension.\n NativeModules.RTKScreensharePickerView.showScreenSharePickerView();\n this.#screenShareState = 'PENDING';\n await new Promise<void>((resolve, reject) => {\n let timeoutId: NodeJS.Timeout;\n let time: number = 0;\n timeoutId = setInterval(() => {\n if (this.#screenShareState === 'STOPPED') {\n clearInterval(timeoutId);\n resolve();\n }\n time = time + 100;\n if (time > 20000) {\n clearInterval(timeoutId);\n reject('Timeout exceeded for disableScreenShare()');\n }\n }, 100);\n });\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 async getAudioDevices() {\n const devices = await this.#localMediaUtils.getAudioDevices();\n\n // Update current audio device from native layer\n try {\n const currentDeviceId = await NativeAudioManager.getCurrentAudioDevice();\n if (currentDeviceId) {\n const currentDevice = this.#localMediaUtils.getDeviceById(\n currentDeviceId,\n 'audioinput'\n );\n if (currentDevice) {\n this.currentDevices.audio = currentDevice;\n }\n }\n } catch (e) {\n console.warn('Failed to update current audio device:', e);\n }\n\n return devices;\n }\n\n public async getVideoDevices() {\n return await this.#localMediaUtils.getVideoDevices();\n }\n\n public async getSpeakerDevices() {\n const devices = await this.#localMediaUtils.getSpeakerDevices();\n\n // Update current speaker device from native layer\n try {\n const currentDeviceId = await NativeAudioManager.getCurrentAudioDevice();\n if (currentDeviceId) {\n const currentDevice = this.#localMediaUtils.getDeviceById(\n currentDeviceId,\n 'audioinput'\n );\n if (currentDevice) {\n this.currentDevices.speaker = currentDevice;\n this.currentDevices.audio = currentDevice;\n }\n }\n } catch (e) {\n console.warn('Failed to update current speaker device:', e);\n }\n\n return devices;\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.length > 0;\n\n if (hasDeviceListChanged || hasSelectedDeviceInfo) {\n this.emit('DEVICE_LIST_UPDATED', changedDevices);\n }\n }\n\n /**\n * Override the meeting foreground service config before the first meeting\n * session. Called by useRealtimeKitClient when keepAliveService is set.\n */\n public static configure(config: Partial<MeetingServiceConfig>) {\n _meetingServiceConfig = { ..._meetingServiceConfig, ...config };\n }\n\n public static async init(_) {\n const localMediaUtils = await LocalMediaUtils.init();\n return new LocalMediaHandler(localMediaUtils);\n }\n\n private async startMeetingService() {\n if (Platform.OS !== 'android') return;\n if (!_meetingServiceConfig.enabled) return;\n\n // Android 13+ (API 33): request POST_NOTIFICATIONS so the foreground-service\n // notification appears in the shade.\n if (Number(Platform.Version) >= 33) {\n try {\n await PermissionsAndroid.request(\n PermissionsAndroid.PERMISSIONS.POST_NOTIFICATIONS\n );\n } catch (e) {\n console.warn('Failed to request POST_NOTIFICATIONS permission', e);\n }\n }\n\n try {\n await RTKHelper.startMeetingService({\n title: _meetingServiceConfig.title,\n text: _meetingServiceConfig.text,\n channelId: _meetingServiceConfig.channelId,\n channelName: _meetingServiceConfig.channelName,\n });\n } catch (e) {\n console.warn('Failed to start KeepAliveService', e);\n }\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 this.stopAudioTrack();\n this.stopVideoTrack();\n this.stopScreenShareTracks();\n if (Platform.OS === 'android') this.#appStateSubscription?.remove();\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,EAERC,kBAAkB,EAElBC,aAAa,EACbC,kBAAkB,EAClBC,QAAQ,QACH,cAAc;AACrB,OAAOC,eAAe,MAAM,qBAAqB;AACjD,OAAOC,kBAAkB,MAAM,sBAAsB;AACrD,SAASC,gBAAgB,QAAQ,qBAAqB;AAEtD,MAAM;EAAEC,SAAS;EAAEC;AAAsB,CAAC,GAAGP,aAAa;AAE1D,OAAO,MAAMQ,gBAAgB,GAAG,IAAIT,kBAAkB,CAACQ,qBAAqB,CAAC;;AAE7E;AACA;AACA;AACA;;AAaA,IAAIE,qBAA2C,GAAG;EAChDC,OAAO,EAAE,IAAI;EACbC,KAAK,EAAE,WAAW;EAClBC,IAAI,EAAE,+BAA+B;EACrCC,SAAS,EAAE,aAAa;EACxBC,WAAW,EAAE;AACf,CAAC;;AAED;AACA,WAAYC,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;AAAA,IAAAI,iBAAA,oBAAAJ,OAAA;AAAA,IAAAK,qBAAA,oBAAAL,OAAA;AAAA,IAAAM,iBAAA,oBAAAN,OAAA;AAAA,IAAAO,6BAAA,oBAAAP,OAAA;AAAA,IAAAQ,6BAAA,oBAAAR,OAAA;AAED,eAAe,MAAMS,iBAAiB,SAAShC,YAAY,CAAC;EAoFnDiC,WAAWA,CAACC,eAAgC,EAAE;IACnD,KAAK,CAAC,CAAC;IApFTC,0BAAA,OAAAb,gBAAgB;IAEhBa,0BAAA,OAAAX,SAAS;IAETW,0BAAA,OAAAV,qBAAqB;IAErBU,0BAAA,OAAAT,SAAS;IAETS,0BAAA,OAAAR,iBAAiB;IAAoDS,eAAA;IAAAA,eAAA;IAAAA,eAAA;IAAAA,eAAA;IAAAA,eAAA;IAAAA,eAAA;IAAAA,eAAA;IAAAA,eAAA;IAAAA,eAAA,8BAqBvC,KAAK;IAAAA,eAAA;IAAAA,eAAA;IAanCD,0BAAA,OAAAP,qBAAqB,EAA0B,IAAI;IAEnDO,0BAAA,OAAAN,iBAAiB;IAEjBM,0BAAA,OAAAL,6BAA6B;IAE7BK,0BAAA,OAAAJ,6BAA6B;IAA0BK,eAAA,gCAE9BC,YAA4B,IAAK;MACxD,MAAMC,YAAY,GAAGC,qBAAA,CAAKf,SAAS,EAAd,IAAa,CAAC;MACnCgB,qBAAA,CAAKhB,SAAS,EAAd,IAAI,EAAaa,YAAJ,CAAC;MAEd,IACEC,YAAY,CAACG,KAAK,CAAC,qBAAqB,CAAC,IACzCJ,YAAY,KAAK,QAAQ,EACzB;QACA;QACA;QACA,IAAIE,qBAAA,CAAKb,SAAS,EAAd,IAAa,CAAC,KAAK,IAAI,EAAE;UAC3BnB,eAAe,CAACmC,aAAa,CAACH,qBAAA,CAAKb,SAAS,EAAd,IAAa,CAAC,CAAC;UAC7Cc,qBAAA,CAAKd,SAAS,EAAd,IAAI,EAAa,IAAJ,CAAC;QAChB;QACA,IAAI,IAAI,CAACiB,UAAU,EAAE;UACnB,IAAI,CAACA,UAAU,CAAC7B,OAAO,GAAG,KAAK;UAC/B8B,UAAU,CAAC,MAAM;YACf,IAAI,IAAI,CAACD,UAAU,EAAE;cACnB,IAAI,CAACA,UAAU,CAAC7B,OAAO,GAAG,IAAI;YAChC;UACF,CAAC,EAAE,GAAG,CAAC;QACT;MACF,CAAC,MAAM,IAAIuB,YAAY,CAACI,KAAK,CAAC,qBAAqB,CAAC,EAAE;QACpD;QACA;QACA;QACA,IAAIF,qBAAA,CAAKb,SAAS,EAAd,IAAa,CAAC,KAAK,IAAI,EAAE;UAC3BnB,eAAe,CAACmC,aAAa,CAACH,qBAAA,CAAKb,SAAS,EAAd,IAAa,CAAC,CAAC;QAC/C;QACAc,qBAAA,CAAKd,SAAS,EAAd,IAAI,EAAanB,eAAe,CAACsC,WAAW,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAA9C,CAAC;MAChB;IACF,CAAC;IAijBD;IACA;IACA;IACA;IAAAT,eAAA,6BAC6B,MAAM;MACjC,IAAI,CAACU,IAAI,CAAC,mBAAmB,CAAC;IAChC,CAAC;IAnjBCN,qBAAA,CAAKlB,gBAAgB,EAArB,IAAI,EAAoBY,eAAJ,CAAC;IACrBM,qBAAA,CAAKX,iBAAiB,EAAtB,IAAI,EAAqBjB,gBAAJ,CAAC;IACtB4B,qBAAA,CAAKhB,SAAS,EAAd,IAAI,EAAa,EAAJ,CAAC;IACd,IAAI,CAACuB,YAAY,GAAG,IAAI;IACxB,IAAI,CAACC,YAAY,GAAG,IAAI;IACxB,IAAI,CAACC,kBAAkB,GAAG,KAAK;IAC/B,IAAI,CAACC,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;IACAf,qBAAA,CAAKjB,gBAAgB,EAArB,IAAoB,CAAC,CAACmC,cAAc,CAAC,MAAOC,cAAc,IAAK;MAC7D,MAAM,IAAI,CAACD,cAAc,CAACC,cAAc,EAAE,KAAK,CAAC;IAClD,CAAC,CAAC;IACF,IAAIpD,QAAQ,CAACqD,EAAE,KAAK,KAAK,EAAE;MACzBnB,qBAAA,CAAKV,6BAA6B,EAAlC,IAAI,EAAiCS,qBAAA,CAAKV,iBAAiB,EAAtB,IAAqB,CAAC,CAAC+B,WAAW,CACrE,sBAAsB,EACtB,MAAM;QACJ,IAAI,CAACC,mBAAmB,CAAC,CAAC;MAC5B,CACF,CALiC,CAAC;MAMlCrB,qBAAA,CAAKT,6BAA6B,EAAlC,IAAI,EAAiCQ,qBAAA,CAAKV,iBAAiB,EAAtB,IAAqB,CAAC,CAAC+B,WAAW,CACrE,sBAAsB,EACtB,MAAM;QACJ,IAAI,CAACE,kBAAkB,CAAC,CAAC;MAC3B,CACF,CALiC,CAAC;IAMpC;IACAtD,kBAAkB,CAACuD,KAAK,CAAC;MAAEC,KAAK,EAAE;IAAQ,CAAC,CAAC;EAC9C;EAEA,MAAcC,yBAAyBA,CAAA,EAAG;IACxC,IAAI,CAAC,IAAI,CAACV,cAAc,CAACJ,KAAK,IAAI,CAAC,IAAI,CAACJ,YAAY,EAAE;MACpD;IACF;IACA,MAAMmB,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,EAAGC,CAAC,IAAK;QACjDJ,OAAO,CAACI,CAAC,CAAC;MACZ,CAAC,CAAC;IAAA,CACJ,CAAC,EACD,IAAIN,OAAO,CAAEE,OAAO,IAAKxB,UAAU,CAACwB,OAAO,EAAE,EAAE,CAAC,CAAC,CAClD,CAAC;IACF,MAAMK,cAAc,GAAG,MAAM,IAAI,CAACC,oBAAoB,CAAC,OAAO,CAAC;IAE/D,IAAID,cAAc,EAAE;MAAA,IAAAE,qBAAA;MAClB,IAAI,CAACC,+BAA+B,CAAC,IAAI,CAACN,UAAU,CAAC;MACrD,MAAM,IAAI,CAACO,gBAAgB,EAAAF,qBAAA,GAAC,IAAI,CAACpB,cAAc,CAACJ,KAAK,cAAAwB,qBAAA,uBAAzBA,qBAAA,CAA2BG,QAAQ,CAAC;MAChE,IAAI,CAACC,4BAA4B,CAAC,IAAI,CAACT,UAAU,CAAC;MAClD,IAAI,CAACxB,IAAI,CAAC,oBAAoB,CAAC;IACjC;EACF;EAEA,MAAckC,yBAAyBA,CAAA,EAAG;IACxC,IAAI,CAAC,IAAI,CAACzB,cAAc,CAACH,KAAK,IAAI,CAAC,IAAI,CAACJ,YAAY,EAAE;IAEtD,MAAMkB,OAAO,CAACC,IAAI,CAAC,CACjB,IAAID,OAAO,CAAEE,OAAO;MAAA,IAAAa,gBAAA;MAAA,QAAAA,gBAAA,GAClB,IAAI,CAACtC,UAAU,cAAAsC,gBAAA,uBAAfA,gBAAA,CAAiBV,gBAAgB,CAAC,QAAQ,EAAEH,OAAO,CAAC;IAAA,CACtD,CAAC,EACD,IAAIF,OAAO,CAAEE,OAAO,IAAKxB,UAAU,CAACwB,OAAO,EAAE,EAAE,CAAC,CAAC,CAClD,CAAC;IAEF,MAAMK,cAAc,GAAG,MAAM,IAAI,CAACC,oBAAoB,CAAC,OAAO,CAAC;IAE/D,IAAID,cAAc,EAAE;MAClB,IAAI,CAACG,+BAA+B,CAAC,IAAI,CAACjC,UAAU,CAAC;MACrD,MAAM,IAAI,CAACuC,gBAAgB,CAAC,IAAI,CAAC3B,cAAc,CAACH,KAAK,CAAC0B,QAAQ,CAAC;MAC/D,IAAI,CAACC,4BAA4B,CAAC,IAAI,CAACpC,UAAU,CAAC;MAClD,IAAI,CAACG,IAAI,CAAC,oBAAoB,CAAC;IACjC;EACF;EAEA,MAAc4B,oBAAoBA,CAACS,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,CAACvC,YAAY;IAChC,CAAC,MAAM,IAAIoC,IAAI,KAAK,OAAO,EAAE;MAC3BE,gBAAgB,GAAG,IAAI,CAAC1C,UAAU;MAClC2C,UAAU,GAAG,IAAI,CAACtC,YAAY;IAChC;IAEA,IAAI,CAACqC,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,CAAC7C,UAAU,EAAE,OAAO,IAAI;IACxD,MAAM8C,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,MAAMxE,yBAAyB,CAAC,IAAI,CAACkD,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;EAGMpB,+BAA+BA,CAACS,gBAAkC,EAAE;IAC1E,IAAI,CAACA,gBAAgB,EAAE;MACrB,OAAO/B,SAAS;IAClB;IAEA,MAAM2C,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;EAEQN,4BAA4BA,CAACM,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,MAAaR,gBAAgBA,CAC3BC,QAAiB,EACjBqB,cAAuB,GAAG,KAAK,EAC/B;IAAA,IAAAC,sBAAA;IACA,MAAMC,YAAY,GAAG,MAAM9D,qBAAA,CAAKjB,gBAAgB,EAArB,IAAoB,CAAC,CAACgF,eAAe,CAAC,CAAC;IAElE,IAAI,CAACD,YAAY,CAACE,MAAM,EAAE;MACxB;IACF;IAEA,IAAIC,aAAa,GAAG1B,QAAQ;IAE5B,IAAI,CAAC0B,aAAa,EAAE;MAClBA,aAAa,GAAG,CAAC,MAAM,IAAI,CAACC,yBAAyB,CAAC,CAAC,EAAE3B,QAAQ;IACnE;IAEA,IAAI,EAAAsB,sBAAA,OAAI,CAAC7C,cAAc,CAACJ,KAAK,cAAAiD,sBAAA,uBAAzBA,sBAAA,CAA2BtB,QAAQ,MAAK0B,aAAa,EAAE;MACzD,IAAI,CAACjD,cAAc,CAACJ,KAAK,GAAGZ,qBAAA,CAAKjB,gBAAgB,EAArB,IAAoB,CAAC,CAACoF,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,MAAMtF,eAAe,CAAC6G,aAAa,CAAC,CAAC;IAC5D,CAAC,CAAC,OAAOC,GAAG,EAAE;MACZC,OAAO,CAACC,IAAI,CAAC,iCAAiC,EAAEF,GAAG,CAAC;MACpD,IAAI,CAACxB,aAAa,GAAGjC,SAAS;IAChC;IACA,IAAI,CAAC4D,aAAa,CAAC,IAAI,CAAC3B,aAAa,CAAC;IACtC,IAAI,CAACR,4BAA4B,CAAC,IAAI,CAACT,UAAU,CAAC;IAClD,IAAI,CAACxB,IAAI,CAAC,oBAAoB,CAAC;IAC/B,IAAI,CAACqE,SAAS,CAAC,IAAI,CAAC5D,cAAc,CAACJ,KAAK,CAAC;;IAEzC;AACJ;AACA;AACA;IACI,IAAI,IAAI,CAACmB,UAAU,IAAI,IAAI,CAACpB,WAAW,CAACC,KAAK,KAAK,eAAe,EAAE;MACjE,MAAMZ,qBAAA,CAAKjB,gBAAgB,EAArB,IAAoB,CAAC,CAAC8F,0BAA0B,CAAC,CAAC;IAC1D;;IAEA;IACA;IACA5G,kBAAkB,CAAC6G,uBAAuB,CAAC,CAAC;IAE5C,IAAI,CAACvE,IAAI,CAAC,eAAe,EAAE;MACzBwE,MAAM,EAAE,IAAI,CAAC/D,cAAc,CAACJ;IAC9B,CAAC,CAAC;EACJ;EAEQoE,kBAAkBA,CAAA,EAAG;IAC3B;EAAA;EAGF,MAAarC,gBAAgBA,CAC3BJ,QAAiB,EACjBqB,cAAuB,GAAG,KAAK,EAC/B;IAAA,IAAAqB,sBAAA;IACA,MAAMC,YAAY,GAAG,MAAMlF,qBAAA,CAAKjB,gBAAgB,EAArB,IAAoB,CAAC,CAACoG,eAAe,CAAC,CAAC;IAClE,IAAI,CAACD,YAAY,CAAClB,MAAM,EAAE;MACxB;IACF;IAEA,IAAIoB,aAAa,GAAG7C,QAAQ;IAC5B,IAAI,CAAC6C,aAAa,EAAE;MAClBA,aAAa,GAAG,CAAC,MAAM,IAAI,CAACC,4BAA4B,CAAC,CAAC,EAAE9C,QAAQ;IACtE;IAEA,IAAI,EAAA0C,sBAAA,OAAI,CAACjE,cAAc,CAACH,KAAK,cAAAoE,sBAAA,uBAAzBA,sBAAA,CAA2B1C,QAAQ,MAAK6C,aAAa,EAAE;MACzD,IAAI,CAACpE,cAAc,CAACH,KAAK,GAAGb,qBAAA,CAAKjB,gBAAgB,EAArB,IAAoB,CAAC,CAACoF,aAAa,CAC7DiB,aAAa,EACb,YACF,CAAC;IACH;;IAEA;AACJ;AACA;AACA;IACI,IAAI,IAAI,CAAC3E,YAAY,EAAE;MACrB,MAAM6E,gBAAgB,GAAG5H,eAAe,CAAC6H,mBAAmB,CAAC;QAC3DH;MACF,CAAC,CAAC;MACF,IAAI,CAAC,IAAI,CAACnC,aAAa,EAAE;QACvB,IAAI;UACF,IAAI,CAACA,aAAa,GAAG,MAAMvF,eAAe,CAAC8H,aAAa,CACtDF,gBACF,CAAC;QACH,CAAC,CAAC,OAAOd,GAAG,EAAE;UACZC,OAAO,CAACC,IAAI,CAAC,iCAAiC,EAAEF,GAAG,CAAC;UACpD,IAAI,CAACvB,aAAa,GAAGlC,SAAS;QAChC;MACF;MACA,IAAI,CAAC0E,aAAa,CAAC,IAAI,CAACxC,aAAa,CAAC;MACtC,IAAI,CAACT,4BAA4B,CAAC,IAAI,CAACpC,UAAU,CAAC;MAClD,IAAI,CAACG,IAAI,CAAC,oBAAoB,CAAC;IACjC;IAEA,IAAIqD,cAAc,EAAE;MAAA,IAAA8B,iBAAA,EAAAC,mBAAA;MAClB,CAAAD,iBAAA,OAAI,CAACtF,UAAU,cAAAsF,iBAAA,eAAfA,iBAAA,CAAiBpB,IAAI,CAAC,CAAC;MACvB,CAAAqB,mBAAA,OAAI,CAAC1C,aAAa,cAAA0C,mBAAA,eAAlBA,mBAAA,CAAoBrB,IAAI,CAAC,CAAC;IAC5B;IACA;AACJ;AACA;AACA;IACI,IAAI,IAAI,CAAClE,UAAU,IAAI,IAAI,CAACO,WAAW,CAACE,KAAK,KAAK,eAAe,EAAE;MACjE,MAAMb,qBAAA,CAAKjB,gBAAgB,EAArB,IAAoB,CAAC,CAAC8F,0BAA0B,CAAC,CAAC;IAC1D;IACA,IAAI,CAACtE,IAAI,CAAC,eAAe,EAAE;MACzBwE,MAAM,EAAE,IAAI,CAAC/D,cAAc,CAACH;IAC9B,CAAC,CAAC;EACJ;EAEA,MAAa+E,YAAYA,CAACrD,QAAiB,EAAE;IAAA,IAAAsD,sBAAA;IAC3C,MAAMC,cAAc,GAAG,MAAM9F,qBAAA,CAAKjB,gBAAgB,EAArB,IAAoB,CAAC,CAACgH,iBAAiB,CAAC,CAAC;IACtE,IAAI,CAACD,cAAc,CAAC9B,MAAM,EAAE;MAC1B;IACF;IAEA,IAAIgC,eAAuB;IAE3B,IAAIzD,QAAQ,EAAE;MACZ;MACAyD,eAAe,GAAGzD,QAAQ;IAC5B,CAAC,MAAM;MACL;MACA,MAAM0D,2BAA2B,GAAGH,cAAc,CAACI,IAAI,CACpDC,CAAC;QAAA,IAAAC,sBAAA;QAAA,OAAKD,CAAC,CAAC5D,QAAQ,OAAA6D,sBAAA,GAAK,IAAI,CAACpF,cAAc,CAACC,OAAO,cAAAmF,sBAAA,uBAA3BA,sBAAA,CAA6B7D,QAAQ;MAAA,CAC7D,CAAC;MAED,IAAI0D,2BAA2B,EAAE;QAC/B;QACAD,eAAe,GAAG,IAAI,CAAChF,cAAc,CAACC,OAAO,CAACsB,QAAQ;MACxD,CAAC,MAAM;QACL;QACA,MAAM8D,eAAe,GAAGP,cAAc,CAACI,IAAI,CACxCC,CAAC,IAAKA,CAAC,CAAC5D,QAAQ,KAAK,WACxB,CAAC;QACD,MAAM+D,WAAW,GAAGR,cAAc,CAACI,IAAI,CAAEC,CAAC,IAAKA,CAAC,CAAC5D,QAAQ,KAAK,OAAO,CAAC;QACtE,MAAMgE,aAAa,GAAGT,cAAc,CAACI,IAAI,CACtCC,CAAC,IAAKA,CAAC,CAAC5D,QAAQ,KAAK,SACxB,CAAC;QAEDyD,eAAe,GACb,CAAAK,eAAe,aAAfA,eAAe,uBAAfA,eAAe,CAAE9D,QAAQ,MACzB+D,WAAW,aAAXA,WAAW,uBAAXA,WAAW,CAAE/D,QAAQ,MACrBgE,aAAa,aAAbA,aAAa,uBAAbA,aAAa,CAAEhE,QAAQ,KACvBuD,cAAc,CAAC,CAAC,CAAC,CAACvD,QAAQ;MAC9B;IACF;IAEA,IAAI,EAAAsD,sBAAA,OAAI,CAAC7E,cAAc,CAACC,OAAO,cAAA4E,sBAAA,uBAA3BA,sBAAA,CAA6BtD,QAAQ,MAAKyD,eAAe,EAAE;MAC7D;MACA,IAAI,CAAChF,cAAc,CAACJ,KAAK,GAAGZ,qBAAA,CAAKjB,gBAAgB,EAArB,IAAoB,CAAC,CAACoF,aAAa,CAC7D6B,eAAe,EACf,YACF,CAAC;MACD,IAAI,CAAChF,cAAc,CAACC,OAAO,GAAG,IAAI,CAACD,cAAc,CAACJ,KAAK;IACzD;IACA,MAAM,IAAI,CAACgE,SAAS,CAAC,IAAI,CAAC5D,cAAc,CAACJ,KAAK,CAAC;IAC/C,IAAI,CAACL,IAAI,CAAC,eAAe,EAAE;MACzBwE,MAAM,EAAE,IAAI,CAAC/D,cAAc,CAACC;IAC9B,CAAC,CAAC;EACJ;EAEA,MAAaoE,4BAA4BA,CAAA,EAGtC;IACD,IAAIH,YAAY,GAAG,MAAMlF,qBAAA,CAAKjB,gBAAgB,EAArB,IAAoB,CAAC,CAACoG,eAAe,CAAC,CAAC;IAChE,IAAI,CAACD,YAAY,CAAClB,MAAM,EAAE;MACxB,OAAO;QAAEwC,aAAa,EAAE,KAAK;QAAEjE,QAAQ,EAAE;MAAK,CAAC;IACjD;;IAEA;AACJ;AACA;AACA;AACA;;IAEI2C,YAAY,GAAG,CAAC,GAAGA,YAAY,CAAC,CAACuB,OAAO,CAAC,CAAC;IAE1C,IAAIC,mBAAmB,GAAG,IAAI;IAC9B,KACE,IAAIC,WAAW,GAAG,CAAC,EACnBA,WAAW,GAAGzB,YAAY,CAAClB,MAAM,EACjC2C,WAAW,IAAI,CAAC,EAChB;MACA,IAAI;QACFD,mBAAmB,GAAGxB,YAAY,CAACyB,WAAW,CAAC,CAACpE,QAAQ;QACxD;MACF,CAAC,CAAC,OAAOiC,GAAG,EAAE,CAAC;IACjB;IAEA,OAAOkC,mBAAmB,GACtB;MAAEF,aAAa,EAAE,IAAI;MAAEjE,QAAQ,EAAEmE;IAAoB,CAAC,GACtD;MAAEF,aAAa,EAAE,KAAK;MAAEjE,QAAQ,EAAE2C,YAAY,CAAC,CAAC,CAAC,CAAC3C;IAAS,CAAC;EAClE;EAEA,MAAa2B,yBAAyBA,CAAA,EAGnC;IACD,IAAIJ,YAAY,GAAG,MAAM9D,qBAAA,CAAKjB,gBAAgB,EAArB,IAAoB,CAAC,CAACgF,eAAe,CAAC,CAAC;IAChE,IAAI,CAACD,YAAY,CAACE,MAAM,EAAE;MACxB,OAAO;QAAEwC,aAAa,EAAE,KAAK;QAAEjE,QAAQ,EAAE;MAAK,CAAC;IACjD;IACA;AACJ;AACA;AACA;AACA;;IAEIuB,YAAY,GAAG,CAAC,GAAGA,YAAY,CAAC,CAAC2C,OAAO,CAAC,CAAC;IAC1C,IAAIC,mBAAmB,GAAG,IAAI;IAE9B,KACE,IAAIC,WAAW,GAAG,CAAC,EACnBA,WAAW,GAAG7C,YAAY,CAACE,MAAM,EACjC2C,WAAW,IAAI,CAAC,EAChB;MACA,IAAI;QACF,MAAM5E,UAAU,GAAG,MAAMrE,eAAe,CAAC6G,aAAa,CAAC,CAAC;QAExD,MAAMqC,QAAQ,GAAG,MAAM/H,yBAAyB,CAACkD,UAAU,CAAC;QAC5DA,UAAU,CAACuC,IAAI,CAAC,CAAC;QACjBvC,UAAU,CAAC8E,OAAO,CAAC,CAAC;QACpB,IAAI,CAACD,QAAQ,EAAE;UACbF,mBAAmB,GAAG5C,YAAY,CAAC6C,WAAW,CAAC,CAACpE,QAAQ;UACxD;QACF;MACF,CAAC,CAAC,OAAOiC,GAAG,EAAE;QACZC,OAAO,CAACC,IAAI,CAAC,iCAAiC,EAAEF,GAAG,CAAC;MACtD;IACF;IAEA,OAAOkC,mBAAmB,GACtB;MAAEF,aAAa,EAAE,IAAI;MAAEjE,QAAQ,EAAEmE;IAAoB,CAAC,GACtD;MAAEF,aAAa,EAAE,KAAK;MAAEjE,QAAQ,EAAEuB,YAAY,CAAC,CAAC,CAAC,CAACvB;IAAS,CAAC;EAClE;EAEA,MAAauE,YAAYA,CAAC;IACxBlG,KAAK;IACLC;EAIF,CAAC,EAAE;IACD,IAAI;MACF,MAAMkG,UAAU,GAAG,MAAM7I,gBAAgB,CAAC0C,KAAK,EAAEC,KAAK,CAAC;MACvD,IAAI,CAACF,WAAW,CAACE,KAAK,GAAGkG,UAAU,CAACC,MAAM;MAC1C,IAAI,CAACrG,WAAW,CAACC,KAAK,GAAGmG,UAAU,CAACE,UAAU;IAChD,CAAC,CAAC,OAAOC,GAAG,EAAE;MACZ,IAAI,CAACvG,WAAW,CAACE,KAAK,GAAGqG,GAAG,CAACF,MAAM,IAAI,KAAK;MAC5C,IAAI,CAACrG,WAAW,CAACC,KAAK,GAAGsG,GAAG,CAACD,UAAU,IAAI,KAAK;IAClD;IACA,IAAI,CAAC1G,IAAI,CAAC,yBAAyB,EAAE;MACnCqC,IAAI,EAAE,OAAO;MACbuE,OAAO,EAAE,IAAI,CAACxG,WAAW,CAACC;IAC5B,CAAC,CAAC;IAEF,IAAI,CAACL,IAAI,CAAC,yBAAyB,EAAE;MACnCqC,IAAI,EAAE,OAAO;MACbuE,OAAO,EAAE,IAAI,CAACxG,WAAW,CAACE;IAC5B,CAAC,CAAC;IACF,MAAMuG,WAA8C,GAAG,CAAC,CAAC;IACzD,IAAI,CAAC,IAAI,CAACpG,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,MAAMkD,YAAY,GAAG,MAAM9D,qBAAA,CAAKjB,gBAAgB,EAArB,IAAoB,CAAC,CAACgF,eAAe,CAAC,CAAC;MAClE,IAAID,YAAY,CAACE,MAAM,KAAK,CAAC,EAAE;QAC7B,MAAMC,aAAa,GAAG,CAAC,MAAM,IAAI,CAACC,yBAAyB,CAAC,CAAC,EAAE3B,QAAQ;QACvE,IAAI,CAACvB,cAAc,CAACJ,KAAK,GAAGZ,qBAAA,CAAKjB,gBAAgB,EAArB,IAAoB,CAAC,CAACoF,aAAa,CAC7DF,aAAa,EACb,YACF,CAAC;QACDmD,WAAW,CAACxG,KAAK,GAAG,IAAI;MAC1B;IACF;IAEA,IAAIC,KAAK,EAAE;MACT,MAAMqE,YAAY,GAAG,MAAMlF,qBAAA,CAAKjB,gBAAgB,EAArB,IAAoB,CAAC,CAACoG,eAAe,CAAC,CAAC;MAClE,IAAID,YAAY,CAAClB,MAAM,KAAK,CAAC,EAAE;QAC7B,MAAMoB,aAAa,GAAG,CAAC,MAAM,IAAI,CAACC,4BAA4B,CAAC,CAAC,EAC7D9C,QAAQ;QACX,IAAI,CAACvB,cAAc,CAACH,KAAK,GAAGb,qBAAA,CAAKjB,gBAAgB,EAArB,IAAoB,CAAC,CAACoF,aAAa,CAC7DiB,aAAa,EACb,YACF,CAAC;QAED,MAAME,gBAAgB,GAAG5H,eAAe,CAAC6H,mBAAmB,CAAC;UAC3DH;QACF,CAAC,CAAC;QACFgC,WAAW,CAACvG,KAAK,GAAGyE,gBAAgB,CAACzE,KAAK;MAC5C;IACF;IAEA,IAAID,KAAK,EAAE,MAAM,IAAI,CAAC0B,gBAAgB,CAAC,CAAC;IACxC,IAAIzB,KAAK,EAAE,MAAM,IAAI,CAAC8B,gBAAgB,CAAC,CAAC;IAExC,IAAI,IAAI,CAACZ,UAAU,EAAE,IAAI,CAACvB,YAAY,GAAG,IAAI,CAAC,KACzC,IAAI,CAACA,YAAY,GAAG,KAAK;IAE9B,IAAI,IAAI,CAACJ,UAAU,EAAE,IAAI,CAACK,YAAY,GAAG,IAAI,CAAC,KACzC,IAAI,CAACA,YAAY,GAAG,KAAK;IAE9B,IAAI,CAACC,kBAAkB,GAAG,KAAK;;IAE/B;IACA,MAAM,IAAI,CAACkF,YAAY,CAAC,CAAC;;IAEzB;IACA,IAAI7H,QAAQ,CAACqD,EAAE,KAAK,SAAS,EAAE;MAC7BnB,qBAAA,CAAKf,qBAAqB,EAA1B,IAAI,EAAyBvB,QAAQ,CAACqE,gBAAgB,CACpD,QAAQ,EACR,IAAI,CAACqF,qBACP,CAHyB,CAAC;IAI5B;;IAEA;IACA;IACA;IACA,MAAM,IAAI,CAACC,mBAAmB,CAAC,CAAC;EAClC;EAEQC,qBAAqBA,CAC3BC,MAA4C,GAAG,CAAC,CAAC,EACjD;IACA,MAAM;MAAE5G,KAAK,GAAG,IAAI;MAAEC,KAAK,GAAG;IAAK,CAAC,GAAG2G,MAAM;IAC7C,IAAI5G,KAAK,EAAE;MAAA,IAAA6G,qBAAA,EAAAC,sBAAA;MACT,CAAAD,qBAAA,OAAI,CAAC3G,iBAAiB,cAAA2G,qBAAA,gBAAAA,qBAAA,GAAtBA,qBAAA,CAAwB7G,KAAK,cAAA6G,qBAAA,eAA7BA,qBAAA,CAA+BnD,IAAI,CAAC,CAAC;MACrC,CAAAoD,sBAAA,OAAI,CAAC5G,iBAAiB,cAAA4G,sBAAA,gBAAAA,sBAAA,GAAtBA,sBAAA,CAAwB9G,KAAK,cAAA8G,sBAAA,eAA7BA,sBAAA,CAA+Bb,OAAO,CAAC,CAAC;IAC1C;IAEA,IAAIhG,KAAK,EAAE;MAAA,IAAA8G,sBAAA,EAAAC,sBAAA;MACT,CAAAD,sBAAA,OAAI,CAAC7G,iBAAiB,cAAA6G,sBAAA,gBAAAA,sBAAA,GAAtBA,sBAAA,CAAwB9G,KAAK,cAAA8G,sBAAA,eAA7BA,sBAAA,CAA+BrD,IAAI,CAAC,CAAC;MACrC,CAAAsD,sBAAA,OAAI,CAAC9G,iBAAiB,cAAA8G,sBAAA,gBAAAA,sBAAA,GAAtBA,sBAAA,CAAwB/G,KAAK,cAAA+G,sBAAA,eAA7BA,sBAAA,CAA+Bf,OAAO,CAAC,CAAC;IAC1C;IAEA,IAAIjG,KAAK,IAAIC,KAAK,EAAE;MAClB,IAAI,CAACH,kBAAkB,GAAG,KAAK;IACjC;EACF;EAEOmH,uBAAuBA,CAACL,MAG9B,EAAE;IAAA,IAAAM,sBAAA;IACD,CAAAA,sBAAA,OAAI,CAAChH,iBAAiB,CAACD,KAAK,cAAAiH,sBAAA,eAA5BA,sBAAA,CAA8BnE,mBAAmB,CAC/C,OAAO,EACP,IAAI,CAACoE,kBACP,CAAC;IACD,IAAI,CAACR,qBAAqB,CAACC,MAAM,CAAC;IAClC,IAAI,CAAC1G,iBAAiB,GAAG;MACvBF,KAAK,EAAEG,SAAS;MAChBF,KAAK,EAAEE;IACT,CAAC;EACH;EAEQ4D,aAAaA,CAAC5C,UAA4B,EAAE;IAClD,IAAIA,UAAU,KAAK,IAAI,CAACA,UAAU,EAAE;MAClC;IACF;IAEA,IAAIA,UAAU,KAAKhB,SAAS,EAAE;MAAA,IAAAiH,oBAAA,EAAAC,oBAAA;MAC5B,CAAAD,oBAAA,OAAI,CAAChF,aAAa,cAAAgF,oBAAA,eAAlBA,oBAAA,CAAoB1D,IAAI,CAAC,CAAC;MAC1B,CAAA2D,oBAAA,OAAI,CAACjF,aAAa,cAAAiF,oBAAA,eAAlBA,oBAAA,CAAoBpB,OAAO,CAAC,CAAC;MAC7B,IAAI,CAAC7D,aAAa,GAAGjC,SAAS;IAChC;IAEA,IAAI,CAACgB,UAAU,GAAGA,UAAU;EAC9B;EAEQ0D,aAAaA,CAACrF,UAA4B,EAAE;IAClD,IAAIA,UAAU,KAAK,IAAI,CAACA,UAAU,EAAE;MAClC;IACF;IAEA,IAAIA,UAAU,KAAKW,SAAS,EAAE;MAAA,IAAAmH,oBAAA,EAAAC,oBAAA;MAC5B,CAAAD,oBAAA,OAAI,CAACjF,aAAa,cAAAiF,oBAAA,eAAlBA,oBAAA,CAAoB5D,IAAI,CAAC,CAAC;MAC1B,CAAA6D,oBAAA,OAAI,CAAClF,aAAa,cAAAkF,oBAAA,eAAlBA,oBAAA,CAAoBtB,OAAO,CAAC,CAAC;MAC7B,IAAI,CAAC5D,aAAa,GAAGlC,SAAS;IAChC;IAEA,IAAI,CAACX,UAAU,GAAGA,UAAU;EAC9B;EAEQgI,oBAAoBA,CAACZ,MAG5B,EAAE;IAAA,IAAAa,sBAAA;IACD,MAAM;MAAEzH,KAAK;MAAEC;IAAM,CAAC,GAAG2G,MAAM;IAC/B,IAAI,CAAC5G,KAAK,IAAI,CAACC,KAAK,EAAE;MACpB,IAAI,CAAC0G,qBAAqB,CAAC;QAAE3G,KAAK,EAAE,CAAC,CAACA,KAAK;QAAEC,KAAK,EAAE,CAAC,CAACA;MAAM,CAAC,CAAC;IAChE;IAEA,IAAI,CAACC,iBAAiB,GAAG0G,MAAM;IAC/B,CAAAa,sBAAA,OAAI,CAACvH,iBAAiB,CAACD,KAAK,cAAAwH,sBAAA,eAA5BA,sBAAA,CAA8BrG,gBAAgB,CAC5C,OAAO,EACP,IAAI,CAAC+F,kBACP,CAAC;EACH;EAUA,MAAaO,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,CAAC5H,WAAW,CAACC,KAAK,KAAK,UAAU,EAAE;MACzC,IAAI;QACF,MAAMmG,UAAU,GAAG,MAAM7I,gBAAgB,CAAC,IAAI,EAAE,KAAK,CAAC;QACtD,IAAI,CAACyC,WAAW,CAACC,KAAK,GAAGmG,UAAU,CAACE,UAAU;MAChD,CAAC,CAAC,OAAOC,GAAG,EAAE;QACZ,IAAI,CAACvG,WAAW,CAACC,KAAK,GAAGsG,GAAG,CAACD,UAAU,IAAI,KAAK;MAClD;IACF;IACA,IAAI,CAAC1G,IAAI,CAAC,yBAAyB,EAAE;MACnCqC,IAAI,EAAE,OAAO;MACbuE,OAAO,EAAE,IAAI,CAACxG,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,CAACJ,YAAY,GAAG,KAAK;MACzB;IACF;IACA,IAAI,IAAI,CAACA,YAAY,EAAE;MACrB,IAAI,CAACA,YAAY,GAAG,KAAK;MAEzB,IAAI,IAAI,CAACuB,UAAU,EAAE;QACnB,IAAI,CAACA,UAAU,CAACxD,OAAO,GAAG,IAAI,CAACiC,YAAY;MAC7C;MACA;IACF;IACA,IAAI;MACF;AACN;AACA;AACA;MACM,IAAI,CAAC,IAAI,CAACuB,UAAU,IAAI,IAAI,CAACA,UAAU,CAACoB,UAAU,KAAK,OAAO,EAAE;QAAA,IAAAsF,sBAAA;QAC9D,MAAM,IAAI,CAACnG,gBAAgB,EAAAmG,sBAAA,GAAC,IAAI,CAACzH,cAAc,CAACJ,KAAK,cAAA6H,sBAAA,uBAAzBA,sBAAA,CAA2BlG,QAAQ,CAAC;MAClE;MACA;MACA;MACA,IAAI,CAAC,IAAI,CAACR,UAAU,EAAE;QACpB,IAAI,CAACvB,YAAY,GAAG,KAAK;QACzB;MACF;MACA,IAAI,CAACA,YAAY,GAAG,IAAI;IAC1B,CAAC,CAAC,OAAOkI,EAAE,EAAE;MACX,IAAI,CAAClI,YAAY,GAAG,KAAK;MACzB,IAAI,CAACuB,UAAU,GAAGhB,SAAS;MAC3B,IAAI,CAACiC,aAAa,GAAGjC,SAAS;IAChC;IACA,IAAI,IAAI,CAACgB,UAAU,EAAE;MACnB,IAAI,CAACA,UAAU,CAACxD,OAAO,GAAG,IAAI;IAChC;EACF;EAEA,MAAaoK,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,CAACnI,WAAW,CAACE,KAAK,KAAK,UAAU,EAAE;MACzC,IAAI;QACF,MAAMkG,UAAU,GAAG,MAAM7I,gBAAgB,CAAC,KAAK,EAAE,IAAI,CAAC;QACtD,IAAI,CAACyC,WAAW,CAACE,KAAK,GAAGkG,UAAU,CAACC,MAAM;MAC5C,CAAC,CAAC,OAAOE,GAAG,EAAE;QACZ,IAAI,CAACvG,WAAW,CAACE,KAAK,GAAGqG,GAAG,CAACF,MAAM,IAAI,KAAK;MAC9C;IACF;IACA,IAAI,CAACzG,IAAI,CAAC,yBAAyB,EAAE;MACnCqC,IAAI,EAAE,OAAO;MACbuE,OAAO,EAAE,IAAI,CAACxG,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,CAACJ,YAAY,GAAG,KAAK;MACzB;IACF;IACA,IAAI,IAAI,CAACA,YAAY,EAAE;MAAA,IAAAsI,oBAAA,EAAAC,oBAAA;MACrB,CAAAD,oBAAA,OAAI,CAAC9F,aAAa,cAAA8F,oBAAA,eAAlBA,oBAAA,CAAoBzE,IAAI,CAAC,CAAC;MAC1B,CAAA0E,oBAAA,OAAI,CAAC/F,aAAa,cAAA+F,oBAAA,eAAlBA,oBAAA,CAAoBnC,OAAO,CAAC,CAAC;MAC7B,IAAI,CAAC5D,aAAa,GAAGlC,SAAS;MAC9B,IAAI,CAACN,YAAY,GAAG,KAAK;MACzB;IACF;IACA;AACJ;AACA;AACA;IACI,IAAI,CAACA,YAAY,GAAG,IAAI;IACxB,MAAM,IAAI,CAACkC,gBAAgB,EAAAmG,sBAAA,GAAC,IAAI,CAAC9H,cAAc,CAACH,KAAK,cAAAiI,sBAAA,uBAAzBA,sBAAA,CAA2BvG,QAAQ,CAAC;EAClE;EAEA,MAAa0G,cAAcA,CAAClE,MAAuB,EAAE;IACnD,MAAM,IAAI,CAACzC,gBAAgB,CAACyC,MAAM,CAACxC,QAAQ,CAAC;EAC9C;EAEA,MAAa2G,cAAcA,CAACnE,MAAuB,EAAE;IACnD,IAAI,IAAI,CAACtE,YAAY,EAAE;MAAA,IAAA0I,oBAAA,EAAAC,oBAAA;MACrB,CAAAD,oBAAA,OAAI,CAAClG,aAAa,cAAAkG,oBAAA,eAAlBA,oBAAA,CAAoB7E,IAAI,CAAC,CAAC;MAC1B,CAAA8E,oBAAA,OAAI,CAACnG,aAAa,cAAAmG,oBAAA,eAAlBA,oBAAA,CAAoBvC,OAAO,CAAC,CAAC;MAC7B,IAAI,CAAC5D,aAAa,GAAGlC,SAAS;IAChC;IACA,MAAM,IAAI,CAAC4B,gBAAgB,CAACoC,MAAM,CAACxC,QAAQ,CAAC;EAC9C;EAEA,MAAa8G,gBAAgBA,CAACtE,MAAwB,EAAE;IACtD,MAAM,IAAI,CAACa,YAAY,CAACb,MAAM,CAACxC,QAAQ,CAAC;EAC1C;EAEA,MAAaqC,SAASA,CAAC0E,KAAsB,EAAE;IAC7C,MAAMtJ,qBAAA,CAAKjB,gBAAgB,EAArB,IAAoB,CAAC,CAACwK,gBAAgB,CAACD,KAAK,CAAC/G,QAAQ,CAAC;EAC9D;EAEA,MAAcjB,mBAAmBA,CAAA,EAAG;IAClC,IAAI,CAAC8G,oBAAoB,CAAC,MAAM1K,eAAe,CAAC8L,oBAAoB,CAAC,CAAC,CAAC;IACvE,IAAI,CAAC9I,kBAAkB,GAAG,IAAI;IAC9BT,qBAAA,CAAKb,iBAAiB,EAAtB,IAAI,EAAqB,SAAJ,CAAC;EACxB;EAEA,MAAcmC,kBAAkBA,CAAA,EAAG;IACjCtB,qBAAA,CAAKb,iBAAiB,EAAtB,IAAI,EAAqB,SAAJ,CAAC;IACtB,IAAI,IAAI,CAACsB,kBAAkB,EAAE;MAC3B,IAAI,CAACmH,uBAAuB,CAAC,CAAC;MAC9B;IACF;EACF;EAEA,MAAa4B,iBAAiBA,CAAA,EAAG;IAC/B;IACA,IAAI,IAAI,CAAC/I,kBAAkB,IAAI,IAAI,CAACgJ,mBAAmB,EAAE;IAEzD,IAAI3L,QAAQ,CAACqD,EAAE,KAAK,SAAS,EAAE;MAC7B,IAAI,CAACsI,mBAAmB,GAAG,IAAI;MAC/B,IAAI;QACF;QACA;QACA,IAAI,CAACtB,oBAAoB,CAAC,MAAM1K,eAAe,CAAC8L,oBAAoB,CAAC,CAAC,CAAC;QACvE,IAAI,CAAC9I,kBAAkB,GAAG,IAAI;MAChC,CAAC,CAAC,OAAOuB,CAAC,EAAE;QACVwC,OAAO,CAACC,IAAI,CAAC,6BAA6B,EAAEzC,CAAC,CAAC;QAC9C,IAAI,CAACvB,kBAAkB,GAAG,KAAK;MACjC,CAAC,SAAS;QACR,IAAI,CAACgJ,mBAAmB,GAAG,KAAK;MAClC;IACF;IAEA,IAAI3L,QAAQ,CAACqD,EAAE,KAAK,KAAK,EAAE;MACzBnB,qBAAA,CAAKb,iBAAiB,EAAtB,IAAI,EAAqB,SAAJ,CAAC;MACtBvB,aAAa,CAAC8L,wBAAwB,CAACC,yBAAyB,CAAC,CAAC;MAClE,MAAM,IAAIjI,OAAO,CAAO,CAACE,OAAO,EAAEgI,MAAM,KAAK;QAC3C,IAAIC,SAAyB;QAC7B,IAAIC,IAAY,GAAG,CAAC;QACpBD,SAAS,GAAGxJ,WAAW,CAAC,MAAM;UAC5B,IAAIN,qBAAA,CAAKZ,iBAAiB,EAAtB,IAAqB,CAAC,KAAK,SAAS,EAAE;YACxCe,aAAa,CAAC2J,SAAS,CAAC;YACxBjI,OAAO,CAAC,CAAC;UACX;UACAkI,IAAI,GAAGA,IAAI,GAAG,GAAG;UACjB,IAAIA,IAAI,GAAG,KAAK,EAAE;YAChB5J,aAAa,CAAC2J,SAAS,CAAC;YACxBD,MAAM,CAAC,0CAA0C,CAAC;UACpD;QACF,CAAC,EAAE,GAAG,CAAC;MACT,CAAC,CAAC;IACJ;EACF;EAEA,MAAaG,kBAAkBA,CAAA,EAAG;IAChC;IACA,IAAI,CAAC,IAAI,CAACtJ,kBAAkB,IAAI,CAAC,IAAI,CAACgJ,mBAAmB,EAAE;IAE3D,IAAI3L,QAAQ,CAACqD,EAAE,KAAK,KAAK,EAAE;MACzB,IAAI,CAACyG,uBAAuB,CAAC,CAAC;MAC9B;IACF;;IAEA;IACAhK,aAAa,CAAC8L,wBAAwB,CAACC,yBAAyB,CAAC,CAAC;IAClE3J,qBAAA,CAAKb,iBAAiB,EAAtB,IAAI,EAAqB,SAAJ,CAAC;IACtB,MAAM,IAAIuC,OAAO,CAAO,CAACE,OAAO,EAAEgI,MAAM,KAAK;MAC3C,IAAIC,SAAyB;MAC7B,IAAIC,IAAY,GAAG,CAAC;MACpBD,SAAS,GAAGxJ,WAAW,CAAC,MAAM;QAC5B,IAAIN,qBAAA,CAAKZ,iBAAiB,EAAtB,IAAqB,CAAC,KAAK,SAAS,EAAE;UACxCe,aAAa,CAAC2J,SAAS,CAAC;UACxBjI,OAAO,CAAC,CAAC;QACX;QACAkI,IAAI,GAAGA,IAAI,GAAG,GAAG;QACjB,IAAIA,IAAI,GAAG,KAAK,EAAE;UAChB5J,aAAa,CAAC2J,SAAS,CAAC;UACxBD,MAAM,CAAC,2CAA2C,CAAC;QACrD;MACF,CAAC,EAAE,GAAG,CAAC;IACT,CAAC,CAAC;EACJ;EAEOI,aAAaA,CAAA,EAAG;IACrB,OAAOjK,qBAAA,CAAKjB,gBAAgB,EAArB,IAAoB,CAAC,CAACmL,gBAAgB;EAC/C;EAEOC,iBAAiBA,CAAA,EAAG;IACzB,OAAO,IAAI,CAACnJ,cAAc;EAC5B;EAEOmD,aAAaA,CAClB5B,QAAgB,EAChBK,IAAiD,EACjD;IACA,OAAO5C,qBAAA,CAAKjB,gBAAgB,EAArB,IAAoB,CAAC,CAACoF,aAAa,CAAC5B,QAAQ,EAAEK,IAAI,CAAC;EAC5D;EAEA,MAAamB,eAAeA,CAAA,EAAG;IAC7B,MAAMqG,OAAO,GAAG,MAAMpK,qBAAA,CAAKjB,gBAAgB,EAArB,IAAoB,CAAC,CAACgF,eAAe,CAAC,CAAC;;IAE7D;IACA,IAAI;MACF,MAAMsG,eAAe,GAAG,MAAMpM,kBAAkB,CAACqM,qBAAqB,CAAC,CAAC;MACxE,IAAID,eAAe,EAAE;QACnB,MAAME,aAAa,GAAGvK,qBAAA,CAAKjB,gBAAgB,EAArB,IAAoB,CAAC,CAACoF,aAAa,CACvDkG,eAAe,EACf,YACF,CAAC;QACD,IAAIE,aAAa,EAAE;UACjB,IAAI,CAACvJ,cAAc,CAACJ,KAAK,GAAG2J,aAAa;QAC3C;MACF;IACF,CAAC,CAAC,OAAOtI,CAAC,EAAE;MACVwC,OAAO,CAACC,IAAI,CAAC,wCAAwC,EAAEzC,CAAC,CAAC;IAC3D;IAEA,OAAOmI,OAAO;EAChB;EAEA,MAAajF,eAAeA,CAAA,EAAG;IAC7B,OAAO,MAAMnF,qBAAA,CAAKjB,gBAAgB,EAArB,IAAoB,CAAC,CAACoG,eAAe,CAAC,CAAC;EACtD;EAEA,MAAaY,iBAAiBA,CAAA,EAAG;IAC/B,MAAMqE,OAAO,GAAG,MAAMpK,qBAAA,CAAKjB,gBAAgB,EAArB,IAAoB,CAAC,CAACgH,iBAAiB,CAAC,CAAC;;IAE/D;IACA,IAAI;MACF,MAAMsE,eAAe,GAAG,MAAMpM,kBAAkB,CAACqM,qBAAqB,CAAC,CAAC;MACxE,IAAID,eAAe,EAAE;QACnB,MAAME,aAAa,GAAGvK,qBAAA,CAAKjB,gBAAgB,EAArB,IAAoB,CAAC,CAACoF,aAAa,CACvDkG,eAAe,EACf,YACF,CAAC;QACD,IAAIE,aAAa,EAAE;UACjB,IAAI,CAACvJ,cAAc,CAACC,OAAO,GAAGsJ,aAAa;UAC3C,IAAI,CAACvJ,cAAc,CAACJ,KAAK,GAAG2J,aAAa;QAC3C;MACF;IACF,CAAC,CAAC,OAAOtI,CAAC,EAAE;MACVwC,OAAO,CAACC,IAAI,CAAC,0CAA0C,EAAEzC,CAAC,CAAC;IAC7D;IAEA,OAAOmI,OAAO;EAChB;EAEA,MAAalJ,cAAcA,CACzBC,cAIC,EACDqJ,iBAA0B,EAC1B;IACA,IAAIC,WAA4B;IAChC,IAAIC,aAA8B;IAClC,IAAIvJ,cAAc,CAACwJ,KAAK,CAAC3G,MAAM,EAAE,CAACyG,WAAW,CAAC,GAAGtJ,cAAc,CAACwJ,KAAK;IAErE,IAAIxJ,cAAc,CAACyJ,OAAO,CAAC5G,MAAM,EAAE,CAAC0G,aAAa,CAAC,GAAGvJ,cAAc,CAACyJ,OAAO;;IAE3E;IACA,IAAIzJ,cAAc,CAAC0J,cAAc,EAAE;MACjC,MAAMC,kBAAkB,GAAG9K,qBAAA,CAAKjB,gBAAgB,EAArB,IAAoB,CAAC,CAACoF,aAAa,CAC5DhD,cAAc,CAAC0J,cAAc,EAC7B,YACF,CAAC;MAED,IAAIC,kBAAkB,EAAE;QACtB,IAAI,CAAC9J,cAAc,CAACC,OAAO,GAAG6J,kBAAkB;QAChD,IAAI,CAAC9J,cAAc,CAACJ,KAAK,GAAGkK,kBAAkB;MAChD;IACF;;IAEA;AACJ;AACA;AACA;AACA;IACI,IAAIL,WAAW,EAAE;MACf;MACA,IAAIzK,qBAAA,CAAKX,qBAAqB,EAA1B,IAAyB,CAAC,EAAE;QAC9B0L,YAAY,CAAC/K,qBAAA,CAAKX,qBAAqB,EAA1B,IAAyB,CAAC,CAAC;QACxCY,qBAAA,CAAKZ,qBAAqB,EAA1B,IAAI,EAAyB,IAAJ,CAAC;MAC5B;MAEA,IAAIoL,WAAW,CAAC7H,IAAI,KAAK,YAAY,EAAE;QACrC,IACE,IAAI,CAACjC,WAAW,CAACC,KAAK,KAAK,QAAQ,IACnC,IAAI,CAACD,WAAW,CAACC,KAAK,KAAK,eAAe,EAC1C;UACA,MAAM,IAAI,CAACgF,YAAY,CAAC6E,WAAW,CAAClI,QAAQ,CAAC;QAC/C,CAAC,MAAM;UACL,MAAM,IAAI,CAACD,gBAAgB,CAACmI,WAAW,CAAClI,QAAQ,CAAC;QACnD;MACF,CAAC,MAAM,IAAIkI,WAAW,CAAC7H,IAAI,KAAK,YAAY,EAAE;QAC5C,MAAM,IAAI,CAACD,gBAAgB,CAAC8H,WAAW,CAAClI,QAAQ,CAAC;MACnD,CAAC,MAAM,IAAIkI,WAAW,CAAC7H,IAAI,KAAK,aAAa,EAAE;QAC7C,MAAM,IAAI,CAACgD,YAAY,CAAC6E,WAAW,CAAClI,QAAQ,CAAC;MAC/C;MACA,IAAI,CAAChC,IAAI,CAAC,oBAAoB,CAAC;IACjC;;IAEA;IACA;IACA,IAAImK,aAAa,IAAI,CAACD,WAAW,EAAE;MACjC;MACA;MACA,MAAMO,kBAAkB,GAAGN,aAAa,CAACnI,QAAQ,KAAK,WAAW;MAEjE,MAAM0I,aAAa,GAAG,MAAAA,CAAA,KAAY;QAChC,IAAIP,aAAa,CAAC9H,IAAI,KAAK,YAAY,EAAE;UACvC,IACE,IAAI,CAACjC,WAAW,CAACC,KAAK,KAAK,QAAQ,IACnC,IAAI,CAACD,WAAW,CAACC,KAAK,KAAK,eAAe,EAC1C;YACA,MAAM,IAAI,CAACgF,YAAY,CAAC,CAAC;UAC3B,CAAC,MAAM;YACL,MAAM,IAAI,CAACtD,gBAAgB,CAAC,CAAC;UAC/B;QACF,CAAC,MAAM,IAAIoI,aAAa,CAAC9H,IAAI,KAAK,YAAY,EAAE;UAC9C,MAAM,IAAI,CAACD,gBAAgB,CAAC,CAAC;QAC/B,CAAC,MAAM,IAAI+H,aAAa,CAAC9H,IAAI,KAAK,aAAa,EAAE;UAC/C,MAAM,IAAI,CAACgD,YAAY,CAAC,CAAC;QAC3B;QACA,IAAI,CAACrF,IAAI,CAAC,oBAAoB,CAAC;MACjC,CAAC;MAED,IAAIyK,kBAAkB,EAAE;QACtB;QACA/K,qBAAA,CAAKZ,qBAAqB,EAA1B,IAAI,EAAyBgB,UAAU,CAAC4K,aAAa,EAAE,GAAG,CAAjC,CAAC;MAC5B,CAAC,MAAM;QACL;QACA,MAAMA,aAAa,CAAC,CAAC;MACvB;IACF;;IAEA;IACA;IACA;IACA,MAAMC,oBAAoB,GACxB/J,cAAc,CAACwJ,KAAK,CAAC3G,MAAM,IAAI7C,cAAc,CAACyJ,OAAO,CAAC5G,MAAM;IAC9D,MAAMmH,qBAAqB,GAAGhK,cAAc,CAAC0J,cAAc,CAAC7G,MAAM,GAAG,CAAC;IAEtE,IAAIkH,oBAAoB,IAAIC,qBAAqB,EAAE;MACjD,IAAI,CAAC5K,IAAI,CAAC,qBAAqB,EAAEY,cAAc,CAAC;IAClD;EACF;;EAEA;AACF;AACA;AACA;EACE,OAAciK,SAASA,CAACC,MAAqC,EAAE;IAC7D/M,qBAAqB,GAAG;MAAE,GAAGA,qBAAqB;MAAE,GAAG+M;IAAO,CAAC;EACjE;EAEA,aAAoBC,IAAIA,CAACC,CAAC,EAAE;IAC1B,MAAM5L,eAAe,GAAG,MAAMjC,eAAe,CAAC4N,IAAI,CAAC,CAAC;IACpD,OAAO,IAAI7L,iBAAiB,CAACE,eAAe,CAAC;EAC/C;EAEA,MAAc2H,mBAAmBA,CAAA,EAAG;IAClC,IAAIvJ,QAAQ,CAACqD,EAAE,KAAK,SAAS,EAAE;IAC/B,IAAI,CAAC9C,qBAAqB,CAACC,OAAO,EAAE;;IAEpC;IACA;IACA,IAAIiN,MAAM,CAACzN,QAAQ,CAAC0N,OAAO,CAAC,IAAI,EAAE,EAAE;MAClC,IAAI;QACF,MAAM3N,kBAAkB,CAAC4N,OAAO,CAC9B5N,kBAAkB,CAAC6N,WAAW,CAACC,kBACjC,CAAC;MACH,CAAC,CAAC,OAAO3J,CAAC,EAAE;QACVwC,OAAO,CAACC,IAAI,CAAC,iDAAiD,EAAEzC,CAAC,CAAC;MACpE;IACF;IAEA,IAAI;MACF,MAAM9D,SAAS,CAACmJ,mBAAmB,CAAC;QAClC9I,KAAK,EAAEF,qBAAqB,CAACE,KAAK;QAClCC,IAAI,EAAEH,qBAAqB,CAACG,IAAI;QAChCC,SAAS,EAAEJ,qBAAqB,CAACI,SAAS;QAC1CC,WAAW,EAAEL,qBAAqB,CAACK;MACrC,CAAC,CAAC;IACJ,CAAC,CAAC,OAAOsD,CAAC,EAAE;MACVwC,OAAO,CAACC,IAAI,CAAC,kCAAkC,EAAEzC,CAAC,CAAC;IACrD;EACF;EAEO1B,IAAIA,CAACsL,KAA+B,EAAE,GAAGC,IAAW,EAAE;IAC3D,OAAO,KAAK,CAACvL,IAAI,CAACsL,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;IAAA,IAAAC,sBAAA;IAChB,IAAI,CAACC,cAAc,CAAC,CAAC;IACrB,IAAI,CAACC,cAAc,CAAC,CAAC;IACrB,IAAI,CAAC7E,qBAAqB,CAAC,CAAC;IAC5B,IAAIxJ,QAAQ,CAACqD,EAAE,KAAK,SAAS,EAAE,CAAA8K,sBAAA,GAAAlM,qBAAA,CAAKd,qBAAqB,EAA1B,IAAyB,CAAC,cAAAgN,sBAAA,eAA1BA,sBAAA,CAA4BG,MAAM,CAAC,CAAC;EACrE;EAEQF,cAAcA,CAAA,EAAG;IAAA,IAAAG,oBAAA,EAAAC,iBAAA,EAAAC,oBAAA,EAAAC,iBAAA;IACvB,CAAAH,oBAAA,OAAI,CAACtJ,aAAa,cAAAsJ,oBAAA,eAAlBA,oBAAA,CAAoBhI,IAAI,CAAC,CAAC;IAC1B,CAAAiI,iBAAA,OAAI,CAACxK,UAAU,cAAAwK,iBAAA,eAAfA,iBAAA,CAAiBjI,IAAI,CAAC,CAAC;IACvB,CAAAkI,oBAAA,OAAI,CAACxJ,aAAa,cAAAwJ,oBAAA,eAAlBA,oBAAA,CAAoB3F,OAAO,CAAC,CAAC;IAC7B,CAAA4F,iBAAA,OAAI,CAAC1K,UAAU,cAAA0K,iBAAA,eAAfA,iBAAA,CAAiB5F,OAAO,CAAC,CAAC;IAC1B,IAAI,CAACrG,YAAY,GAAG,KAAK;IACzB,IAAI,CAACuB,UAAU,GAAGhB,SAAS;IAC3B,IAAI,CAACiC,aAAa,GAAGjC,SAAS;EAChC;EAEQqL,cAAcA,CAAA,EAAG;IAAA,IAAAM,oBAAA,EAAAC,iBAAA,EAAAC,oBAAA,EAAAC,iBAAA;IACvB,CAAAH,oBAAA,OAAI,CAACzJ,aAAa,cAAAyJ,oBAAA,eAAlBA,oBAAA,CAAoBpI,IAAI,CAAC,CAAC;IAC1B,CAAAqI,iBAAA,OAAI,CAACvM,UAAU,cAAAuM,iBAAA,eAAfA,iBAAA,CAAiBrI,IAAI,CAAC,CAAC;IACvB,CAAAsI,oBAAA,OAAI,CAAC3J,aAAa,cAAA2J,oBAAA,eAAlBA,oBAAA,CAAoB/F,OAAO,CAAC,CAAC;IAC7B,CAAAgG,iBAAA,OAAI,CAACzM,UAAU,cAAAyM,iBAAA,eAAfA,iBAAA,CAAiBhG,OAAO,CAAC,CAAC;IAC1B,IAAI,CAACzG,UAAU,GAAGW,SAAS;IAC3B,IAAI,CAACkC,aAAa,GAAGlC,SAAS;EAChC;AACF","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["EventEmitter","LocalMediaUtils","AppState","NativeEventEmitter","NativeModules","PermissionsAndroid","Platform","BackgroundTimer","NativeAudioManager","setupPermissions","RTKHelper","BroadcastEventEmitter","broadcastEmitter","_meetingServiceConfig","enabled","title","text","channelId","channelName","MediaEvents","checkIfAudioTrackIsSilent","track","_localMediaUtils","WeakMap","_appState","_appStateSubscription","_interval","_screenShareState","_deviceRemovalTimeout","_broadcastEmitter","_broadcastStartedSubscription","_broadcastStoppedSubscription","LocalMediaHandler","constructor","localMediaUtils","_classPrivateFieldInitSpec","_defineProperty","nextAppState","prevAppState","_classPrivateFieldGet","_classPrivateFieldSet","match","clearInterval","videoTrack","setTimeout","setInterval","emit","audioEnabled","videoEnabled","screenShareEnabled","permissions","audio","video","screenShareTracks","undefined","currentDevices","speaker","onDeviceChange","changedDevices","OS","addListener","oniOSBroadcastStart","oniOSBroadcastStop","start","media","conditionallyRestartAudio","Promise","race","resolve","_this$audioTrack","audioTrack","addEventListener","e","reacquireTrack","shouldReacquireTrack","_this$currentDevices$","removeMediaStreamTrackListeners","setupAudioStream","deviceId","addMediaStreamTrackListeners","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","console","warn","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","val","message","constraints","_handleAppStateChange","startMeetingService","stopScreenShareTracks","tracks","_this$screenShareTrac","_this$screenShareTrac2","_this$screenShareTrac3","_this$screenShareTrac4","removeScreenShareTracks","_this$screenShareTrac5","onScreenShareEnded","_this$rawAudioTrack2","_this$rawAudioTrack3","_this$rawVideoTrack2","_this$rawVideoTrack3","setScreenShareTracks","_this$screenShareTrac6","disableAudio","toggleAudio","enableAudio","_this$currentDevices$6","ex","enableVideo","toggleVideo","disableVideo","_this$currentDevices$7","_this$rawVideoTrack4","_this$rawVideoTrack5","setAudioDevice","setVideoDevice","_this$rawVideoTrack6","_this$rawVideoTrack7","setSpeakerDevice","route","chooseAudioRoute","getScreenShareTracks","enableScreenShare","_pendingScreenShare","RTKScreensharePickerView","showScreenSharePickerView","reject","timeoutId","time","disableScreenShare","getAllDevices","availableDevices","getCurrentDevices","devices","currentDeviceId","getCurrentAudioDevice","currentDevice","forceDeviceChange","addedDevice","removedDevice","added","removed","selectedDevice","selectedDeviceInfo","clearTimeout","isBluetoothRemoved","handleRemoval","hasDeviceListChanged","hasSelectedDeviceInfo","configure","config","init","_","Number","Version","request","PERMISSIONS","POST_NOTIFICATIONS","event","args","on","listener","destruct","_classPrivateFieldGet2","stopAudioTrack","stopVideoTrack","remove","_this$rawAudioTrack4","_this$audioTrack3","_this$rawAudioTrack5","_this$audioTrack4","_this$rawVideoTrack8","_this$videoTrack3","_this$rawVideoTrack9","_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 AppStateStatus,\n NativeEventEmitter,\n NativeEventSubscription,\n NativeModules,\n PermissionsAndroid,\n Platform,\n} from 'react-native';\nimport BackgroundTimer from './BackgroundHandler';\nimport NativeAudioManager from './NativeAudioManager';\nimport { setupPermissions } from './PermissionHandler';\n\nconst { RTKHelper, BroadcastEventEmitter } = NativeModules;\n\nexport const broadcastEmitter = new NativeEventEmitter(BroadcastEventEmitter);\n\n// ---------------------------------------------------------------------------\n// Meeting foreground service config\n// Set by LocalMediaHandler.configure() before the first init() call.\n// ---------------------------------------------------------------------------\n\nexport interface MeetingServiceConfig {\n /** Whether to start the Android meeting foreground service. Default: true. */\n enabled: boolean;\n /** Notification title. Default: \"In a call\". */\n title?: string;\n /** Notification body text. Default: \"Tap to return to your meeting\". */\n text?: string;\n channelId?: string;\n channelName?: string;\n}\n\nlet _meetingServiceConfig: MeetingServiceConfig = {\n enabled: true,\n title: 'In a call',\n text: 'Tap to return to your meeting',\n channelId: 'rtk_meeting',\n channelName: 'Ongoing Meeting',\n};\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 | undefined;\n\n #interval: number;\n\n #screenShareState: 'STARTED' | 'STOPPED' | 'PENDING' | 'NOT_STARTED';\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 #broadcastEmitter: NativeEventEmitter;\n\n #broadcastStartedSubscription: NativeEventSubscription;\n\n #broadcastStoppedSubscription: NativeEventSubscription;\n\n _handleAppStateChange = (nextAppState: AppStateStatus) => {\n const prevAppState = this.#appState;\n this.#appState = nextAppState;\n\n if (\n prevAppState.match(/inactive|background/) &&\n nextAppState === 'active'\n ) {\n // App returned to foreground — stop the background keep-alive timer\n // and kick the video track to recover the camera feed.\n if (this.#interval !== null) {\n BackgroundTimer.clearInterval(this.#interval);\n this.#interval = null;\n }\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 if (nextAppState.match(/inactive|background/)) {\n // App moved to background — start a recurring no-op timer to keep the\n // JS thread alive so WebRTC/native events continue to be processed.\n // Clear any existing interval first to avoid accumulation.\n if (this.#interval !== null) {\n BackgroundTimer.clearInterval(this.#interval);\n }\n this.#interval = BackgroundTimer.setInterval(() => {}, 1000);\n }\n };\n\n public constructor(localMediaUtils: LocalMediaUtils) {\n super();\n this.#localMediaUtils = localMediaUtils;\n this.#broadcastEmitter = broadcastEmitter;\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 this.#broadcastStartedSubscription = this.#broadcastEmitter.addListener(\n 'iOS_BroadcastStarted',\n () => {\n this.oniOSBroadcastStart();\n }\n );\n this.#broadcastStoppedSubscription = this.#broadcastEmitter.addListener(\n 'iOS_BroadcastStopped',\n () => {\n this.oniOSBroadcastStop();\n }\n );\n }\n NativeAudioManager.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 = await 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 NativeAudioManager.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 = await 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.videoTrack);\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 = await 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 = await 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 = await 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 = await 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 = await 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 // Start the meeting foreground service so Android keeps the app alive\n // in the background during a call. The app is guaranteed to be in the\n // foreground at this point (user just tapped join / setup screen).\n await this.startMeetingService();\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 this.screenShareTracks?.audio?.release();\n }\n\n if (video) {\n this.screenShareTracks?.video?.stop();\n this.screenShareTracks?.video?.release();\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.rawAudioTrack?.stop();\n this.rawAudioTrack?.release();\n this.rawAudioTrack = undefined;\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.rawVideoTrack?.stop();\n this.rawVideoTrack?.release();\n this.rawVideoTrack = undefined;\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\n );\n }\n\n // Arrow function so `this` is stable — the same reference is used in both\n // addEventListener (setScreenShareTracks) and removeEventListener\n // (removeScreenShareTracks). A regular method + .bind(this) creates a new\n // function object on every call, making removeEventListener a no-op.\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: audioEnabled is set to true BEFORE setupAudioStream so that the\n * AUDIO_TRACK_CHANGE event (emitted inside setupAudioStream) sees the\n * correct enabled state and the Self.ts handler calls shareMic()\n * immediately.\n * If track acquisition fails, audioEnabled is rolled back to false below.\n */\n this.audioEnabled = true;\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 } 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.rawVideoTrack?.stop();\n this.rawVideoTrack?.release();\n this.rawVideoTrack = undefined;\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.rawVideoTrack?.stop();\n this.rawVideoTrack?.release();\n this.rawVideoTrack = undefined;\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.#screenShareState = 'STARTED';\n }\n\n private async oniOSBroadcastStop() {\n this.#screenShareState = 'STOPPED';\n if (this.screenShareEnabled) {\n this.removeScreenShareTracks();\n return;\n }\n }\n\n public async enableScreenShare() {\n // Guard: do nothing if already sharing or a consent dialog is in flight.\n if (this.screenShareEnabled || this._pendingScreenShare) return;\n\n if (Platform.OS === 'android') {\n this._pendingScreenShare = true;\n try {\n // getScreenShareTracks() manages the full flow:\n // consent dialog → start MediaProjectionService → create MediaStream\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 } finally {\n this._pendingScreenShare = false;\n }\n }\n\n if (Platform.OS === 'ios') {\n this.#screenShareState = 'PENDING';\n NativeModules.RTKScreensharePickerView.showScreenSharePickerView();\n await new Promise<void>((resolve, reject) => {\n let timeoutId: NodeJS.Timeout;\n let time: number = 0;\n timeoutId = setInterval(() => {\n if (this.#screenShareState === 'STARTED') {\n clearInterval(timeoutId);\n resolve();\n }\n time = time + 100;\n if (time > 20000) {\n clearInterval(timeoutId);\n reject('Timeout exceeded for enableScreenShare()');\n }\n }, 100);\n });\n }\n }\n\n public async disableScreenShare() {\n // Guard: nothing to stop if not sharing and no consent dialog is pending.\n if (!this.screenShareEnabled && !this._pendingScreenShare) return;\n\n if (Platform.OS !== 'ios') {\n this.removeScreenShareTracks();\n return;\n }\n\n // iOS: trigger the broadcast picker to stop the extension.\n NativeModules.RTKScreensharePickerView.showScreenSharePickerView();\n this.#screenShareState = 'PENDING';\n await new Promise<void>((resolve, reject) => {\n let timeoutId: NodeJS.Timeout;\n let time: number = 0;\n timeoutId = setInterval(() => {\n if (this.#screenShareState === 'STOPPED') {\n clearInterval(timeoutId);\n resolve();\n }\n time = time + 100;\n if (time > 20000) {\n clearInterval(timeoutId);\n reject('Timeout exceeded for disableScreenShare()');\n }\n }, 100);\n });\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 async getAudioDevices() {\n const devices = await this.#localMediaUtils.getAudioDevices();\n\n // Update current audio device from native layer\n try {\n const currentDeviceId = await NativeAudioManager.getCurrentAudioDevice();\n if (currentDeviceId) {\n const currentDevice = this.#localMediaUtils.getDeviceById(\n currentDeviceId,\n 'audioinput'\n );\n if (currentDevice) {\n this.currentDevices.audio = currentDevice;\n }\n }\n } catch (e) {\n console.warn('Failed to update current audio device:', e);\n }\n\n return devices;\n }\n\n public async getVideoDevices() {\n return await this.#localMediaUtils.getVideoDevices();\n }\n\n public async getSpeakerDevices() {\n const devices = await this.#localMediaUtils.getSpeakerDevices();\n\n // Update current speaker device from native layer\n try {\n const currentDeviceId = await NativeAudioManager.getCurrentAudioDevice();\n if (currentDeviceId) {\n const currentDevice = this.#localMediaUtils.getDeviceById(\n currentDeviceId,\n 'audioinput'\n );\n if (currentDevice) {\n this.currentDevices.speaker = currentDevice;\n this.currentDevices.audio = currentDevice;\n }\n }\n } catch (e) {\n console.warn('Failed to update current speaker device:', e);\n }\n\n return devices;\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.length > 0;\n\n if (hasDeviceListChanged || hasSelectedDeviceInfo) {\n this.emit('DEVICE_LIST_UPDATED', changedDevices);\n }\n }\n\n /**\n * Override the meeting foreground service config before the first meeting\n * session. Called by useRealtimeKitClient when keepAliveService is set.\n */\n public static configure(config: Partial<MeetingServiceConfig>) {\n _meetingServiceConfig = { ..._meetingServiceConfig, ...config };\n }\n\n public static async init(_) {\n const localMediaUtils = await LocalMediaUtils.init();\n return new LocalMediaHandler(localMediaUtils);\n }\n\n private async startMeetingService() {\n if (Platform.OS !== 'android') return;\n if (!_meetingServiceConfig.enabled) return;\n\n // Android 13+ (API 33): request POST_NOTIFICATIONS so the foreground-service\n // notification appears in the shade.\n if (Number(Platform.Version) >= 33) {\n try {\n await PermissionsAndroid.request(\n PermissionsAndroid.PERMISSIONS.POST_NOTIFICATIONS\n );\n } catch (e) {\n console.warn('Failed to request POST_NOTIFICATIONS permission', e);\n }\n }\n\n try {\n await RTKHelper.startMeetingService({\n title: _meetingServiceConfig.title,\n text: _meetingServiceConfig.text,\n channelId: _meetingServiceConfig.channelId,\n channelName: _meetingServiceConfig.channelName,\n });\n } catch (e) {\n console.warn('Failed to start KeepAliveService', e);\n }\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 this.stopAudioTrack();\n this.stopVideoTrack();\n this.stopScreenShareTracks();\n if (Platform.OS === 'android') this.#appStateSubscription?.remove();\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":[]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export const SDK_VERSION = '1.2.0-staging.
|
|
1
|
+
export const SDK_VERSION = '1.2.0-staging.4';
|
|
2
2
|
//# sourceMappingURL=version.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["SDK_VERSION"],"sources":["version.ts"],"sourcesContent":["export const SDK_VERSION = '1.2.0-staging.
|
|
1
|
+
{"version":3,"names":["SDK_VERSION"],"sources":["version.ts"],"sourcesContent":["export const SDK_VERSION = '1.2.0-staging.4';\n"],"mappings":"AAAA,OAAO,MAAMA,WAAW,GAAG,iBAAiB","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const SDK_VERSION = "1.2.0-staging.
|
|
1
|
+
export declare const SDK_VERSION = "1.2.0-staging.4";
|