senza-sdk 4.3.2-2e967be.0 → 4.3.2-f445d5d.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 +0 -21
- package/src/implementation/api.js +9 -14
- package/src/implementation/deviceManager.js +1 -20
- package/src/implementation/lifecycle.js +48 -57
- package/src/implementation/messageManager.js +0 -20
- package/src/implementation/remotePlayer.js +189 -70
- package/src/interface/remotePlayer.js +21 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "senza-sdk",
|
|
3
|
-
"version": "4.3.2-
|
|
3
|
+
"version": "4.3.2-f445d5d.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,27 +16,6 @@ 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() {
|
|
40
19
|
typeof document !== "undefined" && document.addEventListener("hs/alarmFiredEvent", async (e) => {
|
|
41
20
|
|
|
42
21
|
if (e.detail?.alarmName) {
|
|
@@ -2,17 +2,7 @@ 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";
|
|
8
5
|
|
|
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";
|
|
16
6
|
let authToken;
|
|
17
7
|
|
|
18
8
|
const API_VERSION = "1.0";
|
|
@@ -34,6 +24,8 @@ export const auth = {
|
|
|
34
24
|
|
|
35
25
|
};
|
|
36
26
|
|
|
27
|
+
import { remotePlayer } from "./remotePlayer.js";
|
|
28
|
+
export { remotePlayer };
|
|
37
29
|
|
|
38
30
|
/** Should be called once to init the library
|
|
39
31
|
*@example
|
|
@@ -131,10 +123,6 @@ export async function init(interfaceApiVersion, showSequenceFunc, initSequenceFu
|
|
|
131
123
|
// Initialize lifecycle first to make sure the state is updated.
|
|
132
124
|
await lifecycle._init(sessionInfoObj?.settings?.["ui-streamer"], triggerEvent);
|
|
133
125
|
await remotePlayer._init(sessionInfoObj?.settings?.["ui-streamer"], triggerEvent);
|
|
134
|
-
alarmManager._init();
|
|
135
|
-
deviceManager._init();
|
|
136
|
-
messageManager._init();
|
|
137
|
-
|
|
138
126
|
|
|
139
127
|
const devSequence = sessionInfoObj?.settings?.["ui-streamer"]?.devSequence;
|
|
140
128
|
if (devSequence) {
|
|
@@ -267,6 +255,13 @@ export function uiReady() {
|
|
|
267
255
|
}
|
|
268
256
|
}
|
|
269
257
|
|
|
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
|
+
|
|
270
265
|
import "./devHelper.js";
|
|
271
266
|
|
|
272
267
|
/**
|
|
@@ -43,27 +43,7 @@ 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
|
-
}
|
|
52
46
|
|
|
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() {
|
|
67
47
|
typeof document !== "undefined" && document.addEventListener("wifiSignalReport", (e) => {
|
|
68
48
|
wifiInfo.level = e.detail.level;
|
|
69
49
|
wifiInfo.quality = e.detail.quality;
|
|
@@ -71,6 +51,7 @@ class DeviceManager extends DeviceManagerInterface {
|
|
|
71
51
|
wifiInfo.bssid = e.detail.bssid;
|
|
72
52
|
this.dispatchEvent(new Event("wifiInfoUpdated"));
|
|
73
53
|
});
|
|
54
|
+
|
|
74
55
|
}
|
|
75
56
|
|
|
76
57
|
get deviceInfo() {
|
|
@@ -57,6 +57,53 @@ 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
|
+
});
|
|
60
107
|
}
|
|
61
108
|
|
|
62
109
|
/**
|
|
@@ -139,11 +186,6 @@ class Lifecycle extends LifecycleInterface {
|
|
|
139
186
|
this._triggerEventFcid = triggerEvent.fcid;
|
|
140
187
|
}
|
|
141
188
|
|
|
142
|
-
// Make sure that the event listeners are registered only once
|
|
143
|
-
if (!this._isInitialized) {
|
|
144
|
-
this._addSenzaEventListeners();
|
|
145
|
-
}
|
|
146
|
-
|
|
147
189
|
this._isInitialized = true;
|
|
148
190
|
this._remotePlayerConfirmationTimeout = uiStreamerSettings?.remotePlayerConfirmationTimeout ?? DEFAULT_REMOTE_PLAYER_CONFIRMATION_TIMEOUT;
|
|
149
191
|
this._remotePlayerApiVersion = uiStreamerSettings?.remotePlayerApiVersion || 1;
|
|
@@ -162,58 +204,6 @@ class Lifecycle extends LifecycleInterface {
|
|
|
162
204
|
}
|
|
163
205
|
}
|
|
164
206
|
|
|
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
207
|
/**
|
|
218
208
|
* @private Checks if auto background is enabled including overrides.
|
|
219
209
|
* @returns {boolean}
|
|
@@ -633,6 +623,7 @@ class Lifecycle extends LifecycleInterface {
|
|
|
633
623
|
}
|
|
634
624
|
|
|
635
625
|
// TODO: Need to discuss checking for a valid tenantId in the Senza platform
|
|
626
|
+
remotePlayer._blackoutTime = 0;
|
|
636
627
|
const contentHubTenantId = getPlatformInfo().sessionInfo?.homeSessionInfo?.tenantInfo?.contentHubTenantId;
|
|
637
628
|
const homeTenantId = getPlatformInfo().sessionInfo?.homeSessionInfo?.tenantId;
|
|
638
629
|
sdkLogger.log(`SwitchTenant for ${tenantId}`);
|
|
@@ -5,26 +5,6 @@ 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() {
|
|
28
8
|
typeof document !== "undefined" && document.addEventListener("hs/externalEvent", (e) => {
|
|
29
9
|
sdkLogger.log("Got hs/externalEvent", JSON.stringify(e.detail));
|
|
30
10
|
this.dispatchEvent(new CustomEvent("message", { detail: { eventName: e.detail.eventName, payload: e.detail.payload, fcid: e.detail.fcid } }));
|
|
@@ -140,78 +140,14 @@ 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
143
|
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
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
|
-
}
|
|
144
|
+
/**
|
|
145
|
+
* @type {string}
|
|
146
|
+
* @description the last set blackout time as epoch seconds.
|
|
147
|
+
* @private
|
|
148
|
+
*/
|
|
149
|
+
this._blackoutTime = 0;
|
|
210
150
|
|
|
211
|
-
/**
|
|
212
|
-
* @private Add event listeners for system events
|
|
213
|
-
*/
|
|
214
|
-
_addSenzaEventListeners() {
|
|
215
151
|
typeof document !== "undefined" && document.addEventListener("hs/remotePlayerEvent", (e) => {
|
|
216
152
|
sdkLogger.info("Got hs/remotePlayerEvent event with detail", JSON.stringify(e?.detail));
|
|
217
153
|
this.dispatchEvent(new Event(e?.detail?.eventName));
|
|
@@ -296,6 +232,65 @@ class RemotePlayer extends RemotePlayerInterface {
|
|
|
296
232
|
});
|
|
297
233
|
}
|
|
298
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);
|
|
292
|
+
}
|
|
293
|
+
|
|
299
294
|
/** @private update audio and text tracks
|
|
300
295
|
* @param {Object} playbackMetadata playback metadata that comes along the hs/playback event or trigger event
|
|
301
296
|
* */
|
|
@@ -756,6 +751,7 @@ class RemotePlayer extends RemotePlayerInterface {
|
|
|
756
751
|
this._abortSetAudioLanguage = true;
|
|
757
752
|
this._abortSetSubtitleLanguage = true;
|
|
758
753
|
this._abortSeeking = true;
|
|
754
|
+
this._blackoutTime = 0;
|
|
759
755
|
if (reset) {
|
|
760
756
|
this._reset();
|
|
761
757
|
}
|
|
@@ -1367,6 +1363,129 @@ class RemotePlayer extends RemotePlayerInterface {
|
|
|
1367
1363
|
}
|
|
1368
1364
|
}
|
|
1369
1365
|
|
|
1366
|
+
setBlackoutTime(date) {
|
|
1367
|
+
|
|
1368
|
+
if (!this._isInitialized) {
|
|
1369
|
+
throw new RemotePlayerError(6500, "Cannot call setBlackoutTime() if remote player is not initialized");
|
|
1370
|
+
}
|
|
1371
|
+
|
|
1372
|
+
if (this._loadMode !== this.LoadMode.LOADED) {
|
|
1373
|
+
throw new RemotePlayerError(6001, "Cannot call setBlackoutTime() if player is not loaded");
|
|
1374
|
+
}
|
|
1375
|
+
|
|
1376
|
+
if (!(date instanceof Date)) {
|
|
1377
|
+
throw new RemotePlayerError(6503, `date param must be a ${typeof new Date()} object but got ${typeof date}`);
|
|
1378
|
+
}
|
|
1379
|
+
|
|
1380
|
+
if (this._remotePlayerApiVersion < 2) {
|
|
1381
|
+
throw new RemotePlayerError(6504, `setBlackoutTime is not supported in remotePlayerApiVersion=${this._remotePlayerApiVersion}. remotePlayerApiVersion >= 2 required`);
|
|
1382
|
+
}
|
|
1383
|
+
|
|
1384
|
+
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);
|
|
1429
|
+
}
|
|
1430
|
+
|
|
1431
|
+
resetBlackoutTime() {
|
|
1432
|
+
if (!this._isInitialized) {
|
|
1433
|
+
throw new RemotePlayerError(6500, "Cannot call resetBlackoutTime() if remote player is not initialized");
|
|
1434
|
+
}
|
|
1435
|
+
|
|
1436
|
+
if (this._loadMode !== this.LoadMode.LOADED) {
|
|
1437
|
+
throw new RemotePlayerError(6001, "Cannot call resetBlackoutTime() if player is not loaded");
|
|
1438
|
+
}
|
|
1439
|
+
|
|
1440
|
+
if (this._remotePlayerApiVersion < 2) {
|
|
1441
|
+
throw new RemotePlayerError(6504, `resetBlackoutTime is not supported in remotePlayerApiVersion=${this._remotePlayerApiVersion}. remotePlayerApiVersion >= 2 required`);
|
|
1442
|
+
}
|
|
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);
|
|
1487
|
+
}
|
|
1488
|
+
|
|
1370
1489
|
/**
|
|
1371
1490
|
* Getter/Setter for currentTime
|
|
1372
1491
|
*/
|
|
@@ -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
|
+
setBlackoutTime(date) {
|
|
409
|
+
return noop("RemotePlayer.setBlackoutTime", 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
|
+
resetBlackoutTime() {
|
|
418
|
+
return noop("RemotePlayer.resetBlackoutTime");
|
|
419
|
+
}
|
|
420
|
+
|
|
400
421
|
/**
|
|
401
422
|
* Getter/Setter for currentTime
|
|
402
423
|
*/
|