@100mslive/react-native-hms 0.8.4 → 0.9.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 (82) hide show
  1. package/README.md +6 -6
  2. package/android/build.gradle +3 -1
  3. package/android/src/main/java/com/reactnativehmssdk/HmsDecoder.kt +27 -2
  4. package/android/src/main/java/com/reactnativehmssdk/HmsHelper.kt +25 -0
  5. package/android/src/main/java/com/reactnativehmssdk/HmsModule.kt +81 -4
  6. package/android/src/main/java/com/reactnativehmssdk/HmsSDK.kt +174 -84
  7. package/android/src/main/java/com/reactnativehmssdk/HmsScreenshareActivity.kt +66 -0
  8. package/android/src/main/java/com/reactnativehmssdk/HmsView.kt +28 -3
  9. package/android/src/main/java/com/reactnativehmssdk/HmssdkViewManager.kt +10 -1
  10. package/android/src/main/res/layout/hms_view.xml +19 -0
  11. package/ios/HmsDecoder.swift +58 -2
  12. package/ios/HmsHelper.swift +21 -0
  13. package/ios/HmsManager.m +4 -2
  14. package/ios/HmsManager.swift +16 -2
  15. package/ios/HmsSDK.swift +63 -11
  16. package/ios/HmsView.swift +22 -54
  17. package/lib/commonjs/classes/HMSEncoder.js +2 -1
  18. package/lib/commonjs/classes/HMSEncoder.js.map +1 -1
  19. package/lib/commonjs/classes/HMSHLSConfig.js +20 -0
  20. package/lib/commonjs/classes/HMSHLSConfig.js.map +1 -0
  21. package/lib/commonjs/classes/HMSHLSMeetingURLVariant.js +23 -0
  22. package/lib/commonjs/classes/HMSHLSMeetingURLVariant.js.map +1 -0
  23. package/lib/commonjs/classes/HMSHLSStreamingState.js +23 -0
  24. package/lib/commonjs/classes/HMSHLSStreamingState.js.map +1 -0
  25. package/lib/commonjs/classes/HMSHLSVariant.js +29 -0
  26. package/lib/commonjs/classes/HMSHLSVariant.js.map +1 -0
  27. package/lib/commonjs/classes/HMSLogger.js +27 -0
  28. package/lib/commonjs/classes/HMSLogger.js.map +1 -1
  29. package/lib/commonjs/classes/HMSRoom.js +3 -0
  30. package/lib/commonjs/classes/HMSRoom.js.map +1 -1
  31. package/lib/commonjs/classes/HMSRoomUpdate.js +6 -0
  32. package/lib/commonjs/classes/HMSRoomUpdate.js.map +1 -1
  33. package/lib/commonjs/classes/HMSSDK.js +203 -96
  34. package/lib/commonjs/classes/HMSSDK.js.map +1 -1
  35. package/lib/commonjs/classes/HmsView.js +26 -4
  36. package/lib/commonjs/classes/HmsView.js.map +1 -1
  37. package/lib/commonjs/index.js +56 -0
  38. package/lib/commonjs/index.js.map +1 -1
  39. package/lib/module/classes/HMSEncoder.js +2 -1
  40. package/lib/module/classes/HMSEncoder.js.map +1 -1
  41. package/lib/module/classes/HMSHLSConfig.js +11 -0
  42. package/lib/module/classes/HMSHLSConfig.js.map +1 -0
  43. package/lib/module/classes/HMSHLSMeetingURLVariant.js +14 -0
  44. package/lib/module/classes/HMSHLSMeetingURLVariant.js.map +1 -0
  45. package/lib/module/classes/HMSHLSStreamingState.js +14 -0
  46. package/lib/module/classes/HMSHLSStreamingState.js.map +1 -0
  47. package/lib/module/classes/HMSHLSVariant.js +20 -0
  48. package/lib/module/classes/HMSHLSVariant.js.map +1 -0
  49. package/lib/module/classes/HMSLogger.js +27 -0
  50. package/lib/module/classes/HMSLogger.js.map +1 -1
  51. package/lib/module/classes/HMSRoom.js +3 -0
  52. package/lib/module/classes/HMSRoom.js.map +1 -1
  53. package/lib/module/classes/HMSRoomUpdate.js +6 -0
  54. package/lib/module/classes/HMSRoomUpdate.js.map +1 -1
  55. package/lib/module/classes/HMSSDK.js +204 -97
  56. package/lib/module/classes/HMSSDK.js.map +1 -1
  57. package/lib/module/classes/HmsView.js +23 -4
  58. package/lib/module/classes/HmsView.js.map +1 -1
  59. package/lib/module/index.js +4 -0
  60. package/lib/module/index.js.map +1 -1
  61. package/lib/typescript/classes/HMSHLSConfig.d.ts +7 -0
  62. package/lib/typescript/classes/HMSHLSMeetingURLVariant.d.ts +8 -0
  63. package/lib/typescript/classes/HMSHLSStreamingState.d.ts +9 -0
  64. package/lib/typescript/classes/HMSHLSVariant.d.ts +12 -0
  65. package/lib/typescript/classes/HMSLogger.d.ts +2 -0
  66. package/lib/typescript/classes/HMSRoom.d.ts +3 -0
  67. package/lib/typescript/classes/HMSRoomUpdate.d.ts +7 -1
  68. package/lib/typescript/classes/HMSSDK.d.ts +16 -7
  69. package/lib/typescript/index.d.ts +4 -0
  70. package/package.json +1 -2
  71. package/react-native-hms.podspec +1 -1
  72. package/src/classes/HMSEncoder.ts +1 -0
  73. package/src/classes/HMSHLSConfig.ts +9 -0
  74. package/src/classes/HMSHLSMeetingURLVariant.ts +9 -0
  75. package/src/classes/HMSHLSStreamingState.ts +11 -0
  76. package/src/classes/HMSHLSVariant.ts +18 -0
  77. package/src/classes/HMSLogger.ts +14 -0
  78. package/src/classes/HMSRoom.ts +4 -0
  79. package/src/classes/HMSRoomUpdate.ts +6 -0
  80. package/src/classes/HMSSDK.tsx +95 -19
  81. package/src/classes/HmsView.tsx +32 -4
  82. package/src/index.ts +4 -0
@@ -0,0 +1,66 @@
1
+ package com.reactnativehmssdk
2
+
3
+ import android.app.Activity
4
+ import android.content.Context
5
+ import android.content.Intent
6
+ import android.media.projection.MediaProjectionManager
7
+ import android.os.Bundle
8
+ import androidx.activity.ComponentActivity
9
+ import androidx.activity.result.ActivityResultLauncher
10
+ import androidx.activity.result.contract.ActivityResultContracts
11
+ import live.hms.video.error.HMSException
12
+ import live.hms.video.sdk.HMSActionResultListener
13
+
14
+ class HmsScreenshareActivity : ComponentActivity() {
15
+ private var resultLauncher: ActivityResultLauncher<Intent> =
16
+ this.registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
17
+ if (result.resultCode == Activity.RESULT_OK) {
18
+ val mediaProjectionPermissionResultData: Intent? = result.data
19
+ val id = intent.getStringExtra("id")
20
+ HmsModule.hmsCollection[id]?.hmsSDK?.startScreenshare(
21
+ object : HMSActionResultListener {
22
+ override fun onError(error: HMSException) {
23
+ finish()
24
+ HmsModule.hmsCollection[id]?.emitHMSError(error)
25
+ }
26
+ override fun onSuccess() {
27
+ finish()
28
+ }
29
+ },
30
+ mediaProjectionPermissionResultData
31
+ )
32
+ } else {
33
+ finish()
34
+ }
35
+ }
36
+
37
+ override fun onCreate(savedInstanceState: Bundle?) {
38
+ super.onCreate(savedInstanceState)
39
+ startScreenshare()
40
+ }
41
+
42
+ private fun startScreenshare() {
43
+ val id = intent.getStringExtra("id")
44
+ val isScreenShared = HmsModule.hmsCollection[id]?.hmsSDK?.isScreenShared()
45
+ if (isScreenShared !== null && !isScreenShared) {
46
+ try {
47
+ val mediaProjectionManager =
48
+ getSystemService(Context.MEDIA_PROJECTION_SERVICE) as MediaProjectionManager
49
+ resultLauncher.launch(mediaProjectionManager.createScreenCaptureIntent())
50
+ } catch (e: Exception) {
51
+ println(e)
52
+ }
53
+ } else {
54
+ HmsModule.hmsCollection[id]?.emitHMSError(
55
+ HMSException(
56
+ 103,
57
+ "SCREENSHARE_IS_ALREADY_RUNNING",
58
+ "SCREENSHARE_IS_ALREADY_RUNNING",
59
+ "SCREENSHARE_IS_ALREADY_RUNNING",
60
+ "SCREENSHARE_IS_ALREADY_RUNNING"
61
+ )
62
+ )
63
+ finish()
64
+ }
65
+ }
66
+ }
@@ -1,8 +1,13 @@
1
1
  package com.reactnativehmssdk
2
2
 
3
3
  import android.annotation.SuppressLint
4
+ import android.content.Context
5
+ import android.view.LayoutInflater
4
6
  import android.widget.FrameLayout
7
+ import com.facebook.react.bridge.Arguments
5
8
  import com.facebook.react.bridge.ReactContext
9
+ import com.facebook.react.bridge.WritableMap
10
+ import com.facebook.react.uimanager.events.RCTEventEmitter
6
11
  import live.hms.video.media.tracks.HMSTrackType
7
12
  import live.hms.video.media.tracks.HMSVideoTrack
8
13
  import live.hms.video.utils.SharedEglContext
@@ -14,11 +19,23 @@ class HmsView(context: ReactContext) : FrameLayout(context) {
14
19
  private var surfaceView: SurfaceViewRenderer = SurfaceViewRenderer(context)
15
20
  private var videoTrack: HMSVideoTrack? = null
16
21
  private var localTrack: String? = null
22
+ private var scaleTypeApplied: Boolean = false
23
+ private var currentScaleType: RendererCommon.ScalingType =
24
+ RendererCommon.ScalingType.SCALE_ASPECT_FILL
17
25
 
18
26
  init {
27
+ val inflater = getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
28
+ val view = inflater.inflate(R.layout.hms_view, this)
29
+
30
+ surfaceView = view.findViewById(R.id.surfaceView)
19
31
  surfaceView.setEnableHardwareScaler(true)
20
- surfaceView.setScalingType(RendererCommon.ScalingType.SCALE_ASPECT_FIT)
21
- addView(surfaceView)
32
+ }
33
+
34
+ fun onReceiveNativeEvent() {
35
+ val event: WritableMap = Arguments.createMap()
36
+ event.putString("message", "MyMessage")
37
+ val reactContext = context as ReactContext
38
+ reactContext.getJSModule(RCTEventEmitter::class.java).receiveEvent(id, "topChange", event)
22
39
  }
23
40
 
24
41
  override fun onDetachedFromWindow() {
@@ -31,6 +48,12 @@ class HmsView(context: ReactContext) : FrameLayout(context) {
31
48
  super.onAttachedToWindow()
32
49
  surfaceView.init(SharedEglContext.context, null)
33
50
  videoTrack?.addSink(surfaceView)
51
+ if (!scaleTypeApplied) {
52
+ if (currentScaleType != RendererCommon.ScalingType.SCALE_ASPECT_FILL) {
53
+ onReceiveNativeEvent()
54
+ }
55
+ scaleTypeApplied = true
56
+ }
34
57
  }
35
58
 
36
59
  fun updateScaleType(scaleType: String?) {
@@ -38,14 +61,17 @@ class HmsView(context: ReactContext) : FrameLayout(context) {
38
61
  when (scaleType) {
39
62
  "ASPECT_FIT" -> {
40
63
  surfaceView.setScalingType(RendererCommon.ScalingType.SCALE_ASPECT_FIT)
64
+ currentScaleType = RendererCommon.ScalingType.SCALE_ASPECT_FIT
41
65
  return
42
66
  }
43
67
  "ASPECT_FILL" -> {
44
68
  surfaceView.setScalingType(RendererCommon.ScalingType.SCALE_ASPECT_FILL)
69
+ currentScaleType = RendererCommon.ScalingType.SCALE_ASPECT_FILL
45
70
  return
46
71
  }
47
72
  "ASPECT_BALANCED" -> {
48
73
  surfaceView.setScalingType((RendererCommon.ScalingType.SCALE_ASPECT_BALANCED))
74
+ currentScaleType = RendererCommon.ScalingType.SCALE_ASPECT_BALANCED
49
75
  return
50
76
  }
51
77
  else -> {
@@ -62,7 +88,6 @@ class HmsView(context: ReactContext) : FrameLayout(context) {
62
88
  mirror: Boolean?
63
89
  ) {
64
90
  var sdkId = "12345"
65
-
66
91
  if (id != null) {
67
92
  sdkId = id
68
93
  }
@@ -1,6 +1,7 @@
1
1
  package com.reactnativehmssdk
2
2
 
3
3
  import com.facebook.react.bridge.ReadableMap
4
+ import com.facebook.react.common.MapBuilder
4
5
  import com.facebook.react.uimanager.SimpleViewManager
5
6
  import com.facebook.react.uimanager.ThemedReactContext
6
7
  import com.facebook.react.uimanager.annotations.ReactProp
@@ -18,13 +19,21 @@ class HmssdkViewManager : SimpleViewManager<HmsView>() {
18
19
  return HmsView(reactContext)
19
20
  }
20
21
 
22
+ override fun getExportedCustomBubblingEventTypeConstants(): MutableMap<String, Any>? {
23
+ return MapBuilder.builder<String, Any>()
24
+ .put(
25
+ "topChange",
26
+ MapBuilder.of("phasedRegistrationNames", MapBuilder.of("bubbled", "onChange"))
27
+ )
28
+ .build()
29
+ }
30
+
21
31
  @ReactProp(name = "data")
22
32
  fun setData(view: HmsView, data: ReadableMap) {
23
33
  val trackId = data.getString("trackId")
24
34
  // val sink = data.getBoolean("sink")
25
35
  val id = data.getString("id")
26
36
  val mirror = data.getBoolean("mirror")
27
-
28
37
  val hmsCollection = getHms()
29
38
  if (hmsCollection != null) {
30
39
  view.setData(id, trackId, hmsCollection, mirror)
@@ -0,0 +1,19 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
3
+ xmlns:app="http://schemas.android.com/apk/res-auto"
4
+ xmlns:tools="http://schemas.android.com/tools"
5
+ android:layout_width="match_parent"
6
+ android:layout_height="match_parent"
7
+ android:background="#000">
8
+
9
+ <org.webrtc.SurfaceViewRenderer
10
+ android:id="@+id/surfaceView"
11
+ android:layout_width="wrap_content"
12
+ android:layout_height="wrap_content"
13
+ android:layout_gravity="center"
14
+ app:layout_constraintBottom_toBottomOf="parent"
15
+ app:layout_constraintEnd_toEndOf="parent"
16
+ app:layout_constraintStart_toStartOf="parent"
17
+ app:layout_constraintTop_toTopOf="parent" />
18
+
19
+ </FrameLayout>
@@ -12,13 +12,14 @@ class HmsDecoder: NSObject {
12
12
  let browserRecordingState = HmsDecoder.getHMSBrowserRecordingState(hmsRoom?.browserRecordingState)
13
13
  let rtmpStreamingState = HmsDecoder.getHMSRtmpStreamingState(hmsRoom?.rtmpStreamingState)
14
14
  let serverRecordingState = HmsDecoder.getHMSServerRecordingState(hmsRoom?.serverRecordingState)
15
+ let hlsStreamingState = HmsDecoder.getHlsStreamingState(hmsRoom?.hlsStreamingState)
15
16
  var peers = [[String: Any]]()
16
17
 
17
18
  for peer in room.peers {
18
19
  peers.append(getHmsPeer(peer))
19
20
  }
20
21
 
21
- return ["id": id, "name": name, "metaData": metaData, "peers": peers, "browserRecordingState": browserRecordingState, "rtmpHMSRtmpStreamingState": rtmpStreamingState, "serverRecordingState": serverRecordingState]
22
+ return ["id": id, "name": name, "metaData": metaData, "peers": peers, "browserRecordingState": browserRecordingState, "rtmpHMSRtmpStreamingState": rtmpStreamingState, "serverRecordingState": serverRecordingState, "hlsStreamingState": hlsStreamingState]
22
23
  }
23
24
 
24
25
  static func getHmsPeer (_ peer: HMSPeer) -> [String: Any] {
@@ -281,12 +282,13 @@ class HmsDecoder: NSObject {
281
282
  let name = role.name
282
283
  let permissions = getHmsPermissions(role.permissions)
283
284
  let publishSettings = getHmsPublishSettings(role.publishSettings)
285
+ let subscribeSettings = getHmsSubscribeSettings(role.subscribeSettings)
284
286
  let priority = role.priority
285
287
  let generalPermissions = role.generalPermissions ?? [:]
286
288
  let internalPlugins = role.internalPlugins ?? [:]
287
289
  let externalPlugins = role.externalPlugins ?? [:]
288
290
 
289
- return ["name": name, "permissions": permissions, "publishSettings": publishSettings, "priority": priority, "generalPermissions": generalPermissions, "internalPlugins": internalPlugins, "externalPlugins": externalPlugins]
291
+ return ["name": name, "permissions": permissions, "publishSettings": publishSettings, "subscribeSettings": subscribeSettings, "priority": priority, "generalPermissions": generalPermissions, "internalPlugins": internalPlugins, "externalPlugins": externalPlugins]
290
292
  }
291
293
 
292
294
  static func getHmsPermissions (_ permissions: HMSPermissions) -> [String: Any] {
@@ -329,6 +331,30 @@ class HmsDecoder: NSObject {
329
331
  "screenSimulcastLayers": screenSimulcastLayers,
330
332
  "allowed": allowed]
331
333
  }
334
+
335
+ static func getHmsSubscribeSettings (_ subscribeSettings: HMSSubscribeSettings?) -> [String: Any] {
336
+ guard let settings = subscribeSettings
337
+ else { return [:] }
338
+
339
+ let maxSubsBitRate = settings.maxSubsBitRate
340
+ let subscribeDegradationParam = getHmsSubscribeDegradationSettings(settings.subscribeDegradation)
341
+ let subscribeTo = settings.subscribeToRoles
342
+
343
+ return ["maxSubsBitRate": maxSubsBitRate, "subscribeDegradationParam": subscribeDegradationParam, "subscribeTo": subscribeTo ?? []]
344
+ }
345
+
346
+ static func getHmsSubscribeDegradationSettings (_ hmsSubscribeDegradationParams: HMSSubscribeDegradationPolicy?) -> [String: Any] {
347
+ guard let params = hmsSubscribeDegradationParams
348
+ else {
349
+ return [:]
350
+ }
351
+
352
+ let degradeGracePeriodSeconds = String(params.degradeGracePeriodSeconds ?? 0)
353
+ let packetLossThreshold = String(params.packetLossThreshold ?? 0)
354
+ let recoverGracePeriodSeconds = String(params.recoverGracePeriodSeconds ?? 0)
355
+
356
+ return ["degradeGracePeriodSeconds": degradeGracePeriodSeconds, "packetLossThreshold": packetLossThreshold, "recoverGracePeriodSeconds": recoverGracePeriodSeconds]
357
+ }
332
358
 
333
359
  static func getWriteableArray(_ array: [String]?) -> [String] {
334
360
  var decodedArray = [String]()
@@ -355,6 +381,8 @@ class HmsDecoder: NSObject {
355
381
  let width = videoSettings.width
356
382
  let height = videoSettings.height
357
383
 
384
+
385
+
358
386
  return ["bitRate": bitRate ?? 0, "codec": codec, "frameRate": frameRate, "width": width, "height": height]
359
387
  }
360
388
 
@@ -474,4 +502,32 @@ class HmsDecoder: NSObject {
474
502
  return [:]
475
503
  }
476
504
  }
505
+
506
+ static func getHlsStreamingState(_ data: HMSHLSStreamingState?) -> [String: Any] {
507
+ if let streamingState = data {
508
+ let running = streamingState.running
509
+ let variants = HmsDecoder.getHMSHlsVariant(streamingState.variants)
510
+
511
+ return ["running": running, "variants": variants]
512
+ } else {
513
+ return [:]
514
+ }
515
+ }
516
+
517
+ static func getHMSHlsVariant(_ data: [HMSHLSVariant]?) -> [[String: Any]] {
518
+ var variants = [[String: Any]]()
519
+
520
+ if let hlsVariant = data {
521
+ for variant in hlsVariant {
522
+ let meetingUrl = variant.meetingURL.absoluteString
523
+ let metadata = variant.metadata
524
+ let startedAt = variant.startedAt?.timeIntervalSince1970 ?? 0
525
+ let hlsStreamingUrl = variant.url.absoluteString
526
+
527
+ let decodedVariant = ["meetingUrl": meetingUrl, "metadata": metadata, "hlsStreamUrl": hlsStreamingUrl, "startedAt": startedAt] as [String: Any]
528
+ variants.append(decodedVariant)
529
+ }
530
+ }
531
+ return variants
532
+ }
477
533
  }
@@ -200,4 +200,25 @@ class HmsHelper: NSObject {
200
200
  return nil
201
201
  }
202
202
  }
203
+
204
+ static func getHMSHLSMeetingURLVariants(_ variants: [[String: Any]]?) -> [HMSHLSMeetingURLVariant] {
205
+ var hlsVariants: [HMSHLSMeetingURLVariant] = []
206
+ for variant in variants ?? [] {
207
+ let meetingURLVariant = HmsHelper.getHMSHLSMeetingURLVariant(variant)
208
+ if let extractedVariant = meetingURLVariant {
209
+ hlsVariants.append(extractedVariant)
210
+ }
211
+ }
212
+ return hlsVariants
213
+ }
214
+
215
+ static func getHMSHLSMeetingURLVariant(_ variant: [String: Any]) -> HMSHLSMeetingURLVariant? {
216
+ let meetingUrl = variant["meetingUrl"] as? String
217
+ let metadata = variant["metadata"] as? String
218
+
219
+ if let extractedUrl = meetingUrl, let url = URL(string: extractedUrl) {
220
+ return HMSHLSMeetingURLVariant(meetingURL: url, metadata: metadata ?? "")
221
+ }
222
+ return nil
223
+ }
203
224
  }
package/ios/HmsManager.m CHANGED
@@ -15,8 +15,8 @@ RCT_EXTERN_METHOD(removePeer: (NSDictionary) data :(RCTPromiseResolveBlock) reso
15
15
  RCT_EXTERN_METHOD(endRoom: (NSDictionary) data :(RCTPromiseResolveBlock) resolve :(RCTPromiseRejectBlock) reject)
16
16
  RCT_EXTERN_METHOD(changeRole: (NSDictionary) data :(RCTPromiseResolveBlock) resolve :(RCTPromiseRejectBlock) reject)
17
17
  RCT_EXTERN_METHOD(changeTrackState: (NSDictionary) data :(RCTPromiseResolveBlock) resolve :(RCTPromiseRejectBlock) reject)
18
- RCT_EXTERN_METHOD(changeTrackStateRoles: (NSDictionary) data :(RCTPromiseResolveBlock) resolve :(RCTPromiseRejectBlock) reject)
19
- RCT_EXTERN_METHOD(acceptRoleChange: (NSDictionary) data)
18
+ RCT_EXTERN_METHOD(changeTrackStateForRoles: (NSDictionary) data :(RCTPromiseResolveBlock) resolve :(RCTPromiseRejectBlock) reject)
19
+ RCT_EXTERN_METHOD(acceptRoleChange: (NSDictionary) data :(RCTPromiseResolveBlock) resolve :(RCTPromiseRejectBlock) reject)
20
20
  RCT_EXTERN_METHOD(isMute: (NSDictionary) data :(RCTPromiseResolveBlock) resolve :(RCTPromiseRejectBlock) reject)
21
21
  RCT_EXTERN_METHOD(getRoom: (NSDictionary) data :(RCTPromiseResolveBlock) resolve :(RCTPromiseRejectBlock) reject)
22
22
  RCT_EXTERN_METHOD(switchCamera: (NSDictionary) data)
@@ -28,4 +28,6 @@ RCT_EXTERN_METHOD(isPlaybackAllowed: (NSDictionary) data :(RCTPromiseResolveBloc
28
28
  RCT_EXTERN_METHOD(changeMetadata: (NSDictionary) data :(RCTPromiseResolveBlock) resolve :(RCTPromiseRejectBlock) reject)
29
29
  RCT_EXTERN_METHOD(startRTMPOrRecording: (NSDictionary) data :(RCTPromiseResolveBlock) resolve :(RCTPromiseRejectBlock) reject)
30
30
  RCT_EXTERN_METHOD(stopRtmpAndRecording: (NSDictionary) data :(RCTPromiseResolveBlock) resolve :(RCTPromiseRejectBlock) reject)
31
+ RCT_EXTERN_METHOD(startHLSStreaming: (NSDictionary) data :(RCTPromiseResolveBlock) resolve :(RCTPromiseRejectBlock) reject)
32
+ RCT_EXTERN_METHOD(stopHLSStreaming: (NSDictionary) data :(RCTPromiseResolveBlock) resolve :(RCTPromiseRejectBlock) reject)
31
33
  @end
@@ -141,10 +141,10 @@ class HmsManager: RCTEventEmitter{
141
141
  }
142
142
 
143
143
  @objc
144
- func changeTrackStateRoles(_ data: NSDictionary, _ resolve: RCTPromiseResolveBlock?, _ reject: RCTPromiseRejectBlock?) {
144
+ func changeTrackStateForRoles(_ data: NSDictionary, _ resolve: RCTPromiseResolveBlock?, _ reject: RCTPromiseRejectBlock?) {
145
145
  let hms = HmsHelper.getHms(data, hmsCollection)
146
146
 
147
- hms?.changeTrackStateRoles(data, resolve, reject)
147
+ hms?.changeTrackStateForRoles(data, resolve, reject)
148
148
  }
149
149
 
150
150
  @objc
@@ -237,6 +237,20 @@ class HmsManager: RCTEventEmitter{
237
237
  hms?.stopRtmpAndRecording(resolve, reject)
238
238
  }
239
239
 
240
+ @objc
241
+ func startHLSStreaming(_ data: NSDictionary, _ resolve: RCTPromiseResolveBlock?, _ reject: RCTPromiseRejectBlock?) {
242
+ let hms = HmsHelper.getHms(data, hmsCollection)
243
+
244
+ hms?.startHLSStreaming(data, resolve, reject)
245
+ }
246
+
247
+ @objc
248
+ func stopHLSStreaming(_ data: NSDictionary, _ resolve: RCTPromiseResolveBlock?, _ reject: RCTPromiseRejectBlock?) {
249
+ let hms = HmsHelper.getHms(data, hmsCollection)
250
+
251
+ hms?.stopHLSStreaming(resolve, reject)
252
+ }
253
+
240
254
  // @objc
241
255
  // func setLocalVideoSettings(_ data: NSDictionary) {
242
256
  // let hms = HmsHelper.getHms(data, hmsCollection)
package/ios/HmsSDK.swift CHANGED
@@ -233,7 +233,6 @@ class HmsSDK: HMSUpdateListener, HMSPreviewListener {
233
233
  return
234
234
  }
235
235
  })
236
- self?.hms?.sendDirectMessage(type: type, message: message, peer: peer)
237
236
  }
238
237
  }
239
238
 
@@ -311,23 +310,26 @@ class HmsSDK: HMSUpdateListener, HMSPreviewListener {
311
310
  }
312
311
  }
313
312
 
314
- func changeTrackStateRoles(_ data: NSDictionary, _ resolve: RCTPromiseResolveBlock?, _ reject: RCTPromiseRejectBlock?) {
313
+ func changeTrackStateForRoles(_ data: NSDictionary, _ resolve: RCTPromiseResolveBlock?, _ reject: RCTPromiseRejectBlock?) {
315
314
 
316
- guard let source = data.value(forKey: "source") as? String,
317
- let targetedRoles = data.value(forKey: "roles") as? [String],
318
- let type = data.value(forKey: "type") as? String
315
+ guard let mute = data.value(forKey: "mute") as? Bool
319
316
  else {
320
317
  let error = HMSError(id: "113", code: HMSErrorCode.genericErrorUnknown, message: "REQUIRED_KEYS_NOT_FOUND")
321
318
  delegate?.emitEvent(ON_ERROR, ["event": ON_ERROR, "error": HmsDecoder.getError(error), "id":id])
322
319
  return
323
320
  }
324
- var decodeType: HMSTrackKind;
325
- if( type == "AUDIO") {
326
- decodeType = HMSTrackKind.audio
327
- }else {
328
- decodeType = HMSTrackKind.video
321
+ let source = data.value(forKey: "source") as? String
322
+ let targetedRoles = data.value(forKey: "roles") as? [String]
323
+ let type = data.value(forKey: "type") as? String
324
+
325
+ var decodeType: HMSTrackKind? = nil;
326
+ if( type != nil){
327
+ if( type == "AUDIO") {
328
+ decodeType = HMSTrackKind.audio
329
+ }else {
330
+ decodeType = HMSTrackKind.video
331
+ }
329
332
  }
330
- let mute = data.value(forKey: "mute") as? Bool ?? true
331
333
 
332
334
  DispatchQueue.main.async { [weak self] in
333
335
  let encodedTargetedRoles = HmsHelper.getRolesFromRoleNames(targetedRoles, roles: self?.hms?.roles)
@@ -598,6 +600,54 @@ class HmsSDK: HMSUpdateListener, HMSPreviewListener {
598
600
  })
599
601
  }
600
602
 
603
+ func startHLSStreaming(_ data: NSDictionary, _ resolve: RCTPromiseResolveBlock?, _ reject: RCTPromiseRejectBlock?) {
604
+ guard let meetingURLVariants = data.value(forKey: "meetingURLVariants") as? [[String: Any]]?
605
+ else {
606
+ let error = HMSError(id: "126", code: HMSErrorCode.genericErrorUnknown, message: "REQUIRED_KEYS_NOT_FOUND")
607
+ delegate?.emitEvent(ON_ERROR, ["event": ON_ERROR, "error": HmsDecoder.getError(error), "id":id])
608
+ return
609
+ }
610
+
611
+ let hlsMeetingUrlVariant = HmsHelper.getHMSHLSMeetingURLVariants(meetingURLVariants)
612
+ let config = HMSHLSConfig(variants: hlsMeetingUrlVariant)
613
+
614
+ hms?.startHLSStreaming(config: config, completion: { success, error in
615
+ if (success) {
616
+ let roomData = HmsDecoder.getHmsRoom(self.hms?.room)
617
+ let type = self.getString(from: HMSRoomUpdate.hlsStreamingStateUpdated)
618
+
619
+ let localPeerData = HmsDecoder.getHmsLocalPeer(self.hms?.localPeer)
620
+ let remotePeerData = HmsDecoder.getHmsRemotePeers(self.hms?.remotePeers)
621
+ self.delegate?.emitEvent(self.ON_ROOM_UPDATE, ["event": self.ON_ROOM_UPDATE, "id": self.id, "type": type, "room": roomData, "localPeer": localPeerData, "remotePeers": remotePeerData])
622
+ resolve?(["success": success])
623
+ return
624
+ } else {
625
+ self.delegate?.emitEvent(self.ON_ERROR, ["event": self.ON_ERROR, "error": HmsDecoder.getError(error), "id":self.id])
626
+ reject?(error?.message, error?.localizedDescription, nil)
627
+ return
628
+ }
629
+ })
630
+ }
631
+
632
+ func stopHLSStreaming(_ resolve: RCTPromiseResolveBlock?, _ reject: RCTPromiseRejectBlock?) {
633
+ hms?.stopHLSStreaming(config: nil, completion: { success, error in
634
+ if (success) {
635
+ let roomData = HmsDecoder.getHmsRoom(self.hms?.room)
636
+ let type = self.getString(from: HMSRoomUpdate.browserRecordingStateUpdated)
637
+
638
+ let localPeerData = HmsDecoder.getHmsLocalPeer(self.hms?.localPeer)
639
+ let remotePeerData = HmsDecoder.getHmsRemotePeers(self.hms?.remotePeers)
640
+ self.delegate?.emitEvent(self.ON_ROOM_UPDATE, ["event": self.ON_ROOM_UPDATE, "id": self.id, "type": type, "room": roomData, "localPeer": localPeerData, "remotePeers": remotePeerData])
641
+ resolve?(["success": success])
642
+ return
643
+ } else {
644
+ self.delegate?.emitEvent(self.ON_ERROR, ["event": self.ON_ERROR, "error": HmsDecoder.getError(error), "id":self.id])
645
+ reject?(error?.message, error?.localizedDescription, nil)
646
+ return
647
+ }
648
+ })
649
+ }
650
+
601
651
  //TODO: to be implemented after volume is exposed for iOS
602
652
  // func getVolume(_ data: NSDictionary, _ resolve: RCTPromiseResolveBlock?, _ reject: RCTPromiseRejectBlock?) {
603
653
  // guard let trackId = data.value(forKey: "trackId") as? String
@@ -797,6 +847,8 @@ class HmsSDK: HMSUpdateListener, HMSPreviewListener {
797
847
  return "META_DATA_CHANGED"
798
848
  case .browserRecordingStateUpdated:
799
849
  return "BROWSER_RECORDING_STATE_UPDATED"
850
+ case .hlsStreamingStateUpdated:
851
+ return "HLS_STREAMING_STATE_UPDATED"
800
852
  case .rtmpStreamingStateUpdated:
801
853
  return "RTMP_STREAMING_STATE_UPDATED"
802
854
  case.serverRecordingStateUpdated:
package/ios/HmsView.swift CHANGED
@@ -30,7 +30,6 @@ class HmssdkDisplayView: UIView {
30
30
  }()
31
31
 
32
32
  var hmsCollection: [String: HmsSDK] = [:]
33
- var localTrack: String?
34
33
  var sinked = false
35
34
  var sinkVideo = true
36
35
 
@@ -58,66 +57,31 @@ class HmssdkDisplayView: UIView {
58
57
 
59
58
  @objc var data: NSDictionary = [:] {
60
59
  didSet {
61
- guard let trackID = data.value(forKey: "trackId") as? String,
60
+
61
+ let sdkID = data.value(forKey: "id") as? String ?? "12345"
62
+
63
+ guard let hmsSDK = hmsCollection[sdkID]?.hms,
64
+ let trackID = data.value(forKey: "trackId") as? String,
65
+ let videoTrack = HMSUtilities.getVideoTrack(for: trackID, in: hmsSDK.room!),
62
66
  let sink = data.value(forKey: "sink") as? Bool
63
- else { return }
67
+ else {
68
+ print(#function, "Required data to setup video view not found")
69
+ return
70
+ }
64
71
 
65
72
  sinkVideo = sink
66
- localTrack = trackID
73
+
67
74
  let mirror = data.value(forKey: "mirror") as? Bool
68
- if(mirror != nil){
75
+ if (mirror != nil) {
69
76
  videoView.mirror = mirror!
70
77
  }
71
78
 
72
- var id : String = "12345"
73
-
74
- if let sdkId = data.value(forKey: "id") as? String {
75
- id = sdkId
76
- }
77
-
78
- if let videoTrack: HMSVideoTrack = hmsCollection[id]?.hms?.localPeer?.videoTrack {
79
- if videoTrack.trackId == trackID {
80
-
81
- if !sinked && sinkVideo {
82
- videoView.setVideoTrack(videoTrack)
83
- sinked = true
84
- } else if !sinkVideo {
85
- videoView.setVideoTrack(nil)
86
- sinked = false
87
- }
88
- return
89
- }
90
- }
91
-
92
- if let remotePeers: [HMSRemotePeer] = hmsCollection[id]?.hms?.remotePeers {
93
- for peer in remotePeers where peer.videoTrack?.trackId == trackID {
94
-
95
- if !sinked && sinkVideo {
96
- videoView.setVideoTrack(peer.videoTrack)
97
- sinked = true
98
- } else if !sinkVideo {
99
- videoView.setVideoTrack(nil)
100
- sinked = false
101
- }
102
- return
103
- }
104
- for peer in remotePeers {
105
- let auxTracks = peer.auxiliaryTracks
106
- if let auxTracksVals = auxTracks {
107
- for track in auxTracksVals where track.trackId == trackID {
108
- if (HmsHelper.getHmsTrackType(track.kind) == "VIDEO") {
109
- if !sinked && sinkVideo {
110
- videoView.setVideoTrack(track as? HMSVideoTrack)
111
- sinked = true
112
- } else if !sinkVideo {
113
- videoView.setVideoTrack(nil)
114
- sinked = false
115
- }
116
- return
117
- }
118
- }
119
- }
120
- }
79
+ if !sinked && sinkVideo {
80
+ videoView.setVideoTrack(videoTrack)
81
+ sinked = true
82
+ } else if !sinkVideo {
83
+ videoView.setVideoTrack(nil)
84
+ sinked = false
121
85
  }
122
86
  }
123
87
  }
@@ -139,4 +103,8 @@ class HmssdkDisplayView: UIView {
139
103
  required init?(coder: NSCoder) {
140
104
  fatalError("init(coder:) has not been implemented")
141
105
  }
106
+
107
+ deinit {
108
+ videoView.setVideoTrack(nil)
109
+ }
142
110
  }
@@ -44,7 +44,8 @@ class HMSEncoder {
44
44
  peers: HMSEncoder.encodeHmsPeers(room === null || room === void 0 ? void 0 : room.peers, id),
45
45
  browserRecordingState: room === null || room === void 0 ? void 0 : room.browserRecordingState,
46
46
  rtmpHMSRtmpStreamingState: room === null || room === void 0 ? void 0 : room.rtmpHMSRtmpStreamingState,
47
- serverRecordingState: room === null || room === void 0 ? void 0 : room.serverRecordingState
47
+ serverRecordingState: room === null || room === void 0 ? void 0 : room.serverRecordingState,
48
+ hlsStreamingState: room === null || room === void 0 ? void 0 : room.hlsStreamingState
48
49
  };
49
50
  return new _HMSRoom.HMSRoom(encodedObj);
50
51
  }