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