unified-video-framework 1.4.425 → 1.4.426

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 (100) hide show
  1. package/package.json +1 -1
  2. package/packages/core/dist/VideoPlayerFactory.d.ts.map +1 -1
  3. package/packages/core/dist/VideoPlayerFactory.js +7 -0
  4. package/packages/core/dist/VideoPlayerFactory.js.map +1 -1
  5. package/packages/core/dist/index.d.ts +2 -0
  6. package/packages/core/dist/index.d.ts.map +1 -1
  7. package/packages/core/dist/index.js +1 -0
  8. package/packages/core/dist/index.js.map +1 -1
  9. package/packages/core/dist/telemetry/TelemetryManager.d.ts +20 -0
  10. package/packages/core/dist/telemetry/TelemetryManager.d.ts.map +1 -0
  11. package/packages/core/dist/telemetry/TelemetryManager.js +49 -0
  12. package/packages/core/dist/telemetry/TelemetryManager.js.map +1 -0
  13. package/packages/core/src/VideoPlayerFactory.ts +28 -18
  14. package/packages/core/src/index.ts +4 -0
  15. package/packages/core/src/telemetry/TelemetryManager.ts +72 -0
  16. package/packages/web/dist/WebPlayer.d.ts +0 -2
  17. package/packages/web/dist/WebPlayer.d.ts.map +1 -1
  18. package/packages/web/dist/WebPlayer.js +0 -50
  19. package/packages/web/dist/WebPlayer.js.map +1 -1
  20. package/packages/web/dist/react/WebPlayerView.d.ts +0 -1
  21. package/packages/web/dist/react/WebPlayerView.d.ts.map +1 -1
  22. package/packages/web/dist/react/WebPlayerView.js +0 -5
  23. package/packages/web/dist/react/WebPlayerView.js.map +1 -1
  24. package/packages/web/src/WebPlayer.ts +0 -65
  25. package/packages/web/src/react/WebPlayerView.tsx +0 -6
  26. package/scripts/fix-imports.js +8 -54
  27. package/packages/core/src/BasePlayer.d.ts +0 -61
  28. package/packages/core/src/BasePlayer.d.ts.map +0 -1
  29. package/packages/core/src/BasePlayer.js +0 -175
  30. package/packages/core/src/BasePlayer.js.map +0 -1
  31. package/packages/core/src/VideoPlayerFactory.d.ts +0 -8
  32. package/packages/core/src/VideoPlayerFactory.d.ts.map +0 -1
  33. package/packages/core/src/VideoPlayerFactory.js +0 -95
  34. package/packages/core/src/VideoPlayerFactory.js.map +0 -1
  35. package/packages/core/src/analytics/adapters/PlayerAnalyticsAdapter.d.ts +0 -18
  36. package/packages/core/src/analytics/adapters/PlayerAnalyticsAdapter.d.ts.map +0 -1
  37. package/packages/core/src/analytics/adapters/PlayerAnalyticsAdapter.js +0 -117
  38. package/packages/core/src/analytics/adapters/PlayerAnalyticsAdapter.js.map +0 -1
  39. package/packages/core/src/analytics/core/AnalyticsProvider.d.ts +0 -18
  40. package/packages/core/src/analytics/core/AnalyticsProvider.d.ts.map +0 -1
  41. package/packages/core/src/analytics/core/AnalyticsProvider.js +0 -99
  42. package/packages/core/src/analytics/core/AnalyticsProvider.js.map +0 -1
  43. package/packages/core/src/analytics/core/DynamicAnalyticsManager.d.ts +0 -20
  44. package/packages/core/src/analytics/core/DynamicAnalyticsManager.d.ts.map +0 -1
  45. package/packages/core/src/analytics/core/DynamicAnalyticsManager.js +0 -161
  46. package/packages/core/src/analytics/core/DynamicAnalyticsManager.js.map +0 -1
  47. package/packages/core/src/analytics/core/EventBatcher.d.ts +0 -32
  48. package/packages/core/src/analytics/core/EventBatcher.d.ts.map +0 -1
  49. package/packages/core/src/analytics/core/EventBatcher.js +0 -98
  50. package/packages/core/src/analytics/core/EventBatcher.js.map +0 -1
  51. package/packages/core/src/analytics/core/PlayerAnalytics.d.ts +0 -19
  52. package/packages/core/src/analytics/core/PlayerAnalytics.d.ts.map +0 -1
  53. package/packages/core/src/analytics/core/PlayerAnalytics.js +0 -80
  54. package/packages/core/src/analytics/core/PlayerAnalytics.js.map +0 -1
  55. package/packages/core/src/analytics/index.d.ts +0 -13
  56. package/packages/core/src/analytics/index.d.ts.map +0 -1
  57. package/packages/core/src/analytics/index.js +0 -13
  58. package/packages/core/src/analytics/index.js.map +0 -1
  59. package/packages/core/src/analytics/types/AnalyticsTypes.d.ts +0 -239
  60. package/packages/core/src/analytics/types/AnalyticsTypes.d.ts.map +0 -1
  61. package/packages/core/src/analytics/types/AnalyticsTypes.js +0 -8
  62. package/packages/core/src/analytics/types/AnalyticsTypes.js.map +0 -1
  63. package/packages/core/src/analytics/utils/DeviceDetection.d.ts +0 -27
  64. package/packages/core/src/analytics/utils/DeviceDetection.d.ts.map +0 -1
  65. package/packages/core/src/analytics/utils/DeviceDetection.js +0 -184
  66. package/packages/core/src/analytics/utils/DeviceDetection.js.map +0 -1
  67. package/packages/core/src/chapter-manager.d.ts +0 -39
  68. package/packages/core/src/chapter-manager.d.ts.map +0 -1
  69. package/packages/core/src/chapter-manager.js +0 -173
  70. package/packages/core/src/chapter-manager.js.map +0 -1
  71. package/packages/core/src/index.d.ts +0 -10
  72. package/packages/core/src/index.d.ts.map +0 -1
  73. package/packages/core/src/index.js +0 -8
  74. package/packages/core/src/index.js.map +0 -1
  75. package/packages/core/src/interfaces/IVideoPlayer.d.ts +0 -229
  76. package/packages/core/src/interfaces/IVideoPlayer.d.ts.map +0 -1
  77. package/packages/core/src/interfaces/IVideoPlayer.js +0 -2
  78. package/packages/core/src/interfaces/IVideoPlayer.js.map +0 -1
  79. package/packages/core/src/interfaces.d.ts +0 -455
  80. package/packages/core/src/interfaces.d.ts.map +0 -1
  81. package/packages/core/src/interfaces.js +0 -32
  82. package/packages/core/src/interfaces.js.map +0 -1
  83. package/packages/core/src/utils/EventEmitter.d.ts +0 -14
  84. package/packages/core/src/utils/EventEmitter.d.ts.map +0 -1
  85. package/packages/core/src/utils/EventEmitter.js +0 -55
  86. package/packages/core/src/utils/EventEmitter.js.map +0 -1
  87. package/packages/web/src/drm/DRMManager.ts +0 -224
  88. package/packages/web/src/drm/index.ts +0 -37
  89. package/packages/web/src/drm/providers/BunnyNetProvider.ts +0 -171
  90. package/packages/web/src/drm/providers/GenericProvider.ts +0 -151
  91. package/packages/web/src/drm/systems/BaseDRM.ts +0 -68
  92. package/packages/web/src/drm/systems/FairPlayDRM.ts +0 -317
  93. package/packages/web/src/drm/systems/PlayReadyDRM.ts +0 -156
  94. package/packages/web/src/drm/systems/WidevineDRM.ts +0 -133
  95. package/packages/web/src/drm/types/BunnyNetTypes.ts +0 -35
  96. package/packages/web/src/drm/types/DRMTypes.ts +0 -93
  97. package/packages/web/src/drm/utils/BrowserDetector.ts +0 -281
  98. package/packages/web/src/drm/utils/CertificateManager.ts +0 -86
  99. package/packages/web/src/drm/utils/DRMErrorHandler.ts +0 -84
  100. package/packages/web/src/drm/utils/LicenseRequestHandler.ts +0 -180
@@ -1,93 +0,0 @@
1
- /**
2
- * DRM Type Definitions
3
- * Core type definitions and enums for DRM functionality
4
- */
5
-
6
- import type { DRMConfig, DRMType } from '@unified-video/core';
7
- import { DRMType as DRMTypeEnum } from '@unified-video/core';
8
-
9
- // Extended DRM configuration for internal use
10
- export interface ExtendedDRMConfig extends DRMConfig {
11
- // Provider-specific settings
12
- provider?: 'bunny' | 'generic' | string;
13
-
14
- // Library/Video IDs for Bunny.net
15
- libraryId?: string;
16
- videoId?: string;
17
-
18
- // Advanced options
19
- retryConfig?: {
20
- maxRetries: number;
21
- retryDelay: number;
22
- };
23
-
24
- // Debugging
25
- debug?: boolean;
26
- }
27
-
28
- // Browser DRM capabilities
29
- export interface DRMCapabilities {
30
- widevine: boolean;
31
- fairplay: boolean;
32
- playready: boolean;
33
- supportedType: DRMType | null;
34
- }
35
-
36
- // License request/response types
37
- export interface LicenseRequest {
38
- url: string;
39
- method: 'POST' | 'GET';
40
- headers: Record<string, string>;
41
- body: ArrayBuffer | string;
42
- responseType: 'arraybuffer' | 'text' | 'json';
43
- }
44
-
45
- export interface LicenseResponse {
46
- license: ArrayBuffer;
47
- metadata?: any;
48
- }
49
-
50
- // EME event types
51
- export interface EMEMessageEvent {
52
- messageType: string;
53
- message: ArrayBuffer;
54
- }
55
-
56
- // DRM initialization result
57
- export interface DRMInitResult {
58
- success: boolean;
59
- drmType: DRMType;
60
- keySystem: string;
61
- error?: DRMError;
62
- }
63
-
64
- // DRM-specific errors
65
- export interface DRMError {
66
- code: DRMErrorCode;
67
- message: string;
68
- fatal: boolean;
69
- details?: any;
70
- systemError?: any;
71
- }
72
-
73
- export enum DRMErrorCode {
74
- UNSUPPORTED_BROWSER = 'DRM_UNSUPPORTED_BROWSER',
75
- CERTIFICATE_LOAD_FAILED = 'DRM_CERTIFICATE_LOAD_FAILED',
76
- LICENSE_REQUEST_FAILED = 'DRM_LICENSE_REQUEST_FAILED',
77
- KEY_SYSTEM_ACCESS_DENIED = 'DRM_KEY_SYSTEM_ACCESS_DENIED',
78
- MEDIA_KEYS_CREATION_FAILED = 'DRM_MEDIA_KEYS_CREATION_FAILED',
79
- SESSION_CREATION_FAILED = 'DRM_SESSION_CREATION_FAILED',
80
- LICENSE_INVALID = 'DRM_LICENSE_INVALID',
81
- CONFIGURATION_ERROR = 'DRM_CONFIGURATION_ERROR',
82
- NETWORK_ERROR = 'DRM_NETWORK_ERROR',
83
- SECURE_CONTEXT_REQUIRED = 'DRM_SECURE_CONTEXT_REQUIRED',
84
- TIMEOUT = 'DRM_TIMEOUT',
85
- }
86
-
87
- // Key system mappings
88
- export const KEY_SYSTEMS: Record<DRMType, string[]> = {
89
- [DRMTypeEnum.WIDEVINE]: ['com.widevine.alpha'],
90
- [DRMTypeEnum.PLAYREADY]: ['com.microsoft.playready', 'com.microsoft.playready.recommendation'],
91
- [DRMTypeEnum.FAIRPLAY]: ['com.apple.fps.1_0', 'com.apple.fps'],
92
- [DRMTypeEnum.CLEARKEY]: ['webkit-org.w3.clearkey', 'org.w3.clearkey'],
93
- };
@@ -1,281 +0,0 @@
1
- /**
2
- * Browser DRM Detector
3
- * Detects browser capabilities and determines optimal DRM system
4
- */
5
-
6
- import type { DRMType } from '@unified-video/core';
7
- import { DRMCapabilities, KEY_SYSTEMS } from '../types/DRMTypes';
8
- import { DRMType as DRMTypeEnum } from '@unified-video/core';
9
-
10
- export class BrowserDetector {
11
- private static instance: BrowserDetector;
12
- private capabilities: DRMCapabilities | null = null;
13
-
14
- private constructor() { }
15
-
16
- static getInstance(): BrowserDetector {
17
- if (!BrowserDetector.instance) {
18
- BrowserDetector.instance = new BrowserDetector();
19
- }
20
- return BrowserDetector.instance;
21
- }
22
-
23
- /**
24
- * Detect DRM capabilities of current browser
25
- */
26
- async detectCapabilities(): Promise<DRMCapabilities> {
27
- if (this.capabilities) {
28
- return this.capabilities;
29
- }
30
-
31
- const capabilities: DRMCapabilities = {
32
- widevine: false,
33
- fairplay: false,
34
- playready: false,
35
- supportedType: null,
36
- };
37
-
38
- // Check for FairPlay (Safari/iOS) - highest priority on Apple devices
39
- if (this.isSafari() || this.isWebKitBased()) {
40
- capabilities.fairplay = await this.checkFairPlaySupport();
41
- if (capabilities.fairplay) {
42
- capabilities.supportedType = DRMTypeEnum.FAIRPLAY;
43
- }
44
- }
45
-
46
- // Check for Widevine (Chrome, Firefox, Edge)
47
- if (!capabilities.supportedType) {
48
- capabilities.widevine = await this.checkWidevineSupport();
49
- if (capabilities.widevine) {
50
- capabilities.supportedType = DRMTypeEnum.WIDEVINE;
51
- }
52
- }
53
-
54
- // Check for PlayReady (Edge, IE)
55
- if (!capabilities.supportedType && this.isEdge()) {
56
- capabilities.playready = await this.checkPlayReadySupport();
57
- if (capabilities.playready) {
58
- capabilities.supportedType = DRMTypeEnum.PLAYREADY;
59
- }
60
- }
61
-
62
- this.capabilities = capabilities;
63
- return capabilities;
64
- }
65
-
66
- /**
67
- * Get recommended DRM type for current browser
68
- */
69
- async getRecommendedDRMType(): Promise<DRMType | null> {
70
- const caps = await this.detectCapabilities();
71
- return caps.supportedType;
72
- }
73
-
74
- /**
75
- * Check if specific DRM type is supported
76
- */
77
- async isDRMTypeSupported(drmType: DRMType): Promise<boolean> {
78
- const caps = await this.detectCapabilities();
79
- switch (drmType) {
80
- case DRMTypeEnum.WIDEVINE:
81
- return caps.widevine;
82
- case DRMTypeEnum.FAIRPLAY:
83
- return caps.fairplay;
84
- case DRMTypeEnum.PLAYREADY:
85
- return caps.playready;
86
- default:
87
- return false;
88
- }
89
- }
90
-
91
- /**
92
- * Check if browser is Safari
93
- */
94
- private isSafari(): boolean {
95
- const ua = navigator.userAgent.toLowerCase();
96
- return ua.includes('safari') && !ua.includes('chrome') && !ua.includes('chromium');
97
- }
98
-
99
- /**
100
- * Check if browser is WebKit-based
101
- */
102
- private isWebKitBased(): boolean {
103
- return 'WebKitMediaKeys' in window;
104
- }
105
-
106
- /**
107
- * Check if browser is Edge
108
- */
109
- private isEdge(): boolean {
110
- const ua = navigator.userAgent.toLowerCase();
111
- return ua.includes('edg/');
112
- }
113
-
114
- /**
115
- * Check FairPlay support
116
- */
117
- private async checkFairPlaySupport(): Promise<boolean> {
118
- try {
119
- // Check for WebKit-specific FairPlay API
120
- if ('WebKitMediaKeys' in window) {
121
- return true;
122
- }
123
-
124
- // Check via EME API
125
- if (navigator.requestMediaKeySystemAccess) {
126
- const config: MediaKeySystemConfiguration[] = [{
127
- initDataTypes: ['sinf', 'skd'],
128
- videoCapabilities: [{ contentType: 'application/vnd.apple.mpegurl' }],
129
- }];
130
-
131
- for (const keySystem of KEY_SYSTEMS[DRMTypeEnum.FAIRPLAY]) {
132
- try {
133
- await navigator.requestMediaKeySystemAccess(keySystem, config);
134
- return true;
135
- } catch (e) {
136
- // Try next key system
137
- continue;
138
- }
139
- }
140
- }
141
-
142
- return false;
143
- } catch {
144
- return false;
145
- }
146
- }
147
-
148
- /**
149
- * Check Widevine support
150
- */
151
- private async checkWidevineSupport(): Promise<boolean> {
152
- try {
153
- if (!navigator.requestMediaKeySystemAccess) {
154
- console.warn('[BrowserDetector] EME API (requestMediaKeySystemAccess) not available. Secure context check:', window.isSecureContext);
155
- return false;
156
- }
157
-
158
- const configs: MediaKeySystemConfiguration[] = [
159
- // Standard config with robustness
160
- {
161
- initDataTypes: ['cenc'],
162
- videoCapabilities: [{
163
- contentType: 'video/mp4; codecs="avc1.42E01E"',
164
- robustness: 'SW_SECURE_CRYPTO'
165
- }],
166
- audioCapabilities: [{
167
- contentType: 'audio/mp4; codecs="mp4a.40.2"',
168
- robustness: 'SW_SECURE_CRYPTO'
169
- }]
170
- },
171
- // More permissive config (no robustness)
172
- {
173
- initDataTypes: ['cenc'],
174
- videoCapabilities: [{
175
- contentType: 'video/mp4; codecs="avc1.42E01E"'
176
- }]
177
- },
178
- // Baseline config
179
- {
180
- initDataTypes: ['cenc'],
181
- videoCapabilities: [{
182
- contentType: 'video/mp4; codecs="avc1.4d401e"'
183
- }]
184
- }
185
- ];
186
-
187
- for (const keySystem of KEY_SYSTEMS[DRMTypeEnum.WIDEVINE]) {
188
- for (const config of configs) {
189
- try {
190
- await navigator.requestMediaKeySystemAccess(keySystem, [config]);
191
- console.log(`[BrowserDetector] Widevine supported with system: ${keySystem} and config:`, config);
192
- return true;
193
- } catch (e) {
194
- // Try next config
195
- continue;
196
- }
197
- }
198
- }
199
-
200
- console.warn('[BrowserDetector] Widevine support check failed for all configurations');
201
- return false;
202
- } catch (err) {
203
- console.error('[BrowserDetector] Error checking Widevine support:', err);
204
- return false;
205
- }
206
- }
207
-
208
- /**
209
- * Check PlayReady support
210
- */
211
- private async checkPlayReadySupport(): Promise<boolean> {
212
- try {
213
- if (!navigator.requestMediaKeySystemAccess) {
214
- return false;
215
- }
216
-
217
- const configs: MediaKeySystemConfiguration[] = [
218
- // Standard config
219
- {
220
- initDataTypes: ['cenc'],
221
- videoCapabilities: [{
222
- contentType: 'video/mp4; codecs="avc1.42E01E"',
223
- robustness: 'SW_SECURE_CRYPTO'
224
- }],
225
- audioCapabilities: [{
226
- contentType: 'audio/mp4; codecs="mp4a.40.2"',
227
- robustness: 'SW_SECURE_CRYPTO'
228
- }]
229
- },
230
- // More permissive config
231
- {
232
- initDataTypes: ['cenc'],
233
- videoCapabilities: [{
234
- contentType: 'video/mp4; codecs="avc1.42E01E"'
235
- }]
236
- }
237
- ];
238
-
239
- for (const keySystem of KEY_SYSTEMS[DRMTypeEnum.PLAYREADY]) {
240
- for (const config of configs) {
241
- try {
242
- await navigator.requestMediaKeySystemAccess(keySystem, [config]);
243
- console.log(`[BrowserDetector] PlayReady supported with system: ${keySystem} and config:`, config);
244
- return true;
245
- } catch (e) {
246
- // Try next config
247
- continue;
248
- }
249
- }
250
- }
251
-
252
- console.warn('[BrowserDetector] PlayReady support check failed for all configurations');
253
- return false;
254
- } catch (err) {
255
- console.error('[BrowserDetector] Error checking PlayReady support:', err);
256
- return false;
257
- }
258
- }
259
-
260
- /**
261
- * Get user-friendly browser name
262
- */
263
- getBrowserName(): string {
264
- const ua = navigator.userAgent.toLowerCase();
265
-
266
- if (ua.includes('edg/')) return 'Edge';
267
- if (ua.includes('chrome') || ua.includes('chromium')) return 'Chrome';
268
- if (ua.includes('firefox')) return 'Firefox';
269
- if (ua.includes('safari')) return 'Safari';
270
- if (ua.includes('opera') || ua.includes('opr/')) return 'Opera';
271
-
272
- return 'Unknown';
273
- }
274
-
275
- /**
276
- * Reset cached capabilities (useful for testing)
277
- */
278
- resetCapabilities(): void {
279
- this.capabilities = null;
280
- }
281
- }
@@ -1,86 +0,0 @@
1
- /**
2
- * Certificate Manager
3
- * Manages FairPlay DRM certificates with in-memory caching
4
- */
5
-
6
- export class CertificateManager {
7
- private static instance: CertificateManager;
8
- private cache: Map<string, ArrayBuffer>;
9
- private maxCacheSize: number = 10; // Max number of certificates to cache
10
-
11
- private constructor() {
12
- this.cache = new Map();
13
- }
14
-
15
- static getInstance(): CertificateManager {
16
- if (!CertificateManager.instance) {
17
- CertificateManager.instance = new CertificateManager();
18
- }
19
- return CertificateManager.instance;
20
- }
21
-
22
- /**
23
- * Get certificate from cache
24
- */
25
- getCertificate(url: string): ArrayBuffer | null {
26
- return this.cache.get(url) || null;
27
- }
28
-
29
- /**
30
- * Store certificate in cache
31
- */
32
- setCertificate(url: string, certificate: ArrayBuffer): void {
33
- // Implement LRU eviction if cache is full
34
- if (this.cache.size >= this.maxCacheSize && !this.cache.has(url)) {
35
- const firstKey = this.cache.keys().next().value;
36
- if (firstKey) {
37
- this.cache.delete(firstKey);
38
- }
39
- }
40
-
41
- this.cache.set(url, certificate);
42
- }
43
-
44
- /**
45
- * Check if certificate is cached
46
- */
47
- hasCertificate(url: string): boolean {
48
- return this.cache.has(url);
49
- }
50
-
51
- /**
52
- * Clear all cached certificates
53
- */
54
- clearCache(): void {
55
- this.cache.clear();
56
- }
57
-
58
- /**
59
- * Remove specific certificate from cache
60
- */
61
- removeCertificate(url: string): boolean {
62
- return this.cache.delete(url);
63
- }
64
-
65
- /**
66
- * Get cache size
67
- */
68
- getCacheSize(): number {
69
- return this.cache.size;
70
- }
71
-
72
- /**
73
- * Set max cache size
74
- */
75
- setMaxCacheSize(size: number): void {
76
- this.maxCacheSize = size;
77
-
78
- // Evict old entries if current size exceeds new max
79
- while (this.cache.size > this.maxCacheSize) {
80
- const firstKey = this.cache.keys().next().value;
81
- if (firstKey) {
82
- this.cache.delete(firstKey);
83
- }
84
- }
85
- }
86
- }
@@ -1,84 +0,0 @@
1
- /**
2
- * DRM Error Handler
3
- * Converts DRM errors to user-friendly messages
4
- */
5
-
6
- import { DRMError, DRMErrorCode } from '../types/DRMTypes';
7
-
8
- export class DRMErrorHandler {
9
- /**
10
- * Get user-friendly error message
11
- */
12
- static getUserFriendlyMessage(error: DRMError): string {
13
- switch (error.code) {
14
- case DRMErrorCode.UNSUPPORTED_BROWSER:
15
- return 'DRM is not supported in this browser. Please use Chrome, Safari, Firefox, or Edge.';
16
-
17
- case DRMErrorCode.CERTIFICATE_LOAD_FAILED:
18
- return 'Failed to load DRM certificate. Please check your internet connection.';
19
-
20
- case DRMErrorCode.LICENSE_REQUEST_FAILED:
21
- return 'Failed to obtain content license. Please check your internet connection and try again.';
22
-
23
- case DRMErrorCode.KEY_SYSTEM_ACCESS_DENIED:
24
- return 'Access to DRM system was denied. Please ensure DRM is enabled in your browser settings.';
25
-
26
- case DRMErrorCode.MEDIA_KEYS_CREATION_FAILED:
27
- return 'Failed to initialize DRM protection. Please try refreshing the page.';
28
-
29
- case DRMErrorCode.SESSION_CREATION_FAILED:
30
- return 'Failed to create secure playback session. Please try again.';
31
-
32
- case DRMErrorCode.LICENSE_INVALID:
33
- return 'Invalid or expired content license. You may not have permission to view this content.';
34
-
35
- case DRMErrorCode.CONFIGURATION_ERROR:
36
- return 'DRM configuration error. Please contact support.';
37
-
38
- case DRMErrorCode.NETWORK_ERROR:
39
- return 'Network error while loading protected content. Please check your internet connection.';
40
-
41
- case DRMErrorCode.TIMEOUT:
42
- return 'DRM initialization timed out. Please try again.';
43
-
44
- default:
45
- return 'An error occurred while loading protected content. Please try again.';
46
- }
47
- }
48
-
49
- /**
50
- * Get technical error message for developers
51
- */
52
- static getTechnicalMessage(error: DRMError): string {
53
- let message = `[${error.code}] ${error.message}`;
54
-
55
- if (error.details) {
56
- message += `\nDetails: ${JSON.stringify(error.details, null, 2)}`;
57
- }
58
-
59
- if (error.systemError) {
60
- message += `\nSystem Error: ${error.systemError}`;
61
- }
62
-
63
- return message;
64
- }
65
-
66
- /**
67
- * Create standardized DRM error
68
- */
69
- static createError(
70
- code: DRMErrorCode,
71
- message: string,
72
- fatal: boolean = true,
73
- details?: any,
74
- systemError?: any
75
- ): DRMError {
76
- return {
77
- code,
78
- message,
79
- fatal,
80
- details,
81
- systemError,
82
- };
83
- }
84
- }