@cloudflare/realtimekit-react-native 0.3.1-staging.1 → 0.3.1-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.
@@ -379,7 +379,9 @@ public class AppRTCBluetoothManager {
379
379
  bluetoothState = State.SCO_DISCONNECTING;
380
380
  RTKLogger.d("BluetoothManager", "Cannot find any bluetooth SCO device to set as communication device");
381
381
  }
382
- updateAudioDeviceState();
382
+ // Don't call updateAudioDeviceState() here - it causes a loop since we're already
383
+ // in the middle of updateAudioDeviceState() in InCallManagerModule
384
+ // The state will be updated when this call returns
383
385
  } else {
384
386
  // The SCO connection establishment can take several seconds, hence we cannot rely on the
385
387
  // connection to be available when the method returns but instead register to receive the
@@ -121,6 +121,9 @@ public class InCallManagerModule extends ReactContextBaseJavaModule implements L
121
121
  // avoid duplicate elements.
122
122
  private Set<AudioDevice> audioDevices = new HashSet<>();
123
123
 
124
+ // Guard flag to prevent re-entrant calls to updateAudioDeviceState
125
+ private boolean isUpdatingAudioDeviceState = false;
126
+
124
127
  @Override
125
128
  public String getName() {
126
129
  return REACT_NATIVE_MODULE_NAME;
@@ -482,17 +485,17 @@ public class InCallManagerModule extends ReactContextBaseJavaModule implements L
482
485
  public void getCurrentAudioDevice(Promise promise) {
483
486
  try {
484
487
  WritableMap result = Arguments.createMap();
485
- result.putString("currentDevice", selectedAudioDevice != null ? selectedAudioDevice.name() : "NONE");
486
488
 
487
- // Also include Bluetooth SCO state for better debugging
488
- if (bluetoothManager != null) {
489
- result.putString("bluetoothState", bluetoothManager.getState().toString());
490
- result.putBoolean("bluetoothScoConnected",
491
- bluetoothManager.getState() == AppRTCBluetoothManager.State.SCO_CONNECTED);
489
+ // Check if audio manager is initialized
490
+ if (selectedAudioDevice == null) {
491
+ result.putString("currentDevice", "NONE");
492
+ } else {
493
+ result.putString("currentDevice", selectedAudioDevice.name());
492
494
  }
493
495
 
494
496
  promise.resolve(result);
495
497
  } catch (Exception e) {
498
+ RTKLogger.e("InCallManager", "Failed to get current audio device: " + e.getMessage());
496
499
  promise.reject("ERROR", "Failed to get current audio device", e);
497
500
  }
498
501
  }
@@ -1023,7 +1026,15 @@ public class InCallManagerModule extends ReactContextBaseJavaModule implements L
1023
1026
  */
1024
1027
  public void updateAudioDeviceState() {
1025
1028
  UiThreadUtil.runOnUiThread(() -> {
1026
- RTKLogger.d("InCallManager", "Bluetooth State: " + bluetoothManager.getState().toString());
1029
+ // Prevent re-entrant calls to avoid infinite loop
1030
+ if (isUpdatingAudioDeviceState) {
1031
+ RTKLogger.d("InCallManager", "updateAudioDeviceState: Already updating, skipping re-entrant call");
1032
+ return;
1033
+ }
1034
+ isUpdatingAudioDeviceState = true;
1035
+
1036
+ try {
1037
+ RTKLogger.d("InCallManager", "Bluetooth State: " + bluetoothManager.getState().toString());
1027
1038
  if(bluetoothManager.getState().toString().equals("UNINITIALIZED"))
1028
1039
  bluetoothManager.start();
1029
1040
  hasWiredHeadset= this.hasWiredHeadset();
@@ -1132,6 +1143,9 @@ public class InCallManagerModule extends ReactContextBaseJavaModule implements L
1132
1143
  sendEvent("onAudioDeviceChanged", getAudioDeviceStatusMap());
1133
1144
  }
1134
1145
  RTKLogger.d("InCallManager", "--- updateAudioDeviceState done");
1146
+ } finally {
1147
+ isUpdatingAudioDeviceState = false;
1148
+ }
1135
1149
  });
1136
1150
  }
1137
1151
 
@@ -104,5 +104,7 @@ class BackgroundTimer {
104
104
  }
105
105
  }
106
106
  }
107
+
108
+ // TODO: Remove singleton pattern
107
109
  var _default = exports.default = new BackgroundTimer();
108
110
  //# sourceMappingURL=BackgroundHandler.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["_reactNative","require","_defineProperty","e","r","t","_toPropertyKey","Object","defineProperty","value","enumerable","configurable","writable","i","_toPrimitive","Symbol","toPrimitive","call","TypeError","String","Number","RTKRNBackgroundTimer","NativeModules","Emitter","NativeEventEmitter","BackgroundTimer","constructor","uniqueId","callbacks","addListener","id","callbackById","callback","interval","Platform","OS","backgroundTimerSetTimeout","timeout","setTimeout","init","start","delay","backgroundTimerStart","stop","backgroundTimerStop","runBackgroundTimer","EventEmitter","select","ios","NativeAppEventEmitter","android","DeviceEventEmitter","backgroundListener","remove","backgroundClockMethod","backgroundTimer","stopBackgroundTimer","clearTimeout","timeoutId","setInterval","intervalId","clearInterval","_default","exports","default"],"sources":["BackgroundHandler.ts"],"sourcesContent":["import {\n DeviceEventEmitter,\n NativeAppEventEmitter,\n NativeEventEmitter,\n NativeModules,\n Platform,\n} from 'react-native';\n\nconst { RTKRNBackgroundTimer } = NativeModules;\nconst Emitter = new NativeEventEmitter(RTKRNBackgroundTimer);\n\nclass BackgroundTimer {\n uniqueId: number;\n\n callbacks: { [key: string]: any };\n\n backgroundTimer: number | NodeJS.Timeout | null;\n\n backgroundListener: any;\n\n constructor() {\n this.uniqueId = 0;\n this.callbacks = {};\n\n Emitter.addListener('backgroundTimer.timeout', (id) => {\n if (this.callbacks[id]) {\n const callbackById = this.callbacks[id];\n const { callback } = callbackById;\n if (!this.callbacks[id].interval) {\n delete this.callbacks[id];\n } else {\n Platform.OS === 'android'\n ? RTKRNBackgroundTimer.backgroundTimerSetTimeout(\n id,\n this.callbacks[id].timeout\n )\n : RTKRNBackgroundTimer.setTimeout(id, this.callbacks[id].timeout);\n }\n callback();\n }\n });\n }\n\n init() {\n return new BackgroundTimer();\n }\n\n // Original API\n start(delay = 0) {\n return Platform.OS === 'android'\n ? RTKRNBackgroundTimer.backgroundTimerStart(delay)\n : RTKRNBackgroundTimer.start(delay);\n }\n\n stop() {\n return Platform.OS === 'android'\n ? RTKRNBackgroundTimer.backgroundTimerStop()\n : RTKRNBackgroundTimer.stop();\n }\n\n runBackgroundTimer(callback, delay) {\n const EventEmitter = Platform.select({\n ios: () => NativeAppEventEmitter,\n android: () => DeviceEventEmitter,\n })();\n this.start(0);\n this.backgroundListener = EventEmitter.addListener(\n 'backgroundTimer',\n () => {\n this.backgroundListener.remove();\n this.backgroundClockMethod(callback, delay);\n }\n );\n }\n\n backgroundClockMethod(callback, delay) {\n this.backgroundTimer = this.setTimeout(() => {\n callback();\n this.backgroundClockMethod(callback, delay);\n }, delay);\n }\n\n stopBackgroundTimer() {\n this.stop();\n this.clearTimeout(this.backgroundTimer);\n }\n\n // New API, allowing for multiple timers\n setTimeout(callback, timeout) {\n this.uniqueId += 1;\n const timeoutId = this.uniqueId;\n this.callbacks[timeoutId] = {\n callback,\n interval: false,\n timeout,\n };\n Platform.OS === 'android'\n ? RTKRNBackgroundTimer.backgroundTimerSetTimeout(timeoutId, timeout)\n : RTKRNBackgroundTimer.setTimeout(timeoutId, timeout);\n return timeoutId;\n }\n\n clearTimeout(timeoutId) {\n if (this.callbacks[timeoutId]) {\n delete this.callbacks[timeoutId];\n // RTKRNBackgroundTimer.clearTimeout(timeoutId);\n }\n }\n\n setInterval(callback, timeout) {\n this.uniqueId += 1;\n const intervalId = this.uniqueId;\n this.callbacks[intervalId] = {\n callback,\n interval: true,\n timeout,\n };\n Platform.OS === 'android'\n ? RTKRNBackgroundTimer.backgroundTimerSetTimeout(intervalId, timeout)\n : RTKRNBackgroundTimer.setTimeout(intervalId, timeout);\n return intervalId;\n }\n\n clearInterval(intervalId) {\n if (this.callbacks[intervalId]) {\n delete this.callbacks[intervalId];\n // RTKRNBackgroundTimer.clearTimeout(intervalId);\n }\n }\n}\n\nexport default new BackgroundTimer();\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_reactNative","require","_defineProperty","e","r","t","_toPropertyKey","Object","defineProperty","value","enumerable","configurable","writable","i","_toPrimitive","Symbol","toPrimitive","call","TypeError","String","Number","RTKRNBackgroundTimer","NativeModules","Emitter","NativeEventEmitter","BackgroundTimer","constructor","uniqueId","callbacks","addListener","id","callbackById","callback","interval","Platform","OS","backgroundTimerSetTimeout","timeout","setTimeout","init","start","delay","backgroundTimerStart","stop","backgroundTimerStop","runBackgroundTimer","EventEmitter","select","ios","NativeAppEventEmitter","android","DeviceEventEmitter","backgroundListener","remove","backgroundClockMethod","backgroundTimer","stopBackgroundTimer","clearTimeout","timeoutId","setInterval","intervalId","clearInterval","_default","exports","default"],"sources":["BackgroundHandler.ts"],"sourcesContent":["import {\n DeviceEventEmitter,\n NativeAppEventEmitter,\n NativeEventEmitter,\n NativeModules,\n Platform,\n} from 'react-native';\n\nconst { RTKRNBackgroundTimer } = NativeModules;\nconst Emitter = new NativeEventEmitter(RTKRNBackgroundTimer);\n\nclass BackgroundTimer {\n uniqueId: number;\n\n callbacks: { [key: string]: any };\n\n backgroundTimer: number | NodeJS.Timeout | null;\n\n backgroundListener: any;\n\n constructor() {\n this.uniqueId = 0;\n this.callbacks = {};\n\n Emitter.addListener('backgroundTimer.timeout', (id) => {\n if (this.callbacks[id]) {\n const callbackById = this.callbacks[id];\n const { callback } = callbackById;\n if (!this.callbacks[id].interval) {\n delete this.callbacks[id];\n } else {\n Platform.OS === 'android'\n ? RTKRNBackgroundTimer.backgroundTimerSetTimeout(\n id,\n this.callbacks[id].timeout\n )\n : RTKRNBackgroundTimer.setTimeout(id, this.callbacks[id].timeout);\n }\n callback();\n }\n });\n }\n\n init() {\n return new BackgroundTimer();\n }\n\n // Original API\n start(delay = 0) {\n return Platform.OS === 'android'\n ? RTKRNBackgroundTimer.backgroundTimerStart(delay)\n : RTKRNBackgroundTimer.start(delay);\n }\n\n stop() {\n return Platform.OS === 'android'\n ? RTKRNBackgroundTimer.backgroundTimerStop()\n : RTKRNBackgroundTimer.stop();\n }\n\n runBackgroundTimer(callback, delay) {\n const EventEmitter = Platform.select({\n ios: () => NativeAppEventEmitter,\n android: () => DeviceEventEmitter,\n })();\n this.start(0);\n this.backgroundListener = EventEmitter.addListener(\n 'backgroundTimer',\n () => {\n this.backgroundListener.remove();\n this.backgroundClockMethod(callback, delay);\n }\n );\n }\n\n backgroundClockMethod(callback, delay) {\n this.backgroundTimer = this.setTimeout(() => {\n callback();\n this.backgroundClockMethod(callback, delay);\n }, delay);\n }\n\n stopBackgroundTimer() {\n this.stop();\n this.clearTimeout(this.backgroundTimer);\n }\n\n // New API, allowing for multiple timers\n setTimeout(callback, timeout) {\n this.uniqueId += 1;\n const timeoutId = this.uniqueId;\n this.callbacks[timeoutId] = {\n callback,\n interval: false,\n timeout,\n };\n Platform.OS === 'android'\n ? RTKRNBackgroundTimer.backgroundTimerSetTimeout(timeoutId, timeout)\n : RTKRNBackgroundTimer.setTimeout(timeoutId, timeout);\n return timeoutId;\n }\n\n clearTimeout(timeoutId) {\n if (this.callbacks[timeoutId]) {\n delete this.callbacks[timeoutId];\n // RTKRNBackgroundTimer.clearTimeout(timeoutId);\n }\n }\n\n setInterval(callback, timeout) {\n this.uniqueId += 1;\n const intervalId = this.uniqueId;\n this.callbacks[intervalId] = {\n callback,\n interval: true,\n timeout,\n };\n Platform.OS === 'android'\n ? RTKRNBackgroundTimer.backgroundTimerSetTimeout(intervalId, timeout)\n : RTKRNBackgroundTimer.setTimeout(intervalId, timeout);\n return intervalId;\n }\n\n clearInterval(intervalId) {\n if (this.callbacks[intervalId]) {\n delete this.callbacks[intervalId];\n // RTKRNBackgroundTimer.clearTimeout(intervalId);\n }\n }\n}\n\n// TODO: Remove singleton pattern\nexport default new BackgroundTimer();\n"],"mappings":"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","ignoreList":[]}
@@ -222,7 +222,7 @@ class LocalMediaHandler extends _events.EventEmitter {
222
222
  }
223
223
  async setupAudioStream(deviceId, forceStopTrack = false) {
224
224
  var _this$currentDevices$2;
225
- const audioDevices = _classPrivateFieldGet(_localMediaUtils, this).getAudioDevices();
225
+ const audioDevices = await _classPrivateFieldGet(_localMediaUtils, this).getAudioDevices();
226
226
  if (!audioDevices.length) {
227
227
  return;
228
228
  }
@@ -269,7 +269,7 @@ class LocalMediaHandler extends _events.EventEmitter {
269
269
  }
270
270
  async setupVideoStream(deviceId, forceStopTrack = false) {
271
271
  var _this$currentDevices$3;
272
- const videoDevices = _classPrivateFieldGet(_localMediaUtils, this).getVideoDevices();
272
+ const videoDevices = await _classPrivateFieldGet(_localMediaUtils, this).getVideoDevices();
273
273
  if (!videoDevices.length) {
274
274
  return;
275
275
  }
@@ -319,7 +319,7 @@ class LocalMediaHandler extends _events.EventEmitter {
319
319
  }
320
320
  async setupSpeaker(deviceId) {
321
321
  var _this$currentDevices$5;
322
- const speakerDevices = _classPrivateFieldGet(_localMediaUtils, this).getSpeakerDevices();
322
+ const speakerDevices = await _classPrivateFieldGet(_localMediaUtils, this).getSpeakerDevices();
323
323
  if (!speakerDevices.length) {
324
324
  return;
325
325
  }
@@ -355,7 +355,7 @@ class LocalMediaHandler extends _events.EventEmitter {
355
355
  });
356
356
  }
357
357
  async getOperationalWebcamDeviceId() {
358
- let videoDevices = _classPrivateFieldGet(_localMediaUtils, this).getVideoDevices();
358
+ let videoDevices = await _classPrivateFieldGet(_localMediaUtils, this).getVideoDevices();
359
359
  if (!videoDevices.length) {
360
360
  return {
361
361
  isOperational: false,
@@ -386,7 +386,7 @@ class LocalMediaHandler extends _events.EventEmitter {
386
386
  };
387
387
  }
388
388
  async getOperationalMicDeviceId() {
389
- let audioDevices = _classPrivateFieldGet(_localMediaUtils, this).getAudioDevices();
389
+ let audioDevices = await _classPrivateFieldGet(_localMediaUtils, this).getAudioDevices();
390
390
  if (!audioDevices.length) {
391
391
  return {
392
392
  isOperational: false,
@@ -452,7 +452,7 @@ class LocalMediaHandler extends _events.EventEmitter {
452
452
  };
453
453
  }
454
454
  if (audio) {
455
- const audioDevices = _classPrivateFieldGet(_localMediaUtils, this).getAudioDevices();
455
+ const audioDevices = await _classPrivateFieldGet(_localMediaUtils, this).getAudioDevices();
456
456
  if (audioDevices.length !== 0) {
457
457
  const audioDeviceId = (await this.getOperationalMicDeviceId()).deviceId;
458
458
  this.currentDevices.audio = _classPrivateFieldGet(_localMediaUtils, this).getDeviceById(audioDeviceId, 'audioinput');
@@ -460,7 +460,7 @@ class LocalMediaHandler extends _events.EventEmitter {
460
460
  }
461
461
  }
462
462
  if (video) {
463
- const videoDevices = _classPrivateFieldGet(_localMediaUtils, this).getVideoDevices();
463
+ const videoDevices = await _classPrivateFieldGet(_localMediaUtils, this).getVideoDevices();
464
464
  if (videoDevices.length !== 0) {
465
465
  const videoDeviceId = (await this.getOperationalWebcamDeviceId()).deviceId;
466
466
  this.currentDevices.video = _classPrivateFieldGet(_localMediaUtils, this).getDeviceById(videoDeviceId, 'videoinput');
@@ -718,14 +718,43 @@ class LocalMediaHandler extends _events.EventEmitter {
718
718
  getDeviceById(deviceId, kind) {
719
719
  return _classPrivateFieldGet(_localMediaUtils, this).getDeviceById(deviceId, kind);
720
720
  }
721
- getAudioDevices() {
722
- return _classPrivateFieldGet(_localMediaUtils, this).getAudioDevices();
721
+ async getAudioDevices() {
722
+ const devices = await _classPrivateFieldGet(_localMediaUtils, this).getAudioDevices();
723
+
724
+ // Update current audio device from native layer
725
+ try {
726
+ const currentDeviceId = await _NativeAudioManager.default.getCurrentAudioDevice();
727
+ if (currentDeviceId) {
728
+ const currentDevice = _classPrivateFieldGet(_localMediaUtils, this).getDeviceById(currentDeviceId, 'audioinput');
729
+ if (currentDevice) {
730
+ this.currentDevices.audio = currentDevice;
731
+ }
732
+ }
733
+ } catch (e) {
734
+ console.warn('Failed to update current audio device:', e);
735
+ }
736
+ return devices;
723
737
  }
724
- getVideoDevices() {
725
- return _classPrivateFieldGet(_localMediaUtils, this).getVideoDevices();
738
+ async getVideoDevices() {
739
+ return await _classPrivateFieldGet(_localMediaUtils, this).getVideoDevices();
726
740
  }
727
- getSpeakerDevices() {
728
- return _classPrivateFieldGet(_localMediaUtils, this).getSpeakerDevices();
741
+ async getSpeakerDevices() {
742
+ const devices = await _classPrivateFieldGet(_localMediaUtils, this).getSpeakerDevices();
743
+
744
+ // Update current speaker device from native layer
745
+ try {
746
+ const currentDeviceId = await _NativeAudioManager.default.getCurrentAudioDevice();
747
+ if (currentDeviceId) {
748
+ const currentDevice = _classPrivateFieldGet(_localMediaUtils, this).getDeviceById(currentDeviceId, 'audioinput');
749
+ if (currentDevice) {
750
+ this.currentDevices.speaker = currentDevice;
751
+ this.currentDevices.audio = currentDevice;
752
+ }
753
+ }
754
+ } catch (e) {
755
+ console.warn('Failed to update current speaker device:', e);
756
+ }
757
+ return devices;
729
758
  }
730
759
  async onDeviceChange(changedDevices, forceDeviceChange) {
731
760
  let addedDevice;
@@ -800,7 +829,7 @@ class LocalMediaHandler extends _events.EventEmitter {
800
829
  // 1. Devices were added or removed, OR
801
830
  // 2. Selected device changed (platform routed to a different device)
802
831
  const hasDeviceListChanged = changedDevices.added.length || changedDevices.removed.length;
803
- const hasSelectedDeviceInfo = changedDevices.selectedDevice !== undefined;
832
+ const hasSelectedDeviceInfo = changedDevices.selectedDevice.length > 0;
804
833
  if (hasDeviceListChanged || hasSelectedDeviceInfo) {
805
834
  this.emit('DEVICE_LIST_UPDATED', changedDevices);
806
835
  }
@@ -816,8 +845,7 @@ class LocalMediaHandler extends _events.EventEmitter {
816
845
  return super.on(event, listener);
817
846
  }
818
847
  destruct() {
819
- // TODO: Do not remove native broadcast listeners when going OFF_STAGE in webinar
820
- // this.#localMediaUtils.destruct();
848
+ _classPrivateFieldGet(_localMediaUtils, this).destruct();
821
849
  if (_reactNative.Platform.OS === 'android') _classPrivateFieldGet(_appStateSubscription, this).remove();
822
850
  _BackgroundHandler.default.stop();
823
851
  try {
@@ -829,7 +857,6 @@ class LocalMediaHandler extends _events.EventEmitter {
829
857
  });
830
858
  }
831
859
  } catch (_err) {}
832
- // InCallManger.stop(undefined);
833
860
  }
834
861
  stopAudioTrack() {
835
862
  var _this$rawAudioTrack2, _this$audioTrack3, _this$rawAudioTrack3, _this$audioTrack4;
@@ -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","_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","then","_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') {\n RTKHelper.isForegroundServiceRunning().then((val) => {\n if (val) {\n RTKHelper.stopService();\n }\n });\n }\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","NativeAudioManager","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","devices","currentDeviceId","getCurrentAudioDevice","currentDevice","forceDeviceChange","addedDevice","removedDevice","added","removed","selectedDevice","selectedDeviceInfo","clearTimeout","isBluetoothRemoved","handleRemoval","hasDeviceListChanged","hasSelectedDeviceInfo","init","_","event","args","on","listener","destruct","remove","then","_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 NativeAudioManager 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 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.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 = 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\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 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 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 this.#localMediaUtils.destruct();\n if (Platform.OS === 'android') this.#appStateSubscription.remove();\n BackgroundTimer.stop();\n try {\n if (Platform.OS === 'android') {\n RTKHelper.isForegroundServiceRunning().then((val) => {\n if (val) {\n RTKHelper.stopService();\n }\n });\n }\n } catch (_err) {}\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":[]}
@@ -324,21 +324,24 @@ class LocalMediaUtils {
324
324
  /**
325
325
  * Returns all audio input devices (microphone devices).
326
326
  */
327
- getAudioDevices() {
327
+ async getAudioDevices() {
328
+ await this.repopulateAvailableDevices();
328
329
  return this.getAvailableDevicesByKind('audioinput');
329
330
  }
330
331
 
331
332
  /**
332
333
  * Returns all video input devices.
333
334
  */
334
- getVideoDevices() {
335
+ async getVideoDevices() {
336
+ await this.repopulateAvailableDevices();
335
337
  return this.getAvailableDevicesByKind('videoinput');
336
338
  }
337
339
 
338
340
  /**
339
341
  * Returns all audio output devices (speaker devices).
340
342
  */
341
- getSpeakerDevices() {
343
+ async getSpeakerDevices() {
344
+ await this.repopulateAvailableDevices();
342
345
  const speakerDevices = _classPrivateFieldGet(_availableDevices, this);
343
346
  // In Mobile, speaker devices are the same as audio input devices
344
347
  return speakerDevices.filter(device => device.kind === 'audioinput').map(device => ({