stormcloud-video-player 0.8.37 → 0.8.39

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/lib/index.cjs CHANGED
@@ -1337,7 +1337,7 @@ function createHlsAdPlayer(contentVideo, options) {
1337
1337
  adHls.destroy();
1338
1338
  }
1339
1339
  adHls = new import_hls.default({
1340
- enableWorker: typeof globalThis !== "undefined",
1340
+ enableWorker: true,
1341
1341
  lowLatencyMode: false
1342
1342
  });
1343
1343
  adHls.loadSource(mediaFile.url);
@@ -2110,8 +2110,17 @@ function buildPlayerTopic(licenseKey, channel) {
2110
2110
  // src/utils/mqttClient.ts
2111
2111
  var import_mqtt = __toESM(require("mqtt"), 1);
2112
2112
  var LOG = "[StormcloudVideoPlayer][MQTT]";
2113
+ var KEEPALIVE_SECONDS = 30;
2114
+ var CONNECT_TIMEOUT_MS = 1e4;
2115
+ var RECONNECT_BASE_MS = 5e3;
2116
+ var RECONNECT_MAX_MS = 6e4;
2117
+ var MAX_RECONNECT_ATTEMPTS = 8;
2118
+ var COOLDOWN_MS = 10 * 6e4;
2113
2119
  var client = null;
2114
2120
  var status = "disconnected";
2121
+ var reconnectAttempts = 0;
2122
+ var reconnectTimer = null;
2123
+ var stopped = false;
2115
2124
  function getMQTTStatus() {
2116
2125
  return status;
2117
2126
  }
@@ -2125,8 +2134,45 @@ function configureMQTT(overrides) {
2125
2134
  applyMQTTConfig(overrides);
2126
2135
  disconnectMQTT();
2127
2136
  }
2128
- function initMQTTClient() {
2129
- if (client || !isMQTTEnabled()) return;
2137
+ function clearReconnectTimer() {
2138
+ if (reconnectTimer) {
2139
+ clearTimeout(reconnectTimer);
2140
+ reconnectTimer = null;
2141
+ }
2142
+ }
2143
+ function teardownClient() {
2144
+ if (client) {
2145
+ try {
2146
+ client.removeAllListeners();
2147
+ client.end(true);
2148
+ } catch (unused) {}
2149
+ client = null;
2150
+ }
2151
+ }
2152
+ function scheduleReconnect() {
2153
+ if (stopped || !isMQTTEnabled() || reconnectTimer) return;
2154
+ if (reconnectAttempts >= MAX_RECONNECT_ATTEMPTS) {
2155
+ console.warn("".concat(LOG, " giving up after ").concat(reconnectAttempts, " attempts; cooling down for ").concat(COOLDOWN_MS / 6e4, "m"));
2156
+ teardownClient();
2157
+ status = "disconnected";
2158
+ reconnectTimer = setTimeout(function() {
2159
+ reconnectTimer = null;
2160
+ reconnectAttempts = 0;
2161
+ openConnection();
2162
+ }, COOLDOWN_MS);
2163
+ return;
2164
+ }
2165
+ var delay = Math.min(RECONNECT_MAX_MS, RECONNECT_BASE_MS * Math.pow(2, reconnectAttempts));
2166
+ var jitter = Math.floor(Math.random() * 1e3);
2167
+ reconnectAttempts += 1;
2168
+ reconnectTimer = setTimeout(function() {
2169
+ reconnectTimer = null;
2170
+ openConnection();
2171
+ }, delay + jitter);
2172
+ }
2173
+ function openConnection() {
2174
+ if (stopped || !isMQTTEnabled()) return;
2175
+ teardownClient();
2130
2176
  var url = buildMQTTBrokerUrl();
2131
2177
  status = "connecting";
2132
2178
  var clientId = "stormcloud-vp-".concat(Math.random().toString(36).slice(2, 9));
@@ -2135,41 +2181,48 @@ function initMQTTClient() {
2135
2181
  clientId: clientId,
2136
2182
  username: mqttConfig.username,
2137
2183
  password: mqttConfig.password,
2138
- keepalive: 60,
2184
+ keepalive: KEEPALIVE_SECONDS,
2139
2185
  clean: true,
2140
- reconnectPeriod: 5e3,
2141
- connectTimeout: 1e4,
2142
- queueQoSZero: false
2186
+ reconnectPeriod: 0,
2187
+ connectTimeout: CONNECT_TIMEOUT_MS,
2188
+ queueQoSZero: false,
2189
+ reschedulePings: true
2143
2190
  });
2144
2191
  } catch (err) {
2145
2192
  status = "error";
2146
2193
  console.warn("".concat(LOG, " connect() threw:"), err);
2194
+ scheduleReconnect();
2147
2195
  return;
2148
2196
  }
2149
2197
  client.on("connect", function() {
2150
2198
  status = "connected";
2199
+ reconnectAttempts = 0;
2200
+ clearReconnectTimer();
2151
2201
  console.info("".concat(LOG, " connected to ").concat(url));
2152
2202
  });
2153
- client.on("reconnect", function() {
2154
- status = "connecting";
2155
- console.info("".concat(LOG, " reconnecting…"));
2156
- });
2157
2203
  client.on("offline", function() {
2158
- status = "disconnected";
2204
+ if (status === "connected") status = "disconnected";
2159
2205
  console.warn("".concat(LOG, " offline"));
2206
+ scheduleReconnect();
2160
2207
  });
2161
2208
  client.on("error", function(err) {
2162
2209
  status = "error";
2163
2210
  console.warn("".concat(LOG, " error:"), err.message);
2211
+ scheduleReconnect();
2164
2212
  });
2165
2213
  client.on("close", function() {
2166
- if (status === "connected") {
2167
- status = "disconnected";
2168
- }
2214
+ if (status === "connected") status = "disconnected";
2215
+ scheduleReconnect();
2169
2216
  });
2170
2217
  }
2218
+ function initMQTTClient() {
2219
+ if (client || !isMQTTEnabled()) return;
2220
+ stopped = false;
2221
+ reconnectAttempts = 0;
2222
+ openConnection();
2223
+ }
2171
2224
  function ensureMQTTClient() {
2172
- if (isMQTTEnabled() && !client) {
2225
+ if (isMQTTEnabled() && !client && !reconnectTimer) {
2173
2226
  initMQTTClient();
2174
2227
  }
2175
2228
  }
@@ -2178,7 +2231,7 @@ function publishMQTT(topic, payload) {
2178
2231
  return false;
2179
2232
  }
2180
2233
  ensureMQTTClient();
2181
- if (!client) {
2234
+ if (!client || !client.connected) {
2182
2235
  return false;
2183
2236
  }
2184
2237
  try {
@@ -2192,11 +2245,11 @@ function publishMQTT(topic, payload) {
2192
2245
  }
2193
2246
  }
2194
2247
  function disconnectMQTT() {
2195
- if (client) {
2196
- client.end(true);
2197
- client = null;
2198
- status = "disconnected";
2199
- }
2248
+ stopped = true;
2249
+ clearReconnectTimer();
2250
+ teardownClient();
2251
+ reconnectAttempts = 0;
2252
+ status = "disconnected";
2200
2253
  }
2201
2254
  // src/utils/vastEnvironmentSignals.ts
2202
2255
  var AIRY_ANDROID_APP_ID = "com.freeairytv.android";
@@ -6487,7 +6540,7 @@ var HlsEngine = /*#__PURE__*/ function() {
6487
6540
  value: function setupHls() {
6488
6541
  var _this = this;
6489
6542
  this.hls = new import_hls2.default(_object_spread_props(_object_spread({
6490
- enableWorker: typeof globalThis !== "undefined",
6543
+ enableWorker: true,
6491
6544
  backBufferLength: 30,
6492
6545
  liveDurationInfinity: true,
6493
6546
  lowLatencyMode: !!this.config.lowLatencyMode,