unified-video-framework 1.4.412 → 1.4.414

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 (147) hide show
  1. package/package.json +6 -1
  2. package/packages/core/dist/interfaces/IVideoPlayer.d.ts +0 -22
  3. package/packages/core/dist/interfaces/IVideoPlayer.d.ts.map +1 -1
  4. package/packages/core/src/BasePlayer.d.ts +61 -0
  5. package/packages/core/src/BasePlayer.d.ts.map +1 -0
  6. package/packages/core/src/BasePlayer.js +175 -0
  7. package/packages/core/src/BasePlayer.js.map +1 -0
  8. package/packages/core/src/VideoPlayerFactory.d.ts +8 -0
  9. package/packages/core/src/VideoPlayerFactory.d.ts.map +1 -0
  10. package/packages/core/src/VideoPlayerFactory.js +95 -0
  11. package/packages/core/src/VideoPlayerFactory.js.map +1 -0
  12. package/packages/core/src/analytics/adapters/PlayerAnalyticsAdapter.d.ts +18 -0
  13. package/packages/core/src/analytics/adapters/PlayerAnalyticsAdapter.d.ts.map +1 -0
  14. package/packages/core/src/analytics/adapters/PlayerAnalyticsAdapter.js +117 -0
  15. package/packages/core/src/analytics/adapters/PlayerAnalyticsAdapter.js.map +1 -0
  16. package/packages/core/src/analytics/core/AnalyticsProvider.d.ts +18 -0
  17. package/packages/core/src/analytics/core/AnalyticsProvider.d.ts.map +1 -0
  18. package/packages/core/src/analytics/core/AnalyticsProvider.js +99 -0
  19. package/packages/core/src/analytics/core/AnalyticsProvider.js.map +1 -0
  20. package/packages/core/src/analytics/core/DynamicAnalyticsManager.d.ts +20 -0
  21. package/packages/core/src/analytics/core/DynamicAnalyticsManager.d.ts.map +1 -0
  22. package/packages/core/src/analytics/core/DynamicAnalyticsManager.js +161 -0
  23. package/packages/core/src/analytics/core/DynamicAnalyticsManager.js.map +1 -0
  24. package/packages/core/src/analytics/core/EventBatcher.d.ts +32 -0
  25. package/packages/core/src/analytics/core/EventBatcher.d.ts.map +1 -0
  26. package/packages/core/src/analytics/core/EventBatcher.js +98 -0
  27. package/packages/core/src/analytics/core/EventBatcher.js.map +1 -0
  28. package/packages/core/src/analytics/core/PlayerAnalytics.d.ts +19 -0
  29. package/packages/core/src/analytics/core/PlayerAnalytics.d.ts.map +1 -0
  30. package/packages/core/src/analytics/core/PlayerAnalytics.js +80 -0
  31. package/packages/core/src/analytics/core/PlayerAnalytics.js.map +1 -0
  32. package/packages/core/src/analytics/index.d.ts +13 -0
  33. package/packages/core/src/analytics/index.d.ts.map +1 -0
  34. package/packages/core/src/analytics/index.js +13 -0
  35. package/packages/core/src/analytics/index.js.map +1 -0
  36. package/packages/core/src/analytics/types/AnalyticsTypes.d.ts +239 -0
  37. package/packages/core/src/analytics/types/AnalyticsTypes.d.ts.map +1 -0
  38. package/packages/core/src/analytics/types/AnalyticsTypes.js +8 -0
  39. package/packages/core/src/analytics/types/AnalyticsTypes.js.map +1 -0
  40. package/packages/core/src/analytics/utils/DeviceDetection.d.ts +27 -0
  41. package/packages/core/src/analytics/utils/DeviceDetection.d.ts.map +1 -0
  42. package/packages/core/src/analytics/utils/DeviceDetection.js +184 -0
  43. package/packages/core/src/analytics/utils/DeviceDetection.js.map +1 -0
  44. package/packages/core/src/chapter-manager.d.ts +39 -0
  45. package/packages/core/src/chapter-manager.d.ts.map +1 -0
  46. package/packages/core/src/chapter-manager.js +173 -0
  47. package/packages/core/src/chapter-manager.js.map +1 -0
  48. package/packages/core/src/index.d.ts +10 -0
  49. package/packages/core/src/index.d.ts.map +1 -0
  50. package/packages/core/src/index.js +8 -0
  51. package/packages/core/src/index.js.map +1 -0
  52. package/packages/core/src/interfaces/IVideoPlayer.d.ts +229 -0
  53. package/packages/core/src/interfaces/IVideoPlayer.d.ts.map +1 -0
  54. package/packages/core/src/interfaces/IVideoPlayer.js +2 -0
  55. package/packages/core/src/interfaces/IVideoPlayer.js.map +1 -0
  56. package/packages/core/src/interfaces/IVideoPlayer.ts +0 -27
  57. package/packages/core/src/interfaces.d.ts +455 -0
  58. package/packages/core/src/interfaces.d.ts.map +1 -0
  59. package/packages/core/src/interfaces.js +32 -0
  60. package/packages/core/src/interfaces.js.map +1 -0
  61. package/packages/core/src/utils/EventEmitter.d.ts +14 -0
  62. package/packages/core/src/utils/EventEmitter.d.ts.map +1 -0
  63. package/packages/core/src/utils/EventEmitter.js +55 -0
  64. package/packages/core/src/utils/EventEmitter.js.map +1 -0
  65. package/packages/web/dist/WebPlayer.d.ts +0 -4
  66. package/packages/web/dist/WebPlayer.d.ts.map +1 -1
  67. package/packages/web/dist/WebPlayer.js +62 -73
  68. package/packages/web/dist/WebPlayer.js.map +1 -1
  69. package/packages/web/dist/drm/DRMManager.d.ts +16 -9
  70. package/packages/web/dist/drm/DRMManager.d.ts.map +1 -1
  71. package/packages/web/dist/drm/DRMManager.js +109 -42
  72. package/packages/web/dist/drm/DRMManager.js.map +1 -1
  73. package/packages/web/dist/drm/index.d.ts +15 -0
  74. package/packages/web/dist/drm/index.d.ts.map +1 -0
  75. package/packages/web/dist/drm/index.js +13 -0
  76. package/packages/web/dist/drm/index.js.map +1 -0
  77. package/packages/web/dist/drm/providers/BunnyNetProvider.d.ts +19 -0
  78. package/packages/web/dist/drm/providers/BunnyNetProvider.d.ts.map +1 -0
  79. package/packages/web/dist/drm/providers/BunnyNetProvider.js +112 -0
  80. package/packages/web/dist/drm/providers/BunnyNetProvider.js.map +1 -0
  81. package/packages/web/dist/drm/providers/GenericProvider.d.ts +30 -0
  82. package/packages/web/dist/drm/providers/GenericProvider.d.ts.map +1 -0
  83. package/packages/web/dist/drm/providers/GenericProvider.js +104 -0
  84. package/packages/web/dist/drm/providers/GenericProvider.js.map +1 -0
  85. package/packages/web/dist/drm/systems/BaseDRM.d.ts +18 -0
  86. package/packages/web/dist/drm/systems/BaseDRM.d.ts.map +1 -0
  87. package/packages/web/dist/drm/systems/BaseDRM.js +29 -0
  88. package/packages/web/dist/drm/systems/BaseDRM.js.map +1 -0
  89. package/packages/web/dist/drm/systems/FairPlayDRM.d.ts +32 -0
  90. package/packages/web/dist/drm/systems/FairPlayDRM.d.ts.map +1 -0
  91. package/packages/web/dist/drm/systems/FairPlayDRM.js +198 -0
  92. package/packages/web/dist/drm/systems/FairPlayDRM.js.map +1 -0
  93. package/packages/web/dist/drm/systems/PlayReadyDRM.d.ts +9 -0
  94. package/packages/web/dist/drm/systems/PlayReadyDRM.d.ts.map +1 -0
  95. package/packages/web/dist/drm/systems/PlayReadyDRM.js +92 -0
  96. package/packages/web/dist/drm/systems/PlayReadyDRM.js.map +1 -0
  97. package/packages/web/dist/drm/systems/WidevineDRM.d.ts +9 -0
  98. package/packages/web/dist/drm/systems/WidevineDRM.d.ts.map +1 -0
  99. package/packages/web/dist/drm/systems/WidevineDRM.js +73 -0
  100. package/packages/web/dist/drm/systems/WidevineDRM.js.map +1 -0
  101. package/packages/web/dist/drm/types/BunnyNetTypes.d.ts +20 -0
  102. package/packages/web/dist/drm/types/BunnyNetTypes.d.ts.map +1 -0
  103. package/packages/web/dist/drm/types/BunnyNetTypes.js +8 -0
  104. package/packages/web/dist/drm/types/BunnyNetTypes.js.map +1 -0
  105. package/packages/web/dist/drm/types/DRMTypes.d.ts +56 -49
  106. package/packages/web/dist/drm/types/DRMTypes.d.ts.map +1 -1
  107. package/packages/web/dist/drm/types/DRMTypes.js +19 -13
  108. package/packages/web/dist/drm/types/DRMTypes.js.map +1 -1
  109. package/packages/web/dist/drm/utils/BrowserDetector.d.ts +20 -0
  110. package/packages/web/dist/drm/utils/BrowserDetector.d.ts.map +1 -0
  111. package/packages/web/dist/drm/utils/BrowserDetector.js +168 -0
  112. package/packages/web/dist/drm/utils/BrowserDetector.js.map +1 -0
  113. package/packages/web/dist/drm/utils/CertificateManager.d.ts +15 -0
  114. package/packages/web/dist/drm/utils/CertificateManager.d.ts.map +1 -0
  115. package/packages/web/dist/drm/utils/CertificateManager.js +46 -0
  116. package/packages/web/dist/drm/utils/CertificateManager.js.map +1 -0
  117. package/packages/web/dist/drm/utils/DRMErrorHandler.d.ts +7 -0
  118. package/packages/web/dist/drm/utils/DRMErrorHandler.d.ts.map +1 -0
  119. package/packages/web/dist/drm/utils/DRMErrorHandler.js +49 -0
  120. package/packages/web/dist/drm/utils/DRMErrorHandler.js.map +1 -0
  121. package/packages/web/dist/drm/utils/LicenseRequestHandler.d.ts +15 -0
  122. package/packages/web/dist/drm/utils/LicenseRequestHandler.d.ts.map +1 -0
  123. package/packages/web/dist/drm/utils/LicenseRequestHandler.js +110 -0
  124. package/packages/web/dist/drm/utils/LicenseRequestHandler.js.map +1 -0
  125. package/packages/web/dist/react/WebPlayerView.d.ts +1 -18
  126. package/packages/web/dist/react/WebPlayerView.d.ts.map +1 -1
  127. package/packages/web/dist/react/WebPlayerView.js +0 -5
  128. package/packages/web/dist/react/WebPlayerView.js.map +1 -1
  129. package/packages/web/src/WebPlayer.ts +79 -106
  130. package/packages/web/src/drm/DRMManager.ts +214 -99
  131. package/packages/web/src/drm/index.ts +37 -0
  132. package/packages/web/src/drm/providers/BunnyNetProvider.ts +171 -0
  133. package/packages/web/src/drm/providers/GenericProvider.ts +151 -0
  134. package/packages/web/src/drm/systems/BaseDRM.ts +68 -0
  135. package/packages/web/src/drm/systems/FairPlayDRM.ts +306 -0
  136. package/packages/web/src/drm/systems/PlayReadyDRM.ts +132 -0
  137. package/packages/web/src/drm/systems/WidevineDRM.ts +106 -0
  138. package/packages/web/src/drm/types/BunnyNetTypes.ts +35 -0
  139. package/packages/web/src/drm/types/DRMTypes.ts +92 -97
  140. package/packages/web/src/drm/utils/BrowserDetector.ts +233 -0
  141. package/packages/web/src/drm/utils/CertificateManager.ts +86 -0
  142. package/packages/web/src/drm/utils/DRMErrorHandler.ts +84 -0
  143. package/packages/web/src/drm/utils/LicenseRequestHandler.ts +180 -0
  144. package/packages/web/src/react/WebPlayerView.tsx +1 -28
  145. package/packages/web/src/drm/BunnyCDNDRMProvider.ts +0 -104
  146. package/packages/web/src/drm/FairPlayDRMHandler.ts +0 -322
  147. package/packages/web/src/drm/WidevineDRMHandler.ts +0 -246
@@ -1,246 +0,0 @@
1
- /**
2
- * Widevine DRM Handler
3
- * Implements DRM for Chrome, Edge, Firefox using Encrypted Media Extensions (EME)
4
- */
5
-
6
- import { IDRMHandler, WebDRMConfig, DRM_KEY_SYSTEMS, DRMError } from './types/DRMTypes';
7
- import { BunnyCDNDRMProvider } from './BunnyCDNDRMProvider';
8
-
9
- export class WidevineDRMHandler implements IDRMHandler {
10
- private mediaKeys: MediaKeys | null = null;
11
- private config: WebDRMConfig;
12
- private bunnyProvider: BunnyCDNDRMProvider | null = null;
13
- private videoElement: HTMLVideoElement | null = null;
14
- private pendingLicenseRequests: Map<string, (license: ArrayBuffer) => void> = new Map();
15
-
16
- constructor(config: WebDRMConfig) {
17
- this.config = config;
18
-
19
- if (config.provider === 'bunny' && config.bunny) {
20
- this.bunnyProvider = new BunnyCDNDRMProvider(config.bunny);
21
- }
22
- }
23
-
24
- /**
25
- * Check if Widevine is supported in current browser
26
- */
27
- isSupported(): boolean {
28
- return !!(
29
- typeof navigator.requestMediaKeySystemAccess === 'function' &&
30
- typeof window.MediaKeySystemAccess !== 'undefined'
31
- );
32
- }
33
-
34
- /**
35
- * Initialize Widevine DRM system
36
- */
37
- async initialize(): Promise<void> {
38
- if (!this.isSupported()) {
39
- throw new DRMError(
40
- 'Widevine DRM is not supported in this browser',
41
- 'WIDEVINE_NOT_SUPPORTED'
42
- );
43
- }
44
-
45
- console.log('[Widevine] Initializing DRM system...');
46
-
47
- try {
48
- // Request access to Widevine key system
49
- const keySystemAccess = await navigator.requestMediaKeySystemAccess(
50
- DRM_KEY_SYSTEMS.WIDEVINE,
51
- this.getKeySystemConfiguration()
52
- );
53
-
54
- // Create MediaKeys instance
55
- this.mediaKeys = await keySystemAccess.createMediaKeys();
56
-
57
- console.log('[Widevine] MediaKeys created successfully');
58
- } catch (error) {
59
- console.error('[Widevine] Failed to initialize:', error);
60
- throw new DRMError(
61
- 'Failed to initialize Widevine DRM',
62
- 'WIDEVINE_INIT_ERROR',
63
- error
64
- );
65
- }
66
- }
67
-
68
- /**
69
- * Get key system configuration for Widevine
70
- */
71
- private getKeySystemConfiguration(): MediaKeySystemConfiguration[] {
72
- return [{
73
- initDataTypes: ['cenc', 'webm'],
74
- audioCapabilities: [
75
- { contentType: 'audio/mp4; codecs="mp4a.40.2"' },
76
- { contentType: 'audio/webm; codecs="opus"' }
77
- ],
78
- videoCapabilities: [
79
- { contentType: 'video/mp4; codecs="avc1.42E01E"' },
80
- { contentType: 'video/mp4; codecs="avc1.4D401E"' },
81
- { contentType: 'video/mp4; codecs="avc1.640028"' },
82
- { contentType: 'video/webm; codecs="vp9"' }
83
- ],
84
- distinctiveIdentifier: 'optional',
85
- persistentState: 'optional',
86
- sessionTypes: ['temporary']
87
- }];
88
- }
89
-
90
- /**
91
- * Setup DRM for video element
92
- */
93
- async setupDRM(videoElement: HTMLVideoElement, manifestUrl: string): Promise<void> {
94
- if (!this.mediaKeys) {
95
- throw new DRMError('MediaKeys not initialized', 'MEDIAKEYS_NOT_INITIALIZED');
96
- }
97
-
98
- this.videoElement = videoElement;
99
-
100
- // Attach MediaKeys to video element
101
- await videoElement.setMediaKeys(this.mediaKeys);
102
- console.log('[Widevine] MediaKeys attached to video element');
103
-
104
- // Listen for encrypted events
105
- videoElement.addEventListener('encrypted', this.onEncrypted.bind(this));
106
- }
107
-
108
- /**
109
- * Handle 'encrypted' event from video element
110
- */
111
- private async onEncrypted(event: MediaEncryptedEvent): Promise<void> {
112
- console.log('[Widevine] Encrypted event received:', event.initDataType);
113
-
114
- try {
115
- if (!this.mediaKeys) {
116
- throw new DRMError('MediaKeys not available', 'MEDIAKEYS_NOT_AVAILABLE');
117
- }
118
-
119
- // Create media key session
120
- const session = this.mediaKeys.createSession();
121
-
122
- // Listen for message event (license request)
123
- session.addEventListener('message', async (messageEvent: MediaKeyMessageEvent) => {
124
- await this.onMessage(session, messageEvent);
125
- });
126
-
127
- // Generate license request
128
- await session.generateRequest(event.initDataType!, event.initData!);
129
- console.log('[Widevine] License request generated');
130
-
131
- } catch (error) {
132
- console.error('[Widevine] Failed to handle encrypted event:', error);
133
- throw new DRMError(
134
- 'Failed to process encrypted media',
135
- 'ENCRYPTED_EVENT_ERROR',
136
- error
137
- );
138
- }
139
- }
140
-
141
- /**
142
- * Handle license request message
143
- */
144
- private async onMessage(
145
- session: MediaKeySession,
146
- event: MediaKeyMessageEvent
147
- ): Promise<void> {
148
- console.log('[Widevine] License request message:', event.messageType);
149
-
150
- try {
151
- // Get license from server
152
- const license = await this.requestLicense(event.message);
153
-
154
- // Update session with license
155
- await session.update(license);
156
- console.log('[Widevine] License applied successfully');
157
-
158
- } catch (error) {
159
- console.error('[Widevine] Failed to process license:', error);
160
- throw new DRMError(
161
- 'Failed to process DRM license',
162
- 'LICENSE_REQUEST_ERROR',
163
- error
164
- );
165
- }
166
- }
167
-
168
- /**
169
- * Request license from license server
170
- */
171
- private async requestLicense(challenge: ArrayBuffer): Promise<ArrayBuffer> {
172
- const licenseUrl = this.getLicenseUrl();
173
- const headers = await this.getLicenseHeaders();
174
-
175
- console.log('[Widevine] Requesting license from:', licenseUrl);
176
-
177
- try {
178
- const response = await fetch(licenseUrl, {
179
- method: 'POST',
180
- headers,
181
- body: challenge
182
- });
183
-
184
- if (!response.ok) {
185
- throw new Error(`License request failed: ${response.status} ${response.statusText}`);
186
- }
187
-
188
- const license = await response.arrayBuffer();
189
- console.log('[Widevine] License received:', license.byteLength, 'bytes');
190
-
191
- return license;
192
-
193
- } catch (error) {
194
- console.error('[Widevine] License request failed:', error);
195
- throw new DRMError(
196
- 'Failed to retrieve DRM license',
197
- 'LICENSE_FETCH_ERROR',
198
- error
199
- );
200
- }
201
- }
202
-
203
- /**
204
- * Get license URL based on provider
205
- */
206
- private getLicenseUrl(): string {
207
- if (this.config.provider === 'bunny' && this.bunnyProvider) {
208
- return this.bunnyProvider.getWidevineLicenseUrl();
209
- } else if (this.config.provider === 'generic' && this.config.generic) {
210
- return this.config.generic.licenseUrl;
211
- }
212
- throw new DRMError('No license URL configured', 'NO_LICENSE_URL');
213
- }
214
-
215
- /**
216
- * Get headers for license request
217
- */
218
- private async getLicenseHeaders(): Promise<Record<string, string>> {
219
- if (this.config.provider === 'bunny' && this.bunnyProvider) {
220
- return await this.bunnyProvider.getLicenseHeaders();
221
- } else if (this.config.provider === 'generic' && this.config.generic) {
222
- return this.config.generic.headers || { 'Content-Type': 'application/octet-stream' };
223
- }
224
- return { 'Content-Type': 'application/octet-stream' };
225
- }
226
-
227
- /**
228
- * Handle license request (called by DRM manager)
229
- */
230
- async onLicenseRequest(licenseRequest: ArrayBuffer): Promise<ArrayBuffer> {
231
- return await this.requestLicense(licenseRequest);
232
- }
233
-
234
- /**
235
- * Cleanup resources
236
- */
237
- destroy(): void {
238
- if (this.videoElement) {
239
- this.videoElement.removeEventListener('encrypted', this.onEncrypted.bind(this));
240
- this.videoElement = null;
241
- }
242
- this.mediaKeys = null;
243
- this.bunnyProvider = null;
244
- this.pendingLicenseRequests.clear();
245
- }
246
- }