@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.
Files changed (210) hide show
  1. package/android/build.gradle +16 -8
  2. package/android/src/main/java/com/reactnativehmssdk/HMSDecoder.kt +14 -15
  3. package/android/src/main/java/com/reactnativehmssdk/HMSHLSPlayer.kt +248 -0
  4. package/android/src/main/java/com/reactnativehmssdk/HMSHLSPlayerManager.kt +101 -0
  5. package/android/src/main/java/com/reactnativehmssdk/HMSHelper.kt +10 -5
  6. package/android/src/main/java/com/reactnativehmssdk/HMSManager.kt +0 -14
  7. package/android/src/main/java/com/reactnativehmssdk/HMSRNSDK.kt +79 -103
  8. package/android/src/main/java/com/reactnativehmssdk/HmssdkPackage.kt +1 -1
  9. package/android/src/main/res/layout/player_view.xml +9 -0
  10. package/ios/HMSDecoder.swift +4 -4
  11. package/ios/HMSHLSPlayerManager.m +22 -0
  12. package/ios/HMSHLSPlayerManager.swift +368 -0
  13. package/ios/HMSManager.m +1 -2
  14. package/ios/HMSManager.swift +22 -16
  15. package/ios/HMSRNSDK.swift +30 -81
  16. package/lib/commonjs/classes/HMSEncoder.js +11 -4
  17. package/lib/commonjs/classes/HMSEncoder.js.map +1 -1
  18. package/lib/commonjs/classes/HMSLocalPeer.js.map +1 -1
  19. package/lib/commonjs/classes/HMSPeer.js +55 -20
  20. package/lib/commonjs/classes/HMSPeer.js.map +1 -1
  21. package/lib/commonjs/classes/HMSPeerUpdate.js +1 -1
  22. package/lib/commonjs/classes/HMSPeerUpdate.js.map +1 -1
  23. package/lib/commonjs/classes/HMSPeersCache.js +30 -38
  24. package/lib/commonjs/classes/HMSPeersCache.js.map +1 -1
  25. package/lib/commonjs/classes/HMSRTMPConfig.js.map +1 -1
  26. package/lib/commonjs/classes/HMSRemotePeer.js.map +1 -1
  27. package/lib/commonjs/classes/HMSSDK.js +30 -30
  28. package/lib/commonjs/classes/HMSSDK.js.map +1 -1
  29. package/lib/commonjs/components/HMSHLSPlayer/HMSHLSPlayer.js +147 -0
  30. package/lib/commonjs/components/HMSHLSPlayer/HMSHLSPlayer.js.map +1 -0
  31. package/lib/commonjs/components/HMSHLSPlayer/RCTHMSHLSPlayer.js +12 -0
  32. package/lib/commonjs/components/HMSHLSPlayer/RCTHMSHLSPlayer.js.map +1 -0
  33. package/lib/commonjs/components/HMSHLSPlayer/hooks.js +71 -0
  34. package/lib/commonjs/components/HMSHLSPlayer/hooks.js.map +1 -0
  35. package/lib/commonjs/components/HMSHLSPlayer/index.js +63 -0
  36. package/lib/commonjs/components/HMSHLSPlayer/index.js.map +1 -0
  37. package/lib/commonjs/index.js +38 -0
  38. package/lib/commonjs/index.js.map +1 -1
  39. package/lib/commonjs/stores/hls-player-playback-slice.js +23 -0
  40. package/lib/commonjs/stores/hls-player-playback-slice.js.map +1 -0
  41. package/lib/commonjs/stores/hls-player-stats-store.js +36 -0
  42. package/lib/commonjs/stores/hls-player-stats-store.js.map +1 -0
  43. package/lib/commonjs/stores/hms-store.js +16 -0
  44. package/lib/commonjs/stores/hms-store.js.map +1 -0
  45. package/lib/commonjs/stores/types.js +6 -0
  46. package/lib/commonjs/stores/types.js.map +1 -0
  47. package/lib/commonjs/types.js +36 -0
  48. package/lib/commonjs/types.js.map +1 -0
  49. package/lib/module/classes/HMSEncoder.js +11 -4
  50. package/lib/module/classes/HMSEncoder.js.map +1 -1
  51. package/lib/module/classes/HMSLocalPeer.js.map +1 -1
  52. package/lib/module/classes/HMSPeer.js +55 -20
  53. package/lib/module/classes/HMSPeer.js.map +1 -1
  54. package/lib/module/classes/HMSPeerUpdate.js +1 -1
  55. package/lib/module/classes/HMSPeerUpdate.js.map +1 -1
  56. package/lib/module/classes/HMSPeersCache.js +30 -38
  57. package/lib/module/classes/HMSPeersCache.js.map +1 -1
  58. package/lib/module/classes/HMSRTMPConfig.js.map +1 -1
  59. package/lib/module/classes/HMSRemotePeer.js.map +1 -1
  60. package/lib/module/classes/HMSSDK.js +30 -30
  61. package/lib/module/classes/HMSSDK.js.map +1 -1
  62. package/lib/module/components/HMSHLSPlayer/HMSHLSPlayer.js +138 -0
  63. package/lib/module/components/HMSHLSPlayer/HMSHLSPlayer.js.map +1 -0
  64. package/lib/module/components/HMSHLSPlayer/RCTHMSHLSPlayer.js +4 -0
  65. package/lib/module/components/HMSHLSPlayer/RCTHMSHLSPlayer.js.map +1 -0
  66. package/lib/module/components/HMSHLSPlayer/hooks.js +56 -0
  67. package/lib/module/components/HMSHLSPlayer/hooks.js.map +1 -0
  68. package/lib/module/components/HMSHLSPlayer/index.js +3 -0
  69. package/lib/module/components/HMSHLSPlayer/index.js.map +1 -0
  70. package/lib/module/index.js +7 -0
  71. package/lib/module/index.js.map +1 -1
  72. package/lib/module/stores/hls-player-playback-slice.js +16 -0
  73. package/lib/module/stores/hls-player-playback-slice.js.map +1 -0
  74. package/lib/module/stores/hls-player-stats-store.js +29 -0
  75. package/lib/module/stores/hls-player-stats-store.js.map +1 -0
  76. package/lib/module/stores/hms-store.js +9 -0
  77. package/lib/module/stores/hms-store.js.map +1 -0
  78. package/lib/module/stores/types.js +2 -0
  79. package/lib/module/stores/types.js.map +1 -0
  80. package/lib/module/types.js +32 -0
  81. package/lib/module/types.js.map +1 -0
  82. package/lib/typescript/classes/HMSEncoder.d.ts +1 -0
  83. package/lib/typescript/classes/HMSLocalPeer.d.ts +0 -1
  84. package/lib/typescript/classes/HMSPeer.d.ts +10 -5
  85. package/lib/typescript/classes/HMSPeersCache.d.ts +17 -2
  86. package/lib/typescript/classes/HMSRTMPConfig.d.ts +2 -2
  87. package/lib/typescript/classes/HMSRemotePeer.d.ts +0 -1
  88. package/lib/typescript/classes/HMSSDK.d.ts +3 -14
  89. package/lib/typescript/components/HMSHLSPlayer/HMSHLSPlayer.d.ts +21 -0
  90. package/lib/typescript/components/HMSHLSPlayer/RCTHMSHLSPlayer.d.ts +19 -0
  91. package/lib/typescript/components/HMSHLSPlayer/hooks.d.ts +17 -0
  92. package/lib/typescript/components/HMSHLSPlayer/index.d.ts +2 -0
  93. package/lib/typescript/index.d.ts +3 -0
  94. package/lib/typescript/stores/hls-player-playback-slice.d.ts +5 -0
  95. package/lib/typescript/stores/hls-player-stats-store.d.ts +9 -0
  96. package/lib/typescript/stores/hms-store.d.ts +9 -0
  97. package/lib/typescript/stores/types.d.ts +25 -0
  98. package/lib/typescript/types.d.ts +63 -0
  99. package/package.json +4 -1
  100. package/react-native-hms.podspec +1 -0
  101. package/sdk-versions.json +3 -2
  102. package/src/classes/HMSEncoder.ts +14 -3
  103. package/src/classes/HMSLocalPeer.ts +0 -1
  104. package/src/classes/HMSPeer.ts +96 -48
  105. package/src/classes/HMSPeerUpdate.ts +4 -4
  106. package/src/classes/HMSPeersCache.ts +53 -40
  107. package/src/classes/HMSRTMPConfig.ts +2 -2
  108. package/src/classes/HMSRemotePeer.ts +0 -1
  109. package/src/classes/HMSSDK.tsx +33 -30
  110. package/src/components/HMSHLSPlayer/HMSHLSPlayer.tsx +235 -0
  111. package/src/components/HMSHLSPlayer/RCTHMSHLSPlayer.ts +38 -0
  112. package/src/components/HMSHLSPlayer/hooks.ts +100 -0
  113. package/src/components/HMSHLSPlayer/index.ts +9 -0
  114. package/src/index.ts +8 -0
  115. package/src/stores/hls-player-playback-slice.ts +25 -0
  116. package/src/stores/hls-player-stats-store.ts +37 -0
  117. package/src/stores/hms-store.ts +11 -0
  118. package/src/stores/types.ts +49 -0
  119. package/src/types.ts +119 -0
  120. package/android/.gradle/6.9/executionHistory/executionHistory.lock +0 -0
  121. package/android/.gradle/6.9/fileChanges/last-build.bin +0 -0
  122. package/android/.gradle/6.9/fileHashes/fileHashes.bin +0 -0
  123. package/android/.gradle/6.9/fileHashes/fileHashes.lock +0 -0
  124. package/android/.gradle/6.9/gc.properties +0 -0
  125. package/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock +0 -0
  126. package/android/.gradle/buildOutputCleanup/cache.properties +0 -2
  127. package/android/.gradle/buildOutputCleanup/outputFiles.bin +0 -0
  128. package/android/.gradle/checksums/checksums.lock +0 -0
  129. package/android/.gradle/checksums/md5-checksums.bin +0 -0
  130. package/android/.gradle/checksums/sha1-checksums.bin +0 -0
  131. package/android/.gradle/vcs-1/gc.properties +0 -0
  132. package/android/.idea/compiler.xml +0 -6
  133. package/android/.idea/gradle.xml +0 -18
  134. package/android/.idea/jarRepositories.xml +0 -50
  135. package/android/.idea/libraries/Gradle__androidx_activity_activity_1_2_4_aar.xml +0 -16
  136. package/android/.idea/libraries/Gradle__androidx_annotation_annotation_1_3_0.xml +0 -11
  137. package/android/.idea/libraries/Gradle__androidx_annotation_annotation_experimental_1_1_0_aar.xml +0 -13
  138. package/android/.idea/libraries/Gradle__androidx_appcompat_appcompat_1_4_1_aar.xml +0 -16
  139. package/android/.idea/libraries/Gradle__androidx_appcompat_appcompat_resources_1_4_1_aar.xml +0 -13
  140. package/android/.idea/libraries/Gradle__androidx_arch_core_core_common_2_1_0.xml +0 -11
  141. package/android/.idea/libraries/Gradle__androidx_arch_core_core_runtime_2_1_0_aar.xml +0 -13
  142. package/android/.idea/libraries/Gradle__androidx_autofill_autofill_1_1_0_aar.xml +0 -16
  143. package/android/.idea/libraries/Gradle__androidx_collection_collection_1_1_0.xml +0 -11
  144. package/android/.idea/libraries/Gradle__androidx_constraintlayout_constraintlayout_2_1_3_aar.xml +0 -13
  145. package/android/.idea/libraries/Gradle__androidx_core_core_1_7_0_aar.xml +0 -16
  146. package/android/.idea/libraries/Gradle__androidx_cursoradapter_cursoradapter_1_0_0_aar.xml +0 -13
  147. package/android/.idea/libraries/Gradle__androidx_customview_customview_1_0_0_aar.xml +0 -13
  148. package/android/.idea/libraries/Gradle__androidx_drawerlayout_drawerlayout_1_0_0_aar.xml +0 -16
  149. package/android/.idea/libraries/Gradle__androidx_fragment_fragment_1_3_6_aar.xml +0 -16
  150. package/android/.idea/libraries/Gradle__androidx_interpolator_interpolator_1_0_0_aar.xml +0 -13
  151. package/android/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_common_2_4_0.xml +0 -11
  152. package/android/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_livedata_2_0_0_aar.xml +0 -13
  153. package/android/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_livedata_core_2_3_1_aar.xml +0 -13
  154. package/android/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_runtime_2_4_0_aar.xml +0 -13
  155. package/android/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_viewmodel_2_3_1_aar.xml +0 -13
  156. package/android/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_viewmodel_savedstate_2_3_1_aar.xml +0 -13
  157. package/android/.idea/libraries/Gradle__androidx_loader_loader_1_0_0_aar.xml +0 -13
  158. package/android/.idea/libraries/Gradle__androidx_savedstate_savedstate_1_1_0_aar.xml +0 -13
  159. package/android/.idea/libraries/Gradle__androidx_swiperefreshlayout_swiperefreshlayout_1_0_0_aar.xml +0 -16
  160. package/android/.idea/libraries/Gradle__androidx_tracing_tracing_1_1_0_aar.xml +0 -13
  161. package/android/.idea/libraries/Gradle__androidx_vectordrawable_vectordrawable_1_1_0_aar.xml +0 -13
  162. package/android/.idea/libraries/Gradle__androidx_vectordrawable_vectordrawable_animated_1_1_0_aar.xml +0 -13
  163. package/android/.idea/libraries/Gradle__androidx_versionedparcelable_versionedparcelable_1_1_1_aar.xml +0 -13
  164. package/android/.idea/libraries/Gradle__androidx_viewpager_viewpager_1_0_0_aar.xml +0 -13
  165. package/android/.idea/libraries/Gradle__com_facebook_fbjni_fbjni_0_3_0_aar.xml +0 -14
  166. package/android/.idea/libraries/Gradle__com_facebook_fresco_drawee_2_5_0_aar.xml +0 -15
  167. package/android/.idea/libraries/Gradle__com_facebook_fresco_fbcore_2_5_0_aar.xml +0 -18
  168. package/android/.idea/libraries/Gradle__com_facebook_fresco_fresco_2_5_0_aar.xml +0 -18
  169. package/android/.idea/libraries/Gradle__com_facebook_fresco_imagepipeline_2_5_0_aar.xml +0 -18
  170. package/android/.idea/libraries/Gradle__com_facebook_fresco_imagepipeline_base_2_5_0_aar.xml +0 -18
  171. package/android/.idea/libraries/Gradle__com_facebook_fresco_imagepipeline_native_2_5_0_aar.xml +0 -15
  172. package/android/.idea/libraries/Gradle__com_facebook_fresco_imagepipeline_okhttp3_2_5_0_aar.xml +0 -15
  173. package/android/.idea/libraries/Gradle__com_facebook_fresco_memory_type_ashmem_2_5_0_aar.xml +0 -15
  174. package/android/.idea/libraries/Gradle__com_facebook_fresco_memory_type_java_2_5_0_aar.xml +0 -15
  175. package/android/.idea/libraries/Gradle__com_facebook_fresco_memory_type_native_2_5_0_aar.xml +0 -15
  176. package/android/.idea/libraries/Gradle__com_facebook_fresco_nativeimagefilters_2_5_0_aar.xml +0 -15
  177. package/android/.idea/libraries/Gradle__com_facebook_fresco_nativeimagetranscoder_2_5_0_aar.xml +0 -15
  178. package/android/.idea/libraries/Gradle__com_facebook_fresco_ui_common_2_5_0_aar.xml +0 -15
  179. package/android/.idea/libraries/Gradle__com_facebook_infer_annotation_infer_annotation_0_18_0.xml +0 -13
  180. package/android/.idea/libraries/Gradle__com_facebook_react_react_native_0_71_0_rc_0_debug_aar.xml +0 -14
  181. package/android/.idea/libraries/Gradle__com_facebook_soloader_annotation_0_10_4.xml +0 -13
  182. package/android/.idea/libraries/Gradle__com_facebook_soloader_nativeloader_0_10_4.xml +0 -13
  183. package/android/.idea/libraries/Gradle__com_facebook_soloader_soloader_0_10_4_aar.xml +0 -14
  184. package/android/.idea/libraries/Gradle__com_facebook_yoga_proguard_annotations_1_19_0.xml +0 -13
  185. package/android/.idea/libraries/Gradle__com_github_100mslive_android_sdk_lib_2_5_1_aar.xml +0 -10
  186. package/android/.idea/libraries/Gradle__com_github_100mslive_webrtc_m104_hms_1_3_aar.xml +0 -10
  187. package/android/.idea/libraries/Gradle__com_google_code_findbugs_jsr305_3_0_2.xml +0 -13
  188. package/android/.idea/libraries/Gradle__com_squareup_okhttp3_okhttp_4_9_2.xml +0 -13
  189. package/android/.idea/libraries/Gradle__com_squareup_okhttp3_okhttp_urlconnection_4_9_2.xml +0 -13
  190. package/android/.idea/libraries/Gradle__com_squareup_okio_okio_2_9_0.xml +0 -13
  191. package/android/.idea/libraries/Gradle__javax_inject_javax_inject_1.xml +0 -13
  192. package/android/.idea/libraries/Gradle__org_jetbrains_annotations_13_0.xml +0 -13
  193. package/android/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_annotations_jvm_1_3_72.xml +0 -13
  194. package/android/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_1_6_10.xml +0 -13
  195. package/android/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_common_1_6_10.xml +0 -13
  196. package/android/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_jdk7_1_6_10.xml +0 -13
  197. package/android/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_jdk8_1_6_10.xml +0 -13
  198. package/android/.idea/libraries/Gradle__org_jetbrains_kotlinx_kotlinx_coroutines_android_1_6_0.xml +0 -13
  199. package/android/.idea/libraries/Gradle__org_jetbrains_kotlinx_kotlinx_coroutines_core_jvm_1_6_0.xml +0 -13
  200. package/android/.idea/misc.xml +0 -9
  201. package/android/.idea/modules/android.androidTest.iml +0 -203
  202. package/android/.idea/modules/android.iml +0 -40
  203. package/android/.idea/modules/android.main.iml +0 -199
  204. package/android/.idea/modules/android.unitTest.iml +0 -197
  205. package/android/.idea/modules.xml +0 -11
  206. package/android/.idea/sonarlint/issuestore/3/c/3c46088b6add3088181589d8ed726652742b6221 +0 -5
  207. package/android/.idea/sonarlint/issuestore/a/8/a8c9f5ddd88723818e51ae3cf8693d02355a8691 +0 -0
  208. package/android/.idea/sonarlint/issuestore/f/0/f07866736216be0ee2aba49e392191aeae700a35 +0 -0
  209. package/android/.idea/sonarlint/issuestore/index.pb +0 -7
  210. package/android/.idea/vcs.xml +0 -6
@@ -1002,6 +1002,7 @@ export class HMSSDK {
1002
1002
  };
1003
1003
 
1004
1004
  /**
1005
+ * Android Only
1005
1006
  * - This wrapper function used to switch output to device other than the default, currently available only for android.
1006
1007
  *
1007
1008
  * checkout {@link https://www.100ms.live/docs/react-native/v2/features/audio-output-routing#switch-audio-focus-to-another-device} for more info
@@ -1022,6 +1023,19 @@ export class HMSSDK {
1022
1023
  }
1023
1024
  };
1024
1025
 
1026
+ switchAudioOutputUsingIOSUI = () => {
1027
+ logger?.verbose('#Function switchAudioOutputUsingIOSUI', {
1028
+ id: this.id,
1029
+ });
1030
+ if (Platform.OS !== 'ios') {
1031
+ throw new Error(
1032
+ '#Function `switchAudioOutputUsingIOSUI` is only available on iOS, use `switchAudioOutput` method instead!'
1033
+ );
1034
+ }
1035
+
1036
+ return HMSManager.switchAudioOutputUsingIOSUI({ id: this.id });
1037
+ };
1038
+
1025
1039
  /**
1026
1040
  * - This wrapper function used to change Audio Mode manually, currently available only for android.
1027
1041
  *
@@ -1067,36 +1081,6 @@ export class HMSSDK {
1067
1081
  }
1068
1082
  };
1069
1083
 
1070
- /**
1071
- * @deprecated Older SessionMetaData APIs has been deprecated in favour of newer Session Store APIs.
1072
- * You can subscribe to `ON_SESSION_STORE_AVAILABLE` event to get notified when the `HMSSessionStore`
1073
- * is available and use `set` method on `HMSSessionStore` instance
1074
- * checkout {@link https://www.100ms.live/docs/react-native/v2/how-to-guides/}
1075
- */
1076
- setSessionMetaData = async (sessionMetaData: string | null) => {
1077
- logger?.verbose('#Function setSessionMetaData', {
1078
- id: this.id,
1079
- sessionMetaData,
1080
- });
1081
- return await HMSManager.setSessionMetaData({
1082
- id: this.id,
1083
- sessionMetaData,
1084
- });
1085
- };
1086
-
1087
- /**
1088
- * @deprecated Older SessionMetaData APIs has been deprecated in favour of newer Session Store APIs.
1089
- * You can subscribe to `ON_SESSION_STORE_AVAILABLE` event to get notified when the `HMSSessionStore`
1090
- * is available and use `get` or `addKeyChangeListener` method on `HMSSessionStore` instance
1091
- * checkout {@link https://www.100ms.live/docs/react-native/v2/how-to-guides/}
1092
- */
1093
- getSessionMetaData = async () => {
1094
- logger?.verbose('#Function getSessionMetaData', {
1095
- id: this.id,
1096
- });
1097
- return await HMSManager.getSessionMetaData({ id: this.id });
1098
- };
1099
-
1100
1084
  getRemoteVideoTrackFromTrackId = async (trackId: string) => {
1101
1085
  logger?.verbose('#Function getRemoteVideoTrackFromTrackId', {
1102
1086
  id: this.id,
@@ -1125,6 +1109,25 @@ export class HMSSDK {
1125
1109
  return HMSEncoder.encodeHmsRemoteAudioTrack(remoteAudioTrackData, this.id);
1126
1110
  };
1127
1111
 
1112
+ getPeerFromPeerId = (peerId: string) => {
1113
+ logger?.verbose('#Function getPeerFromPeerId', {
1114
+ id: this.id,
1115
+ peerId,
1116
+ });
1117
+ // Getting Peer Cache
1118
+ const peersCache = getHmsPeersCache();
1119
+
1120
+ // If Peer Cache doesn't exist, return `undefined` as we don't have Peer
1121
+ if (!peersCache) return;
1122
+
1123
+ const peerRole = peersCache.getProperty(peerId, 'role');
1124
+
1125
+ // If Peer doesn't have valid Role, return `undefined` as we don't have Peer
1126
+ if (!peerRole) return;
1127
+
1128
+ return HMSEncoder.encodeHmsPeer({ peerID: peerId });
1129
+ };
1130
+
1128
1131
  /**
1129
1132
  * - This is a prototype event listener that takes action and listens for updates related to that particular action
1130
1133
  *
@@ -0,0 +1,235 @@
1
+ import React, { useImperativeHandle, useRef } from 'react';
2
+ import { View, StyleSheet, UIManager, findNodeHandle } from 'react-native';
3
+ import type { StyleProp, ViewStyle } from 'react-native';
4
+
5
+ import {
6
+ setHMSHLSPlayerCue,
7
+ setHMSHLSPlayerPlaybackError,
8
+ setHMSHLSPlayerPlaybackState,
9
+ setHMSHLSPlayerStats,
10
+ setHMSHLSPlayerStatsError,
11
+ } from './hooks';
12
+ import {
13
+ HmsHlsPlaybackEventHandler,
14
+ HmsHlsStatsEventHandler,
15
+ RCTHMSHLSPlayer,
16
+ RCTHMSHLSPlayerRef,
17
+ RCTHMSHLSPlayerViewManagerConfig,
18
+ } from './RCTHMSHLSPlayer';
19
+ import {
20
+ HMSHLSPlayerPlaybackEventTypes,
21
+ HMSHLSPlayerStatsEventTypes,
22
+ } from '../../types';
23
+ import type { HMSHLSPlayerPlaybackCueEventData } from '../../types';
24
+ import { HMSEncoder } from '../../classes/HMSEncoder';
25
+ import type { HMSHLSPlayerPlaybackCue } from '../../stores/types';
26
+
27
+ export interface HMSHLSPlayerProps {
28
+ url?: string;
29
+ style?: StyleProp<ViewStyle>;
30
+ containerStyle?: StyleProp<ViewStyle>;
31
+ aspectRatio?: number;
32
+ enableStats?: boolean;
33
+ enableControls?: boolean;
34
+ }
35
+
36
+ export interface HMSHLSPlayerRefProperties {
37
+ play: (url?: string) => void;
38
+ stop: () => void;
39
+ pause: () => void;
40
+ resume: () => void;
41
+ seekForward: (seconds: number) => void;
42
+ seekBackward: (seconds: number) => void;
43
+ seekToLivePosition: () => void;
44
+ setVolume: (level: number) => void;
45
+ }
46
+
47
+ const _HMSHLSPlayer: React.ForwardRefRenderFunction<
48
+ HMSHLSPlayerRefProperties,
49
+ HMSHLSPlayerProps
50
+ > = (
51
+ {
52
+ url = '',
53
+ style,
54
+ containerStyle,
55
+ aspectRatio = 9 / 16,
56
+ enableStats,
57
+ enableControls = false,
58
+ },
59
+ ref
60
+ ) => {
61
+ const hmsHlsPlayerRef = useRef<RCTHMSHLSPlayerRef | null>(null);
62
+
63
+ useImperativeHandle(
64
+ ref,
65
+ () => ({
66
+ play: (url?: string) => {
67
+ if (hmsHlsPlayerRef.current) {
68
+ UIManager.dispatchViewManagerCommand(
69
+ findNodeHandle(hmsHlsPlayerRef.current),
70
+ RCTHMSHLSPlayerViewManagerConfig.Commands.play,
71
+ url ? [url] : ['']
72
+ );
73
+ }
74
+ },
75
+ stop: () => {
76
+ if (hmsHlsPlayerRef.current) {
77
+ UIManager.dispatchViewManagerCommand(
78
+ findNodeHandle(hmsHlsPlayerRef.current),
79
+ RCTHMSHLSPlayerViewManagerConfig.Commands.stop,
80
+ undefined
81
+ );
82
+ }
83
+ },
84
+ pause: () => {
85
+ if (hmsHlsPlayerRef.current) {
86
+ UIManager.dispatchViewManagerCommand(
87
+ findNodeHandle(hmsHlsPlayerRef.current),
88
+ RCTHMSHLSPlayerViewManagerConfig.Commands.pause,
89
+ undefined
90
+ );
91
+ }
92
+ },
93
+ resume: () => {
94
+ if (hmsHlsPlayerRef.current) {
95
+ UIManager.dispatchViewManagerCommand(
96
+ findNodeHandle(hmsHlsPlayerRef.current),
97
+ RCTHMSHLSPlayerViewManagerConfig.Commands.resume,
98
+ undefined
99
+ );
100
+ }
101
+ },
102
+ seekForward: (seconds: number) => {
103
+ if (typeof seconds !== 'number') {
104
+ throw new Error(
105
+ seconds
106
+ ? 'seconds must be a `number` type'
107
+ : 'seconds was not provided'
108
+ );
109
+ }
110
+
111
+ if (hmsHlsPlayerRef.current) {
112
+ UIManager.dispatchViewManagerCommand(
113
+ findNodeHandle(hmsHlsPlayerRef.current),
114
+ RCTHMSHLSPlayerViewManagerConfig.Commands.seekForward,
115
+ [seconds]
116
+ );
117
+ }
118
+ },
119
+ seekBackward: (seconds: number) => {
120
+ if (typeof seconds !== 'number') {
121
+ throw new Error(
122
+ seconds
123
+ ? 'seconds must be a `number` type'
124
+ : 'seconds was not provided'
125
+ );
126
+ }
127
+
128
+ if (hmsHlsPlayerRef.current) {
129
+ UIManager.dispatchViewManagerCommand(
130
+ findNodeHandle(hmsHlsPlayerRef.current),
131
+ RCTHMSHLSPlayerViewManagerConfig.Commands.seekBackward,
132
+ [seconds]
133
+ );
134
+ }
135
+ },
136
+ seekToLivePosition: () => {
137
+ if (hmsHlsPlayerRef.current) {
138
+ UIManager.dispatchViewManagerCommand(
139
+ findNodeHandle(hmsHlsPlayerRef.current),
140
+ RCTHMSHLSPlayerViewManagerConfig.Commands.seekToLivePosition,
141
+ undefined
142
+ );
143
+ }
144
+ },
145
+ setVolume: (level: number) => {
146
+ if (typeof level !== 'number') {
147
+ throw new Error(
148
+ level ? 'level must be a `number` type' : 'level was not provided'
149
+ );
150
+ }
151
+
152
+ if (hmsHlsPlayerRef.current) {
153
+ UIManager.dispatchViewManagerCommand(
154
+ findNodeHandle(hmsHlsPlayerRef.current),
155
+ RCTHMSHLSPlayerViewManagerConfig.Commands.setVolume,
156
+ [level]
157
+ );
158
+ }
159
+ },
160
+ }),
161
+ []
162
+ );
163
+
164
+ // Handle HLS Playback events
165
+ const handleHLSPlaybackEvent: HmsHlsPlaybackEventHandler = ({
166
+ nativeEvent,
167
+ }) => {
168
+ const { event, data } = nativeEvent;
169
+
170
+ if (event === HMSHLSPlayerPlaybackEventTypes.ON_PLAYBACK_CUE_EVENT) {
171
+ const transformedData = HMSEncoder.transformHMSHLSCueEventData<
172
+ HMSHLSPlayerPlaybackCueEventData,
173
+ HMSHLSPlayerPlaybackCue
174
+ >(data);
175
+ setHMSHLSPlayerCue(transformedData);
176
+ } else if (
177
+ event === HMSHLSPlayerPlaybackEventTypes.ON_PLAYBACK_FAILURE_EVENT
178
+ ) {
179
+ setHMSHLSPlayerPlaybackError(data.error);
180
+ } else {
181
+ setHMSHLSPlayerPlaybackState(data.state);
182
+ }
183
+ };
184
+
185
+ // Handle HLS Stats events
186
+ const handleHLSStatsEvent: HmsHlsStatsEventHandler = ({ nativeEvent }) => {
187
+ const { event, data } = nativeEvent;
188
+
189
+ if (event === HMSHLSPlayerStatsEventTypes.ON_STATS_EVENT_ERROR) {
190
+ setHMSHLSPlayerStatsError(data);
191
+ } else {
192
+ setHMSHLSPlayerStats(data);
193
+ }
194
+ };
195
+
196
+ return (
197
+ <View style={[styles.container, containerStyle]}>
198
+ <View style={[styles.playerWrapper, style]}>
199
+ <RCTHMSHLSPlayer
200
+ ref={hmsHlsPlayerRef}
201
+ url={url}
202
+ style={[styles.player, { aspectRatio }]}
203
+ enableStats={enableStats}
204
+ enableControls={enableControls}
205
+ onHmsHlsPlaybackEvent={handleHLSPlaybackEvent}
206
+ onHmsHlsStatsEvent={handleHLSStatsEvent}
207
+ />
208
+ </View>
209
+ </View>
210
+ );
211
+ };
212
+
213
+ export const HMSHLSPlayer = React.forwardRef<
214
+ HMSHLSPlayerRefProperties,
215
+ HMSHLSPlayerProps
216
+ >(_HMSHLSPlayer);
217
+
218
+ const styles = StyleSheet.create({
219
+ container: {
220
+ flex: 1,
221
+ alignItems: 'center',
222
+ justifyContent: 'center',
223
+ },
224
+ playerWrapper: {
225
+ backgroundColor: '#000000',
226
+ alignItems: 'center',
227
+ justifyContent: 'center',
228
+ },
229
+ player: {
230
+ width: '100%',
231
+ maxHeight: '100%',
232
+ maxWidth: '100%',
233
+ aspectRatio: 9 / 16,
234
+ },
235
+ });
@@ -0,0 +1,38 @@
1
+ import {
2
+ requireNativeComponent,
3
+ StyleProp,
4
+ NativeSyntheticEvent,
5
+ ViewStyle,
6
+ UIManager,
7
+ NativeMethods,
8
+ } from 'react-native';
9
+ import type {
10
+ HMSHLSPlayerPlaybackEvent,
11
+ HMSHLSPlayerStatsEvent,
12
+ } from '../../types';
13
+
14
+ export type HmsHlsPlaybackEventHandler = (
15
+ event: NativeSyntheticEvent<HMSHLSPlayerPlaybackEvent>
16
+ ) => void;
17
+
18
+ export type HmsHlsStatsEventHandler = (
19
+ event: NativeSyntheticEvent<HMSHLSPlayerStatsEvent>
20
+ ) => void;
21
+
22
+ export type RCTHMSHLSPlayerProps = {
23
+ url?: string;
24
+ style?: StyleProp<ViewStyle>;
25
+ enableStats?: boolean;
26
+ enableControls?: boolean;
27
+ onHmsHlsPlaybackEvent?: HmsHlsPlaybackEventHandler;
28
+ onHmsHlsStatsEvent?: HmsHlsStatsEventHandler;
29
+ };
30
+
31
+ export const RCTHMSHLSPlayer =
32
+ requireNativeComponent<RCTHMSHLSPlayerProps>('HMSHLSPlayer');
33
+
34
+ export type RCTHMSHLSPlayerRef = React.Component<RCTHMSHLSPlayerProps> &
35
+ Readonly<NativeMethods>;
36
+
37
+ export const RCTHMSHLSPlayerViewManagerConfig =
38
+ UIManager.getViewManagerConfig('HMSHLSPlayer');
@@ -0,0 +1,100 @@
1
+ import { DependencyList, useEffect } from 'react';
2
+ import { shallow } from 'zustand/shallow';
3
+
4
+ import { useHMSHLSPlayerStatsStore } from '../../stores/hls-player-stats-store';
5
+ import { useHMSStore } from '../../stores/hms-store';
6
+ import type { HMSHLSPlayerStatsUpdateEventData } from '../../types';
7
+ import type {
8
+ HMSHLSPlayerCue,
9
+ HMSHLSPlayerPlaybackError,
10
+ HMSHLSPlayerStatsError,
11
+ } from '../../stores/types';
12
+
13
+ // use latest state (with component rerender)
14
+
15
+ export const useHMSHLSPlayerPlaybackState = () => {
16
+ return useHMSStore((state) => state.playbackState);
17
+ };
18
+
19
+ export const useHMSHLSPlayerStats = () => {
20
+ return useHMSHLSPlayerStatsStore(
21
+ (state) => ({
22
+ stats: state.stats,
23
+ error: state.error,
24
+ }),
25
+ shallow
26
+ );
27
+ };
28
+
29
+ export const useHMSHLSPlayerStat = <
30
+ T extends keyof HMSHLSPlayerStatsUpdateEventData
31
+ >(
32
+ stat: T
33
+ ) => {
34
+ return useHMSHLSPlayerStatsStore((state) => state.stats[stat]);
35
+ };
36
+
37
+ // // The distance of current playback position from the live edge of HLS stream
38
+ // export const useIsHLSStreamLive = (liveOffsetMillis: number = 1000) => {
39
+ // return useHMSHLSPlayerStatsStore((state) => state.stats.distanceFromLive < liveOffsetMillis);
40
+ // }
41
+
42
+ // get latest state (without component rerender)
43
+
44
+ export const useHMSHLSPlayerStatsError = (
45
+ callback: (error: NonNullable<HMSHLSPlayerStatsError>) => void,
46
+ deps: DependencyList
47
+ ) => {
48
+ useEffect(() => {
49
+ return useHMSHLSPlayerStatsStore.subscribe(
50
+ (state) => state.error,
51
+ (data) => {
52
+ if (data) callback(data);
53
+ }
54
+ );
55
+ }, deps);
56
+ };
57
+
58
+ export const useHMSHLSPlayerPlaybackError = (
59
+ callback: (error: NonNullable<HMSHLSPlayerPlaybackError>) => void,
60
+ deps: DependencyList
61
+ ) => {
62
+ useEffect(() => {
63
+ return useHMSStore.subscribe(
64
+ (state) => state.error,
65
+ (data) => {
66
+ if (data) callback(data);
67
+ }
68
+ );
69
+ }, deps);
70
+ };
71
+
72
+ export const useHMSHLSPlayerCue = (
73
+ callback: (error: NonNullable<HMSHLSPlayerCue>) => void,
74
+ deps: DependencyList
75
+ ) => {
76
+ useEffect(() => {
77
+ return useHMSStore.subscribe(
78
+ (state) => state.cue,
79
+ (data) => {
80
+ if (data) callback(data);
81
+ }
82
+ );
83
+ }, deps);
84
+ };
85
+
86
+ // state setters
87
+
88
+ export const setHMSHLSPlayerPlaybackState =
89
+ useHMSStore.getState().setPlaybackState;
90
+
91
+ export const setHMSHLSPlayerCue = useHMSStore.getState().setCue;
92
+
93
+ export const setHMSHLSPlayerPlaybackError =
94
+ useHMSStore.getState().setPlaybackError;
95
+
96
+ export const setHMSHLSPlayerStats =
97
+ useHMSHLSPlayerStatsStore.getState().changeStats;
98
+
99
+ export const setHMSHLSPlayerStatsError =
100
+ useHMSHLSPlayerStatsStore.getState().setError;
@@ -0,0 +1,9 @@
1
+ export * from './HMSHLSPlayer';
2
+ export {
3
+ useHMSHLSPlayerPlaybackState,
4
+ useHMSHLSPlayerCue,
5
+ useHMSHLSPlayerPlaybackError,
6
+ useHMSHLSPlayerStats,
7
+ useHMSHLSPlayerStat,
8
+ useHMSHLSPlayerStatsError,
9
+ } from './hooks';
package/src/index.ts CHANGED
@@ -88,4 +88,12 @@ export type {
88
88
  export type { HmsViewComponent as HMSView } from './classes/HmsView';
89
89
 
90
90
  import { HMSSDK as HmsManager } from './classes/HMSSDK';
91
+
92
+ // 100ms Components
93
+ export * from './components/HMSHLSPlayer';
94
+
95
+ // 100ms types
96
+ export * from './types';
97
+ export * from './stores/types';
98
+
91
99
  export default HmsManager;
@@ -0,0 +1,25 @@
1
+ import type { StateCreator } from 'zustand';
2
+ import { HMSHLSPlayerPlaybackState } from '../types';
3
+ import type {
4
+ HMSHLSPlayerPlaybackCue,
5
+ HMSHLSPlayerPlaybackError,
6
+ HMSHLSPlayerPlaybackSlice,
7
+ HMSStore,
8
+ } from './types';
9
+
10
+ export const createHMSHLSPlayerPlaybackSlice: StateCreator<
11
+ HMSStore,
12
+ [],
13
+ [],
14
+ HMSHLSPlayerPlaybackSlice
15
+ > = (set) => ({
16
+ cue: undefined,
17
+ setCue: (cue: HMSHLSPlayerPlaybackCue) => set({ cue }),
18
+
19
+ playbackState: HMSHLSPlayerPlaybackState.UNKNOWN,
20
+ setPlaybackState: (playbackState: HMSHLSPlayerPlaybackState) =>
21
+ set({ playbackState }),
22
+
23
+ error: undefined,
24
+ setPlaybackError: (error: HMSHLSPlayerPlaybackError) => set({ error }),
25
+ });
@@ -0,0 +1,37 @@
1
+ import { create } from 'zustand';
2
+ import { subscribeWithSelector } from 'zustand/middleware';
3
+ import type {
4
+ HMSHLSPlayerStats,
5
+ HMSHLSPlayerStatsError,
6
+ HMSHLSPlayerStatsStore,
7
+ } from './types';
8
+
9
+ export const useHMSHLSPlayerStatsStore = create<HMSHLSPlayerStatsStore>()(
10
+ subscribeWithSelector((set) => ({
11
+ // Handle Stats
12
+ stats: {
13
+ // bandwidth
14
+ bandWidthEstimate: 0,
15
+ totalBytesLoaded: 0,
16
+
17
+ // bufferedDuration
18
+ bufferedDuration: 0,
19
+
20
+ // distanceFromLive
21
+ distanceFromLive: 0,
22
+
23
+ // frameInfo
24
+ droppedFrameCount: 0,
25
+
26
+ // videoInfo
27
+ averageBitrate: 0,
28
+ videoHeight: 0,
29
+ videoWidth: 0,
30
+ },
31
+ changeStats: (stats: HMSHLSPlayerStats) => set({ stats }),
32
+
33
+ // Handle Stats Error
34
+ error: undefined,
35
+ setError: (error: HMSHLSPlayerStatsError) => set({ error }),
36
+ }))
37
+ );
@@ -0,0 +1,11 @@
1
+ import { create } from 'zustand';
2
+ import { subscribeWithSelector } from 'zustand/middleware';
3
+
4
+ import { createHMSHLSPlayerPlaybackSlice } from './hls-player-playback-slice';
5
+ import type { HMSStore } from './types';
6
+
7
+ export const useHMSStore = create<HMSStore>()(
8
+ subscribeWithSelector((...a) => ({
9
+ ...createHMSHLSPlayerPlaybackSlice(...a),
10
+ }))
11
+ );
@@ -0,0 +1,49 @@
1
+ // Stores
2
+
3
+ import type {
4
+ HMSHLSPlayerPlaybackState,
5
+ HMSHLSPlayerPlaybackCueEventData,
6
+ HMSHLSPlayerPlaybackFailureEventData,
7
+ HMSHLSPlayerStatsErrorEventData,
8
+ HMSHLSPlayerStatsUpdateEventData,
9
+ } from '../types';
10
+
11
+ export type HMSStore = HMSHLSPlayerPlaybackSlice;
12
+ export type HMSHLSPlayerStatsStore = HMSHLSPlayerStatsSlice;
13
+
14
+ // HLS Player Playback Slice
15
+
16
+ export interface HMSHLSPlayerPlaybackCue
17
+ extends Omit<HMSHLSPlayerPlaybackCueEventData, 'endDate' | 'startDate'> {
18
+ endDate?: Date;
19
+ startDate: Date;
20
+ }
21
+
22
+ export type HMSHLSPlayerCue = HMSHLSPlayerPlaybackCue | undefined;
23
+
24
+ export type HMSHLSPlayerPlaybackError =
25
+ | HMSHLSPlayerPlaybackFailureEventData['error']
26
+ | undefined;
27
+
28
+ export interface HMSHLSPlayerPlaybackSlice {
29
+ cue: HMSHLSPlayerCue;
30
+ playbackState: HMSHLSPlayerPlaybackState;
31
+ error: HMSHLSPlayerPlaybackError;
32
+ setCue(cue: HMSHLSPlayerPlaybackCue): void;
33
+ setPlaybackState(playbackState: HMSHLSPlayerPlaybackState): void;
34
+ setPlaybackError(error: HMSHLSPlayerPlaybackError): void;
35
+ }
36
+
37
+ // HLS Player Stats Slice
38
+
39
+ export type HMSHLSPlayerStats = HMSHLSPlayerStatsUpdateEventData;
40
+ export type HMSHLSPlayerStatsError =
41
+ | HMSHLSPlayerStatsErrorEventData
42
+ | undefined;
43
+
44
+ export interface HMSHLSPlayerStatsSlice {
45
+ stats: HMSHLSPlayerStats;
46
+ error: HMSHLSPlayerStatsError | undefined;
47
+ changeStats(stats: HMSHLSPlayerStats): void;
48
+ setError(error: HMSHLSPlayerStatsError): void;
49
+ }