@100mslive/react-native-hms 0.8.1 → 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 (141) hide show
  1. package/README.md +6 -6
  2. package/android/.gradle/6.9/executionHistory/executionHistory.lock +0 -0
  3. package/android/.gradle/6.9/fileHashes/fileHashes.lock +0 -0
  4. package/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock +0 -0
  5. package/android/.gradle/buildOutputCleanup/cache.properties +1 -1
  6. package/android/.gradle/checksums/checksums.lock +0 -0
  7. package/android/.gradle/checksums/md5-checksums.bin +0 -0
  8. package/android/.gradle/checksums/sha1-checksums.bin +0 -0
  9. package/android/build.gradle +3 -2
  10. package/android/src/main/java/com/reactnativehmssdk/HmsDecoder.kt +226 -256
  11. package/android/src/main/java/com/reactnativehmssdk/HmsHelper.kt +82 -31
  12. package/android/src/main/java/com/reactnativehmssdk/HmsModule.kt +99 -22
  13. package/android/src/main/java/com/reactnativehmssdk/HmsSDK.kt +368 -221
  14. package/android/src/main/java/com/reactnativehmssdk/HmsScreenshareActivity.kt +66 -0
  15. package/android/src/main/java/com/reactnativehmssdk/HmsView.kt +43 -24
  16. package/android/src/main/java/com/reactnativehmssdk/HmssdkPackage.kt +1 -2
  17. package/android/src/main/java/com/reactnativehmssdk/HmssdkViewManager.kt +14 -11
  18. package/android/src/main/res/layout/hms_view.xml +19 -0
  19. package/ios/HmsDecoder.swift +91 -22
  20. package/ios/HmsHelper.swift +34 -3
  21. package/ios/HmsManager.m +11 -9
  22. package/ios/HmsManager.swift +32 -18
  23. package/ios/HmsSDK.swift +193 -43
  24. package/ios/HmsView.swift +22 -54
  25. package/lib/commonjs/classes/HMSChangeTrackStateRequest.js +3 -0
  26. package/lib/commonjs/classes/HMSChangeTrackStateRequest.js.map +1 -1
  27. package/lib/commonjs/classes/HMSEncoder.js +10 -6
  28. package/lib/commonjs/classes/HMSEncoder.js.map +1 -1
  29. package/lib/commonjs/classes/HMSHLSConfig.js +20 -0
  30. package/lib/commonjs/classes/HMSHLSConfig.js.map +1 -0
  31. package/lib/commonjs/classes/HMSHLSMeetingURLVariant.js +23 -0
  32. package/lib/commonjs/classes/HMSHLSMeetingURLVariant.js.map +1 -0
  33. package/lib/commonjs/classes/HMSHLSStreamingState.js +23 -0
  34. package/lib/commonjs/classes/HMSHLSStreamingState.js.map +1 -0
  35. package/lib/commonjs/classes/HMSHLSVariant.js +29 -0
  36. package/lib/commonjs/classes/HMSHLSVariant.js.map +1 -0
  37. package/lib/commonjs/classes/HMSLocalAudioTrack.js +20 -0
  38. package/lib/commonjs/classes/HMSLocalAudioTrack.js.map +1 -1
  39. package/lib/commonjs/classes/HMSLocalPeer.js.map +1 -1
  40. package/lib/commonjs/classes/HMSLocalVideoTrack.js +18 -0
  41. package/lib/commonjs/classes/HMSLocalVideoTrack.js.map +1 -1
  42. package/lib/commonjs/classes/HMSLogger.js +55 -1
  43. package/lib/commonjs/classes/HMSLogger.js.map +1 -1
  44. package/lib/commonjs/classes/HMSRemoteAudioTrack.js +19 -0
  45. package/lib/commonjs/classes/HMSRemoteAudioTrack.js.map +1 -1
  46. package/lib/commonjs/classes/HMSRemoteVideoTrack.js +19 -0
  47. package/lib/commonjs/classes/HMSRemoteVideoTrack.js.map +1 -1
  48. package/lib/commonjs/classes/HMSRoom.js +3 -0
  49. package/lib/commonjs/classes/HMSRoom.js.map +1 -1
  50. package/lib/commonjs/classes/HMSRoomUpdate.js +6 -0
  51. package/lib/commonjs/classes/HMSRoomUpdate.js.map +1 -1
  52. package/lib/commonjs/classes/HMSSDK.js +297 -145
  53. package/lib/commonjs/classes/HMSSDK.js.map +1 -1
  54. package/lib/commonjs/classes/HMSTrackSettings.js +3 -0
  55. package/lib/commonjs/classes/HMSTrackSettings.js.map +1 -1
  56. package/lib/commonjs/classes/HMSVideoCodec.js +4 -4
  57. package/lib/commonjs/classes/HMSVideoCodec.js.map +1 -1
  58. package/lib/commonjs/classes/HmsView.js +26 -4
  59. package/lib/commonjs/classes/HmsView.js.map +1 -1
  60. package/lib/commonjs/index.js +70 -0
  61. package/lib/commonjs/index.js.map +1 -1
  62. package/lib/module/classes/HMSChangeTrackStateRequest.js +3 -0
  63. package/lib/module/classes/HMSChangeTrackStateRequest.js.map +1 -1
  64. package/lib/module/classes/HMSEncoder.js +10 -6
  65. package/lib/module/classes/HMSEncoder.js.map +1 -1
  66. package/lib/module/classes/HMSHLSConfig.js +11 -0
  67. package/lib/module/classes/HMSHLSConfig.js.map +1 -0
  68. package/lib/module/classes/HMSHLSMeetingURLVariant.js +14 -0
  69. package/lib/module/classes/HMSHLSMeetingURLVariant.js.map +1 -0
  70. package/lib/module/classes/HMSHLSStreamingState.js +14 -0
  71. package/lib/module/classes/HMSHLSStreamingState.js.map +1 -0
  72. package/lib/module/classes/HMSHLSVariant.js +20 -0
  73. package/lib/module/classes/HMSHLSVariant.js.map +1 -0
  74. package/lib/module/classes/HMSLocalAudioTrack.js +17 -0
  75. package/lib/module/classes/HMSLocalAudioTrack.js.map +1 -1
  76. package/lib/module/classes/HMSLocalPeer.js.map +1 -1
  77. package/lib/module/classes/HMSLocalVideoTrack.js +15 -0
  78. package/lib/module/classes/HMSLocalVideoTrack.js.map +1 -1
  79. package/lib/module/classes/HMSLogger.js +55 -1
  80. package/lib/module/classes/HMSLogger.js.map +1 -1
  81. package/lib/module/classes/HMSRemoteAudioTrack.js +16 -0
  82. package/lib/module/classes/HMSRemoteAudioTrack.js.map +1 -1
  83. package/lib/module/classes/HMSRemoteVideoTrack.js +16 -0
  84. package/lib/module/classes/HMSRemoteVideoTrack.js.map +1 -1
  85. package/lib/module/classes/HMSRoom.js +3 -0
  86. package/lib/module/classes/HMSRoom.js.map +1 -1
  87. package/lib/module/classes/HMSRoomUpdate.js +6 -0
  88. package/lib/module/classes/HMSRoomUpdate.js.map +1 -1
  89. package/lib/module/classes/HMSSDK.js +295 -146
  90. package/lib/module/classes/HMSSDK.js.map +1 -1
  91. package/lib/module/classes/HMSTrackSettings.js +3 -0
  92. package/lib/module/classes/HMSTrackSettings.js.map +1 -1
  93. package/lib/module/classes/HMSVideoCodec.js +4 -4
  94. package/lib/module/classes/HMSVideoCodec.js.map +1 -1
  95. package/lib/module/classes/HmsView.js +23 -4
  96. package/lib/module/classes/HmsView.js.map +1 -1
  97. package/lib/module/index.js +5 -0
  98. package/lib/module/index.js.map +1 -1
  99. package/lib/typescript/classes/HMSChangeTrackStateRequest.d.ts +2 -0
  100. package/lib/typescript/classes/HMSHLSConfig.d.ts +7 -0
  101. package/lib/typescript/classes/HMSHLSMeetingURLVariant.d.ts +8 -0
  102. package/lib/typescript/classes/HMSHLSStreamingState.d.ts +9 -0
  103. package/lib/typescript/classes/HMSHLSVariant.d.ts +12 -0
  104. package/lib/typescript/classes/HMSLocalPeer.d.ts +3 -0
  105. package/lib/typescript/classes/HMSLogger.d.ts +9 -0
  106. package/lib/typescript/classes/HMSRoom.d.ts +3 -0
  107. package/lib/typescript/classes/HMSRoomUpdate.d.ts +7 -1
  108. package/lib/typescript/classes/HMSSDK.d.ts +22 -13
  109. package/lib/typescript/classes/HMSTrackSettings.d.ts +2 -0
  110. package/lib/typescript/classes/HMSVideoCodec.d.ts +4 -4
  111. package/lib/typescript/index.d.ts +5 -0
  112. package/package.json +1 -1
  113. package/react-native-hms.podspec +1 -1
  114. package/src/classes/HMSChangeTrackStateRequest.ts +7 -1
  115. package/src/classes/HMSEncoder.ts +5 -1
  116. package/src/classes/HMSHLSConfig.ts +9 -0
  117. package/src/classes/HMSHLSMeetingURLVariant.ts +9 -0
  118. package/src/classes/HMSHLSStreamingState.ts +11 -0
  119. package/src/classes/HMSHLSVariant.ts +18 -0
  120. package/src/classes/HMSLocalAudioTrack.ts +16 -0
  121. package/src/classes/HMSLocalPeer.ts +3 -0
  122. package/src/classes/HMSLocalVideoTrack.ts +15 -0
  123. package/src/classes/HMSLogger.ts +28 -1
  124. package/src/classes/HMSRemoteAudioTrack.ts +16 -0
  125. package/src/classes/HMSRemoteVideoTrack.ts +16 -0
  126. package/src/classes/HMSRoom.ts +4 -0
  127. package/src/classes/HMSRoomUpdate.ts +6 -0
  128. package/src/classes/HMSSDK.tsx +221 -84
  129. package/src/classes/HMSTrackSettings.ts +3 -0
  130. package/src/classes/HMSVideoCodec.ts +4 -4
  131. package/src/classes/HmsView.tsx +32 -4
  132. package/src/index.ts +5 -0
  133. package/android/.gradle/6.9/executionHistory/executionHistory.bin +0 -0
  134. package/android/.gradle/6.9/fileHashes/fileHashes.bin +0 -0
  135. package/android/.gradle/6.9/fileHashes/resourceHashesCache.bin +0 -0
  136. package/android/.gradle/6.9/javaCompile/classAnalysis.bin +0 -0
  137. package/android/.gradle/6.9/javaCompile/jarAnalysis.bin +0 -0
  138. package/android/.gradle/6.9/javaCompile/javaCompile.lock +0 -0
  139. package/android/.gradle/6.9/javaCompile/taskHistory.bin +0 -0
  140. package/android/.gradle/buildOutputCleanup/outputFiles.bin +0 -0
  141. package/android/.project +0 -34
@@ -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,24 +1,41 @@
1
1
  package com.reactnativehmssdk
2
2
 
3
+ import android.annotation.SuppressLint
4
+ import android.content.Context
5
+ import android.view.LayoutInflater
3
6
  import android.widget.FrameLayout
7
+ import com.facebook.react.bridge.Arguments
4
8
  import com.facebook.react.bridge.ReactContext
5
- import live.hms.video.media.tracks.HMSTrackSource
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
9
14
  import org.webrtc.RendererCommon
10
15
  import org.webrtc.SurfaceViewRenderer
11
16
 
17
+ @SuppressLint("ViewConstructor")
12
18
  class HmsView(context: ReactContext) : FrameLayout(context) {
13
- private var surfaceView: SurfaceViewRenderer
19
+ private var surfaceView: SurfaceViewRenderer = SurfaceViewRenderer(context)
14
20
  private var videoTrack: HMSVideoTrack? = null
15
21
  private var localTrack: String? = null
22
+ private var scaleTypeApplied: Boolean = false
23
+ private var currentScaleType: RendererCommon.ScalingType =
24
+ RendererCommon.ScalingType.SCALE_ASPECT_FILL
16
25
 
17
26
  init {
18
- surfaceView = SurfaceViewRenderer(context)
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 -> {
@@ -58,12 +84,10 @@ class HmsView(context: ReactContext) : FrameLayout(context) {
58
84
  fun setData(
59
85
  id: String?,
60
86
  trackId: String?,
61
- sink: Boolean?,
62
87
  hmsCollection: MutableMap<String, HmsSDK>,
63
88
  mirror: Boolean?
64
89
  ) {
65
- var sdkId: String = "12345"
66
-
90
+ var sdkId = "12345"
67
91
  if (id != null) {
68
92
  sdkId = id
69
93
  }
@@ -81,26 +105,21 @@ class HmsView(context: ReactContext) : FrameLayout(context) {
81
105
  }
82
106
 
83
107
  val remotePeers = hms.getRemotePeers()
84
- if (remotePeers !== null) {
85
- for (peer in remotePeers) {
86
- val videoTrackId = peer.videoTrack?.trackId
108
+ for (peer in remotePeers) {
109
+ val videoTrackId = peer.videoTrack?.trackId
87
110
 
88
- val auxiliaryTracks = peer.auxiliaryTracks
89
- for (track in auxiliaryTracks) {
90
- val auxTrackId = track.trackId
91
- if (trackId == auxTrackId &&
92
- track.type == HMSTrackType.VIDEO &&
93
- !track.isMute
94
- ) {
95
- videoTrack = track as HMSVideoTrack
96
- return
97
- }
98
- }
99
- if (videoTrackId == localTrack) {
100
- videoTrack = peer.videoTrack
111
+ val auxiliaryTracks = peer.auxiliaryTracks
112
+ for (track in auxiliaryTracks) {
113
+ val auxTrackId = track.trackId
114
+ if (trackId == auxTrackId && track.type == HMSTrackType.VIDEO && !track.isMute) {
115
+ videoTrack = track as HMSVideoTrack
101
116
  return
102
117
  }
103
118
  }
119
+ if (videoTrackId == localTrack) {
120
+ videoTrack = peer.videoTrack
121
+ return
122
+ }
104
123
  }
105
124
  }
106
125
  }
@@ -4,7 +4,6 @@ import com.facebook.react.ReactPackage
4
4
  import com.facebook.react.bridge.NativeModule
5
5
  import com.facebook.react.bridge.ReactApplicationContext
6
6
  import com.facebook.react.uimanager.ViewManager
7
- import java.util.*
8
7
 
9
8
  class HmssdkPackage : ReactPackage {
10
9
  override fun createNativeModules(reactContext: ReactApplicationContext): List<NativeModule> {
@@ -12,6 +11,6 @@ class HmssdkPackage : ReactPackage {
12
11
  }
13
12
 
14
13
  override fun createViewManagers(reactContext: ReactApplicationContext): List<ViewManager<*, *>> {
15
- return Arrays.asList<ViewManager<*, *>>(HmssdkViewManager())
14
+ return listOf<ViewManager<*, *>>(HmssdkViewManager())
16
15
  }
17
16
  }
@@ -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
@@ -13,26 +14,29 @@ class HmssdkViewManager : SimpleViewManager<HmsView>() {
13
14
  return REACT_CLASS
14
15
  }
15
16
 
16
- override fun onDropViewInstance(view: HmsView) {
17
- super.onDropViewInstance(view)
18
- }
19
-
20
17
  public override fun createViewInstance(reactContext: ThemedReactContext): HmsView {
21
18
  this.reactContext = reactContext
22
- val view = HmsView(reactContext)
23
- return view
19
+ return HmsView(reactContext)
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()
24
29
  }
25
30
 
26
31
  @ReactProp(name = "data")
27
32
  fun setData(view: HmsView, data: ReadableMap) {
28
33
  val trackId = data.getString("trackId")
29
- val sink = data.getBoolean("sink")
34
+ // val sink = data.getBoolean("sink")
30
35
  val id = data.getString("id")
31
36
  val mirror = data.getBoolean("mirror")
32
-
33
37
  val hmsCollection = getHms()
34
38
  if (hmsCollection != null) {
35
- view.setData(id, trackId, sink, hmsCollection, mirror)
39
+ view.setData(id, trackId, hmsCollection, mirror)
36
40
  }
37
41
  // do the processing here
38
42
  }
@@ -43,8 +47,7 @@ class HmssdkViewManager : SimpleViewManager<HmsView>() {
43
47
  }
44
48
 
45
49
  private fun getHms(): MutableMap<String, HmsSDK>? {
46
- val hmsCollection = reactContext?.getNativeModule(HmsModule::class.java)?.getHmsInstance()
47
- return hmsCollection
50
+ return reactContext?.getNativeModule(HmsModule::class.java)?.getHmsInstance()
48
51
  }
49
52
 
50
53
  companion object {
@@ -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] {
@@ -33,11 +34,7 @@ class HmsDecoder: NSObject {
33
34
  let videoTrack = getHmsVideoTrack(peer.videoTrack)
34
35
  let role = getHmsRole(peer.role)
35
36
 
36
- var auxiliaryTracks = [[String: Any]]()
37
-
38
- for track in peer.auxiliaryTracks ?? [] {
39
- auxiliaryTracks.append(getHmsTrack(track))
40
- }
37
+ let auxiliaryTracks = getAllTracks(peer.auxiliaryTracks ?? [] )
41
38
 
42
39
  return ["peerID": peerID,
43
40
  "name": name,
@@ -51,6 +48,15 @@ class HmsDecoder: NSObject {
51
48
  "role": role]
52
49
  }
53
50
 
51
+ static func getAllTracks (_ tracks: [HMSTrack]) -> [[String: Any]] {
52
+ var auxiliaryTracks = [[String: Any]]()
53
+
54
+ for track in tracks {
55
+ auxiliaryTracks.append(getHmsTrack(track))
56
+ }
57
+ return auxiliaryTracks
58
+ }
59
+
54
60
  static func getHmsTrack (_ track: HMSTrack?) -> [String: Any] {
55
61
 
56
62
  guard let hmsTrack = track else { return [:] }
@@ -59,9 +65,9 @@ class HmsDecoder: NSObject {
59
65
  let source = hmsTrack.source
60
66
  let trackDescription = hmsTrack.trackDescription
61
67
  let isMute = hmsTrack.isMute()
62
- let type = HmsHelper.getHmsTrackType(hmsTrack.kind)
68
+ let type = HmsHelper.getHmsTrackType(hmsTrack.kind) ?? ""
63
69
 
64
- return ["trackId": trackId, "source": source, "trackDescription": trackDescription, "isMute": isMute, "type": type]
70
+ return ["trackId": trackId, "source": source, "trackDescription": trackDescription, "isMute": isMute, "type": type, "kind": type]
65
71
  }
66
72
 
67
73
  static func getHmsAudioTrack (_ hmsAudioTrack: HMSAudioTrack?) -> [String: Any] {
@@ -72,8 +78,9 @@ class HmsDecoder: NSObject {
72
78
  let source: String = hmsTrack.source
73
79
  let trackDescription: String = hmsTrack.trackDescription
74
80
  let isMute: Bool = hmsTrack.isMute()
81
+ let kind: String = HmsHelper.getHmsTrackType(hmsTrack.kind) ?? ""
75
82
 
76
- return ["trackId": trackId, "source": source, "trackDescription": trackDescription, "isMute": isMute]
83
+ return ["trackId": trackId, "source": source, "trackDescription": trackDescription, "isMute": isMute, "type": kind, "kind": kind]
77
84
  }
78
85
 
79
86
  static func getHmsVideoTrack (_ hmsVideoTrack: HMSVideoTrack?) -> [String: Any] {
@@ -85,8 +92,9 @@ class HmsDecoder: NSObject {
85
92
  let trackDescription = hmsTrack.trackDescription
86
93
  let isMute = hmsTrack.isMute()
87
94
  let isDegraded = hmsTrack.isDegraded()
95
+ let kind: String = HmsHelper.getHmsTrackType(hmsTrack.kind) ?? ""
88
96
 
89
- return ["trackId": trackId, "source": source, "trackDescription": trackDescription, "isMute": isMute, "isDegraded": isDegraded]
97
+ return ["trackId": trackId, "source": source, "trackDescription": trackDescription, "isMute": isMute, "isDegraded": isDegraded, "type": kind, "kind": kind]
90
98
  }
91
99
 
92
100
  static func getHmsLocalPeer(_ hmsLocalPeer: HMSLocalPeer?) -> [String: Any] {
@@ -113,12 +121,14 @@ class HmsDecoder: NSObject {
113
121
 
114
122
  var localAudioTrackData = [String: Any]()
115
123
  if let localAudio = localAudioTrack {
116
- localAudioTrackData = ["trackId": localAudio.trackId, "source": localAudio.source, "trackDescription": localAudio.trackDescription, "settings": getHmsAudioTrackSettings(localAudio.settings), "isMute": localAudioTrack?.isMute() ?? false]
124
+ let type = HmsHelper.getHmsTrackType(localAudio.kind) ?? ""
125
+ localAudioTrackData = ["trackId": localAudio.trackId, "source": localAudio.source, "trackDescription": localAudio.trackDescription, "settings": getHmsAudioTrackSettings(localAudio.settings), "isMute": localAudioTrack?.isMute() ?? false, "type": type, "kind": type]
117
126
  }
118
127
 
119
128
  var localVideoTrackData = [String: Any]()
120
129
  if let localVideo = localVideoTrack {
121
- localVideoTrackData = ["trackId": localVideo.trackId, "source": localVideo.source, "trackDescription": localVideo.trackDescription, "settings": getHmsVideoTrackSettings(localVideo.settings), "isMute":localAudioTrack?.isMute() ?? false]
130
+ let type = HmsHelper.getHmsTrackType(localVideo.kind) ?? ""
131
+ localVideoTrackData = ["trackId": localVideo.trackId, "source": localVideo.source, "trackDescription": localVideo.trackDescription, "settings": getHmsVideoTrackSettings(localVideo.settings), "isMute":localAudioTrack?.isMute() ?? false, "type": type, "kind": type]
122
132
  }
123
133
 
124
134
  return ["peerID": peerID, "name": name, "isLocal": isLocal, "customerUserID": customerUserID, "customerDescription": customerDescription, "metadata": metadata, "audioTrack": audioTrack, "videoTrack": videoTrack, "auxiliaryTracks": auxiliaryTracks, "localAudioTrackData": localAudioTrackData, "localVideoTrackData": localVideoTrackData, "role": role]
@@ -162,11 +172,11 @@ class HmsDecoder: NSObject {
162
172
  static func getHmsVideoTrackCodec(_ codec : HMSCodec) -> String {
163
173
  switch(codec) {
164
174
  case HMSCodec.VP8:
165
- return "vp8"
175
+ return "VP8"
166
176
  case HMSCodec.H264:
167
- return "h264"
177
+ return "H264"
168
178
  default:
169
- return "h264"
179
+ return "H264"
170
180
  }
171
181
  }
172
182
 
@@ -222,12 +232,14 @@ class HmsDecoder: NSObject {
222
232
 
223
233
  var remoteAudioTrackData = [String: Any]()
224
234
  if let remoteAudio = remoteAudioTrack {
225
- remoteAudioTrackData = ["trackId": remoteAudio.trackId, "source": remoteAudio.source, "trackDescription": remoteAudio.trackDescription, "playbackAllowed": remoteAudio.isPlaybackAllowed(), "isMute": remoteAudio.isMute()]
235
+ let type = HmsHelper.getHmsTrackType(remoteAudio.kind) ?? ""
236
+ remoteAudioTrackData = ["trackId": remoteAudio.trackId, "source": remoteAudio.source, "trackDescription": remoteAudio.trackDescription, "playbackAllowed": remoteAudio.isPlaybackAllowed(), "isMute": remoteAudio.isMute(), "type": type, "kind": type]
226
237
  }
227
238
 
228
239
  var remoteVideoTrackData = [String: Any]()
229
240
  if let remoteVideo = remoteVideoTrack {
230
- remoteVideoTrackData = ["trackId": remoteVideo.trackId, "source": remoteVideo.source, "trackDescription": remoteVideo.trackDescription, "layer": remoteVideo.layer.rawValue, "playbackAllowed": remoteVideo.isPlaybackAllowed(), "isMute": remoteVideo.isMute()]
241
+ let type = HmsHelper.getHmsTrackType(remoteVideo.kind) ?? ""
242
+ remoteVideoTrackData = ["trackId": remoteVideo.trackId, "source": remoteVideo.source, "trackDescription": remoteVideo.trackDescription, "layer": remoteVideo.layer.rawValue, "playbackAllowed": remoteVideo.isPlaybackAllowed(), "isMute": remoteVideo.isMute(), "isDegraded": remoteVideo.isDegraded(), "type": type, "kind": type]
231
243
  }
232
244
 
233
245
  return ["peerID": peerID, "name": name, "isLocal": isLocal, "customerUserID": customerUserID, "customerDescription": customerDescription, "metadata": metadata, "audioTrack": audioTrack, "videoTrack": videoTrack, "auxiliaryTracks": auxiliaryTracks, "remoteAudioTrackData": remoteAudioTrackData, "remoteVideoTrackData": remoteVideoTrackData, "role": role]
@@ -239,12 +251,14 @@ class HmsDecoder: NSObject {
239
251
 
240
252
  for track in tracks {
241
253
  if let localVideo = track as? HMSLocalVideoTrack {
242
- let localVideoTrackData: [String : Any] = ["trackId": localVideo.trackId, "source": localVideo.source, "trackDescription": localVideo.trackDescription, "settings": getHmsVideoTrackSettings(localVideo.settings), "isMute": localVideo.isMute()]
254
+ let type = HmsHelper.getHmsTrackType(localVideo.kind) ?? ""
255
+ let localVideoTrackData: [String : Any] = ["trackId": localVideo.trackId, "source": localVideo.source, "trackDescription": localVideo.trackDescription, "settings": getHmsVideoTrackSettings(localVideo.settings), "isMute": localVideo.isMute(), "kind": type, "type": type]
243
256
  hmsTracks["videoTrack"] = localVideoTrackData
244
257
  }
245
258
 
246
259
  if let localAudio = track as? HMSLocalAudioTrack {
247
- let localAudioTrackData: [String : Any] = ["trackId": localAudio.trackId, "source": localAudio.source, "trackDescription": localAudio.trackDescription, "settings": getHmsAudioTrackSettings(localAudio.settings), "isMute": localAudio.isMute()]
260
+ let type = HmsHelper.getHmsTrackType(localAudio.kind) ?? ""
261
+ let localAudioTrackData: [String : Any] = ["trackId": localAudio.trackId, "source": localAudio.source, "trackDescription": localAudio.trackDescription, "settings": getHmsAudioTrackSettings(localAudio.settings), "isMute": localAudio.isMute(), "kind": type, "type": type]
248
262
  hmsTracks["audioTrack"] = localAudioTrackData
249
263
  }
250
264
  }
@@ -268,12 +282,13 @@ class HmsDecoder: NSObject {
268
282
  let name = role.name
269
283
  let permissions = getHmsPermissions(role.permissions)
270
284
  let publishSettings = getHmsPublishSettings(role.publishSettings)
285
+ let subscribeSettings = getHmsSubscribeSettings(role.subscribeSettings)
271
286
  let priority = role.priority
272
287
  let generalPermissions = role.generalPermissions ?? [:]
273
288
  let internalPlugins = role.internalPlugins ?? [:]
274
289
  let externalPlugins = role.externalPlugins ?? [:]
275
290
 
276
- 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]
277
292
  }
278
293
 
279
294
  static func getHmsPermissions (_ permissions: HMSPermissions) -> [String: Any] {
@@ -316,6 +331,30 @@ class HmsDecoder: NSObject {
316
331
  "screenSimulcastLayers": screenSimulcastLayers,
317
332
  "allowed": allowed]
318
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
+ }
319
358
 
320
359
  static func getWriteableArray(_ array: [String]?) -> [String] {
321
360
  var decodedArray = [String]()
@@ -342,6 +381,8 @@ class HmsDecoder: NSObject {
342
381
  let width = videoSettings.width
343
382
  let height = videoSettings.height
344
383
 
384
+
385
+
345
386
  return ["bitRate": bitRate ?? 0, "codec": codec, "frameRate": frameRate, "width": width, "height": height]
346
387
  }
347
388
 
@@ -397,14 +438,14 @@ class HmsDecoder: NSObject {
397
438
  return [:]
398
439
  }
399
440
 
400
- static func getHmsChangeTrackStateRequest(_ changeTrackStateRequest: HMSChangeTrackStateRequest) -> [String: Any] {
441
+ static func getHmsChangeTrackStateRequest(_ changeTrackStateRequest: HMSChangeTrackStateRequest, _ id: String) -> [String: Any] {
401
442
  var requestedBy: [String: Any]?
402
443
  if let peer = changeTrackStateRequest.requestedBy {
403
444
  requestedBy = getHmsPeer(peer)
404
445
  }
405
446
  let trackType = changeTrackStateRequest.track.kind == .video ? "video" : "audio"
406
447
 
407
- var request = ["trackType": trackType] as [String: Any]
448
+ var request = ["trackType": trackType, "id": id, "mute": changeTrackStateRequest.mute] as [String: Any]
408
449
  if let requestedBy = requestedBy {
409
450
  request["requestedBy"] = requestedBy
410
451
  }
@@ -461,4 +502,32 @@ class HmsDecoder: NSObject {
461
502
  return [:]
462
503
  }
463
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
+ }
464
533
  }
@@ -3,7 +3,17 @@ import Foundation
3
3
 
4
4
  class HmsHelper: NSObject {
5
5
 
6
- static func getPeerFromPeerId(_ peerID: String?, remotePeers: [HMSRemotePeer]?) -> HMSPeer? {
6
+ static func getPeerFromPeerId(_ peerID: String?, remotePeers: [HMSRemotePeer]?, localPeer: HMSLocalPeer?) -> HMSPeer? {
7
+
8
+ guard let peerID = peerID, let peers = remotePeers else { return nil }
9
+ if(peerID == localPeer?.peerID) {
10
+ return localPeer
11
+ }
12
+ return peers.first { $0.peerID == peerID }
13
+ }
14
+
15
+
16
+ static func getRemotePeerFromPeerId(_ peerID: String?, remotePeers: [HMSRemotePeer]?) -> HMSPeer? {
7
17
 
8
18
  guard let peerID = peerID, let peers = remotePeers else { return nil }
9
19
 
@@ -156,9 +166,9 @@ class HmsHelper: NSObject {
156
166
 
157
167
  static func getVideoCodec(_ codecString: String?) -> HMSCodec {
158
168
  switch codecString {
159
- case "h264":
169
+ case "H264":
160
170
  return HMSCodec.H264
161
- case "vp8":
171
+ case "VP8":
162
172
  return HMSCodec.VP8
163
173
  default:
164
174
  return HMSCodec.H264
@@ -190,4 +200,25 @@ class HmsHelper: NSObject {
190
200
  return nil
191
201
  }
192
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
+ }
193
224
  }
package/ios/HmsManager.m CHANGED
@@ -7,16 +7,16 @@ RCT_EXTERN_METHOD(join: (NSDictionary) credentials)
7
7
  RCT_EXTERN_METHOD(preview: (NSDictionary) credentials)
8
8
  RCT_EXTERN_METHOD(setLocalMute: (NSDictionary) isMute)
9
9
  RCT_EXTERN_METHOD(setLocalVideoMute: (NSDictionary) isMute)
10
- RCT_EXTERN_METHOD(sendBroadcastMessage: (NSDictionary) data)
11
- RCT_EXTERN_METHOD(sendGroupMessage: (NSDictionary) data)
12
- RCT_EXTERN_METHOD(sendDirectMessage: (NSDictionary) data)
10
+ RCT_EXTERN_METHOD(sendBroadcastMessage: (NSDictionary) data :(RCTPromiseResolveBlock) resolve :(RCTPromiseRejectBlock) reject)
11
+ RCT_EXTERN_METHOD(sendGroupMessage: (NSDictionary) data :(RCTPromiseResolveBlock) resolve :(RCTPromiseRejectBlock) reject)
12
+ RCT_EXTERN_METHOD(sendDirectMessage: (NSDictionary) data :(RCTPromiseResolveBlock) resolve :(RCTPromiseRejectBlock) reject)
13
13
  RCT_EXTERN_METHOD(setPlaybackAllowed: (NSDictionary) data)
14
- RCT_EXTERN_METHOD(removePeer: (NSDictionary) data)
15
- RCT_EXTERN_METHOD(endRoom: (NSDictionary) data)
16
- RCT_EXTERN_METHOD(changeRole: (NSDictionary) data)
17
- RCT_EXTERN_METHOD(changeTrackState: (NSDictionary) data)
18
- RCT_EXTERN_METHOD(changeTrackStateRoles: (NSDictionary) data)
19
- RCT_EXTERN_METHOD(acceptRoleChange: (NSDictionary) data)
14
+ RCT_EXTERN_METHOD(removePeer: (NSDictionary) data :(RCTPromiseResolveBlock) resolve :(RCTPromiseRejectBlock) reject)
15
+ RCT_EXTERN_METHOD(endRoom: (NSDictionary) data :(RCTPromiseResolveBlock) resolve :(RCTPromiseRejectBlock) reject)
16
+ RCT_EXTERN_METHOD(changeRole: (NSDictionary) data :(RCTPromiseResolveBlock) resolve :(RCTPromiseRejectBlock) reject)
17
+ RCT_EXTERN_METHOD(changeTrackState: (NSDictionary) data :(RCTPromiseResolveBlock) resolve :(RCTPromiseRejectBlock) reject)
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