unified-video-framework 1.4.413 → 1.4.415

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. package/package.json +6 -1
  2. package/packages/core/src/BasePlayer.d.ts +61 -0
  3. package/packages/core/src/BasePlayer.d.ts.map +1 -0
  4. package/packages/core/src/BasePlayer.js +175 -0
  5. package/packages/core/src/BasePlayer.js.map +1 -0
  6. package/packages/core/src/VideoPlayerFactory.d.ts +8 -0
  7. package/packages/core/src/VideoPlayerFactory.d.ts.map +1 -0
  8. package/packages/core/src/VideoPlayerFactory.js +95 -0
  9. package/packages/core/src/VideoPlayerFactory.js.map +1 -0
  10. package/packages/core/src/analytics/adapters/PlayerAnalyticsAdapter.d.ts +18 -0
  11. package/packages/core/src/analytics/adapters/PlayerAnalyticsAdapter.d.ts.map +1 -0
  12. package/packages/core/src/analytics/adapters/PlayerAnalyticsAdapter.js +117 -0
  13. package/packages/core/src/analytics/adapters/PlayerAnalyticsAdapter.js.map +1 -0
  14. package/packages/core/src/analytics/core/AnalyticsProvider.d.ts +18 -0
  15. package/packages/core/src/analytics/core/AnalyticsProvider.d.ts.map +1 -0
  16. package/packages/core/src/analytics/core/AnalyticsProvider.js +99 -0
  17. package/packages/core/src/analytics/core/AnalyticsProvider.js.map +1 -0
  18. package/packages/core/src/analytics/core/DynamicAnalyticsManager.d.ts +20 -0
  19. package/packages/core/src/analytics/core/DynamicAnalyticsManager.d.ts.map +1 -0
  20. package/packages/core/src/analytics/core/DynamicAnalyticsManager.js +161 -0
  21. package/packages/core/src/analytics/core/DynamicAnalyticsManager.js.map +1 -0
  22. package/packages/core/src/analytics/core/EventBatcher.d.ts +32 -0
  23. package/packages/core/src/analytics/core/EventBatcher.d.ts.map +1 -0
  24. package/packages/core/src/analytics/core/EventBatcher.js +98 -0
  25. package/packages/core/src/analytics/core/EventBatcher.js.map +1 -0
  26. package/packages/core/src/analytics/core/PlayerAnalytics.d.ts +19 -0
  27. package/packages/core/src/analytics/core/PlayerAnalytics.d.ts.map +1 -0
  28. package/packages/core/src/analytics/core/PlayerAnalytics.js +80 -0
  29. package/packages/core/src/analytics/core/PlayerAnalytics.js.map +1 -0
  30. package/packages/core/src/analytics/index.d.ts +13 -0
  31. package/packages/core/src/analytics/index.d.ts.map +1 -0
  32. package/packages/core/src/analytics/index.js +13 -0
  33. package/packages/core/src/analytics/index.js.map +1 -0
  34. package/packages/core/src/analytics/types/AnalyticsTypes.d.ts +239 -0
  35. package/packages/core/src/analytics/types/AnalyticsTypes.d.ts.map +1 -0
  36. package/packages/core/src/analytics/types/AnalyticsTypes.js +8 -0
  37. package/packages/core/src/analytics/types/AnalyticsTypes.js.map +1 -0
  38. package/packages/core/src/analytics/utils/DeviceDetection.d.ts +27 -0
  39. package/packages/core/src/analytics/utils/DeviceDetection.d.ts.map +1 -0
  40. package/packages/core/src/analytics/utils/DeviceDetection.js +184 -0
  41. package/packages/core/src/analytics/utils/DeviceDetection.js.map +1 -0
  42. package/packages/core/src/chapter-manager.d.ts +39 -0
  43. package/packages/core/src/chapter-manager.d.ts.map +1 -0
  44. package/packages/core/src/chapter-manager.js +173 -0
  45. package/packages/core/src/chapter-manager.js.map +1 -0
  46. package/packages/core/src/index.d.ts +10 -0
  47. package/packages/core/src/index.d.ts.map +1 -0
  48. package/packages/core/src/index.js +8 -0
  49. package/packages/core/src/index.js.map +1 -0
  50. package/packages/core/src/interfaces/IVideoPlayer.d.ts +229 -0
  51. package/packages/core/src/interfaces/IVideoPlayer.d.ts.map +1 -0
  52. package/packages/core/src/interfaces/IVideoPlayer.js +2 -0
  53. package/packages/core/src/interfaces/IVideoPlayer.js.map +1 -0
  54. package/packages/core/src/interfaces.d.ts +455 -0
  55. package/packages/core/src/interfaces.d.ts.map +1 -0
  56. package/packages/core/src/interfaces.js +32 -0
  57. package/packages/core/src/interfaces.js.map +1 -0
  58. package/packages/core/src/utils/EventEmitter.d.ts +14 -0
  59. package/packages/core/src/utils/EventEmitter.d.ts.map +1 -0
  60. package/packages/core/src/utils/EventEmitter.js +55 -0
  61. package/packages/core/src/utils/EventEmitter.js.map +1 -0
  62. package/packages/web/dist/drm/DRMManager.d.ts +1 -1
  63. package/packages/web/dist/drm/DRMManager.d.ts.map +1 -1
  64. package/packages/web/dist/drm/DRMManager.js +7 -7
  65. package/packages/web/dist/drm/DRMManager.js.map +1 -1
  66. package/packages/web/dist/drm/providers/BunnyNetProvider.d.ts +1 -1
  67. package/packages/web/dist/drm/providers/BunnyNetProvider.d.ts.map +1 -1
  68. package/packages/web/dist/drm/providers/BunnyNetProvider.js +13 -13
  69. package/packages/web/dist/drm/providers/BunnyNetProvider.js.map +1 -1
  70. package/packages/web/dist/drm/providers/GenericProvider.d.ts +1 -1
  71. package/packages/web/dist/drm/providers/GenericProvider.d.ts.map +1 -1
  72. package/packages/web/dist/drm/providers/GenericProvider.js +8 -6
  73. package/packages/web/dist/drm/providers/GenericProvider.js.map +1 -1
  74. package/packages/web/dist/drm/systems/FairPlayDRM.d.ts.map +1 -1
  75. package/packages/web/dist/drm/systems/FairPlayDRM.js +2 -2
  76. package/packages/web/dist/drm/systems/FairPlayDRM.js.map +1 -1
  77. package/packages/web/dist/drm/systems/PlayReadyDRM.d.ts.map +1 -1
  78. package/packages/web/dist/drm/systems/PlayReadyDRM.js +7 -7
  79. package/packages/web/dist/drm/systems/PlayReadyDRM.js.map +1 -1
  80. package/packages/web/dist/drm/systems/WidevineDRM.d.ts.map +1 -1
  81. package/packages/web/dist/drm/systems/WidevineDRM.js +2 -2
  82. package/packages/web/dist/drm/systems/WidevineDRM.js.map +1 -1
  83. package/packages/web/dist/drm/types/BunnyNetTypes.d.ts +1 -1
  84. package/packages/web/dist/drm/types/BunnyNetTypes.d.ts.map +1 -1
  85. package/packages/web/dist/drm/types/DRMTypes.d.ts +1 -1
  86. package/packages/web/dist/drm/types/DRMTypes.d.ts.map +1 -1
  87. package/packages/web/dist/drm/types/DRMTypes.js +5 -5
  88. package/packages/web/dist/drm/types/DRMTypes.js.map +1 -1
  89. package/packages/web/dist/drm/utils/BrowserDetector.d.ts +1 -1
  90. package/packages/web/dist/drm/utils/BrowserDetector.d.ts.map +1 -1
  91. package/packages/web/dist/drm/utils/BrowserDetector.js +10 -10
  92. package/packages/web/dist/drm/utils/BrowserDetector.js.map +1 -1
  93. package/packages/web/src/drm/DRMManager.ts +214 -213
  94. package/packages/web/src/drm/index.ts +37 -37
  95. package/packages/web/src/drm/providers/BunnyNetProvider.ts +171 -170
  96. package/packages/web/src/drm/providers/GenericProvider.ts +151 -148
  97. package/packages/web/src/drm/systems/BaseDRM.ts +68 -68
  98. package/packages/web/src/drm/systems/FairPlayDRM.ts +306 -305
  99. package/packages/web/src/drm/systems/PlayReadyDRM.ts +132 -131
  100. package/packages/web/src/drm/systems/WidevineDRM.ts +106 -105
  101. package/packages/web/src/drm/types/BunnyNetTypes.ts +35 -35
  102. package/packages/web/src/drm/types/DRMTypes.ts +92 -91
  103. package/packages/web/src/drm/utils/BrowserDetector.ts +233 -232
  104. package/packages/web/src/drm/utils/CertificateManager.ts +86 -86
  105. package/packages/web/src/drm/utils/DRMErrorHandler.ts +84 -84
  106. package/packages/web/src/drm/utils/LicenseRequestHandler.ts +180 -180
  107. package/scripts/fix-imports.js +54 -8
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "unified-video-framework",
3
- "version": "1.4.413",
3
+ "version": "1.4.415",
4
4
  "description": "Cross-platform video player framework supporting iOS, Android, Web, Smart TVs (Samsung/LG), Roku, and more",
5
5
  "main": "packages/core/dist/index.js",
6
6
  "types": "packages/core/dist/index.d.ts",
@@ -39,6 +39,11 @@
39
39
  "require": "./packages/core/dist/analytics/index.js",
40
40
  "import": "./packages/core/dist/analytics/index.js",
41
41
  "types": "./packages/core/dist/analytics/index.d.ts"
42
+ },
43
+ "./web/drm": {
44
+ "require": "./packages/web/dist/drm/index.js",
45
+ "import": "./packages/web/dist/drm/index.js",
46
+ "types": "./packages/web/dist/drm/index.d.ts"
42
47
  }
43
48
  },
44
49
  "files": [
@@ -0,0 +1,61 @@
1
+ import { IVideoPlayer, VideoSource, PlayerConfig, PlayerState, PlayerError, Quality, SubtitleTrack } from './interfaces/IVideoPlayer';
2
+ import { PlayerEvent } from './interfaces';
3
+ import { EventEmitter } from './utils/EventEmitter';
4
+ export declare abstract class BasePlayer implements IVideoPlayer {
5
+ protected container: HTMLElement | null;
6
+ protected config: PlayerConfig;
7
+ protected events: EventEmitter;
8
+ protected state: PlayerState;
9
+ protected source: VideoSource | null;
10
+ protected subtitles: SubtitleTrack[];
11
+ protected currentSubtitleIndex: number;
12
+ constructor();
13
+ protected getDefaultConfig(): PlayerConfig;
14
+ protected getDefaultState(): PlayerState;
15
+ initialize(container: HTMLElement | string, config?: PlayerConfig): Promise<void>;
16
+ protected abstract setupPlayer(): Promise<void>;
17
+ abstract destroy(): Promise<void>;
18
+ abstract load(source: VideoSource): Promise<void>;
19
+ play(): Promise<void>;
20
+ pause(): void;
21
+ stop(): void;
22
+ abstract seek(time: number): void;
23
+ setVolume(level: number): void;
24
+ mute(): void;
25
+ unmute(): void;
26
+ toggleMute(): void;
27
+ abstract getQualities(): Quality[];
28
+ abstract getCurrentQuality(): Quality | null;
29
+ abstract setQuality(index: number): void;
30
+ abstract setAutoQuality(enabled: boolean): void;
31
+ setPlaybackRate(rate: number): void;
32
+ getPlaybackRate(): number;
33
+ getCurrentTime(): number;
34
+ getDuration(): number;
35
+ getBufferedPercentage(): number;
36
+ getState(): PlayerState;
37
+ isPlaying(): boolean;
38
+ isPaused(): boolean;
39
+ isEnded(): boolean;
40
+ abstract enterFullscreen(): Promise<void>;
41
+ abstract exitFullscreen(): Promise<void>;
42
+ toggleFullscreen(): Promise<void>;
43
+ abstract enterPictureInPicture(): Promise<void>;
44
+ abstract exitPictureInPicture(): Promise<void>;
45
+ on(event: string, handler: Function): void;
46
+ off(event: string, handler?: Function): void;
47
+ once(event: string, handler: Function): void;
48
+ protected emit(event: PlayerEvent, ...args: any[]): void;
49
+ setFreeDuration?(seconds: number): void;
50
+ resetFreePreviewGate?(): void;
51
+ getSubtitles(): SubtitleTrack[];
52
+ setSubtitleTrack(index: number): void;
53
+ disableSubtitles(): void;
54
+ protected abstract applySubtitleTrack(track: SubtitleTrack): void;
55
+ protected abstract removeSubtitles(): void;
56
+ protected handleError(error: PlayerError): void;
57
+ protected updateTime(time: number): void;
58
+ protected updateBuffered(percentage: number): void;
59
+ protected setBuffering(isBuffering: boolean): void;
60
+ }
61
+ //# sourceMappingURL=BasePlayer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BasePlayer.d.ts","sourceRoot":"","sources":["BasePlayer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,175 @@
1
+ import { EventEmitter } from './utils/EventEmitter';
2
+ export class BasePlayer {
3
+ constructor() {
4
+ this.container = null;
5
+ this.source = null;
6
+ this.subtitles = [];
7
+ this.currentSubtitleIndex = -1;
8
+ this.config = this.getDefaultConfig();
9
+ this.events = new EventEmitter();
10
+ this.state = this.getDefaultState();
11
+ }
12
+ getDefaultConfig() {
13
+ return {
14
+ autoPlay: false,
15
+ muted: false,
16
+ volume: 1.0,
17
+ controls: true,
18
+ loop: false,
19
+ preload: 'metadata',
20
+ playsInline: true,
21
+ enableAdaptiveBitrate: true,
22
+ debug: false,
23
+ freeDuration: 0
24
+ };
25
+ }
26
+ getDefaultState() {
27
+ return {
28
+ isPlaying: false,
29
+ isPaused: true,
30
+ isBuffering: false,
31
+ isEnded: false,
32
+ isError: false,
33
+ currentTime: 0,
34
+ duration: 0,
35
+ bufferedPercentage: 0,
36
+ volume: 1.0,
37
+ isMuted: false,
38
+ playbackRate: 1.0,
39
+ availableQualities: []
40
+ };
41
+ }
42
+ async initialize(container, config) {
43
+ if (typeof container === 'string') {
44
+ const element = document.querySelector(container);
45
+ if (!element) {
46
+ throw new Error(`Container element not found: ${container}`);
47
+ }
48
+ this.container = element;
49
+ }
50
+ else {
51
+ this.container = container;
52
+ }
53
+ this.config = { ...this.getDefaultConfig(), ...config };
54
+ this.state.volume = this.config.volume || 1.0;
55
+ this.state.isMuted = this.config.muted || false;
56
+ await this.setupPlayer();
57
+ }
58
+ async play() {
59
+ this.state.isPlaying = true;
60
+ this.state.isPaused = false;
61
+ this.emit('onPlay');
62
+ }
63
+ pause() {
64
+ this.state.isPlaying = false;
65
+ this.state.isPaused = true;
66
+ this.emit('onPause');
67
+ }
68
+ stop() {
69
+ this.pause();
70
+ this.seek(0);
71
+ this.state.isEnded = true;
72
+ }
73
+ setVolume(level) {
74
+ const volume = Math.max(0, Math.min(1, level));
75
+ this.state.volume = volume;
76
+ this.emit('onVolumeChanged', volume);
77
+ }
78
+ mute() {
79
+ this.state.isMuted = true;
80
+ this.emit('onVolumeChanged', 0);
81
+ }
82
+ unmute() {
83
+ this.state.isMuted = false;
84
+ this.emit('onVolumeChanged', this.state.volume);
85
+ }
86
+ toggleMute() {
87
+ if (this.state.isMuted) {
88
+ this.unmute();
89
+ }
90
+ else {
91
+ this.mute();
92
+ }
93
+ }
94
+ setPlaybackRate(rate) {
95
+ this.state.playbackRate = rate;
96
+ }
97
+ getPlaybackRate() {
98
+ return this.state.playbackRate;
99
+ }
100
+ getCurrentTime() {
101
+ return this.state.currentTime;
102
+ }
103
+ getDuration() {
104
+ return this.state.duration;
105
+ }
106
+ getBufferedPercentage() {
107
+ return this.state.bufferedPercentage;
108
+ }
109
+ getState() {
110
+ return { ...this.state };
111
+ }
112
+ isPlaying() {
113
+ return this.state.isPlaying;
114
+ }
115
+ isPaused() {
116
+ return this.state.isPaused;
117
+ }
118
+ isEnded() {
119
+ return this.state.isEnded;
120
+ }
121
+ async toggleFullscreen() {
122
+ if (document.fullscreenElement) {
123
+ await this.exitFullscreen();
124
+ }
125
+ else {
126
+ await this.enterFullscreen();
127
+ }
128
+ }
129
+ on(event, handler) {
130
+ this.events.on(event, handler);
131
+ }
132
+ off(event, handler) {
133
+ this.events.off(event, handler);
134
+ }
135
+ once(event, handler) {
136
+ this.events.once(event, handler);
137
+ }
138
+ emit(event, ...args) {
139
+ this.events.emit(event, ...args);
140
+ }
141
+ getSubtitles() {
142
+ return this.subtitles;
143
+ }
144
+ setSubtitleTrack(index) {
145
+ if (index >= 0 && index < this.subtitles.length) {
146
+ this.currentSubtitleIndex = index;
147
+ this.applySubtitleTrack(this.subtitles[index]);
148
+ }
149
+ }
150
+ disableSubtitles() {
151
+ this.currentSubtitleIndex = -1;
152
+ this.removeSubtitles();
153
+ }
154
+ handleError(error) {
155
+ this.state.isError = true;
156
+ this.state.isPlaying = false;
157
+ this.emit('onError', error);
158
+ if (this.config.debug) {
159
+ console.error('[VideoPlayer Error]', error);
160
+ }
161
+ }
162
+ updateTime(time) {
163
+ this.state.currentTime = time;
164
+ this.emit('onTimeUpdate', time);
165
+ }
166
+ updateBuffered(percentage) {
167
+ this.state.bufferedPercentage = percentage;
168
+ this.emit('onProgress', percentage);
169
+ }
170
+ setBuffering(isBuffering) {
171
+ this.state.isBuffering = isBuffering;
172
+ this.emit('onBuffering', isBuffering);
173
+ }
174
+ }
175
+ //# sourceMappingURL=BasePlayer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BasePlayer.js","sourceRoot":"","sources":["BasePlayer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { IVideoPlayer, PlayerConfig } from './interfaces/IVideoPlayer';
2
+ export type Platform = 'web' | 'ios' | 'android' | 'tizen' | 'webos' | 'roku' | 'androidtv' | 'appletv' | 'windows';
3
+ export declare class VideoPlayerFactory {
4
+ static create(platform: Platform, container: HTMLElement | string | any, config?: PlayerConfig): Promise<IVideoPlayer>;
5
+ static detectPlatform(): Platform;
6
+ static createForCurrentPlatform(container: HTMLElement | string | any, config?: PlayerConfig): Promise<IVideoPlayer>;
7
+ }
8
+ //# sourceMappingURL=VideoPlayerFactory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VideoPlayerFactory.d.ts","sourceRoot":"","sources":["VideoPlayerFactory.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEvE,MAAM,MAAM,QAAQ,GAChB,KAAK,GACL,KAAK,GACL,SAAS,GACT,OAAO,GACP,OAAO,GACP,MAAM,GACN,WAAW,GACX,SAAS,GACT,SAAS,CAAC;AAEd,qBAAa,kBAAkB;WAIhB,MAAM,CACjB,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,WAAW,GAAG,MAAM,GAAG,GAAG,EACrC,MAAM,CAAC,EAAE,YAAY,GACpB,OAAO,CAAC,YAAY,CAAC;IAqExB,MAAM,CAAC,cAAc,IAAI,QAAQ;WAkDpB,wBAAwB,CACnC,SAAS,EAAE,WAAW,GAAG,MAAM,GAAG,GAAG,EACrC,MAAM,CAAC,EAAE,YAAY,GACpB,OAAO,CAAC,YAAY,CAAC;CAIzB"}
@@ -0,0 +1,95 @@
1
+ export class VideoPlayerFactory {
2
+ static async create(platform, container, config) {
3
+ switch (platform) {
4
+ case 'web':
5
+ try {
6
+ const WebModule = await eval('import("@unified-video/web")');
7
+ if (WebModule?.WebPlayer) {
8
+ const player = new WebModule.WebPlayer();
9
+ await player.initialize(container, config);
10
+ return player;
11
+ }
12
+ }
13
+ catch (e) {
14
+ }
15
+ break;
16
+ case 'ios':
17
+ case 'android':
18
+ try {
19
+ const RNModule = await eval('import("@unified-video/react-native")');
20
+ if (RNModule?.ReactNativePlayer) {
21
+ return RNModule.ReactNativePlayer;
22
+ }
23
+ }
24
+ catch (e) {
25
+ }
26
+ break;
27
+ case 'tizen':
28
+ case 'webos':
29
+ try {
30
+ const EnactModule = await eval('import("@unified-video/enact")');
31
+ if (EnactModule?.EnactPlayer) {
32
+ const player = new EnactModule.EnactPlayer();
33
+ await player.initialize(container, config);
34
+ return player;
35
+ }
36
+ }
37
+ catch (e) {
38
+ }
39
+ break;
40
+ case 'roku':
41
+ try {
42
+ const RokuModule = await eval('import("@unified-video/roku")');
43
+ if (RokuModule?.RokuPlayer) {
44
+ const player = new RokuModule.RokuPlayer();
45
+ await player.initialize(container, config);
46
+ return player;
47
+ }
48
+ }
49
+ catch (e) {
50
+ }
51
+ break;
52
+ default:
53
+ throw new Error(`Platform '${platform}' is not supported`);
54
+ }
55
+ throw new Error(`Failed to load player for platform '${platform}'`);
56
+ }
57
+ static detectPlatform() {
58
+ if (typeof global !== 'undefined' && global.nativeCallSyncHook) {
59
+ try {
60
+ const RN = eval('require("react-native")');
61
+ if (RN && RN.Platform) {
62
+ return RN.Platform.OS;
63
+ }
64
+ }
65
+ catch (e) {
66
+ }
67
+ }
68
+ if (typeof window !== 'undefined') {
69
+ const userAgent = window.navigator.userAgent.toLowerCase();
70
+ if (userAgent.includes('tizen'))
71
+ return 'tizen';
72
+ if (userAgent.includes('webos'))
73
+ return 'webos';
74
+ if (userAgent.includes('roku'))
75
+ return 'roku';
76
+ if (userAgent.includes('android') && userAgent.includes('tv')) {
77
+ return 'androidtv';
78
+ }
79
+ if (userAgent.includes('appletv'))
80
+ return 'appletv';
81
+ if (userAgent.includes('windows'))
82
+ return 'windows';
83
+ return 'web';
84
+ }
85
+ if (typeof process !== 'undefined' && process.versions && process.versions.node) {
86
+ return 'web';
87
+ }
88
+ throw new Error('Unable to detect platform');
89
+ }
90
+ static async createForCurrentPlatform(container, config) {
91
+ const platform = this.detectPlatform();
92
+ return this.create(platform, container, config);
93
+ }
94
+ }
95
+ //# sourceMappingURL=VideoPlayerFactory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VideoPlayerFactory.js","sourceRoot":"","sources":["VideoPlayerFactory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { AnalyticsEventData, PlayerSessionInfo, BaseAnalyticsProvider, PlayerAnalyticsConfig } from '../types/AnalyticsTypes';
2
+ export declare class PlayerAnalyticsAdapter implements BaseAnalyticsProvider {
3
+ name: string;
4
+ enabled: boolean;
5
+ private config;
6
+ private currentSessionId;
7
+ private eventQueue;
8
+ private flushTimer;
9
+ constructor(name: string, config: PlayerAnalyticsConfig);
10
+ initialize(): Promise<void>;
11
+ startSession(sessionInfo: PlayerSessionInfo): Promise<string>;
12
+ trackEvent(event: AnalyticsEventData): Promise<void>;
13
+ endSession(): Promise<void>;
14
+ flush(): Promise<void>;
15
+ destroy(): Promise<void>;
16
+ private scheduleFlush;
17
+ }
18
+ //# sourceMappingURL=PlayerAnalyticsAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PlayerAnalyticsAdapter.d.ts","sourceRoot":"","sources":["PlayerAnalyticsAdapter.ts"],"names":[],"mappings":"AAMA,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,qBAAqB,EACrB,qBAAqB,EACtB,MAAM,yBAAyB,CAAC;AAGjC,qBAAa,sBAAuB,YAAW,qBAAqB;IAC3D,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACxB,OAAO,CAAC,MAAM,CAAwB;IACtC,OAAO,CAAC,gBAAgB,CAAuB;IAC/C,OAAO,CAAC,UAAU,CAA4B;IAC9C,OAAO,CAAC,UAAU,CAAa;gBAEnB,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,qBAAqB;IAMjD,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAI3B,YAAY,CAAC,WAAW,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC;IAqB7D,UAAU,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBpD,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAiB3B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA4CtB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAgB9B,OAAO,CAAC,aAAa;CAStB"}
@@ -0,0 +1,117 @@
1
+ import { deviceDetection } from '../utils/DeviceDetection';
2
+ export class PlayerAnalyticsAdapter {
3
+ constructor(name, config) {
4
+ this.currentSessionId = null;
5
+ this.eventQueue = [];
6
+ this.flushTimer = null;
7
+ this.name = name;
8
+ this.enabled = true;
9
+ this.config = config;
10
+ }
11
+ async initialize() {
12
+ }
13
+ async startSession(sessionInfo) {
14
+ const sessionId = `sess_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
15
+ this.currentSessionId = sessionId;
16
+ const event = {
17
+ eventType: 'session_start',
18
+ timestamp: Date.now(),
19
+ video: sessionInfo.initialVideo,
20
+ device: deviceDetection.getDeviceInfo(),
21
+ metadata: {
22
+ sessionId,
23
+ playerId: this.config.playerId,
24
+ userId: sessionInfo.userId,
25
+ customData: sessionInfo.customData
26
+ }
27
+ };
28
+ await this.trackEvent(event);
29
+ return sessionId;
30
+ }
31
+ async trackEvent(event) {
32
+ if (!this.enabled) {
33
+ return;
34
+ }
35
+ this.eventQueue.push(event);
36
+ if (this.eventQueue.length >= (this.config.batchSize || 10)) {
37
+ await this.flush();
38
+ }
39
+ else {
40
+ this.scheduleFlush();
41
+ }
42
+ }
43
+ async endSession() {
44
+ if (this.currentSessionId) {
45
+ const event = {
46
+ eventType: 'session_end',
47
+ timestamp: Date.now(),
48
+ metadata: {
49
+ sessionId: this.currentSessionId,
50
+ playerId: this.config.playerId
51
+ }
52
+ };
53
+ await this.trackEvent(event);
54
+ await this.flush();
55
+ this.currentSessionId = null;
56
+ }
57
+ }
58
+ async flush() {
59
+ if (this.eventQueue.length === 0) {
60
+ return;
61
+ }
62
+ const events = [...this.eventQueue];
63
+ this.eventQueue = [];
64
+ if (this.flushTimer) {
65
+ clearTimeout(this.flushTimer);
66
+ this.flushTimer = null;
67
+ }
68
+ try {
69
+ const payload = {
70
+ session: {
71
+ sessionId: this.currentSessionId || 'unknown',
72
+ playerId: this.config.playerId,
73
+ timestamp: Date.now(),
74
+ customData: {}
75
+ },
76
+ events
77
+ };
78
+ const response = await fetch(`${this.config.baseUrl}/analytics/player/ingest`, {
79
+ method: 'POST',
80
+ headers: {
81
+ 'Content-Type': 'application/json',
82
+ 'Authorization': `Bearer ${this.config.apiKey}`,
83
+ ...(this.config.tenantId && { 'X-Tenant-ID': this.config.tenantId })
84
+ },
85
+ body: JSON.stringify(payload)
86
+ });
87
+ if (!response.ok) {
88
+ throw new Error(`Analytics API error: ${response.status}`);
89
+ }
90
+ }
91
+ catch (error) {
92
+ console.error('Failed to send analytics events:', error);
93
+ this.eventQueue = [...events, ...this.eventQueue];
94
+ }
95
+ }
96
+ async destroy() {
97
+ if (this.currentSessionId) {
98
+ await this.endSession();
99
+ }
100
+ if (this.flushTimer) {
101
+ clearTimeout(this.flushTimer);
102
+ this.flushTimer = null;
103
+ }
104
+ if (this.eventQueue.length > 0) {
105
+ await this.flush();
106
+ }
107
+ }
108
+ scheduleFlush() {
109
+ if (this.flushTimer) {
110
+ return;
111
+ }
112
+ this.flushTimer = setTimeout(() => {
113
+ this.flush().catch(console.error);
114
+ }, (this.config.flushInterval || 30) * 1000);
115
+ }
116
+ }
117
+ //# sourceMappingURL=PlayerAnalyticsAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PlayerAnalyticsAdapter.js","sourceRoot":"","sources":["PlayerAnalyticsAdapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { BaseAnalyticsProvider, AnalyticsEventData, PlayerSessionInfo, AnalyticsProviderType, DynamicAnalyticsConfig, PlayerAnalyticsConfig } from '../types/AnalyticsTypes';
2
+ export declare abstract class AnalyticsProvider implements BaseAnalyticsProvider {
3
+ name: string;
4
+ enabled: boolean;
5
+ constructor(name: string, enabled?: boolean);
6
+ abstract initialize(): Promise<void>;
7
+ abstract trackEvent(event: AnalyticsEventData): Promise<void>;
8
+ abstract startSession(sessionInfo: PlayerSessionInfo): Promise<string>;
9
+ abstract endSession(): Promise<void>;
10
+ abstract flush(): Promise<void>;
11
+ abstract destroy(): Promise<void>;
12
+ }
13
+ export declare function createAnalyticsProvider(type: AnalyticsProviderType, name: string, config: any): BaseAnalyticsProvider;
14
+ export declare function getDefaultAnalyticsConfig(): DynamicAnalyticsConfig;
15
+ export declare function createPlayerAnalyticsProviderConfig(baseUrl: string, apiKey: string, playerId: string, options?: Partial<PlayerAnalyticsConfig>): PlayerAnalyticsConfig;
16
+ export declare function validateAnalyticsConfig(config: DynamicAnalyticsConfig): void;
17
+ export declare function mergeAnalyticsConfigs(defaultConfig: DynamicAnalyticsConfig, userConfig: Partial<DynamicAnalyticsConfig>): DynamicAnalyticsConfig;
18
+ //# sourceMappingURL=AnalyticsProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AnalyticsProvider.d.ts","sourceRoot":"","sources":["AnalyticsProvider.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,qBAAqB,EACrB,kBAAkB,EAClB,iBAAiB,EACjB,qBAAqB,EACrB,sBAAsB,EACtB,qBAAqB,EACtB,MAAM,yBAAyB,CAAC;AAMjC,8BAAsB,iBAAkB,YAAW,qBAAqB;IAC/D,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;gBAEZ,IAAI,EAAE,MAAM,EAAE,OAAO,UAAO;IAKxC,QAAQ,CAAC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IACpC,QAAQ,CAAC,UAAU,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAC7D,QAAQ,CAAC,YAAY,CAAC,WAAW,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC;IACtE,QAAQ,CAAC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IACpC,QAAQ,CAAC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAC/B,QAAQ,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAClC;AAKD,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,qBAAqB,EAC3B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,GAAG,GACV,qBAAqB,CAgBvB;AAKD,wBAAgB,yBAAyB,IAAI,sBAAsB,CAclE;AAKD,wBAAgB,mCAAmC,CACjD,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,OAAO,CAAC,qBAAqB,CAAM,GAC3C,qBAAqB,CAavB;AAKD,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,sBAAsB,GAAG,IAAI,CA8B5E;AAsBD,wBAAgB,qBAAqB,CACnC,aAAa,EAAE,sBAAsB,EACrC,UAAU,EAAE,OAAO,CAAC,sBAAsB,CAAC,GAC1C,sBAAsB,CASxB"}
@@ -0,0 +1,99 @@
1
+ import { AnalyticsProviderType } from '../types/AnalyticsTypes';
2
+ import { PlayerAnalyticsAdapter } from '../adapters/PlayerAnalyticsAdapter';
3
+ export class AnalyticsProvider {
4
+ constructor(name, enabled = true) {
5
+ this.name = name;
6
+ this.enabled = enabled;
7
+ }
8
+ }
9
+ export function createAnalyticsProvider(type, name, config) {
10
+ switch (type) {
11
+ case AnalyticsProviderType.PLAYER_ANALYTICS:
12
+ return new PlayerAnalyticsAdapter(name, config);
13
+ case AnalyticsProviderType.CUSTOM:
14
+ if (config.factory) {
15
+ return config.factory(config);
16
+ }
17
+ throw new Error(`Custom provider "${name}" requires a factory function`);
18
+ case AnalyticsProviderType.GOOGLE_ANALYTICS:
19
+ case AnalyticsProviderType.ADOBE_ANALYTICS:
20
+ default:
21
+ throw new Error(`Analytics provider type "${type}" is not supported yet`);
22
+ }
23
+ }
24
+ export function getDefaultAnalyticsConfig() {
25
+ return {
26
+ enabled: true,
27
+ providers: [],
28
+ globalSettings: {
29
+ enableConsoleLogging: false,
30
+ enableErrorReporting: true,
31
+ sessionTimeout: 60,
32
+ defaultBatchSize: 10,
33
+ defaultFlushInterval: 30,
34
+ retryAttempts: 3,
35
+ retryDelay: 1000
36
+ }
37
+ };
38
+ }
39
+ export function createPlayerAnalyticsProviderConfig(baseUrl, apiKey, playerId, options = {}) {
40
+ return {
41
+ baseUrl,
42
+ apiKey,
43
+ playerId,
44
+ tenantId: options.tenantId,
45
+ heartbeatInterval: options.heartbeatInterval || 10,
46
+ batchSize: options.batchSize || 10,
47
+ flushInterval: options.flushInterval || 30,
48
+ enableOfflineStorage: options.enableOfflineStorage !== false,
49
+ maxRetries: options.maxRetries || 3,
50
+ retryDelay: options.retryDelay || 1000
51
+ };
52
+ }
53
+ export function validateAnalyticsConfig(config) {
54
+ if (!config) {
55
+ throw new Error('Analytics configuration is required');
56
+ }
57
+ if (typeof config.enabled !== 'boolean') {
58
+ throw new Error('Analytics configuration must specify enabled state');
59
+ }
60
+ if (!Array.isArray(config.providers)) {
61
+ throw new Error('Analytics configuration must include providers array');
62
+ }
63
+ config.providers.forEach((provider, index) => {
64
+ if (!provider.name) {
65
+ throw new Error(`Provider at index ${index} must have a name`);
66
+ }
67
+ if (!provider.type) {
68
+ throw new Error(`Provider "${provider.name}" must have a type`);
69
+ }
70
+ if (typeof provider.enabled !== 'boolean') {
71
+ throw new Error(`Provider "${provider.name}" must specify enabled state`);
72
+ }
73
+ if (provider.type === AnalyticsProviderType.PLAYER_ANALYTICS) {
74
+ validatePlayerAnalyticsConfig(provider.config);
75
+ }
76
+ });
77
+ }
78
+ function validatePlayerAnalyticsConfig(config) {
79
+ if (!config.baseUrl) {
80
+ throw new Error('Player Analytics provider requires baseUrl');
81
+ }
82
+ if (!config.apiKey) {
83
+ throw new Error('Player Analytics provider requires apiKey');
84
+ }
85
+ if (!config.playerId) {
86
+ throw new Error('Player Analytics provider requires playerId');
87
+ }
88
+ }
89
+ export function mergeAnalyticsConfigs(defaultConfig, userConfig) {
90
+ return {
91
+ enabled: userConfig.enabled !== undefined ? userConfig.enabled : defaultConfig.enabled,
92
+ providers: userConfig.providers || defaultConfig.providers,
93
+ globalSettings: {
94
+ ...defaultConfig.globalSettings,
95
+ ...userConfig.globalSettings
96
+ }
97
+ };
98
+ }
99
+ //# sourceMappingURL=AnalyticsProvider.js.map