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/dist/bundle.js +1 -1
- package/package.json +1 -1
- package/src/implementation/alarmManager.js +21 -0
- package/src/implementation/api.js +14 -9
- package/src/implementation/deviceManager.js +20 -1
- package/src/implementation/lifecycle.js +57 -47
- package/src/implementation/messageManager.js +20 -0
- package/src/implementation/remotePlayer.js +71 -59
- package/dist/implementation.bundle.js +0 -2
- package/dist/implementation.bundle.js.LICENSE.txt +0 -57
package/package.json
CHANGED
|
@@ -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
|
* */
|