@ngxs/websocket-plugin 3.8.1-dev.master-07536db → 3.8.1-dev.master-4a74d16

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.
@@ -0,0 +1,34 @@
1
+ import { APP_INITIALIZER } from '@angular/core';
2
+ import { WebSocketHandler } from './websocket-handler';
3
+ import { USER_OPTIONS, NGXS_WEBSOCKET_OPTIONS } from './symbols';
4
+ export function ɵwebsocketOptionsFactory(options) {
5
+ return {
6
+ reconnectInterval: 5000,
7
+ reconnectAttempts: 10,
8
+ typeKey: 'type',
9
+ deserializer(e) {
10
+ return JSON.parse(e.data);
11
+ },
12
+ serializer(value) {
13
+ return JSON.stringify(value);
14
+ },
15
+ ...options
16
+ };
17
+ }
18
+ export function ɵgetProviders(options) {
19
+ return [
20
+ { provide: USER_OPTIONS, useValue: options },
21
+ {
22
+ provide: NGXS_WEBSOCKET_OPTIONS,
23
+ useFactory: ɵwebsocketOptionsFactory,
24
+ deps: [USER_OPTIONS]
25
+ },
26
+ {
27
+ provide: APP_INITIALIZER,
28
+ useFactory: () => () => { },
29
+ deps: [WebSocketHandler],
30
+ multi: true
31
+ }
32
+ ];
33
+ }
34
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvd2Vic29ja2V0LXBsdWdpbi9zcmMvcHJvdmlkZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFaEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFlBQVksRUFBRSxzQkFBc0IsRUFBOEIsTUFBTSxXQUFXLENBQUM7QUFFN0YsTUFBTSxVQUFVLHdCQUF3QixDQUFDLE9BQW1DO0lBQzFFLE9BQU87UUFDTCxpQkFBaUIsRUFBRSxJQUFJO1FBQ3ZCLGlCQUFpQixFQUFFLEVBQUU7UUFDckIsT0FBTyxFQUFFLE1BQU07UUFDZixZQUFZLENBQUMsQ0FBZTtZQUMxQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVCLENBQUM7UUFDRCxVQUFVLENBQUMsS0FBVTtZQUNuQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0IsQ0FBQztRQUNELEdBQUcsT0FBTztLQUNYLENBQUM7QUFDSixDQUFDO0FBRUQsTUFBTSxVQUFVLGFBQWEsQ0FBQyxPQUFvQztJQUNoRSxPQUFPO1FBQ0wsRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUU7UUFDNUM7WUFDRSxPQUFPLEVBQUUsc0JBQXNCO1lBQy9CLFVBQVUsRUFBRSx3QkFBd0I7WUFDcEMsSUFBSSxFQUFFLENBQUMsWUFBWSxDQUFDO1NBQ3JCO1FBQ0Q7WUFDRSxPQUFPLEVBQUUsZUFBZTtZQUN4QixVQUFVLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUUsQ0FBQztZQUMxQixJQUFJLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQztZQUN4QixLQUFLLEVBQUUsSUFBSTtTQUNaO0tBQ0YsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBUFBfSU5JVElBTElaRVIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgV2ViU29ja2V0SGFuZGxlciB9IGZyb20gJy4vd2Vic29ja2V0LWhhbmRsZXInO1xuaW1wb3J0IHsgVVNFUl9PUFRJT05TLCBOR1hTX1dFQlNPQ0tFVF9PUFRJT05TLCBOZ3hzV2Vic29ja2V0UGx1Z2luT3B0aW9ucyB9IGZyb20gJy4vc3ltYm9scyc7XG5cbmV4cG9ydCBmdW5jdGlvbiDJtXdlYnNvY2tldE9wdGlvbnNGYWN0b3J5KG9wdGlvbnM6IE5neHNXZWJzb2NrZXRQbHVnaW5PcHRpb25zKSB7XG4gIHJldHVybiB7XG4gICAgcmVjb25uZWN0SW50ZXJ2YWw6IDUwMDAsXG4gICAgcmVjb25uZWN0QXR0ZW1wdHM6IDEwLFxuICAgIHR5cGVLZXk6ICd0eXBlJyxcbiAgICBkZXNlcmlhbGl6ZXIoZTogTWVzc2FnZUV2ZW50KSB7XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZShlLmRhdGEpO1xuICAgIH0sXG4gICAgc2VyaWFsaXplcih2YWx1ZTogYW55KSB7XG4gICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICAgIH0sXG4gICAgLi4ub3B0aW9uc1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gybVnZXRQcm92aWRlcnMob3B0aW9ucz86IE5neHNXZWJzb2NrZXRQbHVnaW5PcHRpb25zKSB7XG4gIHJldHVybiBbXG4gICAgeyBwcm92aWRlOiBVU0VSX09QVElPTlMsIHVzZVZhbHVlOiBvcHRpb25zIH0sXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdYU19XRUJTT0NLRVRfT1BUSU9OUyxcbiAgICAgIHVzZUZhY3Rvcnk6IMm1d2Vic29ja2V0T3B0aW9uc0ZhY3RvcnksXG4gICAgICBkZXBzOiBbVVNFUl9PUFRJT05TXVxuICAgIH0sXG4gICAge1xuICAgICAgcHJvdmlkZTogQVBQX0lOSVRJQUxJWkVSLFxuICAgICAgdXNlRmFjdG9yeTogKCkgPT4gKCkgPT4ge30sXG4gICAgICBkZXBzOiBbV2ViU29ja2V0SGFuZGxlcl0sXG4gICAgICBtdWx0aTogdHJ1ZVxuICAgIH1cbiAgXTtcbn1cbiJdfQ==
@@ -1,8 +1,7 @@
1
1
  import { InjectionToken } from '@angular/core';
2
- export const NGXS_WEBSOCKET_OPTIONS = new InjectionToken('NGXS_WEBSOCKET_OPTIONS');
3
- export function noop(..._args) {
4
- return function () { };
5
- }
2
+ const NG_DEV_MODE = typeof ngDevMode === 'undefined' || ngDevMode;
3
+ export const NGXS_WEBSOCKET_OPTIONS = new InjectionToken(NG_DEV_MODE ? 'NGXS_WEBSOCKET_OPTIONS' : '');
4
+ export const USER_OPTIONS = new InjectionToken(NG_DEV_MODE ? 'USER_OPTIONS' : '');
6
5
  /**
7
6
  * Action to connect to the websocket. Optionally pass a URL.
8
7
  */
@@ -63,4 +62,4 @@ export class TypeKeyPropertyMissingError extends Error {
63
62
  super(`Property ${typeKey} is missing on the socket message`);
64
63
  }
65
64
  }
66
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ltYm9scy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL3dlYnNvY2tldC1wbHVnaW4vc3JjL3N5bWJvbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUvQyxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyxJQUFJLGNBQWMsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO0FBb0RuRixNQUFNLFVBQVUsSUFBSSxDQUFDLEdBQUcsS0FBWTtJQUNsQyxPQUFPLGNBQWEsQ0FBQyxDQUFDO0FBQ3hCLENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sT0FBTyxnQkFBZ0I7SUFHM0IsWUFBbUIsT0FBb0M7UUFBcEMsWUFBTyxHQUFQLE9BQU8sQ0FBNkI7SUFBRyxDQUFDOztBQUYzQyxxQkFBSSxHQUFHLHFCQUFxQixDQUFDO0FBSy9DOztHQUVHO0FBQ0gsTUFBTSxPQUFPLHFCQUFxQjtJQUdoQyxZQUFtQixPQUFZO1FBQVosWUFBTyxHQUFQLE9BQU8sQ0FBSztJQUFHLENBQUM7O0FBRm5CLDBCQUFJLEdBQUcsMkJBQTJCLENBQUM7QUFLckQ7O0dBRUc7QUFDSCxNQUFNLE9BQU8sbUJBQW1COztBQUNkLHdCQUFJLEdBQUcsd0JBQXdCLENBQUM7QUFHbEQ7O0dBRUc7QUFDSCxNQUFNLE9BQU8sa0JBQWtCOztBQUNiLHVCQUFJLEdBQUcsdUJBQXVCLENBQUM7QUFHakQ7O0dBRUc7QUFDSCxNQUFNLE9BQU8scUJBQXFCOztBQUNoQiwwQkFBSSxHQUFHLDBCQUEwQixDQUFDO0FBR3BEOztHQUVHO0FBQ0gsTUFBTSxPQUFPLG9CQUFvQjtJQUcvQixZQUFtQixPQUFZO1FBQVosWUFBTyxHQUFQLE9BQU8sQ0FBSztJQUFHLENBQUM7O0FBRm5CLHlCQUFJLEdBQUcsMEJBQTBCLENBQUM7QUFLcEQ7O0dBRUc7QUFDSCxNQUFNLE9BQU8sMEJBQTBCOztBQUNyQiwrQkFBSSxHQUFHLGdDQUFnQyxDQUFDO0FBRzFEOzs7R0FHRztBQUNILE1BQU0sT0FBTywyQkFBNEIsU0FBUSxLQUFLO0lBQ3BELFlBQVksT0FBZTtRQUN6QixLQUFLLENBQUMsWUFBWSxPQUFPLG1DQUFtQyxDQUFDLENBQUM7SUFDaEUsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuZXhwb3J0IGNvbnN0IE5HWFNfV0VCU09DS0VUX09QVElPTlMgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ05HWFNfV0VCU09DS0VUX09QVElPTlMnKTtcblxuZXhwb3J0IGludGVyZmFjZSBOZ3hzV2Vic29ja2V0UGx1Z2luT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBVUkwgb2YgdGhlIHdlYnNvY2tldC5cbiAgICovXG4gIHVybD86IHN0cmluZztcblxuICAvKipcbiAgICogRWl0aGVyIGEgc2luZ2xlIHByb3RvY29sIHN0cmluZyBvciBhbiBhcnJheSBvZiBwcm90b2NvbCBzdHJpbmdzLlxuICAgKiBUaGVzZSBzdHJpbmdzIGFyZSB1c2VkIHRvIGluZGljYXRlIHN1Yi1wcm90b2NvbHMsIHNvIHRoYXQgYSBzaW5nbGUgc2VydmVyXG4gICAqIGNhbiBpbXBsZW1lbnQgbXVsdGlwbGUgV2ViU29ja2V0IHN1Yi1wcm90b2NvbHMgKGZvciBleGFtcGxlLCB5b3UgbWlnaHQgd2FudCBvbmUgc2VydmVyIHRvIGJlIGFibGVcbiAgICogdG8gaGFuZGxlIGRpZmZlcmVudCB0eXBlcyBvZiBpbnRlcmFjdGlvbnMgZGVwZW5kaW5nIG9uIHRoZSBzcGVjaWZpZWQgcHJvdG9jb2wpLlxuICAgKiBJZiB5b3UgZG9uJ3Qgc3BlY2lmeSBhIHByb3RvY29sIHN0cmluZywgYW4gZW1wdHkgc3RyaW5nIGlzIGFzc3VtZWQuXG4gICAqL1xuICBwcm90b2NvbD86IHN0cmluZyB8IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBgYmluYXJ5VHlwZWAgcHJvcGVydHkgb2YgdGhlIHVuZGVybHlpbmcgV2ViU29ja2V0LlxuICAgKi9cbiAgYmluYXJ5VHlwZT86ICdibG9iJyB8ICdhcnJheWJ1ZmZlcic7XG5cbiAgLyoqXG4gICAqIFRoZSBwcm9wZXJ0eSBuYW1lIHRvIGRpc3RpZ3VuaXNoIHRoaXMgdHlwZSBmb3IgdGhlIHN0b3JlLlxuICAgKiBEZWZhdWx0OiAndHlwZSdcbiAgICovXG4gIHR5cGVLZXk/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEludGVydmFsIHRvIHRyeSBhbmQgcmVjb25uZWN0LlxuICAgKiBEZWZhdWx0OiA1MDAwXG4gICAqL1xuICByZWNvbm5lY3RJbnRlcnZhbD86IG51bWJlcjtcblxuICAvKipcbiAgICogTnVtYmVyIG9mIHJlY29ubmVjdCBhdHRlbXBzLlxuICAgKiBEZWZhdWx0OiAxMFxuICAgKi9cbiAgcmVjb25uZWN0QXR0ZW1wdHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXIgdG8gY2FsbCBiZWZvcmUgc2VuZGluZyBtZXNzYWdlc1xuICAgKiBEZWZhdWx0OiBganNvbi5zdHJpbmdpZnlgXG4gICAqL1xuICBzZXJpYWxpemVyPzogKGRhdGE6IGFueSkgPT4gc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBEZXNlcmFsaXplciBiZWZvcmUgcHVibGlzaGluZyB0aGUgbWVzc2FnZS5cbiAgICovXG4gIGRlc2VyaWFsaXplcj86IChlOiBNZXNzYWdlRXZlbnQpID0+IGFueTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5vb3AoLi4uX2FyZ3M6IGFueVtdKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7fTtcbn1cblxuLyoqXG4gKiBBY3Rpb24gdG8gY29ubmVjdCB0byB0aGUgd2Vic29ja2V0LiBPcHRpb25hbGx5IHBhc3MgYSBVUkwuXG4gKi9cbmV4cG9ydCBjbGFzcyBDb25uZWN0V2ViU29ja2V0IHtcbiAgc3RhdGljIHJlYWRvbmx5IHR5cGUgPSAnW1dlYlNvY2tldF0gQ29ubmVjdCc7XG5cbiAgY29uc3RydWN0b3IocHVibGljIHBheWxvYWQ/OiBOZ3hzV2Vic29ja2V0UGx1Z2luT3B0aW9ucykge31cbn1cblxuLyoqXG4gKiBBY3Rpb24gdHJpZ2dlcmVkIHdoZW4gYSBlcnJvciBvY3VycnNcbiAqL1xuZXhwb3J0IGNsYXNzIFdlYnNvY2tldE1lc3NhZ2VFcnJvciB7XG4gIHN0YXRpYyByZWFkb25seSB0eXBlID0gJ1tXZWJTb2NrZXRdIE1lc3NhZ2UgRXJyb3InO1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBwYXlsb2FkOiBhbnkpIHt9XG59XG5cbi8qKlxuICogQWN0aW9uIHRvIGRpc2Nvbm5lY3QgdGhlIHdlYnNvY2tldC5cbiAqL1xuZXhwb3J0IGNsYXNzIERpc2Nvbm5lY3RXZWJTb2NrZXQge1xuICBzdGF0aWMgcmVhZG9ubHkgdHlwZSA9ICdbV2ViU29ja2V0XSBEaXNjb25uZWN0Jztcbn1cblxuLyoqXG4gKiBBY3Rpb24gdHJpZ2dlcmVkIHdoZW4gd2Vic29ja2V0IGlzIGNvbm5lY3RlZFxuICovXG5leHBvcnQgY2xhc3MgV2ViU29ja2V0Q29ubmVjdGVkIHtcbiAgc3RhdGljIHJlYWRvbmx5IHR5cGUgPSAnW1dlYlNvY2tldF0gQ29ubmVjdGVkJztcbn1cblxuLyoqXG4gKiBBY3Rpb24gdHJpZ2dlcmVkIHdoZW4gd2Vic29ja2V0IGlzIGRpc2Nvbm5lY3RlZFxuICovXG5leHBvcnQgY2xhc3MgV2ViU29ja2V0RGlzY29ubmVjdGVkIHtcbiAgc3RhdGljIHJlYWRvbmx5IHR5cGUgPSAnW1dlYlNvY2tldF0gRGlzY29ubmVjdGVkJztcbn1cblxuLyoqXG4gKiBBY3Rpb24gdG8gc2VuZCB0byB0aGUgc2VydmVyLlxuICovXG5leHBvcnQgY2xhc3MgU2VuZFdlYlNvY2tldE1lc3NhZ2Uge1xuICBzdGF0aWMgcmVhZG9ubHkgdHlwZSA9ICdbV2ViU29ja2V0XSBTZW5kIE1lc3NhZ2UnO1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBwYXlsb2FkOiBhbnkpIHt9XG59XG5cbi8qKlxuICogQWN0aW9uIGRpc3BhdGNoZWQgd2hlbiB0aGUgdXNlciB0cmllcyB0byBjb25uZWN0IGlmIHRoZSBjb25uZWN0aW9uIGFscmVhZHkgZXhpc3RzLlxuICovXG5leHBvcnQgY2xhc3MgV2ViU29ja2V0Q29ubmVjdGlvblVwZGF0ZWQge1xuICBzdGF0aWMgcmVhZG9ubHkgdHlwZSA9ICdbV2ViU29ja2V0XSBDb25uZWN0aW9uIFVwZGF0ZWQnO1xufVxuXG4vKipcbiAqIFRoaXMgZXJyb3IgaXMgdGhyb3duIHdoZXJlIHRoZXJlIGlzIG5vIGB0eXBlYCAob3IgY3VzdG9tIGB0eXBlS2V5YCkgcHJvcGVydHlcbiAqIG9uIHRoZSBtZXNzYWdlIHRoYXQgY2FtZSBmcm9tIHRoZSBzZXJ2ZXIgc2lkZSBzb2NrZXRcbiAqL1xuZXhwb3J0IGNsYXNzIFR5cGVLZXlQcm9wZXJ0eU1pc3NpbmdFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IodHlwZUtleTogc3RyaW5nKSB7XG4gICAgc3VwZXIoYFByb3BlcnR5ICR7dHlwZUtleX0gaXMgbWlzc2luZyBvbiB0aGUgc29ja2V0IG1lc3NhZ2VgKTtcbiAgfVxufVxuIl19
65
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ltYm9scy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL3dlYnNvY2tldC1wbHVnaW4vc3JjL3N5bWJvbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUkvQyxNQUFNLFdBQVcsR0FBRyxPQUFPLFNBQVMsS0FBSyxXQUFXLElBQUksU0FBUyxDQUFDO0FBRWxFLE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLElBQUksY0FBYyxDQUN0RCxXQUFXLENBQUMsQ0FBQyxDQUFDLHdCQUF3QixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQzVDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsSUFBSSxjQUFjLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBb0RsRjs7R0FFRztBQUNILE1BQU0sT0FBTyxnQkFBZ0I7SUFHM0IsWUFBbUIsT0FBb0M7UUFBcEMsWUFBTyxHQUFQLE9BQU8sQ0FBNkI7SUFBRyxDQUFDOztBQUYzQyxxQkFBSSxHQUFHLHFCQUFxQixDQUFDO0FBSy9DOztHQUVHO0FBQ0gsTUFBTSxPQUFPLHFCQUFxQjtJQUdoQyxZQUFtQixPQUFZO1FBQVosWUFBTyxHQUFQLE9BQU8sQ0FBSztJQUFHLENBQUM7O0FBRm5CLDBCQUFJLEdBQUcsMkJBQTJCLENBQUM7QUFLckQ7O0dBRUc7QUFDSCxNQUFNLE9BQU8sbUJBQW1COztBQUNkLHdCQUFJLEdBQUcsd0JBQXdCLENBQUM7QUFHbEQ7O0dBRUc7QUFDSCxNQUFNLE9BQU8sa0JBQWtCOztBQUNiLHVCQUFJLEdBQUcsdUJBQXVCLENBQUM7QUFHakQ7O0dBRUc7QUFDSCxNQUFNLE9BQU8scUJBQXFCOztBQUNoQiwwQkFBSSxHQUFHLDBCQUEwQixDQUFDO0FBR3BEOztHQUVHO0FBQ0gsTUFBTSxPQUFPLG9CQUFvQjtJQUcvQixZQUFtQixPQUFZO1FBQVosWUFBTyxHQUFQLE9BQU8sQ0FBSztJQUFHLENBQUM7O0FBRm5CLHlCQUFJLEdBQUcsMEJBQTBCLENBQUM7QUFLcEQ7O0dBRUc7QUFDSCxNQUFNLE9BQU8sMEJBQTBCOztBQUNyQiwrQkFBSSxHQUFHLGdDQUFnQyxDQUFDO0FBRzFEOzs7R0FHRztBQUNILE1BQU0sT0FBTywyQkFBNEIsU0FBUSxLQUFLO0lBQ3BELFlBQVksT0FBZTtRQUN6QixLQUFLLENBQUMsWUFBWSxPQUFPLG1DQUFtQyxDQUFDLENBQUM7SUFDaEUsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuZGVjbGFyZSBjb25zdCBuZ0Rldk1vZGU6IGJvb2xlYW47XG5cbmNvbnN0IE5HX0RFVl9NT0RFID0gdHlwZW9mIG5nRGV2TW9kZSA9PT0gJ3VuZGVmaW5lZCcgfHwgbmdEZXZNb2RlO1xuXG5leHBvcnQgY29uc3QgTkdYU19XRUJTT0NLRVRfT1BUSU9OUyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxOZ3hzV2Vic29ja2V0UGx1Z2luT3B0aW9ucz4oXG4gIE5HX0RFVl9NT0RFID8gJ05HWFNfV0VCU09DS0VUX09QVElPTlMnIDogJydcbik7XG5cbmV4cG9ydCBjb25zdCBVU0VSX09QVElPTlMgPSBuZXcgSW5qZWN0aW9uVG9rZW4oTkdfREVWX01PREUgPyAnVVNFUl9PUFRJT05TJyA6ICcnKTtcblxuZXhwb3J0IGludGVyZmFjZSBOZ3hzV2Vic29ja2V0UGx1Z2luT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBVUkwgb2YgdGhlIHdlYnNvY2tldC5cbiAgICovXG4gIHVybD86IHN0cmluZztcblxuICAvKipcbiAgICogRWl0aGVyIGEgc2luZ2xlIHByb3RvY29sIHN0cmluZyBvciBhbiBhcnJheSBvZiBwcm90b2NvbCBzdHJpbmdzLlxuICAgKiBUaGVzZSBzdHJpbmdzIGFyZSB1c2VkIHRvIGluZGljYXRlIHN1Yi1wcm90b2NvbHMsIHNvIHRoYXQgYSBzaW5nbGUgc2VydmVyXG4gICAqIGNhbiBpbXBsZW1lbnQgbXVsdGlwbGUgV2ViU29ja2V0IHN1Yi1wcm90b2NvbHMgKGZvciBleGFtcGxlLCB5b3UgbWlnaHQgd2FudCBvbmUgc2VydmVyIHRvIGJlIGFibGVcbiAgICogdG8gaGFuZGxlIGRpZmZlcmVudCB0eXBlcyBvZiBpbnRlcmFjdGlvbnMgZGVwZW5kaW5nIG9uIHRoZSBzcGVjaWZpZWQgcHJvdG9jb2wpLlxuICAgKiBJZiB5b3UgZG9uJ3Qgc3BlY2lmeSBhIHByb3RvY29sIHN0cmluZywgYW4gZW1wdHkgc3RyaW5nIGlzIGFzc3VtZWQuXG4gICAqL1xuICBwcm90b2NvbD86IHN0cmluZyB8IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBgYmluYXJ5VHlwZWAgcHJvcGVydHkgb2YgdGhlIHVuZGVybHlpbmcgV2ViU29ja2V0LlxuICAgKi9cbiAgYmluYXJ5VHlwZT86ICdibG9iJyB8ICdhcnJheWJ1ZmZlcic7XG5cbiAgLyoqXG4gICAqIFRoZSBwcm9wZXJ0eSBuYW1lIHRvIGRpc3RpZ3VuaXNoIHRoaXMgdHlwZSBmb3IgdGhlIHN0b3JlLlxuICAgKiBEZWZhdWx0OiAndHlwZSdcbiAgICovXG4gIHR5cGVLZXk/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEludGVydmFsIHRvIHRyeSBhbmQgcmVjb25uZWN0LlxuICAgKiBEZWZhdWx0OiA1MDAwXG4gICAqL1xuICByZWNvbm5lY3RJbnRlcnZhbD86IG51bWJlcjtcblxuICAvKipcbiAgICogTnVtYmVyIG9mIHJlY29ubmVjdCBhdHRlbXBzLlxuICAgKiBEZWZhdWx0OiAxMFxuICAgKi9cbiAgcmVjb25uZWN0QXR0ZW1wdHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXIgdG8gY2FsbCBiZWZvcmUgc2VuZGluZyBtZXNzYWdlc1xuICAgKiBEZWZhdWx0OiBganNvbi5zdHJpbmdpZnlgXG4gICAqL1xuICBzZXJpYWxpemVyPzogKGRhdGE6IGFueSkgPT4gc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBEZXNlcmFsaXplciBiZWZvcmUgcHVibGlzaGluZyB0aGUgbWVzc2FnZS5cbiAgICovXG4gIGRlc2VyaWFsaXplcj86IChlOiBNZXNzYWdlRXZlbnQpID0+IGFueTtcbn1cblxuLyoqXG4gKiBBY3Rpb24gdG8gY29ubmVjdCB0byB0aGUgd2Vic29ja2V0LiBPcHRpb25hbGx5IHBhc3MgYSBVUkwuXG4gKi9cbmV4cG9ydCBjbGFzcyBDb25uZWN0V2ViU29ja2V0IHtcbiAgc3RhdGljIHJlYWRvbmx5IHR5cGUgPSAnW1dlYlNvY2tldF0gQ29ubmVjdCc7XG5cbiAgY29uc3RydWN0b3IocHVibGljIHBheWxvYWQ/OiBOZ3hzV2Vic29ja2V0UGx1Z2luT3B0aW9ucykge31cbn1cblxuLyoqXG4gKiBBY3Rpb24gdHJpZ2dlcmVkIHdoZW4gYSBlcnJvciBvY3VycnNcbiAqL1xuZXhwb3J0IGNsYXNzIFdlYnNvY2tldE1lc3NhZ2VFcnJvciB7XG4gIHN0YXRpYyByZWFkb25seSB0eXBlID0gJ1tXZWJTb2NrZXRdIE1lc3NhZ2UgRXJyb3InO1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBwYXlsb2FkOiBhbnkpIHt9XG59XG5cbi8qKlxuICogQWN0aW9uIHRvIGRpc2Nvbm5lY3QgdGhlIHdlYnNvY2tldC5cbiAqL1xuZXhwb3J0IGNsYXNzIERpc2Nvbm5lY3RXZWJTb2NrZXQge1xuICBzdGF0aWMgcmVhZG9ubHkgdHlwZSA9ICdbV2ViU29ja2V0XSBEaXNjb25uZWN0Jztcbn1cblxuLyoqXG4gKiBBY3Rpb24gdHJpZ2dlcmVkIHdoZW4gd2Vic29ja2V0IGlzIGNvbm5lY3RlZFxuICovXG5leHBvcnQgY2xhc3MgV2ViU29ja2V0Q29ubmVjdGVkIHtcbiAgc3RhdGljIHJlYWRvbmx5IHR5cGUgPSAnW1dlYlNvY2tldF0gQ29ubmVjdGVkJztcbn1cblxuLyoqXG4gKiBBY3Rpb24gdHJpZ2dlcmVkIHdoZW4gd2Vic29ja2V0IGlzIGRpc2Nvbm5lY3RlZFxuICovXG5leHBvcnQgY2xhc3MgV2ViU29ja2V0RGlzY29ubmVjdGVkIHtcbiAgc3RhdGljIHJlYWRvbmx5IHR5cGUgPSAnW1dlYlNvY2tldF0gRGlzY29ubmVjdGVkJztcbn1cblxuLyoqXG4gKiBBY3Rpb24gdG8gc2VuZCB0byB0aGUgc2VydmVyLlxuICovXG5leHBvcnQgY2xhc3MgU2VuZFdlYlNvY2tldE1lc3NhZ2Uge1xuICBzdGF0aWMgcmVhZG9ubHkgdHlwZSA9ICdbV2ViU29ja2V0XSBTZW5kIE1lc3NhZ2UnO1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBwYXlsb2FkOiBhbnkpIHt9XG59XG5cbi8qKlxuICogQWN0aW9uIGRpc3BhdGNoZWQgd2hlbiB0aGUgdXNlciB0cmllcyB0byBjb25uZWN0IGlmIHRoZSBjb25uZWN0aW9uIGFscmVhZHkgZXhpc3RzLlxuICovXG5leHBvcnQgY2xhc3MgV2ViU29ja2V0Q29ubmVjdGlvblVwZGF0ZWQge1xuICBzdGF0aWMgcmVhZG9ubHkgdHlwZSA9ICdbV2ViU29ja2V0XSBDb25uZWN0aW9uIFVwZGF0ZWQnO1xufVxuXG4vKipcbiAqIFRoaXMgZXJyb3IgaXMgdGhyb3duIHdoZXJlIHRoZXJlIGlzIG5vIGB0eXBlYCAob3IgY3VzdG9tIGB0eXBlS2V5YCkgcHJvcGVydHlcbiAqIG9uIHRoZSBtZXNzYWdlIHRoYXQgY2FtZSBmcm9tIHRoZSBzZXJ2ZXIgc2lkZSBzb2NrZXRcbiAqL1xuZXhwb3J0IGNsYXNzIFR5cGVLZXlQcm9wZXJ0eU1pc3NpbmdFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IodHlwZUtleTogc3RyaW5nKSB7XG4gICAgc3VwZXIoYFByb3BlcnR5ICR7dHlwZUtleX0gaXMgbWlzc2luZyBvbiB0aGUgc29ja2V0IG1lc3NhZ2VgKTtcbiAgfVxufVxuIl19
@@ -1,142 +1,148 @@
1
- import { Injectable, Inject } from '@angular/core';
1
+ import { Injectable, Inject, NgZone } from '@angular/core';
2
2
  import { Actions, Store, getValue, ofActionDispatched } from '@ngxs/store';
3
- import { Subscription } from 'rxjs';
4
- import { WebSocketSubject } from 'rxjs/webSocket';
3
+ import { ReplaySubject, Subject, fromEvent } from 'rxjs';
4
+ import { takeUntil } from 'rxjs/operators';
5
5
  import { ConnectWebSocket, DisconnectWebSocket, SendWebSocketMessage, NGXS_WEBSOCKET_OPTIONS, WebsocketMessageError, WebSocketDisconnected, TypeKeyPropertyMissingError, WebSocketConnectionUpdated, WebSocketConnected } from './symbols';
6
6
  import * as i0 from "@angular/core";
7
7
  import * as i1 from "@ngxs/store";
8
8
  export class WebSocketHandler {
9
- constructor(store, actions$, options) {
10
- this.store = store;
11
- this.actions$ = actions$;
12
- this.options = options;
13
- this.socket = null;
14
- this.config = {
15
- url: this.options.url,
16
- protocol: this.options.protocol,
17
- // Default binary type is `blob` for the global `WebSocket`
18
- binaryType: this.options.binaryType,
19
- serializer: this.options.serializer,
20
- deserializer: this.options.deserializer,
21
- closeObserver: {
22
- next: () => {
23
- // ATTENTION!
24
- // See https://github.com/ReactiveX/rxjs/blob/master/src/internal/observable/dom/WebSocketSubject.ts#L340
25
- // RxJS socket emits `onComplete` event only if `event.wasClean` is truthy
26
- // and doesn't complete socket subject if it's falsy
27
- this.disconnect();
28
- }
29
- },
30
- openObserver: {
31
- next: () => this.store.dispatch(new WebSocketConnected())
32
- }
33
- };
34
- this.typeKey = this.options.typeKey;
35
- this.subscription = new Subscription();
36
- this.setupActionsListeners();
9
+ constructor(_store, _ngZone, _actions$, _options) {
10
+ this._store = _store;
11
+ this._ngZone = _ngZone;
12
+ this._actions$ = _actions$;
13
+ this._options = _options;
14
+ this._socket = null;
15
+ this._socketClosed$ = new Subject();
16
+ this._typeKey = this._options.typeKey;
17
+ this._destroy$ = new ReplaySubject(1);
18
+ this._setupActionsListeners();
37
19
  }
38
20
  ngOnDestroy() {
39
- this.closeConnection();
40
- this.subscription.unsubscribe();
21
+ this._disconnect(/* forcelyCloseSocket */ true);
22
+ this._destroy$.next();
41
23
  }
42
- setupActionsListeners() {
43
- this.subscription.add(this.actions$.pipe(ofActionDispatched(ConnectWebSocket)).subscribe(({ payload }) => {
24
+ _setupActionsListeners() {
25
+ this._actions$
26
+ .pipe(ofActionDispatched(ConnectWebSocket), takeUntil(this._destroy$))
27
+ .subscribe(({ payload }) => {
44
28
  this.connect(payload);
45
- }));
46
- this.subscription.add(this.actions$.pipe(ofActionDispatched(DisconnectWebSocket)).subscribe(() => {
47
- this.disconnect();
48
- }));
49
- this.subscription.add(this.actions$.pipe(ofActionDispatched(SendWebSocketMessage)).subscribe(({ payload }) => {
29
+ });
30
+ this._actions$
31
+ .pipe(ofActionDispatched(DisconnectWebSocket), takeUntil(this._destroy$))
32
+ .subscribe(() => {
33
+ this._disconnect(/* forcelyCloseSocket */ true);
34
+ });
35
+ this._actions$
36
+ .pipe(ofActionDispatched(SendWebSocketMessage), takeUntil(this._destroy$))
37
+ .subscribe(({ payload }) => {
50
38
  this.send(payload);
51
- }));
39
+ });
52
40
  }
53
41
  connect(options) {
54
- this.updateConnection();
55
- // Users can pass the options in the connect method so
56
- // if options aren't available at DI bootstrap they have access
57
- // to pass them here
42
+ if (this._socket) {
43
+ this._closeConnection(/* forcelyCloseSocket */ true);
44
+ this._store.dispatch(new WebSocketConnectionUpdated());
45
+ }
46
+ // TODO(arturovt): we should not override default config values because this breaks support for having multiple socket connections.
58
47
  if (options) {
59
- this.mergeConfigWithOptions(options);
48
+ if (options.serializer) {
49
+ this._options.serializer = options.serializer;
50
+ }
51
+ if (options.deserializer) {
52
+ this._options.deserializer = options.deserializer;
53
+ }
60
54
  }
61
- this.socket = new WebSocketSubject(this.config);
62
- this.socket.subscribe({
63
- next: (message) => {
64
- const type = getValue(message, this.typeKey);
55
+ this._ngZone.runOutsideAngular(() => {
56
+ // We either use options provided in the `ConnectWebSocket` action
57
+ // or fallback to default config values.
58
+ const url = options?.url || this._options.url;
59
+ const protocol = options?.protocol || this._options.protocol;
60
+ const binaryType = options?.binaryType || this._options.binaryType;
61
+ const socket = (this._socket = protocol
62
+ ? new WebSocket(url, protocol)
63
+ : new WebSocket(url));
64
+ if (binaryType) {
65
+ socket.binaryType = binaryType;
66
+ }
67
+ fromEvent(socket, 'open')
68
+ .pipe(takeUntil(this._socketClosed$))
69
+ .subscribe(() => this._store.dispatch(new WebSocketConnected()));
70
+ fromEvent(socket, 'message')
71
+ .pipe(takeUntil(this._socketClosed$))
72
+ .subscribe(event => {
73
+ const message = this._options.deserializer(event);
74
+ const type = getValue(message, this._typeKey);
65
75
  if (!type) {
66
- throw new TypeKeyPropertyMissingError(this.typeKey);
76
+ throw new TypeKeyPropertyMissingError(this._typeKey);
67
77
  }
68
- this.store.dispatch({ ...message, type });
69
- },
70
- error: (error) => {
71
- if (error instanceof CloseEvent) {
72
- this.dispatchWebSocketDisconnected();
78
+ this._store.dispatch({ ...message, type });
79
+ });
80
+ fromEvent(socket, 'error')
81
+ .pipe(takeUntil(this._socketClosed$))
82
+ .subscribe(error => {
83
+ // The error event indicates that an error has occurred during the
84
+ // WebSocket communication, and it is often appropriate to close the
85
+ // WebSocket connection when such an error occurs.
86
+ // We need to call `_disconnect()` after the error event has been fired.
87
+ // This ensures that the WebSocket connection is properly closed to prevent
88
+ // potential resource leaks.
89
+ this._disconnect(/* forcelyCloseSocket */ true);
90
+ this._store.dispatch(new WebsocketMessageError(error));
91
+ });
92
+ fromEvent(socket, 'close')
93
+ .pipe(takeUntil(this._socketClosed$))
94
+ .subscribe(event => {
95
+ if (event.wasClean) {
96
+ // It is not necessary to call `socket.close()` after the `close` event
97
+ // has been fired. In fact, calling `socket.close()` within the `close`
98
+ // event handler or immediately after the event has been fired can lead
99
+ // to unexpected behavior.
100
+ this._disconnect(/* forcelyCloseSocket */ false);
73
101
  }
74
102
  else {
75
- this.store.dispatch(new WebsocketMessageError(error));
103
+ // If the WebSocket `close` event has been fired and its `wasClean`
104
+ // property is falsy, it indicates that the WebSocket connection was
105
+ // closed in an unexpected or abnormal manner.
106
+ // We should call `socket.close()` in this scenario, we can ensure that
107
+ // the WebSocket connection is properly closed.
108
+ this._disconnect(/* forcelyCloseSocket */ true);
109
+ this._store.dispatch(new WebsocketMessageError(event));
76
110
  }
77
- }
111
+ });
78
112
  });
79
113
  }
80
- disconnect() {
81
- if (this.socket) {
82
- this.closeConnection();
83
- this.dispatchWebSocketDisconnected();
114
+ _disconnect(forcelyCloseSocket) {
115
+ if (this._socket) {
116
+ this._closeConnection(forcelyCloseSocket);
117
+ this._store.dispatch(new WebSocketDisconnected());
84
118
  }
85
119
  }
86
120
  send(data) {
87
- if (!this.socket) {
121
+ if (!this._socket) {
88
122
  throw new Error('You must connect to the socket before sending any data');
89
123
  }
90
- this.socket.next(data);
91
- }
92
- /**
93
- * Don't enlarge the `connect` method
94
- */
95
- mergeConfigWithOptions(options) {
96
- if (options.url) {
97
- this.config.url = options.url;
98
- }
99
- if (options.serializer) {
100
- this.config.serializer = options.serializer;
124
+ try {
125
+ this._socket.send(this._options.serializer(data));
101
126
  }
102
- if (options.deserializer) {
103
- this.config.deserializer = options.deserializer;
127
+ catch (error) {
128
+ this._store.dispatch(new WebsocketMessageError(error));
104
129
  }
105
130
  }
106
- /**
107
- * To ensure we don't have any memory leaks
108
- * e.g. if the user occasionally dispatched `ConnectWebSocket` twice
109
- * then the previous subscription will still live in the memory
110
- * to prevent such behavior - we close the previous connection if it exists
111
- */
112
- updateConnection() {
113
- if (this.socket) {
114
- this.closeConnection();
115
- this.store.dispatch(new WebSocketConnectionUpdated());
116
- }
117
- }
118
- /**
119
- * Used in many places so it's better to move the code into function
120
- */
121
- dispatchWebSocketDisconnected() {
122
- this.store.dispatch(new WebSocketDisconnected());
123
- }
124
- closeConnection() {
125
- // `socket.complete()` closes the connection
126
- // also it doesn't invoke the `onComplete` callback that we passed
127
- // into `socket.subscribe(...)`
128
- if (this.socket !== null) {
129
- this.socket.complete();
130
- this.socket = null;
131
+ _closeConnection(forcelyCloseSocket) {
132
+ if (forcelyCloseSocket) {
133
+ this._socket?.close();
131
134
  }
135
+ this._socket = null;
136
+ this._socketClosed$.next();
132
137
  }
133
138
  }
134
- /** @nocollapse */ WebSocketHandler.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.4", ngImport: i0, type: WebSocketHandler, deps: [{ token: i1.Store }, { token: i1.Actions }, { token: NGXS_WEBSOCKET_OPTIONS }], target: i0.ɵɵFactoryTarget.Injectable });
135
- /** @nocollapse */ WebSocketHandler.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.4", ngImport: i0, type: WebSocketHandler });
139
+ /** @nocollapse */ WebSocketHandler.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.4", ngImport: i0, type: WebSocketHandler, deps: [{ token: i1.Store }, { token: i0.NgZone }, { token: i1.Actions }, { token: NGXS_WEBSOCKET_OPTIONS }], target: i0.ɵɵFactoryTarget.Injectable });
140
+ /** @nocollapse */ WebSocketHandler.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.4", ngImport: i0, type: WebSocketHandler, providedIn: 'root' });
136
141
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.4", ngImport: i0, type: WebSocketHandler, decorators: [{
137
- type: Injectable
138
- }], ctorParameters: function () { return [{ type: i1.Store }, { type: i1.Actions }, { type: undefined, decorators: [{
142
+ type: Injectable,
143
+ args: [{ providedIn: 'root' }]
144
+ }], ctorParameters: function () { return [{ type: i1.Store }, { type: i0.NgZone }, { type: i1.Actions }, { type: undefined, decorators: [{
139
145
  type: Inject,
140
146
  args: [NGXS_WEBSOCKET_OPTIONS]
141
147
  }] }]; } });
142
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LWhhbmRsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy93ZWJzb2NrZXQtcGx1Z2luL3NyYy93ZWJzb2NrZXQtaGFuZGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBYSxNQUFNLGVBQWUsQ0FBQztBQUM5RCxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDM0UsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUVwQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQTBCLE1BQU0sZ0JBQWdCLENBQUM7QUFFMUUsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixtQkFBbUIsRUFDbkIsb0JBQW9CLEVBQ3BCLHNCQUFzQixFQUV0QixxQkFBcUIsRUFDckIscUJBQXFCLEVBQ3JCLDJCQUEyQixFQUMzQiwwQkFBMEIsRUFDMUIsa0JBQWtCLEVBQ25CLE1BQU0sV0FBVyxDQUFDOzs7QUFHbkIsTUFBTSxPQUFPLGdCQUFnQjtJQTRCM0IsWUFDVSxLQUFZLEVBQ1osUUFBaUIsRUFDZSxPQUFtQztRQUZuRSxVQUFLLEdBQUwsS0FBSyxDQUFPO1FBQ1osYUFBUSxHQUFSLFFBQVEsQ0FBUztRQUNlLFlBQU8sR0FBUCxPQUFPLENBQTRCO1FBOUJyRSxXQUFNLEdBQWlDLElBQUksQ0FBQztRQUU1QyxXQUFNLEdBQWdDO1lBQzVDLEdBQUcsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUk7WUFDdEIsUUFBUSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUTtZQUMvQiwyREFBMkQ7WUFDM0QsVUFBVSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVTtZQUNuQyxVQUFVLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVO1lBQ25DLFlBQVksRUFBRSxJQUFJ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QyxRQUFRLENBQUMsSUFBSSxxQkFBcUIsRUFBRSxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVPLGVBQWU7UUFDckIsNENBQTRDO1FBQzVDLGtFQUFrRTtRQUNsRSwrQkFBK0I7UUFDL0IsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLElBQUksRUFBRTtZQUN4QixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1NBQ3BCO0lBQ0gsQ0FBQzs7Z0lBdkpVLGdCQUFnQiw4REErQmpCLHNCQUFzQjtvSUEvQnJCLGdCQUFnQjsyRkFBaEIsZ0JBQWdCO2tCQUQ1QixVQUFVOzswQkFnQ04sTUFBTTsyQkFBQyxzQkFBc0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3QsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWN0aW9ucywgU3RvcmUsIGdldFZhbHVlLCBvZkFjdGlvbkRpc3BhdGNoZWQgfSBmcm9tICdAbmd4cy9zdG9yZSc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgV2ViU29ja2V0U3ViamVjdCwgV2ViU29ja2V0U3ViamVjdENvbmZpZyB9IGZyb20gJ3J4anMvd2ViU29ja2V0JztcblxuaW1wb3J0IHtcbiAgQ29ubmVjdFdlYlNvY2tldCxcbiAgRGlzY29ubmVjdFdlYlNvY2tldCxcbiAgU2VuZFdlYlNvY2tldE1lc3NhZ2UsXG4gIE5HWFNfV0VCU09DS0VUX09QVElPTlMsXG4gIE5neHNXZWJzb2NrZXRQbHVnaW5PcHRpb25zLFxuICBXZWJzb2NrZXRNZXNzYWdlRXJyb3IsXG4gIFdlYlNvY2tldERpc2Nvbm5lY3RlZCxcbiAgVHlwZUtleVByb3BlcnR5TWlzc2luZ0Vycm9yLFxuICBXZWJTb2NrZXRDb25uZWN0aW9uVXBkYXRlZCxcbiAgV2ViU29ja2V0Q29ubmVjdGVkXG59IGZyb20gJy4vc3ltYm9scyc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBXZWJTb2NrZXRIYW5kbGVyIGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSBzb2NrZXQ6IFdlYlNvY2tldFN1YmplY3Q8YW55PiB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgY29uZmlnOiBXZWJTb2NrZXRTdWJqZWN0Q29uZmlnPGFueT4gPSB7XG4gICAgdXJsOiB0aGlzLm9wdGlvbnMudXJsISxcbiAgICBwcm90b2NvbDogdGhpcy5vcHRpb25zLnByb3RvY29sLFxuICAgIC8vIERlZmF1bHQgYmluYXJ5IHR5cGUgaXMgYGJsb2JgIGZvciB0aGUgZ2xvYmFsIGBXZWJTb2NrZXRgXG4gICAgYmluYXJ5VHlwZTogdGhpcy5vcHRpb25zLmJpbmFyeVR5cGUsXG4gICAgc2VyaWFsaXplcjogdGhpcy5vcHRpb25zLnNlcmlhbGl6ZXIsXG4gICAgZGVzZXJpYWxpemVyOiB0aGlzLm9wdGlvbnMuZGVzZXJpYWxpemVyLFxuICAgIGNsb3NlT2JzZXJ2ZXI6IHtcbiAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgLy8gQVRURU5USU9OIVxuICAgICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL1JlYWN0aXZlWC9yeGpzL2Jsb2IvbWFzdGVyL3NyYy9pbnRlcm5hbC9vYnNlcnZhYmxlL2RvbS9XZWJTb2NrZXRTdWJqZWN0LnRzI0wzNDBcbiAgICAgICAgLy8gUnhKUyBzb2NrZXQgZW1pdHMgYG9uQ29tcGxldGVgIGV2ZW50IG9ubHkgaWYgYGV2ZW50Lndhc0NsZWFuYCBpcyB0cnV0aHlcbiAgICAgICAgLy8gYW5kIGRvZXNuJ3QgY29tcGxldGUgc29ja2V0IHN1YmplY3QgaWYgaXQncyBmYWxzeVxuICAgICAgICB0aGlzLmRpc2Nvbm5lY3QoKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIG9wZW5PYnNlcnZlcjoge1xuICAgICAgbmV4dDogKCkgPT4gdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgV2ViU29ja2V0Q29ubmVjdGVkKCkpXG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgdHlwZUtleSA9IHRoaXMub3B0aW9ucy50eXBlS2V5ITtcblxuICBwcml2YXRlIHN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHN0b3JlOiBTdG9yZSxcbiAgICBwcml2YXRlIGFjdGlvbnMkOiBBY3Rpb25zLFxuICAgIEBJbmplY3QoTkdYU19XRUJTT0NLRVRfT1BUSU9OUykgcHJpdmF0ZSBvcHRpb25zOiBOZ3hzV2Vic29ja2V0UGx1Z2luT3B0aW9uc1xuICApIHtcbiAgICB0aGlzLnNldHVwQWN0aW9uc0xpc3RlbmVycygpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5jbG9zZUNvbm5lY3Rpb24oKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cEFjdGlvbnNMaXN0ZW5lcnMoKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb24uYWRkKFxuICAgICAgdGhpcy5hY3Rpb25zJC5waXBlKG9mQWN0aW9uRGlzcGF0Y2hlZChDb25uZWN0V2ViU29ja2V0KSkuc3Vic2NyaWJlKCh7IHBheWxvYWQgfSkgPT4ge1xuICAgICAgICB0aGlzLmNvbm5lY3QocGF5bG9hZCk7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbi5hZGQoXG4gICAgICB0aGlzLmFjdGlvbnMkLnBpcGUob2ZBY3Rpb25EaXNwYXRjaGVkKERpc2Nvbm5lY3RXZWJTb2NrZXQpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLmRpc2Nvbm5lY3QoKTtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9uLmFkZChcbiAgICAgIHRoaXMuYWN0aW9ucyQucGlwZShvZkFjdGlvbkRpc3BhdGNoZWQoU2VuZFdlYlNvY2tldE1lc3NhZ2UpKS5zdWJzY3JpYmUoKHsgcGF5bG9hZCB9KSA9PiB7XG4gICAgICAgIHRoaXMuc2VuZChwYXlsb2FkKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgY29ubmVjdChvcHRpb25zPzogTmd4c1dlYnNvY2tldFBsdWdpbk9wdGlvbnMpOiB2b2lkIHtcbiAgICB0aGlzLnVwZGF0ZUNvbm5lY3Rpb24oKTtcblxuICAgIC8vIFVzZXJzIGNhbiBwYXNzIHRoZSBvcHRpb25zIGluIHRoZSBjb25uZWN0IG1ldGhvZCBzb1xuICAgIC8vIGlmIG9wdGlvbnMgYXJlbid0IGF2YWlsYWJsZSBhdCBESSBib290c3RyYXAgdGhleSBoYXZlIGFjY2Vzc1xuICAgIC8vIHRvIHBhc3MgdGhlbSBoZXJlXG4gICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgIHRoaXMubWVyZ2VDb25maWdXaXRoT3B0aW9ucyhvcHRpb25zKTtcbiAgICB9XG5cbiAgICB0aGlzLnNvY2tldCA9IG5ldyBXZWJTb2NrZXRTdWJqZWN0KHRoaXMuY29uZmlnKTtcblxuICAgIHRoaXMuc29ja2V0LnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAobWVzc2FnZTogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IHR5cGUgPSBnZXRWYWx1ZShtZXNzYWdlLCB0aGlzLnR5cGVLZXkpO1xuICAgICAgICBpZiAoIXR5cGUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUtleVByb3BlcnR5TWlzc2luZ0Vycm9yKHRoaXMudHlwZUtleSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaCh7IC4uLm1lc3NhZ2UsIHR5cGUgfSk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6IChlcnJvcjogYW55KSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIENsb3NlRXZlbnQpIHtcbiAgICAgICAgICB0aGlzLmRpc3BhdGNoV2ViU29ja2V0RGlzY29ubmVjdGVkKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgV2Vic29ja2V0TWVzc2FnZUVycm9yKGVycm9yKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZGlzY29ubmVjdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zb2NrZXQpIHtcbiAgICAgIHRoaXMuY2xvc2VDb25uZWN0aW9uKCk7XG4gICAgICB0aGlzLmRpc3BhdGNoV2ViU29ja2V0RGlzY29ubmVjdGVkKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZW5kKGRhdGE6IGFueSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zb2NrZXQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignWW91IG11c3QgY29ubmVjdCB0byB0aGUgc29ja2V0IGJlZm9yZSBzZW5kaW5nIGFueSBkYXRhJyk7XG4gICAgfVxuXG4gICAgdGhpcy5zb2NrZXQubmV4dChkYXRhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEb24ndCBlbmxhcmdlIHRoZSBgY29ubmVjdGAgbWV0aG9kXG4gICAqL1xuICBwcml2YXRlIG1lcmdlQ29uZmlnV2l0aE9wdGlvbnMob3B0aW9uczogTmd4c1dlYnNvY2tldFBsdWdpbk9wdGlvbnMpOiB2b2lkIHtcbiAgICBpZiAob3B0aW9ucy51cmwpIHtcbiAgICAgIHRoaXMuY29uZmlnLnVybCA9IG9wdGlvbnMudXJsO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnNlcmlhbGl6ZXIpIHtcbiAgICAgIHRoaXMuY29uZmlnLnNlcmlhbGl6ZXIgPSBvcHRpb25zLnNlcmlhbGl6ZXI7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuZGVzZXJpYWxpemVyKSB7XG4gICAgICB0aGlzLmNvbmZpZy5kZXNlcmlhbGl6ZXIgPSBvcHRpb25zLmRlc2VyaWFsaXplcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVG8gZW5zdXJlIHdlIGRvbid0IGhhdmUgYW55IG1lbW9yeSBsZWFrc1xuICAgKiBlLmcuIGlmIHRoZSB1c2VyIG9jY2FzaW9uYWxseSBkaXNwYXRjaGVkIGBDb25uZWN0V2ViU29ja2V0YCB0d2ljZVxuICAgKiB0aGVuIHRoZSBwcmV2aW91cyBzdWJzY3JpcHRpb24gd2lsbCBzdGlsbCBsaXZlIGluIHRoZSBtZW1vcnlcbiAgICogdG8gcHJldmVudCBzdWNoIGJlaGF2aW9yIC0gd2UgY2xvc2UgdGhlIHByZXZpb3VzIGNvbm5lY3Rpb24gaWYgaXQgZXhpc3RzXG4gICAqL1xuICBwcml2YXRlIHVwZGF0ZUNvbm5lY3Rpb24oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc29ja2V0KSB7XG4gICAgICB0aGlzLmNsb3NlQ29ubmVjdGlvbigpO1xuICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgV2ViU29ja2V0Q29ubmVjdGlvblVwZGF0ZWQoKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVzZWQgaW4gbWFueSBwbGFjZXMgc28gaXQncyBiZXR0ZXIgdG8gbW92ZSB0aGUgY29kZSBpbnRvIGZ1bmN0aW9uXG4gICAqL1xuICBwcml2YXRlIGRpc3BhdGNoV2ViU29ja2V0RGlzY29ubmVjdGVkKCk6IHZvaWQge1xuICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFdlYlNvY2tldERpc2Nvbm5lY3RlZCgpKTtcbiAgfVxuXG4gIHByaXZhdGUgY2xvc2VDb25uZWN0aW9uKCk6IHZvaWQge1xuICAgIC8vIGBzb2NrZXQuY29tcGxldGUoKWAgY2xvc2VzIHRoZSBjb25uZWN0aW9uXG4gICAgLy8gYWxzbyBpdCBkb2Vzbid0IGludm9rZSB0aGUgYG9uQ29tcGxldGVgIGNhbGxiYWNrIHRoYXQgd2UgcGFzc2VkXG4gICAgLy8gaW50byBgc29ja2V0LnN1YnNjcmliZSguLi4pYFxuICAgIGlmICh0aGlzLnNvY2tldCAhPT0gbnVsbCkge1xuICAgICAgdGhpcy5zb2NrZXQuY29tcGxldGUoKTtcbiAgICAgIHRoaXMuc29ja2V0ID0gbnVsbDtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
148
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LWhhbmRsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy93ZWJzb2NrZXQtcGx1Z2luL3NyYy93ZWJzb2NrZXQtaGFuZGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBYSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdEUsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLGtCQUFrQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzNFLE9BQU8sRUFBRSxhQUFhLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN6RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFM0MsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixtQkFBbUIsRUFDbkIsb0JBQW9CLEVBQ3BCLHNCQUFzQixFQUV0QixxQkFBcUIsRUFDckIscUJBQXFCLEVBQ3JCLDJCQUEyQixFQUMzQiwwQkFBMEIsRUFDMUIsa0JBQWtCLEVBQ25CLE1BQU0sV0FBVyxDQUFDOzs7QUFHbkIsTUFBTSxPQUFPLGdCQUFnQjtJQVMzQixZQUNVLE1BQWEsRUFDYixPQUFlLEVBQ2YsU0FBa0IsRUFDYyxRQUFvQztRQUhwRSxXQUFNLEdBQU4sTUFBTSxDQUFPO1FBQ2IsWUFBTyxHQUFQLE9BQU8sQ0FBUTtRQUNmLGNBQVMsR0FBVCxTQUFTLENBQVM7UUFDYyxhQUFRLEdBQVIsUUFBUSxDQUE0QjtRQVp0RSxZQUFPLEdBQXFCLElBQUksQ0FBQztRQUV4QixtQkFBYyxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUFFckMsYUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBUSxDQUFDO1FBRWxDLGNBQVMsR0FBRyxJQUFJLGFBQWEsQ0FBTyxDQUFDLENBQUMsQ0FBQztRQVF0RCxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztJQUNoQyxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxXQUFXLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDaEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBRU8sc0JBQXNCO1FBQzVCLElBQUksQ0FBQyxTQUFTO2FBQ1gsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGdCQUFnQixDQUFDLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQzthQUNyRSxTQUFTLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUU7WUFDekIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN4QixDQUFDLENBQUMsQ0FBQztRQUVMLElBQUksQ0FBQyxTQUFTO2FBQ1gsSUFBSSxDQUFDLGtCQUFrQixDQUFDLG1CQUFtQixDQUFDLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQzthQUN4RSxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ2QsSUFBSSxDQUFDLFdBQVcsQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsRCxDQUFDLENBQUMsQ0FBQztRQUVMLElBQUksQ0FBQyxTQUFTO2FBQ1gsSUFBSSxDQUFDLGtCQUFrQixDQUFDLG9CQUFvQixDQUFDLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQzthQUN6RSxTQUFTLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUU7WUFDekIsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNyQixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTyxPQUFPLENBQUMsT0FBb0M7UUFDbEQsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ2hCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNyRCxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLDBCQUEwQixFQUFFLENBQUMsQ0FBQztTQUN4RDtRQUVELG1JQUFtSTtRQUNuSSxJQUFJLE9BQU8sRUFBRTtZQUNYLElBQUksT0FBTyxDQUFDLFVBQVUsRUFBRTtnQkFDdEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQzthQUMvQztZQUVELElBQUksT0FBTyxDQUFDLFlBQVksRUFBRTtnQkFDeEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQzthQUNuRDtTQUNGO1FBRUQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUU7WUFDbEMsa0VBQWtFO1lBQ2xFLHdDQUF3QztZQUN4QyxNQUFNLEdBQUcsR0FBRyxPQUFPLEVBQUUsR0FBRyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBSSxDQUFDO1lBQy9DLE1BQU0sUUFBUSxHQUFHLE9BQU8sRUFBRSxRQUFRLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUM7WUFDN0QsTUFBTSxVQUFVLEdBQUcsT0FBTyxFQUFFLFVBQVUsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQztZQUVuRSxNQUFNLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsUUFBUTtnQkFDckMsQ0FBQyxDQUFDLElBQUksU0FBUyxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUM7Z0JBQzlCLENBQUMsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBRXhCLElBQUksVUFBVSxFQUFFO2dCQUNkLE1BQU0sQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO2FBQ2hDO1lBRUQsU0FBUyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUM7aUJBQ3RCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO2lCQUNwQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxrQkFBa0IsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUVuRSxTQUFTLENBQWUsTUFBTSxFQUFFLFNBQVMsQ0FBQztpQkFDdkMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7aUJBQ3BDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDakIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ25ELE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUM5QyxJQUFJLENBQUMsSUFBSSxFQUFFO29CQUNULE1BQU0sSUFBSSwyQkFBMkIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7aUJBQ3REO2dCQUNELElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsR0FBRyxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUM3QyxDQUFDLENBQUMsQ0FBQztZQUVMLFNBQVMsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDO2lCQUN2QixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztpQkFDcEMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUNqQixrRUFBa0U7Z0JBQ2xFLG9FQUFvRTtnQkFDcEUsa0RBQWtEO2dCQUNsRCx3RUFBd0U7Z0JBQ3hFLDJFQUEyRTtnQkFDM0UsNEJBQTRCO2dCQUM1QixJQUFJLENBQUMsV0FBVyxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNoRCxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDekQsQ0FBQyxDQUFDLENBQUM7WUFFTCxTQUFTLENBQWEsTUFBTSxFQUFFLE9BQU8sQ0FBQztpQkFDbkMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7aUJBQ3BDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDakIsSUFBSSxLQUFLLENBQUMsUUFBUSxFQUFFO29CQUNsQix1RUFBdUU7b0JBQ3ZFLHVFQUF1RTtvQkFDdkUsdUVBQXVFO29CQUN2RSwwQkFBMEI7b0JBQzFCLElBQUksQ0FBQyxXQUFXLENBQUMsd0JBQXdCLENBQUMsS0FBSyxDQUFDLENBQUM7aUJBQ2xEO3FCQUFNO29CQUNMLG1FQUFtRTtvQkFDbkUsb0VBQW9FO29CQUNwRSw4Q0FBOEM7b0JBQzlDLHVFQUF1RTtvQkFDdkUsK0NBQStDO29CQUMvQyxJQUFJLENBQUMsV0FBVyxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNoRCxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7aUJBQ3hEO1lBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxXQUFXLENBQUMsa0JBQTJCO1FBQzdDLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNoQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsa0JBQWtCLENBQUMsQ0FBQztZQUMxQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLHFCQUFxQixFQUFFLENBQUMsQ0FBQztTQUNuRDtJQUNILENBQUM7SUFFTyxJQUFJLENBQUMsSUFBUztRQUNwQixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLHdEQUF3RCxDQUFDLENBQUM7U0FDM0U7UUFFRCxJQUFJO1lBQ0YsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztTQUNwRDtRQUFDLE9BQU8sS0FBSyxFQUFFO1lBQ2QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1NBQ3hEO0lBQ0gsQ0FBQztJQUVPLGdCQUFnQixDQUFDLGtCQUEyQjtRQUNsRCxJQUFJLGtCQUFrQixFQUFFO1lBQ3RCLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUM7U0FDdkI7UUFDRCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztRQUNwQixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzdCLENBQUM7O2dJQXRKVSxnQkFBZ0Isb0ZBYWpCLHNCQUFzQjtvSUFickIsZ0JBQWdCLGNBREgsTUFBTTsyRkFDbkIsZ0JBQWdCO2tCQUQ1QixVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRTs7MEJBYzdCLE1BQU07MkJBQUMsc0JBQXNCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0LCBPbkRlc3Ryb3ksIE5nWm9uZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWN0aW9ucywgU3RvcmUsIGdldFZhbHVlLCBvZkFjdGlvbkRpc3BhdGNoZWQgfSBmcm9tICdAbmd4cy9zdG9yZSc7XG5pbXBvcnQgeyBSZXBsYXlTdWJqZWN0LCBTdWJqZWN0LCBmcm9tRXZlbnQgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHtcbiAgQ29ubmVjdFdlYlNvY2tldCxcbiAgRGlzY29ubmVjdFdlYlNvY2tldCxcbiAgU2VuZFdlYlNvY2tldE1lc3NhZ2UsXG4gIE5HWFNfV0VCU09DS0VUX09QVElPTlMsXG4gIE5neHNXZWJzb2NrZXRQbHVnaW5PcHRpb25zLFxuICBXZWJzb2NrZXRNZXNzYWdlRXJyb3IsXG4gIFdlYlNvY2tldERpc2Nvbm5lY3RlZCxcbiAgVHlwZUtleVByb3BlcnR5TWlzc2luZ0Vycm9yLFxuICBXZWJTb2NrZXRDb25uZWN0aW9uVXBkYXRlZCxcbiAgV2ViU29ja2V0Q29ubmVjdGVkXG59IGZyb20gJy4vc3ltYm9scyc7XG5cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgV2ViU29ja2V0SGFuZGxlciBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgX3NvY2tldDogV2ViU29ja2V0IHwgbnVsbCA9IG51bGw7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfc29ja2V0Q2xvc2VkJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfdHlwZUtleSA9IHRoaXMuX29wdGlvbnMudHlwZUtleSE7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfZGVzdHJveSQgPSBuZXcgUmVwbGF5U3ViamVjdDx2b2lkPigxKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9zdG9yZTogU3RvcmUsXG4gICAgcHJpdmF0ZSBfbmdab25lOiBOZ1pvbmUsXG4gICAgcHJpdmF0ZSBfYWN0aW9ucyQ6IEFjdGlvbnMsXG4gICAgQEluamVjdChOR1hTX1dFQlNPQ0tFVF9PUFRJT05TKSBwcml2YXRlIF9vcHRpb25zOiBOZ3hzV2Vic29ja2V0UGx1Z2luT3B0aW9uc1xuICApIHtcbiAgICB0aGlzLl9zZXR1cEFjdGlvbnNMaXN0ZW5lcnMoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuX2Rpc2Nvbm5lY3QoLyogZm9yY2VseUNsb3NlU29ja2V0ICovIHRydWUpO1xuICAgIHRoaXMuX2Rlc3Ryb3kkLm5leHQoKTtcbiAgfVxuXG4gIHByaXZhdGUgX3NldHVwQWN0aW9uc0xpc3RlbmVycygpOiB2b2lkIHtcbiAgICB0aGlzLl9hY3Rpb25zJFxuICAgICAgLnBpcGUob2ZBY3Rpb25EaXNwYXRjaGVkKENvbm5lY3RXZWJTb2NrZXQpLCB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpKVxuICAgICAgLnN1YnNjcmliZSgoeyBwYXlsb2FkIH0pID0+IHtcbiAgICAgICAgdGhpcy5jb25uZWN0KHBheWxvYWQpO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLl9hY3Rpb25zJFxuICAgICAgLnBpcGUob2ZBY3Rpb25EaXNwYXRjaGVkKERpc2Nvbm5lY3RXZWJTb2NrZXQpLCB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuX2Rpc2Nvbm5lY3QoLyogZm9yY2VseUNsb3NlU29ja2V0ICovIHRydWUpO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLl9hY3Rpb25zJFxuICAgICAgLnBpcGUob2ZBY3Rpb25EaXNwYXRjaGVkKFNlbmRXZWJTb2NrZXRNZXNzYWdlKSwgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSlcbiAgICAgIC5zdWJzY3JpYmUoKHsgcGF5bG9hZCB9KSA9PiB7XG4gICAgICAgIHRoaXMuc2VuZChwYXlsb2FkKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjb25uZWN0KG9wdGlvbnM/OiBOZ3hzV2Vic29ja2V0UGx1Z2luT3B0aW9ucyk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9zb2NrZXQpIHtcbiAgICAgIHRoaXMuX2Nsb3NlQ29ubmVjdGlvbigvKiBmb3JjZWx5Q2xvc2VTb2NrZXQgKi8gdHJ1ZSk7XG4gICAgICB0aGlzLl9zdG9yZS5kaXNwYXRjaChuZXcgV2ViU29ja2V0Q29ubmVjdGlvblVwZGF0ZWQoKSk7XG4gICAgfVxuXG4gICAgLy8gVE9ETyhhcnR1cm92dCk6IHdlIHNob3VsZCBub3Qgb3ZlcnJpZGUgZGVmYXVsdCBjb25maWcgdmFsdWVzIGJlY2F1c2UgdGhpcyBicmVha3Mgc3VwcG9ydCBmb3IgaGF2aW5nIG11bHRpcGxlIHNvY2tldCBjb25uZWN0aW9ucy5cbiAgICBpZiAob3B0aW9ucykge1xuICAgICAgaWYgKG9wdGlvbnMuc2VyaWFsaXplcikge1xuICAgICAgICB0aGlzLl9vcHRpb25zLnNlcmlhbGl6ZXIgPSBvcHRpb25zLnNlcmlhbGl6ZXI7XG4gICAgICB9XG5cbiAgICAgIGlmIChvcHRpb25zLmRlc2VyaWFsaXplcikge1xuICAgICAgICB0aGlzLl9vcHRpb25zLmRlc2VyaWFsaXplciA9IG9wdGlvbnMuZGVzZXJpYWxpemVyO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAvLyBXZSBlaXRoZXIgdXNlIG9wdGlvbnMgcHJvdmlkZWQgaW4gdGhlIGBDb25uZWN0V2ViU29ja2V0YCBhY3Rpb25cbiAgICAgIC8vIG9yIGZhbGxiYWNrIHRvIGRlZmF1bHQgY29uZmlnIHZhbHVlcy5cbiAgICAgIGNvbnN0IHVybCA9IG9wdGlvbnM/LnVybCB8fCB0aGlzLl9vcHRpb25zLnVybCE7XG4gICAgICBjb25zdCBwcm90b2NvbCA9IG9wdGlvbnM/LnByb3RvY29sIHx8IHRoaXMuX29wdGlvbnMucHJvdG9jb2w7XG4gICAgICBjb25zdCBiaW5hcnlUeXBlID0gb3B0aW9ucz8uYmluYXJ5VHlwZSB8fCB0aGlzLl9vcHRpb25zLmJpbmFyeVR5cGU7XG5cbiAgICAgIGNvbnN0IHNvY2tldCA9ICh0aGlzLl9zb2NrZXQgPSBwcm90b2NvbFxuICAgICAgICA/IG5ldyBXZWJTb2NrZXQodXJsLCBwcm90b2NvbClcbiAgICAgICAgOiBuZXcgV2ViU29ja2V0KHVybCkpO1xuXG4gICAgICBpZiAoYmluYXJ5VHlwZSkge1xuICAgICAgICBzb2NrZXQuYmluYXJ5VHlwZSA9IGJpbmFyeVR5cGU7XG4gICAgICB9XG5cbiAgICAgIGZyb21FdmVudChzb2NrZXQsICdvcGVuJylcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuX3NvY2tldENsb3NlZCQpKVxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMuX3N0b3JlLmRpc3BhdGNoKG5ldyBXZWJTb2NrZXRDb25uZWN0ZWQoKSkpO1xuXG4gICAgICBmcm9tRXZlbnQ8TWVzc2FnZUV2ZW50Pihzb2NrZXQsICdtZXNzYWdlJylcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuX3NvY2tldENsb3NlZCQpKVxuICAgICAgICAuc3Vic2NyaWJlKGV2ZW50ID0+IHtcbiAgICAgICAgICBjb25zdCBtZXNzYWdlID0gdGhpcy5fb3B0aW9ucy5kZXNlcmlhbGl6ZXIhKGV2ZW50KTtcbiAgICAgICAgICBjb25zdCB0eXBlID0gZ2V0VmFsdWUobWVzc2FnZSwgdGhpcy5fdHlwZUtleSk7XG4gICAgICAgICAgaWYgKCF0eXBlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUtleVByb3BlcnR5TWlzc2luZ0Vycm9yKHRoaXMuX3R5cGVLZXkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLl9zdG9yZS5kaXNwYXRjaCh7IC4uLm1lc3NhZ2UsIHR5cGUgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICBmcm9tRXZlbnQoc29ja2V0LCAnZXJyb3InKVxuICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5fc29ja2V0Q2xvc2VkJCkpXG4gICAgICAgIC5zdWJzY3JpYmUoZXJyb3IgPT4ge1xuICAgICAgICAgIC8vIFRoZSBlcnJvciBldmVudCBpbmRpY2F0ZXMgdGhhdCBhbiBlcnJvciBoYXMgb2NjdXJyZWQgZHVyaW5nIHRoZVxuICAgICAgICAgIC8vIFdlYlNvY2tldCBjb21tdW5pY2F0aW9uLCBhbmQgaXQgaXMgb2Z0ZW4gYXBwcm9wcmlhdGUgdG8gY2xvc2UgdGhlXG4gICAgICAgICAgLy8gV2ViU29ja2V0IGNvbm5lY3Rpb24gd2hlbiBzdWNoIGFuIGVycm9yIG9jY3Vycy5cbiAgICAgICAgICAvLyBXZSBuZWVkIHRvIGNhbGwgYF9kaXNjb25uZWN0KClgIGFmdGVyIHRoZSBlcnJvciBldmVudCBoYXMgYmVlbiBmaXJlZC5cbiAgICAgICAgICAvLyBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb24gaXMgcHJvcGVybHkgY2xvc2VkIHRvIHByZXZlbnRcbiAgICAgICAgICAvLyBwb3RlbnRpYWwgcmVzb3VyY2UgbGVha3MuXG4gICAgICAgICAgdGhpcy5fZGlzY29ubmVjdCgvKiBmb3JjZWx5Q2xvc2VTb2NrZXQgKi8gdHJ1ZSk7XG4gICAgICAgICAgdGhpcy5fc3RvcmUuZGlzcGF0Y2gobmV3IFdlYnNvY2tldE1lc3NhZ2VFcnJvcihlcnJvcikpO1xuICAgICAgICB9KTtcblxuICAgICAgZnJvbUV2ZW50PENsb3NlRXZlbnQ+KHNvY2tldCwgJ2Nsb3NlJylcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuX3NvY2tldENsb3NlZCQpKVxuICAgICAgICAuc3Vic2NyaWJlKGV2ZW50ID0+IHtcbiAgICAgICAgICBpZiAoZXZlbnQud2FzQ2xlYW4pIHtcbiAgICAgICAgICAgIC8vIEl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gY2FsbCBgc29ja2V0LmNsb3NlKClgIGFmdGVyIHRoZSBgY2xvc2VgIGV2ZW50XG4gICAgICAgICAgICAvLyBoYXMgYmVlbiBmaXJlZC4gSW4gZmFjdCwgY2FsbGluZyBgc29ja2V0LmNsb3NlKClgIHdpdGhpbiB0aGUgYGNsb3NlYFxuICAgICAgICAgICAgLy8gZXZlbnQgaGFuZGxlciBvciBpbW1lZGlhdGVseSBhZnRlciB0aGUgZXZlbnQgaGFzIGJlZW4gZmlyZWQgY2FuIGxlYWRcbiAgICAgICAgICAgIC8vIHRvIHVuZXhwZWN0ZWQgYmVoYXZpb3IuXG4gICAgICAgICAgICB0aGlzLl9kaXNjb25uZWN0KC8qIGZvcmNlbHlDbG9zZVNvY2tldCAqLyBmYWxzZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIElmIHRoZSBXZWJTb2NrZXQgYGNsb3NlYCBldmVudCBoYXMgYmVlbiBmaXJlZCBhbmQgaXRzIGB3YXNDbGVhbmBcbiAgICAgICAgICAgIC8vIHByb3BlcnR5IGlzIGZhbHN5LCBpdCBpbmRpY2F0ZXMgdGhhdCB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb24gd2FzXG4gICAgICAgICAgICAvLyBjbG9zZWQgaW4gYW4gdW5leHBlY3RlZCBvciBhYm5vcm1hbCBtYW5uZXIuXG4gICAgICAgICAgICAvLyBXZSBzaG91bGQgY2FsbCBgc29ja2V0LmNsb3NlKClgIGluIHRoaXMgc2NlbmFyaW8sIHdlIGNhbiBlbnN1cmUgdGhhdFxuICAgICAgICAgICAgLy8gdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uIGlzIHByb3Blcmx5IGNsb3NlZC5cbiAgICAgICAgICAgIHRoaXMuX2Rpc2Nvbm5lY3QoLyogZm9yY2VseUNsb3NlU29ja2V0ICovIHRydWUpO1xuICAgICAgICAgICAgdGhpcy5fc3RvcmUuZGlzcGF0Y2gobmV3IFdlYnNvY2tldE1lc3NhZ2VFcnJvcihldmVudCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9kaXNjb25uZWN0KGZvcmNlbHlDbG9zZVNvY2tldDogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICh0aGlzLl9zb2NrZXQpIHtcbiAgICAgIHRoaXMuX2Nsb3NlQ29ubmVjdGlvbihmb3JjZWx5Q2xvc2VTb2NrZXQpO1xuICAgICAgdGhpcy5fc3RvcmUuZGlzcGF0Y2gobmV3IFdlYlNvY2tldERpc2Nvbm5lY3RlZCgpKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNlbmQoZGF0YTogYW55KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9zb2NrZXQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignWW91IG11c3QgY29ubmVjdCB0byB0aGUgc29ja2V0IGJlZm9yZSBzZW5kaW5nIGFueSBkYXRhJyk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuX3NvY2tldC5zZW5kKHRoaXMuX29wdGlvbnMuc2VyaWFsaXplciEoZGF0YSkpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLl9zdG9yZS5kaXNwYXRjaChuZXcgV2Vic29ja2V0TWVzc2FnZUVycm9yKGVycm9yKSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfY2xvc2VDb25uZWN0aW9uKGZvcmNlbHlDbG9zZVNvY2tldDogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmIChmb3JjZWx5Q2xvc2VTb2NrZXQpIHtcbiAgICAgIHRoaXMuX3NvY2tldD8uY2xvc2UoKTtcbiAgICB9XG4gICAgdGhpcy5fc29ja2V0ID0gbnVsbDtcbiAgICB0aGlzLl9zb2NrZXRDbG9zZWQkLm5leHQoKTtcbiAgfVxufVxuIl19
@@ -1,44 +1,11 @@
1
- import { NgModule, APP_INITIALIZER, InjectionToken, makeEnvironmentProviders } from '@angular/core';
2
- import { WebSocketHandler } from './websocket-handler';
3
- import { NGXS_WEBSOCKET_OPTIONS, noop } from './symbols';
1
+ import { NgModule, makeEnvironmentProviders } from '@angular/core';
2
+ import { ɵgetProviders } from './providers';
4
3
  import * as i0 from "@angular/core";
5
- export function websocketOptionsFactory(options) {
6
- return {
7
- reconnectInterval: 5000,
8
- reconnectAttempts: 10,
9
- typeKey: 'type',
10
- deserializer(e) {
11
- return JSON.parse(e.data);
12
- },
13
- serializer(value) {
14
- return JSON.stringify(value);
15
- },
16
- ...options
17
- };
18
- }
19
- export const USER_OPTIONS = new InjectionToken('USER_OPTIONS');
20
4
  export class NgxsWebsocketPluginModule {
21
5
  static forRoot(options) {
22
6
  return {
23
7
  ngModule: NgxsWebsocketPluginModule,
24
- providers: [
25
- WebSocketHandler,
26
- {
27
- provide: USER_OPTIONS,
28
- useValue: options
29
- },
30
- {
31
- provide: NGXS_WEBSOCKET_OPTIONS,
32
- useFactory: websocketOptionsFactory,
33
- deps: [USER_OPTIONS]
34
- },
35
- {
36
- provide: APP_INITIALIZER,
37
- useFactory: noop,
38
- deps: [WebSocketHandler],
39
- multi: true
40
- }
41
- ]
8
+ providers: ɵgetProviders(options)
42
9
  };
43
10
  }
44
11
  }
@@ -49,19 +16,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.4", ngImpor
49
16
  type: NgModule
50
17
  }] });
51
18
  export function withNgxsWebSocketPlugin(options) {
52
- return makeEnvironmentProviders([
53
- { provide: USER_OPTIONS, useValue: options },
54
- {
55
- provide: NGXS_WEBSOCKET_OPTIONS,
56
- useFactory: websocketOptionsFactory,
57
- deps: [USER_OPTIONS]
58
- },
59
- {
60
- provide: APP_INITIALIZER,
61
- useFactory: noop,
62
- deps: [WebSocketHandler],
63
- multi: true
64
- }
65
- ]);
19
+ return makeEnvironmentProviders(ɵgetProviders(options));
66
20
  }
67
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0Lm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL3dlYnNvY2tldC1wbHVnaW4vc3JjL3dlYnNvY2tldC5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFFBQVEsRUFFUixlQUFlLEVBQ2YsY0FBYyxFQUVkLHdCQUF3QixFQUN6QixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RCxPQUFPLEVBQThCLHNCQUFzQixFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQzs7QUFFckYsTUFBTSxVQUFVLHVCQUF1QixDQUFDLE9BQW1DO0lBQ3pFLE9BQU87UUFDTCxpQkFBaUIsRUFBRSxJQUFJO1FBQ3ZCLGlCQUFpQixFQUFFLEVBQUU7UUFDckIsT0FBTyxFQUFFLE1BQU07UUFDZixZQUFZLENBQUMsQ0FBZTtZQUMxQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVCLENBQUM7UUFDRCxVQUFVLENBQUMsS0FBVTtZQUNuQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0IsQ0FBQztRQUNELEdBQUcsT0FBTztLQUNYLENBQUM7QUFDSixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLElBQUksY0FBYyxDQUFDLGNBQWMsQ0FBQyxDQUFDO0FBRy9ELE1BQU0sT0FBTyx5QkFBeUI7SUFDcEMsTUFBTSxDQUFDLE9BQU8sQ0FDWixPQUFvQztRQUVwQyxPQUFPO1lBQ0wsUUFBUSxFQUFFLHlCQUF5QjtZQUNuQyxTQUFTLEVBQUU7Z0JBQ1QsZ0JBQWdCO2dCQUNoQjtvQkFDRSxPQUFPLEVBQUUsWUFBWTtvQkFDckIsUUFBUSxFQUFFLE9BQU87aUJBQ2xCO2dCQUNEO29CQUNFLE9BQU8sRUFBRSxzQkFBc0I7b0JBQy9CLFVBQVUsRUFBRSx1QkFBdUI7b0JBQ25DLElBQUksRUFBRSxDQUFDLFlBQVksQ0FBQztpQkFDckI7Z0JBQ0Q7b0JBQ0UsT0FBTyxFQUFFLGVBQWU7b0JBQ3hCLFVBQVUsRUFBRSxJQUFJO29CQUNoQixJQUFJLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQztvQkFDeEIsS0FBSyxFQUFFLElBQUk7aUJBQ1o7YUFDRjtTQUNGLENBQUM7SUFDSixDQUFDOzt5SUF6QlUseUJBQXlCOzBJQUF6Qix5QkFBeUI7MElBQXpCLHlCQUF5QjsyRkFBekIseUJBQXlCO2tCQURyQyxRQUFROztBQTZCVCxNQUFNLFVBQVUsdUJBQXVCLENBQ3JDLE9BQW9DO0lBRXBDLE9BQU8sd0JBQXdCLENBQUM7UUFDOUIsRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUU7UUFDNUM7WUFDRSxPQUFPLEVBQUUsc0JBQXNCO1lBQy9CLFVBQVUsRUFBRSx1QkFBdUI7WUFDbkMsSUFBSSxFQUFFLENBQUMsWUFBWSxDQUFDO1NBQ3JCO1FBQ0Q7WUFDRSxPQUFPLEVBQUUsZUFBZTtZQUN4QixVQUFVLEVBQUUsSUFBSTtZQUNoQixJQUFJLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQztZQUN4QixLQUFLLEVBQUUsSUFBSTtTQUNaO0tBQ0YsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIE5nTW9kdWxlLFxuICBNb2R1bGVXaXRoUHJvdmlkZXJzLFxuICBBUFBfSU5JVElBTElaRVIsXG4gIEluamVjdGlvblRva2VuLFxuICBFbnZpcm9ubWVudFByb3ZpZGVycyxcbiAgbWFrZUVudmlyb25tZW50UHJvdmlkZXJzXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBXZWJTb2NrZXRIYW5kbGVyIH0gZnJvbSAnLi93ZWJzb2NrZXQtaGFuZGxlcic7XG5pbXBvcnQgeyBOZ3hzV2Vic29ja2V0UGx1Z2luT3B0aW9ucywgTkdYU19XRUJTT0NLRVRfT1BUSU9OUywgbm9vcCB9IGZyb20gJy4vc3ltYm9scyc7XG5cbmV4cG9ydCBmdW5jdGlvbiB3ZWJzb2NrZXRPcHRpb25zRmFjdG9yeShvcHRpb25zOiBOZ3hzV2Vic29ja2V0UGx1Z2luT3B0aW9ucykge1xuICByZXR1cm4ge1xuICAgIHJlY29ubmVjdEludGVydmFsOiA1MDAwLFxuICAgIHJlY29ubmVjdEF0dGVtcHRzOiAxMCxcbiAgICB0eXBlS2V5OiAndHlwZScsXG4gICAgZGVzZXJpYWxpemVyKGU6IE1lc3NhZ2VFdmVudCkge1xuICAgICAgcmV0dXJuIEpTT04ucGFyc2UoZS5kYXRhKTtcbiAgICB9LFxuICAgIHNlcmlhbGl6ZXIodmFsdWU6IGFueSkge1xuICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgICB9LFxuICAgIC4uLm9wdGlvbnNcbiAgfTtcbn1cblxuZXhwb3J0IGNvbnN0IFVTRVJfT1BUSU9OUyA9IG5ldyBJbmplY3Rpb25Ub2tlbignVVNFUl9PUFRJT05TJyk7XG5cbkBOZ01vZHVsZSgpXG5leHBvcnQgY2xhc3MgTmd4c1dlYnNvY2tldFBsdWdpbk1vZHVsZSB7XG4gIHN0YXRpYyBmb3JSb290KFxuICAgIG9wdGlvbnM/OiBOZ3hzV2Vic29ja2V0UGx1Z2luT3B0aW9uc1xuICApOiBNb2R1bGVXaXRoUHJvdmlkZXJzPE5neHNXZWJzb2NrZXRQbHVnaW5Nb2R1bGU+IHtcbiAgICByZXR1cm4ge1xuICAgICAgbmdNb2R1bGU6IE5neHNXZWJzb2NrZXRQbHVnaW5Nb2R1bGUsXG4gICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgV2ViU29ja2V0SGFuZGxlcixcbiAgICAgICAge1xuICAgICAgICAgIHByb3ZpZGU6IFVTRVJfT1BUSU9OUyxcbiAgICAgICAgICB1c2VWYWx1ZTogb3B0aW9uc1xuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgcHJvdmlkZTogTkdYU19XRUJTT0NLRVRfT1BUSU9OUyxcbiAgICAgICAgICB1c2VGYWN0b3J5OiB3ZWJzb2NrZXRPcHRpb25zRmFjdG9yeSxcbiAgICAgICAgICBkZXBzOiBbVVNFUl9PUFRJT05TXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgcHJvdmlkZTogQVBQX0lOSVRJQUxJWkVSLFxuICAgICAgICAgIHVzZUZhY3Rvcnk6IG5vb3AsXG4gICAgICAgICAgZGVwczogW1dlYlNvY2tldEhhbmRsZXJdLFxuICAgICAgICAgIG11bHRpOiB0cnVlXG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3aXRoTmd4c1dlYlNvY2tldFBsdWdpbihcbiAgb3B0aW9ucz86IE5neHNXZWJzb2NrZXRQbHVnaW5PcHRpb25zXG4pOiBFbnZpcm9ubWVudFByb3ZpZGVycyB7XG4gIHJldHVybiBtYWtlRW52aXJvbm1lbnRQcm92aWRlcnMoW1xuICAgIHsgcHJvdmlkZTogVVNFUl9PUFRJT05TLCB1c2VWYWx1ZTogb3B0aW9ucyB9LFxuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HWFNfV0VCU09DS0VUX09QVElPTlMsXG4gICAgICB1c2VGYWN0b3J5OiB3ZWJzb2NrZXRPcHRpb25zRmFjdG9yeSxcbiAgICAgIGRlcHM6IFtVU0VSX09QVElPTlNdXG4gICAgfSxcbiAgICB7XG4gICAgICBwcm92aWRlOiBBUFBfSU5JVElBTElaRVIsXG4gICAgICB1c2VGYWN0b3J5OiBub29wLFxuICAgICAgZGVwczogW1dlYlNvY2tldEhhbmRsZXJdLFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9XG4gIF0pO1xufVxuIl19
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0Lm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL3dlYnNvY2tldC1wbHVnaW4vc3JjL3dlYnNvY2tldC5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFFBQVEsRUFHUix3QkFBd0IsRUFDekIsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGFBQWEsQ0FBQzs7QUFJNUMsTUFBTSxPQUFPLHlCQUF5QjtJQUNwQyxNQUFNLENBQUMsT0FBTyxDQUNaLE9BQW9DO1FBRXBDLE9BQU87WUFDTCxRQUFRLEVBQUUseUJBQXlCO1lBQ25DLFNBQVMsRUFBRSxhQUFhLENBQUMsT0FBTyxDQUFDO1NBQ2xDLENBQUM7SUFDSixDQUFDOzt5SUFSVSx5QkFBeUI7MElBQXpCLHlCQUF5QjswSUFBekIseUJBQXlCOzJGQUF6Qix5QkFBeUI7a0JBRHJDLFFBQVE7O0FBWVQsTUFBTSxVQUFVLHVCQUF1QixDQUNyQyxPQUFvQztJQUVwQyxPQUFPLHdCQUF3QixDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0FBQzFELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBOZ01vZHVsZSxcbiAgTW9kdWxlV2l0aFByb3ZpZGVycyxcbiAgRW52aXJvbm1lbnRQcm92aWRlcnMsXG4gIG1ha2VFbnZpcm9ubWVudFByb3ZpZGVyc1xufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgybVnZXRQcm92aWRlcnMgfSBmcm9tICcuL3Byb3ZpZGVycyc7XG5pbXBvcnQgeyBOZ3hzV2Vic29ja2V0UGx1Z2luT3B0aW9ucyB9IGZyb20gJy4vc3ltYm9scyc7XG5cbkBOZ01vZHVsZSgpXG5leHBvcnQgY2xhc3MgTmd4c1dlYnNvY2tldFBsdWdpbk1vZHVsZSB7XG4gIHN0YXRpYyBmb3JSb290KFxuICAgIG9wdGlvbnM/OiBOZ3hzV2Vic29ja2V0UGx1Z2luT3B0aW9uc1xuICApOiBNb2R1bGVXaXRoUHJvdmlkZXJzPE5neHNXZWJzb2NrZXRQbHVnaW5Nb2R1bGU+IHtcbiAgICByZXR1cm4ge1xuICAgICAgbmdNb2R1bGU6IE5neHNXZWJzb2NrZXRQbHVnaW5Nb2R1bGUsXG4gICAgICBwcm92aWRlcnM6IMm1Z2V0UHJvdmlkZXJzKG9wdGlvbnMpXG4gICAgfTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gd2l0aE5neHNXZWJTb2NrZXRQbHVnaW4oXG4gIG9wdGlvbnM/OiBOZ3hzV2Vic29ja2V0UGx1Z2luT3B0aW9uc1xuKTogRW52aXJvbm1lbnRQcm92aWRlcnMge1xuICByZXR1cm4gbWFrZUVudmlyb25tZW50UHJvdmlkZXJzKMm1Z2V0UHJvdmlkZXJzKG9wdGlvbnMpKTtcbn1cbiJdfQ==