senza-sdk 4.3.1 → 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",
3
+ "version": "4.3.2-2e967be.0",
4
4
  "main": "./src/api.js",
5
5
  "description": "API for Senza application",
6
6
  "license": "MIT",
@@ -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,7 +2,17 @@ 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";
@@ -24,8 +34,6 @@ export const auth = {
24
34
 
25
35
  };
26
36
 
27
- import { remotePlayer } from "./remotePlayer.js";
28
- export { remotePlayer };
29
37
 
30
38
  /** Should be called once to init the library
31
39
  *@example
@@ -123,6 +131,10 @@ export async function init(interfaceApiVersion, showSequenceFunc, initSequenceFu
123
131
  // Initialize lifecycle first to make sure the state is updated.
124
132
  await lifecycle._init(sessionInfoObj?.settings?.["ui-streamer"], triggerEvent);
125
133
  await remotePlayer._init(sessionInfoObj?.settings?.["ui-streamer"], triggerEvent);
134
+ alarmManager._init();
135
+ deviceManager._init();
136
+ messageManager._init();
137
+
126
138
 
127
139
  const devSequence = sessionInfoObj?.settings?.["ui-streamer"]?.devSequence;
128
140
  if (devSequence) {
@@ -255,13 +267,6 @@ export function uiReady() {
255
267
  }
256
268
  }
257
269
 
258
- export { lifecycle } from "./lifecycle.js";
259
- export { deviceManager } from "./deviceManager.js";
260
- export { platformManager } from "./platformManager.js";
261
- export { alarmManager };
262
- export { messageManager } from "./messageManager.js";
263
- export { SenzaShakaPlayer as ShakaPlayer, shaka } from "./senzaShakaPlayer.js";
264
-
265
270
  import "./devHelper.js";
266
271
 
267
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() {
@@ -57,53 +57,6 @@ class Lifecycle extends LifecycleInterface {
57
57
  * @private
58
58
  */
59
59
  this._autoBackgroundOnUIDelay = DEFAULT_AUTO_BACKGROUND_UI_DELAY;
60
-
61
- typeof document !== "undefined" && document.addEventListener("hs/uistatechange", (e) => {
62
- sdkLogger.log("Got hs/uistatechange", e.detail);
63
- const event = new Event("onstatechange");
64
- event.state = e.detail;
65
- this._state = event.state;
66
- if (this._isAutoBackgroundEnabled() && this.state === this.UiState.FOREGROUND) {
67
- this._startCountdown();
68
- }
69
- this.dispatchEvent(event);
70
- });
71
-
72
- typeof document !== "undefined" && document.addEventListener("hs/systemInactivity", (e) => {
73
- sdkLogger.log("Got hs/systemInactivity", e.detail);
74
- const event = new Event("userinactivity");
75
- event.timeout = e.detail.timeout;
76
- this.dispatchEvent(event);
77
- });
78
-
79
- typeof document !== "undefined" && document.addEventListener("hs/endOfSession", async () => {
80
- // Create the event
81
- const event = new Event("userdisconnected");
82
-
83
- // Use the event manager to dispatch the event and wait for all listeners
84
- await this._eventManager.dispatch("userdisconnected", event);
85
-
86
- this._sendTerminatingMessage();
87
- });
88
-
89
- typeof document !== "undefined" && document.addEventListener("keydown", () => {
90
- if (this._isAutoBackgroundEnabled()) {
91
- if (this.state === this.UiState.BACKGROUND ||
92
- this.state === this.UiState.IN_TRANSITION_TO_BACKGROUND) {
93
- this.moveToForeground();
94
- } else {
95
- this._startCountdown();
96
- }
97
- }
98
- });
99
-
100
- // Add playModeChange listener
101
- remotePlayer.addEventListener("playModeChange", (event) => {
102
- if (this._isAutoBackgroundEnabled() && this.state === this.UiState.FOREGROUND) {
103
- sdkLogger.log("Resetting auto background timer due to play mode change", event.detail.isPlaying);
104
- this._startCountdown(event.detail.isPlaying);
105
- }
106
- });
107
60
  }
108
61
 
109
62
  /**
@@ -186,6 +139,11 @@ class Lifecycle extends LifecycleInterface {
186
139
  this._triggerEventFcid = triggerEvent.fcid;
187
140
  }
188
141
 
142
+ // Make sure that the event listeners are registered only once
143
+ if (!this._isInitialized) {
144
+ this._addSenzaEventListeners();
145
+ }
146
+
189
147
  this._isInitialized = true;
190
148
  this._remotePlayerConfirmationTimeout = uiStreamerSettings?.remotePlayerConfirmationTimeout ?? DEFAULT_REMOTE_PLAYER_CONFIRMATION_TIMEOUT;
191
149
  this._remotePlayerApiVersion = uiStreamerSettings?.remotePlayerApiVersion || 1;
@@ -204,6 +162,58 @@ class Lifecycle extends LifecycleInterface {
204
162
  }
205
163
  }
206
164
 
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
+
207
217
  /**
208
218
  * @private Checks if auto background is enabled including overrides.
209
219
  * @returns {boolean}
@@ -5,6 +5,26 @@ class MessageManager extends MessageManagerInterface {
5
5
 
6
6
  constructor() {
7
7
  super();
8
+ /**
9
+ * @type {boolean}
10
+ * @private
11
+ */
12
+ this._isInitialized = false;
13
+ }
14
+ /**
15
+ * @private
16
+ */
17
+ _init() {
18
+ if (!this._isInitialized) {
19
+ this._isInitialized = true;
20
+ this._addSenzaEventListeners();
21
+ }
22
+ }
23
+
24
+ /**
25
+ * @private Add event listeners for system events
26
+ */
27
+ _addSenzaEventListeners() {
8
28
  typeof document !== "undefined" && document.addEventListener("hs/externalEvent", (e) => {
9
29
  sdkLogger.log("Got hs/externalEvent", JSON.stringify(e.detail));
10
30
  this.dispatchEvent(new CustomEvent("message", { detail: { eventName: e.detail.eventName, payload: e.detail.payload, fcid: e.detail.fcid } }));
@@ -140,7 +140,78 @@ class RemotePlayer extends RemotePlayerInterface {
140
140
  * @private
141
141
  */
142
142
  this._isPlaying = false;
143
+ }
144
+
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
+ if (!this._systemEventListenersAdded) {
150
+ this._systemEventListenersAdded = true;
151
+ }
152
+ let playerState = {
153
+ isLoaded: false,
154
+ playbackUrl: ""
155
+ };
156
+ if (window.cefQuery) {
157
+ const FCID = getFCID();
158
+ const logger = sdkLogger.withFields({ FCID });
159
+ const message = {
160
+ type: "playerState",
161
+ fcid: FCID
162
+ };
163
+ const request = { target: "UI-Streamer", waitForResponse: false, message: JSON.stringify(message) };
164
+ try {
165
+ const playerStateStr = await new Promise((resolve, reject) => {
166
+ window.cefQuery({
167
+ request: JSON.stringify(request),
168
+ persistent: false,
169
+ onSuccess: (playerState) => {
170
+ logger.log("playerState request successfully returned", playerState);
171
+ resolve(playerState);
172
+ },
173
+ onFailure: (code, msg) => {
174
+ logger.error(`playerState request failed: ${code} ${msg}`);
175
+ reject();
176
+ }
177
+ });
178
+ });
179
+ playerState = JSON.parse(playerStateStr);
180
+ } catch {
181
+ logger.error("either failed to get or failed to parse player state");
182
+ }
183
+ }
184
+ this._loadMode = playerState?.isLoaded ? this.LoadMode.LOADED : this.LoadMode.NOT_LOADED;
185
+
186
+ this._isPlaying = window?.sessionStorage?.getItem("senzaSdk_isPlaying") === "true";
187
+
188
+ sdkLogger.info(`RemotePlayer initialized with load mode: ${this._loadMode}, senzaSdk_isPlaying: ${this._isPlaying}`);
189
+ this._loadedUrl = playerState?.playbackUrl || "";
190
+ // Make sure that the event listeners are registered only once
191
+ if (!this._isInitialized) {
192
+ this._addSenzaEventListeners();
193
+ }
194
+ this._isInitialized = true;
195
+ this._remotePlayerConfirmationTimeout = uiStreamerSettings?.remotePlayerConfirmationTimeout ?? DEFAULT_REMOTE_PLAYER_CONFIRMATION_TIMEOUT;
196
+ this._remotePlayerApiVersion = uiStreamerSettings?.remotePlayerApiVersion || 1;
197
+ this._multiSeekDelay = uiStreamerSettings?.multiSeekDelay || MULTI_SEEK_DELAY_MSEC;
198
+
199
+ sdkLogger.info(`remotePLayer isPlaying=${this._isPlaying}`);
200
+
201
+ let playbackMetadata = {};
202
+ try {
203
+ playbackMetadata = JSON.parse(triggerEvent?.playbackMetadata || "{}");
204
+ } catch (e) {
205
+ sdkLogger.error(`failed to parse playbackMetadata: ${e.message}`);
206
+ }
207
+ this._availabilityStartTime = playbackMetadata.availabilityStartTime;
208
+ this._updateTracks(playbackMetadata);
209
+ }
143
210
 
211
+ /**
212
+ * @private Add event listeners for system events
213
+ */
214
+ _addSenzaEventListeners() {
144
215
  typeof document !== "undefined" && document.addEventListener("hs/remotePlayerEvent", (e) => {
145
216
  sdkLogger.info("Got hs/remotePlayerEvent event with detail", JSON.stringify(e?.detail));
146
217
  this.dispatchEvent(new Event(e?.detail?.eventName));
@@ -225,65 +296,6 @@ class RemotePlayer extends RemotePlayerInterface {
225
296
  });
226
297
  }
227
298
 
228
- /** @private Initialize the remote player
229
- * @param {Object} uiStreamerSettings ui-streamer portion of the settings taken from session info
230
- * */
231
- async _init(uiStreamerSettings, triggerEvent) {
232
- let playerState = {
233
- isLoaded: false,
234
- playbackUrl: ""
235
- };
236
- if (window.cefQuery) {
237
- const FCID = getFCID();
238
- const logger = sdkLogger.withFields({ FCID });
239
- const message = {
240
- type: "playerState",
241
- fcid: FCID
242
- };
243
- const request = { target: "UI-Streamer", waitForResponse: false, message: JSON.stringify(message) };
244
- try {
245
- const playerStateStr = await new Promise((resolve, reject) => {
246
- window.cefQuery({
247
- request: JSON.stringify(request),
248
- persistent: false,
249
- onSuccess: (playerState) => {
250
- logger.log("playerState request successfully returned", playerState);
251
- resolve(playerState);
252
- },
253
- onFailure: (code, msg) => {
254
- logger.error(`playerState request failed: ${code} ${msg}`);
255
- reject();
256
- }
257
- });
258
- });
259
- playerState = JSON.parse(playerStateStr);
260
- } catch {
261
- logger.error("either failed to get or failed to parse player state");
262
- }
263
- }
264
- this._loadMode = playerState?.isLoaded ? this.LoadMode.LOADED : this.LoadMode.NOT_LOADED;
265
-
266
- this._isPlaying = window?.sessionStorage?.getItem("senzaSdk_isPlaying") === "true";
267
-
268
- sdkLogger.info(`RemotePlayer initialized with load mode: ${this._loadMode}, senzaSdk_isPlaying: ${this._isPlaying}`);
269
- this._loadedUrl = playerState?.playbackUrl || "";
270
- this._isInitialized = true;
271
- this._remotePlayerConfirmationTimeout = uiStreamerSettings?.remotePlayerConfirmationTimeout ?? DEFAULT_REMOTE_PLAYER_CONFIRMATION_TIMEOUT;
272
- this._remotePlayerApiVersion = uiStreamerSettings?.remotePlayerApiVersion || 1;
273
- this._multiSeekDelay = uiStreamerSettings?.multiSeekDelay || MULTI_SEEK_DELAY_MSEC;
274
-
275
- sdkLogger.info(`remotePLayer isPlaying=${this._isPlaying}`);
276
-
277
- let playbackMetadata = {};
278
- try {
279
- playbackMetadata = JSON.parse(triggerEvent?.playbackMetadata || "{}");
280
- } catch (e) {
281
- sdkLogger.error(`failed to parse playbackMetadata: ${e.message}`);
282
- }
283
- this._availabilityStartTime = playbackMetadata.availabilityStartTime;
284
- this._updateTracks(playbackMetadata);
285
- }
286
-
287
299
  /** @private update audio and text tracks
288
300
  * @param {Object} playbackMetadata playback metadata that comes along the hs/playback event or trigger event
289
301
  * */