senza-sdk 4.3.1-e113d43.0 → 4.3.2-2e967be.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "senza-sdk",
3
- "version": "4.3.1-e113d43.0",
3
+ "version": "4.3.2-2e967be.0",
4
4
  "main": "./src/api.js",
5
5
  "description": "API for Senza application",
6
6
  "license": "MIT",
@@ -46,18 +46,19 @@
46
46
  "global": {
47
47
  "branches": 88,
48
48
  "functions": 92.36,
49
- "lines": 93.83,
50
- "statements": 93.81
49
+ "lines": 93.47,
50
+ "statements": 93.46
51
51
  },
52
52
  "src/interface": {
53
- "branches": 69.38,
54
- "functions": 52.72,
55
- "lines": 71.95,
56
- "statements": 72.16
53
+ "branches": 68.42,
54
+ "functions": 40.74,
55
+ "lines": 65.96,
56
+ "statements": 66.32
57
57
  }
58
58
  }
59
59
  },
60
60
  "dependencies": {
61
- "shaka-player": "^4.12.5"
61
+ "shaka-player": "^4.12.5",
62
+ "moment": "^2.30.1"
62
63
  }
63
64
  }
package/src/api.js CHANGED
@@ -4,6 +4,11 @@ import { Lifecycle, RemotePlayer, DeviceManager, PlatformManager, AlarmManager,
4
4
 
5
5
  const { version } = pack;
6
6
 
7
+ typeof document !== "undefined" && document.addEventListener("keydown", (event) => {
8
+ sdkLogger.log(`Got ${event.key} key`);
9
+ });
10
+
11
+
7
12
  let authToken;
8
13
 
9
14
  /** @namespace auth
@@ -193,6 +198,7 @@ export function getClientAssertion() {
193
198
 
194
199
  /**
195
200
  * @module
201
+ * @private
196
202
  * @type {Lifecycle}
197
203
  * @example
198
204
  * import { lifecycle } from "senza-sdk";
@@ -203,6 +209,7 @@ let lifecycle;
203
209
 
204
210
  /**
205
211
  * @module
212
+ * @private
206
213
  * @type {RemotePlayer}
207
214
  * @example
208
215
  * import { init, remotePlayer } from "senza-sdk";
@@ -221,6 +228,7 @@ let remotePlayer;
221
228
 
222
229
  /**
223
230
  * @module
231
+ * @private
224
232
  * @type {AlarmManager}
225
233
  * @example
226
234
  * import { alarmManager } from "senza-sdk";
@@ -231,6 +239,7 @@ let alarmManager;
231
239
 
232
240
  /**
233
241
  * @module
242
+ * @private
234
243
  * @type {DeviceManager}
235
244
  * @example
236
245
  * import { deviceManager } from "senza-sdk";
@@ -246,6 +255,7 @@ let deviceManager;
246
255
 
247
256
  /**
248
257
  * @module
258
+ * @private
249
259
  * @type {PlatformManager}
250
260
  * @example
251
261
  * import { platformManager } from "senza-sdk";
@@ -254,11 +264,11 @@ let deviceManager;
254
264
  *
255
265
  * @return {PlatformManager} pointer to the PlatformManager singleton
256
266
  */
257
-
258
-
259
267
  let platformManager;
268
+
260
269
  /**
261
270
  * @module
271
+ * @private
262
272
  * @type {MessageManager}
263
273
  * @example
264
274
  * import { MessageManager } from "senza-sdk";
@@ -272,6 +282,7 @@ let messageManager;
272
282
  * ShakaPlayer subclass of Shaka that handles both local and remote playback.
273
283
  *
274
284
  * @class ShakaPlayer
285
+ * @private
275
286
  * @type {new|ShakaPlayer}
276
287
  * @example
277
288
  * import { ShakaPlayer } from "senza-sdk";
@@ -291,6 +302,7 @@ let ShakaPlayerImplementation;
291
302
 
292
303
  /**
293
304
  * @module
305
+ * @private
294
306
  * @type {shaka}
295
307
  */
296
308
  let shakaImplementation;
@@ -16,6 +16,27 @@ class AlarmManager extends AlarmManagerInterface {
16
16
  timeoutMs: 15000 // Default timeout of 15 seconds, can be overridden by _setDefaultTimeout
17
17
  });
18
18
 
19
+ /**
20
+ * @type {boolean}
21
+ * @private
22
+ */
23
+ this._isInitialized = false;
24
+ }
25
+
26
+ /**
27
+ * @private
28
+ */
29
+ _init() {
30
+ if (!this._isInitialized) {
31
+ this._isInitialized = true;
32
+ this._addSenzaEventListeners();
33
+ }
34
+ }
35
+
36
+ /**
37
+ * @private Add event listeners for system events
38
+ */
39
+ _addSenzaEventListeners() {
19
40
  typeof document !== "undefined" && document.addEventListener("hs/alarmFiredEvent", async (e) => {
20
41
 
21
42
  if (e.detail?.alarmName) {
@@ -2,16 +2,22 @@ import { getFCID, sdkLogger, getVersion } from "./utils.js";
2
2
  import { sessionInfo } from "./SessionInfo.js";
3
3
  import { lifecycle } from "./lifecycle.js";
4
4
  import { alarmManager } from "./alarmManager.js";
5
+ import { remotePlayer } from "./remotePlayer.js";
6
+ import { deviceManager } from "./deviceManager.js";
7
+ import { messageManager } from "./messageManager.js";
5
8
 
9
+ export { remotePlayer };
10
+ export { lifecycle } from "./lifecycle.js";
11
+ export { deviceManager };
12
+ export { platformManager } from "./platformManager.js";
13
+ export { alarmManager };
14
+ export { messageManager };
15
+ export { SenzaShakaPlayer as ShakaPlayer, shaka } from "./senzaShakaPlayer.js";
6
16
  let authToken;
7
17
 
8
18
  const API_VERSION = "1.0";
9
19
  let interfaceVersion;
10
20
 
11
- typeof document !== "undefined" && document.addEventListener("keydown", (event) => {
12
- sdkLogger.log(`Got ${event.key} key`);
13
- });
14
-
15
21
  /** @namespace auth
16
22
  *@example
17
23
  * import { auth } from "senza-sdk";
@@ -28,8 +34,6 @@ export const auth = {
28
34
 
29
35
  };
30
36
 
31
- import { remotePlayer } from "./remotePlayer.js";
32
- export { remotePlayer };
33
37
 
34
38
  /** Should be called once to init the library
35
39
  *@example
@@ -127,6 +131,10 @@ export async function init(interfaceApiVersion, showSequenceFunc, initSequenceFu
127
131
  // Initialize lifecycle first to make sure the state is updated.
128
132
  await lifecycle._init(sessionInfoObj?.settings?.["ui-streamer"], triggerEvent);
129
133
  await remotePlayer._init(sessionInfoObj?.settings?.["ui-streamer"], triggerEvent);
134
+ alarmManager._init();
135
+ deviceManager._init();
136
+ messageManager._init();
137
+
130
138
 
131
139
  const devSequence = sessionInfoObj?.settings?.["ui-streamer"]?.devSequence;
132
140
  if (devSequence) {
@@ -259,13 +267,6 @@ export function uiReady() {
259
267
  }
260
268
  }
261
269
 
262
- export { lifecycle } from "./lifecycle.js";
263
- export { deviceManager } from "./deviceManager.js";
264
- export { platformManager } from "./platformManager.js";
265
- export { alarmManager };
266
- export { messageManager } from "./messageManager.js";
267
- export { SenzaShakaPlayer as ShakaPlayer, shaka } from "./senzaShakaPlayer.js";
268
-
269
270
  import "./devHelper.js";
270
271
 
271
272
  /**
@@ -43,7 +43,27 @@ class DeviceManager extends DeviceManagerInterface {
43
43
  wifiInfo.quality = 0;
44
44
  wifiInfo.ssid = "unknown";
45
45
  wifiInfo.bssid = "unknown";
46
+ /**
47
+ * @type {boolean}
48
+ * @private
49
+ */
50
+ this._isInitialized = false;
51
+ }
46
52
 
53
+ /**
54
+ * @private
55
+ */
56
+ _init() {
57
+ if (!this._isInitialized) {
58
+ this._isInitialized = true;
59
+ this._addSenzaEventListeners();
60
+ }
61
+ }
62
+
63
+ /**
64
+ * @private Add event listeners for system events
65
+ */
66
+ _addSenzaEventListeners() {
47
67
  typeof document !== "undefined" && document.addEventListener("wifiSignalReport", (e) => {
48
68
  wifiInfo.level = e.detail.level;
49
69
  wifiInfo.quality = e.detail.quality;
@@ -51,7 +71,6 @@ class DeviceManager extends DeviceManagerInterface {
51
71
  wifiInfo.bssid = e.detail.bssid;
52
72
  this.dispatchEvent(new Event("wifiInfoUpdated"));
53
73
  });
54
-
55
74
  }
56
75
 
57
76
  get deviceInfo() {
@@ -20,12 +20,6 @@ const DEFAULT_AUTO_BACKGROUND_VIDEO_DELAY = 30;
20
20
  const DEFAULT_AUTO_BACKGROUND_UI_DELAY = -1;
21
21
  const DEFAULT_AUTO_BACKGROUND_ENABLED = false;
22
22
 
23
- /**
24
- * Lifecycle is a singleton class that manages the application lifecycle states.<br>
25
- * @fires onstatechange
26
- * @fires userinactivity
27
- * @fires userdisconnected
28
- */
29
23
  class Lifecycle extends LifecycleInterface {
30
24
  constructor() {
31
25
  super();
@@ -63,56 +57,10 @@ class Lifecycle extends LifecycleInterface {
63
57
  * @private
64
58
  */
65
59
  this._autoBackgroundOnUIDelay = DEFAULT_AUTO_BACKGROUND_UI_DELAY;
66
-
67
- typeof document !== "undefined" && document.addEventListener("hs/uistatechange", (e) => {
68
- sdkLogger.log("Got hs/uistatechange", e.detail);
69
- const event = new Event("onstatechange");
70
- event.state = e.detail;
71
- this._state = event.state;
72
- if (this._isAutoBackgroundEnabled() && this.state === this.UiState.FOREGROUND) {
73
- this._startCountdown();
74
- }
75
- this.dispatchEvent(event);
76
- });
77
-
78
- typeof document !== "undefined" && document.addEventListener("hs/systemInactivity", (e) => {
79
- sdkLogger.log("Got hs/systemInactivity", e.detail);
80
- const event = new Event("userinactivity");
81
- event.timeout = e.detail.timeout;
82
- this.dispatchEvent(event);
83
- });
84
-
85
- typeof document !== "undefined" && document.addEventListener("hs/endOfSession", async () => {
86
- // Create the event
87
- const event = new Event("userdisconnected");
88
-
89
- // Use the event manager to dispatch the event and wait for all listeners
90
- await this._eventManager.dispatch("userdisconnected", event);
91
-
92
- this._sendTerminatingMessage();
93
- });
94
-
95
- typeof document !== "undefined" && document.addEventListener("keydown", () => {
96
- if (this._isAutoBackgroundEnabled()) {
97
- if (this.state === this.UiState.BACKGROUND ||
98
- this.state === this.UiState.IN_TRANSITION_TO_BACKGROUND) {
99
- this.moveToForeground();
100
- } else {
101
- this._startCountdown();
102
- }
103
- }
104
- });
105
-
106
- // Add playModeChange listener
107
- remotePlayer.addEventListener("playModeChange", (event) => {
108
- if (this._isAutoBackgroundEnabled() && this.state === this.UiState.FOREGROUND) {
109
- sdkLogger.log("Resetting auto background timer due to play mode change", event.detail.isPlaying);
110
- this._startCountdown(event.detail.isPlaying);
111
- }
112
- });
113
60
  }
114
61
 
115
- /** @private Initialize the lifecycle
62
+ /**
63
+ * @private Initialize the lifecycle
116
64
  * @param {Object} uiStreamerSettings - UI-streamer portion of the settings taken from session info
117
65
  * @param {Object} [uiStreamerSettings.autoBackground] - Auto background mode configuration
118
66
  * @param {boolean} [uiStreamerSettings.autoBackground.enabled=false] - Enable/disable auto background
@@ -191,6 +139,11 @@ class Lifecycle extends LifecycleInterface {
191
139
  this._triggerEventFcid = triggerEvent.fcid;
192
140
  }
193
141
 
142
+ // Make sure that the event listeners are registered only once
143
+ if (!this._isInitialized) {
144
+ this._addSenzaEventListeners();
145
+ }
146
+
194
147
  this._isInitialized = true;
195
148
  this._remotePlayerConfirmationTimeout = uiStreamerSettings?.remotePlayerConfirmationTimeout ?? DEFAULT_REMOTE_PLAYER_CONFIRMATION_TIMEOUT;
196
149
  this._remotePlayerApiVersion = uiStreamerSettings?.remotePlayerApiVersion || 1;
@@ -209,14 +162,68 @@ class Lifecycle extends LifecycleInterface {
209
162
  }
210
163
  }
211
164
 
212
- /** @private Checks if auto background is enabled including overrides.
165
+ /**
166
+ * @private Add event listeners for system events
167
+ */
168
+ _addSenzaEventListeners() {
169
+ typeof document !== "undefined" && document.addEventListener("hs/uistatechange", (e) => {
170
+ sdkLogger.log("Got hs/uistatechange", e.detail);
171
+ const event = new Event("onstatechange");
172
+ event.state = e.detail;
173
+ this._state = event.state;
174
+ if (this._isAutoBackgroundEnabled() && this.state === this.UiState.FOREGROUND) {
175
+ this._startCountdown();
176
+ }
177
+ this.dispatchEvent(event);
178
+ });
179
+
180
+ typeof document !== "undefined" && document.addEventListener("hs/systemInactivity", (e) => {
181
+ sdkLogger.log("Got hs/systemInactivity", e.detail);
182
+ const event = new Event("userinactivity");
183
+ event.timeout = e.detail.timeout;
184
+ this.dispatchEvent(event);
185
+ });
186
+
187
+ typeof document !== "undefined" && document.addEventListener("hs/endOfSession", async () => {
188
+ // Create the event
189
+ const event = new Event("userdisconnected");
190
+
191
+ // Use the event manager to dispatch the event and wait for all listeners
192
+ await this._eventManager.dispatch("userdisconnected", event);
193
+
194
+ this._sendTerminatingMessage();
195
+ });
196
+
197
+ typeof document !== "undefined" && document.addEventListener("keydown", () => {
198
+ if (this._isAutoBackgroundEnabled()) {
199
+ if (this.state === this.UiState.BACKGROUND ||
200
+ this.state === this.UiState.IN_TRANSITION_TO_BACKGROUND) {
201
+ this.moveToForeground();
202
+ } else {
203
+ this._startCountdown();
204
+ }
205
+ }
206
+ });
207
+
208
+ // Add playModeChange listener
209
+ remotePlayer.addEventListener("playModeChange", (event) => {
210
+ if (this._isAutoBackgroundEnabled() && this.state === this.UiState.FOREGROUND) {
211
+ sdkLogger.log("Resetting auto background timer due to play mode change", event.detail.isPlaying);
212
+ this._startCountdown(event.detail.isPlaying);
213
+ }
214
+ });
215
+ }
216
+
217
+ /**
218
+ * @private Checks if auto background is enabled including overrides.
213
219
  * @returns {boolean}
214
220
  */
215
221
  _isAutoBackgroundEnabled() {
216
222
  return this._autoBackgroundOverrides?.enabled ?? this._autoBackground;
217
223
  }
218
224
 
219
- /** @private Gets the auto background video delay including overrides.
225
+ /**
226
+ * @private Gets the auto background video delay including overrides.
220
227
  * @returns {number}
221
228
  */
222
229
  _getAutoBackgroundOnVideoDelay() {
@@ -227,7 +234,8 @@ class Lifecycle extends LifecycleInterface {
227
234
  return this._autoBackgroundOnVideoDelay;
228
235
  }
229
236
 
230
- /** @private Gets the auto background UI delay including overrides.
237
+ /**
238
+ * @private Gets the auto background UI delay including overrides.
231
239
  * @returns {number}
232
240
  */
233
241
  _getAutoBackgroundOnUIDelay() {
@@ -290,6 +298,7 @@ class Lifecycle extends LifecycleInterface {
290
298
  }
291
299
 
292
300
  /**
301
+ * @private
293
302
  * This method moves the application into standby mode, i.e. last ui frame is displayed and ui resources are released.
294
303
  * It should be called whenever the application wishes to go into standby mode and release resources.
295
304
  * @example
@@ -1,49 +1,36 @@
1
1
  import { MessageManager as MessageManagerInterface } from "../interface/messageManager";
2
2
  import { getFCID, sdkLogger } from "./utils";
3
3
 
4
- /**
5
- * MessageManager is a singleton class that manages the external messages received by the application. It fires custom events as "message" with the payload as the content
6
- * @fires MessageManager#message
7
- */
8
-
9
4
  class MessageManager extends MessageManagerInterface {
10
5
 
6
+ constructor() {
7
+ super();
8
+ /**
9
+ * @type {boolean}
10
+ * @private
11
+ */
12
+ this._isInitialized = false;
13
+ }
11
14
  /**
12
- * @typedef {object} MessageDetails - object which contains the content of the message
13
- * @property {string} eventName - The name of the event message, a property of MessageDetails
14
- * @property {object} payload - The payload for this event, a property of MessageDetails
15
- * @property {string} fcid - The flow context for this message, a property of MessageDetails
15
+ * @private
16
16
  */
17
+ _init() {
18
+ if (!this._isInitialized) {
19
+ this._isInitialized = true;
20
+ this._addSenzaEventListeners();
21
+ }
22
+ }
17
23
 
18
24
  /**
19
- * message event
20
- *
21
- * @event MessageManager#message
22
- * @type {CustomEvent}
23
- * @property {MessageDetails} detail - object containing data related to the event:
24
-
25
- *
26
- * @description Fired when an external event arrives. This is a generic handler for all messages received for any registered group <br>
27
- * @example
28
- * messageManager.addEventListener("message", (e) => {
29
- * console.log("message arrived with data", e.detail);
30
- * });
31
- *
25
+ * @private Add event listeners for system events
32
26
  */
33
- constructor() {
34
- super();
27
+ _addSenzaEventListeners() {
35
28
  typeof document !== "undefined" && document.addEventListener("hs/externalEvent", (e) => {
36
29
  sdkLogger.log("Got hs/externalEvent", JSON.stringify(e.detail));
37
30
  this.dispatchEvent(new CustomEvent("message", { detail: { eventName: e.detail.eventName, payload: e.detail.payload, fcid: e.detail.fcid } }));
38
31
  });
39
32
  }
40
33
 
41
- /** Register to specific group(s). This function replaces the previously registered groups
42
- * @param {Array<String>} groups group events to receive messages.
43
- * @return {Promise} Promise which is resolved when the registerGroups command has been successfully processed.
44
- * Failure to process the registerGroups command will result in the promise being rejected.
45
- * messageManager.registerGroups(["A","B"]);
46
- * */
47
34
  async registerGroups(groups) {
48
35
  sdkLogger.log(`register called for ${groups}`);
49
36
  return new Promise((resolve, reject) => {
@@ -2,24 +2,12 @@ import { PlatformManager as PlatformManagerInterface } from "../interface/platfo
2
2
  import { sdkLogger } from "./utils";
3
3
  import { sessionInfo } from "./SessionInfo";
4
4
 
5
-
6
- /**
7
- * PlatformManager is a singleton class that manages the platform
8
- */
9
5
  class PlatformManager extends PlatformManagerInterface {
10
6
 
11
7
  constructor() {
12
8
  super();
13
9
  }
14
10
 
15
- /**
16
- * @returns {Object} appConfig object
17
- * @property {String[]} territories - a list of territories configured for the tenant.
18
- * if the list is undefined or empty - there are no restrictions.
19
- * @example
20
- * import { platformManager } from "senza-sdk";
21
- * const appConfig = platformManager.appConfig
22
- * */
23
11
  get appConfig() {
24
12
  const sessionInfoObj = sessionInfo.sessionInfoObj;
25
13
  const appConfig = sessionInfoObj.homeSessionInfo?.["appConfig"] || {};
@@ -27,13 +15,6 @@ class PlatformManager extends PlatformManagerInterface {
27
15
  return appConfig;
28
16
  }
29
17
 
30
- /**
31
- *
32
- * @param {string} timezone the timezone to set to
33
- * the format of the timezone is according to the standard TZ identifier
34
- * (e.g. America/Los_Angeles, Asia/Tokyo, Europe/Brussels)
35
- * for a full list of TZ identifiers, see https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
36
- */
37
18
  setTimezone(timezone) {
38
19
  if (window.cefQuery) {
39
20
  const request = { message: JSON.stringify({ type: "setTimeZone", timezone }), waitForResponse: false, target: "UI-Streamer" };