unified-video-framework 1.4.445 → 1.4.446

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 (75) hide show
  1. package/package.json +1 -1
  2. package/packages/core/dist/version.d.ts +1 -1
  3. package/packages/core/dist/version.js +1 -1
  4. package/packages/core/src/version.ts +1 -1
  5. package/packages/web/dist/WebPlayer.js +1 -1
  6. package/packages/web/dist/drm/BunnyCDNDRMProvider.d.ts +13 -0
  7. package/packages/web/dist/drm/BunnyCDNDRMProvider.d.ts.map +1 -0
  8. package/packages/web/dist/drm/BunnyCDNDRMProvider.js +65 -0
  9. package/packages/web/dist/drm/BunnyCDNDRMProvider.js.map +1 -0
  10. package/packages/web/dist/drm/DRMManager.d.ts +20 -0
  11. package/packages/web/dist/drm/DRMManager.d.ts.map +1 -0
  12. package/packages/web/dist/drm/DRMManager.js +130 -0
  13. package/packages/web/dist/drm/DRMManager.js.map +1 -0
  14. package/packages/web/dist/drm/FairPlayDRMHandler.d.ts +24 -0
  15. package/packages/web/dist/drm/FairPlayDRMHandler.d.ts.map +1 -0
  16. package/packages/web/dist/drm/FairPlayDRMHandler.js +190 -0
  17. package/packages/web/dist/drm/FairPlayDRMHandler.js.map +1 -0
  18. package/packages/web/dist/drm/WidevineDRMHandler.d.ts +21 -0
  19. package/packages/web/dist/drm/WidevineDRMHandler.d.ts.map +1 -0
  20. package/packages/web/dist/drm/WidevineDRMHandler.js +143 -0
  21. package/packages/web/dist/drm/WidevineDRMHandler.js.map +1 -0
  22. package/packages/web/dist/drm/index.d.ts +15 -0
  23. package/packages/web/dist/drm/index.d.ts.map +1 -0
  24. package/packages/web/dist/drm/index.js +13 -0
  25. package/packages/web/dist/drm/index.js.map +1 -0
  26. package/packages/web/dist/drm/providers/BunnyNetProvider.d.ts +19 -0
  27. package/packages/web/dist/drm/providers/BunnyNetProvider.d.ts.map +1 -0
  28. package/packages/web/dist/drm/providers/BunnyNetProvider.js +112 -0
  29. package/packages/web/dist/drm/providers/BunnyNetProvider.js.map +1 -0
  30. package/packages/web/dist/drm/providers/GenericProvider.d.ts +30 -0
  31. package/packages/web/dist/drm/providers/GenericProvider.d.ts.map +1 -0
  32. package/packages/web/dist/drm/providers/GenericProvider.js +104 -0
  33. package/packages/web/dist/drm/providers/GenericProvider.js.map +1 -0
  34. package/packages/web/dist/drm/systems/BaseDRM.d.ts +18 -0
  35. package/packages/web/dist/drm/systems/BaseDRM.d.ts.map +1 -0
  36. package/packages/web/dist/drm/systems/BaseDRM.js +29 -0
  37. package/packages/web/dist/drm/systems/BaseDRM.js.map +1 -0
  38. package/packages/web/dist/drm/systems/FairPlayDRM.d.ts +32 -0
  39. package/packages/web/dist/drm/systems/FairPlayDRM.d.ts.map +1 -0
  40. package/packages/web/dist/drm/systems/FairPlayDRM.js +208 -0
  41. package/packages/web/dist/drm/systems/FairPlayDRM.js.map +1 -0
  42. package/packages/web/dist/drm/systems/PlayReadyDRM.d.ts +9 -0
  43. package/packages/web/dist/drm/systems/PlayReadyDRM.d.ts.map +1 -0
  44. package/packages/web/dist/drm/systems/PlayReadyDRM.js +114 -0
  45. package/packages/web/dist/drm/systems/PlayReadyDRM.js.map +1 -0
  46. package/packages/web/dist/drm/systems/WidevineDRM.d.ts +9 -0
  47. package/packages/web/dist/drm/systems/WidevineDRM.d.ts.map +1 -0
  48. package/packages/web/dist/drm/systems/WidevineDRM.js +159 -0
  49. package/packages/web/dist/drm/systems/WidevineDRM.js.map +1 -0
  50. package/packages/web/dist/drm/types/BunnyNetTypes.d.ts +20 -0
  51. package/packages/web/dist/drm/types/BunnyNetTypes.d.ts.map +1 -0
  52. package/packages/web/dist/drm/types/BunnyNetTypes.js +8 -0
  53. package/packages/web/dist/drm/types/BunnyNetTypes.js.map +1 -0
  54. package/packages/web/dist/drm/types/DRMTypes.d.ts +60 -0
  55. package/packages/web/dist/drm/types/DRMTypes.d.ts.map +1 -0
  56. package/packages/web/dist/drm/types/DRMTypes.js +22 -0
  57. package/packages/web/dist/drm/types/DRMTypes.js.map +1 -0
  58. package/packages/web/dist/drm/utils/BrowserDetector.d.ts +20 -0
  59. package/packages/web/dist/drm/utils/BrowserDetector.d.ts.map +1 -0
  60. package/packages/web/dist/drm/utils/BrowserDetector.js +211 -0
  61. package/packages/web/dist/drm/utils/BrowserDetector.js.map +1 -0
  62. package/packages/web/dist/drm/utils/CertificateManager.d.ts +15 -0
  63. package/packages/web/dist/drm/utils/CertificateManager.d.ts.map +1 -0
  64. package/packages/web/dist/drm/utils/CertificateManager.js +46 -0
  65. package/packages/web/dist/drm/utils/CertificateManager.js.map +1 -0
  66. package/packages/web/dist/drm/utils/DRMErrorHandler.d.ts +7 -0
  67. package/packages/web/dist/drm/utils/DRMErrorHandler.d.ts.map +1 -0
  68. package/packages/web/dist/drm/utils/DRMErrorHandler.js +49 -0
  69. package/packages/web/dist/drm/utils/DRMErrorHandler.js.map +1 -0
  70. package/packages/web/dist/drm/utils/LicenseRequestHandler.d.ts +15 -0
  71. package/packages/web/dist/drm/utils/LicenseRequestHandler.d.ts.map +1 -0
  72. package/packages/web/dist/drm/utils/LicenseRequestHandler.js +110 -0
  73. package/packages/web/dist/drm/utils/LicenseRequestHandler.js.map +1 -0
  74. package/packages/web/dist/drm.js +5 -0
  75. package/scripts/fix-imports.js +61 -23
@@ -0,0 +1,208 @@
1
+ import { BaseDRM } from "./BaseDRM.js";
2
+ import { KEY_SYSTEMS, DRMErrorCode } from "../types/DRMTypes.js";
3
+ import { CertificateManager } from "../utils/CertificateManager.js";
4
+ import { DRMErrorHandler } from "../utils/DRMErrorHandler.js";
5
+ import { DRMType as DRMTypeEnum } from "../../../../core/dist/index.js";
6
+ export class FairPlayDRM extends BaseDRM {
7
+ constructor(videoElement, config, debug = false) {
8
+ super(videoElement, config, debug);
9
+ this.serverCertificate = null;
10
+ this.encryptedEventHandler = null;
11
+ this.needKeyEventHandler = null;
12
+ this.certificateManager = CertificateManager.getInstance();
13
+ }
14
+ async initialize() {
15
+ this.log('Initializing FairPlay DRM...');
16
+ await this.loadCertificate();
17
+ this.setupEncryptedEventListeners();
18
+ this.log('FairPlay DRM initialized');
19
+ }
20
+ getKeySystem() {
21
+ return KEY_SYSTEMS[DRMTypeEnum.FAIRPLAY][0];
22
+ }
23
+ getHLSConfig() {
24
+ this.log('Generating HLS.js config for FairPlay');
25
+ const certificateUrl = this.config.certificateUrl || this.config.fairplayOptions?.certificateUrl;
26
+ const licenseUrl = this.config.licenseUrl || this.config.fairplayOptions?.licenseUrl;
27
+ return {
28
+ emeEnabled: true,
29
+ drmSystems: {
30
+ [this.getKeySystem()]: {
31
+ licenseUrl: licenseUrl,
32
+ serverCertificateUrl: certificateUrl,
33
+ serverCertificate: this.serverCertificate,
34
+ },
35
+ },
36
+ requestMediaKeySystemAccessFunc: this.createMediaKeySystemAccess.bind(this),
37
+ xhrSetup: (xhr, url) => {
38
+ if (url === licenseUrl || url === certificateUrl) {
39
+ this.log(`[LicenseXHR] (FairPlay) Requesting resource from: ${url}`);
40
+ if (this.config.headers) {
41
+ Object.keys(this.config.headers).forEach(key => {
42
+ xhr.setRequestHeader(key, this.config.headers[key]);
43
+ });
44
+ }
45
+ }
46
+ }
47
+ };
48
+ }
49
+ getDashProtectionData() {
50
+ this.log('Generating dash.js protection data for FairPlay');
51
+ const licenseUrl = this.config.licenseUrl || this.config.fairplayOptions?.licenseUrl;
52
+ return {
53
+ [this.getKeySystem()]: {
54
+ serverURL: licenseUrl,
55
+ serverCertificate: this.serverCertificate,
56
+ },
57
+ };
58
+ }
59
+ async destroy() {
60
+ if (this.encryptedEventHandler) {
61
+ this.videoElement.removeEventListener('encrypted', this.encryptedEventHandler);
62
+ this.encryptedEventHandler = null;
63
+ }
64
+ if (this.needKeyEventHandler) {
65
+ this.videoElement.removeEventListener('webkitneedkey', this.needKeyEventHandler);
66
+ this.needKeyEventHandler = null;
67
+ }
68
+ await super.destroy();
69
+ }
70
+ async loadCertificate() {
71
+ const certificateUrl = this.config.certificateUrl || this.config.fairplayOptions?.certificateUrl;
72
+ if (!certificateUrl) {
73
+ throw DRMErrorHandler.createError(DRMErrorCode.CONFIGURATION_ERROR, 'FairPlay certificate URL not provided', true);
74
+ }
75
+ this.log('Loading FairPlay certificate from:', certificateUrl);
76
+ const cached = this.certificateManager.getCertificate(certificateUrl);
77
+ if (cached) {
78
+ this.log('Using cached certificate');
79
+ this.serverCertificate = cached;
80
+ return;
81
+ }
82
+ try {
83
+ const response = await fetch(certificateUrl);
84
+ if (!response.ok) {
85
+ throw new Error(`HTTP ${response.status}: ${response.statusText}`);
86
+ }
87
+ this.serverCertificate = await response.arrayBuffer();
88
+ this.certificateManager.setCertificate(certificateUrl, this.serverCertificate);
89
+ this.log('FairPlay certificate loaded, size:', this.serverCertificate.byteLength, 'bytes');
90
+ }
91
+ catch (error) {
92
+ throw DRMErrorHandler.createError(DRMErrorCode.CERTIFICATE_LOAD_FAILED, `Failed to load FairPlay certificate: ${error.message}`, true, error);
93
+ }
94
+ }
95
+ setupEncryptedEventListeners() {
96
+ this.encryptedEventHandler = this.onEncrypted.bind(this);
97
+ this.videoElement.addEventListener('encrypted', this.encryptedEventHandler);
98
+ this.needKeyEventHandler = this.onWebKitNeedKey.bind(this);
99
+ this.videoElement.addEventListener('webkitneedkey', this.needKeyEventHandler);
100
+ this.log('FairPlay encrypted event listeners set up');
101
+ }
102
+ async onEncrypted(event) {
103
+ this.log('Encrypted event received:', event);
104
+ try {
105
+ const initData = event.initData;
106
+ const initDataType = event.initDataType;
107
+ await this.createSession(initData, initDataType);
108
+ }
109
+ catch (error) {
110
+ this.log('Error handling encrypted event:', error);
111
+ throw error;
112
+ }
113
+ }
114
+ async onWebKitNeedKey(event) {
115
+ this.log('WebKit needkey event received');
116
+ try {
117
+ const initData = event.initData;
118
+ await this.createSession(initData, 'skd');
119
+ }
120
+ catch (error) {
121
+ this.log('Error handling webkitneedkey event:', error);
122
+ throw error;
123
+ }
124
+ }
125
+ async createSession(initData, initDataType) {
126
+ if (!this.mediaKeys) {
127
+ try {
128
+ const keySystemAccess = await navigator.requestMediaKeySystemAccess(this.getKeySystem(), this.getKeySystemConfiguration());
129
+ this.mediaKeys = await keySystemAccess.createMediaKeys();
130
+ await this.videoElement.setMediaKeys(this.mediaKeys);
131
+ this.log('FairPlay MediaKeys created and set');
132
+ }
133
+ catch (error) {
134
+ throw DRMErrorHandler.createError(DRMErrorCode.MEDIA_KEYS_CREATION_FAILED, `Failed to create FairPlay MediaKeys: ${error.message}`, true, error);
135
+ }
136
+ }
137
+ try {
138
+ this.keySession = this.mediaKeys.createSession();
139
+ this.log('FairPlay session created');
140
+ this.keySession.addEventListener('message', async (event) => {
141
+ await this.onMessage(event);
142
+ });
143
+ await this.keySession.generateRequest(initDataType, initData);
144
+ }
145
+ catch (error) {
146
+ throw DRMErrorHandler.createError(DRMErrorCode.SESSION_CREATION_FAILED, `Failed to create FairPlay session: ${error.message}`, true, error);
147
+ }
148
+ }
149
+ async onMessage(event) {
150
+ this.log('FairPlay message event:', event.messageType);
151
+ try {
152
+ const message = event.message;
153
+ const messageBase64 = this.arrayBufferToBase64(message);
154
+ const licenseUrl = this.config.licenseUrl || this.config.fairplayOptions?.licenseUrl;
155
+ if (!licenseUrl) {
156
+ throw DRMErrorHandler.createError(DRMErrorCode.CONFIGURATION_ERROR, 'FairPlay license URL not provided', true);
157
+ }
158
+ const license = await this.licenseHandler.requestLicense({
159
+ url: licenseUrl,
160
+ method: 'POST',
161
+ headers: {
162
+ 'Content-Type': 'application/octet-stream',
163
+ ...this.config.headers,
164
+ },
165
+ body: message,
166
+ responseType: 'arraybuffer',
167
+ });
168
+ await this.keySession.update(license.license);
169
+ this.log('FairPlay license applied successfully');
170
+ }
171
+ catch (error) {
172
+ throw DRMErrorHandler.createError(DRMErrorCode.LICENSE_REQUEST_FAILED, `Failed to process FairPlay license: ${error.message}`, true, error);
173
+ }
174
+ }
175
+ getKeySystemConfiguration() {
176
+ return [{
177
+ initDataTypes: ['sinf', 'skd'],
178
+ audioCapabilities: [{
179
+ contentType: 'audio/mp4; codecs="mp4a.40.2"',
180
+ }],
181
+ videoCapabilities: [
182
+ {
183
+ contentType: 'application/vnd.apple.mpegurl',
184
+ robustness: 'SW_SECURE_CRYPTO',
185
+ },
186
+ {
187
+ contentType: 'video/mp4; codecs="avc1.42E01E"',
188
+ robustness: 'SW_SECURE_CRYPTO',
189
+ },
190
+ ],
191
+ distinctiveIdentifier: 'not-allowed',
192
+ persistentState: 'not-allowed',
193
+ sessionTypes: ['temporary'],
194
+ }];
195
+ }
196
+ async createMediaKeySystemAccess() {
197
+ return navigator.requestMediaKeySystemAccess(this.getKeySystem(), this.getKeySystemConfiguration());
198
+ }
199
+ arrayBufferToBase64(buffer) {
200
+ const bytes = new Uint8Array(buffer);
201
+ let binary = '';
202
+ for (let i = 0; i < bytes.byteLength; i++) {
203
+ binary += String.fromCharCode(bytes[i]);
204
+ }
205
+ return btoa(binary);
206
+ }
207
+ }
208
+ //# sourceMappingURL=FairPlayDRM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FairPlayDRM.js","sourceRoot":"","sources":["../../../src/drm/systems/FairPlayDRM.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { BaseDRM } from './BaseDRM';
2
+ export declare class PlayReadyDRM extends BaseDRM {
3
+ initialize(): Promise<void>;
4
+ getKeySystem(): string;
5
+ getHLSConfig(): any;
6
+ getDashProtectionData(): any;
7
+ private getKeySystemConfiguration;
8
+ }
9
+ //# sourceMappingURL=PlayReadyDRM.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PlayReadyDRM.d.ts","sourceRoot":"","sources":["../../../src/drm/systems/PlayReadyDRM.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,qBAAa,YAAa,SAAQ,OAAO;IACjC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IA0CjC,YAAY,IAAI,MAAM;IAItB,YAAY,IAAI,GAAG;IA4CnB,qBAAqB,IAAI,GAAG;IA+B5B,OAAO,CAAC,yBAAyB;CAsBlC"}
@@ -0,0 +1,114 @@
1
+ import { BaseDRM } from "./BaseDRM.js";
2
+ import { KEY_SYSTEMS, DRMErrorCode } from "../types/DRMTypes.js";
3
+ import { DRMErrorHandler } from "../utils/DRMErrorHandler.js";
4
+ import { DRMType as DRMTypeEnum } from "../../../../core/dist/index.js";
5
+ export class PlayReadyDRM extends BaseDRM {
6
+ async initialize() {
7
+ this.log('Initializing PlayReady DRM...');
8
+ try {
9
+ const keySystemAccess = await navigator.requestMediaKeySystemAccess(this.getKeySystem(), this.getKeySystemConfiguration());
10
+ this.log('PlayReady key system access granted');
11
+ this.mediaKeys = await keySystemAccess.createMediaKeys();
12
+ }
13
+ catch (error) {
14
+ try {
15
+ const fallbackKeySystem = KEY_SYSTEMS[DRMTypeEnum.PLAYREADY][1];
16
+ const keySystemAccess = await navigator.requestMediaKeySystemAccess(fallbackKeySystem, this.getKeySystemConfiguration());
17
+ this.log('PlayReady fallback key system access granted');
18
+ this.mediaKeys = await keySystemAccess.createMediaKeys();
19
+ }
20
+ catch (fallbackError) {
21
+ this.log('PlayReady initialization failed:', fallbackError);
22
+ throw DRMErrorHandler.createError(DRMErrorCode.KEY_SYSTEM_ACCESS_DENIED, 'Failed to access PlayReady DRM system', true, fallbackError);
23
+ }
24
+ }
25
+ this.log('PlayReady DRM initialized');
26
+ }
27
+ getKeySystem() {
28
+ return KEY_SYSTEMS[DRMTypeEnum.PLAYREADY][0];
29
+ }
30
+ getHLSConfig() {
31
+ this.log('Generating HLS.js config for PlayReady');
32
+ const licenseUrl = this.config.licenseUrl || this.config.playreadyOptions?.licenseUrl;
33
+ return {
34
+ emeEnabled: true,
35
+ drmSystems: {
36
+ [this.getKeySystem()]: {
37
+ licenseUrl: licenseUrl,
38
+ robustness: 'SW_SECURE_CRYPTO',
39
+ },
40
+ [KEY_SYSTEMS[DRMTypeEnum.PLAYREADY][1]]: {
41
+ licenseUrl: licenseUrl,
42
+ robustness: 'SW_SECURE_CRYPTO',
43
+ },
44
+ },
45
+ requestMediaKeySystemAccessFunc: navigator.requestMediaKeySystemAccess.bind(navigator),
46
+ licenseXhrSetup: (xhr, url) => {
47
+ this.log(`[LicenseXHR] (PlayReady) Requesting license from: ${url}`);
48
+ if (this.config.headers) {
49
+ Object.keys(this.config.headers).forEach(key => {
50
+ xhr.setRequestHeader(key, this.config.headers[key]);
51
+ });
52
+ }
53
+ xhr.addEventListener('readystatechange', () => {
54
+ if (xhr.readyState === 4) {
55
+ if (xhr.status >= 200 && xhr.status < 300) {
56
+ this.log(`[LicenseXHR] PlayReady license received (Status: ${xhr.status}, Size: ${xhr.response?.byteLength || 0} bytes)`);
57
+ }
58
+ else {
59
+ this.log(`[LicenseXHR] ❌ PlayReady license request failed! (Status: ${xhr.status}, URL: ${url})`);
60
+ if (xhr.responseType === '' || xhr.responseType === 'text') {
61
+ this.log(`[LicenseXHR] Response Body: ${xhr.responseText}`);
62
+ }
63
+ }
64
+ }
65
+ });
66
+ }
67
+ };
68
+ }
69
+ getDashProtectionData() {
70
+ this.log('Generating dash.js protection data for PlayReady');
71
+ const licenseUrl = this.config.licenseUrl || this.config.playreadyOptions?.licenseUrl;
72
+ const protectionData = {
73
+ [this.getKeySystem()]: {
74
+ serverURL: licenseUrl,
75
+ },
76
+ [KEY_SYSTEMS[DRMTypeEnum.PLAYREADY][1]]: {
77
+ serverURL: licenseUrl,
78
+ },
79
+ };
80
+ if (this.config.headers && Object.keys(this.config.headers).length > 0) {
81
+ protectionData[this.getKeySystem()].httpRequestHeaders = this.config.headers;
82
+ protectionData[KEY_SYSTEMS[DRMTypeEnum.PLAYREADY][1]].httpRequestHeaders = this.config.headers;
83
+ }
84
+ const customData = this.config.customData || this.config.playreadyOptions?.customData;
85
+ if (customData) {
86
+ protectionData[this.getKeySystem()].customData = customData;
87
+ protectionData[KEY_SYSTEMS[DRMTypeEnum.PLAYREADY][1]].customData = customData;
88
+ }
89
+ return protectionData;
90
+ }
91
+ getKeySystemConfiguration() {
92
+ return [{
93
+ initDataTypes: ['cenc'],
94
+ audioCapabilities: [{
95
+ contentType: 'audio/mp4; codecs="mp4a.40.2"',
96
+ robustness: 'SW_SECURE_CRYPTO',
97
+ }],
98
+ videoCapabilities: [
99
+ {
100
+ contentType: 'video/mp4; codecs="avc1.42E01E"',
101
+ robustness: 'SW_SECURE_CRYPTO',
102
+ },
103
+ {
104
+ contentType: 'video/mp4; codecs="avc1.4d401f"',
105
+ robustness: 'SW_SECURE_CRYPTO',
106
+ },
107
+ ],
108
+ distinctiveIdentifier: 'not-allowed',
109
+ persistentState: 'not-allowed',
110
+ sessionTypes: ['temporary'],
111
+ }];
112
+ }
113
+ }
114
+ //# sourceMappingURL=PlayReadyDRM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PlayReadyDRM.js","sourceRoot":"","sources":["../../../src/drm/systems/PlayReadyDRM.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { BaseDRM } from './BaseDRM';
2
+ export declare class WidevineDRM extends BaseDRM {
3
+ initialize(): Promise<void>;
4
+ getKeySystem(): string;
5
+ getHLSConfig(): any;
6
+ getDashProtectionData(): any;
7
+ private getKeySystemConfiguration;
8
+ }
9
+ //# sourceMappingURL=WidevineDRM.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WidevineDRM.d.ts","sourceRoot":"","sources":["../../../src/drm/systems/WidevineDRM.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,qBAAa,WAAY,SAAQ,OAAO;IAChC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IA8BjC,YAAY,IAAI,MAAM;IAItB,YAAY,IAAI,GAAG;IA0CnB,qBAAqB,IAAI,GAAG;IAsB5B,OAAO,CAAC,yBAAyB;CAsBlC"}
@@ -0,0 +1,159 @@
1
+ import { BaseDRM } from "./BaseDRM.js";
2
+ import { KEY_SYSTEMS, DRMErrorCode } from "../types/DRMTypes.js";
3
+ import { DRMErrorHandler } from "../utils/DRMErrorHandler.js";
4
+ import { DRMType as DRMTypeEnum } from "../../../../core/dist/index.js";
5
+ export class WidevineDRM extends BaseDRM {
6
+ async initialize() {
7
+ this.log('Initializing Widevine DRM...');
8
+ this.log('Requested robustness - Video:', this.config.videoRobustness || 'SW_SECURE_CRYPTO', 'Audio:', this.config.audioRobustness || 'SW_SECURE_CRYPTO');
9
+ try {
10
+ const keySystemAccess = await navigator.requestMediaKeySystemAccess(this.getKeySystem(), this.getKeySystemConfiguration());
11
+ this.log('Widevine key system access granted');
12
+
13
+ // Log the actual configuration that was accepted
14
+ const actualConfig = keySystemAccess.getConfiguration();
15
+ this.log('✅ GRANTED Configuration:', {
16
+ videoRobustness: actualConfig.videoCapabilities?.[0]?.robustness || 'unknown',
17
+ audioRobustness: actualConfig.audioCapabilities?.[0]?.robustness || 'unknown',
18
+ distinctiveIdentifier: actualConfig.distinctiveIdentifier,
19
+ persistentState: actualConfig.persistentState
20
+ });
21
+
22
+ // Check if fallback happened
23
+ const requestedVideoRobustness = this.config.videoRobustness || 'SW_SECURE_CRYPTO';
24
+ const grantedVideoRobustness = actualConfig.videoCapabilities?.[0]?.robustness;
25
+
26
+ if (requestedVideoRobustness !== grantedVideoRobustness) {
27
+ this.log('⚠️ WARNING: Browser fell back from', requestedVideoRobustness, 'to', grantedVideoRobustness);
28
+ this.log('⚠️ Screenshot blocking may not work - system does not support hardware overlay');
29
+ } else if (requestedVideoRobustness === 'HW_SECURE_DECODE' && grantedVideoRobustness === 'HW_SECURE_DECODE') {
30
+ this.log('✅ SUCCESS: Hardware overlay protection active - screenshots should show black screen');
31
+ } else {
32
+ this.log('ℹ️ Using software DRM - screenshots will be visible');
33
+ }
34
+
35
+ this.mediaKeys = await keySystemAccess.createMediaKeys();
36
+ }
37
+ catch (error) {
38
+ this.log('Widevine initialization failed:', error);
39
+ throw DRMErrorHandler.createError(DRMErrorCode.KEY_SYSTEM_ACCESS_DENIED, 'Failed to access Widevine DRM system', true, error);
40
+ }
41
+ this.log('Widevine DRM initialized');
42
+ }
43
+ getKeySystem() {
44
+ return KEY_SYSTEMS[DRMTypeEnum.WIDEVINE][0];
45
+ }
46
+ getHLSConfig() {
47
+ this.log('Generating HLS.js config for Widevine');
48
+ const licenseUrl = this.config.licenseUrl || this.config.widevineOptions?.licenseUrl;
49
+ // Use videoRobustness from config if provided, otherwise fallback to SW_SECURE_CRYPTO
50
+ const robustness = this.config.videoRobustness || 'SW_SECURE_CRYPTO';
51
+ this.log(`Using video robustness level: ${robustness}`);
52
+ return {
53
+ emeEnabled: true,
54
+ drmSystems: {
55
+ [this.getKeySystem()]: {
56
+ licenseUrl: licenseUrl,
57
+ robustness: robustness,
58
+ },
59
+ },
60
+ requestMediaKeySystemAccessFunc: navigator.requestMediaKeySystemAccess.bind(navigator),
61
+ licenseXhrSetup: (xhr, url) => {
62
+ this.log(`[LicenseXHR] Requesting license from: ${url}`);
63
+ if (this.config.headers) {
64
+ Object.keys(this.config.headers).forEach(key => {
65
+ xhr.setRequestHeader(key, this.config.headers[key]);
66
+ });
67
+ }
68
+ xhr.addEventListener('readystatechange', () => {
69
+ if (xhr.readyState === 4) {
70
+ if (xhr.status >= 200 && xhr.status < 300) {
71
+ this.log(`[LicenseXHR] License received successfully (Status: ${xhr.status}, Size: ${xhr.response?.byteLength || 0} bytes)`);
72
+ }
73
+ else {
74
+ this.log(`[LicenseXHR] ❌ License request failed! (Status: ${xhr.status}, URL: ${url})`);
75
+ if (xhr.responseType === '' || xhr.responseType === 'text') {
76
+ this.log(`[LicenseXHR] Response Body: ${xhr.responseText}`);
77
+ }
78
+ }
79
+ }
80
+ });
81
+ }
82
+ };
83
+ }
84
+ getDashProtectionData() {
85
+ this.log('Generating dash.js protection data for Widevine');
86
+ const protectionData = {
87
+ [this.getKeySystem()]: {
88
+ serverURL: this.config.licenseUrl || this.config.widevineOptions?.licenseUrl,
89
+ },
90
+ };
91
+ if (this.config.headers && Object.keys(this.config.headers).length > 0) {
92
+ protectionData[this.getKeySystem()].httpRequestHeaders = this.config.headers;
93
+ }
94
+ if (this.config.widevineOptions?.serverCertificate) {
95
+ protectionData[this.getKeySystem()].serverCertificate = this.config.widevineOptions.serverCertificate;
96
+ }
97
+ return protectionData;
98
+ }
99
+ getKeySystemConfiguration() {
100
+ // Use robustness from config or fallback to SW_SECURE_CRYPTO (L3)
101
+ const videoRobustness = this.config.videoRobustness || 'SW_SECURE_CRYPTO';
102
+ const audioRobustness = this.config.audioRobustness || 'SW_SECURE_CRYPTO';
103
+
104
+ this.log(`Key system config - Video: ${videoRobustness}, Audio: ${audioRobustness}`);
105
+
106
+ // Create configuration with multiple robustness fallbacks
107
+ const configs = [];
108
+
109
+ // Try requested robustness first
110
+ configs.push({
111
+ initDataTypes: ['cenc'],
112
+ audioCapabilities: [{
113
+ contentType: 'audio/mp4; codecs="mp4a.40.2"',
114
+ robustness: audioRobustness,
115
+ }],
116
+ videoCapabilities: [
117
+ {
118
+ contentType: 'video/mp4; codecs="avc1.42E01E"',
119
+ robustness: videoRobustness,
120
+ },
121
+ {
122
+ contentType: 'video/mp4; codecs="avc1.4d401f"',
123
+ robustness: videoRobustness,
124
+ },
125
+ ],
126
+ distinctiveIdentifier: 'optional',
127
+ persistentState: 'optional',
128
+ sessionTypes: ['temporary'],
129
+ });
130
+
131
+ // Fallback to SW_SECURE_CRYPTO if hardware not available
132
+ if (videoRobustness !== 'SW_SECURE_CRYPTO') {
133
+ this.log('Adding fallback configuration with SW_SECURE_CRYPTO');
134
+ configs.push({
135
+ initDataTypes: ['cenc'],
136
+ audioCapabilities: [{
137
+ contentType: 'audio/mp4; codecs="mp4a.40.2"',
138
+ robustness: 'SW_SECURE_CRYPTO',
139
+ }],
140
+ videoCapabilities: [
141
+ {
142
+ contentType: 'video/mp4; codecs="avc1.42E01E"',
143
+ robustness: 'SW_SECURE_CRYPTO',
144
+ },
145
+ {
146
+ contentType: 'video/mp4; codecs="avc1.4d401f"',
147
+ robustness: 'SW_SECURE_CRYPTO',
148
+ },
149
+ ],
150
+ distinctiveIdentifier: 'not-allowed',
151
+ persistentState: 'not-allowed',
152
+ sessionTypes: ['temporary'],
153
+ });
154
+ }
155
+
156
+ return configs;
157
+ }
158
+ }
159
+ //# sourceMappingURL=WidevineDRM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WidevineDRM.js","sourceRoot":"","sources":["../../../src/drm/systems/WidevineDRM.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { DRMType } from '@unified-video/core';
2
+ export interface BunnyNetConfig {
3
+ libraryId: string;
4
+ videoId: string;
5
+ drmType?: DRMType;
6
+ }
7
+ export interface BunnyNetEndpoints {
8
+ widevine: string;
9
+ fairplayCert: string;
10
+ fairplayLicense: string;
11
+ playready: string;
12
+ }
13
+ export declare const BUNNY_NET_BASE_URL = "https://video.bunnycdn.com";
14
+ export declare const BUNNY_NET_ENDPOINTS: {
15
+ WIDEVINE_LICENSE: (libraryId: string, videoId: string) => string;
16
+ FAIRPLAY_CERTIFICATE: (libraryId: string) => string;
17
+ FAIRPLAY_LICENSE: (libraryId: string, videoId: string) => string;
18
+ PLAYREADY_LICENSE: (libraryId: string, videoId: string) => string;
19
+ };
20
+ //# sourceMappingURL=BunnyNetTypes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BunnyNetTypes.d.ts","sourceRoot":"","sources":["../../../src/drm/types/BunnyNetTypes.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAEnD,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,kBAAkB,+BAA+B,CAAC;AAE/D,eAAO,MAAM,mBAAmB;kCACA,MAAM,WAAW,MAAM;sCAGnB,MAAM;kCAGV,MAAM,WAAW,MAAM;mCAGtB,MAAM,WAAW,MAAM;CAEvD,CAAC"}
@@ -0,0 +1,8 @@
1
+ export const BUNNY_NET_BASE_URL = 'https://video.bunnycdn.com';
2
+ export const BUNNY_NET_ENDPOINTS = {
3
+ WIDEVINE_LICENSE: (libraryId, videoId) => `${BUNNY_NET_BASE_URL}/WidevineLicense/${libraryId}/${videoId}`,
4
+ FAIRPLAY_CERTIFICATE: (libraryId) => `${BUNNY_NET_BASE_URL}/FairPlay/${libraryId}/certificate`,
5
+ FAIRPLAY_LICENSE: (libraryId, videoId) => `${BUNNY_NET_BASE_URL}/FairPlay/${libraryId}/license/?videoId=${videoId}`,
6
+ PLAYREADY_LICENSE: (libraryId, videoId) => `${BUNNY_NET_BASE_URL}/PlayReadyLicense/${libraryId}/${videoId}`,
7
+ };
8
+ //# sourceMappingURL=BunnyNetTypes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BunnyNetTypes.js","sourceRoot":"","sources":["../../../src/drm/types/BunnyNetTypes.ts"],"names":[],"mappings":"AAoBA,MAAM,CAAC,MAAM,kBAAkB,GAAG,4BAA4B,CAAC;AAE/D,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,gBAAgB,EAAE,CAAC,SAAiB,EAAE,OAAe,EAAE,EAAE,CACvD,GAAG,kBAAkB,oBAAoB,SAAS,IAAI,OAAO,EAAE;IAEjE,oBAAoB,EAAE,CAAC,SAAiB,EAAE,EAAE,CAC1C,GAAG,kBAAkB,aAAa,SAAS,cAAc;IAE3D,gBAAgB,EAAE,CAAC,SAAiB,EAAE,OAAe,EAAE,EAAE,CACvD,GAAG,kBAAkB,aAAa,SAAS,qBAAqB,OAAO,EAAE;IAE3E,iBAAiB,EAAE,CAAC,SAAiB,EAAE,OAAe,EAAE,EAAE,CACxD,GAAG,kBAAkB,qBAAqB,SAAS,IAAI,OAAO,EAAE;CACnE,CAAC"}
@@ -0,0 +1,60 @@
1
+ import type { DRMConfig, DRMType } from '@unified-video/core';
2
+ export interface ExtendedDRMConfig extends DRMConfig {
3
+ provider?: 'bunny' | 'generic' | string;
4
+ libraryId?: string;
5
+ videoId?: string;
6
+ retryConfig?: {
7
+ maxRetries: number;
8
+ retryDelay: number;
9
+ };
10
+ debug?: boolean;
11
+ }
12
+ export interface DRMCapabilities {
13
+ widevine: boolean;
14
+ fairplay: boolean;
15
+ playready: boolean;
16
+ supportedType: DRMType | null;
17
+ }
18
+ export interface LicenseRequest {
19
+ url: string;
20
+ method: 'POST' | 'GET';
21
+ headers: Record<string, string>;
22
+ body: ArrayBuffer | string;
23
+ responseType: 'arraybuffer' | 'text' | 'json';
24
+ }
25
+ export interface LicenseResponse {
26
+ license: ArrayBuffer;
27
+ metadata?: any;
28
+ }
29
+ export interface EMEMessageEvent {
30
+ messageType: string;
31
+ message: ArrayBuffer;
32
+ }
33
+ export interface DRMInitResult {
34
+ success: boolean;
35
+ drmType: DRMType;
36
+ keySystem: string;
37
+ error?: DRMError;
38
+ }
39
+ export interface DRMError {
40
+ code: DRMErrorCode;
41
+ message: string;
42
+ fatal: boolean;
43
+ details?: any;
44
+ systemError?: any;
45
+ }
46
+ export declare enum DRMErrorCode {
47
+ UNSUPPORTED_BROWSER = "DRM_UNSUPPORTED_BROWSER",
48
+ CERTIFICATE_LOAD_FAILED = "DRM_CERTIFICATE_LOAD_FAILED",
49
+ LICENSE_REQUEST_FAILED = "DRM_LICENSE_REQUEST_FAILED",
50
+ KEY_SYSTEM_ACCESS_DENIED = "DRM_KEY_SYSTEM_ACCESS_DENIED",
51
+ MEDIA_KEYS_CREATION_FAILED = "DRM_MEDIA_KEYS_CREATION_FAILED",
52
+ SESSION_CREATION_FAILED = "DRM_SESSION_CREATION_FAILED",
53
+ LICENSE_INVALID = "DRM_LICENSE_INVALID",
54
+ CONFIGURATION_ERROR = "DRM_CONFIGURATION_ERROR",
55
+ NETWORK_ERROR = "DRM_NETWORK_ERROR",
56
+ SECURE_CONTEXT_REQUIRED = "DRM_SECURE_CONTEXT_REQUIRED",
57
+ TIMEOUT = "DRM_TIMEOUT"
58
+ }
59
+ export declare const KEY_SYSTEMS: Record<DRMType, string[]>;
60
+ //# sourceMappingURL=DRMTypes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DRMTypes.d.ts","sourceRoot":"","sources":["../../../src/drm/types/DRMTypes.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAI9D,MAAM,WAAW,iBAAkB,SAAQ,SAAS;IAElD,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;IAGxC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IAGjB,WAAW,CAAC,EAAE;QACZ,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IAGF,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAGD,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,aAAa,EAAE,OAAO,GAAG,IAAI,CAAC;CAC/B;AAGD,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,IAAI,EAAE,WAAW,GAAG,MAAM,CAAC;IAC3B,YAAY,EAAE,aAAa,GAAG,MAAM,GAAG,MAAM,CAAC;CAC/C;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,WAAW,CAAC;IACrB,QAAQ,CAAC,EAAE,GAAG,CAAC;CAChB;AAGD,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,WAAW,CAAC;CACtB;AAGD,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,QAAQ,CAAC;CAClB;AAGD,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,YAAY,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,GAAG,CAAC;IACd,WAAW,CAAC,EAAE,GAAG,CAAC;CACnB;AAED,oBAAY,YAAY;IACtB,mBAAmB,4BAA4B;IAC/C,uBAAuB,gCAAgC;IACvD,sBAAsB,+BAA+B;IACrD,wBAAwB,iCAAiC;IACzD,0BAA0B,mCAAmC;IAC7D,uBAAuB,gCAAgC;IACvD,eAAe,wBAAwB;IACvC,mBAAmB,4BAA4B;IAC/C,aAAa,sBAAsB;IACnC,uBAAuB,gCAAgC;IACvD,OAAO,gBAAgB;CACxB;AAGD,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,CAKjD,CAAC"}