stormcloud-video-player 0.8.55 → 0.8.57

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 (69) hide show
  1. package/README.md +2 -2
  2. package/dist/stormcloud-vp.min.js +1 -3
  3. package/lib/index.cjs +377 -359
  4. package/lib/index.cjs.map +1 -1
  5. package/lib/index.d.cts +12 -30
  6. package/lib/index.d.ts +12 -30
  7. package/lib/index.js +357 -303
  8. package/lib/index.js.map +1 -1
  9. package/lib/player/AdBreakOrchestrator.cjs +140 -212
  10. package/lib/player/AdBreakOrchestrator.cjs.map +1 -1
  11. package/lib/player/AdBreakOrchestrator.d.cts +1 -1
  12. package/lib/player/AdConfigManager.cjs +103 -211
  13. package/lib/player/AdConfigManager.cjs.map +1 -1
  14. package/lib/player/AdConfigManager.d.cts +1 -2
  15. package/lib/player/AdTimingService.cjs.map +1 -1
  16. package/lib/player/AdTimingService.d.cts +1 -1
  17. package/lib/player/HlsEngine.cjs.map +1 -1
  18. package/lib/player/HlsEngine.d.cts +1 -1
  19. package/lib/player/PlaceholderLayer.cjs.map +1 -1
  20. package/lib/player/PlayerControls.cjs.map +1 -1
  21. package/lib/player/PlayerControls.d.cts +1 -1
  22. package/lib/player/Scte35CueManager.cjs.map +1 -1
  23. package/lib/player/Scte35CueManager.d.cts +1 -1
  24. package/lib/player/Scte35Parser.cjs.map +1 -1
  25. package/lib/player/Scte35Parser.d.cts +1 -1
  26. package/lib/player/StormcloudVideoPlayer.cjs +350 -281
  27. package/lib/player/StormcloudVideoPlayer.cjs.map +1 -1
  28. package/lib/player/StormcloudVideoPlayer.d.cts +1 -1
  29. package/lib/player/playerTypes.cjs.map +1 -1
  30. package/lib/player/playerTypes.d.cts +1 -1
  31. package/lib/players/FilePlayer.cjs.map +1 -1
  32. package/lib/players/HlsPlayer.cjs +350 -281
  33. package/lib/players/HlsPlayer.cjs.map +1 -1
  34. package/lib/players/HlsPlayer.d.cts +1 -1
  35. package/lib/players/index.cjs +350 -281
  36. package/lib/players/index.cjs.map +1 -1
  37. package/lib/sdk/hlsAdPlayer.cjs +194 -52
  38. package/lib/sdk/hlsAdPlayer.cjs.map +1 -1
  39. package/lib/sdk/hlsAdPlayer.d.cts +1 -1
  40. package/lib/sdk/pal.cjs.map +1 -1
  41. package/lib/{types-DpbgEvSH.d.cts → types-cTqIKw_D.d.cts} +0 -1
  42. package/lib/ui/StormcloudVideoPlayer.cjs +350 -281
  43. package/lib/ui/StormcloudVideoPlayer.cjs.map +1 -1
  44. package/lib/ui/StormcloudVideoPlayer.d.cts +1 -1
  45. package/lib/utils/browserCompat.cjs.map +1 -1
  46. package/lib/utils/ctvVastSignals.cjs.map +1 -1
  47. package/lib/utils/devUrl.cjs.map +1 -1
  48. package/lib/utils/polyfills.cjs.map +1 -1
  49. package/lib/utils/tracking.cjs +135 -212
  50. package/lib/utils/tracking.cjs.map +1 -1
  51. package/lib/utils/tracking.d.cts +1 -1
  52. package/lib/utils/trackingIngest.cjs +322 -0
  53. package/lib/utils/trackingIngest.cjs.map +1 -0
  54. package/lib/utils/trackingIngest.d.cts +14 -0
  55. package/lib/utils/vastEnvironmentSignals.cjs +0 -4
  56. package/lib/utils/vastEnvironmentSignals.cjs.map +1 -1
  57. package/lib/utils/vastEnvironmentSignals.d.cts +1 -2
  58. package/lib/utils/vastMacros.cjs.map +1 -1
  59. package/lib/utils/vastTrackingMacros.cjs +185 -0
  60. package/lib/utils/vastTrackingMacros.cjs.map +1 -0
  61. package/lib/utils/vastTrackingMacros.d.cts +19 -0
  62. package/package.json +1 -3
  63. package/lib/utils/mqttClient.cjs +0 -305
  64. package/lib/utils/mqttClient.cjs.map +0 -1
  65. package/lib/utils/mqttClient.d.cts +0 -13
  66. package/lib/utils/mqttConfig.cjs +0 -139
  67. package/lib/utils/mqttConfig.cjs.map +0 -1
  68. package/lib/utils/mqttConfig.d.cts +0 -20
  69. package/src/certs/emqxsl-ca.crt +0 -22
@@ -154,11 +154,9 @@ function _type_of(obj) {
154
154
  "@swc/helpers - typeof";
155
155
  return obj && typeof Symbol !== "undefined" && obj.constructor === Symbol ? "symbol" : typeof obj;
156
156
  }
157
- var __create = Object.create;
158
157
  var __defProp = Object.defineProperty;
159
158
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
160
159
  var __getOwnPropNames = Object.getOwnPropertyNames;
161
- var __getProtoOf = Object.getPrototypeOf;
162
160
  var __hasOwnProp = Object.prototype.hasOwnProperty;
163
161
  var __export = function __export(target, all) {
164
162
  for(var name in all)__defProp(target, name, {
@@ -197,16 +195,6 @@ var __copyProps = function __copyProps(to, from, except, desc) {
197
195
  }
198
196
  return to;
199
197
  };
200
- var __toESM = function __toESM(mod, isNodeMode, target) {
201
- return target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(// If the importer is in node compatibility mode or this is not an ESM
202
- // file that has been converted to a CommonJS file using a Babel-
203
- // compatible transform (i.e. "__esModule" has not been set), then set
204
- // "default" to the CommonJS "module.exports" for node compatibility.
205
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
206
- value: mod,
207
- enumerable: true
208
- }) : target, mod);
209
- };
210
198
  var __toCommonJS = function __toCommonJS(mod) {
211
199
  return __copyProps(__defProp({}, "__esModule", {
212
200
  value: true
@@ -241,160 +229,83 @@ __export(tracking_exports, {
241
229
  }
242
230
  });
243
231
  module.exports = __toCommonJS(tracking_exports);
244
- // src/utils/mqttConfig.ts
245
- var DEFAULT_MQTT_CONFIG = {
232
+ // src/utils/trackingIngest.ts
233
+ var DEFAULT_TRACKING_INGEST_CONFIG = {
246
234
  enabled: true,
247
- brokerAddress: "vecbae77.ala.us-east-1.emqxsl.com",
248
- brokerPort: 8883,
249
- wsPort: 8084,
250
- username: "for-sonifi",
251
- password: "sonifi-mqtt",
252
- topicPrefix: "adstorm/players",
253
- qos: 1
235
+ baseUrl: "https://player-analytics-ingest-api-760490581852.us-central1.run.app/api/adstorm/player-tracking"
254
236
  };
255
- var mqttConfig = _object_spread({}, DEFAULT_MQTT_CONFIG);
256
- function isMQTTEnabled() {
257
- return mqttConfig.enabled;
258
- }
259
- function buildMQTTBrokerUrl() {
260
- if (mqttConfig.brokerUrl) return mqttConfig.brokerUrl;
261
- return "wss://".concat(mqttConfig.brokerAddress, ":").concat(mqttConfig.wsPort, "/mqtt");
262
- }
263
- function buildPlayerTopic(licenseKey, channel) {
264
- return "".concat(mqttConfig.topicPrefix, "/").concat(licenseKey, "/").concat(channel);
237
+ var trackingIngestConfig = _object_spread({}, DEFAULT_TRACKING_INGEST_CONFIG);
238
+ function isTrackingIngestEnabled() {
239
+ return trackingIngestConfig.enabled === true;
265
240
  }
266
- // src/utils/mqttClient.ts
267
- var import_mqtt = __toESM(require("mqtt"), 1);
268
- var LOG = "[StormcloudVideoPlayer][MQTT]";
269
- var KEEPALIVE_SECONDS = 30;
270
- var CONNECT_TIMEOUT_MS = 1e4;
271
- var RECONNECT_BASE_MS = 5e3;
272
- var RECONNECT_MAX_MS = 6e4;
273
- var MAX_RECONNECT_ATTEMPTS = 8;
274
- var COOLDOWN_MS = 10 * 6e4;
275
- var client = null;
276
- var status = "disconnected";
277
- var reconnectAttempts = 0;
278
- var reconnectTimer = null;
279
- var stopped = false;
280
- function clearReconnectTimer() {
281
- if (reconnectTimer) {
282
- clearTimeout(reconnectTimer);
283
- reconnectTimer = null;
284
- }
285
- }
286
- function teardownClient() {
287
- if (client) {
288
- try {
289
- client.removeAllListeners();
290
- client.end(true);
291
- } catch (unused) {}
292
- client = null;
293
- }
241
+ function normalizeIngestBaseUrl(baseUrl) {
242
+ return baseUrl.replace(/\/+$/, "");
294
243
  }
295
- function scheduleReconnect() {
296
- if (stopped || !isMQTTEnabled() || reconnectTimer) return;
297
- if (reconnectAttempts >= MAX_RECONNECT_ATTEMPTS) {
298
- console.warn("".concat(LOG, " giving up after ").concat(reconnectAttempts, " attempts; cooling down for ").concat(COOLDOWN_MS / 6e4, "m"));
299
- teardownClient();
300
- status = "disconnected";
301
- reconnectTimer = setTimeout(function() {
302
- reconnectTimer = null;
303
- reconnectAttempts = 0;
304
- openConnection();
305
- }, COOLDOWN_MS);
306
- return;
244
+ function buildTrackingIngestUrl(channel) {
245
+ var base = normalizeIngestBaseUrl(trackingIngestConfig.baseUrl);
246
+ if (channel === "impressions") {
247
+ return "".concat(base, "/impressions/ingest");
307
248
  }
308
- var delay = Math.min(RECONNECT_MAX_MS, RECONNECT_BASE_MS * Math.pow(2, reconnectAttempts));
309
- var jitter = Math.floor(Math.random() * 1e3);
310
- reconnectAttempts += 1;
311
- reconnectTimer = setTimeout(function() {
312
- reconnectTimer = null;
313
- openConnection();
314
- }, delay + jitter);
249
+ return "".concat(base, "/metrics/ingest");
315
250
  }
316
- function openConnection() {
317
- if (stopped || !isMQTTEnabled()) return;
318
- teardownClient();
319
- var url = buildMQTTBrokerUrl();
320
- status = "connecting";
321
- var clientId = "stormcloud-vp-".concat(Math.random().toString(36).slice(2, 9));
322
- try {
323
- client = import_mqtt.default.connect(url, {
324
- clientId: clientId,
325
- username: mqttConfig.username,
326
- password: mqttConfig.password,
327
- keepalive: KEEPALIVE_SECONDS,
328
- clean: true,
329
- // Disable MQTT.js internal reconnect; we manage reconnection ourselves.
330
- reconnectPeriod: 0,
331
- connectTimeout: CONNECT_TIMEOUT_MS,
332
- queueQoSZero: false,
333
- reschedulePings: true,
334
- // Root-cause fix for the Tizen 4.0 "Keepalive timeout" loop: MQTT.js's
335
- // default timerVariant "auto" runs the keepalive interval inside a
336
- // Blob-URL Web Worker (via worker-timers). On Samsung Tizen 4.0 (old
337
- // WebKit) served from a file:// origin that worker can't tick reliably,
338
- // so the keepalive counter trips onKeepaliveTimeout almost immediately
339
- // after connect. Force the native setInterval timer instead; the main
340
- // thread is free because video is decoded by the native AVPlay pipeline.
341
- timerVariant: "native"
342
- });
343
- } catch (err) {
344
- status = "error";
345
- console.warn("".concat(LOG, " connect() threw:"), err);
346
- scheduleReconnect();
347
- return;
348
- }
349
- client.on("connect", function() {
350
- status = "connected";
351
- reconnectAttempts = 0;
352
- clearReconnectTimer();
353
- console.info("".concat(LOG, " connected to ").concat(url));
354
- });
355
- client.on("offline", function() {
356
- if (status === "connected") status = "disconnected";
357
- console.warn("".concat(LOG, " offline"));
358
- scheduleReconnect();
359
- });
360
- client.on("error", function(err) {
361
- status = "error";
362
- console.warn("".concat(LOG, " error:"), err.message);
363
- scheduleReconnect();
364
- });
365
- client.on("close", function() {
366
- if (status === "connected") status = "disconnected";
367
- scheduleReconnect();
368
- });
369
- }
370
- function initMQTTClient() {
371
- if (client || !isMQTTEnabled()) return;
372
- stopped = false;
373
- reconnectAttempts = 0;
374
- openConnection();
375
- }
376
- function ensureMQTTClient() {
377
- if (isMQTTEnabled() && !client && !reconnectTimer) {
378
- initMQTTClient();
379
- }
380
- }
381
- function publishMQTT(topic, payload) {
382
- if (!isMQTTEnabled()) {
383
- return false;
384
- }
385
- ensureMQTTClient();
386
- if (!client || !client.connected) {
387
- return false;
388
- }
389
- try {
390
- client.publish(topic, JSON.stringify(payload), {
391
- qos: mqttConfig.qos
251
+ function ingestPlayerTracking(licenseKey, channel, body) {
252
+ return _async_to_generator(function() {
253
+ var response, error;
254
+ return _ts_generator(this, function(_state) {
255
+ switch(_state.label){
256
+ case 0:
257
+ if (!isTrackingIngestEnabled() || !licenseKey) {
258
+ return [
259
+ 2,
260
+ false
261
+ ];
262
+ }
263
+ _state.label = 1;
264
+ case 1:
265
+ _state.trys.push([
266
+ 1,
267
+ 3,
268
+ ,
269
+ 4
270
+ ]);
271
+ return [
272
+ 4,
273
+ fetch(buildTrackingIngestUrl(channel), {
274
+ method: "POST",
275
+ headers: {
276
+ "Content-Type": "application/json",
277
+ Authorization: "License-Key ".concat(licenseKey)
278
+ },
279
+ body: JSON.stringify(body)
280
+ })
281
+ ];
282
+ case 2:
283
+ response = _state.sent();
284
+ if (!response.ok) {
285
+ console.warn("[StormcloudVideoPlayer] Tracking ingest failed (".concat(response.status, ") for ").concat(channel));
286
+ return [
287
+ 2,
288
+ false
289
+ ];
290
+ }
291
+ return [
292
+ 2,
293
+ true
294
+ ];
295
+ case 3:
296
+ error = _state.sent();
297
+ console.warn("[StormcloudVideoPlayer] Tracking ingest error for ".concat(channel, ":"), error);
298
+ return [
299
+ 2,
300
+ false
301
+ ];
302
+ case 4:
303
+ return [
304
+ 2
305
+ ];
306
+ }
392
307
  });
393
- return true;
394
- } catch (err) {
395
- console.warn("".concat(LOG, " publish failed on ").concat(topic, ":"), err);
396
- return false;
397
- }
308
+ })();
398
309
  }
399
310
  // src/utils/vastEnvironmentSignals.ts
400
311
  var PLAYER_ID_STORAGE_KEY = "stormcloud.player.id";
@@ -1078,7 +989,7 @@ function getBrowserID(clientInfo) {
1078
989
  })();
1079
990
  }
1080
991
  function canPublish(licenseKey) {
1081
- return Boolean(isMQTTEnabled() && licenseKey);
992
+ return Boolean(isTrackingIngestEnabled() && licenseKey);
1082
993
  }
1083
994
  function buildPlayerMetricEvent() {
1084
995
  return _async_to_generator(function() {
@@ -1120,21 +1031,6 @@ function buildPlayerMetricEvent() {
1120
1031
  });
1121
1032
  }).apply(this, arguments);
1122
1033
  }
1123
- function publishTracking(licenseKey, channel, body) {
1124
- var debug = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : false;
1125
- ensureMQTTClient();
1126
- var topic = buildPlayerTopic(licenseKey, channel);
1127
- var published = publishMQTT(topic, body);
1128
- if (debug) {
1129
- console.log("[StormcloudVideoPlayer] publishTracking:", JSON.stringify({
1130
- licenseKey: licenseKey,
1131
- channel: channel,
1132
- topic: topic,
1133
- body: body,
1134
- published: published
1135
- }, null, 2));
1136
- }
1137
- }
1138
1034
  function sendInitialTracking(_0) {
1139
1035
  return _async_to_generator(function(licenseKey) {
1140
1036
  var context, metricEvent, error;
@@ -1150,9 +1046,9 @@ function sendInitialTracking(_0) {
1150
1046
  case 1:
1151
1047
  _state.trys.push([
1152
1048
  1,
1153
- 3,
1049
+ 4,
1154
1050
  ,
1155
- 4
1051
+ 5
1156
1052
  ]);
1157
1053
  return [
1158
1054
  4,
@@ -1163,23 +1059,28 @@ function sendInitialTracking(_0) {
1163
1059
  ];
1164
1060
  case 2:
1165
1061
  metricEvent = _state.sent();
1166
- publishTracking(licenseKey, "metrics", {
1167
- events: [
1168
- metricEvent
1169
- ]
1170
- }, !!context.debugAdTiming);
1171
1062
  return [
1172
- 3,
1173
- 4
1063
+ 4,
1064
+ ingestPlayerTracking(licenseKey, "metrics", {
1065
+ events: [
1066
+ metricEvent
1067
+ ]
1068
+ })
1174
1069
  ];
1175
1070
  case 3:
1071
+ _state.sent();
1072
+ return [
1073
+ 3,
1074
+ 5
1075
+ ];
1076
+ case 4:
1176
1077
  error = _state.sent();
1177
1078
  console.error("[StormcloudVideoPlayer] Error sending initial tracking data:", error);
1178
1079
  return [
1179
1080
  3,
1180
- 4
1081
+ 5
1181
1082
  ];
1182
- case 4:
1083
+ case 5:
1183
1084
  return [
1184
1085
  2
1185
1086
  ];
@@ -1277,7 +1178,7 @@ function sendAdLoadedTracking(_0, _1) {
1277
1178
  }
1278
1179
  function sendAdImpressionTracking(_0, _1) {
1279
1180
  return _async_to_generator(function(licenseKey, adImpressionInfo) {
1280
- var context, _adImpressionInfo_adUrl, metricEvent, error;
1181
+ var context, metricEvent, error;
1281
1182
  var _arguments = arguments;
1282
1183
  return _ts_generator(this, function(_state) {
1283
1184
  switch(_state.label){
@@ -1290,9 +1191,9 @@ function sendAdImpressionTracking(_0, _1) {
1290
1191
  case 1:
1291
1192
  _state.trys.push([
1292
1193
  1,
1293
- 3,
1194
+ 5,
1294
1195
  ,
1295
- 4
1196
+ 6
1296
1197
  ]);
1297
1198
  return [
1298
1199
  4,
@@ -1302,30 +1203,43 @@ function sendAdImpressionTracking(_0, _1) {
1302
1203
  ];
1303
1204
  case 2:
1304
1205
  metricEvent = _state.sent();
1305
- publishTracking(licenseKey, "heartbeat", metricEvent, !!context.debugAdTiming);
1306
- publishTracking(licenseKey, "impressions", {
1307
- events: [
1308
- {
1309
- event_id: createUuid(),
1310
- player_id: metricEvent.player_id,
1311
- ad_played_count: 1,
1312
- ad_url: (_adImpressionInfo_adUrl = adImpressionInfo.adUrl) !== null && _adImpressionInfo_adUrl !== void 0 ? _adImpressionInfo_adUrl : adImpressionInfo.adId,
1313
- capture_at: adImpressionInfo.timestamp
1314
- }
1315
- ]
1316
- }, !!context.debugAdTiming);
1317
1206
  return [
1318
- 3,
1319
- 4
1207
+ 4,
1208
+ ingestPlayerTracking(licenseKey, "metrics", {
1209
+ events: [
1210
+ metricEvent
1211
+ ]
1212
+ })
1320
1213
  ];
1321
1214
  case 3:
1215
+ _state.sent();
1216
+ return [
1217
+ 4,
1218
+ ingestPlayerTracking(licenseKey, "impressions", {
1219
+ events: [
1220
+ {
1221
+ player_id: metricEvent.player_id,
1222
+ ad_played_count: 1,
1223
+ ad_url: adImpressionInfo.adUrl,
1224
+ capture_at: adImpressionInfo.timestamp
1225
+ }
1226
+ ]
1227
+ })
1228
+ ];
1229
+ case 4:
1230
+ _state.sent();
1231
+ return [
1232
+ 3,
1233
+ 6
1234
+ ];
1235
+ case 5:
1322
1236
  error = _state.sent();
1323
1237
  console.error("[StormcloudVideoPlayer] Error sending ad impression tracking:", error);
1324
1238
  return [
1325
1239
  3,
1326
- 4
1240
+ 6
1327
1241
  ];
1328
- case 4:
1242
+ case 6:
1329
1243
  return [
1330
1244
  2
1331
1245
  ];
@@ -1348,9 +1262,9 @@ function sendHeartbeat(_0) {
1348
1262
  case 1:
1349
1263
  _state.trys.push([
1350
1264
  1,
1351
- 3,
1265
+ 4,
1352
1266
  ,
1353
- 4
1267
+ 5
1354
1268
  ]);
1355
1269
  return [
1356
1270
  4,
@@ -1358,19 +1272,28 @@ function sendHeartbeat(_0) {
1358
1272
  ];
1359
1273
  case 2:
1360
1274
  heartbeatData = _state.sent();
1361
- publishTracking(licenseKey, "heartbeat", heartbeatData, !!context.debugAdTiming);
1362
1275
  return [
1363
- 3,
1364
- 4
1276
+ 4,
1277
+ ingestPlayerTracking(licenseKey, "metrics", {
1278
+ events: [
1279
+ heartbeatData
1280
+ ]
1281
+ })
1365
1282
  ];
1366
1283
  case 3:
1284
+ _state.sent();
1285
+ return [
1286
+ 3,
1287
+ 5
1288
+ ];
1289
+ case 4:
1367
1290
  error = _state.sent();
1368
1291
  console.error("[StormcloudVideoPlayer] Error sending heartbeat:", error);
1369
1292
  return [
1370
1293
  3,
1371
- 4
1294
+ 5
1372
1295
  ];
1373
- case 4:
1296
+ case 5:
1374
1297
  return [
1375
1298
  2
1376
1299
  ];