@100mslive/react-native-hms 1.4.0 → 1.6.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 (205) hide show
  1. package/android/build.gradle +3 -2
  2. package/android/src/main/java/com/reactnativehmssdk/HMSDecoder.kt +189 -55
  3. package/android/src/main/java/com/reactnativehmssdk/HMSHelper.kt +1 -0
  4. package/android/src/main/java/com/reactnativehmssdk/HMSManager.kt +94 -38
  5. package/android/src/main/java/com/reactnativehmssdk/HMSRNSDK.kt +446 -107
  6. package/android/src/main/java/com/reactnativehmssdk/HMSSDKViewManager.kt +5 -0
  7. package/android/src/main/java/com/reactnativehmssdk/HMSView.kt +42 -25
  8. package/android/src/main/res/layout/hms_view.xml +2 -2
  9. package/ios/HMSConstants.swift +33 -0
  10. package/ios/HMSDecoder.swift +372 -157
  11. package/ios/HMSHelper.swift +44 -7
  12. package/ios/HMSManager.m +17 -2
  13. package/ios/HMSManager.swift +177 -75
  14. package/ios/HMSRNSDK.swift +641 -199
  15. package/ios/HMSView.m +1 -0
  16. package/ios/HMSView.swift +21 -19
  17. package/lib/commonjs/classes/HMSAudioTrackSettings.js +14 -0
  18. package/lib/commonjs/classes/HMSAudioTrackSettings.js.map +1 -1
  19. package/lib/commonjs/classes/HMSCameraControl.js +28 -0
  20. package/lib/commonjs/classes/HMSCameraControl.js.map +1 -0
  21. package/lib/commonjs/classes/HMSEncoder.js +97 -14
  22. package/lib/commonjs/classes/HMSEncoder.js.map +1 -1
  23. package/lib/commonjs/classes/HMSIOSAudioMode.js +13 -0
  24. package/lib/commonjs/classes/HMSIOSAudioMode.js.map +1 -0
  25. package/lib/commonjs/classes/HMSLayer.js +14 -0
  26. package/lib/commonjs/classes/HMSLayer.js.map +1 -0
  27. package/lib/commonjs/classes/HMSLocalVideoStats.js +11 -0
  28. package/lib/commonjs/classes/HMSLocalVideoStats.js.map +1 -1
  29. package/lib/commonjs/classes/HMSPeer.js +1 -1
  30. package/lib/commonjs/classes/HMSPeer.js.map +1 -1
  31. package/lib/commonjs/classes/HMSPublishSettings.js +2 -0
  32. package/lib/commonjs/classes/HMSPublishSettings.js.map +1 -1
  33. package/lib/commonjs/classes/HMSQualityLimitationReason.js +16 -0
  34. package/lib/commonjs/classes/HMSQualityLimitationReason.js.map +1 -0
  35. package/lib/commonjs/classes/HMSQualityLimitationReasons.js +27 -0
  36. package/lib/commonjs/classes/HMSQualityLimitationReasons.js.map +1 -0
  37. package/lib/commonjs/classes/HMSRemotePeer.js.map +1 -1
  38. package/lib/commonjs/classes/HMSRemoteVideoTrack.js +39 -3
  39. package/lib/commonjs/classes/HMSRemoteVideoTrack.js.map +1 -1
  40. package/lib/commonjs/classes/HMSRoom.js +4 -0
  41. package/lib/commonjs/classes/HMSRoom.js.map +1 -1
  42. package/lib/commonjs/classes/HMSRoomUpdate.js +1 -0
  43. package/lib/commonjs/classes/HMSRoomUpdate.js.map +1 -1
  44. package/lib/commonjs/classes/HMSSDK.js +82 -45
  45. package/lib/commonjs/classes/HMSSDK.js.map +1 -1
  46. package/lib/commonjs/classes/HMSSessionStore.js +173 -0
  47. package/lib/commonjs/classes/HMSSessionStore.js.map +1 -0
  48. package/lib/commonjs/classes/HMSSimulcastLayerDefinition.js +19 -0
  49. package/lib/commonjs/classes/HMSSimulcastLayerDefinition.js.map +1 -0
  50. package/lib/commonjs/classes/HMSSimulcastLayerSettingsPolicy.js +23 -0
  51. package/lib/commonjs/classes/HMSSimulcastLayerSettingsPolicy.js.map +1 -0
  52. package/lib/commonjs/classes/HMSSimulcastSettings.js +5 -4
  53. package/lib/commonjs/classes/HMSSimulcastSettings.js.map +1 -1
  54. package/lib/commonjs/classes/HMSSimulcastSettingsPolicy.js +17 -0
  55. package/lib/commonjs/classes/HMSSimulcastSettingsPolicy.js.map +1 -0
  56. package/lib/commonjs/classes/HMSSubscribeDegradationPolicy.js +21 -0
  57. package/lib/commonjs/classes/HMSSubscribeDegradationPolicy.js.map +1 -0
  58. package/lib/commonjs/classes/HMSSubscribeSettings.js +2 -0
  59. package/lib/commonjs/classes/HMSSubscribeSettings.js.map +1 -1
  60. package/lib/commonjs/classes/HMSUpdateListenerActions.js +8 -0
  61. package/lib/commonjs/classes/HMSUpdateListenerActions.js.map +1 -1
  62. package/lib/commonjs/classes/HMSVideoResolution.js.map +1 -1
  63. package/lib/commonjs/classes/HMSVideoTrackSettings.js +5 -0
  64. package/lib/commonjs/classes/HMSVideoTrackSettings.js.map +1 -1
  65. package/lib/commonjs/classes/HmsView.js +2 -0
  66. package/lib/commonjs/classes/HmsView.js.map +1 -1
  67. package/lib/commonjs/index.js +72 -0
  68. package/lib/commonjs/index.js.map +1 -1
  69. package/lib/commonjs/utils/emitter/EventEmitter.js +162 -0
  70. package/lib/commonjs/utils/emitter/EventEmitter.js.map +1 -0
  71. package/lib/commonjs/utils/emitter/_EmitterSubscription.js +46 -0
  72. package/lib/commonjs/utils/emitter/_EmitterSubscription.js.map +1 -0
  73. package/lib/commonjs/utils/emitter/_EventSubscription.js +36 -0
  74. package/lib/commonjs/utils/emitter/_EventSubscription.js.map +1 -0
  75. package/lib/commonjs/utils/emitter/_EventSubscriptionVendor.js +90 -0
  76. package/lib/commonjs/utils/emitter/_EventSubscriptionVendor.js.map +1 -0
  77. package/lib/commonjs/utils/index.js +17 -0
  78. package/lib/commonjs/utils/index.js.map +1 -0
  79. package/lib/module/classes/HMSAudioTrackSettings.js +14 -0
  80. package/lib/module/classes/HMSAudioTrackSettings.js.map +1 -1
  81. package/lib/module/classes/HMSCameraControl.js +21 -0
  82. package/lib/module/classes/HMSCameraControl.js.map +1 -0
  83. package/lib/module/classes/HMSEncoder.js +97 -14
  84. package/lib/module/classes/HMSEncoder.js.map +1 -1
  85. package/lib/module/classes/HMSIOSAudioMode.js +6 -0
  86. package/lib/module/classes/HMSIOSAudioMode.js.map +1 -0
  87. package/lib/module/classes/HMSLayer.js +7 -0
  88. package/lib/module/classes/HMSLayer.js.map +1 -0
  89. package/lib/module/classes/HMSLocalVideoStats.js +11 -0
  90. package/lib/module/classes/HMSLocalVideoStats.js.map +1 -1
  91. package/lib/module/classes/HMSPeer.js +1 -1
  92. package/lib/module/classes/HMSPeer.js.map +1 -1
  93. package/lib/module/classes/HMSPublishSettings.js +2 -0
  94. package/lib/module/classes/HMSPublishSettings.js.map +1 -1
  95. package/lib/module/classes/HMSQualityLimitationReason.js +9 -0
  96. package/lib/module/classes/HMSQualityLimitationReason.js.map +1 -0
  97. package/lib/module/classes/HMSQualityLimitationReasons.js +20 -0
  98. package/lib/module/classes/HMSQualityLimitationReasons.js.map +1 -0
  99. package/lib/module/classes/HMSRemotePeer.js.map +1 -1
  100. package/lib/module/classes/HMSRemoteVideoTrack.js +39 -3
  101. package/lib/module/classes/HMSRemoteVideoTrack.js.map +1 -1
  102. package/lib/module/classes/HMSRoom.js +4 -0
  103. package/lib/module/classes/HMSRoom.js.map +1 -1
  104. package/lib/module/classes/HMSRoomUpdate.js +1 -0
  105. package/lib/module/classes/HMSRoomUpdate.js.map +1 -1
  106. package/lib/module/classes/HMSSDK.js +83 -45
  107. package/lib/module/classes/HMSSDK.js.map +1 -1
  108. package/lib/module/classes/HMSSessionStore.js +166 -0
  109. package/lib/module/classes/HMSSessionStore.js.map +1 -0
  110. package/lib/module/classes/HMSSimulcastLayerDefinition.js +12 -0
  111. package/lib/module/classes/HMSSimulcastLayerDefinition.js.map +1 -0
  112. package/lib/module/classes/HMSSimulcastLayerSettingsPolicy.js +16 -0
  113. package/lib/module/classes/HMSSimulcastLayerSettingsPolicy.js.map +1 -0
  114. package/lib/module/classes/HMSSimulcastSettings.js +5 -4
  115. package/lib/module/classes/HMSSimulcastSettings.js.map +1 -1
  116. package/lib/module/classes/HMSSimulcastSettingsPolicy.js +10 -0
  117. package/lib/module/classes/HMSSimulcastSettingsPolicy.js.map +1 -0
  118. package/lib/module/classes/HMSSubscribeDegradationPolicy.js +14 -0
  119. package/lib/module/classes/HMSSubscribeDegradationPolicy.js.map +1 -0
  120. package/lib/module/classes/HMSSubscribeSettings.js +2 -0
  121. package/lib/module/classes/HMSSubscribeSettings.js.map +1 -1
  122. package/lib/module/classes/HMSUpdateListenerActions.js +8 -0
  123. package/lib/module/classes/HMSUpdateListenerActions.js.map +1 -1
  124. package/lib/module/classes/HMSVideoResolution.js.map +1 -1
  125. package/lib/module/classes/HMSVideoTrackSettings.js +5 -0
  126. package/lib/module/classes/HMSVideoTrackSettings.js.map +1 -1
  127. package/lib/module/classes/HmsView.js +2 -0
  128. package/lib/module/classes/HmsView.js.map +1 -1
  129. package/lib/module/index.js +6 -0
  130. package/lib/module/index.js.map +1 -1
  131. package/lib/module/utils/emitter/EventEmitter.js +151 -0
  132. package/lib/module/utils/emitter/EventEmitter.js.map +1 -0
  133. package/lib/module/utils/emitter/_EmitterSubscription.js +39 -0
  134. package/lib/module/utils/emitter/_EmitterSubscription.js.map +1 -0
  135. package/lib/module/utils/emitter/_EventSubscription.js +29 -0
  136. package/lib/module/utils/emitter/_EventSubscription.js.map +1 -0
  137. package/lib/module/utils/emitter/_EventSubscriptionVendor.js +83 -0
  138. package/lib/module/utils/emitter/_EventSubscriptionVendor.js.map +1 -0
  139. package/lib/module/utils/index.js +2 -0
  140. package/lib/module/utils/index.js.map +1 -0
  141. package/lib/typescript/classes/HMSAudioTrackSettings.d.ts +14 -0
  142. package/lib/typescript/classes/HMSCameraControl.d.ts +9 -0
  143. package/lib/typescript/classes/HMSEncoder.d.ts +13 -1
  144. package/lib/typescript/classes/HMSIOSAudioMode.d.ts +4 -0
  145. package/lib/typescript/classes/HMSLayer.d.ts +5 -0
  146. package/lib/typescript/classes/HMSLocalVideoStats.d.ts +6 -0
  147. package/lib/typescript/classes/HMSPeer.d.ts +1 -1
  148. package/lib/typescript/classes/HMSPublishSettings.d.ts +3 -0
  149. package/lib/typescript/classes/HMSQualityLimitationReason.d.ts +7 -0
  150. package/lib/typescript/classes/HMSQualityLimitationReasons.d.ts +17 -0
  151. package/lib/typescript/classes/HMSRemotePeer.d.ts +0 -1
  152. package/lib/typescript/classes/HMSRemoteVideoTrack.d.ts +6 -2
  153. package/lib/typescript/classes/HMSRoomUpdate.d.ts +2 -1
  154. package/lib/typescript/classes/HMSSDK.d.ts +21 -31
  155. package/lib/typescript/classes/HMSSessionStore.d.ts +63 -0
  156. package/lib/typescript/classes/HMSSimulcastLayerDefinition.d.ts +10 -0
  157. package/lib/typescript/classes/HMSSimulcastLayerSettingsPolicy.d.ts +12 -0
  158. package/lib/typescript/classes/HMSSimulcastSettings.d.ts +7 -3
  159. package/lib/typescript/classes/HMSSimulcastSettingsPolicy.d.ts +7 -0
  160. package/lib/typescript/classes/HMSSubscribeDegradationPolicy.d.ts +10 -0
  161. package/lib/typescript/classes/HMSSubscribeSettings.d.ts +5 -2
  162. package/lib/typescript/classes/HMSUpdateListenerActions.d.ts +9 -1
  163. package/lib/typescript/classes/HMSVideoResolution.d.ts +2 -2
  164. package/lib/typescript/classes/HMSVideoTrackSettings.d.ts +5 -0
  165. package/lib/typescript/classes/HmsView.d.ts +2 -2
  166. package/lib/typescript/index.d.ts +7 -0
  167. package/lib/typescript/utils/emitter/EventEmitter.d.ts +91 -0
  168. package/lib/typescript/utils/emitter/_EmitterSubscription.d.ts +29 -0
  169. package/lib/typescript/utils/emitter/_EventSubscription.d.ts +19 -0
  170. package/lib/typescript/utils/emitter/_EventSubscriptionVendor.d.ts +44 -0
  171. package/lib/typescript/utils/index.d.ts +1 -0
  172. package/package.json +21 -2
  173. package/sdk-versions.json +3 -3
  174. package/src/classes/HMSAudioTrackSettings.ts +16 -0
  175. package/src/classes/HMSCameraControl.ts +21 -0
  176. package/src/classes/HMSEncoder.ts +126 -11
  177. package/src/classes/HMSIOSAudioMode.ts +4 -0
  178. package/src/classes/HMSLayer.ts +5 -0
  179. package/src/classes/HMSLocalVideoStats.ts +21 -0
  180. package/src/classes/HMSPeer.ts +1 -1
  181. package/src/classes/HMSPublishSettings.ts +4 -0
  182. package/src/classes/HMSQualityLimitationReason.ts +7 -0
  183. package/src/classes/HMSQualityLimitationReasons.ts +27 -0
  184. package/src/classes/HMSRemotePeer.ts +0 -1
  185. package/src/classes/HMSRemoteVideoTrack.ts +52 -4
  186. package/src/classes/HMSRoom.ts +2 -0
  187. package/src/classes/HMSRoomUpdate.ts +1 -0
  188. package/src/classes/HMSSDK.tsx +124 -52
  189. package/src/classes/HMSSessionStore.ts +209 -0
  190. package/src/classes/HMSSimulcastLayerDefinition.ts +12 -0
  191. package/src/classes/HMSSimulcastLayerSettingsPolicy.ts +18 -0
  192. package/src/classes/HMSSimulcastSettings.ts +12 -3
  193. package/src/classes/HMSSimulcastSettingsPolicy.ts +9 -0
  194. package/src/classes/HMSSubscribeDegradationPolicy.ts +15 -0
  195. package/src/classes/HMSSubscribeSettings.ts +10 -2
  196. package/src/classes/HMSUpdateListenerActions.ts +8 -0
  197. package/src/classes/HMSVideoResolution.ts +1 -1
  198. package/src/classes/HMSVideoTrackSettings.ts +5 -0
  199. package/src/classes/HmsView.tsx +5 -1
  200. package/src/index.ts +10 -0
  201. package/src/utils/emitter/EventEmitter.ts +160 -0
  202. package/src/utils/emitter/_EmitterSubscription.ts +44 -0
  203. package/src/utils/emitter/_EventSubscription.ts +28 -0
  204. package/src/utils/emitter/_EventSubscriptionVendor.ts +89 -0
  205. package/src/utils/index.ts +1 -0
@@ -2,12 +2,14 @@ package com.reactnativehmssdk
2
2
 
3
3
  import android.content.Intent
4
4
  import android.content.Intent.FLAG_ACTIVITY_NEW_TASK
5
+ import android.util.Log
5
6
  import com.facebook.react.bridge.*
6
7
  import com.facebook.react.bridge.UiThreadUtil.runOnUiThread
7
8
  import kotlinx.coroutines.launch
8
9
  import live.hms.video.audio.HMSAudioManager
9
10
  import live.hms.video.connection.stats.*
10
11
  import live.hms.video.error.HMSException
12
+ import live.hms.video.media.settings.HMSLayer
11
13
  import live.hms.video.media.tracks.*
12
14
  import live.hms.video.sdk.*
13
15
  import live.hms.video.sdk.models.*
@@ -16,17 +18,21 @@ import live.hms.video.sdk.models.enums.HMSPeerUpdate
16
18
  import live.hms.video.sdk.models.enums.HMSRoomUpdate
17
19
  import live.hms.video.sdk.models.enums.HMSTrackUpdate
18
20
  import live.hms.video.sdk.models.trackchangerequest.HMSChangeTrackStateRequest
21
+ import live.hms.video.sessionstore.HMSKeyChangeListener
22
+ import live.hms.video.sessionstore.HmsSessionStore
19
23
  import live.hms.video.signal.init.HMSTokenListener
20
24
  import live.hms.video.signal.init.TokenRequest
21
25
  import live.hms.video.signal.init.TokenRequestOptions
22
26
  import live.hms.video.utils.HMSCoroutineScope
23
27
  import live.hms.video.utils.HmsUtilities
28
+ import java.io.File
29
+ import java.util.Date
24
30
 
25
31
  class HMSRNSDK(
26
32
  data: ReadableMap?,
27
33
  HmsDelegate: HMSManager,
28
34
  sdkId: String,
29
- reactApplicationContext: ReactApplicationContext
35
+ reactApplicationContext: ReactApplicationContext,
30
36
  ) {
31
37
  var hmsSDK: HMSSDK? = null
32
38
  var screenshareCallback: Promise? = null
@@ -37,12 +43,13 @@ class HMSRNSDK(
37
43
  private var context: ReactApplicationContext = reactApplicationContext
38
44
  private var previewInProgress: Boolean = false
39
45
  private var reconnectingStage: Boolean = false
40
- private var rtcStatsAttached: Boolean = false
41
46
  private var networkQualityUpdatesAttached: Boolean = false
42
47
  private var audioMixingMode: AudioMixingMode = AudioMixingMode.TALK_AND_MUSIC
43
48
  private var id: String = sdkId
44
49
  private var self = this
45
50
  private var eventsEnableStatus = mutableMapOf<String, Boolean>()
51
+ private var sessionStore: HmsSessionStore? = null
52
+ private val keyChangeObservers = mutableMapOf<String, HMSKeyChangeListener?>()
46
53
 
47
54
  init {
48
55
  val builder = HMSSDK.Builder(reactApplicationContext)
@@ -98,7 +105,7 @@ class HMSRNSDK(
98
105
  message,
99
106
  message,
100
107
  null,
101
- false
108
+ false,
102
109
  )
103
110
  data.putString("id", id)
104
111
  data.putMap("error", HMSDecoder.getError(hmsError))
@@ -109,6 +116,21 @@ class HMSRNSDK(
109
116
  callback?.reject("6002", message)
110
117
  }
111
118
 
119
+ // Handle resetting states and data cleanup
120
+ private fun cleanup() {
121
+ screenshareCallback = null
122
+ audioshareCallback = null
123
+ isAudioSharing = false
124
+ recentRoleChangeRequest = null
125
+ previewInProgress = false
126
+ reconnectingStage = false
127
+ networkQualityUpdatesAttached = false
128
+ eventsEnableStatus.clear()
129
+ sessionStore = null
130
+ keyChangeObservers.clear()
131
+ HMSDecoder.clearRestrictDataStates()
132
+ }
133
+
112
134
  fun emitHMSError(error: HMSException) {
113
135
  if (eventsEnableStatus["ON_ERROR"] != true) {
114
136
  return
@@ -136,7 +158,7 @@ class HMSRNSDK(
136
158
  val requiredKeys =
137
159
  HMSHelper.getUnavailableRequiredKey(
138
160
  credentials,
139
- arrayOf(Pair("username", "String"), Pair("authToken", "String"))
161
+ arrayOf(Pair("username", "String"), Pair("authToken", "String")),
140
162
  )
141
163
  if (requiredKeys === null) {
142
164
  previewInProgress = true
@@ -208,7 +230,7 @@ class HMSRNSDK(
208
230
  data.putString("id", id)
209
231
  delegate.emitEvent("ON_PREVIEW", data)
210
232
  }
211
- }
233
+ },
212
234
  )
213
235
  } else {
214
236
  val errorMessage = "preview: $requiredKeys"
@@ -224,7 +246,7 @@ class HMSRNSDK(
224
246
  val requiredKeys =
225
247
  HMSHelper.getUnavailableRequiredKey(
226
248
  credentials,
227
- arrayOf(Pair("username", "String"), Pair("authToken", "String"))
249
+ arrayOf(Pair("username", "String"), Pair("authToken", "String")),
228
250
  )
229
251
  if (requiredKeys === null) {
230
252
  reconnectingStage = false
@@ -243,15 +265,14 @@ class HMSRNSDK(
243
265
  HMSDecoder.getHmsChangeTrackStateRequest(details, id)
244
266
  delegate.emitEvent(
245
267
  "ON_CHANGE_TRACK_STATE_REQUEST",
246
- decodedChangeTrackStateRequest
268
+ decodedChangeTrackStateRequest,
247
269
  )
248
270
  }
249
271
 
250
272
  override fun onRemovedFromRoom(notification: HMSRemovedFromRoom) {
251
273
  super.onRemovedFromRoom(notification)
252
-
253
- HMSDecoder.clearRestrictDataStates()
254
274
  if (eventsEnableStatus["ON_REMOVED_FROM_ROOM"] != true) {
275
+ cleanup() // resetting states and doing data cleanup
255
276
  return
256
277
  }
257
278
  val data: WritableMap = Arguments.createMap()
@@ -266,6 +287,7 @@ class HMSRNSDK(
266
287
  data.putString("id", id)
267
288
 
268
289
  delegate.emitEvent("ON_REMOVED_FROM_ROOM", data)
290
+ cleanup() // resetting states and doing data cleanup
269
291
  }
270
292
 
271
293
  override fun onError(error: HMSException) {
@@ -394,7 +416,17 @@ class HMSRNSDK(
394
416
  val decodedChangeRoleRequest = HMSDecoder.getHmsRoleChangeRequest(request, id)
395
417
  delegate.emitEvent("ON_ROLE_CHANGE_REQUEST", decodedChangeRoleRequest)
396
418
  }
397
- }
419
+
420
+ override fun onSessionStoreAvailable(sessionStore: HmsSessionStore) {
421
+ self.sessionStore = sessionStore
422
+ if (eventsEnableStatus["ON_SESSION_STORE_AVAILABLE"] != true) {
423
+ return
424
+ }
425
+ val data: WritableMap = Arguments.createMap()
426
+ data.putString("id", id)
427
+ delegate.emitEvent("ON_SESSION_STORE_AVAILABLE", data)
428
+ }
429
+ },
398
430
  )
399
431
  } catch (e: HMSException) {
400
432
  self.emitHMSError(e)
@@ -423,7 +455,7 @@ class HMSRNSDK(
423
455
  data.putString("id", id)
424
456
  delegate.emitEvent("ON_SPEAKER", data)
425
457
  }
426
- }
458
+ },
427
459
  )
428
460
 
429
461
  hmsSDK?.addRtcStatsObserver(
@@ -431,20 +463,17 @@ class HMSRNSDK(
431
463
  override fun onLocalAudioStats(
432
464
  audioStats: HMSLocalAudioStats,
433
465
  hmsTrack: HMSTrack?,
434
- hmsPeer: HMSPeer?
466
+ hmsPeer: HMSPeer?,
435
467
  ) {
436
- if (eventsEnableStatus["ON_LOCAL_AUDIO_STATS"] != true) {
437
- return
438
- }
439
- if (!rtcStatsAttached) {
468
+ if (eventsEnableStatus["ON_LOCAL_AUDIO_STATS"] != true || hmsPeer == null || hmsTrack == null) {
440
469
  return
441
470
  }
442
- val localAudioStats = HMSDecoder.getLocalAudioStats(audioStats)
471
+ val localAudioStats = HMSDecoder.getLocalAudioStats(audioStats) // [bitrate, bytesSent, roundTripTime]
443
472
  val track = HMSDecoder.getHmsLocalAudioTrack(hmsTrack as HMSLocalAudioTrack)
444
473
  val peer = HMSDecoder.getHmsPeerSubset(hmsPeer)
445
474
 
446
475
  val data: WritableMap = Arguments.createMap()
447
- data.putMap("localAudioStats", localAudioStats)
476
+ data.putArray("localAudioStats", localAudioStats)
448
477
  data.putMap("track", track)
449
478
  data.putMap("peer", peer)
450
479
  data.putString("id", id)
@@ -454,16 +483,12 @@ class HMSRNSDK(
454
483
  override fun onLocalVideoStats(
455
484
  videoStats: List<HMSLocalVideoStats>,
456
485
  hmsTrack: HMSTrack?,
457
- hmsPeer: HMSPeer?
486
+ hmsPeer: HMSPeer?,
458
487
  ) {
459
- if (eventsEnableStatus["ON_LOCAL_VIDEO_STATS"] != true) {
460
- return
461
- }
462
- if (!rtcStatsAttached && hmsPeer != null && hmsTrack != null) {
488
+ if (eventsEnableStatus["ON_LOCAL_VIDEO_STATS"] != true || hmsPeer == null || hmsTrack == null) {
463
489
  return
464
490
  }
465
-
466
- val localVideoStats = HMSDecoder.getLocalVideoStats(videoStats)
491
+ val localVideoStats = HMSDecoder.getLocalVideoStats(videoStats) // List<[bitrate, bytesSent, roundTripTime, frameRate, resolution]>
467
492
  val track = HMSDecoder.getHmsLocalVideoTrack(hmsTrack as HMSLocalVideoTrack)
468
493
  val peer = HMSDecoder.getHmsPeerSubset(hmsPeer)
469
494
 
@@ -479,17 +504,14 @@ class HMSRNSDK(
479
504
  if (eventsEnableStatus["ON_RTC_STATS"] != true) {
480
505
  return
481
506
  }
482
- if (!rtcStatsAttached) {
483
- return
484
- }
485
- val video = HMSDecoder.getHMSRTCStats(rtcStats.video)
486
- val audio = HMSDecoder.getHMSRTCStats(rtcStats.audio)
487
- val combined = HMSDecoder.getHMSRTCStats(rtcStats.combined)
507
+ val video = HMSDecoder.getHMSRTCStats(rtcStats.video) // [bitrateReceived, bitrateSent, bytesReceived, bytesSent, packetsLost, packetsReceived, roundTripTime]
508
+ val audio = HMSDecoder.getHMSRTCStats(rtcStats.audio) // [bitrateReceived, bitrateSent, bytesReceived, bytesSent, packetsLost, packetsReceived, roundTripTime]
509
+ val combined = HMSDecoder.getHMSRTCStats(rtcStats.combined) // [bitrateReceived, bitrateSent, bytesReceived, bytesSent, packetsLost, packetsReceived, roundTripTime]
488
510
 
489
511
  val data: WritableMap = Arguments.createMap()
490
- data.putMap("video", video)
491
- data.putMap("audio", audio)
492
- data.putMap("combined", combined)
512
+ data.putArray("video", video)
513
+ data.putArray("audio", audio)
514
+ data.putArray("combined", combined)
493
515
  data.putString("id", id)
494
516
  delegate.emitEvent("ON_RTC_STATS", data)
495
517
  }
@@ -497,21 +519,17 @@ class HMSRNSDK(
497
519
  override fun onRemoteAudioStats(
498
520
  audioStats: HMSRemoteAudioStats,
499
521
  hmsTrack: HMSTrack?,
500
- hmsPeer: HMSPeer?
522
+ hmsPeer: HMSPeer?,
501
523
  ) {
502
- if (eventsEnableStatus["ON_REMOTE_AUDIO_STATS"] != true) {
503
- return
504
- }
505
- if (!rtcStatsAttached) {
524
+ if (eventsEnableStatus["ON_REMOTE_AUDIO_STATS"] != true || hmsPeer == null || hmsTrack == null) {
506
525
  return
507
526
  }
508
-
509
- val remoteAudioStats = HMSDecoder.getRemoteAudioStats(audioStats)
527
+ val remoteAudioStats = HMSDecoder.getRemoteAudioStats(audioStats) // [bitrate, bytesReceived, jitter, packetsLost, packetsReceived]
510
528
  val track = HMSDecoder.getHmsRemoteAudioTrack(hmsTrack as HMSRemoteAudioTrack)
511
529
  val peer = HMSDecoder.getHmsPeerSubset(hmsPeer)
512
530
 
513
531
  val data: WritableMap = Arguments.createMap()
514
- data.putMap("remoteAudioStats", remoteAudioStats)
532
+ data.putArray("remoteAudioStats", remoteAudioStats)
515
533
  data.putMap("track", track)
516
534
  data.putMap("peer", peer)
517
535
  data.putString("id", id)
@@ -521,27 +539,23 @@ class HMSRNSDK(
521
539
  override fun onRemoteVideoStats(
522
540
  videoStats: HMSRemoteVideoStats,
523
541
  hmsTrack: HMSTrack?,
524
- hmsPeer: HMSPeer?
542
+ hmsPeer: HMSPeer?,
525
543
  ) {
526
- if (eventsEnableStatus["ON_REMOTE_VIDEO_STATS"] != true) {
527
- return
528
- }
529
- if (!rtcStatsAttached) {
544
+ if (eventsEnableStatus["ON_REMOTE_VIDEO_STATS"] != true || hmsPeer == null || hmsTrack == null) {
530
545
  return
531
546
  }
532
-
533
- val remoteVideoStats = HMSDecoder.getRemoteVideoStats(videoStats)
547
+ val remoteVideoStats = HMSDecoder.getRemoteVideoStats(videoStats) // [bitrate, bytesReceived, frameRate, jitter, packetsLost, packetsReceived, resolution]
534
548
  val track = HMSDecoder.getHmsRemoteVideoTrack(hmsTrack as HMSRemoteVideoTrack)
535
549
  val peer = HMSDecoder.getHmsPeerSubset(hmsPeer)
536
550
 
537
551
  val data: WritableMap = Arguments.createMap()
538
- data.putMap("remoteVideoStats", remoteVideoStats)
552
+ data.putArray("remoteVideoStats", remoteVideoStats)
539
553
  data.putMap("track", track)
540
554
  data.putMap("peer", peer)
541
555
  data.putString("id", id)
542
556
  delegate.emitEvent("ON_REMOTE_VIDEO_STATS", data)
543
557
  }
544
- }
558
+ },
545
559
  )
546
560
  }
547
561
  } else {
@@ -554,7 +568,7 @@ class HMSRNSDK(
554
568
  val requiredKeys =
555
569
  HMSHelper.getUnavailableRequiredKey(
556
570
  data,
557
- arrayOf(Pair("roomCode", "String"))
571
+ arrayOf(Pair("roomCode", "String")),
558
572
  )
559
573
 
560
574
  if (requiredKeys === null) {
@@ -576,7 +590,7 @@ class HMSRNSDK(
576
590
  override fun onTokenSuccess(string: String) {
577
591
  promise.resolve(string)
578
592
  }
579
- }
593
+ },
580
594
  )
581
595
  } else {
582
596
  val errorMessage = "getAuthTokenByRoomCode: $requiredKeys"
@@ -614,12 +628,6 @@ class HMSRNSDK(
614
628
  hmsSDK?.leave(
615
629
  object : HMSActionResultListener {
616
630
  override fun onSuccess() {
617
- isAudioSharing = false
618
- screenshareCallback = null
619
- audioshareCallback = null
620
- networkQualityUpdatesAttached = false
621
- rtcStatsAttached = false
622
- HMSDecoder.clearRestrictDataStates()
623
631
  if (fromPIP) {
624
632
  context.currentActivity?.moveTaskToBack(false)
625
633
 
@@ -632,6 +640,7 @@ class HMSRNSDK(
632
640
  } else {
633
641
  callback?.resolve(emitHMSSuccess())
634
642
  }
643
+ cleanup() // resetting states and doing data cleanup
635
644
  }
636
645
 
637
646
  override fun onError(error: HMSException) {
@@ -640,7 +649,7 @@ class HMSRNSDK(
640
649
  }
641
650
  self.emitHMSError(error)
642
651
  }
643
- }
652
+ },
644
653
  )
645
654
  }
646
655
  }
@@ -649,7 +658,7 @@ class HMSRNSDK(
649
658
  val requiredKeys =
650
659
  HMSHelper.getUnavailableRequiredKey(
651
660
  data,
652
- arrayOf(Pair("message", "String"), Pair("type", "String"))
661
+ arrayOf(Pair("message", "String"), Pair("type", "String")),
653
662
  )
654
663
  if (requiredKeys === null) {
655
664
  hmsSDK?.sendBroadcastMessage(
@@ -663,7 +672,7 @@ class HMSRNSDK(
663
672
  override fun onSuccess(hmsMessage: HMSMessage) {
664
673
  callback?.resolve(emitHMSSuccess(hmsMessage))
665
674
  }
666
- }
675
+ },
667
676
  )
668
677
  } else {
669
678
  val errorMessage = "sendBroadcastMessage: $requiredKeys"
@@ -676,7 +685,7 @@ class HMSRNSDK(
676
685
  val requiredKeys =
677
686
  HMSHelper.getUnavailableRequiredKey(
678
687
  data,
679
- arrayOf(Pair("message", "String"), Pair("roles", "Array"), Pair("type", "String"))
688
+ arrayOf(Pair("message", "String"), Pair("roles", "Array"), Pair("type", "String")),
680
689
  )
681
690
  if (requiredKeys === null) {
682
691
  val targetedRoles = data.getArray("roles")?.toArrayList() as? ArrayList<String>
@@ -695,7 +704,7 @@ class HMSRNSDK(
695
704
  override fun onSuccess(hmsMessage: HMSMessage) {
696
705
  callback?.resolve(emitHMSSuccess(hmsMessage))
697
706
  }
698
- }
707
+ },
699
708
  )
700
709
  } else {
701
710
  val errorMessage = "sendGroupMessage: $requiredKeys"
@@ -708,7 +717,7 @@ class HMSRNSDK(
708
717
  val requiredKeys =
709
718
  HMSHelper.getUnavailableRequiredKey(
710
719
  data,
711
- arrayOf(Pair("message", "String"), Pair("peerId", "String"), Pair("type", "String"))
720
+ arrayOf(Pair("message", "String"), Pair("peerId", "String"), Pair("type", "String")),
712
721
  )
713
722
  if (requiredKeys === null) {
714
723
  val peerId = data.getString("peerId")
@@ -726,7 +735,7 @@ class HMSRNSDK(
726
735
  override fun onSuccess(hmsMessage: HMSMessage) {
727
736
  callback?.resolve(emitHMSSuccess(hmsMessage))
728
737
  }
729
- }
738
+ },
730
739
  )
731
740
  } else {
732
741
  self.emitCustomError("PEER_NOT_FOUND")
@@ -744,7 +753,7 @@ class HMSRNSDK(
744
753
  val requiredKeys =
745
754
  HMSHelper.getUnavailableRequiredKey(
746
755
  data,
747
- arrayOf(Pair("peerId", "String"), Pair("role", "String"), Pair("force", "Boolean"))
756
+ arrayOf(Pair("peerId", "String"), Pair("role", "String"), Pair("force", "Boolean")),
748
757
  )
749
758
  if (requiredKeys === null) {
750
759
  val peerId = data.getString("peerId")
@@ -768,7 +777,7 @@ class HMSRNSDK(
768
777
  self.emitHMSError(error)
769
778
  callback?.reject(error.code.toString(), error.message)
770
779
  }
771
- }
780
+ },
772
781
  )
773
782
  }
774
783
  }
@@ -783,7 +792,7 @@ class HMSRNSDK(
783
792
  val requiredKeys =
784
793
  HMSHelper.getUnavailableRequiredKey(
785
794
  data,
786
- arrayOf(Pair("peerId", "String"), Pair("role", "String"), Pair("force", "Boolean"))
795
+ arrayOf(Pair("peerId", "String"), Pair("role", "String"), Pair("force", "Boolean")),
787
796
  )
788
797
  if (requiredKeys === null) {
789
798
  val peerId = data.getString("peerId")
@@ -807,7 +816,7 @@ class HMSRNSDK(
807
816
  self.emitHMSError(error)
808
817
  promise?.reject(error.code.toString(), error.message)
809
818
  }
810
- }
819
+ },
811
820
  )
812
821
  }
813
822
  }
@@ -822,7 +831,7 @@ class HMSRNSDK(
822
831
  val requiredKeys =
823
832
  HMSHelper.getUnavailableRequiredKey(
824
833
  data,
825
- arrayOf(Pair("ofRoles", "Array"), Pair("toRole", "String"))
834
+ arrayOf(Pair("ofRoles", "Array"), Pair("toRole", "String")),
826
835
  )
827
836
  if (requiredKeys === null) {
828
837
  val ofRoles = data.getArray("ofRoles")
@@ -848,7 +857,7 @@ class HMSRNSDK(
848
857
  self.emitHMSError(error)
849
858
  promise?.reject(error.code.toString(), error.message)
850
859
  }
851
- }
860
+ },
852
861
  )
853
862
  }
854
863
  }
@@ -863,7 +872,7 @@ class HMSRNSDK(
863
872
  val requiredKeys =
864
873
  HMSHelper.getUnavailableRequiredKey(
865
874
  data,
866
- arrayOf(Pair("trackId", "String"), Pair("mute", "Boolean"))
875
+ arrayOf(Pair("trackId", "String"), Pair("mute", "Boolean")),
867
876
  )
868
877
  if (requiredKeys === null) {
869
878
  val trackId = data.getString("trackId")
@@ -881,7 +890,7 @@ class HMSRNSDK(
881
890
  self.emitHMSError(error)
882
891
  callback?.reject(error.code.toString(), error.message)
883
892
  }
884
- }
893
+ },
885
894
  )
886
895
  }
887
896
  } else {
@@ -932,7 +941,7 @@ class HMSRNSDK(
932
941
  self.emitHMSError(error)
933
942
  callback?.reject(error.code.toString(), error.message)
934
943
  }
935
- }
944
+ },
936
945
  )
937
946
  } else {
938
947
  val errorMessage = "changeTrackStateForRoles: $requiredKeys"
@@ -963,7 +972,7 @@ class HMSRNSDK(
963
972
  val requiredKeys =
964
973
  HMSHelper.getUnavailableRequiredKey(
965
974
  data,
966
- arrayOf(Pair("peerId", "String"), Pair("reason", "String"))
975
+ arrayOf(Pair("peerId", "String"), Pair("reason", "String")),
967
976
  )
968
977
  if (requiredKeys === null) {
969
978
  val peerId = data.getString("peerId")
@@ -981,7 +990,7 @@ class HMSRNSDK(
981
990
  self.emitHMSError(error)
982
991
  callback?.reject(error.code.toString(), error.message)
983
992
  }
984
- }
993
+ },
985
994
  )
986
995
  } else {
987
996
  self.emitCustomError("PEER_NOT_FOUND")
@@ -998,7 +1007,7 @@ class HMSRNSDK(
998
1007
  val requiredKeys =
999
1008
  HMSHelper.getUnavailableRequiredKey(
1000
1009
  data,
1001
- arrayOf(Pair("lock", "Boolean"), Pair("reason", "String"))
1010
+ arrayOf(Pair("lock", "Boolean"), Pair("reason", "String")),
1002
1011
  )
1003
1012
  if (requiredKeys === null) {
1004
1013
  hmsSDK?.endRoom(
@@ -1007,12 +1016,13 @@ class HMSRNSDK(
1007
1016
  object : HMSActionResultListener {
1008
1017
  override fun onSuccess() {
1009
1018
  callback?.resolve(emitHMSSuccess())
1019
+ cleanup() // resetting states and doing data cleanup
1010
1020
  }
1011
1021
  override fun onError(error: HMSException) {
1012
1022
  self.emitHMSError(error)
1013
1023
  callback?.reject(error.code.toString(), error.message)
1014
1024
  }
1015
- }
1025
+ },
1016
1026
  )
1017
1027
  } else {
1018
1028
  val errorMessage = "endRoom: $requiredKeys"
@@ -1033,7 +1043,7 @@ class HMSRNSDK(
1033
1043
  self.emitHMSError(error)
1034
1044
  callback?.reject(error.code.toString(), error.message)
1035
1045
  }
1036
- }
1046
+ },
1037
1047
  )
1038
1048
  recentRoleChangeRequest = null
1039
1049
  } else {
@@ -1056,7 +1066,7 @@ class HMSRNSDK(
1056
1066
  override fun onError(error: HMSException) {
1057
1067
  customError = error
1058
1068
  }
1059
- }
1069
+ },
1060
1070
  )
1061
1071
  }
1062
1072
  if (customError === null) {
@@ -1090,7 +1100,7 @@ class HMSRNSDK(
1090
1100
  val requiredKeys =
1091
1101
  HMSHelper.getUnavailableRequiredKey(
1092
1102
  data,
1093
- arrayOf(Pair("trackId", "String"), Pair("playbackAllowed", "Boolean"))
1103
+ arrayOf(Pair("trackId", "String"), Pair("playbackAllowed", "Boolean")),
1094
1104
  )
1095
1105
  if (requiredKeys === null) {
1096
1106
  val trackId = data.getString("trackId")
@@ -1158,7 +1168,7 @@ class HMSRNSDK(
1158
1168
  val requiredKeys =
1159
1169
  HMSHelper.getUnavailableRequiredKey(
1160
1170
  data,
1161
- arrayOf(Pair("trackId", "String"), Pair("volume", "Float"))
1171
+ arrayOf(Pair("trackId", "String"), Pair("volume", "Float")),
1162
1172
  )
1163
1173
 
1164
1174
  if (requiredKeys === null) {
@@ -1234,7 +1244,7 @@ class HMSRNSDK(
1234
1244
  callback?.reject(error.code.toString(), error.message)
1235
1245
  self.emitHMSError(error)
1236
1246
  }
1237
- }
1247
+ },
1238
1248
  )
1239
1249
  }
1240
1250
  } else {
@@ -1248,7 +1258,7 @@ class HMSRNSDK(
1248
1258
  val requiredKeys =
1249
1259
  HMSHelper.getUnavailableRequiredKey(
1250
1260
  data,
1251
- arrayOf(Pair("record", "Boolean"), Pair("meetingURL", "String"))
1261
+ arrayOf(Pair("record", "Boolean"), Pair("meetingURL", "String")),
1252
1262
  )
1253
1263
  if (requiredKeys === null) {
1254
1264
  val config = HMSHelper.getRtmpConfig(data)
@@ -1267,7 +1277,7 @@ class HMSRNSDK(
1267
1277
  callback?.reject(error.code.toString(), error.message)
1268
1278
  self.emitHMSError(error)
1269
1279
  }
1270
- }
1280
+ },
1271
1281
  )
1272
1282
  }
1273
1283
  } else {
@@ -1287,7 +1297,7 @@ class HMSRNSDK(
1287
1297
  callback?.reject(error.code.toString(), error.message)
1288
1298
  self.emitHMSError(error)
1289
1299
  }
1290
- }
1300
+ },
1291
1301
  )
1292
1302
  }
1293
1303
 
@@ -1317,7 +1327,7 @@ class HMSRNSDK(
1317
1327
  screenshareCallback = null
1318
1328
  callback?.resolve(emitHMSSuccess())
1319
1329
  }
1320
- }
1330
+ },
1321
1331
  )
1322
1332
  }
1323
1333
 
@@ -1333,7 +1343,7 @@ class HMSRNSDK(
1333
1343
  callback?.reject(error.code.toString(), error.message)
1334
1344
  self.emitHMSError(error)
1335
1345
  }
1336
- }
1346
+ },
1337
1347
  )
1338
1348
  }
1339
1349
 
@@ -1348,7 +1358,7 @@ class HMSRNSDK(
1348
1358
  callback?.reject(error.code.toString(), error.message)
1349
1359
  self.emitHMSError(error)
1350
1360
  }
1351
- }
1361
+ },
1352
1362
  )
1353
1363
  }
1354
1364
 
@@ -1388,7 +1398,7 @@ class HMSRNSDK(
1388
1398
  callback?.reject(error.code.toString(), error.message)
1389
1399
  self.emitHMSError(error)
1390
1400
  }
1391
- }
1401
+ },
1392
1402
  )
1393
1403
  } else {
1394
1404
  self.emitCustomError("NAME_UNDEFINED")
@@ -1401,14 +1411,6 @@ class HMSRNSDK(
1401
1411
  }
1402
1412
  }
1403
1413
 
1404
- fun enableRTCStats() {
1405
- rtcStatsAttached = true
1406
- }
1407
-
1408
- fun disableRTCStats() {
1409
- rtcStatsAttached = false
1410
- }
1411
-
1412
1414
  fun enableNetworkQualityUpdates() {
1413
1415
  networkQualityUpdatesAttached = true
1414
1416
  }
@@ -1453,7 +1455,7 @@ class HMSRNSDK(
1453
1455
  object : HMSAudioManager.AudioManagerDeviceChangeListener {
1454
1456
  override fun onAudioDeviceChanged(
1455
1457
  device: HMSAudioManager.AudioDevice?,
1456
- audioDevicesList: Set<HMSAudioManager.AudioDevice>?
1458
+ audioDevicesList: Set<HMSAudioManager.AudioDevice>?,
1457
1459
  ) {
1458
1460
  if (eventsEnableStatus["ON_AUDIO_DEVICE_CHANGED"] != true) {
1459
1461
  return
@@ -1468,7 +1470,7 @@ class HMSRNSDK(
1468
1470
  override fun onError(error: HMSException) {
1469
1471
  self.emitHMSError(error)
1470
1472
  }
1471
- }
1473
+ },
1472
1474
  )
1473
1475
  }
1474
1476
 
@@ -1508,7 +1510,7 @@ class HMSRNSDK(
1508
1510
  audioshareCallback = null
1509
1511
  callback?.resolve(emitHMSSuccess())
1510
1512
  }
1511
- }
1513
+ },
1512
1514
  )
1513
1515
  }
1514
1516
 
@@ -1531,6 +1533,7 @@ class HMSRNSDK(
1531
1533
  }
1532
1534
  }
1533
1535
 
1536
+ @Deprecated("SessionMetaData APIs has been deprecated in favour of Session Store APIs", ReplaceWith("setSessionMetadataForKey"), DeprecationLevel.WARNING)
1534
1537
  fun setSessionMetaData(data: ReadableMap, callback: Promise?) {
1535
1538
  if (data.hasKey("sessionMetaData")) {
1536
1539
  val sessionMetaData = data.getString("sessionMetaData")
@@ -1545,7 +1548,7 @@ class HMSRNSDK(
1545
1548
  callback?.reject(error.code.toString(), error.message)
1546
1549
  self.emitHMSError(error)
1547
1550
  }
1548
- }
1551
+ },
1549
1552
  )
1550
1553
  } else {
1551
1554
  val errorMessage = "setSessionMetaData: sessionMetaData_Is_Required"
@@ -1554,18 +1557,23 @@ class HMSRNSDK(
1554
1557
  }
1555
1558
  }
1556
1559
 
1560
+ @Deprecated("SessionMetaData APIs has been deprecated in favour of Session Store APIs", ReplaceWith("getSessionMetadataForKey"), DeprecationLevel.WARNING)
1557
1561
  fun getSessionMetaData(callback: Promise?) {
1558
1562
  hmsSDK?.getSessionMetaData(
1559
1563
  object : HMSSessionMetadataListener {
1560
- override fun onSuccess(sessionMetadata: String?) {
1561
- callback?.resolve(sessionMetadata)
1564
+ override fun onSuccess(sessionMetadata: Any?) {
1565
+ if (sessionMetadata is String?) {
1566
+ callback?.resolve(sessionMetadata)
1567
+ } else {
1568
+ callback?.reject("6002", "Session Store: Unsupported type received, only String type is supported")
1569
+ }
1562
1570
  }
1563
1571
 
1564
1572
  override fun onError(error: HMSException) {
1565
1573
  callback?.reject(error.code.toString(), error.message)
1566
1574
  self.emitHMSError(error)
1567
1575
  }
1568
- }
1576
+ },
1569
1577
  )
1570
1578
  }
1571
1579
 
@@ -1582,7 +1590,9 @@ class HMSRNSDK(
1582
1590
  val peerId = data.getString("peerId")!!
1583
1591
  val property = data.getString("property")!!
1584
1592
 
1585
- val peer = HMSHelper.getPeerFromPeerId(peerId, nativeHmsSDK.getRoom())
1593
+ val hmsRoom = nativeHmsSDK.getRoom()
1594
+
1595
+ val peer = HMSHelper.getPeerFromPeerId(peerId, hmsRoom)
1586
1596
 
1587
1597
  if (peer !== null) {
1588
1598
  val result: WritableMap = Arguments.createMap()
@@ -1740,4 +1750,333 @@ class HMSRNSDK(
1740
1750
  rejectCallback(promise, errorMessage)
1741
1751
  }
1742
1752
  }
1753
+
1754
+ fun getRemoteVideoTrackFromTrackId(data: ReadableMap, promise: Promise) {
1755
+ val requiredKeys = HMSHelper.getUnavailableRequiredKey(data, arrayOf(Pair("trackId", "String")))
1756
+ if (requiredKeys === null) {
1757
+ val trackId = data.getString("trackId")
1758
+ val remoteVideoTrack = HMSHelper.getRemoteVideoTrackFromTrackId(trackId, hmsSDK?.getRoom())
1759
+ if (remoteVideoTrack === null) {
1760
+ promise.reject("101", "TRACK_NOT_FOUND")
1761
+ } else {
1762
+ promise.resolve(HMSDecoder.getHmsRemoteVideoTrack(remoteVideoTrack))
1763
+ }
1764
+ } else {
1765
+ val errorMessage = "getRemoteVideoTrackFromTrackId: $requiredKeys"
1766
+ self.emitRequiredKeysError(errorMessage)
1767
+ rejectCallback(promise, errorMessage)
1768
+ }
1769
+ }
1770
+
1771
+ fun getRemoteAudioTrackFromTrackId(data: ReadableMap, promise: Promise) {
1772
+ val requiredKeys = HMSHelper.getUnavailableRequiredKey(data, arrayOf(Pair("trackId", "String")))
1773
+ if (requiredKeys === null) {
1774
+ val trackId = data.getString("trackId")
1775
+ val remoteAudioTrack = HMSHelper.getRemoteAudioTrackFromTrackId(trackId, hmsSDK?.getRoom())
1776
+ if (remoteAudioTrack === null) {
1777
+ promise.reject("101", "TRACK_NOT_FOUND")
1778
+ } else {
1779
+ promise.resolve(HMSDecoder.getHmsRemoteAudioTrack(remoteAudioTrack))
1780
+ }
1781
+ } else {
1782
+ val errorMessage = "getRemoteAudioTrackFromTrackId: $requiredKeys"
1783
+ self.emitRequiredKeysError(errorMessage)
1784
+ rejectCallback(promise, errorMessage)
1785
+ }
1786
+ }
1787
+
1788
+ fun getVideoTrackLayer(data: ReadableMap, promise: Promise) {
1789
+ val requiredKeys = HMSHelper.getUnavailableRequiredKey(data, arrayOf(Pair("trackId", "String")))
1790
+ if (requiredKeys === null) {
1791
+ val trackId = data.getString("trackId")
1792
+ val remoteVideoTrack = HMSHelper.getRemoteVideoTrackFromTrackId(trackId, hmsSDK?.getRoom())
1793
+ if (remoteVideoTrack === null) {
1794
+ promise.reject("101", "TRACK_NOT_FOUND")
1795
+ } else {
1796
+ val layer = remoteVideoTrack.getLayer()
1797
+ promise.resolve(layer.name)
1798
+ }
1799
+ } else {
1800
+ val errorMessage = "getVideoTrackLayer: $requiredKeys"
1801
+ self.emitRequiredKeysError(errorMessage)
1802
+ rejectCallback(promise, errorMessage)
1803
+ }
1804
+ }
1805
+
1806
+ fun getVideoTrackLayerDefinition(data: ReadableMap, promise: Promise) {
1807
+ val requiredKeys = HMSHelper.getUnavailableRequiredKey(data, arrayOf(Pair("trackId", "String")))
1808
+ if (requiredKeys === null) {
1809
+ val trackId = data.getString("trackId")
1810
+ val remoteVideoTrack = HMSHelper.getRemoteVideoTrackFromTrackId(trackId, hmsSDK?.getRoom())
1811
+ if (remoteVideoTrack === null) {
1812
+ promise.reject("101", "TRACK_NOT_FOUND")
1813
+ } else {
1814
+ val layerDefinition = remoteVideoTrack.getLayerDefinition()
1815
+
1816
+ promise.resolve(HMSDecoder.getSimulcastLayerDefinitions(layerDefinition))
1817
+ }
1818
+ } else {
1819
+ val errorMessage = "getVideoTrackLayerDefinition: $requiredKeys"
1820
+ self.emitRequiredKeysError(errorMessage)
1821
+ rejectCallback(promise, errorMessage)
1822
+ }
1823
+ }
1824
+
1825
+ fun setVideoTrackLayer(data: ReadableMap, promise: Promise?) {
1826
+ val requiredKeys = HMSHelper.getUnavailableRequiredKey(data, arrayOf(Pair("trackId", "String"), Pair("layer", "String")))
1827
+ if (requiredKeys === null) {
1828
+ val trackId = data.getString("trackId")
1829
+ val layerString = data.getString("layer")
1830
+
1831
+ if (HMSLayer.values().find { it.name == layerString } === null) {
1832
+ // DOUBT: which error to throw here?
1833
+ // emitError or 101 or 6000?
1834
+ promise?.reject("6000", "INVALID_LAYER")
1835
+ return
1836
+ }
1837
+
1838
+ val remoteVideoTrack = HMSHelper.getRemoteVideoTrackFromTrackId(trackId, hmsSDK?.getRoom())
1839
+
1840
+ if (remoteVideoTrack === null) {
1841
+ promise?.reject("101", "TRACK_NOT_FOUND")
1842
+ } else {
1843
+ val layer = HMSLayer.valueOf(layerString!!)
1844
+ remoteVideoTrack.setLayer(layer)
1845
+ promise?.resolve(true)
1846
+ }
1847
+ } else {
1848
+ val errorMessage = "setVideoTrackLayer: $requiredKeys"
1849
+ self.emitRequiredKeysError(errorMessage)
1850
+ rejectCallback(promise, errorMessage)
1851
+ }
1852
+ }
1853
+
1854
+ fun captureImageAtMaxSupportedResolution(data: ReadableMap, promise: Promise?) {
1855
+ val requiredKeys = HMSHelper.getUnavailableRequiredKey(data, arrayOf(Pair("flash", "Boolean")))
1856
+ if (requiredKeys === null) {
1857
+ val localPeer = hmsSDK?.getLocalPeer().let {
1858
+ if (it == null) {
1859
+ promise?.reject("6004", "An instance of Local Peer could not be found! Please check if a Room is joined.")
1860
+ return
1861
+ } else {
1862
+ it
1863
+ }
1864
+ }
1865
+ val localVideoTrack = localPeer.videoTrack.let {
1866
+ if (it == null) {
1867
+ promise?.reject("6004", "Video Track of Local Peer could not be found! Please check if the Local Peer has permission to publish video & video is unmuted currently.")
1868
+ return
1869
+ } else {
1870
+ it
1871
+ }
1872
+ }
1873
+ val cameraControl = localVideoTrack.getCameraControl().let {
1874
+ if (it == null) {
1875
+ promise?.reject("6004", "Camera Controls not available!")
1876
+ return
1877
+ } else {
1878
+ it
1879
+ }
1880
+ }
1881
+
1882
+ val flashSupported = cameraControl.isFlashSupported()
1883
+ var flashActionOnSuccess = 0 // 0 - Do nothing on success, 1 - set flash on, 2 - set flash off
1884
+ if (flashSupported) {
1885
+ val useFlash = data.getBoolean("flash")
1886
+
1887
+ val flashEnabled = cameraControl.isFlashEnabled()
1888
+
1889
+ // if flash option is true, and flash is already on
1890
+ // -> do nothing now and on success
1891
+
1892
+ // if flash option is true, and flash is off
1893
+ // -> turn it on and later turn it off
1894
+ if (useFlash && !flashEnabled) {
1895
+ cameraControl.setFlash(true)
1896
+ flashActionOnSuccess = 2
1897
+ }
1898
+
1899
+ // if flash option is false, and flash is on
1900
+ // -> turn it off and later turn it on
1901
+ if (!useFlash && flashEnabled) {
1902
+ cameraControl.setFlash(false)
1903
+ flashActionOnSuccess = 1
1904
+ }
1905
+
1906
+ // if flash option is false, and flash is off
1907
+ // -> do nothing now and on success
1908
+ }
1909
+
1910
+ val dir = context.getExternalFilesDir("images")
1911
+ val imagePath = "$dir/hms_${Date().time}.jpg"
1912
+ val savePath = File(imagePath)
1913
+
1914
+ cameraControl.captureImageAtMaxSupportedResolution(
1915
+ savePath,
1916
+ ) { success ->
1917
+ if (flashActionOnSuccess > 0) {
1918
+ cameraControl.setFlash(flashActionOnSuccess === 1)
1919
+ }
1920
+ if (success) {
1921
+ promise?.resolve(imagePath)
1922
+ } else {
1923
+ promise?.reject("6004", "Could Not Capture Image!")
1924
+ }
1925
+ }
1926
+ } else {
1927
+ val errorMessage = "captureImageAtMaxSupportedResolution: $requiredKeys"
1928
+ self.emitRequiredKeysError(errorMessage)
1929
+ rejectCallback(promise, errorMessage)
1930
+ }
1931
+ }
1932
+
1933
+ // Mark: Session Store
1934
+
1935
+ fun setSessionMetadataForKey(data: ReadableMap, promise: Promise?) {
1936
+ val requiredKeys = HMSHelper.getUnavailableRequiredKey(data, arrayOf(Pair("key", "String")))
1937
+ if (requiredKeys === null) {
1938
+ val key = data.getString("key")!!
1939
+ val value = data.getString("value")
1940
+
1941
+ sessionStore.let {
1942
+ if (it === null) {
1943
+ val errorMessage = "setSessionMetadataForKey: HmsSessionStore instance is not available!"
1944
+ rejectCallback(promise, errorMessage)
1945
+ return
1946
+ }
1947
+
1948
+ it.set(
1949
+ value, // data/value
1950
+ key, // key
1951
+ object : HMSActionResultListener {
1952
+ override fun onError(error: HMSException) {
1953
+ promise?.reject(error.code.toString(), error.message)
1954
+ }
1955
+ override fun onSuccess() {
1956
+ val result: WritableMap = Arguments.createMap()
1957
+ result.putBoolean("success", true)
1958
+ result.putString("finalValue", value)
1959
+ promise?.resolve(result)
1960
+ }
1961
+ },
1962
+ )
1963
+ }
1964
+ } else {
1965
+ val errorMessage = "setSessionMetadataForKey: $requiredKeys"
1966
+ rejectCallback(promise, errorMessage)
1967
+ }
1968
+ }
1969
+
1970
+ fun getSessionMetadataForKey(data: ReadableMap, promise: Promise?) {
1971
+ val requiredKeys = HMSHelper.getUnavailableRequiredKey(data, arrayOf(Pair("key", "String")))
1972
+ if (requiredKeys === null) {
1973
+ val key = data.getString("key")!!
1974
+
1975
+ sessionStore.let {
1976
+ if (it === null) {
1977
+ val errorMessage = "setSessionMetadataForKey: HmsSessionStore instance is not available!"
1978
+ rejectCallback(promise, errorMessage)
1979
+ return
1980
+ }
1981
+
1982
+ it.get(
1983
+ key,
1984
+ object : HMSSessionMetadataListener {
1985
+ override fun onError(error: HMSException) {
1986
+ promise?.reject(error.code.toString(), error.message)
1987
+ }
1988
+ override fun onSuccess(sessionMetadata: Any?) {
1989
+ if (sessionMetadata is String?) {
1990
+ promise?.resolve(sessionMetadata)
1991
+ } else {
1992
+ promise?.reject("6002", "Session Store: Unsupported type received for '$key' key, only String type is supported")
1993
+ }
1994
+ }
1995
+ },
1996
+ )
1997
+ }
1998
+ } else {
1999
+ val errorMessage = "getSessionMetadataForKey: $requiredKeys"
2000
+ rejectCallback(promise, errorMessage)
2001
+ }
2002
+ }
2003
+
2004
+ fun addKeyChangeListener(data: ReadableMap, promise: Promise?) {
2005
+ val requiredKeys = HMSHelper.getUnavailableRequiredKey(data, arrayOf(Pair("keys", "Array"), Pair("uniqueId", "String")))
2006
+ if (requiredKeys === null) {
2007
+ val keys = ArrayList(data.getArray("keys")!!.toArrayList().map { it.toString() })
2008
+ val uniqueId = data.getString("uniqueId")!!
2009
+
2010
+ sessionStore.let {
2011
+ if (it === null) {
2012
+ val errorMessage = "setSessionMetadataForKey: HmsSessionStore instance is not available!"
2013
+ rejectCallback(promise, errorMessage)
2014
+ return
2015
+ }
2016
+
2017
+ val keyChangeListener = object : HMSKeyChangeListener {
2018
+ override fun onKeyChanged(key: String, value: Any?) {
2019
+ val map = Arguments.createMap()
2020
+ map.putString("id", id)
2021
+ map.putString("key", key)
2022
+ if (value is String?) {
2023
+ map.putString("value", value)
2024
+ } else {
2025
+ Log.e("HMSRNSDK", "Session Store: '$value' value received for '$key' key, expected only NullableString type for value")
2026
+ map.putString("value", null) // resetting value to `null`, as the current type is not supported
2027
+ }
2028
+ delegate.emitEvent("ON_SESSION_STORE_CHANGED", map)
2029
+ }
2030
+ }
2031
+
2032
+ val actionResultListener = object : HMSActionResultListener {
2033
+ override fun onError(error: HMSException) {
2034
+ promise?.reject(error.code.toString(), error.message)
2035
+ }
2036
+ override fun onSuccess() {
2037
+ keyChangeObservers[uniqueId] = keyChangeListener
2038
+ promise?.resolve(true)
2039
+ }
2040
+ }
2041
+
2042
+ it.addKeyChangeListener(
2043
+ keys,
2044
+ keyChangeListener,
2045
+ actionResultListener,
2046
+ )
2047
+ }
2048
+ } else {
2049
+ val errorMessage = "addKeyChangeListener: $requiredKeys"
2050
+ rejectCallback(promise, errorMessage)
2051
+ }
2052
+ }
2053
+
2054
+ fun removeKeyChangeListener(data: ReadableMap, promise: Promise?) {
2055
+ val requiredKeys = HMSHelper.getUnavailableRequiredKey(data, arrayOf(Pair("uniqueId", "String")))
2056
+ if (requiredKeys === null) {
2057
+ val uniqueId = data.getString("uniqueId")!!
2058
+
2059
+ sessionStore.let { localSessionStore ->
2060
+ if (localSessionStore === null) {
2061
+ val errorMessage = "removeKeyChangeListener: HmsSessionStore instance is not available!"
2062
+ rejectCallback(promise, errorMessage)
2063
+ return
2064
+ }
2065
+
2066
+ keyChangeObservers[uniqueId].let {
2067
+ if (it == null) {
2068
+ val errorMessage = "removeKeyChangeListener: No listener found to remove for the '$uniqueId' uniqueId passed."
2069
+ rejectCallback(promise, errorMessage)
2070
+ } else {
2071
+ localSessionStore.removeKeyChangeListener(it)
2072
+ keyChangeObservers.remove(uniqueId)
2073
+ promise?.resolve(true)
2074
+ }
2075
+ }
2076
+ }
2077
+ } else {
2078
+ val errorMessage = "removeKeyChangeListener: $requiredKeys"
2079
+ rejectCallback(promise, errorMessage)
2080
+ }
2081
+ }
1743
2082
  }