@stream-io/video-react-native-sdk 1.41.0 → 1.42.0

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 (63) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/android/src/main/java/com/streamvideo/reactnative/audio/AudioDeviceManager.kt +79 -54
  3. package/android/src/main/java/com/streamvideo/reactnative/audio/utils/AudioManagerUtil.kt +6 -2
  4. package/android/src/main/java/com/streamvideo/reactnative/callmanager/StreamInCallManagerModule.kt +3 -3
  5. package/dist/commonjs/hooks/index.js +11 -0
  6. package/dist/commonjs/hooks/index.js.map +1 -1
  7. package/dist/commonjs/hooks/push/useCallingExpWithCallingStateEffect.js +73 -0
  8. package/dist/commonjs/hooks/push/useCallingExpWithCallingStateEffect.js.map +1 -1
  9. package/dist/commonjs/hooks/useAudioDeviceStatus.js +76 -0
  10. package/dist/commonjs/hooks/useAudioDeviceStatus.js.map +1 -0
  11. package/dist/commonjs/modules/call-manager/CallManager.js +94 -47
  12. package/dist/commonjs/modules/call-manager/CallManager.js.map +1 -1
  13. package/dist/commonjs/utils/internal/callingx/callingx.js +0 -7
  14. package/dist/commonjs/utils/internal/callingx/callingx.js.map +1 -1
  15. package/dist/commonjs/utils/push/setupCallingExpEvents.js +0 -2
  16. package/dist/commonjs/utils/push/setupCallingExpEvents.js.map +1 -1
  17. package/dist/commonjs/version.js +1 -1
  18. package/dist/module/hooks/index.js +1 -0
  19. package/dist/module/hooks/index.js.map +1 -1
  20. package/dist/module/hooks/push/useCallingExpWithCallingStateEffect.js +73 -0
  21. package/dist/module/hooks/push/useCallingExpWithCallingStateEffect.js.map +1 -1
  22. package/dist/module/hooks/useAudioDeviceStatus.js +71 -0
  23. package/dist/module/hooks/useAudioDeviceStatus.js.map +1 -0
  24. package/dist/module/modules/call-manager/CallManager.js +94 -47
  25. package/dist/module/modules/call-manager/CallManager.js.map +1 -1
  26. package/dist/module/utils/internal/callingx/callingx.js +0 -7
  27. package/dist/module/utils/internal/callingx/callingx.js.map +1 -1
  28. package/dist/module/utils/push/setupCallingExpEvents.js +0 -2
  29. package/dist/module/utils/push/setupCallingExpEvents.js.map +1 -1
  30. package/dist/module/version.js +1 -1
  31. package/dist/typescript/hooks/index.d.ts +1 -0
  32. package/dist/typescript/hooks/index.d.ts.map +1 -1
  33. package/dist/typescript/hooks/push/useCallingExpWithCallingStateEffect.d.ts.map +1 -1
  34. package/dist/typescript/hooks/useAudioDeviceStatus.d.ts +21 -0
  35. package/dist/typescript/hooks/useAudioDeviceStatus.d.ts.map +1 -0
  36. package/dist/typescript/modules/call-manager/CallManager.d.ts +25 -11
  37. package/dist/typescript/modules/call-manager/CallManager.d.ts.map +1 -1
  38. package/dist/typescript/modules/call-manager/types.d.ts +29 -3
  39. package/dist/typescript/modules/call-manager/types.d.ts.map +1 -1
  40. package/dist/typescript/utils/internal/callingx/callingx.d.ts.map +1 -1
  41. package/dist/typescript/utils/push/setupCallingExpEvents.d.ts.map +1 -1
  42. package/dist/typescript/version.d.ts +1 -1
  43. package/expo-config-plugin/dist/index.js +2 -0
  44. package/expo-config-plugin/dist/withAndroidMessagingService.js +287 -0
  45. package/ios/StreamInCallManager.m +7 -0
  46. package/ios/StreamInCallManager.swift +257 -14
  47. package/package.json +8 -8
  48. package/src/hooks/index.ts +1 -0
  49. package/src/hooks/push/useCallingExpWithCallingStateEffect.ts +95 -0
  50. package/src/hooks/useAudioDeviceStatus.ts +90 -0
  51. package/src/modules/call-manager/CallManager.ts +122 -64
  52. package/src/modules/call-manager/native-module.d.ts +14 -7
  53. package/src/modules/call-manager/types.ts +30 -3
  54. package/src/utils/internal/callingx/callingx.ts +0 -8
  55. package/src/utils/push/setupCallingExpEvents.ts +0 -2
  56. package/src/version.ts +1 -1
  57. package/dist/commonjs/utils/internal/callingx/audioSessionPromise.js +0 -68
  58. package/dist/commonjs/utils/internal/callingx/audioSessionPromise.js.map +0 -1
  59. package/dist/module/utils/internal/callingx/audioSessionPromise.js +0 -63
  60. package/dist/module/utils/internal/callingx/audioSessionPromise.js.map +0 -1
  61. package/dist/typescript/utils/internal/callingx/audioSessionPromise.d.ts +0 -16
  62. package/dist/typescript/utils/internal/callingx/audioSessionPromise.d.ts.map +0 -1
  63. package/src/utils/internal/callingx/audioSessionPromise.ts +0 -65
package/CHANGELOG.md CHANGED
@@ -2,6 +2,32 @@
2
2
 
3
3
  This file was generated using [@jscutlery/semver](https://github.com/jscutlery/semver).
4
4
 
5
+ ## [1.42.0](https://github.com/GetStream/stream-video-js/compare/@stream-io/video-react-native-sdk-1.41.0...@stream-io/video-react-native-sdk-1.42.0) (2026-07-30)
6
+
7
+ ### Dependency Updates
8
+
9
+ - `@stream-io/noise-cancellation-react-native` updated to version `0.9.5`
10
+ - `@stream-io/react-native-callingx` updated to version `0.8.1`
11
+ - `@stream-io/video-filters-react-native` updated to version `0.14.5`
12
+ - `@stream-io/typescript-config` updated to version `0.1.0`
13
+ - `@stream-io/video-client` updated to version `1.56.0`
14
+ - **Features**
15
+ - **react-sdk:** show blocked audio overlay per participant ([#2341](https://github.com/GetStream/stream-video-js/issues/2341)) ([4fe5c40](https://github.com/GetStream/stream-video-js/commit/4fe5c40aaed1829125bff49deec39a008c7abec5))
16
+ - **Bug Fixes**
17
+ - **client:** fix stale mid in SetPublisher after PeerConnection rollback ([#2344](https://github.com/GetStream/stream-video-js/issues/2344)) ([9c3e201](https://github.com/GetStream/stream-video-js/commit/9c3e201c9a1cf129e182da961b1d73652508b9f2))
18
+ - **client:** never announce two tracks for the same publish option ([#2352](https://github.com/GetStream/stream-video-js/issues/2352)) ([b9a0c6e](https://github.com/GetStream/stream-video-js/commit/b9a0c6e709805e8658e74a68dc6e84459353db37))
19
+ - **client:** preserve ICE state in peer connection failure reports ([#2340](https://github.com/GetStream/stream-video-js/issues/2340)) ([2ce42a2](https://github.com/GetStream/stream-video-js/commit/2ce42a229eecfc60ae8f6783672c517b94b6ab42))
20
+ - `@stream-io/video-react-bindings` updated to version `1.19.1`
21
+
22
+ ### Features
23
+
24
+ - add iOS audio output selection methods ([#2334](https://github.com/GetStream/stream-video-js/issues/2334)) ([e858efe](https://github.com/GetStream/stream-video-js/commit/e858efee6f8741a7f0e469789c64b2780dbcb5ce))
25
+ - added expo plugin for resolving fcm conflicts issue ([#2350](https://github.com/GetStream/stream-video-js/issues/2350)) ([b083873](https://github.com/GetStream/stream-video-js/commit/b0838731e3a040ab87866621f66f36e6827fd0cc))
26
+
27
+ ### Bug Fixes
28
+
29
+ - wait for callkit audio activation and then start audio engine, remove the previous timeout ([#2328](https://github.com/GetStream/stream-video-js/issues/2328)) ([64d6cff](https://github.com/GetStream/stream-video-js/commit/64d6cff02112fa7f9b2ed273f27006675f1d798d))
30
+
5
31
  ## [1.41.0](https://github.com/GetStream/stream-video-js/compare/@stream-io/video-react-native-sdk-1.40.2...@stream-io/video-react-native-sdk-1.41.0) (2026-07-17)
6
32
 
7
33
  ### Dependency Updates
@@ -58,7 +58,7 @@ class AudioDeviceManager(
58
58
  val nonBluetoothEndpoints = HashMap<@EndpointType Int, AudioDeviceEndpoint>()
59
59
  for (device in initialEndpoints) {
60
60
  if (device.isBluetoothType()) {
61
- bluetoothEndpoints[device.name] = device
61
+ bluetoothEndpoints[device.deviceId.toString()] = device
62
62
  } else {
63
63
  nonBluetoothEndpoints[device.type] = device
64
64
  }
@@ -66,7 +66,7 @@ class AudioDeviceManager(
66
66
  EndpointMaps(bluetoothEndpoints, nonBluetoothEndpoints)
67
67
  }
68
68
 
69
- private var cachedAvailableEndpointNamesSet = setOf<String>()
69
+ private var cachedAvailableEndpointIdsSet = setOf<String>()
70
70
 
71
71
  /** Returns the currently selected audio device. */
72
72
  private var _selectedAudioDeviceEndpoint: AudioDeviceEndpoint? = null
@@ -85,10 +85,6 @@ class AudioDeviceManager(
85
85
  @EndpointType
86
86
  var defaultAudioDevice = AudioDeviceEndpoint.TYPE_SPEAKER
87
87
 
88
- /** Contains the user-selected audio device which overrides the predefined selection scheme */
89
- @EndpointType
90
- private var userSelectedAudioDevice: Int? = null
91
-
92
88
  var enableStereo: Boolean = false
93
89
 
94
90
  private val mAudioManager =
@@ -137,7 +133,6 @@ class AudioDeviceManager(
137
133
  fun start(activity: Activity) {
138
134
  runInAudioThread {
139
135
  setup()
140
- userSelectedAudioDevice = null
141
136
  selectedAudioDeviceEndpoint = null
142
137
  if (callAudioRole == CallAudioRole.Communicator) {
143
138
  // Audio routing is manually controlled by the SDK in communication media mode
@@ -190,13 +185,28 @@ class AudioDeviceManager(
190
185
  }
191
186
  }
192
187
 
193
- private fun getEndpointFromName(name: String): AudioDeviceEndpoint? {
194
- val endpointType = AudioDeviceEndpointUtils.endpointStringToType(name)
195
- val endpoint = when (endpointType) {
196
- AudioDeviceEndpoint.TYPE_SPEAKER, AudioDeviceEndpoint.TYPE_EARPIECE, AudioDeviceEndpoint.TYPE_WIRED_HEADSET -> mEndpointMaps.nonBluetoothEndpoints[endpointType]
197
- else -> mEndpointMaps.bluetoothEndpoints[name]
188
+ private fun bluetoothEndpointByName(name: String?): AudioDeviceEndpoint? {
189
+ if (name == null) return null
190
+ return mEndpointMaps.bluetoothEndpoints.values.firstOrNull { it.name == name }
191
+ }
192
+
193
+ /**
194
+ * Resolves the currently-active Bluetooth endpoint.
195
+ */
196
+ private fun activeBluetoothEndpoint(): AudioDeviceEndpoint? {
197
+ if (Build.VERSION.SDK_INT >= 31) {
198
+ mAudioManager.communicationDevice?.id?.toString()?.let { id ->
199
+ mEndpointMaps.bluetoothEndpoints[id]?.let { return it }
200
+ }
201
+ }
202
+ return bluetoothEndpointByName(bluetoothManager.getDeviceName())
203
+ }
204
+
205
+ /** Resolves a non-Bluetooth endpoint by its stable device id. */
206
+ private fun nonBluetoothEndpointById(deviceId: String): AudioDeviceEndpoint? {
207
+ return mEndpointMaps.nonBluetoothEndpoints.values.firstOrNull {
208
+ it.deviceId.toString() == deviceId
198
209
  }
199
- return endpoint
200
210
  }
201
211
 
202
212
  fun setSpeakerphoneOn(enable: Boolean) {
@@ -227,16 +237,12 @@ class AudioDeviceManager(
227
237
  this.selectedAudioDeviceEndpoint = newDevice
228
238
  }
229
239
 
230
- fun switchDeviceFromDeviceName(
231
- deviceName: String
240
+ fun switchDeviceById(
241
+ deviceId: String
232
242
  ) {
233
- Log.d(TAG, "switchDeviceFromDeviceName: deviceName = $deviceName")
234
- Log.d(
235
- TAG,
236
- "switchDeviceFromDeviceName: mEndpointMaps.bluetoothEndpoints = ${mEndpointMaps.bluetoothEndpoints}"
237
- )
243
+ Log.d(TAG, "switchDeviceById: deviceId = $deviceId")
238
244
  runInAudioThread {
239
- val btDevice = mEndpointMaps.bluetoothEndpoints[deviceName]
245
+ val btDevice = mEndpointMaps.bluetoothEndpoints[deviceId]
240
246
  if (btDevice != null) {
241
247
  if (Build.VERSION.SDK_INT >= 31) {
242
248
  mAudioManager.setCommunicationDevice(btDevice.deviceInfo)
@@ -248,10 +254,12 @@ class AudioDeviceManager(
248
254
  )
249
255
  }
250
256
  } else {
251
- val endpointType = AudioDeviceEndpointUtils.endpointStringToType(deviceName)
252
- switchDeviceEndpointType(
253
- endpointType
254
- )
257
+ val endpoint = nonBluetoothEndpointById(deviceId)
258
+ if (endpoint != null) {
259
+ switchDeviceEndpointType(endpoint.type)
260
+ } else {
261
+ Log.e(TAG, "switchDeviceById: no endpoint found for id $deviceId")
262
+ }
255
263
  }
256
264
  }
257
265
  }
@@ -308,25 +316,39 @@ class AudioDeviceManager(
308
316
  }
309
317
 
310
318
  private fun getCurrentDeviceEndpoints(): List<AudioDeviceEndpoint> {
311
- if (Build.VERSION.SDK_INT >= 31) {
312
- return (mEndpointMaps.bluetoothEndpoints.values + mEndpointMaps.nonBluetoothEndpoints.values).sorted()
319
+ val endpoints = if (Build.VERSION.SDK_INT >= 31) {
320
+ (mEndpointMaps.bluetoothEndpoints.values + mEndpointMaps.nonBluetoothEndpoints.values).sorted()
313
321
  } else {
314
- val btEndpoint = mEndpointMaps.bluetoothEndpoints[bluetoothManager.getDeviceName()]
322
+ val btEndpoint = bluetoothEndpointByName(bluetoothManager.getDeviceName())
315
323
  if (btEndpoint != null) {
316
324
  val list = mutableListOf(btEndpoint)
317
325
  list.addAll(mEndpointMaps.nonBluetoothEndpoints.values)
318
- return list.sorted()
326
+ list.sorted()
319
327
  } else {
320
- return mEndpointMaps.nonBluetoothEndpoints.values.sorted()
328
+ mEndpointMaps.nonBluetoothEndpoints.values.sorted()
321
329
  }
330
+ }
331
+ return maybeRemoveEarpieceIfWiredPresent(endpoints)
332
+ }
322
333
 
334
+ /**
335
+ * When a wired headset is connected the built-in earpiece is not separately
336
+ * routable — the wired plug physically occupies the receiver path
337
+ */
338
+ private fun maybeRemoveEarpieceIfWiredPresent(
339
+ endpoints: List<AudioDeviceEndpoint>
340
+ ): List<AudioDeviceEndpoint> {
341
+ if (endpoints.any { it.isWiredHeadsetType() }) {
342
+ return endpoints.filterNot { it.type == AudioDeviceEndpoint.TYPE_EARPIECE }
323
343
  }
344
+ return endpoints
324
345
  }
325
346
 
326
347
  private fun maybeAddCallEndpoint(endpoint: AudioDeviceEndpoint): Int {
327
348
  if (endpoint.isBluetoothType()) {
328
- if (!mEndpointMaps.bluetoothEndpoints.containsKey(endpoint.name)) {
329
- mEndpointMaps.bluetoothEndpoints[endpoint.name] = endpoint
349
+ val key = endpoint.deviceId.toString()
350
+ if (!mEndpointMaps.bluetoothEndpoints.containsKey(key)) {
351
+ mEndpointMaps.bluetoothEndpoints[key] = endpoint
330
352
  Log.d(TAG, "maybeAddCallEndpoint: bluetooth endpoint added: " + endpoint.name)
331
353
  return 1
332
354
  }
@@ -343,8 +365,9 @@ class AudioDeviceManager(
343
365
  private fun maybeRemoveCallEndpoint(endpoint: AudioDeviceEndpoint): Int {
344
366
  // TODO:: determine if it is necessary to cleanup listeners here
345
367
  if (endpoint.isBluetoothType()) {
346
- if (mEndpointMaps.bluetoothEndpoints.containsKey(endpoint.name)) {
347
- mEndpointMaps.bluetoothEndpoints.remove(endpoint.name)
368
+ val key = endpoint.deviceId.toString()
369
+ if (mEndpointMaps.bluetoothEndpoints.containsKey(key)) {
370
+ mEndpointMaps.bluetoothEndpoints.remove(key)
348
371
  Log.d(TAG, "maybeRemoveCallEndpoint: bluetooth endpoint removed: " + endpoint.name)
349
372
  return 1
350
373
  }
@@ -405,18 +428,17 @@ class AudioDeviceManager(
405
428
  return@runInAudioThread
406
429
  }
407
430
  val audioDevices = getCurrentDeviceEndpoints()
408
- val audioDeviceNamesSet = audioDevices.map { it.name }.toSet()
409
- val devicesChanged = if (cachedAvailableEndpointNamesSet.size != audioDevices.size) {
431
+ // Compare by stable device id, not name
432
+ val audioDeviceIdsSet = audioDevices.map { it.deviceId.toString() }.toSet()
433
+ val devicesChanged = if (cachedAvailableEndpointIdsSet.size != audioDevices.size) {
410
434
  true
411
435
  } else {
412
- cachedAvailableEndpointNamesSet != audioDeviceNamesSet
436
+ cachedAvailableEndpointIdsSet != audioDeviceIdsSet
413
437
  }
414
- cachedAvailableEndpointNamesSet = audioDeviceNamesSet
438
+ cachedAvailableEndpointIdsSet = audioDeviceIdsSet
415
439
  Log.d(
416
440
  TAG,
417
- ("updateAudioDeviceState() Device status: available=$audioDevices, selected=$selectedAudioDeviceEndpoint, user selected=" + endpointTypeDebug(
418
- userSelectedAudioDevice
419
- ))
441
+ ("updateAudioDeviceState() Device status: available=$audioDevices, selected=$selectedAudioDeviceEndpoint")
420
442
  )
421
443
 
422
444
  if (devicesChanged) {
@@ -437,10 +459,6 @@ class AudioDeviceManager(
437
459
  newAudioDevice = it.type
438
460
  }
439
461
  var deviceSwitched = false
440
- val userSelectedAudioDevice = this.userSelectedAudioDevice
441
- if (userSelectedAudioDevice !== null && userSelectedAudioDevice != AudioDeviceEndpoint.TYPE_UNKNOWN) {
442
- newAudioDevice = userSelectedAudioDevice
443
- }
444
462
  Log.d(
445
463
  TAG, ("Decided newAudioDevice: ${endpointTypeDebug(newAudioDevice)}")
446
464
  )
@@ -452,10 +470,6 @@ class AudioDeviceManager(
452
470
  * */
453
471
  fun revertBTSelection() {
454
472
  val selectedAudioDeviceEndpoint = this.selectedAudioDeviceEndpoint
455
- // BT connection, so revert user selection if needed
456
- if (userSelectedAudioDevice == AudioDeviceEndpoint.TYPE_BLUETOOTH) {
457
- this.userSelectedAudioDevice = null
458
- }
459
473
  // prev selection was not BT, but new was BT
460
474
  // new can now be WiredHeadset or default if there was no selection before
461
475
  if (selectedAudioDeviceEndpoint != null && selectedAudioDeviceEndpoint.type != AudioDeviceEndpoint.TYPE_UNKNOWN && selectedAudioDeviceEndpoint.type != AudioDeviceEndpoint.TYPE_BLUETOOTH) {
@@ -492,8 +506,7 @@ class AudioDeviceManager(
492
506
 
493
507
  // already selected BT device
494
508
  if (bluetoothManager.bluetoothState == BluetoothManager.State.SCO_CONNECTED) {
495
- selectedAudioDeviceEndpoint =
496
- getEndpointFromName(bluetoothManager.getDeviceName()!!)
509
+ selectedAudioDeviceEndpoint = activeBluetoothEndpoint()
497
510
  this.selectedAudioDeviceEndpoint = selectedAudioDeviceEndpoint
498
511
  deviceSwitched = true
499
512
  } else if (
@@ -566,12 +579,24 @@ class AudioDeviceManager(
566
579
 
567
580
  fun audioStatusMap(): WritableMap {
568
581
  val endpoint = this.selectedAudioDeviceEndpoint
569
- val availableEndpoints = Arguments.fromList(getCurrentDeviceEndpoints().map { it.name })
582
+ val devices = Arguments.createArray()
583
+ for (device in getCurrentDeviceEndpoints()) {
584
+ val deviceMap = Arguments.createMap()
585
+ deviceMap.putString("id", device.deviceId.toString())
586
+ deviceMap.putString("name", device.name)
587
+ deviceMap.putString(
588
+ "type",
589
+ AudioDeviceEndpointUtils.endpointTypeToString(device.type)
590
+ )
591
+ devices.pushMap(deviceMap)
592
+ }
570
593
 
571
594
  val data = Arguments.createMap()
572
- data.putArray("devices", availableEndpoints)
595
+ data.putArray("devices", devices)
573
596
  data.putString("currentEndpointType", endpointTypeDebug(endpoint?.type))
574
- data.putString("selectedDevice", endpoint?.name)
597
+ if (endpoint != null) {
598
+ data.putString("selectedDeviceId", endpoint.deviceId.toString())
599
+ }
575
600
  return data
576
601
  }
577
602
 
@@ -108,7 +108,9 @@ internal class AudioManagerUtil {
108
108
  AudioDeviceEndpoint.TYPE_BLUETOOTH -> {
109
109
  val didSwitch = bluetoothManager.startScoAudio()
110
110
  if (didSwitch) {
111
- return endpointMaps.bluetoothEndpoints[bluetoothManager.getDeviceName()]
111
+ val activeId = audioManager.communicationDevice?.id?.toString()
112
+ ?: return null
113
+ return endpointMaps.bluetoothEndpoints[activeId]
112
114
  }
113
115
  return null
114
116
  }
@@ -166,7 +168,9 @@ internal class AudioManagerUtil {
166
168
  val didSwitch = bluetoothManager.startScoAudio()
167
169
  if (didSwitch) {
168
170
  // NOTE: SCO connection may fail after timeout, how to catch that on older platforms?
169
- return endpointMaps.bluetoothEndpoints[bluetoothManager.getDeviceName()]
171
+ return endpointMaps.bluetoothEndpoints.values.firstOrNull {
172
+ it.name == bluetoothManager.getDeviceName()
173
+ }
170
174
  }
171
175
  return null
172
176
  }
@@ -190,7 +190,7 @@ class StreamInCallManagerModule(reactContext: ReactApplicationContext) :
190
190
 
191
191
  @Suppress("unused")
192
192
  @ReactMethod
193
- fun chooseAudioDeviceEndpoint(endpointDeviceName: String) {
193
+ fun chooseAudioDeviceEndpoint(deviceId: String) {
194
194
  AudioDeviceManager.runInAudioThread {
195
195
  if (mAudioDeviceManager.callAudioRole !== CallAudioRole.Communicator) {
196
196
  Log.e(
@@ -199,8 +199,8 @@ class StreamInCallManagerModule(reactContext: ReactApplicationContext) :
199
199
  )
200
200
  return@runInAudioThread
201
201
  }
202
- mAudioDeviceManager.switchDeviceFromDeviceName(
203
- endpointDeviceName
202
+ mAudioDeviceManager.switchDeviceById(
203
+ deviceId
204
204
  )
205
205
  }
206
206
  }
@@ -146,4 +146,15 @@ Object.keys(_useModeration).forEach(function (key) {
146
146
  }
147
147
  });
148
148
  });
149
+ var _useAudioDeviceStatus = require("./useAudioDeviceStatus");
150
+ Object.keys(_useAudioDeviceStatus).forEach(function (key) {
151
+ if (key === "default" || key === "__esModule") return;
152
+ if (key in exports && exports[key] === _useAudioDeviceStatus[key]) return;
153
+ Object.defineProperty(exports, key, {
154
+ enumerable: true,
155
+ get: function () {
156
+ return _useAudioDeviceStatus[key];
157
+ }
158
+ });
159
+ });
149
160
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["_usePermissionRequest","require","Object","keys","forEach","key","exports","defineProperty","enumerable","get","_usePermissionNotification","_push","_useAndroidKeepCallAliveEffect","_useIsIosScreenshareBroadcastStarted","_useIsInPiPMode","_useAutoEnterPiPEffect","_useScreenShareButton","_useScreenShareAudioMixing","_useLoopbackRecording","_useTrackDimensions","_useScreenshot","_useModeration"],"sourceRoot":"../../../src","sources":["hooks/index.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_usePermissionRequest","require","Object","keys","forEach","key","exports","defineProperty","enumerable","get","_usePermissionNotification","_push","_useAndroidKeepCallAliveEffect","_useIsIosScreenshareBroadcastStarted","_useIsInPiPMode","_useAutoEnterPiPEffect","_useScreenShareButton","_useScreenShareAudioMixing","_useLoopbackRecording","_useTrackDimensions","_useScreenshot","_useModeration","_useAudioDeviceStatus"],"sourceRoot":"../../../src","sources":["hooks/index.ts"],"mappings":";;;;;AAAA,IAAAA,qBAAA,GAAAC,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAH,qBAAA,EAAAI,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAL,qBAAA,CAAAK,GAAA;EAAAH,MAAA,CAAAK,cAAA,CAAAD,OAAA,EAAAD,GAAA;IAAAG,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAT,qBAAA,CAAAK,GAAA;IAAA;EAAA;AAAA;AACA,IAAAK,0BAAA,GAAAT,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAO,0BAAA,EAAAN,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAK,0BAAA,CAAAL,GAAA;EAAAH,MAAA,CAAAK,cAAA,CAAAD,OAAA,EAAAD,GAAA;IAAAG,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAC,0BAAA,CAAAL,GAAA;IAAA;EAAA;AAAA;AACA,IAAAM,KAAA,GAAAV,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAQ,KAAA,EAAAP,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAM,KAAA,CAAAN,GAAA;EAAAH,MAAA,CAAAK,cAAA,CAAAD,OAAA,EAAAD,GAAA;IAAAG,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAE,KAAA,CAAAN,GAAA;IAAA;EAAA;AAAA;AACA,IAAAO,8BAAA,GAAAX,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAS,8BAAA,EAAAR,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAO,8BAAA,CAAAP,GAAA;EAAAH,MAAA,CAAAK,cAAA,CAAAD,OAAA,EAAAD,GAAA;IAAAG,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAG,8BAAA,CAAAP,GAAA;IAAA;EAAA;AAAA;AACA,IAAAQ,oCAAA,GAAAZ,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAU,oCAAA,EAAAT,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAQ,oCAAA,CAAAR,GAAA;EAAAH,MAAA,CAAAK,cAAA,CAAAD,OAAA,EAAAD,GAAA;IAAAG,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAI,oCAAA,CAAAR,GAAA;IAAA;EAAA;AAAA;AACA,IAAAS,eAAA,GAAAb,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAW,eAAA,EAAAV,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAS,eAAA,CAAAT,GAAA;EAAAH,MAAA,CAAAK,cAAA,CAAAD,OAAA,EAAAD,GAAA;IAAAG,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAK,eAAA,CAAAT,GAAA;IAAA;EAAA;AAAA;AACA,IAAAU,sBAAA,GAAAd,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAY,sBAAA,EAAAX,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAU,sBAAA,CAAAV,GAAA;EAAAH,MAAA,CAAAK,cAAA,CAAAD,OAAA,EAAAD,GAAA;IAAAG,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAM,sBAAA,CAAAV,GAAA;IAAA;EAAA;AAAA;AACA,IAAAW,qBAAA,GAAAf,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAa,qBAAA,EAAAZ,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAW,qBAAA,CAAAX,GAAA;EAAAH,MAAA,CAAAK,cAAA,CAAAD,OAAA,EAAAD,GAAA;IAAAG,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAO,qBAAA,CAAAX,GAAA;IAAA;EAAA;AAAA;AACA,IAAAY,0BAAA,GAAAhB,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAc,0BAAA,EAAAb,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAY,0BAAA,CAAAZ,GAAA;EAAAH,MAAA,CAAAK,cAAA,CAAAD,OAAA,EAAAD,GAAA;IAAAG,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAQ,0BAAA,CAAAZ,GAAA;IAAA;EAAA;AAAA;AACA,IAAAa,qBAAA,GAAAjB,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAe,qBAAA,EAAAd,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAa,qBAAA,CAAAb,GAAA;EAAAH,MAAA,CAAAK,cAAA,CAAAD,OAAA,EAAAD,GAAA;IAAAG,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAS,qBAAA,CAAAb,GAAA;IAAA;EAAA;AAAA;AACA,IAAAc,mBAAA,GAAAlB,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAgB,mBAAA,EAAAf,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAc,mBAAA,CAAAd,GAAA;EAAAH,MAAA,CAAAK,cAAA,CAAAD,OAAA,EAAAD,GAAA;IAAAG,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAU,mBAAA,CAAAd,GAAA;IAAA;EAAA;AAAA;AACA,IAAAe,cAAA,GAAAnB,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAiB,cAAA,EAAAhB,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAe,cAAA,CAAAf,GAAA;EAAAH,MAAA,CAAAK,cAAA,CAAAD,OAAA,EAAAD,GAAA;IAAAG,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAW,cAAA,CAAAf,GAAA;IAAA;EAAA;AAAA;AACA,IAAAgB,cAAA,GAAApB,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAkB,cAAA,EAAAjB,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAgB,cAAA,CAAAhB,GAAA;EAAAH,MAAA,CAAAK,cAAA,CAAAD,OAAA,EAAAD,GAAA;IAAAG,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAY,cAAA,CAAAhB,GAAA;IAAA;EAAA;AAAA;AACA,IAAAiB,qBAAA,GAAArB,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAmB,qBAAA,EAAAlB,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAiB,qBAAA,CAAAjB,GAAA;EAAAH,MAAA,CAAAK,cAAA,CAAAD,OAAA,EAAAD,GAAA;IAAAG,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAa,qBAAA,CAAAjB,GAAA;IAAA;EAAA;AAAA","ignoreList":[]}
@@ -7,6 +7,8 @@ exports.useCallingExpWithCallingStateEffect = void 0;
7
7
  var _videoClient = require("@stream-io/video-client");
8
8
  var _videoReactBindings = require("@stream-io/video-react-bindings");
9
9
  var _react = require("react");
10
+ var _reactNative = require("react-native");
11
+ var _reactNativeWebrtc = require("@stream-io/react-native-webrtc");
10
12
  var _operators = require("rxjs/operators");
11
13
  var _callingx = require("../../utils/internal/callingx/callingx");
12
14
  var _callingx2 = require("../../utils/push/libs/callingx");
@@ -141,6 +143,77 @@ const useCallingExpWithCallingStateEffect = () => {
141
143
  subscription.remove();
142
144
  };
143
145
  }, [activeCallCid, microphone]);
146
+
147
+ // Trace CallKit audio session activation/deactivation onto the call's tracer.
148
+ (0, _react.useEffect)(() => {
149
+ const callingx = (0, _callingx2.getCallingxLibIfAvailable)();
150
+ if (!callingx?.isSetup || !activeCall) {
151
+ return;
152
+ }
153
+ const activateSubscription = callingx.addEventListener('didActivateAudioSession', () => {
154
+ activeCall.tracer.trace('callingx.didActivateAudioSession', null);
155
+ });
156
+ const deactivateSubscription = callingx.addEventListener('didDeactivateAudioSession', () => {
157
+ activeCall.tracer.trace('callingx.didDeactivateAudioSession', null);
158
+ });
159
+ return () => {
160
+ activateSubscription.remove();
161
+ deactivateSubscription.remove();
162
+ };
163
+ }, [activeCall]);
164
+
165
+ // Trace the iOS ADM recording state to detect silent-mic calls: the engine's
166
+ // input bring-up racing the CallKit audio-session activation could leave
167
+ // recording silently never started (mic track live, zero audio RTP sent).
168
+ // Samples shortly after JOINED and after every didActivateAudioSession, and
169
+ // traces healthy calls too so the failure rate is measurable. Detection only;
170
+ // the engine-availability gate in callingx owns prevention.
171
+ (0, _react.useEffect)(() => {
172
+ const callingx = (0, _callingx2.getCallingxLibIfAvailable)();
173
+ if (_reactNative.Platform.OS !== 'ios' || !callingx?.isSetup || !activeCall) {
174
+ return;
175
+ }
176
+ const timeouts = new Set();
177
+ const traceRecordingState = trigger => {
178
+ if (activeCall.state.callingState !== _videoClient.CallingState.JOINED) return;
179
+ if (activeCall.microphone.state.status !== 'enabled') return;
180
+ let state;
181
+ try {
182
+ state = {
183
+ trigger,
184
+ isRecording: _reactNativeWebrtc.AudioDeviceModule.isRecording(),
185
+ isEngineRunning: _reactNativeWebrtc.AudioDeviceModule.isEngineRunning(),
186
+ isMicrophoneMuted: _reactNativeWebrtc.AudioDeviceModule.isMicrophoneMuted()
187
+ };
188
+ } catch (error) {
189
+ logger.warn('failed to read the ADM recording state', error);
190
+ return;
191
+ }
192
+ activeCall.tracer.trace('ios.audioRecording.state', state);
193
+ if (!state.isRecording) {
194
+ logger.warn('mic is enabled but ADM is not recording', state);
195
+ }
196
+ };
197
+ const scheduleCheck = (trigger, delayMs) => {
198
+ const timeout = setTimeout(() => {
199
+ timeouts.delete(timeout);
200
+ traceRecordingState(trigger);
201
+ }, delayMs);
202
+ timeouts.add(timeout);
203
+ };
204
+ const joinedSubscription = activeCall.state.callingState$.pipe((0, _operators.filter)(callingState => callingState === _videoClient.CallingState.JOINED), (0, _operators.take)(1))
205
+ // delayed so the normal engine bring-up can complete on its own
206
+ .subscribe(() => scheduleCheck('joined', 3000));
207
+ const activationSubscription = callingx.addEventListener('didActivateAudioSession',
208
+ // delayed so the activation-driven engine start can run first
209
+ () => scheduleCheck('audioSessionActivated', 1000));
210
+ return () => {
211
+ joinedSubscription.unsubscribe();
212
+ activationSubscription.remove();
213
+ timeouts.forEach(clearTimeout);
214
+ timeouts.clear();
215
+ };
216
+ }, [activeCall]);
144
217
  };
145
218
  exports.useCallingExpWithCallingStateEffect = useCallingExpWithCallingStateEffect;
146
219
  //# sourceMappingURL=useCallingExpWithCallingStateEffect.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["_videoClient","require","_videoReactBindings","_react","_operators","_callingx","_callingx2","logger","videoLoggerSystem","getLogger","useCallingExpWithCallingStateEffect","useMicrophoneState","useParticipants","useCallMembers","useCallStateHooks","activeCall","useCall","isMute","microphone","callMembers","participants","activeCallCid","cid","createdByUserId","state","createdBy","id","callCustomDisplayName","custom","display_name","currentUserId","isIncoming","ringing","isCreatedByMe","callDisplayName","useMemo","getCallDisplayName","useEffect","callingx","getCallingxLibIfAvailable","isSetup","shouldMakeCallActive","call","isOngoingCallsEnabled","subscription","callingState$","pipe","filter","callingState","CallingState","JOINED","isCallTracked","take","subscribe","setCurrentCallActive","unsubscribe","debug","endCallWithReason","catch","error","updateDisplay","setMutedCall","addEventListener","event","callId","muted","isCurrentlyMuted","status","disable","enable","remove","exports"],"sourceRoot":"../../../../src","sources":["hooks/push/useCallingExpWithCallingStateEffect.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_videoClient","require","_videoReactBindings","_react","_reactNative","_reactNativeWebrtc","_operators","_callingx","_callingx2","logger","videoLoggerSystem","getLogger","useCallingExpWithCallingStateEffect","useMicrophoneState","useParticipants","useCallMembers","useCallStateHooks","activeCall","useCall","isMute","microphone","callMembers","participants","activeCallCid","cid","createdByUserId","state","createdBy","id","callCustomDisplayName","custom","display_name","currentUserId","isIncoming","ringing","isCreatedByMe","callDisplayName","useMemo","getCallDisplayName","useEffect","callingx","getCallingxLibIfAvailable","isSetup","shouldMakeCallActive","call","isOngoingCallsEnabled","subscription","callingState$","pipe","filter","callingState","CallingState","JOINED","isCallTracked","take","subscribe","setCurrentCallActive","unsubscribe","debug","endCallWithReason","catch","error","updateDisplay","setMutedCall","addEventListener","event","callId","muted","isCurrentlyMuted","status","disable","enable","remove","activateSubscription","tracer","trace","deactivateSubscription","Platform","OS","timeouts","Set","traceRecordingState","trigger","isRecording","AudioDeviceModule","isEngineRunning","isMicrophoneMuted","warn","scheduleCheck","delayMs","timeout","setTimeout","delete","add","joinedSubscription","activationSubscription","forEach","clearTimeout","clear","exports"],"sourceRoot":"../../../../src","sources":["hooks/push/useCallingExpWithCallingStateEffect.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.useAudioDeviceStatus = void 0;
7
+ var _react = require("react");
8
+ var _callManager = require("../modules/call-manager");
9
+ /**
10
+ * Structural equality for two audio device states to avoid redundant re-renders.
11
+ */
12
+ const areStatesEqual = (a, b) => {
13
+ if (!a) return false;
14
+ if (a.selectedDeviceId !== b.selectedDeviceId || a.currentEndpointType !== b.currentEndpointType || a.devices.length !== b.devices.length) {
15
+ return false;
16
+ }
17
+ return a.devices.every((device, i) => {
18
+ const other = b.devices[i];
19
+ return other !== undefined && device.id === other.id && device.name === other.name && device.type === other.type;
20
+ });
21
+ };
22
+
23
+ /**
24
+ * Subscribes to the current audio output device state and keeps it in sync.
25
+ *
26
+ * Works on Android, iOS, and iOS with CallKit
27
+ * (`@stream-io/react-native-callingx`) — the underlying source is selected
28
+ * automatically. Pair with `callManager.audioDevices.select(device.id)` to
29
+ * build a custom audio route picker.
30
+ *
31
+ * @returns the latest {@link AudioDevicesState}, or `undefined` until the
32
+ * initial status resolves.
33
+ *
34
+ * @example
35
+ * ```tsx
36
+ * const status = useAudioDeviceStatus();
37
+ * const { devices, selectedDeviceId } = status ?? {};
38
+ * // callManager.audioDevices.select(devices[0].id);
39
+ * ```
40
+ */
41
+ const useAudioDeviceStatus = () => {
42
+ const [state, setState] = (0, _react.useState)();
43
+ (0, _react.useEffect)(() => {
44
+ let active = true;
45
+ let receivedUpdate = false;
46
+ let unsubscribe = () => {};
47
+ const applyIfChanged = next => {
48
+ setState(prev => areStatesEqual(prev, next) ? prev : next);
49
+ };
50
+
51
+ // Live change events take precedence over the initial fetch.
52
+ const onChange = next => {
53
+ if (!active) return;
54
+ receivedUpdate = true;
55
+ applyIfChanged(next);
56
+ };
57
+ try {
58
+ // Subscribe before fetching so no change between the two is missed.
59
+ unsubscribe = _callManager.callManager.audioDevices.addChangeListener(onChange);
60
+ _callManager.callManager.audioDevices.getStatus().then(initial => {
61
+ // Don't let the initial snapshot clobber newer event-driven state,
62
+ // and ignore it entirely after unmount.
63
+ if (active && !receivedUpdate) applyIfChanged(initial);
64
+ }).catch(() => {});
65
+ } catch {
66
+ // Native/bridge error during setup — leave state undefined.
67
+ }
68
+ return () => {
69
+ active = false;
70
+ unsubscribe();
71
+ };
72
+ }, []);
73
+ return state;
74
+ };
75
+ exports.useAudioDeviceStatus = useAudioDeviceStatus;
76
+ //# sourceMappingURL=useAudioDeviceStatus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_react","require","_callManager","areStatesEqual","a","b","selectedDeviceId","currentEndpointType","devices","length","every","device","i","other","undefined","id","name","type","useAudioDeviceStatus","state","setState","useState","useEffect","active","receivedUpdate","unsubscribe","applyIfChanged","next","prev","onChange","callManager","audioDevices","addChangeListener","getStatus","then","initial","catch","exports"],"sourceRoot":"../../../src","sources":["hooks/useAudioDeviceStatus.ts"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AACA,IAAAC,YAAA,GAAAD,OAAA;AAGA;AACA;AACA;AACA,MAAME,cAAc,GAAGA,CACrBC,CAAgC,EAChCC,CAAoB,KACR;EACZ,IAAI,CAACD,CAAC,EAAE,OAAO,KAAK;EACpB,IACEA,CAAC,CAACE,gBAAgB,KAAKD,CAAC,CAACC,gBAAgB,IACzCF,CAAC,CAACG,mBAAmB,KAAKF,CAAC,CAACE,mBAAmB,IAC/CH,CAAC,CAACI,OAAO,CAACC,MAAM,KAAKJ,CAAC,CAACG,OAAO,CAACC,MAAM,EACrC;IACA,OAAO,KAAK;EACd;EACA,OAAOL,CAAC,CAACI,OAAO,CAACE,KAAK,CAAC,CAACC,MAAM,EAAEC,CAAC,KAAK;IACpC,MAAMC,KAAK,GAAGR,CAAC,CAACG,OAAO,CAACI,CAAC,CAAC;IAC1B,OACEC,KAAK,KAAKC,SAAS,IACnBH,MAAM,CAACI,EAAE,KAAKF,KAAK,CAACE,EAAE,IACtBJ,MAAM,CAACK,IAAI,KAAKH,KAAK,CAACG,IAAI,IAC1BL,MAAM,CAACM,IAAI,KAAKJ,KAAK,CAACI,IAAI;EAE9B,CAAC,CAAC;AACJ,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMC,oBAAoB,GAAGA,CAAA,KAAqC;EACvE,MAAM,CAACC,KAAK,EAAEC,QAAQ,CAAC,GAAG,IAAAC,eAAQ,EAAoB,CAAC;EAEvD,IAAAC,gBAAS,EAAC,MAAM;IACd,IAAIC,MAAM,GAAG,IAAI;IACjB,IAAIC,cAAc,GAAG,KAAK;IAC1B,IAAIC,WAAW,GAAGA,CAAA,KAAM,CAAC,CAAC;IAE1B,MAAMC,cAAc,GAAIC,IAAuB,IAAK;MAClDP,QAAQ,CAAEQ,IAAI,IAAMzB,cAAc,CAACyB,IAAI,EAAED,IAAI,CAAC,GAAGC,IAAI,GAAGD,IAAK,CAAC;IAChE,CAAC;;IAED;IACA,MAAME,QAAQ,GAAIF,IAAuB,IAAK;MAC5C,IAAI,CAACJ,MAAM,EAAE;MACbC,cAAc,GAAG,IAAI;MACrBE,cAAc,CAACC,IAAI,CAAC;IACtB,CAAC;IAED,IAAI;MACF;MACAF,WAAW,GAAGK,wBAAW,CAACC,YAAY,CAACC,iBAAiB,CAACH,QAAQ,CAAC;MAClEC,wBAAW,CAACC,YAAY,CACrBE,SAAS,CAAC,CAAC,CACXC,IAAI,CAAEC,OAAO,IAAK;QACjB;QACA;QACA,IAAIZ,MAAM,IAAI,CAACC,cAAc,EAAEE,cAAc,CAACS,OAAO,CAAC;MACxD,CAAC,CAAC,CACDC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IACpB,CAAC,CAAC,MAAM;MACN;IAAA;IAGF,OAAO,MAAM;MACXb,MAAM,GAAG,KAAK;MACdE,WAAW,CAAC,CAAC;IACf,CAAC;EACH,CAAC,EAAE,EAAE,CAAC;EAEN,OAAON,KAAK;AACd,CAAC;AAACkB,OAAA,CAAAnB,oBAAA,GAAAA,oBAAA","ignoreList":[]}