@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.
@@ -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*(?:[&#39;&#34;])*['\"]*(.+?)['\"]*(?:[&#39;&#34;])*\\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*(?:[&#39;&#34;])*['\"]*(.+?)['\"]*(?:[&#39;&#34;])*\\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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"}