@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.
- package/README.md +6 -6
- package/android/build.gradle +3 -1
- package/android/src/main/java/com/reactnativehmssdk/HmsDecoder.kt +27 -2
- package/android/src/main/java/com/reactnativehmssdk/HmsHelper.kt +25 -0
- package/android/src/main/java/com/reactnativehmssdk/HmsModule.kt +81 -4
- package/android/src/main/java/com/reactnativehmssdk/HmsSDK.kt +174 -84
- package/android/src/main/java/com/reactnativehmssdk/HmsScreenshareActivity.kt +66 -0
- package/android/src/main/java/com/reactnativehmssdk/HmsView.kt +28 -3
- package/android/src/main/java/com/reactnativehmssdk/HmssdkViewManager.kt +10 -1
- package/android/src/main/res/layout/hms_view.xml +19 -0
- package/ios/HmsDecoder.swift +58 -2
- package/ios/HmsHelper.swift +21 -0
- package/ios/HmsManager.m +4 -2
- package/ios/HmsManager.swift +16 -2
- package/ios/HmsSDK.swift +63 -11
- package/ios/HmsView.swift +22 -54
- package/lib/commonjs/classes/HMSEncoder.js +2 -1
- package/lib/commonjs/classes/HMSEncoder.js.map +1 -1
- package/lib/commonjs/classes/HMSHLSConfig.js +20 -0
- package/lib/commonjs/classes/HMSHLSConfig.js.map +1 -0
- package/lib/commonjs/classes/HMSHLSMeetingURLVariant.js +23 -0
- package/lib/commonjs/classes/HMSHLSMeetingURLVariant.js.map +1 -0
- package/lib/commonjs/classes/HMSHLSStreamingState.js +23 -0
- package/lib/commonjs/classes/HMSHLSStreamingState.js.map +1 -0
- package/lib/commonjs/classes/HMSHLSVariant.js +29 -0
- package/lib/commonjs/classes/HMSHLSVariant.js.map +1 -0
- package/lib/commonjs/classes/HMSLogger.js +27 -0
- package/lib/commonjs/classes/HMSLogger.js.map +1 -1
- package/lib/commonjs/classes/HMSRoom.js +3 -0
- package/lib/commonjs/classes/HMSRoom.js.map +1 -1
- package/lib/commonjs/classes/HMSRoomUpdate.js +6 -0
- package/lib/commonjs/classes/HMSRoomUpdate.js.map +1 -1
- package/lib/commonjs/classes/HMSSDK.js +203 -96
- package/lib/commonjs/classes/HMSSDK.js.map +1 -1
- package/lib/commonjs/classes/HmsView.js +26 -4
- package/lib/commonjs/classes/HmsView.js.map +1 -1
- package/lib/commonjs/index.js +56 -0
- package/lib/commonjs/index.js.map +1 -1
- package/lib/module/classes/HMSEncoder.js +2 -1
- package/lib/module/classes/HMSEncoder.js.map +1 -1
- package/lib/module/classes/HMSHLSConfig.js +11 -0
- package/lib/module/classes/HMSHLSConfig.js.map +1 -0
- package/lib/module/classes/HMSHLSMeetingURLVariant.js +14 -0
- package/lib/module/classes/HMSHLSMeetingURLVariant.js.map +1 -0
- package/lib/module/classes/HMSHLSStreamingState.js +14 -0
- package/lib/module/classes/HMSHLSStreamingState.js.map +1 -0
- package/lib/module/classes/HMSHLSVariant.js +20 -0
- package/lib/module/classes/HMSHLSVariant.js.map +1 -0
- package/lib/module/classes/HMSLogger.js +27 -0
- package/lib/module/classes/HMSLogger.js.map +1 -1
- package/lib/module/classes/HMSRoom.js +3 -0
- package/lib/module/classes/HMSRoom.js.map +1 -1
- package/lib/module/classes/HMSRoomUpdate.js +6 -0
- package/lib/module/classes/HMSRoomUpdate.js.map +1 -1
- package/lib/module/classes/HMSSDK.js +204 -97
- package/lib/module/classes/HMSSDK.js.map +1 -1
- package/lib/module/classes/HmsView.js +23 -4
- package/lib/module/classes/HmsView.js.map +1 -1
- package/lib/module/index.js +4 -0
- package/lib/module/index.js.map +1 -1
- package/lib/typescript/classes/HMSHLSConfig.d.ts +7 -0
- package/lib/typescript/classes/HMSHLSMeetingURLVariant.d.ts +8 -0
- package/lib/typescript/classes/HMSHLSStreamingState.d.ts +9 -0
- package/lib/typescript/classes/HMSHLSVariant.d.ts +12 -0
- package/lib/typescript/classes/HMSLogger.d.ts +2 -0
- package/lib/typescript/classes/HMSRoom.d.ts +3 -0
- package/lib/typescript/classes/HMSRoomUpdate.d.ts +7 -1
- package/lib/typescript/classes/HMSSDK.d.ts +16 -7
- package/lib/typescript/index.d.ts +4 -0
- package/package.json +1 -2
- package/react-native-hms.podspec +1 -1
- package/src/classes/HMSEncoder.ts +1 -0
- package/src/classes/HMSHLSConfig.ts +9 -0
- package/src/classes/HMSHLSMeetingURLVariant.ts +9 -0
- package/src/classes/HMSHLSStreamingState.ts +11 -0
- package/src/classes/HMSHLSVariant.ts +18 -0
- package/src/classes/HMSLogger.ts +14 -0
- package/src/classes/HMSRoom.ts +4 -0
- package/src/classes/HMSRoomUpdate.ts +6 -0
- package/src/classes/HMSSDK.tsx +95 -19
- package/src/classes/HmsView.tsx +32 -4
- 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
|
-
|
|
21
|
-
|
|
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>
|
package/ios/HmsDecoder.swift
CHANGED
|
@@ -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
|
}
|
package/ios/HmsHelper.swift
CHANGED
|
@@ -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(
|
|
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
|
package/ios/HmsManager.swift
CHANGED
|
@@ -141,10 +141,10 @@ class HmsManager: RCTEventEmitter{
|
|
|
141
141
|
}
|
|
142
142
|
|
|
143
143
|
@objc
|
|
144
|
-
func
|
|
144
|
+
func changeTrackStateForRoles(_ data: NSDictionary, _ resolve: RCTPromiseResolveBlock?, _ reject: RCTPromiseRejectBlock?) {
|
|
145
145
|
let hms = HmsHelper.getHms(data, hmsCollection)
|
|
146
146
|
|
|
147
|
-
hms?.
|
|
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
|
|
313
|
+
func changeTrackStateForRoles(_ data: NSDictionary, _ resolve: RCTPromiseResolveBlock?, _ reject: RCTPromiseRejectBlock?) {
|
|
315
314
|
|
|
316
|
-
guard let
|
|
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
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
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
|
-
|
|
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 {
|
|
67
|
+
else {
|
|
68
|
+
print(#function, "Required data to setup video view not found")
|
|
69
|
+
return
|
|
70
|
+
}
|
|
64
71
|
|
|
65
72
|
sinkVideo = sink
|
|
66
|
-
|
|
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
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
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
|
}
|