@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
@@ -1,8 +1,8 @@
1
1
  //
2
2
  // Hmssdk.swift
3
- // Hmssdk
3
+ // HMSSDK
4
4
  //
5
- // Copyright © 2021 Facebook. All rights reserved.
5
+ // Copyright © 2023 100ms. All rights reserved.
6
6
  //
7
7
 
8
8
  import Foundation
@@ -16,7 +16,6 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
16
16
  var recentRoleChangeRequest: HMSRoleChangeRequest?
17
17
  var delegate: HMSManager?
18
18
  var id: String = "12345"
19
- var recentPreviewTracks: [HMSTrack]? = []
20
19
  private var reconnectingStage: Bool = false
21
20
  private var preferredExtension: String?
22
21
  private var systemBroadcastPicker: RPSystemBroadcastPickerView?
@@ -24,27 +23,10 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
24
23
  private var stopScreenshareResolve: RCTPromiseResolveBlock?
25
24
  private var isScreenShared: Bool? = false
26
25
  private var previewInProgress = false
27
- private var rtcStatsAttached = false
28
26
  private var networkQualityUpdatesAttached = false
29
27
  private var eventsEnableStatus: [String: Bool] = [:]
30
-
31
- let ON_PREVIEW = "ON_PREVIEW"
32
- let ON_JOIN = "ON_JOIN"
33
- let ON_ROOM_UPDATE = "ON_ROOM_UPDATE"
34
- let ON_PEER_UPDATE = "3"
35
- let ON_TRACK_UPDATE = "ON_TRACK_UPDATE"
36
- let ON_ROLE_CHANGE_REQUEST = "ON_ROLE_CHANGE_REQUEST"
37
- let ON_REMOVED_FROM_ROOM = "ON_REMOVED_FROM_ROOM"
38
- let ON_ERROR = "ON_ERROR"
39
- let ON_MESSAGE = "ON_MESSAGE"
40
- let ON_SPEAKER = "ON_SPEAKER"
41
- let RECONNECTING = "RECONNECTING"
42
- let RECONNECTED = "RECONNECTED"
43
- let ON_RTC_STATS = "ON_RTC_STATS"
44
- let ON_LOCAL_AUDIO_STATS = "ON_LOCAL_AUDIO_STATS"
45
- let ON_LOCAL_VIDEO_STATS = "ON_LOCAL_VIDEO_STATS"
46
- let ON_REMOTE_AUDIO_STATS = "ON_REMOTE_AUDIO_STATS"
47
- let ON_REMOTE_VIDEO_STATS = "ON_REMOTE_VIDEO_STATS"
28
+ private var sessionStore: HMSSessionStore?
29
+ private var sessionStoreChangeObservers = [String: NSObjectProtocol]()
48
30
 
49
31
  // MARK: - Setup
50
32
  init(data: NSDictionary?, delegate manager: HMSManager?, uid id: String) {
@@ -68,8 +50,8 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
68
50
  func preview(_ credentials: NSDictionary) {
69
51
 
70
52
  guard !previewInProgress else {
71
- if eventsEnableStatus[ON_ERROR] == true {
72
- delegate?.emitEvent(ON_ERROR, ["error": ["code": 5000, "description": "Preview is in progress", "isTerminal": false, "canRetry": true, "params": ["function": #function]], "id": id])
53
+ if eventsEnableStatus[HMSConstants.ON_ERROR] == true {
54
+ delegate?.emitEvent(HMSConstants.ON_ERROR, ["error": ["code": 5000, "description": "Preview is in progress", "isTerminal": false, "canRetry": true, "params": ["function": #function]] as [String: Any], "id": id])
73
55
  }
74
56
  return
75
57
  }
@@ -112,32 +94,30 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
112
94
  if let extractedRole = roleObj {
113
95
  hms?.preview(role: extractedRole, completion: { tracks, error in
114
96
  if error != nil {
115
- if eventsEnableStatus[ON_ERROR] == true {
116
- delegate?.emitEvent(ON_ERROR, ["error": HMSDecoder.getError(error), "id": id])
97
+ if eventsEnableStatus[HMSConstants.ON_ERROR] == true {
98
+ delegate?.emitEvent(HMSConstants.ON_ERROR, ["error": HMSDecoder.getError(error), "id": id])
117
99
  }
118
100
  reject?(error?.localizedDescription, error?.localizedDescription, nil)
119
101
  return
120
102
  }
121
- self.recentPreviewTracks = tracks
122
103
 
123
104
  let decodedTracks = HMSDecoder.getAllTracks(tracks ?? [])
124
105
 
125
- resolve?(["success": true, "tracks": decodedTracks])
106
+ resolve?(["success": true, "tracks": decodedTracks] as [String: Any])
126
107
  return
127
108
  })
128
109
  }
129
110
  }
130
111
 
131
112
  func cancelPreview() {
132
- self.recentPreviewTracks = []
133
113
  hms?.cancelPreview()
134
114
  }
135
115
 
136
116
  func join(_ credentials: NSDictionary) {
137
117
 
138
118
  guard !previewInProgress else {
139
- if eventsEnableStatus[ON_ERROR] == true {
140
- delegate?.emitEvent("ON_ERROR", ["error": ["code": 5000, "description": "Preview is in progress", "isTerminal": false, "canRetry": true, "params": ["function": #function]], "id": id])
119
+ if eventsEnableStatus[HMSConstants.ON_ERROR] == true {
120
+ delegate?.emitEvent(HMSConstants.ON_ERROR, ["error": ["code": 5000, "description": "Preview is in progress", "isTerminal": false, "canRetry": true, "params": ["function": #function]] as [String: Any], "id": id])
141
121
  }
142
122
  return
143
123
  }
@@ -244,27 +224,28 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
244
224
  reject?("Still in reconnecting stage", "Still in reconnecting stage", nil)
245
225
  } else {
246
226
  DispatchQueue.main.async { [weak self] in
247
- guard let strongSelf = self else { return }
248
- self?.config = nil
249
- self?.recentRoleChangeRequest = nil
250
- self?.systemBroadcastPicker = nil
251
- self?.preferredExtension = nil
252
- self?.stopScreenshareResolve = nil
253
- self?.startScreenshareResolve = nil
254
- self?.isScreenShared = false
255
- self?.rtcStatsAttached = false
256
- self?.networkQualityUpdatesAttached = false
257
- self?.hms?.leave({ success, error in
227
+ guard let strongSelf = self else {
228
+ print(#function, "Could not find reference to self while executing Room leave")
229
+ return
230
+ }
231
+
232
+ strongSelf.hms?.leave { [weak self] success, error in
233
+
234
+ guard let strongSelf = self else {
235
+ print(#function, "Could not find reference to self when callback is received while executing Room leave")
236
+ return
237
+ }
238
+
258
239
  if success {
259
- HMSDecoder.clearRestrictDataStates()
260
240
  resolve?(["success": success])
241
+ strongSelf.cleanup() // resetting states and doing data cleanup
261
242
  } else {
262
- if strongSelf.eventsEnableStatus[strongSelf.ON_ERROR] == true {
263
- strongSelf.delegate?.emitEvent(strongSelf.ON_ERROR, ["error": HMSDecoder.getError(error), "id": strongSelf.id])
243
+ if strongSelf.eventsEnableStatus[HMSConstants.ON_ERROR] == true {
244
+ strongSelf.delegate?.emitEvent(HMSConstants.ON_ERROR, ["error": HMSDecoder.getError(error), "id": strongSelf.id])
264
245
  }
265
246
  reject?("error in leave", "error in leave", nil)
266
247
  }
267
- })
248
+ }
268
249
  }
269
250
  }
270
251
  }
@@ -283,11 +264,11 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
283
264
  DispatchQueue.main.async { [weak self] in
284
265
  self?.hms?.sendBroadcastMessage(type: type, message: message, completion: { message, error in
285
266
  if error == nil {
286
- resolve?(["success": true, "data": ["sender": message?.sender?.name ?? "", "message": message?.message ?? "", "type": message?.type]])
267
+ resolve?(["success": true, "data": ["sender": message?.sender?.name ?? "", "message": message?.message ?? "", "type": message?.type]] as [String: Any])
287
268
  return
288
269
  } else {
289
- if self?.eventsEnableStatus["ON_ERROR"] == true {
290
- self?.delegate?.emitEvent("ON_ERROR", ["error": HMSDecoder.getError(error), "id": self?.id ?? "12345"])
270
+ if self?.eventsEnableStatus[HMSConstants.ON_ERROR] == true {
271
+ self?.delegate?.emitEvent(HMSConstants.ON_ERROR, ["error": HMSDecoder.getError(error), "id": self?.id ?? "12345"])
291
272
  }
292
273
  reject?(error?.localizedDescription, error?.localizedDescription, nil)
293
274
  return
@@ -311,11 +292,11 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
311
292
  let encodedTargetedRoles = HMSHelper.getRolesFromRoleNames(targetedRoles, roles: self?.hms?.roles)
312
293
  self?.hms?.sendGroupMessage(type: type, message: message, roles: encodedTargetedRoles, completion: { message, error in
313
294
  if error == nil {
314
- resolve?(["success": true, "data": ["sender": message?.sender?.name ?? "", "message": message?.message ?? "", "type": message?.type]])
295
+ resolve?(["success": true, "data": ["sender": message?.sender?.name ?? "", "message": message?.message ?? "", "type": message?.type]] as [String: Any])
315
296
  return
316
297
  } else {
317
- if self?.eventsEnableStatus["ON_ERROR"] == true {
318
- self?.delegate?.emitEvent("ON_ERROR", ["error": HMSDecoder.getError(error), "id": self?.id ?? "12345"])
298
+ if self?.eventsEnableStatus[HMSConstants.ON_ERROR] == true {
299
+ self?.delegate?.emitEvent(HMSConstants.ON_ERROR, ["error": HMSDecoder.getError(error), "id": self?.id ?? "12345"])
319
300
  }
320
301
  reject?(error?.localizedDescription, error?.localizedDescription, nil)
321
302
  return
@@ -339,11 +320,11 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
339
320
  guard let peer = HMSHelper.getRemotePeerFromPeerId(peerId, remotePeers: self?.hms?.remotePeers) else { return }
340
321
  self?.hms?.sendDirectMessage(type: type, message: message, peer: peer, completion: { message, error in
341
322
  if error == nil {
342
- resolve?(["success": true, "data": ["sender": message?.sender?.name ?? "", "message": message?.message ?? "", "type": message?.type]])
323
+ resolve?(["success": true, "data": ["sender": message?.sender?.name ?? "", "message": message?.message ?? "", "type": message?.type]] as [String: Any])
343
324
  return
344
325
  } else {
345
- if self?.eventsEnableStatus["ON_ERROR"] == true {
346
- self?.delegate?.emitEvent("ON_ERROR", ["error": HMSDecoder.getError(error), "id": self?.id ?? "12345"])
326
+ if self?.eventsEnableStatus[HMSConstants.ON_ERROR] == true {
327
+ self?.delegate?.emitEvent(HMSConstants.ON_ERROR, ["error": HMSDecoder.getError(error), "id": self?.id ?? "12345"])
347
328
  }
348
329
  reject?(error?.localizedDescription, error?.localizedDescription, nil)
349
330
  return
@@ -368,13 +349,12 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
368
349
  if success {
369
350
  resolve?(["success": success])
370
351
  } else {
371
- if self?.eventsEnableStatus["ON_ERROR"] == true {
372
- self?.delegate?.emitEvent("ON_ERROR", ["error": HMSDecoder.getError(error), "id": self?.id ?? "12345"])
352
+ if self?.eventsEnableStatus[HMSConstants.ON_ERROR] == true {
353
+ self?.delegate?.emitEvent(HMSConstants.ON_ERROR, ["error": HMSDecoder.getError(error), "id": self?.id ?? "12345"])
373
354
  }
374
355
  reject?(error?.localizedDescription, error?.localizedDescription, nil)
375
356
  }
376
357
  })
377
- self?.recentPreviewTracks = []
378
358
  self?.recentRoleChangeRequest = nil
379
359
  }
380
360
  }
@@ -401,8 +381,8 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
401
381
  if success {
402
382
  resolve?(["success": success])
403
383
  } else {
404
- if self?.eventsEnableStatus["ON_ERROR"] == true {
405
- self?.delegate?.emitEvent("ON_ERROR", ["error": HMSDecoder.getError(error), "id": self?.id ?? "12345"])
384
+ if self?.eventsEnableStatus[HMSConstants.ON_ERROR] == true {
385
+ self?.delegate?.emitEvent(HMSConstants.ON_ERROR, ["error": HMSDecoder.getError(error), "id": self?.id ?? "12345"])
406
386
  }
407
387
  reject?(error?.localizedDescription, error?.localizedDescription, nil)
408
388
  }
@@ -439,8 +419,8 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
439
419
  if success {
440
420
  resolve?(["success": success])
441
421
  } else {
442
- if self?.eventsEnableStatus["ON_ERROR"] == true {
443
- self?.delegate?.emitEvent("ON_ERROR", ["error": HMSDecoder.getError(error), "id": self?.id ?? "12345"])
422
+ if self?.eventsEnableStatus[HMSConstants.ON_ERROR] == true {
423
+ self?.delegate?.emitEvent(HMSConstants.ON_ERROR, ["error": HMSDecoder.getError(error), "id": self?.id ?? "12345"])
444
424
  }
445
425
  reject?(error?.localizedDescription, error?.localizedDescription, nil)
446
426
  }
@@ -472,8 +452,8 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
472
452
  if success {
473
453
  resolve?(["success": success])
474
454
  } else {
475
- if self?.eventsEnableStatus["ON_ERROR"] == true {
476
- self?.delegate?.emitEvent("ON_ERROR", ["error": HMSDecoder.getError(error), "id": self?.id ?? "12345"])
455
+ if self?.eventsEnableStatus[HMSConstants.ON_ERROR] == true {
456
+ self?.delegate?.emitEvent(HMSConstants.ON_ERROR, ["error": HMSDecoder.getError(error), "id": self?.id ?? "12345"])
477
457
  }
478
458
  reject?(error?.localizedDescription, error?.localizedDescription, nil)
479
459
  }
@@ -509,8 +489,8 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
509
489
  if success {
510
490
  resolve?(["success": success])
511
491
  } else {
512
- if self?.eventsEnableStatus["ON_ERROR"] == true {
513
- self?.delegate?.emitEvent("ON_ERROR", ["error": HMSDecoder.getError(error), "id": self?.id ?? "12345"])
492
+ if self?.eventsEnableStatus[HMSConstants.ON_ERROR] == true {
493
+ self?.delegate?.emitEvent(HMSConstants.ON_ERROR, ["error": HMSDecoder.getError(error), "id": self?.id ?? "12345"])
514
494
  }
515
495
  reject?(error?.localizedDescription, error?.localizedDescription, nil)
516
496
  }
@@ -535,8 +515,8 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
535
515
  guard let remotePeers = self?.hms?.remotePeers,
536
516
  let track = HMSHelper.getTrackFromTrackId(trackId, remotePeers)
537
517
  else {
538
- if strongSelf.eventsEnableStatus["ON_ERROR"] == true {
539
- strongSelf.delegate?.emitEvent("ON_ERROR", ["error": ["code": 6002, "description": "Track not found", "isTerminal": false, "canRetry": true, "params": ["function": #function]], "id": strongSelf.id])
518
+ if strongSelf.eventsEnableStatus[HMSConstants.ON_ERROR] == true {
519
+ strongSelf.delegate?.emitEvent(HMSConstants.ON_ERROR, ["error": ["code": 6002, "description": "Track not found", "isTerminal": false, "canRetry": true, "params": ["function": #function]] as [String: Any], "id": strongSelf.id])
540
520
  }
541
521
  reject?("Track not found", "Track not found", nil)
542
522
  return
@@ -575,8 +555,8 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
575
555
  if success {
576
556
  resolve?(["success": success])
577
557
  } else {
578
- if self?.eventsEnableStatus["ON_ERROR"] == true {
579
- self?.delegate?.emitEvent("ON_ERROR", ["error": HMSDecoder.getError(error), "id": self?.id ?? "12345"])
558
+ if self?.eventsEnableStatus[HMSConstants.ON_ERROR] == true {
559
+ self?.delegate?.emitEvent(HMSConstants.ON_ERROR, ["error": HMSDecoder.getError(error), "id": self?.id ?? "12345"])
580
560
  }
581
561
  reject?(error?.localizedDescription, error?.localizedDescription, nil)
582
562
  }
@@ -599,9 +579,10 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
599
579
  self?.hms?.endRoom(lock: lock, reason: reason, completion: { success, error in
600
580
  if success {
601
581
  resolve?(["success": success])
582
+ self?.cleanup() // resetting states and doing data cleanup
602
583
  } else {
603
- if self?.eventsEnableStatus["ON_ERROR"] == true {
604
- self?.delegate?.emitEvent("ON_ERROR", ["error": HMSDecoder.getError(error), "id": self?.id ?? "12345"])
584
+ if self?.eventsEnableStatus[HMSConstants.ON_ERROR] == true {
585
+ self?.delegate?.emitEvent(HMSConstants.ON_ERROR, ["error": HMSDecoder.getError(error), "id": self?.id ?? "12345"])
605
586
  }
606
587
  reject?(error?.localizedDescription, error?.localizedDescription, nil)
607
588
  }
@@ -681,8 +662,8 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
681
662
  resolve?(["success": success])
682
663
  return
683
664
  } else {
684
- if self.eventsEnableStatus["ON_ERROR"] == true {
685
- self.delegate?.emitEvent(self.ON_ERROR, ["error": HMSDecoder.getError(error), "id": self.id])
665
+ if self.eventsEnableStatus[HMSConstants.ON_ERROR] == true {
666
+ self.delegate?.emitEvent(HMSConstants.ON_ERROR, ["error": HMSDecoder.getError(error), "id": self.id])
686
667
  }
687
668
  reject?(error?.localizedDescription, error?.localizedDescription, nil)
688
669
  return
@@ -707,8 +688,8 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
707
688
 
708
689
  if remoteAudioTrack != nil {
709
690
  remoteAudioTrack?.setVolume(volume)
710
- } else if strongSelf.eventsEnableStatus["ON_ERROR"] == true {
711
- strongSelf.delegate?.emitEvent("ON_ERROR", ["error": ["code": 6002, "description": "Track not found", "isTerminal": false, "canRetry": true, "params": ["function": #function]], "id": strongSelf.id])
691
+ } else if strongSelf.eventsEnableStatus[HMSConstants.ON_ERROR] == true {
692
+ strongSelf.delegate?.emitEvent(HMSConstants.ON_ERROR, ["error": ["code": 6002, "description": "Track not found", "isTerminal": false, "canRetry": true, "params": ["function": #function]] as [String: Any], "id": strongSelf.id])
712
693
  }
713
694
  }
714
695
  }
@@ -729,8 +710,8 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
729
710
  if let meetLink = URL(string: meetingString) {
730
711
  meetingUrl = meetLink
731
712
  } else {
732
- if eventsEnableStatus[ON_ERROR] == true {
733
- delegate?.emitEvent(ON_ERROR, ["error": ["code": 6002, "description": "Invalid meeting url passed", "isTerminal": false, "canRetry": true, "params": ["function": #function]], "id": id])
713
+ if eventsEnableStatus[HMSConstants.ON_ERROR] == true {
714
+ delegate?.emitEvent(HMSConstants.ON_ERROR, ["error": ["code": 6002, "description": "Invalid meeting url passed", "isTerminal": false, "canRetry": true, "params": ["function": #function]] as [String: Any], "id": id])
734
715
  }
735
716
  reject?("Invalid meeting url passed", "Invalid meeting url passed", nil)
736
717
  }
@@ -743,8 +724,8 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
743
724
  resolve?(["success": success])
744
725
  return
745
726
  } else {
746
- if self.eventsEnableStatus[self.ON_ERROR] == true {
747
- self.delegate?.emitEvent(self.ON_ERROR, ["error": HMSDecoder.getError(error), "id": self.id])
727
+ if self.eventsEnableStatus[HMSConstants.ON_ERROR] == true {
728
+ self.delegate?.emitEvent(HMSConstants.ON_ERROR, ["error": HMSDecoder.getError(error), "id": self.id])
748
729
  }
749
730
  reject?(error?.localizedDescription, error?.localizedDescription, nil)
750
731
  return
@@ -758,8 +739,8 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
758
739
  resolve?(["success": success])
759
740
  return
760
741
  } else {
761
- if self.eventsEnableStatus[self.ON_ERROR] == true {
762
- self.delegate?.emitEvent(self.ON_ERROR, ["error": HMSDecoder.getError(error), "id": self.id])
742
+ if self.eventsEnableStatus[HMSConstants.ON_ERROR] == true {
743
+ self.delegate?.emitEvent(HMSConstants.ON_ERROR, ["error": HMSDecoder.getError(error), "id": self.id])
763
744
  }
764
745
  reject?(error?.localizedDescription, error?.localizedDescription, nil)
765
746
  return
@@ -780,8 +761,8 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
780
761
  resolve?(["success": success])
781
762
  return
782
763
  } else {
783
- if self.eventsEnableStatus[self.ON_ERROR] == true {
784
- self.delegate?.emitEvent(self.ON_ERROR, ["error": HMSDecoder.getError(error), "id": self.id])
764
+ if self.eventsEnableStatus[HMSConstants.ON_ERROR] == true {
765
+ self.delegate?.emitEvent(HMSConstants.ON_ERROR, ["error": HMSDecoder.getError(error), "id": self.id])
785
766
  }
786
767
  reject?(error?.localizedDescription, error?.localizedDescription, nil)
787
768
  return
@@ -795,8 +776,8 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
795
776
  resolve?(["success": success])
796
777
  return
797
778
  } else {
798
- if self.eventsEnableStatus[self.ON_ERROR] == true {
799
- self.delegate?.emitEvent(self.ON_ERROR, ["error": HMSDecoder.getError(error), "id": self.id])
779
+ if self.eventsEnableStatus[HMSConstants.ON_ERROR] == true {
780
+ self.delegate?.emitEvent(HMSConstants.ON_ERROR, ["error": HMSDecoder.getError(error), "id": self.id])
800
781
  }
801
782
  reject?(error?.localizedDescription, error?.localizedDescription, nil)
802
783
  return
@@ -817,8 +798,8 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
817
798
  if success {
818
799
  resolve?(["success": success])
819
800
  } else {
820
- if self.eventsEnableStatus[self.ON_ERROR] == true {
821
- self.delegate?.emitEvent(self.ON_ERROR, ["error": HMSDecoder.getError(error), "id": self.id])
801
+ if self.eventsEnableStatus[HMSConstants.ON_ERROR] == true {
802
+ self.delegate?.emitEvent(HMSConstants.ON_ERROR, ["error": HMSDecoder.getError(error), "id": self.id])
822
803
  }
823
804
  reject?(error?.localizedDescription, error?.localizedDescription, nil)
824
805
  }
@@ -859,18 +840,10 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
859
840
  }
860
841
  }
861
842
 
862
- func enableRTCStats() {
863
- rtcStatsAttached = true
864
- }
865
-
866
- func disableRTCStats() {
867
- rtcStatsAttached = false
868
- }
869
-
870
843
  func startScreenshare(_ resolve: RCTPromiseResolveBlock?, _ reject: RCTPromiseRejectBlock?) {
871
844
  guard let preferredExtension = preferredExtension else {
872
- if eventsEnableStatus[ON_ERROR] == true {
873
- delegate?.emitEvent(ON_ERROR, ["error": ["code": 6002, "description": "Could not start screen share, preferredExtension not passed in Build method", "isTerminal": false, "canRetry": true, "params": ["function": #function]], "id": id])
845
+ if eventsEnableStatus[HMSConstants.ON_ERROR] == true {
846
+ delegate?.emitEvent(HMSConstants.ON_ERROR, ["error": ["code": 6002, "description": "Could not start screen share, preferredExtension not passed in Build method", "isTerminal": false, "canRetry": true, "params": ["function": #function]] as [String: Any], "id": id])
874
847
  }
875
848
  reject?("Could not start screen share, preferredExtension not passed in Build method", "Could not start screen share, preferredExtension not passed in Build method", nil)
876
849
  return
@@ -893,8 +866,8 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
893
866
 
894
867
  func stopScreenshare(_ resolve: RCTPromiseResolveBlock?, _ reject: RCTPromiseRejectBlock?) {
895
868
  guard let preferredExtension = preferredExtension else {
896
- if eventsEnableStatus[ON_ERROR] == true {
897
- delegate?.emitEvent(ON_ERROR, ["error": ["code": 6002, "description": "Could not start screen share, preferredExtension not passed in Build method", "isTerminal": false, "canRetry": true, "params": ["function": #function]], "id": id])
869
+ if eventsEnableStatus[HMSConstants.ON_ERROR] == true {
870
+ delegate?.emitEvent(HMSConstants.ON_ERROR, ["error": ["code": 6002, "description": "Could not start screen share, preferredExtension not passed in Build method", "isTerminal": false, "canRetry": true, "params": ["function": #function]] as [String: Any], "id": id])
898
871
  }
899
872
  reject?("Could not start screen share, preferredExtension not passed in Build method", "Could not start screen share, preferredExtension not passed in Build method", nil)
900
873
  return
@@ -938,20 +911,20 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
938
911
  try audioFilePlayerNode.play(fileUrl: url, loops: loops, interrupts: interrupts)
939
912
  resolve?(["success": true])
940
913
  } catch {
941
- if eventsEnableStatus[ON_ERROR] == true {
942
- delegate?.emitEvent(ON_ERROR, ["error": ["code": 6002, "description": error.localizedDescription, "isTerminal": false, "canRetry": true, "params": ["function": #function]], "id": id])
914
+ if eventsEnableStatus[HMSConstants.ON_ERROR] == true {
915
+ delegate?.emitEvent(HMSConstants.ON_ERROR, ["error": ["code": 6002, "description": error.localizedDescription, "isTerminal": false, "canRetry": true, "params": ["function": #function]] as [String: Any], "id": id])
943
916
  }
944
917
  reject?(error.localizedDescription, error.localizedDescription, nil)
945
918
  }
946
919
  } else {
947
- if eventsEnableStatus[ON_ERROR] == true {
948
- delegate?.emitEvent(ON_ERROR, ["error": ["code": 6002, "description": "Incorrect url", "isTerminal": false, "canRetry": true, "params": ["function": #function]], "id": id])
920
+ if eventsEnableStatus[HMSConstants.ON_ERROR] == true {
921
+ delegate?.emitEvent(HMSConstants.ON_ERROR, ["error": ["code": 6002, "description": "Incorrect url", "isTerminal": false, "canRetry": true, "params": ["function": #function]] as [String: Any], "id": id])
949
922
  }
950
923
  reject?("Incorrect URL", "Incorrect URL", nil)
951
924
  }
952
925
  } else {
953
- if eventsEnableStatus[ON_ERROR] == true {
954
- delegate?.emitEvent(ON_ERROR, ["error": ["code": 6002, "description": "AudioFilePlayerNode not found", "isTerminal": false, "canRetry": true, "params": ["function": #function]], "id": id])
926
+ if eventsEnableStatus[HMSConstants.ON_ERROR] == true {
927
+ delegate?.emitEvent(HMSConstants.ON_ERROR, ["error": ["code": 6002, "description": "AudioFilePlayerNode not found", "isTerminal": false, "canRetry": true, "params": ["function": #function]] as [String: Any], "id": id])
955
928
  }
956
929
  reject?("AudioFilePlayerNode not found", "AudioFilePlayerNode not found", nil)
957
930
  }
@@ -986,8 +959,8 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
986
959
  }
987
960
  if let audioFilePlayerNode = playerNode as? HMSAudioFilePlayerNode {
988
961
  audioFilePlayerNode.stop()
989
- } else if eventsEnableStatus[ON_ERROR] == true {
990
- delegate?.emitEvent(ON_ERROR, ["error": ["code": 6002, "description": "AudioFilePlayerNode not found", "isTerminal": false, "canRetry": true, "params": ["function": #function]], "id": id])
962
+ } else if eventsEnableStatus[HMSConstants.ON_ERROR] == true {
963
+ delegate?.emitEvent(HMSConstants.ON_ERROR, ["error": ["code": 6002, "description": "AudioFilePlayerNode not found", "isTerminal": false, "canRetry": true, "params": ["function": #function]] as [String: Any], "id": id])
991
964
  }
992
965
  }
993
966
 
@@ -1004,12 +977,12 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
1004
977
  do {
1005
978
  try audioFilePlayerNode.resume()
1006
979
  } catch {
1007
- if eventsEnableStatus[ON_ERROR] == true {
1008
- delegate?.emitEvent(ON_ERROR, ["error": ["code": 6002, "description": error.localizedDescription, "isTerminal": false, "canRetry": true, "params": ["function": #function]], "id": id])
980
+ if eventsEnableStatus[HMSConstants.ON_ERROR] == true {
981
+ delegate?.emitEvent(HMSConstants.ON_ERROR, ["error": ["code": 6002, "description": error.localizedDescription, "isTerminal": false, "canRetry": true, "params": ["function": #function]] as [String: Any], "id": id])
1009
982
  }
1010
983
  }
1011
- } else if eventsEnableStatus[ON_ERROR] == true {
1012
- delegate?.emitEvent(ON_ERROR, ["error": ["code": 6002, "description": "AudioFilePlayerNode not found", "isTerminal": false, "canRetry": true, "params": ["function": #function]], "id": id])
984
+ } else if eventsEnableStatus[HMSConstants.ON_ERROR] == true {
985
+ delegate?.emitEvent(HMSConstants.ON_ERROR, ["error": ["code": 6002, "description": "AudioFilePlayerNode not found", "isTerminal": false, "canRetry": true, "params": ["function": #function]] as [String: Any], "id": id])
1013
986
  }
1014
987
  }
1015
988
 
@@ -1024,8 +997,8 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
1024
997
  }
1025
998
  if let audioFilePlayerNode = playerNode as? HMSAudioFilePlayerNode {
1026
999
  audioFilePlayerNode.pause()
1027
- } else if eventsEnableStatus[ON_ERROR] == true {
1028
- delegate?.emitEvent(ON_ERROR, ["error": ["code": 6002, "description": "AudioFilePlayerNode not found", "isTerminal": false, "canRetry": true, "params": ["function": #function]], "id": id])
1000
+ } else if eventsEnableStatus[HMSConstants.ON_ERROR] == true {
1001
+ delegate?.emitEvent(HMSConstants.ON_ERROR, ["error": ["code": 6002, "description": "AudioFilePlayerNode not found", "isTerminal": false, "canRetry": true, "params": ["function": #function]] as [String: Any], "id": id])
1029
1002
  }
1030
1003
  }
1031
1004
 
@@ -1042,8 +1015,8 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
1042
1015
  if let audioFilePlayerNode = playerNode as? HMSAudioFilePlayerNode {
1043
1016
  resolve?(audioFilePlayerNode.isPlaying)
1044
1017
  } else {
1045
- if eventsEnableStatus[ON_ERROR] == true {
1046
- delegate?.emitEvent(ON_ERROR, ["error": ["code": 6002, "description": "AudioFilePlayerNode not found", "isTerminal": false, "canRetry": true, "params": ["function": #function]], "id": id])
1018
+ if eventsEnableStatus[HMSConstants.ON_ERROR] == true {
1019
+ delegate?.emitEvent(HMSConstants.ON_ERROR, ["error": ["code": 6002, "description": "AudioFilePlayerNode not found", "isTerminal": false, "canRetry": true, "params": ["function": #function]] as [String: Any], "id": id])
1047
1020
  }
1048
1021
  reject?("AudioFilePlayerNode not found", "AudioFilePlayerNode not found", nil)
1049
1022
  }
@@ -1062,8 +1035,8 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
1062
1035
  if let audioFilePlayerNode = playerNode as? HMSAudioFilePlayerNode {
1063
1036
  resolve?(audioFilePlayerNode.currentTime)
1064
1037
  } else {
1065
- if eventsEnableStatus[ON_ERROR] == true {
1066
- delegate?.emitEvent(ON_ERROR, ["error": ["code": 6002, "description": "AudioFilePlayerNode not found", "isTerminal": false, "canRetry": true, "params": ["function": #function]], "id": id])
1038
+ if eventsEnableStatus[HMSConstants.ON_ERROR] == true {
1039
+ delegate?.emitEvent(HMSConstants.ON_ERROR, ["error": ["code": 6002, "description": "AudioFilePlayerNode not found", "isTerminal": false, "canRetry": true, "params": ["function": #function]] as [String: Any] as [String: Any], "id": id])
1067
1040
  }
1068
1041
  reject?("AudioFilePlayerNode not found", "AudioFilePlayerNode not found", nil)
1069
1042
  }
@@ -1082,8 +1055,8 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
1082
1055
  if let audioFilePlayerNode = playerNode as? HMSAudioFilePlayerNode {
1083
1056
  resolve?(audioFilePlayerNode.duration)
1084
1057
  } else {
1085
- if eventsEnableStatus[ON_ERROR] == true {
1086
- delegate?.emitEvent(ON_ERROR, ["error": ["code": 6002, "description": "AudioFilePlayerNode not found", "isTerminal": false, "canRetry": true, "params": ["function": #function]], "id": id])
1058
+ if eventsEnableStatus[HMSConstants.ON_ERROR] == true {
1059
+ delegate?.emitEvent(HMSConstants.ON_ERROR, ["error": ["code": 6002, "description": "AudioFilePlayerNode not found", "isTerminal": false, "canRetry": true, "params": ["function": #function]] as [String: Any], "id": id])
1087
1060
  }
1088
1061
  reject?("AudioFilePlayerNode not found", "AudioFilePlayerNode not found", nil)
1089
1062
  }
@@ -1100,14 +1073,32 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
1100
1073
  func setSessionMetaData(_ data: NSDictionary, _ resolve: RCTPromiseResolveBlock?, _ reject: RCTPromiseRejectBlock?) {
1101
1074
  let metaData = data.value(forKey: "sessionMetaData") as? String ?? ""
1102
1075
 
1103
- hms?.setSessionMetadata(metaData) { success, error in
1104
- if success {
1105
- resolve?(["success": success])
1106
- } else {
1107
- if self.eventsEnableStatus[self.ON_ERROR] == true {
1108
- self.delegate?.emitEvent(self.ON_ERROR, ["error": HMSDecoder.getError(error), "id": self.id])
1076
+ DispatchQueue.main.async { [weak self] in
1077
+
1078
+ guard let self = self else {
1079
+ let errorMessage = "\(#function) Unexpectedly encountered self as null"
1080
+ self?.emitRequiredKeysError(errorMessage)
1081
+ reject?(errorMessage, errorMessage, nil)
1082
+ return
1083
+ }
1084
+
1085
+ self.hms?.setSessionMetadata(metaData) { [weak self] success, error in
1086
+
1087
+ guard let self = self else {
1088
+ let errorMessage = "\(#function) Unexpectedly encountered self as null"
1089
+ self?.emitRequiredKeysError(errorMessage)
1090
+ reject?(errorMessage, errorMessage, nil)
1091
+ return
1092
+ }
1093
+
1094
+ if success {
1095
+ resolve?(["success": success])
1096
+ } else {
1097
+ if self.eventsEnableStatus[HMSConstants.ON_ERROR] == true {
1098
+ self.delegate?.emitEvent(HMSConstants.ON_ERROR, ["error": HMSDecoder.getError(error), "id": self.id])
1099
+ }
1100
+ reject?(error?.localizedDescription, error?.localizedDescription, nil)
1109
1101
  }
1110
- reject?(error?.localizedDescription, error?.localizedDescription, nil)
1111
1102
  }
1112
1103
  }
1113
1104
  }
@@ -1121,7 +1112,7 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
1121
1112
  }
1122
1113
 
1123
1114
  eventsEnableStatus[eventType] = true
1124
- resolve?(["success": true, "message": "function call executed successfully"])
1115
+ resolve?(["success": true, "message": "function call executed successfully"] as [String: Any])
1125
1116
  }
1126
1117
 
1127
1118
  func disableEvent(_ data: NSDictionary, _ resolve: RCTPromiseResolveBlock?, _ reject: RCTPromiseRejectBlock?) {
@@ -1133,7 +1124,7 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
1133
1124
  }
1134
1125
 
1135
1126
  eventsEnableStatus[eventType] = false
1136
- resolve?(["success": true, "message": "function call executed successfully"])
1127
+ resolve?(["success": true, "message": "function call executed successfully"] as [String: Any])
1137
1128
  }
1138
1129
 
1139
1130
  func restrictData(_ data: NSDictionary) {
@@ -1172,14 +1163,31 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
1172
1163
  }
1173
1164
 
1174
1165
  func getSessionMetaData(_ resolve: RCTPromiseResolveBlock?, _ reject: RCTPromiseRejectBlock?) {
1175
- hms?.getSessionMetadata { result, error in
1176
- if error != nil {
1177
- if self.eventsEnableStatus[self.ON_ERROR] == true {
1178
- self.delegate?.emitEvent(self.ON_ERROR, ["error": HMSDecoder.getError(error), "id": self.id])
1166
+
1167
+ DispatchQueue.main.async { [weak self] in
1168
+
1169
+ guard let self = self else {
1170
+ let errorMessage = "\(#function) Unexpectedly encountered self as null"
1171
+ self?.emitRequiredKeysError(errorMessage)
1172
+ reject?(errorMessage, errorMessage, nil)
1173
+ return
1174
+ }
1175
+
1176
+ self.hms?.getSessionMetadata { [weak self] result, error in
1177
+
1178
+ guard let self = self else {
1179
+ let errorMessage = "\(#function) Unexpectedly encountered self as null"
1180
+ self?.emitRequiredKeysError(errorMessage)
1181
+ reject?(errorMessage, errorMessage, nil)
1182
+ return
1183
+ }
1184
+
1185
+ if error != nil {
1186
+ self.delegate?.emitEvent(HMSConstants.ON_ERROR, ["error": HMSDecoder.getError(error), "id": self.id])
1187
+ reject?(error?.localizedDescription, error?.localizedDescription, nil)
1188
+ } else {
1189
+ resolve?(result)
1179
1190
  }
1180
- reject?(error?.localizedDescription, error?.localizedDescription, nil)
1181
- } else {
1182
- resolve?(result)
1183
1191
  }
1184
1192
  }
1185
1193
  }
@@ -1289,29 +1297,79 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
1289
1297
  }
1290
1298
  }
1291
1299
 
1300
+ func getRemoteVideoTrackFromTrackId(_ data: NSDictionary, _ resolve: RCTPromiseResolveBlock?, _ reject: RCTPromiseRejectBlock?) {
1301
+
1302
+ guard let trackId = data.value(forKey: "trackId") as? String
1303
+ else {
1304
+ let errorMessage = "\(#function) " + HMSHelper.getUnavailableRequiredKey(data, ["trackId"])
1305
+ emitRequiredKeysError(errorMessage)
1306
+ reject?(errorMessage, errorMessage, nil)
1307
+ return
1308
+ }
1309
+
1310
+ DispatchQueue.main.async { [weak self] in
1311
+
1312
+ guard let self = self,
1313
+ let remotePeers = self.hms?.remotePeers,
1314
+ let remoteVideoTrack = HMSHelper.getRemoteVideoTrackFromTrackId(trackId, remotePeers)
1315
+ else {
1316
+ let errorMessage = "\(#function) " + "TRACK_NOT_FOUND"
1317
+ self?.emitRequiredKeysError(errorMessage)
1318
+ reject?(errorMessage, errorMessage, nil)
1319
+ return
1320
+ }
1321
+
1322
+ resolve?(HMSDecoder.getHMSRemoteVideoTrack(remoteVideoTrack))
1323
+ }
1324
+ }
1325
+
1326
+ func getRemoteAudioTrackFromTrackId(_ data: NSDictionary, _ resolve: RCTPromiseResolveBlock?, _ reject: RCTPromiseRejectBlock?) {
1327
+ guard let trackId = data.value(forKey: "trackId") as? String
1328
+ else {
1329
+ let errorMessage = "\(#function) " + HMSHelper.getUnavailableRequiredKey(data, ["trackId"])
1330
+ emitRequiredKeysError(errorMessage)
1331
+ reject?(errorMessage, errorMessage, nil)
1332
+ return
1333
+ }
1334
+
1335
+ DispatchQueue.main.async { [weak self] in
1336
+
1337
+ guard let self = self,
1338
+ let remotePeers = self.hms?.remotePeers,
1339
+ let remoteAudioTrack = HMSHelper.getRemoteAudioTrackFromTrackId(trackId, remotePeers)
1340
+ else {
1341
+ let errorMessage = "\(#function) " + "TRACK_NOT_FOUND"
1342
+ self?.emitRequiredKeysError(errorMessage)
1343
+ reject?(errorMessage, errorMessage, nil)
1344
+ return
1345
+ }
1346
+
1347
+ resolve?(HMSDecoder.getHMSRemoteAudioTrack(remoteAudioTrack))
1348
+ }
1349
+ }
1350
+
1292
1351
  // MARK: - HMS SDK Delegate Callbacks
1293
1352
  func on(join room: HMSRoom) {
1294
- self.recentPreviewTracks = []
1295
- if eventsEnableStatus[ON_JOIN] != true {
1353
+ if eventsEnableStatus[HMSConstants.ON_JOIN] != true {
1296
1354
  return
1297
1355
  }
1298
1356
  let roomData = HMSDecoder.getHmsRoomSubset(room)
1299
- self.delegate?.emitEvent(ON_JOIN, ["event": ON_JOIN, "id": self.id, "room": roomData])
1357
+ self.delegate?.emitEvent(HMSConstants.ON_JOIN, ["event": HMSConstants.ON_JOIN, "id": self.id, "room": roomData])
1300
1358
  }
1301
1359
 
1302
1360
  func onPreview(room: HMSRoom, localTracks: [HMSTrack]) {
1303
1361
  previewInProgress = false
1304
- if eventsEnableStatus[ON_PREVIEW] != true {
1362
+ if eventsEnableStatus[HMSConstants.ON_PREVIEW] != true {
1305
1363
  return
1306
1364
  }
1307
1365
  let previewTracks = HMSDecoder.getPreviewTracks(localTracks)
1308
1366
  let hmsRoom = HMSDecoder.getHmsRoomSubset(room)
1309
1367
 
1310
- self.delegate?.emitEvent(ON_PREVIEW, ["event": ON_PREVIEW, "id": self.id, "room": hmsRoom, "previewTracks": previewTracks])
1368
+ self.delegate?.emitEvent(HMSConstants.ON_PREVIEW, ["event": HMSConstants.ON_PREVIEW, "id": self.id, "room": hmsRoom, "previewTracks": previewTracks])
1311
1369
  }
1312
1370
 
1313
1371
  func on(room: HMSRoom, update: HMSRoomUpdate) {
1314
- if eventsEnableStatus[ON_ROOM_UPDATE] != true {
1372
+ if eventsEnableStatus[HMSConstants.ON_ROOM_UPDATE] != true {
1315
1373
  return
1316
1374
  }
1317
1375
  if update == .metaDataUpdated || update == .roomTypeChanged {
@@ -1321,11 +1379,11 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
1321
1379
  let roomData = HMSDecoder.getHmsRoomSubset(room, update)
1322
1380
  let type = getString(from: update)
1323
1381
 
1324
- self.delegate?.emitEvent(ON_ROOM_UPDATE, ["event": ON_ROOM_UPDATE, "id": self.id, "type": type, "room": roomData])
1382
+ self.delegate?.emitEvent(HMSConstants.ON_ROOM_UPDATE, ["event": HMSConstants.ON_ROOM_UPDATE, "id": self.id, "type": type, "room": roomData])
1325
1383
  }
1326
1384
 
1327
1385
  func on(peer: HMSPeer, update: HMSPeerUpdate) {
1328
- if eventsEnableStatus[ON_PEER_UPDATE] != true {
1386
+ if eventsEnableStatus[HMSConstants.ON_PEER_UPDATE] != true {
1329
1387
  return
1330
1388
  }
1331
1389
  let type = getString(from: update)
@@ -1335,7 +1393,7 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
1335
1393
  return
1336
1394
  }
1337
1395
 
1338
- self.delegate?.emitEvent(ON_PEER_UPDATE, hmsPeer)
1396
+ self.delegate?.emitEvent(HMSConstants.ON_PEER_UPDATE, hmsPeer)
1339
1397
  }
1340
1398
 
1341
1399
  func on(track: HMSTrack, update: HMSTrackUpdate, for peer: HMSPeer) {
@@ -1351,7 +1409,7 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
1351
1409
  }
1352
1410
  }
1353
1411
 
1354
- if eventsEnableStatus[ON_TRACK_UPDATE] != true {
1412
+ if eventsEnableStatus[HMSConstants.ON_TRACK_UPDATE] != true {
1355
1413
  return
1356
1414
  }
1357
1415
 
@@ -1359,73 +1417,75 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
1359
1417
  let hmsPeer = HMSDecoder.getHmsPeerSubset(peer)
1360
1418
  let hmsTrack = HMSDecoder.getHmsTrack(track)
1361
1419
 
1362
- self.delegate?.emitEvent(ON_TRACK_UPDATE, ["event": ON_TRACK_UPDATE, "id": self.id, "type": type, "peer": hmsPeer, "track": hmsTrack])
1420
+ self.delegate?.emitEvent(HMSConstants.ON_TRACK_UPDATE, ["event": HMSConstants.ON_TRACK_UPDATE, "id": self.id, "type": type, "peer": hmsPeer, "track": hmsTrack])
1363
1421
  }
1364
1422
 
1365
1423
  func on(error: Error) {
1366
1424
  if previewInProgress { previewInProgress = false }
1367
- if eventsEnableStatus[ON_ERROR] != true {
1425
+ if eventsEnableStatus[HMSConstants.ON_ERROR] != true {
1368
1426
  return
1369
1427
  }
1370
- self.delegate?.emitEvent(ON_ERROR, ["error": HMSDecoder.getError(error), "id": id])
1428
+ self.delegate?.emitEvent(HMSConstants.ON_ERROR, ["error": HMSDecoder.getError(error), "id": id])
1371
1429
  }
1372
1430
 
1373
1431
  func on(message: HMSMessage) {
1374
- if eventsEnableStatus[ON_MESSAGE] != true {
1432
+ if eventsEnableStatus[HMSConstants.ON_MESSAGE] != true {
1375
1433
  return
1376
1434
  }
1377
- self.delegate?.emitEvent(ON_MESSAGE, ["event": ON_MESSAGE, "id": self.id, "sender": HMSDecoder.getHmsPeerSubset(message.sender), "recipient": HMSDecoder.getHmsMessageRecipient(message.recipient), "time": message.time.timeIntervalSince1970 * 1000, "message": message.message, "type": message.type])
1435
+ self.delegate?.emitEvent(HMSConstants.ON_MESSAGE, ["event": HMSConstants.ON_MESSAGE, "id": self.id, "sender": HMSDecoder.getHmsPeerSubset(message.sender), "recipient": HMSDecoder.getHmsMessageRecipient(message.recipient), "time": message.time.timeIntervalSince1970 * 1000, "message": message.message, "type": message.type])
1378
1436
  }
1379
1437
 
1380
1438
  func on(updated speakers: [HMSSpeaker]) {
1381
- if eventsEnableStatus[ON_SPEAKER] != true {
1439
+ if eventsEnableStatus[HMSConstants.ON_SPEAKER] != true {
1382
1440
  return
1383
1441
  }
1384
1442
  var speakerPeerIds: [[String: Any]] = []
1385
1443
  for speaker in speakers {
1386
1444
  speakerPeerIds.append(["peer": HMSDecoder.getHmsPeerSubset(speaker.peer), "level": speaker.level, "track": HMSDecoder.getHmsTrack(speaker.track)])
1387
1445
  }
1388
- self.delegate?.emitEvent(ON_SPEAKER, ["event": ON_SPEAKER, "id": self.id, "speakers": speakerPeerIds])
1446
+ self.delegate?.emitEvent(HMSConstants.ON_SPEAKER, ["event": HMSConstants.ON_SPEAKER, "id": self.id, "speakers": speakerPeerIds])
1389
1447
  }
1390
1448
 
1391
1449
  func onReconnecting() {
1392
1450
  reconnectingStage = true
1393
- if eventsEnableStatus[RECONNECTING] != true {
1451
+ if eventsEnableStatus[HMSConstants.RECONNECTING] != true {
1394
1452
  return
1395
1453
  }
1396
- self.delegate?.emitEvent(RECONNECTING, ["event": RECONNECTING, "error": ["code": 1003, "description": "Network connection lost ", "isTerminal": false, "canRetry": true], "id": self.id ])
1454
+ self.delegate?.emitEvent(HMSConstants.RECONNECTING, ["event": HMSConstants.RECONNECTING, "error": ["code": 1003, "description": "Network connection lost ", "isTerminal": false, "canRetry": true] as [String: Any], "id": self.id ])
1397
1455
  }
1398
1456
 
1399
1457
  func onReconnected() {
1400
1458
  reconnectingStage = false
1401
- if eventsEnableStatus[RECONNECTED] != true {
1459
+ if eventsEnableStatus[HMSConstants.RECONNECTED] != true {
1402
1460
  return
1403
1461
  }
1404
- self.delegate?.emitEvent(RECONNECTED, ["event": RECONNECTED, "id": self.id ])
1462
+ self.delegate?.emitEvent(HMSConstants.RECONNECTED, ["event": HMSConstants.RECONNECTED, "id": self.id ])
1405
1463
  }
1406
1464
 
1407
1465
  func on(roleChangeRequest: HMSRoleChangeRequest) {
1408
1466
  recentRoleChangeRequest = roleChangeRequest
1409
- if eventsEnableStatus[ON_ROLE_CHANGE_REQUEST] != true {
1467
+ if eventsEnableStatus[HMSConstants.ON_ROLE_CHANGE_REQUEST] != true {
1410
1468
  return
1411
1469
  }
1412
1470
  let decodedRoleChangeRequest = HMSDecoder.getHmsRoleChangeRequest(roleChangeRequest, self.id)
1413
- self.delegate?.emitEvent(ON_ROLE_CHANGE_REQUEST, decodedRoleChangeRequest)
1471
+ self.delegate?.emitEvent(HMSConstants.ON_ROLE_CHANGE_REQUEST, decodedRoleChangeRequest)
1414
1472
  }
1415
1473
 
1416
1474
  func on(changeTrackStateRequest: HMSChangeTrackStateRequest) {
1417
- if eventsEnableStatus["ON_CHANGE_TRACK_STATE_REQUEST"] != true {
1475
+ if eventsEnableStatus[HMSConstants.ON_CHANGE_TRACK_STATE_REQUEST] != true {
1418
1476
  return
1419
1477
  }
1420
1478
  let decodedChangeTrackStateRequest = HMSDecoder.getHmsChangeTrackStateRequest(changeTrackStateRequest, id)
1421
- delegate?.emitEvent("ON_CHANGE_TRACK_STATE_REQUEST", decodedChangeTrackStateRequest)
1479
+ delegate?.emitEvent(HMSConstants.ON_CHANGE_TRACK_STATE_REQUEST, decodedChangeTrackStateRequest)
1422
1480
  }
1423
1481
 
1424
1482
  func on(removedFromRoom notification: HMSRemovedFromRoomNotification) {
1425
- HMSDecoder.clearRestrictDataStates()
1426
- if eventsEnableStatus[ON_REMOVED_FROM_ROOM] != true {
1483
+
1484
+ if eventsEnableStatus[HMSConstants.ON_REMOVED_FROM_ROOM] != true {
1485
+ self.cleanup() // resetting states and doing data cleanup
1427
1486
  return
1428
1487
  }
1488
+
1429
1489
  let requestedBy = notification.requestedBy as HMSPeer?
1430
1490
  var decodedRequestedBy: [String: Any]?
1431
1491
  if let requested = requestedBy {
@@ -1433,80 +1493,439 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
1433
1493
  }
1434
1494
  let reason = notification.reason
1435
1495
  let roomEnded = notification.roomEnded
1436
- self.delegate?.emitEvent(ON_REMOVED_FROM_ROOM, ["event": ON_REMOVED_FROM_ROOM, "id": self.id, "requestedBy": decodedRequestedBy as Any, "reason": reason, "roomEnded": roomEnded ])
1496
+ self.delegate?.emitEvent(HMSConstants.ON_REMOVED_FROM_ROOM, ["event": HMSConstants.ON_REMOVED_FROM_ROOM, "id": self.id, "requestedBy": decodedRequestedBy as Any, "reason": reason, "roomEnded": roomEnded ])
1497
+
1498
+ self.cleanup() // resetting states and doing data cleanup
1437
1499
  }
1438
1500
 
1439
- func on(rtcStats: HMSRTCStatsReport) {
1440
- if eventsEnableStatus[ON_RTC_STATS] != true {
1501
+ func on(sessionStoreAvailable store: HMSSessionStore) {
1502
+ self.sessionStore = store
1503
+ if eventsEnableStatus[HMSConstants.ON_SESSION_STORE_AVAILABLE] != true {
1441
1504
  return
1442
1505
  }
1443
- if !rtcStatsAttached {
1506
+ self.delegate?.emitEvent(HMSConstants.ON_SESSION_STORE_AVAILABLE, ["id": self.id])
1507
+ }
1508
+
1509
+ func on(rtcStats: HMSRTCStatsReport) {
1510
+ if eventsEnableStatus[HMSConstants.ON_RTC_STATS] != true {
1444
1511
  return
1445
1512
  }
1446
- let video = HMSDecoder.getHMSRTCStats(rtcStats.video)
1447
- let audio = HMSDecoder.getHMSRTCStats(rtcStats.audio)
1448
- let combined = HMSDecoder.getHMSRTCStats(rtcStats.combined)
1513
+ let video = HMSDecoder.getHMSRTCStats(rtcStats.video) // [bitrateReceived, bitrateSent, bytesReceived, bytesSent, packetsLost, packetsReceived, roundTripTime]
1514
+ let audio = HMSDecoder.getHMSRTCStats(rtcStats.audio) // [bitrateReceived, bitrateSent, bytesReceived, bytesSent, packetsLost, packetsReceived, roundTripTime]
1515
+ let combined = HMSDecoder.getHMSRTCStats(rtcStats.combined) // [bitrateReceived, bitrateSent, bytesReceived, bytesSent, packetsLost, packetsReceived, roundTripTime]
1449
1516
 
1450
- self.delegate?.emitEvent(ON_RTC_STATS, ["video": video, "audio": audio, "combined": combined, "id": self.id])
1517
+ self.delegate?.emitEvent(HMSConstants.ON_RTC_STATS, ["video": video, "audio": audio, "combined": combined, "id": self.id])
1451
1518
  }
1452
1519
 
1453
1520
  func on(localAudioStats: HMSLocalAudioStats, track: HMSAudioTrack, peer: HMSPeer) {
1454
- if eventsEnableStatus[ON_LOCAL_AUDIO_STATS] != true {
1521
+ if eventsEnableStatus[HMSConstants.ON_LOCAL_AUDIO_STATS] != true {
1455
1522
  return
1456
1523
  }
1457
- if !rtcStatsAttached {
1458
- return
1459
- }
1460
- let localStats = HMSDecoder.getLocalAudioStats(localAudioStats)
1524
+ let localStats = HMSDecoder.getLocalAudioStats(localAudioStats) // [bitrate, bytesSent, roundTripTime]
1461
1525
  let localTrack = HMSDecoder.getHmsAudioTrack(track)
1462
1526
  let decodedPeer = HMSDecoder.getHmsPeerSubset(peer)
1463
1527
 
1464
- self.delegate?.emitEvent(ON_LOCAL_AUDIO_STATS, ["localAudioStats": localStats, "track": localTrack, "peer": decodedPeer, "id": self.id])
1528
+ self.delegate?.emitEvent(HMSConstants.ON_LOCAL_AUDIO_STATS, ["localAudioStats": localStats, "track": localTrack, "peer": decodedPeer, "id": self.id])
1465
1529
  }
1466
1530
 
1467
- func on(localVideoStats: [HMSLocalVideoStats], track: HMSVideoTrack, peer: HMSPeer) {
1468
- if eventsEnableStatus[ON_LOCAL_VIDEO_STATS] != true {
1531
+ func on(localVideoStats: [HMSLocalVideoStats], track: HMSVideoTrack, peer: HMSPeer) { // DOUBT: HMSLocalVideoTrack instead of HMSVideoTrack?
1532
+ if eventsEnableStatus[HMSConstants.ON_LOCAL_VIDEO_STATS] != true {
1469
1533
  return
1470
1534
  }
1471
- if !rtcStatsAttached {
1472
- return
1473
- }
1474
- let localStats = HMSDecoder.getLocalVideoStats(localVideoStats)
1535
+ let localStats = HMSDecoder.getLocalVideoStats(localVideoStats) // List<[bitrate, bytesSent, roundTripTime, frameRate, resolution, layer]>
1475
1536
  let decodedPeer = HMSDecoder.getHmsPeerSubset(peer)
1476
1537
  let localTrack = HMSDecoder.getHmsVideoTrack(track)
1477
1538
 
1478
- self.delegate?.emitEvent(ON_LOCAL_VIDEO_STATS, ["localVideoStats": localStats, "track": localTrack, "peer": decodedPeer, "id": self.id])
1539
+ self.delegate?.emitEvent(HMSConstants.ON_LOCAL_VIDEO_STATS, ["localVideoStats": localStats, "track": localTrack, "peer": decodedPeer, "id": self.id])
1479
1540
  }
1480
1541
 
1481
1542
  func on(remoteAudioStats: HMSRemoteAudioStats, track: HMSAudioTrack, peer: HMSPeer) {
1482
- if eventsEnableStatus[ON_REMOTE_AUDIO_STATS] != true {
1483
- return
1484
- }
1485
- if !rtcStatsAttached {
1543
+ if eventsEnableStatus[HMSConstants.ON_REMOTE_AUDIO_STATS] != true {
1486
1544
  return
1487
1545
  }
1488
- let remoteStats = HMSDecoder.getRemoteAudioStats(remoteAudioStats)
1546
+ let remoteStats = HMSDecoder.getRemoteAudioStats(remoteAudioStats) // [bitrate, bytesReceived, jitter, packetsLost, packetsReceived]
1489
1547
  let remoteTrack = HMSDecoder.getHmsAudioTrack(track)
1490
1548
  let decodedPeer = HMSDecoder.getHmsPeerSubset(peer)
1491
1549
 
1492
- self.delegate?.emitEvent(ON_REMOTE_AUDIO_STATS, ["remoteAudioStats": remoteStats, "track": remoteTrack, "peer": decodedPeer, "id": self.id])
1550
+ self.delegate?.emitEvent(HMSConstants.ON_REMOTE_AUDIO_STATS, ["remoteAudioStats": remoteStats, "track": remoteTrack, "peer": decodedPeer, "id": self.id])
1493
1551
  }
1494
1552
 
1495
1553
  func on(remoteVideoStats: HMSRemoteVideoStats, track: HMSVideoTrack, peer: HMSPeer) {
1496
- if eventsEnableStatus[ON_REMOTE_VIDEO_STATS] != true {
1497
- return
1498
- }
1499
- if !rtcStatsAttached {
1554
+ if eventsEnableStatus[HMSConstants.ON_REMOTE_VIDEO_STATS] != true {
1500
1555
  return
1501
1556
  }
1502
- let remoteStats = HMSDecoder.getRemoteVideoStats(remoteVideoStats)
1557
+ let remoteStats = HMSDecoder.getRemoteVideoStats(remoteVideoStats) // [bitrate, bytesReceived, frameRate, jitter, packetsLost, packetsReceived, resolution]
1503
1558
  let decodedPeer = HMSDecoder.getHmsPeerSubset(peer)
1504
1559
  let remoteTrack = HMSDecoder.getHmsVideoTrack(track)
1505
1560
 
1506
- self.delegate?.emitEvent(ON_REMOTE_VIDEO_STATS, ["remoteVideoStats": remoteStats, "track": remoteTrack, "peer": decodedPeer, "id": self.id])
1561
+ self.delegate?.emitEvent(HMSConstants.ON_REMOTE_VIDEO_STATS, ["remoteVideoStats": remoteStats, "track": remoteTrack, "peer": decodedPeer, "id": self.id])
1562
+ }
1563
+
1564
+ // MARK: - Simulcast
1565
+
1566
+ func getVideoTrackLayerDefinition(_ data: NSDictionary, _ resolve: RCTPromiseResolveBlock?, _ reject: RCTPromiseRejectBlock?) {
1567
+ guard let trackId = data.value(forKey: "trackId") as? String
1568
+ else {
1569
+ let errorMessage = "\(#function) " + HMSHelper.getUnavailableRequiredKey(data, ["trackId"])
1570
+ emitRequiredKeysError(errorMessage)
1571
+ reject?(errorMessage, errorMessage, nil)
1572
+ return
1573
+ }
1574
+
1575
+ DispatchQueue.main.async { [weak self] in
1576
+
1577
+ guard let self = self,
1578
+ let remotePeers = self.hms?.remotePeers,
1579
+ let remoteVideoTrack = HMSHelper.getRemoteVideoTrackFromTrackId(trackId, remotePeers)
1580
+ else {
1581
+ let errorMessage = "\(#function) " + "TRACK_NOT_FOUND"
1582
+ self?.emitRequiredKeysError(errorMessage)
1583
+ reject?(errorMessage, errorMessage, nil)
1584
+ return
1585
+ }
1586
+
1587
+ guard let layerDefinitions = remoteVideoTrack.layerDefinitions
1588
+ else {
1589
+ let errorMessage = "\(#function) " + "layer definitions not available for track: '\(trackId)' !"
1590
+ self.emitRequiredKeysError(errorMessage)
1591
+ reject?(errorMessage, errorMessage, nil)
1592
+ return
1593
+ }
1594
+
1595
+ let parsedLayerDefinitions = HMSDecoder.getSimulcastLayerDefinitions(for: layerDefinitions)
1596
+
1597
+ resolve?(parsedLayerDefinitions)
1598
+ }
1599
+ }
1600
+
1601
+ func getVideoTrackLayer(_ data: NSDictionary, _ resolve: RCTPromiseResolveBlock?, _ reject: RCTPromiseRejectBlock?) {
1602
+
1603
+ guard let trackId = data.value(forKey: "trackId") as? String
1604
+ else {
1605
+ let errorMessage = "\(#function) " + HMSHelper.getUnavailableRequiredKey(data, ["trackId"])
1606
+ emitRequiredKeysError(errorMessage)
1607
+ reject?(errorMessage, errorMessage, nil)
1608
+ return
1609
+ }
1610
+
1611
+ DispatchQueue.main.async { [weak self] in
1612
+
1613
+ guard let self = self,
1614
+ let remotePeers = self.hms?.remotePeers,
1615
+ let remoteVideoTrack = HMSHelper.getRemoteVideoTrackFromTrackId(trackId, remotePeers)
1616
+ else {
1617
+ let errorMessage = "\(#function) " + "TRACK_NOT_FOUND"
1618
+ self?.emitRequiredKeysError(errorMessage)
1619
+ reject?(errorMessage, errorMessage, nil)
1620
+ return
1621
+ }
1622
+
1623
+ let parsedLayer = HMSDecoder.getString(from: remoteVideoTrack.layer)
1624
+
1625
+ resolve?(parsedLayer)
1626
+ }
1627
+ }
1628
+
1629
+ func setVideoTrackLayer(_ data: NSDictionary, _ resolve: RCTPromiseResolveBlock?, _ reject: RCTPromiseRejectBlock?) {
1630
+ guard let trackId = data.value(forKey: "trackId") as? String,
1631
+ let layer = data.value(forKey: "layer") as? String
1632
+ else {
1633
+ let errorMessage = "\(#function) " + HMSHelper.getUnavailableRequiredKey(data, ["trackId", "layer"])
1634
+ emitRequiredKeysError(errorMessage)
1635
+ reject?(errorMessage, errorMessage, nil)
1636
+ return
1637
+ }
1638
+
1639
+ DispatchQueue.main.async { [weak self] in
1640
+
1641
+ guard let self = self,
1642
+ let remotePeers = self.hms?.remotePeers,
1643
+ let remoteVideoTrack = HMSHelper.getRemoteVideoTrackFromTrackId(trackId, remotePeers)
1644
+ else {
1645
+ let errorMessage = "\(#function) " + "TRACK_NOT_FOUND"
1646
+ self?.emitRequiredKeysError(errorMessage)
1647
+ reject?(errorMessage, errorMessage, nil)
1648
+ return
1649
+ }
1650
+
1651
+ switch layer.uppercased() {
1652
+ case "LOW":
1653
+ remoteVideoTrack.layer = .low
1654
+ case "MEDIUM":
1655
+ remoteVideoTrack.layer = .mid
1656
+ default:
1657
+ remoteVideoTrack.layer = .high
1658
+ }
1659
+
1660
+ resolve?(true)
1661
+ }
1662
+ }
1663
+
1664
+ // MARK: - Advanced Camera Controls
1665
+
1666
+ func captureImageAtMaxSupportedResolution(_ data: NSDictionary, _ resolve: RCTPromiseResolveBlock?, _ reject: RCTPromiseRejectBlock?) {
1667
+
1668
+ let withFlash = data["flash"] as? Bool ?? false
1669
+
1670
+ DispatchQueue.main.async { [weak self] in
1671
+
1672
+ guard let localPeer = self?.hms?.localPeer else {
1673
+ let errorMessage = "\(#function) An instance of Local Peer could not be found. Please check if a Room is joined."
1674
+ reject?("6004", errorMessage, nil)
1675
+ return
1676
+ }
1677
+
1678
+ guard let localVideoTrack = localPeer.localVideoTrack()
1679
+ else {
1680
+ let errorMessage = "\(#function) Video Track of Local Peer could not be found. Please check if the Local Peer has permission to publish video & video is unmuted currently."
1681
+ reject?("6004", errorMessage, nil)
1682
+ return
1683
+ }
1684
+
1685
+ localVideoTrack.captureImageAtMaxSupportedResolution(withFlash: withFlash) { image in
1686
+
1687
+ guard let rawImage = image, let capturedImage = rawImage.fixOrientation() else {
1688
+ let errorMessage = "\(#function) Could not capture image of the Local Peer's Video Track."
1689
+ reject?("6004", errorMessage, nil)
1690
+ return
1691
+ }
1692
+
1693
+ guard let data = capturedImage.pngData() else {
1694
+ let errorMessage = "\(#function) Could not compress image of the Local Peer's Video Track to png data."
1695
+ reject?("6004", errorMessage, nil)
1696
+ return
1697
+ }
1698
+
1699
+ let filePath = HMSRNSDK.getDocumentsDirectory().appendingPathComponent("hms_\(HMSRNSDK.getTimeStamp()).png")
1700
+
1701
+ do {
1702
+ try data.write(to: filePath)
1703
+
1704
+ resolve?(filePath.relativePath)
1705
+ } catch let error {
1706
+ let errorMessage = "\(#function) Could not write to disk the image data of the Local Peer's Video Track. \(error.localizedDescription)"
1707
+ reject?("6004", errorMessage, nil)
1708
+ return
1709
+ }
1710
+ }
1711
+ }
1712
+ }
1713
+
1714
+ // MARK: - Session Store
1715
+
1716
+ func getSessionMetadataForKey(_ data: NSDictionary, _ resolve: RCTPromiseResolveBlock?, _ reject: RCTPromiseRejectBlock?) {
1717
+
1718
+ DispatchQueue.main.async { [weak self] in
1719
+
1720
+ guard let store = self?.sessionStore
1721
+ else {
1722
+ let errorMessage = "\(#function) Session Store is null"
1723
+ reject?("6004", errorMessage, nil)
1724
+ return
1725
+ }
1726
+
1727
+ guard let data = data as? [AnyHashable: Any],
1728
+ let key = data["key"] as? String
1729
+ else {
1730
+ let errorMessage = "\(#function) Key to be fetched from Session Store is null." + HMSHelper.getUnavailableRequiredKey(data, ["key"])
1731
+ reject?("6004", errorMessage, nil)
1732
+ return
1733
+ }
1734
+
1735
+ store.object(forKey: key) { value, error in
1736
+
1737
+ if let error = error {
1738
+ let errorMessage = "\(#function) Error in fetching key: \(key) from Session Store. Error: \(error.localizedDescription)"
1739
+ reject?("6004", errorMessage, nil)
1740
+ return
1741
+ }
1742
+
1743
+ if let value = value {
1744
+ if let stringValue = value as? String {
1745
+ resolve?(stringValue)
1746
+ } else {
1747
+ let errorMessage = "\(#function) Session Store value for the key: \(key) is not of String Type. Value: \(value)"
1748
+ reject?("6004", errorMessage, nil)
1749
+ }
1750
+ } else {
1751
+ resolve?(nil)
1752
+ }
1753
+ }
1754
+ }
1755
+ }
1756
+
1757
+ func setSessionMetadataForKey(_ data: NSDictionary, _ resolve: RCTPromiseResolveBlock?, _ reject: RCTPromiseRejectBlock?) {
1758
+
1759
+ DispatchQueue.main.async { [weak self] in
1760
+
1761
+ guard let store = self?.sessionStore
1762
+ else {
1763
+ let errorMessage = "\(#function) Session Store is null"
1764
+ reject?("6004", errorMessage, nil)
1765
+ return
1766
+ }
1767
+
1768
+ guard let data = data as? [AnyHashable: Any],
1769
+ let key = data["key"] as? String
1770
+ else {
1771
+ let errorMessage = "\(#function) Key for the object to be set in Session Store is null." + HMSHelper.getUnavailableRequiredKey(data, ["key"])
1772
+ reject?("6004", errorMessage, nil)
1773
+ return
1774
+ }
1775
+
1776
+ let valueToBeSet = data["value"] as Any
1777
+
1778
+ store.set(valueToBeSet, forKey: key) { value, error in
1779
+
1780
+ if let error = error {
1781
+ let errorMessage = "\(#function) Error in setting value: \(valueToBeSet) for key: \(key) to the Session Store. Error: \(error.localizedDescription)"
1782
+ reject?("6004", errorMessage, nil)
1783
+ return
1784
+ }
1785
+ resolve?(["success": true, "finalValue": value])
1786
+ }
1787
+ }
1788
+ }
1789
+
1790
+ func addKeyChangeListener(_ data: NSDictionary, _ resolve: RCTPromiseResolveBlock?, _ reject: RCTPromiseRejectBlock?) {
1791
+
1792
+ DispatchQueue.main.async { [weak self] in
1793
+
1794
+ guard let store = self?.sessionStore
1795
+ else {
1796
+ let errorMessage = "\(#function) Session Store is null"
1797
+ reject?("6004", errorMessage, nil)
1798
+ return
1799
+ }
1800
+
1801
+ guard let data = data as? [AnyHashable: Any]
1802
+ else {
1803
+ let errorMessage = "\(#function) No arguments passed which can be attached to Key Change Listener on the Session Store."
1804
+ reject?("6004", errorMessage, nil)
1805
+ return
1806
+ }
1807
+
1808
+ guard let keys = data["keys"] as? [String]
1809
+ else {
1810
+ let errorMessage = "\(#function) No keys passed which can be attached to Key Change Listener on the Session Store. Available arguments: \(data)"
1811
+ reject?("6004", errorMessage, nil)
1812
+ return
1813
+ }
1814
+
1815
+ guard let uniqueId = data["uniqueId"] as? String
1816
+ else {
1817
+ let errorMessage = "\(#function) No uniqueId passed which can be used to attach Key Change Listener on the Session Store. Available arguments: \(data)"
1818
+ reject?("6004", errorMessage, nil)
1819
+ return
1820
+ }
1821
+
1822
+ store.observeChanges(forKeys: keys, changeObserver: { [weak self] key, value in
1823
+
1824
+ var data = [String: Any]()
1825
+
1826
+ data["id"] = self?.id
1827
+
1828
+ data["key"] = key
1829
+
1830
+ if let value = value {
1831
+ if let stringValue = value as? String {
1832
+ data["value"] = stringValue
1833
+ } else {
1834
+ let errorMessage = "\(#function) Session Store value for the key: \(key) is not of String Type. Value: \(value)"
1835
+ print(errorMessage)
1836
+ }
1837
+ }
1838
+ self?.delegate?.emitEvent(HMSConstants.ON_SESSION_STORE_CHANGED, data)
1839
+
1840
+ }) { [weak self] observer, error in
1841
+
1842
+ if let error = error {
1843
+ let errorMessage = "\(#function) Error in observing changes for key: \(keys) in the Session Store. Error: \(error.localizedDescription)"
1844
+ reject?("6004", errorMessage, nil)
1845
+ return
1846
+ }
1847
+
1848
+ guard let observer = observer
1849
+ else {
1850
+ let errorMessage = "\(#function) Unknown Error in observing changes for key: \(keys) in the Session Store."
1851
+ reject?("6004", errorMessage, nil)
1852
+ return
1853
+ }
1854
+
1855
+ guard let self = self
1856
+ else {
1857
+ let errorMessage = "\(#function) Could not find self instance while observing changes for key: \(keys) in the Session Store."
1858
+ reject?("6004", errorMessage, nil)
1859
+ return
1860
+ }
1861
+
1862
+ self.sessionStoreChangeObservers[uniqueId] = observer
1863
+
1864
+ resolve?(true)
1865
+ }
1866
+ }
1867
+ }
1868
+
1869
+ func removeKeyChangeListener(_ data: NSDictionary, _ resolve: RCTPromiseResolveBlock?, _ reject: RCTPromiseRejectBlock?) {
1870
+
1871
+ DispatchQueue.main.async { [weak self] in
1872
+
1873
+ guard let store = self?.sessionStore
1874
+ else {
1875
+ let errorMessage = "\(#function) Session Store is null"
1876
+ reject?("6004", errorMessage, nil)
1877
+ return
1878
+ }
1879
+
1880
+ guard let data = data as? [AnyHashable: Any]
1881
+ else {
1882
+ let errorMessage = "\(#function) No arguments passed which can be used to remove Key Change Listener from the Session Store."
1883
+ reject?("6004", errorMessage, nil)
1884
+ return
1885
+ }
1886
+
1887
+ guard let uniqueId = data["uniqueId"] as? String
1888
+ else {
1889
+ let errorMessage = "\(#function) No uniqueId passed which can be used to remove Key Change Listener from the Session Store. Available arguments: \(data)"
1890
+ reject?("6004", errorMessage, nil)
1891
+ return
1892
+ }
1893
+
1894
+ guard let observerToBeRemoved = self?.sessionStoreChangeObservers[uniqueId]
1895
+ else {
1896
+ let errorMessage = "\(#function) No listener found to remove for the uniqueId passed. Available arguments: \(data)"
1897
+ reject?("6004", errorMessage, nil)
1898
+ return
1899
+ }
1900
+
1901
+ self?.sessionStoreChangeObservers.removeValue(forKey: uniqueId)
1902
+
1903
+ store.removeObserver(observerToBeRemoved)
1904
+
1905
+ resolve?(true)
1906
+ }
1907
+ }
1908
+
1909
+ // MARK: - Helper Functions
1910
+
1911
+ // Handle resetting states and data cleanup
1912
+ private func cleanup() {
1913
+ self.config = nil
1914
+ self.recentRoleChangeRequest = nil
1915
+ self.reconnectingStage = false
1916
+ self.preferredExtension = nil
1917
+ self.systemBroadcastPicker = nil
1918
+ self.startScreenshareResolve = nil
1919
+ self.stopScreenshareResolve = nil
1920
+ self.isScreenShared = false
1921
+ self.previewInProgress = false
1922
+ self.networkQualityUpdatesAttached = false
1923
+ self.eventsEnableStatus.removeAll()
1924
+ self.sessionStore = nil
1925
+ self.sessionStoreChangeObservers.removeAll()
1926
+ HMSDecoder.clearRestrictDataStates()
1507
1927
  }
1508
1928
 
1509
- // MARK: Helper Functions
1510
1929
  private func getString(from update: HMSPeerUpdate) -> String {
1511
1930
  switch update {
1512
1931
  case .peerJoined:
@@ -1571,9 +1990,32 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
1571
1990
  }
1572
1991
 
1573
1992
  func emitRequiredKeysError(_ error: String) {
1574
- if eventsEnableStatus[ON_ERROR] != true {
1993
+ if eventsEnableStatus[HMSConstants.ON_ERROR] != true {
1575
1994
  return
1576
1995
  }
1577
- delegate?.emitEvent(ON_ERROR, ["error": ["code": 6002, "description": error, "isTerminal": false, "canRetry": true], "id": id])
1996
+ delegate?.emitEvent(HMSConstants.ON_ERROR, ["error": ["code": 7000, "description": error, "isTerminal": false, "canRetry": true] as [String: Any], "id": id])
1997
+ }
1998
+
1999
+ static private func getDocumentsDirectory() -> URL {
2000
+ let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
2001
+ return paths[0]
2002
+ }
2003
+
2004
+ static private func getTimeStamp() -> String {
2005
+ "\(Date().timeIntervalSince1970)"
2006
+ }
2007
+ }
2008
+
2009
+ extension UIImage {
2010
+ func fixOrientation() -> UIImage? {
2011
+ if self.imageOrientation == UIImage.Orientation.up {
2012
+ return self
2013
+ }
2014
+
2015
+ UIGraphicsBeginImageContext(self.size)
2016
+ self.draw(in: CGRect(origin: .zero, size: self.size))
2017
+ let normalizedImage = UIGraphicsGetImageFromCurrentImageContext()
2018
+ UIGraphicsEndImageContext()
2019
+ return normalizedImage
1578
2020
  }
1579
2021
  }