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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/android/build.gradle +0 -2
  2. package/android/src/main/java/com/cloudflare/realtimekit/CoreModule.java +19 -0
  3. package/android/src/main/java/com/cloudflare/realtimekit/ForegroundService.java +2 -4
  4. package/android/src/main/java/com/cloudflare/realtimekit/RTKHelperModule.java +1 -2
  5. package/android/src/main/java/com/cloudflare/realtimekit/RTKLogger.java +116 -0
  6. package/android/src/main/java/com/cloudflare/realtimekit/incallmanager/AppRTCBluetoothManager.java +75 -74
  7. package/android/src/main/java/com/cloudflare/realtimekit/incallmanager/AppRTCUtils.java +10 -9
  8. package/android/src/main/java/com/cloudflare/realtimekit/incallmanager/InCallManagerModule.java +175 -872
  9. package/android/src/main/java/com/cloudflare/realtimekit/incallmanager/InCallProximityManager.java +9 -8
  10. package/android/src/main/java/com/cloudflare/realtimekit/incallmanager/InCallWakeLockUtils.java +8 -7
  11. package/ios/BroadcastEventEmitter.m +9 -0
  12. package/ios/Core.h +9 -1
  13. package/ios/Core.m +42 -0
  14. package/ios/RNInCallManager.m +639 -700
  15. package/ios/RTKLogger.h +51 -0
  16. package/ios/RTKLogger.m +107 -0
  17. package/ios/RTKRNBackgroundTimer.m +8 -7
  18. package/ios/RTKRNPermissionHandlerNotifications.m +12 -0
  19. package/ios/RTKRNPermissions.m +24 -1
  20. package/ios/RTKScreensharePickerView.m +6 -0
  21. package/ios/screenshare/RTKScreenshareHandler.swift +1 -1
  22. package/ios/screenshare/RTKScreenshareUploader.swift +3 -3
  23. package/ios/screenshare/RTKSocketConnection.swift +8 -8
  24. package/lib/commonjs/LocalMediaHandler.js +82 -24
  25. package/lib/commonjs/LocalMediaHandler.js.map +1 -1
  26. package/lib/commonjs/LocalMediaUtils.js +60 -5
  27. package/lib/commonjs/LocalMediaUtils.js.map +1 -1
  28. package/lib/commonjs/NativeAudioManager.js +7 -3
  29. package/lib/commonjs/NativeAudioManager.js.map +1 -1
  30. package/lib/commonjs/utils/version.js +1 -1
  31. package/lib/commonjs/utils/version.js.map +1 -1
  32. package/lib/module/LocalMediaHandler.js +82 -24
  33. package/lib/module/LocalMediaHandler.js.map +1 -1
  34. package/lib/module/LocalMediaUtils.js +60 -5
  35. package/lib/module/LocalMediaUtils.js.map +1 -1
  36. package/lib/module/NativeAudioManager.js +7 -3
  37. package/lib/module/NativeAudioManager.js.map +1 -1
  38. package/lib/module/utils/version.js +1 -1
  39. package/lib/module/utils/version.js.map +1 -1
  40. package/lib/typescript/LocalMediaHandler.d.ts +1 -0
  41. package/lib/typescript/LocalMediaUtils.d.ts +1 -0
  42. package/lib/typescript/NativeAudioManager.d.ts +1 -0
  43. package/lib/typescript/utils/version.d.ts +1 -1
  44. package/package.json +2 -4
@@ -45,6 +45,7 @@ var _localMediaUtils = /*#__PURE__*/new WeakMap();
45
45
  var _appState = /*#__PURE__*/new WeakMap();
46
46
  var _appStateSubscription = /*#__PURE__*/new WeakMap();
47
47
  var _interval = /*#__PURE__*/new WeakMap();
48
+ var _deviceRemovalTimeout = /*#__PURE__*/new WeakMap();
48
49
  class LocalMediaHandler extends _events.EventEmitter {
49
50
  async configureForeground() {
50
51
  if (_reactNative.Platform.OS !== 'android') return;
@@ -83,6 +84,7 @@ class LocalMediaHandler extends _events.EventEmitter {
83
84
  _defineProperty(this, "_pendingScreenShare", false);
84
85
  _defineProperty(this, "currentDevices", void 0);
85
86
  _defineProperty(this, "permissions", void 0);
87
+ _classPrivateFieldInitSpec(this, _deviceRemovalTimeout, null);
86
88
  _defineProperty(this, "_handleAppStateChange", nextAppState => {
87
89
  if (_classPrivateFieldGet(_appState, this).match(/inactive|background/) && nextAppState === 'active') {
88
90
  _BackgroundHandler.default.clearInterval(_classPrivateFieldGet(_interval, this));
@@ -135,13 +137,14 @@ class LocalMediaHandler extends _events.EventEmitter {
135
137
  this.oniOSBroadcastStop();
136
138
  });
137
139
  }
138
- _NativeAudioManager.default.start({});
140
+ _NativeAudioManager.default.start({
141
+ media: 'video'
142
+ });
139
143
  }
140
144
  async conditionallyRestartAudio() {
141
145
  if (!this.currentDevices.audio || !this.audioEnabled) {
142
146
  return;
143
147
  }
144
- // log.info('maybe_restart_audio: ');
145
148
  await Promise.race([new Promise(resolve => {
146
149
  var _this$audioTrack;
147
150
  return (_this$audioTrack = this.audioTrack) === null || _this$audioTrack === void 0 ? void 0 : _this$audioTrack.addEventListener('unmute', e => {
@@ -159,8 +162,6 @@ class LocalMediaHandler extends _events.EventEmitter {
159
162
  }
160
163
  async conditionallyRestartVideo() {
161
164
  if (!this.currentDevices.video || !this.videoEnabled) return;
162
- // log.info('maybe_restart_video');
163
-
164
165
  await Promise.race([new Promise(resolve => {
165
166
  var _this$videoTrack;
166
167
  return (_this$videoTrack = this.videoTrack) === null || _this$videoTrack === void 0 ? void 0 : _this$videoTrack.addEventListener('unmute', resolve);
@@ -255,6 +256,10 @@ class LocalMediaHandler extends _events.EventEmitter {
255
256
  if (this.audioTrack && this.permissions.audio === 'NOT_REQUESTED') {
256
257
  await _classPrivateFieldGet(_localMediaUtils, this).repopulateAvailableDevices();
257
258
  }
259
+
260
+ // Force update audio devices on iOS after audio session is active
261
+ // This ensures route change notifications start firing
262
+ _NativeAudioManager.default.forceUpdateAudioDevices();
258
263
  this.emit('DEVICE_CHANGE', {
259
264
  device: this.currentDevices.audio
260
265
  });
@@ -313,14 +318,33 @@ class LocalMediaHandler extends _events.EventEmitter {
313
318
  });
314
319
  }
315
320
  async setupSpeaker(deviceId) {
316
- var _this$currentDevices$4;
321
+ var _this$currentDevices$5;
317
322
  const speakerDevices = _classPrivateFieldGet(_localMediaUtils, this).getSpeakerDevices();
318
323
  if (!speakerDevices.length) {
319
324
  return;
320
325
  }
321
- const lastDeviceIndex = speakerDevices.length - 1;
322
- const speakerDeviceId = deviceId ?? speakerDevices[lastDeviceIndex].deviceId;
323
- if (((_this$currentDevices$4 = this.currentDevices.speaker) === null || _this$currentDevices$4 === void 0 ? void 0 : _this$currentDevices$4.deviceId) !== speakerDeviceId) {
326
+ let speakerDeviceId;
327
+ if (deviceId) {
328
+ // If explicit deviceId provided, use it
329
+ speakerDeviceId = deviceId;
330
+ } else {
331
+ // Prefer current device if it's still available
332
+ const currentDeviceStillAvailable = speakerDevices.find(d => {
333
+ var _this$currentDevices$4;
334
+ return d.deviceId === ((_this$currentDevices$4 = this.currentDevices.speaker) === null || _this$currentDevices$4 === void 0 ? void 0 : _this$currentDevices$4.deviceId);
335
+ });
336
+ if (currentDeviceStillAvailable) {
337
+ // Keep current device if it's still connected
338
+ speakerDeviceId = this.currentDevices.speaker.deviceId;
339
+ } else {
340
+ // Otherwise, prefer Bluetooth > Wired > Speaker > Earpiece
341
+ const bluetoothDevice = speakerDevices.find(d => d.deviceId === 'bluetooth');
342
+ const wiredDevice = speakerDevices.find(d => d.deviceId === 'wired');
343
+ const speakerDevice = speakerDevices.find(d => d.deviceId === 'speaker');
344
+ speakerDeviceId = (bluetoothDevice === null || bluetoothDevice === void 0 ? void 0 : bluetoothDevice.deviceId) ?? (wiredDevice === null || wiredDevice === void 0 ? void 0 : wiredDevice.deviceId) ?? (speakerDevice === null || speakerDevice === void 0 ? void 0 : speakerDevice.deviceId) ?? speakerDevices[0].deviceId;
345
+ }
346
+ }
347
+ if (((_this$currentDevices$5 = this.currentDevices.speaker) === null || _this$currentDevices$5 === void 0 ? void 0 : _this$currentDevices$5.deviceId) !== speakerDeviceId) {
324
348
  // Audio Input devices are same as output devices in mobile
325
349
  this.currentDevices.audio = _classPrivateFieldGet(_localMediaUtils, this).getDeviceById(speakerDeviceId, 'audioinput');
326
350
  this.currentDevices.speaker = this.currentDevices.audio;
@@ -510,7 +534,6 @@ class LocalMediaHandler extends _events.EventEmitter {
510
534
  audio,
511
535
  video
512
536
  } = tracks;
513
- // console.log('SetScreenshare called');
514
537
  if (!audio || !video) {
515
538
  this.stopScreenShareTracks({
516
539
  audio: !!audio,
@@ -559,8 +582,8 @@ class LocalMediaHandler extends _events.EventEmitter {
559
582
  * if the audio track is not preset or it has ended
560
583
  */
561
584
  if (!this.audioTrack || this.audioTrack.readyState === 'ended') {
562
- var _this$currentDevices$5;
563
- await this.setupAudioStream((_this$currentDevices$5 = this.currentDevices.audio) === null || _this$currentDevices$5 === void 0 ? void 0 : _this$currentDevices$5.deviceId);
585
+ var _this$currentDevices$6;
586
+ await this.setupAudioStream((_this$currentDevices$6 = this.currentDevices.audio) === null || _this$currentDevices$6 === void 0 ? void 0 : _this$currentDevices$6.deviceId);
564
587
  }
565
588
  // if we still can't get a track after setting up audio stream
566
589
  // do not toggle the audio state
@@ -585,7 +608,7 @@ class LocalMediaHandler extends _events.EventEmitter {
585
608
  await this.toggleVideo();
586
609
  }
587
610
  async toggleVideo() {
588
- var _this$currentDevices$6;
611
+ var _this$currentDevices$7;
589
612
  if (this.permissions.video !== 'ACCEPTED') {
590
613
  try {
591
614
  const permResult = await (0, _PermissionHandler.setupPermissions)(false, true);
@@ -612,7 +635,7 @@ class LocalMediaHandler extends _events.EventEmitter {
612
635
  * hence it must be set to true first.
613
636
  */
614
637
  this.videoEnabled = true;
615
- await this.setupVideoStream((_this$currentDevices$6 = this.currentDevices.video) === null || _this$currentDevices$6 === void 0 ? void 0 : _this$currentDevices$6.deviceId);
638
+ await this.setupVideoStream((_this$currentDevices$7 = this.currentDevices.video) === null || _this$currentDevices$7 === void 0 ? void 0 : _this$currentDevices$7.deviceId);
616
639
  }
617
640
  async setAudioDevice(device) {
618
641
  await this.setupAudioStream(device.deviceId);
@@ -710,12 +733,26 @@ class LocalMediaHandler extends _events.EventEmitter {
710
733
  if (changedDevices.added.length) [addedDevice] = changedDevices.added;
711
734
  if (changedDevices.removed.length) [removedDevice] = changedDevices.removed;
712
735
 
736
+ // Update currentDevices.speaker when platform reports selected device change
737
+ if (changedDevices.selectedDevice) {
738
+ const selectedDeviceInfo = _classPrivateFieldGet(_localMediaUtils, this).getDeviceById(changedDevices.selectedDevice, 'audioinput');
739
+ if (selectedDeviceInfo) {
740
+ this.currentDevices.speaker = selectedDeviceInfo;
741
+ this.currentDevices.audio = selectedDeviceInfo;
742
+ }
743
+ }
744
+
713
745
  /**
714
746
  * NOTE(roerohan): forceStopTrack is set required to be set to true for firefox.
715
747
  * https://stackoverflow.com/questions/59068146/navigator-mediadevices-getusermedia-api-rejecting-with-error-notreadableerror
716
748
  * forceStopTrack is the second argument of setupAudioStream and setupVideoStream.
717
749
  */
718
750
  if (addedDevice) {
751
+ // Clear any pending device removal timeout when a device is added
752
+ if (_classPrivateFieldGet(_deviceRemovalTimeout, this)) {
753
+ clearTimeout(_classPrivateFieldGet(_deviceRemovalTimeout, this));
754
+ _classPrivateFieldSet(_deviceRemovalTimeout, this, null);
755
+ }
719
756
  if (addedDevice.kind === 'audioinput') {
720
757
  if (this.permissions.audio === 'DENIED' || this.permissions.audio === 'NOT_REQUESTED') {
721
758
  await this.setupSpeaker(addedDevice.deviceId);
@@ -729,21 +766,42 @@ class LocalMediaHandler extends _events.EventEmitter {
729
766
  }
730
767
  this.emit('AUDIO_TRACK_CHANGE');
731
768
  }
732
- if (removedDevice) {
733
- if (removedDevice.kind === 'audioinput') {
734
- if (this.permissions.audio === 'DENIED' || this.permissions.audio === 'NOT_REQUESTED') {
769
+
770
+ // Only handle device removal if no device was added
771
+ // This prevents switching away from newly connected devices (e.g., Bluetooth)
772
+ if (removedDevice && !addedDevice) {
773
+ // For Bluetooth devices, add a delay to handle rapid reconnections
774
+ // (e.g., when AirPods are put in ears, they briefly disconnect then reconnect)
775
+ const isBluetoothRemoved = removedDevice.deviceId === 'bluetooth';
776
+ const handleRemoval = async () => {
777
+ if (removedDevice.kind === 'audioinput') {
778
+ if (this.permissions.audio === 'DENIED' || this.permissions.audio === 'NOT_REQUESTED') {
779
+ await this.setupSpeaker();
780
+ } else {
781
+ await this.setupAudioStream();
782
+ }
783
+ } else if (removedDevice.kind === 'videoinput') {
784
+ await this.setupVideoStream();
785
+ } else if (removedDevice.kind === 'audiooutput') {
735
786
  await this.setupSpeaker();
736
- } else {
737
- await this.setupAudioStream();
738
787
  }
739
- } else if (removedDevice.kind === 'videoinput') {
740
- await this.setupVideoStream();
741
- } else if (removedDevice.kind === 'audiooutput') {
742
- await this.setupSpeaker();
788
+ this.emit('AUDIO_TRACK_CHANGE');
789
+ };
790
+ if (isBluetoothRemoved) {
791
+ // Wait 500ms before switching away from Bluetooth to allow for reconnection
792
+ _classPrivateFieldSet(_deviceRemovalTimeout, this, setTimeout(handleRemoval, 500));
793
+ } else {
794
+ // For other devices, handle removal immediately
795
+ await handleRemoval();
743
796
  }
744
- this.emit('AUDIO_TRACK_CHANGE');
745
797
  }
746
- if (changedDevices.added.length || changedDevices.removed.length) {
798
+
799
+ // Emit DEVICE_LIST_UPDATED if:
800
+ // 1. Devices were added or removed, OR
801
+ // 2. Selected device changed (platform routed to a different device)
802
+ const hasDeviceListChanged = changedDevices.added.length || changedDevices.removed.length;
803
+ const hasSelectedDeviceInfo = changedDevices.selectedDevice !== undefined;
804
+ if (hasDeviceListChanged || hasSelectedDeviceInfo) {
747
805
  this.emit('DEVICE_LIST_UPDATED', changedDevices);
748
806
  }
749
807
  }
@@ -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","NativeEventEmitter","MediaEvents","exports","checkIfAudioTrackIsSilent","track","_localMediaUtils","WeakMap","_appState","_appStateSubscription","_interval","LocalMediaHandler","EventEmitter","configureForeground","Platform","OS","val","isForegroundServiceRunning","Version","res","PermissionsAndroid","request","PERMISSIONS","POST_NOTIFICATIONS","RESULTS","GRANTED","console","warn","createNotificationChannel","startService","constructor","localMediaUtils","nextAppState","match","BackgroundTimer","clearInterval","videoTrack","enabled","setTimeout","screenShareEnabled","_pendingScreenShare","setInterval","audioEnabled","videoEnabled","permissions","audio","video","screenShareTracks","undefined","currentDevices","speaker","onDeviceChange","changedDevices","addListener","oniOSBroadcastStart","oniOSBroadcastStop","InCallManger","start","conditionallyRestartAudio","Promise","race","resolve","_this$audioTrack","audioTrack","addEventListener","reacquireTrack","shouldReacquireTrack","_this$currentDevices$","removeMediaStreamTrackListeners","setupAudioStream","deviceId","addMediaStreamTrackListeners","emit","conditionallyRestartVideo","_this$videoTrack","setupVideoStream","kind","workaroundWebKitBug1208516","mediaStreamTrack","wasEnabled","rawAudioTrack","rawVideoTrack","isStopped","readyState","isInadvertentlyStopped","isSilentAudio","muted","removeDocumentEventListeners","onUnmute","ev","conditionallyRestart","removeEventListener","forceStopTrack","_this$currentDevices$2","audioDevices","getAudioDevices","audioDeviceId","getOperationalMicDeviceId","getDeviceById","_this$audioTrack2","_this$rawAudioTrack","stop","LocalMediaUtils","getAudioTrack","err","setAudioTrack","setDevice","repopulateAvailableDevices","device","onVisibilityChange","_this$currentDevices$3","videoDevices","getVideoDevices","videoDeviceId","getOperationalWebcamDeviceId","videoConstraints","getVideoConstraints","getVideoTrack","setVideoTrack","_this$videoTrack2","_this$rawVideoTrack","setupSpeaker","_this$currentDevices$4","speakerDevices","getSpeakerDevices","lastDeviceIndex","speakerDeviceId","isOperational","reverse","operationalDeviceId","deviceIndex","isSilent","release","setupStreams","permResult","setupPermissions","camera","microphone","message","constraints","AppState","_handleAppStateChange","stopScreenShareTracks","tracks","_this$screenShareTrac","_this$screenShareTrac2","removeScreenShareTracks","_this$screenShareTrac3","onScreenShareEnded","stopAudioTrack","stopVideoTrack","setScreenShareTracks","_this$screenShareTrac4","bind","disableAudio","toggleAudio","enableAudio","_this$currentDevices$5","ex","enableVideo","toggleVideo","disableVideo","_this$currentDevices$6","setAudioDevice","setVideoDevice","setSpeakerDevice","route","chooseAudioRoute","getScreenShareTracks","toggleScreenShare","stopService","RTKScreensharePickerView","showScreenSharePickerView","enableScreenShare","disableScreenShare","getAllDevices","availableDevices","getCurrentDevices","forceDeviceChange","addedDevice","removedDevice","added","removed","init","_","event","args","on","listener","destruct","remove","_err","_this$rawAudioTrack2","_this$audioTrack3","_this$rawAudioTrack3","_this$audioTrack4","_this$rawVideoTrack2","_this$videoTrack3","_this$rawVideoTrack3","_this$videoTrack4"],"sources":["LocalMediaHandler.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-unused-vars */\nimport { EventEmitter } from 'events';\nimport LocalMediaUtils from './LocalMediaUtils';\nimport {\n RealtimeKitMediaStreamConstraints,\n MediaPermission,\n} from './LocalMediaInterfaces';\nimport type { MediaStreamTrack } from '@cloudflare/react-native-webrtc';\nimport type { MediaDeviceInfo } from './LocalMediaInterfaces';\nimport {\n AppState,\n NativeEventEmitter,\n NativeEventSubscription,\n NativeModules,\n PermissionsAndroid,\n Platform,\n} from 'react-native';\nimport BackgroundTimer from './BackgroundHandler';\nimport InCallManger from './NativeAudioManager';\nimport { setupPermissions } from './PermissionHandler';\n\nconst { RTKHelper, BroadcastEventEmitter } = NativeModules;\n\nconst broadcastEmitter = new NativeEventEmitter(BroadcastEventEmitter);\n\n// eslint-disable-next-line no-shadow\nexport enum MediaEvents {\n AUDIO_TRACK_CHANGE,\n VIDEO_TRACK_CHANGE,\n SCREENSHARE_TRACK_CHANGE,\n SCREENSHARE_ENDED,\n DEVICE_CHANGE,\n SCREENSHARE_STARTED,\n MEDIA_PERMISSION_UPDATE,\n DEVICE_LIST_UPDATED,\n}\n\nfunction checkIfAudioTrackIsSilent(track: MediaStreamTrack) {\n //TODO\n return !!track;\n}\n\nexport default class LocalMediaHandler extends EventEmitter {\n #localMediaUtils: LocalMediaUtils;\n\n #appState: string;\n\n #appStateSubscription: NativeEventSubscription;\n\n #interval: number;\n\n public audioTrack: MediaStreamTrack;\n\n public rawAudioTrack: MediaStreamTrack;\n\n public videoTrack: MediaStreamTrack;\n\n public rawVideoTrack: MediaStreamTrack;\n\n public screenShareTracks: {\n audio?: MediaStreamTrack;\n video?: MediaStreamTrack;\n };\n\n public audioEnabled: boolean;\n\n public videoEnabled: boolean;\n\n public screenShareEnabled: boolean;\n\n private _pendingScreenShare = false;\n\n public currentDevices: {\n audio?: MediaDeviceInfo;\n video?: MediaDeviceInfo;\n speaker?: MediaDeviceInfo;\n };\n\n public permissions: {\n audio?: MediaPermission;\n video?: MediaPermission;\n };\n\n _handleAppStateChange = (nextAppState) => {\n if (\n this.#appState.match(/inactive|background/) &&\n nextAppState === 'active'\n ) {\n BackgroundTimer.clearInterval(this.#interval);\n this.#interval = null;\n if (this.videoTrack) {\n this.videoTrack.enabled = false;\n setTimeout(() => {\n if (this.videoTrack) {\n this.videoTrack.enabled = true;\n }\n }, 100);\n }\n } else {\n if (this.#interval === null) {\n if (this.screenShareEnabled || this._pendingScreenShare) {\n this.configureForeground();\n }\n }\n this.#interval = BackgroundTimer.setInterval(() => {}, 1000);\n this.#appState = nextAppState;\n }\n };\n\n private async configureForeground() {\n if (Platform.OS !== 'android') return;\n const val = await RTKHelper.isForegroundServiceRunning();\n if (!val) {\n if ((Platform.Version as number) >= 33) {\n const res = await PermissionsAndroid.request(\n PermissionsAndroid.PERMISSIONS.POST_NOTIFICATIONS\n );\n if (res !== PermissionsAndroid.RESULTS.GRANTED) {\n console.warn('Permission required for screenshare notification');\n }\n }\n if ((Platform.Version as number) >= 26) {\n await RTKHelper.createNotificationChannel();\n }\n try {\n await RTKHelper.startService();\n } catch (e) {\n console.warn('Failed to start foreground service', e);\n }\n }\n }\n\n public constructor(localMediaUtils: LocalMediaUtils) {\n super();\n this.#localMediaUtils = localMediaUtils;\n this.#appState = '';\n this.audioEnabled = true;\n this.videoEnabled = true;\n this.screenShareEnabled = false;\n this.permissions = { audio: 'NOT_REQUESTED', video: 'NOT_REQUESTED' };\n this.screenShareTracks = {\n audio: undefined,\n video: undefined,\n };\n this.currentDevices = {\n audio: undefined,\n video: undefined,\n speaker: undefined,\n };\n // LocalMediaUtils onDeviceChange with callback from native onAudioDeviceChanged events\n this.#localMediaUtils.onDeviceChange(async (changedDevices) => {\n await this.onDeviceChange(changedDevices, false);\n });\n if (Platform.OS === 'ios') {\n broadcastEmitter.addListener('iOS_BroadcastStarted', () => {\n this.oniOSBroadcastStart();\n });\n broadcastEmitter.addListener('iOS_BroadcastStopped', () => {\n this.oniOSBroadcastStop();\n });\n }\n InCallManger.start({});\n }\n\n private async conditionallyRestartAudio() {\n if (!this.currentDevices.audio || !this.audioEnabled) {\n return;\n }\n // log.info('maybe_restart_audio: ');\n await Promise.race([\n new Promise((resolve) =>\n this.audioTrack?.addEventListener('unmute', (e) => {\n resolve(e);\n })\n ),\n new Promise((resolve) => setTimeout(resolve, 50)),\n ]);\n const reacquireTrack = await this.shouldReacquireTrack('audio');\n\n if (reacquireTrack) {\n this.removeMediaStreamTrackListeners(this.audioTrack);\n await this.setupAudioStream(this.currentDevices.audio?.deviceId);\n this.addMediaStreamTrackListeners(this.audioTrack);\n this.emit('AUDIO_TRACK_CHANGE');\n }\n }\n\n private async conditionallyRestartVideo() {\n if (!this.currentDevices.video || !this.videoEnabled) return;\n // log.info('maybe_restart_video');\n\n await Promise.race([\n new Promise((resolve) =>\n this.videoTrack?.addEventListener('unmute', resolve)\n ),\n new Promise((resolve) => setTimeout(resolve, 50)),\n ]);\n\n const reacquireTrack = await this.shouldReacquireTrack('video');\n\n if (reacquireTrack) {\n this.removeMediaStreamTrackListeners(this.videoTrack);\n await this.setupVideoStream(this.currentDevices.video.deviceId);\n this.addMediaStreamTrackListeners(this.videoTrack);\n this.emit('VIDEO_TRACK_CHANGE');\n }\n }\n\n private async shouldReacquireTrack(kind: 'audio' | 'video') {\n const workaroundWebKitBug1208516 = false;\n let mediaStreamTrack: MediaStreamTrack;\n let wasEnabled = false;\n\n if (kind === 'audio') {\n mediaStreamTrack = this.audioTrack;\n wasEnabled = this.audioEnabled;\n } else if (kind === 'video') {\n mediaStreamTrack = this.videoTrack;\n wasEnabled = this.videoEnabled;\n }\n\n if (!mediaStreamTrack) return false;\n if (!this.rawAudioTrack || !this.audioTrack) return true;\n if (!this.rawVideoTrack || !this.videoTrack) return true;\n const isStopped = mediaStreamTrack.readyState === 'ended';\n\n const isInadvertentlyStopped =\n isStopped && wasEnabled && workaroundWebKitBug1208516;\n\n let isSilentAudio = false;\n if (kind === 'audio') {\n isSilentAudio = await checkIfAudioTrackIsSilent(this.audioTrack);\n }\n\n return mediaStreamTrack.muted || isInadvertentlyStopped || isSilentAudio;\n }\n\n public async removeDocumentEventListeners() {}\n\n private onUnmute(ev) {\n // log.info('Track unmuted', ev);\n }\n\n private removeMediaStreamTrackListeners(mediaStreamTrack: MediaStreamTrack) {\n if (!mediaStreamTrack) {\n return undefined;\n }\n\n const conditionallyRestart =\n mediaStreamTrack.kind === 'audio'\n ? this.conditionallyRestartAudio\n : this.conditionallyRestartVideo;\n mediaStreamTrack.removeEventListener('ended', conditionallyRestart);\n mediaStreamTrack.removeEventListener('mute', conditionallyRestart);\n mediaStreamTrack.removeEventListener('unmute', this.onUnmute);\n return mediaStreamTrack;\n }\n\n private addMediaStreamTrackListeners(mediaStreamTrack: MediaStreamTrack) {\n if (!mediaStreamTrack) {\n return null;\n }\n const conditionallyRestart =\n mediaStreamTrack.kind === 'audio'\n ? this.conditionallyRestartAudio\n : this.conditionallyRestartVideo;\n mediaStreamTrack.addEventListener('ended', conditionallyRestart);\n mediaStreamTrack.addEventListener('mute', conditionallyRestart);\n mediaStreamTrack.addEventListener('unmute', this.onUnmute);\n\n return mediaStreamTrack;\n }\n\n public async setupAudioStream(\n deviceId?: string,\n forceStopTrack: boolean = false\n ) {\n const audioDevices = this.#localMediaUtils.getAudioDevices();\n\n if (!audioDevices.length) {\n return;\n }\n\n let audioDeviceId = deviceId;\n\n if (!audioDeviceId) {\n audioDeviceId = (await this.getOperationalMicDeviceId()).deviceId;\n }\n\n if (this.currentDevices.audio?.deviceId !== audioDeviceId) {\n this.currentDevices.audio = this.#localMediaUtils.getDeviceById(\n audioDeviceId,\n 'audioinput'\n );\n }\n if (forceStopTrack) {\n this.audioTrack?.stop();\n this.rawAudioTrack?.stop();\n }\n try {\n this.rawAudioTrack = await LocalMediaUtils.getAudioTrack();\n } catch (err) {\n console.warn('Failed to acquire audio track: ', err);\n this.rawAudioTrack = undefined;\n }\n this.setAudioTrack(this.rawAudioTrack);\n this.addMediaStreamTrackListeners(this.audioTrack);\n this.emit('AUDIO_TRACK_CHANGE');\n this.setDevice(this.currentDevices.audio);\n\n /**\n * NOTE(roerohan): Firefox does not show device labels until permissions are granted.\n * So, we need to repopulate the devices once permission is granted.\n */\n if (this.audioTrack && this.permissions.audio === 'NOT_REQUESTED') {\n await this.#localMediaUtils.repopulateAvailableDevices();\n }\n\n this.emit('DEVICE_CHANGE', {\n device: this.currentDevices.audio,\n });\n }\n\n private onVisibilityChange() {\n // pass\n }\n\n public async setupVideoStream(\n deviceId?: string,\n forceStopTrack: boolean = false\n ) {\n const videoDevices = this.#localMediaUtils.getVideoDevices();\n if (!videoDevices.length) {\n return;\n }\n\n let videoDeviceId = deviceId;\n if (!videoDeviceId) {\n videoDeviceId = (await this.getOperationalWebcamDeviceId()).deviceId;\n }\n\n if (this.currentDevices.video?.deviceId !== videoDeviceId) {\n this.currentDevices.video = this.#localMediaUtils.getDeviceById(\n videoDeviceId,\n 'videoinput'\n );\n }\n\n /**\n * NOTE(roerohan): this.videoEnabled is checked, so that upon device change,\n * the video track is not set when the user has turned off his camera.\n */\n if (this.videoEnabled) {\n const videoConstraints = LocalMediaUtils.getVideoConstraints({\n videoDeviceId,\n });\n if (!this.rawVideoTrack) {\n try {\n this.rawVideoTrack = await LocalMediaUtils.getVideoTrack(\n videoConstraints\n );\n } catch (err) {\n console.warn('Failed to acquire video track: ', err);\n this.rawVideoTrack = undefined;\n }\n }\n this.setVideoTrack(this.rawVideoTrack);\n this.addMediaStreamTrackListeners(this.rawVideoTrack);\n this.emit('VIDEO_TRACK_CHANGE');\n }\n\n if (forceStopTrack) {\n this.videoTrack?.stop();\n this.rawVideoTrack?.stop();\n }\n /**\n * NOTE(roerohan): Firefox does not show device labels until permissions are granted.\n * So, we need to repopulate the devices once permission is granted.\n */\n if (this.videoTrack && this.permissions.video === 'NOT_REQUESTED') {\n await this.#localMediaUtils.repopulateAvailableDevices();\n }\n this.emit('DEVICE_CHANGE', {\n device: this.currentDevices.video,\n });\n }\n\n public async setupSpeaker(deviceId?: string) {\n const speakerDevices = this.#localMediaUtils.getSpeakerDevices();\n if (!speakerDevices.length) {\n return;\n }\n const lastDeviceIndex = speakerDevices.length - 1;\n const speakerDeviceId =\n deviceId ?? speakerDevices[lastDeviceIndex].deviceId;\n if (this.currentDevices.speaker?.deviceId !== speakerDeviceId) {\n // Audio Input devices are same as output devices in mobile\n this.currentDevices.audio = this.#localMediaUtils.getDeviceById(\n speakerDeviceId,\n 'audioinput'\n );\n this.currentDevices.speaker = this.currentDevices.audio;\n }\n await this.setDevice(this.currentDevices.audio);\n this.emit('DEVICE_CHANGE', {\n device: this.currentDevices.speaker,\n });\n }\n\n public async getOperationalWebcamDeviceId(): Promise<{\n isOperational: boolean;\n deviceId: string;\n }> {\n let videoDevices = this.#localMediaUtils.getVideoDevices();\n if (!videoDevices.length) {\n return { isOperational: false, deviceId: null };\n }\n\n /*\n NOTE(ravindra-dyte): Usually external devices come at the bottom,\n By reversing the deviceList and breaking on first operational device\n We are giving preference to external device\n */\n\n videoDevices = [...videoDevices].reverse();\n\n let operationalDeviceId = null;\n for (\n let deviceIndex = 0;\n deviceIndex < videoDevices.length;\n deviceIndex += 1\n ) {\n try {\n operationalDeviceId = videoDevices[deviceIndex].deviceId;\n break;\n } catch (err) {}\n }\n\n return operationalDeviceId\n ? { isOperational: true, deviceId: operationalDeviceId }\n : { isOperational: false, deviceId: videoDevices[0].deviceId };\n }\n\n public async getOperationalMicDeviceId(): Promise<{\n isOperational: boolean;\n deviceId: string;\n }> {\n let audioDevices = this.#localMediaUtils.getAudioDevices();\n if (!audioDevices.length) {\n return { isOperational: false, deviceId: null };\n }\n /*\n NOTE(ravindra-dyte): Usually external devices come at the bottom,\n By reversing the deviceList and breaking on first operational device\n We are giving preference to external device\n */\n\n audioDevices = [...audioDevices].reverse();\n let operationalDeviceId = null;\n\n for (\n let deviceIndex = 0;\n deviceIndex < audioDevices.length;\n deviceIndex += 1\n ) {\n try {\n const audioTrack = await LocalMediaUtils.getAudioTrack();\n\n const isSilent = await checkIfAudioTrackIsSilent(audioTrack);\n audioTrack.stop();\n audioTrack.release();\n if (!isSilent) {\n operationalDeviceId = audioDevices[deviceIndex].deviceId;\n break;\n }\n } catch (err) {\n console.warn('Failed to acquire audio track: ', err);\n }\n }\n\n return operationalDeviceId\n ? { isOperational: true, deviceId: operationalDeviceId }\n : { isOperational: false, deviceId: audioDevices[0].deviceId };\n }\n\n public async setupStreams({\n audio,\n video,\n }: {\n audio: boolean;\n video: boolean;\n }) {\n try {\n const permResult = await setupPermissions(audio, video);\n this.permissions.video = permResult.camera;\n this.permissions.audio = permResult.microphone;\n } catch (val) {\n this.permissions.video = val.camera ?? false;\n this.permissions.audio = val.microphone ?? false;\n }\n this.emit('MEDIA_PERMISSION_UPDATE', {\n kind: 'audio',\n message: this.permissions.audio,\n });\n\n this.emit('MEDIA_PERMISSION_UPDATE', {\n kind: 'video',\n message: this.permissions.video,\n });\n const constraints: RealtimeKitMediaStreamConstraints = {};\n if (!this.currentDevices) {\n this.currentDevices = {\n audio: undefined,\n video: undefined,\n speaker: undefined,\n };\n }\n if (audio) {\n const audioDevices = this.#localMediaUtils.getAudioDevices();\n if (audioDevices.length !== 0) {\n const audioDeviceId = (await this.getOperationalMicDeviceId()).deviceId;\n this.currentDevices.audio = this.#localMediaUtils.getDeviceById(\n audioDeviceId,\n 'audioinput'\n );\n constraints.audio = true;\n }\n }\n\n if (video) {\n const videoDevices = this.#localMediaUtils.getVideoDevices();\n if (videoDevices.length !== 0) {\n const videoDeviceId = (await this.getOperationalWebcamDeviceId())\n .deviceId;\n this.currentDevices.video = this.#localMediaUtils.getDeviceById(\n videoDeviceId,\n 'videoinput'\n );\n\n const videoConstraints = LocalMediaUtils.getVideoConstraints({\n videoDeviceId,\n });\n constraints.video = videoConstraints.video;\n }\n }\n\n if (audio) await this.setupAudioStream();\n if (video) await this.setupVideoStream();\n\n if (this.audioTrack) this.audioEnabled = true;\n else this.audioEnabled = false;\n\n if (this.videoTrack) this.videoEnabled = true;\n else this.videoEnabled = false;\n\n this.screenShareEnabled = false;\n\n // Setting default audio output to speaker\n await this.setupSpeaker();\n\n // Setup Foreground Service after handling permissions\n if (Platform.OS === 'android') {\n this.#appStateSubscription = AppState.addEventListener(\n 'change',\n this._handleAppStateChange\n );\n }\n }\n\n private stopScreenShareTracks(\n tracks: { audio?: boolean; video?: boolean } = {}\n ) {\n const { audio = true, video = true } = tracks;\n if (audio) {\n this.screenShareTracks?.audio?.stop();\n }\n\n if (video) {\n this.screenShareTracks?.video?.stop();\n }\n\n if (audio && video) {\n this.screenShareEnabled = false;\n }\n }\n\n public removeScreenShareTracks(tracks?: {\n audio?: boolean;\n video?: boolean;\n }) {\n this.screenShareTracks.video?.removeEventListener(\n 'ended',\n this.onScreenShareEnded\n );\n this.stopScreenShareTracks(tracks);\n this.screenShareTracks = {\n audio: undefined,\n video: undefined,\n };\n }\n\n private setAudioTrack(audioTrack: MediaStreamTrack) {\n if (audioTrack === this.audioTrack) {\n return;\n }\n\n if (audioTrack === undefined) {\n this.stopAudioTrack();\n }\n\n this.audioTrack = audioTrack;\n }\n\n private setVideoTrack(videoTrack: MediaStreamTrack) {\n if (videoTrack === this.videoTrack) {\n return;\n }\n\n if (videoTrack === undefined) {\n this.stopVideoTrack();\n }\n\n this.videoTrack = videoTrack;\n }\n\n private setScreenShareTracks(tracks: {\n audio?: MediaStreamTrack;\n video?: MediaStreamTrack;\n }) {\n const { audio, video } = tracks;\n // console.log('SetScreenshare called');\n if (!audio || !video) {\n this.stopScreenShareTracks({ audio: !!audio, video: !!video });\n }\n\n this.screenShareTracks = tracks;\n this.screenShareTracks.video?.addEventListener(\n 'ended',\n this.onScreenShareEnded.bind(this)\n );\n }\n\n private onScreenShareEnded() {\n this.emit('SCREENSHARE_ENDED');\n }\n\n public async disableAudio() {\n await this.toggleAudio();\n }\n\n public async enableAudio() {\n await this.toggleAudio();\n }\n\n public async toggleAudio() {\n if (this.permissions.audio !== 'ACCEPTED') {\n try {\n const permResult = await setupPermissions(true, false);\n this.permissions.audio = permResult.microphone;\n } catch (val) {\n this.permissions.audio = val.microphone ?? false;\n }\n }\n this.emit('MEDIA_PERMISSION_UPDATE', {\n kind: 'audio',\n message: this.permissions.audio,\n });\n if (\n this.permissions.audio === 'DENIED' ||\n this.permissions.audio === 'NOT_REQUESTED'\n ) {\n this.audioEnabled = false;\n return;\n }\n if (this.audioEnabled) {\n this.audioEnabled = false;\n\n if (this.audioTrack) {\n this.audioTrack.enabled = this.audioEnabled;\n }\n return;\n }\n try {\n /**\n * NOTE (@madhugb): We need to setup new stream,\n * if the audio track is not preset or it has ended\n */\n if (!this.audioTrack || this.audioTrack.readyState === 'ended') {\n await this.setupAudioStream(this.currentDevices.audio?.deviceId);\n }\n // if we still can't get a track after setting up audio stream\n // do not toggle the audio state\n if (!this.audioTrack) {\n this.audioEnabled = false;\n return;\n }\n this.audioEnabled = true;\n } catch (ex) {\n this.audioEnabled = false;\n this.audioTrack = undefined;\n this.rawAudioTrack = undefined;\n }\n if (this.audioTrack) {\n this.audioTrack.enabled = true;\n }\n }\n\n public async enableVideo() {\n await this.toggleVideo();\n }\n\n public async disableVideo() {\n await this.toggleVideo();\n }\n\n public async toggleVideo() {\n if (this.permissions.video !== 'ACCEPTED') {\n try {\n const permResult = await setupPermissions(false, true);\n this.permissions.video = permResult.camera;\n } catch (val) {\n this.permissions.video = val.camera ?? false;\n }\n }\n this.emit('MEDIA_PERMISSION_UPDATE', {\n kind: 'video',\n message: this.permissions.video,\n });\n if (\n this.permissions.video === 'DENIED' ||\n this.permissions.video === 'NOT_REQUESTED'\n ) {\n this.videoEnabled = false;\n return;\n }\n if (this.videoEnabled) {\n this.stopVideoTrack();\n this.videoEnabled = false;\n return;\n }\n /**\n * NOTE(roerohan): The videoEnabled flag is used inside the setupVideoStream method\n * hence it must be set to true first.\n */\n this.videoEnabled = true;\n await this.setupVideoStream(this.currentDevices.video?.deviceId);\n }\n\n public async setAudioDevice(device: MediaDeviceInfo) {\n await this.setupAudioStream(device.deviceId);\n }\n\n public async setVideoDevice(device: MediaDeviceInfo) {\n if (this.videoEnabled) {\n this.stopVideoTrack();\n }\n await this.setupVideoStream(device.deviceId);\n }\n\n public async setSpeakerDevice(device?: MediaDeviceInfo) {\n await this.setupSpeaker(device.deviceId);\n }\n\n public async setDevice(route: MediaDeviceInfo) {\n await this.#localMediaUtils.chooseAudioRoute(route.deviceId);\n }\n\n private async oniOSBroadcastStart() {\n this.setScreenShareTracks(await LocalMediaUtils.getScreenShareTracks());\n this.screenShareEnabled = true;\n this.emit('SCREENSHARE_TRACK_CHANGE');\n }\n\n private async oniOSBroadcastStop() {\n if (this.screenShareEnabled) {\n this.removeScreenShareTracks();\n this.emit('SCREENSHARE_TRACK_CHANGE');\n return;\n }\n }\n\n public async toggleScreenShare() {\n if (this.screenShareEnabled && Platform.OS !== 'ios') {\n this.removeScreenShareTracks();\n try {\n const val = await RTKHelper.isForegroundServiceRunning();\n if (val) {\n await RTKHelper.stopService();\n }\n } catch (e) {\n console.warn('Failed to stop foreground service', e);\n }\n return;\n }\n if (Platform.OS === 'ios' && this.screenShareEnabled) {\n NativeModules.RTKScreensharePickerView.showScreenSharePickerView();\n return;\n }\n\n if (Platform.OS === 'android') {\n this._pendingScreenShare = true;\n await this.configureForeground();\n try {\n this.setScreenShareTracks(await LocalMediaUtils.getScreenShareTracks());\n this.screenShareEnabled = true;\n } catch (e) {\n console.warn('Failed to start screenshare', e);\n this.screenShareEnabled = false;\n const val = await RTKHelper.isForegroundServiceRunning();\n if (val) {\n await RTKHelper.stopService();\n }\n this._pendingScreenShare = false;\n } finally {\n this._pendingScreenShare = false;\n }\n }\n if (Platform.OS === 'ios') {\n NativeModules.RTKScreensharePickerView.showScreenSharePickerView();\n }\n }\n\n public async enableScreenShare() {\n await this.toggleScreenShare();\n }\n\n public async disableScreenShare() {\n await this.toggleScreenShare();\n }\n\n public getAllDevices() {\n return this.#localMediaUtils.availableDevices;\n }\n\n public getCurrentDevices() {\n return this.currentDevices;\n }\n\n public getDeviceById(\n deviceId: string,\n kind: 'audioinput' | 'audiooutput' | 'videoinput'\n ) {\n return this.#localMediaUtils.getDeviceById(deviceId, kind);\n }\n\n public getAudioDevices() {\n return this.#localMediaUtils.getAudioDevices();\n }\n\n public getVideoDevices() {\n return this.#localMediaUtils.getVideoDevices();\n }\n\n public getSpeakerDevices() {\n return this.#localMediaUtils.getSpeakerDevices();\n }\n\n public async onDeviceChange(\n changedDevices: {\n added: MediaDeviceInfo[];\n removed: MediaDeviceInfo[];\n },\n forceDeviceChange: boolean\n ) {\n let addedDevice: MediaDeviceInfo;\n let removedDevice: MediaDeviceInfo;\n if (changedDevices.added.length) [addedDevice] = changedDevices.added;\n\n if (changedDevices.removed.length) [removedDevice] = changedDevices.removed;\n\n /**\n * NOTE(roerohan): forceStopTrack is set required to be set to true for firefox.\n * https://stackoverflow.com/questions/59068146/navigator-mediadevices-getusermedia-api-rejecting-with-error-notreadableerror\n * forceStopTrack is the second argument of setupAudioStream and setupVideoStream.\n */\n if (addedDevice) {\n if (addedDevice.kind === 'audioinput') {\n if (\n this.permissions.audio === 'DENIED' ||\n this.permissions.audio === 'NOT_REQUESTED'\n ) {\n await this.setupSpeaker(addedDevice.deviceId);\n } else {\n await this.setupAudioStream(addedDevice.deviceId);\n }\n } else if (addedDevice.kind === 'videoinput') {\n await this.setupVideoStream(addedDevice.deviceId);\n } else if (addedDevice.kind === 'audiooutput') {\n await this.setupSpeaker(addedDevice.deviceId);\n }\n this.emit('AUDIO_TRACK_CHANGE');\n }\n\n if (removedDevice) {\n if (removedDevice.kind === 'audioinput') {\n if (\n this.permissions.audio === 'DENIED' ||\n this.permissions.audio === 'NOT_REQUESTED'\n ) {\n await this.setupSpeaker();\n } else {\n await this.setupAudioStream();\n }\n } else if (removedDevice.kind === 'videoinput') {\n await this.setupVideoStream();\n } else if (removedDevice.kind === 'audiooutput') {\n await this.setupSpeaker();\n }\n this.emit('AUDIO_TRACK_CHANGE');\n }\n\n if (changedDevices.added.length || changedDevices.removed.length) {\n this.emit('DEVICE_LIST_UPDATED', changedDevices);\n }\n }\n\n public static async init(_) {\n const localMediaUtils = await LocalMediaUtils.init();\n return new LocalMediaHandler(localMediaUtils);\n }\n\n public emit(event: keyof typeof MediaEvents, ...args: any[]) {\n return super.emit(event, ...args);\n }\n\n public on(\n event: keyof typeof MediaEvents,\n listener: (...args: any[]) => void\n ) {\n return super.on(event, listener);\n }\n\n public destruct() {\n // TODO: Do not remove native broadcast listeners when going OFF_STAGE in webinar\n // this.#localMediaUtils.destruct();\n if (Platform.OS === 'android') this.#appStateSubscription.remove();\n BackgroundTimer.stop();\n try {\n if (Platform.OS === 'android') RTKHelper.stopService();\n } catch (_err) {}\n // InCallManger.stop(undefined);\n }\n\n private stopAudioTrack() {\n this.rawAudioTrack?.stop();\n this.audioTrack?.stop();\n this.rawAudioTrack?.release();\n this.audioTrack?.release();\n this.audioEnabled = false;\n this.audioTrack = undefined;\n this.rawAudioTrack = undefined;\n }\n\n private stopVideoTrack() {\n this.rawVideoTrack?.stop();\n this.videoTrack?.stop();\n this.rawVideoTrack?.release();\n this.videoTrack?.release();\n this.videoTrack = undefined;\n this.rawVideoTrack = undefined;\n }\n}\n\nexport interface RNLocalMediaHandler {\n new (): LocalMediaHandler;\n}\n"],"mappings":"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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","NativeEventEmitter","MediaEvents","exports","checkIfAudioTrackIsSilent","track","_localMediaUtils","WeakMap","_appState","_appStateSubscription","_interval","_deviceRemovalTimeout","LocalMediaHandler","EventEmitter","configureForeground","Platform","OS","val","isForegroundServiceRunning","Version","res","PermissionsAndroid","request","PERMISSIONS","POST_NOTIFICATIONS","RESULTS","GRANTED","console","warn","createNotificationChannel","startService","constructor","localMediaUtils","nextAppState","match","BackgroundTimer","clearInterval","videoTrack","enabled","setTimeout","screenShareEnabled","_pendingScreenShare","setInterval","audioEnabled","videoEnabled","permissions","audio","video","screenShareTracks","undefined","currentDevices","speaker","onDeviceChange","changedDevices","addListener","oniOSBroadcastStart","oniOSBroadcastStop","InCallManger","start","media","conditionallyRestartAudio","Promise","race","resolve","_this$audioTrack","audioTrack","addEventListener","reacquireTrack","shouldReacquireTrack","_this$currentDevices$","removeMediaStreamTrackListeners","setupAudioStream","deviceId","addMediaStreamTrackListeners","emit","conditionallyRestartVideo","_this$videoTrack","setupVideoStream","kind","workaroundWebKitBug1208516","mediaStreamTrack","wasEnabled","rawAudioTrack","rawVideoTrack","isStopped","readyState","isInadvertentlyStopped","isSilentAudio","muted","removeDocumentEventListeners","onUnmute","ev","conditionallyRestart","removeEventListener","forceStopTrack","_this$currentDevices$2","audioDevices","getAudioDevices","audioDeviceId","getOperationalMicDeviceId","getDeviceById","_this$audioTrack2","_this$rawAudioTrack","stop","LocalMediaUtils","getAudioTrack","err","setAudioTrack","setDevice","repopulateAvailableDevices","forceUpdateAudioDevices","device","onVisibilityChange","_this$currentDevices$3","videoDevices","getVideoDevices","videoDeviceId","getOperationalWebcamDeviceId","videoConstraints","getVideoConstraints","getVideoTrack","setVideoTrack","_this$videoTrack2","_this$rawVideoTrack","setupSpeaker","_this$currentDevices$5","speakerDevices","getSpeakerDevices","speakerDeviceId","currentDeviceStillAvailable","find","d","_this$currentDevices$4","bluetoothDevice","wiredDevice","speakerDevice","isOperational","reverse","operationalDeviceId","deviceIndex","isSilent","release","setupStreams","permResult","setupPermissions","camera","microphone","message","constraints","AppState","_handleAppStateChange","stopScreenShareTracks","tracks","_this$screenShareTrac","_this$screenShareTrac2","removeScreenShareTracks","_this$screenShareTrac3","onScreenShareEnded","stopAudioTrack","stopVideoTrack","setScreenShareTracks","_this$screenShareTrac4","bind","disableAudio","toggleAudio","enableAudio","_this$currentDevices$6","ex","enableVideo","toggleVideo","disableVideo","_this$currentDevices$7","setAudioDevice","setVideoDevice","setSpeakerDevice","route","chooseAudioRoute","getScreenShareTracks","toggleScreenShare","stopService","RTKScreensharePickerView","showScreenSharePickerView","enableScreenShare","disableScreenShare","getAllDevices","availableDevices","getCurrentDevices","forceDeviceChange","addedDevice","removedDevice","added","removed","selectedDevice","selectedDeviceInfo","clearTimeout","isBluetoothRemoved","handleRemoval","hasDeviceListChanged","hasSelectedDeviceInfo","init","_","event","args","on","listener","destruct","remove","_err","_this$rawAudioTrack2","_this$audioTrack3","_this$rawAudioTrack3","_this$audioTrack4","_this$rawVideoTrack2","_this$videoTrack3","_this$rawVideoTrack3","_this$videoTrack4"],"sources":["LocalMediaHandler.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-unused-vars */\nimport { EventEmitter } from 'events';\nimport LocalMediaUtils from './LocalMediaUtils';\nimport {\n RealtimeKitMediaStreamConstraints,\n MediaPermission,\n} from './LocalMediaInterfaces';\nimport type { MediaStreamTrack } from '@cloudflare/react-native-webrtc';\nimport type { MediaDeviceInfo } from './LocalMediaInterfaces';\nimport {\n AppState,\n NativeEventEmitter,\n NativeEventSubscription,\n NativeModules,\n PermissionsAndroid,\n Platform,\n} from 'react-native';\nimport BackgroundTimer from './BackgroundHandler';\nimport InCallManger from './NativeAudioManager';\nimport { setupPermissions } from './PermissionHandler';\n\nconst { RTKHelper, BroadcastEventEmitter } = NativeModules;\n\nconst broadcastEmitter = new NativeEventEmitter(BroadcastEventEmitter);\n\n// eslint-disable-next-line no-shadow\nexport enum MediaEvents {\n AUDIO_TRACK_CHANGE,\n VIDEO_TRACK_CHANGE,\n SCREENSHARE_TRACK_CHANGE,\n SCREENSHARE_ENDED,\n DEVICE_CHANGE,\n SCREENSHARE_STARTED,\n MEDIA_PERMISSION_UPDATE,\n DEVICE_LIST_UPDATED,\n}\n\nfunction checkIfAudioTrackIsSilent(track: MediaStreamTrack) {\n //TODO\n return !!track;\n}\n\nexport default class LocalMediaHandler extends EventEmitter {\n #localMediaUtils: LocalMediaUtils;\n\n #appState: string;\n\n #appStateSubscription: NativeEventSubscription;\n\n #interval: number;\n\n public audioTrack: MediaStreamTrack;\n\n public rawAudioTrack: MediaStreamTrack;\n\n public videoTrack: MediaStreamTrack;\n\n public rawVideoTrack: MediaStreamTrack;\n\n public screenShareTracks: {\n audio?: MediaStreamTrack;\n video?: MediaStreamTrack;\n };\n\n public audioEnabled: boolean;\n\n public videoEnabled: boolean;\n\n public screenShareEnabled: boolean;\n\n private _pendingScreenShare = false;\n\n public currentDevices: {\n audio?: MediaDeviceInfo;\n video?: MediaDeviceInfo;\n speaker?: MediaDeviceInfo;\n };\n\n public permissions: {\n audio?: MediaPermission;\n video?: MediaPermission;\n };\n\n #deviceRemovalTimeout: NodeJS.Timeout | null = null;\n\n _handleAppStateChange = (nextAppState) => {\n if (\n this.#appState.match(/inactive|background/) &&\n nextAppState === 'active'\n ) {\n BackgroundTimer.clearInterval(this.#interval);\n this.#interval = null;\n if (this.videoTrack) {\n this.videoTrack.enabled = false;\n setTimeout(() => {\n if (this.videoTrack) {\n this.videoTrack.enabled = true;\n }\n }, 100);\n }\n } else {\n if (this.#interval === null) {\n if (this.screenShareEnabled || this._pendingScreenShare) {\n this.configureForeground();\n }\n }\n this.#interval = BackgroundTimer.setInterval(() => {}, 1000);\n this.#appState = nextAppState;\n }\n };\n\n private async configureForeground() {\n if (Platform.OS !== 'android') return;\n const val = await RTKHelper.isForegroundServiceRunning();\n if (!val) {\n if ((Platform.Version as number) >= 33) {\n const res = await PermissionsAndroid.request(\n PermissionsAndroid.PERMISSIONS.POST_NOTIFICATIONS\n );\n if (res !== PermissionsAndroid.RESULTS.GRANTED) {\n console.warn('Permission required for screenshare notification');\n }\n }\n if ((Platform.Version as number) >= 26) {\n await RTKHelper.createNotificationChannel();\n }\n try {\n await RTKHelper.startService();\n } catch (e) {\n console.warn('Failed to start foreground service', e);\n }\n }\n }\n\n public constructor(localMediaUtils: LocalMediaUtils) {\n super();\n this.#localMediaUtils = localMediaUtils;\n this.#appState = '';\n this.audioEnabled = true;\n this.videoEnabled = true;\n this.screenShareEnabled = false;\n this.permissions = { audio: 'NOT_REQUESTED', video: 'NOT_REQUESTED' };\n this.screenShareTracks = {\n audio: undefined,\n video: undefined,\n };\n this.currentDevices = {\n audio: undefined,\n video: undefined,\n speaker: undefined,\n };\n // LocalMediaUtils onDeviceChange with callback from native onAudioDeviceChanged events\n this.#localMediaUtils.onDeviceChange(async (changedDevices) => {\n await this.onDeviceChange(changedDevices, false);\n });\n if (Platform.OS === 'ios') {\n broadcastEmitter.addListener('iOS_BroadcastStarted', () => {\n this.oniOSBroadcastStart();\n });\n broadcastEmitter.addListener('iOS_BroadcastStopped', () => {\n this.oniOSBroadcastStop();\n });\n }\n InCallManger.start({ media: 'video' });\n }\n\n private async conditionallyRestartAudio() {\n if (!this.currentDevices.audio || !this.audioEnabled) {\n return;\n }\n await Promise.race([\n new Promise((resolve) =>\n this.audioTrack?.addEventListener('unmute', (e) => {\n resolve(e);\n })\n ),\n new Promise((resolve) => setTimeout(resolve, 50)),\n ]);\n const reacquireTrack = await this.shouldReacquireTrack('audio');\n\n if (reacquireTrack) {\n this.removeMediaStreamTrackListeners(this.audioTrack);\n await this.setupAudioStream(this.currentDevices.audio?.deviceId);\n this.addMediaStreamTrackListeners(this.audioTrack);\n this.emit('AUDIO_TRACK_CHANGE');\n }\n }\n\n private async conditionallyRestartVideo() {\n if (!this.currentDevices.video || !this.videoEnabled) return;\n\n await Promise.race([\n new Promise((resolve) =>\n this.videoTrack?.addEventListener('unmute', resolve)\n ),\n new Promise((resolve) => setTimeout(resolve, 50)),\n ]);\n\n const reacquireTrack = await this.shouldReacquireTrack('video');\n\n if (reacquireTrack) {\n this.removeMediaStreamTrackListeners(this.videoTrack);\n await this.setupVideoStream(this.currentDevices.video.deviceId);\n this.addMediaStreamTrackListeners(this.videoTrack);\n this.emit('VIDEO_TRACK_CHANGE');\n }\n }\n\n private async shouldReacquireTrack(kind: 'audio' | 'video') {\n const workaroundWebKitBug1208516 = false;\n let mediaStreamTrack: MediaStreamTrack;\n let wasEnabled = false;\n\n if (kind === 'audio') {\n mediaStreamTrack = this.audioTrack;\n wasEnabled = this.audioEnabled;\n } else if (kind === 'video') {\n mediaStreamTrack = this.videoTrack;\n wasEnabled = this.videoEnabled;\n }\n\n if (!mediaStreamTrack) return false;\n if (!this.rawAudioTrack || !this.audioTrack) return true;\n if (!this.rawVideoTrack || !this.videoTrack) return true;\n const isStopped = mediaStreamTrack.readyState === 'ended';\n\n const isInadvertentlyStopped =\n isStopped && wasEnabled && workaroundWebKitBug1208516;\n\n let isSilentAudio = false;\n if (kind === 'audio') {\n isSilentAudio = await checkIfAudioTrackIsSilent(this.audioTrack);\n }\n\n return mediaStreamTrack.muted || isInadvertentlyStopped || isSilentAudio;\n }\n\n public async removeDocumentEventListeners() {}\n\n private onUnmute(ev) {\n // log.info('Track unmuted', ev);\n }\n\n private removeMediaStreamTrackListeners(mediaStreamTrack: MediaStreamTrack) {\n if (!mediaStreamTrack) {\n return undefined;\n }\n\n const conditionallyRestart =\n mediaStreamTrack.kind === 'audio'\n ? this.conditionallyRestartAudio\n : this.conditionallyRestartVideo;\n mediaStreamTrack.removeEventListener('ended', conditionallyRestart);\n mediaStreamTrack.removeEventListener('mute', conditionallyRestart);\n mediaStreamTrack.removeEventListener('unmute', this.onUnmute);\n return mediaStreamTrack;\n }\n\n private addMediaStreamTrackListeners(mediaStreamTrack: MediaStreamTrack) {\n if (!mediaStreamTrack) {\n return null;\n }\n const conditionallyRestart =\n mediaStreamTrack.kind === 'audio'\n ? this.conditionallyRestartAudio\n : this.conditionallyRestartVideo;\n mediaStreamTrack.addEventListener('ended', conditionallyRestart);\n mediaStreamTrack.addEventListener('mute', conditionallyRestart);\n mediaStreamTrack.addEventListener('unmute', this.onUnmute);\n\n return mediaStreamTrack;\n }\n\n public async setupAudioStream(\n deviceId?: string,\n forceStopTrack: boolean = false\n ) {\n const audioDevices = this.#localMediaUtils.getAudioDevices();\n\n if (!audioDevices.length) {\n return;\n }\n\n let audioDeviceId = deviceId;\n\n if (!audioDeviceId) {\n audioDeviceId = (await this.getOperationalMicDeviceId()).deviceId;\n }\n\n if (this.currentDevices.audio?.deviceId !== audioDeviceId) {\n this.currentDevices.audio = this.#localMediaUtils.getDeviceById(\n audioDeviceId,\n 'audioinput'\n );\n }\n if (forceStopTrack) {\n this.audioTrack?.stop();\n this.rawAudioTrack?.stop();\n }\n try {\n this.rawAudioTrack = await LocalMediaUtils.getAudioTrack();\n } catch (err) {\n console.warn('Failed to acquire audio track: ', err);\n this.rawAudioTrack = undefined;\n }\n this.setAudioTrack(this.rawAudioTrack);\n this.addMediaStreamTrackListeners(this.audioTrack);\n this.emit('AUDIO_TRACK_CHANGE');\n this.setDevice(this.currentDevices.audio);\n\n /**\n * NOTE(roerohan): Firefox does not show device labels until permissions are granted.\n * So, we need to repopulate the devices once permission is granted.\n */\n if (this.audioTrack && this.permissions.audio === 'NOT_REQUESTED') {\n await this.#localMediaUtils.repopulateAvailableDevices();\n }\n\n // Force update audio devices on iOS after audio session is active\n // This ensures route change notifications start firing\n InCallManger.forceUpdateAudioDevices();\n\n this.emit('DEVICE_CHANGE', {\n device: this.currentDevices.audio,\n });\n }\n\n private onVisibilityChange() {\n // pass\n }\n\n public async setupVideoStream(\n deviceId?: string,\n forceStopTrack: boolean = false\n ) {\n const videoDevices = this.#localMediaUtils.getVideoDevices();\n if (!videoDevices.length) {\n return;\n }\n\n let videoDeviceId = deviceId;\n if (!videoDeviceId) {\n videoDeviceId = (await this.getOperationalWebcamDeviceId()).deviceId;\n }\n\n if (this.currentDevices.video?.deviceId !== videoDeviceId) {\n this.currentDevices.video = this.#localMediaUtils.getDeviceById(\n videoDeviceId,\n 'videoinput'\n );\n }\n\n /**\n * NOTE(roerohan): this.videoEnabled is checked, so that upon device change,\n * the video track is not set when the user has turned off his camera.\n */\n if (this.videoEnabled) {\n const videoConstraints = LocalMediaUtils.getVideoConstraints({\n videoDeviceId,\n });\n if (!this.rawVideoTrack) {\n try {\n this.rawVideoTrack = await LocalMediaUtils.getVideoTrack(\n videoConstraints\n );\n } catch (err) {\n console.warn('Failed to acquire video track: ', err);\n this.rawVideoTrack = undefined;\n }\n }\n this.setVideoTrack(this.rawVideoTrack);\n this.addMediaStreamTrackListeners(this.rawVideoTrack);\n this.emit('VIDEO_TRACK_CHANGE');\n }\n\n if (forceStopTrack) {\n this.videoTrack?.stop();\n this.rawVideoTrack?.stop();\n }\n /**\n * NOTE(roerohan): Firefox does not show device labels until permissions are granted.\n * So, we need to repopulate the devices once permission is granted.\n */\n if (this.videoTrack && this.permissions.video === 'NOT_REQUESTED') {\n await this.#localMediaUtils.repopulateAvailableDevices();\n }\n this.emit('DEVICE_CHANGE', {\n device: this.currentDevices.video,\n });\n }\n\n public async setupSpeaker(deviceId?: string) {\n const speakerDevices = this.#localMediaUtils.getSpeakerDevices();\n if (!speakerDevices.length) {\n return;\n }\n\n let speakerDeviceId: string;\n\n if (deviceId) {\n // If explicit deviceId provided, use it\n speakerDeviceId = deviceId;\n } else {\n // Prefer current device if it's still available\n const currentDeviceStillAvailable = speakerDevices.find(\n (d) => d.deviceId === this.currentDevices.speaker?.deviceId\n );\n\n if (currentDeviceStillAvailable) {\n // Keep current device if it's still connected\n speakerDeviceId = this.currentDevices.speaker.deviceId;\n } else {\n // Otherwise, prefer Bluetooth > Wired > Speaker > Earpiece\n const bluetoothDevice = speakerDevices.find(\n (d) => d.deviceId === 'bluetooth'\n );\n const wiredDevice = speakerDevices.find((d) => d.deviceId === 'wired');\n const speakerDevice = speakerDevices.find(\n (d) => d.deviceId === 'speaker'\n );\n\n speakerDeviceId =\n bluetoothDevice?.deviceId ??\n wiredDevice?.deviceId ??\n speakerDevice?.deviceId ??\n speakerDevices[0].deviceId;\n }\n }\n\n if (this.currentDevices.speaker?.deviceId !== speakerDeviceId) {\n // Audio Input devices are same as output devices in mobile\n this.currentDevices.audio = this.#localMediaUtils.getDeviceById(\n speakerDeviceId,\n 'audioinput'\n );\n this.currentDevices.speaker = this.currentDevices.audio;\n }\n await this.setDevice(this.currentDevices.audio);\n this.emit('DEVICE_CHANGE', {\n device: this.currentDevices.speaker,\n });\n }\n\n public async getOperationalWebcamDeviceId(): Promise<{\n isOperational: boolean;\n deviceId: string;\n }> {\n let videoDevices = this.#localMediaUtils.getVideoDevices();\n if (!videoDevices.length) {\n return { isOperational: false, deviceId: null };\n }\n\n /*\n NOTE(ravindra-dyte): Usually external devices come at the bottom,\n By reversing the deviceList and breaking on first operational device\n We are giving preference to external device\n */\n\n videoDevices = [...videoDevices].reverse();\n\n let operationalDeviceId = null;\n for (\n let deviceIndex = 0;\n deviceIndex < videoDevices.length;\n deviceIndex += 1\n ) {\n try {\n operationalDeviceId = videoDevices[deviceIndex].deviceId;\n break;\n } catch (err) {}\n }\n\n return operationalDeviceId\n ? { isOperational: true, deviceId: operationalDeviceId }\n : { isOperational: false, deviceId: videoDevices[0].deviceId };\n }\n\n public async getOperationalMicDeviceId(): Promise<{\n isOperational: boolean;\n deviceId: string;\n }> {\n let audioDevices = this.#localMediaUtils.getAudioDevices();\n if (!audioDevices.length) {\n return { isOperational: false, deviceId: null };\n }\n /*\n NOTE(ravindra-dyte): Usually external devices come at the bottom,\n By reversing the deviceList and breaking on first operational device\n We are giving preference to external device\n */\n\n audioDevices = [...audioDevices].reverse();\n let operationalDeviceId = null;\n\n for (\n let deviceIndex = 0;\n deviceIndex < audioDevices.length;\n deviceIndex += 1\n ) {\n try {\n const audioTrack = await LocalMediaUtils.getAudioTrack();\n\n const isSilent = await checkIfAudioTrackIsSilent(audioTrack);\n audioTrack.stop();\n audioTrack.release();\n if (!isSilent) {\n operationalDeviceId = audioDevices[deviceIndex].deviceId;\n break;\n }\n } catch (err) {\n console.warn('Failed to acquire audio track: ', err);\n }\n }\n\n return operationalDeviceId\n ? { isOperational: true, deviceId: operationalDeviceId }\n : { isOperational: false, deviceId: audioDevices[0].deviceId };\n }\n\n public async setupStreams({\n audio,\n video,\n }: {\n audio: boolean;\n video: boolean;\n }) {\n try {\n const permResult = await setupPermissions(audio, video);\n this.permissions.video = permResult.camera;\n this.permissions.audio = permResult.microphone;\n } catch (val) {\n this.permissions.video = val.camera ?? false;\n this.permissions.audio = val.microphone ?? false;\n }\n this.emit('MEDIA_PERMISSION_UPDATE', {\n kind: 'audio',\n message: this.permissions.audio,\n });\n\n this.emit('MEDIA_PERMISSION_UPDATE', {\n kind: 'video',\n message: this.permissions.video,\n });\n const constraints: RealtimeKitMediaStreamConstraints = {};\n if (!this.currentDevices) {\n this.currentDevices = {\n audio: undefined,\n video: undefined,\n speaker: undefined,\n };\n }\n if (audio) {\n const audioDevices = this.#localMediaUtils.getAudioDevices();\n if (audioDevices.length !== 0) {\n const audioDeviceId = (await this.getOperationalMicDeviceId()).deviceId;\n this.currentDevices.audio = this.#localMediaUtils.getDeviceById(\n audioDeviceId,\n 'audioinput'\n );\n constraints.audio = true;\n }\n }\n\n if (video) {\n const videoDevices = this.#localMediaUtils.getVideoDevices();\n if (videoDevices.length !== 0) {\n const videoDeviceId = (await this.getOperationalWebcamDeviceId())\n .deviceId;\n this.currentDevices.video = this.#localMediaUtils.getDeviceById(\n videoDeviceId,\n 'videoinput'\n );\n\n const videoConstraints = LocalMediaUtils.getVideoConstraints({\n videoDeviceId,\n });\n constraints.video = videoConstraints.video;\n }\n }\n\n if (audio) await this.setupAudioStream();\n if (video) await this.setupVideoStream();\n\n if (this.audioTrack) this.audioEnabled = true;\n else this.audioEnabled = false;\n\n if (this.videoTrack) this.videoEnabled = true;\n else this.videoEnabled = false;\n\n this.screenShareEnabled = false;\n\n // Setting default audio output to speaker\n await this.setupSpeaker();\n\n // Setup Foreground Service after handling permissions\n if (Platform.OS === 'android') {\n this.#appStateSubscription = AppState.addEventListener(\n 'change',\n this._handleAppStateChange\n );\n }\n }\n\n private stopScreenShareTracks(\n tracks: { audio?: boolean; video?: boolean } = {}\n ) {\n const { audio = true, video = true } = tracks;\n if (audio) {\n this.screenShareTracks?.audio?.stop();\n }\n\n if (video) {\n this.screenShareTracks?.video?.stop();\n }\n\n if (audio && video) {\n this.screenShareEnabled = false;\n }\n }\n\n public removeScreenShareTracks(tracks?: {\n audio?: boolean;\n video?: boolean;\n }) {\n this.screenShareTracks.video?.removeEventListener(\n 'ended',\n this.onScreenShareEnded\n );\n this.stopScreenShareTracks(tracks);\n this.screenShareTracks = {\n audio: undefined,\n video: undefined,\n };\n }\n\n private setAudioTrack(audioTrack: MediaStreamTrack) {\n if (audioTrack === this.audioTrack) {\n return;\n }\n\n if (audioTrack === undefined) {\n this.stopAudioTrack();\n }\n\n this.audioTrack = audioTrack;\n }\n\n private setVideoTrack(videoTrack: MediaStreamTrack) {\n if (videoTrack === this.videoTrack) {\n return;\n }\n\n if (videoTrack === undefined) {\n this.stopVideoTrack();\n }\n\n this.videoTrack = videoTrack;\n }\n\n private setScreenShareTracks(tracks: {\n audio?: MediaStreamTrack;\n video?: MediaStreamTrack;\n }) {\n const { audio, video } = tracks;\n if (!audio || !video) {\n this.stopScreenShareTracks({ audio: !!audio, video: !!video });\n }\n\n this.screenShareTracks = tracks;\n this.screenShareTracks.video?.addEventListener(\n 'ended',\n this.onScreenShareEnded.bind(this)\n );\n }\n\n private onScreenShareEnded() {\n this.emit('SCREENSHARE_ENDED');\n }\n\n public async disableAudio() {\n await this.toggleAudio();\n }\n\n public async enableAudio() {\n await this.toggleAudio();\n }\n\n public async toggleAudio() {\n if (this.permissions.audio !== 'ACCEPTED') {\n try {\n const permResult = await setupPermissions(true, false);\n this.permissions.audio = permResult.microphone;\n } catch (val) {\n this.permissions.audio = val.microphone ?? false;\n }\n }\n this.emit('MEDIA_PERMISSION_UPDATE', {\n kind: 'audio',\n message: this.permissions.audio,\n });\n if (\n this.permissions.audio === 'DENIED' ||\n this.permissions.audio === 'NOT_REQUESTED'\n ) {\n this.audioEnabled = false;\n return;\n }\n if (this.audioEnabled) {\n this.audioEnabled = false;\n\n if (this.audioTrack) {\n this.audioTrack.enabled = this.audioEnabled;\n }\n return;\n }\n try {\n /**\n * NOTE (@madhugb): We need to setup new stream,\n * if the audio track is not preset or it has ended\n */\n if (!this.audioTrack || this.audioTrack.readyState === 'ended') {\n await this.setupAudioStream(this.currentDevices.audio?.deviceId);\n }\n // if we still can't get a track after setting up audio stream\n // do not toggle the audio state\n if (!this.audioTrack) {\n this.audioEnabled = false;\n return;\n }\n this.audioEnabled = true;\n } catch (ex) {\n this.audioEnabled = false;\n this.audioTrack = undefined;\n this.rawAudioTrack = undefined;\n }\n if (this.audioTrack) {\n this.audioTrack.enabled = true;\n }\n }\n\n public async enableVideo() {\n await this.toggleVideo();\n }\n\n public async disableVideo() {\n await this.toggleVideo();\n }\n\n public async toggleVideo() {\n if (this.permissions.video !== 'ACCEPTED') {\n try {\n const permResult = await setupPermissions(false, true);\n this.permissions.video = permResult.camera;\n } catch (val) {\n this.permissions.video = val.camera ?? false;\n }\n }\n this.emit('MEDIA_PERMISSION_UPDATE', {\n kind: 'video',\n message: this.permissions.video,\n });\n if (\n this.permissions.video === 'DENIED' ||\n this.permissions.video === 'NOT_REQUESTED'\n ) {\n this.videoEnabled = false;\n return;\n }\n if (this.videoEnabled) {\n this.stopVideoTrack();\n this.videoEnabled = false;\n return;\n }\n /**\n * NOTE(roerohan): The videoEnabled flag is used inside the setupVideoStream method\n * hence it must be set to true first.\n */\n this.videoEnabled = true;\n await this.setupVideoStream(this.currentDevices.video?.deviceId);\n }\n\n public async setAudioDevice(device: MediaDeviceInfo) {\n await this.setupAudioStream(device.deviceId);\n }\n\n public async setVideoDevice(device: MediaDeviceInfo) {\n if (this.videoEnabled) {\n this.stopVideoTrack();\n }\n await this.setupVideoStream(device.deviceId);\n }\n\n public async setSpeakerDevice(device?: MediaDeviceInfo) {\n await this.setupSpeaker(device.deviceId);\n }\n\n public async setDevice(route: MediaDeviceInfo) {\n await this.#localMediaUtils.chooseAudioRoute(route.deviceId);\n }\n\n private async oniOSBroadcastStart() {\n this.setScreenShareTracks(await LocalMediaUtils.getScreenShareTracks());\n this.screenShareEnabled = true;\n this.emit('SCREENSHARE_TRACK_CHANGE');\n }\n\n private async oniOSBroadcastStop() {\n if (this.screenShareEnabled) {\n this.removeScreenShareTracks();\n this.emit('SCREENSHARE_TRACK_CHANGE');\n return;\n }\n }\n\n public async toggleScreenShare() {\n if (this.screenShareEnabled && Platform.OS !== 'ios') {\n this.removeScreenShareTracks();\n try {\n const val = await RTKHelper.isForegroundServiceRunning();\n if (val) {\n await RTKHelper.stopService();\n }\n } catch (e) {\n console.warn('Failed to stop foreground service', e);\n }\n return;\n }\n if (Platform.OS === 'ios' && this.screenShareEnabled) {\n NativeModules.RTKScreensharePickerView.showScreenSharePickerView();\n return;\n }\n\n if (Platform.OS === 'android') {\n this._pendingScreenShare = true;\n await this.configureForeground();\n try {\n this.setScreenShareTracks(await LocalMediaUtils.getScreenShareTracks());\n this.screenShareEnabled = true;\n } catch (e) {\n console.warn('Failed to start screenshare', e);\n this.screenShareEnabled = false;\n const val = await RTKHelper.isForegroundServiceRunning();\n if (val) {\n await RTKHelper.stopService();\n }\n this._pendingScreenShare = false;\n } finally {\n this._pendingScreenShare = false;\n }\n }\n if (Platform.OS === 'ios') {\n NativeModules.RTKScreensharePickerView.showScreenSharePickerView();\n }\n }\n\n public async enableScreenShare() {\n await this.toggleScreenShare();\n }\n\n public async disableScreenShare() {\n await this.toggleScreenShare();\n }\n\n public getAllDevices() {\n return this.#localMediaUtils.availableDevices;\n }\n\n public getCurrentDevices() {\n return this.currentDevices;\n }\n\n public getDeviceById(\n deviceId: string,\n kind: 'audioinput' | 'audiooutput' | 'videoinput'\n ) {\n return this.#localMediaUtils.getDeviceById(deviceId, kind);\n }\n\n public getAudioDevices() {\n return this.#localMediaUtils.getAudioDevices();\n }\n\n public getVideoDevices() {\n return this.#localMediaUtils.getVideoDevices();\n }\n\n public getSpeakerDevices() {\n return this.#localMediaUtils.getSpeakerDevices();\n }\n\n public async onDeviceChange(\n changedDevices: {\n added: MediaDeviceInfo[];\n removed: MediaDeviceInfo[];\n selectedDevice?: string;\n },\n forceDeviceChange: boolean\n ) {\n let addedDevice: MediaDeviceInfo;\n let removedDevice: MediaDeviceInfo;\n if (changedDevices.added.length) [addedDevice] = changedDevices.added;\n\n if (changedDevices.removed.length) [removedDevice] = changedDevices.removed;\n\n // Update currentDevices.speaker when platform reports selected device change\n if (changedDevices.selectedDevice) {\n const selectedDeviceInfo = this.#localMediaUtils.getDeviceById(\n changedDevices.selectedDevice,\n 'audioinput'\n );\n\n if (selectedDeviceInfo) {\n this.currentDevices.speaker = selectedDeviceInfo;\n this.currentDevices.audio = selectedDeviceInfo;\n }\n }\n\n /**\n * NOTE(roerohan): forceStopTrack is set required to be set to true for firefox.\n * https://stackoverflow.com/questions/59068146/navigator-mediadevices-getusermedia-api-rejecting-with-error-notreadableerror\n * forceStopTrack is the second argument of setupAudioStream and setupVideoStream.\n */\n if (addedDevice) {\n // Clear any pending device removal timeout when a device is added\n if (this.#deviceRemovalTimeout) {\n clearTimeout(this.#deviceRemovalTimeout);\n this.#deviceRemovalTimeout = null;\n }\n\n if (addedDevice.kind === 'audioinput') {\n if (\n this.permissions.audio === 'DENIED' ||\n this.permissions.audio === 'NOT_REQUESTED'\n ) {\n await this.setupSpeaker(addedDevice.deviceId);\n } else {\n await this.setupAudioStream(addedDevice.deviceId);\n }\n } else if (addedDevice.kind === 'videoinput') {\n await this.setupVideoStream(addedDevice.deviceId);\n } else if (addedDevice.kind === 'audiooutput') {\n await this.setupSpeaker(addedDevice.deviceId);\n }\n this.emit('AUDIO_TRACK_CHANGE');\n }\n\n // Only handle device removal if no device was added\n // This prevents switching away from newly connected devices (e.g., Bluetooth)\n if (removedDevice && !addedDevice) {\n // For Bluetooth devices, add a delay to handle rapid reconnections\n // (e.g., when AirPods are put in ears, they briefly disconnect then reconnect)\n const isBluetoothRemoved = removedDevice.deviceId === 'bluetooth';\n\n const handleRemoval = async () => {\n if (removedDevice.kind === 'audioinput') {\n if (\n this.permissions.audio === 'DENIED' ||\n this.permissions.audio === 'NOT_REQUESTED'\n ) {\n await this.setupSpeaker();\n } else {\n await this.setupAudioStream();\n }\n } else if (removedDevice.kind === 'videoinput') {\n await this.setupVideoStream();\n } else if (removedDevice.kind === 'audiooutput') {\n await this.setupSpeaker();\n }\n this.emit('AUDIO_TRACK_CHANGE');\n };\n\n if (isBluetoothRemoved) {\n // Wait 500ms before switching away from Bluetooth to allow for reconnection\n this.#deviceRemovalTimeout = setTimeout(handleRemoval, 500);\n } else {\n // For other devices, handle removal immediately\n await handleRemoval();\n }\n }\n\n // Emit DEVICE_LIST_UPDATED if:\n // 1. Devices were added or removed, OR\n // 2. Selected device changed (platform routed to a different device)\n const hasDeviceListChanged =\n changedDevices.added.length || changedDevices.removed.length;\n const hasSelectedDeviceInfo = changedDevices.selectedDevice !== undefined;\n\n if (hasDeviceListChanged || hasSelectedDeviceInfo) {\n this.emit('DEVICE_LIST_UPDATED', changedDevices);\n }\n }\n\n public static async init(_) {\n const localMediaUtils = await LocalMediaUtils.init();\n return new LocalMediaHandler(localMediaUtils);\n }\n\n public emit(event: keyof typeof MediaEvents, ...args: any[]) {\n return super.emit(event, ...args);\n }\n\n public on(\n event: keyof typeof MediaEvents,\n listener: (...args: any[]) => void\n ) {\n return super.on(event, listener);\n }\n\n public destruct() {\n // TODO: Do not remove native broadcast listeners when going OFF_STAGE in webinar\n // this.#localMediaUtils.destruct();\n if (Platform.OS === 'android') this.#appStateSubscription.remove();\n BackgroundTimer.stop();\n try {\n if (Platform.OS === 'android') RTKHelper.stopService();\n } catch (_err) {}\n // InCallManger.stop(undefined);\n }\n\n private stopAudioTrack() {\n this.rawAudioTrack?.stop();\n this.audioTrack?.stop();\n this.rawAudioTrack?.release();\n this.audioTrack?.release();\n this.audioEnabled = false;\n this.audioTrack = undefined;\n this.rawAudioTrack = undefined;\n }\n\n private stopVideoTrack() {\n this.rawVideoTrack?.stop();\n this.videoTrack?.stop();\n this.rawVideoTrack?.release();\n this.videoTrack?.release();\n this.videoTrack = undefined;\n this.rawVideoTrack = undefined;\n }\n}\n\nexport interface RNLocalMediaHandler {\n new (): LocalMediaHandler;\n}\n"],"mappings":"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","ignoreList":[]}
@@ -56,10 +56,12 @@ const VIDEO_CONSTRAINTS = exports.VIDEO_CONSTRAINTS = {
56
56
  */
57
57
  var _availableDevices = /*#__PURE__*/new WeakMap();
58
58
  var _nativeEventEmitter = /*#__PURE__*/new WeakMap();
59
+ var _previouslySelectedDevice = /*#__PURE__*/new WeakMap();
59
60
  class LocalMediaUtils {
60
61
  constructor(availableDevices) {
61
62
  _classPrivateFieldInitSpec(this, _availableDevices, void 0);
62
63
  _classPrivateFieldInitSpec(this, _nativeEventEmitter, void 0);
64
+ _classPrivateFieldInitSpec(this, _previouslySelectedDevice, null);
63
65
  _classPrivateFieldSet(_availableDevices, this, availableDevices);
64
66
  _classPrivateFieldSet(_nativeEventEmitter, this, new _reactNative.NativeEventEmitter(_reactNative.NativeModules.InCallManager));
65
67
  }
@@ -214,18 +216,47 @@ class LocalMediaUtils {
214
216
  const checkDeviceId = _id => {
215
217
  if (_id.toLowerCase().includes('speaker')) return 'speaker';else return _id;
216
218
  };
219
+
220
+ // Extract selected device from event
221
+ const selectedDevice = deviceData.selectedAudioDevice;
222
+ const hasSelectedDeviceChanged = selectedDevice && _classPrivateFieldGet(_previouslySelectedDevice, this) !== null && selectedDevice !== _classPrivateFieldGet(_previouslySelectedDevice, this);
223
+
224
+ // On first event, we need to initialize previouslySelectedDevice and fire callback
225
+ const isFirstDeviceEvent = selectedDevice && _classPrivateFieldGet(_previouslySelectedDevice, this) === null;
226
+
227
+ // Update previouslySelectedDevice IMMEDIATELY after detection to avoid race conditions
228
+ // This must happen BEFORE any async operations
229
+ if (selectedDevice) {
230
+ _classPrivateFieldSet(_previouslySelectedDevice, this, selectedDevice);
231
+ }
217
232
  const previouslyAvailableDevices = _classPrivateFieldGet(_availableDevices, this).filter(device => device.kind === 'audioinput' || device.kind === 'audiooutput');
218
233
  const previouslyAvailableDeviceIds = previouslyAvailableDevices.map(device => checkDeviceId(device.deviceId));
234
+
235
+ // Parse available device list from event to detect list changes
236
+ let availableDeviceListFromEvent = [];
219
237
  const len = deviceData.availableAudioDeviceList.length;
238
+ if (typeof deviceData.availableAudioDeviceList === 'string') {
239
+ try {
240
+ availableDeviceListFromEvent = JSON.parse(deviceData.availableAudioDeviceList);
241
+ } catch (e) {
242
+ // If parsing fails, fall back to empty array
243
+ availableDeviceListFromEvent = [];
244
+ }
245
+ }
220
246
  if (len === 0) {
221
247
  const currentlyAvailableDevices = await LocalMediaUtils.enumerateAudioDevices();
222
248
  const currentlyAvailableDeviceIds = currentlyAvailableDevices.map(device => checkDeviceId(device.deviceId));
223
249
  const changedDevices = {
224
250
  added: currentlyAvailableDevices.filter(device => !previouslyAvailableDeviceIds.includes(checkDeviceId(device.deviceId))),
225
- removed: previouslyAvailableDevices.filter(device => !currentlyAvailableDeviceIds.includes(device.deviceId))
251
+ removed: previouslyAvailableDevices.filter(device => !currentlyAvailableDeviceIds.includes(device.deviceId)),
252
+ selectedDevice: selectedDevice
226
253
  };
254
+
255
+ // Check if available device list changed
256
+ const hasAvailableListChanged = availableDeviceListFromEvent.length > 0 && (availableDeviceListFromEvent.length !== previouslyAvailableDeviceIds.length || !availableDeviceListFromEvent.every(device => previouslyAvailableDeviceIds.includes(device)));
227
257
  this.repopulateAvailableDevices().then(() => {
228
- if (changedDevices.added.length || changedDevices.removed.length) {
258
+ const shouldFireCallback = changedDevices.added.length || changedDevices.removed.length || hasSelectedDeviceChanged || isFirstDeviceEvent || hasAvailableListChanged;
259
+ if (shouldFireCallback) {
229
260
  callback(changedDevices, false);
230
261
  }
231
262
  });
@@ -235,10 +266,15 @@ class LocalMediaUtils {
235
266
  const availableAudioDevices = await LocalMediaUtils.enumerateAudioDevices();
236
267
  const changedDevices = {
237
268
  added: availableAudioDevices.filter(device => !previouslyAvailableDeviceIds.includes(checkDeviceId(device.deviceId))),
238
- removed: previouslyAvailableDevices.filter(device => !currentlyAvailableDeviceIds.includes(device.deviceId))
269
+ removed: previouslyAvailableDevices.filter(device => !currentlyAvailableDeviceIds.includes(device.deviceId)),
270
+ selectedDevice: selectedDevice
239
271
  };
272
+
273
+ // Check if available device list changed
274
+ const hasAvailableListChanged = availableDeviceListFromEvent.length > 0 && (availableDeviceListFromEvent.length !== previouslyAvailableDeviceIds.length || !availableDeviceListFromEvent.every(device => previouslyAvailableDeviceIds.includes(device)));
240
275
  this.repopulateAvailableDevices().then(() => {
241
- if (changedDevices.added.length || changedDevices.removed.length) {
276
+ const shouldFireCallback = changedDevices.added.length || changedDevices.removed.length || hasSelectedDeviceChanged || isFirstDeviceEvent || hasAvailableListChanged;
277
+ if (shouldFireCallback) {
242
278
  callback(changedDevices, false);
243
279
  }
244
280
  });
@@ -263,7 +299,26 @@ class LocalMediaUtils {
263
299
  return _classPrivateFieldGet(_availableDevices, this).filter(device => device.kind === kind);
264
300
  }
265
301
  getDeviceById(deviceId, kind) {
266
- return _classPrivateFieldGet(_availableDevices, this).find(device => device.deviceId === deviceId && device.kind === kind);
302
+ const normalizedDeviceId = deviceId.toLowerCase();
303
+ return _classPrivateFieldGet(_availableDevices, this).find(device => {
304
+ if (device.kind !== kind) return false;
305
+ const deviceIdLower = device.deviceId.toLowerCase();
306
+
307
+ // Exact match first
308
+ if (device.deviceId === deviceId) return true;
309
+
310
+ // iOS special cases
311
+ if (normalizedDeviceId === 'speaker' && deviceIdLower.includes('speaker')) {
312
+ return true;
313
+ }
314
+ if (normalizedDeviceId === 'bluetooth' && deviceIdLower.includes('bluetooth')) {
315
+ return true;
316
+ }
317
+ if (normalizedDeviceId === 'earpiece' && deviceIdLower.includes('earpiece')) {
318
+ return true;
319
+ }
320
+ return false;
321
+ });
267
322
  }
268
323
 
269
324
  /**