active-connect-ng2 0.2.41 → 0.2.43

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.
Files changed (53) hide show
  1. package/esm2020/active-connect-ng2.mjs +5 -0
  2. package/esm2020/lib/active-connect-ng2.module.mjs +42 -0
  3. package/esm2020/lib/websocket/client.mjs +353 -0
  4. package/esm2020/lib/websocket/decorators/function.mjs +40 -0
  5. package/esm2020/lib/websocket/decorators/websocket/handle.mjs +9 -0
  6. package/esm2020/lib/websocket/decorators/websocket/on-reconnect.mjs +6 -0
  7. package/esm2020/lib/websocket/decorators/websocket/on-success.mjs +8 -0
  8. package/esm2020/lib/websocket/decorators/websocket/outbound.mjs +213 -0
  9. package/esm2020/lib/websocket/decorators/websocket/route.mjs +31 -0
  10. package/esm2020/lib/websocket/decorators/websocket/shared.mjs +10 -0
  11. package/esm2020/lib/websocket/decorators/websocket/websocket-route-service.mjs +2 -0
  12. package/esm2020/lib/websocket/index.mjs +11 -0
  13. package/esm2020/lib/websocket/json/json-parser.mjs +23 -0
  14. package/esm2020/lib/websocket/lifecycle/loading-status.mjs +31 -0
  15. package/esm2020/lib/websocket/objects/outbound-object.mjs +398 -0
  16. package/esm2020/public-api.mjs +7 -0
  17. package/fesm2015/active-connect-ng2.mjs +1184 -0
  18. package/fesm2015/active-connect-ng2.mjs.map +1 -0
  19. package/fesm2020/active-connect-ng2.mjs +1166 -0
  20. package/fesm2020/active-connect-ng2.mjs.map +1 -0
  21. package/index.d.ts +5 -0
  22. package/lib/active-connect-ng2.module.d.ts +7 -0
  23. package/lib/websocket/client.d.ts +60 -0
  24. package/lib/websocket/decorators/function.d.ts +30 -0
  25. package/lib/websocket/decorators/websocket/handle.d.ts +1 -0
  26. package/lib/websocket/decorators/websocket/on-reconnect.d.ts +1 -0
  27. package/lib/websocket/decorators/websocket/on-success.d.ts +1 -0
  28. package/lib/websocket/decorators/websocket/outbound.d.ts +1 -0
  29. package/lib/websocket/decorators/websocket/route.d.ts +1 -0
  30. package/lib/websocket/decorators/websocket/shared.d.ts +4 -0
  31. package/{src/lib/websocket/decorators/websocket/websocket-route-service.ts → lib/websocket/decorators/websocket/websocket-route-service.d.ts} +2 -3
  32. package/lib/websocket/json/json-parser.d.ts +5 -0
  33. package/lib/websocket/lifecycle/loading-status.d.ts +9 -0
  34. package/lib/websocket/objects/outbound-object.d.ts +48 -0
  35. package/package.json +32 -13
  36. package/{src/public-api.ts → public-api.d.ts} +0 -4
  37. package/ng-package.json +0 -7
  38. package/src/lib/active-connect-ng2.module.ts +0 -34
  39. package/src/lib/websocket/client.ts +0 -438
  40. package/src/lib/websocket/decorators/function.ts +0 -44
  41. package/src/lib/websocket/decorators/websocket/handle.ts +0 -12
  42. package/src/lib/websocket/decorators/websocket/on-reconnect.ts +0 -6
  43. package/src/lib/websocket/decorators/websocket/on-success.ts +0 -11
  44. package/src/lib/websocket/decorators/websocket/outbound.ts +0 -212
  45. package/src/lib/websocket/decorators/websocket/route.ts +0 -32
  46. package/src/lib/websocket/decorators/websocket/shared.ts +0 -11
  47. package/src/lib/websocket/json/json-parser.ts +0 -26
  48. package/src/lib/websocket/lifecycle/loading-status.ts +0 -32
  49. package/src/lib/websocket/objects/outbound-object.ts +0 -430
  50. package/tsconfig.lib.json +0 -14
  51. package/tsconfig.lib.prod.json +0 -10
  52. package/tsconfig.spec.json +0 -14
  53. /package/{src/lib/websocket/index.ts → lib/websocket/index.d.ts} +0 -0
@@ -0,0 +1,398 @@
1
+ import { Observable } from 'rxjs';
2
+ import { WebsocketClient } from '../client';
3
+ export class OutboundObject {
4
+ constructor(client, method, lazyLoaded, cached, initialLoadingCount, sortBy) {
5
+ this.client = client;
6
+ this.method = method;
7
+ this.lazyLoaded = lazyLoaded;
8
+ this.cached = cached;
9
+ this.initialLoadingCount = initialLoadingCount;
10
+ this.sortBy = sortBy;
11
+ this.dataMap = new Map();
12
+ this.data = undefined;
13
+ this.requested = false;
14
+ this._loading = false;
15
+ this._length = undefined;
16
+ this.requestedId = null;
17
+ this.loadedObservable = null;
18
+ this.loadedId = null;
19
+ this.loadedIdData = null;
20
+ this.loadedIdChanged = null;
21
+ this.requestedGroupId = null;
22
+ this.loadedGroupObservable = null;
23
+ this.loadedGroupId = null;
24
+ this.loadedGroupData = null;
25
+ this.loadedGroupChanged = null;
26
+ this.target.loading = new Map();
27
+ if (this.client.dbService) {
28
+ try {
29
+ this.client.dbService
30
+ .getByKey('outbound', method)
31
+ .subscribe((result) => {
32
+ if (result) {
33
+ this.previouslyCachedCount = result.data?.length || null;
34
+ }
35
+ });
36
+ }
37
+ catch (e) {
38
+ console.error('ActiveConnect: Unable to read cached data');
39
+ console.error(e);
40
+ }
41
+ }
42
+ const _this = this;
43
+ WebsocketClient.expectOutbound(method, function setOutbound(data, specificHash, insertedOrGroupData, updatedOrGroupId, deleted, length, _client) {
44
+ if (!cached) {
45
+ if (_client.dbService) {
46
+ try {
47
+ _client.dbService
48
+ .deleteByKey('outbound', method)
49
+ .subscribe(() => { });
50
+ }
51
+ catch (e) {
52
+ console.error('ActiveConnect: Unable to delete cached data');
53
+ console.error(e);
54
+ }
55
+ }
56
+ }
57
+ if (data == 'cache_restore') {
58
+ if (_client.dbService) {
59
+ try {
60
+ _client.dbService
61
+ .getByKey('outbound', method)
62
+ .subscribe((result) => {
63
+ _this.setData(result.data);
64
+ if (result.length)
65
+ _this._length = result.length;
66
+ _this.loading = false;
67
+ });
68
+ }
69
+ catch (e) {
70
+ console.error('ActiveConnect: Unable to restore cached data');
71
+ console.error(e);
72
+ }
73
+ }
74
+ else {
75
+ console.error('ActiveConnect: Caching / restore not possible as the indexedDB is not accessible');
76
+ }
77
+ }
78
+ else if (data == 'cache_delete') {
79
+ if (_client.dbService) {
80
+ try {
81
+ _client.dbService
82
+ .deleteByKey('outbound', method)
83
+ .subscribe(() => { });
84
+ }
85
+ catch (e) {
86
+ console.error('ActiveConnect: Unable to delete cached data');
87
+ console.error(e);
88
+ }
89
+ }
90
+ else {
91
+ console.error('ActiveConnect: Caching / restore not possible as the indexedDB is not accessible');
92
+ }
93
+ _this.loading = false;
94
+ _this.requested = false;
95
+ }
96
+ else if (data == 'data_delete') {
97
+ _this.data = undefined;
98
+ _this.dataMap = new Map();
99
+ _this.requested = false;
100
+ _this.loadedGroupData = null;
101
+ _this.loadedGroupId = null;
102
+ _this._length = undefined;
103
+ _this.loading = false;
104
+ }
105
+ else if (data == 'data_group') {
106
+ if (_this.requestedGroupId ==
107
+ (updatedOrGroupId ? updatedOrGroupId[0] : 0)) {
108
+ _this.loadedGroupData = insertedOrGroupData;
109
+ _this.loadedGroupId = updatedOrGroupId ? updatedOrGroupId[0] : 0;
110
+ _this.loadedGroupChanged?.next(insertedOrGroupData);
111
+ _this.loading = false;
112
+ }
113
+ }
114
+ else if (data == 'data_id') {
115
+ if (_this.requestedId == (updatedOrGroupId ? updatedOrGroupId[0] : 0)) {
116
+ _this.loadedIdData =
117
+ (insertedOrGroupData?.length || 0) > 0
118
+ ? insertedOrGroupData[0]
119
+ : null;
120
+ _this.loadedId = updatedOrGroupId ? updatedOrGroupId[0] : 0;
121
+ _this.loadedIdChanged?.next(_this.loadedIdData);
122
+ _this.loading = false;
123
+ }
124
+ }
125
+ else if (data == 'data_diff') {
126
+ insertedOrGroupData?.forEach((e) => {
127
+ _this.dataMap.set(e.id, e);
128
+ if (e.id == _this.loadedId) {
129
+ _this.loadedIdChanged?.next(e);
130
+ }
131
+ });
132
+ updatedOrGroupId?.forEach((e) => {
133
+ _this.dataMap.set(e.id, e);
134
+ if (e.id == _this.loadedId) {
135
+ _this.loadedIdChanged?.next(e);
136
+ }
137
+ });
138
+ deleted?.forEach((e) => {
139
+ _this.dataMap.delete(e.id);
140
+ if (e.id == _this.loadedId) {
141
+ _this.loadedIdChanged?.next(null);
142
+ }
143
+ });
144
+ _this.data = Array.from(_this.dataMap.values());
145
+ if (_this.data && _this.sortBy)
146
+ _this.data = _this.data.sort(_this.sortBy);
147
+ _this.loading = false;
148
+ if (cached && specificHash) {
149
+ if (_client.dbService) {
150
+ try {
151
+ if (_this.data && _this.data?.length > 0) {
152
+ _client.dbService
153
+ .update('outbound', {
154
+ method,
155
+ data: _this.data,
156
+ specificHash,
157
+ length,
158
+ })
159
+ .subscribe(() => { });
160
+ }
161
+ else {
162
+ _client.dbService
163
+ .deleteByKey('outbound', method)
164
+ .subscribe(() => { });
165
+ }
166
+ }
167
+ catch (e) {
168
+ console.error('ActiveConnect: Unable to update cached data.');
169
+ console.error(e);
170
+ }
171
+ }
172
+ else {
173
+ console.error('ActiveConnect: Caching not possible as the indexedDB has not been initialized');
174
+ }
175
+ }
176
+ }
177
+ else {
178
+ _this.setData(data);
179
+ if (_this.loadedId) {
180
+ const loadedValue = _this.dataMap.get(_this.loadedId);
181
+ if (loadedValue) {
182
+ _this.loadedIdData = loadedValue;
183
+ _this.loadedIdChanged?.next(_this.loadedIdData);
184
+ }
185
+ }
186
+ _this.loading = false;
187
+ if (cached && specificHash) {
188
+ if (_client.dbService) {
189
+ try {
190
+ if (data && data?.length > 0) {
191
+ _client.dbService
192
+ .update('outbound', {
193
+ method,
194
+ data,
195
+ specificHash,
196
+ length,
197
+ })
198
+ .subscribe(() => { });
199
+ }
200
+ else {
201
+ _client.dbService
202
+ .deleteByKey('outbound', method)
203
+ .subscribe(() => { });
204
+ }
205
+ }
206
+ catch (e) {
207
+ console.error('ActiveConnect: Unable to update cached data.');
208
+ console.error(e);
209
+ }
210
+ }
211
+ else {
212
+ console.error('ActiveConnect: Caching not possible as the indexedDB has not been initialized');
213
+ }
214
+ }
215
+ }
216
+ if (length)
217
+ _this._length = length;
218
+ });
219
+ WebsocketClient.addResetRequestingStateCallback(() => {
220
+ this.afterServerReconnected();
221
+ });
222
+ }
223
+ get target() {
224
+ return this.client.__proto__;
225
+ }
226
+ get(id) {
227
+ if (this.requestedId == id && this.loadedObservable && this.loadedIdData) {
228
+ if (this.loadedIdData)
229
+ setTimeout(() => {
230
+ if (this.loadedIdData)
231
+ this.loadedIdChanged?.next(this.loadedIdData);
232
+ }, 50);
233
+ return this.loadedObservable;
234
+ }
235
+ let observablePromise;
236
+ if (this.requestedId != id || !this.loadedObservable) {
237
+ observablePromise = new Promise((resolve) => {
238
+ this.loadedObservable = new Observable((observer) => {
239
+ this.loadedIdChanged = observer;
240
+ resolve();
241
+ });
242
+ });
243
+ }
244
+ Promise.all([observablePromise]).then(() => {
245
+ new Promise(async (resolve) => {
246
+ if (!this.requested && this.lazyLoaded) {
247
+ this.load().then();
248
+ }
249
+ if (this.data) {
250
+ const res = this.dataMap.get(id);
251
+ if (res) {
252
+ this.loadedIdChanged?.next(res);
253
+ resolve();
254
+ return;
255
+ }
256
+ }
257
+ if (this.loadedId == id) {
258
+ this.loadedIdChanged?.next(this.loadedIdData);
259
+ }
260
+ else {
261
+ await this.requestById(id);
262
+ }
263
+ resolve();
264
+ }).then();
265
+ });
266
+ return this.loadedObservable;
267
+ }
268
+ getForGroup(groupId) {
269
+ if (this.requestedGroupId == groupId &&
270
+ this.loadedGroupObservable &&
271
+ this.loadedGroupData) {
272
+ setTimeout(() => {
273
+ if (this.loadedGroupData)
274
+ this.loadedGroupChanged?.next(this.loadedGroupData);
275
+ }, 50);
276
+ return this.loadedGroupObservable;
277
+ }
278
+ let observablePromise;
279
+ if (this.requestedGroupId != groupId || !this.loadedGroupObservable) {
280
+ observablePromise = new Promise((resolve) => {
281
+ this.loadedGroupObservable = new Observable((observer) => {
282
+ this.loadedGroupChanged = observer;
283
+ resolve();
284
+ });
285
+ });
286
+ }
287
+ Promise.all([observablePromise]).then(() => {
288
+ new Promise(async (resolve) => {
289
+ if (!this.requested && this.lazyLoaded) {
290
+ this.load().then();
291
+ }
292
+ if (this.loadedGroupId == groupId && this.loadedGroupData) {
293
+ this.loadedGroupChanged?.next(this.loadedGroupData);
294
+ }
295
+ else {
296
+ await this.requestForGroup(groupId);
297
+ }
298
+ resolve();
299
+ }).then();
300
+ });
301
+ return this.loadedGroupObservable;
302
+ }
303
+ get all() {
304
+ if (!this.requested && this.lazyLoaded) {
305
+ this.load().then();
306
+ }
307
+ return this.data;
308
+ }
309
+ async load(count) {
310
+ if (this.lazyLoaded) {
311
+ const hasBeenRequestedBefore = this.requested;
312
+ this._loading = true;
313
+ if (!this.requested) {
314
+ this.loading = true;
315
+ }
316
+ this.requested = true;
317
+ await this.client.send('request.' + this.method, {
318
+ count: hasBeenRequestedBefore
319
+ ? this.data
320
+ ? count || this.initialLoadingCount
321
+ ? (count || this.initialLoadingCount) +
322
+ this.loadedLength
323
+ : undefined
324
+ : undefined
325
+ : this.previouslyCachedCount || this.initialLoadingCount,
326
+ loaded: this.loadedLength,
327
+ });
328
+ }
329
+ else {
330
+ throw Error('Active-Connect: Cannot run loading request as this outbound is not lazy-loaded.');
331
+ }
332
+ }
333
+ set loading(value) {
334
+ this._loading = value;
335
+ this.target.loading.set(this.method, value);
336
+ }
337
+ get loading() {
338
+ return this._loading;
339
+ }
340
+ get loadedLength() {
341
+ return this.data?.length || 0;
342
+ }
343
+ get length() {
344
+ return this._length;
345
+ }
346
+ requestById(id) {
347
+ this.loading = true;
348
+ this.requestedId = id;
349
+ return this.client.send('request.' + this.method, { id });
350
+ }
351
+ requestForGroup(groupId) {
352
+ this.loading = true;
353
+ this.requestedGroupId = groupId;
354
+ return this.client.send('request.' + this.method, { groupId });
355
+ }
356
+ setData(data) {
357
+ this.data = data;
358
+ if (this.data && this.sortBy)
359
+ this.data = this.data.sort(this.sortBy);
360
+ this._length = data.length;
361
+ this.dataMap = new Map();
362
+ this.data.forEach((d) => {
363
+ this.dataMap.set(d.id, d);
364
+ });
365
+ }
366
+ get isEmpty() {
367
+ return this.data == undefined;
368
+ }
369
+ /**
370
+ * The contained data can be modified within the callback method
371
+ */
372
+ update(callback) {
373
+ if (this.data) {
374
+ const updateLengthVariable = this.data.length == this._length;
375
+ const length = this.length;
376
+ callback(this.data);
377
+ this.setData(this.data);
378
+ if (!updateLengthVariable) {
379
+ this._length = length;
380
+ }
381
+ }
382
+ }
383
+ afterServerReconnected() {
384
+ if (this.requested && this.lazyLoaded) {
385
+ this.requested = false;
386
+ this.load(1).then();
387
+ }
388
+ if (this.loadedId) {
389
+ this.loadedIdData = null;
390
+ this.get(this.loadedId);
391
+ }
392
+ if (this.loadedGroupId) {
393
+ this.loadedGroupData = null;
394
+ this.getForGroup(this.loadedGroupId);
395
+ }
396
+ }
397
+ }
398
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3V0Ym91bmQtb2JqZWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYWN0aXZlLWNvbm5lY3QtbmcyL3NyYy9saWIvd2Vic29ja2V0L29iamVjdHMvb3V0Ym91bmQtb2JqZWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQVksTUFBTSxNQUFNLENBQUM7QUFDNUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQU01QyxNQUFNLE9BQU8sY0FBYztJQUV6QixZQUNVLE1BQXVCLEVBQ3ZCLE1BQWMsRUFDZCxVQUFvQixFQUNaLE1BQWdCLEVBQ3hCLG1CQUE0QixFQUM1QixNQUErQjtRQUwvQixXQUFNLEdBQU4sTUFBTSxDQUFpQjtRQUN2QixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2QsZUFBVSxHQUFWLFVBQVUsQ0FBVTtRQUNaLFdBQU0sR0FBTixNQUFNLENBQVU7UUFDeEIsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFTO1FBQzVCLFdBQU0sR0FBTixNQUFNLENBQXlCO1FBb05qQyxZQUFPLEdBQXNDLElBQUksR0FBRyxFQUFFLENBQUM7UUFDdkQsU0FBSSxHQUFvQixTQUFTLENBQUM7UUE2RmxDLGNBQVMsR0FBWSxLQUFLLENBQUM7UUEyQjNCLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFXakIsWUFBTyxHQUF1QixTQUFTLENBQUM7UUFLeEMsZ0JBQVcsR0FBa0IsSUFBSSxDQUFDO1FBQ2xDLHFCQUFnQixHQUF5QixJQUFJLENBQUM7UUFDOUMsYUFBUSxHQUFrQixJQUFJLENBQUM7UUFDL0IsaUJBQVksR0FBYSxJQUFJLENBQUM7UUFDOUIsb0JBQWUsR0FBdUIsSUFBSSxDQUFDO1FBTzNDLHFCQUFnQixHQUFrQixJQUFJLENBQUM7UUFDdkMsMEJBQXFCLEdBQTJCLElBQUksQ0FBQztRQUNyRCxrQkFBYSxHQUFrQixJQUFJLENBQUM7UUFDcEMs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LENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN4QixJQUFJLENBQUMsb0JBQW9CLEVBQUU7Z0JBQ3pCLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO2FBQ3ZCO1NBQ0Y7SUFDSCxDQUFDO0lBRU8sc0JBQXNCO1FBQzVCLElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ3JDLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7U0FDckI7UUFDRCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDakIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7WUFDekIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDekI7UUFDRCxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDdEIsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7WUFDNUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7U0FDdEM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPYnNlcnZhYmxlLCBPYnNlcnZlciB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBXZWJzb2NrZXRDbGllbnQgfSBmcm9tICcuLi9jbGllbnQnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJZE9iamVjdCB7XHJcbiAgaWQ6IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQ7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBPdXRib3VuZE9iamVjdDxUIGV4dGVuZHMgSWRPYmplY3Q+IHtcclxuICBwcml2YXRlIHByZXZpb3VzbHlDYWNoZWRDb3VudDogbnVtYmVyIHwgdW5kZWZpbmVkO1xyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBjbGllbnQ6IFdlYnNvY2tldENsaWVudCxcclxuICAgIHByaXZhdGUgbWV0aG9kOiBzdHJpbmcsXHJcbiAgICBwcml2YXRlIGxhenlMb2FkZWQ/OiBib29sZWFuLFxyXG4gICAgcHVibGljIHJlYWRvbmx5IGNhY2hlZD86IGJvb2xlYW4sXHJcbiAgICBwcml2YXRlIGluaXRpYWxMb2FkaW5nQ291bnQ/OiBudW1iZXIsXHJcbiAgICBwcml2YXRlIHNvcnRCeT86IChhOiBULCBiOiBUKSA9PiBudW1iZXJcclxuICApIHtcclxuICAgIHRoaXMudGFyZ2V0LmxvYWRpbmcgPSBuZXcgTWFwPHN0cmluZywgYm9vbGVhbj4oKTtcclxuXHJcbiAgICBpZiAodGhpcy5jbGllbnQuZGJTZXJ2aWNlKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgdGhpcy5jbGllbnQuZGJTZXJ2aWNlXHJcbiAgICAgICAgICAuZ2V0QnlLZXkoJ291dGJvdW5kJywgbWV0aG9kKVxyXG4gICAgICAgICAgLnN1YnNjcmliZSgocmVzdWx0OiBhbnkpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICAgICAgICAgIHRoaXMucHJldmlvdXNseUNhY2hlZENvdW50ID0gcmVzdWx0LmRhdGE/Lmxlbmd0aCB8fCBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0FjdGl2ZUNvbm5lY3Q6IFVuYWJsZSB0byByZWFkIGNhY2hlZCBkYXRhJyk7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IF90aGlzID0gdGhpcztcclxuICAgIFdlYnNvY2tldENsaWVudC5leHBlY3RPdXRib3VuZChcclxuICAgICAgbWV0aG9kLFxyXG4gICAgICBmdW5jdGlvbiBzZXRPdXRib3VuZChcclxuICAgICAgICBkYXRhOiBhbnksXHJcbiAgICAgICAgc3BlY2lmaWNIYXNoOiBudW1iZXIgfCBudWxsLFxyXG4gICAgICAgIGluc2VydGVkT3JHcm91cERhdGE6IGFueVtdIHwgbnVsbCxcclxuICAgICAgICB1cGRhdGVkT3JHcm91cElkOiBhbnlbXSB8IG51bGwsXHJcbiAgICAgICAgZGVsZXRlZDogYW55W10gfCBudWxsLFxyXG4gICAgICAgIGxlbmd0aDogbnVtYmVyIHwgbnVsbCxcclxuICAgICAgICBfY2xpZW50OiBXZWJzb2NrZXRDbGllbnRcclxuICAgICAgKSB7XHJcbiAgICAgICAgaWYgKCFjYWNoZWQpIHtcclxuICAgICAgICAgIGlmIChfY2xpZW50LmRiU2VydmljZSkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgIF9jbGllbnQuZGJTZXJ2aWNlXHJcbiAgICAgICAgICAgICAgICAuZGVsZXRlQnlLZXkoJ291dGJvdW5kJywgbWV0aG9kKVxyXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7fSk7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdBY3RpdmVDb25uZWN0OiBVbmFibGUgdG8gZGVsZXRlIGNhY2hlZCBkYXRhJyk7XHJcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGRhdGEgPT0gJ2NhY2hlX3Jlc3RvcmUnKSB7XHJcbiAgICAgICAgICBpZiAoX2NsaWVudC5kYlNlcnZpY2UpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICBfY2xpZW50LmRiU2VydmljZVxyXG4gICAgICAgICAgICAgICAgLmdldEJ5S2V5KCdvdXRib3VuZCcsIG1ldGhvZClcclxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKHJlc3VsdDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIF90aGlzLnNldERhdGEocmVzdWx0LmRhdGEpO1xyXG4gICAgICAgICAgICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCkgX3RoaXMuX2xlbmd0aCA9IHJlc3VsdC5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgIF90aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignQWN0aXZlQ29ubmVjdDogVW5hYmxlIHRvIHJlc3RvcmUgY2FjaGVkIGRhdGEnKTtcclxuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFxyXG4gICAgICAgICAgICAgICdBY3RpdmVDb25uZWN0OiBDYWNoaW5nIC8gcmVzdG9yZSBub3QgcG9zc2libGUgYXMgdGhlIGluZGV4ZWREQiBpcyBub3QgYWNjZXNzaWJsZSdcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKGRhdGEgPT0gJ2NhY2hlX2RlbGV0ZScpIHtcclxuICAgICAgICAgIGlmIChfY2xpZW50LmRiU2VydmljZSkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgIF9jbGllbnQuZGJTZXJ2aWNlXHJcbiAgICAgICAgICAgICAgICAuZGVsZXRlQnlLZXkoJ291dGJvdW5kJywgbWV0aG9kKVxyXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7fSk7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdBY3RpdmVDb25uZWN0OiBVbmFibGUgdG8gZGVsZXRlIGNhY2hlZCBkYXRhJyk7XHJcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcclxuICAgICAgICAgICAgICAnQWN0aXZlQ29ubmVjdDogQ2FjaGluZyAvIHJlc3RvcmUgbm90IHBvc3NpYmxlIGFzIHRoZSBpbmRleGVkREIgaXMgbm90IGFjY2Vzc2libGUnXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBfdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICBfdGhpcy5yZXF1ZXN0ZWQgPSBmYWxzZTtcclxuICAgICAgICB9IGVsc2UgaWYgKGRhdGEgPT0gJ2RhdGFfZGVsZXRlJykge1xyXG4gICAgICAgICAgX3RoaXMuZGF0YSA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgIF90aGlzLmRhdGFNYXAgPSBuZXcgTWFwKCk7XHJcbiAgICAgICAgICBfdGhpcy5yZXF1ZXN0ZWQgPSBmYWxzZTtcclxuICAgICAgICAgIF90aGlzLmxvYWRlZEdyb3VwRGF0YSA9IG51bGw7XHJcbiAgICAgICAgICBfdGhpcy5sb2FkZWRHcm91cElkID0gbnVsbDtcclxuICAgICAgICAgIF90aGlzLl9sZW5ndGggPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICBfdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgfSBlbHNlIGlmIChkYXRhID09ICdkYXRhX2dyb3VwJykge1xyXG4gICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICBfdGhpcy5yZXF1ZXN0ZWRHcm91cElkID09XHJcbiAgICAgICAgICAgICh1cGRhdGVkT3JHcm91cElkID8gdXBkYXRlZE9yR3JvdXBJZFswXSA6IDApXHJcbiAgICAgICAgICApIHtcclxuICAgICAgICAgICAgX3RoaXMubG9hZGVkR3JvdXBEYXRhID0gaW5zZXJ0ZWRPckdyb3VwRGF0YTtcclxuICAgICAgICAgICAgX3RoaXMubG9hZGVkR3JvdXBJZCA9IHVwZGF0ZWRPckdyb3VwSWQgPyB1cGRhdGVkT3JHcm91cElkWzBdIDogMDtcclxuICAgICAgICAgICAgX3RoaXMubG9hZGVkR3JvdXBDaGFuZ2VkPy5uZXh0KGluc2VydGVkT3JHcm91cERhdGEgYXMgVFtdKTtcclxuICAgICAgICAgICAgX3RoaXMubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YSA9PSAnZGF0YV9pZCcpIHtcclxuICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgX3RoaXMucmVxdWVzdGVkSWQgPT0gKHVwZGF0ZWRPckdyb3VwSWQgPyB1cGRhdGVkT3JHcm91cElkWzBdIDogMClcclxuICAgICAgICAgICkge1xyXG4gICAgICAgICAgICBfdGhpcy5sb2FkZWRJZERhdGEgPVxyXG4gICAgICAgICAgICAgIChpbnNlcnRlZE9yR3JvdXBEYXRhPy5sZW5ndGggfHwgMCkgPiAwXHJcbiAgICAgICAgICAgICAgICA/IChpbnNlcnRlZE9yR3JvdXBEYXRhIGFzIGFueVtdKVswXVxyXG4gICAgICAgICAgICAgICAgOiBudWxsO1xyXG4gICAgICAgICAgICBfdGhpcy5sb2FkZWRJZCA9IHVwZGF0ZWRPckdyb3VwSWQgPyB1cGRhdGVkT3JHcm91cElkWzBdIDogMDtcclxuICAgICAgICAgICAgX3RoaXMubG9hZGVkSWRDaGFuZ2VkPy5uZXh0KF90aGlzLmxvYWRlZElkRGF0YSBhcyBUKTtcclxuICAgICAgICAgICAgX3RoaXMubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YSA9PSAnZGF0YV9kaWZmJykge1xyXG4gICAgICAgICAgaW5zZXJ0ZWRPckdyb3VwRGF0YT8uZm9yRWFjaCgoZSkgPT4ge1xyXG4gICAgICAgICAgICBfdGhpcy5kYXRhTWFwLnNldChlLmlkLCBlKTtcclxuICAgICAgICAgICAgaWYgKGUuaWQgPT0gX3RoaXMubG9hZGVkSWQpIHtcclxuICAgICAgICAgICAgICBfdGhpcy5sb2FkZWRJZENoYW5nZWQ/Lm5leHQoZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgdXBkYXRlZE9yR3JvdXBJZD8uZm9yRWFjaCgoZSkgPT4ge1xyXG4gICAgICAgICAgICBfdGhpcy5kYXRhTWFwLnNldChlLmlkLCBlKTtcclxuICAgICAgICAgICAgaWYgKGUuaWQgPT0gX3RoaXMubG9hZGVkSWQpIHtcclxuICAgICAgICAgICAgICBfdGhpcy5sb2FkZWRJZENoYW5nZWQ/Lm5leHQoZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgZGVsZXRlZD8uZm9yRWFjaCgoZSkgPT4ge1xyXG4gICAgICAgICAgICBfdGhpcy5kYXRhTWFwLmRlbGV0ZShlLmlkKTtcclxuICAgICAgICAgICAgaWYgKGUuaWQgPT0gX3RoaXMubG9hZGVkSWQpIHtcclxuICAgICAgICAgICAgICBfdGhpcy5sb2FkZWRJZENoYW5nZWQ/Lm5leHQobnVsbCBhcyBhbnkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIF90aGlzLmRhdGEgPSBBcnJheS5mcm9tKF90aGlzLmRhdGFNYXAudmFsdWVzKCkpO1xyXG4gICAgICAgICAgaWYgKF90aGlzLmRhdGEgJiYgX3RoaXMuc29ydEJ5KVxyXG4gICAgICAgICAgICBfdGhpcy5kYXRhID0gX3RoaXMuZGF0YS5zb3J0KF90aGlzLnNvcnRCeSk7XHJcbiAgICAgICAgICBfdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgaWYgKGNhY2hlZCAmJiBzcGVjaWZpY0hhc2gpIHtcclxuICAgICAgICAgICAgaWYgKF9jbGllbnQuZGJTZXJ2aWNlKSB7XHJcbiAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGlmIChfdGhpcy5kYXRhICYmIF90aGlzLmRhdGE/Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgX2NsaWVudC5kYlNlcnZpY2VcclxuICAgICAgICAgICAgICAgICAgICAudXBkYXRlKCdvdXRib3VuZCcsIHtcclxuICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCxcclxuICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IF90aGlzLmRhdGEsXHJcbiAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpY0hhc2gsXHJcbiAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgsXHJcbiAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHt9KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIF9jbGllbnQuZGJTZXJ2aWNlXHJcbiAgICAgICAgICAgICAgICAgICAgLmRlbGV0ZUJ5S2V5KCdvdXRib3VuZCcsIG1ldGhvZClcclxuICAgICAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHt9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdBY3RpdmVDb25uZWN0OiBVbmFibGUgdG8gdXBkYXRlIGNhY2hlZCBkYXRhLicpO1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcclxuICAgICAgICAgICAgICAgICdBY3RpdmVDb25uZWN0OiBDYWNoaW5nIG5vdCBwb3NzaWJsZSBhcyB0aGUgaW5kZXhlZERCIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCdcclxuICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIF90aGlzLnNldERhdGEoZGF0YSk7XHJcbiAgICAgICAgICBpZiAoX3RoaXMubG9hZGVkSWQpIHtcclxuICAgICAgICAgICAgY29uc3QgbG9hZGVkVmFsdWUgPSBfdGhpcy5kYXRhTWFwLmdldChfdGhpcy5sb2FkZWRJZCk7XHJcbiAgICAgICAgICAgIGlmIChsb2FkZWRWYWx1ZSkge1xyXG4gICAgICAgICAgICAgIF90aGlzLmxvYWRlZElkRGF0YSA9IGxvYWRlZFZhbHVlO1xyXG4gICAgICAgICAgICAgIF90aGlzLmxvYWRlZElkQ2hhbmdlZD8ubmV4dChfdGhpcy5sb2FkZWRJZERhdGEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBfdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICBpZiAoY2FjaGVkICYmIHNwZWNpZmljSGFzaCkge1xyXG4gICAgICAgICAgICBpZiAoX2NsaWVudC5kYlNlcnZpY2UpIHtcclxuICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGRhdGEgJiYgZGF0YT8ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICBfY2xpZW50LmRiU2VydmljZVxyXG4gICAgICAgICAgICAgICAgICAgIC51cGRhdGUoJ291dGJvdW5kJywge1xyXG4gICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLFxyXG4gICAgICAgICAgICAgICAgICAgICAgZGF0YSxcclxuICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmljSGFzaCxcclxuICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCxcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge30pO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgX2NsaWVudC5kYlNlcnZpY2VcclxuICAgICAgICAgICAgICAgICAgICAuZGVsZXRlQnlLZXkoJ291dGJvdW5kJywgbWV0aG9kKVxyXG4gICAgICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge30pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0FjdGl2ZUNvbm5lY3Q6IFVuYWJsZSB0byB1cGRhdGUgY2FjaGVkIGRhdGEuJyk7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFxyXG4gICAgICAgICAgICAgICAgJ0FjdGl2ZUNvbm5lY3Q6IENhY2hpbmcgbm90IHBvc3NpYmxlIGFzIHRoZSBpbmRleGVkREIgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkJ1xyXG4gICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGxlbmd0aCkgX3RoaXMuX2xlbmd0aCA9IGxlbmd0aDtcclxuICAgICAgfVxyXG4gICAgKTtcclxuXHJcbiAgICBXZWJzb2NrZXRDbGllbnQuYWRkUmVzZXRSZXF1ZXN0aW5nU3RhdGVDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgIHRoaXMuYWZ0ZXJTZXJ2ZXJSZWNvbm5lY3RlZCgpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBnZXQgdGFyZ2V0KCk6IGFueSB7XHJcbiAgICByZXR1cm4gKHRoaXMuY2xpZW50IGFzIGFueSkuX19wcm90b19fO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBkYXRhTWFwOiBNYXA8bnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCwgVD4gPSBuZXcgTWFwKCk7XHJcbiAgcHJpdmF0ZSBkYXRhOiBUW10gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XHJcblxyXG4gIHB1YmxpYyBnZXQoaWQ6IG51bWJlcik6IE9ic2VydmFibGU8VD4ge1xyXG4gICAgaWYgKHRoaXMucmVxdWVzdGVkSWQgPT0gaWQgJiYgdGhpcy5sb2FkZWRPYnNlcnZhYmxlICYmIHRoaXMubG9hZGVkSWREYXRhKSB7XHJcbiAgICAgIGlmICh0aGlzLmxvYWRlZElkRGF0YSlcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgIGlmICh0aGlzLmxvYWRlZElkRGF0YSkgdGhpcy5sb2FkZWRJZENoYW5nZWQ/Lm5leHQodGhpcy5sb2FkZWRJZERhdGEpO1xyXG4gICAgICAgIH0sIDUwKTtcclxuICAgICAgcmV0dXJuIHRoaXMubG9hZGVkT2JzZXJ2YWJsZTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgb2JzZXJ2YWJsZVByb21pc2U6IFByb21pc2U8YW55PiB8IHVuZGVmaW5lZDtcclxuICAgIGlmICh0aGlzLnJlcXVlc3RlZElkICE9IGlkIHx8ICF0aGlzLmxvYWRlZE9ic2VydmFibGUpIHtcclxuICAgICAgb2JzZXJ2YWJsZVByb21pc2UgPSBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xyXG4gICAgICAgIHRoaXMubG9hZGVkT2JzZXJ2YWJsZSA9IG5ldyBPYnNlcnZhYmxlPFQ+KChvYnNlcnZlcjogT2JzZXJ2ZXI8VD4pID0+IHtcclxuICAgICAgICAgIHRoaXMubG9hZGVkSWRDaGFuZ2VkID0gb2JzZXJ2ZXI7XHJcbiAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIFByb21pc2UuYWxsKFtvYnNlcnZhYmxlUHJvbWlzZV0pLnRoZW4oKCkgPT4ge1xyXG4gICAgICBuZXcgUHJvbWlzZTx2b2lkPihhc3luYyAocmVzb2x2ZSkgPT4ge1xyXG4gICAgICAgIGlmICghdGhpcy5yZXF1ZXN0ZWQgJiYgdGhpcy5sYXp5TG9hZGVkKSB7XHJcbiAgICAgICAgICB0aGlzLmxvYWQoKS50aGVuKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmRhdGEpIHtcclxuICAgICAgICAgIGNvbnN0IHJlcyA9IHRoaXMuZGF0YU1hcC5nZXQoaWQpO1xyXG4gICAgICAgICAgaWYgKHJlcykge1xyXG4gICAgICAgICAgICB0aGlzLmxvYWRlZElkQ2hhbmdlZD8ubmV4dChyZXMpO1xyXG4gICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMubG9hZGVkSWQgPT0gaWQpIHtcclxuICAgICAgICAgIHRoaXMubG9hZGVkSWRDaGFuZ2VkPy5uZXh0KHRoaXMubG9hZGVkSWREYXRhIGFzIFQpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLnJlcXVlc3RCeUlkKGlkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICB9KS50aGVuKCk7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiB0aGlzLmxvYWRlZE9ic2VydmFibGUgYXMgT2JzZXJ2YWJsZTxUPjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRGb3JHcm91cChncm91cElkOiBudW1iZXIpOiBPYnNlcnZhYmxlPFRbXT4ge1xyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLnJlcXVlc3RlZEdyb3VwSWQgPT0gZ3JvdXBJZCAmJlxyXG4gICAgICB0aGlzLmxvYWRlZEdyb3VwT2JzZXJ2YWJsZSAmJlxyXG4gICAgICB0aGlzLmxvYWRlZEdyb3VwRGF0YVxyXG4gICAgKSB7XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLmxvYWRlZEdyb3VwRGF0YSlcclxuICAgICAgICAgIHRoaXMubG9hZGVkR3JvdXBDaGFuZ2VkPy5uZXh0KHRoaXMubG9hZGVkR3JvdXBEYXRhKTtcclxuICAgICAgfSwgNTApO1xyXG4gICAgICByZXR1cm4gdGhpcy5sb2FkZWRHcm91cE9ic2VydmFibGU7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IG9ic2VydmFibGVQcm9taXNlOiBQcm9taXNlPGFueT4gfCB1bmRlZmluZWQ7XHJcbiAgICBpZiAodGhpcy5yZXF1ZXN0ZWRHcm91cElkICE9IGdyb3VwSWQgfHwgIXRoaXMubG9hZGVkR3JvdXBPYnNlcnZhYmxlKSB7XHJcbiAgICAgIG9ic2VydmFibGVQcm9taXNlID0gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcclxuICAgICAgICB0aGlzLmxvYWRlZEdyb3VwT2JzZXJ2YWJsZSA9IG5ldyBPYnNlcnZhYmxlPFRbXT4oXHJcbiAgICAgICAgICAob2JzZXJ2ZXI6IE9ic2VydmVyPFRbXT4pID0+IHtcclxuICAgICAgICAgICAgdGhpcy5sb2FkZWRHcm91cENoYW5nZWQgPSBvYnNlcnZlcjtcclxuICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIFByb21pc2UuYWxsKFtvYnNlcnZhYmxlUHJvbWlzZV0pLnRoZW4oKCkgPT4ge1xyXG4gICAgICBuZXcgUHJvbWlzZTx2b2lkPihhc3luYyAocmVzb2x2ZSkgPT4ge1xyXG4gICAgICAgIGlmICghdGhpcy5yZXF1ZXN0ZWQgJiYgdGhpcy5sYXp5TG9hZGVkKSB7XHJcbiAgICAgICAgICB0aGlzLmxvYWQoKS50aGVuKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmxvYWRlZEdyb3VwSWQgPT0gZ3JvdXBJZCAmJiB0aGlzLmxvYWRlZEdyb3VwRGF0YSkge1xyXG4gICAgICAgICAgdGhpcy5sb2FkZWRHcm91cENoYW5nZWQ/Lm5leHQodGhpcy5sb2FkZWRHcm91cERhdGEgYXMgVFtdKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5yZXF1ZXN0Rm9yR3JvdXAoZ3JvdXBJZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgfSkudGhlbigpO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gdGhpcy5sb2FkZWRHcm91cE9ic2VydmFibGUgYXMgT2JzZXJ2YWJsZTxUW10+O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBhbGwoKTogVFtdIHwgdW5kZWZpbmVkIHtcclxuICAgIGlmICghdGhpcy5yZXF1ZXN0ZWQgJiYgdGhpcy5sYXp5TG9hZGVkKSB7XHJcbiAgICAgIHRoaXMubG9hZCgpLnRoZW4oKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLmRhdGE7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlcXVlc3RlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBhc3luYyBsb2FkKGNvdW50PzogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAodGhpcy5sYXp5TG9hZGVkKSB7XHJcbiAgICAgIGNvbnN0IGhhc0JlZW5SZXF1ZXN0ZWRCZWZvcmUgPSB0aGlzLnJlcXVlc3RlZDtcclxuICAgICAgdGhpcy5fbG9hZGluZyA9IHRydWU7XHJcbiAgICAgIGlmICghdGhpcy5yZXF1ZXN0ZWQpIHtcclxuICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMucmVxdWVzdGVkID0gdHJ1ZTtcclxuICAgICAgYXdhaXQgdGhpcy5jbGllbnQuc2VuZCgncmVxdWVzdC4nICsgdGhpcy5tZXRob2QsIHtcclxuICAgICAgICBjb3VudDogaGFzQmVlblJlcXVlc3RlZEJlZm9yZVxyXG4gICAgICAgICAgPyB0aGlzLmRhdGFcclxuICAgICAgICAgICAgPyBjb3VudCB8fCB0aGlzLmluaXRpYWxMb2FkaW5nQ291bnRcclxuICAgICAgICAgICAgICA/IChjb3VudCB8fCAodGhpcy5pbml0aWFsTG9hZGluZ0NvdW50IGFzIG51bWJlcikpICtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9hZGVkTGVuZ3RoXHJcbiAgICAgICAgICAgICAgOiB1bmRlZmluZWRcclxuICAgICAgICAgICAgOiB1bmRlZmluZWRcclxuICAgICAgICAgIDogdGhpcy5wcmV2aW91c2x5Q2FjaGVkQ291bnQgfHwgKHRoaXMuaW5pdGlhbExvYWRpbmdDb3VudCBhcyBudW1iZXIpLFxyXG4gICAgICAgIGxvYWRlZDogdGhpcy5sb2FkZWRMZW5ndGgsXHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhyb3cgRXJyb3IoXHJcbiAgICAgICAgJ0FjdGl2ZS1Db25uZWN0OiBDYW5ub3QgcnVuIGxvYWRpbmcgcmVxdWVzdCBhcyB0aGlzIG91dGJvdW5kIGlzIG5vdCBsYXp5LWxvYWRlZC4nXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9sb2FkaW5nID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBzZXQgbG9hZGluZyh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5fbG9hZGluZyA9IHZhbHVlO1xyXG4gICAgdGhpcy50YXJnZXQubG9hZGluZy5zZXQodGhpcy5tZXRob2QsIHZhbHVlKTtcclxuICB9XHJcbiAgcHVibGljIGdldCBsb2FkaW5nKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2xvYWRpbmc7XHJcbiAgfVxyXG4gIHB1YmxpYyBnZXQgbG9hZGVkTGVuZ3RoKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5kYXRhPy5sZW5ndGggfHwgMDtcclxuICB9XHJcbiAgcHJpdmF0ZSBfbGVuZ3RoOiBudW1iZXIgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XHJcbiAgcHVibGljIGdldCBsZW5ndGgoKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiB0aGlzLl9sZW5ndGg7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlcXVlc3RlZElkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIGxvYWRlZE9ic2VydmFibGU6IE9ic2VydmFibGU8VD4gfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIGxvYWRlZElkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIGxvYWRlZElkRGF0YTogVCB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgbG9hZGVkSWRDaGFuZ2VkOiBPYnNlcnZlcjxUPiB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgcmVxdWVzdEJ5SWQoaWQ6IG51bWJlcik6IFByb21pc2U8YW55PiB7XHJcbiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy5yZXF1ZXN0ZWRJZCA9IGlkO1xyXG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlbmQoJ3JlcXVlc3QuJyArIHRoaXMubWV0aG9kLCB7IGlkIH0pIGFzIFByb21pc2U8YW55PjtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVxdWVzdGVkR3JvdXBJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBsb2FkZWRHcm91cE9ic2VydmFibGU6IE9ic2VydmFibGU8VFtdPiB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgbG9hZGVkR3JvdXBJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBsb2FkZWRHcm91cERhdGE6IFRbXSB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgbG9hZGVkR3JvdXBDaGFuZ2VkOiBPYnNlcnZlcjxUW10+IHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSByZXF1ZXN0Rm9yR3JvdXAoZ3JvdXBJZDogbnVtYmVyKTogUHJvbWlzZTxUW10+IHtcclxuICAgIHRoaXMubG9hZGluZyA9IHRydWU7XHJcbiAgICB0aGlzLnJlcXVlc3RlZEdyb3VwSWQgPSBncm91cElkO1xyXG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlbmQoJ3JlcXVlc3QuJyArIHRoaXMubWV0aG9kLCB7IGdyb3VwSWQgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldERhdGEoZGF0YTogVFtdIHwgeyBhZGRlZDogVFtdIHwgdW5kZWZpbmVkOyBsZW5ndGg6IG51bWJlciB9KSB7XHJcbiAgICB0aGlzLmRhdGEgPSBkYXRhIGFzIFRbXTtcclxuICAgIGlmICh0aGlzLmRhdGEgJiYgdGhpcy5zb3J0QnkpIHRoaXMuZGF0YSA9IHRoaXMuZGF0YS5zb3J0KHRoaXMuc29ydEJ5KTtcclxuICAgIHRoaXMuX2xlbmd0aCA9IGRhdGEubGVuZ3RoO1xyXG4gICAgdGhpcy5kYXRhTWFwID0gbmV3IE1hcCgpO1xyXG4gICAgdGhpcy5kYXRhLmZvckVhY2goKGQpID0+IHtcclxuICAgICAgdGhpcy5kYXRhTWFwLnNldChkLmlkLCBkKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGlzRW1wdHkoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5kYXRhID09IHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBjb250YWluZWQgZGF0YSBjYW4gYmUgbW9kaWZpZWQgd2l0aGluIHRoZSBjYWxsYmFjayBtZXRob2RcclxuICAgKi9cclxuICBwdWJsaWMgdXBkYXRlKGNhbGxiYWNrOiAoZGF0YTogVFtdKSA9PiB2b2lkKSB7XHJcbiAgICBpZiAodGhpcy5kYXRhKSB7XHJcbiAgICAgIGNvbnN0IHVwZGF0ZUxlbmd0aFZhcmlhYmxlID0gdGhpcy5kYXRhLmxlbmd0aCA9PSB0aGlzLl9sZW5ndGg7XHJcbiAgICAgIGNvbnN0IGxlbmd0aCA9IHRoaXMubGVuZ3RoO1xyXG4gICAgICBjYWxsYmFjayh0aGlzLmRhdGEpO1xyXG4gICAgICB0aGlzLnNldERhdGEodGhpcy5kYXRhKTtcclxuICAgICAgaWYgKCF1cGRhdGVMZW5ndGhWYXJpYWJsZSkge1xyXG4gICAgICAgIHRoaXMuX2xlbmd0aCA9IGxlbmd0aDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhZnRlclNlcnZlclJlY29ubmVjdGVkKCkge1xyXG4gICAgaWYgKHRoaXMucmVxdWVzdGVkICYmIHRoaXMubGF6eUxvYWRlZCkge1xyXG4gICAgICB0aGlzLnJlcXVlc3RlZCA9IGZhbHNlO1xyXG4gICAgICB0aGlzLmxvYWQoMSkudGhlbigpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMubG9hZGVkSWQpIHtcclxuICAgICAgdGhpcy5sb2FkZWRJZERhdGEgPSBudWxsO1xyXG4gICAgICB0aGlzLmdldCh0aGlzLmxvYWRlZElkKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmxvYWRlZEdyb3VwSWQpIHtcclxuICAgICAgdGhpcy5sb2FkZWRHcm91cERhdGEgPSBudWxsO1xyXG4gICAgICB0aGlzLmdldEZvckdyb3VwKHRoaXMubG9hZGVkR3JvdXBJZCk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdfQ==
@@ -0,0 +1,7 @@
1
+ /*
2
+ * Public API Surface of active-connect-ng2
3
+ */
4
+ export * from './lib/active-connect-ng2.module';
5
+ export * from './lib/websocket';
6
+ export { NgxIndexedDBService } from 'ngx-indexed-db';
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL2FjdGl2ZS1jb25uZWN0LW5nMi9zcmMvcHVibGljLWFwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsaUNBQWlDLENBQUM7QUFDaEQsY0FBYyxpQkFBaUIsQ0FBQztBQUNoQyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXHJcbiAqIFB1YmxpYyBBUEkgU3VyZmFjZSBvZiBhY3RpdmUtY29ubmVjdC1uZzJcclxuICovXHJcblxyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9hY3RpdmUtY29ubmVjdC1uZzIubW9kdWxlJztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvd2Vic29ja2V0JztcclxuZXhwb3J0IHsgTmd4SW5kZXhlZERCU2VydmljZSB9IGZyb20gJ25neC1pbmRleGVkLWRiJztcclxuIl19