@livepeer-frameworks/player-react 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -9
- package/dist/cjs/_virtual/_rollupPluginBabelHelpers.js +359 -0
- package/dist/cjs/_virtual/_rollupPluginBabelHelpers.js.map +1 -0
- package/dist/cjs/assets/logomark.svg.js +8 -0
- package/dist/cjs/assets/logomark.svg.js.map +1 -0
- package/dist/cjs/components/DevModePanel.js +826 -0
- package/dist/cjs/components/DevModePanel.js.map +1 -0
- package/dist/cjs/components/DvdLogo.js +200 -0
- package/dist/cjs/components/DvdLogo.js.map +1 -0
- package/dist/cjs/components/Icons.js +439 -0
- package/dist/cjs/components/Icons.js.map +1 -0
- package/dist/cjs/components/IdleScreen.js +587 -0
- package/dist/cjs/components/IdleScreen.js.map +1 -0
- package/dist/cjs/components/LoadingScreen.js +523 -0
- package/dist/cjs/components/LoadingScreen.js.map +1 -0
- package/dist/cjs/components/Player.js +420 -0
- package/dist/cjs/components/Player.js.map +1 -0
- package/dist/cjs/components/PlayerControls.js +798 -0
- package/dist/cjs/components/PlayerControls.js.map +1 -0
- package/dist/cjs/components/PlayerErrorBoundary.js +80 -0
- package/dist/cjs/components/PlayerErrorBoundary.js.map +1 -0
- package/dist/cjs/components/SeekBar.js +253 -0
- package/dist/cjs/components/SeekBar.js.map +1 -0
- package/dist/cjs/components/SkipIndicator.js +92 -0
- package/dist/cjs/components/SkipIndicator.js.map +1 -0
- package/dist/cjs/components/SpeedIndicator.js +43 -0
- package/dist/cjs/components/SpeedIndicator.js.map +1 -0
- package/dist/cjs/components/StatsPanel.js +202 -0
- package/dist/cjs/components/StatsPanel.js.map +1 -0
- package/dist/cjs/components/StreamStateOverlay.js +229 -0
- package/dist/cjs/components/StreamStateOverlay.js.map +1 -0
- package/dist/cjs/components/ThumbnailOverlay.js +86 -0
- package/dist/cjs/components/ThumbnailOverlay.js.map +1 -0
- package/dist/cjs/components/TitleOverlay.js +32 -0
- package/dist/cjs/components/TitleOverlay.js.map +1 -0
- package/dist/cjs/context/PlayerContext.js +46 -0
- package/dist/cjs/context/PlayerContext.js.map +1 -0
- package/dist/cjs/hooks/useMetaTrack.js +165 -0
- package/dist/cjs/hooks/useMetaTrack.js.map +1 -0
- package/dist/cjs/hooks/usePlaybackQuality.js +131 -0
- package/dist/cjs/hooks/usePlaybackQuality.js.map +1 -0
- package/dist/cjs/hooks/usePlayerController.js +518 -0
- package/dist/cjs/hooks/usePlayerController.js.map +1 -0
- package/dist/cjs/hooks/usePlayerSelection.js +90 -0
- package/dist/cjs/hooks/usePlayerSelection.js.map +1 -0
- package/dist/cjs/hooks/useStreamState.js +360 -0
- package/dist/cjs/hooks/useStreamState.js.map +1 -0
- package/dist/cjs/hooks/useTelemetry.js +120 -0
- package/dist/cjs/hooks/useTelemetry.js.map +1 -0
- package/dist/cjs/hooks/useViewerEndpoints.js +222 -0
- package/dist/cjs/hooks/useViewerEndpoints.js.map +1 -0
- package/dist/cjs/index.js +97 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/ui/badge.js +34 -0
- package/dist/cjs/ui/badge.js.map +1 -0
- package/dist/cjs/ui/button.js +74 -0
- package/dist/cjs/ui/button.js.map +1 -0
- package/dist/cjs/ui/context-menu.js +163 -0
- package/dist/cjs/ui/context-menu.js.map +1 -0
- package/dist/cjs/ui/slider.js +60 -0
- package/dist/cjs/ui/slider.js.map +1 -0
- package/dist/esm/_virtual/_rollupPluginBabelHelpers.js +329 -0
- package/dist/esm/_virtual/_rollupPluginBabelHelpers.js.map +1 -0
- package/dist/esm/assets/logomark.svg.js +4 -0
- package/dist/esm/assets/logomark.svg.js.map +1 -0
- package/dist/esm/components/DevModePanel.js +822 -0
- package/dist/esm/components/DevModePanel.js.map +1 -0
- package/dist/esm/components/DvdLogo.js +196 -0
- package/dist/esm/components/DvdLogo.js.map +1 -0
- package/dist/esm/components/Icons.js +421 -0
- package/dist/esm/components/Icons.js.map +1 -0
- package/dist/esm/components/IdleScreen.js +582 -0
- package/dist/esm/components/IdleScreen.js.map +1 -0
- package/dist/esm/components/LoadingScreen.js +519 -0
- package/dist/esm/components/LoadingScreen.js.map +1 -0
- package/dist/esm/components/Player.js +416 -0
- package/dist/esm/components/Player.js.map +1 -0
- package/dist/esm/components/PlayerControls.js +794 -0
- package/dist/esm/components/PlayerControls.js.map +1 -0
- package/dist/esm/components/PlayerErrorBoundary.js +76 -0
- package/dist/esm/components/PlayerErrorBoundary.js.map +1 -0
- package/dist/esm/components/SeekBar.js +249 -0
- package/dist/esm/components/SeekBar.js.map +1 -0
- package/dist/esm/components/SkipIndicator.js +88 -0
- package/dist/esm/components/SkipIndicator.js.map +1 -0
- package/dist/esm/components/SpeedIndicator.js +39 -0
- package/dist/esm/components/SpeedIndicator.js.map +1 -0
- package/dist/esm/components/StatsPanel.js +198 -0
- package/dist/esm/components/StatsPanel.js.map +1 -0
- package/dist/esm/components/StreamStateOverlay.js +224 -0
- package/dist/esm/components/StreamStateOverlay.js.map +1 -0
- package/dist/esm/components/ThumbnailOverlay.js +82 -0
- package/dist/esm/components/ThumbnailOverlay.js.map +1 -0
- package/dist/esm/components/TitleOverlay.js +28 -0
- package/dist/esm/components/TitleOverlay.js.map +1 -0
- package/dist/esm/context/PlayerContext.js +41 -0
- package/dist/esm/context/PlayerContext.js.map +1 -0
- package/dist/esm/hooks/useMetaTrack.js +163 -0
- package/dist/esm/hooks/useMetaTrack.js.map +1 -0
- package/dist/esm/hooks/usePlaybackQuality.js +129 -0
- package/dist/esm/hooks/usePlaybackQuality.js.map +1 -0
- package/dist/esm/hooks/usePlayerController.js +516 -0
- package/dist/esm/hooks/usePlayerController.js.map +1 -0
- package/dist/esm/hooks/usePlayerSelection.js +88 -0
- package/dist/esm/hooks/usePlayerSelection.js.map +1 -0
- package/dist/esm/hooks/useStreamState.js +358 -0
- package/dist/esm/hooks/useStreamState.js.map +1 -0
- package/dist/esm/hooks/useTelemetry.js +118 -0
- package/dist/esm/hooks/useTelemetry.js.map +1 -0
- package/dist/esm/hooks/useViewerEndpoints.js +220 -0
- package/dist/esm/hooks/useViewerEndpoints.js.map +1 -0
- package/dist/esm/index.js +23 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/ui/badge.js +31 -0
- package/dist/esm/ui/badge.js.map +1 -0
- package/dist/esm/ui/button.js +52 -0
- package/dist/esm/ui/button.js.map +1 -0
- package/dist/esm/ui/context-menu.js +132 -0
- package/dist/esm/ui/context-menu.js.map +1 -0
- package/dist/esm/ui/slider.js +38 -0
- package/dist/esm/ui/slider.js.map +1 -0
- package/dist/types/components/DvdLogo.d.ts +1 -1
- package/dist/types/components/Icons.d.ts +1 -1
- package/dist/types/components/Player.d.ts +1 -1
- package/dist/types/components/PlayerErrorBoundary.d.ts +2 -1
- package/dist/types/components/StreamStateOverlay.d.ts +2 -2
- package/dist/types/components/SubtitleRenderer.d.ts +2 -2
- package/dist/types/context/PlayerContext.d.ts +2 -2
- package/dist/types/context/index.d.ts +2 -2
- package/dist/types/hooks/useMetaTrack.d.ts +3 -3
- package/dist/types/hooks/usePlaybackQuality.d.ts +2 -2
- package/dist/types/hooks/usePlayerController.d.ts +26 -3
- package/dist/types/hooks/usePlayerSelection.d.ts +1 -1
- package/dist/types/hooks/useStreamState.d.ts +1 -1
- package/dist/types/hooks/useTelemetry.d.ts +1 -1
- package/dist/types/hooks/useViewerEndpoints.d.ts +3 -3
- package/dist/types/index.d.ts +28 -28
- package/dist/types/types.d.ts +3 -3
- package/dist/types/ui/select.d.ts +1 -1
- package/package.json +22 -14
- package/src/components/DevModePanel.tsx +244 -143
- package/src/components/DvdLogo.tsx +1 -1
- package/src/components/Icons.tsx +105 -25
- package/src/components/IdleScreen.tsx +262 -128
- package/src/components/LoadingScreen.tsx +169 -151
- package/src/components/LogoOverlay.tsx +3 -6
- package/src/components/Player.tsx +126 -59
- package/src/components/PlayerControls.tsx +384 -272
- package/src/components/PlayerErrorBoundary.tsx +7 -13
- package/src/components/SeekBar.tsx +96 -88
- package/src/components/SkipIndicator.tsx +2 -12
- package/src/components/SpeedIndicator.tsx +2 -11
- package/src/components/StatsPanel.tsx +31 -22
- package/src/components/StreamStateOverlay.tsx +105 -49
- package/src/components/SubtitleRenderer.tsx +29 -29
- package/src/components/ThumbnailOverlay.tsx +5 -6
- package/src/components/TitleOverlay.tsx +2 -8
- package/src/context/PlayerContext.tsx +4 -8
- package/src/context/index.ts +3 -3
- package/src/hooks/useMetaTrack.ts +27 -27
- package/src/hooks/usePlaybackQuality.ts +3 -3
- package/src/hooks/usePlayerController.ts +246 -138
- package/src/hooks/usePlayerSelection.ts +6 -6
- package/src/hooks/useStreamState.ts +51 -56
- package/src/hooks/useTelemetry.ts +18 -3
- package/src/hooks/useViewerEndpoints.ts +34 -23
- package/src/index.tsx +36 -28
- package/src/types.ts +8 -8
- package/src/ui/badge.tsx +6 -5
- package/src/ui/button.tsx +9 -8
- package/src/ui/context-menu.tsx +42 -61
- package/src/ui/select.tsx +13 -7
- package/src/ui/slider.tsx +18 -29
- package/dist/types/components/players/DashJsPlayer.d.ts +0 -18
- package/dist/types/components/players/HlsJsPlayer.d.ts +0 -18
- package/dist/types/components/players/MewsWsPlayer/index.d.ts +0 -18
- package/dist/types/components/players/MistPlayer.d.ts +0 -20
- package/dist/types/components/players/MistWebRTCPlayer/index.d.ts +0 -20
- package/dist/types/components/players/NativePlayer.d.ts +0 -19
- package/dist/types/components/players/VideoJsPlayer.d.ts +0 -18
- package/src/components/players/DashJsPlayer.tsx +0 -56
- package/src/components/players/HlsJsPlayer.tsx +0 -56
- package/src/components/players/MewsWsPlayer/index.tsx +0 -56
- package/src/components/players/MistPlayer.tsx +0 -60
- package/src/components/players/MistWebRTCPlayer/index.tsx +0 -59
- package/src/components/players/NativePlayer.tsx +0 -58
- package/src/components/players/VideoJsPlayer.tsx +0 -56
|
@@ -0,0 +1,516 @@
|
|
|
1
|
+
import { objectWithoutProperties as _objectWithoutProperties, slicedToArray as _slicedToArray, objectSpread2 as _objectSpread2, asyncToGenerator as _asyncToGenerator, regenerator as _regenerator } from '../_virtual/_rollupPluginBabelHelpers.js';
|
|
2
|
+
import { useRef, useState, useEffect, useCallback } from 'react';
|
|
3
|
+
import { PlayerController } from '@livepeer-frameworks/player-core';
|
|
4
|
+
|
|
5
|
+
var _excluded = ["enabled", "onStateChange", "onStreamStateChange", "onError", "onReady", "onProtocolSwapped", "onPlaybackFailed"];
|
|
6
|
+
// ============================================================================
|
|
7
|
+
// Initial State
|
|
8
|
+
// ============================================================================
|
|
9
|
+
var initialState = {
|
|
10
|
+
state: "booting",
|
|
11
|
+
streamState: null,
|
|
12
|
+
endpoints: null,
|
|
13
|
+
metadata: null,
|
|
14
|
+
videoElement: null,
|
|
15
|
+
currentTime: 0,
|
|
16
|
+
duration: NaN,
|
|
17
|
+
isPlaying: false,
|
|
18
|
+
isPaused: true,
|
|
19
|
+
isBuffering: false,
|
|
20
|
+
isMuted: true,
|
|
21
|
+
volume: 1,
|
|
22
|
+
error: null,
|
|
23
|
+
errorDetails: null,
|
|
24
|
+
isPassiveError: false,
|
|
25
|
+
hasPlaybackStarted: false,
|
|
26
|
+
isHoldingSpeed: false,
|
|
27
|
+
holdSpeed: 2,
|
|
28
|
+
isHovering: false,
|
|
29
|
+
shouldShowControls: false,
|
|
30
|
+
isLoopEnabled: false,
|
|
31
|
+
isFullscreen: false,
|
|
32
|
+
isPiPActive: false,
|
|
33
|
+
isEffectivelyLive: false,
|
|
34
|
+
shouldShowIdleScreen: true,
|
|
35
|
+
currentPlayerInfo: null,
|
|
36
|
+
currentSourceInfo: null,
|
|
37
|
+
playbackQuality: null,
|
|
38
|
+
subtitlesEnabled: false,
|
|
39
|
+
qualities: [],
|
|
40
|
+
textTracks: [],
|
|
41
|
+
streamInfo: null,
|
|
42
|
+
toast: null
|
|
43
|
+
};
|
|
44
|
+
// ============================================================================
|
|
45
|
+
// Hook
|
|
46
|
+
// ============================================================================
|
|
47
|
+
function usePlayerController(config) {
|
|
48
|
+
var _config$enabled = config.enabled,
|
|
49
|
+
enabled = _config$enabled === void 0 ? true : _config$enabled,
|
|
50
|
+
onStateChange = config.onStateChange,
|
|
51
|
+
onStreamStateChange = config.onStreamStateChange,
|
|
52
|
+
onError = config.onError,
|
|
53
|
+
onReady = config.onReady,
|
|
54
|
+
onProtocolSwapped = config.onProtocolSwapped,
|
|
55
|
+
onPlaybackFailed = config.onPlaybackFailed,
|
|
56
|
+
controllerConfig = _objectWithoutProperties(config, _excluded);
|
|
57
|
+
var containerRef = useRef(null);
|
|
58
|
+
var controllerRef = useRef(null);
|
|
59
|
+
var _useState = useState(initialState),
|
|
60
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
61
|
+
state = _useState2[0],
|
|
62
|
+
setState = _useState2[1];
|
|
63
|
+
// Stable config ref for effect dependencies
|
|
64
|
+
var configRef = useRef(controllerConfig);
|
|
65
|
+
configRef.current = controllerConfig;
|
|
66
|
+
// Create and attach controller
|
|
67
|
+
useEffect(function () {
|
|
68
|
+
if (!enabled) return;
|
|
69
|
+
var container = containerRef.current;
|
|
70
|
+
if (!container) return;
|
|
71
|
+
// Create controller
|
|
72
|
+
var controller = new PlayerController({
|
|
73
|
+
contentId: configRef.current.contentId,
|
|
74
|
+
contentType: configRef.current.contentType,
|
|
75
|
+
endpoints: configRef.current.endpoints,
|
|
76
|
+
gatewayUrl: configRef.current.gatewayUrl,
|
|
77
|
+
mistUrl: configRef.current.mistUrl,
|
|
78
|
+
authToken: configRef.current.authToken,
|
|
79
|
+
autoplay: configRef.current.autoplay,
|
|
80
|
+
muted: configRef.current.muted,
|
|
81
|
+
controls: configRef.current.controls,
|
|
82
|
+
poster: configRef.current.poster,
|
|
83
|
+
debug: configRef.current.debug
|
|
84
|
+
});
|
|
85
|
+
controllerRef.current = controller;
|
|
86
|
+
// Subscribe to events
|
|
87
|
+
var unsubs = [];
|
|
88
|
+
// Sync state from controller - called on video events
|
|
89
|
+
var syncState = function syncState() {
|
|
90
|
+
if (!controllerRef.current) return;
|
|
91
|
+
var c = controllerRef.current;
|
|
92
|
+
setState(function (prev) {
|
|
93
|
+
return _objectSpread2(_objectSpread2({}, prev), {}, {
|
|
94
|
+
isPlaying: c.isPlaying(),
|
|
95
|
+
isPaused: c.isPaused(),
|
|
96
|
+
isBuffering: c.isBuffering(),
|
|
97
|
+
isMuted: c.isMuted(),
|
|
98
|
+
volume: c.getVolume(),
|
|
99
|
+
hasPlaybackStarted: c.hasPlaybackStarted(),
|
|
100
|
+
shouldShowControls: c.shouldShowControls(),
|
|
101
|
+
shouldShowIdleScreen: c.shouldShowIdleScreen(),
|
|
102
|
+
playbackQuality: c.getPlaybackQuality(),
|
|
103
|
+
isLoopEnabled: c.isLoopEnabled(),
|
|
104
|
+
subtitlesEnabled: c.isSubtitlesEnabled(),
|
|
105
|
+
qualities: c.getQualities(),
|
|
106
|
+
streamInfo: c.getStreamInfo()
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
};
|
|
110
|
+
unsubs.push(controller.on("stateChange", function (_ref) {
|
|
111
|
+
var newState = _ref.state;
|
|
112
|
+
setState(function (prev) {
|
|
113
|
+
return _objectSpread2(_objectSpread2({}, prev), {}, {
|
|
114
|
+
state: newState
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
onStateChange === null || onStateChange === void 0 || onStateChange(newState);
|
|
118
|
+
}));
|
|
119
|
+
unsubs.push(controller.on("streamStateChange", function (_ref2) {
|
|
120
|
+
var streamState = _ref2.state;
|
|
121
|
+
setState(function (prev) {
|
|
122
|
+
return _objectSpread2(_objectSpread2({}, prev), {}, {
|
|
123
|
+
streamState: streamState,
|
|
124
|
+
metadata: controller.getMetadata(),
|
|
125
|
+
isEffectivelyLive: controller.isEffectivelyLive(),
|
|
126
|
+
shouldShowIdleScreen: controller.shouldShowIdleScreen()
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
onStreamStateChange === null || onStreamStateChange === void 0 || onStreamStateChange(streamState);
|
|
130
|
+
}));
|
|
131
|
+
unsubs.push(controller.on("timeUpdate", function (_ref3) {
|
|
132
|
+
var currentTime = _ref3.currentTime,
|
|
133
|
+
duration = _ref3.duration;
|
|
134
|
+
setState(function (prev) {
|
|
135
|
+
return _objectSpread2(_objectSpread2({}, prev), {}, {
|
|
136
|
+
currentTime: currentTime,
|
|
137
|
+
duration: duration
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
}));
|
|
141
|
+
unsubs.push(controller.on("error", function (_ref4) {
|
|
142
|
+
var error = _ref4.error;
|
|
143
|
+
setState(function (prev) {
|
|
144
|
+
return _objectSpread2(_objectSpread2({}, prev), {}, {
|
|
145
|
+
error: error,
|
|
146
|
+
isPassiveError: controller.isPassiveError()
|
|
147
|
+
});
|
|
148
|
+
});
|
|
149
|
+
onError === null || onError === void 0 || onError(error);
|
|
150
|
+
}));
|
|
151
|
+
unsubs.push(controller.on("errorCleared", function () {
|
|
152
|
+
setState(function (prev) {
|
|
153
|
+
return _objectSpread2(_objectSpread2({}, prev), {}, {
|
|
154
|
+
error: null,
|
|
155
|
+
isPassiveError: false
|
|
156
|
+
});
|
|
157
|
+
});
|
|
158
|
+
}));
|
|
159
|
+
unsubs.push(controller.on("ready", function (_ref5) {
|
|
160
|
+
var videoElement = _ref5.videoElement;
|
|
161
|
+
setState(function (prev) {
|
|
162
|
+
return _objectSpread2(_objectSpread2({}, prev), {}, {
|
|
163
|
+
videoElement: videoElement,
|
|
164
|
+
endpoints: controller.getEndpoints(),
|
|
165
|
+
metadata: controller.getMetadata(),
|
|
166
|
+
streamInfo: controller.getStreamInfo(),
|
|
167
|
+
isEffectivelyLive: controller.isEffectivelyLive(),
|
|
168
|
+
shouldShowIdleScreen: controller.shouldShowIdleScreen(),
|
|
169
|
+
currentPlayerInfo: controller.getCurrentPlayerInfo(),
|
|
170
|
+
currentSourceInfo: controller.getCurrentSourceInfo(),
|
|
171
|
+
qualities: controller.getQualities()
|
|
172
|
+
});
|
|
173
|
+
});
|
|
174
|
+
onReady === null || onReady === void 0 || onReady(videoElement);
|
|
175
|
+
// Set up video event listeners AFTER video is ready
|
|
176
|
+
// syncState is defined below - this closure captures it
|
|
177
|
+
var handleVideoEvent = function handleVideoEvent() {
|
|
178
|
+
var _controllerRef$curren, _controllerRef$curren2;
|
|
179
|
+
if ((_controllerRef$curren = controllerRef.current) !== null && _controllerRef$curren !== void 0 && (_controllerRef$curren2 = _controllerRef$curren.shouldSuppressVideoEvents) !== null && _controllerRef$curren2 !== void 0 && _controllerRef$curren2.call(_controllerRef$curren)) return;
|
|
180
|
+
syncState();
|
|
181
|
+
};
|
|
182
|
+
videoElement.addEventListener("play", handleVideoEvent);
|
|
183
|
+
videoElement.addEventListener("pause", handleVideoEvent);
|
|
184
|
+
videoElement.addEventListener("waiting", handleVideoEvent);
|
|
185
|
+
videoElement.addEventListener("playing", handleVideoEvent);
|
|
186
|
+
unsubs.push(function () {
|
|
187
|
+
videoElement.removeEventListener("play", handleVideoEvent);
|
|
188
|
+
videoElement.removeEventListener("pause", handleVideoEvent);
|
|
189
|
+
videoElement.removeEventListener("waiting", handleVideoEvent);
|
|
190
|
+
videoElement.removeEventListener("playing", handleVideoEvent);
|
|
191
|
+
});
|
|
192
|
+
}));
|
|
193
|
+
unsubs.push(controller.on("playerSelected", function (_ref6) {
|
|
194
|
+
_ref6.player;
|
|
195
|
+
var source = _ref6.source;
|
|
196
|
+
setState(function (prev) {
|
|
197
|
+
return _objectSpread2(_objectSpread2({}, prev), {}, {
|
|
198
|
+
currentPlayerInfo: controller.getCurrentPlayerInfo(),
|
|
199
|
+
currentSourceInfo: {
|
|
200
|
+
url: source.url,
|
|
201
|
+
type: source.type
|
|
202
|
+
},
|
|
203
|
+
qualities: controller.getQualities()
|
|
204
|
+
});
|
|
205
|
+
});
|
|
206
|
+
}));
|
|
207
|
+
unsubs.push(controller.on("volumeChange", function (_ref7) {
|
|
208
|
+
var volume = _ref7.volume,
|
|
209
|
+
muted = _ref7.muted;
|
|
210
|
+
setState(function (prev) {
|
|
211
|
+
return _objectSpread2(_objectSpread2({}, prev), {}, {
|
|
212
|
+
volume: volume,
|
|
213
|
+
isMuted: muted
|
|
214
|
+
});
|
|
215
|
+
});
|
|
216
|
+
}));
|
|
217
|
+
unsubs.push(controller.on("loopChange", function (_ref8) {
|
|
218
|
+
var isLoopEnabled = _ref8.isLoopEnabled;
|
|
219
|
+
setState(function (prev) {
|
|
220
|
+
return _objectSpread2(_objectSpread2({}, prev), {}, {
|
|
221
|
+
isLoopEnabled: isLoopEnabled
|
|
222
|
+
});
|
|
223
|
+
});
|
|
224
|
+
}));
|
|
225
|
+
unsubs.push(controller.on("fullscreenChange", function (_ref9) {
|
|
226
|
+
var isFullscreen = _ref9.isFullscreen;
|
|
227
|
+
setState(function (prev) {
|
|
228
|
+
return _objectSpread2(_objectSpread2({}, prev), {}, {
|
|
229
|
+
isFullscreen: isFullscreen
|
|
230
|
+
});
|
|
231
|
+
});
|
|
232
|
+
}));
|
|
233
|
+
unsubs.push(controller.on("pipChange", function (_ref0) {
|
|
234
|
+
var isPiP = _ref0.isPiP;
|
|
235
|
+
setState(function (prev) {
|
|
236
|
+
return _objectSpread2(_objectSpread2({}, prev), {}, {
|
|
237
|
+
isPiPActive: isPiP
|
|
238
|
+
});
|
|
239
|
+
});
|
|
240
|
+
}));
|
|
241
|
+
unsubs.push(controller.on("holdSpeedStart", function (_ref1) {
|
|
242
|
+
var speed = _ref1.speed;
|
|
243
|
+
setState(function (prev) {
|
|
244
|
+
return _objectSpread2(_objectSpread2({}, prev), {}, {
|
|
245
|
+
isHoldingSpeed: true,
|
|
246
|
+
holdSpeed: speed
|
|
247
|
+
});
|
|
248
|
+
});
|
|
249
|
+
}));
|
|
250
|
+
unsubs.push(controller.on("holdSpeedEnd", function () {
|
|
251
|
+
setState(function (prev) {
|
|
252
|
+
return _objectSpread2(_objectSpread2({}, prev), {}, {
|
|
253
|
+
isHoldingSpeed: false
|
|
254
|
+
});
|
|
255
|
+
});
|
|
256
|
+
}));
|
|
257
|
+
unsubs.push(controller.on("hoverStart", function () {
|
|
258
|
+
setState(function (prev) {
|
|
259
|
+
return _objectSpread2(_objectSpread2({}, prev), {}, {
|
|
260
|
+
isHovering: true,
|
|
261
|
+
shouldShowControls: true
|
|
262
|
+
});
|
|
263
|
+
});
|
|
264
|
+
}));
|
|
265
|
+
unsubs.push(controller.on("hoverEnd", function () {
|
|
266
|
+
setState(function (prev) {
|
|
267
|
+
return _objectSpread2(_objectSpread2({}, prev), {}, {
|
|
268
|
+
isHovering: false,
|
|
269
|
+
shouldShowControls: controller.shouldShowControls()
|
|
270
|
+
});
|
|
271
|
+
});
|
|
272
|
+
}));
|
|
273
|
+
unsubs.push(controller.on("captionsChange", function (_ref10) {
|
|
274
|
+
var enabled = _ref10.enabled;
|
|
275
|
+
setState(function (prev) {
|
|
276
|
+
return _objectSpread2(_objectSpread2({}, prev), {}, {
|
|
277
|
+
subtitlesEnabled: enabled
|
|
278
|
+
});
|
|
279
|
+
});
|
|
280
|
+
}));
|
|
281
|
+
// Error handling events - show toasts/modals
|
|
282
|
+
unsubs.push(controller.on("protocolSwapped", function (data) {
|
|
283
|
+
var message = "Switched to ".concat(data.toProtocol);
|
|
284
|
+
setState(function (prev) {
|
|
285
|
+
return _objectSpread2(_objectSpread2({}, prev), {}, {
|
|
286
|
+
toast: {
|
|
287
|
+
message: message,
|
|
288
|
+
timestamp: Date.now()
|
|
289
|
+
}
|
|
290
|
+
});
|
|
291
|
+
});
|
|
292
|
+
onProtocolSwapped === null || onProtocolSwapped === void 0 || onProtocolSwapped(data);
|
|
293
|
+
}));
|
|
294
|
+
unsubs.push(controller.on("playbackFailed", function (data) {
|
|
295
|
+
setState(function (prev) {
|
|
296
|
+
var _data$details;
|
|
297
|
+
return _objectSpread2(_objectSpread2({}, prev), {}, {
|
|
298
|
+
error: data.message,
|
|
299
|
+
errorDetails: (_data$details = data.details) !== null && _data$details !== void 0 ? _data$details : null,
|
|
300
|
+
isPassiveError: false
|
|
301
|
+
});
|
|
302
|
+
});
|
|
303
|
+
onPlaybackFailed === null || onPlaybackFailed === void 0 || onPlaybackFailed({
|
|
304
|
+
code: data.code,
|
|
305
|
+
message: data.message,
|
|
306
|
+
details: data.details
|
|
307
|
+
});
|
|
308
|
+
}));
|
|
309
|
+
// Attach controller to container
|
|
310
|
+
// Note: Video event listeners are set up in the 'ready' handler above
|
|
311
|
+
controller.attach(container)["catch"](function (err) {
|
|
312
|
+
console.warn("[usePlayerController] Attach failed:", err);
|
|
313
|
+
});
|
|
314
|
+
// Set initial state
|
|
315
|
+
setState(function (prev) {
|
|
316
|
+
return _objectSpread2(_objectSpread2({}, prev), {}, {
|
|
317
|
+
isLoopEnabled: controller.isLoopEnabled()
|
|
318
|
+
});
|
|
319
|
+
});
|
|
320
|
+
return function () {
|
|
321
|
+
unsubs.forEach(function (fn) {
|
|
322
|
+
return fn();
|
|
323
|
+
});
|
|
324
|
+
controller.destroy();
|
|
325
|
+
controllerRef.current = null;
|
|
326
|
+
setState(initialState);
|
|
327
|
+
};
|
|
328
|
+
}, [enabled, config.contentId, config.contentType]); // Re-create on content change
|
|
329
|
+
// Stable action callbacks
|
|
330
|
+
var play = useCallback(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {
|
|
331
|
+
var _controllerRef$curren3;
|
|
332
|
+
return _regenerator().w(function (_context) {
|
|
333
|
+
while (1) switch (_context.n) {
|
|
334
|
+
case 0:
|
|
335
|
+
_context.n = 1;
|
|
336
|
+
return (_controllerRef$curren3 = controllerRef.current) === null || _controllerRef$curren3 === void 0 ? void 0 : _controllerRef$curren3.play();
|
|
337
|
+
case 1:
|
|
338
|
+
return _context.a(2);
|
|
339
|
+
}
|
|
340
|
+
}, _callee);
|
|
341
|
+
})), []);
|
|
342
|
+
var pause = useCallback(function () {
|
|
343
|
+
var _controllerRef$curren4;
|
|
344
|
+
(_controllerRef$curren4 = controllerRef.current) === null || _controllerRef$curren4 === void 0 || _controllerRef$curren4.pause();
|
|
345
|
+
}, []);
|
|
346
|
+
var togglePlay = useCallback(function () {
|
|
347
|
+
var _controllerRef$curren5;
|
|
348
|
+
(_controllerRef$curren5 = controllerRef.current) === null || _controllerRef$curren5 === void 0 || _controllerRef$curren5.togglePlay();
|
|
349
|
+
}, []);
|
|
350
|
+
var seek = useCallback(function (time) {
|
|
351
|
+
var _controllerRef$curren6;
|
|
352
|
+
(_controllerRef$curren6 = controllerRef.current) === null || _controllerRef$curren6 === void 0 || _controllerRef$curren6.seek(time);
|
|
353
|
+
}, []);
|
|
354
|
+
var seekBy = useCallback(function (delta) {
|
|
355
|
+
var _controllerRef$curren7;
|
|
356
|
+
(_controllerRef$curren7 = controllerRef.current) === null || _controllerRef$curren7 === void 0 || _controllerRef$curren7.seekBy(delta);
|
|
357
|
+
}, []);
|
|
358
|
+
var setVolume = useCallback(function (volume) {
|
|
359
|
+
var _controllerRef$curren8;
|
|
360
|
+
(_controllerRef$curren8 = controllerRef.current) === null || _controllerRef$curren8 === void 0 || _controllerRef$curren8.setVolume(volume);
|
|
361
|
+
}, []);
|
|
362
|
+
var toggleMute = useCallback(function () {
|
|
363
|
+
var _controllerRef$curren9;
|
|
364
|
+
(_controllerRef$curren9 = controllerRef.current) === null || _controllerRef$curren9 === void 0 || _controllerRef$curren9.toggleMute();
|
|
365
|
+
}, []);
|
|
366
|
+
var toggleLoop = useCallback(function () {
|
|
367
|
+
var _controllerRef$curren0;
|
|
368
|
+
(_controllerRef$curren0 = controllerRef.current) === null || _controllerRef$curren0 === void 0 || _controllerRef$curren0.toggleLoop();
|
|
369
|
+
}, []);
|
|
370
|
+
var toggleFullscreen = useCallback(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2() {
|
|
371
|
+
var _controllerRef$curren1;
|
|
372
|
+
return _regenerator().w(function (_context2) {
|
|
373
|
+
while (1) switch (_context2.n) {
|
|
374
|
+
case 0:
|
|
375
|
+
_context2.n = 1;
|
|
376
|
+
return (_controllerRef$curren1 = controllerRef.current) === null || _controllerRef$curren1 === void 0 ? void 0 : _controllerRef$curren1.toggleFullscreen();
|
|
377
|
+
case 1:
|
|
378
|
+
return _context2.a(2);
|
|
379
|
+
}
|
|
380
|
+
}, _callee2);
|
|
381
|
+
})), []);
|
|
382
|
+
var togglePiP = useCallback(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3() {
|
|
383
|
+
var _controllerRef$curren10;
|
|
384
|
+
return _regenerator().w(function (_context3) {
|
|
385
|
+
while (1) switch (_context3.n) {
|
|
386
|
+
case 0:
|
|
387
|
+
_context3.n = 1;
|
|
388
|
+
return (_controllerRef$curren10 = controllerRef.current) === null || _controllerRef$curren10 === void 0 ? void 0 : _controllerRef$curren10.togglePictureInPicture();
|
|
389
|
+
case 1:
|
|
390
|
+
return _context3.a(2);
|
|
391
|
+
}
|
|
392
|
+
}, _callee3);
|
|
393
|
+
})), []);
|
|
394
|
+
var toggleSubtitles = useCallback(function () {
|
|
395
|
+
var _controllerRef$curren11;
|
|
396
|
+
(_controllerRef$curren11 = controllerRef.current) === null || _controllerRef$curren11 === void 0 || _controllerRef$curren11.toggleSubtitles();
|
|
397
|
+
}, []);
|
|
398
|
+
var clearError = useCallback(function () {
|
|
399
|
+
var _controllerRef$curren12;
|
|
400
|
+
(_controllerRef$curren12 = controllerRef.current) === null || _controllerRef$curren12 === void 0 || _controllerRef$curren12.clearError();
|
|
401
|
+
setState(function (prev) {
|
|
402
|
+
return _objectSpread2(_objectSpread2({}, prev), {}, {
|
|
403
|
+
error: null,
|
|
404
|
+
errorDetails: null,
|
|
405
|
+
isPassiveError: false
|
|
406
|
+
});
|
|
407
|
+
});
|
|
408
|
+
}, []);
|
|
409
|
+
var dismissToast = useCallback(function () {
|
|
410
|
+
setState(function (prev) {
|
|
411
|
+
return _objectSpread2(_objectSpread2({}, prev), {}, {
|
|
412
|
+
toast: null
|
|
413
|
+
});
|
|
414
|
+
});
|
|
415
|
+
}, []);
|
|
416
|
+
var jumpToLive = useCallback(function () {
|
|
417
|
+
var _controllerRef$curren13;
|
|
418
|
+
(_controllerRef$curren13 = controllerRef.current) === null || _controllerRef$curren13 === void 0 || _controllerRef$curren13.jumpToLive();
|
|
419
|
+
}, []);
|
|
420
|
+
var retry = useCallback(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee4() {
|
|
421
|
+
var _controllerRef$curren14;
|
|
422
|
+
return _regenerator().w(function (_context4) {
|
|
423
|
+
while (1) switch (_context4.n) {
|
|
424
|
+
case 0:
|
|
425
|
+
_context4.n = 1;
|
|
426
|
+
return (_controllerRef$curren14 = controllerRef.current) === null || _controllerRef$curren14 === void 0 ? void 0 : _controllerRef$curren14.retry();
|
|
427
|
+
case 1:
|
|
428
|
+
return _context4.a(2);
|
|
429
|
+
}
|
|
430
|
+
}, _callee4);
|
|
431
|
+
})), []);
|
|
432
|
+
var reload = useCallback(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee5() {
|
|
433
|
+
var _controllerRef$curren15;
|
|
434
|
+
return _regenerator().w(function (_context5) {
|
|
435
|
+
while (1) switch (_context5.n) {
|
|
436
|
+
case 0:
|
|
437
|
+
_context5.n = 1;
|
|
438
|
+
return (_controllerRef$curren15 = controllerRef.current) === null || _controllerRef$curren15 === void 0 ? void 0 : _controllerRef$curren15.reload();
|
|
439
|
+
case 1:
|
|
440
|
+
return _context5.a(2);
|
|
441
|
+
}
|
|
442
|
+
}, _callee5);
|
|
443
|
+
})), []);
|
|
444
|
+
var getQualities = useCallback(function () {
|
|
445
|
+
var _controllerRef$curren16, _controllerRef$curren17;
|
|
446
|
+
return (_controllerRef$curren16 = (_controllerRef$curren17 = controllerRef.current) === null || _controllerRef$curren17 === void 0 ? void 0 : _controllerRef$curren17.getQualities()) !== null && _controllerRef$curren16 !== void 0 ? _controllerRef$curren16 : [];
|
|
447
|
+
}, []);
|
|
448
|
+
var selectQuality = useCallback(function (id) {
|
|
449
|
+
var _controllerRef$curren18;
|
|
450
|
+
(_controllerRef$curren18 = controllerRef.current) === null || _controllerRef$curren18 === void 0 || _controllerRef$curren18.selectQuality(id);
|
|
451
|
+
}, []);
|
|
452
|
+
var handleMouseEnter = useCallback(function () {
|
|
453
|
+
var _controllerRef$curren19;
|
|
454
|
+
(_controllerRef$curren19 = controllerRef.current) === null || _controllerRef$curren19 === void 0 || _controllerRef$curren19.handleMouseEnter();
|
|
455
|
+
}, []);
|
|
456
|
+
var handleMouseLeave = useCallback(function () {
|
|
457
|
+
var _controllerRef$curren20;
|
|
458
|
+
(_controllerRef$curren20 = controllerRef.current) === null || _controllerRef$curren20 === void 0 || _controllerRef$curren20.handleMouseLeave();
|
|
459
|
+
}, []);
|
|
460
|
+
var handleMouseMove = useCallback(function () {
|
|
461
|
+
var _controllerRef$curren21;
|
|
462
|
+
(_controllerRef$curren21 = controllerRef.current) === null || _controllerRef$curren21 === void 0 || _controllerRef$curren21.handleMouseMove();
|
|
463
|
+
}, []);
|
|
464
|
+
var handleTouchStart = useCallback(function () {
|
|
465
|
+
var _controllerRef$curren22;
|
|
466
|
+
(_controllerRef$curren22 = controllerRef.current) === null || _controllerRef$curren22 === void 0 || _controllerRef$curren22.handleTouchStart();
|
|
467
|
+
}, []);
|
|
468
|
+
var setDevModeOptions = useCallback(/*#__PURE__*/function () {
|
|
469
|
+
var _ref16 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee6(options) {
|
|
470
|
+
var _controllerRef$curren23;
|
|
471
|
+
return _regenerator().w(function (_context6) {
|
|
472
|
+
while (1) switch (_context6.n) {
|
|
473
|
+
case 0:
|
|
474
|
+
_context6.n = 1;
|
|
475
|
+
return (_controllerRef$curren23 = controllerRef.current) === null || _controllerRef$curren23 === void 0 ? void 0 : _controllerRef$curren23.setDevModeOptions(options);
|
|
476
|
+
case 1:
|
|
477
|
+
return _context6.a(2);
|
|
478
|
+
}
|
|
479
|
+
}, _callee6);
|
|
480
|
+
}));
|
|
481
|
+
return function (_x) {
|
|
482
|
+
return _ref16.apply(this, arguments);
|
|
483
|
+
};
|
|
484
|
+
}(), []);
|
|
485
|
+
return {
|
|
486
|
+
containerRef: containerRef,
|
|
487
|
+
state: state,
|
|
488
|
+
controller: controllerRef.current,
|
|
489
|
+
play: play,
|
|
490
|
+
pause: pause,
|
|
491
|
+
togglePlay: togglePlay,
|
|
492
|
+
seek: seek,
|
|
493
|
+
seekBy: seekBy,
|
|
494
|
+
jumpToLive: jumpToLive,
|
|
495
|
+
setVolume: setVolume,
|
|
496
|
+
toggleMute: toggleMute,
|
|
497
|
+
toggleLoop: toggleLoop,
|
|
498
|
+
toggleFullscreen: toggleFullscreen,
|
|
499
|
+
togglePiP: togglePiP,
|
|
500
|
+
toggleSubtitles: toggleSubtitles,
|
|
501
|
+
clearError: clearError,
|
|
502
|
+
dismissToast: dismissToast,
|
|
503
|
+
retry: retry,
|
|
504
|
+
reload: reload,
|
|
505
|
+
getQualities: getQualities,
|
|
506
|
+
selectQuality: selectQuality,
|
|
507
|
+
handleMouseEnter: handleMouseEnter,
|
|
508
|
+
handleMouseLeave: handleMouseLeave,
|
|
509
|
+
handleMouseMove: handleMouseMove,
|
|
510
|
+
handleTouchStart: handleTouchStart,
|
|
511
|
+
setDevModeOptions: setDevModeOptions
|
|
512
|
+
};
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
export { usePlayerController };
|
|
516
|
+
//# sourceMappingURL=usePlayerController.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usePlayerController.js","sources":["../../../../src/hooks/usePlayerController.ts"],"sourcesContent":["/**\n * usePlayerController.ts\n *\n * React hook that wraps PlayerController for declarative usage.\n * Manages the complete player lifecycle and provides reactive state.\n */\n\nimport { useState, useEffect, useRef, useCallback } from \"react\";\nimport {\n PlayerController,\n type PlayerControllerConfig,\n type PlayerState,\n type StreamState,\n type StreamInfo,\n type PlaybackQuality,\n type ContentEndpoints,\n type ContentMetadata,\n type ClassifiedError,\n} from \"@livepeer-frameworks/player-core\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface UsePlayerControllerConfig extends Omit<PlayerControllerConfig, \"playerManager\"> {\n /** Enable/disable the hook */\n enabled?: boolean;\n /** Callback when state changes */\n onStateChange?: (state: PlayerState) => void;\n /** Callback when stream state changes */\n onStreamStateChange?: (state: StreamState) => void;\n /** Callback when error occurs */\n onError?: (error: string) => void;\n /** Callback when ready */\n onReady?: (videoElement: HTMLVideoElement) => void;\n /** Callback when protocol is swapped (for toast notification) */\n onProtocolSwapped?: (data: {\n fromPlayer: string;\n toPlayer: string;\n fromProtocol: string;\n toProtocol: string;\n reason: string;\n }) => void;\n /** Callback when playback fails after all recovery attempts (for error modal) */\n onPlaybackFailed?: (error: {\n code: string;\n message: string;\n details?: ClassifiedError[\"details\"];\n }) => void;\n}\n\nexport interface PlayerControllerState {\n /** Current player state */\n state: PlayerState;\n /** Stream state (for live streams) */\n streamState: StreamState | null;\n /** Resolved endpoints */\n endpoints: ContentEndpoints | null;\n /** Content metadata */\n metadata: ContentMetadata | null;\n /** Video element (null if not ready) */\n videoElement: HTMLVideoElement | null;\n /** Current time */\n currentTime: number;\n /** Duration */\n duration: number;\n /** Is playing */\n isPlaying: boolean;\n /** Is paused */\n isPaused: boolean;\n /** Is buffering */\n isBuffering: boolean;\n /** Is muted */\n isMuted: boolean;\n /** Volume (0-1) */\n volume: number;\n /** Error text */\n error: string | null;\n /** Error details for debugging */\n errorDetails: ClassifiedError[\"details\"] | null;\n /** Is passive error */\n isPassiveError: boolean;\n /** Has playback ever started */\n hasPlaybackStarted: boolean;\n /** Is holding speed (2x gesture) */\n isHoldingSpeed: boolean;\n /** Current hold speed */\n holdSpeed: number;\n /** Is hovering (controls visible) */\n isHovering: boolean;\n /** Should show controls */\n shouldShowControls: boolean;\n /** Is loop enabled */\n isLoopEnabled: boolean;\n /** Is fullscreen */\n isFullscreen: boolean;\n /** Is PiP active */\n isPiPActive: boolean;\n /** Is effectively live (live or DVR recording) */\n isEffectivelyLive: boolean;\n /** Should show idle screen */\n shouldShowIdleScreen: boolean;\n /** Current player info */\n currentPlayerInfo: { name: string; shortname: string } | null;\n /** Current source info */\n currentSourceInfo: { url: string; type: string } | null;\n /** Playback quality metrics */\n playbackQuality: PlaybackQuality | null;\n /** Subtitles enabled */\n subtitlesEnabled: boolean;\n /** Available quality levels */\n qualities: Array<{\n id: string;\n label: string;\n bitrate?: number;\n width?: number;\n height?: number;\n isAuto?: boolean;\n active?: boolean;\n }>;\n /** Available text/caption tracks */\n textTracks: Array<{ id: string; label: string; language?: string; active: boolean }>;\n /** Stream info for player selection (sources + tracks) */\n streamInfo: StreamInfo | null;\n /** Toast message to display (auto-dismisses) */\n toast: { message: string; timestamp: number } | null;\n}\n\nexport interface UsePlayerControllerReturn {\n /** Container ref to attach to your player container div */\n containerRef: React.RefObject<HTMLDivElement | null>;\n /** Current state (reactive) */\n state: PlayerControllerState;\n /** Controller instance (for direct method calls) */\n controller: PlayerController | null;\n /** Play */\n play: () => Promise<void>;\n /** Pause */\n pause: () => void;\n /** Toggle play/pause */\n togglePlay: () => void;\n /** Seek to time */\n seek: (time: number) => void;\n /** Seek by delta */\n seekBy: (delta: number) => void;\n /** Jump to live edge (for live streams) */\n jumpToLive: () => void;\n /** Set volume */\n setVolume: (volume: number) => void;\n /** Toggle mute */\n toggleMute: () => void;\n /** Toggle loop */\n toggleLoop: () => void;\n /** Toggle fullscreen */\n toggleFullscreen: () => Promise<void>;\n /** Toggle PiP */\n togglePiP: () => Promise<void>;\n /** Toggle subtitles */\n toggleSubtitles: () => void;\n /** Clear error */\n clearError: () => void;\n /** Dismiss toast notification */\n dismissToast: () => void;\n /** Retry playback */\n retry: () => Promise<void>;\n /** Reload player */\n reload: () => Promise<void>;\n /** Get qualities */\n getQualities: () => Array<{ id: string; label: string; bitrate?: number }>;\n /** Select quality */\n selectQuality: (id: string) => void;\n /** Handle mouse enter (for controls visibility) */\n handleMouseEnter: () => void;\n /** Handle mouse leave (for controls visibility) */\n handleMouseLeave: () => void;\n /** Handle mouse move (for controls visibility) */\n handleMouseMove: () => void;\n /** Handle touch start (for controls visibility) */\n handleTouchStart: () => void;\n /** Set dev mode options (force player, type, source) */\n setDevModeOptions: (options: {\n forcePlayer?: string;\n forceType?: string;\n forceSource?: number;\n playbackMode?: \"auto\" | \"low-latency\" | \"quality\" | \"vod\";\n }) => Promise<void>;\n}\n\n// ============================================================================\n// Initial State\n// ============================================================================\n\nconst initialState: PlayerControllerState = {\n state: \"booting\",\n streamState: null,\n endpoints: null,\n metadata: null,\n videoElement: null,\n currentTime: 0,\n duration: NaN,\n isPlaying: false,\n isPaused: true,\n isBuffering: false,\n isMuted: true,\n volume: 1,\n error: null,\n errorDetails: null,\n isPassiveError: false,\n hasPlaybackStarted: false,\n isHoldingSpeed: false,\n holdSpeed: 2,\n isHovering: false,\n shouldShowControls: false,\n isLoopEnabled: false,\n isFullscreen: false,\n isPiPActive: false,\n isEffectivelyLive: false,\n shouldShowIdleScreen: true,\n currentPlayerInfo: null,\n currentSourceInfo: null,\n playbackQuality: null,\n subtitlesEnabled: false,\n qualities: [],\n textTracks: [],\n streamInfo: null,\n toast: null,\n};\n\n// ============================================================================\n// Hook\n// ============================================================================\n\nexport function usePlayerController(config: UsePlayerControllerConfig): UsePlayerControllerReturn {\n const {\n enabled = true,\n onStateChange,\n onStreamStateChange,\n onError,\n onReady,\n onProtocolSwapped,\n onPlaybackFailed,\n ...controllerConfig\n } = config;\n\n const containerRef = useRef<HTMLDivElement>(null);\n const controllerRef = useRef<PlayerController | null>(null);\n const [state, setState] = useState<PlayerControllerState>(initialState);\n\n // Stable config ref for effect dependencies\n const configRef = useRef(controllerConfig);\n configRef.current = controllerConfig;\n\n // Create and attach controller\n useEffect(() => {\n if (!enabled) return;\n\n const container = containerRef.current;\n if (!container) return;\n\n // Create controller\n const controller = new PlayerController({\n contentId: configRef.current.contentId,\n contentType: configRef.current.contentType,\n endpoints: configRef.current.endpoints,\n gatewayUrl: configRef.current.gatewayUrl,\n mistUrl: configRef.current.mistUrl,\n authToken: configRef.current.authToken,\n autoplay: configRef.current.autoplay,\n muted: configRef.current.muted,\n controls: configRef.current.controls,\n poster: configRef.current.poster,\n debug: configRef.current.debug,\n });\n\n controllerRef.current = controller;\n\n // Subscribe to events\n const unsubs: Array<() => void> = [];\n\n // Sync state from controller - called on video events\n const syncState = () => {\n if (!controllerRef.current) return;\n const c = controllerRef.current;\n setState((prev) => ({\n ...prev,\n isPlaying: c.isPlaying(),\n isPaused: c.isPaused(),\n isBuffering: c.isBuffering(),\n isMuted: c.isMuted(),\n volume: c.getVolume(),\n hasPlaybackStarted: c.hasPlaybackStarted(),\n shouldShowControls: c.shouldShowControls(),\n shouldShowIdleScreen: c.shouldShowIdleScreen(),\n playbackQuality: c.getPlaybackQuality(),\n isLoopEnabled: c.isLoopEnabled(),\n subtitlesEnabled: c.isSubtitlesEnabled(),\n qualities: c.getQualities(),\n streamInfo: c.getStreamInfo(),\n }));\n };\n\n unsubs.push(\n controller.on(\"stateChange\", ({ state: newState }) => {\n setState((prev) => ({ ...prev, state: newState }));\n onStateChange?.(newState);\n })\n );\n\n unsubs.push(\n controller.on(\"streamStateChange\", ({ state: streamState }) => {\n setState((prev) => ({\n ...prev,\n streamState,\n metadata: controller.getMetadata(),\n isEffectivelyLive: controller.isEffectivelyLive(),\n shouldShowIdleScreen: controller.shouldShowIdleScreen(),\n }));\n onStreamStateChange?.(streamState);\n })\n );\n\n unsubs.push(\n controller.on(\"timeUpdate\", ({ currentTime, duration }) => {\n setState((prev) => ({ ...prev, currentTime, duration }));\n })\n );\n\n unsubs.push(\n controller.on(\"error\", ({ error }) => {\n setState((prev) => ({\n ...prev,\n error,\n isPassiveError: controller.isPassiveError(),\n }));\n onError?.(error);\n })\n );\n\n unsubs.push(\n controller.on(\"errorCleared\", () => {\n setState((prev) => ({ ...prev, error: null, isPassiveError: false }));\n })\n );\n\n unsubs.push(\n controller.on(\"ready\", ({ videoElement }) => {\n setState((prev) => ({\n ...prev,\n videoElement,\n endpoints: controller.getEndpoints(),\n metadata: controller.getMetadata(),\n streamInfo: controller.getStreamInfo(),\n isEffectivelyLive: controller.isEffectivelyLive(),\n shouldShowIdleScreen: controller.shouldShowIdleScreen(),\n currentPlayerInfo: controller.getCurrentPlayerInfo(),\n currentSourceInfo: controller.getCurrentSourceInfo(),\n qualities: controller.getQualities(),\n }));\n onReady?.(videoElement);\n\n // Set up video event listeners AFTER video is ready\n // syncState is defined below - this closure captures it\n const handleVideoEvent = () => {\n if (controllerRef.current?.shouldSuppressVideoEvents?.()) return;\n syncState();\n };\n videoElement.addEventListener(\"play\", handleVideoEvent);\n videoElement.addEventListener(\"pause\", handleVideoEvent);\n videoElement.addEventListener(\"waiting\", handleVideoEvent);\n videoElement.addEventListener(\"playing\", handleVideoEvent);\n unsubs.push(() => {\n videoElement.removeEventListener(\"play\", handleVideoEvent);\n videoElement.removeEventListener(\"pause\", handleVideoEvent);\n videoElement.removeEventListener(\"waiting\", handleVideoEvent);\n videoElement.removeEventListener(\"playing\", handleVideoEvent);\n });\n })\n );\n\n unsubs.push(\n controller.on(\"playerSelected\", ({ player: _player, source }) => {\n setState((prev) => ({\n ...prev,\n currentPlayerInfo: controller.getCurrentPlayerInfo(),\n currentSourceInfo: { url: source.url, type: source.type },\n qualities: controller.getQualities(),\n }));\n })\n );\n\n unsubs.push(\n controller.on(\"volumeChange\", ({ volume, muted }) => {\n setState((prev) => ({ ...prev, volume, isMuted: muted }));\n })\n );\n\n unsubs.push(\n controller.on(\"loopChange\", ({ isLoopEnabled }) => {\n setState((prev) => ({ ...prev, isLoopEnabled }));\n })\n );\n\n unsubs.push(\n controller.on(\"fullscreenChange\", ({ isFullscreen }) => {\n setState((prev) => ({ ...prev, isFullscreen }));\n })\n );\n\n unsubs.push(\n controller.on(\"pipChange\", ({ isPiP }) => {\n setState((prev) => ({ ...prev, isPiPActive: isPiP }));\n })\n );\n\n unsubs.push(\n controller.on(\"holdSpeedStart\", ({ speed }) => {\n setState((prev) => ({ ...prev, isHoldingSpeed: true, holdSpeed: speed }));\n })\n );\n\n unsubs.push(\n controller.on(\"holdSpeedEnd\", () => {\n setState((prev) => ({ ...prev, isHoldingSpeed: false }));\n })\n );\n\n unsubs.push(\n controller.on(\"hoverStart\", () => {\n setState((prev) => ({ ...prev, isHovering: true, shouldShowControls: true }));\n })\n );\n\n unsubs.push(\n controller.on(\"hoverEnd\", () => {\n setState((prev) => ({\n ...prev,\n isHovering: false,\n shouldShowControls: controller.shouldShowControls(),\n }));\n })\n );\n\n unsubs.push(\n controller.on(\"captionsChange\", ({ enabled }) => {\n setState((prev) => ({ ...prev, subtitlesEnabled: enabled }));\n })\n );\n\n // Error handling events - show toasts/modals\n unsubs.push(\n controller.on(\"protocolSwapped\", (data) => {\n const message = `Switched to ${data.toProtocol}`;\n setState((prev) => ({ ...prev, toast: { message, timestamp: Date.now() } }));\n onProtocolSwapped?.(data);\n })\n );\n\n unsubs.push(\n controller.on(\"playbackFailed\", (data) => {\n setState((prev) => ({\n ...prev,\n error: data.message,\n errorDetails: data.details ?? null,\n isPassiveError: false,\n }));\n onPlaybackFailed?.({\n code: data.code,\n message: data.message,\n details: data.details,\n });\n })\n );\n\n // Attach controller to container\n // Note: Video event listeners are set up in the 'ready' handler above\n controller.attach(container).catch((err) => {\n console.warn(\"[usePlayerController] Attach failed:\", err);\n });\n\n // Set initial state\n setState((prev) => ({\n ...prev,\n isLoopEnabled: controller.isLoopEnabled(),\n }));\n\n return () => {\n unsubs.forEach((fn) => fn());\n controller.destroy();\n controllerRef.current = null;\n setState(initialState);\n };\n }, [enabled, config.contentId, config.contentType]); // Re-create on content change\n\n // Stable action callbacks\n const play = useCallback(async () => {\n await controllerRef.current?.play();\n }, []);\n\n const pause = useCallback(() => {\n controllerRef.current?.pause();\n }, []);\n\n const togglePlay = useCallback(() => {\n controllerRef.current?.togglePlay();\n }, []);\n\n const seek = useCallback((time: number) => {\n controllerRef.current?.seek(time);\n }, []);\n\n const seekBy = useCallback((delta: number) => {\n controllerRef.current?.seekBy(delta);\n }, []);\n\n const setVolume = useCallback((volume: number) => {\n controllerRef.current?.setVolume(volume);\n }, []);\n\n const toggleMute = useCallback(() => {\n controllerRef.current?.toggleMute();\n }, []);\n\n const toggleLoop = useCallback(() => {\n controllerRef.current?.toggleLoop();\n }, []);\n\n const toggleFullscreen = useCallback(async () => {\n await controllerRef.current?.toggleFullscreen();\n }, []);\n\n const togglePiP = useCallback(async () => {\n await controllerRef.current?.togglePictureInPicture();\n }, []);\n\n const toggleSubtitles = useCallback(() => {\n controllerRef.current?.toggleSubtitles();\n }, []);\n\n const clearError = useCallback(() => {\n controllerRef.current?.clearError();\n setState((prev) => ({\n ...prev,\n error: null,\n errorDetails: null,\n isPassiveError: false,\n }));\n }, []);\n\n const dismissToast = useCallback(() => {\n setState((prev) => ({ ...prev, toast: null }));\n }, []);\n\n const jumpToLive = useCallback(() => {\n controllerRef.current?.jumpToLive();\n }, []);\n\n const retry = useCallback(async () => {\n await controllerRef.current?.retry();\n }, []);\n\n const reload = useCallback(async () => {\n await controllerRef.current?.reload();\n }, []);\n\n const getQualities = useCallback(() => {\n return controllerRef.current?.getQualities() ?? [];\n }, []);\n\n const selectQuality = useCallback((id: string) => {\n controllerRef.current?.selectQuality(id);\n }, []);\n\n const handleMouseEnter = useCallback(() => {\n controllerRef.current?.handleMouseEnter();\n }, []);\n\n const handleMouseLeave = useCallback(() => {\n controllerRef.current?.handleMouseLeave();\n }, []);\n\n const handleMouseMove = useCallback(() => {\n controllerRef.current?.handleMouseMove();\n }, []);\n\n const handleTouchStart = useCallback(() => {\n controllerRef.current?.handleTouchStart();\n }, []);\n\n const setDevModeOptions = useCallback(\n async (options: {\n forcePlayer?: string;\n forceType?: string;\n forceSource?: number;\n playbackMode?: \"auto\" | \"low-latency\" | \"quality\" | \"vod\";\n }) => {\n await controllerRef.current?.setDevModeOptions(options);\n },\n []\n );\n\n return {\n containerRef,\n state,\n controller: controllerRef.current,\n play,\n pause,\n togglePlay,\n seek,\n seekBy,\n jumpToLive,\n setVolume,\n toggleMute,\n toggleLoop,\n toggleFullscreen,\n togglePiP,\n toggleSubtitles,\n clearError,\n dismissToast,\n retry,\n reload,\n getQualities,\n selectQuality,\n handleMouseEnter,\n handleMouseLeave,\n handleMouseMove,\n handleTouchStart,\n setDevModeOptions,\n };\n}\n\nexport default usePlayerController;\n"],"names":["initialState","state","streamState","endpoints","metadata","videoElement","currentTime","duration","NaN","isPlaying","isPaused","isBuffering","isMuted","volume","error","errorDetails","isPassiveError","hasPlaybackStarted","isHoldingSpeed","holdSpeed","isHovering","shouldShowControls","isLoopEnabled","isFullscreen","isPiPActive","isEffectivelyLive","shouldShowIdleScreen","currentPlayerInfo","currentSourceInfo","playbackQuality","subtitlesEnabled","qualities","textTracks","streamInfo","toast","usePlayerController","config","_config$enabled","enabled","onStateChange","onStreamStateChange","onError","onReady","onProtocolSwapped","onPlaybackFailed","controllerConfig","_objectWithoutProperties","_excluded","containerRef","useRef","controllerRef","_useState","useState","_useState2","_slicedToArray","setState","configRef","current","useEffect","container","controller","PlayerController","contentId","contentType","gatewayUrl","mistUrl","authToken","autoplay","muted","controls","poster","debug","unsubs","syncState","c","prev","_objectSpread","getVolume","getPlaybackQuality","isSubtitlesEnabled","getQualities","getStreamInfo","push","on","_ref","newState","_ref2","getMetadata","_ref3","_ref4","_ref5","getEndpoints","getCurrentPlayerInfo","getCurrentSourceInfo","handleVideoEvent","_controllerRef$curren","_controllerRef$curren2","shouldSuppressVideoEvents","call","addEventListener","removeEventListener","_ref6","player","source","url","type","_ref7","_ref8","_ref9","_ref0","isPiP","_ref1","speed","_ref10","data","message","concat","toProtocol","timestamp","Date","now","_data$details","details","code","attach","err","console","warn","forEach","fn","destroy","play","useCallback","_asyncToGenerator","_regenerator","m","_callee","_controllerRef$curren3","w","_context","n","a","pause","_controllerRef$curren4","togglePlay","_controllerRef$curren5","seek","time","_controllerRef$curren6","seekBy","delta","_controllerRef$curren7","setVolume","_controllerRef$curren8","toggleMute","_controllerRef$curren9","toggleLoop","_controllerRef$curren0","toggleFullscreen","_callee2","_controllerRef$curren1","_context2","togglePiP","_callee3","_controllerRef$curren10","_context3","togglePictureInPicture","toggleSubtitles","_controllerRef$curren11","clearError","_controllerRef$curren12","dismissToast","jumpToLive","_controllerRef$curren13","retry","_callee4","_controllerRef$curren14","_context4","reload","_callee5","_controllerRef$curren15","_context5","_controllerRef$curren16","_controllerRef$curren17","selectQuality","id","_controllerRef$curren18","handleMouseEnter","_controllerRef$curren19","handleMouseLeave","_controllerRef$curren20","handleMouseMove","_controllerRef$curren21","handleTouchStart","_controllerRef$curren22","setDevModeOptions","_ref16","_callee6","options","_controllerRef$curren23","_context6","_x","apply","arguments"],"mappings":"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"}
|