@100mslive/react-native-hms 1.12.2 → 2.0.0-alpha.1
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 +70 -12
- package/android/src/main/java/com/reactnativehmssdk/HMSAudioshareActivity.kt +8 -8
- package/android/src/main/java/com/reactnativehmssdk/HMSHLSPlayer.kt +38 -12
- package/android/src/main/java/com/reactnativehmssdk/HMSHLSPlayerManagerImpl.kt +185 -0
- package/android/src/main/java/com/reactnativehmssdk/HMSHelper.kt +20 -10
- package/android/src/main/java/com/reactnativehmssdk/{HMSManager.kt → HMSManagerImpl.kt} +28 -111
- package/android/src/main/java/com/reactnativehmssdk/HMSRNSDK.kt +3 -3
- package/android/src/main/java/com/reactnativehmssdk/HMSReactNativeEvent.kt +29 -0
- package/android/src/main/java/com/reactnativehmssdk/HMSSDKViewManagerImpl.kt +119 -0
- package/android/src/main/java/com/reactnativehmssdk/HMSView.kt +33 -5
- package/android/src/main/java/com/reactnativehmssdk/HmsScreenshareActivity.kt +9 -9
- package/android/src/main/java/com/reactnativehmssdk/HmssdkPackage.kt +42 -3
- package/android/src/newarch/java/com/reactnativehmssdk/HMSHLSPlayerManager.kt +128 -0
- package/android/src/newarch/java/com/reactnativehmssdk/HMSManager.kt +332 -0
- package/android/src/newarch/java/com/reactnativehmssdk/HMSSDKViewManager.kt +102 -0
- package/android/src/oldarch/java/com/reactnativehmssdk/HMSHLSPlayerManager.kt +61 -0
- package/android/src/oldarch/java/com/reactnativehmssdk/HMSManager.kt +351 -0
- package/android/src/oldarch/java/com/reactnativehmssdk/HMSSDKViewManager.kt +87 -0
- package/ios/HMSHLSPlayerComponentView.mm +325 -0
- package/ios/HMSHLSPlayerManager.m +10 -0
- package/ios/HMSHLSPlayerManager.swift +91 -79
- package/ios/HMSManager.m +13 -0
- package/ios/HMSManager.mm +365 -0
- package/ios/HMSManager.swift +109 -103
- package/ios/HMSView.m +9 -0
- package/ios/HMSView.swift +44 -14
- package/ios/HMSViewComponentView.mm +229 -0
- package/lib/commonjs/classes/HmsView.js +45 -48
- package/lib/commonjs/classes/HmsView.js.map +1 -1
- package/lib/commonjs/components/HMSHLSPlayer/HMSHLSPlayer.js +46 -26
- package/lib/commonjs/components/HMSHLSPlayer/HMSHLSPlayer.js.map +1 -1
- package/lib/commonjs/components/HMSHLSPlayer/RCTHMSHLSPlayer.js +5 -4
- package/lib/commonjs/components/HMSHLSPlayer/RCTHMSHLSPlayer.js.map +1 -1
- package/lib/commonjs/modules/HMSManagerModule.js +3 -10
- package/lib/commonjs/modules/HMSManagerModule.js.map +1 -1
- package/lib/commonjs/specs/HMSHLSPlayerNativeComponent.js +75 -0
- package/lib/commonjs/specs/HMSHLSPlayerNativeComponent.js.map +1 -0
- package/lib/commonjs/specs/HMSViewNativeComponent.js +55 -0
- package/lib/commonjs/specs/HMSViewNativeComponent.js.map +1 -0
- package/lib/commonjs/specs/NativeHMSManager.js +38 -0
- package/lib/commonjs/specs/NativeHMSManager.js.map +1 -0
- package/lib/module/classes/HmsView.js +46 -49
- package/lib/module/classes/HmsView.js.map +1 -1
- package/lib/module/components/HMSHLSPlayer/HMSHLSPlayer.js +48 -28
- package/lib/module/components/HMSHLSPlayer/HMSHLSPlayer.js.map +1 -1
- package/lib/module/components/HMSHLSPlayer/RCTHMSHLSPlayer.js +3 -3
- package/lib/module/components/HMSHLSPlayer/RCTHMSHLSPlayer.js.map +1 -1
- package/lib/module/modules/HMSManagerModule.js +1 -9
- package/lib/module/modules/HMSManagerModule.js.map +1 -1
- package/lib/module/specs/HMSHLSPlayerNativeComponent.js +69 -0
- package/lib/module/specs/HMSHLSPlayerNativeComponent.js.map +1 -0
- package/lib/module/specs/HMSViewNativeComponent.js +49 -0
- package/lib/module/specs/HMSViewNativeComponent.js.map +1 -0
- package/lib/module/specs/NativeHMSManager.js +33 -0
- package/lib/module/specs/NativeHMSManager.js.map +1 -0
- package/lib/typescript/components/HMSHLSPlayer/RCTHMSHLSPlayer.d.ts +6 -9
- package/lib/typescript/specs/HMSHLSPlayerNativeComponent.d.ts +115 -0
- package/lib/typescript/specs/HMSViewNativeComponent.d.ts +97 -0
- package/lib/typescript/specs/NativeHMSManager.d.ts +147 -0
- package/package.json +16 -1
- package/react-native-hms.podspec +43 -0
- package/src/classes/HmsView.tsx +60 -78
- package/src/components/HMSHLSPlayer/HMSHLSPlayer.tsx +62 -128
- package/src/components/HMSHLSPlayer/RCTHMSHLSPlayer.ts +8 -13
- package/src/modules/HMSManagerModule.ts +1 -14
- package/src/specs/HMSHLSPlayerNativeComponent.ts +203 -0
- package/src/specs/HMSViewNativeComponent.ts +119 -0
- package/src/specs/NativeHMSManager.ts +307 -0
- package/android/src/main/java/com/reactnativehmssdk/HMSHLSPlayerManager.kt +0 -144
- package/android/src/main/java/com/reactnativehmssdk/HMSSDKViewManager.kt +0 -111
|
@@ -1,37 +1,10 @@
|
|
|
1
|
-
import React, {
|
|
2
|
-
import {
|
|
1
|
+
import React, { useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react';
|
|
2
|
+
import { StyleSheet, Platform } from 'react-native';
|
|
3
|
+
import HmsView, { Commands } from '../specs/HMSViewNativeComponent';
|
|
3
4
|
import { HMSConstants } from './HMSConstants';
|
|
4
5
|
import { HMSVideoViewMode } from './HMSVideoViewMode';
|
|
5
6
|
import { setHmsViewsResolutionsState } from '../hooks/hmsviews';
|
|
6
7
|
|
|
7
|
-
/**
|
|
8
|
-
* Interface defining the properties for the `HmsView` component.
|
|
9
|
-
*
|
|
10
|
-
* This interface specifies the structure of the props that the `HmsView` component expects. It includes
|
|
11
|
-
* properties for configuring the video track display, such as the track ID, mirroring options,
|
|
12
|
-
* and scale type. It also includes properties for handling events and customizing the component's style.
|
|
13
|
-
*
|
|
14
|
-
* @interface HmsViewProps
|
|
15
|
-
* @property {Object} data - An object containing the track ID, instance ID, mirroring option, and scale type for the video or audio track.
|
|
16
|
-
* @property {string} data.trackId - The unique identifier for the track to be displayed.
|
|
17
|
-
* @property {string} data.id - The identifier for the `HmsViewComponent` instance.
|
|
18
|
-
* @property {boolean} data.mirror - Indicates whether the video should be mirrored. This is commonly used for local video tracks.
|
|
19
|
-
* @property {HMSVideoViewMode} data.scaleType - Determines how the video fits within the bounds of the view (e.g., aspect fill, aspect fit).
|
|
20
|
-
* @property {boolean} autoSimulcast - Enables automatic simulcast layer switching based on network conditions, if supported.
|
|
21
|
-
* @property {boolean} setZOrderMediaOverlay - When true, the video view will be rendered above the regular view hierarchy.
|
|
22
|
-
* @property {ViewStyle} style - Custom styles to apply to the view.
|
|
23
|
-
* @property {Function} onChange - A callback function that is invoked when the `HmsView` component emits a change event.
|
|
24
|
-
* @property {Function} onDataReturned - A callback function that is invoked when the `HmsView` component returns data in response to a capture frame event.
|
|
25
|
-
*
|
|
26
|
-
* @see {https://www.100ms.live/docs/react-native/v2/how-to-guides/set-up-video-conferencing/render-video/overview}
|
|
27
|
-
*/
|
|
28
|
-
|
|
29
|
-
// Imports the `HmsView` component from the native side using the `requireNativeComponent` function.
|
|
30
|
-
// This component is used to render video tracks in the application.
|
|
31
|
-
const HmsView = requireNativeComponent('HMSView');
|
|
32
|
-
let _nextRequestId = 1;
|
|
33
|
-
let _requestMap = new Map();
|
|
34
|
-
|
|
35
8
|
/**
|
|
36
9
|
* Defines the properties for the `HmsViewComponent`.
|
|
37
10
|
*
|
|
@@ -61,12 +34,24 @@ export const HmsViewComponent = /*#__PURE__*/React.forwardRef((props, ref) => {
|
|
|
61
34
|
} = props;
|
|
62
35
|
const hmsViewRef = useRef();
|
|
63
36
|
const [applyStyles_ANDROID, setApplyStyles_ANDROID] = useState(false);
|
|
64
|
-
|
|
37
|
+
// Memoized so the object reference is stable across renders unless one
|
|
38
|
+
// of the inputs actually changes. Fabric diffs view props by reference
|
|
39
|
+
// before doing a deep compare — a fresh `{...}` on every render would
|
|
40
|
+
// trigger redundant native prop updates.
|
|
41
|
+
const data = useMemo(() => ({
|
|
65
42
|
trackId,
|
|
66
43
|
id,
|
|
67
44
|
mirror,
|
|
68
45
|
scaleType
|
|
69
|
-
};
|
|
46
|
+
}), [trackId, id, mirror, scaleType]);
|
|
47
|
+
|
|
48
|
+
// Per-instance request/response state for the `capture` imperative.
|
|
49
|
+
// Each `<HmsView />` gets its own counter + pending-promise map so:
|
|
50
|
+
// - requestIds can't collide across multiple HmsView instances
|
|
51
|
+
// - pending promises are scoped to this view and cleaned up when
|
|
52
|
+
// it unmounts (see the useEffect below)
|
|
53
|
+
const nextRequestId = useRef(1);
|
|
54
|
+
const requestMap = useMemo(() => new Map(), []);
|
|
70
55
|
|
|
71
56
|
/**
|
|
72
57
|
* This method is passed to `onChange` prop of `HmsView` Native Component.
|
|
@@ -90,38 +75,35 @@ export const HmsViewComponent = /*#__PURE__*/React.forwardRef((props, ref) => {
|
|
|
90
75
|
* It is invoked when `HmsView` emits 'captureFrame' event.
|
|
91
76
|
*/
|
|
92
77
|
const _onDataReturned = event => {
|
|
93
|
-
|
|
94
|
-
let {
|
|
78
|
+
const {
|
|
95
79
|
requestId,
|
|
96
80
|
result,
|
|
97
81
|
error
|
|
98
82
|
} = event.nativeEvent;
|
|
99
|
-
|
|
100
|
-
|
|
83
|
+
const promise = requestMap.get(requestId);
|
|
84
|
+
if (!promise) {
|
|
85
|
+
// No pending request — typically a late event after unmount/cleanup
|
|
86
|
+
// rejected it, or a stale requestId from a previous mount.
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
101
89
|
if (result) {
|
|
102
|
-
// If it was successful, we resolve the promise.
|
|
103
90
|
promise.resolve(result);
|
|
104
91
|
} else {
|
|
105
|
-
// Otherwise, we reject it.
|
|
106
92
|
promise.reject(error);
|
|
107
93
|
}
|
|
108
|
-
|
|
109
|
-
_requestMap.delete(requestId);
|
|
94
|
+
requestMap.delete(requestId);
|
|
110
95
|
};
|
|
111
96
|
const capture = async () => {
|
|
112
|
-
const
|
|
113
|
-
|
|
114
|
-
let requestMap = _requestMap;
|
|
115
|
-
|
|
116
|
-
// We create a promise here that will be resolved once `_onRequestDone` is
|
|
117
|
-
// called.
|
|
118
|
-
let promise = new Promise(function (resolve, reject) {
|
|
97
|
+
const requestId = nextRequestId.current++;
|
|
98
|
+
const promise = new Promise((resolve, reject) => {
|
|
119
99
|
requestMap.set(requestId, {
|
|
120
100
|
resolve,
|
|
121
101
|
reject
|
|
122
102
|
});
|
|
123
103
|
});
|
|
124
|
-
|
|
104
|
+
if (hmsViewRef.current) {
|
|
105
|
+
Commands.capture(hmsViewRef.current, requestId);
|
|
106
|
+
}
|
|
125
107
|
return promise;
|
|
126
108
|
};
|
|
127
109
|
useImperativeHandle(ref, () => {
|
|
@@ -129,9 +111,24 @@ export const HmsViewComponent = /*#__PURE__*/React.forwardRef((props, ref) => {
|
|
|
129
111
|
capture
|
|
130
112
|
};
|
|
131
113
|
});
|
|
114
|
+
|
|
115
|
+
// Reject any in-flight capture promises on unmount. Under bridgeless
|
|
116
|
+
// mode the native side may not be able to deliver the captureFrame
|
|
117
|
+
// event back (event dispatcher returns null when the React tag is
|
|
118
|
+
// gone), which would leave promises hanging in the map forever.
|
|
119
|
+
useEffect(() => {
|
|
120
|
+
return () => {
|
|
121
|
+
requestMap.forEach(({
|
|
122
|
+
reject
|
|
123
|
+
}) => {
|
|
124
|
+
reject(new Error('HmsView unmounted before capture completed'));
|
|
125
|
+
});
|
|
126
|
+
requestMap.clear();
|
|
127
|
+
};
|
|
128
|
+
}, [requestMap]);
|
|
132
129
|
return /*#__PURE__*/React.createElement(HmsView, {
|
|
133
130
|
ref: hmsViewRef,
|
|
134
|
-
|
|
131
|
+
onResolutionChange: onChange,
|
|
135
132
|
data: data,
|
|
136
133
|
style: Platform.OS === 'android' ? applyStyles_ANDROID ? style : {} : style,
|
|
137
134
|
autoSimulcast: autoSimulcast,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","useState","useImperativeHandle","useRef","findNodeHandle","requireNativeComponent","StyleSheet","UIManager","Platform","HMSConstants","HMSVideoViewMode","setHmsViewsResolutionsState","HmsView","_nextRequestId","_requestMap","Map","HmsViewComponent","forwardRef","props","ref","trackId","style","styles","hmsView","id","DEFAULT_SDK_ID","mirror","setZOrderMediaOverlay","autoSimulcast","scaleType","ASPECT_FILL","hmsViewRef","applyStyles_ANDROID","setApplyStyles_ANDROID","data","onChange","nativeEvent","event","_onDataReturned","requestId","result","error","promise","get","resolve","reject","delete","capture","viewManagerConfig","getViewManagerConfig","requestMap","Promise","set","dispatchViewManagerCommand","current","Commands","createElement","OS","onDataReturned","create","flex"],"sources":["HmsView.tsx"],"sourcesContent":["import React, { useState, useImperativeHandle, useRef } from 'react';\nimport {\n findNodeHandle,\n requireNativeComponent,\n StyleSheet,\n UIManager,\n Platform,\n} from 'react-native';\nimport type { NativeSyntheticEvent, ViewStyle } from 'react-native';\nimport { HMSConstants } from './HMSConstants';\nimport { HMSVideoViewMode } from './HMSVideoViewMode';\nimport { setHmsViewsResolutionsState } from '../hooks/hmsviews';\n\n/**\n * Interface defining the properties for the `HmsView` component.\n *\n * This interface specifies the structure of the props that the `HmsView` component expects. It includes\n * properties for configuring the video track display, such as the track ID, mirroring options,\n * and scale type. It also includes properties for handling events and customizing the component's style.\n *\n * @interface HmsViewProps\n * @property {Object} data - An object containing the track ID, instance ID, mirroring option, and scale type for the video or audio track.\n * @property {string} data.trackId - The unique identifier for the track to be displayed.\n * @property {string} data.id - The identifier for the `HmsViewComponent` instance.\n * @property {boolean} data.mirror - Indicates whether the video should be mirrored. This is commonly used for local video tracks.\n * @property {HMSVideoViewMode} data.scaleType - Determines how the video fits within the bounds of the view (e.g., aspect fill, aspect fit).\n * @property {boolean} autoSimulcast - Enables automatic simulcast layer switching based on network conditions, if supported.\n * @property {boolean} setZOrderMediaOverlay - When true, the video view will be rendered above the regular view hierarchy.\n * @property {ViewStyle} style - Custom styles to apply to the view.\n * @property {Function} onChange - A callback function that is invoked when the `HmsView` component emits a change event.\n * @property {Function} onDataReturned - A callback function that is invoked when the `HmsView` component returns data in response to a capture frame event.\n *\n * @see {https://www.100ms.live/docs/react-native/v2/how-to-guides/set-up-video-conferencing/render-video/overview}\n */\ninterface HmsViewProps {\n data: {\n trackId: string;\n id: string;\n mirror: boolean;\n scaleType: HMSVideoViewMode;\n };\n autoSimulcast: boolean;\n setZOrderMediaOverlay: boolean;\n scaleType: HMSVideoViewMode;\n style: ViewStyle;\n onChange: Function;\n onDataReturned: Function;\n}\n\n// Imports the `HmsView` component from the native side using the `requireNativeComponent` function.\n// This component is used to render video tracks in the application.\nconst HmsView = requireNativeComponent<HmsViewProps>('HMSView');\nlet _nextRequestId = 1;\nlet _requestMap = new Map();\n\n/**\n * Defines the properties for the `HmsViewComponent`.\n *\n * This interface outlines the props that can be passed to the `HmsViewComponent` to configure its behavior and appearance.\n *\n * @interface HmsComponentProps\n * @property {string} trackId - The unique identifier for the track to be displayed.\n * @property {ViewStyle} [style] - Optional. Custom styles to apply to the view.\n * @property {boolean} [mirror] - Optional. If true, the video will be mirrored. This is commonly used for local video tracks.\n * @property {boolean} [autoSimulcast] - Optional. Enables automatic simulcast layer switching based on network conditions, if supported.\n * @property {HMSVideoViewMode} [scaleType] - Optional. Determines how the video fits within the bounds of the view (e.g., aspect fill, aspect fit).\n * @property {boolean} [setZOrderMediaOverlay] - Optional. When true, the video view will be rendered above the regular view hierarchy.\n * @property {string} id - The identifier for the `HmsViewComponent` instance.\n *\n * @see {https://www.100ms.live/docs/react-native/v2/how-to-guides/set-up-video-conferencing/render-video/overview}\n */\nexport interface HmsComponentProps {\n trackId: string;\n style?: ViewStyle;\n mirror?: boolean;\n autoSimulcast?: boolean;\n scaleType?: HMSVideoViewMode;\n setZOrderMediaOverlay?: boolean;\n id: string;\n}\n\nexport const HmsViewComponent = React.forwardRef<any, HmsComponentProps>(\n (props, ref) => {\n const {\n trackId,\n style = styles.hmsView,\n id = HMSConstants.DEFAULT_SDK_ID,\n mirror = false,\n setZOrderMediaOverlay = false,\n autoSimulcast = true,\n scaleType = HMSVideoViewMode.ASPECT_FILL,\n } = props;\n\n const hmsViewRef: any = useRef();\n const [applyStyles_ANDROID, setApplyStyles_ANDROID] = useState(false);\n const data = {\n trackId,\n id,\n mirror,\n scaleType,\n };\n\n /**\n * This method is passed to `onChange` prop of `HmsView` Native Component.\n * It is invoked when `HmsView` emits 'topChange' event.\n */\n const onChange = ({\n nativeEvent,\n }: NativeSyntheticEvent<{\n data: { height: number; width: number };\n event: 'ON_RESOLUTION_CHANGE_EVENT';\n }>) => {\n const { event, data } = nativeEvent;\n\n setApplyStyles_ANDROID(true);\n\n if (event === 'ON_RESOLUTION_CHANGE_EVENT') {\n setHmsViewsResolutionsState(trackId, data);\n }\n };\n\n /**\n * This method is passed to `onDataReturned` prop of `HmsView` Native Component.\n * It is invoked when `HmsView` emits 'captureFrame' event.\n */\n const _onDataReturned = (event: {\n nativeEvent: { requestId: any; result: any; error: any };\n }) => {\n // We grab the relevant data out of our event.\n let { requestId, result, error } = event.nativeEvent;\n // Then we get the promise we saved earlier for the given request ID.\n let promise = _requestMap.get(requestId);\n if (result) {\n // If it was successful, we resolve the promise.\n promise.resolve(result);\n } else {\n // Otherwise, we reject it.\n promise.reject(error);\n }\n // Finally, we clean up our request map.\n _requestMap.delete(requestId);\n };\n\n const capture = async () => {\n const viewManagerConfig = UIManager.getViewManagerConfig('HMSView');\n\n let requestId = _nextRequestId++;\n let requestMap = _requestMap;\n\n // We create a promise here that will be resolved once `_onRequestDone` is\n // called.\n let promise = new Promise(function (resolve, reject) {\n requestMap.set(requestId, { resolve, reject });\n });\n\n UIManager.dispatchViewManagerCommand(\n findNodeHandle(hmsViewRef.current),\n viewManagerConfig.Commands.capture,\n [requestId]\n );\n return promise;\n };\n\n useImperativeHandle(ref, () => {\n return {\n capture,\n };\n });\n\n return (\n <HmsView\n ref={hmsViewRef}\n onChange={onChange}\n data={data}\n style={\n Platform.OS === 'android' ? (applyStyles_ANDROID ? style : {}) : style\n }\n autoSimulcast={autoSimulcast}\n scaleType={scaleType}\n setZOrderMediaOverlay={setZOrderMediaOverlay}\n onDataReturned={_onDataReturned}\n />\n );\n }\n);\n\nconst styles = StyleSheet.create({\n hmsView: {\n flex: 1,\n },\n});\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["React","useEffect","useImperativeHandle","useMemo","useRef","useState","StyleSheet","Platform","HmsView","Commands","HMSConstants","HMSVideoViewMode","setHmsViewsResolutionsState","HmsViewComponent","forwardRef","props","ref","trackId","style","styles","hmsView","id","DEFAULT_SDK_ID","mirror","setZOrderMediaOverlay","autoSimulcast","scaleType","ASPECT_FILL","hmsViewRef","applyStyles_ANDROID","setApplyStyles_ANDROID","data","nextRequestId","requestMap","Map","onChange","nativeEvent","event","_onDataReturned","requestId","result","error","promise","get","resolve","reject","delete","capture","current","Promise","set","forEach","Error","clear","createElement","onResolutionChange","OS","onDataReturned","create","flex"],"sources":["HmsView.tsx"],"sourcesContent":["import React, {\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { StyleSheet, Platform } from 'react-native';\nimport type { NativeSyntheticEvent, ViewStyle } from 'react-native';\nimport HmsView, { Commands } from '../specs/HMSViewNativeComponent';\nimport { HMSConstants } from './HMSConstants';\nimport { HMSVideoViewMode } from './HMSVideoViewMode';\nimport { setHmsViewsResolutionsState } from '../hooks/hmsviews';\n\ntype CapturePromiseMethods = {\n resolve: (value: unknown) => void;\n reject: (reason?: unknown) => void;\n};\n\n/**\n * Defines the properties for the `HmsViewComponent`.\n *\n * This interface outlines the props that can be passed to the `HmsViewComponent` to configure its behavior and appearance.\n *\n * @interface HmsComponentProps\n * @property {string} trackId - The unique identifier for the track to be displayed.\n * @property {ViewStyle} [style] - Optional. Custom styles to apply to the view.\n * @property {boolean} [mirror] - Optional. If true, the video will be mirrored. This is commonly used for local video tracks.\n * @property {boolean} [autoSimulcast] - Optional. Enables automatic simulcast layer switching based on network conditions, if supported.\n * @property {HMSVideoViewMode} [scaleType] - Optional. Determines how the video fits within the bounds of the view (e.g., aspect fill, aspect fit).\n * @property {boolean} [setZOrderMediaOverlay] - Optional. When true, the video view will be rendered above the regular view hierarchy.\n * @property {string} id - The identifier for the `HmsViewComponent` instance.\n *\n * @see {https://www.100ms.live/docs/react-native/v2/how-to-guides/set-up-video-conferencing/render-video/overview}\n */\nexport interface HmsComponentProps {\n trackId: string;\n style?: ViewStyle;\n mirror?: boolean;\n autoSimulcast?: boolean;\n scaleType?: HMSVideoViewMode;\n setZOrderMediaOverlay?: boolean;\n id: string;\n}\n\nexport const HmsViewComponent = React.forwardRef<any, HmsComponentProps>(\n (props, ref) => {\n const {\n trackId,\n style = styles.hmsView,\n id = HMSConstants.DEFAULT_SDK_ID,\n mirror = false,\n setZOrderMediaOverlay = false,\n autoSimulcast = true,\n scaleType = HMSVideoViewMode.ASPECT_FILL,\n } = props;\n\n const hmsViewRef: any = useRef();\n const [applyStyles_ANDROID, setApplyStyles_ANDROID] = useState(false);\n // Memoized so the object reference is stable across renders unless one\n // of the inputs actually changes. Fabric diffs view props by reference\n // before doing a deep compare — a fresh `{...}` on every render would\n // trigger redundant native prop updates.\n const data = useMemo(\n () => ({ trackId, id, mirror, scaleType }),\n [trackId, id, mirror, scaleType]\n );\n\n // Per-instance request/response state for the `capture` imperative.\n // Each `<HmsView />` gets its own counter + pending-promise map so:\n // - requestIds can't collide across multiple HmsView instances\n // - pending promises are scoped to this view and cleaned up when\n // it unmounts (see the useEffect below)\n const nextRequestId = useRef(1);\n const requestMap = useMemo(\n () => new Map<number, CapturePromiseMethods>(),\n []\n );\n\n /**\n * This method is passed to `onChange` prop of `HmsView` Native Component.\n * It is invoked when `HmsView` emits 'topChange' event.\n */\n const onChange = ({\n nativeEvent,\n }: NativeSyntheticEvent<{\n data: { height: number; width: number };\n event: 'ON_RESOLUTION_CHANGE_EVENT';\n }>) => {\n const { event, data } = nativeEvent;\n\n setApplyStyles_ANDROID(true);\n\n if (event === 'ON_RESOLUTION_CHANGE_EVENT') {\n setHmsViewsResolutionsState(trackId, data);\n }\n };\n\n /**\n * This method is passed to `onDataReturned` prop of `HmsView` Native Component.\n * It is invoked when `HmsView` emits 'captureFrame' event.\n */\n const _onDataReturned = (event: {\n nativeEvent: { requestId: any; result: any; error: any };\n }) => {\n const { requestId, result, error } = event.nativeEvent;\n const promise = requestMap.get(requestId);\n if (!promise) {\n // No pending request — typically a late event after unmount/cleanup\n // rejected it, or a stale requestId from a previous mount.\n return;\n }\n if (result) {\n promise.resolve(result);\n } else {\n promise.reject(error);\n }\n requestMap.delete(requestId);\n };\n\n const capture = async () => {\n const requestId = nextRequestId.current++;\n const promise = new Promise((resolve, reject) => {\n requestMap.set(requestId, { resolve, reject });\n });\n\n if (hmsViewRef.current) {\n Commands.capture(hmsViewRef.current, requestId);\n }\n return promise;\n };\n\n useImperativeHandle(ref, () => {\n return {\n capture,\n };\n });\n\n // Reject any in-flight capture promises on unmount. Under bridgeless\n // mode the native side may not be able to deliver the captureFrame\n // event back (event dispatcher returns null when the React tag is\n // gone), which would leave promises hanging in the map forever.\n useEffect(() => {\n return () => {\n requestMap.forEach(({ reject }) => {\n reject(new Error('HmsView unmounted before capture completed'));\n });\n requestMap.clear();\n };\n }, [requestMap]);\n\n return (\n <HmsView\n ref={hmsViewRef}\n onResolutionChange={onChange as any}\n data={data}\n style={\n Platform.OS === 'android' ? (applyStyles_ANDROID ? style : {}) : style\n }\n autoSimulcast={autoSimulcast}\n scaleType={scaleType}\n setZOrderMediaOverlay={setZOrderMediaOverlay}\n onDataReturned={_onDataReturned as any}\n />\n );\n }\n);\n\nconst styles = StyleSheet.create({\n hmsView: {\n flex: 1,\n },\n});\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import React, { useEffect, useImperativeHandle, useMemo, useRef } from 'react';
|
|
2
|
-
import { View, StyleSheet,
|
|
2
|
+
import { View, StyleSheet, Platform } from 'react-native';
|
|
3
3
|
import { setHMSHLSPlayerCue, setHMSHLSPlayerPlaybackError, setHMSHLSPlayerPlaybackState, setHMSHLSPlayerResolution, setHMSHLSPlayerStats, setHMSHLSPlayerStatsError, setHMSHLSPlayerSubtitles } from './hooks';
|
|
4
|
-
import { RCTHMSHLSPlayer,
|
|
4
|
+
import { RCTHMSHLSPlayer, RCTHMSHLSPlayerCommands } from './RCTHMSHLSPlayer';
|
|
5
5
|
import { HMSHLSPlayerPlaybackEventTypes, HMSHLSPlayerStatsEventTypes } from '../../types';
|
|
6
6
|
import { HMSEncoder } from '../../classes/HMSEncoder';
|
|
7
7
|
import { useHMSStore } from '../../stores/hms-store';
|
|
@@ -17,57 +17,63 @@ const _HMSHLSPlayer = ({
|
|
|
17
17
|
const promiseAndIdsMap = useMemo(() => new Map(), []);
|
|
18
18
|
const currentRequestId = useRef(1);
|
|
19
19
|
useImperativeHandle(ref, () => ({
|
|
20
|
+
// `url` is optional at the JS API level: omit it (or pass undefined)
|
|
21
|
+
// to play the URL currently configured on the player; pass a string
|
|
22
|
+
// to switch to a new stream. The Codegen `play` command signature is
|
|
23
|
+
// `(viewRef, url: string)` (non-optional), so we pass `''` to mean
|
|
24
|
+
// "no override" — the native side treats empty-string as the
|
|
25
|
+
// "use existing url" sentinel.
|
|
20
26
|
play: url => {
|
|
21
|
-
if (hmsHlsPlayerRef.current
|
|
22
|
-
|
|
27
|
+
if (hmsHlsPlayerRef.current) {
|
|
28
|
+
RCTHMSHLSPlayerCommands.play(hmsHlsPlayerRef.current, url ?? '');
|
|
23
29
|
}
|
|
24
30
|
},
|
|
25
31
|
stop: () => {
|
|
26
|
-
if (hmsHlsPlayerRef.current
|
|
27
|
-
|
|
32
|
+
if (hmsHlsPlayerRef.current) {
|
|
33
|
+
RCTHMSHLSPlayerCommands.stop(hmsHlsPlayerRef.current);
|
|
28
34
|
}
|
|
29
35
|
},
|
|
30
36
|
pause: () => {
|
|
31
|
-
if (hmsHlsPlayerRef.current
|
|
32
|
-
|
|
37
|
+
if (hmsHlsPlayerRef.current) {
|
|
38
|
+
RCTHMSHLSPlayerCommands.pause(hmsHlsPlayerRef.current);
|
|
33
39
|
}
|
|
34
40
|
},
|
|
35
41
|
resume: () => {
|
|
36
|
-
if (hmsHlsPlayerRef.current
|
|
37
|
-
|
|
42
|
+
if (hmsHlsPlayerRef.current) {
|
|
43
|
+
RCTHMSHLSPlayerCommands.resume(hmsHlsPlayerRef.current);
|
|
38
44
|
}
|
|
39
45
|
},
|
|
40
46
|
seekForward: seconds => {
|
|
41
47
|
if (typeof seconds !== 'number') {
|
|
42
48
|
throw new Error(seconds ? 'seconds must be a `number` type' : 'seconds was not provided');
|
|
43
49
|
}
|
|
44
|
-
if (hmsHlsPlayerRef.current
|
|
45
|
-
|
|
50
|
+
if (hmsHlsPlayerRef.current) {
|
|
51
|
+
RCTHMSHLSPlayerCommands.seekForward(hmsHlsPlayerRef.current, seconds);
|
|
46
52
|
}
|
|
47
53
|
},
|
|
48
54
|
seekBackward: seconds => {
|
|
49
55
|
if (typeof seconds !== 'number') {
|
|
50
56
|
throw new Error(seconds ? 'seconds must be a `number` type' : 'seconds was not provided');
|
|
51
57
|
}
|
|
52
|
-
if (hmsHlsPlayerRef.current
|
|
53
|
-
|
|
58
|
+
if (hmsHlsPlayerRef.current) {
|
|
59
|
+
RCTHMSHLSPlayerCommands.seekBackward(hmsHlsPlayerRef.current, seconds);
|
|
54
60
|
}
|
|
55
61
|
},
|
|
56
62
|
seekToLivePosition: () => {
|
|
57
|
-
if (hmsHlsPlayerRef.current
|
|
58
|
-
|
|
63
|
+
if (hmsHlsPlayerRef.current) {
|
|
64
|
+
RCTHMSHLSPlayerCommands.seekToLivePosition(hmsHlsPlayerRef.current);
|
|
59
65
|
}
|
|
60
66
|
},
|
|
61
67
|
setVolume: level => {
|
|
62
68
|
if (typeof level !== 'number') {
|
|
63
69
|
throw new Error(level ? 'level must be a `number` type' : 'level was not provided');
|
|
64
70
|
}
|
|
65
|
-
if (hmsHlsPlayerRef.current
|
|
66
|
-
|
|
71
|
+
if (hmsHlsPlayerRef.current) {
|
|
72
|
+
RCTHMSHLSPlayerCommands.setVolume(hmsHlsPlayerRef.current, level);
|
|
67
73
|
}
|
|
68
74
|
},
|
|
69
75
|
isClosedCaptionSupported: () => {
|
|
70
|
-
if (hmsHlsPlayerRef.current
|
|
76
|
+
if (hmsHlsPlayerRef.current) {
|
|
71
77
|
const requestId = currentRequestId.current++;
|
|
72
78
|
const promise = new Promise((resolve, reject) => {
|
|
73
79
|
promiseAndIdsMap.set(requestId, {
|
|
@@ -75,13 +81,13 @@ const _HMSHLSPlayer = ({
|
|
|
75
81
|
reject
|
|
76
82
|
});
|
|
77
83
|
});
|
|
78
|
-
|
|
84
|
+
RCTHMSHLSPlayerCommands.areClosedCaptionSupported(hmsHlsPlayerRef.current, requestId);
|
|
79
85
|
return promise;
|
|
80
86
|
}
|
|
81
87
|
return Promise.resolve(false);
|
|
82
88
|
},
|
|
83
89
|
isClosedCaptionEnabled: () => {
|
|
84
|
-
if (hmsHlsPlayerRef.current
|
|
90
|
+
if (hmsHlsPlayerRef.current) {
|
|
85
91
|
const requestId = currentRequestId.current++;
|
|
86
92
|
const promise = new Promise((resolve, reject) => {
|
|
87
93
|
promiseAndIdsMap.set(requestId, {
|
|
@@ -89,23 +95,23 @@ const _HMSHLSPlayer = ({
|
|
|
89
95
|
reject
|
|
90
96
|
});
|
|
91
97
|
});
|
|
92
|
-
|
|
98
|
+
RCTHMSHLSPlayerCommands.isClosedCaptionEnabled(hmsHlsPlayerRef.current, requestId);
|
|
93
99
|
return promise;
|
|
94
100
|
}
|
|
95
101
|
return Promise.resolve(false);
|
|
96
102
|
},
|
|
97
103
|
enableClosedCaption: () => {
|
|
98
|
-
if (hmsHlsPlayerRef.current
|
|
99
|
-
|
|
104
|
+
if (hmsHlsPlayerRef.current) {
|
|
105
|
+
RCTHMSHLSPlayerCommands.enableClosedCaption(hmsHlsPlayerRef.current);
|
|
100
106
|
}
|
|
101
107
|
},
|
|
102
108
|
disableClosedCaption: () => {
|
|
103
|
-
if (hmsHlsPlayerRef.current
|
|
104
|
-
|
|
109
|
+
if (hmsHlsPlayerRef.current) {
|
|
110
|
+
RCTHMSHLSPlayerCommands.disableClosedCaption(hmsHlsPlayerRef.current);
|
|
105
111
|
}
|
|
106
112
|
},
|
|
107
113
|
getPlayerDurationDetails: () => {
|
|
108
|
-
if (hmsHlsPlayerRef.current
|
|
114
|
+
if (hmsHlsPlayerRef.current) {
|
|
109
115
|
const requestId = currentRequestId.current++;
|
|
110
116
|
const promise = new Promise((resolve, reject) => {
|
|
111
117
|
promiseAndIdsMap.set(requestId, {
|
|
@@ -113,7 +119,7 @@ const _HMSHLSPlayer = ({
|
|
|
113
119
|
reject
|
|
114
120
|
});
|
|
115
121
|
});
|
|
116
|
-
|
|
122
|
+
RCTHMSHLSPlayerCommands.getPlayerDurationDetails(hmsHlsPlayerRef.current, requestId);
|
|
117
123
|
return promise;
|
|
118
124
|
}
|
|
119
125
|
return Promise.resolve({
|
|
@@ -187,12 +193,26 @@ const _HMSHLSPlayer = ({
|
|
|
187
193
|
return;
|
|
188
194
|
}
|
|
189
195
|
promiseMethods.resolve(data);
|
|
196
|
+
// Remove the entry so the map doesn't grow unboundedly across the
|
|
197
|
+
// lifetime of the player view.
|
|
198
|
+
promiseAndIdsMap.delete(requestId);
|
|
190
199
|
};
|
|
191
200
|
useEffect(() => {
|
|
192
201
|
return () => {
|
|
193
202
|
useHMSStore.getState().resetPlaybackSlice();
|
|
194
203
|
useHMSHLSPlayerStatsStore.getState().reset();
|
|
204
|
+
// Reject any in-flight command promises that didn't get a response
|
|
205
|
+
// before unmount. Under bridgeless mode the native side may not be
|
|
206
|
+
// able to deliver `onDataReturned` events back if the React tag is
|
|
207
|
+
// gone — left unrejected, those promises would hang forever.
|
|
208
|
+
promiseAndIdsMap.forEach(({
|
|
209
|
+
reject
|
|
210
|
+
}) => {
|
|
211
|
+
reject(new Error('HMSHLSPlayer unmounted before command response arrived'));
|
|
212
|
+
});
|
|
213
|
+
promiseAndIdsMap.clear();
|
|
195
214
|
};
|
|
215
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
196
216
|
}, []);
|
|
197
217
|
return /*#__PURE__*/React.createElement(View, {
|
|
198
218
|
style: [styles.container, containerStyle]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","useEffect","useImperativeHandle","useMemo","useRef","View","StyleSheet","UIManager","findNodeHandle","Platform","setHMSHLSPlayerCue","setHMSHLSPlayerPlaybackError","setHMSHLSPlayerPlaybackState","setHMSHLSPlayerResolution","setHMSHLSPlayerStats","setHMSHLSPlayerStatsError","setHMSHLSPlayerSubtitles","RCTHMSHLSPlayer","RCTHMSHLSPlayerViewManagerConfig","HMSHLSPlayerPlaybackEventTypes","HMSHLSPlayerStatsEventTypes","HMSEncoder","useHMSStore","useHMSHLSPlayerStatsStore","_HMSHLSPlayer","url","style","containerStyle","enableStats","enableControls","ref","hmsHlsPlayerRef","promiseAndIdsMap","Map","currentRequestId","play","current","Commands","dispatchViewManagerCommand","stop","undefined","pause","resume","seekForward","seconds","Error","seekBackward","seekToLivePosition","setVolume","level","isClosedCaptionSupported","areClosedCaptionSupported","requestId","promise","Promise","resolve","reject","set","isClosedCaptionEnabled","enableClosedCaption","disableClosedCaption","getPlayerDurationDetails","streamDuration","rollingWindowTime","handleHLSPlaybackEvent","nativeEvent","event","data","ON_PLAYBACK_CUE_EVENT","transformedData","transformHMSHLSCueEventData","ON_PLAYBACK_FAILURE_EVENT","error","ON_PLAYBACK_RESOLUTION_CHANGE_EVENT","state","handleHLSStatsEvent","ON_STATS_EVENT_ERROR","handleHLSPlayerCuesEvent","handleRequestedDataReturned","promiseMethods","get","console","warn","getState","resetPlaybackSlice","reset","createElement","styles","container","playerWrapper","player","onHmsHlsPlaybackEvent","onHmsHlsStatsEvent","onHlsPlayerCuesEvent","OS","onDataReturned","HMSHLSPlayer","forwardRef","create","flex","alignItems","justifyContent","backgroundColor","width","height"],"sources":["HMSHLSPlayer.tsx"],"sourcesContent":["import React, { useEffect, useImperativeHandle, useMemo, useRef } from 'react';\nimport {\n View,\n StyleSheet,\n UIManager,\n findNodeHandle,\n Platform,\n} from 'react-native';\nimport type { StyleProp, ViewStyle } from 'react-native';\n\nimport {\n setHMSHLSPlayerCue,\n setHMSHLSPlayerPlaybackError,\n setHMSHLSPlayerPlaybackState,\n setHMSHLSPlayerResolution,\n setHMSHLSPlayerStats,\n setHMSHLSPlayerStatsError,\n setHMSHLSPlayerSubtitles,\n} from './hooks';\nimport {\n RCTHMSHLSPlayer,\n RCTHMSHLSPlayerViewManagerConfig,\n} from './RCTHMSHLSPlayer';\nimport type {\n HlsSPlayerCuesEventHandler,\n HmsHlsPlaybackEventHandler,\n HmsHlsStatsEventHandler,\n RCTHMSHLSPlayerRef,\n RequestedDataEventHandler,\n} from './RCTHMSHLSPlayer';\nimport {\n HMSHLSPlayerPlaybackEventTypes,\n HMSHLSPlayerStatsEventTypes,\n} from '../../types';\nimport type {\n HLSPlayerDurationDetails,\n HMSHLSPlayerPlaybackCueEventData,\n} from '../../types';\nimport { HMSEncoder } from '../../classes/HMSEncoder';\nimport type { HMSHLSPlayerPlaybackCue } from '../../stores/types';\nimport { useHMSStore } from '../../stores/hms-store';\nimport { useHMSHLSPlayerStatsStore } from '../../stores/hls-player-stats-store';\n\nexport interface HMSHLSPlayerProps {\n url?: string;\n style?: StyleProp<ViewStyle>;\n containerStyle?: StyleProp<ViewStyle>;\n aspectRatio?: number;\n enableStats?: boolean;\n enableControls?: boolean;\n}\n\nexport interface HMSHLSPlayerRefProperties {\n play: (url?: string) => void;\n stop: () => void;\n pause: () => void;\n resume: () => void;\n seekForward: (seconds: number) => void;\n seekBackward: (seconds: number) => void;\n seekToLivePosition: () => void;\n setVolume: (level: number) => void;\n isClosedCaptionSupported: () => Promise<boolean>;\n isClosedCaptionEnabled: () => Promise<boolean>;\n enableClosedCaption: () => void;\n disableClosedCaption: () => void;\n getPlayerDurationDetails: () => Promise<HLSPlayerDurationDetails>;\n}\n\nconst _HMSHLSPlayer: React.ForwardRefRenderFunction<\n HMSHLSPlayerRefProperties,\n HMSHLSPlayerProps\n> = (\n { url = '', style, containerStyle, enableStats, enableControls = false },\n ref\n) => {\n const hmsHlsPlayerRef = useRef<RCTHMSHLSPlayerRef | null>(null);\n const promiseAndIdsMap = useMemo(\n () =>\n new Map<\n number,\n { resolve(value: unknown): void; reject(reason?: any): void }\n >(),\n []\n );\n const currentRequestId = useRef(1);\n\n useImperativeHandle(\n ref,\n () => ({\n play: (url?: string) => {\n if (\n hmsHlsPlayerRef.current &&\n RCTHMSHLSPlayerViewManagerConfig.Commands.play\n ) {\n UIManager.dispatchViewManagerCommand(\n findNodeHandle(hmsHlsPlayerRef.current),\n RCTHMSHLSPlayerViewManagerConfig.Commands.play,\n url ? [url] : ['']\n );\n }\n },\n stop: () => {\n if (\n hmsHlsPlayerRef.current &&\n RCTHMSHLSPlayerViewManagerConfig.Commands.stop\n ) {\n UIManager.dispatchViewManagerCommand(\n findNodeHandle(hmsHlsPlayerRef.current),\n RCTHMSHLSPlayerViewManagerConfig.Commands.stop,\n undefined\n );\n }\n },\n pause: () => {\n if (\n hmsHlsPlayerRef.current &&\n RCTHMSHLSPlayerViewManagerConfig.Commands.pause\n ) {\n UIManager.dispatchViewManagerCommand(\n findNodeHandle(hmsHlsPlayerRef.current),\n RCTHMSHLSPlayerViewManagerConfig.Commands.pause,\n undefined\n );\n }\n },\n resume: () => {\n if (\n hmsHlsPlayerRef.current &&\n RCTHMSHLSPlayerViewManagerConfig.Commands.resume\n ) {\n UIManager.dispatchViewManagerCommand(\n findNodeHandle(hmsHlsPlayerRef.current),\n RCTHMSHLSPlayerViewManagerConfig.Commands.resume,\n undefined\n );\n }\n },\n seekForward: (seconds: number) => {\n if (typeof seconds !== 'number') {\n throw new Error(\n seconds\n ? 'seconds must be a `number` type'\n : 'seconds was not provided'\n );\n }\n\n if (\n hmsHlsPlayerRef.current &&\n RCTHMSHLSPlayerViewManagerConfig.Commands.seekForward\n ) {\n UIManager.dispatchViewManagerCommand(\n findNodeHandle(hmsHlsPlayerRef.current),\n RCTHMSHLSPlayerViewManagerConfig.Commands.seekForward,\n [seconds]\n );\n }\n },\n seekBackward: (seconds: number) => {\n if (typeof seconds !== 'number') {\n throw new Error(\n seconds\n ? 'seconds must be a `number` type'\n : 'seconds was not provided'\n );\n }\n\n if (\n hmsHlsPlayerRef.current &&\n RCTHMSHLSPlayerViewManagerConfig.Commands.seekBackward\n ) {\n UIManager.dispatchViewManagerCommand(\n findNodeHandle(hmsHlsPlayerRef.current),\n RCTHMSHLSPlayerViewManagerConfig.Commands.seekBackward,\n [seconds]\n );\n }\n },\n seekToLivePosition: () => {\n if (\n hmsHlsPlayerRef.current &&\n RCTHMSHLSPlayerViewManagerConfig.Commands.seekToLivePosition\n ) {\n UIManager.dispatchViewManagerCommand(\n findNodeHandle(hmsHlsPlayerRef.current),\n RCTHMSHLSPlayerViewManagerConfig.Commands.seekToLivePosition,\n undefined\n );\n }\n },\n setVolume: (level: number) => {\n if (typeof level !== 'number') {\n throw new Error(\n level ? 'level must be a `number` type' : 'level was not provided'\n );\n }\n\n if (\n hmsHlsPlayerRef.current &&\n RCTHMSHLSPlayerViewManagerConfig.Commands.setVolume\n ) {\n UIManager.dispatchViewManagerCommand(\n findNodeHandle(hmsHlsPlayerRef.current),\n RCTHMSHLSPlayerViewManagerConfig.Commands.setVolume,\n [level]\n );\n }\n },\n isClosedCaptionSupported: () => {\n if (\n hmsHlsPlayerRef.current &&\n RCTHMSHLSPlayerViewManagerConfig.Commands.areClosedCaptionSupported\n ) {\n const requestId = currentRequestId.current++;\n const promise = new Promise<boolean>((resolve, reject) => {\n promiseAndIdsMap.set(requestId, { resolve, reject });\n });\n\n UIManager.dispatchViewManagerCommand(\n findNodeHandle(hmsHlsPlayerRef.current),\n RCTHMSHLSPlayerViewManagerConfig.Commands.areClosedCaptionSupported,\n [requestId]\n );\n return promise;\n }\n return Promise.resolve(false);\n },\n isClosedCaptionEnabled: () => {\n if (\n hmsHlsPlayerRef.current &&\n RCTHMSHLSPlayerViewManagerConfig.Commands.isClosedCaptionEnabled\n ) {\n const requestId = currentRequestId.current++;\n const promise = new Promise<boolean>((resolve, reject) => {\n promiseAndIdsMap.set(requestId, { resolve, reject });\n });\n\n UIManager.dispatchViewManagerCommand(\n findNodeHandle(hmsHlsPlayerRef.current),\n RCTHMSHLSPlayerViewManagerConfig.Commands.isClosedCaptionEnabled,\n [requestId]\n );\n return promise;\n }\n return Promise.resolve(false);\n },\n enableClosedCaption: () => {\n if (\n hmsHlsPlayerRef.current &&\n RCTHMSHLSPlayerViewManagerConfig.Commands.enableClosedCaption\n ) {\n UIManager.dispatchViewManagerCommand(\n findNodeHandle(hmsHlsPlayerRef.current),\n RCTHMSHLSPlayerViewManagerConfig.Commands.enableClosedCaption,\n undefined\n );\n }\n },\n disableClosedCaption: () => {\n if (\n hmsHlsPlayerRef.current &&\n RCTHMSHLSPlayerViewManagerConfig.Commands.disableClosedCaption\n ) {\n UIManager.dispatchViewManagerCommand(\n findNodeHandle(hmsHlsPlayerRef.current),\n RCTHMSHLSPlayerViewManagerConfig.Commands.disableClosedCaption,\n undefined\n );\n }\n },\n getPlayerDurationDetails: () => {\n if (\n hmsHlsPlayerRef.current &&\n RCTHMSHLSPlayerViewManagerConfig.Commands.getPlayerDurationDetails\n ) {\n const requestId = currentRequestId.current++;\n const promise = new Promise<HLSPlayerDurationDetails>(\n (resolve, reject) => {\n promiseAndIdsMap.set(requestId, { resolve, reject });\n }\n );\n\n UIManager.dispatchViewManagerCommand(\n findNodeHandle(hmsHlsPlayerRef.current),\n RCTHMSHLSPlayerViewManagerConfig.Commands.getPlayerDurationDetails,\n [requestId]\n );\n return promise;\n }\n return Promise.resolve({\n streamDuration: undefined,\n rollingWindowTime: undefined,\n });\n },\n }),\n [currentRequestId, promiseAndIdsMap]\n );\n\n // Handle HLS Playback events\n const handleHLSPlaybackEvent: HmsHlsPlaybackEventHandler = ({\n nativeEvent,\n }) => {\n const { event, data } = nativeEvent;\n\n if (event === HMSHLSPlayerPlaybackEventTypes.ON_PLAYBACK_CUE_EVENT) {\n const transformedData = HMSEncoder.transformHMSHLSCueEventData<\n HMSHLSPlayerPlaybackCueEventData,\n HMSHLSPlayerPlaybackCue\n >(data);\n setHMSHLSPlayerCue(transformedData);\n } else if (\n event === HMSHLSPlayerPlaybackEventTypes.ON_PLAYBACK_FAILURE_EVENT\n ) {\n setHMSHLSPlayerPlaybackError(data.error);\n } else if (\n event ===\n HMSHLSPlayerPlaybackEventTypes.ON_PLAYBACK_RESOLUTION_CHANGE_EVENT\n ) {\n setHMSHLSPlayerResolution({ ...data });\n } else {\n setHMSHLSPlayerPlaybackState(data.state);\n }\n };\n\n // Handle HLS Stats events\n const handleHLSStatsEvent: HmsHlsStatsEventHandler = ({ nativeEvent }) => {\n const { event, data } = nativeEvent;\n\n if (event === HMSHLSPlayerStatsEventTypes.ON_STATS_EVENT_ERROR) {\n setHMSHLSPlayerStatsError(data);\n } else {\n setHMSHLSPlayerStats(data);\n }\n };\n\n // Handle HLS Player Cues events (e.g. usage - Closed Captions)\n const handleHLSPlayerCuesEvent: HlsSPlayerCuesEventHandler = ({\n nativeEvent,\n }) => {\n const { event, data } = nativeEvent;\n\n if (event === 'ON_CLOSED_CAPTION_UPDATE') {\n setHMSHLSPlayerSubtitles(data);\n }\n };\n\n // Handle Requested data\n const handleRequestedDataReturned: RequestedDataEventHandler = ({\n nativeEvent,\n }) => {\n const { requestId, data } = nativeEvent;\n const promiseMethods = promiseAndIdsMap.get(requestId);\n\n if (!promiseMethods) {\n console.warn(\n '#function handleRequestedDataReturned',\n \"Didn't found promise methods by requestId: \",\n requestId\n );\n return;\n }\n promiseMethods.resolve(data);\n };\n\n useEffect(() => {\n return () => {\n useHMSStore.getState().resetPlaybackSlice();\n useHMSHLSPlayerStatsStore.getState().reset();\n };\n }, []);\n\n return (\n <View style={[styles.container, containerStyle]}>\n <View style={[styles.playerWrapper, style]}>\n <RCTHMSHLSPlayer\n ref={hmsHlsPlayerRef}\n url={url}\n style={styles.player}\n enableStats={enableStats}\n enableControls={enableControls}\n onHmsHlsPlaybackEvent={handleHLSPlaybackEvent}\n onHmsHlsStatsEvent={handleHLSStatsEvent}\n onHlsPlayerCuesEvent={\n Platform.OS === 'android' ? handleHLSPlayerCuesEvent : undefined\n }\n onDataReturned={handleRequestedDataReturned}\n />\n </View>\n </View>\n );\n};\n\nexport const HMSHLSPlayer = React.forwardRef<\n HMSHLSPlayerRefProperties,\n HMSHLSPlayerProps\n>(_HMSHLSPlayer);\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n alignItems: 'center',\n justifyContent: 'center',\n },\n playerWrapper: {\n backgroundColor: '#000000',\n alignItems: 'center',\n justifyContent: 'center',\n },\n player: {\n width: '100%',\n height: '100%',\n flex: 1,\n },\n});\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["React","useEffect","useImperativeHandle","useMemo","useRef","View","StyleSheet","Platform","setHMSHLSPlayerCue","setHMSHLSPlayerPlaybackError","setHMSHLSPlayerPlaybackState","setHMSHLSPlayerResolution","setHMSHLSPlayerStats","setHMSHLSPlayerStatsError","setHMSHLSPlayerSubtitles","RCTHMSHLSPlayer","RCTHMSHLSPlayerCommands","HMSHLSPlayerPlaybackEventTypes","HMSHLSPlayerStatsEventTypes","HMSEncoder","useHMSStore","useHMSHLSPlayerStatsStore","_HMSHLSPlayer","url","style","containerStyle","enableStats","enableControls","ref","hmsHlsPlayerRef","promiseAndIdsMap","Map","currentRequestId","play","current","stop","pause","resume","seekForward","seconds","Error","seekBackward","seekToLivePosition","setVolume","level","isClosedCaptionSupported","requestId","promise","Promise","resolve","reject","set","areClosedCaptionSupported","isClosedCaptionEnabled","enableClosedCaption","disableClosedCaption","getPlayerDurationDetails","streamDuration","undefined","rollingWindowTime","handleHLSPlaybackEvent","nativeEvent","event","data","ON_PLAYBACK_CUE_EVENT","transformedData","transformHMSHLSCueEventData","ON_PLAYBACK_FAILURE_EVENT","error","ON_PLAYBACK_RESOLUTION_CHANGE_EVENT","state","handleHLSStatsEvent","ON_STATS_EVENT_ERROR","handleHLSPlayerCuesEvent","handleRequestedDataReturned","promiseMethods","get","console","warn","delete","getState","resetPlaybackSlice","reset","forEach","clear","createElement","styles","container","playerWrapper","player","onHmsHlsPlaybackEvent","onHmsHlsStatsEvent","onHlsPlayerCuesEvent","OS","onDataReturned","HMSHLSPlayer","forwardRef","create","flex","alignItems","justifyContent","backgroundColor","width","height"],"sources":["HMSHLSPlayer.tsx"],"sourcesContent":["import React, { useEffect, useImperativeHandle, useMemo, useRef } from 'react';\nimport { View, StyleSheet, Platform } from 'react-native';\nimport type { StyleProp, ViewStyle } from 'react-native';\n\nimport {\n setHMSHLSPlayerCue,\n setHMSHLSPlayerPlaybackError,\n setHMSHLSPlayerPlaybackState,\n setHMSHLSPlayerResolution,\n setHMSHLSPlayerStats,\n setHMSHLSPlayerStatsError,\n setHMSHLSPlayerSubtitles,\n} from './hooks';\nimport { RCTHMSHLSPlayer, RCTHMSHLSPlayerCommands } from './RCTHMSHLSPlayer';\nimport type {\n HlsSPlayerCuesEventHandler,\n HmsHlsPlaybackEventHandler,\n HmsHlsStatsEventHandler,\n RCTHMSHLSPlayerRef,\n RequestedDataEventHandler,\n} from './RCTHMSHLSPlayer';\nimport {\n HMSHLSPlayerPlaybackEventTypes,\n HMSHLSPlayerStatsEventTypes,\n} from '../../types';\nimport type {\n HLSPlayerDurationDetails,\n HMSHLSPlayerPlaybackCueEventData,\n} from '../../types';\nimport { HMSEncoder } from '../../classes/HMSEncoder';\nimport type { HMSHLSPlayerPlaybackCue } from '../../stores/types';\nimport { useHMSStore } from '../../stores/hms-store';\nimport { useHMSHLSPlayerStatsStore } from '../../stores/hls-player-stats-store';\n\nexport interface HMSHLSPlayerProps {\n url?: string;\n style?: StyleProp<ViewStyle>;\n containerStyle?: StyleProp<ViewStyle>;\n aspectRatio?: number;\n enableStats?: boolean;\n enableControls?: boolean;\n}\n\nexport interface HMSHLSPlayerRefProperties {\n play: (url?: string) => void;\n stop: () => void;\n pause: () => void;\n resume: () => void;\n seekForward: (seconds: number) => void;\n seekBackward: (seconds: number) => void;\n seekToLivePosition: () => void;\n setVolume: (level: number) => void;\n isClosedCaptionSupported: () => Promise<boolean>;\n isClosedCaptionEnabled: () => Promise<boolean>;\n enableClosedCaption: () => void;\n disableClosedCaption: () => void;\n getPlayerDurationDetails: () => Promise<HLSPlayerDurationDetails>;\n}\n\nconst _HMSHLSPlayer: React.ForwardRefRenderFunction<\n HMSHLSPlayerRefProperties,\n HMSHLSPlayerProps\n> = (\n { url = '', style, containerStyle, enableStats, enableControls = false },\n ref\n) => {\n const hmsHlsPlayerRef = useRef<RCTHMSHLSPlayerRef | null>(null);\n const promiseAndIdsMap = useMemo(\n () =>\n new Map<\n number,\n { resolve(value: unknown): void; reject(reason?: any): void }\n >(),\n []\n );\n const currentRequestId = useRef(1);\n\n useImperativeHandle(\n ref,\n () => ({\n // `url` is optional at the JS API level: omit it (or pass undefined)\n // to play the URL currently configured on the player; pass a string\n // to switch to a new stream. The Codegen `play` command signature is\n // `(viewRef, url: string)` (non-optional), so we pass `''` to mean\n // \"no override\" — the native side treats empty-string as the\n // \"use existing url\" sentinel.\n play: (url?: string) => {\n if (hmsHlsPlayerRef.current) {\n RCTHMSHLSPlayerCommands.play(hmsHlsPlayerRef.current, url ?? '');\n }\n },\n stop: () => {\n if (hmsHlsPlayerRef.current) {\n RCTHMSHLSPlayerCommands.stop(hmsHlsPlayerRef.current);\n }\n },\n pause: () => {\n if (hmsHlsPlayerRef.current) {\n RCTHMSHLSPlayerCommands.pause(hmsHlsPlayerRef.current);\n }\n },\n resume: () => {\n if (hmsHlsPlayerRef.current) {\n RCTHMSHLSPlayerCommands.resume(hmsHlsPlayerRef.current);\n }\n },\n seekForward: (seconds: number) => {\n if (typeof seconds !== 'number') {\n throw new Error(\n seconds\n ? 'seconds must be a `number` type'\n : 'seconds was not provided'\n );\n }\n\n if (hmsHlsPlayerRef.current) {\n RCTHMSHLSPlayerCommands.seekForward(hmsHlsPlayerRef.current, seconds);\n }\n },\n seekBackward: (seconds: number) => {\n if (typeof seconds !== 'number') {\n throw new Error(\n seconds\n ? 'seconds must be a `number` type'\n : 'seconds was not provided'\n );\n }\n\n if (hmsHlsPlayerRef.current) {\n RCTHMSHLSPlayerCommands.seekBackward(\n hmsHlsPlayerRef.current,\n seconds\n );\n }\n },\n seekToLivePosition: () => {\n if (hmsHlsPlayerRef.current) {\n RCTHMSHLSPlayerCommands.seekToLivePosition(hmsHlsPlayerRef.current);\n }\n },\n setVolume: (level: number) => {\n if (typeof level !== 'number') {\n throw new Error(\n level ? 'level must be a `number` type' : 'level was not provided'\n );\n }\n\n if (hmsHlsPlayerRef.current) {\n RCTHMSHLSPlayerCommands.setVolume(hmsHlsPlayerRef.current, level);\n }\n },\n isClosedCaptionSupported: () => {\n if (hmsHlsPlayerRef.current) {\n const requestId = currentRequestId.current++;\n const promise = new Promise<boolean>((resolve, reject) => {\n promiseAndIdsMap.set(requestId, { resolve, reject });\n });\n\n RCTHMSHLSPlayerCommands.areClosedCaptionSupported(\n hmsHlsPlayerRef.current,\n requestId\n );\n return promise;\n }\n return Promise.resolve(false);\n },\n isClosedCaptionEnabled: () => {\n if (hmsHlsPlayerRef.current) {\n const requestId = currentRequestId.current++;\n const promise = new Promise<boolean>((resolve, reject) => {\n promiseAndIdsMap.set(requestId, { resolve, reject });\n });\n\n RCTHMSHLSPlayerCommands.isClosedCaptionEnabled(\n hmsHlsPlayerRef.current,\n requestId\n );\n return promise;\n }\n return Promise.resolve(false);\n },\n enableClosedCaption: () => {\n if (hmsHlsPlayerRef.current) {\n RCTHMSHLSPlayerCommands.enableClosedCaption(hmsHlsPlayerRef.current);\n }\n },\n disableClosedCaption: () => {\n if (hmsHlsPlayerRef.current) {\n RCTHMSHLSPlayerCommands.disableClosedCaption(hmsHlsPlayerRef.current);\n }\n },\n getPlayerDurationDetails: () => {\n if (hmsHlsPlayerRef.current) {\n const requestId = currentRequestId.current++;\n const promise = new Promise<HLSPlayerDurationDetails>(\n (resolve, reject) => {\n promiseAndIdsMap.set(requestId, { resolve, reject });\n }\n );\n\n RCTHMSHLSPlayerCommands.getPlayerDurationDetails(\n hmsHlsPlayerRef.current,\n requestId\n );\n return promise;\n }\n return Promise.resolve({\n streamDuration: undefined,\n rollingWindowTime: undefined,\n });\n },\n }),\n [currentRequestId, promiseAndIdsMap]\n );\n\n // Handle HLS Playback events\n const handleHLSPlaybackEvent: HmsHlsPlaybackEventHandler = ({\n nativeEvent,\n }) => {\n const { event, data } = nativeEvent;\n\n if (event === HMSHLSPlayerPlaybackEventTypes.ON_PLAYBACK_CUE_EVENT) {\n const transformedData = HMSEncoder.transformHMSHLSCueEventData<\n HMSHLSPlayerPlaybackCueEventData,\n HMSHLSPlayerPlaybackCue\n >(data);\n setHMSHLSPlayerCue(transformedData);\n } else if (\n event === HMSHLSPlayerPlaybackEventTypes.ON_PLAYBACK_FAILURE_EVENT\n ) {\n setHMSHLSPlayerPlaybackError(data.error);\n } else if (\n event ===\n HMSHLSPlayerPlaybackEventTypes.ON_PLAYBACK_RESOLUTION_CHANGE_EVENT\n ) {\n setHMSHLSPlayerResolution({ ...data });\n } else {\n setHMSHLSPlayerPlaybackState(data.state);\n }\n };\n\n // Handle HLS Stats events\n const handleHLSStatsEvent: HmsHlsStatsEventHandler = ({ nativeEvent }) => {\n const { event, data } = nativeEvent;\n\n if (event === HMSHLSPlayerStatsEventTypes.ON_STATS_EVENT_ERROR) {\n setHMSHLSPlayerStatsError(data);\n } else {\n setHMSHLSPlayerStats(data);\n }\n };\n\n // Handle HLS Player Cues events (e.g. usage - Closed Captions)\n const handleHLSPlayerCuesEvent: HlsSPlayerCuesEventHandler = ({\n nativeEvent,\n }) => {\n const { event, data } = nativeEvent;\n\n if (event === 'ON_CLOSED_CAPTION_UPDATE') {\n setHMSHLSPlayerSubtitles(data);\n }\n };\n\n // Handle Requested data\n const handleRequestedDataReturned: RequestedDataEventHandler = ({\n nativeEvent,\n }) => {\n const { requestId, data } = nativeEvent;\n const promiseMethods = promiseAndIdsMap.get(requestId);\n\n if (!promiseMethods) {\n console.warn(\n '#function handleRequestedDataReturned',\n \"Didn't found promise methods by requestId: \",\n requestId\n );\n return;\n }\n promiseMethods.resolve(data);\n // Remove the entry so the map doesn't grow unboundedly across the\n // lifetime of the player view.\n promiseAndIdsMap.delete(requestId);\n };\n\n useEffect(() => {\n return () => {\n useHMSStore.getState().resetPlaybackSlice();\n useHMSHLSPlayerStatsStore.getState().reset();\n // Reject any in-flight command promises that didn't get a response\n // before unmount. Under bridgeless mode the native side may not be\n // able to deliver `onDataReturned` events back if the React tag is\n // gone — left unrejected, those promises would hang forever.\n promiseAndIdsMap.forEach(({ reject }) => {\n reject(\n new Error('HMSHLSPlayer unmounted before command response arrived')\n );\n });\n promiseAndIdsMap.clear();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return (\n <View style={[styles.container, containerStyle]}>\n <View style={[styles.playerWrapper, style]}>\n <RCTHMSHLSPlayer\n ref={hmsHlsPlayerRef}\n url={url}\n style={styles.player}\n enableStats={enableStats}\n enableControls={enableControls}\n onHmsHlsPlaybackEvent={handleHLSPlaybackEvent as any}\n onHmsHlsStatsEvent={handleHLSStatsEvent as any}\n onHlsPlayerCuesEvent={\n Platform.OS === 'android'\n ? (handleHLSPlayerCuesEvent as any)\n : undefined\n }\n onDataReturned={handleRequestedDataReturned as any}\n />\n </View>\n </View>\n );\n};\n\nexport const HMSHLSPlayer = React.forwardRef<\n HMSHLSPlayerRefProperties,\n HMSHLSPlayerProps\n>(_HMSHLSPlayer);\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n alignItems: 'center',\n justifyContent: 'center',\n },\n playerWrapper: {\n backgroundColor: '#000000',\n alignItems: 'center',\n justifyContent: 'center',\n },\n player: {\n width: '100%',\n height: '100%',\n flex: 1,\n },\n});\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export const RCTHMSHLSPlayer =
|
|
3
|
-
export const
|
|
1
|
+
import HMSHLSPlayerNativeComponent, { Commands } from '../../specs/HMSHLSPlayerNativeComponent';
|
|
2
|
+
export const RCTHMSHLSPlayer = HMSHLSPlayerNativeComponent;
|
|
3
|
+
export const RCTHMSHLSPlayerCommands = Commands;
|
|
4
4
|
//# sourceMappingURL=RCTHMSHLSPlayer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["
|
|
1
|
+
{"version":3,"names":["HMSHLSPlayerNativeComponent","Commands","RCTHMSHLSPlayer","RCTHMSHLSPlayerCommands"],"sources":["RCTHMSHLSPlayer.ts"],"sourcesContent":["import type { ElementRef } from 'react';\nimport type { StyleProp, NativeSyntheticEvent, ViewStyle } from 'react-native';\nimport HMSHLSPlayerNativeComponent, {\n Commands,\n} from '../../specs/HMSHLSPlayerNativeComponent';\nimport type {\n HMSHLSPlayerCuesEvent,\n HMSHLSPlayerPlaybackEvent,\n HMSHLSPlayerStatsEvent,\n RequestedDataEvent,\n} from '../../types';\n\nexport type HmsHlsPlaybackEventHandler = (\n event: NativeSyntheticEvent<HMSHLSPlayerPlaybackEvent>\n) => void;\n\nexport type HmsHlsStatsEventHandler = (\n event: NativeSyntheticEvent<HMSHLSPlayerStatsEvent>\n) => void;\n\nexport type HlsSPlayerCuesEventHandler = (\n event: NativeSyntheticEvent<HMSHLSPlayerCuesEvent>\n) => void;\n\nexport type RequestedDataEventHandler = (\n event: NativeSyntheticEvent<RequestedDataEvent>\n) => void;\n\nexport type RCTHMSHLSPlayerProps = {\n url?: string;\n style?: StyleProp<ViewStyle>;\n enableStats?: boolean;\n enableControls?: boolean;\n onHmsHlsPlaybackEvent?: HmsHlsPlaybackEventHandler;\n onHmsHlsStatsEvent?: HmsHlsStatsEventHandler;\n onDataReturned?: RequestedDataEventHandler;\n onHlsPlayerCuesEvent?: HlsSPlayerCuesEventHandler;\n};\n\nexport const RCTHMSHLSPlayer = HMSHLSPlayerNativeComponent;\n\nexport const RCTHMSHLSPlayerCommands = Commands;\n\nexport type RCTHMSHLSPlayerRef = ElementRef<typeof RCTHMSHLSPlayer>;\n"],"mappings":"AAEA,OAAOA,2BAA2B,IAChCC,QAAQ,QACH,yCAAyC;AAmChD,OAAO,MAAMC,eAAe,GAAGF,2BAA2B;AAE1D,OAAO,MAAMG,uBAAuB,GAAGF,QAAQ","ignoreList":[]}
|
|
@@ -1,11 +1,3 @@
|
|
|
1
|
-
import
|
|
2
|
-
const {
|
|
3
|
-
HMSManager
|
|
4
|
-
} = NativeModules;
|
|
5
|
-
if (HMSManager == null) {
|
|
6
|
-
console.error(`[@100mslive/react-native-hms] react-native-hms module was not found. Make sure you're running your app on the native platform and your code is linked properly (cd ios && pod install && cd ..).
|
|
7
|
-
|
|
8
|
-
For installation instructions, please refer to https://www.100ms.live/docs/react-native/v2/how-to-guides/install-the-sdk/integration`.split('\n').map(line => line.trim()).join('\n'));
|
|
9
|
-
}
|
|
1
|
+
import HMSManager from '../specs/NativeHMSManager';
|
|
10
2
|
export default HMSManager;
|
|
11
3
|
//# sourceMappingURL=HMSManagerModule.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["
|
|
1
|
+
{"version":3,"names":["HMSManager"],"sources":["HMSManagerModule.ts"],"sourcesContent":["import HMSManager from '../specs/NativeHMSManager';\n\nexport type HMSManagerProps = any;\n\nexport default HMSManager as HMSManagerProps;\n"],"mappings":"AAAA,OAAOA,UAAU,MAAM,2BAA2B;AAIlD,eAAeA,UAAU","ignoreList":[]}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fabric component spec for `<HMSHLSPlayer />`.
|
|
3
|
+
*
|
|
4
|
+
* Renders an HLS stream from the live room (host-published or recorded).
|
|
5
|
+
* Today's implementation lives in `ios/HMSHLSPlayerManager.swift` (paper)
|
|
6
|
+
* and `android/.../HMSHLSPlayerManager.kt` + `HMSHLSPlayer.kt` (paper).
|
|
7
|
+
* Phase 1 adds Fabric counterparts.
|
|
8
|
+
*
|
|
9
|
+
* This is the most surface-heavy component in the SDK:
|
|
10
|
+
* - 3 props (`url`, `enableStats`, `enableControls`)
|
|
11
|
+
* - 4 events (playback state, stats, request-response, captions)
|
|
12
|
+
* - 13 imperative commands
|
|
13
|
+
*
|
|
14
|
+
* Like {@link HMSViewNativeComponent}, Fabric requires explicit prop and
|
|
15
|
+
* event payload shapes. For Phase 1 we use minimal shapes that capture
|
|
16
|
+
* essential fields (e.g. `requestId` for response events) and leave the
|
|
17
|
+
* rest loose. Phase 2 tightens.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent';
|
|
21
|
+
import codegenNativeCommands from 'react-native/Libraries/Utilities/codegenNativeCommands';
|
|
22
|
+
|
|
23
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
24
|
+
// Event payload shapes
|
|
25
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Playback state-change event payload.
|
|
29
|
+
* Today's emitter in `HMSHLSPlayer.kt` / iOS counterpart sends an
|
|
30
|
+
* `eventType` plus a state-specific data object. Phase 2 will type the
|
|
31
|
+
* `data` field per state; Phase 1 carries it as a string blob.
|
|
32
|
+
*/
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Stats event payload (RTC-shape stats: bitrate, dropped frames, etc.).
|
|
36
|
+
* Carried as a stringified JSON blob for Phase 1; Phase 2 types it.
|
|
37
|
+
*/
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Response event for the request-style commands (`areClosedCaptionSupported`,
|
|
41
|
+
* `isClosedCaptionEnabled`, `getPlayerDurationDetails`). The JS-side
|
|
42
|
+
* matches the response to the in-flight Promise via `requestId`.
|
|
43
|
+
*/
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Closed-captions cue payload. Native-side fires a cue object with start
|
|
47
|
+
* time, end time, payload string, etc. Phase 1 keeps it as a stringified
|
|
48
|
+
* blob; Phase 2 will type it.
|
|
49
|
+
*/
|
|
50
|
+
|
|
51
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
52
|
+
// Props
|
|
53
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
54
|
+
|
|
55
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
56
|
+
// Imperative commands (13)
|
|
57
|
+
//
|
|
58
|
+
// `requestId`-bearing commands deliver their response via the
|
|
59
|
+
// `onDataReturned` event (see {@link OnDataReturnedPayload}). The JS
|
|
60
|
+
// wrapper in `src/components/HMSHLSPlayer/HMSHLSPlayer.tsx` currently
|
|
61
|
+
// allocates the requestId and resolves a promise on response; Phase 1
|
|
62
|
+
// keeps that pattern.
|
|
63
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
64
|
+
|
|
65
|
+
export const Commands = codegenNativeCommands({
|
|
66
|
+
supportedCommands: ['play', 'stop', 'pause', 'resume', 'seekToLivePosition', 'seekForward', 'seekBackward', 'setVolume', 'areClosedCaptionSupported', 'isClosedCaptionEnabled', 'enableClosedCaption', 'disableClosedCaption', 'getPlayerDurationDetails']
|
|
67
|
+
});
|
|
68
|
+
export default codegenNativeComponent('HMSHLSPlayer');
|
|
69
|
+
//# sourceMappingURL=HMSHLSPlayerNativeComponent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["codegenNativeComponent","codegenNativeCommands","Commands","supportedCommands"],"sources":["HMSHLSPlayerNativeComponent.ts"],"sourcesContent":["/**\n * Fabric component spec for `<HMSHLSPlayer />`.\n *\n * Renders an HLS stream from the live room (host-published or recorded).\n * Today's implementation lives in `ios/HMSHLSPlayerManager.swift` (paper)\n * and `android/.../HMSHLSPlayerManager.kt` + `HMSHLSPlayer.kt` (paper).\n * Phase 1 adds Fabric counterparts.\n *\n * This is the most surface-heavy component in the SDK:\n * - 3 props (`url`, `enableStats`, `enableControls`)\n * - 4 events (playback state, stats, request-response, captions)\n * - 13 imperative commands\n *\n * Like {@link HMSViewNativeComponent}, Fabric requires explicit prop and\n * event payload shapes. For Phase 1 we use minimal shapes that capture\n * essential fields (e.g. `requestId` for response events) and leave the\n * rest loose. Phase 2 tightens.\n */\n\nimport type * as React from 'react';\nimport type { ViewProps, HostComponent } from 'react-native';\nimport type {\n DirectEventHandler,\n Double,\n Int32,\n WithDefault,\n} from 'react-native/Libraries/Types/CodegenTypes';\nimport codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent';\nimport codegenNativeCommands from 'react-native/Libraries/Utilities/codegenNativeCommands';\n\n// ─────────────────────────────────────────────────────────────────────────\n// Event payload shapes\n// ─────────────────────────────────────────────────────────────────────────\n\n/**\n * Playback state-change event payload.\n * Today's emitter in `HMSHLSPlayer.kt` / iOS counterpart sends an\n * `eventType` plus a state-specific data object. Phase 2 will type the\n * `data` field per state; Phase 1 carries it as a string blob.\n */\ntype OnHmsHlsPlaybackEventPayload = Readonly<{\n event: string;\n data: string;\n}>;\n\n/**\n * Stats event payload (RTC-shape stats: bitrate, dropped frames, etc.).\n * Carried as a stringified JSON blob for Phase 1; Phase 2 types it.\n */\ntype OnHmsHlsStatsEventPayload = Readonly<{\n event: string;\n data: string;\n}>;\n\n/**\n * Response event for the request-style commands (`areClosedCaptionSupported`,\n * `isClosedCaptionEnabled`, `getPlayerDurationDetails`). The JS-side\n * matches the response to the in-flight Promise via `requestId`.\n */\ntype OnDataReturnedPayload = Readonly<{\n requestId: Int32;\n result?: string;\n error?: string;\n}>;\n\n/**\n * Closed-captions cue payload. Native-side fires a cue object with start\n * time, end time, payload string, etc. Phase 1 keeps it as a stringified\n * blob; Phase 2 will type it.\n */\ntype OnHlsPlayerCuesEventPayload = Readonly<{\n event: string;\n data: string;\n}>;\n\n// ─────────────────────────────────────────────────────────────────────────\n// Props\n// ─────────────────────────────────────────────────────────────────────────\n\nexport interface NativeProps extends ViewProps {\n /** HLS stream URL to play. */\n url?: string;\n\n /** Emit periodic stats events via `onHmsHlsStatsEvent`. */\n enableStats?: WithDefault<boolean, false>;\n\n /** Show the native player's built-in controls UI overlay. */\n enableControls?: WithDefault<boolean, false>;\n\n /** Playback state changes (started/paused/buffering/ended/...). */\n onHmsHlsPlaybackEvent?: DirectEventHandler<OnHmsHlsPlaybackEventPayload>;\n\n /** Periodic stats (only fired when `enableStats=true`). */\n onHmsHlsStatsEvent?: DirectEventHandler<OnHmsHlsStatsEventPayload>;\n\n /** Response for request-style commands; matched by `requestId`. */\n onDataReturned?: DirectEventHandler<OnDataReturnedPayload>;\n\n /** Closed-captions cue events. */\n onHlsPlayerCuesEvent?: DirectEventHandler<OnHlsPlayerCuesEventPayload>;\n}\n\n// ─────────────────────────────────────────────────────────────────────────\n// Imperative commands (13)\n//\n// `requestId`-bearing commands deliver their response via the\n// `onDataReturned` event (see {@link OnDataReturnedPayload}). The JS\n// wrapper in `src/components/HMSHLSPlayer/HMSHLSPlayer.tsx` currently\n// allocates the requestId and resolves a promise on response; Phase 1\n// keeps that pattern.\n// ─────────────────────────────────────────────────────────────────────────\n\nexport interface NativeCommands {\n /** Start playing. Pass `''` (empty string) to reuse the URL prop. */\n play: (viewRef: React.ElementRef<HostComponent<NativeProps>>, url: string) => void;\n\n /** Stop playback (releases the player). */\n stop: (viewRef: React.ElementRef<HostComponent<NativeProps>>) => void;\n\n /** Pause playback (player remains allocated). */\n pause: (viewRef: React.ElementRef<HostComponent<NativeProps>>) => void;\n\n /** Resume from paused state. */\n resume: (viewRef: React.ElementRef<HostComponent<NativeProps>>) => void;\n\n /** Jump to the live edge (DVR HLS only). */\n seekToLivePosition: (viewRef: React.ElementRef<HostComponent<NativeProps>>) => void;\n\n /** Seek `seconds` ahead from current position. */\n seekForward: (\n viewRef: React.ElementRef<HostComponent<NativeProps>>,\n seconds: Double\n ) => void;\n\n /** Seek `seconds` back from current position. */\n seekBackward: (\n viewRef: React.ElementRef<HostComponent<NativeProps>>,\n seconds: Double\n ) => void;\n\n /** Set volume `0–100` (integer). */\n setVolume: (\n viewRef: React.ElementRef<HostComponent<NativeProps>>,\n level: Int32\n ) => void;\n\n /**\n * Query whether the stream supports closed captions. Response via\n * `onDataReturned` matched by `requestId`.\n */\n areClosedCaptionSupported: (\n viewRef: React.ElementRef<HostComponent<NativeProps>>,\n requestId: Int32\n ) => void;\n\n /**\n * Query whether closed captions are currently enabled. Response via\n * `onDataReturned` matched by `requestId`.\n */\n isClosedCaptionEnabled: (\n viewRef: React.ElementRef<HostComponent<NativeProps>>,\n requestId: Int32\n ) => void;\n\n /** Enable closed captions display. */\n enableClosedCaption: (\n viewRef: React.ElementRef<HostComponent<NativeProps>>\n ) => void;\n\n /** Disable closed captions display. */\n disableClosedCaption: (\n viewRef: React.ElementRef<HostComponent<NativeProps>>\n ) => void;\n\n /**\n * Get current player duration details (currentTime, duration, live).\n * Response via `onDataReturned` matched by `requestId`.\n */\n getPlayerDurationDetails: (\n viewRef: React.ElementRef<HostComponent<NativeProps>>,\n requestId: Int32\n ) => void;\n}\n\nexport const Commands: NativeCommands = codegenNativeCommands<NativeCommands>({\n supportedCommands: [\n 'play',\n 'stop',\n 'pause',\n 'resume',\n 'seekToLivePosition',\n 'seekForward',\n 'seekBackward',\n 'setVolume',\n 'areClosedCaptionSupported',\n 'isClosedCaptionEnabled',\n 'enableClosedCaption',\n 'disableClosedCaption',\n 'getPlayerDurationDetails',\n ],\n});\n\nexport default codegenNativeComponent<NativeProps>('HMSHLSPlayer');\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAUA,OAAOA,sBAAsB,MAAM,yDAAyD;AAC5F,OAAOC,qBAAqB,MAAM,wDAAwD;;AAE1F;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAMA;AACA;AACA;AACA;;AAMA;AACA;AACA;AACA;AACA;;AAOA;AACA;AACA;AACA;AACA;;AAMA;AACA;AACA;;AAyBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AA0EA,OAAO,MAAMC,QAAwB,GAAGD,qBAAqB,CAAiB;EAC5EE,iBAAiB,EAAE,CACjB,MAAM,EACN,MAAM,EACN,OAAO,EACP,QAAQ,EACR,oBAAoB,EACpB,aAAa,EACb,cAAc,EACd,WAAW,EACX,2BAA2B,EAC3B,wBAAwB,EACxB,qBAAqB,EACrB,sBAAsB,EACtB,0BAA0B;AAE9B,CAAC,CAAC;AAEF,eAAeH,sBAAsB,CAAc,cAAc,CAAC","ignoreList":[]}
|