senza-sdk 4.3.1 → 4.3.2-3c99350.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 +4 -4
- package/src/implementation/alarmManager.js +23 -0
- package/src/implementation/api.js +15 -9
- package/src/implementation/deviceManager.js +22 -1
- package/src/implementation/lifecycle.js +59 -47
- package/src/implementation/messageManager.js +22 -0
- package/src/implementation/remotePlayer.js +155 -59
- package/src/interface/remotePlayer.js +21 -0
- package/dist/implementation.bundle.js +0 -2
- package/dist/implementation.bundle.js.LICENSE.txt +0 -57
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "senza-sdk",
|
|
3
|
-
"version": "4.3.
|
|
3
|
+
"version": "4.3.2-3c99350.0",
|
|
4
4
|
"main": "./src/api.js",
|
|
5
5
|
"description": "API for Senza application",
|
|
6
6
|
"license": "MIT",
|
|
@@ -51,9 +51,9 @@
|
|
|
51
51
|
},
|
|
52
52
|
"src/interface": {
|
|
53
53
|
"branches": 68.42,
|
|
54
|
-
"functions": 40
|
|
55
|
-
"lines": 65.
|
|
56
|
-
"statements":
|
|
54
|
+
"functions": 40,
|
|
55
|
+
"lines": 65.28,
|
|
56
|
+
"statements": 65.65
|
|
57
57
|
}
|
|
58
58
|
}
|
|
59
59
|
},
|
|
@@ -16,6 +16,28 @@ 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
|
+
sdkLogger.log("Initializing AlarmManager");
|
|
31
|
+
if (!this._isInitialized) {
|
|
32
|
+
this._isInitialized = true;
|
|
33
|
+
this._addSenzaEventListeners();
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* @private Add event listeners for system events
|
|
39
|
+
*/
|
|
40
|
+
_addSenzaEventListeners() {
|
|
19
41
|
typeof document !== "undefined" && document.addEventListener("hs/alarmFiredEvent", async (e) => {
|
|
20
42
|
|
|
21
43
|
if (e.detail?.alarmName) {
|
|
@@ -73,6 +95,7 @@ class AlarmManager extends AlarmManagerInterface {
|
|
|
73
95
|
}
|
|
74
96
|
}
|
|
75
97
|
);
|
|
98
|
+
sdkLogger.log("[AlarmManager] Added event listeners for system events");
|
|
76
99
|
}
|
|
77
100
|
|
|
78
101
|
/**
|
|
@@ -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,11 @@ 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
|
+
sdkLogger.log("All submodules initialized");
|
|
138
|
+
|
|
126
139
|
|
|
127
140
|
const devSequence = sessionInfoObj?.settings?.["ui-streamer"]?.devSequence;
|
|
128
141
|
if (devSequence) {
|
|
@@ -255,13 +268,6 @@ export function uiReady() {
|
|
|
255
268
|
}
|
|
256
269
|
}
|
|
257
270
|
|
|
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
271
|
import "./devHelper.js";
|
|
266
272
|
|
|
267
273
|
/**
|
|
@@ -43,7 +43,28 @@ 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
|
+
sdkLogger.log("Initializing DeviceManager");
|
|
58
|
+
if (!this._isInitialized) {
|
|
59
|
+
this._isInitialized = true;
|
|
60
|
+
this._addSenzaEventListeners();
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* @private Add event listeners for system events
|
|
66
|
+
*/
|
|
67
|
+
_addSenzaEventListeners() {
|
|
47
68
|
typeof document !== "undefined" && document.addEventListener("wifiSignalReport", (e) => {
|
|
48
69
|
wifiInfo.level = e.detail.level;
|
|
49
70
|
wifiInfo.quality = e.detail.quality;
|
|
@@ -51,7 +72,7 @@ class DeviceManager extends DeviceManagerInterface {
|
|
|
51
72
|
wifiInfo.bssid = e.detail.bssid;
|
|
52
73
|
this.dispatchEvent(new Event("wifiInfoUpdated"));
|
|
53
74
|
});
|
|
54
|
-
|
|
75
|
+
sdkLogger.log("[DeviceManager] Added event listeners for system events");
|
|
55
76
|
}
|
|
56
77
|
|
|
57
78
|
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
|
/**
|
|
@@ -118,6 +71,7 @@ class Lifecycle extends LifecycleInterface {
|
|
|
118
71
|
* @param {number} [uiStreamerSettings.remotePlayerApiVersion=1] - Remote player API version
|
|
119
72
|
*/
|
|
120
73
|
async _init(uiStreamerSettings, triggerEvent) {
|
|
74
|
+
sdkLogger.log("Initializing Lifecycle");
|
|
121
75
|
if (window.cefQuery) {
|
|
122
76
|
|
|
123
77
|
// Get UI state
|
|
@@ -186,6 +140,11 @@ class Lifecycle extends LifecycleInterface {
|
|
|
186
140
|
this._triggerEventFcid = triggerEvent.fcid;
|
|
187
141
|
}
|
|
188
142
|
|
|
143
|
+
// Make sure that the event listeners are registered only once
|
|
144
|
+
if (!this._isInitialized) {
|
|
145
|
+
this._addSenzaEventListeners();
|
|
146
|
+
}
|
|
147
|
+
|
|
189
148
|
this._isInitialized = true;
|
|
190
149
|
this._remotePlayerConfirmationTimeout = uiStreamerSettings?.remotePlayerConfirmationTimeout ?? DEFAULT_REMOTE_PLAYER_CONFIRMATION_TIMEOUT;
|
|
191
150
|
this._remotePlayerApiVersion = uiStreamerSettings?.remotePlayerApiVersion || 1;
|
|
@@ -204,6 +163,59 @@ class Lifecycle extends LifecycleInterface {
|
|
|
204
163
|
}
|
|
205
164
|
}
|
|
206
165
|
|
|
166
|
+
/**
|
|
167
|
+
* @private Add event listeners for system events
|
|
168
|
+
*/
|
|
169
|
+
_addSenzaEventListeners() {
|
|
170
|
+
typeof document !== "undefined" && document.addEventListener("hs/uistatechange", (e) => {
|
|
171
|
+
sdkLogger.log("Got hs/uistatechange", e.detail);
|
|
172
|
+
const event = new Event("onstatechange");
|
|
173
|
+
event.state = e.detail;
|
|
174
|
+
this._state = event.state;
|
|
175
|
+
if (this._isAutoBackgroundEnabled() && this.state === this.UiState.FOREGROUND) {
|
|
176
|
+
this._startCountdown();
|
|
177
|
+
}
|
|
178
|
+
this.dispatchEvent(event);
|
|
179
|
+
});
|
|
180
|
+
|
|
181
|
+
typeof document !== "undefined" && document.addEventListener("hs/systemInactivity", (e) => {
|
|
182
|
+
sdkLogger.log("Got hs/systemInactivity", e.detail);
|
|
183
|
+
const event = new Event("userinactivity");
|
|
184
|
+
event.timeout = e.detail.timeout;
|
|
185
|
+
this.dispatchEvent(event);
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
typeof document !== "undefined" && document.addEventListener("hs/endOfSession", async () => {
|
|
189
|
+
// Create the event
|
|
190
|
+
const event = new Event("userdisconnected");
|
|
191
|
+
|
|
192
|
+
// Use the event manager to dispatch the event and wait for all listeners
|
|
193
|
+
await this._eventManager.dispatch("userdisconnected", event);
|
|
194
|
+
|
|
195
|
+
this._sendTerminatingMessage();
|
|
196
|
+
});
|
|
197
|
+
|
|
198
|
+
typeof document !== "undefined" && document.addEventListener("keydown", () => {
|
|
199
|
+
if (this._isAutoBackgroundEnabled()) {
|
|
200
|
+
if (this.state === this.UiState.BACKGROUND ||
|
|
201
|
+
this.state === this.UiState.IN_TRANSITION_TO_BACKGROUND) {
|
|
202
|
+
this.moveToForeground();
|
|
203
|
+
} else {
|
|
204
|
+
this._startCountdown();
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
});
|
|
208
|
+
|
|
209
|
+
// Add playModeChange listener
|
|
210
|
+
remotePlayer.addEventListener("playModeChange", (event) => {
|
|
211
|
+
if (this._isAutoBackgroundEnabled() && this.state === this.UiState.FOREGROUND) {
|
|
212
|
+
sdkLogger.log("Resetting auto background timer due to play mode change", event.detail.isPlaying);
|
|
213
|
+
this._startCountdown(event.detail.isPlaying);
|
|
214
|
+
}
|
|
215
|
+
});
|
|
216
|
+
sdkLogger.log("[Lifecycle] Added event listeners for system events");
|
|
217
|
+
}
|
|
218
|
+
|
|
207
219
|
/**
|
|
208
220
|
* @private Checks if auto background is enabled including overrides.
|
|
209
221
|
* @returns {boolean}
|
|
@@ -5,10 +5,32 @@ 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
|
+
sdkLogger.log("Initializing MessageManager");
|
|
19
|
+
if (!this._isInitialized) {
|
|
20
|
+
this._isInitialized = true;
|
|
21
|
+
this._addSenzaEventListeners();
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* @private Add event listeners for system events
|
|
27
|
+
*/
|
|
28
|
+
_addSenzaEventListeners() {
|
|
8
29
|
typeof document !== "undefined" && document.addEventListener("hs/externalEvent", (e) => {
|
|
9
30
|
sdkLogger.log("Got hs/externalEvent", JSON.stringify(e.detail));
|
|
10
31
|
this.dispatchEvent(new CustomEvent("message", { detail: { eventName: e.detail.eventName, payload: e.detail.payload, fcid: e.detail.fcid } }));
|
|
11
32
|
});
|
|
33
|
+
sdkLogger.log("[MessageManager] Added event listeners for system events");
|
|
12
34
|
}
|
|
13
35
|
|
|
14
36
|
async registerGroups(groups) {
|
|
@@ -140,6 +140,76 @@ 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
|
+
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() {
|
|
143
213
|
|
|
144
214
|
typeof document !== "undefined" && document.addEventListener("hs/remotePlayerEvent", (e) => {
|
|
145
215
|
sdkLogger.info("Got hs/remotePlayerEvent event with detail", JSON.stringify(e?.detail));
|
|
@@ -223,65 +293,7 @@ class RemotePlayer extends RemotePlayerInterface {
|
|
|
223
293
|
};
|
|
224
294
|
this.dispatchEvent(licenseRequestEvent);
|
|
225
295
|
});
|
|
226
|
-
|
|
227
|
-
|
|
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);
|
|
296
|
+
sdkLogger.log("[RemotePlayer] Added event listeners for system events");
|
|
285
297
|
}
|
|
286
298
|
|
|
287
299
|
/** @private update audio and text tracks
|
|
@@ -1355,6 +1367,43 @@ class RemotePlayer extends RemotePlayerInterface {
|
|
|
1355
1367
|
}
|
|
1356
1368
|
}
|
|
1357
1369
|
|
|
1370
|
+
setScreenBlackout(date) {
|
|
1371
|
+
|
|
1372
|
+
if (!this._isInitialized) {
|
|
1373
|
+
throw new RemotePlayerError(6500, "Cannot call setScreenBlackout() if remote player is not initialized");
|
|
1374
|
+
}
|
|
1375
|
+
|
|
1376
|
+
if (this._loadMode !== this.LoadMode.LOADED) {
|
|
1377
|
+
throw new RemotePlayerError(6001, "Cannot call setScreenBlackout() if player is not loaded");
|
|
1378
|
+
}
|
|
1379
|
+
|
|
1380
|
+
if (!(date instanceof Date)) {
|
|
1381
|
+
throw new RemotePlayerError(6503, `date param must be a ${typeof new Date()} object but got ${typeof date}`);
|
|
1382
|
+
}
|
|
1383
|
+
|
|
1384
|
+
if (this._remotePlayerApiVersion < 2) {
|
|
1385
|
+
throw new RemotePlayerError(6504, `setScreenBlackout is not supported in remotePlayerApiVersion=${this._remotePlayerApiVersion}. remotePlayerApiVersion >= 2 required`);
|
|
1386
|
+
}
|
|
1387
|
+
|
|
1388
|
+
const blackoutTime = (date.getTime()/1000).toFixed(2);
|
|
1389
|
+
return this._setScreenBlackout(blackoutTime);
|
|
1390
|
+
}
|
|
1391
|
+
|
|
1392
|
+
resetScreenBlackout() {
|
|
1393
|
+
if (!this._isInitialized) {
|
|
1394
|
+
throw new RemotePlayerError(6500, "Cannot call resetScreenBlackout() if remote player is not initialized");
|
|
1395
|
+
}
|
|
1396
|
+
|
|
1397
|
+
if (this._loadMode !== this.LoadMode.LOADED) {
|
|
1398
|
+
throw new RemotePlayerError(6001, "Cannot call resetScreenBlackout() if player is not loaded");
|
|
1399
|
+
}
|
|
1400
|
+
|
|
1401
|
+
if (this._remotePlayerApiVersion < 2) {
|
|
1402
|
+
throw new RemotePlayerError(6504, `resetScreenBlackout is not supported in remotePlayerApiVersion=${this._remotePlayerApiVersion}. remotePlayerApiVersion >= 2 required`);
|
|
1403
|
+
}
|
|
1404
|
+
return this._setScreenBlackout(0);
|
|
1405
|
+
}
|
|
1406
|
+
|
|
1358
1407
|
/**
|
|
1359
1408
|
* Getter/Setter for currentTime
|
|
1360
1409
|
*/
|
|
@@ -1706,6 +1755,53 @@ class RemotePlayer extends RemotePlayerInterface {
|
|
|
1706
1755
|
sdkLogger.log(`remotePlayer _atomicSetSubtitleLanguage: textTrackId=${textTrackId} ended.`);
|
|
1707
1756
|
return setLanguageError ? Promise.reject(setLanguageError) : Promise.resolve();
|
|
1708
1757
|
}
|
|
1758
|
+
|
|
1759
|
+
_setScreenBlackout(blackoutTime) {
|
|
1760
|
+
const functionName = blackoutTime === 0 ? "resetScreenBlackout" : "setScreenBlackout";
|
|
1761
|
+
if (window.cefQuery) {
|
|
1762
|
+
const FCID = getFCID();
|
|
1763
|
+
const logger = sdkLogger.withFields({ FCID });
|
|
1764
|
+
logger.log(`remotePlayer ${functionName}: sending screenBlackout action at ${blackoutTime}`);
|
|
1765
|
+
const message = {
|
|
1766
|
+
type: "remotePlayer.screenBlackout",
|
|
1767
|
+
class: "remotePlayer",
|
|
1768
|
+
action: "screenBlackout",
|
|
1769
|
+
fcid: FCID,
|
|
1770
|
+
blackoutTime
|
|
1771
|
+
};
|
|
1772
|
+
const request = { target: "TC", waitForResponse: true, message: JSON.stringify(message) };
|
|
1773
|
+
return new Promise((resolve, reject) => {
|
|
1774
|
+
let timerId = 0;
|
|
1775
|
+
const timeBeforeSendingRequest = Date.now();
|
|
1776
|
+
const queryId = window.cefQuery({
|
|
1777
|
+
request: JSON.stringify(request),
|
|
1778
|
+
persistent: false,
|
|
1779
|
+
onSuccess: () => {
|
|
1780
|
+
const duration = Date.now() - timeBeforeSendingRequest;
|
|
1781
|
+
logger.withFields({ duration }).log(`setBlackoutTime completed successfully after ${duration} ms`);
|
|
1782
|
+
timerId = clearTimer(timerId);
|
|
1783
|
+
resolve();
|
|
1784
|
+
},
|
|
1785
|
+
onFailure: (code, msg) => {
|
|
1786
|
+
const duration = Date.now() - timeBeforeSendingRequest;
|
|
1787
|
+
logger.withFields({ duration }).log(`setBlackoutTime failed after ${duration} ms. Error code: ${code}, error message: ${msg}`);
|
|
1788
|
+
timerId = clearTimer(timerId);
|
|
1789
|
+
reject(new RemotePlayerError(code, msg));
|
|
1790
|
+
}
|
|
1791
|
+
});
|
|
1792
|
+
|
|
1793
|
+
logger.log(`window.cefQuery for ${functionName} returned query id ${queryId}`);
|
|
1794
|
+
const timeout = this._remotePlayerConfirmationTimeout + 1000;
|
|
1795
|
+
timerId = setTimeout(() => {
|
|
1796
|
+
logger.log(`${functionName} reached timeout of ${timeout} ms, canceling query id ${queryId}`);
|
|
1797
|
+
window.cefQueryCancel(queryId);
|
|
1798
|
+
reject(new RemotePlayerError(6000, `${functionName} reached timeout of ${timeout} ms`));
|
|
1799
|
+
}, timeout, queryId);
|
|
1800
|
+
});
|
|
1801
|
+
}
|
|
1802
|
+
sdkLogger.error(`remotePlayer ${functionName}: window.cefQuery is undefined`);
|
|
1803
|
+
return Promise.resolve(undefined);
|
|
1804
|
+
}
|
|
1709
1805
|
}
|
|
1710
1806
|
/**
|
|
1711
1807
|
*
|
|
@@ -116,6 +116,8 @@ export class RemotePlayerError extends Error {
|
|
|
116
116
|
* | 6500 | Player | remotePlayer api was called before initializing remotePlayer |
|
|
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
|
+
* | 6503 | Player | The remote player api call has invalid parameters |
|
|
120
|
+
* | 6504 | Player | The remote player api call has invalid api version |
|
|
119
121
|
* | 8001 | Player | Error pulling manifest. bad parameters |
|
|
120
122
|
* | 8002 | Player | Error pulling manifest. filters returned no data |
|
|
121
123
|
* | 8003 | Player | Error pulling manifest. fetch error |
|
|
@@ -397,6 +399,25 @@ class RemotePlayer extends EventTarget {
|
|
|
397
399
|
return noop("RemotePlayer.setTextTrackVisibility", visible);
|
|
398
400
|
}
|
|
399
401
|
|
|
402
|
+
/**
|
|
403
|
+
*
|
|
404
|
+
* @param {Date} date
|
|
405
|
+
* @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
|
|
407
|
+
*/
|
|
408
|
+
setScreenBlackout(date) {
|
|
409
|
+
return noop("RemotePlayer.setScreenBlackout", date);
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
/**
|
|
413
|
+
*
|
|
414
|
+
* @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
|
|
416
|
+
*/
|
|
417
|
+
resetScreenBlackout() {
|
|
418
|
+
return noop("RemotePlayer.resetScreenBlackout");
|
|
419
|
+
}
|
|
420
|
+
|
|
400
421
|
/**
|
|
401
422
|
* Getter/Setter for currentTime
|
|
402
423
|
*/
|