@trillboards/ads-sdk 2.2.1 → 2.3.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.
package/dist/react.mjs CHANGED
@@ -948,7 +948,7 @@ var WaterfallEngine = class {
948
948
  };
949
949
 
950
950
  // src/player/ProgrammaticPlayer.ts
951
- var ProgrammaticPlayer = class {
951
+ var _ProgrammaticPlayer = class _ProgrammaticPlayer {
952
952
  constructor(events, timeoutMs = 12e3) {
953
953
  // ── Public state ──────────────────────────────────────────
954
954
  this.vastTagUrl = null;
@@ -1035,8 +1035,11 @@ var ProgrammaticPlayer = class {
1035
1035
  this.telemetry.recordRequest();
1036
1036
  const correlator = Date.now();
1037
1037
  const finalUrl = vastUrl.includes("correlator=") ? vastUrl.replace(/correlator=[^&]*/, `correlator=${correlator}`) : `${vastUrl}${vastUrl.includes("?") ? "&" : "?"}correlator=${correlator}`;
1038
- if (typeof google === "undefined" || !google?.ima) {
1039
- onError("Google IMA SDK not loaded");
1038
+ const imaReady = await this.ensureImaSdk();
1039
+ if (!imaReady) {
1040
+ const msg = "Google IMA SDK not loaded";
1041
+ this.events.emit("programmatic_error", { error: msg, code: void 0 });
1042
+ onError(msg);
1040
1043
  this.telemetry.recordError();
1041
1044
  this.waterfallEngine.recordFailure(sourceName);
1042
1045
  return;
@@ -1053,6 +1056,50 @@ var ProgrammaticPlayer = class {
1053
1056
  onError(err instanceof Error ? err.message : String(err));
1054
1057
  }
1055
1058
  }
1059
+ /**
1060
+ * Ensure Google IMA SDK is available. If already loaded, resolves
1061
+ * immediately. Otherwise injects the `<script>` tag and waits.
1062
+ * Matches the Lite SDK's `loadImaScript()` pattern.
1063
+ */
1064
+ async ensureImaSdk() {
1065
+ if (typeof google !== "undefined" && google?.ima) return true;
1066
+ if (typeof document === "undefined") return false;
1067
+ const existing = document.querySelector(
1068
+ `script[src="${_ProgrammaticPlayer.IMA_SDK_URL}"]`
1069
+ );
1070
+ if (existing) {
1071
+ return new Promise((resolve) => {
1072
+ const start = Date.now();
1073
+ const check = () => {
1074
+ if (typeof google !== "undefined" && google?.ima) {
1075
+ resolve(true);
1076
+ } else if (Date.now() - start > 5e3) {
1077
+ resolve(false);
1078
+ } else {
1079
+ setTimeout(check, 100);
1080
+ }
1081
+ };
1082
+ check();
1083
+ });
1084
+ }
1085
+ if (!_ProgrammaticPlayer.imaLoadPromise) {
1086
+ _ProgrammaticPlayer.imaLoadPromise = new Promise((resolve) => {
1087
+ const script = document.createElement("script");
1088
+ script.src = _ProgrammaticPlayer.IMA_SDK_URL;
1089
+ script.async = true;
1090
+ script.onload = () => {
1091
+ _ProgrammaticPlayer.imaLoadPromise = null;
1092
+ resolve(true);
1093
+ };
1094
+ script.onerror = () => {
1095
+ _ProgrammaticPlayer.imaLoadPromise = null;
1096
+ resolve(false);
1097
+ };
1098
+ document.head.appendChild(script);
1099
+ });
1100
+ }
1101
+ return _ProgrammaticPlayer.imaLoadPromise;
1102
+ }
1056
1103
  // ── IMA request / playback lifecycle ──────────────────────
1057
1104
  async requestAdsViaIMA(vastUrl, onComplete, onError) {
1058
1105
  return new Promise((resolve) => {
@@ -1254,6 +1301,12 @@ var ProgrammaticPlayer = class {
1254
1301
  this.telemetry.reset();
1255
1302
  }
1256
1303
  };
1304
+ // ── IMA SDK loader ──────────────────────────────────────────
1305
+ /** IMA script URL */
1306
+ _ProgrammaticPlayer.IMA_SDK_URL = "https://imasdk.googleapis.com/js/sdkloader/ima3.js";
1307
+ /** Singleton load promise so concurrent calls don't insert multiple scripts. */
1308
+ _ProgrammaticPlayer.imaLoadPromise = null;
1309
+ var ProgrammaticPlayer = _ProgrammaticPlayer;
1257
1310
 
1258
1311
  // src/player/Player.ts
1259
1312
  var MAX_AD_DURATION_SECONDS = 300;