@100mslive/react-native-hms 0.9.7 → 0.9.91

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 (170) hide show
  1. package/README.md +63 -44
  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/compiler.xml +6 -0
  10. package/android/.idea/gradle.xml +6 -1
  11. package/android/.idea/jarRepositories.xml +40 -0
  12. package/android/.idea/libraries/Gradle__androidx_activity_activity_1_2_4_aar.xml +16 -0
  13. package/android/.idea/libraries/Gradle__androidx_annotation_annotation_1_3_0.xml +11 -0
  14. package/android/.idea/libraries/Gradle__androidx_annotation_annotation_experimental_1_1_0_aar.xml +13 -0
  15. package/android/.idea/libraries/Gradle__androidx_appcompat_appcompat_1_4_1_aar.xml +16 -0
  16. package/android/.idea/libraries/Gradle__androidx_appcompat_appcompat_resources_1_4_1_aar.xml +13 -0
  17. package/android/.idea/libraries/Gradle__androidx_arch_core_core_common_2_1_0.xml +11 -0
  18. package/android/.idea/libraries/Gradle__androidx_arch_core_core_runtime_2_1_0_aar.xml +13 -0
  19. package/android/.idea/libraries/Gradle__androidx_autofill_autofill_1_1_0_aar.xml +16 -0
  20. package/android/.idea/libraries/Gradle__androidx_collection_collection_1_1_0.xml +11 -0
  21. package/android/.idea/libraries/Gradle__androidx_constraintlayout_constraintlayout_2_1_3_aar.xml +13 -0
  22. package/android/.idea/libraries/Gradle__androidx_core_core_1_7_0_aar.xml +16 -0
  23. package/android/.idea/libraries/Gradle__androidx_cursoradapter_cursoradapter_1_0_0_aar.xml +13 -0
  24. package/android/.idea/libraries/Gradle__androidx_customview_customview_1_0_0_aar.xml +13 -0
  25. package/android/.idea/libraries/Gradle__androidx_drawerlayout_drawerlayout_1_0_0_aar.xml +16 -0
  26. package/android/.idea/libraries/Gradle__androidx_fragment_fragment_1_3_6_aar.xml +16 -0
  27. package/android/.idea/libraries/Gradle__androidx_interpolator_interpolator_1_0_0_aar.xml +13 -0
  28. package/android/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_common_2_4_0.xml +11 -0
  29. package/android/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_livedata_2_0_0_aar.xml +13 -0
  30. package/android/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_livedata_core_2_3_1_aar.xml +13 -0
  31. package/android/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_runtime_2_4_0_aar.xml +13 -0
  32. package/android/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_viewmodel_2_3_1_aar.xml +13 -0
  33. package/android/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_viewmodel_savedstate_2_3_1_aar.xml +13 -0
  34. package/android/.idea/libraries/Gradle__androidx_loader_loader_1_0_0_aar.xml +13 -0
  35. package/android/.idea/libraries/Gradle__androidx_savedstate_savedstate_1_1_0_aar.xml +13 -0
  36. package/android/.idea/libraries/Gradle__androidx_swiperefreshlayout_swiperefreshlayout_1_0_0_aar.xml +16 -0
  37. package/android/.idea/libraries/Gradle__androidx_vectordrawable_vectordrawable_1_1_0_aar.xml +13 -0
  38. package/android/.idea/libraries/Gradle__androidx_vectordrawable_vectordrawable_animated_1_1_0_aar.xml +13 -0
  39. package/android/.idea/libraries/Gradle__androidx_versionedparcelable_versionedparcelable_1_1_1_aar.xml +13 -0
  40. package/android/.idea/libraries/Gradle__androidx_viewpager_viewpager_1_0_0_aar.xml +13 -0
  41. package/android/.idea/libraries/Gradle__com_facebook_fbjni_fbjni_java_only_0_2_2.xml +13 -0
  42. package/android/.idea/libraries/Gradle__com_facebook_fresco_drawee_2_5_0_aar.xml +15 -0
  43. package/android/.idea/libraries/Gradle__com_facebook_fresco_fbcore_2_5_0_aar.xml +18 -0
  44. package/android/.idea/libraries/Gradle__com_facebook_fresco_fresco_2_5_0_aar.xml +18 -0
  45. package/android/.idea/libraries/Gradle__com_facebook_fresco_imagepipeline_2_5_0_aar.xml +18 -0
  46. package/android/.idea/libraries/Gradle__com_facebook_fresco_imagepipeline_base_2_5_0_aar.xml +18 -0
  47. package/android/.idea/libraries/Gradle__com_facebook_fresco_imagepipeline_native_2_5_0_aar.xml +15 -0
  48. package/android/.idea/libraries/Gradle__com_facebook_fresco_imagepipeline_okhttp3_2_5_0_aar.xml +15 -0
  49. package/android/.idea/libraries/Gradle__com_facebook_fresco_memory_type_ashmem_2_5_0_aar.xml +15 -0
  50. package/android/.idea/libraries/Gradle__com_facebook_fresco_memory_type_java_2_5_0_aar.xml +15 -0
  51. package/android/.idea/libraries/Gradle__com_facebook_fresco_memory_type_native_2_5_0_aar.xml +15 -0
  52. package/android/.idea/libraries/Gradle__com_facebook_fresco_nativeimagefilters_2_5_0_aar.xml +15 -0
  53. package/android/.idea/libraries/Gradle__com_facebook_fresco_nativeimagetranscoder_2_5_0_aar.xml +15 -0
  54. package/android/.idea/libraries/Gradle__com_facebook_fresco_ui_common_2_5_0_aar.xml +15 -0
  55. package/android/.idea/libraries/Gradle__com_facebook_infer_annotation_infer_annotation_0_18_0.xml +13 -0
  56. package/android/.idea/libraries/Gradle__com_facebook_react_react_native_0_69_1_debug_aar.xml +14 -0
  57. package/android/.idea/libraries/Gradle__com_facebook_soloader_annotation_0_10_3.xml +13 -0
  58. package/android/.idea/libraries/Gradle__com_facebook_soloader_nativeloader_0_10_3.xml +13 -0
  59. package/android/.idea/libraries/Gradle__com_facebook_soloader_soloader_0_10_3_aar.xml +15 -0
  60. package/android/.idea/libraries/Gradle__com_facebook_yoga_proguard_annotations_1_19_0.xml +13 -0
  61. package/android/.idea/libraries/Gradle__com_github_100mslive_android_sdk_lib_2_4_7_aar.xml +11 -0
  62. package/android/.idea/libraries/Gradle__com_github_100mslive_webrtc_m97_hms_1_1_aar.xml +11 -0
  63. package/android/.idea/libraries/Gradle__com_google_code_findbugs_jsr305_3_0_2.xml +13 -0
  64. package/android/.idea/libraries/Gradle__com_squareup_okhttp3_okhttp_4_9_2.xml +13 -0
  65. package/android/.idea/libraries/Gradle__com_squareup_okhttp3_okhttp_urlconnection_4_9_2.xml +13 -0
  66. package/android/.idea/libraries/Gradle__com_squareup_okio_okio_2_9_0.xml +13 -0
  67. package/android/.idea/libraries/Gradle__javax_inject_javax_inject_1.xml +13 -0
  68. package/android/.idea/libraries/Gradle__org_jetbrains_annotations_13_0.xml +13 -0
  69. package/android/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_annotations_jvm_1_3_72.xml +13 -0
  70. package/android/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_1_6_10.xml +13 -0
  71. package/android/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_common_1_6_10.xml +13 -0
  72. package/android/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_jdk7_1_6_10.xml +13 -0
  73. package/android/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_jdk8_1_6_10.xml +13 -0
  74. package/android/.idea/libraries/Gradle__org_jetbrains_kotlinx_kotlinx_coroutines_android_1_6_0.xml +13 -0
  75. package/android/.idea/libraries/Gradle__org_jetbrains_kotlinx_kotlinx_coroutines_core_jvm_1_6_0.xml +13 -0
  76. package/android/.idea/misc.xml +1 -1
  77. package/android/.idea/modules/android.androidTest.iml +201 -0
  78. package/android/.idea/modules/android.iml +28 -6
  79. package/android/.idea/modules/android.main.iml +196 -0
  80. package/android/.idea/modules/android.unitTest.iml +195 -0
  81. package/android/.idea/modules.xml +3 -0
  82. package/android/build.gradle +2 -2
  83. package/android/src/main/java/com/reactnativehmssdk/HMSAudioshareActivity.kt +84 -0
  84. package/android/src/main/java/com/reactnativehmssdk/HMSDecoder.kt +79 -10
  85. package/android/src/main/java/com/reactnativehmssdk/HMSHelper.kt +130 -27
  86. package/android/src/main/java/com/reactnativehmssdk/HMSManager.kt +88 -2
  87. package/android/src/main/java/com/reactnativehmssdk/HMSRNSDK.kt +307 -82
  88. package/ios/HMSDecoder.swift +9 -8
  89. package/ios/HMSHelper.swift +18 -8
  90. package/ios/HMSManager.m +1 -1
  91. package/ios/HMSManager.swift +7 -6
  92. package/ios/HMSRNSDK.swift +198 -173
  93. package/lib/commonjs/classes/HMSAudioDevice.js +17 -0
  94. package/lib/commonjs/classes/HMSAudioDevice.js.map +1 -0
  95. package/lib/commonjs/classes/HMSAudioMixingMode.js +15 -0
  96. package/lib/commonjs/classes/HMSAudioMixingMode.js.map +1 -0
  97. package/lib/commonjs/classes/HMSAudioMode.js +17 -0
  98. package/lib/commonjs/classes/HMSAudioMode.js.map +1 -0
  99. package/lib/commonjs/classes/HMSEncoder.js +15 -0
  100. package/lib/commonjs/classes/HMSEncoder.js.map +1 -1
  101. package/lib/commonjs/classes/HMSException.js +18 -13
  102. package/lib/commonjs/classes/HMSException.js.map +1 -1
  103. package/lib/commonjs/classes/HMSHLSConfig.js.map +1 -1
  104. package/lib/commonjs/classes/HMSLogger.js +2 -2
  105. package/lib/commonjs/classes/HMSLogger.js.map +1 -1
  106. package/lib/commonjs/classes/HMSPermissions.js +7 -4
  107. package/lib/commonjs/classes/HMSPermissions.js.map +1 -1
  108. package/lib/commonjs/classes/HMSRTMPConfig.js +3 -0
  109. package/lib/commonjs/classes/HMSRTMPConfig.js.map +1 -1
  110. package/lib/commonjs/classes/HMSRtmpVideoResolution.js +23 -0
  111. package/lib/commonjs/classes/HMSRtmpVideoResolution.js.map +1 -0
  112. package/lib/commonjs/classes/HMSSDK.js +268 -48
  113. package/lib/commonjs/classes/HMSSDK.js.map +1 -1
  114. package/lib/commonjs/classes/HMSUpdateListenerActions.js +1 -0
  115. package/lib/commonjs/classes/HMSUpdateListenerActions.js.map +1 -1
  116. package/lib/commonjs/index.js +56 -0
  117. package/lib/commonjs/index.js.map +1 -1
  118. package/lib/module/classes/HMSAudioDevice.js +10 -0
  119. package/lib/module/classes/HMSAudioDevice.js.map +1 -0
  120. package/lib/module/classes/HMSAudioMixingMode.js +8 -0
  121. package/lib/module/classes/HMSAudioMixingMode.js.map +1 -0
  122. package/lib/module/classes/HMSAudioMode.js +10 -0
  123. package/lib/module/classes/HMSAudioMode.js.map +1 -0
  124. package/lib/module/classes/HMSEncoder.js +14 -0
  125. package/lib/module/classes/HMSEncoder.js.map +1 -1
  126. package/lib/module/classes/HMSException.js +18 -13
  127. package/lib/module/classes/HMSException.js.map +1 -1
  128. package/lib/module/classes/HMSHLSConfig.js.map +1 -1
  129. package/lib/module/classes/HMSLogger.js +2 -2
  130. package/lib/module/classes/HMSLogger.js.map +1 -1
  131. package/lib/module/classes/HMSPermissions.js +7 -4
  132. package/lib/module/classes/HMSPermissions.js.map +1 -1
  133. package/lib/module/classes/HMSRTMPConfig.js +3 -0
  134. package/lib/module/classes/HMSRTMPConfig.js.map +1 -1
  135. package/lib/module/classes/HMSRtmpVideoResolution.js +14 -0
  136. package/lib/module/classes/HMSRtmpVideoResolution.js.map +1 -0
  137. package/lib/module/classes/HMSSDK.js +267 -42
  138. package/lib/module/classes/HMSSDK.js.map +1 -1
  139. package/lib/module/classes/HMSUpdateListenerActions.js +1 -0
  140. package/lib/module/classes/HMSUpdateListenerActions.js.map +1 -1
  141. package/lib/module/index.js +4 -0
  142. package/lib/module/index.js.map +1 -1
  143. package/lib/typescript/classes/HMSAudioDevice.d.ts +7 -0
  144. package/lib/typescript/classes/HMSAudioMixingMode.d.ts +5 -0
  145. package/lib/typescript/classes/HMSAudioMode.d.ts +7 -0
  146. package/lib/typescript/classes/HMSEncoder.d.ts +2 -0
  147. package/lib/typescript/classes/HMSException.d.ts +8 -14
  148. package/lib/typescript/classes/HMSHLSConfig.d.ts +2 -2
  149. package/lib/typescript/classes/HMSLogger.d.ts +1 -1
  150. package/lib/typescript/classes/HMSPermissions.d.ts +6 -4
  151. package/lib/typescript/classes/HMSRTMPConfig.d.ts +3 -0
  152. package/lib/typescript/classes/HMSRtmpVideoResolution.d.ts +8 -0
  153. package/lib/typescript/classes/HMSSDK.d.ts +109 -11
  154. package/lib/typescript/classes/HMSUpdateListenerActions.d.ts +2 -1
  155. package/lib/typescript/index.d.ts +4 -0
  156. package/package.json +1 -19
  157. package/react-native-hms.podspec +1 -1
  158. package/src/classes/HMSAudioDevice.ts +7 -0
  159. package/src/classes/HMSAudioMixingMode.ts +5 -0
  160. package/src/classes/HMSAudioMode.ts +7 -0
  161. package/src/classes/HMSEncoder.ts +12 -0
  162. package/src/classes/HMSException.ts +15 -24
  163. package/src/classes/HMSHLSConfig.ts +2 -2
  164. package/src/classes/HMSLogger.ts +2 -2
  165. package/src/classes/HMSPermissions.ts +9 -6
  166. package/src/classes/HMSRTMPConfig.ts +5 -0
  167. package/src/classes/HMSRtmpVideoResolution.ts +9 -0
  168. package/src/classes/HMSSDK.tsx +341 -49
  169. package/src/classes/HMSUpdateListenerActions.ts +1 -0
  170. package/src/index.ts +4 -0
@@ -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,10 +28,15 @@ 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
 
@@ -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)
@@ -85,7 +96,7 @@ class HMSRNSDK(
85
96
 
86
97
  fun preview(credentials: ReadableMap) {
87
98
  if (previewInProgress) {
88
- self.emitCustomError("PREVIEW_ALREADY_IN_PROGRESS")
99
+ self.emitCustomError("PREVIEW_IS_IN_PROGRESS")
89
100
  return
90
101
  }
91
102
  val requiredKeys =
@@ -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?) {
@@ -611,17 +735,11 @@ class HMSRNSDK(
611
735
  val requiredKeys = HMSHelper.getUnavailableRequiredKey(data, arrayOf(Pair("trackId", "String")))
612
736
  if (requiredKeys === null) {
613
737
  val trackId = data.getString("trackId")
614
- val localTrack = HMSHelper.getTrackFromTrackId(trackId, hmsSDK?.getRoom())
615
- if (localTrack == null) {
616
- val track = HMSHelper.getTrackFromTrackId(trackId, hmsSDK?.getRoom())
617
- if (track != null) {
618
- val mute = track.isMute
619
- callback?.resolve(mute)
620
- } else {
621
- callback?.reject("101", "NOT_FOUND")
622
- }
738
+ val track = HMSHelper.getTrackFromTrackId(trackId, hmsSDK?.getRoom())
739
+ if (track == null) {
740
+ callback?.reject("101", "TRACK_NOT_FOUND")
623
741
  } else {
624
- val mute = localTrack.isMute
742
+ val mute = track.isMute
625
743
  callback?.resolve(mute)
626
744
  }
627
745
  } else {
@@ -709,13 +827,13 @@ class HMSRNSDK(
709
827
  )
710
828
  recentRoleChangeRequest = null
711
829
  } else {
712
- val errorMessage = "acceptRoleChange: recentRoleChangeRequest null"
830
+ val errorMessage = "acceptRoleChange: recentRoleChangeRequest not found"
713
831
  self.emitRequiredKeysError(errorMessage)
714
832
  rejectCallback(callback, errorMessage)
715
833
  }
716
834
  }
717
835
 
718
- fun remoteMuteAllAudio() {
836
+ fun remoteMuteAllAudio(callback: Promise?) {
719
837
  val allAudioTracks = hmsSDK?.getRoom()?.let { HmsUtilities.getAllAudioTracks(it) }
720
838
  if (allAudioTracks != null) {
721
839
  var customError: HMSException? = null
@@ -731,10 +849,13 @@ class HMSRNSDK(
731
849
  }
732
850
  )
733
851
  }
734
- if (customError != null) {
735
- self.emitHMSError(customError!!)
852
+ if (customError === null) {
853
+ callback?.resolve(emitHMSSuccess())
854
+ } else {
855
+ rejectCallback(callback, customError!!.message)
736
856
  }
737
857
  }
858
+ rejectCallback(callback, "Audio tracks not found")
738
859
  }
739
860
 
740
861
  fun setPlaybackForAllAudio(data: ReadableMap) {
@@ -802,7 +923,7 @@ class HMSRNSDK(
802
923
  callback?.resolve(isPlaybackAllowed)
803
924
  }
804
925
  else -> {
805
- callback?.reject("101", "NOT_FOUND")
926
+ callback?.reject("101", "TRACK_NOT_FOUND")
806
927
  }
807
928
  }
808
929
  } else {
@@ -850,7 +971,7 @@ class HMSRNSDK(
850
971
  }
851
972
  }
852
973
  }
853
- this.emitCustomError("TRACKID_NOT_MATCHED")
974
+ this.emitCustomError("TRACK_NOT_FOUND")
854
975
  } else {
855
976
  this.emitCustomError("REMOTE_PEERS_NOT_FOUND")
856
977
  }
@@ -914,27 +1035,25 @@ class HMSRNSDK(
914
1035
  arrayOf(Pair("record", "Boolean"), Pair("meetingURL", "String"))
915
1036
  )
916
1037
  if (requiredKeys === null) {
917
- val record = data.getBoolean("record")
918
- val meetingURL = data.getString("meetingURL") as String
919
- var rtmpURLs = data.getArray("rtmpURLs")
920
- if (rtmpURLs == null) {
921
- rtmpURLs = Arguments.createArray()
922
- }
923
- val rtmpURLsList = HMSHelper.getRtmpUrls(rtmpURLs)
924
- val config = HMSRecordingConfig(meetingURL, rtmpURLsList, record)
925
-
926
- hmsSDK?.startRtmpOrRecording(
927
- config,
928
- object : HMSActionResultListener {
929
- override fun onSuccess() {
930
- callback?.resolve(emitHMSSuccess())
931
- }
932
- override fun onError(error: HMSException) {
933
- callback?.reject(error.code.toString(), error.message)
934
- self.emitHMSError(error)
1038
+ val config = HMSHelper.getRtmpConfig(data)
1039
+ if (config === null) {
1040
+ val errorMessage = "startRTMPOrRecording: INVALID_MEETING_URL_PASSED"
1041
+ self.emitRequiredKeysError(errorMessage)
1042
+ rejectCallback(callback, errorMessage)
1043
+ } else {
1044
+ hmsSDK?.startRtmpOrRecording(
1045
+ config,
1046
+ object : HMSActionResultListener {
1047
+ override fun onSuccess() {
1048
+ callback?.resolve(emitHMSSuccess())
1049
+ }
1050
+ override fun onError(error: HMSException) {
1051
+ callback?.reject(error.code.toString(), error.message)
1052
+ self.emitHMSError(error)
1053
+ }
935
1054
  }
936
- }
937
- )
1055
+ )
1056
+ }
938
1057
  } else {
939
1058
  val errorMessage = "startRTMPOrRecording: $requiredKeys"
940
1059
  self.emitRequiredKeysError(errorMessage)
@@ -987,32 +1106,19 @@ class HMSRNSDK(
987
1106
  }
988
1107
 
989
1108
  fun startHLSStreaming(data: ReadableMap, callback: Promise?) {
990
- val requiredKeys =
991
- HMSHelper.getUnavailableRequiredKey(data, arrayOf(Pair("meetingURLVariants", "Array")))
992
- if (requiredKeys === null) {
993
- val meetingURLVariants =
994
- data.getArray("meetingURLVariants")?.toArrayList() as? ArrayList<HashMap<String, String>>
995
- val hlsMeetingUrlVariant = HMSHelper.getHMSHLSMeetingURLVariants(meetingURLVariants)
996
- val hlsRecordingConfig = HMSHelper.getHlsRecordingConfig(data)
997
- val config = HMSHLSConfig(hlsMeetingUrlVariant, hlsRecordingConfig)
998
-
999
- hmsSDK?.startHLSStreaming(
1000
- config,
1001
- object : HMSActionResultListener {
1002
- override fun onSuccess() {
1003
- callback?.resolve(emitHMSSuccess())
1004
- }
1005
- override fun onError(error: HMSException) {
1006
- callback?.reject(error.code.toString(), error.message)
1007
- self.emitHMSError(error)
1008
- }
1109
+ val hlsConfig = HMSHelper.getHLSConfig(data)
1110
+ hmsSDK?.startHLSStreaming(
1111
+ hlsConfig,
1112
+ object : HMSActionResultListener {
1113
+ override fun onSuccess() {
1114
+ callback?.resolve(emitHMSSuccess())
1009
1115
  }
1010
- )
1011
- } else {
1012
- val errorMessage = "startHLSStreaming: $requiredKeys"
1013
- self.emitRequiredKeysError(errorMessage)
1014
- rejectCallback(callback, errorMessage)
1015
- }
1116
+ override fun onError(error: HMSException) {
1117
+ callback?.reject(error.code.toString(), error.message)
1118
+ self.emitHMSError(error)
1119
+ }
1120
+ }
1121
+ )
1016
1122
  }
1017
1123
 
1018
1124
  fun stopHLSStreaming(callback: Promise?) {
@@ -1079,4 +1185,123 @@ class HMSRNSDK(
1079
1185
  rejectCallback(callback, errorMessage)
1080
1186
  }
1081
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
+ }
1082
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
  }
@@ -3,6 +3,19 @@ import Foundation
3
3
 
4
4
  class HMSHelper: NSObject {
5
5
 
6
+ static func getUnavailableRequiredKey(_ data: NSDictionary, _ requiredKeys: [String]) -> String {
7
+ for (key) in requiredKeys {
8
+ let value = data.object(forKey: key)
9
+ if (value == nil) {
10
+ return key + "_Is_Required"
11
+ }
12
+ if (value is NSNull) {
13
+ return key + "_Is_Null"
14
+ }
15
+ }
16
+ return "SEND_ALL_REQUIRED_KEYS"
17
+ }
18
+
6
19
  static func getPeerFromPeerId(_ peerID: String?, remotePeers: [HMSRemotePeer]?, localPeer: HMSLocalPeer?) -> HMSPeer? {
7
20
 
8
21
  guard let peerID = peerID, let peers = remotePeers else { return nil }
@@ -215,18 +228,15 @@ class HMSHelper: NSObject {
215
228
  return hlsVariants
216
229
  }
217
230
 
218
- static func getHlsRecordingConfig(_ data: NSDictionary) -> HMSHLSRecordingConfig? {
219
- guard let meetingURLVariants = data.value(forKey: "hlsRecordingConfig") as? NSDictionary
220
- else {
221
- return nil
222
- }
223
- guard let singleFilePerLayer = meetingURLVariants.value(forKey: "singleFilePerLayer") as? Bool ,
224
- let videoOnDemand = meetingURLVariants.value(forKey: "videoOnDemand") as? Bool
231
+ static func getHlsRecordingConfig(_ config: NSDictionary?) -> HMSHLSRecordingConfig? {
232
+ guard let hlsRecordingConfig = config
225
233
  else {
226
234
  return nil
227
235
  }
236
+ let singleFilePerLayer = hlsRecordingConfig.value(forKey: "singleFilePerLayer") as? Bool
237
+ let videoOnDemand = hlsRecordingConfig.value(forKey: "videoOnDemand") as? Bool
228
238
 
229
- return HMSHLSRecordingConfig(singleFilePerLayer: singleFilePerLayer, enableVOD: videoOnDemand)
239
+ return HMSHLSRecordingConfig(singleFilePerLayer: singleFilePerLayer ?? false, enableVOD: videoOnDemand ?? false)
230
240
  }
231
241
 
232
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)
@@ -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