streamit-player 1.0.0

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 (118) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/LICENSE +203 -0
  3. package/README.md +552 -0
  4. package/dist/Player-BfmqCREY.cjs +11616 -0
  5. package/dist/Player-YpukGRGt.js +11617 -0
  6. package/dist/PlayerController-Bt7Po42U.cjs +14093 -0
  7. package/dist/PlayerController-CW0pxrIt.js +14072 -0
  8. package/dist/core/index.cjs +194 -0
  9. package/dist/core/index.js +194 -0
  10. package/dist/core/src/AdScheduler.d.ts +56 -0
  11. package/dist/core/src/AdScheduler.d.ts.map +1 -0
  12. package/dist/core/src/AdsController.d.ts +48 -0
  13. package/dist/core/src/AdsController.d.ts.map +1 -0
  14. package/dist/core/src/AdsManager.d.ts +181 -0
  15. package/dist/core/src/AdsManager.d.ts.map +1 -0
  16. package/dist/core/src/DrmManager.d.ts +162 -0
  17. package/dist/core/src/DrmManager.d.ts.map +1 -0
  18. package/dist/core/src/DrmValidator.d.ts +36 -0
  19. package/dist/core/src/DrmValidator.d.ts.map +1 -0
  20. package/dist/core/src/KeyboardManager.d.ts +73 -0
  21. package/dist/core/src/KeyboardManager.d.ts.map +1 -0
  22. package/dist/core/src/PictureInPictureManager.d.ts +47 -0
  23. package/dist/core/src/PictureInPictureManager.d.ts.map +1 -0
  24. package/dist/core/src/PlayerController.d.ts +231 -0
  25. package/dist/core/src/PlayerController.d.ts.map +1 -0
  26. package/dist/core/src/PlaylistManager.d.ts +63 -0
  27. package/dist/core/src/PlaylistManager.d.ts.map +1 -0
  28. package/dist/core/src/SourceManager.d.ts +142 -0
  29. package/dist/core/src/SourceManager.d.ts.map +1 -0
  30. package/dist/core/src/SubtitleManager.d.ts +77 -0
  31. package/dist/core/src/SubtitleManager.d.ts.map +1 -0
  32. package/dist/core/src/TimelineMath.d.ts +14 -0
  33. package/dist/core/src/TimelineMath.d.ts.map +1 -0
  34. package/dist/core/src/html-overlay/HtmlOverlayRenderer.d.ts +103 -0
  35. package/dist/core/src/html-overlay/HtmlOverlayRenderer.d.ts.map +1 -0
  36. package/dist/core/src/index.d.ts +21 -0
  37. package/dist/core/src/index.d.ts.map +1 -0
  38. package/dist/core/src/providers/ImaProvider.d.ts +135 -0
  39. package/dist/core/src/providers/ImaProvider.d.ts.map +1 -0
  40. package/dist/core/src/providers/ThumbnailProviders.d.ts +102 -0
  41. package/dist/core/src/providers/ThumbnailProviders.d.ts.map +1 -0
  42. package/dist/core/src/providers/VastProvider.d.ts +202 -0
  43. package/dist/core/src/providers/VastProvider.d.ts.map +1 -0
  44. package/dist/core/src/providers/VmapProvider.d.ts +98 -0
  45. package/dist/core/src/providers/VmapProvider.d.ts.map +1 -0
  46. package/dist/core/src/providers/fetchXmlWithPolicy.d.ts +9 -0
  47. package/dist/core/src/providers/fetchXmlWithPolicy.d.ts.map +1 -0
  48. package/dist/core/src/simid/SimidBridge.d.ts +44 -0
  49. package/dist/core/src/simid/SimidBridge.d.ts.map +1 -0
  50. package/dist/core/src/simid/SimidManager.d.ts +21 -0
  51. package/dist/core/src/simid/SimidManager.d.ts.map +1 -0
  52. package/dist/core/src/simid/SimidRuntime.d.ts +113 -0
  53. package/dist/core/src/simid/SimidRuntime.d.ts.map +1 -0
  54. package/dist/core/src/simid/SimidSession.d.ts +48 -0
  55. package/dist/core/src/simid/SimidSession.d.ts.map +1 -0
  56. package/dist/core/src/simid/types.d.ts +115 -0
  57. package/dist/core/src/simid/types.d.ts.map +1 -0
  58. package/dist/core/src/storage.d.ts +10 -0
  59. package/dist/core/src/storage.d.ts.map +1 -0
  60. package/dist/core/src/types.d.ts +1403 -0
  61. package/dist/core/src/types.d.ts.map +1 -0
  62. package/dist/core/src/utils.d.ts +34 -0
  63. package/dist/core/src/utils.d.ts.map +1 -0
  64. package/dist/core/src/vendorLoaders.d.ts +16 -0
  65. package/dist/core/src/vendorLoaders.d.ts.map +1 -0
  66. package/dist/index.cjs +55 -0
  67. package/dist/index.js +55 -0
  68. package/dist/src/index.d.ts +3 -0
  69. package/dist/src/index.d.ts.map +1 -0
  70. package/dist/streamit-player.esm.js +26226 -0
  71. package/dist/streamit-player.esm.min.js +18830 -0
  72. package/dist/streamit-player.iife.js +26229 -0
  73. package/dist/streamit-player.iife.min.js +4750 -0
  74. package/dist/web-components/index.cjs +15 -0
  75. package/dist/web-components/index.js +15 -0
  76. package/dist/web-components/src/ChaptersButton.d.ts +27 -0
  77. package/dist/web-components/src/ChaptersButton.d.ts.map +1 -0
  78. package/dist/web-components/src/ChaptersButton.styles.d.ts +2 -0
  79. package/dist/web-components/src/ChaptersButton.styles.d.ts.map +1 -0
  80. package/dist/web-components/src/PlayButton.d.ts +17 -0
  81. package/dist/web-components/src/PlayButton.d.ts.map +1 -0
  82. package/dist/web-components/src/PlayButton.styles.d.ts +2 -0
  83. package/dist/web-components/src/PlayButton.styles.d.ts.map +1 -0
  84. package/dist/web-components/src/Player.d.ts +271 -0
  85. package/dist/web-components/src/Player.d.ts.map +1 -0
  86. package/dist/web-components/src/Player.styles.d.ts +2 -0
  87. package/dist/web-components/src/Player.styles.d.ts.map +1 -0
  88. package/dist/web-components/src/SeekButton.d.ts +18 -0
  89. package/dist/web-components/src/SeekButton.d.ts.map +1 -0
  90. package/dist/web-components/src/SeekButton.styles.d.ts +2 -0
  91. package/dist/web-components/src/SeekButton.styles.d.ts.map +1 -0
  92. package/dist/web-components/src/Seekbar.d.ts +101 -0
  93. package/dist/web-components/src/Seekbar.d.ts.map +1 -0
  94. package/dist/web-components/src/Seekbar.styles.d.ts +2 -0
  95. package/dist/web-components/src/Seekbar.styles.d.ts.map +1 -0
  96. package/dist/web-components/src/Themes.d.ts +5 -0
  97. package/dist/web-components/src/Themes.d.ts.map +1 -0
  98. package/dist/web-components/src/VerticalControls.d.ts +49 -0
  99. package/dist/web-components/src/VerticalControls.d.ts.map +1 -0
  100. package/dist/web-components/src/VerticalControls.styles.d.ts +2 -0
  101. package/dist/web-components/src/VerticalControls.styles.d.ts.map +1 -0
  102. package/dist/web-components/src/VolumeControl.d.ts +21 -0
  103. package/dist/web-components/src/VolumeControl.d.ts.map +1 -0
  104. package/dist/web-components/src/VolumeControl.styles.d.ts +2 -0
  105. package/dist/web-components/src/VolumeControl.styles.d.ts.map +1 -0
  106. package/dist/web-components/src/icons/IconRegistry.d.ts +24 -0
  107. package/dist/web-components/src/icons/IconRegistry.d.ts.map +1 -0
  108. package/dist/web-components/src/index.d.ts +10 -0
  109. package/dist/web-components/src/index.d.ts.map +1 -0
  110. package/dist/web-components/src/player-internals/GestureController.d.ts +140 -0
  111. package/dist/web-components/src/player-internals/GestureController.d.ts.map +1 -0
  112. package/dist/web-components/src/player-internals/PrefetchController.d.ts +34 -0
  113. package/dist/web-components/src/player-internals/PrefetchController.d.ts.map +1 -0
  114. package/dist/web-components/src/player-internals/SettingsMenuController.d.ts +59 -0
  115. package/dist/web-components/src/player-internals/SettingsMenuController.d.ts.map +1 -0
  116. package/dist/web-components/src/player-internals/ThumbnailCache.d.ts +64 -0
  117. package/dist/web-components/src/player-internals/ThumbnailCache.d.ts.map +1 -0
  118. package/package.json +84 -0
@@ -0,0 +1,194 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const PlayerController = require("../PlayerController-Bt7Po42U.cjs");
4
+ class DrmValidator {
5
+ /**
6
+ * Performs an automated validation of the player's DRM state.
7
+ */
8
+ static async validate(controller) {
9
+ const report = {
10
+ emeSupported: typeof navigator !== "undefined" && typeof navigator.requestMediaKeySystemAccess === "function",
11
+ keySystems: {},
12
+ activeSystem: null,
13
+ hasMediaKeys: false,
14
+ activeSessionsCount: 0,
15
+ sessionIds: [],
16
+ keyStatuses: [],
17
+ hasUsableKey: false,
18
+ errors: [],
19
+ passed: false,
20
+ requestMediaKeySystemAccessChecked: false,
21
+ mediaKeysCreatedChecked: false,
22
+ mediaKeysAttachedChecked: false,
23
+ encryptedEventCount: 0,
24
+ licenseChallengeGeneratedCount: 0,
25
+ licenseRequestSentCount: 0,
26
+ licenseResponseReceivedCount: 0,
27
+ sessionUpdatedCount: 0,
28
+ keyStatusesChangeCount: 0,
29
+ usableKeysCount: 0,
30
+ expiredKeysCount: 0,
31
+ outputRestrictedCount: 0,
32
+ internalErrorsCount: 0,
33
+ closedSessionsCount: 0,
34
+ lastInternalError: null
35
+ };
36
+ if (!report.emeSupported) {
37
+ report.errors.push("EME is not supported on this platform/browser.");
38
+ return report;
39
+ }
40
+ const systems = {
41
+ widevine: "com.widevine.alpha",
42
+ playready: "com.microsoft.playready",
43
+ fairplay: "com.apple.fps",
44
+ clearkey: "org.w3.clearkey"
45
+ };
46
+ const videoCapabilities = [
47
+ { contentType: 'video/mp4; codecs="avc1.640028"' },
48
+ { contentType: 'video/mp4; codecs="avc1.4d401e"' },
49
+ { contentType: "video/mp4" },
50
+ { contentType: 'video/webm; codecs="vp9"' }
51
+ ];
52
+ const audioCapabilities = [
53
+ { contentType: 'audio/mp4; codecs="mp4a.40.2"' },
54
+ { contentType: "audio/mp4" },
55
+ { contentType: 'audio/webm; codecs="opus"' }
56
+ ];
57
+ for (const [name, sys] of Object.entries(systems)) {
58
+ try {
59
+ const config = [
60
+ // 1. Preferred full capabilities
61
+ {
62
+ initDataTypes: ["cenc", "keyids", "webm", "skd", "sinf"],
63
+ videoCapabilities,
64
+ audioCapabilities
65
+ },
66
+ // 2. Video fallback
67
+ {
68
+ initDataTypes: ["cenc", "keyids", "webm", "skd", "sinf"],
69
+ videoCapabilities
70
+ },
71
+ // 3. Audio fallback
72
+ {
73
+ initDataTypes: ["cenc", "keyids", "webm", "skd", "sinf"],
74
+ audioCapabilities
75
+ },
76
+ // 4. State/Identifier disabled fallback
77
+ {
78
+ initDataTypes: ["cenc", "keyids", "webm", "skd", "sinf"],
79
+ videoCapabilities,
80
+ persistentState: "not-allowed",
81
+ distinctiveIdentifier: "not-allowed"
82
+ }
83
+ ];
84
+ await navigator.requestMediaKeySystemAccess(sys, config);
85
+ report.keySystems[name] = true;
86
+ } catch (_) {
87
+ report.keySystems[name] = false;
88
+ }
89
+ }
90
+ const video = controller.getVideoElement();
91
+ if (video) {
92
+ if (video.mediaKeys) {
93
+ report.hasMediaKeys = true;
94
+ const drmManager = controller.getDrmManager();
95
+ if (drmManager) {
96
+ const drmConfig = drmManager.getConfig();
97
+ if (drmConfig) {
98
+ report.activeSystem = Object.keys(drmConfig).find(
99
+ (k) => k !== "robustness" && k !== "distinctiveIdentifier" && k !== "persistentState" && k !== "retryCount" && k !== "timeout"
100
+ ) || null;
101
+ }
102
+ const sessions = drmManager.getActiveSessions();
103
+ if (sessions) {
104
+ report.activeSessionsCount = sessions.size;
105
+ sessions.forEach((s) => {
106
+ if (s.sessionId) {
107
+ report.sessionIds.push(s.sessionId);
108
+ }
109
+ if (s.keyStatuses) {
110
+ s.keyStatuses.forEach((status) => {
111
+ report.keyStatuses.push(String(status));
112
+ if (status === "usable") {
113
+ report.hasUsableKey = true;
114
+ }
115
+ });
116
+ }
117
+ });
118
+ }
119
+ const diag = drmManager.emeDiagnostics;
120
+ if (diag) {
121
+ report.requestMediaKeySystemAccessChecked = diag.requestMediaKeySystemAccess;
122
+ report.mediaKeysCreatedChecked = diag.mediaKeysCreated;
123
+ report.mediaKeysAttachedChecked = diag.mediaKeysAttached;
124
+ report.encryptedEventCount = diag.encryptedEventsCount;
125
+ report.licenseChallengeGeneratedCount = diag.challengesGenerated;
126
+ report.licenseRequestSentCount = diag.licenseRequestsSent;
127
+ report.licenseResponseReceivedCount = diag.licenseResponsesReceived;
128
+ report.sessionUpdatedCount = diag.sessionsUpdated;
129
+ report.keyStatusesChangeCount = diag.keyStatusesChanges;
130
+ report.usableKeysCount = diag.usableKeysCount;
131
+ report.expiredKeysCount = diag.expiredKeysCount;
132
+ report.outputRestrictedCount = diag.outputRestrictedCount;
133
+ report.internalErrorsCount = diag.internalErrorsCount;
134
+ report.closedSessionsCount = diag.closedSessionsCount;
135
+ report.lastInternalError = diag.lastInternalError;
136
+ if (diag.expiredKeysCount > 0) {
137
+ report.errors.push(`EME has ${diag.expiredKeysCount} expired key(s).`);
138
+ }
139
+ if (diag.outputRestrictedCount > 0) {
140
+ report.errors.push(`EME playback restricted by HDCP output constraints.`);
141
+ }
142
+ if (diag.internalErrorsCount > 0 && diag.lastInternalError) {
143
+ report.errors.push(`EME Internal Error: ${diag.lastInternalError}`);
144
+ }
145
+ }
146
+ }
147
+ }
148
+ }
149
+ const state = controller.getState();
150
+ if (state && state.error) {
151
+ report.errors.push(state.error);
152
+ }
153
+ report.passed = report.emeSupported && report.errors.length === 0;
154
+ return report;
155
+ }
156
+ }
157
+ exports.AdBreakManager = PlayerController.AdBreakManager;
158
+ exports.AdBreakType = PlayerController.AdBreakType;
159
+ exports.AdErrorType = PlayerController.AdErrorType;
160
+ exports.AdPlacementType = PlayerController.AdPlacementType;
161
+ exports.AdProviderType = PlayerController.AdProviderType;
162
+ exports.AdSkipMode = PlayerController.AdSkipMode;
163
+ exports.AdState = PlayerController.AdState;
164
+ exports.AdsController = PlayerController.AdsController;
165
+ exports.AdsManager = PlayerController.AdsManager;
166
+ exports.AdsValidator = PlayerController.AdsValidator;
167
+ exports.AutoThumbnailProvider = PlayerController.AutoThumbnailProvider;
168
+ exports.DrmManager = PlayerController.DrmManager;
169
+ exports.HtmlOverlayRenderer = PlayerController.HtmlOverlayRenderer;
170
+ exports.ImaProvider = PlayerController.ImaProvider;
171
+ exports.KeyboardManager = PlayerController.KeyboardManager;
172
+ exports.PlayerController = PlayerController.PlayerController;
173
+ exports.SimidBridge = PlayerController.SimidBridge;
174
+ exports.SimidErrorCode = PlayerController.SimidErrorCode;
175
+ exports.SimidManager = PlayerController.SimidManager;
176
+ exports.SimidRuntime = PlayerController.SimidRuntime;
177
+ exports.SimidSession = PlayerController.SimidSession;
178
+ exports.SpriteThumbnailProvider = PlayerController.SpriteThumbnailProvider;
179
+ exports.TimelineMath = PlayerController.TimelineMath;
180
+ exports.TrackingEventName = PlayerController.TrackingEventName;
181
+ exports.VTTThumbnailProvider = PlayerController.VTTThumbnailProvider;
182
+ exports.VastProvider = PlayerController.VastProvider;
183
+ exports.VideoFrameThumbnailProvider = PlayerController.VideoFrameThumbnailProvider;
184
+ exports.VmapProvider = PlayerController.VmapProvider;
185
+ exports.detectSupportedKeySystems = PlayerController.detectSupportedKeySystems;
186
+ exports.formatTime = PlayerController.formatTime;
187
+ exports.isClearKeySupported = PlayerController.isClearKeySupported;
188
+ exports.isFairPlaySupported = PlayerController.isFairPlaySupported;
189
+ exports.isKeySystemSupported = PlayerController.isKeySystemSupported;
190
+ exports.isPlayReadySupported = PlayerController.isPlayReadySupported;
191
+ exports.isWidevineSupported = PlayerController.isWidevineSupported;
192
+ exports.normalizeClearKeyValue = PlayerController.normalizeClearKeyValue;
193
+ exports.normalizeClearKeys = PlayerController.normalizeClearKeys;
194
+ exports.DrmValidator = DrmValidator;
@@ -0,0 +1,194 @@
1
+ import { A, a, b, c, d, e, f, g, h, i, j, D, H, I, K, P, S, k, l, m, n, o, T, p, V, q, r, s, t, u, v, w, x, y, z, B, C } from "../PlayerController-CW0pxrIt.js";
2
+ class DrmValidator {
3
+ /**
4
+ * Performs an automated validation of the player's DRM state.
5
+ */
6
+ static async validate(controller) {
7
+ const report = {
8
+ emeSupported: typeof navigator !== "undefined" && typeof navigator.requestMediaKeySystemAccess === "function",
9
+ keySystems: {},
10
+ activeSystem: null,
11
+ hasMediaKeys: false,
12
+ activeSessionsCount: 0,
13
+ sessionIds: [],
14
+ keyStatuses: [],
15
+ hasUsableKey: false,
16
+ errors: [],
17
+ passed: false,
18
+ requestMediaKeySystemAccessChecked: false,
19
+ mediaKeysCreatedChecked: false,
20
+ mediaKeysAttachedChecked: false,
21
+ encryptedEventCount: 0,
22
+ licenseChallengeGeneratedCount: 0,
23
+ licenseRequestSentCount: 0,
24
+ licenseResponseReceivedCount: 0,
25
+ sessionUpdatedCount: 0,
26
+ keyStatusesChangeCount: 0,
27
+ usableKeysCount: 0,
28
+ expiredKeysCount: 0,
29
+ outputRestrictedCount: 0,
30
+ internalErrorsCount: 0,
31
+ closedSessionsCount: 0,
32
+ lastInternalError: null
33
+ };
34
+ if (!report.emeSupported) {
35
+ report.errors.push("EME is not supported on this platform/browser.");
36
+ return report;
37
+ }
38
+ const systems = {
39
+ widevine: "com.widevine.alpha",
40
+ playready: "com.microsoft.playready",
41
+ fairplay: "com.apple.fps",
42
+ clearkey: "org.w3.clearkey"
43
+ };
44
+ const videoCapabilities = [
45
+ { contentType: 'video/mp4; codecs="avc1.640028"' },
46
+ { contentType: 'video/mp4; codecs="avc1.4d401e"' },
47
+ { contentType: "video/mp4" },
48
+ { contentType: 'video/webm; codecs="vp9"' }
49
+ ];
50
+ const audioCapabilities = [
51
+ { contentType: 'audio/mp4; codecs="mp4a.40.2"' },
52
+ { contentType: "audio/mp4" },
53
+ { contentType: 'audio/webm; codecs="opus"' }
54
+ ];
55
+ for (const [name, sys] of Object.entries(systems)) {
56
+ try {
57
+ const config = [
58
+ // 1. Preferred full capabilities
59
+ {
60
+ initDataTypes: ["cenc", "keyids", "webm", "skd", "sinf"],
61
+ videoCapabilities,
62
+ audioCapabilities
63
+ },
64
+ // 2. Video fallback
65
+ {
66
+ initDataTypes: ["cenc", "keyids", "webm", "skd", "sinf"],
67
+ videoCapabilities
68
+ },
69
+ // 3. Audio fallback
70
+ {
71
+ initDataTypes: ["cenc", "keyids", "webm", "skd", "sinf"],
72
+ audioCapabilities
73
+ },
74
+ // 4. State/Identifier disabled fallback
75
+ {
76
+ initDataTypes: ["cenc", "keyids", "webm", "skd", "sinf"],
77
+ videoCapabilities,
78
+ persistentState: "not-allowed",
79
+ distinctiveIdentifier: "not-allowed"
80
+ }
81
+ ];
82
+ await navigator.requestMediaKeySystemAccess(sys, config);
83
+ report.keySystems[name] = true;
84
+ } catch (_) {
85
+ report.keySystems[name] = false;
86
+ }
87
+ }
88
+ const video = controller.getVideoElement();
89
+ if (video) {
90
+ if (video.mediaKeys) {
91
+ report.hasMediaKeys = true;
92
+ const drmManager = controller.getDrmManager();
93
+ if (drmManager) {
94
+ const drmConfig = drmManager.getConfig();
95
+ if (drmConfig) {
96
+ report.activeSystem = Object.keys(drmConfig).find(
97
+ (k2) => k2 !== "robustness" && k2 !== "distinctiveIdentifier" && k2 !== "persistentState" && k2 !== "retryCount" && k2 !== "timeout"
98
+ ) || null;
99
+ }
100
+ const sessions = drmManager.getActiveSessions();
101
+ if (sessions) {
102
+ report.activeSessionsCount = sessions.size;
103
+ sessions.forEach((s2) => {
104
+ if (s2.sessionId) {
105
+ report.sessionIds.push(s2.sessionId);
106
+ }
107
+ if (s2.keyStatuses) {
108
+ s2.keyStatuses.forEach((status) => {
109
+ report.keyStatuses.push(String(status));
110
+ if (status === "usable") {
111
+ report.hasUsableKey = true;
112
+ }
113
+ });
114
+ }
115
+ });
116
+ }
117
+ const diag = drmManager.emeDiagnostics;
118
+ if (diag) {
119
+ report.requestMediaKeySystemAccessChecked = diag.requestMediaKeySystemAccess;
120
+ report.mediaKeysCreatedChecked = diag.mediaKeysCreated;
121
+ report.mediaKeysAttachedChecked = diag.mediaKeysAttached;
122
+ report.encryptedEventCount = diag.encryptedEventsCount;
123
+ report.licenseChallengeGeneratedCount = diag.challengesGenerated;
124
+ report.licenseRequestSentCount = diag.licenseRequestsSent;
125
+ report.licenseResponseReceivedCount = diag.licenseResponsesReceived;
126
+ report.sessionUpdatedCount = diag.sessionsUpdated;
127
+ report.keyStatusesChangeCount = diag.keyStatusesChanges;
128
+ report.usableKeysCount = diag.usableKeysCount;
129
+ report.expiredKeysCount = diag.expiredKeysCount;
130
+ report.outputRestrictedCount = diag.outputRestrictedCount;
131
+ report.internalErrorsCount = diag.internalErrorsCount;
132
+ report.closedSessionsCount = diag.closedSessionsCount;
133
+ report.lastInternalError = diag.lastInternalError;
134
+ if (diag.expiredKeysCount > 0) {
135
+ report.errors.push(`EME has ${diag.expiredKeysCount} expired key(s).`);
136
+ }
137
+ if (diag.outputRestrictedCount > 0) {
138
+ report.errors.push(`EME playback restricted by HDCP output constraints.`);
139
+ }
140
+ if (diag.internalErrorsCount > 0 && diag.lastInternalError) {
141
+ report.errors.push(`EME Internal Error: ${diag.lastInternalError}`);
142
+ }
143
+ }
144
+ }
145
+ }
146
+ }
147
+ const state = controller.getState();
148
+ if (state && state.error) {
149
+ report.errors.push(state.error);
150
+ }
151
+ report.passed = report.emeSupported && report.errors.length === 0;
152
+ return report;
153
+ }
154
+ }
155
+ export {
156
+ A as AdBreakManager,
157
+ a as AdBreakType,
158
+ b as AdErrorType,
159
+ c as AdPlacementType,
160
+ d as AdProviderType,
161
+ e as AdSkipMode,
162
+ f as AdState,
163
+ g as AdsController,
164
+ h as AdsManager,
165
+ i as AdsValidator,
166
+ j as AutoThumbnailProvider,
167
+ D as DrmManager,
168
+ DrmValidator,
169
+ H as HtmlOverlayRenderer,
170
+ I as ImaProvider,
171
+ K as KeyboardManager,
172
+ P as PlayerController,
173
+ S as SimidBridge,
174
+ k as SimidErrorCode,
175
+ l as SimidManager,
176
+ m as SimidRuntime,
177
+ n as SimidSession,
178
+ o as SpriteThumbnailProvider,
179
+ T as TimelineMath,
180
+ p as TrackingEventName,
181
+ V as VTTThumbnailProvider,
182
+ q as VastProvider,
183
+ r as VideoFrameThumbnailProvider,
184
+ s as VmapProvider,
185
+ t as detectSupportedKeySystems,
186
+ u as formatTime,
187
+ v as isClearKeySupported,
188
+ w as isFairPlaySupported,
189
+ x as isKeySystemSupported,
190
+ y as isPlayReadySupported,
191
+ z as isWidevineSupported,
192
+ B as normalizeClearKeyValue,
193
+ C as normalizeClearKeys
194
+ };
@@ -0,0 +1,56 @@
1
+ import { PlayerController } from './PlayerController';
2
+ import { AdProvider, Advertisement, HtmlOverlayConfig } from './types';
3
+
4
+ export interface ScheduledAdRequest {
5
+ /** Required for provider 'VAST' | 'IMA'. Ignored for 'HTML_OVERLAY'. */
6
+ tagUrl?: string;
7
+ type: 'preroll' | 'midroll' | 'postroll';
8
+ /** Seconds (number), or a percentage of content duration, e.g. '50%'. Only used for 'midroll'. */
9
+ timeOffset?: number | string;
10
+ /** Which registered provider to trigger. Defaults to 'VAST'. */
11
+ provider?: 'VAST' | 'IMA' | 'HTML_OVERLAY';
12
+ /** Required for provider 'HTML_OVERLAY' - the overlay creative to show when this break hits. */
13
+ overlay?: Advertisement | HtmlOverlayConfig;
14
+ }
15
+ /**
16
+ * Resolves a midroll timeOffset to absolute seconds. Numbers pass through
17
+ * unchanged. Percentage strings (e.g. '50%') resolve against duration once
18
+ * it's known; returns null if not yet resolvable (duration unknown) or the
19
+ * format is invalid - callers should treat null as "try again later".
20
+ */
21
+ export declare function resolveScheduledTimeOffset(timeOffset: number | string | undefined, duration: number): number | null;
22
+ export declare function evaluateScheduledHits(breaks: Array<{
23
+ id: string;
24
+ type: 'preroll' | 'midroll' | 'postroll';
25
+ timeOffset?: number;
26
+ isPlayed: boolean;
27
+ }>, currentTime: number, duration: number, isEnded: boolean): string[];
28
+ /**
29
+ * NOTE: AdScheduler and VmapProvider both independently watch the video
30
+ * element's timeupdate/ended events with no shared coordination or
31
+ * frequency-cap state between them. Using player.ads.schedule() alongside
32
+ * a VMAP playlist on the same player instance is unsupported - pick one
33
+ * scheduling mechanism per player instance.
34
+ */
35
+ export declare class AdScheduler {
36
+ private controller;
37
+ private getProviderByName;
38
+ private showOverlay;
39
+ private breaks;
40
+ private timeUpdateListener;
41
+ private endedListener;
42
+ private nextId;
43
+ constructor(controller: PlayerController, getProviderByName: (name: 'VAST' | 'IMA') => AdProvider | undefined, showOverlay: (config: Advertisement | HtmlOverlayConfig) => Promise<boolean>);
44
+ schedule(request: ScheduledAdRequest): string;
45
+ /** True if there are unplayed manually-scheduled breaks - used to detect
46
+ * the unsupported combination with an active VmapProvider playlist (see
47
+ * class-level note above). */
48
+ hasActiveBreaks(): boolean;
49
+ unschedule(id: string): void;
50
+ clear(): void;
51
+ destroy(): void;
52
+ private attach;
53
+ private evaluate;
54
+ private trigger;
55
+ }
56
+ //# sourceMappingURL=AdScheduler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdScheduler.d.ts","sourceRoot":"","sources":["../../../core/src/AdScheduler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAe,aAAa,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAEpF,MAAM,WAAW,kBAAkB;IACjC,wEAAwE;IACxE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,SAAS,GAAG,SAAS,GAAG,UAAU,CAAC;IACzC,kGAAkG;IAClG,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC7B,gEAAgE;IAChE,QAAQ,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,cAAc,CAAC;IAC3C,gGAAgG;IAChG,OAAO,CAAC,EAAE,aAAa,GAAG,iBAAiB,CAAC;CAC7C;AAQD;;;;;GAKG;AACH,wBAAgB,0BAA0B,CACxC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,EACvC,QAAQ,EAAE,MAAM,GACf,MAAM,GAAG,IAAI,CAYf;AAED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,SAAS,GAAG,SAAS,GAAG,UAAU,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAAC,EAC/G,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,OAAO,GACf,MAAM,EAAE,CAgBV;AAED;;;;;;GAMG;AACH,qBAAa,WAAW;IAOpB,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,iBAAiB;IACzB,OAAO,CAAC,WAAW;IARrB,OAAO,CAAC,MAAM,CAAwB;IACtC,OAAO,CAAC,kBAAkB,CAA6B;IACvD,OAAO,CAAC,aAAa,CAA6B;IAClD,OAAO,CAAC,MAAM,CAAK;gBAGT,UAAU,EAAE,gBAAgB,EAC5B,iBAAiB,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,KAAK,UAAU,GAAG,SAAS,EACnE,WAAW,EAAE,CAAC,MAAM,EAAE,aAAa,GAAG,iBAAiB,KAAK,OAAO,CAAC,OAAO,CAAC;IAK/E,QAAQ,CAAC,OAAO,EAAE,kBAAkB,GAAG,MAAM;IAMpD;;kCAE8B;IACvB,eAAe,IAAI,OAAO;IAI1B,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAI5B,KAAK,IAAI,IAAI;IAIb,OAAO,IAAI,IAAI;IAOtB,OAAO,CAAC,MAAM;IAUd,OAAO,CAAC,QAAQ;YAgCF,OAAO;CA0BtB"}
@@ -0,0 +1,48 @@
1
+ import { PlayerController } from './PlayerController';
2
+ import { AdsManager } from './AdsManager';
3
+ import { ScheduledAdRequest } from './AdScheduler';
4
+ import { PlayerState, Advertisement, HtmlOverlayConfig, AdBreak, AdProvider, CapabilityInfo, AdsDiagnostics, AdsValidationReport } from './types';
5
+ import { HtmlOverlayDiagnostics } from './html-overlay/HtmlOverlayRenderer';
6
+
7
+ export declare class AdsController {
8
+ private controller;
9
+ readonly manager: AdsManager;
10
+ private providers;
11
+ private activeProviderName;
12
+ private adContainerElement;
13
+ constructor(controller: PlayerController);
14
+ setAdContainer(container: HTMLElement): void;
15
+ getAdContainer(): HTMLElement | null;
16
+ state(): Partial<PlayerState>;
17
+ provider(): string | null;
18
+ capabilities(): CapabilityInfo | null;
19
+ currentAd(): Advertisement | null;
20
+ currentBreak(): AdBreak | null;
21
+ skip(): void;
22
+ pause(): void;
23
+ resume(): void;
24
+ enable(): void;
25
+ disable(): void;
26
+ private scheduler;
27
+ private getScheduler;
28
+ schedule(request: ScheduledAdRequest): string;
29
+ /** True if there's an active manual schedule (via schedule()) with unplayed
30
+ * breaks - used by VmapProvider to detect the unsupported combination. */
31
+ hasActiveManualSchedule(): boolean;
32
+ unschedule(id: string): void;
33
+ clearSchedule(): void;
34
+ play(tagUrl: string): Promise<void>;
35
+ registerProvider(name: string, provider: AdProvider, adContainer?: HTMLElement): void;
36
+ initializeProvider(name: string, adContainer?: HTMLElement): boolean;
37
+ getProvider(name: string): AdProvider | undefined;
38
+ unregisterProvider(name: string): void;
39
+ destroy(): void;
40
+ showOverlay(adOrConfig: Advertisement | HtmlOverlayConfig): Promise<boolean>;
41
+ hideOverlay(): void;
42
+ closeOverlay(): void;
43
+ updateOverlay(patch: Partial<HtmlOverlayConfig>): void;
44
+ getOverlayDiagnostics(): HtmlOverlayDiagnostics | null;
45
+ diagnostics(): AdsDiagnostics;
46
+ validate(): AdsValidationReport;
47
+ }
48
+ //# sourceMappingURL=AdsController.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdsController.d.ts","sourceRoot":"","sources":["../../../core/src/AdsController.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAe,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAIhE,OAAO,EACL,WAAW,EACX,aAAa,EACb,iBAAiB,EACjB,OAAO,EACP,UAAU,EACV,cAAc,EACd,cAAc,EACd,mBAAmB,EAIpB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAC;AAE5E,qBAAa,aAAa;IACxB,OAAO,CAAC,UAAU,CAAmB;IACrC,SAAgB,OAAO,EAAE,UAAU,CAAC;IACpC,OAAO,CAAC,SAAS,CAAsC;IACvD,OAAO,CAAC,kBAAkB,CAAuB;IACjD,OAAO,CAAC,kBAAkB,CAA4B;gBAE1C,UAAU,EAAE,gBAAgB;IAWjC,cAAc,CAAC,SAAS,EAAE,WAAW,GAAG,IAAI;IAU5C,cAAc,IAAI,WAAW,GAAG,IAAI;IAIpC,KAAK,IAAI,OAAO,CAAC,WAAW,CAAC;IAkB7B,QAAQ,IAAI,MAAM,GAAG,IAAI;IAIzB,YAAY,IAAI,cAAc,GAAG,IAAI;IAQrC,SAAS,IAAI,aAAa,GAAG,IAAI;IAIjC,YAAY,IAAI,OAAO,GAAG,IAAI;IAI9B,IAAI,IAAI,IAAI;IAIZ,KAAK,IAAI,IAAI;IAIb,MAAM,IAAI,IAAI;IAId,MAAM,IAAI,IAAI;IAId,OAAO,IAAI,IAAI;IAItB,OAAO,CAAC,SAAS,CAA4B;IAE7C,OAAO,CAAC,YAAY;IAWb,QAAQ,CAAC,OAAO,EAAE,kBAAkB,GAAG,MAAM;IAgBpD;8EAC0E;IACnE,uBAAuB,IAAI,OAAO;IAIlC,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAI5B,aAAa,IAAI,IAAI;IAIf,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASzC,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,CAAC,EAAE,WAAW,GAAG,IAAI;IAYrF,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,WAAW,GAAG,OAAO;IAgBpE,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAuBjD,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAiBtC,OAAO,IAAI,IAAI;IAKT,WAAW,CAAC,UAAU,EAAE,aAAa,GAAG,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC;IAIlF,WAAW,IAAI,IAAI;IAInB,YAAY,IAAI,IAAI;IAIpB,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,iBAAiB,CAAC,GAAG,IAAI;IAItD,qBAAqB,IAAI,sBAAsB,GAAG,IAAI;IAKtD,WAAW,IAAI,cAAc;IAmB7B,QAAQ,IAAI,mBAAmB;CAGvC"}
@@ -0,0 +1,181 @@
1
+ import { PlayerController } from './PlayerController';
2
+ import { HtmlOverlayRenderer } from './html-overlay/HtmlOverlayRenderer';
3
+ import { PlaybackInterceptor, PlayerPlugin, AdBreak, Advertisement, HtmlOverlayConfig, AdState, AdProvider, CapabilityInfo, ProviderContext, AdError, CompanionSlot, PlayerSource } from './types';
4
+
5
+ export declare function matchCompanionsToSlots(companions: Advertisement[], slots: CompanionSlot[]): Array<{
6
+ slot: CompanionSlot;
7
+ companion: Advertisement;
8
+ }>;
9
+ export declare class ProviderManager {
10
+ private providers;
11
+ private activeProviderName;
12
+ registerProvider(name: string, provider: AdProvider): void;
13
+ getProvider(name: string): AdProvider | undefined;
14
+ unregisterProvider(name: string): void;
15
+ selectProvider(name: string | null): void;
16
+ getActiveProvider(): AdProvider | undefined;
17
+ getActiveProviderName(): string | null;
18
+ getCapabilities(name: string): CapabilityInfo | null;
19
+ onSourceLoaded(source?: PlayerSource): void;
20
+ destroy(): void;
21
+ }
22
+ export interface SnapshotState {
23
+ readonly currentTime: number;
24
+ readonly paused: boolean;
25
+ readonly playbackRate: number;
26
+ readonly muted: boolean;
27
+ readonly volume: number;
28
+ readonly activeAudioTrack: number;
29
+ readonly activeSubtitleTrackId: string | null;
30
+ readonly activeQuality: number;
31
+ readonly isFullscreen: boolean;
32
+ readonly pictureInPicture: boolean;
33
+ readonly isAtLiveEdge: boolean;
34
+ readonly liveLatency: number | null;
35
+ }
36
+ export declare class ContentSnapshot {
37
+ private snapshot;
38
+ capture(controller: PlayerController): void;
39
+ restore(controller: PlayerController): void;
40
+ clear(): void;
41
+ exists(): boolean;
42
+ }
43
+ export declare class AdBreakManager {
44
+ private activeBreak;
45
+ private pendingBreaks;
46
+ private completedBreaks;
47
+ private cancelledBreaks;
48
+ registerBreak(adBreak: AdBreak): void;
49
+ activateBreak(adBreak: AdBreak): void;
50
+ completeBreak(): void;
51
+ cancelBreak(id: string): void;
52
+ clearBreaks(): void;
53
+ getActiveBreak(): AdBreak | null;
54
+ getPendingBreaks(): AdBreak[];
55
+ getCompletedBreaks(): AdBreak[];
56
+ getCancelledBreaks(): AdBreak[];
57
+ }
58
+ export declare class AsyncGuard {
59
+ private activeToken;
60
+ generateToken(): number;
61
+ isValid(token: number): boolean;
62
+ invalidateAll(): void;
63
+ }
64
+ export declare class TimeoutManager {
65
+ private timers;
66
+ set(id: string, callback: () => void, delayMs: number): void;
67
+ clear(id: string): void;
68
+ clearAll(): void;
69
+ }
70
+ export interface ExtendedDiagnosticsStats {
71
+ totalAdsRequested: number;
72
+ totalAdsPlayed: number;
73
+ totalAdsCompleted: number;
74
+ totalAdsSkipped: number;
75
+ totalAdErrors: number;
76
+ recoveryCount: number;
77
+ timeoutCount: number;
78
+ cancelledAdsCount: number;
79
+ providerFailures: number;
80
+ averageLoadTimeMs: number;
81
+ averageResumeTimeMs: number;
82
+ activeOperationsCount: number;
83
+ }
84
+ export declare class AdsManager implements PlayerPlugin, PlaybackInterceptor {
85
+ readonly name = "ads-manager";
86
+ private controller;
87
+ private state;
88
+ private providerManager;
89
+ private contentSnapshot;
90
+ private adBreakManager;
91
+ private asyncGuard;
92
+ private timeoutManager;
93
+ private htmlOverlayRenderer;
94
+ private companionRenderers;
95
+ private concurrentOverlayRenderers;
96
+ private adContainer;
97
+ private isInterceptionActive;
98
+ private currentAd;
99
+ private requestedCount;
100
+ private playedCount;
101
+ private completedCount;
102
+ private skippedCount;
103
+ private errorCount;
104
+ private recoveryCount;
105
+ private timeoutCount;
106
+ private cancelledCount;
107
+ private providerFailuresCount;
108
+ private activeOperations;
109
+ install(controller: PlayerController): void;
110
+ destroy(): void;
111
+ getProviderManager(): ProviderManager;
112
+ getAdBreakManager(): AdBreakManager;
113
+ getAdState(): AdState;
114
+ getSavedContentSnapshot(): ContentSnapshot;
115
+ transitionTo(newState: AdState): boolean;
116
+ private updateDiagnosticsMetrics;
117
+ private dispatchStateEvents;
118
+ startAdBreak(adBreak: AdBreak, options?: {
119
+ skipVideoOwnership?: boolean;
120
+ }): void;
121
+ skipAd(): void;
122
+ endAdBreak(): void;
123
+ recover(reason: string): void;
124
+ triggerAdError(error: AdError): void;
125
+ scheduleTimeout(id: string, delayMs: number, reason: string): void;
126
+ cancelTimeout(id: string): void;
127
+ setAdContainer(container: HTMLElement): void;
128
+ getAdContainer(): HTMLElement | null;
129
+ createProviderContext(adContainer?: HTMLElement): ProviderContext;
130
+ setCurrentAd(ad: Advertisement | null): void;
131
+ private updatePlayerState;
132
+ play(): Promise<boolean> | boolean;
133
+ pause(): boolean;
134
+ seek(time: number): boolean;
135
+ setVolume(vol: number): boolean;
136
+ setMuted(muted: boolean): boolean;
137
+ private triggerLifecycleHook;
138
+ liveEdgeSyncHook(): void;
139
+ dvrPositionHook(): void;
140
+ catchUpPlaybackHook(): void;
141
+ liveSourceSwitchHook(): void;
142
+ playlistItemStartHook(): void;
143
+ playlistItemEndHook(): void;
144
+ autoplayNextItemHook(): void;
145
+ playlistRepeatHook(): void;
146
+ playlistNavigationHook(): void;
147
+ getHtmlOverlayRenderer(): HtmlOverlayRenderer | null;
148
+ private applyDefaultSanitizer;
149
+ isHtmlOverlayCreative(ad: Advertisement): boolean;
150
+ showCompanions(companions: Advertisement[]): void;
151
+ private clearCompanions;
152
+ /**
153
+ * Renders NonLinear overlay ads declared inside the SAME VAST <Ad> as the
154
+ * Linear creative currently playing - i.e. an overlay banner shown ON TOP
155
+ * of the ad video while it plays, per the standard IAB VAST pattern. Unlike
156
+ * `playHtmlOverlay()`, this does NOT touch `currentAd` or the AdState
157
+ * machine - it's a passive, fire-and-forget render alongside the Linear ad,
158
+ * exactly like `showCompanions()` except targeting the player container
159
+ * instead of an external page slot.
160
+ */
161
+ showConcurrentOverlays(nonLinearAds: Advertisement[]): void;
162
+ /**
163
+ * Clears both companion ads and concurrent NonLinear overlays. Providers
164
+ * call this before playing the next ad in a pod, so a previous ad's
165
+ * companion/overlay isn't left stuck on screen if the next ad has none of
166
+ * its own (showCompanions/showConcurrentOverlays only run when there IS
167
+ * something new to show, so a previous render would otherwise never clear).
168
+ */
169
+ clearAuxiliaryOverlays(): void;
170
+ private clearConcurrentOverlays;
171
+ private fireOverlayErrorPixels;
172
+ showOverlay(adOrConfig: Advertisement | HtmlOverlayConfig): Promise<boolean>;
173
+ hideOverlay(): void;
174
+ closeOverlay(): void;
175
+ updateOverlay(patch: Partial<HtmlOverlayConfig>): void;
176
+ playHtmlOverlay(ad: Advertisement): Promise<void>;
177
+ onSourceLoaded(source?: PlayerSource): void;
178
+ handleSourceSwitch(): void;
179
+ getDiagnosticsStats(): ExtendedDiagnosticsStats;
180
+ }
181
+ //# sourceMappingURL=AdsManager.d.ts.map