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

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 (69) hide show
  1. package/README.md +13 -7
  2. package/android/src/main/java/com/reactnativehmssdk/HMSRNSDK.kt +1 -1
  3. package/ios/HMSDecoder.swift +21 -24
  4. package/ios/HMSHelper.swift +42 -8
  5. package/ios/HMSManager.m +11 -0
  6. package/ios/HMSManager.swift +87 -18
  7. package/ios/HMSRNSDK.swift +308 -119
  8. package/ios/HMSView.swift +3 -4
  9. package/lib/commonjs/classes/HMSAudioFilePlayerNode.js +87 -0
  10. package/lib/commonjs/classes/HMSAudioFilePlayerNode.js.map +1 -0
  11. package/lib/commonjs/classes/HMSAudioMixerSource.js +26 -0
  12. package/lib/commonjs/classes/HMSAudioMixerSource.js.map +1 -0
  13. package/lib/commonjs/classes/HMSAudioNode.js +26 -0
  14. package/lib/commonjs/classes/HMSAudioNode.js.map +1 -0
  15. package/lib/commonjs/classes/HMSAudioTrackSettings.js +6 -0
  16. package/lib/commonjs/classes/HMSAudioTrackSettings.js.map +1 -1
  17. package/lib/commonjs/classes/HMSEncoder.js +3 -2
  18. package/lib/commonjs/classes/HMSEncoder.js.map +1 -1
  19. package/lib/commonjs/classes/HMSException.js +7 -0
  20. package/lib/commonjs/classes/HMSException.js.map +1 -1
  21. package/lib/commonjs/classes/HMSMicNode.js +35 -0
  22. package/lib/commonjs/classes/HMSMicNode.js.map +1 -0
  23. package/lib/commonjs/classes/HMSSDK.js +22 -34
  24. package/lib/commonjs/classes/HMSSDK.js.map +1 -1
  25. package/lib/commonjs/classes/HMSScreenBroadcastAudioReceiverNode.js +18 -0
  26. package/lib/commonjs/classes/HMSScreenBroadcastAudioReceiverNode.js.map +1 -0
  27. package/lib/commonjs/index.js +70 -0
  28. package/lib/commonjs/index.js.map +1 -1
  29. package/lib/module/classes/HMSAudioFilePlayerNode.js +75 -0
  30. package/lib/module/classes/HMSAudioFilePlayerNode.js.map +1 -0
  31. package/lib/module/classes/HMSAudioMixerSource.js +17 -0
  32. package/lib/module/classes/HMSAudioMixerSource.js.map +1 -0
  33. package/lib/module/classes/HMSAudioNode.js +17 -0
  34. package/lib/module/classes/HMSAudioNode.js.map +1 -0
  35. package/lib/module/classes/HMSAudioTrackSettings.js +6 -0
  36. package/lib/module/classes/HMSAudioTrackSettings.js.map +1 -1
  37. package/lib/module/classes/HMSEncoder.js +3 -2
  38. package/lib/module/classes/HMSEncoder.js.map +1 -1
  39. package/lib/module/classes/HMSException.js +7 -0
  40. package/lib/module/classes/HMSException.js.map +1 -1
  41. package/lib/module/classes/HMSMicNode.js +23 -0
  42. package/lib/module/classes/HMSMicNode.js.map +1 -0
  43. package/lib/module/classes/HMSSDK.js +21 -33
  44. package/lib/module/classes/HMSSDK.js.map +1 -1
  45. package/lib/module/classes/HMSScreenBroadcastAudioReceiverNode.js +8 -0
  46. package/lib/module/classes/HMSScreenBroadcastAudioReceiverNode.js.map +1 -0
  47. package/lib/module/index.js +5 -0
  48. package/lib/module/index.js.map +1 -1
  49. package/lib/typescript/classes/HMSAudioFilePlayerNode.d.ts +12 -0
  50. package/lib/typescript/classes/HMSAudioMixerSource.d.ts +8 -0
  51. package/lib/typescript/classes/HMSAudioNode.d.ts +6 -0
  52. package/lib/typescript/classes/HMSAudioTrackSettings.d.ts +4 -2
  53. package/lib/typescript/classes/HMSException.d.ts +8 -6
  54. package/lib/typescript/classes/HMSMicNode.d.ts +5 -0
  55. package/lib/typescript/classes/HMSSDK.d.ts +28 -26
  56. package/lib/typescript/classes/HMSScreenBroadcastAudioReceiverNode.d.ts +4 -0
  57. package/lib/typescript/index.d.ts +5 -0
  58. package/package.json +1 -1
  59. package/react-native-hms.podspec +2 -1
  60. package/src/classes/HMSAudioFilePlayerNode.ts +75 -0
  61. package/src/classes/HMSAudioMixerSource.ts +15 -0
  62. package/src/classes/HMSAudioNode.ts +12 -0
  63. package/src/classes/HMSAudioTrackSettings.ts +7 -4
  64. package/src/classes/HMSEncoder.ts +1 -0
  65. package/src/classes/HMSException.ts +9 -6
  66. package/src/classes/HMSMicNode.ts +23 -0
  67. package/src/classes/HMSSDK.tsx +47 -58
  68. package/src/classes/HMSScreenBroadcastAudioReceiverNode.ts +7 -0
  69. package/src/index.ts +5 -0
@@ -7,6 +7,7 @@
7
7
 
8
8
  import Foundation
9
9
  import HMSSDK
10
+ import ReplayKit
10
11
 
11
12
  class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
12
13
 
@@ -18,6 +19,12 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
18
19
  var rtcStatsAttached = false
19
20
  var recentPreviewTracks: [HMSTrack]? = []
20
21
  private var reconnectingStage: Bool = false
22
+ private var preferredExtension: String?
23
+ private var systemBroadcastPicker: RPSystemBroadcastPickerView?
24
+ private var startScreenshareResolve: RCTPromiseResolveBlock?
25
+ private var stopScreenshareResolve: RCTPromiseResolveBlock?
26
+ private var isScreenShared: Bool? = false
27
+ private var previewInProgress = false
21
28
 
22
29
  let ON_PREVIEW = "ON_PREVIEW"
23
30
  let ON_JOIN = "ON_JOIN"
@@ -38,14 +45,16 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
38
45
  let ON_REMOTE_VIDEO_STATS = "ON_REMOTE_VIDEO_STATS"
39
46
 
40
47
  // MARK: - Setup
41
-
42
48
  init(data: NSDictionary?, delegate manager: HMSManager?, uid id: String) {
43
- let videoSettings = HMSHelper.getLocalVideoSettings(data?.value(forKey: "video") as? NSDictionary)
44
- let audioSettings = HMSHelper.getLocalAudioSettings(data?.value(forKey: "audio") as? NSDictionary)
49
+ preferredExtension = data?.value(forKey: "preferredExtension") as? String
50
+
45
51
  DispatchQueue.main.async { [weak self] in
46
- let hmsTrackSettings = HMSTrackSettings(videoSettings: videoSettings, audioSettings: audioSettings)
47
52
  self?.hms = HMSSDK.build { sdk in
48
- sdk.trackSettings = hmsTrackSettings
53
+ sdk.appGroup = data?.value(forKey: "appGroup") as? String
54
+ let trackSettings = data?.value(forKey: "trackSettings") as? NSDictionary
55
+ let videoSettings = HMSHelper.getLocalVideoSettings(trackSettings?.value(forKey: "video") as? NSDictionary)
56
+ let audioSettings = HMSHelper.getLocalAudioSettings(trackSettings?.value(forKey: "audio") as? NSDictionary, sdk, self?.delegate, id)
57
+ sdk.trackSettings = HMSTrackSettings(videoSettings: videoSettings, audioSettings: audioSettings)
49
58
  }
50
59
  }
51
60
  self.delegate = manager
@@ -53,18 +62,10 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
53
62
  }
54
63
 
55
64
  // MARK: - HMS SDK Actions
56
-
57
- private var previewInProgress = false
58
-
59
- func emitRequiredKeysError(_ error: String) {
60
- delegate?.emitEvent(ON_ERROR, ["error": ["code": HMSErrorCode.genericErrorUnknown.rawValue, "description": error, "message": error, "name": "REQUIRED_KEYS_NOT_FOUND", "action": "SEND_ALL_REQUIRED_KEYS", "id": 102, "isTerminal": false], "id": id])
61
- }
62
-
63
65
  func preview(_ credentials: NSDictionary) {
64
66
 
65
67
  guard !previewInProgress else {
66
- let error = HMSError(id: "PREVIEW", code: .joinErrorServer, message: "PREVIEW_IS_IN_PROGRESS", params: ["function": #function, "credentials": credentials])
67
- on(error: error)
68
+ delegate?.emitEvent(ON_ERROR, ["error": ["code": 5000, "description": "Preview is in progress", "isTerminal": false, "canRetry": true, "params": ["function": #function]], "id": id])
68
69
  return
69
70
  }
70
71
 
@@ -78,7 +79,7 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
78
79
 
79
80
  let metadata = credentials.value(forKey: "metadata") as? String
80
81
  let captureNetworkQualityInPreview = credentials.value(forKey: "captureNetworkQualityInPreview") as? Bool ?? false
81
-
82
+
82
83
  DispatchQueue.main.async { [weak self] in
83
84
  guard let strongSelf = self else { return }
84
85
  if let endpoint = credentials.value(forKey: "endpoint") as? String {
@@ -91,7 +92,7 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
91
92
  strongSelf.previewInProgress = true
92
93
  }
93
94
  }
94
-
95
+
95
96
  func previewForRole(_ data: NSDictionary, _ resolve: RCTPromiseResolveBlock?, _ reject: RCTPromiseRejectBlock?) {
96
97
  guard let role = data.value(forKey: "role") as? String
97
98
  else {
@@ -100,26 +101,26 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
100
101
  reject?(errorMessage, errorMessage, nil)
101
102
  return
102
103
  }
103
-
104
+
104
105
  let roleObj = HMSHelper.getRoleFromRoleName(role, roles: hms?.roles)
105
-
106
+
106
107
  if let extractedRole = roleObj {
107
108
  hms?.preview(role: extractedRole, completion: { tracks, error in
108
- if (error != nil) {
109
+ if error != nil {
109
110
  delegate?.emitEvent(ON_ERROR, ["error": HMSDecoder.getError(error), "id": id])
110
- reject?(error?.message, error?.localizedDescription, nil)
111
+ reject?(error?.localizedDescription, error?.localizedDescription, nil)
111
112
  return
112
113
  }
113
114
  self.recentPreviewTracks = tracks
114
-
115
+
115
116
  let decodedTracks = HMSDecoder.getAllTracks(tracks ?? [])
116
-
117
+
117
118
  resolve?(["success": true, "tracks": decodedTracks])
118
119
  return
119
120
  })
120
121
  }
121
122
  }
122
-
123
+
123
124
  func cancelPreview() {
124
125
  self.recentPreviewTracks = []
125
126
  hms?.cancelPreview()
@@ -128,8 +129,7 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
128
129
  func join(_ credentials: NSDictionary) {
129
130
 
130
131
  guard !previewInProgress else {
131
- let error = HMSError(id: "PREVIEW", code: .joinErrorServer, message: "PREVIEW_IS_IN_PROGRESS", params: ["function": #function, "credentials": credentials])
132
- on(error: error)
132
+ delegate?.emitEvent("ON_ERROR", ["error": ["code": 5000, "description": "Preview is in progress", "isTerminal": false, "canRetry": true, "params": ["function": #function]], "id": id])
133
133
  return
134
134
  }
135
135
 
@@ -193,19 +193,24 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
193
193
  }
194
194
 
195
195
  func leave(_ resolve: RCTPromiseResolveBlock?, _ reject: RCTPromiseRejectBlock?) {
196
- if(reconnectingStage) {
197
- reject?("101", "Still in reconnecting stage", nil)
196
+ if reconnectingStage {
197
+ reject?("Still in reconnecting stage", "Still in reconnecting stage", nil)
198
198
  } else {
199
199
  DispatchQueue.main.async { [weak self] in
200
200
  guard let strongSelf = self else { return }
201
201
  self?.config = nil
202
202
  self?.recentRoleChangeRequest = nil
203
+ self?.systemBroadcastPicker = nil
204
+ self?.preferredExtension = nil
205
+ self?.stopScreenshareResolve = nil
206
+ self?.startScreenshareResolve = nil
207
+ self?.isScreenShared = false
203
208
  self?.hms?.leave({ success, error in
204
209
  if success {
205
210
  resolve?(["success": success])
206
211
  } else {
207
212
  strongSelf.delegate?.emitEvent(strongSelf.ON_ERROR, ["error": HMSDecoder.getError(error), "id": strongSelf.id])
208
- reject?(nil, "error in leave", nil)
213
+ reject?("error in leave", "error in leave", nil)
209
214
  }
210
215
  })
211
216
  }
@@ -230,7 +235,7 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
230
235
  return
231
236
  } else {
232
237
  self?.delegate?.emitEvent("ON_ERROR", ["error": HMSDecoder.getError(error), "id": self?.id ?? "12345"])
233
- reject?(error?.message, error?.localizedDescription, nil)
238
+ reject?(error?.localizedDescription, error?.localizedDescription, nil)
234
239
  return
235
240
  }
236
241
  })
@@ -256,7 +261,7 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
256
261
  return
257
262
  } else {
258
263
  self?.delegate?.emitEvent("ON_ERROR", ["error": HMSDecoder.getError(error), "id": self?.id ?? "12345"])
259
- reject?(error?.message, error?.localizedDescription, nil)
264
+ reject?(error?.localizedDescription, error?.localizedDescription, nil)
260
265
  return
261
266
  }
262
267
  })
@@ -282,7 +287,7 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
282
287
  return
283
288
  } else {
284
289
  self?.delegate?.emitEvent("ON_ERROR", ["error": HMSDecoder.getError(error), "id": self?.id ?? "12345"])
285
- reject?(error?.message, error?.localizedDescription, nil)
290
+ reject?(error?.localizedDescription, error?.localizedDescription, nil)
286
291
  return
287
292
  }
288
293
  })
@@ -306,7 +311,7 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
306
311
  resolve?(["success": success])
307
312
  } else {
308
313
  self?.delegate?.emitEvent("ON_ERROR", ["error": HMSDecoder.getError(error), "id": self?.id ?? "12345"])
309
- reject?(error?.message, error?.localizedDescription, nil)
314
+ reject?(error?.localizedDescription, error?.localizedDescription, nil)
310
315
  }
311
316
  })
312
317
  self?.recentPreviewTracks = []
@@ -337,7 +342,7 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
337
342
  resolve?(["success": success])
338
343
  } else {
339
344
  self?.delegate?.emitEvent("ON_ERROR", ["error": HMSDecoder.getError(error), "id": self?.id ?? "12345"])
340
- reject?(error?.message, error?.localizedDescription, nil)
345
+ reject?(error?.localizedDescription, error?.localizedDescription, nil)
341
346
  }
342
347
  })
343
348
  }
@@ -358,9 +363,9 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
358
363
  DispatchQueue.main.async { [weak self] in
359
364
  guard let remotePeers = self?.hms?.remotePeers,
360
365
  let track = HMSHelper.getTrackFromTrackId(trackId, remotePeers)
361
- else {
362
- reject?(nil, "TRACK_NOT_FOUND", nil)
363
- return
366
+ else {
367
+ reject?("TRACK_NOT_FOUND", "TRACK_NOT_FOUND", nil)
368
+ return
364
369
  }
365
370
 
366
371
  self?.hms?.changeTrackState(for: track, mute: mute, completion: { success, error in
@@ -368,7 +373,7 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
368
373
  resolve?(["success": success])
369
374
  } else {
370
375
  self?.delegate?.emitEvent("ON_ERROR", ["error": HMSDecoder.getError(error), "id": self?.id ?? "12345"])
371
- reject?(error?.message, error?.localizedDescription, nil)
376
+ reject?(error?.localizedDescription, error?.localizedDescription, nil)
372
377
  }
373
378
  })
374
379
  }
@@ -403,7 +408,7 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
403
408
  resolve?(["success": success])
404
409
  } else {
405
410
  self?.delegate?.emitEvent("ON_ERROR", ["error": HMSDecoder.getError(error), "id": self?.id ?? "12345"])
406
- reject?(error?.message, error?.localizedDescription, nil)
411
+ reject?(error?.localizedDescription, error?.localizedDescription, nil)
407
412
  }
408
413
  })
409
414
  }
@@ -426,9 +431,8 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
426
431
  guard let remotePeers = self?.hms?.remotePeers,
427
432
  let track = HMSHelper.getTrackFromTrackId(trackId, remotePeers)
428
433
  else {
429
- let error = HMSError(id: "120", code: HMSErrorCode.genericErrorUnknown, message: "TRACK_NOT_FOUND")
430
- strongSelf.delegate?.emitEvent(strongSelf.ON_ERROR, ["error": HMSDecoder.getError(error), "id": strongSelf.id])
431
- reject?(nil, "TRACK_NOT_FOUND", nil)
434
+ strongSelf.delegate?.emitEvent("ON_ERROR", ["error": ["code": 6002, "description": "Track not found", "isTerminal": false, "canRetry": true, "params": ["function": #function]], "id": strongSelf.id])
435
+ reject?("Track not found", "Track not found", nil)
432
436
  return
433
437
  }
434
438
  let mute = track.isMute()
@@ -456,9 +460,9 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
456
460
 
457
461
  guard let remotePeers = self?.hms?.remotePeers,
458
462
  let peer = HMSHelper.getRemotePeerFromPeerId(peerId, remotePeers: remotePeers)
459
- else {
460
- reject?(nil, "PEER_NOT_FOUND", nil)
461
- return
463
+ else {
464
+ reject?("PEER_NOT_FOUND", "PEER_NOT_FOUND", nil)
465
+ return
462
466
  }
463
467
 
464
468
  self?.hms?.removePeer(peer, reason: reason ?? "Removed from room", completion: { success, error in
@@ -466,7 +470,7 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
466
470
  resolve?(["success": success])
467
471
  } else {
468
472
  self?.delegate?.emitEvent("ON_ERROR", ["error": HMSDecoder.getError(error), "id": self?.id ?? "12345"])
469
- reject?(error?.message, error?.localizedDescription, nil)
473
+ reject?(error?.localizedDescription, error?.localizedDescription, nil)
470
474
  }
471
475
  })
472
476
  }
@@ -489,7 +493,7 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
489
493
  resolve?(["success": success])
490
494
  } else {
491
495
  self?.delegate?.emitEvent("ON_ERROR", ["error": HMSDecoder.getError(error), "id": self?.id ?? "12345"])
492
- reject?(error?.message, error?.localizedDescription, nil)
496
+ reject?(error?.localizedDescription, error?.localizedDescription, nil)
493
497
  }
494
498
  })
495
499
  }
@@ -506,7 +510,7 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
506
510
  DispatchQueue.main.async { [weak self] in
507
511
  guard let remotePeers = self?.hms?.remotePeers
508
512
  else {
509
- reject?(nil, "REMOTE_PEERS_NOT_FOUND", nil)
513
+ reject?("REMOTE_PEERS_NOT_FOUND", "REMOTE_PEERS_NOT_FOUND", nil)
510
514
  return
511
515
  }
512
516
  let remoteAudioTrack = HMSHelper.getRemoteAudioTrackFromTrackId(trackId, remotePeers)
@@ -520,7 +524,7 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
520
524
  resolve?(isPlaybackAllowed)
521
525
  return
522
526
  } else {
523
- reject?(nil, "TRACK_NOT_FOUND", nil)
527
+ reject?("TRACK_NOT_FOUND", "TRACK_NOT_FOUND", nil)
524
528
  return
525
529
  }
526
530
  }
@@ -574,7 +578,7 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
574
578
  return
575
579
  } else {
576
580
  self.delegate?.emitEvent(self.ON_ERROR, ["error": HMSDecoder.getError(error), "id": self.id])
577
- reject?(error?.message, error?.localizedDescription, nil)
581
+ reject?(error?.localizedDescription, error?.localizedDescription, nil)
578
582
  return
579
583
  }
580
584
  })
@@ -598,8 +602,7 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
598
602
  if remoteAudioTrack != nil {
599
603
  remoteAudioTrack?.setVolume(volume)
600
604
  } else {
601
- let error = HMSError(id: "125", code: HMSErrorCode.genericErrorUnknown, message: "TRACK_NOT_FOUND")
602
- strongSelf.delegate?.emitEvent(strongSelf.ON_ERROR, ["error": HMSDecoder.getError(error), "id": strongSelf.id])
605
+ strongSelf.delegate?.emitEvent("ON_ERROR", ["error": ["code": 6002, "description": "Track not found", "isTerminal": false, "canRetry": true, "params": ["function": #function]], "id": strongSelf.id])
603
606
  }
604
607
  }
605
608
  }
@@ -620,9 +623,8 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
620
623
  if let meetLink = URL(string: meetingString) {
621
624
  meetingUrl = meetLink
622
625
  } else {
623
- let error = HMSError(id: "127", code: HMSErrorCode.genericErrorUnknown, message: "INVALID_MEETING_URL_PASSED")
624
- delegate?.emitEvent(ON_ERROR, ["error": HMSDecoder.getError(error), "id": id])
625
- reject?("INVALID_MEETING_URL_PASSED", "INVALID_MEETING_URL_PASSED", nil)
626
+ delegate?.emitEvent(ON_ERROR, ["error": ["code": 6002, "description": "Invalid meeting url passed", "isTerminal": false, "canRetry": true, "params": ["function": #function]], "id": id])
627
+ reject?("Invalid meeting url passed", "Invalid meeting url passed", nil)
626
628
  }
627
629
 
628
630
  let URLs = HMSHelper.getRtmpUrls(rtmpStrings)
@@ -640,7 +642,7 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
640
642
  return
641
643
  } else {
642
644
  self.delegate?.emitEvent(self.ON_ERROR, ["error": HMSDecoder.getError(error), "id": self.id])
643
- reject?(error?.message, error?.localizedDescription, nil)
645
+ reject?(error?.localizedDescription, error?.localizedDescription, nil)
644
646
  return
645
647
  }
646
648
  })
@@ -659,7 +661,7 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
659
661
  return
660
662
  } else {
661
663
  self.delegate?.emitEvent(self.ON_ERROR, ["error": HMSDecoder.getError(error), "id": self.id])
662
- reject?(error?.message, error?.localizedDescription, nil)
664
+ reject?(error?.localizedDescription, error?.localizedDescription, nil)
663
665
  return
664
666
  }
665
667
  })
@@ -667,9 +669,9 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
667
669
 
668
670
  func startHLSStreaming(_ data: NSDictionary, _ resolve: RCTPromiseResolveBlock?, _ reject: RCTPromiseRejectBlock?) {
669
671
  let recordConfig = HMSHelper.getHlsRecordingConfig(data.value(forKey: "hlsRecordingConfig") as? NSDictionary)
670
- let hlsMeetingUrlVariant = HMSHelper.getHMSHLSMeetingURLVariants(data.value(forKey: "meetingURLVariants") as? [[String : Any]])
671
- var config: HMSHLSConfig? = nil
672
- if(!hlsMeetingUrlVariant.isEmpty || recordConfig !== nil){
672
+ let hlsMeetingUrlVariant = HMSHelper.getHMSHLSMeetingURLVariants(data.value(forKey: "meetingURLVariants") as? [[String: Any]])
673
+ var config: HMSHLSConfig?
674
+ if !hlsMeetingUrlVariant.isEmpty || recordConfig !== nil {
673
675
  config = HMSHLSConfig(variants: hlsMeetingUrlVariant, recording: recordConfig)
674
676
  }
675
677
 
@@ -685,7 +687,7 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
685
687
  return
686
688
  } else {
687
689
  self.delegate?.emitEvent(self.ON_ERROR, ["error": HMSDecoder.getError(error), "id": self.id])
688
- reject?(error?.message, error?.localizedDescription, nil)
690
+ reject?(error?.localizedDescription, error?.localizedDescription, nil)
689
691
  return
690
692
  }
691
693
  })
@@ -704,12 +706,12 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
704
706
  return
705
707
  } else {
706
708
  self.delegate?.emitEvent(self.ON_ERROR, ["error": HMSDecoder.getError(error), "id": self.id])
707
- reject?(error?.message, error?.localizedDescription, nil)
709
+ reject?(error?.localizedDescription, error?.localizedDescription, nil)
708
710
  return
709
711
  }
710
712
  })
711
713
  }
712
-
714
+
713
715
  func changeName(_ data: NSDictionary, _ resolve: RCTPromiseResolveBlock?, _ reject: RCTPromiseRejectBlock?) {
714
716
  guard let name = data.value(forKey: "name") as? String
715
717
  else {
@@ -724,14 +726,14 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
724
726
  resolve?(["success": success])
725
727
  } else {
726
728
  self.delegate?.emitEvent(self.ON_ERROR, ["error": HMSDecoder.getError(error), "id": self.id])
727
- reject?(error?.message, error?.localizedDescription, nil)
729
+ reject?(error?.localizedDescription, error?.localizedDescription, nil)
728
730
  }
729
731
  }
730
732
  }
731
-
733
+
732
734
  func remoteMuteAllAudio(_ resolve: RCTPromiseResolveBlock?, _ reject: RCTPromiseRejectBlock?) {
733
735
  let allAudioTracks = HMSUtilities.getAllAudioTracks(in: (self.hms?.room)!!)
734
- var customError: HMSError? = nil
736
+ var customError: Error?
735
737
  for audioTrack in allAudioTracks {
736
738
  self.hms?.changeTrackState(for: audioTrack, mute: true, completion: { success, error in
737
739
  if success {
@@ -740,10 +742,10 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
740
742
  }
741
743
  })
742
744
  }
743
- if (customError === nil) {
745
+ if customError == nil {
744
746
  resolve?(["success": true])
745
747
  } else {
746
- reject?(customError?.message, customError?.localizedDescription, nil)
748
+ reject?(customError?.localizedDescription, customError?.localizedDescription, nil)
747
749
  }
748
750
  }
749
751
 
@@ -767,43 +769,220 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
767
769
 
768
770
  self.delegate?.emitEvent(ON_PEER_UPDATE, ["event": ON_PEER_UPDATE, "room": roomData, "localPeer": localPeerData, "remotePeers": remotePeerData])
769
771
  }
770
-
772
+
771
773
  func enableRTCStats() {
772
774
  rtcStatsAttached = true
773
775
  }
774
-
776
+
775
777
  func disableRTCStats() {
776
778
  rtcStatsAttached = false
777
779
  }
778
780
 
779
- // TODO: to be implemented after volume is exposed for iOS
780
- // func getVolume(_ data: NSDictionary, _ resolve: RCTPromiseResolveBlock?, _ reject: RCTPromiseRejectBlock?) {
781
- // guard let trackId = data.value(forKey: "trackId") as? String
782
- // else {
783
- // let errorMessage = "getVolume: " + HMSHelper.getUnavailableRequiredKey(data, ["trackId"])
784
- // emitRequiredKeysError(errorMessage)
785
- // reject?(errorMessage, errorMessage, nil)
786
- // return
787
- // }
788
- //
789
- // if (localPeer?.localAudioTrack()?.trackId == trackId) {
790
- //
791
- // }
792
- // }
781
+ func startScreenshare(_ resolve: RCTPromiseResolveBlock?, _ reject: RCTPromiseRejectBlock?) {
782
+ guard let preferredExtension = preferredExtension else {
783
+ 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])
784
+ reject?("Could not start screen share, preferredExtension not passed in Build method", "Could not start screen share, preferredExtension not passed in Build method", nil)
785
+ return
786
+ }
787
+ DispatchQueue.main.async { [weak self] in
788
+ if self?.systemBroadcastPicker == nil {
789
+ self?.systemBroadcastPicker = RPSystemBroadcastPickerView()
790
+ self?.systemBroadcastPicker!.preferredExtension = preferredExtension
791
+ self?.systemBroadcastPicker!.showsMicrophoneButton = false
792
+ }
793
793
 
794
- // func setLocalVideoSettings(_ data: NSDictionary) {
795
- // let localVideoTrack = self.hms?.localPeer?.localVideoTrack()
796
- //
797
- // guard let settings = HMSHelper.getLocalVideoSettings(data)
798
- // else {
799
- // let errorMessage = "setLocalVideoSettings: " + HMSHelper.getUnavailableRequiredKey(data)
800
- // emitRequiredKeysError(errorMessage)
801
- // return
802
- // }
803
- // localVideoTrack?.settings = settings
804
- // }
805
-
806
- // MARK: - HMS SDK Delegate Callbacks
794
+ for view in self!.systemBroadcastPicker!.subviews {
795
+ if let button = view as? UIButton {
796
+ button.sendActions(for: .allEvents)
797
+ }
798
+ }
799
+ self?.startScreenshareResolve = resolve
800
+ }
801
+ }
802
+
803
+ func stopScreenshare(_ resolve: RCTPromiseResolveBlock?, _ reject: RCTPromiseRejectBlock?) {
804
+ guard let preferredExtension = preferredExtension else {
805
+ 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])
806
+ reject?("Could not start screen share, preferredExtension not passed in Build method", "Could not start screen share, preferredExtension not passed in Build method", nil)
807
+ return
808
+ }
809
+ DispatchQueue.main.async { [weak self] in
810
+ if self?.systemBroadcastPicker == nil {
811
+ self?.systemBroadcastPicker = RPSystemBroadcastPickerView()
812
+ self?.systemBroadcastPicker!.preferredExtension = preferredExtension
813
+ self?.systemBroadcastPicker!.showsMicrophoneButton = false
814
+ }
815
+
816
+ for view in self!.systemBroadcastPicker!.subviews {
817
+ if let button = view as? UIButton {
818
+ button.sendActions(for: .allEvents)
819
+ }
820
+ }
821
+ self?.stopScreenshareResolve = resolve
822
+ }
823
+ }
824
+
825
+ func isScreenShared(_ resolve: RCTPromiseResolveBlock?, _ reject: RCTPromiseRejectBlock?) {
826
+ resolve?(isScreenShared)
827
+ }
828
+
829
+ func playAudioShare(_ data: NSDictionary, _ resolve: RCTPromiseResolveBlock?, _ reject: RCTPromiseRejectBlock?) {
830
+ guard let fileUrl = data.value(forKey: "fileUrl") as? String,
831
+ let audioNodeName = data.value(forKey: "audioNode") as? String,
832
+ let audioMixerSourceMap = HMSHelper.getAudioMixerSourceMap(),
833
+ let playerNode = audioMixerSourceMap[audioNodeName]
834
+ else {
835
+ let errorMessage = "playAudioShare: " + HMSHelper.getUnavailableRequiredKey(data, ["audioNode", "fileUrl"])
836
+ emitRequiredKeysError(errorMessage)
837
+ reject?(errorMessage, errorMessage, nil)
838
+ return
839
+ }
840
+ let loops = data.value(forKey: "loops") as? Bool ?? false
841
+ let interrupts = data.value(forKey: "interrupts") as? Bool ?? false
842
+ if let audioFilePlayerNode = playerNode as? HMSAudioFilePlayerNode {
843
+ if let url = URL(string: fileUrl) {
844
+ do {
845
+ try audioFilePlayerNode.play(fileUrl: url, loops: loops, interrupts: interrupts)
846
+ resolve?(["success": true])
847
+ } catch {
848
+ delegate?.emitEvent(ON_ERROR, ["error": ["code": 6002, "description": error.localizedDescription, "isTerminal": false, "canRetry": true, "params": ["function": #function]], "id": id])
849
+ reject?(error.localizedDescription, error.localizedDescription, nil)
850
+ }
851
+ } else {
852
+ delegate?.emitEvent(ON_ERROR, ["error": ["code": 6002, "description": "Incorrect url", "isTerminal": false, "canRetry": true, "params": ["function": #function]], "id": id])
853
+ reject?("Incorrect URL", "Incorrect URL", nil)
854
+ }
855
+ } else {
856
+ delegate?.emitEvent(ON_ERROR, ["error": ["code": 6002, "description": "AudioFilePlayerNode not found", "isTerminal": false, "canRetry": true, "params": ["function": #function]], "id": id])
857
+ reject?("AudioFilePlayerNode not found", "AudioFilePlayerNode not found", nil)
858
+ }
859
+ }
860
+
861
+ func setAudioShareVolume(_ data: NSDictionary) {
862
+ guard let volume = data.value(forKey: "volume") as? NSNumber,
863
+ let audioNodeName = data.value(forKey: "audioNode") as? String,
864
+ let audioMixerSourceMap = HMSHelper.getAudioMixerSourceMap(),
865
+ let playerNode = audioMixerSourceMap[audioNodeName]
866
+ else {
867
+ let errorMessage = "setAudioShareVolume: " + HMSHelper.getUnavailableRequiredKey(data, ["audioNode", "volume"])
868
+ emitRequiredKeysError(errorMessage)
869
+ return
870
+ }
871
+ if let audioMicNode = playerNode as? HMSMicNode {
872
+ audioMicNode.volume = volume.floatValue
873
+ }
874
+ if let audioFilePlayerNode = playerNode as? HMSAudioFilePlayerNode {
875
+ audioFilePlayerNode.volume = volume.floatValue
876
+ }
877
+ }
878
+
879
+ func stopAudioShare(_ data: NSDictionary) {
880
+ guard let audioNodeName = data.value(forKey: "audioNode") as? String,
881
+ let audioMixerSourceMap = HMSHelper.getAudioMixerSourceMap(),
882
+ let playerNode = audioMixerSourceMap[audioNodeName]
883
+ else {
884
+ let errorMessage = "stopAudioShare: " + HMSHelper.getUnavailableRequiredKey(data, ["audioNode"])
885
+ emitRequiredKeysError(errorMessage)
886
+ return
887
+ }
888
+ if let audioFilePlayerNode = playerNode as? HMSAudioFilePlayerNode {
889
+ audioFilePlayerNode.stop()
890
+ } else {
891
+ delegate?.emitEvent(ON_ERROR, ["error": ["code": 6002, "description": "AudioFilePlayerNode not found", "isTerminal": false, "canRetry": true, "params": ["function": #function]], "id": id])
892
+ }
893
+ }
894
+
895
+ func resumeAudioShare(_ data: NSDictionary) {
896
+ guard let audioNodeName = data.value(forKey: "audioNode") as? String,
897
+ let audioMixerSourceMap = HMSHelper.getAudioMixerSourceMap(),
898
+ let playerNode = audioMixerSourceMap[audioNodeName]
899
+ else {
900
+ let errorMessage = "resumeAudioShare: " + HMSHelper.getUnavailableRequiredKey(data, ["audioNode"])
901
+ emitRequiredKeysError(errorMessage)
902
+ return
903
+ }
904
+ if let audioFilePlayerNode = playerNode as? HMSAudioFilePlayerNode {
905
+ do {
906
+ try audioFilePlayerNode.resume()
907
+ } catch {
908
+ delegate?.emitEvent(ON_ERROR, ["error": ["code": 6002, "description": error.localizedDescription, "isTerminal": false, "canRetry": true, "params": ["function": #function]], "id": id])
909
+ }
910
+ } else {
911
+ delegate?.emitEvent(ON_ERROR, ["error": ["code": 6002, "description": "AudioFilePlayerNode not found", "isTerminal": false, "canRetry": true, "params": ["function": #function]], "id": id])
912
+ }
913
+ }
914
+
915
+ func pauseAudioShare(_ data: NSDictionary) {
916
+ guard let audioNodeName = data.value(forKey: "audioNode") as? String,
917
+ let audioMixerSourceMap = HMSHelper.getAudioMixerSourceMap(),
918
+ let playerNode = audioMixerSourceMap[audioNodeName]
919
+ else {
920
+ let errorMessage = "pauseAudioShare: " + HMSHelper.getUnavailableRequiredKey(data, ["audioNode"])
921
+ emitRequiredKeysError(errorMessage)
922
+ return
923
+ }
924
+ if let audioFilePlayerNode = playerNode as? HMSAudioFilePlayerNode {
925
+ audioFilePlayerNode.pause()
926
+ } else {
927
+ delegate?.emitEvent(ON_ERROR, ["error": ["code": 6002, "description": "AudioFilePlayerNode not found", "isTerminal": false, "canRetry": true, "params": ["function": #function]], "id": id])
928
+ }
929
+ }
930
+
931
+ func audioShareIsPlaying(_ data: NSDictionary, _ resolve: RCTPromiseResolveBlock?, _ reject: RCTPromiseRejectBlock?) {
932
+ guard let audioNodeName = data.value(forKey: "audioNode") as? String,
933
+ let audioMixerSourceMap = HMSHelper.getAudioMixerSourceMap(),
934
+ let playerNode = audioMixerSourceMap[audioNodeName]
935
+ else {
936
+ let errorMessage = "pauseAudioShare: " + HMSHelper.getUnavailableRequiredKey(data, ["audioNode"])
937
+ emitRequiredKeysError(errorMessage)
938
+ reject?(errorMessage, errorMessage, nil)
939
+ return
940
+ }
941
+ if let audioFilePlayerNode = playerNode as? HMSAudioFilePlayerNode {
942
+ resolve?(audioFilePlayerNode.isPlaying)
943
+ } else {
944
+ delegate?.emitEvent(ON_ERROR, ["error": ["code": 6002, "description": "AudioFilePlayerNode not found", "isTerminal": false, "canRetry": true, "params": ["function": #function]], "id": id])
945
+ reject?("AudioFilePlayerNode not found", "AudioFilePlayerNode not found", nil)
946
+ }
947
+ }
948
+
949
+ func audioShareCurrentTime(_ data: NSDictionary, _ resolve: RCTPromiseResolveBlock?, _ reject: RCTPromiseRejectBlock?) {
950
+ guard let audioNodeName = data.value(forKey: "audioNode") as? String,
951
+ let audioMixerSourceMap = HMSHelper.getAudioMixerSourceMap(),
952
+ let playerNode = audioMixerSourceMap[audioNodeName]
953
+ else {
954
+ let errorMessage = "pauseAudioShare: " + HMSHelper.getUnavailableRequiredKey(data, ["audioNode"])
955
+ emitRequiredKeysError(errorMessage)
956
+ reject?(errorMessage, errorMessage, nil)
957
+ return
958
+ }
959
+ if let audioFilePlayerNode = playerNode as? HMSAudioFilePlayerNode {
960
+ resolve?(audioFilePlayerNode.currentTime)
961
+ } else {
962
+ delegate?.emitEvent(ON_ERROR, ["error": ["code": 6002, "description": "AudioFilePlayerNode not found", "isTerminal": false, "canRetry": true, "params": ["function": #function]], "id": id])
963
+ reject?("AudioFilePlayerNode not found", "AudioFilePlayerNode not found", nil)
964
+ }
965
+ }
966
+
967
+ func audioShareDuration(_ data: NSDictionary, _ resolve: RCTPromiseResolveBlock?, _ reject: RCTPromiseRejectBlock?) {
968
+ guard let audioNodeName = data.value(forKey: "audioNode") as? String,
969
+ let audioMixerSourceMap = HMSHelper.getAudioMixerSourceMap(),
970
+ let playerNode = audioMixerSourceMap[audioNodeName]
971
+ else {
972
+ let errorMessage = "pauseAudioShare: " + HMSHelper.getUnavailableRequiredKey(data, ["audioNode"])
973
+ emitRequiredKeysError(errorMessage)
974
+ reject?(errorMessage, errorMessage, nil)
975
+ return
976
+ }
977
+ if let audioFilePlayerNode = playerNode as? HMSAudioFilePlayerNode {
978
+ resolve?(audioFilePlayerNode.duration)
979
+ } else {
980
+ delegate?.emitEvent(ON_ERROR, ["error": ["code": 6002, "description": "AudioFilePlayerNode not found", "isTerminal": false, "canRetry": true, "params": ["function": #function]], "id": id])
981
+ reject?("AudioFilePlayerNode not found", "AudioFilePlayerNode not found", nil)
982
+ }
983
+ }
984
+
985
+ // MARK: - HMS SDK Delegate Callbacks
807
986
  func on(join room: HMSRoom) {
808
987
  let roomData = HMSDecoder.getHmsRoom(room)
809
988
  let localPeerData = HMSDecoder.getHmsLocalPeer(hms?.localPeer)
@@ -856,10 +1035,22 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
856
1035
  let hmsPeer = HMSDecoder.getHmsPeer(peer)
857
1036
  let hmsTrack = HMSDecoder.getHmsTrack(track)
858
1037
 
1038
+ if peer.isLocal && track.source.uppercased() == "SCREEN" && track.kind == HMSTrackKind.video {
1039
+ if update == .trackAdded {
1040
+ isScreenShared = true
1041
+ startScreenshareResolve?(["success": true])
1042
+ startScreenshareResolve = nil
1043
+ } else if update == .trackRemoved {
1044
+ isScreenShared = false
1045
+ stopScreenshareResolve?(["success": true])
1046
+ stopScreenshareResolve = nil
1047
+ }
1048
+ }
1049
+
859
1050
  self.delegate?.emitEvent(ON_TRACK_UPDATE, ["event": ON_TRACK_UPDATE, "id": self.id, "room": roomData, "type": type, "localPeer": localPeerData, "remotePeers": remotePeerData, "peer": hmsPeer, "track": hmsTrack])
860
1051
  }
861
1052
 
862
- func on(error: HMSError) {
1053
+ func on(error: Error) {
863
1054
  if previewInProgress { previewInProgress = false }
864
1055
  self.delegate?.emitEvent(ON_ERROR, ["error": HMSDecoder.getError(error), "id": id])
865
1056
  }
@@ -878,7 +1069,7 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
878
1069
 
879
1070
  func onReconnecting() {
880
1071
  reconnectingStage = true
881
- self.delegate?.emitEvent(RECONNECTING, ["event": RECONNECTING, "error": ["code": HMSErrorCode.websocketConnectionLost, "description": "Software caused connection abort", "localizedDescription": "Network connection lost ", "debugDescription": "Network connection lost ", "message": "Network connection lost ", "name": "WebSocketConnectionLost", "action": "NONE", "id": 101], "id": self.id ])
1072
+ self.delegate?.emitEvent(RECONNECTING, ["event": RECONNECTING, "error": ["code": 1003, "description": "Network connection lost ", "isTerminal": false, "canRetry": true], "id": self.id ])
882
1073
  }
883
1074
 
884
1075
  func onReconnected() {
@@ -907,59 +1098,59 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
907
1098
  let roomEnded = notification.roomEnded
908
1099
  self.delegate?.emitEvent(ON_REMOVED_FROM_ROOM, ["event": ON_REMOVED_FROM_ROOM, "id": self.id, "requestedBy": decodedRequestedBy as Any, "reason": reason, "roomEnded": roomEnded ])
909
1100
  }
910
-
1101
+
911
1102
  func on(rtcStats: HMSRTCStatsReport) {
912
- if (!rtcStatsAttached) {
1103
+ if !rtcStatsAttached {
913
1104
  return
914
1105
  }
915
1106
  let video = HMSDecoder.getHMSRTCStats(rtcStats.video)
916
1107
  let audio = HMSDecoder.getHMSRTCStats(rtcStats.audio)
917
1108
  let combined = HMSDecoder.getHMSRTCStats(rtcStats.combined)
918
-
1109
+
919
1110
  self.delegate?.emitEvent(ON_RTC_STATS, ["video": video, "audio": audio, "combined": combined, "id": self.id])
920
1111
  }
921
-
1112
+
922
1113
  func on(localAudioStats: HMSLocalAudioStats, track: HMSLocalAudioTrack, peer: HMSPeer) {
923
- if (!rtcStatsAttached) {
1114
+ if !rtcStatsAttached {
924
1115
  return
925
1116
  }
926
1117
  let localStats = HMSDecoder.getLocalAudioStats(localAudioStats)
927
1118
  let localTrack = HMSDecoder.getHmsLocalAudioTrack(track)
928
1119
  let decodedPeer = HMSDecoder.getHmsPeer(peer)
929
-
1120
+
930
1121
  self.delegate?.emitEvent(ON_LOCAL_AUDIO_STATS, ["localAudioStats": localStats, "track": localTrack, "peer": decodedPeer, "id": self.id])
931
1122
  }
932
-
1123
+
933
1124
  func on(localVideoStats: HMSLocalVideoStats, track: HMSLocalVideoTrack, peer: HMSPeer) {
934
- if (!rtcStatsAttached) {
1125
+ if !rtcStatsAttached {
935
1126
  return
936
1127
  }
937
1128
  let localStats = HMSDecoder.getLocalVideoStats(localVideoStats)
938
1129
  let decodedPeer = HMSDecoder.getHmsPeer(peer)
939
1130
  let localTrack = HMSDecoder.getHmsLocalVideoTrack(track)
940
-
1131
+
941
1132
  self.delegate?.emitEvent(ON_LOCAL_VIDEO_STATS, ["localVideoStats": localStats, "track": localTrack, "peer": decodedPeer, "id": self.id])
942
1133
  }
943
-
1134
+
944
1135
  func on(remoteAudioStats: HMSRemoteAudioStats, track: HMSRemoteAudioTrack, peer: HMSPeer) {
945
- if (!rtcStatsAttached) {
1136
+ if !rtcStatsAttached {
946
1137
  return
947
1138
  }
948
1139
  let remoteStats = HMSDecoder.getRemoteAudioStats(remoteAudioStats)
949
1140
  let remoteTrack = HMSDecoder.getHMSRemoteAudioTrack(track)
950
1141
  let decodedPeer = HMSDecoder.getHmsPeer(peer)
951
-
1142
+
952
1143
  self.delegate?.emitEvent(ON_REMOTE_AUDIO_STATS, ["remoteAudioStats": remoteStats, "track": remoteTrack, "peer": decodedPeer, "id": self.id])
953
1144
  }
954
-
1145
+
955
1146
  func on(remoteVideoStats: HMSRemoteVideoStats, track: HMSRemoteVideoTrack, peer: HMSPeer) {
956
- if (!rtcStatsAttached) {
1147
+ if !rtcStatsAttached {
957
1148
  return
958
1149
  }
959
1150
  let remoteStats = HMSDecoder.getRemoteVideoStats(remoteVideoStats)
960
1151
  let decodedPeer = HMSDecoder.getHmsPeer(peer)
961
1152
  let remoteTrack = HMSDecoder.getHMSRemoteVideoTrack(track)
962
-
1153
+
963
1154
  self.delegate?.emitEvent(ON_REMOTE_VIDEO_STATS, ["remoteVideoStats": remoteStats, "track": remoteTrack, "peer": decodedPeer, "id": self.id])
964
1155
  }
965
1156
 
@@ -1024,10 +1215,8 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener {
1024
1215
  return ""
1025
1216
  }
1026
1217
  }
1027
- }
1028
1218
 
1029
- // extension HMSRNSDK: HMSLogger {
1030
- // func log(_ message: String, _ level: HMSLogLevel) {
1031
- //
1032
- // }
1033
- // }
1219
+ func emitRequiredKeysError(_ error: String) {
1220
+ delegate?.emitEvent(ON_ERROR, ["error": ["code": 6002, "description": error, "isTerminal": false, "canRetry": true], "id": id])
1221
+ }
1222
+ }