@reveldigital/player-client 0.0.12 → 0.0.13
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/README.md +2 -23
- package/esm2020/lib/player-client.module.mjs +14 -0
- package/esm2020/lib/player-client.service.mjs +218 -0
- package/{esm2015/public-api.js → esm2020/public-api.mjs} +0 -0
- package/{esm2015/reveldigital-player-client.js → esm2020/reveldigital-player-client.mjs} +0 -0
- package/fesm2015/{reveldigital-player-client.js → reveldigital-player-client.mjs} +18 -13
- package/fesm2015/reveldigital-player-client.mjs.map +1 -0
- package/fesm2020/reveldigital-player-client.mjs +241 -0
- package/fesm2020/reveldigital-player-client.mjs.map +1 -0
- package/lib/player-client.module.d.ts +5 -0
- package/lib/player-client.module.d.ts.map +1 -0
- package/lib/player-client.service.d.ts +4 -0
- package/lib/player-client.service.d.ts.map +1 -0
- package/package.json +22 -10
- package/public-api.d.ts +1 -0
- package/public-api.d.ts.map +1 -0
- package/reveldigital-player-client.d.ts +2 -0
- package/reveldigital-player-client.d.ts.map +1 -0
- package/bundles/reveldigital-player-client.umd.js +0 -686
- package/bundles/reveldigital-player-client.umd.js.map +0 -1
- package/esm2015/lib/player-client.module.js +0 -9
- package/esm2015/lib/player-client.service.js +0 -248
- package/fesm2015/reveldigital-player-client.js.map +0 -1
- package/reveldigital-player-client.metadata.json +0 -1
package/README.md
CHANGED
|
@@ -1,24 +1,3 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Revel Digital Angular Client
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
## Code scaffolding
|
|
6
|
-
|
|
7
|
-
Run `ng generate component component-name --project player-client` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module --project player-client`.
|
|
8
|
-
> Note: Don't forget to add `--project player-client` or else it will be added to the default project in your `angular.json` file.
|
|
9
|
-
|
|
10
|
-
## Build
|
|
11
|
-
|
|
12
|
-
Run `ng build player-client` to build the project. The build artifacts will be stored in the `dist/` directory.
|
|
13
|
-
|
|
14
|
-
## Publishing
|
|
15
|
-
|
|
16
|
-
After building your library with `ng build player-client`, go to the dist folder `cd dist/player-client` and run `npm publish`.
|
|
17
|
-
|
|
18
|
-
## Running unit tests
|
|
19
|
-
|
|
20
|
-
Run `ng test player-client` to execute the unit tests via [Karma](https://karma-runner.github.io).
|
|
21
|
-
|
|
22
|
-
## Further help
|
|
23
|
-
|
|
24
|
-
To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI README](https://github.com/angular/angular-cli/blob/master/README.md).
|
|
3
|
+
Libary for Angular based Revel Digital gadgets
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { NgModule } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export class PlayerClientModule {
|
|
4
|
+
}
|
|
5
|
+
PlayerClientModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: PlayerClientModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
6
|
+
PlayerClientModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: PlayerClientModule });
|
|
7
|
+
PlayerClientModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: PlayerClientModule, imports: [[]] });
|
|
8
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: PlayerClientModule, decorators: [{
|
|
9
|
+
type: NgModule,
|
|
10
|
+
args: [{
|
|
11
|
+
imports: [],
|
|
12
|
+
}]
|
|
13
|
+
}] });
|
|
14
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxheWVyLWNsaWVudC5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yZXZlbGRpZ2l0YWwvcGxheWVyLWNsaWVudC9zcmMvbGliL3BsYXllci1jbGllbnQubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBT3pDLE1BQU0sT0FBTyxrQkFBa0I7O2dIQUFsQixrQkFBa0I7aUhBQWxCLGtCQUFrQjtpSEFBbEIsa0JBQWtCLFlBSHBCLEVBQ1I7NEZBRVUsa0JBQWtCO2tCQUo5QixRQUFRO21CQUFDO29CQUNSLE9BQU8sRUFBRSxFQUNSO2lCQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIFBsYXllckNsaWVudE1vZHVsZSB7IH1cbiJdfQ==
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { Subject } from 'rxjs';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
export class PlayerClientService {
|
|
5
|
+
constructor() {
|
|
6
|
+
this.onCommand$ = new Subject();
|
|
7
|
+
this.onStart$ = new Subject();
|
|
8
|
+
this.onStop$ = new Subject();
|
|
9
|
+
let self = this;
|
|
10
|
+
window.RevelDigital = {
|
|
11
|
+
Controller: {
|
|
12
|
+
onCommand: function (name, arg) {
|
|
13
|
+
self.onCommand$.next({ name: name, arg: arg });
|
|
14
|
+
},
|
|
15
|
+
onStart: function () {
|
|
16
|
+
self.onStart$.next();
|
|
17
|
+
},
|
|
18
|
+
onStop: function () {
|
|
19
|
+
self.onStop$.next();
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
this.clientPromise = null;
|
|
24
|
+
}
|
|
25
|
+
callback(...args) {
|
|
26
|
+
this.getClient().then((client) => {
|
|
27
|
+
switch (args.length) {
|
|
28
|
+
case 0:
|
|
29
|
+
client.callback();
|
|
30
|
+
break;
|
|
31
|
+
case 1:
|
|
32
|
+
client.callback(args[0]);
|
|
33
|
+
break;
|
|
34
|
+
case 2:
|
|
35
|
+
client.callback(args[1]);
|
|
36
|
+
break;
|
|
37
|
+
case 3:
|
|
38
|
+
client.callback(args[2]);
|
|
39
|
+
break;
|
|
40
|
+
case 4:
|
|
41
|
+
client.callback(args[3]);
|
|
42
|
+
break;
|
|
43
|
+
case 5:
|
|
44
|
+
client.callback(args[4]);
|
|
45
|
+
break;
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
async getDeviceTime(date) {
|
|
50
|
+
const client = await this.getClient();
|
|
51
|
+
if (date !== undefined) {
|
|
52
|
+
return client.getDeviceTime(date);
|
|
53
|
+
}
|
|
54
|
+
return client.getDeviceTime();
|
|
55
|
+
}
|
|
56
|
+
async getDeviceTimeZoneName() {
|
|
57
|
+
const client = await this.getClient();
|
|
58
|
+
return client.getDeviceTimeZoneName();
|
|
59
|
+
}
|
|
60
|
+
async getDeviceTimeZoneID() {
|
|
61
|
+
const client = await this.getClient();
|
|
62
|
+
return client.getDeviceTimeZoneID();
|
|
63
|
+
}
|
|
64
|
+
async getDeviceTimeZoneOffset() {
|
|
65
|
+
const client = await this.getClient();
|
|
66
|
+
return client.getDeviceTimeZoneOffset();
|
|
67
|
+
}
|
|
68
|
+
async getLanguageCode() {
|
|
69
|
+
const client = await this.getClient();
|
|
70
|
+
return client.getLanguageCode();
|
|
71
|
+
}
|
|
72
|
+
async getDeviceKey() {
|
|
73
|
+
const client = await this.getClient();
|
|
74
|
+
return client.getDeviceKey();
|
|
75
|
+
}
|
|
76
|
+
sendCommand(name, arg) {
|
|
77
|
+
this.getClient().then((client) => {
|
|
78
|
+
client.sendCommand(name, arg);
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
sendRemoteCommand(deviceKeys, name, arg) {
|
|
82
|
+
this.getClient().then((client) => {
|
|
83
|
+
client.sendRemoteCommand(deviceKeys, name, arg);
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
track(eventName, properties) {
|
|
87
|
+
this.getClient().then((client) => {
|
|
88
|
+
client.track(eventName, JSON.stringify(properties));
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
timeEvent(eventName) {
|
|
92
|
+
this.getClient().then((client) => {
|
|
93
|
+
client.timeEvent(eventName);
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
newEventSession(id) {
|
|
97
|
+
this.getClient().then((client) => {
|
|
98
|
+
if (id !== undefined) {
|
|
99
|
+
client.newEventSession();
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
client.newEventSession(id);
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
async getRevelRoot() {
|
|
107
|
+
const client = await this.getClient();
|
|
108
|
+
return client.getRevelRoot();
|
|
109
|
+
}
|
|
110
|
+
async getCommandMap() {
|
|
111
|
+
const client = await this.getClient();
|
|
112
|
+
return JSON.parse(await client.getCommandMap());
|
|
113
|
+
// let map = new Map<string, any>();
|
|
114
|
+
// let obj = JSON.parse(await client.getCommandMap());
|
|
115
|
+
// for (let key in obj) {
|
|
116
|
+
// map.set(key, obj[key]);
|
|
117
|
+
// }
|
|
118
|
+
// return map;
|
|
119
|
+
}
|
|
120
|
+
// ---
|
|
121
|
+
// PRIVATE METHODS.
|
|
122
|
+
// ---
|
|
123
|
+
// I return a Promise that resolves with a Tracker API (which may be the 3rd-party
|
|
124
|
+
// library or a mock API representation).
|
|
125
|
+
getClient() {
|
|
126
|
+
if (this.clientPromise) {
|
|
127
|
+
return (this.clientPromise);
|
|
128
|
+
}
|
|
129
|
+
if (window.Client) {
|
|
130
|
+
return (this.clientPromise = Promise.resolve(window.Client));
|
|
131
|
+
}
|
|
132
|
+
// A "complete" status indicates that the "load" event has been fired on the
|
|
133
|
+
// window; and, that all sub-resources such as Scripts, Images, and Frames have
|
|
134
|
+
// been loaded.
|
|
135
|
+
if (window.document.readyState === "complete") {
|
|
136
|
+
// If this event has fired AND the 3rd-party script isn't available (see IF-
|
|
137
|
+
// condition BEFORE this one), it means that the 3rd-party script either
|
|
138
|
+
// failed on the network or was BLOCKED by an ad-blocker. As such, we have to
|
|
139
|
+
// fall-back to using a mock API.
|
|
140
|
+
return (this.clientPromise = Promise.resolve(new NoopClient()));
|
|
141
|
+
}
|
|
142
|
+
// ASSERT: If we made it this far, the document has not completed loading (but it
|
|
143
|
+
// may be in an "interactive" state which is when I believe that the Angular app
|
|
144
|
+
// gets bootstrapped). As such, we need bind to the LOAD event to wait for our
|
|
145
|
+
// third-party scripts to load (or fail to load, or be blocked).
|
|
146
|
+
this.clientPromise = new Promise((resolve) => {
|
|
147
|
+
window.addEventListener("load", function handleWindowLoad() {
|
|
148
|
+
// At this point, the 3rd-party library is either available or
|
|
149
|
+
// it's not - there's no further loading to do. If it's not
|
|
150
|
+
// present on the global scope, we're going to fall-back to using
|
|
151
|
+
// a mock API.
|
|
152
|
+
resolve(window.Client || new NoopClient());
|
|
153
|
+
});
|
|
154
|
+
});
|
|
155
|
+
return (this.clientPromise);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
PlayerClientService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: PlayerClientService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
159
|
+
PlayerClientService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: PlayerClientService, providedIn: 'root' });
|
|
160
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: PlayerClientService, decorators: [{
|
|
161
|
+
type: Injectable,
|
|
162
|
+
args: [{
|
|
163
|
+
providedIn: 'root'
|
|
164
|
+
}]
|
|
165
|
+
}], ctorParameters: function () { return []; } });
|
|
166
|
+
// ----------------------------------------------------------------------------------- //
|
|
167
|
+
// ----------------------------------------------------------------------------------- //
|
|
168
|
+
// I provide a mock API for the 3rd-party script. This just allows the consuming code to
|
|
169
|
+
// act as though the library is available even if it failed to load (example, it was
|
|
170
|
+
// blocked by an ad-blocker).
|
|
171
|
+
class NoopClient {
|
|
172
|
+
constructor() {
|
|
173
|
+
console.warn("Client API not available, falling back to mock API.");
|
|
174
|
+
}
|
|
175
|
+
callback(...args) {
|
|
176
|
+
// NOOP implement, nothing to do....
|
|
177
|
+
}
|
|
178
|
+
getDeviceTime(date) {
|
|
179
|
+
return Promise.resolve(null);
|
|
180
|
+
}
|
|
181
|
+
async getDeviceTimeZoneName() {
|
|
182
|
+
return Promise.resolve(null);
|
|
183
|
+
}
|
|
184
|
+
async getDeviceTimeZoneID() {
|
|
185
|
+
return Promise.resolve(null);
|
|
186
|
+
}
|
|
187
|
+
async getDeviceTimeZoneOffset() {
|
|
188
|
+
return Promise.resolve(null);
|
|
189
|
+
}
|
|
190
|
+
async getLanguageCode() {
|
|
191
|
+
return Promise.resolve(null);
|
|
192
|
+
}
|
|
193
|
+
async getDeviceKey() {
|
|
194
|
+
return Promise.resolve(null);
|
|
195
|
+
}
|
|
196
|
+
sendCommand(name, arg) {
|
|
197
|
+
// NOOP implement, nothing to do....
|
|
198
|
+
}
|
|
199
|
+
sendRemoteCommand(deviceKeys, name, arg) {
|
|
200
|
+
// NOOP implement, nothing to do....
|
|
201
|
+
}
|
|
202
|
+
track(eventName, properties) {
|
|
203
|
+
// NOOP implement, nothing to do....
|
|
204
|
+
}
|
|
205
|
+
timeEvent(eventName) {
|
|
206
|
+
// NOOP implement, nothing to do....
|
|
207
|
+
}
|
|
208
|
+
newEventSession(id) {
|
|
209
|
+
// NOOP implement, nothing to do....
|
|
210
|
+
}
|
|
211
|
+
async getRevelRoot() {
|
|
212
|
+
return Promise.resolve(null);
|
|
213
|
+
}
|
|
214
|
+
async getCommandMap() {
|
|
215
|
+
return Promise.resolve('{}');
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxheWVyLWNsaWVudC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcmV2ZWxkaWdpdGFsL3BsYXllci1jbGllbnQvc3JjL2xpYi9wbGF5ZXItY2xpZW50LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDOztBQXNEL0IsTUFBTSxPQUFPLG1CQUFtQjtJQVE5QjtRQUpPLGVBQVUsR0FBRyxJQUFJLE9BQU8sRUFBVyxDQUFDO1FBQ3BDLGFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQ3pCLFlBQU8sR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBSTdCLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQztRQUNmLE1BQWMsQ0FBQyxZQUFZLEdBQUc7WUFDN0IsVUFBVSxFQUFFO2dCQUNWLFNBQVMsRUFBRSxVQUFVLElBQVksRUFBRSxHQUFXO29CQUM1QyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7Z0JBQ2pELENBQUM7Z0JBQ0QsT0FBTyxFQUFFO29CQUNQLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ3ZCLENBQUM7Z0JBQ0QsTUFBTSxFQUFFO29CQUNOLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ3RCLENBQUM7YUFDRjtTQUNGLENBQUE7UUFFRCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztJQUM1QixDQUFDO0lBRU0sUUFBUSxDQUFDLEdBQUcsSUFBVztRQUU1QixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFFL0IsUUFBUSxJQUFJLENBQUMsTUFBTSxFQUFFO2dCQUNuQixLQUFLLENBQUM7b0JBQ0osTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO29CQUNsQixNQUFNO2dCQUNSLEtBQUssQ0FBQztvQkFDSixNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUN6QixNQUFNO2dCQUNSLEtBQUssQ0FBQztvQkFDSixNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUN6QixNQUFNO2dCQUNSLEtBQUssQ0FBQztvQkFDSixNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUN6QixNQUFNO2dCQUNSLEtBQUssQ0FBQztvQkFDSixNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUN6QixNQUFNO2dCQUNSLEtBQUssQ0FBQztvQkFDSixNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUN6QixNQUFNO2FBQ1Q7UUFDSCxDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFTSxLQUFLLENBQUMsYUFBYSxDQUFDLElBQVc7UUFFcEMsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFFdEMsSUFBSSxJQUFJLEtBQUssU0FBUyxFQUFFO1lBQ3RCLE9BQU8sTUFBTSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNuQztRQUNELE9BQU8sTUFBTSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ2hDLENBQUM7SUFFTSxLQUFLLENBQUMscUJBQXFCO1FBRWhDLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBRXRDLE9BQU8sTUFBTSxDQUFDLHFCQUFxQixFQUFFLENBQUM7SUFDeEMsQ0FBQztJQUVNLEtBQUssQ0FBQyxtQkFBbUI7UUFFOUIsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFFdEMsT0FBTyxNQUFNLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztJQUN0QyxDQUFDO0lBRU0sS0FBSyxDQUFDLHVCQUF1QjtRQUVsQyxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUV0QyxPQUFPLE1BQU0sQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO0lBQzFDLENBQUM7SUFFTSxLQUFLLENBQUMsZUFBZTtRQUUxQixNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUV0QyxPQUFPLE1BQU0sQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUNsQyxDQUFDO0lBRU0sS0FBSyxDQUFDLFlBQVk7UUFFdkIsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFFdEMsT0FBTyxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUVNLFdBQVcsQ0FBQyxJQUFZLEVBQUUsR0FBVztRQUUxQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDL0IsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDaEMsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBRU0saUJBQWlCLENBQUMsVUFBb0IsRUFBRSxJQUFZLEVBQUUsR0FBVztRQUV0RSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDL0IsTUFBTSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDbEQsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0sS0FBSyxDQUFDLFNBQWlCLEVBQUUsVUFBNEI7UUFFMUQsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLElBQUksQ0FB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O0lBRU0sZUFBZSxDQUFDLEVBQVc7UUFFaEMsb0NBQW9DO0lBQ3RDLENBQUM7SUFFTSxLQUFLLENBQUMsWUFBWTtRQUV2QixPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVNLEtBQUssQ0FBQyxhQUFhO1FBRXhCLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMvQixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuXHJcblxyXG4vLyBTbyB0aGF0IFR5cGVTY3JpcHQgZG9lc24ndCBjb21wbGFpbiwgd2UncmUgZ29pbmcgdG8gYXVnbWVudCB0aGUgR0xPQkFMIC8gV0lORE9XIFxyXG4vLyBuYW1lLXNwYWNlIGRlZmluaXRpb24gdG8gaW5jbHVkZSB0aGUgVHJhY2tlciBBUEkuIFRoaXMgYWxzbyBwcm92aWRlcyB1cyB3aXRoIGEgcGxhY2VcclxuLy8gdG8gYWN0dWFsbHkgRE9DVU1FTlQgdGhlIEFQSSBzbyB0aGF0IG91ciBkZXZlbG9wZXJzIGFyZW4ndCBndWVzc2luZyBhYm91dCB3aGF0J3NcclxuLy8gYXZhaWxhYmxlIG9uIHRoZSBsaWJyYXJ5LlxyXG5kZWNsYXJlIGdsb2JhbCB7XHJcbiAgdmFyIENsaWVudDogQ2xpZW50O1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIENsaWVudCB7XHJcblxyXG4gIGNhbGxiYWNrKC4uLmFyZ3M6IGFueVtdKTogdm9pZDtcclxuXHJcbiAgZ2V0RGV2aWNlVGltZShkYXRlPzogRGF0ZSk6IFByb21pc2U8c3RyaW5nPjtcclxuXHJcbiAgZ2V0RGV2aWNlVGltZVpvbmVOYW1lKCk6IFByb21pc2U8c3RyaW5nPjtcclxuXHJcbiAgZ2V0RGV2aWNlVGltZVpvbmVJRCgpOiBQcm9taXNlPHN0cmluZz47XHJcblxyXG4gIGdldERldmljZVRpbWVab25lT2Zmc2V0KCk6IFByb21pc2U8bnVtYmVyPjtcclxuXHJcbiAgZ2V0TGFuZ3VhZ2VDb2RlKCk6IFByb21pc2U8c3RyaW5nPjtcclxuXHJcbiAgZ2V0RGV2aWNlS2V5KCk6IFByb21pc2U8c3RyaW5nPjtcclxuXHJcbiAgc2VuZENvbW1hbmQobmFtZTogc3RyaW5nLCBhcmc6IHN0cmluZyk6IHZvaWQ7XHJcblxyXG4gIHNlbmRSZW1vdGVDb21tYW5kKGRldmljZUtleXM6IHN0cmluZ1tdLCBuYW1lOiBzdHJpbmcsIGFyZzogc3RyaW5nKTogdm9pZDtcclxuXHJcbiAgdHJhY2soZXZlbnROYW1lOiBzdHJpbmcsIHByb3BlcnRpZXM/OiBzdHJpbmcpOiB2b2lkO1xyXG5cclxuICB0aW1lRXZlbnQoZXZlbnROYW1lOiBzdHJpbmcpOiB2b2lkO1xyXG5cclxuICBuZXdFdmVudFNlc3Npb24oaWQ/OiBzdHJpbmcpOiB2b2lkO1xyXG5cclxuICBnZXRSZXZlbFJvb3QoKTogUHJvbWlzZTxzdHJpbmc+O1xyXG5cclxuICBnZXRDb21tYW5kTWFwKCk6IFByb21pc2U8c3RyaW5nPjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBFdmVudFByb3BlcnRpZXMge1xyXG4gIFtrZXk6IHN0cmluZ106IGFueTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBDb21tYW5kIHtcclxuICBuYW1lOiBzdHJpbmc7XHJcbiAgYXJnOiBzdHJpbmc7XHJcbn1cclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIFBsYXllckNsaWVudFNlcnZpY2Uge1xyXG5cclxuICBwcml2YXRlIGNsaWVudFByb21pc2U6IFByb21pc2U8Q2xpZW50PiB8IG51bGw7XHJcblxyXG4gIHB1YmxpYyBvbkNvbW1hbmQkID0gbmV3IFN1YmplY3Q8Q29tbWFuZD4oKTtcclxuICBwdWJsaWMgb25TdGFydCQgPSBuZXcgU3ViamVjdCgpO1xyXG4gIHB1YmxpYyBvblN0b3AkID0gbmV3IFN1YmplY3QoKTtcclxuXHJcbiAgY29uc3RydWN0b3IoKSB7XHJcblxyXG4gICAgbGV0IHNlbGYgPSB0aGlzO1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLlJldmVsRGlnaXRhbCA9IHtcclxuICAgICAgQ29udHJvbGxlcjoge1xyXG4gICAgICAgIG9uQ29tbWFuZDogZnVuY3Rpb24gKG5hbWU6IHN0cmluZywgYXJnOiBzdHJpbmcpIHtcclxuICAgICAgICAgIHNlbGYub25Db21tYW5kJC5uZXh0KHsgbmFtZTogbmFtZSwgYXJnOiBhcmcgfSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBvblN0YXJ0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICBzZWxmLm9uU3RhcnQkLm5leHQoKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIG9uU3RvcDogZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICBzZWxmLm9uU3RvcCQubmV4dCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY2xpZW50UHJvbWlzZSA9IG51bGw7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2FsbGJhY2soLi4uYXJnczogYW55W10pOiB2b2lkIHtcclxuXHJcbiAgICB0aGlzLmdldENsaWVudCgpLnRoZW4oKGNsaWVudCkgPT4ge1xyXG5cclxuICAgICAgc3dpdGNoIChhcmdzLmxlbmd0aCkge1xyXG4gICAgICAgIGNhc2UgMDpcclxuICAgICAgICAgIGNsaWVudC5jYWxsYmFjaygpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAxOlxyXG4gICAgICAgICAgY2xpZW50LmNhbGxiYWNrKGFyZ3NbMF0pO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAyOlxyXG4gICAgICAgICAgY2xpZW50LmNhbGxiYWNrKGFyZ3NbMV0pO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAzOlxyXG4gICAgICAgICAgY2xpZW50LmNhbGxiYWNrKGFyZ3NbMl0pO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSA0OlxyXG4gICAgICAgICAgY2xpZW50LmNhbGxiYWNrKGFyZ3NbM10pO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSA1OlxyXG4gICAgICAgICAgY2xpZW50LmNhbGxiYWNrKGFyZ3NbNF0pO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZ2V0RGV2aWNlVGltZShkYXRlPzogRGF0ZSk6IFByb21pc2U8c3RyaW5nPiB7XHJcblxyXG4gICAgY29uc3QgY2xpZW50ID0gYXdhaXQgdGhpcy5nZXRDbGllbnQoKTtcclxuXHJcbiAgICBpZiAoZGF0ZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHJldHVybiBjbGllbnQuZ2V0RGV2aWNlVGltZShkYXRlKTtcclxuICAgIH1cclxuICAgIHJldHVybiBjbGllbnQuZ2V0RGV2aWNlVGltZSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGdldERldmljZVRpbWVab25lTmFtZSgpOiBQcm9taXNlPHN0cmluZz4ge1xyXG5cclxuICAgIGNvbnN0IGNsaWVudCA9IGF3YWl0IHRoaXMuZ2V0Q2xpZW50KCk7XHJcblxyXG4gICAgcmV0dXJuIGNsaWVudC5nZXREZXZpY2VUaW1lWm9uZU5hbWUoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBnZXREZXZpY2VUaW1lWm9uZUlEKCk6IFByb21pc2U8c3RyaW5nPiB7XHJcblxyXG4gICAgY29uc3QgY2xpZW50ID0gYXdhaXQgdGhpcy5nZXRDbGllbnQoKTtcclxuXHJcbiAgICByZXR1cm4gY2xpZW50LmdldERldmljZVRpbWVab25lSUQoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBnZXREZXZpY2VUaW1lWm9uZU9mZnNldCgpOiBQcm9taXNlPG51bWJlcj4ge1xyXG5cclxuICAgIGNvbnN0IGNsaWVudCA9IGF3YWl0IHRoaXMuZ2V0Q2xpZW50KCk7XHJcblxyXG4gICAgcmV0dXJuIGNsaWVudC5nZXREZXZpY2VUaW1lWm9uZU9mZnNldCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGdldExhbmd1YWdlQ29kZSgpOiBQcm9taXNlPHN0cmluZz4ge1xyXG5cclxuICAgIGNvbnN0IGNsaWVudCA9IGF3YWl0IHRoaXMuZ2V0Q2xpZW50KCk7XHJcblxyXG4gICAgcmV0dXJuIGNsaWVudC5nZXRMYW5ndWFnZUNvZGUoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBnZXREZXZpY2VLZXkoKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuXHJcbiAgICBjb25zdCBjbGllbnQgPSBhd2FpdCB0aGlzLmdldENsaWVudCgpO1xyXG5cclxuICAgIHJldHVybiBjbGllbnQuZ2V0RGV2aWNlS2V5KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2VuZENvbW1hbmQobmFtZTogc3RyaW5nLCBhcmc6IHN0cmluZyk6IHZvaWQge1xyXG5cclxuICAgIHRoaXMuZ2V0Q2xpZW50KCkudGhlbigoY2xpZW50KSA9PiB7XHJcbiAgICAgIGNsaWVudC5zZW5kQ29tbWFuZChuYW1lLCBhcmcpO1xyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZW5kUmVtb3RlQ29tbWFuZChkZXZpY2VLZXlzOiBzdHJpbmdbXSwgbmFtZTogc3RyaW5nLCBhcmc6IHN0cmluZyk6IHZvaWQge1xyXG5cclxuICAgIHRoaXMuZ2V0Q2xpZW50KCkudGhlbigoY2xpZW50KSA9PiB7XHJcbiAgICAgIGNsaWVudC5zZW5kUmVtb3RlQ29tbWFuZChkZXZpY2VLZXlzLCBuYW1lLCBhcmcpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdHJhY2soZXZlbnROYW1lOiBzdHJpbmcsIHByb3BlcnRpZXM/OiBFdmVudFByb3BlcnRpZXMpOiB2b2lkIHtcclxuXHJcbiAgICB0aGlzLmdldENsaWVudCgpLnRoZW4oKGNsaWVudCkgPT4ge1xyXG4gICAgICBjbGllbnQudHJhY2soZXZlbnROYW1lLCBKU09OLnN0cmluZ2lmeShwcm9wZXJ0aWVzKSk7XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHRpbWVFdmVudChldmVudE5hbWU6IHN0cmluZyk6IHZvaWQge1xyXG5cclxuICAgIHRoaXMuZ2V0Q2xpZW50KCkudGhlbigoY2xpZW50KSA9PiB7XHJcbiAgICAgIGNsaWVudC50aW1lRXZlbnQoZXZlbnROYW1lKTtcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbmV3RXZlbnRTZXNzaW9uKGlkPzogc3RyaW5nKTogdm9pZCB7XHJcblxyXG4gICAgdGhpcy5nZXRDbGllbnQoKS50aGVuKChjbGllbnQpID0+IHtcclxuICAgICAgaWYgKGlkICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICBjbGllbnQubmV3RXZlbnRTZXNzaW9uKCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY2xpZW50Lm5ld0V2ZW50U2Vzc2lvbihpZCk7XHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZ2V0UmV2ZWxSb290KCk6IFByb21pc2U8c3RyaW5nPiB7XHJcblxyXG4gICAgY29uc3QgY2xpZW50ID0gYXdhaXQgdGhpcy5nZXRDbGllbnQoKTtcclxuXHJcbiAgICByZXR1cm4gY2xpZW50LmdldFJldmVsUm9vdCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGdldENvbW1hbmRNYXAoKTogUHJvbWlzZTxhbnk+IHtcclxuXHJcbiAgICBjb25zdCBjbGllbnQgPSBhd2FpdCB0aGlzLmdldENsaWVudCgpO1xyXG5cclxuICAgIHJldHVybiBKU09OLnBhcnNlKGF3YWl0IGNsaWVudC5nZXRDb21tYW5kTWFwKCkpO1xyXG5cclxuICAgIC8vIGxldCBtYXAgPSBuZXcgTWFwPHN0cmluZywgYW55PigpO1xyXG5cclxuICAgIC8vIGxldCBvYmogPSBKU09OLnBhcnNlKGF3YWl0IGNsaWVudC5nZXRDb21tYW5kTWFwKCkpO1xyXG4gICAgLy8gZm9yIChsZXQga2V5IGluIG9iaikge1xyXG4gICAgLy8gICBtYXAuc2V0KGtleSwgb2JqW2tleV0pO1xyXG4gICAgLy8gfVxyXG4gICAgLy8gcmV0dXJuIG1hcDtcclxuICB9XHJcblxyXG4gIC8vIC0tLVxyXG4gIC8vIFBSSVZBVEUgTUVUSE9EUy5cclxuICAvLyAtLS1cclxuXHJcbiAgLy8gSSByZXR1cm4gYSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCBhIFRyYWNrZXIgQVBJICh3aGljaCBtYXkgYmUgdGhlIDNyZC1wYXJ0eVxyXG4gIC8vIGxpYnJhcnkgb3IgYSBtb2NrIEFQSSByZXByZXNlbnRhdGlvbikuXHJcbiAgcHJpdmF0ZSBnZXRDbGllbnQoKTogUHJvbWlzZTxDbGllbnQ+IHtcclxuXHJcbiAgICBpZiAodGhpcy5jbGllbnRQcm9taXNlKSB7XHJcblxyXG4gICAgICByZXR1cm4gKHRoaXMuY2xpZW50UHJvbWlzZSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHdpbmRvdy5DbGllbnQpIHtcclxuXHJcbiAgICAgIHJldHVybiAodGhpcy5jbGllbnRQcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKHdpbmRvdy5DbGllbnQpKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBBIFwiY29tcGxldGVcIiBzdGF0dXMgaW5kaWNhdGVzIHRoYXQgdGhlIFwibG9hZFwiIGV2ZW50IGhhcyBiZWVuIGZpcmVkIG9uIHRoZVxyXG4gICAgLy8gd2luZG93OyBhbmQsIHRoYXQgYWxsIHN1Yi1yZXNvdXJjZXMgc3VjaCBhcyBTY3JpcHRzLCBJbWFnZXMsIGFuZCBGcmFtZXMgaGF2ZVxyXG4gICAgLy8gYmVlbiBsb2FkZWQuXHJcbiAgICBpZiAod2luZG93LmRvY3VtZW50LnJlYWR5U3RhdGUgPT09IFwiY29tcGxldGVcIikge1xyXG5cclxuICAgICAgLy8gSWYgdGhpcyBldmVudCBoYXMgZmlyZWQgQU5EIHRoZSAzcmQtcGFydHkgc2NyaXB0IGlzbid0IGF2YWlsYWJsZSAoc2VlIElGLVxyXG4gICAgICAvLyBjb25kaXRpb24gQkVGT1JFIHRoaXMgb25lKSwgaXQgbWVhbnMgdGhhdCB0aGUgM3JkLXBhcnR5IHNjcmlwdCBlaXRoZXJcclxuICAgICAgLy8gZmFpbGVkIG9uIHRoZSBuZXR3b3JrIG9yIHdhcyBCTE9DS0VEIGJ5IGFuIGFkLWJsb2NrZXIuIEFzIHN1Y2gsIHdlIGhhdmUgdG9cclxuICAgICAgLy8gZmFsbC1iYWNrIHRvIHVzaW5nIGEgbW9jayBBUEkuXHJcbiAgICAgIHJldHVybiAodGhpcy5jbGllbnRQcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKG5ldyBOb29wQ2xpZW50KCkpKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBBU1NFUlQ6IElmIHdlIG1hZGUgaXQgdGhpcyBmYXIsIHRoZSBkb2N1bWVudCBoYXMgbm90IGNvbXBsZXRlZCBsb2FkaW5nIChidXQgaXRcclxuICAgIC8vIG1heSBiZSBpbiBhbiBcImludGVyYWN0aXZlXCIgc3RhdGUgd2hpY2ggaXMgd2hlbiBJIGJlbGlldmUgdGhhdCB0aGUgQW5ndWxhciBhcHBcclxuICAgIC8vIGdldHMgYm9vdHN0cmFwcGVkKS4gQXMgc3VjaCwgd2UgbmVlZCBiaW5kIHRvIHRoZSBMT0FEIGV2ZW50IHRvIHdhaXQgZm9yIG91clxyXG4gICAgLy8gdGhpcmQtcGFydHkgc2NyaXB0cyB0byBsb2FkIChvciBmYWlsIHRvIGxvYWQsIG9yIGJlIGJsb2NrZWQpLlxyXG4gICAgdGhpcy5jbGllbnRQcm9taXNlID0gbmV3IFByb21pc2U8Q2xpZW50PihcclxuICAgICAgKHJlc29sdmUpID0+IHtcclxuXHJcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXHJcbiAgICAgICAgICBcImxvYWRcIixcclxuICAgICAgICAgIGZ1bmN0aW9uIGhhbmRsZVdpbmRvd0xvYWQoKSB7XHJcblxyXG4gICAgICAgICAgICAvLyBBdCB0aGlzIHBvaW50LCB0aGUgM3JkLXBhcnR5IGxpYnJhcnkgaXMgZWl0aGVyIGF2YWlsYWJsZSBvclxyXG4gICAgICAgICAgICAvLyBpdCdzIG5vdCAtIHRoZXJlJ3Mgbm8gZnVydGhlciBsb2FkaW5nIHRvIGRvLiBJZiBpdCdzIG5vdFxyXG4gICAgICAgICAgICAvLyBwcmVzZW50IG9uIHRoZSBnbG9iYWwgc2NvcGUsIHdlJ3JlIGdvaW5nIHRvIGZhbGwtYmFjayB0byB1c2luZ1xyXG4gICAgICAgICAgICAvLyBhIG1vY2sgQVBJLlxyXG4gICAgICAgICAgICByZXNvbHZlKHdpbmRvdy5DbGllbnQgfHwgbmV3IE5vb3BDbGllbnQoKSk7XHJcblxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICB9XHJcbiAgICApO1xyXG5cclxuICAgIHJldHVybiAodGhpcy5jbGllbnRQcm9taXNlKTtcclxuICB9XHJcblxyXG59XHJcblxyXG5cclxuXHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXHJcblxyXG4vLyBJIHByb3ZpZGUgYSBtb2NrIEFQSSBmb3IgdGhlIDNyZC1wYXJ0eSBzY3JpcHQuIFRoaXMganVzdCBhbGxvd3MgdGhlIGNvbnN1bWluZyBjb2RlIHRvXHJcbi8vIGFjdCBhcyB0aG91Z2ggdGhlIGxpYnJhcnkgaXMgYXZhaWxhYmxlIGV2ZW4gaWYgaXQgZmFpbGVkIHRvIGxvYWQgKGV4YW1wbGUsIGl0IHdhc1xyXG4vLyBibG9ja2VkIGJ5IGFuIGFkLWJsb2NrZXIpLlxyXG5jbGFzcyBOb29wQ2xpZW50IGltcGxlbWVudHMgQ2xpZW50IHtcclxuXHJcbiAgY29uc3RydWN0b3IoKSB7XHJcblxyXG4gICAgY29uc29sZS53YXJuKFwiQ2xpZW50IEFQSSBub3QgYXZhaWxhYmxlLCBmYWxsaW5nIGJhY2sgdG8gbW9jayBBUEkuXCIpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNhbGxiYWNrKC4uLmFyZ3M6IGFueVtdKTogdm9pZCB7XHJcblxyXG4gICAgLy8gTk9PUCBpbXBsZW1lbnQsIG5vdGhpbmcgdG8gZG8uLi4uXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0RGV2aWNlVGltZShkYXRlPzogRGF0ZSk6IFByb21pc2U8c3RyaW5nPiB7XHJcblxyXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBnZXREZXZpY2VUaW1lWm9uZU5hbWUoKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuXHJcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGdldERldmljZVRpbWVab25lSUQoKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuXHJcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGdldERldmljZVRpbWVab25lT2Zmc2V0KCk6IFByb21pc2U8bnVtYmVyPiB7XHJcblxyXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBnZXRMYW5ndWFnZUNvZGUoKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuXHJcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGdldERldmljZUtleSgpOiBQcm9taXNlPHN0cmluZz4ge1xyXG5cclxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2VuZENvbW1hbmQobmFtZTogc3RyaW5nLCBhcmc6IHN0cmluZyk6IHZvaWQge1xyXG5cclxuICAgIC8vIE5PT1AgaW1wbGVtZW50LCBub3RoaW5nIHRvIGRvLi4uLlxyXG4gIH1cclxuXHJcbiAgcHVibGljIHNlbmRSZW1vdGVDb21tYW5kKGRldmljZUtleXM6IHN0cmluZ1tdLCBuYW1lOiBzdHJpbmcsIGFyZzogc3RyaW5nKSB7XHJcblxyXG4gICAgLy8gTk9PUCBpbXBsZW1lbnQsIG5vdGhpbmcgdG8gZG8uLi4uXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdHJhY2soZXZlbnROYW1lOiBzdHJpbmcsIHByb3BlcnRpZXM/OiBzdHJpbmcpOiB2b2lkIHtcclxuXHJcbiAgICAvLyBOT09QIGltcGxlbWVudCwgbm90aGluZyB0byBkby4uLi5cclxuICB9XHJcblxyXG4gIHB1YmxpYyB0aW1lRXZlbnQoZXZlbnROYW1lOiBzdHJpbmcpOiB2b2lkIHtcclxuXHJcbiAgICAvLyBOT09QIGltcGxlbWVudCwgbm90aGluZyB0byBkby4uLi5cclxuICB9XHJcblxyXG4gIHB1YmxpYyBuZXdFdmVudFNlc3Npb24oaWQ/OiBzdHJpbmcpOiB2b2lkIHtcclxuXHJcbiAgICAvLyBOT09QIGltcGxlbWVudCwgbm90aGluZyB0byBkby4uLi5cclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBnZXRSZXZlbFJvb3QoKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuXHJcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGdldENvbW1hbmRNYXAoKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuXHJcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCd7fScpO1xyXG4gIH1cclxufVxyXG4iXX0=
|
|
File without changes
|
|
File without changes
|
|
@@ -173,13 +173,14 @@ class PlayerClientService {
|
|
|
173
173
|
return (this.clientPromise);
|
|
174
174
|
}
|
|
175
175
|
}
|
|
176
|
-
PlayerClientService.ɵ
|
|
177
|
-
PlayerClientService
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
176
|
+
PlayerClientService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: PlayerClientService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
177
|
+
PlayerClientService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: PlayerClientService, providedIn: 'root' });
|
|
178
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: PlayerClientService, decorators: [{
|
|
179
|
+
type: Injectable,
|
|
180
|
+
args: [{
|
|
181
|
+
providedIn: 'root'
|
|
182
|
+
}]
|
|
183
|
+
}], ctorParameters: function () { return []; } });
|
|
183
184
|
// ----------------------------------------------------------------------------------- //
|
|
184
185
|
// ----------------------------------------------------------------------------------- //
|
|
185
186
|
// I provide a mock API for the 3rd-party script. This just allows the consuming code to
|
|
@@ -249,11 +250,15 @@ class NoopClient {
|
|
|
249
250
|
|
|
250
251
|
class PlayerClientModule {
|
|
251
252
|
}
|
|
252
|
-
PlayerClientModule
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
253
|
+
PlayerClientModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: PlayerClientModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
254
|
+
PlayerClientModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: PlayerClientModule });
|
|
255
|
+
PlayerClientModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: PlayerClientModule, imports: [[]] });
|
|
256
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: PlayerClientModule, decorators: [{
|
|
257
|
+
type: NgModule,
|
|
258
|
+
args: [{
|
|
259
|
+
imports: [],
|
|
260
|
+
}]
|
|
261
|
+
}] });
|
|
257
262
|
|
|
258
263
|
/*
|
|
259
264
|
* Public API Surface of player-client
|
|
@@ -264,4 +269,4 @@ PlayerClientModule.decorators = [
|
|
|
264
269
|
*/
|
|
265
270
|
|
|
266
271
|
export { PlayerClientModule, PlayerClientService };
|
|
267
|
-
//# sourceMappingURL=reveldigital-player-client.
|
|
272
|
+
//# sourceMappingURL=reveldigital-player-client.mjs.map
|
|
@@ -0,0 +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/player-client.module.ts","../../../../projects/reveldigital/player-client/src/public-api.ts","../../../../projects/reveldigital/player-client/src/reveldigital-player-client.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\r\nimport { Subject } from 'rxjs';\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\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 {\r\n\r\n private clientPromise: Promise<Client> | null;\r\n\r\n public onCommand$ = new Subject<Command>();\r\n public onStart$ = new Subject();\r\n public onStop$ = new Subject();\r\n\r\n constructor() {\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 self.onCommand$.next({ name: name, arg: arg });\r\n },\r\n onStart: function () {\r\n self.onStart$.next();\r\n },\r\n onStop: function() {\r\n self.onStop$.next();\r\n }\r\n }\r\n }\r\n\r\n this.clientPromise = null;\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 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 // ---\r\n // PRIVATE METHODS.\r\n // ---\r\n\r\n // I return a Promise that resolves with a Tracker API (which may be the 3rd-party\r\n // library or a mock API representation).\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\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.warn(\"Client API not available, falling back to mock API.\");\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(null);\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","import { NgModule } from '@angular/core';\n\n\n@NgModule({\n imports: [\n ],\n})\nexport class PlayerClientModule { }\n","/*\n * Public API Surface of player-client\n */\n\nexport * from './lib/player-client.service';\nexport * from './lib/player-client.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { Injectable, NgModule } from '@angular/core';
|
|
3
|
+
import { Subject } from 'rxjs';
|
|
4
|
+
|
|
5
|
+
class PlayerClientService {
|
|
6
|
+
constructor() {
|
|
7
|
+
this.onCommand$ = new Subject();
|
|
8
|
+
this.onStart$ = new Subject();
|
|
9
|
+
this.onStop$ = new Subject();
|
|
10
|
+
let self = this;
|
|
11
|
+
window.RevelDigital = {
|
|
12
|
+
Controller: {
|
|
13
|
+
onCommand: function (name, arg) {
|
|
14
|
+
self.onCommand$.next({ name: name, arg: arg });
|
|
15
|
+
},
|
|
16
|
+
onStart: function () {
|
|
17
|
+
self.onStart$.next();
|
|
18
|
+
},
|
|
19
|
+
onStop: function () {
|
|
20
|
+
self.onStop$.next();
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
this.clientPromise = null;
|
|
25
|
+
}
|
|
26
|
+
callback(...args) {
|
|
27
|
+
this.getClient().then((client) => {
|
|
28
|
+
switch (args.length) {
|
|
29
|
+
case 0:
|
|
30
|
+
client.callback();
|
|
31
|
+
break;
|
|
32
|
+
case 1:
|
|
33
|
+
client.callback(args[0]);
|
|
34
|
+
break;
|
|
35
|
+
case 2:
|
|
36
|
+
client.callback(args[1]);
|
|
37
|
+
break;
|
|
38
|
+
case 3:
|
|
39
|
+
client.callback(args[2]);
|
|
40
|
+
break;
|
|
41
|
+
case 4:
|
|
42
|
+
client.callback(args[3]);
|
|
43
|
+
break;
|
|
44
|
+
case 5:
|
|
45
|
+
client.callback(args[4]);
|
|
46
|
+
break;
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
async getDeviceTime(date) {
|
|
51
|
+
const client = await this.getClient();
|
|
52
|
+
if (date !== undefined) {
|
|
53
|
+
return client.getDeviceTime(date);
|
|
54
|
+
}
|
|
55
|
+
return client.getDeviceTime();
|
|
56
|
+
}
|
|
57
|
+
async getDeviceTimeZoneName() {
|
|
58
|
+
const client = await this.getClient();
|
|
59
|
+
return client.getDeviceTimeZoneName();
|
|
60
|
+
}
|
|
61
|
+
async getDeviceTimeZoneID() {
|
|
62
|
+
const client = await this.getClient();
|
|
63
|
+
return client.getDeviceTimeZoneID();
|
|
64
|
+
}
|
|
65
|
+
async getDeviceTimeZoneOffset() {
|
|
66
|
+
const client = await this.getClient();
|
|
67
|
+
return client.getDeviceTimeZoneOffset();
|
|
68
|
+
}
|
|
69
|
+
async getLanguageCode() {
|
|
70
|
+
const client = await this.getClient();
|
|
71
|
+
return client.getLanguageCode();
|
|
72
|
+
}
|
|
73
|
+
async getDeviceKey() {
|
|
74
|
+
const client = await this.getClient();
|
|
75
|
+
return client.getDeviceKey();
|
|
76
|
+
}
|
|
77
|
+
sendCommand(name, arg) {
|
|
78
|
+
this.getClient().then((client) => {
|
|
79
|
+
client.sendCommand(name, arg);
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
sendRemoteCommand(deviceKeys, name, arg) {
|
|
83
|
+
this.getClient().then((client) => {
|
|
84
|
+
client.sendRemoteCommand(deviceKeys, name, arg);
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
track(eventName, properties) {
|
|
88
|
+
this.getClient().then((client) => {
|
|
89
|
+
client.track(eventName, JSON.stringify(properties));
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
timeEvent(eventName) {
|
|
93
|
+
this.getClient().then((client) => {
|
|
94
|
+
client.timeEvent(eventName);
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
newEventSession(id) {
|
|
98
|
+
this.getClient().then((client) => {
|
|
99
|
+
if (id !== undefined) {
|
|
100
|
+
client.newEventSession();
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
client.newEventSession(id);
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
async getRevelRoot() {
|
|
108
|
+
const client = await this.getClient();
|
|
109
|
+
return client.getRevelRoot();
|
|
110
|
+
}
|
|
111
|
+
async getCommandMap() {
|
|
112
|
+
const client = await this.getClient();
|
|
113
|
+
return JSON.parse(await client.getCommandMap());
|
|
114
|
+
// let map = new Map<string, any>();
|
|
115
|
+
// let obj = JSON.parse(await client.getCommandMap());
|
|
116
|
+
// for (let key in obj) {
|
|
117
|
+
// map.set(key, obj[key]);
|
|
118
|
+
// }
|
|
119
|
+
// return map;
|
|
120
|
+
}
|
|
121
|
+
// ---
|
|
122
|
+
// PRIVATE METHODS.
|
|
123
|
+
// ---
|
|
124
|
+
// I return a Promise that resolves with a Tracker API (which may be the 3rd-party
|
|
125
|
+
// library or a mock API representation).
|
|
126
|
+
getClient() {
|
|
127
|
+
if (this.clientPromise) {
|
|
128
|
+
return (this.clientPromise);
|
|
129
|
+
}
|
|
130
|
+
if (window.Client) {
|
|
131
|
+
return (this.clientPromise = Promise.resolve(window.Client));
|
|
132
|
+
}
|
|
133
|
+
// A "complete" status indicates that the "load" event has been fired on the
|
|
134
|
+
// window; and, that all sub-resources such as Scripts, Images, and Frames have
|
|
135
|
+
// been loaded.
|
|
136
|
+
if (window.document.readyState === "complete") {
|
|
137
|
+
// If this event has fired AND the 3rd-party script isn't available (see IF-
|
|
138
|
+
// condition BEFORE this one), it means that the 3rd-party script either
|
|
139
|
+
// failed on the network or was BLOCKED by an ad-blocker. As such, we have to
|
|
140
|
+
// fall-back to using a mock API.
|
|
141
|
+
return (this.clientPromise = Promise.resolve(new NoopClient()));
|
|
142
|
+
}
|
|
143
|
+
// ASSERT: If we made it this far, the document has not completed loading (but it
|
|
144
|
+
// may be in an "interactive" state which is when I believe that the Angular app
|
|
145
|
+
// gets bootstrapped). As such, we need bind to the LOAD event to wait for our
|
|
146
|
+
// third-party scripts to load (or fail to load, or be blocked).
|
|
147
|
+
this.clientPromise = new Promise((resolve) => {
|
|
148
|
+
window.addEventListener("load", function handleWindowLoad() {
|
|
149
|
+
// At this point, the 3rd-party library is either available or
|
|
150
|
+
// it's not - there's no further loading to do. If it's not
|
|
151
|
+
// present on the global scope, we're going to fall-back to using
|
|
152
|
+
// a mock API.
|
|
153
|
+
resolve(window.Client || new NoopClient());
|
|
154
|
+
});
|
|
155
|
+
});
|
|
156
|
+
return (this.clientPromise);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
PlayerClientService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: PlayerClientService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
160
|
+
PlayerClientService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: PlayerClientService, providedIn: 'root' });
|
|
161
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: PlayerClientService, decorators: [{
|
|
162
|
+
type: Injectable,
|
|
163
|
+
args: [{
|
|
164
|
+
providedIn: 'root'
|
|
165
|
+
}]
|
|
166
|
+
}], ctorParameters: function () { return []; } });
|
|
167
|
+
// ----------------------------------------------------------------------------------- //
|
|
168
|
+
// ----------------------------------------------------------------------------------- //
|
|
169
|
+
// I provide a mock API for the 3rd-party script. This just allows the consuming code to
|
|
170
|
+
// act as though the library is available even if it failed to load (example, it was
|
|
171
|
+
// blocked by an ad-blocker).
|
|
172
|
+
class NoopClient {
|
|
173
|
+
constructor() {
|
|
174
|
+
console.warn("Client API not available, falling back to mock API.");
|
|
175
|
+
}
|
|
176
|
+
callback(...args) {
|
|
177
|
+
// NOOP implement, nothing to do....
|
|
178
|
+
}
|
|
179
|
+
getDeviceTime(date) {
|
|
180
|
+
return Promise.resolve(null);
|
|
181
|
+
}
|
|
182
|
+
async getDeviceTimeZoneName() {
|
|
183
|
+
return Promise.resolve(null);
|
|
184
|
+
}
|
|
185
|
+
async getDeviceTimeZoneID() {
|
|
186
|
+
return Promise.resolve(null);
|
|
187
|
+
}
|
|
188
|
+
async getDeviceTimeZoneOffset() {
|
|
189
|
+
return Promise.resolve(null);
|
|
190
|
+
}
|
|
191
|
+
async getLanguageCode() {
|
|
192
|
+
return Promise.resolve(null);
|
|
193
|
+
}
|
|
194
|
+
async getDeviceKey() {
|
|
195
|
+
return Promise.resolve(null);
|
|
196
|
+
}
|
|
197
|
+
sendCommand(name, arg) {
|
|
198
|
+
// NOOP implement, nothing to do....
|
|
199
|
+
}
|
|
200
|
+
sendRemoteCommand(deviceKeys, name, arg) {
|
|
201
|
+
// NOOP implement, nothing to do....
|
|
202
|
+
}
|
|
203
|
+
track(eventName, properties) {
|
|
204
|
+
// NOOP implement, nothing to do....
|
|
205
|
+
}
|
|
206
|
+
timeEvent(eventName) {
|
|
207
|
+
// NOOP implement, nothing to do....
|
|
208
|
+
}
|
|
209
|
+
newEventSession(id) {
|
|
210
|
+
// NOOP implement, nothing to do....
|
|
211
|
+
}
|
|
212
|
+
async getRevelRoot() {
|
|
213
|
+
return Promise.resolve(null);
|
|
214
|
+
}
|
|
215
|
+
async getCommandMap() {
|
|
216
|
+
return Promise.resolve('{}');
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
class PlayerClientModule {
|
|
221
|
+
}
|
|
222
|
+
PlayerClientModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: PlayerClientModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
223
|
+
PlayerClientModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: PlayerClientModule });
|
|
224
|
+
PlayerClientModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: PlayerClientModule, imports: [[]] });
|
|
225
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: PlayerClientModule, decorators: [{
|
|
226
|
+
type: NgModule,
|
|
227
|
+
args: [{
|
|
228
|
+
imports: [],
|
|
229
|
+
}]
|
|
230
|
+
}] });
|
|
231
|
+
|
|
232
|
+
/*
|
|
233
|
+
* Public API Surface of player-client
|
|
234
|
+
*/
|
|
235
|
+
|
|
236
|
+
/**
|
|
237
|
+
* Generated bundle index. Do not edit.
|
|
238
|
+
*/
|
|
239
|
+
|
|
240
|
+
export { PlayerClientModule, PlayerClientService };
|
|
241
|
+
//# sourceMappingURL=reveldigital-player-client.mjs.map
|