@100mslive/react-native-hms 1.6.2 → 1.7.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/android/build.gradle +16 -8
- package/android/src/main/java/com/reactnativehmssdk/HMSDecoder.kt +14 -15
- package/android/src/main/java/com/reactnativehmssdk/HMSHLSPlayer.kt +248 -0
- package/android/src/main/java/com/reactnativehmssdk/HMSHLSPlayerManager.kt +101 -0
- package/android/src/main/java/com/reactnativehmssdk/HMSHelper.kt +10 -5
- package/android/src/main/java/com/reactnativehmssdk/HMSManager.kt +0 -14
- package/android/src/main/java/com/reactnativehmssdk/HMSRNSDK.kt +79 -103
- package/android/src/main/java/com/reactnativehmssdk/HmssdkPackage.kt +1 -1
- package/android/src/main/res/layout/player_view.xml +9 -0
- package/ios/HMSDecoder.swift +4 -4
- package/ios/HMSHLSPlayerManager.m +22 -0
- package/ios/HMSHLSPlayerManager.swift +368 -0
- package/ios/HMSManager.m +1 -2
- package/ios/HMSManager.swift +22 -16
- package/ios/HMSRNSDK.swift +30 -81
- package/lib/commonjs/classes/HMSEncoder.js +11 -4
- package/lib/commonjs/classes/HMSEncoder.js.map +1 -1
- package/lib/commonjs/classes/HMSLocalPeer.js.map +1 -1
- package/lib/commonjs/classes/HMSPeer.js +55 -20
- package/lib/commonjs/classes/HMSPeer.js.map +1 -1
- package/lib/commonjs/classes/HMSPeerUpdate.js +1 -1
- package/lib/commonjs/classes/HMSPeerUpdate.js.map +1 -1
- package/lib/commonjs/classes/HMSPeersCache.js +30 -38
- package/lib/commonjs/classes/HMSPeersCache.js.map +1 -1
- package/lib/commonjs/classes/HMSRTMPConfig.js.map +1 -1
- package/lib/commonjs/classes/HMSRemotePeer.js.map +1 -1
- package/lib/commonjs/classes/HMSSDK.js +30 -30
- package/lib/commonjs/classes/HMSSDK.js.map +1 -1
- package/lib/commonjs/components/HMSHLSPlayer/HMSHLSPlayer.js +147 -0
- package/lib/commonjs/components/HMSHLSPlayer/HMSHLSPlayer.js.map +1 -0
- package/lib/commonjs/components/HMSHLSPlayer/RCTHMSHLSPlayer.js +12 -0
- package/lib/commonjs/components/HMSHLSPlayer/RCTHMSHLSPlayer.js.map +1 -0
- package/lib/commonjs/components/HMSHLSPlayer/hooks.js +71 -0
- package/lib/commonjs/components/HMSHLSPlayer/hooks.js.map +1 -0
- package/lib/commonjs/components/HMSHLSPlayer/index.js +63 -0
- package/lib/commonjs/components/HMSHLSPlayer/index.js.map +1 -0
- package/lib/commonjs/index.js +38 -0
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/stores/hls-player-playback-slice.js +23 -0
- package/lib/commonjs/stores/hls-player-playback-slice.js.map +1 -0
- package/lib/commonjs/stores/hls-player-stats-store.js +36 -0
- package/lib/commonjs/stores/hls-player-stats-store.js.map +1 -0
- package/lib/commonjs/stores/hms-store.js +16 -0
- package/lib/commonjs/stores/hms-store.js.map +1 -0
- package/lib/commonjs/stores/types.js +6 -0
- package/lib/commonjs/stores/types.js.map +1 -0
- package/lib/commonjs/types.js +36 -0
- package/lib/commonjs/types.js.map +1 -0
- package/lib/module/classes/HMSEncoder.js +11 -4
- package/lib/module/classes/HMSEncoder.js.map +1 -1
- package/lib/module/classes/HMSLocalPeer.js.map +1 -1
- package/lib/module/classes/HMSPeer.js +55 -20
- package/lib/module/classes/HMSPeer.js.map +1 -1
- package/lib/module/classes/HMSPeerUpdate.js +1 -1
- package/lib/module/classes/HMSPeerUpdate.js.map +1 -1
- package/lib/module/classes/HMSPeersCache.js +30 -38
- package/lib/module/classes/HMSPeersCache.js.map +1 -1
- package/lib/module/classes/HMSRTMPConfig.js.map +1 -1
- package/lib/module/classes/HMSRemotePeer.js.map +1 -1
- package/lib/module/classes/HMSSDK.js +30 -30
- package/lib/module/classes/HMSSDK.js.map +1 -1
- package/lib/module/components/HMSHLSPlayer/HMSHLSPlayer.js +138 -0
- package/lib/module/components/HMSHLSPlayer/HMSHLSPlayer.js.map +1 -0
- package/lib/module/components/HMSHLSPlayer/RCTHMSHLSPlayer.js +4 -0
- package/lib/module/components/HMSHLSPlayer/RCTHMSHLSPlayer.js.map +1 -0
- package/lib/module/components/HMSHLSPlayer/hooks.js +56 -0
- package/lib/module/components/HMSHLSPlayer/hooks.js.map +1 -0
- package/lib/module/components/HMSHLSPlayer/index.js +3 -0
- package/lib/module/components/HMSHLSPlayer/index.js.map +1 -0
- package/lib/module/index.js +7 -0
- package/lib/module/index.js.map +1 -1
- package/lib/module/stores/hls-player-playback-slice.js +16 -0
- package/lib/module/stores/hls-player-playback-slice.js.map +1 -0
- package/lib/module/stores/hls-player-stats-store.js +29 -0
- package/lib/module/stores/hls-player-stats-store.js.map +1 -0
- package/lib/module/stores/hms-store.js +9 -0
- package/lib/module/stores/hms-store.js.map +1 -0
- package/lib/module/stores/types.js +2 -0
- package/lib/module/stores/types.js.map +1 -0
- package/lib/module/types.js +32 -0
- package/lib/module/types.js.map +1 -0
- package/lib/typescript/classes/HMSEncoder.d.ts +1 -0
- package/lib/typescript/classes/HMSLocalPeer.d.ts +0 -1
- package/lib/typescript/classes/HMSPeer.d.ts +10 -5
- package/lib/typescript/classes/HMSPeersCache.d.ts +17 -2
- package/lib/typescript/classes/HMSRTMPConfig.d.ts +2 -2
- package/lib/typescript/classes/HMSRemotePeer.d.ts +0 -1
- package/lib/typescript/classes/HMSSDK.d.ts +3 -14
- package/lib/typescript/components/HMSHLSPlayer/HMSHLSPlayer.d.ts +21 -0
- package/lib/typescript/components/HMSHLSPlayer/RCTHMSHLSPlayer.d.ts +19 -0
- package/lib/typescript/components/HMSHLSPlayer/hooks.d.ts +17 -0
- package/lib/typescript/components/HMSHLSPlayer/index.d.ts +2 -0
- package/lib/typescript/index.d.ts +3 -0
- package/lib/typescript/stores/hls-player-playback-slice.d.ts +5 -0
- package/lib/typescript/stores/hls-player-stats-store.d.ts +9 -0
- package/lib/typescript/stores/hms-store.d.ts +9 -0
- package/lib/typescript/stores/types.d.ts +25 -0
- package/lib/typescript/types.d.ts +63 -0
- package/package.json +4 -1
- package/react-native-hms.podspec +1 -0
- package/sdk-versions.json +3 -2
- package/src/classes/HMSEncoder.ts +14 -3
- package/src/classes/HMSLocalPeer.ts +0 -1
- package/src/classes/HMSPeer.ts +96 -48
- package/src/classes/HMSPeerUpdate.ts +4 -4
- package/src/classes/HMSPeersCache.ts +53 -40
- package/src/classes/HMSRTMPConfig.ts +2 -2
- package/src/classes/HMSRemotePeer.ts +0 -1
- package/src/classes/HMSSDK.tsx +33 -30
- package/src/components/HMSHLSPlayer/HMSHLSPlayer.tsx +235 -0
- package/src/components/HMSHLSPlayer/RCTHMSHLSPlayer.ts +38 -0
- package/src/components/HMSHLSPlayer/hooks.ts +100 -0
- package/src/components/HMSHLSPlayer/index.ts +9 -0
- package/src/index.ts +8 -0
- package/src/stores/hls-player-playback-slice.ts +25 -0
- package/src/stores/hls-player-stats-store.ts +37 -0
- package/src/stores/hms-store.ts +11 -0
- package/src/stores/types.ts +49 -0
- package/src/types.ts +119 -0
- package/android/.gradle/6.9/executionHistory/executionHistory.lock +0 -0
- package/android/.gradle/6.9/fileChanges/last-build.bin +0 -0
- package/android/.gradle/6.9/fileHashes/fileHashes.bin +0 -0
- package/android/.gradle/6.9/fileHashes/fileHashes.lock +0 -0
- package/android/.gradle/6.9/gc.properties +0 -0
- package/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock +0 -0
- package/android/.gradle/buildOutputCleanup/cache.properties +0 -2
- package/android/.gradle/buildOutputCleanup/outputFiles.bin +0 -0
- package/android/.gradle/checksums/checksums.lock +0 -0
- package/android/.gradle/checksums/md5-checksums.bin +0 -0
- package/android/.gradle/checksums/sha1-checksums.bin +0 -0
- package/android/.gradle/vcs-1/gc.properties +0 -0
- package/android/.idea/compiler.xml +0 -6
- package/android/.idea/gradle.xml +0 -18
- package/android/.idea/jarRepositories.xml +0 -50
- package/android/.idea/libraries/Gradle__androidx_activity_activity_1_2_4_aar.xml +0 -16
- package/android/.idea/libraries/Gradle__androidx_annotation_annotation_1_3_0.xml +0 -11
- package/android/.idea/libraries/Gradle__androidx_annotation_annotation_experimental_1_1_0_aar.xml +0 -13
- package/android/.idea/libraries/Gradle__androidx_appcompat_appcompat_1_4_1_aar.xml +0 -16
- package/android/.idea/libraries/Gradle__androidx_appcompat_appcompat_resources_1_4_1_aar.xml +0 -13
- package/android/.idea/libraries/Gradle__androidx_arch_core_core_common_2_1_0.xml +0 -11
- package/android/.idea/libraries/Gradle__androidx_arch_core_core_runtime_2_1_0_aar.xml +0 -13
- package/android/.idea/libraries/Gradle__androidx_autofill_autofill_1_1_0_aar.xml +0 -16
- package/android/.idea/libraries/Gradle__androidx_collection_collection_1_1_0.xml +0 -11
- package/android/.idea/libraries/Gradle__androidx_constraintlayout_constraintlayout_2_1_3_aar.xml +0 -13
- package/android/.idea/libraries/Gradle__androidx_core_core_1_7_0_aar.xml +0 -16
- package/android/.idea/libraries/Gradle__androidx_cursoradapter_cursoradapter_1_0_0_aar.xml +0 -13
- package/android/.idea/libraries/Gradle__androidx_customview_customview_1_0_0_aar.xml +0 -13
- package/android/.idea/libraries/Gradle__androidx_drawerlayout_drawerlayout_1_0_0_aar.xml +0 -16
- package/android/.idea/libraries/Gradle__androidx_fragment_fragment_1_3_6_aar.xml +0 -16
- package/android/.idea/libraries/Gradle__androidx_interpolator_interpolator_1_0_0_aar.xml +0 -13
- package/android/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_common_2_4_0.xml +0 -11
- package/android/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_livedata_2_0_0_aar.xml +0 -13
- package/android/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_livedata_core_2_3_1_aar.xml +0 -13
- package/android/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_runtime_2_4_0_aar.xml +0 -13
- package/android/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_viewmodel_2_3_1_aar.xml +0 -13
- package/android/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_viewmodel_savedstate_2_3_1_aar.xml +0 -13
- package/android/.idea/libraries/Gradle__androidx_loader_loader_1_0_0_aar.xml +0 -13
- package/android/.idea/libraries/Gradle__androidx_savedstate_savedstate_1_1_0_aar.xml +0 -13
- package/android/.idea/libraries/Gradle__androidx_swiperefreshlayout_swiperefreshlayout_1_0_0_aar.xml +0 -16
- package/android/.idea/libraries/Gradle__androidx_tracing_tracing_1_1_0_aar.xml +0 -13
- package/android/.idea/libraries/Gradle__androidx_vectordrawable_vectordrawable_1_1_0_aar.xml +0 -13
- package/android/.idea/libraries/Gradle__androidx_vectordrawable_vectordrawable_animated_1_1_0_aar.xml +0 -13
- package/android/.idea/libraries/Gradle__androidx_versionedparcelable_versionedparcelable_1_1_1_aar.xml +0 -13
- package/android/.idea/libraries/Gradle__androidx_viewpager_viewpager_1_0_0_aar.xml +0 -13
- package/android/.idea/libraries/Gradle__com_facebook_fbjni_fbjni_0_3_0_aar.xml +0 -14
- package/android/.idea/libraries/Gradle__com_facebook_fresco_drawee_2_5_0_aar.xml +0 -15
- package/android/.idea/libraries/Gradle__com_facebook_fresco_fbcore_2_5_0_aar.xml +0 -18
- package/android/.idea/libraries/Gradle__com_facebook_fresco_fresco_2_5_0_aar.xml +0 -18
- package/android/.idea/libraries/Gradle__com_facebook_fresco_imagepipeline_2_5_0_aar.xml +0 -18
- package/android/.idea/libraries/Gradle__com_facebook_fresco_imagepipeline_base_2_5_0_aar.xml +0 -18
- package/android/.idea/libraries/Gradle__com_facebook_fresco_imagepipeline_native_2_5_0_aar.xml +0 -15
- package/android/.idea/libraries/Gradle__com_facebook_fresco_imagepipeline_okhttp3_2_5_0_aar.xml +0 -15
- package/android/.idea/libraries/Gradle__com_facebook_fresco_memory_type_ashmem_2_5_0_aar.xml +0 -15
- package/android/.idea/libraries/Gradle__com_facebook_fresco_memory_type_java_2_5_0_aar.xml +0 -15
- package/android/.idea/libraries/Gradle__com_facebook_fresco_memory_type_native_2_5_0_aar.xml +0 -15
- package/android/.idea/libraries/Gradle__com_facebook_fresco_nativeimagefilters_2_5_0_aar.xml +0 -15
- package/android/.idea/libraries/Gradle__com_facebook_fresco_nativeimagetranscoder_2_5_0_aar.xml +0 -15
- package/android/.idea/libraries/Gradle__com_facebook_fresco_ui_common_2_5_0_aar.xml +0 -15
- package/android/.idea/libraries/Gradle__com_facebook_infer_annotation_infer_annotation_0_18_0.xml +0 -13
- package/android/.idea/libraries/Gradle__com_facebook_react_react_native_0_71_0_rc_0_debug_aar.xml +0 -14
- package/android/.idea/libraries/Gradle__com_facebook_soloader_annotation_0_10_4.xml +0 -13
- package/android/.idea/libraries/Gradle__com_facebook_soloader_nativeloader_0_10_4.xml +0 -13
- package/android/.idea/libraries/Gradle__com_facebook_soloader_soloader_0_10_4_aar.xml +0 -14
- package/android/.idea/libraries/Gradle__com_facebook_yoga_proguard_annotations_1_19_0.xml +0 -13
- package/android/.idea/libraries/Gradle__com_github_100mslive_android_sdk_lib_2_5_1_aar.xml +0 -10
- package/android/.idea/libraries/Gradle__com_github_100mslive_webrtc_m104_hms_1_3_aar.xml +0 -10
- package/android/.idea/libraries/Gradle__com_google_code_findbugs_jsr305_3_0_2.xml +0 -13
- package/android/.idea/libraries/Gradle__com_squareup_okhttp3_okhttp_4_9_2.xml +0 -13
- package/android/.idea/libraries/Gradle__com_squareup_okhttp3_okhttp_urlconnection_4_9_2.xml +0 -13
- package/android/.idea/libraries/Gradle__com_squareup_okio_okio_2_9_0.xml +0 -13
- package/android/.idea/libraries/Gradle__javax_inject_javax_inject_1.xml +0 -13
- package/android/.idea/libraries/Gradle__org_jetbrains_annotations_13_0.xml +0 -13
- package/android/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_annotations_jvm_1_3_72.xml +0 -13
- package/android/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_1_6_10.xml +0 -13
- package/android/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_common_1_6_10.xml +0 -13
- package/android/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_jdk7_1_6_10.xml +0 -13
- package/android/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_jdk8_1_6_10.xml +0 -13
- package/android/.idea/libraries/Gradle__org_jetbrains_kotlinx_kotlinx_coroutines_android_1_6_0.xml +0 -13
- package/android/.idea/libraries/Gradle__org_jetbrains_kotlinx_kotlinx_coroutines_core_jvm_1_6_0.xml +0 -13
- package/android/.idea/misc.xml +0 -9
- package/android/.idea/modules/android.androidTest.iml +0 -203
- package/android/.idea/modules/android.iml +0 -40
- package/android/.idea/modules/android.main.iml +0 -199
- package/android/.idea/modules/android.unitTest.iml +0 -197
- package/android/.idea/modules.xml +0 -11
- package/android/.idea/sonarlint/issuestore/3/c/3c46088b6add3088181589d8ed726652742b6221 +0 -5
- package/android/.idea/sonarlint/issuestore/a/8/a8c9f5ddd88723818e51ae3cf8693d02355a8691 +0 -0
- package/android/.idea/sonarlint/issuestore/f/0/f07866736216be0ee2aba49e392191aeae700a35 +0 -0
- package/android/.idea/sonarlint/issuestore/index.pb +0 -7
- package/android/.idea/vcs.xml +0 -6
|
@@ -2,9 +2,9 @@ package com.reactnativehmssdk
|
|
|
2
2
|
|
|
3
3
|
import android.content.Intent
|
|
4
4
|
import android.content.Intent.FLAG_ACTIVITY_NEW_TASK
|
|
5
|
-
import android.util.Log
|
|
6
5
|
import com.facebook.react.bridge.*
|
|
7
6
|
import com.facebook.react.bridge.UiThreadUtil.runOnUiThread
|
|
7
|
+
import com.google.gson.JsonElement
|
|
8
8
|
import kotlinx.coroutines.launch
|
|
9
9
|
import live.hms.video.audio.HMSAudioManager
|
|
10
10
|
import live.hms.video.connection.stats.*
|
|
@@ -186,13 +186,8 @@ class HMSRNSDK(
|
|
|
186
186
|
if (eventsEnableStatus["3"] != true) {
|
|
187
187
|
return
|
|
188
188
|
}
|
|
189
|
-
if (type === HMSPeerUpdate.
|
|
190
|
-
type === HMSPeerUpdate.
|
|
191
|
-
type === HMSPeerUpdate.BECAME_DOMINANT_SPEAKER ||
|
|
192
|
-
type === HMSPeerUpdate.NO_DOMINANT_SPEAKER ||
|
|
193
|
-
type === HMSPeerUpdate.RESIGNED_DOMINANT_SPEAKER ||
|
|
194
|
-
type === HMSPeerUpdate.STARTED_SPEAKING ||
|
|
195
|
-
type === HMSPeerUpdate.STOPPED_SPEAKING
|
|
189
|
+
if (type === HMSPeerUpdate.BECAME_DOMINANT_SPEAKER ||
|
|
190
|
+
type === HMSPeerUpdate.NO_DOMINANT_SPEAKER
|
|
196
191
|
) {
|
|
197
192
|
return
|
|
198
193
|
}
|
|
@@ -321,13 +316,8 @@ class HMSRNSDK(
|
|
|
321
316
|
if (eventsEnableStatus["3"] != true) {
|
|
322
317
|
return
|
|
323
318
|
}
|
|
324
|
-
if (type === HMSPeerUpdate.
|
|
325
|
-
type === HMSPeerUpdate.
|
|
326
|
-
type === HMSPeerUpdate.BECAME_DOMINANT_SPEAKER ||
|
|
327
|
-
type === HMSPeerUpdate.NO_DOMINANT_SPEAKER ||
|
|
328
|
-
type === HMSPeerUpdate.RESIGNED_DOMINANT_SPEAKER ||
|
|
329
|
-
type === HMSPeerUpdate.STARTED_SPEAKING ||
|
|
330
|
-
type === HMSPeerUpdate.STOPPED_SPEAKING
|
|
319
|
+
if (type === HMSPeerUpdate.BECAME_DOMINANT_SPEAKER ||
|
|
320
|
+
type === HMSPeerUpdate.NO_DOMINANT_SPEAKER
|
|
331
321
|
) {
|
|
332
322
|
return
|
|
333
323
|
}
|
|
@@ -770,24 +760,30 @@ class HMSRNSDK(
|
|
|
770
760
|
|
|
771
761
|
if (peerId !== null && role !== null) {
|
|
772
762
|
val hmsPeer = HMSHelper.getPeerFromPeerId(peerId, hmsSDK?.getRoom())
|
|
763
|
+
if (hmsPeer == null) {
|
|
764
|
+
callback?.reject("4000", "PEER_NOT_FOUND")
|
|
765
|
+
return
|
|
766
|
+
}
|
|
773
767
|
val hmsRole = HMSHelper.getRoleFromRoleName(role, hmsSDK?.getRoles())
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
hmsPeer,
|
|
778
|
-
hmsRole,
|
|
779
|
-
force,
|
|
780
|
-
object : HMSActionResultListener {
|
|
781
|
-
override fun onSuccess() {
|
|
782
|
-
callback?.resolve(emitHMSSuccess())
|
|
783
|
-
}
|
|
784
|
-
override fun onError(error: HMSException) {
|
|
785
|
-
self.emitHMSError(error)
|
|
786
|
-
callback?.reject(error.code.toString(), error.message)
|
|
787
|
-
}
|
|
788
|
-
},
|
|
789
|
-
)
|
|
768
|
+
if (hmsRole == null) {
|
|
769
|
+
callback?.reject("4000", "ROLE_NOT_FOUND")
|
|
770
|
+
return
|
|
790
771
|
}
|
|
772
|
+
|
|
773
|
+
hmsSDK?.changeRole(
|
|
774
|
+
hmsPeer,
|
|
775
|
+
hmsRole,
|
|
776
|
+
force,
|
|
777
|
+
object : HMSActionResultListener {
|
|
778
|
+
override fun onSuccess() {
|
|
779
|
+
callback?.resolve(emitHMSSuccess())
|
|
780
|
+
}
|
|
781
|
+
override fun onError(error: HMSException) {
|
|
782
|
+
self.emitHMSError(error)
|
|
783
|
+
callback?.reject(error.code.toString(), error.message)
|
|
784
|
+
}
|
|
785
|
+
},
|
|
786
|
+
)
|
|
791
787
|
}
|
|
792
788
|
} else {
|
|
793
789
|
val errorMessage = "changeRole: $requiredKeys"
|
|
@@ -809,24 +805,30 @@ class HMSRNSDK(
|
|
|
809
805
|
|
|
810
806
|
if (peerId !== null && role !== null) {
|
|
811
807
|
val hmsPeer = HMSHelper.getPeerFromPeerId(peerId, hmsSDK?.getRoom())
|
|
808
|
+
if (hmsPeer == null) {
|
|
809
|
+
promise?.reject("4000", "PEER_NOT_FOUND")
|
|
810
|
+
return
|
|
811
|
+
}
|
|
812
812
|
val hmsRole = HMSHelper.getRoleFromRoleName(role, hmsSDK?.getRoles())
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
hmsPeer,
|
|
817
|
-
hmsRole,
|
|
818
|
-
force,
|
|
819
|
-
object : HMSActionResultListener {
|
|
820
|
-
override fun onSuccess() {
|
|
821
|
-
promise?.resolve(emitHMSSuccess())
|
|
822
|
-
}
|
|
823
|
-
override fun onError(error: HMSException) {
|
|
824
|
-
self.emitHMSError(error)
|
|
825
|
-
promise?.reject(error.code.toString(), error.message)
|
|
826
|
-
}
|
|
827
|
-
},
|
|
828
|
-
)
|
|
813
|
+
if (hmsRole == null) {
|
|
814
|
+
promise?.reject("4000", "ROLE_NOT_FOUND")
|
|
815
|
+
return
|
|
829
816
|
}
|
|
817
|
+
|
|
818
|
+
hmsSDK?.changeRoleOfPeer(
|
|
819
|
+
hmsPeer,
|
|
820
|
+
hmsRole,
|
|
821
|
+
force,
|
|
822
|
+
object : HMSActionResultListener {
|
|
823
|
+
override fun onSuccess() {
|
|
824
|
+
promise?.resolve(emitHMSSuccess())
|
|
825
|
+
}
|
|
826
|
+
override fun onError(error: HMSException) {
|
|
827
|
+
self.emitHMSError(error)
|
|
828
|
+
promise?.reject(error.code.toString(), error.message)
|
|
829
|
+
}
|
|
830
|
+
},
|
|
831
|
+
)
|
|
830
832
|
}
|
|
831
833
|
} else {
|
|
832
834
|
val errorMessage = "changeRoleOfPeer: $requiredKeys"
|
|
@@ -1266,7 +1268,7 @@ class HMSRNSDK(
|
|
|
1266
1268
|
val requiredKeys =
|
|
1267
1269
|
HMSHelper.getUnavailableRequiredKey(
|
|
1268
1270
|
data,
|
|
1269
|
-
arrayOf(Pair("record", "Boolean")
|
|
1271
|
+
arrayOf(Pair("record", "Boolean")),
|
|
1270
1272
|
)
|
|
1271
1273
|
if (requiredKeys === null) {
|
|
1272
1274
|
val config = HMSHelper.getRtmpConfig(data)
|
|
@@ -1541,50 +1543,6 @@ class HMSRNSDK(
|
|
|
1541
1543
|
}
|
|
1542
1544
|
}
|
|
1543
1545
|
|
|
1544
|
-
@Deprecated("SessionMetaData APIs has been deprecated in favour of Session Store APIs", ReplaceWith("setSessionMetadataForKey"), DeprecationLevel.WARNING)
|
|
1545
|
-
fun setSessionMetaData(data: ReadableMap, callback: Promise?) {
|
|
1546
|
-
if (data.hasKey("sessionMetaData")) {
|
|
1547
|
-
val sessionMetaData = data.getString("sessionMetaData")
|
|
1548
|
-
hmsSDK?.setSessionMetaData(
|
|
1549
|
-
sessionMetaData,
|
|
1550
|
-
object : HMSActionResultListener {
|
|
1551
|
-
override fun onSuccess() {
|
|
1552
|
-
callback?.resolve(emitHMSSuccess())
|
|
1553
|
-
}
|
|
1554
|
-
|
|
1555
|
-
override fun onError(error: HMSException) {
|
|
1556
|
-
callback?.reject(error.code.toString(), error.message)
|
|
1557
|
-
self.emitHMSError(error)
|
|
1558
|
-
}
|
|
1559
|
-
},
|
|
1560
|
-
)
|
|
1561
|
-
} else {
|
|
1562
|
-
val errorMessage = "setSessionMetaData: sessionMetaData_Is_Required"
|
|
1563
|
-
self.emitRequiredKeysError(errorMessage)
|
|
1564
|
-
rejectCallback(callback, errorMessage)
|
|
1565
|
-
}
|
|
1566
|
-
}
|
|
1567
|
-
|
|
1568
|
-
@Deprecated("SessionMetaData APIs has been deprecated in favour of Session Store APIs", ReplaceWith("getSessionMetadataForKey"), DeprecationLevel.WARNING)
|
|
1569
|
-
fun getSessionMetaData(callback: Promise?) {
|
|
1570
|
-
hmsSDK?.getSessionMetaData(
|
|
1571
|
-
object : HMSSessionMetadataListener {
|
|
1572
|
-
override fun onSuccess(sessionMetadata: Any?) {
|
|
1573
|
-
if (sessionMetadata is String?) {
|
|
1574
|
-
callback?.resolve(sessionMetadata)
|
|
1575
|
-
} else {
|
|
1576
|
-
callback?.reject("6002", "Session Store: Unsupported type received, only String type is supported")
|
|
1577
|
-
}
|
|
1578
|
-
}
|
|
1579
|
-
|
|
1580
|
-
override fun onError(error: HMSException) {
|
|
1581
|
-
callback?.reject(error.code.toString(), error.message)
|
|
1582
|
-
self.emitHMSError(error)
|
|
1583
|
-
}
|
|
1584
|
-
},
|
|
1585
|
-
)
|
|
1586
|
-
}
|
|
1587
|
-
|
|
1588
1546
|
fun getPeerProperty(data: ReadableMap): WritableMap? {
|
|
1589
1547
|
val requiredKeys =
|
|
1590
1548
|
HMSHelper.getUnavailableRequiredKey(data, arrayOf(Pair("peerId", "String"), Pair("property", "String")))
|
|
@@ -1993,11 +1951,20 @@ class HMSRNSDK(
|
|
|
1993
1951
|
override fun onError(error: HMSException) {
|
|
1994
1952
|
promise?.reject(error.code.toString(), error.message)
|
|
1995
1953
|
}
|
|
1996
|
-
|
|
1997
|
-
|
|
1998
|
-
|
|
1999
|
-
|
|
2000
|
-
|
|
1954
|
+
|
|
1955
|
+
override fun onSuccess(sessionMetadata: JsonElement?) {
|
|
1956
|
+
sessionMetadata.let { sm ->
|
|
1957
|
+
if (sm == null) {
|
|
1958
|
+
promise?.resolve(null)
|
|
1959
|
+
} else {
|
|
1960
|
+
if (sm.isJsonPrimitive) {
|
|
1961
|
+
promise?.resolve(sm.asString)
|
|
1962
|
+
} else if (sm.isJsonNull) {
|
|
1963
|
+
promise?.resolve(null)
|
|
1964
|
+
} else {
|
|
1965
|
+
promise?.resolve(sm.toString())
|
|
1966
|
+
}
|
|
1967
|
+
}
|
|
2001
1968
|
}
|
|
2002
1969
|
}
|
|
2003
1970
|
},
|
|
@@ -2023,16 +1990,25 @@ class HMSRNSDK(
|
|
|
2023
1990
|
}
|
|
2024
1991
|
|
|
2025
1992
|
val keyChangeListener = object : HMSKeyChangeListener {
|
|
2026
|
-
override fun onKeyChanged(key: String, value:
|
|
1993
|
+
override fun onKeyChanged(key: String, value: JsonElement?) {
|
|
2027
1994
|
val map = Arguments.createMap()
|
|
2028
1995
|
map.putString("id", id)
|
|
2029
1996
|
map.putString("key", key)
|
|
2030
|
-
|
|
2031
|
-
|
|
2032
|
-
|
|
2033
|
-
|
|
2034
|
-
|
|
1997
|
+
|
|
1998
|
+
value.let { sm ->
|
|
1999
|
+
if (sm == null) {
|
|
2000
|
+
map.putString("value", null)
|
|
2001
|
+
} else {
|
|
2002
|
+
if (sm.isJsonPrimitive) {
|
|
2003
|
+
map.putString("value", sm.asString)
|
|
2004
|
+
} else if (sm.isJsonNull) {
|
|
2005
|
+
map.putString("value", null)
|
|
2006
|
+
} else {
|
|
2007
|
+
map.putString("value", sm.toString())
|
|
2008
|
+
}
|
|
2009
|
+
}
|
|
2035
2010
|
}
|
|
2011
|
+
|
|
2036
2012
|
delegate.emitEvent("ON_SESSION_STORE_CHANGED", map)
|
|
2037
2013
|
}
|
|
2038
2014
|
}
|
|
@@ -11,6 +11,6 @@ class HmssdkPackage : ReactPackage {
|
|
|
11
11
|
}
|
|
12
12
|
|
|
13
13
|
override fun createViewManagers(reactContext: ReactApplicationContext): List<ViewManager<*, *>> {
|
|
14
|
-
return listOf<ViewManager<*, *>>(HMSSDKViewManager())
|
|
14
|
+
return listOf<ViewManager<*, *>>(HMSSDKViewManager(), HMSHLSPlayerManager())
|
|
15
15
|
}
|
|
16
16
|
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="utf-8"?>
|
|
2
|
+
|
|
3
|
+
<androidx.media3.ui.PlayerView xmlns:android="http://schemas.android.com/apk/res/android"
|
|
4
|
+
xmlns:tools="http://schemas.android.com/tools"
|
|
5
|
+
android:id="@+id/hls_view"
|
|
6
|
+
android:layout_width="match_parent"
|
|
7
|
+
android:layout_height="wrap_content"
|
|
8
|
+
android:layout_gravity="center"
|
|
9
|
+
/>
|
package/ios/HMSDecoder.swift
CHANGED
|
@@ -90,10 +90,10 @@ class HMSDecoder: NSObject {
|
|
|
90
90
|
switch peerUpdateType {
|
|
91
91
|
case .peerJoined: return "0"
|
|
92
92
|
case .peerLeft: return "1"
|
|
93
|
-
case .roleUpdated: return "
|
|
94
|
-
case .nameUpdated: return "
|
|
95
|
-
case .metadataUpdated: return "
|
|
96
|
-
case .networkQualityUpdated: return "
|
|
93
|
+
case .roleUpdated: return "4"
|
|
94
|
+
case .nameUpdated: return "5"
|
|
95
|
+
case .metadataUpdated: return "6"
|
|
96
|
+
case .networkQualityUpdated: return "7"
|
|
97
97
|
default: return nil
|
|
98
98
|
}
|
|
99
99
|
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
|
|
2
|
+
#import "React/RCTViewManager.h"
|
|
3
|
+
#import <Foundation/Foundation.h>
|
|
4
|
+
|
|
5
|
+
@interface RCT_EXTERN_MODULE(HMSHLSPlayerManager, RCTViewManager)
|
|
6
|
+
|
|
7
|
+
RCT_EXPORT_VIEW_PROPERTY(url, NSString);
|
|
8
|
+
RCT_EXPORT_VIEW_PROPERTY(enableStats, BOOL);
|
|
9
|
+
RCT_EXPORT_VIEW_PROPERTY(enableControls, BOOL);
|
|
10
|
+
RCT_EXPORT_VIEW_PROPERTY(onHmsHlsPlaybackEvent, RCTDirectEventBlock);
|
|
11
|
+
RCT_EXPORT_VIEW_PROPERTY(onHmsHlsStatsEvent, RCTDirectEventBlock);
|
|
12
|
+
|
|
13
|
+
RCT_EXTERN_METHOD(play:(nonnull NSNumber *)node url:(nullable NSString *)url)
|
|
14
|
+
RCT_EXTERN_METHOD(stop:(nonnull NSNumber *)node)
|
|
15
|
+
RCT_EXTERN_METHOD(pause:(nonnull NSNumber *)node)
|
|
16
|
+
RCT_EXTERN_METHOD(resume:(nonnull NSNumber *)node)
|
|
17
|
+
RCT_EXTERN_METHOD(seekToLivePosition:(nonnull NSNumber *)node)
|
|
18
|
+
RCT_EXTERN_METHOD(seekForward:(nonnull NSNumber *)node seconds:(nonnull NSNumber *)seconds)
|
|
19
|
+
RCT_EXTERN_METHOD(seekBackward:(nonnull NSNumber *)node seconds:(nonnull NSNumber *)seconds)
|
|
20
|
+
RCT_EXTERN_METHOD(setVolume:(nonnull NSNumber *)node level:(nonnull NSNumber *)level)
|
|
21
|
+
|
|
22
|
+
@end
|
|
@@ -0,0 +1,368 @@
|
|
|
1
|
+
import HMSSDK
|
|
2
|
+
import HMSHLSPlayerSDK
|
|
3
|
+
import AVKit.AVPlayerViewController
|
|
4
|
+
|
|
5
|
+
typealias HmsHlsPlayer = HMSHLSPlayerSDK.HMSHLSPlayer
|
|
6
|
+
|
|
7
|
+
@objc(HMSHLSPlayerManager)
|
|
8
|
+
class HMSHLSPlayerManager: RCTViewManager {
|
|
9
|
+
override func view() -> (HMSHLSPlayer) {
|
|
10
|
+
let view = HMSHLSPlayer()
|
|
11
|
+
let hms = getHmsFromBridge()
|
|
12
|
+
|
|
13
|
+
view.setHms(hms)
|
|
14
|
+
|
|
15
|
+
return view
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
func getHmsFromBridge() -> [String: HMSRNSDK] {
|
|
19
|
+
let collection = (bridge.module(for: HMSManager.classForCoder()) as? HMSManager)?.hmsCollection ?? [String: HMSRNSDK]()
|
|
20
|
+
return collection
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
override class func requiresMainQueueSetup() -> Bool {
|
|
24
|
+
true
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
@objc func play(_ node: NSNumber, url: String? = nil) {
|
|
28
|
+
DispatchQueue.main.async {
|
|
29
|
+
if let component = self.bridge.uiManager.view(forReactTag: node) as? HMSHLSPlayer {
|
|
30
|
+
component.play(url)
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
@objc func stop(_ node: NSNumber) {
|
|
36
|
+
DispatchQueue.main.async {
|
|
37
|
+
if let component = self.bridge.uiManager.view(forReactTag: node) as? HMSHLSPlayer {
|
|
38
|
+
component.stop()
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
@objc func pause(_ node: NSNumber) {
|
|
44
|
+
DispatchQueue.main.async {
|
|
45
|
+
if let component = self.bridge.uiManager.view(forReactTag: node) as? HMSHLSPlayer {
|
|
46
|
+
component.pause()
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
@objc func resume(_ node: NSNumber) {
|
|
52
|
+
DispatchQueue.main.async {
|
|
53
|
+
if let component = self.bridge.uiManager.view(forReactTag: node) as? HMSHLSPlayer {
|
|
54
|
+
component.resume()
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
@objc func seekToLivePosition(_ node: NSNumber) {
|
|
60
|
+
DispatchQueue.main.async {
|
|
61
|
+
if let component = self.bridge.uiManager.view(forReactTag: node) as? HMSHLSPlayer {
|
|
62
|
+
component.seekToLivePosition()
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
@objc func seekForward(_ node: NSNumber, seconds: NSNumber) {
|
|
68
|
+
DispatchQueue.main.async {
|
|
69
|
+
if let component = self.bridge.uiManager.view(forReactTag: node) as? HMSHLSPlayer {
|
|
70
|
+
component.seekForward(Double(truncating: seconds))
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
@objc func seekBackward(_ node: NSNumber, seconds: NSNumber) {
|
|
76
|
+
DispatchQueue.main.async {
|
|
77
|
+
if let component = self.bridge.uiManager.view(forReactTag: node) as? HMSHLSPlayer {
|
|
78
|
+
component.seekBackward(Double(truncating: seconds))
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
@objc func setVolume(_ node: NSNumber, level: NSNumber) {
|
|
84
|
+
DispatchQueue.main.async {
|
|
85
|
+
if let component = self.bridge.uiManager.view(forReactTag: node) as? HMSHLSPlayer {
|
|
86
|
+
component.setVolume(Int(truncating: level))
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
class HMSHLSPlayer: UIView {
|
|
93
|
+
// MARK: class instance properties
|
|
94
|
+
var hlsStatsTimerRef: Timer?
|
|
95
|
+
var eventController: HLSPlaybackEventController?
|
|
96
|
+
var hmsHLSPlayerViewController: AVPlayerViewController?
|
|
97
|
+
lazy var hmsHLSPlayer = HmsHlsPlayer()
|
|
98
|
+
|
|
99
|
+
// MARK: Handle HMSRNSDK Instance in HMSHLSPlayer instance
|
|
100
|
+
var hmsCollection = [String: HMSRNSDK]()
|
|
101
|
+
|
|
102
|
+
func setHms(_ hmsInstance: [String: HMSRNSDK]) {
|
|
103
|
+
hmsCollection = hmsInstance
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// MARK: Handle HMSHLSPlayer RN Component props
|
|
107
|
+
|
|
108
|
+
@objc var onHmsHlsPlaybackEvent: RCTDirectEventBlock?
|
|
109
|
+
|
|
110
|
+
@objc var onHmsHlsStatsEvent: RCTDirectEventBlock?
|
|
111
|
+
|
|
112
|
+
@objc var url: String? {
|
|
113
|
+
didSet {
|
|
114
|
+
play(url)
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
@objc var enableStats: Bool = false {
|
|
119
|
+
didSet {
|
|
120
|
+
if enableStats == true {
|
|
121
|
+
attachHLSPlayerStatsListener()
|
|
122
|
+
} else {
|
|
123
|
+
// If we have existing Stats Timer, Invalidate it
|
|
124
|
+
if let hlsStatsTimer = hlsStatsTimerRef {
|
|
125
|
+
hlsStatsTimer.invalidate()
|
|
126
|
+
hlsStatsTimerRef = nil
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
@objc var enableControls: Bool = true {
|
|
133
|
+
didSet {
|
|
134
|
+
hmsHLSPlayerViewController?.showsPlaybackControls = enableControls
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
// MARK: Handle HMSHLSPlayer RN Component methods
|
|
139
|
+
|
|
140
|
+
@objc func play(_ url: String?) {
|
|
141
|
+
if let validURLString = url, !validURLString.isEmpty {
|
|
142
|
+
if let urlInstance = URL(string: validURLString) {
|
|
143
|
+
hmsHLSPlayer.play(urlInstance)
|
|
144
|
+
}
|
|
145
|
+
return
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
guard let hlsStreamingState = hmsCollection["12345"]?.hms?.room?.hlsStreamingState else {
|
|
149
|
+
return
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
if hlsStreamingState.running && !hlsStreamingState.variants.isEmpty {
|
|
153
|
+
hmsHLSPlayer.play(hlsStreamingState.variants[0].meetingURL)
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
@objc func stop() {
|
|
158
|
+
hmsHLSPlayer.stop()
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
@objc func pause() {
|
|
162
|
+
hmsHLSPlayer.pause()
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
@objc func resume() {
|
|
166
|
+
hmsHLSPlayer.resume()
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
@objc func seekForward(_ seconds: Double) {
|
|
170
|
+
hmsHLSPlayer.seekForward(seconds: seconds)
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
@objc func seekBackward(_ seconds: Double) {
|
|
174
|
+
hmsHLSPlayer.seekBackward(seconds: seconds)
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
@objc func seekToLivePosition() {
|
|
178
|
+
hmsHLSPlayer.seekToLivePosition()
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
@objc func setVolume(_ level: Int) {
|
|
182
|
+
hmsHLSPlayer.volume = level
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
// MARK: Constructor & Deconstructor
|
|
186
|
+
|
|
187
|
+
override init(frame: CGRect) {
|
|
188
|
+
super.init(frame: frame)
|
|
189
|
+
|
|
190
|
+
// setting properties on current UIView
|
|
191
|
+
self.frame = frame
|
|
192
|
+
self.backgroundColor = UIColor(displayP3Red: 0, green: 0, blue: 0, alpha: 1)
|
|
193
|
+
|
|
194
|
+
// creating 100ms HLS Player and getting player view controller
|
|
195
|
+
let playerViewController = hmsHLSPlayer.videoPlayerViewController(showsPlayerControls: false)
|
|
196
|
+
hmsHLSPlayerViewController = playerViewController
|
|
197
|
+
playerViewController.view.frame = self.bounds
|
|
198
|
+
|
|
199
|
+
// Setting 100ms HLS Player as subview of current UIView
|
|
200
|
+
self.addSubview(playerViewController.view)
|
|
201
|
+
|
|
202
|
+
attachPlayerPlaybackListeners()
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
required init?(coder: NSCoder) {
|
|
206
|
+
fatalError("init(coder:) has not been implemented")
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
deinit {
|
|
210
|
+
cleanup()
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
// MARK: Utility functions
|
|
214
|
+
func cleanup() {
|
|
215
|
+
hmsHLSPlayer.stop()
|
|
216
|
+
|
|
217
|
+
// Remove HLS player playback events
|
|
218
|
+
hmsHLSPlayer.delegate = nil
|
|
219
|
+
|
|
220
|
+
// Remove HLS player stats timer
|
|
221
|
+
hlsStatsTimerRef?.invalidate()
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
private func sendHLSPlaybackEventToJS(_ eventName: String, _ data: [String: Any]) {
|
|
225
|
+
guard let onHmsHlsPlaybackEvent = onHmsHlsPlaybackEvent else { return }
|
|
226
|
+
|
|
227
|
+
onHmsHlsPlaybackEvent(["event": eventName, "data": data])
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
private func sendHLSStatsEventToJS(_ eventName: String, _ data: [String: Any]) {
|
|
231
|
+
guard let onHmsHlsStatsEvent = onHmsHlsStatsEvent else { return }
|
|
232
|
+
|
|
233
|
+
onHmsHlsStatsEvent(["event": eventName, "data": data])
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
private func attachPlayerPlaybackListeners() {
|
|
237
|
+
// Attaching HLS Player Playback Events Listener
|
|
238
|
+
eventController = HLSPlaybackEventController(self)
|
|
239
|
+
hmsHLSPlayer.delegate = eventController
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
private func attachHLSPlayerStatsListener() {
|
|
243
|
+
// Only Attach listener, if there is no previously attached listener
|
|
244
|
+
if hlsStatsTimerRef == nil {
|
|
245
|
+
|
|
246
|
+
// Attaching HLS Player Stats Event Listener
|
|
247
|
+
hlsStatsTimerRef = Timer.scheduledTimer(withTimeInterval: 2.0, repeats: true) { [weak self] _ in
|
|
248
|
+
guard let self = self, self.onHmsHlsStatsEvent != nil else { return }
|
|
249
|
+
|
|
250
|
+
let statsMonitor = self.hmsHLSPlayer.statMonitor
|
|
251
|
+
|
|
252
|
+
var data = [String: Any]()
|
|
253
|
+
|
|
254
|
+
// bandwidth
|
|
255
|
+
data["bandWidthEstimate"] = statsMonitor.estimatedBandwidth
|
|
256
|
+
data["totalBytesLoaded"] = statsMonitor.bytesDownloaded
|
|
257
|
+
|
|
258
|
+
// bufferedDuration
|
|
259
|
+
data["bufferedDuration"] = statsMonitor.bufferedDuration
|
|
260
|
+
|
|
261
|
+
// distanceFromLive
|
|
262
|
+
data["distanceFromLive"] = statsMonitor.distanceFromLiveEdge
|
|
263
|
+
|
|
264
|
+
// frameInfo
|
|
265
|
+
data["droppedFrameCount"] = statsMonitor.droppedFrames
|
|
266
|
+
|
|
267
|
+
// videoInfo
|
|
268
|
+
data["averageBitrate"] = statsMonitor.bitrate
|
|
269
|
+
data["videoHeight"] = statsMonitor.videoSize.height
|
|
270
|
+
data["videoWidth"] = statsMonitor.videoSize.width
|
|
271
|
+
|
|
272
|
+
self.sendHLSStatsEventToJS(HMSHLSPlayerConstants.ON_STATS_EVENT_UPDATE, data)
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
fileprivate func onCue(cue: HMSHLSCue) {
|
|
278
|
+
guard onHmsHlsPlaybackEvent != nil else { return }
|
|
279
|
+
|
|
280
|
+
var data = [String: Any]()
|
|
281
|
+
|
|
282
|
+
data["id"] = cue.id
|
|
283
|
+
data["startDate"] = String(cue.startDate.timeIntervalSince1970)
|
|
284
|
+
if let endDate = cue.endDate {
|
|
285
|
+
data["endDate"] = String(endDate.timeIntervalSince1970)
|
|
286
|
+
}
|
|
287
|
+
if let payload = cue.payload {
|
|
288
|
+
data["payloadval"] = payload
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
sendHLSPlaybackEventToJS(HMSHLSPlayerConstants.ON_PLAYBACK_CUE_EVENT, data)
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
fileprivate func onPlaybackFailure(error: Error) {
|
|
295
|
+
guard onHmsHlsPlaybackEvent != nil else { return }
|
|
296
|
+
|
|
297
|
+
var data = [String: Any]()
|
|
298
|
+
|
|
299
|
+
data["error"] = [
|
|
300
|
+
"errorCode": error.localizedDescription,
|
|
301
|
+
"errorCodeName": error.localizedDescription,
|
|
302
|
+
"message": error.localizedDescription
|
|
303
|
+
]
|
|
304
|
+
|
|
305
|
+
sendHLSPlaybackEventToJS(HMSHLSPlayerConstants.ON_PLAYBACK_FAILURE_EVENT, data)
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
fileprivate func onPlaybackStateChanged(state: HMSHLSPlaybackState) {
|
|
309
|
+
guard onHmsHlsPlaybackEvent != nil else { return }
|
|
310
|
+
|
|
311
|
+
var data = [String: Any]()
|
|
312
|
+
|
|
313
|
+
data["state"] = state.description
|
|
314
|
+
|
|
315
|
+
sendHLSPlaybackEventToJS(HMSHLSPlayerConstants.ON_PLAYBACK_STATE_CHANGE_EVENT, data)
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
class HLSPlaybackEventController: HMSHLSPlayerDelegate {
|
|
320
|
+
weak var hmsHlsPlayerDelegate: HMSHLSPlayer?
|
|
321
|
+
|
|
322
|
+
init(_ hmsPlayerDelegate: HMSHLSPlayer) {
|
|
323
|
+
self.hmsHlsPlayerDelegate = hmsPlayerDelegate
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
func onPlaybackStateChanged(state: HMSHLSPlaybackState) {
|
|
327
|
+
hmsHlsPlayerDelegate?.onPlaybackStateChanged(state: state)
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
func onCue(cue: HMSHLSCue) {
|
|
331
|
+
hmsHlsPlayerDelegate?.onCue(cue: cue)
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
func onPlaybackFailure(error: Error) {
|
|
335
|
+
hmsHlsPlayerDelegate?.onPlaybackFailure(error: error)
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
enum HMSHLSPlayerConstants {
|
|
340
|
+
// HLS Playback Events
|
|
341
|
+
static let ON_PLAYBACK_CUE_EVENT = "ON_PLAYBACK_CUE_EVENT"
|
|
342
|
+
static let ON_PLAYBACK_FAILURE_EVENT = "ON_PLAYBACK_FAILURE_EVENT"
|
|
343
|
+
static let ON_PLAYBACK_STATE_CHANGE_EVENT = "ON_PLAYBACK_STATE_CHANGE_EVENT"
|
|
344
|
+
|
|
345
|
+
// HLS Playback Stats Events
|
|
346
|
+
static let ON_STATS_EVENT_UPDATE = "ON_STATS_EVENT_UPDATE"
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
extension HMSHLSPlaybackState: CustomStringConvertible {
|
|
350
|
+
public var description: String {
|
|
351
|
+
switch self {
|
|
352
|
+
case .buffering:
|
|
353
|
+
return "buffering"
|
|
354
|
+
case .failed:
|
|
355
|
+
return "failed"
|
|
356
|
+
case .paused:
|
|
357
|
+
return "paused"
|
|
358
|
+
case .playing:
|
|
359
|
+
return "playing"
|
|
360
|
+
case .stopped:
|
|
361
|
+
return "stopped"
|
|
362
|
+
case .unknown:
|
|
363
|
+
return "unknown"
|
|
364
|
+
@unknown default:
|
|
365
|
+
return "unknown"
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
}
|
package/ios/HMSManager.m
CHANGED
|
@@ -38,6 +38,7 @@ RCT_EXTERN_METHOD(destroy: (NSDictionary) data :(RCTPromiseResolveBlock) resolve
|
|
|
38
38
|
RCT_EXTERN_METHOD(startScreenshare: (NSDictionary) data :(RCTPromiseResolveBlock) resolve :(RCTPromiseRejectBlock) reject)
|
|
39
39
|
RCT_EXTERN_METHOD(stopScreenshare: (NSDictionary) data :(RCTPromiseResolveBlock) resolve :(RCTPromiseRejectBlock) reject)
|
|
40
40
|
RCT_EXTERN_METHOD(isScreenShared: (NSDictionary) data :(RCTPromiseResolveBlock) resolve :(RCTPromiseRejectBlock) reject)
|
|
41
|
+
RCT_EXTERN_METHOD(switchAudioOutputUsingIOSUI: (NSDictionary) data :(RCTPromiseResolveBlock) resolve :(RCTPromiseRejectBlock) reject)
|
|
41
42
|
RCT_EXTERN_METHOD(playAudioShare: (NSDictionary) data :(RCTPromiseResolveBlock) resolve :(RCTPromiseRejectBlock) reject)
|
|
42
43
|
RCT_EXTERN_METHOD(setAudioShareVolume: (NSDictionary) data)
|
|
43
44
|
RCT_EXTERN_METHOD(stopAudioShare: (NSDictionary) data)
|
|
@@ -51,8 +52,6 @@ RCT_EXTERN_METHOD(getRemotePeers: (NSDictionary) data :(RCTPromiseResolveBlock)
|
|
|
51
52
|
RCT_EXTERN_METHOD(getRoles: (NSDictionary) data :(RCTPromiseResolveBlock) resolve :(RCTPromiseRejectBlock) reject)
|
|
52
53
|
RCT_EXTERN_METHOD(enableNetworkQualityUpdates: (NSDictionary) data)
|
|
53
54
|
RCT_EXTERN_METHOD(disableNetworkQualityUpdates: (NSDictionary) data)
|
|
54
|
-
RCT_EXTERN_METHOD(setSessionMetaData: (NSDictionary) data :(RCTPromiseResolveBlock) resolve :(RCTPromiseRejectBlock) reject)
|
|
55
|
-
RCT_EXTERN_METHOD(getSessionMetaData: (NSDictionary) data :(RCTPromiseResolveBlock) resolve :(RCTPromiseRejectBlock) reject)
|
|
56
55
|
RCT_EXTERN_METHOD(changeRoleOfPeer: (NSDictionary) data :(RCTPromiseResolveBlock) resolve :(RCTPromiseRejectBlock) reject)
|
|
57
56
|
RCT_EXTERN_METHOD(changeRoleOfPeersWithRoles: (NSDictionary) data :(RCTPromiseResolveBlock) resolve :(RCTPromiseRejectBlock) reject)
|
|
58
57
|
|