unified-video-framework 1.4.445 → 1.4.447
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 +1 -1
- package/packages/core/dist/interfaces.d.ts +14 -0
- package/packages/core/dist/interfaces.d.ts.map +1 -1
- package/packages/core/dist/version.d.ts +1 -1
- package/packages/core/dist/version.js +1 -1
- package/packages/core/src/interfaces.ts +24 -0
- package/packages/core/src/version.ts +1 -1
- package/packages/web/dist/WebPlayer.d.ts +364 -0
- package/packages/web/dist/WebPlayer.d.ts.map +1 -1
- package/packages/web/dist/WebPlayer.js +308 -6
- package/packages/web/dist/WebPlayer.js.map +1 -1
- package/packages/web/dist/chapters/ChapterManager.js +3 -3
- package/packages/web/dist/chapters/SkipButtonController.js +1 -1
- package/packages/web/dist/chapters/index.js +7 -7
- package/packages/web/dist/drm/BunnyCDNDRMProvider.d.ts +13 -0
- package/packages/web/dist/drm/BunnyCDNDRMProvider.d.ts.map +1 -0
- package/packages/web/dist/drm/BunnyCDNDRMProvider.js +65 -0
- package/packages/web/dist/drm/BunnyCDNDRMProvider.js.map +1 -0
- package/packages/web/dist/drm/DRMManager.d.ts +20 -0
- package/packages/web/dist/drm/DRMManager.d.ts.map +1 -0
- package/packages/web/dist/drm/DRMManager.js +130 -0
- package/packages/web/dist/drm/DRMManager.js.map +1 -0
- package/packages/web/dist/drm/FairPlayDRMHandler.d.ts +24 -0
- package/packages/web/dist/drm/FairPlayDRMHandler.d.ts.map +1 -0
- package/packages/web/dist/drm/FairPlayDRMHandler.js +190 -0
- package/packages/web/dist/drm/FairPlayDRMHandler.js.map +1 -0
- package/packages/web/dist/drm/WidevineDRMHandler.d.ts +21 -0
- package/packages/web/dist/drm/WidevineDRMHandler.d.ts.map +1 -0
- package/packages/web/dist/drm/WidevineDRMHandler.js +143 -0
- package/packages/web/dist/drm/WidevineDRMHandler.js.map +1 -0
- package/packages/web/dist/drm/index.d.ts +15 -0
- package/packages/web/dist/drm/index.d.ts.map +1 -0
- package/packages/web/dist/drm/index.js +13 -0
- package/packages/web/dist/drm/index.js.map +1 -0
- package/packages/web/dist/drm/providers/BunnyNetProvider.d.ts +19 -0
- package/packages/web/dist/drm/providers/BunnyNetProvider.d.ts.map +1 -0
- package/packages/web/dist/drm/providers/BunnyNetProvider.js +112 -0
- package/packages/web/dist/drm/providers/BunnyNetProvider.js.map +1 -0
- package/packages/web/dist/drm/providers/GenericProvider.d.ts +30 -0
- package/packages/web/dist/drm/providers/GenericProvider.d.ts.map +1 -0
- package/packages/web/dist/drm/providers/GenericProvider.js +104 -0
- package/packages/web/dist/drm/providers/GenericProvider.js.map +1 -0
- package/packages/web/dist/drm/systems/BaseDRM.d.ts +18 -0
- package/packages/web/dist/drm/systems/BaseDRM.d.ts.map +1 -0
- package/packages/web/dist/drm/systems/BaseDRM.js +29 -0
- package/packages/web/dist/drm/systems/BaseDRM.js.map +1 -0
- package/packages/web/dist/drm/systems/FairPlayDRM.d.ts +32 -0
- package/packages/web/dist/drm/systems/FairPlayDRM.d.ts.map +1 -0
- package/packages/web/dist/drm/systems/FairPlayDRM.js +208 -0
- package/packages/web/dist/drm/systems/FairPlayDRM.js.map +1 -0
- package/packages/web/dist/drm/systems/PlayReadyDRM.d.ts +9 -0
- package/packages/web/dist/drm/systems/PlayReadyDRM.d.ts.map +1 -0
- package/packages/web/dist/drm/systems/PlayReadyDRM.js +114 -0
- package/packages/web/dist/drm/systems/PlayReadyDRM.js.map +1 -0
- package/packages/web/dist/drm/systems/WidevineDRM.d.ts +9 -0
- package/packages/web/dist/drm/systems/WidevineDRM.d.ts.map +1 -0
- package/packages/web/dist/drm/systems/WidevineDRM.js +159 -0
- package/packages/web/dist/drm/systems/WidevineDRM.js.map +1 -0
- package/packages/web/dist/drm/types/BunnyNetTypes.d.ts +20 -0
- package/packages/web/dist/drm/types/BunnyNetTypes.d.ts.map +1 -0
- package/packages/web/dist/drm/types/BunnyNetTypes.js +8 -0
- package/packages/web/dist/drm/types/BunnyNetTypes.js.map +1 -0
- package/packages/web/dist/drm/types/DRMTypes.d.ts +60 -0
- package/packages/web/dist/drm/types/DRMTypes.d.ts.map +1 -0
- package/packages/web/dist/drm/types/DRMTypes.js +22 -0
- package/packages/web/dist/drm/types/DRMTypes.js.map +1 -0
- package/packages/web/dist/drm/utils/BrowserDetector.d.ts +20 -0
- package/packages/web/dist/drm/utils/BrowserDetector.d.ts.map +1 -0
- package/packages/web/dist/drm/utils/BrowserDetector.js +211 -0
- package/packages/web/dist/drm/utils/BrowserDetector.js.map +1 -0
- package/packages/web/dist/drm/utils/CertificateManager.d.ts +15 -0
- package/packages/web/dist/drm/utils/CertificateManager.d.ts.map +1 -0
- package/packages/web/dist/drm/utils/CertificateManager.js +46 -0
- package/packages/web/dist/drm/utils/CertificateManager.js.map +1 -0
- package/packages/web/dist/drm/utils/DRMErrorHandler.d.ts +7 -0
- package/packages/web/dist/drm/utils/DRMErrorHandler.d.ts.map +1 -0
- package/packages/web/dist/drm/utils/DRMErrorHandler.js +49 -0
- package/packages/web/dist/drm/utils/DRMErrorHandler.js.map +1 -0
- package/packages/web/dist/drm/utils/LicenseRequestHandler.d.ts +15 -0
- package/packages/web/dist/drm/utils/LicenseRequestHandler.d.ts.map +1 -0
- package/packages/web/dist/drm/utils/LicenseRequestHandler.js +110 -0
- package/packages/web/dist/drm/utils/LicenseRequestHandler.js.map +1 -0
- package/packages/web/dist/drm.js +5 -0
- package/packages/web/dist/index.js +4 -4
- package/packages/web/dist/paywall/PaywallController.js +1 -1
- package/packages/web/dist/react/EPG.js +6 -6
- package/packages/web/dist/react/WebPlayerView.d.ts +399 -0
- package/packages/web/dist/react/WebPlayerView.d.ts.map +1 -1
- package/packages/web/dist/react/WebPlayerView.js +19 -6
- package/packages/web/dist/react/WebPlayerView.js.map +1 -1
- package/packages/web/dist/react/WebPlayerViewWithEPG.js +2 -2
- package/packages/web/dist/react/components/ChapterProgress.js +1 -1
- package/packages/web/dist/react/components/EPGOverlay-improved-positioning.js +5 -5
- package/packages/web/dist/react/components/EPGOverlay.js +5 -5
- package/packages/web/dist/react/components/EPGProgramDetails.js +1 -1
- package/packages/web/dist/react/components/EPGProgramGrid.js +1 -1
- package/packages/web/dist/react/components/EPGTimelineHeader.js +1 -1
- package/packages/web/dist/react/components/SkipButton.js +1 -1
- package/packages/web/dist/react/examples/google-ads-example.js +1 -1
- package/packages/web/dist/react/types/ThumbnailPreviewTypes.d.ts +26 -0
- package/packages/web/dist/react/types/ThumbnailPreviewTypes.d.ts.map +1 -0
- package/packages/web/dist/react/types/ThumbnailPreviewTypes.js +2 -0
- package/packages/web/dist/react/types/ThumbnailPreviewTypes.js.map +1 -0
- package/packages/web/dist/test/epg-test.js +1 -1
- package/packages/web/src/WebPlayer.ts +389 -3
- package/packages/web/src/react/WebPlayerView.tsx +21 -2
- package/packages/web/src/react/types/ThumbnailPreviewTypes.ts +62 -0
- package/scripts/fix-imports.js +61 -23
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { DRMType as DRMTypeEnum } from "../../../../core/dist/index.js";
|
|
2
|
+
export var DRMErrorCode;
|
|
3
|
+
(function (DRMErrorCode) {
|
|
4
|
+
DRMErrorCode["UNSUPPORTED_BROWSER"] = "DRM_UNSUPPORTED_BROWSER";
|
|
5
|
+
DRMErrorCode["CERTIFICATE_LOAD_FAILED"] = "DRM_CERTIFICATE_LOAD_FAILED";
|
|
6
|
+
DRMErrorCode["LICENSE_REQUEST_FAILED"] = "DRM_LICENSE_REQUEST_FAILED";
|
|
7
|
+
DRMErrorCode["KEY_SYSTEM_ACCESS_DENIED"] = "DRM_KEY_SYSTEM_ACCESS_DENIED";
|
|
8
|
+
DRMErrorCode["MEDIA_KEYS_CREATION_FAILED"] = "DRM_MEDIA_KEYS_CREATION_FAILED";
|
|
9
|
+
DRMErrorCode["SESSION_CREATION_FAILED"] = "DRM_SESSION_CREATION_FAILED";
|
|
10
|
+
DRMErrorCode["LICENSE_INVALID"] = "DRM_LICENSE_INVALID";
|
|
11
|
+
DRMErrorCode["CONFIGURATION_ERROR"] = "DRM_CONFIGURATION_ERROR";
|
|
12
|
+
DRMErrorCode["NETWORK_ERROR"] = "DRM_NETWORK_ERROR";
|
|
13
|
+
DRMErrorCode["SECURE_CONTEXT_REQUIRED"] = "DRM_SECURE_CONTEXT_REQUIRED";
|
|
14
|
+
DRMErrorCode["TIMEOUT"] = "DRM_TIMEOUT";
|
|
15
|
+
})(DRMErrorCode || (DRMErrorCode = {}));
|
|
16
|
+
export const KEY_SYSTEMS = {
|
|
17
|
+
[DRMTypeEnum.WIDEVINE]: ['com.widevine.alpha'],
|
|
18
|
+
[DRMTypeEnum.PLAYREADY]: ['com.microsoft.playready', 'com.microsoft.playready.recommendation'],
|
|
19
|
+
[DRMTypeEnum.FAIRPLAY]: ['com.apple.fps.1_0', 'com.apple.fps'],
|
|
20
|
+
[DRMTypeEnum.CLEARKEY]: ['webkit-org.w3.clearkey', 'org.w3.clearkey'],
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=DRMTypes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DRMTypes.js","sourceRoot":"","sources":["../../../src/drm/types/DRMTypes.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAkE7D,MAAM,CAAN,IAAY,YAYX;AAZD,WAAY,YAAY;IACtB,+DAA+C,CAAA;IAC/C,uEAAuD,CAAA;IACvD,qEAAqD,CAAA;IACrD,yEAAyD,CAAA;IACzD,6EAA6D,CAAA;IAC7D,uEAAuD,CAAA;IACvD,uDAAuC,CAAA;IACvC,+DAA+C,CAAA;IAC/C,mDAAmC,CAAA;IACnC,uEAAuD,CAAA;IACvD,uCAAuB,CAAA;AACzB,CAAC,EAZW,YAAY,KAAZ,YAAY,QAYvB;AAGD,MAAM,CAAC,MAAM,WAAW,GAA8B;IACpD,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,oBAAoB,CAAC;IAC9C,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,CAAC,yBAAyB,EAAE,wCAAwC,CAAC;IAC9F,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,mBAAmB,EAAE,eAAe,CAAC;IAC9D,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,wBAAwB,EAAE,iBAAiB,CAAC;CACtE,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { DRMType } from '@unified-video/core';
|
|
2
|
+
import { DRMCapabilities } from '../types/DRMTypes';
|
|
3
|
+
export declare class BrowserDetector {
|
|
4
|
+
private static instance;
|
|
5
|
+
private capabilities;
|
|
6
|
+
private constructor();
|
|
7
|
+
static getInstance(): BrowserDetector;
|
|
8
|
+
detectCapabilities(): Promise<DRMCapabilities>;
|
|
9
|
+
getRecommendedDRMType(): Promise<DRMType | null>;
|
|
10
|
+
isDRMTypeSupported(drmType: DRMType): Promise<boolean>;
|
|
11
|
+
private isSafari;
|
|
12
|
+
private isWebKitBased;
|
|
13
|
+
private isEdge;
|
|
14
|
+
private checkFairPlaySupport;
|
|
15
|
+
private checkWidevineSupport;
|
|
16
|
+
private checkPlayReadySupport;
|
|
17
|
+
getBrowserName(): string;
|
|
18
|
+
resetCapabilities(): void;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=BrowserDetector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BrowserDetector.d.ts","sourceRoot":"","sources":["../../../src/drm/utils/BrowserDetector.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAe,MAAM,mBAAmB,CAAC;AAGjE,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAkB;IACzC,OAAO,CAAC,YAAY,CAAgC;IAEpD,OAAO;IAEP,MAAM,CAAC,WAAW,IAAI,eAAe;IAU/B,kBAAkB,IAAI,OAAO,CAAC,eAAe,CAAC;IA2C9C,qBAAqB,IAAI,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAQhD,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAiB5D,OAAO,CAAC,QAAQ;IAQhB,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,MAAM;YAQA,oBAAoB;YAkCpB,oBAAoB;YA4DpB,qBAAqB;IAoDnC,cAAc,IAAI,MAAM;IAexB,iBAAiB,IAAI,IAAI;CAG1B"}
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
import { KEY_SYSTEMS } from "../types/DRMTypes.js";
|
|
2
|
+
import { DRMType as DRMTypeEnum } from "../../../../core/dist/index.js";
|
|
3
|
+
export class BrowserDetector {
|
|
4
|
+
constructor() {
|
|
5
|
+
this.capabilities = null;
|
|
6
|
+
}
|
|
7
|
+
static getInstance() {
|
|
8
|
+
if (!BrowserDetector.instance) {
|
|
9
|
+
BrowserDetector.instance = new BrowserDetector();
|
|
10
|
+
}
|
|
11
|
+
return BrowserDetector.instance;
|
|
12
|
+
}
|
|
13
|
+
async detectCapabilities() {
|
|
14
|
+
if (this.capabilities) {
|
|
15
|
+
return this.capabilities;
|
|
16
|
+
}
|
|
17
|
+
const capabilities = {
|
|
18
|
+
widevine: false,
|
|
19
|
+
fairplay: false,
|
|
20
|
+
playready: false,
|
|
21
|
+
supportedType: null,
|
|
22
|
+
};
|
|
23
|
+
if (this.isSafari() || this.isWebKitBased()) {
|
|
24
|
+
capabilities.fairplay = await this.checkFairPlaySupport();
|
|
25
|
+
if (capabilities.fairplay) {
|
|
26
|
+
capabilities.supportedType = DRMTypeEnum.FAIRPLAY;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
if (!capabilities.supportedType) {
|
|
30
|
+
capabilities.widevine = await this.checkWidevineSupport();
|
|
31
|
+
if (capabilities.widevine) {
|
|
32
|
+
capabilities.supportedType = DRMTypeEnum.WIDEVINE;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
if (!capabilities.supportedType && this.isEdge()) {
|
|
36
|
+
capabilities.playready = await this.checkPlayReadySupport();
|
|
37
|
+
if (capabilities.playready) {
|
|
38
|
+
capabilities.supportedType = DRMTypeEnum.PLAYREADY;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
this.capabilities = capabilities;
|
|
42
|
+
return capabilities;
|
|
43
|
+
}
|
|
44
|
+
async getRecommendedDRMType() {
|
|
45
|
+
const caps = await this.detectCapabilities();
|
|
46
|
+
return caps.supportedType;
|
|
47
|
+
}
|
|
48
|
+
async isDRMTypeSupported(drmType) {
|
|
49
|
+
const caps = await this.detectCapabilities();
|
|
50
|
+
switch (drmType) {
|
|
51
|
+
case DRMTypeEnum.WIDEVINE:
|
|
52
|
+
return caps.widevine;
|
|
53
|
+
case DRMTypeEnum.FAIRPLAY:
|
|
54
|
+
return caps.fairplay;
|
|
55
|
+
case DRMTypeEnum.PLAYREADY:
|
|
56
|
+
return caps.playready;
|
|
57
|
+
default:
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
isSafari() {
|
|
62
|
+
const ua = navigator.userAgent.toLowerCase();
|
|
63
|
+
return ua.includes('safari') && !ua.includes('chrome') && !ua.includes('chromium');
|
|
64
|
+
}
|
|
65
|
+
isWebKitBased() {
|
|
66
|
+
return 'WebKitMediaKeys' in window;
|
|
67
|
+
}
|
|
68
|
+
isEdge() {
|
|
69
|
+
const ua = navigator.userAgent.toLowerCase();
|
|
70
|
+
return ua.includes('edg/');
|
|
71
|
+
}
|
|
72
|
+
async checkFairPlaySupport() {
|
|
73
|
+
try {
|
|
74
|
+
if ('WebKitMediaKeys' in window) {
|
|
75
|
+
return true;
|
|
76
|
+
}
|
|
77
|
+
if (navigator.requestMediaKeySystemAccess) {
|
|
78
|
+
const config = [{
|
|
79
|
+
initDataTypes: ['sinf', 'skd'],
|
|
80
|
+
videoCapabilities: [{ contentType: 'application/vnd.apple.mpegurl' }],
|
|
81
|
+
}];
|
|
82
|
+
for (const keySystem of KEY_SYSTEMS[DRMTypeEnum.FAIRPLAY]) {
|
|
83
|
+
try {
|
|
84
|
+
await navigator.requestMediaKeySystemAccess(keySystem, config);
|
|
85
|
+
return true;
|
|
86
|
+
}
|
|
87
|
+
catch (e) {
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
return false;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
async checkWidevineSupport() {
|
|
99
|
+
try {
|
|
100
|
+
if (!navigator.requestMediaKeySystemAccess) {
|
|
101
|
+
console.warn('[BrowserDetector] EME API (requestMediaKeySystemAccess) not available. Secure context check:', window.isSecureContext);
|
|
102
|
+
return false;
|
|
103
|
+
}
|
|
104
|
+
const configs = [
|
|
105
|
+
{
|
|
106
|
+
initDataTypes: ['cenc'],
|
|
107
|
+
videoCapabilities: [{
|
|
108
|
+
contentType: 'video/mp4; codecs="avc1.42E01E"',
|
|
109
|
+
robustness: 'SW_SECURE_CRYPTO'
|
|
110
|
+
}],
|
|
111
|
+
audioCapabilities: [{
|
|
112
|
+
contentType: 'audio/mp4; codecs="mp4a.40.2"',
|
|
113
|
+
robustness: 'SW_SECURE_CRYPTO'
|
|
114
|
+
}]
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
initDataTypes: ['cenc'],
|
|
118
|
+
videoCapabilities: [{
|
|
119
|
+
contentType: 'video/mp4; codecs="avc1.42E01E"'
|
|
120
|
+
}]
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
initDataTypes: ['cenc'],
|
|
124
|
+
videoCapabilities: [{
|
|
125
|
+
contentType: 'video/mp4; codecs="avc1.4d401e"'
|
|
126
|
+
}]
|
|
127
|
+
}
|
|
128
|
+
];
|
|
129
|
+
for (const keySystem of KEY_SYSTEMS[DRMTypeEnum.WIDEVINE]) {
|
|
130
|
+
for (const config of configs) {
|
|
131
|
+
try {
|
|
132
|
+
await navigator.requestMediaKeySystemAccess(keySystem, [config]);
|
|
133
|
+
console.log(`[BrowserDetector] Widevine supported with system: ${keySystem} and config:`, config);
|
|
134
|
+
return true;
|
|
135
|
+
}
|
|
136
|
+
catch (e) {
|
|
137
|
+
continue;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
console.warn('[BrowserDetector] Widevine support check failed for all configurations');
|
|
142
|
+
return false;
|
|
143
|
+
}
|
|
144
|
+
catch (err) {
|
|
145
|
+
console.error('[BrowserDetector] Error checking Widevine support:', err);
|
|
146
|
+
return false;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
async checkPlayReadySupport() {
|
|
150
|
+
try {
|
|
151
|
+
if (!navigator.requestMediaKeySystemAccess) {
|
|
152
|
+
return false;
|
|
153
|
+
}
|
|
154
|
+
const configs = [
|
|
155
|
+
{
|
|
156
|
+
initDataTypes: ['cenc'],
|
|
157
|
+
videoCapabilities: [{
|
|
158
|
+
contentType: 'video/mp4; codecs="avc1.42E01E"',
|
|
159
|
+
robustness: 'SW_SECURE_CRYPTO'
|
|
160
|
+
}],
|
|
161
|
+
audioCapabilities: [{
|
|
162
|
+
contentType: 'audio/mp4; codecs="mp4a.40.2"',
|
|
163
|
+
robustness: 'SW_SECURE_CRYPTO'
|
|
164
|
+
}]
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
initDataTypes: ['cenc'],
|
|
168
|
+
videoCapabilities: [{
|
|
169
|
+
contentType: 'video/mp4; codecs="avc1.42E01E"'
|
|
170
|
+
}]
|
|
171
|
+
}
|
|
172
|
+
];
|
|
173
|
+
for (const keySystem of KEY_SYSTEMS[DRMTypeEnum.PLAYREADY]) {
|
|
174
|
+
for (const config of configs) {
|
|
175
|
+
try {
|
|
176
|
+
await navigator.requestMediaKeySystemAccess(keySystem, [config]);
|
|
177
|
+
console.log(`[BrowserDetector] PlayReady supported with system: ${keySystem} and config:`, config);
|
|
178
|
+
return true;
|
|
179
|
+
}
|
|
180
|
+
catch (e) {
|
|
181
|
+
continue;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
console.warn('[BrowserDetector] PlayReady support check failed for all configurations');
|
|
186
|
+
return false;
|
|
187
|
+
}
|
|
188
|
+
catch (err) {
|
|
189
|
+
console.error('[BrowserDetector] Error checking PlayReady support:', err);
|
|
190
|
+
return false;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
getBrowserName() {
|
|
194
|
+
const ua = navigator.userAgent.toLowerCase();
|
|
195
|
+
if (ua.includes('edg/'))
|
|
196
|
+
return 'Edge';
|
|
197
|
+
if (ua.includes('chrome') || ua.includes('chromium'))
|
|
198
|
+
return 'Chrome';
|
|
199
|
+
if (ua.includes('firefox'))
|
|
200
|
+
return 'Firefox';
|
|
201
|
+
if (ua.includes('safari'))
|
|
202
|
+
return 'Safari';
|
|
203
|
+
if (ua.includes('opera') || ua.includes('opr/'))
|
|
204
|
+
return 'Opera';
|
|
205
|
+
return 'Unknown';
|
|
206
|
+
}
|
|
207
|
+
resetCapabilities() {
|
|
208
|
+
this.capabilities = null;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
//# sourceMappingURL=BrowserDetector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BrowserDetector.js","sourceRoot":"","sources":["../../../src/drm/utils/BrowserDetector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export declare class CertificateManager {
|
|
2
|
+
private static instance;
|
|
3
|
+
private cache;
|
|
4
|
+
private maxCacheSize;
|
|
5
|
+
private constructor();
|
|
6
|
+
static getInstance(): CertificateManager;
|
|
7
|
+
getCertificate(url: string): ArrayBuffer | null;
|
|
8
|
+
setCertificate(url: string, certificate: ArrayBuffer): void;
|
|
9
|
+
hasCertificate(url: string): boolean;
|
|
10
|
+
clearCache(): void;
|
|
11
|
+
removeCertificate(url: string): boolean;
|
|
12
|
+
getCacheSize(): number;
|
|
13
|
+
setMaxCacheSize(size: number): void;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=CertificateManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CertificateManager.d.ts","sourceRoot":"","sources":["../../../src/drm/utils/CertificateManager.ts"],"names":[],"mappings":"AAKA,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAqB;IAC5C,OAAO,CAAC,KAAK,CAA2B;IACxC,OAAO,CAAC,YAAY,CAAc;IAElC,OAAO;IAIP,MAAM,CAAC,WAAW,IAAI,kBAAkB;IAUxC,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAO/C,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,GAAG,IAAI;IAe3D,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAOpC,UAAU,IAAI,IAAI;IAOlB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAOvC,YAAY,IAAI,MAAM;IAOtB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;CAWpC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
export class CertificateManager {
|
|
2
|
+
constructor() {
|
|
3
|
+
this.maxCacheSize = 10;
|
|
4
|
+
this.cache = new Map();
|
|
5
|
+
}
|
|
6
|
+
static getInstance() {
|
|
7
|
+
if (!CertificateManager.instance) {
|
|
8
|
+
CertificateManager.instance = new CertificateManager();
|
|
9
|
+
}
|
|
10
|
+
return CertificateManager.instance;
|
|
11
|
+
}
|
|
12
|
+
getCertificate(url) {
|
|
13
|
+
return this.cache.get(url) || null;
|
|
14
|
+
}
|
|
15
|
+
setCertificate(url, certificate) {
|
|
16
|
+
if (this.cache.size >= this.maxCacheSize && !this.cache.has(url)) {
|
|
17
|
+
const firstKey = this.cache.keys().next().value;
|
|
18
|
+
if (firstKey) {
|
|
19
|
+
this.cache.delete(firstKey);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
this.cache.set(url, certificate);
|
|
23
|
+
}
|
|
24
|
+
hasCertificate(url) {
|
|
25
|
+
return this.cache.has(url);
|
|
26
|
+
}
|
|
27
|
+
clearCache() {
|
|
28
|
+
this.cache.clear();
|
|
29
|
+
}
|
|
30
|
+
removeCertificate(url) {
|
|
31
|
+
return this.cache.delete(url);
|
|
32
|
+
}
|
|
33
|
+
getCacheSize() {
|
|
34
|
+
return this.cache.size;
|
|
35
|
+
}
|
|
36
|
+
setMaxCacheSize(size) {
|
|
37
|
+
this.maxCacheSize = size;
|
|
38
|
+
while (this.cache.size > this.maxCacheSize) {
|
|
39
|
+
const firstKey = this.cache.keys().next().value;
|
|
40
|
+
if (firstKey) {
|
|
41
|
+
this.cache.delete(firstKey);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=CertificateManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CertificateManager.js","sourceRoot":"","sources":["../../../src/drm/utils/CertificateManager.ts"],"names":[],"mappings":"AAKA,MAAM,OAAO,kBAAkB;IAK7B;QAFQ,iBAAY,GAAW,EAAE,CAAC;QAGhC,IAAI,CAAC,KAAK,GAAG,IAAI,GAAG,EAAE,CAAC;IACzB,CAAC;IAED,MAAM,CAAC,WAAW;QAChB,IAAI,CAAC,kBAAkB,CAAC,QAAQ,EAAE;YAChC,kBAAkB,CAAC,QAAQ,GAAG,IAAI,kBAAkB,EAAE,CAAC;SACxD;QACD,OAAO,kBAAkB,CAAC,QAAQ,CAAC;IACrC,CAAC;IAKD,cAAc,CAAC,GAAW;QACxB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC;IACrC,CAAC;IAKD,cAAc,CAAC,GAAW,EAAE,WAAwB;QAElD,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,YAAY,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;YAChE,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;YAChD,IAAI,QAAQ,EAAE;gBACZ,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;aAC7B;SACF;QAED,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IACnC,CAAC;IAKD,cAAc,CAAC,GAAW;QACxB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAKD,UAAU;QACR,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;IAKD,iBAAiB,CAAC,GAAW;QAC3B,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAChC,CAAC;IAKD,YAAY;QACV,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;IACzB,CAAC;IAKD,eAAe,CAAC,IAAY;QAC1B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QAGzB,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,YAAY,EAAE;YAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;YAChD,IAAI,QAAQ,EAAE;gBACZ,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;aAC7B;SACF;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { DRMError, DRMErrorCode } from '../types/DRMTypes';
|
|
2
|
+
export declare class DRMErrorHandler {
|
|
3
|
+
static getUserFriendlyMessage(error: DRMError): string;
|
|
4
|
+
static getTechnicalMessage(error: DRMError): string;
|
|
5
|
+
static createError(code: DRMErrorCode, message: string, fatal?: boolean, details?: any, systemError?: any): DRMError;
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=DRMErrorHandler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DRMErrorHandler.d.ts","sourceRoot":"","sources":["../../../src/drm/utils/DRMErrorHandler.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAE3D,qBAAa,eAAe;IAI1B,MAAM,CAAC,sBAAsB,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM;IAwCtD,MAAM,CAAC,mBAAmB,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM;IAiBnD,MAAM,CAAC,WAAW,CAChB,IAAI,EAAE,YAAY,EAClB,OAAO,EAAE,MAAM,EACf,KAAK,GAAE,OAAc,EACrB,OAAO,CAAC,EAAE,GAAG,EACb,WAAW,CAAC,EAAE,GAAG,GAChB,QAAQ;CASZ"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { DRMErrorCode } from "../types/DRMTypes.js";
|
|
2
|
+
export class DRMErrorHandler {
|
|
3
|
+
static getUserFriendlyMessage(error) {
|
|
4
|
+
switch (error.code) {
|
|
5
|
+
case DRMErrorCode.UNSUPPORTED_BROWSER:
|
|
6
|
+
return 'DRM is not supported in this browser. Please use Chrome, Safari, Firefox, or Edge.';
|
|
7
|
+
case DRMErrorCode.CERTIFICATE_LOAD_FAILED:
|
|
8
|
+
return 'Failed to load DRM certificate. Please check your internet connection.';
|
|
9
|
+
case DRMErrorCode.LICENSE_REQUEST_FAILED:
|
|
10
|
+
return 'Failed to obtain content license. Please check your internet connection and try again.';
|
|
11
|
+
case DRMErrorCode.KEY_SYSTEM_ACCESS_DENIED:
|
|
12
|
+
return 'Access to DRM system was denied. Please ensure DRM is enabled in your browser settings.';
|
|
13
|
+
case DRMErrorCode.MEDIA_KEYS_CREATION_FAILED:
|
|
14
|
+
return 'Failed to initialize DRM protection. Please try refreshing the page.';
|
|
15
|
+
case DRMErrorCode.SESSION_CREATION_FAILED:
|
|
16
|
+
return 'Failed to create secure playback session. Please try again.';
|
|
17
|
+
case DRMErrorCode.LICENSE_INVALID:
|
|
18
|
+
return 'Invalid or expired content license. You may not have permission to view this content.';
|
|
19
|
+
case DRMErrorCode.CONFIGURATION_ERROR:
|
|
20
|
+
return 'DRM configuration error. Please contact support.';
|
|
21
|
+
case DRMErrorCode.NETWORK_ERROR:
|
|
22
|
+
return 'Network error while loading protected content. Please check your internet connection.';
|
|
23
|
+
case DRMErrorCode.TIMEOUT:
|
|
24
|
+
return 'DRM initialization timed out. Please try again.';
|
|
25
|
+
default:
|
|
26
|
+
return 'An error occurred while loading protected content. Please try again.';
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
static getTechnicalMessage(error) {
|
|
30
|
+
let message = `[${error.code}] ${error.message}`;
|
|
31
|
+
if (error.details) {
|
|
32
|
+
message += `\nDetails: ${JSON.stringify(error.details, null, 2)}`;
|
|
33
|
+
}
|
|
34
|
+
if (error.systemError) {
|
|
35
|
+
message += `\nSystem Error: ${error.systemError}`;
|
|
36
|
+
}
|
|
37
|
+
return message;
|
|
38
|
+
}
|
|
39
|
+
static createError(code, message, fatal = true, details, systemError) {
|
|
40
|
+
return {
|
|
41
|
+
code,
|
|
42
|
+
message,
|
|
43
|
+
fatal,
|
|
44
|
+
details,
|
|
45
|
+
systemError,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=DRMErrorHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DRMErrorHandler.js","sourceRoot":"","sources":["../../../src/drm/utils/DRMErrorHandler.ts"],"names":[],"mappings":"AAKA,OAAO,EAAY,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAE3D,MAAM,OAAO,eAAe;IAI1B,MAAM,CAAC,sBAAsB,CAAC,KAAe;QAC3C,QAAQ,KAAK,CAAC,IAAI,EAAE;YAClB,KAAK,YAAY,CAAC,mBAAmB;gBACnC,OAAO,oFAAoF,CAAC;YAE9F,KAAK,YAAY,CAAC,uBAAuB;gBACvC,OAAO,wEAAwE,CAAC;YAElF,KAAK,YAAY,CAAC,sBAAsB;gBACtC,OAAO,wFAAwF,CAAC;YAElG,KAAK,YAAY,CAAC,wBAAwB;gBACxC,OAAO,yFAAyF,CAAC;YAEnG,KAAK,YAAY,CAAC,0BAA0B;gBAC1C,OAAO,sEAAsE,CAAC;YAEhF,KAAK,YAAY,CAAC,uBAAuB;gBACvC,OAAO,6DAA6D,CAAC;YAEvE,KAAK,YAAY,CAAC,eAAe;gBAC/B,OAAO,uFAAuF,CAAC;YAEjG,KAAK,YAAY,CAAC,mBAAmB;gBACnC,OAAO,kDAAkD,CAAC;YAE5D,KAAK,YAAY,CAAC,aAAa;gBAC7B,OAAO,uFAAuF,CAAC;YAEjG,KAAK,YAAY,CAAC,OAAO;gBACvB,OAAO,iDAAiD,CAAC;YAE3D;gBACE,OAAO,sEAAsE,CAAC;SACjF;IACH,CAAC;IAKD,MAAM,CAAC,mBAAmB,CAAC,KAAe;QACxC,IAAI,OAAO,GAAG,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC;QAEjD,IAAI,KAAK,CAAC,OAAO,EAAE;YACjB,OAAO,IAAI,cAAc,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;SACnE;QAED,IAAI,KAAK,CAAC,WAAW,EAAE;YACrB,OAAO,IAAI,mBAAmB,KAAK,CAAC,WAAW,EAAE,CAAC;SACnD;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAKD,MAAM,CAAC,WAAW,CAChB,IAAkB,EAClB,OAAe,EACf,QAAiB,IAAI,EACrB,OAAa,EACb,WAAiB;QAEjB,OAAO;YACL,IAAI;YACJ,OAAO;YACP,KAAK;YACL,OAAO;YACP,WAAW;SACZ,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { ExtendedDRMConfig, LicenseRequest, LicenseResponse } from '../types/DRMTypes';
|
|
2
|
+
export declare class LicenseRequestHandler {
|
|
3
|
+
private config;
|
|
4
|
+
private debug;
|
|
5
|
+
constructor(config: ExtendedDRMConfig, debug?: boolean);
|
|
6
|
+
requestLicense(request: LicenseRequest): Promise<LicenseResponse>;
|
|
7
|
+
private makeRequest;
|
|
8
|
+
private isFatalError;
|
|
9
|
+
private textToArrayBuffer;
|
|
10
|
+
private base64ToArrayBuffer;
|
|
11
|
+
private delay;
|
|
12
|
+
private createError;
|
|
13
|
+
private log;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=LicenseRequestHandler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LicenseRequestHandler.d.ts","sourceRoot":"","sources":["../../../src/drm/utils/LicenseRequestHandler.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,eAAe,EAAgB,MAAM,mBAAmB,CAAC;AAErG,qBAAa,qBAAqB;IAChC,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,KAAK,CAAU;gBAEX,MAAM,EAAE,iBAAiB,EAAE,KAAK,GAAE,OAAe;IAQvD,cAAc,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC;YAqCzD,WAAW;IAgEzB,OAAO,CAAC,YAAY;IAiBpB,OAAO,CAAC,iBAAiB;IAQzB,OAAO,CAAC,mBAAmB;IAY3B,OAAO,CAAC,KAAK;IAOb,OAAO,CAAC,WAAW;IAUnB,OAAO,CAAC,GAAG;CAKZ"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { DRMErrorCode } from "../types/DRMTypes.js";
|
|
2
|
+
export class LicenseRequestHandler {
|
|
3
|
+
constructor(config, debug = false) {
|
|
4
|
+
this.config = config;
|
|
5
|
+
this.debug = debug;
|
|
6
|
+
}
|
|
7
|
+
async requestLicense(request) {
|
|
8
|
+
const maxRetries = this.config.retryConfig?.maxRetries || 3;
|
|
9
|
+
const retryDelay = this.config.retryConfig?.retryDelay || 1000;
|
|
10
|
+
let lastError;
|
|
11
|
+
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
12
|
+
try {
|
|
13
|
+
if (attempt > 0) {
|
|
14
|
+
this.log(`Retry attempt ${attempt}/${maxRetries}`);
|
|
15
|
+
await this.delay(retryDelay * attempt);
|
|
16
|
+
}
|
|
17
|
+
const response = await this.makeRequest(request);
|
|
18
|
+
return response;
|
|
19
|
+
}
|
|
20
|
+
catch (error) {
|
|
21
|
+
lastError = error;
|
|
22
|
+
this.log(`License request failed (attempt ${attempt + 1}/${maxRetries + 1}):`, error);
|
|
23
|
+
if (this.isFatalError(error)) {
|
|
24
|
+
throw error;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
throw this.createError(DRMErrorCode.LICENSE_REQUEST_FAILED, `Failed to request license after ${maxRetries + 1} attempts`, lastError);
|
|
29
|
+
}
|
|
30
|
+
async makeRequest(request) {
|
|
31
|
+
this.log('Requesting license from:', request.url);
|
|
32
|
+
try {
|
|
33
|
+
const response = await fetch(request.url, {
|
|
34
|
+
method: request.method,
|
|
35
|
+
headers: request.headers,
|
|
36
|
+
body: request.body,
|
|
37
|
+
});
|
|
38
|
+
if (!response.ok) {
|
|
39
|
+
throw this.createError(DRMErrorCode.LICENSE_REQUEST_FAILED, `License server returned ${response.status}: ${response.statusText}`, { status: response.status, statusText: response.statusText });
|
|
40
|
+
}
|
|
41
|
+
let license;
|
|
42
|
+
if (request.responseType === 'arraybuffer') {
|
|
43
|
+
license = await response.arrayBuffer();
|
|
44
|
+
}
|
|
45
|
+
else if (request.responseType === 'text') {
|
|
46
|
+
const text = await response.text();
|
|
47
|
+
license = this.textToArrayBuffer(text);
|
|
48
|
+
}
|
|
49
|
+
else if (request.responseType === 'json') {
|
|
50
|
+
const json = await response.json();
|
|
51
|
+
if (json.license) {
|
|
52
|
+
license = this.base64ToArrayBuffer(json.license);
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
throw this.createError(DRMErrorCode.LICENSE_INVALID, 'License response does not contain license field', json);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
license = await response.arrayBuffer();
|
|
60
|
+
}
|
|
61
|
+
this.log('License received, size:', license.byteLength, 'bytes');
|
|
62
|
+
return {
|
|
63
|
+
license,
|
|
64
|
+
metadata: response.headers,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
if (error.code && error.code.startsWith('DRM_')) {
|
|
69
|
+
throw error;
|
|
70
|
+
}
|
|
71
|
+
throw this.createError(DRMErrorCode.NETWORK_ERROR, `Network error requesting license: ${error.message}`, error);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
isFatalError(error) {
|
|
75
|
+
if (error.details?.status === 401 || error.details?.status === 403) {
|
|
76
|
+
return true;
|
|
77
|
+
}
|
|
78
|
+
if (error.code === DRMErrorCode.LICENSE_INVALID) {
|
|
79
|
+
return true;
|
|
80
|
+
}
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
textToArrayBuffer(text) {
|
|
84
|
+
const encoder = new TextEncoder();
|
|
85
|
+
return encoder.encode(text).buffer;
|
|
86
|
+
}
|
|
87
|
+
base64ToArrayBuffer(base64) {
|
|
88
|
+
const binaryString = atob(base64);
|
|
89
|
+
const bytes = new Uint8Array(binaryString.length);
|
|
90
|
+
for (let i = 0; i < binaryString.length; i++) {
|
|
91
|
+
bytes[i] = binaryString.charCodeAt(i);
|
|
92
|
+
}
|
|
93
|
+
return bytes.buffer;
|
|
94
|
+
}
|
|
95
|
+
delay(ms) {
|
|
96
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
97
|
+
}
|
|
98
|
+
createError(code, message, details) {
|
|
99
|
+
const error = new Error(message);
|
|
100
|
+
error.code = code;
|
|
101
|
+
error.details = details;
|
|
102
|
+
return error;
|
|
103
|
+
}
|
|
104
|
+
log(...args) {
|
|
105
|
+
if (this.debug) {
|
|
106
|
+
console.log('[LicenseRequestHandler]', ...args);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=LicenseRequestHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LicenseRequestHandler.js","sourceRoot":"","sources":["../../../src/drm/utils/LicenseRequestHandler.ts"],"names":[],"mappings":"AAKA,OAAO,EAAsD,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAErG,MAAM,OAAO,qBAAqB;IAIhC,YAAY,MAAyB,EAAE,QAAiB,KAAK;QAC3D,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAKD,KAAK,CAAC,cAAc,CAAC,OAAuB;QAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,UAAU,IAAI,CAAC,CAAC;QAC5D,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,UAAU,IAAI,IAAI,CAAC;QAE/D,IAAI,SAAc,CAAC;QAEnB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,UAAU,EAAE,OAAO,EAAE,EAAE;YACtD,IAAI;gBACF,IAAI,OAAO,GAAG,CAAC,EAAE;oBACf,IAAI,CAAC,GAAG,CAAC,iBAAiB,OAAO,IAAI,UAAU,EAAE,CAAC,CAAC;oBACnD,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,OAAO,CAAC,CAAC;iBACxC;gBAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;gBACjD,OAAO,QAAQ,CAAC;aACjB;YAAC,OAAO,KAAU,EAAE;gBACnB,SAAS,GAAG,KAAK,CAAC;gBAClB,IAAI,CAAC,GAAG,CAAC,mCAAmC,OAAO,GAAG,CAAC,IAAI,UAAU,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;gBAGtF,IAAI,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE;oBAC5B,MAAM,KAAK,CAAC;iBACb;aACF;SACF;QAGD,MAAM,IAAI,CAAC,WAAW,CACpB,YAAY,CAAC,sBAAsB,EACnC,mCAAmC,UAAU,GAAG,CAAC,WAAW,EAC5D,SAAS,CACV,CAAC;IACJ,CAAC;IAKO,KAAK,CAAC,WAAW,CAAC,OAAuB;QAC/C,IAAI,CAAC,GAAG,CAAC,0BAA0B,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;QAElD,IAAI;YACF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE;gBACxC,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,IAAI,EAAE,OAAO,CAAC,IAAI;aACnB,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE;gBAChB,MAAM,IAAI,CAAC,WAAW,CACpB,YAAY,CAAC,sBAAsB,EACnC,2BAA2B,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC,UAAU,EAAE,EACpE,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,CAAC,UAAU,EAAE,CAC7D,CAAC;aACH;YAGD,IAAI,OAAoB,CAAC;YAEzB,IAAI,OAAO,CAAC,YAAY,KAAK,aAAa,EAAE;gBAC1C,OAAO,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC;aACxC;iBAAM,IAAI,OAAO,CAAC,YAAY,KAAK,MAAM,EAAE;gBAC1C,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACnC,OAAO,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;aACxC;iBAAM,IAAI,OAAO,CAAC,YAAY,KAAK,MAAM,EAAE;gBAC1C,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBAEnC,IAAI,IAAI,CAAC,OAAO,EAAE;oBAChB,OAAO,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;iBAClD;qBAAM;oBACL,MAAM,IAAI,CAAC,WAAW,CACpB,YAAY,CAAC,eAAe,EAC5B,iDAAiD,EACjD,IAAI,CACL,CAAC;iBACH;aACF;iBAAM;gBACL,OAAO,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC;aACxC;YAED,IAAI,CAAC,GAAG,CAAC,yBAAyB,EAAE,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YAEjE,OAAO;gBACL,OAAO;gBACP,QAAQ,EAAE,QAAQ,CAAC,OAAO;aAC3B,CAAC;SACH;QAAC,OAAO,KAAU,EAAE;YACnB,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE;gBAC/C,MAAM,KAAK,CAAC;aACb;YAED,MAAM,IAAI,CAAC,WAAW,CACpB,YAAY,CAAC,aAAa,EAC1B,qCAAqC,KAAK,CAAC,OAAO,EAAE,EACpD,KAAK,CACN,CAAC;SACH;IACH,CAAC;IAKO,YAAY,CAAC,KAAU;QAE7B,IAAI,KAAK,CAAC,OAAO,EAAE,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,OAAO,EAAE,MAAM,KAAK,GAAG,EAAE;YAClE,OAAO,IAAI,CAAC;SACb;QAGD,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,CAAC,eAAe,EAAE;YAC/C,OAAO,IAAI,CAAC;SACb;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAKO,iBAAiB,CAAC,IAAY;QACpC,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;QAClC,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;IACrC,CAAC;IAKO,mBAAmB,CAAC,MAAc;QACxC,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;QAClC,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAClD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YAC5C,KAAK,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;SACvC;QACD,OAAO,KAAK,CAAC,MAAM,CAAC;IACtB,CAAC;IAKO,KAAK,CAAC,EAAU;QACtB,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;IACzD,CAAC;IAKO,WAAW,CAAC,IAAkB,EAAE,OAAe,EAAE,OAAa;QACpE,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;QAChC,KAAa,CAAC,IAAI,GAAG,IAAI,CAAC;QAC1B,KAAa,CAAC,OAAO,GAAG,OAAO,CAAC;QACjC,OAAO,KAAK,CAAC;IACf,CAAC;IAKO,GAAG,CAAC,GAAG,IAAW;QACxB,IAAI,IAAI,CAAC,KAAK,EAAE;YACd,OAAO,CAAC,GAAG,CAAC,yBAAyB,EAAE,GAAG,IAAI,CAAC,CAAC;SACjD;IACH,CAAC;CACF"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
export * from
|
|
2
|
-
export { WebPlayer } from
|
|
3
|
-
export { WebPlayerView } from
|
|
4
|
-
export * from
|
|
1
|
+
export * from '../../core/dist/index.js';
|
|
2
|
+
export { WebPlayer } from './WebPlayer.js';
|
|
3
|
+
export { WebPlayerView } from './react/WebPlayerView.js';
|
|
4
|
+
export * from './react/EPG.js';
|
|
5
5
|
export const VERSION = '1.0.0';
|
|
6
6
|
//# sourceMappingURL=index.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
export { default as EPGOverlay } from
|
|
2
|
-
export { default as EPGTimelineHeader } from
|
|
3
|
-
export { default as EPGProgramGrid } from
|
|
4
|
-
export { default as EPGNavigationControls } from
|
|
5
|
-
export { default as EPGProgramDetails } from
|
|
6
|
-
export { parseTime, formatTime, formatDateTime, getProgramDuration, generateTimeSlots, calculateProgramBlock, isProgramLive, getProgramProgress, findProgramAtTime, getCurrentTimePosition, snapToTimeSlot, calculateOptimalTimeRange, getProgramsInRange, calculateScrollPosition, debounce, throttle, } from
|
|
1
|
+
export { default as EPGOverlay } from './components/EPGOverlay.js';
|
|
2
|
+
export { default as EPGTimelineHeader } from './components/EPGTimelineHeader.js';
|
|
3
|
+
export { default as EPGProgramGrid } from './components/EPGProgramGrid.js';
|
|
4
|
+
export { default as EPGNavigationControls } from './components/EPGNavigationControls.js';
|
|
5
|
+
export { default as EPGProgramDetails } from './components/EPGProgramDetails.js';
|
|
6
|
+
export { parseTime, formatTime, formatDateTime, getProgramDuration, generateTimeSlots, calculateProgramBlock, isProgramLive, getProgramProgress, findProgramAtTime, getCurrentTimePosition, snapToTimeSlot, calculateOptimalTimeRange, getProgramsInRange, calculateScrollPosition, debounce, throttle, } from './utils/EPGUtils.js';
|
|
7
7
|
//# sourceMappingURL=EPG.js.map
|