unified-video-framework 1.4.413 → 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.
- package/package.json +6 -1
- package/packages/core/src/BasePlayer.d.ts +61 -0
- package/packages/core/src/BasePlayer.d.ts.map +1 -0
- package/packages/core/src/BasePlayer.js +175 -0
- package/packages/core/src/BasePlayer.js.map +1 -0
- package/packages/core/src/VideoPlayerFactory.d.ts +8 -0
- package/packages/core/src/VideoPlayerFactory.d.ts.map +1 -0
- package/packages/core/src/VideoPlayerFactory.js +95 -0
- package/packages/core/src/VideoPlayerFactory.js.map +1 -0
- package/packages/core/src/analytics/adapters/PlayerAnalyticsAdapter.d.ts +18 -0
- package/packages/core/src/analytics/adapters/PlayerAnalyticsAdapter.d.ts.map +1 -0
- package/packages/core/src/analytics/adapters/PlayerAnalyticsAdapter.js +117 -0
- package/packages/core/src/analytics/adapters/PlayerAnalyticsAdapter.js.map +1 -0
- package/packages/core/src/analytics/core/AnalyticsProvider.d.ts +18 -0
- package/packages/core/src/analytics/core/AnalyticsProvider.d.ts.map +1 -0
- package/packages/core/src/analytics/core/AnalyticsProvider.js +99 -0
- package/packages/core/src/analytics/core/AnalyticsProvider.js.map +1 -0
- package/packages/core/src/analytics/core/DynamicAnalyticsManager.d.ts +20 -0
- package/packages/core/src/analytics/core/DynamicAnalyticsManager.d.ts.map +1 -0
- package/packages/core/src/analytics/core/DynamicAnalyticsManager.js +161 -0
- package/packages/core/src/analytics/core/DynamicAnalyticsManager.js.map +1 -0
- package/packages/core/src/analytics/core/EventBatcher.d.ts +32 -0
- package/packages/core/src/analytics/core/EventBatcher.d.ts.map +1 -0
- package/packages/core/src/analytics/core/EventBatcher.js +98 -0
- package/packages/core/src/analytics/core/EventBatcher.js.map +1 -0
- package/packages/core/src/analytics/core/PlayerAnalytics.d.ts +19 -0
- package/packages/core/src/analytics/core/PlayerAnalytics.d.ts.map +1 -0
- package/packages/core/src/analytics/core/PlayerAnalytics.js +80 -0
- package/packages/core/src/analytics/core/PlayerAnalytics.js.map +1 -0
- package/packages/core/src/analytics/index.d.ts +13 -0
- package/packages/core/src/analytics/index.d.ts.map +1 -0
- package/packages/core/src/analytics/index.js +13 -0
- package/packages/core/src/analytics/index.js.map +1 -0
- package/packages/core/src/analytics/types/AnalyticsTypes.d.ts +239 -0
- package/packages/core/src/analytics/types/AnalyticsTypes.d.ts.map +1 -0
- package/packages/core/src/analytics/types/AnalyticsTypes.js +8 -0
- package/packages/core/src/analytics/types/AnalyticsTypes.js.map +1 -0
- package/packages/core/src/analytics/utils/DeviceDetection.d.ts +27 -0
- package/packages/core/src/analytics/utils/DeviceDetection.d.ts.map +1 -0
- package/packages/core/src/analytics/utils/DeviceDetection.js +184 -0
- package/packages/core/src/analytics/utils/DeviceDetection.js.map +1 -0
- package/packages/core/src/chapter-manager.d.ts +39 -0
- package/packages/core/src/chapter-manager.d.ts.map +1 -0
- package/packages/core/src/chapter-manager.js +173 -0
- package/packages/core/src/chapter-manager.js.map +1 -0
- package/packages/core/src/index.d.ts +10 -0
- package/packages/core/src/index.d.ts.map +1 -0
- package/packages/core/src/index.js +8 -0
- package/packages/core/src/index.js.map +1 -0
- package/packages/core/src/interfaces/IVideoPlayer.d.ts +229 -0
- package/packages/core/src/interfaces/IVideoPlayer.d.ts.map +1 -0
- package/packages/core/src/interfaces/IVideoPlayer.js +2 -0
- package/packages/core/src/interfaces/IVideoPlayer.js.map +1 -0
- package/packages/core/src/interfaces.d.ts +455 -0
- package/packages/core/src/interfaces.d.ts.map +1 -0
- package/packages/core/src/interfaces.js +32 -0
- package/packages/core/src/interfaces.js.map +1 -0
- package/packages/core/src/utils/EventEmitter.d.ts +14 -0
- package/packages/core/src/utils/EventEmitter.d.ts.map +1 -0
- package/packages/core/src/utils/EventEmitter.js +55 -0
- package/packages/core/src/utils/EventEmitter.js.map +1 -0
- package/packages/web/dist/drm/DRMManager.d.ts +1 -1
- package/packages/web/dist/drm/DRMManager.d.ts.map +1 -1
- package/packages/web/dist/drm/DRMManager.js +7 -7
- package/packages/web/dist/drm/DRMManager.js.map +1 -1
- package/packages/web/dist/drm/providers/BunnyNetProvider.d.ts +1 -1
- package/packages/web/dist/drm/providers/BunnyNetProvider.d.ts.map +1 -1
- package/packages/web/dist/drm/providers/BunnyNetProvider.js +13 -13
- package/packages/web/dist/drm/providers/BunnyNetProvider.js.map +1 -1
- package/packages/web/dist/drm/providers/GenericProvider.d.ts +1 -1
- package/packages/web/dist/drm/providers/GenericProvider.d.ts.map +1 -1
- package/packages/web/dist/drm/providers/GenericProvider.js +8 -6
- package/packages/web/dist/drm/providers/GenericProvider.js.map +1 -1
- package/packages/web/dist/drm/systems/FairPlayDRM.d.ts.map +1 -1
- package/packages/web/dist/drm/systems/FairPlayDRM.js +2 -2
- package/packages/web/dist/drm/systems/FairPlayDRM.js.map +1 -1
- package/packages/web/dist/drm/systems/PlayReadyDRM.d.ts.map +1 -1
- package/packages/web/dist/drm/systems/PlayReadyDRM.js +7 -7
- package/packages/web/dist/drm/systems/PlayReadyDRM.js.map +1 -1
- package/packages/web/dist/drm/systems/WidevineDRM.d.ts.map +1 -1
- package/packages/web/dist/drm/systems/WidevineDRM.js +2 -2
- package/packages/web/dist/drm/systems/WidevineDRM.js.map +1 -1
- package/packages/web/dist/drm/types/BunnyNetTypes.d.ts +1 -1
- package/packages/web/dist/drm/types/BunnyNetTypes.d.ts.map +1 -1
- package/packages/web/dist/drm/types/DRMTypes.d.ts +1 -1
- package/packages/web/dist/drm/types/DRMTypes.d.ts.map +1 -1
- package/packages/web/dist/drm/types/DRMTypes.js +5 -5
- package/packages/web/dist/drm/types/DRMTypes.js.map +1 -1
- package/packages/web/dist/drm/utils/BrowserDetector.d.ts +1 -1
- package/packages/web/dist/drm/utils/BrowserDetector.d.ts.map +1 -1
- package/packages/web/dist/drm/utils/BrowserDetector.js +10 -10
- package/packages/web/dist/drm/utils/BrowserDetector.js.map +1 -1
- package/packages/web/src/drm/DRMManager.ts +214 -213
- package/packages/web/src/drm/index.ts +37 -37
- package/packages/web/src/drm/providers/BunnyNetProvider.ts +171 -170
- package/packages/web/src/drm/providers/GenericProvider.ts +151 -148
- package/packages/web/src/drm/systems/BaseDRM.ts +68 -68
- package/packages/web/src/drm/systems/FairPlayDRM.ts +306 -305
- package/packages/web/src/drm/systems/PlayReadyDRM.ts +132 -131
- package/packages/web/src/drm/systems/WidevineDRM.ts +106 -105
- package/packages/web/src/drm/types/BunnyNetTypes.ts +35 -35
- package/packages/web/src/drm/types/DRMTypes.ts +92 -91
- package/packages/web/src/drm/utils/BrowserDetector.ts +233 -232
- package/packages/web/src/drm/utils/CertificateManager.ts +86 -86
- package/packages/web/src/drm/utils/DRMErrorHandler.ts +84 -84
- package/packages/web/src/drm/utils/LicenseRequestHandler.ts +180 -180
|
@@ -1,180 +1,180 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* License Request Handler
|
|
3
|
-
* Centralized HTTP request handling for license servers with retry logic
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { ExtendedDRMConfig, LicenseRequest, LicenseResponse, DRMErrorCode } from '../types/DRMTypes';
|
|
7
|
-
|
|
8
|
-
export class LicenseRequestHandler {
|
|
9
|
-
private config: ExtendedDRMConfig;
|
|
10
|
-
private debug: boolean;
|
|
11
|
-
|
|
12
|
-
constructor(config: ExtendedDRMConfig, debug: boolean = false) {
|
|
13
|
-
this.config = config;
|
|
14
|
-
this.debug = debug;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* Request license from server with retry logic
|
|
19
|
-
*/
|
|
20
|
-
async requestLicense(request: LicenseRequest): Promise<LicenseResponse> {
|
|
21
|
-
const maxRetries = this.config.retryConfig?.maxRetries || 3;
|
|
22
|
-
const retryDelay = this.config.retryConfig?.retryDelay || 1000;
|
|
23
|
-
|
|
24
|
-
let lastError: any;
|
|
25
|
-
|
|
26
|
-
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
27
|
-
try {
|
|
28
|
-
if (attempt > 0) {
|
|
29
|
-
this.log(`Retry attempt ${attempt}/${maxRetries}`);
|
|
30
|
-
await this.delay(retryDelay * attempt); // Exponential backoff
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
const response = await this.makeRequest(request);
|
|
34
|
-
return response;
|
|
35
|
-
} catch (error: any) {
|
|
36
|
-
lastError = error;
|
|
37
|
-
this.log(`License request failed (attempt ${attempt + 1}/${maxRetries + 1}):`, error);
|
|
38
|
-
|
|
39
|
-
// Don't retry on certain errors
|
|
40
|
-
if (this.isFatalError(error)) {
|
|
41
|
-
throw error;
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
// All retries exhausted
|
|
47
|
-
throw this.createError(
|
|
48
|
-
DRMErrorCode.LICENSE_REQUEST_FAILED,
|
|
49
|
-
`Failed to request license after ${maxRetries + 1} attempts`,
|
|
50
|
-
lastError
|
|
51
|
-
);
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
/**
|
|
55
|
-
* Make HTTP request to license server
|
|
56
|
-
*/
|
|
57
|
-
private async makeRequest(request: LicenseRequest): Promise<LicenseResponse> {
|
|
58
|
-
this.log('Requesting license from:', request.url);
|
|
59
|
-
|
|
60
|
-
try {
|
|
61
|
-
const response = await fetch(request.url, {
|
|
62
|
-
method: request.method,
|
|
63
|
-
headers: request.headers,
|
|
64
|
-
body: request.body,
|
|
65
|
-
});
|
|
66
|
-
|
|
67
|
-
if (!response.ok) {
|
|
68
|
-
throw this.createError(
|
|
69
|
-
DRMErrorCode.LICENSE_REQUEST_FAILED,
|
|
70
|
-
`License server returned ${response.status}: ${response.statusText}`,
|
|
71
|
-
{ status: response.status, statusText: response.statusText }
|
|
72
|
-
);
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
// Parse response based on type
|
|
76
|
-
let license: ArrayBuffer;
|
|
77
|
-
|
|
78
|
-
if (request.responseType === 'arraybuffer') {
|
|
79
|
-
license = await response.arrayBuffer();
|
|
80
|
-
} else if (request.responseType === 'text') {
|
|
81
|
-
const text = await response.text();
|
|
82
|
-
license = this.textToArrayBuffer(text);
|
|
83
|
-
} else if (request.responseType === 'json') {
|
|
84
|
-
const json = await response.json();
|
|
85
|
-
// Assume license is in a 'license' field or is base64-encoded
|
|
86
|
-
if (json.license) {
|
|
87
|
-
license = this.base64ToArrayBuffer(json.license);
|
|
88
|
-
} else {
|
|
89
|
-
throw this.createError(
|
|
90
|
-
DRMErrorCode.LICENSE_INVALID,
|
|
91
|
-
'License response does not contain license field',
|
|
92
|
-
json
|
|
93
|
-
);
|
|
94
|
-
}
|
|
95
|
-
} else {
|
|
96
|
-
license = await response.arrayBuffer();
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
this.log('License received, size:', license.byteLength, 'bytes');
|
|
100
|
-
|
|
101
|
-
return {
|
|
102
|
-
license,
|
|
103
|
-
metadata: response.headers,
|
|
104
|
-
};
|
|
105
|
-
} catch (error: any) {
|
|
106
|
-
if (error.code && error.code.startsWith('DRM_')) {
|
|
107
|
-
throw error;
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
throw this.createError(
|
|
111
|
-
DRMErrorCode.NETWORK_ERROR,
|
|
112
|
-
`Network error requesting license: ${error.message}`,
|
|
113
|
-
error
|
|
114
|
-
);
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
/**
|
|
119
|
-
* Check if error is fatal (should not retry)
|
|
120
|
-
*/
|
|
121
|
-
private isFatalError(error: any): boolean {
|
|
122
|
-
// Don't retry authentication errors (401, 403)
|
|
123
|
-
if (error.details?.status === 401 || error.details?.status === 403) {
|
|
124
|
-
return true;
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
// Don't retry invalid license errors
|
|
128
|
-
if (error.code === DRMErrorCode.LICENSE_INVALID) {
|
|
129
|
-
return true;
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
return false;
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
/**
|
|
136
|
-
* Convert text to ArrayBuffer
|
|
137
|
-
*/
|
|
138
|
-
private textToArrayBuffer(text: string): ArrayBuffer {
|
|
139
|
-
const encoder = new TextEncoder();
|
|
140
|
-
return encoder.encode(text).buffer;
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
/**
|
|
144
|
-
* Convert base64 string to ArrayBuffer
|
|
145
|
-
*/
|
|
146
|
-
private base64ToArrayBuffer(base64: string): ArrayBuffer {
|
|
147
|
-
const binaryString = atob(base64);
|
|
148
|
-
const bytes = new Uint8Array(binaryString.length);
|
|
149
|
-
for (let i = 0; i < binaryString.length; i++) {
|
|
150
|
-
bytes[i] = binaryString.charCodeAt(i);
|
|
151
|
-
}
|
|
152
|
-
return bytes.buffer;
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
/**
|
|
156
|
-
* Delay helper for retry logic
|
|
157
|
-
*/
|
|
158
|
-
private delay(ms: number): Promise<void> {
|
|
159
|
-
return new Promise(resolve => setTimeout(resolve, ms));
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
/**
|
|
163
|
-
* Create standardized DRM error
|
|
164
|
-
*/
|
|
165
|
-
private createError(code: DRMErrorCode, message: string, details?: any): any {
|
|
166
|
-
const error = new Error(message);
|
|
167
|
-
(error as any).code = code;
|
|
168
|
-
(error as any).details = details;
|
|
169
|
-
return error;
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
/**
|
|
173
|
-
* Debug logging
|
|
174
|
-
*/
|
|
175
|
-
private log(...args: any[]): void {
|
|
176
|
-
if (this.debug) {
|
|
177
|
-
console.log('[LicenseRequestHandler]', ...args);
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* License Request Handler
|
|
3
|
+
* Centralized HTTP request handling for license servers with retry logic
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { ExtendedDRMConfig, LicenseRequest, LicenseResponse, DRMErrorCode } from '../types/DRMTypes';
|
|
7
|
+
|
|
8
|
+
export class LicenseRequestHandler {
|
|
9
|
+
private config: ExtendedDRMConfig;
|
|
10
|
+
private debug: boolean;
|
|
11
|
+
|
|
12
|
+
constructor(config: ExtendedDRMConfig, debug: boolean = false) {
|
|
13
|
+
this.config = config;
|
|
14
|
+
this.debug = debug;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Request license from server with retry logic
|
|
19
|
+
*/
|
|
20
|
+
async requestLicense(request: LicenseRequest): Promise<LicenseResponse> {
|
|
21
|
+
const maxRetries = this.config.retryConfig?.maxRetries || 3;
|
|
22
|
+
const retryDelay = this.config.retryConfig?.retryDelay || 1000;
|
|
23
|
+
|
|
24
|
+
let lastError: any;
|
|
25
|
+
|
|
26
|
+
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
27
|
+
try {
|
|
28
|
+
if (attempt > 0) {
|
|
29
|
+
this.log(`Retry attempt ${attempt}/${maxRetries}`);
|
|
30
|
+
await this.delay(retryDelay * attempt); // Exponential backoff
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const response = await this.makeRequest(request);
|
|
34
|
+
return response;
|
|
35
|
+
} catch (error: any) {
|
|
36
|
+
lastError = error;
|
|
37
|
+
this.log(`License request failed (attempt ${attempt + 1}/${maxRetries + 1}):`, error);
|
|
38
|
+
|
|
39
|
+
// Don't retry on certain errors
|
|
40
|
+
if (this.isFatalError(error)) {
|
|
41
|
+
throw error;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// All retries exhausted
|
|
47
|
+
throw this.createError(
|
|
48
|
+
DRMErrorCode.LICENSE_REQUEST_FAILED,
|
|
49
|
+
`Failed to request license after ${maxRetries + 1} attempts`,
|
|
50
|
+
lastError
|
|
51
|
+
);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Make HTTP request to license server
|
|
56
|
+
*/
|
|
57
|
+
private async makeRequest(request: LicenseRequest): Promise<LicenseResponse> {
|
|
58
|
+
this.log('Requesting license from:', request.url);
|
|
59
|
+
|
|
60
|
+
try {
|
|
61
|
+
const response = await fetch(request.url, {
|
|
62
|
+
method: request.method,
|
|
63
|
+
headers: request.headers,
|
|
64
|
+
body: request.body,
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
if (!response.ok) {
|
|
68
|
+
throw this.createError(
|
|
69
|
+
DRMErrorCode.LICENSE_REQUEST_FAILED,
|
|
70
|
+
`License server returned ${response.status}: ${response.statusText}`,
|
|
71
|
+
{ status: response.status, statusText: response.statusText }
|
|
72
|
+
);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// Parse response based on type
|
|
76
|
+
let license: ArrayBuffer;
|
|
77
|
+
|
|
78
|
+
if (request.responseType === 'arraybuffer') {
|
|
79
|
+
license = await response.arrayBuffer();
|
|
80
|
+
} else if (request.responseType === 'text') {
|
|
81
|
+
const text = await response.text();
|
|
82
|
+
license = this.textToArrayBuffer(text);
|
|
83
|
+
} else if (request.responseType === 'json') {
|
|
84
|
+
const json = await response.json();
|
|
85
|
+
// Assume license is in a 'license' field or is base64-encoded
|
|
86
|
+
if (json.license) {
|
|
87
|
+
license = this.base64ToArrayBuffer(json.license);
|
|
88
|
+
} else {
|
|
89
|
+
throw this.createError(
|
|
90
|
+
DRMErrorCode.LICENSE_INVALID,
|
|
91
|
+
'License response does not contain license field',
|
|
92
|
+
json
|
|
93
|
+
);
|
|
94
|
+
}
|
|
95
|
+
} else {
|
|
96
|
+
license = await response.arrayBuffer();
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
this.log('License received, size:', license.byteLength, 'bytes');
|
|
100
|
+
|
|
101
|
+
return {
|
|
102
|
+
license,
|
|
103
|
+
metadata: response.headers,
|
|
104
|
+
};
|
|
105
|
+
} catch (error: any) {
|
|
106
|
+
if (error.code && error.code.startsWith('DRM_')) {
|
|
107
|
+
throw error;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
throw this.createError(
|
|
111
|
+
DRMErrorCode.NETWORK_ERROR,
|
|
112
|
+
`Network error requesting license: ${error.message}`,
|
|
113
|
+
error
|
|
114
|
+
);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Check if error is fatal (should not retry)
|
|
120
|
+
*/
|
|
121
|
+
private isFatalError(error: any): boolean {
|
|
122
|
+
// Don't retry authentication errors (401, 403)
|
|
123
|
+
if (error.details?.status === 401 || error.details?.status === 403) {
|
|
124
|
+
return true;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// Don't retry invalid license errors
|
|
128
|
+
if (error.code === DRMErrorCode.LICENSE_INVALID) {
|
|
129
|
+
return true;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
return false;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* Convert text to ArrayBuffer
|
|
137
|
+
*/
|
|
138
|
+
private textToArrayBuffer(text: string): ArrayBuffer {
|
|
139
|
+
const encoder = new TextEncoder();
|
|
140
|
+
return encoder.encode(text).buffer;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Convert base64 string to ArrayBuffer
|
|
145
|
+
*/
|
|
146
|
+
private base64ToArrayBuffer(base64: string): ArrayBuffer {
|
|
147
|
+
const binaryString = atob(base64);
|
|
148
|
+
const bytes = new Uint8Array(binaryString.length);
|
|
149
|
+
for (let i = 0; i < binaryString.length; i++) {
|
|
150
|
+
bytes[i] = binaryString.charCodeAt(i);
|
|
151
|
+
}
|
|
152
|
+
return bytes.buffer;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* Delay helper for retry logic
|
|
157
|
+
*/
|
|
158
|
+
private delay(ms: number): Promise<void> {
|
|
159
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Create standardized DRM error
|
|
164
|
+
*/
|
|
165
|
+
private createError(code: DRMErrorCode, message: string, details?: any): any {
|
|
166
|
+
const error = new Error(message);
|
|
167
|
+
(error as any).code = code;
|
|
168
|
+
(error as any).details = details;
|
|
169
|
+
return error;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* Debug logging
|
|
174
|
+
*/
|
|
175
|
+
private log(...args: any[]): void {
|
|
176
|
+
if (this.debug) {
|
|
177
|
+
console.log('[LicenseRequestHandler]', ...args);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|