stormcloud-video-player 0.8.70 → 0.8.71
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/dist/stormcloud-vp.min.js +1 -1
- package/lib/StormcloudPlayer.cjs +33 -2
- package/lib/StormcloudPlayer.cjs.map +1 -1
- package/lib/index.cjs +47 -9
- package/lib/index.cjs.map +1 -1
- package/lib/index.d.ts +6 -1
- package/lib/index.js +47 -9
- package/lib/index.js.map +1 -1
- package/lib/player/EdgePodRequest.cjs +14 -2
- package/lib/player/EdgePodRequest.cjs.map +1 -1
- package/lib/player/EdgePodRequest.d.cts +1 -1
- package/lib/player/StormcloudVideoPlayer.cjs +33 -2
- package/lib/player/StormcloudVideoPlayer.cjs.map +1 -1
- package/lib/player/StormcloudVideoPlayer.d.cts +6 -1
- package/lib/players/HlsPlayer.cjs +33 -2
- package/lib/players/HlsPlayer.cjs.map +1 -1
- package/lib/players/index.cjs +33 -2
- package/lib/players/index.cjs.map +1 -1
- package/lib/ui/StormcloudVideoPlayer.cjs +47 -9
- package/lib/ui/StormcloudVideoPlayer.cjs.map +1 -1
- package/package.json +1 -1
|
@@ -74,19 +74,31 @@ __export(EdgePodRequest_exports, {
|
|
|
74
74
|
module.exports = __toCommonJS(EdgePodRequest_exports);
|
|
75
75
|
var EDGE_POD_MAX_ADS = 10;
|
|
76
76
|
var EDGE_POD_EXCEEDS_BUDGET = "edge_pod_exceeds_budget";
|
|
77
|
+
var LICENSE_KEY_PLACEHOLDER = /\{licenseKey\}|%7BlicenseKey%7D/gi;
|
|
77
78
|
function resolveEdgePodBaseUrl(config) {
|
|
78
|
-
var _config_edgePodUrl;
|
|
79
|
+
var _config_edgePodUrl, _config_licenseKey;
|
|
79
80
|
if (config.enableEdgePodRequest !== true) return void 0;
|
|
80
81
|
var raw = (_config_edgePodUrl = config.edgePodUrl) === null || _config_edgePodUrl === void 0 ? void 0 : _config_edgePodUrl.trim();
|
|
81
82
|
if (!raw) {
|
|
82
83
|
console.warn("[AdBreak][EDGE] enableEdgePodRequest is true but edgePodUrl is missing; using GAM only");
|
|
83
84
|
return void 0;
|
|
84
85
|
}
|
|
86
|
+
var licenseKey = (_config_licenseKey = config.licenseKey) === null || _config_licenseKey === void 0 ? void 0 : _config_licenseKey.trim();
|
|
87
|
+
if (!licenseKey) {
|
|
88
|
+
console.warn("[AdBreak][EDGE] enableEdgePodRequest is true but licenseKey is missing; using GAM only");
|
|
89
|
+
return void 0;
|
|
90
|
+
}
|
|
91
|
+
var encodedKey = encodeURIComponent(licenseKey);
|
|
85
92
|
try {
|
|
86
|
-
var
|
|
93
|
+
var hasPlaceholder = raw.search(LICENSE_KEY_PLACEHOLDER) !== -1;
|
|
94
|
+
var url = new URL(hasPlaceholder ? raw.replace(LICENSE_KEY_PLACEHOLDER, encodedKey) : raw);
|
|
87
95
|
if (url.protocol !== "https:" && url.protocol !== "http:") {
|
|
88
96
|
throw new Error("unsupported protocol ".concat(url.protocol));
|
|
89
97
|
}
|
|
98
|
+
if (!hasPlaceholder) {
|
|
99
|
+
var path = url.pathname.replace(/\/+$/, "");
|
|
100
|
+
url.pathname = /\/[^/]+\/pod$/.test(path) ? path.replace(/\/[^/]+\/pod$/, "/".concat(encodedKey, "/pod")) : "".concat(path, "/").concat(encodedKey, "/pod");
|
|
101
|
+
}
|
|
90
102
|
return url.toString();
|
|
91
103
|
} catch (unused) {
|
|
92
104
|
console.warn("[AdBreak][EDGE] edgePodUrl is not a valid http(s) URL; using GAM only");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["d:\\project\\stormcloud-vp\\lib\\player\\EdgePodRequest.cjs"],"names":["__defProp","Object","defineProperty","__getOwnPropDesc","getOwnPropertyDescriptor","__getOwnPropNames","getOwnPropertyNames","__hasOwnProp","prototype","hasOwnProperty","__export","target","all","name","get","enumerable","__copyProps","to","from","except","desc","key","call","__toCommonJS","mod","value","EdgePodRequest_exports","EDGE_POD_EXCEEDS_BUDGET","EDGE_POD_MAX_ADS","buildEdgePodUrl","classifyEdgeVastResponse","describeEdgeUrl","resolveEdgePodBaseUrl","module","exports","config","enableEdgePodRequest","raw","edgePodUrl","trim","console","warn","url","URL","protocol","Error","toString","baseUrl","remainingMs","remainingAdLimit","maxMs","Math","max","floor","maxAds","min","searchParams","set","String","result","error","podAdCount","message","
|
|
1
|
+
{"version":3,"sources":["d:\\project\\stormcloud-vp\\lib\\player\\EdgePodRequest.cjs"],"names":["__defProp","Object","defineProperty","__getOwnPropDesc","getOwnPropertyDescriptor","__getOwnPropNames","getOwnPropertyNames","__hasOwnProp","prototype","hasOwnProperty","__export","target","all","name","get","enumerable","__copyProps","to","from","except","desc","key","call","__toCommonJS","mod","value","EdgePodRequest_exports","EDGE_POD_EXCEEDS_BUDGET","EDGE_POD_MAX_ADS","buildEdgePodUrl","classifyEdgeVastResponse","describeEdgeUrl","resolveEdgePodBaseUrl","module","exports","LICENSE_KEY_PLACEHOLDER","config","enableEdgePodRequest","raw","edgePodUrl","trim","console","warn","licenseKey","encodedKey","encodeURIComponent","hasPlaceholder","search","url","URL","replace","protocol","Error","path","pathname","test","toString","baseUrl","remainingMs","remainingAdLimit","maxMs","Math","max","floor","maxAds","min","searchParams","set","String","result","error","podAdCount","message","includes","parsed","origin","split"],"mappings":"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","sourcesContent":["\"use strict\";\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __export = (target, all) => {\n for (var name in all)\n __defProp(target, name, { get: all[name], enumerable: true });\n};\nvar __copyProps = (to, from, except, desc) => {\n if (from && typeof from === \"object\" || typeof from === \"function\") {\n for (let key of __getOwnPropNames(from))\n if (!__hasOwnProp.call(to, key) && key !== except)\n __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });\n }\n return to;\n};\nvar __toCommonJS = (mod) => __copyProps(__defProp({}, \"__esModule\", { value: true }), mod);\n\n// src/player/EdgePodRequest.ts\nvar EdgePodRequest_exports = {};\n__export(EdgePodRequest_exports, {\n EDGE_POD_EXCEEDS_BUDGET: () => EDGE_POD_EXCEEDS_BUDGET,\n EDGE_POD_MAX_ADS: () => EDGE_POD_MAX_ADS,\n buildEdgePodUrl: () => buildEdgePodUrl,\n classifyEdgeVastResponse: () => classifyEdgeVastResponse,\n describeEdgeUrl: () => describeEdgeUrl,\n resolveEdgePodBaseUrl: () => resolveEdgePodBaseUrl\n});\nmodule.exports = __toCommonJS(EdgePodRequest_exports);\nvar EDGE_POD_MAX_ADS = 10;\nvar EDGE_POD_EXCEEDS_BUDGET = \"edge_pod_exceeds_budget\";\nvar LICENSE_KEY_PLACEHOLDER = /\\{licenseKey\\}|%7BlicenseKey%7D/gi;\nfunction resolveEdgePodBaseUrl(config) {\n if (config.enableEdgePodRequest !== true) return void 0;\n const raw = config.edgePodUrl?.trim();\n if (!raw) {\n console.warn(\n \"[AdBreak][EDGE] enableEdgePodRequest is true but edgePodUrl is missing; using GAM only\"\n );\n return void 0;\n }\n const licenseKey = config.licenseKey?.trim();\n if (!licenseKey) {\n console.warn(\n \"[AdBreak][EDGE] enableEdgePodRequest is true but licenseKey is missing; using GAM only\"\n );\n return void 0;\n }\n const encodedKey = encodeURIComponent(licenseKey);\n try {\n const hasPlaceholder = raw.search(LICENSE_KEY_PLACEHOLDER) !== -1;\n const url = new URL(hasPlaceholder ? raw.replace(LICENSE_KEY_PLACEHOLDER, encodedKey) : raw);\n if (url.protocol !== \"https:\" && url.protocol !== \"http:\") {\n throw new Error(`unsupported protocol ${url.protocol}`);\n }\n if (!hasPlaceholder) {\n const path = url.pathname.replace(/\\/+$/, \"\");\n url.pathname = /\\/[^/]+\\/pod$/.test(path) ? path.replace(/\\/[^/]+\\/pod$/, `/${encodedKey}/pod`) : `${path}/${encodedKey}/pod`;\n }\n return url.toString();\n } catch {\n console.warn(\"[AdBreak][EDGE] edgePodUrl is not a valid http(s) URL; using GAM only\");\n return void 0;\n }\n}\nfunction buildEdgePodUrl(baseUrl, remainingMs, remainingAdLimit) {\n const url = new URL(baseUrl);\n const maxMs = Math.max(0, Math.floor(remainingMs));\n const maxAds = Math.max(1, Math.min(EDGE_POD_MAX_ADS, Math.floor(remainingAdLimit)));\n url.searchParams.set(\"pmxd\", String(maxMs));\n url.searchParams.set(\"pmad\", String(maxAds));\n url.searchParams.set(\"duration\", String(Math.floor(maxMs / 1e3)));\n url.searchParams.set(\"count\", String(maxAds));\n return url.toString();\n}\nfunction classifyEdgeVastResponse(result) {\n if (result.error == null) {\n return result.podAdCount > 0 ? \"fill\" : \"no_fill\";\n }\n const message = result.error?.message ?? String(result.error);\n if (/no ads available|fill rejected|no media file|no ad loaded/i.test(message) || message.includes(EDGE_POD_EXCEEDS_BUDGET)) {\n return \"no_fill\";\n }\n return \"invalid\";\n}\nfunction describeEdgeUrl(url) {\n try {\n const parsed = new URL(url);\n return `${parsed.origin}${parsed.pathname}`;\n } catch {\n return url.split(\"?\")[0] ?? \"\";\n }\n}\n// Annotate the CommonJS export names for ESM import in node:\n0 && (module.exports = {\n EDGE_POD_EXCEEDS_BUDGET,\n EDGE_POD_MAX_ADS,\n buildEdgePodUrl,\n classifyEdgeVastResponse,\n describeEdgeUrl,\n resolveEdgePodBaseUrl\n});\n"]}
|
|
@@ -3,7 +3,7 @@ import { StormcloudVideoPlayerConfig } from '../types.cjs';
|
|
|
3
3
|
declare const EDGE_POD_MAX_ADS = 10;
|
|
4
4
|
type EdgePodClassification = "fill" | "no_fill" | "invalid";
|
|
5
5
|
declare const EDGE_POD_EXCEEDS_BUDGET = "edge_pod_exceeds_budget";
|
|
6
|
-
declare function resolveEdgePodBaseUrl(config: Pick<StormcloudVideoPlayerConfig, "enableEdgePodRequest" | "edgePodUrl">): string | undefined;
|
|
6
|
+
declare function resolveEdgePodBaseUrl(config: Pick<StormcloudVideoPlayerConfig, "enableEdgePodRequest" | "edgePodUrl" | "licenseKey">): string | undefined;
|
|
7
7
|
declare function buildEdgePodUrl(baseUrl: string, remainingMs: number, remainingAdLimit: number): string;
|
|
8
8
|
declare function classifyEdgeVastResponse(result: {
|
|
9
9
|
podAdCount: number;
|
|
@@ -9210,19 +9210,31 @@ var HlsEngine = /*#__PURE__*/ function() {
|
|
|
9210
9210
|
// src/player/EdgePodRequest.ts
|
|
9211
9211
|
var EDGE_POD_MAX_ADS = 10;
|
|
9212
9212
|
var EDGE_POD_EXCEEDS_BUDGET = "edge_pod_exceeds_budget";
|
|
9213
|
+
var LICENSE_KEY_PLACEHOLDER = /\{licenseKey\}|%7BlicenseKey%7D/gi;
|
|
9213
9214
|
function resolveEdgePodBaseUrl(config) {
|
|
9214
|
-
var _config_edgePodUrl;
|
|
9215
|
+
var _config_edgePodUrl, _config_licenseKey;
|
|
9215
9216
|
if (config.enableEdgePodRequest !== true) return void 0;
|
|
9216
9217
|
var raw = (_config_edgePodUrl = config.edgePodUrl) === null || _config_edgePodUrl === void 0 ? void 0 : _config_edgePodUrl.trim();
|
|
9217
9218
|
if (!raw) {
|
|
9218
9219
|
console.warn("[AdBreak][EDGE] enableEdgePodRequest is true but edgePodUrl is missing; using GAM only");
|
|
9219
9220
|
return void 0;
|
|
9220
9221
|
}
|
|
9222
|
+
var licenseKey = (_config_licenseKey = config.licenseKey) === null || _config_licenseKey === void 0 ? void 0 : _config_licenseKey.trim();
|
|
9223
|
+
if (!licenseKey) {
|
|
9224
|
+
console.warn("[AdBreak][EDGE] enableEdgePodRequest is true but licenseKey is missing; using GAM only");
|
|
9225
|
+
return void 0;
|
|
9226
|
+
}
|
|
9227
|
+
var encodedKey = encodeURIComponent(licenseKey);
|
|
9221
9228
|
try {
|
|
9222
|
-
var
|
|
9229
|
+
var hasPlaceholder = raw.search(LICENSE_KEY_PLACEHOLDER) !== -1;
|
|
9230
|
+
var url = new URL(hasPlaceholder ? raw.replace(LICENSE_KEY_PLACEHOLDER, encodedKey) : raw);
|
|
9223
9231
|
if (url.protocol !== "https:" && url.protocol !== "http:") {
|
|
9224
9232
|
throw new Error("unsupported protocol ".concat(url.protocol));
|
|
9225
9233
|
}
|
|
9234
|
+
if (!hasPlaceholder) {
|
|
9235
|
+
var path = url.pathname.replace(/\/+$/, "");
|
|
9236
|
+
url.pathname = /\/[^/]+\/pod$/.test(path) ? path.replace(/\/[^/]+\/pod$/, "/".concat(encodedKey, "/pod")) : "".concat(path, "/").concat(encodedKey, "/pod");
|
|
9237
|
+
}
|
|
9226
9238
|
return url.toString();
|
|
9227
9239
|
} catch (unused) {
|
|
9228
9240
|
console.warn("[AdBreak][EDGE] edgePodUrl is not a valid http(s) URL; using GAM only");
|
|
@@ -11700,6 +11712,25 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
|
|
|
11700
11712
|
return this.floorLadderEnabled;
|
|
11701
11713
|
}
|
|
11702
11714
|
},
|
|
11715
|
+
{
|
|
11716
|
+
key: "setEdgePodRequest",
|
|
11717
|
+
value: function setEdgePodRequest(update) {
|
|
11718
|
+
if (update.enableEdgePodRequest === this.config.enableEdgePodRequest && update.edgePodUrl === this.config.edgePodUrl) {
|
|
11719
|
+
return;
|
|
11720
|
+
}
|
|
11721
|
+
if (update.enableEdgePodRequest === void 0) delete this.config.enableEdgePodRequest;
|
|
11722
|
+
else this.config.enableEdgePodRequest = update.enableEdgePodRequest;
|
|
11723
|
+
if (update.edgePodUrl === void 0) delete this.config.edgePodUrl;
|
|
11724
|
+
else this.config.edgePodUrl = update.edgePodUrl;
|
|
11725
|
+
this.edgePodBaseUrl = resolveEdgePodBaseUrl(this.config);
|
|
11726
|
+
}
|
|
11727
|
+
},
|
|
11728
|
+
{
|
|
11729
|
+
key: "getEdgePodUrl",
|
|
11730
|
+
value: function getEdgePodUrl() {
|
|
11731
|
+
return this.edgePodBaseUrl;
|
|
11732
|
+
}
|
|
11733
|
+
},
|
|
11703
11734
|
{
|
|
11704
11735
|
key: "warnOnInvalidFloorLadder",
|
|
11705
11736
|
value: function warnOnInvalidFloorLadder(report) {
|