@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.
Files changed (70) hide show
  1. package/android/build.gradle +70 -12
  2. package/android/src/main/java/com/reactnativehmssdk/HMSAudioshareActivity.kt +8 -8
  3. package/android/src/main/java/com/reactnativehmssdk/HMSHLSPlayer.kt +38 -12
  4. package/android/src/main/java/com/reactnativehmssdk/HMSHLSPlayerManagerImpl.kt +185 -0
  5. package/android/src/main/java/com/reactnativehmssdk/HMSHelper.kt +20 -10
  6. package/android/src/main/java/com/reactnativehmssdk/{HMSManager.kt → HMSManagerImpl.kt} +28 -111
  7. package/android/src/main/java/com/reactnativehmssdk/HMSRNSDK.kt +3 -3
  8. package/android/src/main/java/com/reactnativehmssdk/HMSReactNativeEvent.kt +29 -0
  9. package/android/src/main/java/com/reactnativehmssdk/HMSSDKViewManagerImpl.kt +119 -0
  10. package/android/src/main/java/com/reactnativehmssdk/HMSView.kt +33 -5
  11. package/android/src/main/java/com/reactnativehmssdk/HmsScreenshareActivity.kt +9 -9
  12. package/android/src/main/java/com/reactnativehmssdk/HmssdkPackage.kt +42 -3
  13. package/android/src/newarch/java/com/reactnativehmssdk/HMSHLSPlayerManager.kt +128 -0
  14. package/android/src/newarch/java/com/reactnativehmssdk/HMSManager.kt +332 -0
  15. package/android/src/newarch/java/com/reactnativehmssdk/HMSSDKViewManager.kt +102 -0
  16. package/android/src/oldarch/java/com/reactnativehmssdk/HMSHLSPlayerManager.kt +61 -0
  17. package/android/src/oldarch/java/com/reactnativehmssdk/HMSManager.kt +351 -0
  18. package/android/src/oldarch/java/com/reactnativehmssdk/HMSSDKViewManager.kt +87 -0
  19. package/ios/HMSHLSPlayerComponentView.mm +325 -0
  20. package/ios/HMSHLSPlayerManager.m +10 -0
  21. package/ios/HMSHLSPlayerManager.swift +91 -79
  22. package/ios/HMSManager.m +13 -0
  23. package/ios/HMSManager.mm +365 -0
  24. package/ios/HMSManager.swift +109 -103
  25. package/ios/HMSView.m +9 -0
  26. package/ios/HMSView.swift +44 -14
  27. package/ios/HMSViewComponentView.mm +229 -0
  28. package/lib/commonjs/classes/HmsView.js +45 -48
  29. package/lib/commonjs/classes/HmsView.js.map +1 -1
  30. package/lib/commonjs/components/HMSHLSPlayer/HMSHLSPlayer.js +46 -26
  31. package/lib/commonjs/components/HMSHLSPlayer/HMSHLSPlayer.js.map +1 -1
  32. package/lib/commonjs/components/HMSHLSPlayer/RCTHMSHLSPlayer.js +5 -4
  33. package/lib/commonjs/components/HMSHLSPlayer/RCTHMSHLSPlayer.js.map +1 -1
  34. package/lib/commonjs/modules/HMSManagerModule.js +3 -10
  35. package/lib/commonjs/modules/HMSManagerModule.js.map +1 -1
  36. package/lib/commonjs/specs/HMSHLSPlayerNativeComponent.js +75 -0
  37. package/lib/commonjs/specs/HMSHLSPlayerNativeComponent.js.map +1 -0
  38. package/lib/commonjs/specs/HMSViewNativeComponent.js +55 -0
  39. package/lib/commonjs/specs/HMSViewNativeComponent.js.map +1 -0
  40. package/lib/commonjs/specs/NativeHMSManager.js +38 -0
  41. package/lib/commonjs/specs/NativeHMSManager.js.map +1 -0
  42. package/lib/module/classes/HmsView.js +46 -49
  43. package/lib/module/classes/HmsView.js.map +1 -1
  44. package/lib/module/components/HMSHLSPlayer/HMSHLSPlayer.js +48 -28
  45. package/lib/module/components/HMSHLSPlayer/HMSHLSPlayer.js.map +1 -1
  46. package/lib/module/components/HMSHLSPlayer/RCTHMSHLSPlayer.js +3 -3
  47. package/lib/module/components/HMSHLSPlayer/RCTHMSHLSPlayer.js.map +1 -1
  48. package/lib/module/modules/HMSManagerModule.js +1 -9
  49. package/lib/module/modules/HMSManagerModule.js.map +1 -1
  50. package/lib/module/specs/HMSHLSPlayerNativeComponent.js +69 -0
  51. package/lib/module/specs/HMSHLSPlayerNativeComponent.js.map +1 -0
  52. package/lib/module/specs/HMSViewNativeComponent.js +49 -0
  53. package/lib/module/specs/HMSViewNativeComponent.js.map +1 -0
  54. package/lib/module/specs/NativeHMSManager.js +33 -0
  55. package/lib/module/specs/NativeHMSManager.js.map +1 -0
  56. package/lib/typescript/components/HMSHLSPlayer/RCTHMSHLSPlayer.d.ts +6 -9
  57. package/lib/typescript/specs/HMSHLSPlayerNativeComponent.d.ts +115 -0
  58. package/lib/typescript/specs/HMSViewNativeComponent.d.ts +97 -0
  59. package/lib/typescript/specs/NativeHMSManager.d.ts +147 -0
  60. package/package.json +16 -1
  61. package/react-native-hms.podspec +43 -0
  62. package/src/classes/HmsView.tsx +60 -78
  63. package/src/components/HMSHLSPlayer/HMSHLSPlayer.tsx +62 -128
  64. package/src/components/HMSHLSPlayer/RCTHMSHLSPlayer.ts +8 -13
  65. package/src/modules/HMSManagerModule.ts +1 -14
  66. package/src/specs/HMSHLSPlayerNativeComponent.ts +203 -0
  67. package/src/specs/HMSViewNativeComponent.ts +119 -0
  68. package/src/specs/NativeHMSManager.ts +307 -0
  69. package/android/src/main/java/com/reactnativehmssdk/HMSHLSPlayerManager.kt +0 -144
  70. package/android/src/main/java/com/reactnativehmssdk/HMSSDKViewManager.kt +0 -111
@@ -1,37 +1,10 @@
1
- import React, { useState, useImperativeHandle, useRef } from 'react';
2
- import { findNodeHandle, requireNativeComponent, StyleSheet, UIManager, Platform } from 'react-native';
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
- const data = {
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
- // We grab the relevant data out of our event.
94
- let {
78
+ const {
95
79
  requestId,
96
80
  result,
97
81
  error
98
82
  } = event.nativeEvent;
99
- // Then we get the promise we saved earlier for the given request ID.
100
- let promise = _requestMap.get(requestId);
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
- // Finally, we clean up our request map.
109
- _requestMap.delete(requestId);
94
+ requestMap.delete(requestId);
110
95
  };
111
96
  const capture = async () => {
112
- const viewManagerConfig = UIManager.getViewManagerConfig('HMSView');
113
- let requestId = _nextRequestId++;
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
- UIManager.dispatchViewManagerCommand(findNodeHandle(hmsViewRef.current), viewManagerConfig.Commands.capture, [requestId]);
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
- onChange: onChange,
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, UIManager, findNodeHandle, Platform } from 'react-native';
2
+ import { View, StyleSheet, Platform } from 'react-native';
3
3
  import { setHMSHLSPlayerCue, setHMSHLSPlayerPlaybackError, setHMSHLSPlayerPlaybackState, setHMSHLSPlayerResolution, setHMSHLSPlayerStats, setHMSHLSPlayerStatsError, setHMSHLSPlayerSubtitles } from './hooks';
4
- import { RCTHMSHLSPlayer, RCTHMSHLSPlayerViewManagerConfig } from './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 && RCTHMSHLSPlayerViewManagerConfig.Commands.play) {
22
- UIManager.dispatchViewManagerCommand(findNodeHandle(hmsHlsPlayerRef.current), RCTHMSHLSPlayerViewManagerConfig.Commands.play, url ? [url] : ['']);
27
+ if (hmsHlsPlayerRef.current) {
28
+ RCTHMSHLSPlayerCommands.play(hmsHlsPlayerRef.current, url ?? '');
23
29
  }
24
30
  },
25
31
  stop: () => {
26
- if (hmsHlsPlayerRef.current && RCTHMSHLSPlayerViewManagerConfig.Commands.stop) {
27
- UIManager.dispatchViewManagerCommand(findNodeHandle(hmsHlsPlayerRef.current), RCTHMSHLSPlayerViewManagerConfig.Commands.stop, undefined);
32
+ if (hmsHlsPlayerRef.current) {
33
+ RCTHMSHLSPlayerCommands.stop(hmsHlsPlayerRef.current);
28
34
  }
29
35
  },
30
36
  pause: () => {
31
- if (hmsHlsPlayerRef.current && RCTHMSHLSPlayerViewManagerConfig.Commands.pause) {
32
- UIManager.dispatchViewManagerCommand(findNodeHandle(hmsHlsPlayerRef.current), RCTHMSHLSPlayerViewManagerConfig.Commands.pause, undefined);
37
+ if (hmsHlsPlayerRef.current) {
38
+ RCTHMSHLSPlayerCommands.pause(hmsHlsPlayerRef.current);
33
39
  }
34
40
  },
35
41
  resume: () => {
36
- if (hmsHlsPlayerRef.current && RCTHMSHLSPlayerViewManagerConfig.Commands.resume) {
37
- UIManager.dispatchViewManagerCommand(findNodeHandle(hmsHlsPlayerRef.current), RCTHMSHLSPlayerViewManagerConfig.Commands.resume, undefined);
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 && RCTHMSHLSPlayerViewManagerConfig.Commands.seekForward) {
45
- UIManager.dispatchViewManagerCommand(findNodeHandle(hmsHlsPlayerRef.current), RCTHMSHLSPlayerViewManagerConfig.Commands.seekForward, [seconds]);
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 && RCTHMSHLSPlayerViewManagerConfig.Commands.seekBackward) {
53
- UIManager.dispatchViewManagerCommand(findNodeHandle(hmsHlsPlayerRef.current), RCTHMSHLSPlayerViewManagerConfig.Commands.seekBackward, [seconds]);
58
+ if (hmsHlsPlayerRef.current) {
59
+ RCTHMSHLSPlayerCommands.seekBackward(hmsHlsPlayerRef.current, seconds);
54
60
  }
55
61
  },
56
62
  seekToLivePosition: () => {
57
- if (hmsHlsPlayerRef.current && RCTHMSHLSPlayerViewManagerConfig.Commands.seekToLivePosition) {
58
- UIManager.dispatchViewManagerCommand(findNodeHandle(hmsHlsPlayerRef.current), RCTHMSHLSPlayerViewManagerConfig.Commands.seekToLivePosition, undefined);
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 && RCTHMSHLSPlayerViewManagerConfig.Commands.setVolume) {
66
- UIManager.dispatchViewManagerCommand(findNodeHandle(hmsHlsPlayerRef.current), RCTHMSHLSPlayerViewManagerConfig.Commands.setVolume, [level]);
71
+ if (hmsHlsPlayerRef.current) {
72
+ RCTHMSHLSPlayerCommands.setVolume(hmsHlsPlayerRef.current, level);
67
73
  }
68
74
  },
69
75
  isClosedCaptionSupported: () => {
70
- if (hmsHlsPlayerRef.current && RCTHMSHLSPlayerViewManagerConfig.Commands.areClosedCaptionSupported) {
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
- UIManager.dispatchViewManagerCommand(findNodeHandle(hmsHlsPlayerRef.current), RCTHMSHLSPlayerViewManagerConfig.Commands.areClosedCaptionSupported, [requestId]);
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 && RCTHMSHLSPlayerViewManagerConfig.Commands.isClosedCaptionEnabled) {
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
- UIManager.dispatchViewManagerCommand(findNodeHandle(hmsHlsPlayerRef.current), RCTHMSHLSPlayerViewManagerConfig.Commands.isClosedCaptionEnabled, [requestId]);
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 && RCTHMSHLSPlayerViewManagerConfig.Commands.enableClosedCaption) {
99
- UIManager.dispatchViewManagerCommand(findNodeHandle(hmsHlsPlayerRef.current), RCTHMSHLSPlayerViewManagerConfig.Commands.enableClosedCaption, undefined);
104
+ if (hmsHlsPlayerRef.current) {
105
+ RCTHMSHLSPlayerCommands.enableClosedCaption(hmsHlsPlayerRef.current);
100
106
  }
101
107
  },
102
108
  disableClosedCaption: () => {
103
- if (hmsHlsPlayerRef.current && RCTHMSHLSPlayerViewManagerConfig.Commands.disableClosedCaption) {
104
- UIManager.dispatchViewManagerCommand(findNodeHandle(hmsHlsPlayerRef.current), RCTHMSHLSPlayerViewManagerConfig.Commands.disableClosedCaption, undefined);
109
+ if (hmsHlsPlayerRef.current) {
110
+ RCTHMSHLSPlayerCommands.disableClosedCaption(hmsHlsPlayerRef.current);
105
111
  }
106
112
  },
107
113
  getPlayerDurationDetails: () => {
108
- if (hmsHlsPlayerRef.current && RCTHMSHLSPlayerViewManagerConfig.Commands.getPlayerDurationDetails) {
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
- UIManager.dispatchViewManagerCommand(findNodeHandle(hmsHlsPlayerRef.current), RCTHMSHLSPlayerViewManagerConfig.Commands.getPlayerDurationDetails, [requestId]);
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 { requireNativeComponent, UIManager } from 'react-native';
2
- export const RCTHMSHLSPlayer = requireNativeComponent('HMSHLSPlayer');
3
- export const RCTHMSHLSPlayerViewManagerConfig = UIManager.getViewManagerConfig('HMSHLSPlayer');
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":["requireNativeComponent","UIManager","RCTHMSHLSPlayer","RCTHMSHLSPlayerViewManagerConfig","getViewManagerConfig"],"sources":["RCTHMSHLSPlayer.ts"],"sourcesContent":["import { requireNativeComponent, UIManager } from 'react-native';\nimport type {\n StyleProp,\n NativeSyntheticEvent,\n ViewStyle,\n NativeMethods,\n} from 'react-native';\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 =\n requireNativeComponent<RCTHMSHLSPlayerProps>('HMSHLSPlayer');\n\nexport type RCTHMSHLSPlayerRef = React.Component<RCTHMSHLSPlayerProps> &\n Readonly<NativeMethods>;\n\nexport const RCTHMSHLSPlayerViewManagerConfig =\n UIManager.getViewManagerConfig('HMSHLSPlayer');\n"],"mappings":"AAAA,SAASA,sBAAsB,EAAEC,SAAS,QAAQ,cAAc;AAyChE,OAAO,MAAMC,eAAe,GAC1BF,sBAAsB,CAAuB,cAAc,CAAC;AAK9D,OAAO,MAAMG,gCAAgC,GAC3CF,SAAS,CAACG,oBAAoB,CAAC,cAAc,CAAC","ignoreList":[]}
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 { NativeModules } from 'react-native';
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":["NativeModules","HMSManager","console","error","split","map","line","trim","join"],"sources":["HMSManagerModule.ts"],"sourcesContent":["import { NativeModules } from 'react-native';\n\nconst { HMSManager } = NativeModules;\n\nif (HMSManager == null) {\n console.error(\n `[@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 ..).\n\n For installation instructions, please refer to https://www.100ms.live/docs/react-native/v2/how-to-guides/install-the-sdk/integration`\n .split('\\n')\n .map((line) => line.trim())\n .join('\\n')\n );\n}\n\nexport type HMSManagerProps = any;\n\nexport default HMSManager as HMSManagerProps;\n"],"mappings":"AAAA,SAASA,aAAa,QAAQ,cAAc;AAE5C,MAAM;EAAEC;AAAW,CAAC,GAAGD,aAAa;AAEpC,IAAIC,UAAU,IAAI,IAAI,EAAE;EACtBC,OAAO,CAACC,KAAK,CACX;AACJ;AACA,yIAAyI,CAClIC,KAAK,CAAC,IAAI,CAAC,CACXC,GAAG,CAAEC,IAAI,IAAKA,IAAI,CAACC,IAAI,CAAC,CAAC,CAAC,CAC1BC,IAAI,CAAC,IAAI,CACd,CAAC;AACH;AAIA,eAAeP,UAAU","ignoreList":[]}
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":[]}