@esfaenza/signalr-notifications 15.2.19 → 15.2.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/{esm2022 → esm2020}/lib/models/BaseMessageService.mjs +4 -4
- package/{esm2022 → esm2020}/lib/signalr-notifications.module.mjs +5 -5
- package/esm2020/lib/signalr-notifications.service.mjs +248 -0
- package/fesm2015/esfaenza-signalr-notifications.mjs +378 -0
- package/fesm2015/esfaenza-signalr-notifications.mjs.map +1 -0
- package/{fesm2022 → fesm2020}/esfaenza-signalr-notifications.mjs +11 -10
- package/fesm2020/esfaenza-signalr-notifications.mjs.map +1 -0
- package/package.json +11 -5
- package/esm2022/lib/signalr-notifications.service.mjs +0 -247
- package/fesm2022/esfaenza-signalr-notifications.mjs.map +0 -1
- /package/{esm2022 → esm2020}/esfaenza-signalr-notifications.mjs +0 -0
- /package/{esm2022 → esm2020}/lib/config/SignalrNotificationsModuleConfig.mjs +0 -0
- /package/{esm2022 → esm2020}/lib/models/EndpointDef.mjs +0 -0
- /package/{esm2022 → esm2020}/lib/models/JobProgressDto.mjs +0 -0
- /package/{esm2022 → esm2020}/lib/tokens.mjs +0 -0
- /package/{esm2022 → esm2020}/public-api.mjs +0 -0
|
@@ -26,10 +26,10 @@ export class BaseMessageService {
|
|
|
26
26
|
add(endpoint) {
|
|
27
27
|
this.definitions.push(endpoint);
|
|
28
28
|
}
|
|
29
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: BaseMessageService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
30
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: BaseMessageService }); }
|
|
31
29
|
}
|
|
32
|
-
i0.ɵɵ
|
|
30
|
+
BaseMessageService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: BaseMessageService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
31
|
+
BaseMessageService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: BaseMessageService });
|
|
32
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: BaseMessageService, decorators: [{
|
|
33
33
|
type: Injectable
|
|
34
34
|
}], ctorParameters: function () { return []; } });
|
|
35
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
35
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmFzZU1lc3NhZ2VTZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2lnbmFsci1ub3RpZmljYXRpb25zL3NyYy9saWIvbW9kZWxzL0Jhc2VNZXNzYWdlU2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxVQUFVO0FBQ1YsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxVQUFVO0FBQ1YsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7O0FBRWxEOztHQUVHO0FBRUgsTUFBTSxPQUFPLGtCQUFrQjtJQVkzQixvSUFBb0k7SUFDcEksSUFBVyxjQUFjLEtBQThCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7SUFFakY7UUFiUSxnQkFBVyxHQUE0QixFQUFFLENBQUM7UUFFM0MsK0JBQTBCLEdBQUcsV0FBVyxDQUFDLEVBQUUsQ0FBQywwQkFBMEIsRUFBRSxJQUFJLGNBQWMsRUFBRSxDQUFDLENBQUM7UUFDOUYsbUJBQWMsR0FBRyxXQUFXLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNuRCxrQkFBYSxHQUFHLFdBQVcsQ0FBQyxFQUFFLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2pELHdCQUFtQixHQUFHLFdBQVcsQ0FBQyxFQUFFLENBQUMsa0JBQWtCLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFHN0QsdUJBQWtCLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsQ0FBQztRQU1oRSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQzlCLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzdCLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDbkMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRU0sR0FBRyxDQUFDLFFBQStCO1FBQ3RDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7O2dIQXpCUSxrQkFBa0I7b0hBQWxCLGtCQUFrQjs0RkFBbEIsa0JBQWtCO2tCQUQ5QixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQW5ndWxhclxyXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG4vLyBNb2RlbGxpXHJcbmltcG9ydCB7IEVuZHBvaW50RGVmIH0gZnJvbSAnLi9FbmRwb2ludERlZic7XHJcbmltcG9ydCB7IEpvYlByb2dyZXNzRHRvIH0gZnJvbSAnLi9Kb2JQcm9ncmVzc0R0byc7XHJcblxyXG4vKipcclxuICogQ2xhc3NlIGJhc2UgZGEgZXN0ZW5kZXJlIGNvbiBsYSBkZWZpbml6aW9uZSBkZWdsaSBFbmRwb2ludCBzdXBwb3J0YXRpIGRhbGwnYXBwbGljYXppb25lXHJcbiAqL1xyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBCYXNlTWVzc2FnZVNlcnZpY2Uge1xyXG5cclxuICAgIHByaXZhdGUgZGVmaW5pdGlvbnM6IEVuZHBvaW50RGVmPGFueSwgYW55PltdID0gW107XHJcblxyXG4gICAgcHVibGljIElOX0pvYlByb2dyZXNzTm90aWZpY2F0aW9uID0gRW5kcG9pbnREZWYuSW4oXCJTZW5kUHJvZ3Jlc3NOb3RpZmljYXRpb25cIiwgbmV3IEpvYlByb2dyZXNzRHRvKCkpO1xyXG4gICAgcHVibGljIElOX1NlbmRWZXJzaW9uID0gRW5kcG9pbnREZWYuSW4oXCJTZW5kVmVyc2lvblwiLCBcIlwiKTtcclxuICAgIHB1YmxpYyBJTl9DbGVhckNhY2hlID0gRW5kcG9pbnREZWYuSW4oXCJDbGVhckNhY2hlXCIsIFwiXCIpO1xyXG4gICAgcHVibGljIElOX0NsZWFyUHJlZmVyZWNuZXMgPSBFbmRwb2ludERlZi5JbihcIkNsZWFyUHJlZmVyZWNuZXNcIiwgXCJcIik7XHJcblxyXG5cclxuICAgIHB1YmxpYyBPVVRfUXVlcnlKb2JTdGF0dXMgPSBFbmRwb2ludERlZi5PdXQoXCJRdWVyeUpvYlN0YXR1c1wiLCBudWxsKTtcclxuXHJcbiAgICAvKiogRW50cnlwb2ludCBjaGUgcmVzdGl0dWlzY2UgdHV0dGkgZ2xpIEVuZHBvaW50IGRlbGwnYXBwbGljYXppb25lLiBEYSBvdmVycmlkYXJlIHF1YWxvcmEgbm9uIHZlbmdhIHV0aWxpenphdG8gaWwgbWV0b2RvICoqYWRkKiogKi9cclxuICAgIHB1YmxpYyBnZXQgQWxsRGVmaW5pdGlvbnMoKTogRW5kcG9pbnREZWY8YW55LCBhbnk+W10geyByZXR1cm4gdGhpcy5kZWZpbml0aW9uczsgfVxyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHRoaXMuYWRkKHRoaXMuSU5fSm9iUHJvZ3Jlc3NOb3RpZmljYXRpb24pO1xyXG4gICAgICAgIHRoaXMuYWRkKHRoaXMuSU5fU2VuZFZlcnNpb24pO1xyXG4gICAgICAgIHRoaXMuYWRkKHRoaXMuSU5fQ2xlYXJDYWNoZSk7XHJcbiAgICAgICAgdGhpcy5hZGQodGhpcy5JTl9DbGVhclByZWZlcmVjbmVzKTtcclxuICAgICAgICB0aGlzLmFkZCh0aGlzLk9VVF9RdWVyeUpvYlN0YXR1cyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFkZChlbmRwb2ludDogRW5kcG9pbnREZWY8YW55LCBhbnk+KSB7XHJcbiAgICAgICAgdGhpcy5kZWZpbml0aW9ucy5wdXNoKGVuZHBvaW50KTtcclxuICAgIH1cclxufSJdfQ==
|
|
@@ -19,11 +19,11 @@ export class SignalrNotificationsModule {
|
|
|
19
19
|
]
|
|
20
20
|
};
|
|
21
21
|
}
|
|
22
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SignalrNotificationsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
23
|
-
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.2.12", ngImport: i0, type: SignalrNotificationsModule }); }
|
|
24
|
-
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SignalrNotificationsModule }); }
|
|
25
22
|
}
|
|
26
|
-
i0.ɵɵ
|
|
23
|
+
SignalrNotificationsModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: SignalrNotificationsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
24
|
+
SignalrNotificationsModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.10", ngImport: i0, type: SignalrNotificationsModule });
|
|
25
|
+
SignalrNotificationsModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: SignalrNotificationsModule });
|
|
26
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: SignalrNotificationsModule, decorators: [{
|
|
27
27
|
type: NgModule
|
|
28
28
|
}] });
|
|
29
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
29
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbmFsci1ub3RpZmljYXRpb25zLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3NpZ25hbHItbm90aWZpY2F0aW9ucy9zcmMvbGliL3NpZ25hbHItbm90aWZpY2F0aW9ucy5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFFBQVEsRUFBdUIsTUFBTSxlQUFlLENBQUM7QUFFOUQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDakUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDdkUsT0FBTyxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsY0FBYyxFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLE1BQU0sVUFBVSxDQUFDOztBQUdqSCxNQUFNLE9BQU8sMEJBQTBCO0lBQ3JDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBeUM7UUFDdEQsT0FBTztZQUNMLFFBQVEsRUFBRSwwQkFBMEI7WUFDcEMsU0FBUyxFQUFFO2dCQUNULG9CQUFvQjtnQkFDcEIsRUFBRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxjQUFjLElBQUksa0JBQWtCLEVBQUU7Z0JBQ3ZGLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRTtnQkFDeEQsRUFBRSxPQUFPLEVBQUUsZUFBZSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsT0FBTyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFO2dCQUN4RixFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxTQUFTLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUU7Z0JBQzVGLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLGNBQWMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRTtnQkFDcEcsRUFBRSxPQUFPLEVBQUUsY0FBYyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsYUFBYSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFO2dCQUNuRyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxPQUFPLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUU7YUFDbkY7U0FDRixDQUFDO0lBQ0osQ0FBQzs7d0hBZlUsMEJBQTBCO3lIQUExQiwwQkFBMEI7eUhBQTFCLDBCQUEwQjs0RkFBMUIsMEJBQTBCO2tCQUR0QyxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiXHJcbmltcG9ydCB7IE5nTW9kdWxlLCBNb2R1bGVXaXRoUHJvdmlkZXJzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFNpZ25hbHJOb3RpZmljYXRpb25zTW9kdWxlQ29uZmlnIH0gZnJvbSAnLi9jb25maWcvU2lnbmFsck5vdGlmaWNhdGlvbnNNb2R1bGVDb25maWcnO1xyXG5pbXBvcnQgeyBCYXNlTWVzc2FnZVNlcnZpY2UgfSBmcm9tICcuL21vZGVscy9CYXNlTWVzc2FnZVNlcnZpY2UnO1xyXG5pbXBvcnQgeyBOb3RpZmljYXRpb25zU2VydmljZSB9IGZyb20gJy4vc2lnbmFsci1ub3RpZmljYXRpb25zLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBFTkRQT0lOVF9VUkwsIFNJR05BTFJfRU5BQkxFRCwgU0dSX0RFQlVHX01PREUsIE1FU1NBR0VfUEFDSywgQVVUT19SRUNPTk5FQ1QsIEFWT0lEX1dTIH0gZnJvbSAnLi90b2tlbnMnO1xyXG5cclxuQE5nTW9kdWxlKClcclxuZXhwb3J0IGNsYXNzIFNpZ25hbHJOb3RpZmljYXRpb25zTW9kdWxlIHtcclxuICBzdGF0aWMgZm9yUm9vdChjb25maWc/OiBTaWduYWxyTm90aWZpY2F0aW9uc01vZHVsZUNvbmZpZyk6IE1vZHVsZVdpdGhQcm92aWRlcnM8U2lnbmFsck5vdGlmaWNhdGlvbnNNb2R1bGU+IHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIG5nTW9kdWxlOiBTaWduYWxyTm90aWZpY2F0aW9uc01vZHVsZSxcclxuICAgICAgcHJvdmlkZXJzOiBbXHJcbiAgICAgICAgTm90aWZpY2F0aW9uc1NlcnZpY2UsXHJcbiAgICAgICAgeyBwcm92aWRlOiBCYXNlTWVzc2FnZVNlcnZpY2UsIHVzZUNsYXNzOiBjb25maWc/Lm1lc3NhZ2VTZXJ2aWNlIHx8IEJhc2VNZXNzYWdlU2VydmljZSB9LFxyXG4gICAgICAgIHsgcHJvdmlkZTogRU5EUE9JTlRfVVJMLCB1c2VWYWx1ZTogY29uZmlnPy5lbmRwb2ludFVybCB9LFxyXG4gICAgICAgIHsgcHJvdmlkZTogU0lHTkFMUl9FTkFCTEVELCB1c2VWYWx1ZTogY29uZmlnPy5lbmFibGVkICE9IG51bGwgPyBjb25maWc/LmVuYWJsZWQgOiB0cnVlIH0sXHJcbiAgICAgICAgeyBwcm92aWRlOiBTR1JfREVCVUdfTU9ERSwgdXNlVmFsdWU6IGNvbmZpZz8uZGVidWdNb2RlICE9IG51bGwgPyBjb25maWc/LmRlYnVnTW9kZSA6IGZhbHNlIH0sXHJcbiAgICAgICAgeyBwcm92aWRlOiBNRVNTQUdFX1BBQ0ssIHVzZVZhbHVlOiBjb25maWc/LnVzZU1lc3NhZ2VQYWNrICE9IG51bGwgPyBjb25maWc/LnVzZU1lc3NhZ2VQYWNrIDogZmFsc2UgfSxcclxuICAgICAgICB7IHByb3ZpZGU6IEFVVE9fUkVDT05ORUNULCB1c2VWYWx1ZTogY29uZmlnPy5hdXRvUmVjb25uZWN0ICE9IG51bGwgPyBjb25maWc/LmF1dG9SZWNvbm5lY3QgOiB0cnVlIH0sXHJcbiAgICAgICAgeyBwcm92aWRlOiBBVk9JRF9XUywgdXNlVmFsdWU6IGNvbmZpZz8uYXZvaWRXcyAhPSBudWxsID8gY29uZmlnPy5hdm9pZFdzIDogZmFsc2UgfSxcclxuICAgICAgXVxyXG4gICAgfTtcclxuICB9XHJcbn0iXX0=
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
// Angular
|
|
2
|
+
import { Injectable, Inject } from "@angular/core";
|
|
3
|
+
// Direttive, Componenti, Librerie
|
|
4
|
+
import * as signalR from '@microsoft/signalr';
|
|
5
|
+
import { HubConnectionState } from "@microsoft/signalr";
|
|
6
|
+
import { Subject, EMPTY, from, of } from "rxjs";
|
|
7
|
+
import { catchError, concatMap, delay, tap } from "rxjs/operators";
|
|
8
|
+
import { SGR_DEBUG_MODE, ENDPOINT_URL, MESSAGE_PACK, SIGNALR_ENABLED, AUTO_RECONNECT, AVOID_WS } from "./tokens";
|
|
9
|
+
import * as i0 from "@angular/core";
|
|
10
|
+
import * as i1 from "./models/BaseMessageService";
|
|
11
|
+
/** Servizio che gestisce la comunicazione con un Hub SignalR in base alle configurazioni fornite dall'applicazione */
|
|
12
|
+
export class NotificationsService {
|
|
13
|
+
/** @ignore Costruttore */
|
|
14
|
+
constructor(MessageDef, endpoint_url, msgpack, avoidWs, enabled, debug, autoreconnect) {
|
|
15
|
+
this.MessageDef = MessageDef;
|
|
16
|
+
this.endpoint_url = endpoint_url;
|
|
17
|
+
this.msgpack = msgpack;
|
|
18
|
+
this.avoidWs = avoidWs;
|
|
19
|
+
this.enabled = enabled;
|
|
20
|
+
this.debug = debug;
|
|
21
|
+
this.autoreconnect = autoreconnect;
|
|
22
|
+
/** Cache degli Observable generati in base agli Endpoint disponibili */
|
|
23
|
+
this.notifications$ = {};
|
|
24
|
+
/** Coda di chiamate da recuperare quando la connessione viene finalmente aperta */
|
|
25
|
+
this.RequestsToRecover = [];
|
|
26
|
+
if (!this.enabled) {
|
|
27
|
+
this.log(this.loc("SignalR won't be enabled as per configuration"));
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
this.init();
|
|
31
|
+
}
|
|
32
|
+
async init() {
|
|
33
|
+
this.MessageDef.AllDefinitions.forEach(def => { this.notifications$[def.endpoint] = new Subject(); });
|
|
34
|
+
let pars = { skipNegotiation: this.avoidWs ? false : true, transport: this.avoidWs ? signalR.HttpTransportType.LongPolling : signalR.HttpTransportType.WebSockets, logger: this.debug ? signalR.LogLevel.Trace : signalR.LogLevel.None };
|
|
35
|
+
var builder = new signalR.HubConnectionBuilder().withUrl("/" + this.endpoint_url, pars);
|
|
36
|
+
if (this.autoreconnect) {
|
|
37
|
+
this.log(this.loc("Building SignalR Hub with Automatic Reconnection"));
|
|
38
|
+
// 100 tentativi di riconnessione, 1 ogni 5 secondi
|
|
39
|
+
builder = builder.withAutomaticReconnect(new Array(100).fill(5 * 1000));
|
|
40
|
+
}
|
|
41
|
+
if (this.msgpack) {
|
|
42
|
+
this.log(this.loc("Building SignalR Hub with MessagePack protocol"));
|
|
43
|
+
var mphpModule = await import("@microsoft/signalr-protocol-msgpack");
|
|
44
|
+
builder = builder.withHubProtocol(new mphpModule.MessagePackHubProtocol());
|
|
45
|
+
}
|
|
46
|
+
this.connection = builder.build();
|
|
47
|
+
this.connect(() => {
|
|
48
|
+
if (this.RequestsToRecover.length == 0)
|
|
49
|
+
return;
|
|
50
|
+
for (let i = 0; i < this.RequestsToRecover.length; i++) {
|
|
51
|
+
this.log(this.loc("Recovering request to Endpoint") + " " + this.RequestsToRecover[i].item.endpoint);
|
|
52
|
+
this.send(this.RequestsToRecover[i].item, this.RequestsToRecover[i].dto);
|
|
53
|
+
}
|
|
54
|
+
this.RequestsToRecover = [];
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Effettua la connessione all'Hub Signalr e registra tutti gli Endpoint per cui il Backend comunica con il Frontend sulla **connection**
|
|
59
|
+
*/
|
|
60
|
+
connect(onConnected) {
|
|
61
|
+
this.connection.start().catch(err => console.log(err)).then(_ => onConnected?.());
|
|
62
|
+
this.connection.on("ForceDisconnect", () => { this.connection.stop(); });
|
|
63
|
+
this.MessageDef.AllDefinitions.forEach(d => {
|
|
64
|
+
//Registro solo le cose di IN, quelle di out sono chiamate che faccio io al BE quindi non servono
|
|
65
|
+
if (d.inTypeDefault !== null && (d.outTypeDefault === null || d.outTypeDefault === undefined))
|
|
66
|
+
this.connection.on(d.endpoint, (message) => {
|
|
67
|
+
this.log(this.loc("Request received from the server for endpoint") + " '" + d.endpoint + "': " + (message ? this.substringLog(JSON.stringify(message)) : "[No message]"));
|
|
68
|
+
this.notifications$[d.endpoint].next(message);
|
|
69
|
+
});
|
|
70
|
+
else
|
|
71
|
+
this.log(this.loc("Refusing to register endpoint") + " " + d.endpoint + " " + this.loc("because it is not declared as IN - ONLY"));
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Effettua verifiche sulla connessione e, in caso non fosse collegata, tenta di riconnetterla
|
|
76
|
+
*
|
|
77
|
+
* @returns {Promise<'OK' | 'KO' | 'NO-OP'>} 'OK' Se la connessione è già connessa o è stata riconnessa con successo, 'KO' Se non è stato possibile riconnettere
|
|
78
|
+
* una connessione disconnessa, 'NO-OP' se la connesisone è in uno stato intermedio che non può essere modificato
|
|
79
|
+
*/
|
|
80
|
+
ensureConnected() {
|
|
81
|
+
if (this.connection.state == HubConnectionState.Disconnected) {
|
|
82
|
+
this.log(this.loc("Connection lost or missing, reconnecting..."));
|
|
83
|
+
return this.connection.start()
|
|
84
|
+
.then(_ => {
|
|
85
|
+
return Promise.resolve("OK");
|
|
86
|
+
}, _ => {
|
|
87
|
+
this.log(this.loc("Cannot reconnect SignalR, frontend HUB offline"));
|
|
88
|
+
return Promise.resolve("KO");
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
else if (this.connection.state == HubConnectionState.Connected)
|
|
92
|
+
return Promise.resolve("OK");
|
|
93
|
+
else
|
|
94
|
+
return Promise.resolve("NO-OP");
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Invia un messaggio all'Hub del Backend
|
|
98
|
+
*
|
|
99
|
+
* @param {EndpointDef<any, TOut>} item Endpoint da contattare
|
|
100
|
+
* @param {TOut} dto Dto da inviare all'Endpoint
|
|
101
|
+
*/
|
|
102
|
+
send(item, dto) {
|
|
103
|
+
if (!this.connection) {
|
|
104
|
+
this.RequestsToRecover.push({ item, dto });
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
if (!this.enabled) {
|
|
108
|
+
this.log(this.loc("Send request ignored because SignalR is not active by configuration"));
|
|
109
|
+
return EMPTY;
|
|
110
|
+
}
|
|
111
|
+
if (this.connection.state == HubConnectionState.Connecting || this.connection.state == HubConnectionState.Reconnecting || this.connection.state == HubConnectionState.Disconnecting) {
|
|
112
|
+
this.log(this.loc("Send request sent before a connection was in stable State, waiting 1 second and retrying"));
|
|
113
|
+
setTimeout(() => { this.send(item, dto); }, 1000);
|
|
114
|
+
}
|
|
115
|
+
else if (this.connection.state == HubConnectionState.Disconnected) {
|
|
116
|
+
this.ensureConnected().then(t => {
|
|
117
|
+
if (t == "KO")
|
|
118
|
+
this.log(this.loc("ERRORS on reconnecting before retrying a send command. Sent message WILL BE LOST"));
|
|
119
|
+
else
|
|
120
|
+
this.send(item, dto);
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
this.connection.send(item.endpoint, dto).then(_ => {
|
|
125
|
+
if (this.debug)
|
|
126
|
+
console.info(this.loc("Request sent to server") + " - " + item.endpoint + ": " + this.substringLog(JSON.stringify(dto)));
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Invia un messaggio all'Hub del Backend, aspettandosi una risposta
|
|
132
|
+
*
|
|
133
|
+
* @param {EndpointDef<TOut, TIn>} item Endpoint da contattare
|
|
134
|
+
* @param {TOut} dto Dto da inviare all'Endpoint
|
|
135
|
+
*
|
|
136
|
+
* @returns {Observable<TIn>} Observable su cui ci si può registrare per ricevere il risultato della chiamata
|
|
137
|
+
*/
|
|
138
|
+
invoke(item, dto) {
|
|
139
|
+
if (!this.enabled) {
|
|
140
|
+
this.log(this.loc("Invoke request ignored because SignalR is not active by configuration"));
|
|
141
|
+
return EMPTY;
|
|
142
|
+
}
|
|
143
|
+
if (this.connection.state == HubConnectionState.Connecting || this.connection.state == HubConnectionState.Reconnecting || this.connection.state == HubConnectionState.Disconnecting) {
|
|
144
|
+
this.log(this.loc("Invoke request sent before a connection was in stable State, waiting 1 second and retrying"));
|
|
145
|
+
return of().pipe(delay(1000), concatMap(() => this.invoke(item, dto)));
|
|
146
|
+
}
|
|
147
|
+
else if (this.connection.state == HubConnectionState.Disconnected) {
|
|
148
|
+
return from(this.ensureConnected()).pipe(concatMap((res) => {
|
|
149
|
+
if (res == "KO") {
|
|
150
|
+
this.log(this.loc("ERRORS on reconnecting before retrying a send command. Sent message WILL BE LOST"));
|
|
151
|
+
return EMPTY;
|
|
152
|
+
}
|
|
153
|
+
else
|
|
154
|
+
return this.invoke(item, dto);
|
|
155
|
+
}));
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
return from(this.connection.invoke(item.endpoint, dto)).pipe(tap(() => {
|
|
159
|
+
if (this.debug)
|
|
160
|
+
console.log(this.loc("Request invoked to server") + " - " + item.endpoint + ": " + this.substringLog(JSON.stringify(dto)));
|
|
161
|
+
}));
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Hook per osservare i dati spediti ad un Endpoint dal Backend
|
|
166
|
+
*
|
|
167
|
+
* @param {EndpointDef<TIn, any>} item Endpoint su cui ascoltare
|
|
168
|
+
*
|
|
169
|
+
* @returns {Observable<TIn>} Observable su cui ci si può registrare per ricevere l'oggetto generato ad ogni chiamata dal Backend al Frontend
|
|
170
|
+
*/
|
|
171
|
+
observe(item) {
|
|
172
|
+
if (!this.enabled) {
|
|
173
|
+
this.log(this.loc("Observe request ignored because SignalR is not active by configuration"));
|
|
174
|
+
return EMPTY;
|
|
175
|
+
}
|
|
176
|
+
this.log(this.loc("Returning observable for required endpoint") + ": " + item.endpoint);
|
|
177
|
+
return this.notifications$[item.endpoint];
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Disconnessione del sistema di SignalR
|
|
181
|
+
*
|
|
182
|
+
* @returns {Observable<void>} Observable a cui registrarsi che viene chiamato quando la disconnessione è terminata
|
|
183
|
+
*/
|
|
184
|
+
disconnect() {
|
|
185
|
+
//NO-OP se non attivo
|
|
186
|
+
if (!this.enabled) {
|
|
187
|
+
this.log(this.loc("Disconnection request ignored because SignalR is not active by configuration"));
|
|
188
|
+
return EMPTY;
|
|
189
|
+
}
|
|
190
|
+
return from(this.connection.stop()).pipe(catchError((err, caught) => { console.log(err); return of(null); }), tap(() => {
|
|
191
|
+
this.log(this.loc("Disconnection request honored"));
|
|
192
|
+
}));
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Taglia un log troppo lungo
|
|
196
|
+
*
|
|
197
|
+
* @param {string} text Log da tagliare
|
|
198
|
+
* @param {number} maxchars Numero massimo di caratteri da tenere
|
|
199
|
+
*
|
|
200
|
+
* @returns {string} Log tagliato
|
|
201
|
+
*/
|
|
202
|
+
substringLog(text, maxchars = 120) {
|
|
203
|
+
return text.length > maxchars ? text.substr(0, maxchars) + "[...]" : text;
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Stampa un log a console
|
|
207
|
+
*
|
|
208
|
+
* @param {string} message Messaggio da stampare
|
|
209
|
+
*/
|
|
210
|
+
log(message) {
|
|
211
|
+
if (this.debug)
|
|
212
|
+
console.log("@signalr-notifications: " + message);
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Helper di localizzazione
|
|
216
|
+
*
|
|
217
|
+
* @param {string} message Messaggio da tradurre
|
|
218
|
+
*
|
|
219
|
+
* @returns {string} Messaggio tradotto
|
|
220
|
+
*/
|
|
221
|
+
loc(message) {
|
|
222
|
+
return message;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
NotificationsService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: NotificationsService, deps: [{ token: i1.BaseMessageService }, { token: ENDPOINT_URL }, { token: MESSAGE_PACK }, { token: AVOID_WS }, { token: SIGNALR_ENABLED }, { token: SGR_DEBUG_MODE }, { token: AUTO_RECONNECT }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
226
|
+
NotificationsService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: NotificationsService });
|
|
227
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: NotificationsService, decorators: [{
|
|
228
|
+
type: Injectable
|
|
229
|
+
}], ctorParameters: function () { return [{ type: i1.BaseMessageService }, { type: undefined, decorators: [{
|
|
230
|
+
type: Inject,
|
|
231
|
+
args: [ENDPOINT_URL]
|
|
232
|
+
}] }, { type: undefined, decorators: [{
|
|
233
|
+
type: Inject,
|
|
234
|
+
args: [MESSAGE_PACK]
|
|
235
|
+
}] }, { type: undefined, decorators: [{
|
|
236
|
+
type: Inject,
|
|
237
|
+
args: [AVOID_WS]
|
|
238
|
+
}] }, { type: undefined, decorators: [{
|
|
239
|
+
type: Inject,
|
|
240
|
+
args: [SIGNALR_ENABLED]
|
|
241
|
+
}] }, { type: undefined, decorators: [{
|
|
242
|
+
type: Inject,
|
|
243
|
+
args: [SGR_DEBUG_MODE]
|
|
244
|
+
}] }, { type: undefined, decorators: [{
|
|
245
|
+
type: Inject,
|
|
246
|
+
args: [AUTO_RECONNECT]
|
|
247
|
+
}] }]; } });
|
|
248
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbmFsci1ub3RpZmljYXRpb25zLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9zaWduYWxyLW5vdGlmaWNhdGlvbnMvc3JjL2xpYi9zaWduYWxyLW5vdGlmaWNhdGlvbnMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxVQUFVO0FBQ1YsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFbkQsa0NBQWtDO0FBQ2xDLE9BQU8sS0FBSyxPQUFPLE1BQU0sb0JBQW9CLENBQUM7QUFDOUMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDeEQsT0FBTyxFQUFjLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM1RCxPQUFPLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFLbkUsT0FBTyxFQUFFLGNBQWMsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLGVBQWUsRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLE1BQU0sVUFBVSxDQUFDOzs7QUFFakgsc0hBQXNIO0FBRXRILE1BQU0sT0FBTyxvQkFBb0I7SUFXNUIsMEJBQTBCO0lBQzNCLFlBQW9CLFVBQThCLEVBQWdDLFlBQW9CLEVBQWdDLE9BQWdCLEVBQTZCLE9BQWdCLEVBQW1DLE9BQWdCLEVBQWtDLEtBQWMsRUFBa0MsYUFBc0I7UUFBMVUsZUFBVSxHQUFWLFVBQVUsQ0FBb0I7UUFBZ0MsaUJBQVksR0FBWixZQUFZLENBQVE7UUFBZ0MsWUFBTyxHQUFQLE9BQU8sQ0FBUztRQUE2QixZQUFPLEdBQVAsT0FBTyxDQUFTO1FBQW1DLFlBQU8sR0FBUCxPQUFPLENBQVM7UUFBa0MsVUFBSyxHQUFMLEtBQUssQ0FBUztRQUFrQyxrQkFBYSxHQUFiLGFB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Q0FBQyxHQUFHLENBQUMsMEJBQTBCLEdBQUcsT0FBTyxDQUFDLENBQUE7SUFDekQsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNLLEdBQUcsQ0FBQyxPQUFlO1FBQ3ZCLE9BQU8sT0FBTyxDQUFDO0lBQ25CLENBQUM7O2tIQTNPUSxvQkFBb0Isb0RBWStCLFlBQVksYUFBd0MsWUFBWSxhQUFxQyxRQUFRLGFBQW9DLGVBQWUsYUFBb0MsY0FBYyxhQUFrQyxjQUFjO3NIQVpyVCxvQkFBb0I7NEZBQXBCLG9CQUFvQjtrQkFEaEMsVUFBVTs7MEJBYThDLE1BQU07MkJBQUMsWUFBWTs7MEJBQWlDLE1BQU07MkJBQUMsWUFBWTs7MEJBQThCLE1BQU07MkJBQUMsUUFBUTs7MEJBQTZCLE1BQU07MkJBQUMsZUFBZTs7MEJBQTZCLE1BQU07MkJBQUMsY0FBYzs7MEJBQTJCLE1BQU07MkJBQUMsY0FBYyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEFuZ3VsYXJcclxuaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuXHJcbi8vIERpcmV0dGl2ZSwgQ29tcG9uZW50aSwgTGlicmVyaWVcclxuaW1wb3J0ICogYXMgc2lnbmFsUiBmcm9tICdAbWljcm9zb2Z0L3NpZ25hbHInO1xyXG5pbXBvcnQgeyBIdWJDb25uZWN0aW9uU3RhdGUgfSBmcm9tIFwiQG1pY3Jvc29mdC9zaWduYWxyXCI7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QsIEVNUFRZLCBmcm9tLCBvZiB9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7IGNhdGNoRXJyb3IsIGNvbmNhdE1hcCwgZGVsYXksIHRhcCB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xyXG5cclxuLy8gTW9kZWxsaVxyXG5pbXBvcnQgeyBCYXNlTWVzc2FnZVNlcnZpY2UgfSBmcm9tICcuL21vZGVscy9CYXNlTWVzc2FnZVNlcnZpY2UnO1xyXG5pbXBvcnQgeyBFbmRwb2ludERlZiB9IGZyb20gJy4vbW9kZWxzL0VuZHBvaW50RGVmJztcclxuaW1wb3J0IHsgU0dSX0RFQlVHX01PREUsIEVORFBPSU5UX1VSTCwgTUVTU0FHRV9QQUNLLCBTSUdOQUxSX0VOQUJMRUQsIEFVVE9fUkVDT05ORUNULCBBVk9JRF9XUyB9IGZyb20gXCIuL3Rva2Vuc1wiO1xyXG5cclxuLyoqIFNlcnZpemlvIGNoZSBnZXN0aXNjZSBsYSBjb211bmljYXppb25lIGNvbiB1biBIdWIgU2lnbmFsUiBpbiBiYXNlIGFsbGUgY29uZmlndXJhemlvbmkgZm9ybml0ZSBkYWxsJ2FwcGxpY2F6aW9uZSAqL1xyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBOb3RpZmljYXRpb25zU2VydmljZSB7XHJcblxyXG4gICAgLyoqIENhY2hlIGRlZ2xpIE9ic2VydmFibGUgZ2VuZXJhdGkgaW4gYmFzZSBhZ2xpIEVuZHBvaW50IGRpc3BvbmliaWxpICovXHJcbiAgICBwcml2YXRlIG5vdGlmaWNhdGlvbnMkOiB7IFtpbmRleDogc3RyaW5nXTogU3ViamVjdDxhbnk+IH0gPSB7fTtcclxuXHJcbiAgICAvKiogQ29ubmVzc2lvbmUgU2lnbmFsciAqL1xyXG4gICAgcHJpdmF0ZSBjb25uZWN0aW9uOiBzaWduYWxSLkh1YkNvbm5lY3Rpb247XHJcblxyXG4gICAgIC8qKiBDb2RhIGRpIGNoaWFtYXRlIGRhIHJlY3VwZXJhcmUgcXVhbmRvIGxhIGNvbm5lc3Npb25lIHZpZW5lIGZpbmFsbWVudGUgYXBlcnRhICovXHJcbiAgICAgcHJpdmF0ZSBSZXF1ZXN0c1RvUmVjb3ZlcjogeyBpdGVtOiBFbmRwb2ludERlZjxhbnksIGFueT4sIGR0bzogYW55IH1bXSA9IFtdO1xyXG5cclxuICAgICAvKiogQGlnbm9yZSBDb3N0cnV0dG9yZSAqL1xyXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBNZXNzYWdlRGVmOiBCYXNlTWVzc2FnZVNlcnZpY2UsIEBJbmplY3QoRU5EUE9JTlRfVVJMKSBwcml2YXRlIGVuZHBvaW50X3VybDogc3RyaW5nLCBASW5qZWN0KE1FU1NBR0VfUEFDSykgcHJpdmF0ZSBtc2dwYWNrOiBib29sZWFuLCAgQEluamVjdChBVk9JRF9XUykgcHJpdmF0ZSBhdm9pZFdzOiBib29sZWFuLCBASW5qZWN0KFNJR05BTFJfRU5BQkxFRCkgcHJpdmF0ZSBlbmFibGVkOiBib29sZWFuLCBASW5qZWN0KFNHUl9ERUJVR19NT0RFKSBwcml2YXRlIGRlYnVnOiBib29sZWFuLCBASW5qZWN0KEFVVE9fUkVDT05ORUNUKSBwcml2YXRlIGF1dG9yZWNvbm5lY3Q6IGJvb2xlYW4pIHtcclxuICAgICAgICBpZiAoIXRoaXMuZW5hYmxlZCkge1xyXG4gICAgICAgICAgICB0aGlzLmxvZyh0aGlzLmxvYyhcIlNpZ25hbFIgd29uJ3QgYmUgZW5hYmxlZCBhcyBwZXIgY29uZmlndXJhdGlvblwiKSk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuaW5pdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYXN5bmMgaW5pdCgpe1xyXG4gICAgICAgIHRoaXMuTWVzc2FnZURlZi5BbGxEZWZpbml0aW9ucy5mb3JFYWNoKGRlZiA9PiB7IHRoaXMubm90aWZpY2F0aW9ucyRbZGVmLmVuZHBvaW50XSA9IG5ldyBTdWJqZWN0PHR5cGVvZiBkZWYuaW5UeXBlRGVmYXVsdD4oKTsgfSk7XHJcblxyXG4gICAgICAgIGxldCBwYXJzOiBzaWduYWxSLklIdHRwQ29ubmVjdGlvbk9wdGlvbnMgPSB7IHNraXBOZWdvdGlhdGlvbjogdGhpcy5hdm9pZFdzID8gZmFsc2UgOiB0cnVlLCB0cmFuc3BvcnQ6IHRoaXMuYXZvaWRXcyA/IHNpZ25hbFIuSHR0cFRyYW5zcG9ydFR5cGUuTG9uZ1BvbGxpbmcgOiBzaWduYWxSLkh0dHBUcmFuc3BvcnRUeXBlLldlYlNvY2tldHMsIGxvZ2dlcjogdGhpcy5kZWJ1ZyA/IHNpZ25hbFIuTG9nTGV2ZWwuVHJhY2UgOiBzaWduYWxSLkxvZ0xldmVsLk5vbmUgfTtcclxuICAgICAgICB2YXIgYnVpbGRlciA9IG5ldyBzaWduYWxSLkh1YkNvbm5lY3Rpb25CdWlsZGVyKCkud2l0aFVybChcIi9cIiArIHRoaXMuZW5kcG9pbnRfdXJsLCBwYXJzKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuYXV0b3JlY29ubmVjdCkge1xyXG4gICAgICAgICAgICB0aGlzLmxvZyh0aGlzLmxvYyhcIkJ1aWxkaW5nIFNpZ25hbFIgSHViIHdpdGggQXV0b21hdGljIFJlY29ubmVjdGlvblwiKSk7XHJcbiAgICAgICAgICAgIC8vIDEwMCB0ZW50YXRpdmkgZGkgcmljb25uZXNzaW9uZSwgMSBvZ25pIDUgc2Vjb25kaVxyXG4gICAgICAgICAgICBidWlsZGVyID0gYnVpbGRlci53aXRoQXV0b21hdGljUmVjb25uZWN0KG5ldyBBcnJheSgxMDApLmZpbGwoNSAqIDEwMDApKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLm1zZ3BhY2spIHtcclxuICAgICAgICAgICAgdGhpcy5sb2codGhpcy5sb2MoXCJCdWlsZGluZyBTaWduYWxSIEh1YiB3aXRoIE1lc3NhZ2VQYWNrIHByb3RvY29sXCIpKTtcclxuICAgICAgICAgICAgdmFyIG1waHBNb2R1bGUgPSBhd2FpdCBpbXBvcnQoXCJAbWljcm9zb2Z0L3NpZ25hbHItcHJvdG9jb2wtbXNncGFja1wiKTtcclxuICAgICAgICAgICAgYnVpbGRlciA9IGJ1aWxkZXIud2l0aEh1YlByb3RvY29sKG5ldyBtcGhwTW9kdWxlLk1lc3NhZ2VQYWNrSHViUHJvdG9jb2woKSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuY29ubmVjdGlvbiA9IGJ1aWxkZXIuYnVpbGQoKTtcclxuICAgICAgICB0aGlzLmNvbm5lY3QoKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5SZXF1ZXN0c1RvUmVjb3Zlci5sZW5ndGggPT0gMClcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5SZXF1ZXN0c1RvUmVjb3Zlci5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2codGhpcy5sb2MoXCJSZWNvdmVyaW5nIHJlcXVlc3QgdG8gRW5kcG9pbnRcIikgKyBcIiBcIiArIHRoaXMuUmVxdWVzdHNUb1JlY292ZXJbaV0uaXRlbS5lbmRwb2ludClcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VuZCh0aGlzLlJlcXVlc3RzVG9SZWNvdmVyW2ldLml0ZW0sIHRoaXMuUmVxdWVzdHNUb1JlY292ZXJbaV0uZHRvKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5SZXF1ZXN0c1RvUmVjb3ZlciA9IFtdO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRWZmZXR0dWEgbGEgY29ubmVzc2lvbmUgYWxsJ0h1YiBTaWduYWxyIGUgcmVnaXN0cmEgdHV0dGkgZ2xpIEVuZHBvaW50IHBlciBjdWkgaWwgQmFja2VuZCBjb211bmljYSBjb24gaWwgRnJvbnRlbmQgc3VsbGEgKipjb25uZWN0aW9uKipcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBjb25uZWN0KG9uQ29ubmVjdGVkPzogKCkgPT4gdm9pZCkge1xyXG4gICAgICAgIHRoaXMuY29ubmVjdGlvbi5zdGFydCgpLmNhdGNoKGVyciA9PiBjb25zb2xlLmxvZyhlcnIpKS50aGVuKF8gPT4gb25Db25uZWN0ZWQ/LigpKTtcclxuICAgICAgICB0aGlzLmNvbm5lY3Rpb24ub24oXCJGb3JjZURpc2Nvbm5lY3RcIiwgKCkgPT4geyB0aGlzLmNvbm5lY3Rpb24uc3RvcCgpOyB9KTtcclxuICAgICAgICB0aGlzLk1lc3NhZ2VEZWYuQWxsRGVmaW5pdGlvbnMuZm9yRWFjaChkID0+IHtcclxuICAgICAgICAgICAgLy9SZWdpc3RybyBzb2xvIGxlIGNvc2UgZGkgSU4sIHF1ZWxsZSBkaSBvdXQgc29ubyBjaGlhbWF0ZSBjaGUgZmFjY2lvIGlvIGFsIEJFIHF1aW5kaSBub24gc2Vydm9ub1xyXG4gICAgICAgICAgICBpZiAoZC5pblR5cGVEZWZhdWx0ICE9PSBudWxsICYmIChkLm91dFR5cGVEZWZhdWx0ID09PSBudWxsIHx8IGQub3V0VHlwZURlZmF1bHQgPT09IHVuZGVmaW5lZCkpXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24ub24oZC5lbmRwb2ludCwgKG1lc3NhZ2UpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZyh0aGlzLmxvYyhcIlJlcXVlc3QgcmVjZWl2ZWQgZnJvbSB0aGUgc2VydmVyIGZvciBlbmRwb2ludFwiKSArIFwiICdcIiArIGQuZW5kcG9pbnQgKyBcIic6IFwiICsgKG1lc3NhZ2UgPyB0aGlzLnN1YnN0cmluZ0xvZyhKU09OLnN0cmluZ2lmeShtZXNzYWdlKSk6IFwiW05vIG1lc3NhZ2VdXCIpKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbnMkW2QuZW5kcG9pbnRdLm5leHQobWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2codGhpcy5sb2MoXCJSZWZ1c2luZyB0byByZWdpc3RlciBlbmRwb2ludFwiKSArIFwiIFwiICsgZC5lbmRwb2ludCArIFwiIFwiICsgdGhpcy5sb2MoXCJiZWNhdXNlIGl0IGlzIG5vdCBkZWNsYXJlZCBhcyBJTiAtIE9OTFlcIikpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRWZmZXR0dWEgdmVyaWZpY2hlIHN1bGxhIGNvbm5lc3Npb25lIGUsIGluIGNhc28gbm9uIGZvc3NlIGNvbGxlZ2F0YSwgdGVudGEgZGkgcmljb25uZXR0ZXJsYVxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTwnT0snIHwgJ0tPJyB8ICdOTy1PUCc+fSAnT0snIFNlIGxhIGNvbm5lc3Npb25lIMOoIGdpw6AgY29ubmVzc2EgbyDDqCBzdGF0YSByaWNvbm5lc3NhIGNvbiBzdWNjZXNzbywgJ0tPJyBTZSBub24gw6ggc3RhdG8gcG9zc2liaWxlIHJpY29ubmV0dGVyZSBcclxuICAgICAqIHVuYSBjb25uZXNzaW9uZSBkaXNjb25uZXNzYSwgJ05PLU9QJyBzZSBsYSBjb25uZXNpc29uZSDDqCBpbiB1bm8gc3RhdG8gaW50ZXJtZWRpbyBjaGUgbm9uIHB1w7IgZXNzZXJlIG1vZGlmaWNhdG9cclxuICAgICAqL1xyXG4gICAgcHVibGljIGVuc3VyZUNvbm5lY3RlZCgpOiBQcm9taXNlPCdPSycgfCAnS08nIHwgJ05PLU9QJz4ge1xyXG4gICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb24uc3RhdGUgPT0gSHViQ29ubmVjdGlvblN0YXRlLkRpc2Nvbm5lY3RlZCkge1xyXG4gICAgICAgICAgICB0aGlzLmxvZyh0aGlzLmxvYyhcIkNvbm5lY3Rpb24gbG9zdCBvciBtaXNzaW5nLCByZWNvbm5lY3RpbmcuLi5cIikpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvbi5zdGFydCgpXHJcbiAgICAgICAgICAgICAgICAudGhlbihfID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFwiT0tcIik7XHJcbiAgICAgICAgICAgICAgICB9LCBfID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZyh0aGlzLmxvYyhcIkNhbm5vdCByZWNvbm5lY3QgU2lnbmFsUiwgZnJvbnRlbmQgSFVCIG9mZmxpbmVcIikpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoXCJLT1wiKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0aGlzLmNvbm5lY3Rpb24uc3RhdGUgPT0gSHViQ29ubmVjdGlvblN0YXRlLkNvbm5lY3RlZClcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShcIk9LXCIpO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShcIk5PLU9QXCIpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEludmlhIHVuIG1lc3NhZ2dpbyBhbGwnSHViIGRlbCBCYWNrZW5kXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7RW5kcG9pbnREZWY8YW55LCBUT3V0Pn0gaXRlbSBFbmRwb2ludCBkYSBjb250YXR0YXJlXHJcbiAgICAgKiBAcGFyYW0ge1RPdXR9IGR0byBEdG8gZGEgaW52aWFyZSBhbGwnRW5kcG9pbnRcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNlbmQ8VE91dD4oaXRlbTogRW5kcG9pbnREZWY8YW55LCBUT3V0PiwgZHRvOiBUT3V0KSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmNvbm5lY3Rpb24pIHtcclxuICAgICAgICAgICAgdGhpcy5SZXF1ZXN0c1RvUmVjb3Zlci5wdXNoKHsgaXRlbSwgZHRvIH0pO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXRoaXMuZW5hYmxlZCkge1xyXG4gICAgICAgICAgICB0aGlzLmxvZyh0aGlzLmxvYyhcIlNlbmQgcmVxdWVzdCBpZ25vcmVkIGJlY2F1c2UgU2lnbmFsUiBpcyBub3QgYWN0aXZlIGJ5IGNvbmZpZ3VyYXRpb25cIikpO1xyXG4gICAgICAgICAgICByZXR1cm4gRU1QVFk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uLnN0YXRlID09IEh1YkNvbm5lY3Rpb25TdGF0ZS5Db25uZWN0aW5nIHx8IHRoaXMuY29ubmVjdGlvbi5zdGF0ZSA9PSBIdWJDb25uZWN0aW9uU3RhdGUuUmVjb25uZWN0aW5nIHx8IHRoaXMuY29ubmVjdGlvbi5zdGF0ZSA9PSBIdWJDb25uZWN0aW9uU3RhdGUuRGlzY29ubmVjdGluZykge1xyXG4gICAgICAgICAgICB0aGlzLmxvZyh0aGlzLmxvYyhcIlNlbmQgcmVxdWVzdCBzZW50IGJlZm9yZSBhIGNvbm5lY3Rpb24gd2FzIGluIHN0YWJsZSBTdGF0ZSwgd2FpdGluZyAxIHNlY29uZCBhbmQgcmV0cnlpbmdcIikpO1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsgdGhpcy5zZW5kKGl0ZW0sIGR0byk7IH0sIDEwMDApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0aGlzLmNvbm5lY3Rpb24uc3RhdGUgPT0gSHViQ29ubmVjdGlvblN0YXRlLkRpc2Nvbm5lY3RlZCkge1xyXG4gICAgICAgICAgICB0aGlzLmVuc3VyZUNvbm5lY3RlZCgpLnRoZW4odCA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAodCA9PSBcIktPXCIpIHRoaXMubG9nKHRoaXMubG9jKFwiRVJST1JTIG9uIHJlY29ubmVjdGluZyBiZWZvcmUgcmV0cnlpbmcgYSBzZW5kIGNvbW1hbmQuIFNlbnQgbWVzc2FnZSBXSUxMIEJFIExPU1RcIikpO1xyXG4gICAgICAgICAgICAgICAgZWxzZSB0aGlzLnNlbmQoaXRlbSwgZHRvKTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvbi5zZW5kKGl0ZW0uZW5kcG9pbnQsIGR0bykudGhlbihfID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmRlYnVnKVxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuaW5mbyh0aGlzLmxvYyhcIlJlcXVlc3Qgc2VudCB0byBzZXJ2ZXJcIikgKyBcIiAtIFwiICsgaXRlbS5lbmRwb2ludCArIFwiOiBcIiArIHRoaXMuc3Vic3RyaW5nTG9nKEpTT04uc3RyaW5naWZ5KGR0bykpKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW52aWEgdW4gbWVzc2FnZ2lvIGFsbCdIdWIgZGVsIEJhY2tlbmQsIGFzcGV0dGFuZG9zaSB1bmEgcmlzcG9zdGFcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtFbmRwb2ludERlZjxUT3V0LCBUSW4+fSBpdGVtIEVuZHBvaW50IGRhIGNvbnRhdHRhcmVcclxuICAgICAqIEBwYXJhbSB7VE91dH0gZHRvIER0byBkYSBpbnZpYXJlIGFsbCdFbmRwb2ludFxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZTxUSW4+fSBPYnNlcnZhYmxlIHN1IGN1aSBjaSBzaSBwdcOyIHJlZ2lzdHJhcmUgcGVyIHJpY2V2ZXJlIGlsIHJpc3VsdGF0byBkZWxsYSBjaGlhbWF0YVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaW52b2tlPFRPdXQsIFRJbj4oaXRlbTogRW5kcG9pbnREZWY8VE91dCwgVEluPiwgZHRvOiBUT3V0KTogT2JzZXJ2YWJsZTxUSW4+IHtcclxuICAgICAgICBpZiAoIXRoaXMuZW5hYmxlZCkge1xyXG4gICAgICAgICAgICB0aGlzLmxvZyh0aGlzLmxvYyhcIkludm9rZSByZXF1ZXN0IGlnbm9yZWQgYmVjYXVzZSBTaWduYWxSIGlzIG5vdCBhY3RpdmUgYnkgY29uZmlndXJhdGlvblwiKSk7XHJcbiAgICAgICAgICAgIHJldHVybiBFTVBUWTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb24uc3RhdGUgPT0gSHViQ29ubmVjdGlvblN0YXRlLkNvbm5lY3RpbmcgfHwgdGhpcy5jb25uZWN0aW9uLnN0YXRlID09IEh1YkNvbm5lY3Rpb25TdGF0ZS5SZWNvbm5lY3RpbmcgfHwgdGhpcy5jb25uZWN0aW9uLnN0YXRlID09IEh1YkNvbm5lY3Rpb25TdGF0ZS5EaXNjb25uZWN0aW5nKSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nKHRoaXMubG9jKFwiSW52b2tlIHJlcXVlc3Qgc2VudCBiZWZvcmUgYSBjb25uZWN0aW9uIHdhcyBpbiBzdGFibGUgU3RhdGUsIHdhaXRpbmcgMSBzZWNvbmQgYW5kIHJldHJ5aW5nXCIpKTtcclxuICAgICAgICAgICAgcmV0dXJuIG9mKCkucGlwZShkZWxheSgxMDAwKSwgY29uY2F0TWFwKCgpID0+IHRoaXMuaW52b2tlKGl0ZW0sIGR0bykpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5jb25uZWN0aW9uLnN0YXRlID09IEh1YkNvbm5lY3Rpb25TdGF0ZS5EaXNjb25uZWN0ZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZyb20odGhpcy5lbnN1cmVDb25uZWN0ZWQoKSkucGlwZShjb25jYXRNYXAoKHJlcykgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHJlcyA9PSBcIktPXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZyh0aGlzLmxvYyhcIkVSUk9SUyBvbiByZWNvbm5lY3RpbmcgYmVmb3JlIHJldHJ5aW5nIGEgc2VuZCBjb21tYW5kLiBTZW50IG1lc3NhZ2UgV0lMTCBCRSBMT1NUXCIpKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gRU1QVFk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHJldHVybiB0aGlzLmludm9rZShpdGVtLCBkdG8pO1xyXG4gICAgICAgICAgICB9KSlcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmcm9tKHRoaXMuY29ubmVjdGlvbi5pbnZva2U8VEluPihpdGVtLmVuZHBvaW50LCBkdG8pKS5waXBlKFxyXG4gICAgICAgICAgICAgICAgdGFwKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5kZWJ1ZykgY29uc29sZS5sb2codGhpcy5sb2MoXCJSZXF1ZXN0IGludm9rZWQgdG8gc2VydmVyXCIpICsgXCIgLSBcIiArIGl0ZW0uZW5kcG9pbnQgKyBcIjogXCIgKyB0aGlzLnN1YnN0cmluZ0xvZyhKU09OLnN0cmluZ2lmeShkdG8pKSk7XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEhvb2sgcGVyIG9zc2VydmFyZSBpIGRhdGkgc3BlZGl0aSBhZCB1biBFbmRwb2ludCBkYWwgQmFja2VuZFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge0VuZHBvaW50RGVmPFRJbiwgYW55Pn0gaXRlbSBFbmRwb2ludCBzdSBjdWkgYXNjb2x0YXJlXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlPFRJbj59IE9ic2VydmFibGUgc3UgY3VpIGNpIHNpIHB1w7IgcmVnaXN0cmFyZSBwZXIgcmljZXZlcmUgbCdvZ2dldHRvIGdlbmVyYXRvIGFkIG9nbmkgY2hpYW1hdGEgZGFsIEJhY2tlbmQgYWwgRnJvbnRlbmRcclxuICAgICAqL1xyXG4gICAgcHVibGljIG9ic2VydmU8VEluPihpdGVtOiBFbmRwb2ludERlZjxUSW4sIGFueT4pOiBPYnNlcnZhYmxlPFRJbj4ge1xyXG4gICAgICAgIGlmICghdGhpcy5lbmFibGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nKHRoaXMubG9jKFwiT2JzZXJ2ZSByZXF1ZXN0IGlnbm9yZWQgYmVjYXVzZSBTaWduYWxSIGlzIG5vdCBhY3RpdmUgYnkgY29uZmlndXJhdGlvblwiKSk7XHJcbiAgICAgICAgICAgIHJldHVybiBFTVBUWTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMubG9nKHRoaXMubG9jKFwiUmV0dXJuaW5nIG9ic2VydmFibGUgZm9yIHJlcXVpcmVkIGVuZHBvaW50XCIpICsgXCI6IFwiICsgaXRlbS5lbmRwb2ludCk7XHJcbiAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPFRJbj4+dGhpcy5ub3RpZmljYXRpb25zJFtpdGVtLmVuZHBvaW50XTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERpc2Nvbm5lc3Npb25lIGRlbCBzaXN0ZW1hIGRpIFNpZ25hbFJcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMge09ic2VydmFibGU8dm9pZD59IE9ic2VydmFibGUgYSBjdWkgcmVnaXN0cmFyc2kgY2hlIHZpZW5lIGNoaWFtYXRvIHF1YW5kbyBsYSBkaXNjb25uZXNzaW9uZSDDqCB0ZXJtaW5hdGFcclxuICAgICAqL1xyXG4gICAgcHVibGljIGRpc2Nvbm5lY3QoKTogT2JzZXJ2YWJsZTx2b2lkPiB7XHJcbiAgICAgICAgLy9OTy1PUCBzZSBub24gYXR0aXZvXHJcbiAgICAgICAgaWYgKCF0aGlzLmVuYWJsZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2codGhpcy5sb2MoXCJEaXNjb25uZWN0aW9uIHJlcXVlc3QgaWdub3JlZCBiZWNhdXNlIFNpZ25hbFIgaXMgbm90IGFjdGl2ZSBieSBjb25maWd1cmF0aW9uXCIpKTtcclxuICAgICAgICAgICAgcmV0dXJuIEVNUFRZO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGZyb20odGhpcy5jb25uZWN0aW9uLnN0b3AoKSkucGlwZShcclxuICAgICAgICAgICAgY2F0Y2hFcnJvcigoZXJyLCBjYXVnaHQpID0+IHsgY29uc29sZS5sb2coZXJyKTsgcmV0dXJuIG9mKG51bGwpOyB9KSxcclxuICAgICAgICAgICAgdGFwKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nKHRoaXMubG9jKFwiRGlzY29ubmVjdGlvbiByZXF1ZXN0IGhvbm9yZWRcIikpO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUYWdsaWEgdW4gbG9nIHRyb3BwbyBsdW5nb1xyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCBMb2cgZGEgdGFnbGlhcmVcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBtYXhjaGFycyBOdW1lcm8gbWFzc2ltbyBkaSBjYXJhdHRlcmkgZGEgdGVuZXJlXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IExvZyB0YWdsaWF0b1xyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHN1YnN0cmluZ0xvZyh0ZXh0OiBzdHJpbmcsIG1heGNoYXJzOiBudW1iZXIgPSAxMjApOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0ZXh0Lmxlbmd0aCA+IG1heGNoYXJzID8gdGV4dC5zdWJzdHIoMCwgbWF4Y2hhcnMpICsgXCJbLi4uXVwiIDogdGV4dDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFN0YW1wYSB1biBsb2cgYSBjb25zb2xlXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIE1lc3NhZ2dpbyBkYSBzdGFtcGFyZVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGxvZyhtZXNzYWdlOiBzdHJpbmcpIHtcclxuICAgICAgICBpZiAodGhpcy5kZWJ1ZylcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJAc2lnbmFsci1ub3RpZmljYXRpb25zOiBcIiArIG1lc3NhZ2UpXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBIZWxwZXIgZGkgbG9jYWxpenphemlvbmVcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgTWVzc2FnZ2lvIGRhIHRyYWR1cnJlXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IE1lc3NhZ2dpbyB0cmFkb3R0b1xyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGxvYyhtZXNzYWdlOiBzdHJpbmcpIDogc3RyaW5ne1xyXG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xyXG4gICAgfVxyXG59Il19
|