@100mslive/react-native-hms 0.9.8 → 0.9.92

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 (91) hide show
  1. package/README.md +50 -43
  2. package/android/.gradle/6.9/fileHashes/fileHashes.bin +0 -0
  3. package/android/.gradle/6.9/fileHashes/fileHashes.lock +0 -0
  4. package/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock +0 -0
  5. package/android/.gradle/buildOutputCleanup/outputFiles.bin +0 -0
  6. package/android/.gradle/checksums/checksums.lock +0 -0
  7. package/android/.gradle/checksums/md5-checksums.bin +0 -0
  8. package/android/.gradle/checksums/sha1-checksums.bin +0 -0
  9. package/android/.idea/libraries/{Gradle__com_github_100mslive_android_sdk_lib_2_4_2_aar.xml → Gradle__com_github_100mslive_android_sdk_lib_2_4_7_aar.xml} +4 -4
  10. package/android/.idea/libraries/Gradle__com_github_100mslive_webrtc_m97_hms_1_1_aar.xml +11 -0
  11. package/android/.idea/modules/android.androidTest.iml +4 -4
  12. package/android/.idea/modules/android.main.iml +4 -4
  13. package/android/.idea/modules/android.unitTest.iml +4 -4
  14. package/android/build.gradle +2 -2
  15. package/android/src/main/java/com/reactnativehmssdk/HMSAudioshareActivity.kt +84 -0
  16. package/android/src/main/java/com/reactnativehmssdk/HMSDecoder.kt +77 -8
  17. package/android/src/main/java/com/reactnativehmssdk/HMSHelper.kt +95 -22
  18. package/android/src/main/java/com/reactnativehmssdk/HMSManager.kt +88 -2
  19. package/android/src/main/java/com/reactnativehmssdk/HMSRNSDK.kt +282 -49
  20. package/ios/HMSDecoder.swift +9 -8
  21. package/ios/HMSHelper.swift +5 -8
  22. package/ios/HMSManager.m +4 -1
  23. package/ios/HMSManager.swift +28 -6
  24. package/ios/HMSRNSDK.swift +146 -101
  25. package/lib/commonjs/classes/HMSAudioDevice.js +17 -0
  26. package/lib/commonjs/classes/HMSAudioDevice.js.map +1 -0
  27. package/lib/commonjs/classes/HMSAudioMixingMode.js +15 -0
  28. package/lib/commonjs/classes/HMSAudioMixingMode.js.map +1 -0
  29. package/lib/commonjs/classes/HMSAudioMode.js +17 -0
  30. package/lib/commonjs/classes/HMSAudioMode.js.map +1 -0
  31. package/lib/commonjs/classes/HMSEncoder.js +15 -0
  32. package/lib/commonjs/classes/HMSEncoder.js.map +1 -1
  33. package/lib/commonjs/classes/HMSException.js +18 -13
  34. package/lib/commonjs/classes/HMSException.js.map +1 -1
  35. package/lib/commonjs/classes/HMSHLSConfig.js.map +1 -1
  36. package/lib/commonjs/classes/HMSLogger.js +2 -2
  37. package/lib/commonjs/classes/HMSLogger.js.map +1 -1
  38. package/lib/commonjs/classes/HMSPermissions.js +7 -4
  39. package/lib/commonjs/classes/HMSPermissions.js.map +1 -1
  40. package/lib/commonjs/classes/HMSSDK.js +267 -58
  41. package/lib/commonjs/classes/HMSSDK.js.map +1 -1
  42. package/lib/commonjs/classes/HMSUpdateListenerActions.js +1 -0
  43. package/lib/commonjs/classes/HMSUpdateListenerActions.js.map +1 -1
  44. package/lib/commonjs/index.js +42 -0
  45. package/lib/commonjs/index.js.map +1 -1
  46. package/lib/module/classes/HMSAudioDevice.js +10 -0
  47. package/lib/module/classes/HMSAudioDevice.js.map +1 -0
  48. package/lib/module/classes/HMSAudioMixingMode.js +8 -0
  49. package/lib/module/classes/HMSAudioMixingMode.js.map +1 -0
  50. package/lib/module/classes/HMSAudioMode.js +10 -0
  51. package/lib/module/classes/HMSAudioMode.js.map +1 -0
  52. package/lib/module/classes/HMSEncoder.js +14 -0
  53. package/lib/module/classes/HMSEncoder.js.map +1 -1
  54. package/lib/module/classes/HMSException.js +18 -13
  55. package/lib/module/classes/HMSException.js.map +1 -1
  56. package/lib/module/classes/HMSHLSConfig.js.map +1 -1
  57. package/lib/module/classes/HMSLogger.js +2 -2
  58. package/lib/module/classes/HMSLogger.js.map +1 -1
  59. package/lib/module/classes/HMSPermissions.js +7 -4
  60. package/lib/module/classes/HMSPermissions.js.map +1 -1
  61. package/lib/module/classes/HMSSDK.js +267 -52
  62. package/lib/module/classes/HMSSDK.js.map +1 -1
  63. package/lib/module/classes/HMSUpdateListenerActions.js +1 -0
  64. package/lib/module/classes/HMSUpdateListenerActions.js.map +1 -1
  65. package/lib/module/index.js +3 -0
  66. package/lib/module/index.js.map +1 -1
  67. package/lib/typescript/classes/HMSAudioDevice.d.ts +7 -0
  68. package/lib/typescript/classes/HMSAudioMixingMode.d.ts +5 -0
  69. package/lib/typescript/classes/HMSAudioMode.d.ts +7 -0
  70. package/lib/typescript/classes/HMSEncoder.d.ts +2 -0
  71. package/lib/typescript/classes/HMSException.d.ts +8 -14
  72. package/lib/typescript/classes/HMSHLSConfig.d.ts +2 -2
  73. package/lib/typescript/classes/HMSLogger.d.ts +1 -1
  74. package/lib/typescript/classes/HMSPermissions.d.ts +6 -4
  75. package/lib/typescript/classes/HMSSDK.d.ts +112 -12
  76. package/lib/typescript/classes/HMSUpdateListenerActions.d.ts +2 -1
  77. package/lib/typescript/index.d.ts +3 -0
  78. package/package.json +1 -19
  79. package/react-native-hms.podspec +2 -1
  80. package/src/classes/HMSAudioDevice.ts +7 -0
  81. package/src/classes/HMSAudioMixingMode.ts +5 -0
  82. package/src/classes/HMSAudioMode.ts +7 -0
  83. package/src/classes/HMSEncoder.ts +12 -0
  84. package/src/classes/HMSException.ts +15 -24
  85. package/src/classes/HMSHLSConfig.ts +2 -2
  86. package/src/classes/HMSLogger.ts +2 -2
  87. package/src/classes/HMSPermissions.ts +9 -6
  88. package/src/classes/HMSSDK.tsx +352 -67
  89. package/src/classes/HMSUpdateListenerActions.ts +1 -0
  90. package/src/index.ts +3 -0
  91. package/android/.idea/libraries/Gradle__com_github_100mslive_webrtc_m97_aar.xml +0 -11
@@ -6,12 +6,13 @@ import com.facebook.react.bridge.*
6
6
  import com.facebook.react.bridge.UiThreadUtil.runOnUiThread
7
7
  import java.util.*
8
8
  import kotlinx.coroutines.launch
9
+ import live.hms.video.audio.HMSAudioManager
10
+ import live.hms.video.connection.stats.*
9
11
  import live.hms.video.error.HMSException
10
- import live.hms.video.media.tracks.HMSRemoteAudioTrack
11
- import live.hms.video.media.tracks.HMSTrack
12
- import live.hms.video.media.tracks.HMSTrackType
12
+ import live.hms.video.media.tracks.*
13
13
  import live.hms.video.sdk.*
14
14
  import live.hms.video.sdk.models.*
15
+ import live.hms.video.sdk.models.enums.AudioMixingMode
15
16
  import live.hms.video.sdk.models.enums.HMSPeerUpdate
16
17
  import live.hms.video.sdk.models.enums.HMSRoomUpdate
17
18
  import live.hms.video.sdk.models.enums.HMSTrackUpdate
@@ -27,15 +28,20 @@ class HMSRNSDK(
27
28
  ) {
28
29
  var hmsSDK: HMSSDK? = null
29
30
  var screenshareCallback: Promise? = null
31
+ var audioshareCallback: Promise? = null
32
+ var isAudioSharing: Boolean = false
30
33
  var delegate: HMSManager = HmsDelegate
31
34
  private var recentRoleChangeRequest: HMSRoleChangeRequest? = null
32
35
  private var context: ReactApplicationContext = reactApplicationContext
33
36
  private var previewInProgress: Boolean = false
37
+ private var reconnectingStage: Boolean = false
38
+ private var rtcStatsAttached: Boolean = false
39
+ private var audioMixingMode: AudioMixingMode = AudioMixingMode.TALK_AND_MUSIC
34
40
  private var id: String = sdkId
35
41
  private var self = this
36
42
 
37
43
  init {
38
- val trackSettings = HMSHelper.getTrackSettings(data)
44
+ val trackSettings = HMSHelper.getTrackSettings(data?.getMap("trackSettings"))
39
45
  if (trackSettings == null) {
40
46
  this.hmsSDK = HMSSDK.Builder(reactApplicationContext).build()
41
47
  } else {
@@ -45,8 +51,7 @@ class HMSRNSDK(
45
51
 
46
52
  private fun emitCustomError(message: String) {
47
53
  val data: WritableMap = Arguments.createMap()
48
- val hmsError = HMSException(102, message, message, message, message)
49
- data.putString("event", "ON_ERROR")
54
+ val hmsError = HMSException(6002, message, message, message, message, null, false)
50
55
  data.putString("id", id)
51
56
  data.putMap("error", HMSDecoder.getError(hmsError))
52
57
  delegate.emitEvent("ON_ERROR", data)
@@ -55,20 +60,26 @@ class HMSRNSDK(
55
60
  private fun emitRequiredKeysError(message: String) {
56
61
  val data: WritableMap = Arguments.createMap()
57
62
  val hmsError =
58
- HMSException(102, "REQUIRED_KEYS_NOT_FOUND", "SEND_ALL_REQUIRED_KEYS", message, message)
59
- data.putString("event", "ON_ERROR")
63
+ HMSException(
64
+ 6002,
65
+ "REQUIRED_KEYS_NOT_FOUND",
66
+ "SEND_ALL_REQUIRED_KEYS",
67
+ message,
68
+ message,
69
+ null,
70
+ false
71
+ )
60
72
  data.putString("id", id)
61
73
  data.putMap("error", HMSDecoder.getError(hmsError))
62
74
  delegate.emitEvent("ON_ERROR", data)
63
75
  }
64
76
 
65
77
  private fun rejectCallback(callback: Promise?, message: String) {
66
- callback?.reject("102", message)
78
+ callback?.reject("6002", message)
67
79
  }
68
80
 
69
81
  fun emitHMSError(error: HMSException) {
70
82
  val data: WritableMap = Arguments.createMap()
71
- data.putString("event", "ON_ERROR")
72
83
  data.putString("id", id)
73
84
  data.putMap("error", HMSDecoder.getError(error))
74
85
  delegate.emitEvent("ON_ERROR", data)
@@ -181,6 +192,7 @@ class HMSRNSDK(
181
192
  arrayOf(Pair("username", "String"), Pair("authToken", "String"))
182
193
  )
183
194
  if (requiredKeys === null) {
195
+ reconnectingStage = false
184
196
  val config = HMSHelper.getHmsConfig(credentials)
185
197
 
186
198
  HMSCoroutineScope.launch {
@@ -312,6 +324,7 @@ class HMSRNSDK(
312
324
  }
313
325
 
314
326
  override fun onReconnected() {
327
+ reconnectingStage = false
315
328
  val data: WritableMap = Arguments.createMap()
316
329
  data.putString("event", "RECONNECTED")
317
330
  data.putString("id", id)
@@ -319,7 +332,9 @@ class HMSRNSDK(
319
332
  }
320
333
 
321
334
  override fun onReconnecting(error: HMSException) {
335
+ reconnectingStage = true
322
336
  val data: WritableMap = Arguments.createMap()
337
+ data.putMap("error", HMSDecoder.getError(error))
323
338
  data.putString("event", "RECONNECTING")
324
339
  data.putString("id", id)
325
340
  delegate.emitEvent("RECONNECTING", data)
@@ -356,6 +371,109 @@ class HMSRNSDK(
356
371
  }
357
372
  }
358
373
  )
374
+
375
+ hmsSDK?.addRtcStatsObserver(
376
+ object : HMSStatsObserver {
377
+ override fun onLocalAudioStats(
378
+ audioStats: HMSLocalAudioStats,
379
+ hmsTrack: HMSTrack?,
380
+ hmsPeer: HMSPeer?
381
+ ) {
382
+ if (!rtcStatsAttached) {
383
+ return
384
+ }
385
+ val localAudioStats = HMSDecoder.getLocalAudioStats(audioStats)
386
+ val track = HMSDecoder.getHmsLocalAudioTrack(hmsTrack as HMSLocalAudioTrack)
387
+ val peer = HMSDecoder.getHmsPeer(hmsPeer)
388
+
389
+ val data: WritableMap = Arguments.createMap()
390
+ data.putMap("localAudioStats", localAudioStats)
391
+ data.putMap("track", track)
392
+ data.putMap("peer", peer)
393
+ data.putString("id", id)
394
+ delegate.emitEvent("ON_LOCAL_AUDIO_STATS", data)
395
+ }
396
+
397
+ override fun onLocalVideoStats(
398
+ videoStats: HMSLocalVideoStats,
399
+ hmsTrack: HMSTrack?,
400
+ hmsPeer: HMSPeer?
401
+ ) {
402
+ if (!rtcStatsAttached) {
403
+ return
404
+ }
405
+
406
+ val localVideoStats = HMSDecoder.getLocalVideoStats(videoStats)
407
+ val track = HMSDecoder.getHmsLocalVideoTrack(hmsTrack as HMSLocalVideoTrack)
408
+ val peer = HMSDecoder.getHmsPeer(hmsPeer)
409
+
410
+ val data: WritableMap = Arguments.createMap()
411
+ data.putMap("localVideoStats", localVideoStats)
412
+ data.putMap("track", track)
413
+ data.putMap("peer", peer)
414
+ data.putString("id", id)
415
+ delegate.emitEvent("ON_LOCAL_VIDEO_STATS", data)
416
+ }
417
+
418
+ override fun onRTCStats(rtcStats: HMSRTCStatsReport) {
419
+ if (!rtcStatsAttached) {
420
+ return
421
+ }
422
+ val video = HMSDecoder.getHMSRTCStats(rtcStats.video)
423
+ val audio = HMSDecoder.getHMSRTCStats(rtcStats.audio)
424
+ val combined = HMSDecoder.getHMSRTCStats(rtcStats.combined)
425
+
426
+ val data: WritableMap = Arguments.createMap()
427
+ data.putMap("video", video)
428
+ data.putMap("audio", audio)
429
+ data.putMap("combined", combined)
430
+ data.putString("id", id)
431
+ delegate.emitEvent("ON_RTC_STATS", data)
432
+ }
433
+
434
+ override fun onRemoteAudioStats(
435
+ audioStats: HMSRemoteAudioStats,
436
+ hmsTrack: HMSTrack?,
437
+ hmsPeer: HMSPeer?
438
+ ) {
439
+ if (!rtcStatsAttached) {
440
+ return
441
+ }
442
+
443
+ val remoteAudioStats = HMSDecoder.getRemoteAudioStats(audioStats)
444
+ val track = HMSDecoder.getHmsRemoteAudioTrack(hmsTrack as HMSRemoteAudioTrack)
445
+ val peer = HMSDecoder.getHmsPeer(hmsPeer)
446
+
447
+ val data: WritableMap = Arguments.createMap()
448
+ data.putMap("remoteAudioStats", remoteAudioStats)
449
+ data.putMap("track", track)
450
+ data.putMap("peer", peer)
451
+ data.putString("id", id)
452
+ delegate.emitEvent("ON_REMOTE_AUDIO_STATS", data)
453
+ }
454
+
455
+ override fun onRemoteVideoStats(
456
+ videoStats: HMSRemoteVideoStats,
457
+ hmsTrack: HMSTrack?,
458
+ hmsPeer: HMSPeer?
459
+ ) {
460
+ if (!rtcStatsAttached) {
461
+ return
462
+ }
463
+
464
+ val remoteVideoStats = HMSDecoder.getRemoteVideoStats(videoStats)
465
+ val track = HMSDecoder.getHmsRemoteVideoTrack(hmsTrack as HMSRemoteVideoTrack)
466
+ val peer = HMSDecoder.getHmsPeer(hmsPeer)
467
+
468
+ val data: WritableMap = Arguments.createMap()
469
+ data.putMap("remoteVideoStats", remoteVideoStats)
470
+ data.putMap("track", track)
471
+ data.putMap("peer", peer)
472
+ data.putString("id", id)
473
+ delegate.emitEvent("ON_REMOTE_VIDEO_STATS", data)
474
+ }
475
+ }
476
+ )
359
477
  }
360
478
  } else {
361
479
  val errorMessage = "join: $requiredKeys"
@@ -380,19 +498,25 @@ class HMSRNSDK(
380
498
  }
381
499
 
382
500
  fun leave(callback: Promise?) {
383
- hmsSDK?.leave(
384
- object : HMSActionResultListener {
385
- override fun onSuccess() {
386
- screenshareCallback = null
387
- callback?.resolve(emitHMSSuccess())
388
- }
501
+ if (reconnectingStage) {
502
+ callback?.reject("101", "Still in reconnecting stage")
503
+ } else {
504
+ hmsSDK?.leave(
505
+ object : HMSActionResultListener {
506
+ override fun onSuccess() {
507
+ isAudioSharing = false
508
+ screenshareCallback = null
509
+ audioshareCallback = null
510
+ callback?.resolve(emitHMSSuccess())
511
+ }
389
512
 
390
- override fun onError(error: HMSException) {
391
- callback?.reject(error.code.toString(), error.message)
392
- self.emitHMSError(error)
513
+ override fun onError(error: HMSException) {
514
+ callback?.reject(error.code.toString(), error.message)
515
+ self.emitHMSError(error)
516
+ }
393
517
  }
394
- }
395
- )
518
+ )
519
+ }
396
520
  }
397
521
 
398
522
  fun sendBroadcastMessage(data: ReadableMap, callback: Promise?) {
@@ -709,7 +833,7 @@ class HMSRNSDK(
709
833
  }
710
834
  }
711
835
 
712
- fun remoteMuteAllAudio() {
836
+ fun remoteMuteAllAudio(callback: Promise?) {
713
837
  val allAudioTracks = hmsSDK?.getRoom()?.let { HmsUtilities.getAllAudioTracks(it) }
714
838
  if (allAudioTracks != null) {
715
839
  var customError: HMSException? = null
@@ -725,10 +849,13 @@ class HMSRNSDK(
725
849
  }
726
850
  )
727
851
  }
728
- if (customError != null) {
729
- self.emitHMSError(customError!!)
852
+ if (customError === null) {
853
+ callback?.resolve(emitHMSSuccess())
854
+ } else {
855
+ rejectCallback(callback, customError!!.message)
730
856
  }
731
857
  }
858
+ rejectCallback(callback, "Audio tracks not found")
732
859
  }
733
860
 
734
861
  fun setPlaybackForAllAudio(data: ReadableMap) {
@@ -979,32 +1106,19 @@ class HMSRNSDK(
979
1106
  }
980
1107
 
981
1108
  fun startHLSStreaming(data: ReadableMap, callback: Promise?) {
982
- val requiredKeys =
983
- HMSHelper.getUnavailableRequiredKey(data, arrayOf(Pair("meetingURLVariants", "Array")))
984
- if (requiredKeys === null) {
985
- val meetingURLVariants =
986
- data.getArray("meetingURLVariants")?.toArrayList() as? ArrayList<HashMap<String, String>>
987
- val hlsMeetingUrlVariant = HMSHelper.getHMSHLSMeetingURLVariants(meetingURLVariants)
988
- val hlsRecordingConfig = HMSHelper.getHlsRecordingConfig(data)
989
- val config = HMSHLSConfig(hlsMeetingUrlVariant, hlsRecordingConfig)
990
-
991
- hmsSDK?.startHLSStreaming(
992
- config,
993
- object : HMSActionResultListener {
994
- override fun onSuccess() {
995
- callback?.resolve(emitHMSSuccess())
996
- }
997
- override fun onError(error: HMSException) {
998
- callback?.reject(error.code.toString(), error.message)
999
- self.emitHMSError(error)
1000
- }
1109
+ val hlsConfig = HMSHelper.getHLSConfig(data)
1110
+ hmsSDK?.startHLSStreaming(
1111
+ hlsConfig,
1112
+ object : HMSActionResultListener {
1113
+ override fun onSuccess() {
1114
+ callback?.resolve(emitHMSSuccess())
1001
1115
  }
1002
- )
1003
- } else {
1004
- val errorMessage = "startHLSStreaming: $requiredKeys"
1005
- self.emitRequiredKeysError(errorMessage)
1006
- rejectCallback(callback, errorMessage)
1007
- }
1116
+ override fun onError(error: HMSException) {
1117
+ callback?.reject(error.code.toString(), error.message)
1118
+ self.emitHMSError(error)
1119
+ }
1120
+ }
1121
+ )
1008
1122
  }
1009
1123
 
1010
1124
  fun stopHLSStreaming(callback: Promise?) {
@@ -1071,4 +1185,123 @@ class HMSRNSDK(
1071
1185
  rejectCallback(callback, errorMessage)
1072
1186
  }
1073
1187
  }
1188
+
1189
+ fun enableRTCStats() {
1190
+ rtcStatsAttached = true
1191
+ }
1192
+
1193
+ fun disableRTCStats() {
1194
+ rtcStatsAttached = false
1195
+ }
1196
+
1197
+ fun getAudioDevicesList(callback: Promise?) {
1198
+ callback?.resolve(HMSHelper.getAudioDevicesList(hmsSDK?.getAudioDevicesList()))
1199
+ }
1200
+
1201
+ fun getAudioOutputRouteType(callback: Promise?) {
1202
+ callback?.resolve(hmsSDK?.getAudioOutputRouteType()?.name)
1203
+ }
1204
+
1205
+ fun switchAudioOutput(data: ReadableMap) {
1206
+ val requiredKeys =
1207
+ HMSHelper.getUnavailableRequiredKey(data, arrayOf(Pair("audioDevice", "String")))
1208
+ if (requiredKeys === null) {
1209
+ val audioDevice = data.getString("audioDevice")
1210
+ hmsSDK?.switchAudioOutput(HMSHelper.getAudioDevice(audioDevice))
1211
+ } else {
1212
+ val errorMessage = "switchAudioOutput: $requiredKeys"
1213
+ self.emitRequiredKeysError(errorMessage)
1214
+ }
1215
+ }
1216
+
1217
+ fun setAudioMode(data: ReadableMap) {
1218
+ val requiredKeys = HMSHelper.getUnavailableRequiredKey(data, arrayOf(Pair("audioMode", "Int")))
1219
+ if (requiredKeys === null) {
1220
+ val audioMode = data.getInt("audioMode")
1221
+ hmsSDK?.setAudioMode(audioMode)
1222
+ } else {
1223
+ val errorMessage = "setAudioMode: $requiredKeys"
1224
+ self.emitRequiredKeysError(errorMessage)
1225
+ }
1226
+ }
1227
+
1228
+ fun setAudioDeviceChangeListener() {
1229
+ hmsSDK?.setAudioDeviceChangeListener(
1230
+ object : HMSAudioManager.AudioManagerDeviceChangeListener {
1231
+ override fun onAudioDeviceChanged(
1232
+ device: HMSAudioManager.AudioDevice?,
1233
+ audioDevicesList: Set<HMSAudioManager.AudioDevice>?
1234
+ ) {
1235
+ val data: WritableMap = Arguments.createMap()
1236
+ data.putString("device", device?.name)
1237
+ data.putArray("audioDevicesList", HMSHelper.getAudioDevicesSet(audioDevicesList))
1238
+ data.putString("id", id)
1239
+ delegate.emitEvent("ON_AUDIO_DEVICE_CHANGED", data)
1240
+ }
1241
+
1242
+ override fun onError(error: HMSException) {
1243
+ self.emitHMSError(error)
1244
+ }
1245
+ }
1246
+ )
1247
+ }
1248
+
1249
+ fun startAudioshare(data: ReadableMap, callback: Promise?) {
1250
+ val requiredKeys =
1251
+ HMSHelper.getUnavailableRequiredKey(data, arrayOf(Pair("audioMixingMode", "String")))
1252
+ if (requiredKeys === null) {
1253
+ audioshareCallback = callback
1254
+ runOnUiThread {
1255
+ val intent = Intent(context, HMSAudioshareActivity::class.java)
1256
+ intent.flags = FLAG_ACTIVITY_NEW_TASK
1257
+ intent.putExtra("id", id)
1258
+ intent.putExtra("audioMixingMode", data.getString("audioMixingMode"))
1259
+ context.startActivity(intent)
1260
+ }
1261
+ } else {
1262
+ val errorMessage = "startAudioshare: $requiredKeys"
1263
+ self.emitRequiredKeysError(errorMessage)
1264
+ rejectCallback(callback, errorMessage)
1265
+ }
1266
+ }
1267
+
1268
+ fun isAudioShared(callback: Promise?) {
1269
+ callback?.resolve(isAudioSharing)
1270
+ }
1271
+
1272
+ fun stopAudioshare(callback: Promise?) {
1273
+ hmsSDK?.stopAudioshare(
1274
+ object : HMSActionResultListener {
1275
+ override fun onError(error: HMSException) {
1276
+ audioshareCallback = null
1277
+ callback?.reject(error.code.toString(), error.message)
1278
+ self.emitHMSError(error)
1279
+ }
1280
+ override fun onSuccess() {
1281
+ isAudioSharing = false
1282
+ audioshareCallback = null
1283
+ callback?.resolve(emitHMSSuccess())
1284
+ }
1285
+ }
1286
+ )
1287
+ }
1288
+
1289
+ fun getAudioMixingMode(): AudioMixingMode {
1290
+ return audioMixingMode
1291
+ }
1292
+
1293
+ fun setAudioMixingMode(data: ReadableMap, callback: Promise?) {
1294
+ val requiredKeys =
1295
+ HMSHelper.getUnavailableRequiredKey(data, arrayOf(Pair("audioMixingMode", "String")))
1296
+ if (requiredKeys === null) {
1297
+ val mode = HMSHelper.getAudioMixingMode(data.getString("audioMixingMode"))
1298
+ audioMixingMode = mode
1299
+ hmsSDK?.setAudioMixingMode(mode)
1300
+ callback?.resolve(emitHMSSuccess())
1301
+ } else {
1302
+ val errorMessage = "setAudioMixingMode: $requiredKeys"
1303
+ self.emitRequiredKeysError(errorMessage)
1304
+ rejectCallback(callback, errorMessage)
1305
+ }
1306
+ }
1074
1307
  }
@@ -320,16 +320,18 @@ class HMSDecoder: NSObject {
320
320
 
321
321
  let endRoom = permissions.endRoom ?? false
322
322
  let removeOthers = permissions.removeOthers ?? false
323
- let stopPresentation = permissions.stopPresentation ?? false
324
- let muteAll = permissions.muteAll ?? false
323
+ let browserRecording = permissions.browserRecording ?? false
324
+ let hlsStreaming = permissions.hlsStreaming ?? false
325
+ let rtmpStreaming = permissions.rtmpStreaming ?? false
325
326
  let mute = permissions.mute ?? false
326
327
  let unmute = permissions.unmute ?? false
327
328
  let changeRole = permissions.changeRole ?? false
328
329
 
329
330
  return ["endRoom": endRoom,
330
331
  "removeOthers": removeOthers,
331
- "stopPresentation": stopPresentation,
332
- "muteAll": muteAll,
332
+ "browserRecording": browserRecording,
333
+ "hlsStreaming": hlsStreaming,
334
+ "rtmpStreaming": rtmpStreaming,
333
335
  "mute": mute,
334
336
  "unmute": unmute,
335
337
  "changeRole": changeRole]
@@ -478,16 +480,15 @@ class HMSDecoder: NSObject {
478
480
 
479
481
  static func getError(_ errorObj: HMSError?) -> [String: Any]? {
480
482
  if let error = errorObj {
481
- let code = error.code
483
+ let code = error.code.rawValue
482
484
  let description = error.description
483
- let localizedDescription = error.localizedDescription
484
- let debugDescription = error.debugDescription
485
485
  let message = error.message
486
486
  let name = error.id
487
487
  let id = error.id
488
488
  let action = error.action
489
+ let isTerminal = false
489
490
 
490
- return ["code": code, "description": description, "localizedDescription": localizedDescription, "debugDescription": debugDescription, "message": message, "name": name, "action": action, "id": id]
491
+ return ["code": code, "description": description, "message": message, "name": name, "action": action, "id": id, "isTerminal": isTerminal]
491
492
  } else {
492
493
  return nil
493
494
  }
@@ -228,18 +228,15 @@ class HMSHelper: NSObject {
228
228
  return hlsVariants
229
229
  }
230
230
 
231
- static func getHlsRecordingConfig(_ data: NSDictionary) -> HMSHLSRecordingConfig? {
232
- guard let meetingURLVariants = data.value(forKey: "hlsRecordingConfig") as? NSDictionary
233
- else {
234
- return nil
235
- }
236
- guard let singleFilePerLayer = meetingURLVariants.value(forKey: "singleFilePerLayer") as? Bool ,
237
- let videoOnDemand = meetingURLVariants.value(forKey: "videoOnDemand") as? Bool
231
+ static func getHlsRecordingConfig(_ config: NSDictionary?) -> HMSHLSRecordingConfig? {
232
+ guard let hlsRecordingConfig = config
238
233
  else {
239
234
  return nil
240
235
  }
236
+ let singleFilePerLayer = hlsRecordingConfig.value(forKey: "singleFilePerLayer") as? Bool
237
+ let videoOnDemand = hlsRecordingConfig.value(forKey: "videoOnDemand") as? Bool
241
238
 
242
- return HMSHLSRecordingConfig(singleFilePerLayer: singleFilePerLayer, enableVOD: videoOnDemand)
239
+ return HMSHLSRecordingConfig(singleFilePerLayer: singleFilePerLayer ?? false, enableVOD: videoOnDemand ?? false)
243
240
  }
244
241
 
245
242
  static func getHMSHLSMeetingURLVariant(_ variant: [String: Any]) -> HMSHLSMeetingURLVariant? {
package/ios/HMSManager.m CHANGED
@@ -26,7 +26,7 @@ RCT_EXTERN_METHOD(setVolume: (NSDictionary) data)
26
26
  RCT_EXTERN_METHOD(build : (NSDictionary) data :(RCTPromiseResolveBlock) resolve :(RCTPromiseRejectBlock) reject)
27
27
  RCT_EXTERN_METHOD(leave: (NSDictionary) data :(RCTPromiseResolveBlock) resolve :(RCTPromiseRejectBlock) reject)
28
28
  RCT_EXTERN_METHOD(setPlaybackForAllAudio: (NSDictionary) mute)
29
- RCT_EXTERN_METHOD(remoteMuteAllAudio: (NSDictionary) data)
29
+ RCT_EXTERN_METHOD(remoteMuteAllAudio: (NSDictionary) data :(RCTPromiseResolveBlock) resolve :(RCTPromiseRejectBlock) reject)
30
30
  RCT_EXTERN_METHOD(isPlaybackAllowed: (NSDictionary) data :(RCTPromiseResolveBlock) resolve :(RCTPromiseRejectBlock) reject)
31
31
  RCT_EXTERN_METHOD(changeMetadata: (NSDictionary) data :(RCTPromiseResolveBlock) resolve :(RCTPromiseRejectBlock) reject)
32
32
  RCT_EXTERN_METHOD(startRTMPOrRecording: (NSDictionary) data :(RCTPromiseResolveBlock) resolve :(RCTPromiseRejectBlock) reject)
@@ -37,4 +37,7 @@ RCT_EXTERN_METHOD(changeName: (NSDictionary) data :(RCTPromiseResolveBlock) reso
37
37
  RCT_EXTERN_METHOD(enableRTCStats: (NSDictionary) data)
38
38
  RCT_EXTERN_METHOD(disableRTCStats: (NSDictionary) data)
39
39
  RCT_EXTERN_METHOD(destroy: (NSDictionary) data :(RCTPromiseResolveBlock) resolve :(RCTPromiseRejectBlock) reject)
40
+ RCT_EXTERN_METHOD(startScreenshare: (NSDictionary) data :(RCTPromiseResolveBlock) resolve :(RCTPromiseRejectBlock) reject)
41
+ RCT_EXTERN_METHOD(stopScreenshare: (NSDictionary) data :(RCTPromiseResolveBlock) resolve :(RCTPromiseRejectBlock) reject)
42
+ RCT_EXTERN_METHOD(isScreenShared: (NSDictionary) data :(RCTPromiseResolveBlock) resolve :(RCTPromiseRejectBlock) reject)
40
43
  @end
@@ -23,6 +23,7 @@ class HMSManager: RCTEventEmitter {
23
23
  let ON_LOCAL_VIDEO_STATS = "ON_LOCAL_VIDEO_STATS"
24
24
  let ON_REMOTE_AUDIO_STATS = "ON_REMOTE_AUDIO_STATS"
25
25
  let ON_REMOTE_VIDEO_STATS = "ON_REMOTE_VIDEO_STATS"
26
+ let ON_AUDIO_DEVICE_CHANGED = "ON_AUDIO_DEVICE_CHANGED"
26
27
 
27
28
  // MARK: - Setup
28
29
 
@@ -30,12 +31,12 @@ class HMSManager: RCTEventEmitter {
30
31
  super.init()
31
32
  }
32
33
 
33
- override class func requiresMainQueueSetup() -> Bool {
34
- true
35
- }
34
+ override class func requiresMainQueueSetup() -> Bool {
35
+ true
36
+ }
36
37
 
37
38
  override func supportedEvents() -> [String]! {
38
- return [ON_JOIN, ON_PREVIEW, ON_ROOM_UPDATE, ON_PEER_UPDATE, ON_TRACK_UPDATE, ON_ERROR, ON_MESSAGE, ON_SPEAKER, RECONNECTING, RECONNECTED, ON_ROLE_CHANGE_REQUEST, ON_CHANGE_TRACK_STATE_REQUEST, ON_REMOVED_FROM_ROOM, ON_RTC_STATS, ON_LOCAL_AUDIO_STATS, ON_LOCAL_VIDEO_STATS, ON_REMOTE_AUDIO_STATS, ON_REMOTE_VIDEO_STATS]
39
+ return [ON_JOIN, ON_PREVIEW, ON_ROOM_UPDATE, ON_PEER_UPDATE, ON_TRACK_UPDATE, ON_ERROR, ON_MESSAGE, ON_SPEAKER, RECONNECTING, RECONNECTED, ON_ROLE_CHANGE_REQUEST, ON_CHANGE_TRACK_STATE_REQUEST, ON_REMOVED_FROM_ROOM, ON_RTC_STATS, ON_LOCAL_AUDIO_STATS, ON_LOCAL_VIDEO_STATS, ON_REMOTE_AUDIO_STATS, ON_REMOTE_VIDEO_STATS, ON_AUDIO_DEVICE_CHANGED]
39
40
  }
40
41
 
41
42
  // MARK: - HMS SDK Actions
@@ -225,10 +226,10 @@ class HMSManager: RCTEventEmitter {
225
226
  }
226
227
 
227
228
  @objc
228
- func remoteMuteAllAudio(_ data: NSDictionary) {
229
+ func remoteMuteAllAudio(_ data: NSDictionary, _ resolve: RCTPromiseResolveBlock?, _ reject: RCTPromiseRejectBlock?) {
229
230
  let hms = HMSHelper.getHms(data, hmsCollection)
230
231
 
231
- hms?.remoteMuteAllAudio()
232
+ hms?.remoteMuteAllAudio(resolve, reject)
232
233
  }
233
234
 
234
235
  @objc
@@ -301,6 +302,27 @@ class HMSManager: RCTEventEmitter {
301
302
  resolve?(["success": id + " removed"])
302
303
  }
303
304
 
305
+ @objc
306
+ func startScreenshare(_ data: NSDictionary, _ resolve: RCTPromiseResolveBlock?, _ reject: RCTPromiseRejectBlock?) {
307
+ let hms = HMSHelper.getHms(data, hmsCollection)
308
+
309
+ hms?.startScreenshare(resolve, reject)
310
+ }
311
+
312
+ @objc
313
+ func stopScreenshare(_ data: NSDictionary, _ resolve: RCTPromiseResolveBlock?, _ reject: RCTPromiseRejectBlock?) {
314
+ let hms = HMSHelper.getHms(data, hmsCollection)
315
+
316
+ hms?.stopScreenshare(resolve, reject)
317
+ }
318
+
319
+ @objc
320
+ func isScreenShared(_ data: NSDictionary, _ resolve: RCTPromiseResolveBlock?, _ reject: RCTPromiseRejectBlock?) {
321
+ let hms = HMSHelper.getHms(data, hmsCollection)
322
+
323
+ hms?.isScreenShared(resolve, reject)
324
+ }
325
+
304
326
  // @objc
305
327
  // func setLocalVideoSettings(_ data: NSDictionary) {
306
328
  // let hms = HMSHelper.getHms(data, hmsCollection)