@100mslive/react-native-hms 1.5.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 (88) hide show
  1. package/android/src/main/java/com/reactnativehmssdk/HMSManager.kt +52 -24
  2. package/android/src/main/java/com/reactnativehmssdk/HMSRNSDK.kt +245 -62
  3. package/android/src/main/java/com/reactnativehmssdk/HMSView.kt +15 -6
  4. package/ios/HMSConstants.swift +3 -1
  5. package/ios/HMSDecoder.swift +1 -1
  6. package/ios/HMSHelper.swift +44 -7
  7. package/ios/HMSManager.m +8 -0
  8. package/ios/HMSManager.swift +35 -1
  9. package/ios/HMSRNSDK.swift +268 -38
  10. package/lib/commonjs/classes/HMSAudioTrackSettings.js +14 -0
  11. package/lib/commonjs/classes/HMSAudioTrackSettings.js.map +1 -1
  12. package/lib/commonjs/classes/HMSEncoder.js +2 -1
  13. package/lib/commonjs/classes/HMSEncoder.js.map +1 -1
  14. package/lib/commonjs/classes/HMSIOSAudioMode.js +13 -0
  15. package/lib/commonjs/classes/HMSIOSAudioMode.js.map +1 -0
  16. package/lib/commonjs/classes/HMSSDK.js +50 -0
  17. package/lib/commonjs/classes/HMSSDK.js.map +1 -1
  18. package/lib/commonjs/classes/HMSSessionStore.js +173 -0
  19. package/lib/commonjs/classes/HMSSessionStore.js.map +1 -0
  20. package/lib/commonjs/classes/HMSUpdateListenerActions.js +8 -0
  21. package/lib/commonjs/classes/HMSUpdateListenerActions.js.map +1 -1
  22. package/lib/commonjs/classes/HMSVideoTrackSettings.js +5 -0
  23. package/lib/commonjs/classes/HMSVideoTrackSettings.js.map +1 -1
  24. package/lib/commonjs/index.js +12 -0
  25. package/lib/commonjs/index.js.map +1 -1
  26. package/lib/commonjs/utils/emitter/EventEmitter.js +162 -0
  27. package/lib/commonjs/utils/emitter/EventEmitter.js.map +1 -0
  28. package/lib/commonjs/utils/emitter/_EmitterSubscription.js +46 -0
  29. package/lib/commonjs/utils/emitter/_EmitterSubscription.js.map +1 -0
  30. package/lib/commonjs/utils/emitter/_EventSubscription.js +36 -0
  31. package/lib/commonjs/utils/emitter/_EventSubscription.js.map +1 -0
  32. package/lib/commonjs/utils/emitter/_EventSubscriptionVendor.js +90 -0
  33. package/lib/commonjs/utils/emitter/_EventSubscriptionVendor.js.map +1 -0
  34. package/lib/commonjs/utils/index.js +17 -0
  35. package/lib/commonjs/utils/index.js.map +1 -0
  36. package/lib/module/classes/HMSAudioTrackSettings.js +14 -0
  37. package/lib/module/classes/HMSAudioTrackSettings.js.map +1 -1
  38. package/lib/module/classes/HMSEncoder.js +2 -1
  39. package/lib/module/classes/HMSEncoder.js.map +1 -1
  40. package/lib/module/classes/HMSIOSAudioMode.js +6 -0
  41. package/lib/module/classes/HMSIOSAudioMode.js.map +1 -0
  42. package/lib/module/classes/HMSSDK.js +50 -0
  43. package/lib/module/classes/HMSSDK.js.map +1 -1
  44. package/lib/module/classes/HMSSessionStore.js +166 -0
  45. package/lib/module/classes/HMSSessionStore.js.map +1 -0
  46. package/lib/module/classes/HMSUpdateListenerActions.js +8 -0
  47. package/lib/module/classes/HMSUpdateListenerActions.js.map +1 -1
  48. package/lib/module/classes/HMSVideoTrackSettings.js +5 -0
  49. package/lib/module/classes/HMSVideoTrackSettings.js.map +1 -1
  50. package/lib/module/index.js +1 -0
  51. package/lib/module/index.js.map +1 -1
  52. package/lib/module/utils/emitter/EventEmitter.js +151 -0
  53. package/lib/module/utils/emitter/EventEmitter.js.map +1 -0
  54. package/lib/module/utils/emitter/_EmitterSubscription.js +39 -0
  55. package/lib/module/utils/emitter/_EmitterSubscription.js.map +1 -0
  56. package/lib/module/utils/emitter/_EventSubscription.js +29 -0
  57. package/lib/module/utils/emitter/_EventSubscription.js.map +1 -0
  58. package/lib/module/utils/emitter/_EventSubscriptionVendor.js +83 -0
  59. package/lib/module/utils/emitter/_EventSubscriptionVendor.js.map +1 -0
  60. package/lib/module/utils/index.js +2 -0
  61. package/lib/module/utils/index.js.map +1 -0
  62. package/lib/typescript/classes/HMSAudioTrackSettings.d.ts +14 -0
  63. package/lib/typescript/classes/HMSIOSAudioMode.d.ts +4 -0
  64. package/lib/typescript/classes/HMSSDK.d.ts +16 -0
  65. package/lib/typescript/classes/HMSSessionStore.d.ts +63 -0
  66. package/lib/typescript/classes/HMSUpdateListenerActions.d.ts +9 -1
  67. package/lib/typescript/classes/HMSVideoTrackSettings.d.ts +5 -0
  68. package/lib/typescript/index.d.ts +2 -0
  69. package/lib/typescript/utils/emitter/EventEmitter.d.ts +91 -0
  70. package/lib/typescript/utils/emitter/_EmitterSubscription.d.ts +29 -0
  71. package/lib/typescript/utils/emitter/_EventSubscription.d.ts +19 -0
  72. package/lib/typescript/utils/emitter/_EventSubscriptionVendor.d.ts +44 -0
  73. package/lib/typescript/utils/index.d.ts +1 -0
  74. package/package.json +21 -2
  75. package/sdk-versions.json +2 -2
  76. package/src/classes/HMSAudioTrackSettings.ts +16 -0
  77. package/src/classes/HMSEncoder.ts +1 -0
  78. package/src/classes/HMSIOSAudioMode.ts +4 -0
  79. package/src/classes/HMSSDK.tsx +70 -4
  80. package/src/classes/HMSSessionStore.ts +209 -0
  81. package/src/classes/HMSUpdateListenerActions.ts +8 -0
  82. package/src/classes/HMSVideoTrackSettings.ts +5 -0
  83. package/src/index.ts +5 -0
  84. package/src/utils/emitter/EventEmitter.ts +160 -0
  85. package/src/utils/emitter/_EmitterSubscription.ts +44 -0
  86. package/src/utils/emitter/_EventSubscription.ts +28 -0
  87. package/src/utils/emitter/_EventSubscriptionVendor.ts +89 -0
  88. package/src/utils/index.ts +1 -0
@@ -25,6 +25,8 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
25
25
  private var previewInProgress = false
26
26
  private var networkQualityUpdatesAttached = false
27
27
  private var eventsEnableStatus: [String: Bool] = [:]
28
+ private var sessionStore: HMSSessionStore?
29
+ private var sessionStoreChangeObservers = [String: NSObjectProtocol]()
28
30
 
29
31
  // MARK: - Setup
30
32
  init(data: NSDictionary?, delegate manager: HMSManager?, uid id: String) {
@@ -49,7 +51,7 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
49
51
 
50
52
  guard !previewInProgress else {
51
53
  if eventsEnableStatus[HMSConstants.ON_ERROR] == true {
52
- delegate?.emitEvent(HMSConstants.ON_ERROR, ["error": ["code": 5000, "description": "Preview is in progress", "isTerminal": false, "canRetry": true, "params": ["function": #function]], "id": id])
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])
53
55
  }
54
56
  return
55
57
  }
@@ -101,7 +103,7 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
101
103
 
102
104
  let decodedTracks = HMSDecoder.getAllTracks(tracks ?? [])
103
105
 
104
- resolve?(["success": true, "tracks": decodedTracks])
106
+ resolve?(["success": true, "tracks": decodedTracks] as [String: Any])
105
107
  return
106
108
  })
107
109
  }
@@ -115,7 +117,7 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
115
117
 
116
118
  guard !previewInProgress else {
117
119
  if eventsEnableStatus[HMSConstants.ON_ERROR] == true {
118
- delegate?.emitEvent(HMSConstants.ON_ERROR, ["error": ["code": 5000, "description": "Preview is in progress", "isTerminal": false, "canRetry": true, "params": ["function": #function]], "id": id])
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])
119
121
  }
120
122
  return
121
123
  }
@@ -222,26 +224,28 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
222
224
  reject?("Still in reconnecting stage", "Still in reconnecting stage", nil)
223
225
  } else {
224
226
  DispatchQueue.main.async { [weak self] in
225
- guard let strongSelf = self else { return }
226
- self?.config = nil
227
- self?.recentRoleChangeRequest = nil
228
- self?.systemBroadcastPicker = nil
229
- self?.preferredExtension = nil
230
- self?.stopScreenshareResolve = nil
231
- self?.startScreenshareResolve = nil
232
- self?.isScreenShared = false
233
- self?.networkQualityUpdatesAttached = false
234
- 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
+
235
239
  if success {
236
- HMSDecoder.clearRestrictDataStates()
237
240
  resolve?(["success": success])
241
+ strongSelf.cleanup() // resetting states and doing data cleanup
238
242
  } else {
239
243
  if strongSelf.eventsEnableStatus[HMSConstants.ON_ERROR] == true {
240
244
  strongSelf.delegate?.emitEvent(HMSConstants.ON_ERROR, ["error": HMSDecoder.getError(error), "id": strongSelf.id])
241
245
  }
242
246
  reject?("error in leave", "error in leave", nil)
243
247
  }
244
- })
248
+ }
245
249
  }
246
250
  }
247
251
  }
@@ -260,7 +264,7 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
260
264
  DispatchQueue.main.async { [weak self] in
261
265
  self?.hms?.sendBroadcastMessage(type: type, message: message, completion: { message, error in
262
266
  if error == nil {
263
- 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])
264
268
  return
265
269
  } else {
266
270
  if self?.eventsEnableStatus[HMSConstants.ON_ERROR] == true {
@@ -288,7 +292,7 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
288
292
  let encodedTargetedRoles = HMSHelper.getRolesFromRoleNames(targetedRoles, roles: self?.hms?.roles)
289
293
  self?.hms?.sendGroupMessage(type: type, message: message, roles: encodedTargetedRoles, completion: { message, error in
290
294
  if error == nil {
291
- 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])
292
296
  return
293
297
  } else {
294
298
  if self?.eventsEnableStatus[HMSConstants.ON_ERROR] == true {
@@ -316,7 +320,7 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
316
320
  guard let peer = HMSHelper.getRemotePeerFromPeerId(peerId, remotePeers: self?.hms?.remotePeers) else { return }
317
321
  self?.hms?.sendDirectMessage(type: type, message: message, peer: peer, completion: { message, error in
318
322
  if error == nil {
319
- 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])
320
324
  return
321
325
  } else {
322
326
  if self?.eventsEnableStatus[HMSConstants.ON_ERROR] == true {
@@ -512,7 +516,7 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
512
516
  let track = HMSHelper.getTrackFromTrackId(trackId, remotePeers)
513
517
  else {
514
518
  if strongSelf.eventsEnableStatus[HMSConstants.ON_ERROR] == true {
515
- strongSelf.delegate?.emitEvent(HMSConstants.ON_ERROR, ["error": ["code": 6002, "description": "Track not found", "isTerminal": false, "canRetry": true, "params": ["function": #function]], "id": strongSelf.id])
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])
516
520
  }
517
521
  reject?("Track not found", "Track not found", nil)
518
522
  return
@@ -575,6 +579,7 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
575
579
  self?.hms?.endRoom(lock: lock, reason: reason, completion: { success, error in
576
580
  if success {
577
581
  resolve?(["success": success])
582
+ self?.cleanup() // resetting states and doing data cleanup
578
583
  } else {
579
584
  if self?.eventsEnableStatus[HMSConstants.ON_ERROR] == true {
580
585
  self?.delegate?.emitEvent(HMSConstants.ON_ERROR, ["error": HMSDecoder.getError(error), "id": self?.id ?? "12345"])
@@ -684,7 +689,7 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
684
689
  if remoteAudioTrack != nil {
685
690
  remoteAudioTrack?.setVolume(volume)
686
691
  } else if strongSelf.eventsEnableStatus[HMSConstants.ON_ERROR] == true {
687
- strongSelf.delegate?.emitEvent(HMSConstants.ON_ERROR, ["error": ["code": 6002, "description": "Track not found", "isTerminal": false, "canRetry": true, "params": ["function": #function]], "id": strongSelf.id])
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])
688
693
  }
689
694
  }
690
695
  }
@@ -706,7 +711,7 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
706
711
  meetingUrl = meetLink
707
712
  } else {
708
713
  if eventsEnableStatus[HMSConstants.ON_ERROR] == true {
709
- delegate?.emitEvent(HMSConstants.ON_ERROR, ["error": ["code": 6002, "description": "Invalid meeting url passed", "isTerminal": false, "canRetry": true, "params": ["function": #function]], "id": id])
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])
710
715
  }
711
716
  reject?("Invalid meeting url passed", "Invalid meeting url passed", nil)
712
717
  }
@@ -838,7 +843,7 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
838
843
  func startScreenshare(_ resolve: RCTPromiseResolveBlock?, _ reject: RCTPromiseRejectBlock?) {
839
844
  guard let preferredExtension = preferredExtension else {
840
845
  if eventsEnableStatus[HMSConstants.ON_ERROR] == true {
841
- 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]], "id": id])
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])
842
847
  }
843
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)
844
849
  return
@@ -862,7 +867,7 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
862
867
  func stopScreenshare(_ resolve: RCTPromiseResolveBlock?, _ reject: RCTPromiseRejectBlock?) {
863
868
  guard let preferredExtension = preferredExtension else {
864
869
  if eventsEnableStatus[HMSConstants.ON_ERROR] == true {
865
- 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]], "id": id])
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])
866
871
  }
867
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)
868
873
  return
@@ -907,19 +912,19 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
907
912
  resolve?(["success": true])
908
913
  } catch {
909
914
  if eventsEnableStatus[HMSConstants.ON_ERROR] == true {
910
- delegate?.emitEvent(HMSConstants.ON_ERROR, ["error": ["code": 6002, "description": error.localizedDescription, "isTerminal": false, "canRetry": true, "params": ["function": #function]], "id": id])
915
+ delegate?.emitEvent(HMSConstants.ON_ERROR, ["error": ["code": 6002, "description": error.localizedDescription, "isTerminal": false, "canRetry": true, "params": ["function": #function]] as [String: Any], "id": id])
911
916
  }
912
917
  reject?(error.localizedDescription, error.localizedDescription, nil)
913
918
  }
914
919
  } else {
915
920
  if eventsEnableStatus[HMSConstants.ON_ERROR] == true {
916
- delegate?.emitEvent(HMSConstants.ON_ERROR, ["error": ["code": 6002, "description": "Incorrect url", "isTerminal": false, "canRetry": true, "params": ["function": #function]], "id": id])
921
+ delegate?.emitEvent(HMSConstants.ON_ERROR, ["error": ["code": 6002, "description": "Incorrect url", "isTerminal": false, "canRetry": true, "params": ["function": #function]] as [String: Any], "id": id])
917
922
  }
918
923
  reject?("Incorrect URL", "Incorrect URL", nil)
919
924
  }
920
925
  } else {
921
926
  if eventsEnableStatus[HMSConstants.ON_ERROR] == true {
922
- delegate?.emitEvent(HMSConstants.ON_ERROR, ["error": ["code": 6002, "description": "AudioFilePlayerNode not found", "isTerminal": false, "canRetry": true, "params": ["function": #function]], "id": id])
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])
923
928
  }
924
929
  reject?("AudioFilePlayerNode not found", "AudioFilePlayerNode not found", nil)
925
930
  }
@@ -955,7 +960,7 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
955
960
  if let audioFilePlayerNode = playerNode as? HMSAudioFilePlayerNode {
956
961
  audioFilePlayerNode.stop()
957
962
  } else if eventsEnableStatus[HMSConstants.ON_ERROR] == true {
958
- delegate?.emitEvent(HMSConstants.ON_ERROR, ["error": ["code": 6002, "description": "AudioFilePlayerNode not found", "isTerminal": false, "canRetry": true, "params": ["function": #function]], "id": id])
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])
959
964
  }
960
965
  }
961
966
 
@@ -973,11 +978,11 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
973
978
  try audioFilePlayerNode.resume()
974
979
  } catch {
975
980
  if eventsEnableStatus[HMSConstants.ON_ERROR] == true {
976
- delegate?.emitEvent(HMSConstants.ON_ERROR, ["error": ["code": 6002, "description": error.localizedDescription, "isTerminal": false, "canRetry": true, "params": ["function": #function]], "id": id])
981
+ delegate?.emitEvent(HMSConstants.ON_ERROR, ["error": ["code": 6002, "description": error.localizedDescription, "isTerminal": false, "canRetry": true, "params": ["function": #function]] as [String: Any], "id": id])
977
982
  }
978
983
  }
979
984
  } else if eventsEnableStatus[HMSConstants.ON_ERROR] == true {
980
- delegate?.emitEvent(HMSConstants.ON_ERROR, ["error": ["code": 6002, "description": "AudioFilePlayerNode not found", "isTerminal": false, "canRetry": true, "params": ["function": #function]], "id": id])
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])
981
986
  }
982
987
  }
983
988
 
@@ -993,7 +998,7 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
993
998
  if let audioFilePlayerNode = playerNode as? HMSAudioFilePlayerNode {
994
999
  audioFilePlayerNode.pause()
995
1000
  } else if eventsEnableStatus[HMSConstants.ON_ERROR] == true {
996
- delegate?.emitEvent(HMSConstants.ON_ERROR, ["error": ["code": 6002, "description": "AudioFilePlayerNode not found", "isTerminal": false, "canRetry": true, "params": ["function": #function]], "id": id])
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])
997
1002
  }
998
1003
  }
999
1004
 
@@ -1011,7 +1016,7 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
1011
1016
  resolve?(audioFilePlayerNode.isPlaying)
1012
1017
  } else {
1013
1018
  if eventsEnableStatus[HMSConstants.ON_ERROR] == true {
1014
- delegate?.emitEvent(HMSConstants.ON_ERROR, ["error": ["code": 6002, "description": "AudioFilePlayerNode not found", "isTerminal": false, "canRetry": true, "params": ["function": #function]], "id": id])
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])
1015
1020
  }
1016
1021
  reject?("AudioFilePlayerNode not found", "AudioFilePlayerNode not found", nil)
1017
1022
  }
@@ -1031,7 +1036,7 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
1031
1036
  resolve?(audioFilePlayerNode.currentTime)
1032
1037
  } else {
1033
1038
  if eventsEnableStatus[HMSConstants.ON_ERROR] == true {
1034
- delegate?.emitEvent(HMSConstants.ON_ERROR, ["error": ["code": 6002, "description": "AudioFilePlayerNode not found", "isTerminal": false, "canRetry": true, "params": ["function": #function]], "id": id])
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])
1035
1040
  }
1036
1041
  reject?("AudioFilePlayerNode not found", "AudioFilePlayerNode not found", nil)
1037
1042
  }
@@ -1051,7 +1056,7 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
1051
1056
  resolve?(audioFilePlayerNode.duration)
1052
1057
  } else {
1053
1058
  if eventsEnableStatus[HMSConstants.ON_ERROR] == true {
1054
- delegate?.emitEvent(HMSConstants.ON_ERROR, ["error": ["code": 6002, "description": "AudioFilePlayerNode not found", "isTerminal": false, "canRetry": true, "params": ["function": #function]], "id": id])
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])
1055
1060
  }
1056
1061
  reject?("AudioFilePlayerNode not found", "AudioFilePlayerNode not found", nil)
1057
1062
  }
@@ -1107,7 +1112,7 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
1107
1112
  }
1108
1113
 
1109
1114
  eventsEnableStatus[eventType] = true
1110
- resolve?(["success": true, "message": "function call executed successfully"])
1115
+ resolve?(["success": true, "message": "function call executed successfully"] as [String: Any])
1111
1116
  }
1112
1117
 
1113
1118
  func disableEvent(_ data: NSDictionary, _ resolve: RCTPromiseResolveBlock?, _ reject: RCTPromiseRejectBlock?) {
@@ -1119,7 +1124,7 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
1119
1124
  }
1120
1125
 
1121
1126
  eventsEnableStatus[eventType] = false
1122
- resolve?(["success": true, "message": "function call executed successfully"])
1127
+ resolve?(["success": true, "message": "function call executed successfully"] as [String: Any])
1123
1128
  }
1124
1129
 
1125
1130
  func restrictData(_ data: NSDictionary) {
@@ -1446,7 +1451,7 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
1446
1451
  if eventsEnableStatus[HMSConstants.RECONNECTING] != true {
1447
1452
  return
1448
1453
  }
1449
- self.delegate?.emitEvent(HMSConstants.RECONNECTING, ["event": HMSConstants.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 ])
1450
1455
  }
1451
1456
 
1452
1457
  func onReconnected() {
@@ -1475,10 +1480,12 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
1475
1480
  }
1476
1481
 
1477
1482
  func on(removedFromRoom notification: HMSRemovedFromRoomNotification) {
1478
- HMSDecoder.clearRestrictDataStates()
1483
+
1479
1484
  if eventsEnableStatus[HMSConstants.ON_REMOVED_FROM_ROOM] != true {
1485
+ self.cleanup() // resetting states and doing data cleanup
1480
1486
  return
1481
1487
  }
1488
+
1482
1489
  let requestedBy = notification.requestedBy as HMSPeer?
1483
1490
  var decodedRequestedBy: [String: Any]?
1484
1491
  if let requested = requestedBy {
@@ -1487,6 +1494,16 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
1487
1494
  let reason = notification.reason
1488
1495
  let roomEnded = notification.roomEnded
1489
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
1499
+ }
1500
+
1501
+ func on(sessionStoreAvailable store: HMSSessionStore) {
1502
+ self.sessionStore = store
1503
+ if eventsEnableStatus[HMSConstants.ON_SESSION_STORE_AVAILABLE] != true {
1504
+ return
1505
+ }
1506
+ self.delegate?.emitEvent(HMSConstants.ON_SESSION_STORE_AVAILABLE, ["id": self.id])
1490
1507
  }
1491
1508
 
1492
1509
  func on(rtcStats: HMSRTCStatsReport) {
@@ -1694,8 +1711,221 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
1694
1711
  }
1695
1712
  }
1696
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
+
1697
1909
  // MARK: - Helper Functions
1698
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()
1927
+ }
1928
+
1699
1929
  private func getString(from update: HMSPeerUpdate) -> String {
1700
1930
  switch update {
1701
1931
  case .peerJoined:
@@ -1763,7 +1993,7 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
1763
1993
  if eventsEnableStatus[HMSConstants.ON_ERROR] != true {
1764
1994
  return
1765
1995
  }
1766
- delegate?.emitEvent(HMSConstants.ON_ERROR, ["error": ["code": 7000, "description": error, "isTerminal": false, "canRetry": true], "id": id]) // DOUBT: Error code 6002 or 7000?
1996
+ delegate?.emitEvent(HMSConstants.ON_ERROR, ["error": ["code": 7000, "description": error, "isTerminal": false, "canRetry": true] as [String: Any], "id": id])
1767
1997
  }
1768
1998
 
1769
1999
  static private func getDocumentsDirectory() -> URL {
@@ -7,6 +7,11 @@ exports.HMSAudioTrackSettings = void 0;
7
7
  function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
8
8
  function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
9
9
  function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
10
+ /**
11
+ * Customize local peer's Audio track settings before Joining the Room.
12
+ *
13
+ * Checkout Track Settings docs for more details {@link https://www.100ms.live/docs/react-native/v2/how-to-guides/interact-with-room/track/track-settings}
14
+ */
10
15
  class HMSAudioTrackSettings {
11
16
  // ios only
12
17
 
@@ -15,9 +20,18 @@ class HMSAudioTrackSettings {
15
20
  _defineProperty(this, "useHardwareEchoCancellation", void 0);
16
21
  // android only
17
22
  _defineProperty(this, "audioSource", void 0);
23
+ // ios only
24
+ /**
25
+ * [iOS only] `audioMode` allows you to capture audio in its highest quality
26
+ * by disabling voice processing and increasing the maximum bandwidth limit
27
+ *
28
+ * Checkout Music Mode docs for more details {@link https://www.100ms.live/docs/react-native/v2/how-to-guides/configure-your-device/microphone/music-mode}
29
+ */
30
+ _defineProperty(this, "audioMode", void 0);
18
31
  this.useHardwareEchoCancellation = params.useHardwareEchoCancellation;
19
32
  this.initialState = params.initialState;
20
33
  this.audioSource = params.audioSource;
34
+ this.audioMode = params.audioMode;
21
35
  }
22
36
  }
23
37
  exports.HMSAudioTrackSettings = HMSAudioTrackSettings;
@@ -1 +1 @@
1
- {"version":3,"names":["HMSAudioTrackSettings","constructor","params","_defineProperty","useHardwareEchoCancellation","initialState","audioSource","exports"],"sources":["HMSAudioTrackSettings.ts"],"sourcesContent":["import type { HMSTrackSettingsInitState } from './HMSTrackSettingsInitState';\n\nexport class HMSAudioTrackSettings {\n initialState?: HMSTrackSettingsInitState;\n useHardwareEchoCancellation?: boolean; // android only\n audioSource?: string[]; // ios only\n\n constructor(params: {\n initialState?: HMSTrackSettingsInitState;\n useHardwareEchoCancellation?: boolean;\n audioSource?: string[];\n }) {\n this.useHardwareEchoCancellation = params.useHardwareEchoCancellation;\n this.initialState = params.initialState;\n this.audioSource = params.audioSource;\n }\n}\n"],"mappings":";;;;;;;;;AAEO,MAAMA,qBAAqB,CAAC;EAGT;;EAExBC,WAAWA,CAACC,MAIX,EAAE;IAAAC,eAAA;IAAAA,eAAA;IAPoC;IAAAA,eAAA;IAQrC,IAAI,CAACC,2BAA2B,GAAGF,MAAM,CAACE,2BAA2B;IACrE,IAAI,CAACC,YAAY,GAAGH,MAAM,CAACG,YAAY;IACvC,IAAI,CAACC,WAAW,GAAGJ,MAAM,CAACI,WAAW;EACvC;AACF;AAACC,OAAA,CAAAP,qBAAA,GAAAA,qBAAA"}
1
+ {"version":3,"names":["HMSAudioTrackSettings","constructor","params","_defineProperty","useHardwareEchoCancellation","initialState","audioSource","audioMode","exports"],"sources":["HMSAudioTrackSettings.ts"],"sourcesContent":["import type { HMSIOSAudioMode } from './HMSIOSAudioMode';\nimport type { HMSTrackSettingsInitState } from './HMSTrackSettingsInitState';\n\n/**\n * Customize local peer's Audio track settings before Joining the Room.\n *\n * Checkout Track Settings docs for more details {@link https://www.100ms.live/docs/react-native/v2/how-to-guides/interact-with-room/track/track-settings}\n */\nexport class HMSAudioTrackSettings {\n initialState?: HMSTrackSettingsInitState;\n useHardwareEchoCancellation?: boolean; // android only\n audioSource?: string[]; // ios only\n\n /**\n * [iOS only] `audioMode` allows you to capture audio in its highest quality\n * by disabling voice processing and increasing the maximum bandwidth limit\n *\n * Checkout Music Mode docs for more details {@link https://www.100ms.live/docs/react-native/v2/how-to-guides/configure-your-device/microphone/music-mode}\n */\n audioMode?: HMSIOSAudioMode; // ios only\n\n constructor(params: {\n initialState?: HMSTrackSettingsInitState;\n useHardwareEchoCancellation?: boolean;\n audioSource?: string[];\n audioMode?: HMSIOSAudioMode;\n }) {\n this.useHardwareEchoCancellation = params.useHardwareEchoCancellation;\n this.initialState = params.initialState;\n this.audioSource = params.audioSource;\n this.audioMode = params.audioMode;\n }\n}\n"],"mappings":";;;;;;;;;AAGA;AACA;AACA;AACA;AACA;AACO,MAAMA,qBAAqB,CAAC;EAWJ;;EAE7BC,WAAWA,CAACC,MAKX,EAAE;IAAAC,eAAA;IAAAA,eAAA;IAhBoC;IAAAA,eAAA;IACf;IAExB;AACF;AACA;AACA;AACA;AACA;IALEA,eAAA;IAcE,IAAI,CAACC,2BAA2B,GAAGF,MAAM,CAACE,2BAA2B;IACrE,IAAI,CAACC,YAAY,GAAGH,MAAM,CAACG,YAAY;IACvC,IAAI,CAACC,WAAW,GAAGJ,MAAM,CAACI,WAAW;IACrC,IAAI,CAACC,SAAS,GAAGL,MAAM,CAACK,SAAS;EACnC;AACF;AAACC,OAAA,CAAAR,qBAAA,GAAAA,qBAAA"}
@@ -162,7 +162,8 @@ class HMSEncoder {
162
162
  static encodeHmsAudioTrackSettings(settings) {
163
163
  const encodedObj = {
164
164
  useHardwareEchoCancellation: settings === null || settings === void 0 ? void 0 : settings.useHardwareAcousticEchoCanceler,
165
- initialState: settings === null || settings === void 0 ? void 0 : settings.initialState
165
+ initialState: settings === null || settings === void 0 ? void 0 : settings.initialState,
166
+ audioMode: settings === null || settings === void 0 ? void 0 : settings.audioMode
166
167
  };
167
168
  return new _HMSAudioTrackSettings.HMSAudioTrackSettings(encodedObj);
168
169
  }