@reveldigital/player-client 1.0.0 → 1.0.2
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/esm2020/lib/app-init.service.mjs +5 -2
- package/esm2020/lib/player-client.service.mjs +126 -7
- package/esm2020/lib/safe-style.pipe.mjs +8 -1
- package/fesm2015/reveldigital-player-client.mjs +136 -7
- package/fesm2015/reveldigital-player-client.mjs.map +1 -1
- package/fesm2020/reveldigital-player-client.mjs +136 -7
- package/fesm2020/reveldigital-player-client.mjs.map +1 -1
- package/lib/app-init.service.d.ts +1 -0
- package/lib/app-init.service.d.ts.map +1 -1
- package/lib/player-client.service.d.ts +130 -0
- package/lib/player-client.service.d.ts.map +1 -1
- package/lib/safe-style.pipe.d.ts +7 -0
- package/lib/safe-style.pipe.d.ts.map +1 -1
- package/package.json +1 -1
- package/schematics/ng-add/assets/user-prefs.yml +5 -1
- package/schematics/ng-add/utils/yml2xml.js +27 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { __awaiter } from 'tslib';
|
|
2
2
|
import * as i0 from '@angular/core';
|
|
3
|
-
import { Injectable, isDevMode, Pipe, NgModule, APP_INITIALIZER, LOCALE_ID } from '@angular/core';
|
|
3
|
+
import { Injectable, enableProdMode, isDevMode, Pipe, NgModule, APP_INITIALIZER, LOCALE_ID } from '@angular/core';
|
|
4
4
|
import { Subject, BehaviorSubject, fromEvent } from 'rxjs';
|
|
5
5
|
import { share, tap, map } from 'rxjs/operators';
|
|
6
6
|
import * as yaml from 'js-yaml';
|
|
@@ -23,13 +23,29 @@ class PlayerClientService {
|
|
|
23
23
|
// share(),
|
|
24
24
|
// tap(this.onCommand$)
|
|
25
25
|
// );
|
|
26
|
+
/** @ignore */
|
|
26
27
|
constructor(zone) {
|
|
28
|
+
/**
|
|
29
|
+
* Commands sent to this player.
|
|
30
|
+
*/
|
|
27
31
|
this.onCommand$ = new Subject();
|
|
32
|
+
/**
|
|
33
|
+
* Signals the gadget has been loaded and is ready to start.
|
|
34
|
+
*/
|
|
28
35
|
this.onReady$ = new BehaviorSubject(false);
|
|
36
|
+
/**
|
|
37
|
+
* Signals the gadget has been started by the player.
|
|
38
|
+
*/
|
|
29
39
|
this.onStart$ = new Subject();
|
|
40
|
+
/**
|
|
41
|
+
* Signals the gadgets has been stopped by the player.
|
|
42
|
+
*/
|
|
30
43
|
this.onStop$ = new Subject();
|
|
44
|
+
/** @ignore */
|
|
31
45
|
this.onStartEvt$ = fromEvent(document, 'RevelDigital.Start').pipe(share(), tap(this.onStart$));
|
|
46
|
+
/** @ignore */
|
|
32
47
|
this.onStopEvt$ = fromEvent(document, 'RevelDigital.Stop').pipe(share(), tap(this.onStop$));
|
|
48
|
+
/** @ignore */
|
|
33
49
|
this.onCommandEvt$ = fromEvent(document, 'RevelDigital.Command').pipe(map((e) => { return { name: e.detail.name, arg: e.detail.arg }; }), share(), tap(this.onCommand$));
|
|
34
50
|
let self = this;
|
|
35
51
|
window.RevelDigital = {
|
|
@@ -57,6 +73,7 @@ class PlayerClientService {
|
|
|
57
73
|
this.clientPromise = null;
|
|
58
74
|
this.onReady$.next(true);
|
|
59
75
|
}
|
|
76
|
+
/** @ignore */
|
|
60
77
|
ngOnDestroy() {
|
|
61
78
|
var _a, _b, _c;
|
|
62
79
|
(_a = this.onStartSub) === null || _a === void 0 ? void 0 : _a.unsubscribe();
|
|
@@ -64,9 +81,20 @@ class PlayerClientService {
|
|
|
64
81
|
(_c = this.onCommandSub) === null || _c === void 0 ? void 0 : _c.unsubscribe();
|
|
65
82
|
this.onReady$.next(false);
|
|
66
83
|
}
|
|
84
|
+
/** @ignore */
|
|
67
85
|
static init(data) {
|
|
68
86
|
console.log('%c⚙️ Initializing Revel Digital client library', 'background-color:blue; color:yellow;');
|
|
69
87
|
}
|
|
88
|
+
/**
|
|
89
|
+
* This method allows the gadget to communicate with player scripting.
|
|
90
|
+
* If the appropriate scripting is in place in the currently running template, calling this method
|
|
91
|
+
* will initiate a callback which can be acted upon in player script.
|
|
92
|
+
*
|
|
93
|
+
* @example
|
|
94
|
+
* client.callback('test', 'this');
|
|
95
|
+
*
|
|
96
|
+
* @param args variable number of arguments
|
|
97
|
+
*/
|
|
70
98
|
callback(...args) {
|
|
71
99
|
this.getClient().then((client) => {
|
|
72
100
|
switch (args.length) {
|
|
@@ -91,9 +119,28 @@ class PlayerClientService {
|
|
|
91
119
|
}
|
|
92
120
|
});
|
|
93
121
|
}
|
|
122
|
+
/**
|
|
123
|
+
* Accessor method for the user preferences interface exposed by the Gadgets API.
|
|
124
|
+
*
|
|
125
|
+
* See {@link https://developers.google.com/gadgets/docs/basic} for more details on the Gadgets API.
|
|
126
|
+
*
|
|
127
|
+
* @example
|
|
128
|
+
* constructor(public client: PlayerClientService) {
|
|
129
|
+
* let prefs = client.getPrefs();
|
|
130
|
+
* let myString = prefs.getString('myStringPref');
|
|
131
|
+
* }
|
|
132
|
+
* @returns {gadgets.Prefs} Gadget API Prefs object
|
|
133
|
+
*/
|
|
94
134
|
getPrefs() {
|
|
95
135
|
return new window['gadgets']['Prefs']();
|
|
96
136
|
}
|
|
137
|
+
/**
|
|
138
|
+
* Returns the current device time in ISO8601 format.
|
|
139
|
+
* Current device time is determined by the device timezone assigned to the device in the CMS.
|
|
140
|
+
*
|
|
141
|
+
* @param date Optional. If supplied will translate the supplied date/time to device time based on respective timezones.
|
|
142
|
+
* @returns Date/time in ISO8601 format
|
|
143
|
+
*/
|
|
97
144
|
getDeviceTime(date) {
|
|
98
145
|
return __awaiter(this, void 0, void 0, function* () {
|
|
99
146
|
const client = yield this.getClient();
|
|
@@ -103,56 +150,118 @@ class PlayerClientService {
|
|
|
103
150
|
return client.getDeviceTime();
|
|
104
151
|
});
|
|
105
152
|
}
|
|
153
|
+
/**
|
|
154
|
+
* Returns the timezone name currently assigned to the device.
|
|
155
|
+
*
|
|
156
|
+
* @returns Timezone Name
|
|
157
|
+
*/
|
|
106
158
|
getDeviceTimeZoneName() {
|
|
107
159
|
return __awaiter(this, void 0, void 0, function* () {
|
|
108
160
|
const client = yield this.getClient();
|
|
109
161
|
return client.getDeviceTimeZoneName();
|
|
110
162
|
});
|
|
111
163
|
}
|
|
164
|
+
/**
|
|
165
|
+
* Returns the timezone ID currently assigned to the device.
|
|
166
|
+
*
|
|
167
|
+
* @returns Timezone ID
|
|
168
|
+
*/
|
|
112
169
|
getDeviceTimeZoneID() {
|
|
113
170
|
return __awaiter(this, void 0, void 0, function* () {
|
|
114
171
|
const client = yield this.getClient();
|
|
115
172
|
return client.getDeviceTimeZoneID();
|
|
116
173
|
});
|
|
117
174
|
}
|
|
175
|
+
/**
|
|
176
|
+
* Returns the numerical offset from GMT of the timezone currently assigned to the device.
|
|
177
|
+
*
|
|
178
|
+
* @returns Timezone offset
|
|
179
|
+
*/
|
|
118
180
|
getDeviceTimeZoneOffset() {
|
|
119
181
|
return __awaiter(this, void 0, void 0, function* () {
|
|
120
182
|
const client = yield this.getClient();
|
|
121
183
|
return client.getDeviceTimeZoneOffset();
|
|
122
184
|
});
|
|
123
185
|
}
|
|
186
|
+
/**
|
|
187
|
+
* Returns the language code of the language currently assigned to the device.
|
|
188
|
+
*
|
|
189
|
+
* @returns Language code
|
|
190
|
+
*/
|
|
124
191
|
getLanguageCode() {
|
|
125
192
|
return __awaiter(this, void 0, void 0, function* () {
|
|
126
193
|
const client = yield this.getClient();
|
|
127
194
|
return client.getLanguageCode();
|
|
128
195
|
});
|
|
129
196
|
}
|
|
197
|
+
/**
|
|
198
|
+
* Returns the unique Revel Digital device key associated with the device.
|
|
199
|
+
*
|
|
200
|
+
* @returns Device key
|
|
201
|
+
*/
|
|
130
202
|
getDeviceKey() {
|
|
131
203
|
return __awaiter(this, void 0, void 0, function* () {
|
|
132
204
|
const client = yield this.getClient();
|
|
133
205
|
return client.getDeviceKey();
|
|
134
206
|
});
|
|
135
207
|
}
|
|
208
|
+
/**
|
|
209
|
+
* Send a command to the player device.
|
|
210
|
+
*
|
|
211
|
+
* @param name Command name
|
|
212
|
+
* @param arg Command argument
|
|
213
|
+
*/
|
|
136
214
|
sendCommand(name, arg) {
|
|
137
215
|
this.getClient().then((client) => {
|
|
138
216
|
client.sendCommand(name, arg);
|
|
139
217
|
});
|
|
140
218
|
}
|
|
219
|
+
/**
|
|
220
|
+
* Send a command to any remote player with the supplied device key(s).
|
|
221
|
+
* Note: Remote commands can only be delivered to devices within the same account as the sender device.
|
|
222
|
+
*
|
|
223
|
+
* @param deviceKeys Array of remote device keys
|
|
224
|
+
* @param name Command name
|
|
225
|
+
* @param arg Command arg
|
|
226
|
+
*/
|
|
141
227
|
sendRemoteCommand(deviceKeys, name, arg) {
|
|
142
228
|
this.getClient().then((client) => {
|
|
143
229
|
client.sendRemoteCommand(deviceKeys, name, arg);
|
|
144
230
|
});
|
|
145
231
|
}
|
|
232
|
+
/**
|
|
233
|
+
* Log an event for use with AdHawk analytics.
|
|
234
|
+
* Events are used for tracking various metrics including usage statistics, player condition, state changes, etc.
|
|
235
|
+
*
|
|
236
|
+
* @param eventName Unique name for this event
|
|
237
|
+
* @param properties A map of user defined properties to associate with this event
|
|
238
|
+
*/
|
|
146
239
|
track(eventName, properties) {
|
|
147
240
|
this.getClient().then((client) => {
|
|
148
241
|
client.track(eventName, JSON.stringify(properties));
|
|
149
242
|
});
|
|
150
243
|
}
|
|
244
|
+
/**
|
|
245
|
+
* Method for initiating a timed event.
|
|
246
|
+
* Timed events are useful for tracking the duration of an event and must be proceeded with a call to track().
|
|
247
|
+
*
|
|
248
|
+
* @example
|
|
249
|
+
* client.timeEvent('testEvent');
|
|
250
|
+
* client.track("test", { "a": "b" });
|
|
251
|
+
* @param eventName Unique name for this event
|
|
252
|
+
*/
|
|
151
253
|
timeEvent(eventName) {
|
|
152
254
|
this.getClient().then((client) => {
|
|
153
255
|
client.timeEvent(eventName);
|
|
154
256
|
});
|
|
155
257
|
}
|
|
258
|
+
/**
|
|
259
|
+
* A session is a way of grouping events together. Each event has an associated session ID.
|
|
260
|
+
* Session ID's are randomly generated and reset by subsequent calls to newEventSession().
|
|
261
|
+
*
|
|
262
|
+
* Each call to track() will utilize the same session ID, until another call to newEventSession().
|
|
263
|
+
* @param id Optional. User supplied session ID. If not supplied a random session ID will be generated.
|
|
264
|
+
*/
|
|
156
265
|
newEventSession(id) {
|
|
157
266
|
this.getClient().then((client) => {
|
|
158
267
|
if (id !== undefined) {
|
|
@@ -163,24 +272,32 @@ class PlayerClientService {
|
|
|
163
272
|
}
|
|
164
273
|
});
|
|
165
274
|
}
|
|
275
|
+
/**
|
|
276
|
+
* Returns the root folder utilized by this player device.
|
|
277
|
+
*
|
|
278
|
+
* @returns Path to the root folder
|
|
279
|
+
*/
|
|
166
280
|
getRevelRoot() {
|
|
167
281
|
return __awaiter(this, void 0, void 0, function* () {
|
|
168
282
|
const client = yield this.getClient();
|
|
169
283
|
return client.getRevelRoot();
|
|
170
284
|
});
|
|
171
285
|
}
|
|
286
|
+
/**
|
|
287
|
+
* Returns a map of commands currently active for this device.
|
|
288
|
+
*
|
|
289
|
+
* @returns Map of commands currently active for this device.
|
|
290
|
+
*/
|
|
172
291
|
getCommandMap() {
|
|
173
292
|
return __awaiter(this, void 0, void 0, function* () {
|
|
174
293
|
const client = yield this.getClient();
|
|
175
294
|
return JSON.parse(yield client.getCommandMap());
|
|
176
|
-
// let map = new Map<string, any>();
|
|
177
|
-
// let obj = JSON.parse(await client.getCommandMap());
|
|
178
|
-
// for (let key in obj) {
|
|
179
|
-
// map.set(key, obj[key]);
|
|
180
|
-
// }
|
|
181
|
-
// return map;
|
|
182
295
|
});
|
|
183
296
|
}
|
|
297
|
+
/**
|
|
298
|
+
* Indicate to the player that this gadget has finished it's visualization.
|
|
299
|
+
* This allows the player to proceed with the next item in a playlist if applicable.
|
|
300
|
+
*/
|
|
184
301
|
finish() {
|
|
185
302
|
this.getClient().then((client) => {
|
|
186
303
|
client.finish();
|
|
@@ -189,6 +306,7 @@ class PlayerClientService {
|
|
|
189
306
|
// ---
|
|
190
307
|
// PRIVATE METHODS.
|
|
191
308
|
// ---
|
|
309
|
+
/** @ignore */
|
|
192
310
|
getClient() {
|
|
193
311
|
if (this.clientPromise) {
|
|
194
312
|
return (this.clientPromise);
|
|
@@ -235,6 +353,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
|
|
|
235
353
|
// I provide a mock API for the 3rd-party script. This just allows the consuming code to
|
|
236
354
|
// act as though the library is available even if it failed to load (example, it was
|
|
237
355
|
// blocked by an ad-blocker).
|
|
356
|
+
/** @ignore */
|
|
238
357
|
class NoopClient {
|
|
239
358
|
constructor() {
|
|
240
359
|
console.log('%cClient API not available, falling back to mock API', 'background-color:blue; color:yellow;');
|
|
@@ -300,6 +419,9 @@ class NoopClient {
|
|
|
300
419
|
}
|
|
301
420
|
}
|
|
302
421
|
|
|
422
|
+
const isLocal = /localhost/.test(document.location.host);
|
|
423
|
+
!isLocal && enableProdMode();
|
|
424
|
+
/** @ignore */
|
|
303
425
|
class AppInitService {
|
|
304
426
|
constructor(http, _route, _router) {
|
|
305
427
|
this.http = http;
|
|
@@ -401,6 +523,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
|
|
|
401
523
|
}]
|
|
402
524
|
}], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i2.ActivatedRoute }, { type: i2.Router }]; } });
|
|
403
525
|
|
|
526
|
+
/**
|
|
527
|
+
* The safe style pipe is used when custom styles are defined for a gadget and must be applied to an Angular
|
|
528
|
+
* component. This pipe will ensure the style can be appied safely by utilizing the DomSanitizer.
|
|
529
|
+
*
|
|
530
|
+
* @example
|
|
531
|
+
* <h2 [style]="style | safeStyle">Sample Pref: {{ prefs.getString('myStringPref') }}</h2>
|
|
532
|
+
*/
|
|
404
533
|
class SafeStylePipe {
|
|
405
534
|
constructor(sanitized) {
|
|
406
535
|
this.sanitized = sanitized;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reveldigital-player-client.mjs","sources":["../../../../projects/reveldigital/player-client/src/lib/player-client.service.ts","../../../../projects/reveldigital/player-client/src/lib/app-init.service.ts","../../../../projects/reveldigital/player-client/src/lib/safe-style.pipe.ts","../../../../projects/reveldigital/player-client/src/lib/player-client.module.ts","../../../../projects/reveldigital/player-client/src/public-api.ts","../../../../projects/reveldigital/player-client/src/reveldigital-player-client.ts"],"sourcesContent":["import { Injectable, NgZone, OnDestroy } from '@angular/core';\r\nimport { BehaviorSubject, fromEvent, Subject, Subscription } from 'rxjs';\r\nimport { map, share, tap } from 'rxjs/operators';\r\nimport { gadgets } from '@reveldigital/gadget-types';\r\n\r\n\r\n// So that TypeScript doesn't complain, we're going to augment the GLOBAL / WINDOW \r\n// name-space definition to include the Tracker API. This also provides us with a place\r\n// to actually DOCUMENT the API so that our developers aren't guessing about what's\r\n// available on the library.\r\ndeclare global {\r\n var Client: Client;\r\n}\r\n\r\nexport interface Client {\r\n\r\n callback(...args: any[]): void;\r\n\r\n getDeviceTime(date?: Date): Promise<string>;\r\n\r\n getDeviceTimeZoneName(): Promise<string>;\r\n\r\n getDeviceTimeZoneID(): Promise<string>;\r\n\r\n getDeviceTimeZoneOffset(): Promise<number>;\r\n\r\n getLanguageCode(): Promise<string>;\r\n\r\n getDeviceKey(): Promise<string>;\r\n\r\n sendCommand(name: string, arg: string): void;\r\n\r\n sendRemoteCommand(deviceKeys: string[], name: string, arg: string): void;\r\n\r\n track(eventName: string, properties?: string): void;\r\n\r\n timeEvent(eventName: string): void;\r\n\r\n newEventSession(id?: string): void;\r\n\r\n getRevelRoot(): Promise<string>;\r\n\r\n getCommandMap(): Promise<string>;\r\n\r\n finish(): void;\r\n}\r\n\r\nexport interface EventProperties {\r\n [key: string]: any;\r\n}\r\n\r\nexport interface Command {\r\n name: string;\r\n arg: string;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class PlayerClientService implements OnDestroy {\r\n\r\n private clientPromise: Promise<Client> | null;\r\n\r\n public onCommand$ = new Subject<Command>();\r\n public onReady$ = new BehaviorSubject(false);\r\n public onStart$ = new Subject();\r\n public onStop$ = new Subject();\r\n\r\n //\r\n // Two methods available for calling into the library:\r\n //\r\n // 1) Using dispatchEvent() with the following custom events\r\n // 2) Using the window scoped RevelDigital object as defined in the constructor\r\n //\r\n private onStartSub: Subscription;\r\n private onStartEvt$ = fromEvent(document, 'RevelDigital.Start').pipe(\r\n share(),\r\n tap(this.onStart$)\r\n );\r\n private onStopSub: Subscription;\r\n private onStopEvt$ = fromEvent(document, 'RevelDigital.Stop').pipe(\r\n share(),\r\n tap(this.onStop$)\r\n );\r\n private onCommandSub: Subscription;\r\n private onCommandEvt$ = fromEvent<Command>(document, 'RevelDigital.Command').pipe(\r\n map((e: any) => { return { name: e.detail.name, arg: e.detail.arg } as Command }),\r\n share(),\r\n tap(this.onCommand$)\r\n );\r\n\r\n // private onPostMessageSub: Subscription;\r\n // private onPostMessageEvt$ = fromEvent(window, 'message').pipe(\r\n // filter((messageEvent: MessageEvent) =>\r\n // messageEvent.source !== window.parent &&\r\n // typeof messageEvent.data === 'string' &&\r\n // messageEvent.data.startsWith('reveldigital:')),\r\n // map((e: any) => { return JSON.parse(e.substring(13)) as Command }),\r\n // share(),\r\n // tap(this.onCommand$)\r\n // );\r\n\r\n\r\n constructor(zone: NgZone) {\r\n\r\n let self = this;\r\n (window as any).RevelDigital = {\r\n Controller: {\r\n onCommand: function (name: string, arg: string) {\r\n zone.run(() => {\r\n self.onCommand$.next({ name: name, arg: arg });\r\n });\r\n },\r\n onStart: function () {\r\n zone.run(() => {\r\n self.onStart$.next(null);\r\n });\r\n },\r\n onStop: function () {\r\n zone.run(() => {\r\n self.onStop$.next(null);\r\n });\r\n }\r\n }\r\n }\r\n\r\n this.onStartSub = this.onStartEvt$.subscribe(() => { });\r\n this.onStopSub = this.onStopEvt$.subscribe(() => { });\r\n this.onCommandSub = this.onCommandEvt$.subscribe(() => { });\r\n\r\n this.clientPromise = null;\r\n\r\n this.onReady$.next(true);\r\n }\r\n\r\n ngOnDestroy(): void {\r\n\r\n this.onStartSub?.unsubscribe();\r\n this.onStopSub?.unsubscribe();\r\n this.onCommandSub?.unsubscribe();\r\n\r\n this.onReady$.next(false);\r\n }\r\n\r\n public static init(data: any) {\r\n\r\n console.log(\r\n '%c⚙️ Initializing Revel Digital client library',\r\n 'background-color:blue; color:yellow;'\r\n );\r\n }\r\n\r\n public callback(...args: any[]): void {\r\n\r\n this.getClient().then((client) => {\r\n\r\n switch (args.length) {\r\n case 0:\r\n client.callback();\r\n break;\r\n case 1:\r\n client.callback(args[0]);\r\n break;\r\n case 2:\r\n client.callback(args[1]);\r\n break;\r\n case 3:\r\n client.callback(args[2]);\r\n break;\r\n case 4:\r\n client.callback(args[3]);\r\n break;\r\n case 5:\r\n client.callback(args[4]);\r\n break;\r\n }\r\n })\r\n }\r\n\r\n public getPrefs(): gadgets.Prefs {\r\n\r\n return new window['gadgets']['Prefs']();\r\n }\r\n\r\n public async getDeviceTime(date?: Date): Promise<string> {\r\n\r\n const client = await this.getClient();\r\n\r\n if (date !== undefined) {\r\n return client.getDeviceTime(date);\r\n }\r\n return client.getDeviceTime();\r\n }\r\n\r\n public async getDeviceTimeZoneName(): Promise<string> {\r\n\r\n const client = await this.getClient();\r\n\r\n return client.getDeviceTimeZoneName();\r\n }\r\n\r\n public async getDeviceTimeZoneID(): Promise<string> {\r\n\r\n const client = await this.getClient();\r\n\r\n return client.getDeviceTimeZoneID();\r\n }\r\n\r\n public async getDeviceTimeZoneOffset(): Promise<number> {\r\n\r\n const client = await this.getClient();\r\n\r\n return client.getDeviceTimeZoneOffset();\r\n }\r\n\r\n public async getLanguageCode(): Promise<string> {\r\n\r\n const client = await this.getClient();\r\n\r\n return client.getLanguageCode();\r\n }\r\n\r\n public async getDeviceKey(): Promise<string> {\r\n\r\n const client = await this.getClient();\r\n\r\n return client.getDeviceKey();\r\n }\r\n\r\n public sendCommand(name: string, arg: string): void {\r\n\r\n this.getClient().then((client) => {\r\n client.sendCommand(name, arg);\r\n })\r\n }\r\n\r\n public sendRemoteCommand(deviceKeys: string[], name: string, arg: string): void {\r\n\r\n this.getClient().then((client) => {\r\n client.sendRemoteCommand(deviceKeys, name, arg);\r\n });\r\n }\r\n\r\n public track(eventName: string, properties?: EventProperties): void {\r\n\r\n this.getClient().then((client) => {\r\n client.track(eventName, JSON.stringify(properties));\r\n })\r\n }\r\n\r\n public timeEvent(eventName: string): void {\r\n\r\n this.getClient().then((client) => {\r\n client.timeEvent(eventName);\r\n })\r\n }\r\n\r\n public newEventSession(id?: string): void {\r\n\r\n this.getClient().then((client) => {\r\n if (id !== undefined) {\r\n client.newEventSession();\r\n } else {\r\n client.newEventSession(id);\r\n }\r\n })\r\n }\r\n\r\n public async getRevelRoot(): Promise<string> {\r\n\r\n const client = await this.getClient();\r\n\r\n return client.getRevelRoot();\r\n }\r\n\r\n public async getCommandMap(): Promise<any> {\r\n\r\n const client = await this.getClient();\r\n\r\n return JSON.parse(await client.getCommandMap());\r\n\r\n // let map = new Map<string, any>();\r\n\r\n // let obj = JSON.parse(await client.getCommandMap());\r\n // for (let key in obj) {\r\n // map.set(key, obj[key]);\r\n // }\r\n // return map;\r\n }\r\n\r\n public finish(): void {\r\n\r\n this.getClient().then((client) => {\r\n\r\n client.finish();\r\n })\r\n }\r\n\r\n // ---\r\n // PRIVATE METHODS.\r\n // ---\r\n\r\n private getClient(): Promise<Client> {\r\n\r\n if (this.clientPromise) {\r\n\r\n return (this.clientPromise);\r\n }\r\n\r\n if (window.Client) {\r\n\r\n return (this.clientPromise = Promise.resolve(window.Client));\r\n }\r\n\r\n // A \"complete\" status indicates that the \"load\" event has been fired on the\r\n // window; and, that all sub-resources such as Scripts, Images, and Frames have\r\n // been loaded.\r\n if (window.document.readyState === \"complete\") {\r\n\r\n // If this event has fired AND the 3rd-party script isn't available (see IF-\r\n // condition BEFORE this one), it means that the 3rd-party script either\r\n // failed on the network or was BLOCKED by an ad-blocker. As such, we have to\r\n // fall-back to using a mock API.\r\n return (this.clientPromise = Promise.resolve(new NoopClient()));\r\n }\r\n\r\n // ASSERT: If we made it this far, the document has not completed loading (but it\r\n // may be in an \"interactive\" state which is when I believe that the Angular app\r\n // gets bootstrapped). As such, we need bind to the LOAD event to wait for our\r\n // third-party scripts to load (or fail to load, or be blocked).\r\n this.clientPromise = new Promise<Client>(\r\n (resolve) => {\r\n\r\n window.addEventListener(\r\n \"load\",\r\n function handleWindowLoad() {\r\n\r\n // At this point, the 3rd-party library is either available or\r\n // it's not - there's no further loading to do. If it's not\r\n // present on the global scope, we're going to fall-back to using\r\n // a mock API.\r\n resolve(window.Client || new NoopClient());\r\n }\r\n );\r\n\r\n }\r\n );\r\n\r\n return (this.clientPromise);\r\n }\r\n\r\n}\r\n\r\n\r\n\r\n// ----------------------------------------------------------------------------------- //\r\n// ----------------------------------------------------------------------------------- //\r\n\r\n// I provide a mock API for the 3rd-party script. This just allows the consuming code to\r\n// act as though the library is available even if it failed to load (example, it was\r\n// blocked by an ad-blocker).\r\nclass NoopClient implements Client {\r\n\r\n constructor() {\r\n\r\n console.log(\r\n '%cClient API not available, falling back to mock API',\r\n 'background-color:blue; color:yellow;'\r\n );\r\n }\r\n\r\n public callback(...args: any[]): void {\r\n\r\n // NOOP implement, nothing to do....\r\n }\r\n\r\n public getDeviceTime(date?: Date): Promise<string> {\r\n\r\n return Promise.resolve(new Date().toISOString());\r\n }\r\n\r\n public async getDeviceTimeZoneName(): Promise<string> {\r\n\r\n return Promise.resolve(null);\r\n }\r\n\r\n public async getDeviceTimeZoneID(): Promise<string> {\r\n\r\n return Promise.resolve(null);\r\n }\r\n\r\n public async getDeviceTimeZoneOffset(): Promise<number> {\r\n\r\n return Promise.resolve(null);\r\n }\r\n\r\n public async getLanguageCode(): Promise<string> {\r\n\r\n return Promise.resolve(null);\r\n }\r\n\r\n public async getDeviceKey(): Promise<string> {\r\n\r\n return Promise.resolve(null);\r\n }\r\n\r\n public sendCommand(name: string, arg: string): void {\r\n\r\n // NOOP implement, nothing to do....\r\n }\r\n\r\n public sendRemoteCommand(deviceKeys: string[], name: string, arg: string) {\r\n\r\n // NOOP implement, nothing to do....\r\n }\r\n\r\n public track(eventName: string, properties?: string): void {\r\n\r\n // NOOP implement, nothing to do....\r\n }\r\n\r\n public timeEvent(eventName: string): void {\r\n\r\n // NOOP implement, nothing to do....\r\n }\r\n\r\n public newEventSession(id?: string): void {\r\n\r\n // NOOP implement, nothing to do....\r\n }\r\n\r\n public async getRevelRoot(): Promise<string> {\r\n\r\n return Promise.resolve(null);\r\n }\r\n\r\n public async getCommandMap(): Promise<string> {\r\n\r\n return Promise.resolve('{}');\r\n }\r\n\r\n public finish(): void {\r\n\r\n // NOOP implement, nothing to do....\r\n }\r\n}\r\n","import { Injectable, isDevMode } from '@angular/core';\r\nimport { HttpClient } from \"@angular/common/http\";\r\nimport { ActivatedRoute, Router } from \"@angular/router\";\r\nimport * as yaml from \"js-yaml\";\r\nimport * as WebFont from 'webfontloader';\r\n\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class AppInitService {\r\n\r\n constructor(\r\n public http: HttpClient,\r\n private _route: ActivatedRoute,\r\n private _router: Router) {\r\n }\r\n\r\n init(): Promise<any> {\r\n\r\n return new Promise<void>(async (resolve) => {\r\n\r\n this.loadFonts();\r\n\r\n if (isDevMode()) {\r\n console.log(\r\n '%cRunning in development mode',\r\n 'background-color:blue; color:yellow;'\r\n );\r\n\r\n /**\r\n * Shim the shindig prefs functionality for dev mode\r\n */\r\n (<any>window).gadgets = {\r\n\r\n Prefs: class {\r\n getString(key: string) { return this.getParameterByName(key) }\r\n\r\n getArray(key: string) { return this.getParameterByName(key).split(',') }\r\n\r\n getBool(key: string) { return !!this.getParameterByName(key) }\r\n\r\n getCountry() { }\r\n\r\n getFloat(key: string) { return parseFloat(this.getParameterByName(key)) }\r\n\r\n getInt(key: string) { return parseInt(this.getParameterByName(key)) }\r\n\r\n getLang() { return this.getParameterByName('lang') === '' ? 'en' : this.getParameterByName('lang'); }\r\n\r\n getParameterByName(name: string, search = window.location.href): string {\r\n\r\n name = name.replace(/[\\[\\]]/g, '\\\\$&');\r\n let regex = new RegExp('[?&]' + name + '(=([^&#]*)|&|#|$)'),\r\n results = regex.exec(search);\r\n if (!results) return '';\r\n if (!results[2]) return '';\r\n return decodeURIComponent(results[2].replace(/\\+/g, ' '));\r\n }\r\n }\r\n };\r\n\r\n this.http.get('assets/user-prefs.yml', {\r\n responseType: 'text'\r\n }).subscribe(data => {\r\n const doc: any = yaml.load(data);\r\n let params: any = {}\r\n for (const val of doc.prefs) {\r\n params[val.name] = val.default_value\r\n }\r\n\r\n this._router.navigate([], {\r\n relativeTo: this._route,\r\n queryParams: params,\r\n });\r\n\r\n console.log(\r\n `%cUser prefs loaded successfully`,\r\n 'background-color:blue; color:yellow;'\r\n );\r\n }, (err) => {\r\n console.log(\r\n `%cUnable to load user preferences YAML definition file: ${err}`,\r\n 'background-color:blue; color:yellow;'\r\n );\r\n console.log(\r\n `%cPlease see our developer documentation for help with your app configuration: https://developer.reveldigital.com`,\r\n 'background-color:red; color:yellow;'\r\n )\r\n })\r\n }\r\n resolve();\r\n });\r\n }\r\n\r\n\r\n private getFamilyName(css) {\r\n\r\n let FONT_FAMILY_REGEX = /font-family:\\s*(?:['"])*['\"]*(.+?)['\"]*(?:['"])*\\s*;/i;\r\n if (FONT_FAMILY_REGEX.test(css)) {\r\n var matches = css.match(FONT_FAMILY_REGEX);\r\n return matches[1].split(',')[0];\r\n } else {\r\n return '';\r\n }\r\n }\r\n\r\n /**\r\n * Loads the given font from Google Web Fonts.\r\n */\r\n private loadFonts(): void {\r\n\r\n const parameters = new URLSearchParams(window.location.search);\r\n parameters.forEach((val, key) => {\r\n try {\r\n let fontFamily = this.getFamilyName(val);\r\n if (fontFamily !== '') {\r\n WebFont.load({\r\n google: {\r\n families: [fontFamily]\r\n },\r\n fontactive: (familyName) => {\r\n console.log(`%cActivating font: ${familyName}`,\r\n 'background-color:blue; color:yellow;');\r\n },\r\n fontinactive: (familyName) => {\r\n console.log(`%cFont inactive: ${familyName}`,\r\n 'background-color:red; color:yellow;');\r\n }\r\n });\r\n }\r\n } catch (e) {\r\n }\r\n });\r\n }\r\n}\r\n","import { Pipe, PipeTransform, NgModule } from '@angular/core';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\n\r\n@Pipe({\r\n name: 'safeStyle',\r\n})\r\nexport class SafeStylePipe implements PipeTransform {\r\n constructor(private sanitized: DomSanitizer) { }\r\n\r\n transform(value: any): unknown {\r\n return this.sanitized.bypassSecurityTrustStyle(value);\r\n }\r\n}\r\n\r\n@NgModule({\r\n declarations: [SafeStylePipe],\r\n exports: [SafeStylePipe],\r\n})\r\nexport class NgSafeStylePipeModule { }\r\n","import { APP_INITIALIZER, LOCALE_ID, NgModule } from '@angular/core';\nimport { PlayerClientService } from './player-client.service';\nimport { AppInitService } from './app-init.service';\nimport { HttpClientModule } from '@angular/common/http';\nimport { RouterModule } from '@angular/router';\nimport { APP_BASE_HREF } from '@angular/common';\nimport { NgSafeStylePipeModule } from './safe-style.pipe';\n\ndeclare var gadgets: any;\n\n\n@NgModule({\n imports: [\n HttpClientModule,\n RouterModule.forRoot([]),\n NgSafeStylePipeModule\n ],\n exports: [\n NgSafeStylePipeModule\n ],\n providers: [{\n provide: APP_INITIALIZER,\n useFactory: initializeApp,\n deps: [AppInitService, PlayerClientService],\n multi: true\n },\n {\n provide: LOCALE_ID,\n useFactory: () => {\n try {\n return new gadgets.Prefs().getLang();\n } catch {\n return 'en';\n }\n }\n },\n { provide: APP_BASE_HREF, useValue: '/gadgets/ifr' }]\n})\nexport class PlayerClientModule { }\n\nfunction initializeApp(appInitService: AppInitService) {\n return async () => {\n PlayerClientService.init({});\n await appInitService.init();\n }\n}\n","/*\n * Public API Surface of player-client\n */\n\nexport * from './lib/player-client.service';\nexport * from './lib/player-client.module';\nexport * from './lib/safe-style.pipe';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"reveldigital-player-client.mjs","sources":["../../../../projects/reveldigital/player-client/src/lib/player-client.service.ts","../../../../projects/reveldigital/player-client/src/lib/app-init.service.ts","../../../../projects/reveldigital/player-client/src/lib/safe-style.pipe.ts","../../../../projects/reveldigital/player-client/src/lib/player-client.module.ts","../../../../projects/reveldigital/player-client/src/public-api.ts","../../../../projects/reveldigital/player-client/src/reveldigital-player-client.ts"],"sourcesContent":["import { Injectable, NgZone, OnDestroy } from '@angular/core';\r\nimport { BehaviorSubject, fromEvent, Subject, Subscription } from 'rxjs';\r\nimport { map, share, tap } from 'rxjs/operators';\r\nimport { gadgets } from '@reveldigital/gadget-types';\r\n\r\n\r\n// So that TypeScript doesn't complain, we're going to augment the GLOBAL / WINDOW \r\n// name-space definition to include the Tracker API. This also provides us with a place\r\n// to actually DOCUMENT the API so that our developers aren't guessing about what's\r\n// available on the library.\r\n\r\n/** @ignore */\r\ndeclare global {\r\n var Client: Client;\r\n}\r\n\r\n/** @ignore */\r\nexport interface Client {\r\n\r\n callback(...args: any[]): void;\r\n\r\n getDeviceTime(date?: Date): Promise<string>;\r\n\r\n getDeviceTimeZoneName(): Promise<string>;\r\n\r\n getDeviceTimeZoneID(): Promise<string>;\r\n\r\n getDeviceTimeZoneOffset(): Promise<number>;\r\n\r\n getLanguageCode(): Promise<string>;\r\n\r\n getDeviceKey(): Promise<string>;\r\n\r\n sendCommand(name: string, arg: string): void;\r\n\r\n sendRemoteCommand(deviceKeys: string[], name: string, arg: string): void;\r\n\r\n track(eventName: string, properties?: string): void;\r\n\r\n timeEvent(eventName: string): void;\r\n\r\n newEventSession(id?: string): void;\r\n\r\n getRevelRoot(): Promise<string>;\r\n\r\n getCommandMap(): Promise<string>;\r\n\r\n finish(): void;\r\n}\r\n\r\nexport interface EventProperties {\r\n [key: string]: any;\r\n}\r\n\r\nexport interface Command {\r\n name: string;\r\n arg: string;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class PlayerClientService implements OnDestroy {\r\n\r\n /** @ignore */\r\n private clientPromise: Promise<Client> | null;\r\n\r\n /**\r\n * Commands sent to this player.\r\n */\r\n public onCommand$ = new Subject<Command>();\r\n /**\r\n * Signals the gadget has been loaded and is ready to start.\r\n */\r\n public onReady$ = new BehaviorSubject(false);\r\n /**\r\n * Signals the gadget has been started by the player.\r\n */\r\n public onStart$ = new Subject();\r\n /**\r\n * Signals the gadgets has been stopped by the player.\r\n */\r\n public onStop$ = new Subject();\r\n\r\n //\r\n // Two methods available for calling into the library:\r\n //\r\n // 1) Using dispatchEvent() with the following custom events\r\n // 2) Using the window scoped RevelDigital object as defined in the constructor\r\n //\r\n /** @ignore */\r\n private onStartSub: Subscription;\r\n /** @ignore */\r\n private onStartEvt$ = fromEvent(document, 'RevelDigital.Start').pipe(\r\n share(),\r\n tap(this.onStart$)\r\n );\r\n /** @ignore */\r\n private onStopSub: Subscription;\r\n /** @ignore */\r\n private onStopEvt$ = fromEvent(document, 'RevelDigital.Stop').pipe(\r\n share(),\r\n tap(this.onStop$)\r\n );\r\n /** @ignore */\r\n private onCommandSub: Subscription;\r\n /** @ignore */\r\n private onCommandEvt$ = fromEvent<Command>(document, 'RevelDigital.Command').pipe(\r\n map((e: any) => { return { name: e.detail.name, arg: e.detail.arg } as Command }),\r\n share(),\r\n tap(this.onCommand$)\r\n );\r\n\r\n // private onPostMessageSub: Subscription;\r\n // private onPostMessageEvt$ = fromEvent(window, 'message').pipe(\r\n // filter((messageEvent: MessageEvent) =>\r\n // messageEvent.source !== window.parent &&\r\n // typeof messageEvent.data === 'string' &&\r\n // messageEvent.data.startsWith('reveldigital:')),\r\n // map((e: any) => { return JSON.parse(e.substring(13)) as Command }),\r\n // share(),\r\n // tap(this.onCommand$)\r\n // );\r\n\r\n /** @ignore */\r\n constructor(zone: NgZone) {\r\n\r\n let self = this;\r\n (window as any).RevelDigital = {\r\n Controller: {\r\n onCommand: function (name: string, arg: string) {\r\n zone.run(() => {\r\n self.onCommand$.next({ name: name, arg: arg });\r\n });\r\n },\r\n onStart: function () {\r\n zone.run(() => {\r\n self.onStart$.next(null);\r\n });\r\n },\r\n onStop: function () {\r\n zone.run(() => {\r\n self.onStop$.next(null);\r\n });\r\n }\r\n }\r\n }\r\n\r\n this.onStartSub = this.onStartEvt$.subscribe(() => { });\r\n this.onStopSub = this.onStopEvt$.subscribe(() => { });\r\n this.onCommandSub = this.onCommandEvt$.subscribe(() => { });\r\n\r\n this.clientPromise = null;\r\n\r\n this.onReady$.next(true);\r\n }\r\n\r\n /** @ignore */\r\n ngOnDestroy(): void {\r\n\r\n this.onStartSub?.unsubscribe();\r\n this.onStopSub?.unsubscribe();\r\n this.onCommandSub?.unsubscribe();\r\n\r\n this.onReady$.next(false);\r\n }\r\n\r\n /** @ignore */\r\n public static init(data: any) {\r\n\r\n console.log(\r\n '%c⚙️ Initializing Revel Digital client library',\r\n 'background-color:blue; color:yellow;'\r\n );\r\n }\r\n\r\n /**\r\n * This method allows the gadget to communicate with player scripting.\r\n * If the appropriate scripting is in place in the currently running template, calling this method\r\n * will initiate a callback which can be acted upon in player script.\r\n * \r\n * @example\r\n * client.callback('test', 'this');\r\n * \r\n * @param args variable number of arguments\r\n */\r\n public callback(...args: any[]): void {\r\n\r\n this.getClient().then((client) => {\r\n\r\n switch (args.length) {\r\n case 0:\r\n client.callback();\r\n break;\r\n case 1:\r\n client.callback(args[0]);\r\n break;\r\n case 2:\r\n client.callback(args[1]);\r\n break;\r\n case 3:\r\n client.callback(args[2]);\r\n break;\r\n case 4:\r\n client.callback(args[3]);\r\n break;\r\n case 5:\r\n client.callback(args[4]);\r\n break;\r\n }\r\n })\r\n }\r\n\r\n /**\r\n * Accessor method for the user preferences interface exposed by the Gadgets API.\r\n * \r\n * See {@link https://developers.google.com/gadgets/docs/basic} for more details on the Gadgets API.\r\n * \r\n * @example\r\n * constructor(public client: PlayerClientService) {\r\n * let prefs = client.getPrefs();\r\n * let myString = prefs.getString('myStringPref');\r\n * }\r\n * @returns {gadgets.Prefs} Gadget API Prefs object\r\n */\r\n public getPrefs(): gadgets.Prefs {\r\n\r\n return new window['gadgets']['Prefs']();\r\n }\r\n\r\n /**\r\n * Returns the current device time in ISO8601 format.\r\n * Current device time is determined by the device timezone assigned to the device in the CMS.\r\n * \r\n * @param date Optional. If supplied will translate the supplied date/time to device time based on respective timezones.\r\n * @returns Date/time in ISO8601 format\r\n */\r\n public async getDeviceTime(date?: Date): Promise<string> {\r\n\r\n const client = await this.getClient();\r\n\r\n if (date !== undefined) {\r\n return client.getDeviceTime(date);\r\n }\r\n return client.getDeviceTime();\r\n }\r\n\r\n /**\r\n * Returns the timezone name currently assigned to the device.\r\n * \r\n * @returns Timezone Name\r\n */\r\n public async getDeviceTimeZoneName(): Promise<string> {\r\n\r\n const client = await this.getClient();\r\n\r\n return client.getDeviceTimeZoneName();\r\n }\r\n\r\n /**\r\n * Returns the timezone ID currently assigned to the device.\r\n * \r\n * @returns Timezone ID\r\n */\r\n public async getDeviceTimeZoneID(): Promise<string> {\r\n\r\n const client = await this.getClient();\r\n\r\n return client.getDeviceTimeZoneID();\r\n }\r\n\r\n /**\r\n * Returns the numerical offset from GMT of the timezone currently assigned to the device.\r\n * \r\n * @returns Timezone offset\r\n */\r\n public async getDeviceTimeZoneOffset(): Promise<number> {\r\n\r\n const client = await this.getClient();\r\n\r\n return client.getDeviceTimeZoneOffset();\r\n }\r\n\r\n /**\r\n * Returns the language code of the language currently assigned to the device.\r\n * \r\n * @returns Language code\r\n */\r\n public async getLanguageCode(): Promise<string> {\r\n\r\n const client = await this.getClient();\r\n\r\n return client.getLanguageCode();\r\n }\r\n\r\n /**\r\n * Returns the unique Revel Digital device key associated with the device.\r\n * \r\n * @returns Device key\r\n */\r\n public async getDeviceKey(): Promise<string> {\r\n\r\n const client = await this.getClient();\r\n\r\n return client.getDeviceKey();\r\n }\r\n\r\n /**\r\n * Send a command to the player device.\r\n * \r\n * @param name Command name\r\n * @param arg Command argument\r\n */\r\n public sendCommand(name: string, arg: string): void {\r\n\r\n this.getClient().then((client) => {\r\n client.sendCommand(name, arg);\r\n })\r\n }\r\n\r\n /**\r\n * Send a command to any remote player with the supplied device key(s).\r\n * Note: Remote commands can only be delivered to devices within the same account as the sender device.\r\n * \r\n * @param deviceKeys Array of remote device keys\r\n * @param name Command name\r\n * @param arg Command arg\r\n */\r\n public sendRemoteCommand(deviceKeys: string[], name: string, arg: string): void {\r\n\r\n this.getClient().then((client) => {\r\n client.sendRemoteCommand(deviceKeys, name, arg);\r\n });\r\n }\r\n\r\n /**\r\n * Log an event for use with AdHawk analytics.\r\n * Events are used for tracking various metrics including usage statistics, player condition, state changes, etc.\r\n * \r\n * @param eventName Unique name for this event\r\n * @param properties A map of user defined properties to associate with this event\r\n */\r\n public track(eventName: string, properties?: EventProperties): void {\r\n\r\n this.getClient().then((client) => {\r\n client.track(eventName, JSON.stringify(properties));\r\n })\r\n }\r\n\r\n /**\r\n * Method for initiating a timed event.\r\n * Timed events are useful for tracking the duration of an event and must be proceeded with a call to track().\r\n * \r\n * @example\r\n * client.timeEvent('testEvent');\r\n * client.track(\"test\", { \"a\": \"b\" });\r\n * @param eventName Unique name for this event\r\n */\r\n public timeEvent(eventName: string): void {\r\n\r\n this.getClient().then((client) => {\r\n client.timeEvent(eventName);\r\n })\r\n }\r\n\r\n /**\r\n * A session is a way of grouping events together. Each event has an associated session ID.\r\n * Session ID's are randomly generated and reset by subsequent calls to newEventSession().\r\n * \r\n * Each call to track() will utilize the same session ID, until another call to newEventSession().\r\n * @param id Optional. User supplied session ID. If not supplied a random session ID will be generated.\r\n */\r\n public newEventSession(id?: string): void {\r\n\r\n this.getClient().then((client) => {\r\n if (id !== undefined) {\r\n client.newEventSession();\r\n } else {\r\n client.newEventSession(id);\r\n }\r\n })\r\n }\r\n\r\n /**\r\n * Returns the root folder utilized by this player device.\r\n * \r\n * @returns Path to the root folder\r\n */\r\n public async getRevelRoot(): Promise<string> {\r\n\r\n const client = await this.getClient();\r\n\r\n return client.getRevelRoot();\r\n }\r\n\r\n /**\r\n * Returns a map of commands currently active for this device.\r\n * \r\n * @returns Map of commands currently active for this device.\r\n */\r\n public async getCommandMap(): Promise<any> {\r\n\r\n const client = await this.getClient();\r\n\r\n return JSON.parse(await client.getCommandMap());\r\n }\r\n\r\n /**\r\n * Indicate to the player that this gadget has finished it's visualization.\r\n * This allows the player to proceed with the next item in a playlist if applicable.\r\n */\r\n public finish(): void {\r\n\r\n this.getClient().then((client) => {\r\n\r\n client.finish();\r\n })\r\n }\r\n\r\n // ---\r\n // PRIVATE METHODS.\r\n // ---\r\n /** @ignore */\r\n private getClient(): Promise<Client> {\r\n\r\n if (this.clientPromise) {\r\n\r\n return (this.clientPromise);\r\n }\r\n\r\n if (window.Client) {\r\n\r\n return (this.clientPromise = Promise.resolve(window.Client));\r\n }\r\n\r\n // A \"complete\" status indicates that the \"load\" event has been fired on the\r\n // window; and, that all sub-resources such as Scripts, Images, and Frames have\r\n // been loaded.\r\n if (window.document.readyState === \"complete\") {\r\n\r\n // If this event has fired AND the 3rd-party script isn't available (see IF-\r\n // condition BEFORE this one), it means that the 3rd-party script either\r\n // failed on the network or was BLOCKED by an ad-blocker. As such, we have to\r\n // fall-back to using a mock API.\r\n return (this.clientPromise = Promise.resolve(new NoopClient()));\r\n }\r\n\r\n // ASSERT: If we made it this far, the document has not completed loading (but it\r\n // may be in an \"interactive\" state which is when I believe that the Angular app\r\n // gets bootstrapped). As such, we need bind to the LOAD event to wait for our\r\n // third-party scripts to load (or fail to load, or be blocked).\r\n this.clientPromise = new Promise<Client>(\r\n (resolve) => {\r\n\r\n window.addEventListener(\r\n \"load\",\r\n function handleWindowLoad() {\r\n\r\n // At this point, the 3rd-party library is either available or\r\n // it's not - there's no further loading to do. If it's not\r\n // present on the global scope, we're going to fall-back to using\r\n // a mock API.\r\n resolve(window.Client || new NoopClient());\r\n }\r\n );\r\n\r\n }\r\n );\r\n\r\n return (this.clientPromise);\r\n }\r\n\r\n}\r\n\r\n\r\n\r\n// ----------------------------------------------------------------------------------- //\r\n// ----------------------------------------------------------------------------------- //\r\n\r\n// I provide a mock API for the 3rd-party script. This just allows the consuming code to\r\n// act as though the library is available even if it failed to load (example, it was\r\n// blocked by an ad-blocker).\r\n\r\n/** @ignore */\r\nclass NoopClient implements Client {\r\n\r\n constructor() {\r\n\r\n console.log(\r\n '%cClient API not available, falling back to mock API',\r\n 'background-color:blue; color:yellow;'\r\n );\r\n }\r\n\r\n public callback(...args: any[]): void {\r\n\r\n // NOOP implement, nothing to do....\r\n }\r\n\r\n public getDeviceTime(date?: Date): Promise<string> {\r\n\r\n return Promise.resolve(new Date().toISOString());\r\n }\r\n\r\n public async getDeviceTimeZoneName(): Promise<string> {\r\n\r\n return Promise.resolve(null);\r\n }\r\n\r\n public async getDeviceTimeZoneID(): Promise<string> {\r\n\r\n return Promise.resolve(null);\r\n }\r\n\r\n public async getDeviceTimeZoneOffset(): Promise<number> {\r\n\r\n return Promise.resolve(null);\r\n }\r\n\r\n public async getLanguageCode(): Promise<string> {\r\n\r\n return Promise.resolve(null);\r\n }\r\n\r\n public async getDeviceKey(): Promise<string> {\r\n\r\n return Promise.resolve(null);\r\n }\r\n\r\n public sendCommand(name: string, arg: string): void {\r\n\r\n // NOOP implement, nothing to do....\r\n }\r\n\r\n public sendRemoteCommand(deviceKeys: string[], name: string, arg: string) {\r\n\r\n // NOOP implement, nothing to do....\r\n }\r\n\r\n public track(eventName: string, properties?: string): void {\r\n\r\n // NOOP implement, nothing to do....\r\n }\r\n\r\n public timeEvent(eventName: string): void {\r\n\r\n // NOOP implement, nothing to do....\r\n }\r\n\r\n public newEventSession(id?: string): void {\r\n\r\n // NOOP implement, nothing to do....\r\n }\r\n\r\n public async getRevelRoot(): Promise<string> {\r\n\r\n return Promise.resolve(null);\r\n }\r\n\r\n public async getCommandMap(): Promise<string> {\r\n\r\n return Promise.resolve('{}');\r\n }\r\n\r\n public finish(): void {\r\n\r\n // NOOP implement, nothing to do....\r\n }\r\n}\r\n","import { Injectable, enableProdMode, isDevMode } from '@angular/core';\r\nimport { HttpClient } from \"@angular/common/http\";\r\nimport { ActivatedRoute, Router } from \"@angular/router\";\r\nimport * as yaml from \"js-yaml\";\r\nimport * as WebFont from 'webfontloader';\r\n\r\nconst isLocal: boolean = /localhost/.test(document.location.host);\r\n!isLocal && enableProdMode();\r\n\r\n\r\n/** @ignore */\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class AppInitService {\r\n\r\n constructor(\r\n public http: HttpClient,\r\n private _route: ActivatedRoute,\r\n private _router: Router) {\r\n }\r\n\r\n init(): Promise<any> {\r\n\r\n return new Promise<void>(async (resolve) => {\r\n\r\n this.loadFonts();\r\n\r\n if (isDevMode()) {\r\n console.log(\r\n '%cRunning in development mode',\r\n 'background-color:blue; color:yellow;'\r\n );\r\n\r\n /**\r\n * Shim the shindig prefs functionality for dev mode\r\n */\r\n (<any>window).gadgets = {\r\n\r\n Prefs: class {\r\n getString(key: string) { return this.getParameterByName(key) }\r\n\r\n getArray(key: string) { return this.getParameterByName(key).split(',') }\r\n\r\n getBool(key: string) { return !!this.getParameterByName(key) }\r\n\r\n getCountry() { }\r\n\r\n getFloat(key: string) { return parseFloat(this.getParameterByName(key)) }\r\n\r\n getInt(key: string) { return parseInt(this.getParameterByName(key)) }\r\n\r\n getLang() { return this.getParameterByName('lang') === '' ? 'en' : this.getParameterByName('lang'); }\r\n\r\n getParameterByName(name: string, search = window.location.href): string {\r\n\r\n name = name.replace(/[\\[\\]]/g, '\\\\$&');\r\n let regex = new RegExp('[?&]' + name + '(=([^&#]*)|&|#|$)'),\r\n results = regex.exec(search);\r\n if (!results) return '';\r\n if (!results[2]) return '';\r\n return decodeURIComponent(results[2].replace(/\\+/g, ' '));\r\n }\r\n }\r\n };\r\n\r\n this.http.get('assets/user-prefs.yml', {\r\n responseType: 'text'\r\n }).subscribe(data => {\r\n const doc: any = yaml.load(data);\r\n let params: any = {}\r\n for (const val of doc.prefs) {\r\n params[val.name] = val.default_value\r\n }\r\n\r\n this._router.navigate([], {\r\n relativeTo: this._route,\r\n queryParams: params,\r\n });\r\n\r\n console.log(\r\n `%cUser prefs loaded successfully`,\r\n 'background-color:blue; color:yellow;'\r\n );\r\n }, (err) => {\r\n console.log(\r\n `%cUnable to load user preferences YAML definition file: ${err}`,\r\n 'background-color:blue; color:yellow;'\r\n );\r\n console.log(\r\n `%cPlease see our developer documentation for help with your app configuration: https://developer.reveldigital.com`,\r\n 'background-color:red; color:yellow;'\r\n )\r\n })\r\n }\r\n resolve();\r\n });\r\n }\r\n\r\n\r\n private getFamilyName(css) {\r\n\r\n let FONT_FAMILY_REGEX = /font-family:\\s*(?:['"])*['\"]*(.+?)['\"]*(?:['"])*\\s*;/i;\r\n if (FONT_FAMILY_REGEX.test(css)) {\r\n var matches = css.match(FONT_FAMILY_REGEX);\r\n return matches[1].split(',')[0];\r\n } else {\r\n return '';\r\n }\r\n }\r\n\r\n /**\r\n * Loads the given font from Google Web Fonts.\r\n */\r\n private loadFonts(): void {\r\n\r\n const parameters = new URLSearchParams(window.location.search);\r\n parameters.forEach((val, key) => {\r\n try {\r\n let fontFamily = this.getFamilyName(val);\r\n if (fontFamily !== '') {\r\n WebFont.load({\r\n google: {\r\n families: [fontFamily]\r\n },\r\n fontactive: (familyName) => {\r\n console.log(`%cActivating font: ${familyName}`,\r\n 'background-color:blue; color:yellow;');\r\n },\r\n fontinactive: (familyName) => {\r\n console.log(`%cFont inactive: ${familyName}`,\r\n 'background-color:red; color:yellow;');\r\n }\r\n });\r\n }\r\n } catch (e) {\r\n }\r\n });\r\n }\r\n}\r\n","import { Pipe, PipeTransform, NgModule } from '@angular/core';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\n\r\n/**\r\n * The safe style pipe is used when custom styles are defined for a gadget and must be applied to an Angular\r\n * component. This pipe will ensure the style can be appied safely by utilizing the DomSanitizer.\r\n * \r\n * @example\r\n * <h2 [style]=\"style | safeStyle\">Sample Pref: {{ prefs.getString('myStringPref') }}</h2>\r\n */\r\n@Pipe({\r\n name: 'safeStyle',\r\n})\r\nexport class SafeStylePipe implements PipeTransform {\r\n constructor(private sanitized: DomSanitizer) { }\r\n\r\n transform(value: any): unknown {\r\n return this.sanitized.bypassSecurityTrustStyle(value);\r\n }\r\n}\r\n\r\n@NgModule({\r\n declarations: [SafeStylePipe],\r\n exports: [SafeStylePipe],\r\n})\r\nexport class NgSafeStylePipeModule { }\r\n","import { APP_INITIALIZER, LOCALE_ID, NgModule } from '@angular/core';\nimport { PlayerClientService } from './player-client.service';\nimport { AppInitService } from './app-init.service';\nimport { HttpClientModule } from '@angular/common/http';\nimport { RouterModule } from '@angular/router';\nimport { APP_BASE_HREF } from '@angular/common';\nimport { NgSafeStylePipeModule } from './safe-style.pipe';\n\ndeclare var gadgets: any;\n\n\n@NgModule({\n imports: [\n HttpClientModule,\n RouterModule.forRoot([]),\n NgSafeStylePipeModule\n ],\n exports: [\n NgSafeStylePipeModule\n ],\n providers: [{\n provide: APP_INITIALIZER,\n useFactory: initializeApp,\n deps: [AppInitService, PlayerClientService],\n multi: true\n },\n {\n provide: LOCALE_ID,\n useFactory: () => {\n try {\n return new gadgets.Prefs().getLang();\n } catch {\n return 'en';\n }\n }\n },\n { provide: APP_BASE_HREF, useValue: '/gadgets/ifr' }]\n})\nexport class PlayerClientModule { }\n\nfunction initializeApp(appInitService: AppInitService) {\n return async () => {\n PlayerClientService.init({});\n await appInitService.init();\n }\n}\n","/*\n * Public API Surface of player-client\n */\n\nexport * from './lib/player-client.service';\nexport * from './lib/player-client.module';\nexport * from './lib/safe-style.pipe';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|