@guardvideo/player-sdk 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,477 @@
1
+ import Hls from 'hls.js';
2
+ import React, { forwardRef, useRef, useState, useEffect, useImperativeHandle, useCallback } from 'react';
3
+
4
+ var PlayerState;
5
+ (function (PlayerState) {
6
+ PlayerState["IDLE"] = "idle";
7
+ PlayerState["LOADING"] = "loading";
8
+ PlayerState["READY"] = "ready";
9
+ PlayerState["PLAYING"] = "playing";
10
+ PlayerState["PAUSED"] = "paused";
11
+ PlayerState["BUFFERING"] = "buffering";
12
+ PlayerState["ERROR"] = "error";
13
+ })(PlayerState || (PlayerState = {}));
14
+
15
+ class GuardVideoPlayer {
16
+ constructor(videoElement, videoId, config) {
17
+ this.videoId = videoId;
18
+ this.hls = null;
19
+ this.state = PlayerState.IDLE;
20
+ this.embedToken = null;
21
+ this.currentQuality = null;
22
+ this.videoElement = videoElement;
23
+ this.config = {
24
+ embedTokenEndpoint: config.embedTokenEndpoint,
25
+ apiBaseUrl: config.apiBaseUrl || '',
26
+ debug: config.debug || false,
27
+ autoplay: config.autoplay || false,
28
+ controls: config.controls !== false,
29
+ className: config.className || '',
30
+ style: config.style || {},
31
+ hlsConfig: config.hlsConfig || {},
32
+ onReady: config.onReady || (() => { }),
33
+ onError: config.onError || (() => { }),
34
+ onQualityChange: config.onQualityChange || (() => { }),
35
+ onStateChange: config.onStateChange || (() => { }),
36
+ };
37
+ this.log('Initializing GuardVideo Player', { videoId, config });
38
+ this.initialize();
39
+ }
40
+ log(message, data) {
41
+ if (this.config.debug) {
42
+ console.log(`[GuardVideoPlayer] ${message}`, data || '');
43
+ }
44
+ }
45
+ error(message, data) {
46
+ console.error(`[GuardVideoPlayer] ${message}`, data || '');
47
+ }
48
+ setState(newState) {
49
+ if (this.state !== newState) {
50
+ this.state = newState;
51
+ this.config.onStateChange(newState);
52
+ this.log(`State changed to: ${newState}`);
53
+ }
54
+ }
55
+ async initialize() {
56
+ try {
57
+ this.setState(PlayerState.LOADING);
58
+ this.embedToken = await this.fetchEmbedToken();
59
+ this.log('Embed token received', this.embedToken);
60
+ await this.initializePlayer();
61
+ }
62
+ catch (err) {
63
+ this.handleError({
64
+ code: 'INIT_ERROR',
65
+ message: err.message || 'Failed to initialize player',
66
+ fatal: true,
67
+ details: err,
68
+ });
69
+ }
70
+ }
71
+ async fetchEmbedToken() {
72
+ const url = `${this.config.embedTokenEndpoint}/${this.videoId}`;
73
+ this.log('Fetching embed token from', url);
74
+ const response = await fetch(url, {
75
+ method: 'POST',
76
+ headers: {
77
+ 'Content-Type': 'application/json',
78
+ },
79
+ body: JSON.stringify({
80
+ allowedDomain: window.location.origin,
81
+ expiresInMinutes: 120,
82
+ maxViews: null,
83
+ }),
84
+ });
85
+ if (!response.ok) {
86
+ const errorData = await response.json().catch(() => ({}));
87
+ throw new Error(errorData.error || 'Failed to fetch embed token');
88
+ }
89
+ return await response.json();
90
+ }
91
+ async initializePlayer() {
92
+ if (!this.embedToken) {
93
+ throw new Error('No embed token available');
94
+ }
95
+ const playerUrl = this.embedToken.playerUrl;
96
+ this.log('Initializing player with URL', playerUrl);
97
+ this.videoElement.controls = this.config.controls;
98
+ if (this.config.className) {
99
+ this.videoElement.className = this.config.className;
100
+ }
101
+ Object.assign(this.videoElement.style, this.config.style);
102
+ if (Hls.isSupported()) {
103
+ this.initializeHls(playerUrl);
104
+ }
105
+ else if (this.videoElement.canPlayType('application/vnd.apple.mpegurl')) {
106
+ this.log('Using native HLS support');
107
+ this.videoElement.src = playerUrl;
108
+ this.setupVideoEventListeners();
109
+ this.setState(PlayerState.READY);
110
+ this.config.onReady();
111
+ }
112
+ else {
113
+ throw new Error('HLS is not supported in this browser');
114
+ }
115
+ }
116
+ initializeHls(playerUrl) {
117
+ this.log('Using HLS.js for adaptive streaming');
118
+ this.hls = new Hls({
119
+ debug: this.config.debug,
120
+ enableWorker: true,
121
+ lowLatencyMode: false,
122
+ ...this.config.hlsConfig,
123
+ });
124
+ this.hls.loadSource(playerUrl);
125
+ this.hls.attachMedia(this.videoElement);
126
+ this.hls.on(Hls.Events.MANIFEST_PARSED, (_event, data) => {
127
+ this.log('HLS manifest parsed', {
128
+ levels: data.levels.map((l) => `${l.height}p`),
129
+ });
130
+ this.setState(PlayerState.READY);
131
+ this.config.onReady();
132
+ if (this.config.autoplay) {
133
+ this.play();
134
+ }
135
+ });
136
+ this.hls.on(Hls.Events.LEVEL_SWITCHED, (_event, data) => {
137
+ const level = this.hls.levels[data.level];
138
+ const quality = {
139
+ index: data.level,
140
+ height: level.height,
141
+ width: level.width,
142
+ bitrate: level.bitrate,
143
+ name: `${level.height}p`,
144
+ };
145
+ this.currentQuality = quality;
146
+ this.log(`Quality switched to ${quality.name}`);
147
+ this.config.onQualityChange(quality.name);
148
+ });
149
+ this.hls.on(Hls.Events.ERROR, (_event, data) => {
150
+ this.error('HLS Error', data);
151
+ if (data.fatal) {
152
+ switch (data.type) {
153
+ case Hls.ErrorTypes.NETWORK_ERROR:
154
+ this.error('Network error, attempting recovery...');
155
+ setTimeout(() => this.hls?.startLoad(), 1000);
156
+ break;
157
+ case Hls.ErrorTypes.MEDIA_ERROR:
158
+ this.error('Media error, attempting recovery...');
159
+ this.hls?.recoverMediaError();
160
+ break;
161
+ default:
162
+ this.handleError({
163
+ code: data.type,
164
+ message: data.details,
165
+ fatal: true,
166
+ details: data,
167
+ });
168
+ break;
169
+ }
170
+ }
171
+ });
172
+ this.setupVideoEventListeners();
173
+ }
174
+ setupVideoEventListeners() {
175
+ this.videoElement.addEventListener('playing', () => {
176
+ this.setState(PlayerState.PLAYING);
177
+ });
178
+ this.videoElement.addEventListener('pause', () => {
179
+ this.setState(PlayerState.PAUSED);
180
+ });
181
+ this.videoElement.addEventListener('waiting', () => {
182
+ this.setState(PlayerState.BUFFERING);
183
+ });
184
+ this.videoElement.addEventListener('error', () => {
185
+ const error = this.videoElement.error;
186
+ if (error) {
187
+ const errorMessages = {
188
+ 1: 'Video loading aborted',
189
+ 2: 'Network error',
190
+ 3: 'Video decoding failed',
191
+ 4: 'Video format not supported',
192
+ };
193
+ this.handleError({
194
+ code: `MEDIA_ERROR_${error.code}`,
195
+ message: errorMessages[error.code] || 'Unknown media error',
196
+ fatal: true,
197
+ details: error,
198
+ });
199
+ }
200
+ });
201
+ }
202
+ handleError(error) {
203
+ this.setState(PlayerState.ERROR);
204
+ this.config.onError(error);
205
+ this.error('Player error', error);
206
+ }
207
+ async play() {
208
+ try {
209
+ await this.videoElement.play();
210
+ }
211
+ catch (err) {
212
+ this.log('Autoplay prevented or play failed', err);
213
+ throw err;
214
+ }
215
+ }
216
+ pause() {
217
+ this.videoElement.pause();
218
+ }
219
+ getCurrentTime() {
220
+ return this.videoElement.currentTime;
221
+ }
222
+ seek(time) {
223
+ this.videoElement.currentTime = time;
224
+ }
225
+ getDuration() {
226
+ return this.videoElement.duration || 0;
227
+ }
228
+ getVolume() {
229
+ return this.videoElement.volume;
230
+ }
231
+ setVolume(volume) {
232
+ this.videoElement.volume = Math.max(0, Math.min(1, volume));
233
+ }
234
+ getQualityLevels() {
235
+ if (!this.hls)
236
+ return [];
237
+ return this.hls.levels.map((level, index) => ({
238
+ index,
239
+ height: level.height,
240
+ width: level.width,
241
+ bitrate: level.bitrate,
242
+ name: `${level.height}p`,
243
+ }));
244
+ }
245
+ getCurrentQuality() {
246
+ return this.currentQuality;
247
+ }
248
+ setQuality(levelIndex) {
249
+ if (this.hls) {
250
+ this.hls.currentLevel = levelIndex;
251
+ this.log(`Quality set to level ${levelIndex}`);
252
+ }
253
+ }
254
+ getState() {
255
+ return this.state;
256
+ }
257
+ destroy() {
258
+ this.log('Destroying player');
259
+ if (this.hls) {
260
+ this.hls.destroy();
261
+ this.hls = null;
262
+ }
263
+ this.videoElement.removeAttribute('src');
264
+ this.videoElement.load();
265
+ this.setState(PlayerState.IDLE);
266
+ }
267
+ }
268
+
269
+ const GuardVideoPlayerComponent = forwardRef((props, ref) => {
270
+ const { videoId, width = '100%', height = 'auto', embedTokenEndpoint, apiBaseUrl, debug = false, autoplay = false, controls = true, className = '', style = {}, hlsConfig, onReady, onError, onQualityChange, onStateChange, onTimeUpdate, onEnded, } = props;
271
+ const videoRef = useRef(null);
272
+ const playerRef = useRef(null);
273
+ const [error, setError] = useState(null);
274
+ const [currentState, setCurrentState] = useState(PlayerState.IDLE);
275
+ useEffect(() => {
276
+ if (!videoRef.current || playerRef.current)
277
+ return;
278
+ const player = new GuardVideoPlayer(videoRef.current, videoId, {
279
+ embedTokenEndpoint,
280
+ apiBaseUrl,
281
+ debug,
282
+ autoplay,
283
+ controls,
284
+ className,
285
+ style,
286
+ hlsConfig,
287
+ onReady: () => {
288
+ onReady?.();
289
+ },
290
+ onError: (err) => {
291
+ setError(err);
292
+ onError?.(err);
293
+ },
294
+ onQualityChange: (quality) => {
295
+ onQualityChange?.(quality);
296
+ },
297
+ onStateChange: (state) => {
298
+ setCurrentState(state);
299
+ onStateChange?.(state);
300
+ },
301
+ });
302
+ playerRef.current = player;
303
+ return () => {
304
+ player.destroy();
305
+ playerRef.current = null;
306
+ };
307
+ }, [videoId, embedTokenEndpoint]);
308
+ useEffect(() => {
309
+ const video = videoRef.current;
310
+ if (!video)
311
+ return;
312
+ const handleTimeUpdate = () => {
313
+ if (onTimeUpdate) {
314
+ onTimeUpdate(video.currentTime);
315
+ }
316
+ };
317
+ const handleEnded = () => {
318
+ onEnded?.();
319
+ };
320
+ video.addEventListener('timeupdate', handleTimeUpdate);
321
+ video.addEventListener('ended', handleEnded);
322
+ return () => {
323
+ video.removeEventListener('timeupdate', handleTimeUpdate);
324
+ video.removeEventListener('ended', handleEnded);
325
+ };
326
+ }, [onTimeUpdate, onEnded]);
327
+ useImperativeHandle(ref, () => ({
328
+ play: () => playerRef.current?.play() || Promise.resolve(),
329
+ pause: () => playerRef.current?.pause(),
330
+ getCurrentTime: () => playerRef.current?.getCurrentTime() || 0,
331
+ seek: (time) => playerRef.current?.seek(time),
332
+ getDuration: () => playerRef.current?.getDuration() || 0,
333
+ getVolume: () => playerRef.current?.getVolume() || 1,
334
+ setVolume: (volume) => playerRef.current?.setVolume(volume),
335
+ getQualityLevels: () => playerRef.current?.getQualityLevels() || [],
336
+ getCurrentQuality: () => playerRef.current?.getCurrentQuality() || null,
337
+ setQuality: (levelIndex) => playerRef.current?.setQuality(levelIndex),
338
+ getState: () => playerRef.current?.getState() || PlayerState.IDLE,
339
+ destroy: () => playerRef.current?.destroy(),
340
+ getVideoElement: () => videoRef.current,
341
+ }));
342
+ const containerStyle = {
343
+ width,
344
+ height,
345
+ position: 'relative',
346
+ backgroundColor: '#000',
347
+ ...style,
348
+ };
349
+ const videoStyle = {
350
+ width: '100%',
351
+ height: '100%',
352
+ objectFit: 'contain',
353
+ };
354
+ return (React.createElement("div", { style: containerStyle, className: className },
355
+ React.createElement("video", { ref: videoRef, style: videoStyle, playsInline: true, preload: "metadata" }, "Your browser does not support the video tag."),
356
+ currentState === PlayerState.LOADING && (React.createElement("div", { style: {
357
+ position: 'absolute',
358
+ top: '50%',
359
+ left: '50%',
360
+ transform: 'translate(-50%, -50%)',
361
+ color: 'white',
362
+ fontSize: '14px',
363
+ } }, "Loading video...")),
364
+ error && (React.createElement("div", { style: {
365
+ position: 'absolute',
366
+ top: '50%',
367
+ left: '50%',
368
+ transform: 'translate(-50%, -50%)',
369
+ color: 'white',
370
+ backgroundColor: 'rgba(255, 0, 0, 0.8)',
371
+ padding: '10px 20px',
372
+ borderRadius: '4px',
373
+ fontSize: '14px',
374
+ textAlign: 'center',
375
+ maxWidth: '80%',
376
+ } },
377
+ React.createElement("div", { style: { fontWeight: 'bold', marginBottom: '5px' } },
378
+ "Error: ",
379
+ error.code),
380
+ React.createElement("div", null, error.message)))));
381
+ });
382
+ GuardVideoPlayerComponent.displayName = 'GuardVideoPlayer';
383
+
384
+ function useGuardVideoPlayer(options) {
385
+ const videoRef = useRef(null);
386
+ const playerRef = useRef(null);
387
+ const [state, setState] = useState(PlayerState.IDLE);
388
+ const [error, setError] = useState(null);
389
+ const [currentTime, setCurrentTime] = useState(0);
390
+ const [duration, setDuration] = useState(0);
391
+ const [volume, setVolumeState] = useState(1);
392
+ const [currentQuality, setCurrentQuality] = useState(null);
393
+ const [qualityLevels, setQualityLevels] = useState([]);
394
+ const [isReady, setIsReady] = useState(false);
395
+ useEffect(() => {
396
+ if (!videoRef.current || playerRef.current)
397
+ return;
398
+ const player = new GuardVideoPlayer(videoRef.current, options.videoId, {
399
+ ...options,
400
+ onReady: () => {
401
+ setIsReady(true);
402
+ setQualityLevels(player.getQualityLevels());
403
+ setDuration(player.getDuration());
404
+ options.onReady?.();
405
+ },
406
+ onError: (err) => {
407
+ setError(err);
408
+ options.onError?.(err);
409
+ },
410
+ onQualityChange: (quality) => {
411
+ setCurrentQuality(player.getCurrentQuality());
412
+ options.onQualityChange?.(quality);
413
+ },
414
+ onStateChange: (newState) => {
415
+ setState(newState);
416
+ options.onStateChange?.(newState);
417
+ },
418
+ });
419
+ playerRef.current = player;
420
+ return () => {
421
+ player.destroy();
422
+ playerRef.current = null;
423
+ };
424
+ }, [options.videoId, options.embedTokenEndpoint]);
425
+ useEffect(() => {
426
+ const video = videoRef.current;
427
+ if (!video)
428
+ return;
429
+ const handleTimeUpdate = () => setCurrentTime(video.currentTime);
430
+ const handleVolumeChange = () => setVolumeState(video.volume);
431
+ const handleDurationChange = () => setDuration(video.duration);
432
+ video.addEventListener('timeupdate', handleTimeUpdate);
433
+ video.addEventListener('volumechange', handleVolumeChange);
434
+ video.addEventListener('durationchange', handleDurationChange);
435
+ return () => {
436
+ video.removeEventListener('timeupdate', handleTimeUpdate);
437
+ video.removeEventListener('volumechange', handleVolumeChange);
438
+ video.removeEventListener('durationchange', handleDurationChange);
439
+ };
440
+ }, []);
441
+ const play = useCallback(() => {
442
+ return playerRef.current?.play() || Promise.resolve();
443
+ }, []);
444
+ const pause = useCallback(() => {
445
+ playerRef.current?.pause();
446
+ }, []);
447
+ const seek = useCallback((time) => {
448
+ playerRef.current?.seek(time);
449
+ }, []);
450
+ const setVolume = useCallback((vol) => {
451
+ playerRef.current?.setVolume(vol);
452
+ }, []);
453
+ const setQuality = useCallback((levelIndex) => {
454
+ playerRef.current?.setQuality(levelIndex);
455
+ }, []);
456
+ return {
457
+ videoRef,
458
+ player: playerRef.current,
459
+ state,
460
+ error,
461
+ currentTime,
462
+ duration,
463
+ volume,
464
+ currentQuality,
465
+ qualityLevels,
466
+ isReady,
467
+ isPlaying: state === PlayerState.PLAYING,
468
+ play,
469
+ pause,
470
+ seek,
471
+ setVolume,
472
+ setQuality,
473
+ };
474
+ }
475
+
476
+ export { GuardVideoPlayerComponent as GuardVideoPlayer, GuardVideoPlayer as GuardVideoPlayerCore, PlayerState, useGuardVideoPlayer };
477
+ //# sourceMappingURL=index.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.esm.js","sources":["../src/core/types.ts","../src/core/player.ts","../src/react/GuardVideoPlayer.tsx","../src/react/hooks.ts"],"sourcesContent":[null,null,null,null],"names":[],"mappings":"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"}