senza-sdk 4.3.2-f445d5d.0 → 4.3.3-13bd44c.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.
@@ -140,13 +140,76 @@ class RemotePlayer extends RemotePlayerInterface {
140
140
  * @private
141
141
  */
142
142
  this._isPlaying = false;
143
+ }
143
144
 
144
- /**
145
- * @type {string}
146
- * @description the last set blackout time as epoch seconds.
147
- * @private
148
- */
149
- this._blackoutTime = 0;
145
+ /** @private Initialize the remote player
146
+ * @param {Object} uiStreamerSettings ui-streamer portion of the settings taken from session info
147
+ * */
148
+ async _init(uiStreamerSettings, triggerEvent) {
149
+ sdkLogger.info("Initializing RemotePlayer");
150
+ let playerState = {
151
+ isLoaded: false,
152
+ playbackUrl: ""
153
+ };
154
+ if (window.cefQuery) {
155
+ const FCID = getFCID();
156
+ const logger = sdkLogger.withFields({ FCID });
157
+ const message = {
158
+ type: "playerState",
159
+ fcid: FCID
160
+ };
161
+ const request = { target: "UI-Streamer", waitForResponse: false, message: JSON.stringify(message) };
162
+ try {
163
+ const playerStateStr = await new Promise((resolve, reject) => {
164
+ window.cefQuery({
165
+ request: JSON.stringify(request),
166
+ persistent: false,
167
+ onSuccess: (playerState) => {
168
+ logger.log("playerState request successfully returned", playerState);
169
+ resolve(playerState);
170
+ },
171
+ onFailure: (code, msg) => {
172
+ logger.error(`playerState request failed: ${code} ${msg}`);
173
+ reject();
174
+ }
175
+ });
176
+ });
177
+ playerState = JSON.parse(playerStateStr);
178
+ } catch {
179
+ logger.error("either failed to get or failed to parse player state");
180
+ }
181
+ }
182
+ this._loadMode = playerState?.isLoaded ? this.LoadMode.LOADED : this.LoadMode.NOT_LOADED;
183
+
184
+ this._isPlaying = window?.sessionStorage?.getItem("senzaSdk_isPlaying") === "true";
185
+
186
+ sdkLogger.info(`RemotePlayer initialized with load mode: ${this._loadMode}, senzaSdk_isPlaying: ${this._isPlaying}`);
187
+ this._loadedUrl = playerState?.playbackUrl || "";
188
+ // Make sure that the event listeners are registered only once
189
+ if (!this._isInitialized) {
190
+ this._addSenzaEventListeners();
191
+ }
192
+ this._isInitialized = true;
193
+ this._remotePlayerConfirmationTimeout = uiStreamerSettings?.remotePlayerConfirmationTimeout ?? DEFAULT_REMOTE_PLAYER_CONFIRMATION_TIMEOUT;
194
+ this._remotePlayerApiVersion = uiStreamerSettings?.remotePlayerApiVersion || 1;
195
+ this._multiSeekDelay = uiStreamerSettings?.multiSeekDelay || MULTI_SEEK_DELAY_MSEC;
196
+
197
+ sdkLogger.info(`remotePLayer isPlaying=${this._isPlaying}`);
198
+
199
+ let playbackMetadata = {};
200
+ try {
201
+ playbackMetadata = JSON.parse(triggerEvent?.playbackMetadata || "{}");
202
+ } catch (e) {
203
+ sdkLogger.error(`failed to parse playbackMetadata: ${e.message}`);
204
+ }
205
+ this._availabilityStartTime = playbackMetadata.availabilityStartTime;
206
+ this._updateTracks(playbackMetadata);
207
+ }
208
+
209
+ /**
210
+ * @private Add event listeners for system events
211
+ */
212
+ _addSenzaEventListeners() {
150
213
 
151
214
  typeof document !== "undefined" && document.addEventListener("hs/remotePlayerEvent", (e) => {
152
215
  sdkLogger.info("Got hs/remotePlayerEvent event with detail", JSON.stringify(e?.detail));
@@ -230,65 +293,7 @@ class RemotePlayer extends RemotePlayerInterface {
230
293
  };
231
294
  this.dispatchEvent(licenseRequestEvent);
232
295
  });
233
- }
234
-
235
- /** @private Initialize the remote player
236
- * @param {Object} uiStreamerSettings ui-streamer portion of the settings taken from session info
237
- * */
238
- async _init(uiStreamerSettings, triggerEvent) {
239
- let playerState = {
240
- isLoaded: false,
241
- playbackUrl: ""
242
- };
243
- if (window.cefQuery) {
244
- const FCID = getFCID();
245
- const logger = sdkLogger.withFields({ FCID });
246
- const message = {
247
- type: "playerState",
248
- fcid: FCID
249
- };
250
- const request = { target: "UI-Streamer", waitForResponse: false, message: JSON.stringify(message) };
251
- try {
252
- const playerStateStr = await new Promise((resolve, reject) => {
253
- window.cefQuery({
254
- request: JSON.stringify(request),
255
- persistent: false,
256
- onSuccess: (playerState) => {
257
- logger.log("playerState request successfully returned", playerState);
258
- resolve(playerState);
259
- },
260
- onFailure: (code, msg) => {
261
- logger.error(`playerState request failed: ${code} ${msg}`);
262
- reject();
263
- }
264
- });
265
- });
266
- playerState = JSON.parse(playerStateStr);
267
- } catch {
268
- logger.error("either failed to get or failed to parse player state");
269
- }
270
- }
271
- this._loadMode = playerState?.isLoaded ? this.LoadMode.LOADED : this.LoadMode.NOT_LOADED;
272
-
273
- this._isPlaying = window?.sessionStorage?.getItem("senzaSdk_isPlaying") === "true";
274
-
275
- sdkLogger.info(`RemotePlayer initialized with load mode: ${this._loadMode}, senzaSdk_isPlaying: ${this._isPlaying}`);
276
- this._loadedUrl = playerState?.playbackUrl || "";
277
- this._isInitialized = true;
278
- this._remotePlayerConfirmationTimeout = uiStreamerSettings?.remotePlayerConfirmationTimeout ?? DEFAULT_REMOTE_PLAYER_CONFIRMATION_TIMEOUT;
279
- this._remotePlayerApiVersion = uiStreamerSettings?.remotePlayerApiVersion || 1;
280
- this._multiSeekDelay = uiStreamerSettings?.multiSeekDelay || MULTI_SEEK_DELAY_MSEC;
281
-
282
- sdkLogger.info(`remotePLayer isPlaying=${this._isPlaying}`);
283
-
284
- let playbackMetadata = {};
285
- try {
286
- playbackMetadata = JSON.parse(triggerEvent?.playbackMetadata || "{}");
287
- } catch (e) {
288
- sdkLogger.error(`failed to parse playbackMetadata: ${e.message}`);
289
- }
290
- this._availabilityStartTime = playbackMetadata.availabilityStartTime;
291
- this._updateTracks(playbackMetadata);
296
+ sdkLogger.log("[RemotePlayer] Added event listeners for system events");
292
297
  }
293
298
 
294
299
  /** @private update audio and text tracks
@@ -751,7 +756,6 @@ class RemotePlayer extends RemotePlayerInterface {
751
756
  this._abortSetAudioLanguage = true;
752
757
  this._abortSetSubtitleLanguage = true;
753
758
  this._abortSeeking = true;
754
- this._blackoutTime = 0;
755
759
  if (reset) {
756
760
  this._reset();
757
761
  }
@@ -1363,14 +1367,23 @@ class RemotePlayer extends RemotePlayerInterface {
1363
1367
  }
1364
1368
  }
1365
1369
 
1366
- setBlackoutTime(date) {
1370
+ /**
1371
+ * The function sets a blackout time for the screen.
1372
+ * The blackout time is the time when the screen will be blacked out.
1373
+ * This is useful for parental controls where the screen should be blacked out during certain times
1374
+ *
1375
+ * @param {Date} date
1376
+ * @returns {Promise<void>} A Promise that resolves once the blackout time is set.
1377
+ * @throws {RemotePlayerError} If the player is not initialized or not loaded. if date is not a Date object or if the remote player api version is not supported
1378
+ */
1379
+ setScreenBlackout(date) {
1367
1380
 
1368
1381
  if (!this._isInitialized) {
1369
- throw new RemotePlayerError(6500, "Cannot call setBlackoutTime() if remote player is not initialized");
1382
+ throw new RemotePlayerError(6500, "Cannot call setScreenBlackout() if remote player is not initialized");
1370
1383
  }
1371
1384
 
1372
1385
  if (this._loadMode !== this.LoadMode.LOADED) {
1373
- throw new RemotePlayerError(6001, "Cannot call setBlackoutTime() if player is not loaded");
1386
+ throw new RemotePlayerError(6001, "Cannot call setScreenBlackout() if player is not loaded");
1374
1387
  }
1375
1388
 
1376
1389
  if (!(date instanceof Date)) {
@@ -1378,112 +1391,35 @@ class RemotePlayer extends RemotePlayerInterface {
1378
1391
  }
1379
1392
 
1380
1393
  if (this._remotePlayerApiVersion < 2) {
1381
- throw new RemotePlayerError(6504, `setBlackoutTime is not supported in remotePlayerApiVersion=${this._remotePlayerApiVersion}. remotePlayerApiVersion >= 2 required`);
1394
+ throw new RemotePlayerError(6504, "setScreenBlackout(): internal error");
1382
1395
  }
1383
1396
 
1384
1397
  const blackoutTime = (date.getTime()/1000).toFixed(2);
1385
- if (window.cefQuery) {
1386
- const FCID = getFCID();
1387
- const logger = sdkLogger.withFields({ FCID });
1388
- logger.log("remotePlayer setBlackoutTime: sending screenBlackout action");
1389
- const message = {
1390
- type: "remotePlayer.screenBlackout",
1391
- class: "remotePlayer",
1392
- action: "screenBlackout",
1393
- fcid: FCID,
1394
- blackoutTime
1395
- };
1396
- const request = { target: "TC", waitForResponse: true, message: JSON.stringify(message) };
1397
- return new Promise((resolve, reject) => {
1398
- let timerId = 0;
1399
- const timeBeforeSendingRequest = Date.now();
1400
- const queryId = window.cefQuery({
1401
- request: JSON.stringify(request),
1402
- persistent: false,
1403
- onSuccess: () => {
1404
- this._blackoutTime = blackoutTime;
1405
- const duration = Date.now() - timeBeforeSendingRequest;
1406
- logger.withFields({ duration }).log(`setBlackoutTime completed successfully after ${duration} ms`);
1407
- timerId = clearTimer(timerId);
1408
- resolve();
1409
- },
1410
- onFailure: (code, msg) => {
1411
- const duration = Date.now() - timeBeforeSendingRequest;
1412
- logger.withFields({ duration }).log(`setBlackoutTime failed after ${duration} ms. Error code: ${code}, error message: ${msg}`);
1413
- timerId = clearTimer(timerId);
1414
- reject(new RemotePlayerError(code, msg));
1415
- }
1416
- });
1417
-
1418
- logger.log(`window.cefQuery for setBlackoutTime returned query id ${queryId}`);
1419
- const timeout = this._remotePlayerConfirmationTimeout + 1000;
1420
- timerId = setTimeout(() => {
1421
- logger.log(`setBlackoutTime reached timeout of ${timeout} ms, canceling query id ${queryId}`);
1422
- window.cefQueryCancel(queryId);
1423
- reject(new RemotePlayerError(6000, `setBlackoutTime reached timeout of ${timeout} ms`));
1424
- }, timeout, queryId);
1425
- });
1426
- }
1427
- sdkLogger.error("remotePlayer setBlackoutTime: window.cefQuery is undefined");
1428
- return Promise.resolve(undefined);
1398
+ sdkLogger.info(`remotePlayer.setScreenBlackout(): setting blackout time to ${blackoutTime}`);
1399
+ return this._setScreenBlackout(blackoutTime);
1429
1400
  }
1430
1401
 
1431
- resetBlackoutTime() {
1402
+ /**
1403
+ * The function resets the currently set blackout time for the screen.
1404
+ * This is useful for parental controls to be reset the blackout time after it has been set.
1405
+ *
1406
+ * @returns {Promise<void>} A Promise that resolves once the blackout time is reset.
1407
+ * @throws {RemotePlayerError} If the player is not initialized or not loaded. if the remote player api version is not supported
1408
+ */
1409
+ resetScreenBlackout() {
1432
1410
  if (!this._isInitialized) {
1433
- throw new RemotePlayerError(6500, "Cannot call resetBlackoutTime() if remote player is not initialized");
1411
+ throw new RemotePlayerError(6500, "Cannot call resetScreenBlackout() if remote player is not initialized");
1434
1412
  }
1435
1413
 
1436
1414
  if (this._loadMode !== this.LoadMode.LOADED) {
1437
- throw new RemotePlayerError(6001, "Cannot call resetBlackoutTime() if player is not loaded");
1415
+ throw new RemotePlayerError(6001, "Cannot call resetScreenBlackout() if player is not loaded");
1438
1416
  }
1439
1417
 
1440
1418
  if (this._remotePlayerApiVersion < 2) {
1441
- throw new RemotePlayerError(6504, `resetBlackoutTime is not supported in remotePlayerApiVersion=${this._remotePlayerApiVersion}. remotePlayerApiVersion >= 2 required`);
1419
+ throw new RemotePlayerError(6504, "resetScreenBlackout(): internal error");
1442
1420
  }
1443
-
1444
- if (window.cefQuery) {
1445
- const FCID = getFCID();
1446
- const logger = sdkLogger.withFields({ FCID });
1447
- logger.log("remotePlayer resetBlackoutTime: sending screenBlackout action");
1448
- const message = {
1449
- type: "remotePlayer.screenBlackout",
1450
- class: "remotePlayer",
1451
- action: "screenBlackout",
1452
- fcid: FCID,
1453
- blackoutTime: 0 // Resetting the blackout time
1454
- };
1455
- const request = { target: "TC", waitForResponse: true, message: JSON.stringify(message) };
1456
- return new Promise((resolve, reject) => {
1457
- let timerId = 0;
1458
- const timeBeforeSendingRequest = Date.now();
1459
- const queryId = window.cefQuery({
1460
- request: JSON.stringify(request),
1461
- persistent: false,
1462
- onSuccess: () => {
1463
- this._blackoutTime = 0; // Resetting the blackout time
1464
- const duration = Date.now() - timeBeforeSendingRequest;
1465
- logger.withFields({ duration }).log(`resetBlackoutTime completed successfully after ${duration} ms`);
1466
- timerId = clearTimer(timerId);
1467
- resolve();
1468
- },
1469
- onFailure: (code, msg) => {
1470
- const duration = Date.now() - timeBeforeSendingRequest;
1471
- logger.withFields({ duration }).log(`resetBlackoutTime failed after ${duration} ms. Error code: ${code}, error message: ${msg}`);
1472
- timerId = clearTimer(timerId);
1473
- reject(new RemotePlayerError(code, msg));
1474
- }
1475
- });
1476
- logger.log(`window.cefQuery for resetBlackoutTime returned query id ${queryId}`);
1477
- const timeout = this._remotePlayerConfirmationTimeout + 1000;
1478
- timerId = setTimeout(() => {
1479
- logger.log(`resetBlackoutTime reached timeout of ${timeout} ms, canceling query id ${queryId}`);
1480
- window.cefQueryCancel(queryId);
1481
- reject(new RemotePlayerError(6000, `resetBlackoutTime reached timeout of ${timeout} ms`));
1482
- }, timeout, queryId);
1483
- });
1484
- }
1485
- sdkLogger.error("remotePlayer resetBlackoutTime: window.cefQuery is undefined");
1486
- return Promise.resolve(undefined);
1421
+ sdkLogger.info("remotePlayer.resetScreenBlackout(): resetting blackout time");
1422
+ return this._setScreenBlackout(0);
1487
1423
  }
1488
1424
 
1489
1425
  /**
@@ -1837,6 +1773,52 @@ class RemotePlayer extends RemotePlayerInterface {
1837
1773
  sdkLogger.log(`remotePlayer _atomicSetSubtitleLanguage: textTrackId=${textTrackId} ended.`);
1838
1774
  return setLanguageError ? Promise.reject(setLanguageError) : Promise.resolve();
1839
1775
  }
1776
+
1777
+ _setScreenBlackout(blackoutTime) {
1778
+ if (window.cefQuery) {
1779
+ const FCID = getFCID();
1780
+ const logger = sdkLogger.withFields({ FCID });
1781
+ logger.log(`sending screenBlackout action at ${blackoutTime}`);
1782
+ const message = {
1783
+ type: "remotePlayer.screenBlackout",
1784
+ class: "remotePlayer",
1785
+ action: "screenBlackout",
1786
+ fcid: FCID,
1787
+ blackoutTime
1788
+ };
1789
+ const request = { target: "TC", waitForResponse: true, message: JSON.stringify(message) };
1790
+ return new Promise((resolve, reject) => {
1791
+ let timerId = 0;
1792
+ const timeBeforeSendingRequest = Date.now();
1793
+ const queryId = window.cefQuery({
1794
+ request: JSON.stringify(request),
1795
+ persistent: false,
1796
+ onSuccess: () => {
1797
+ const duration = Date.now() - timeBeforeSendingRequest;
1798
+ logger.withFields({ duration }).log(`setBlackoutTime completed successfully after ${duration} ms`);
1799
+ timerId = clearTimer(timerId);
1800
+ resolve();
1801
+ },
1802
+ onFailure: (code, msg) => {
1803
+ const duration = Date.now() - timeBeforeSendingRequest;
1804
+ logger.withFields({ duration }).log(`setBlackoutTime failed after ${duration} ms. Error code: ${code}, error message: ${msg}`);
1805
+ timerId = clearTimer(timerId);
1806
+ reject(new RemotePlayerError(code, msg));
1807
+ }
1808
+ });
1809
+
1810
+ logger.log(`window.cefQuery for screenBlackout returned query id ${queryId}`);
1811
+ const timeout = this._remotePlayerConfirmationTimeout + 1000;
1812
+ timerId = setTimeout(() => {
1813
+ logger.log(`screenBlackout reached timeout of ${timeout} ms, canceling query id ${queryId}`);
1814
+ window.cefQueryCancel(queryId);
1815
+ reject(new RemotePlayerError(6000, `screenBlackout reached timeout of ${timeout} ms`));
1816
+ }, timeout, queryId);
1817
+ });
1818
+ }
1819
+ sdkLogger.error("screenBlackout: window.cefQuery is undefined");
1820
+ return Promise.resolve(undefined);
1821
+ }
1840
1822
  }
1841
1823
  /**
1842
1824
  *
@@ -1,4 +1,4 @@
1
- import { noop } from "./utils";
1
+ import { noop } from "./utils.js";
2
2
 
3
3
  /**
4
4
  * alarm event
@@ -117,7 +117,7 @@ export class RemotePlayerError extends Error {
117
117
  * | 6501 | Player | load() was called while previous load/unload was still in progress |
118
118
  * | 6502 | Player | unload() was called while previous unload/load was still in progress |
119
119
  * | 6503 | Player | The remote player api call has invalid parameters |
120
- * | 6504 | Player | The remote player api call has invalid api version |
120
+ * | 6504 | Player | The remote player api internal error |
121
121
  * | 8001 | Player | Error pulling manifest. bad parameters |
122
122
  * | 8002 | Player | Error pulling manifest. filters returned no data |
123
123
  * | 8003 | Player | Error pulling manifest. fetch error |
@@ -400,22 +400,27 @@ class RemotePlayer extends EventTarget {
400
400
  }
401
401
 
402
402
  /**
403
- *
403
+ * The function sets a blackout time for the screen.
404
+ * The blackout time is the time when the screen will be blacked out.
405
+ * This is useful for parental controls where the screen should be blacked out during certain times
406
+ * @private
404
407
  * @param {Date} date
405
408
  * @returns {Promise<void>} A Promise that resolves once the blackout time is set.
406
- * @throws {RemotePlayerError} If the player is not initialized or not loaded. if date is not a Date object or if the remote player api version is less than 2
409
+ * @throws {RemotePlayerError} If the player is not initialized or not loaded. if date is not a Date object or if the remote player api version is not supported
407
410
  */
408
- setBlackoutTime(date) {
409
- return noop("RemotePlayer.setBlackoutTime", date);
411
+ setScreenBlackout(date) {
412
+ return noop("RemotePlayer.setScreenBlackout", date);
410
413
  }
411
414
 
412
415
  /**
413
- *
416
+ * The function resets the currently set blackout time for the screen.
417
+ * This is useful for parental controls to be reset the blackout time after it has been set.
418
+ * @private
414
419
  * @returns {Promise<void>} A Promise that resolves once the blackout time is reset.
415
- * @throws {RemotePlayerError} If the player is not initialized or not loaded. if the remote player api version is less than 2
420
+ * @throws {RemotePlayerError} If the player is not initialized or not loaded. if the remote player api version is not supported
416
421
  */
417
- resetBlackoutTime() {
418
- return noop("RemotePlayer.resetBlackoutTime");
422
+ resetScreenBlackout() {
423
+ return noop("RemotePlayer.resetScreenBlackout");
419
424
  }
420
425
 
421
426
  /**
@@ -1,5 +1,4 @@
1
- import pack from "../../package.json";
2
- const { version } = pack;
1
+ import { version } from "./version.js";
3
2
 
4
3
  /* eslint-disable no-console */
5
4
  class SdkLogger {
@@ -0,0 +1 @@
1
+ export const version = "4.3.3-13bd44c.0";