@esfaenza/signalr-notifications 15.2.17 → 16.2.0

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.
@@ -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 }); }
29
31
  }
30
- BaseMessageService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: BaseMessageService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
31
- BaseMessageService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: BaseMessageService });
32
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: BaseMessageService, decorators: [{
32
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: BaseMessageService, decorators: [{
33
33
  type: Injectable
34
34
  }], ctorParameters: function () { return []; } });
35
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmFzZU1lc3NhZ2VTZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2lnbmFsci1ub3RpZmljYXRpb25zL3NyYy9saWIvbW9kZWxzL0Jhc2VNZXNzYWdlU2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxVQUFVO0FBQ1YsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxVQUFVO0FBQ1YsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7O0FBRWxEOztHQUVHO0FBRUgsTUFBTSxPQUFPLGtCQUFrQjtJQVkzQixvSUFBb0k7SUFDcEksSUFBVyxjQUFjLEtBQThCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7SUFFakY7UUFiUSxnQkFBVyxHQUE0QixFQUFFLENBQUM7UUFFM0MsK0JBQTBCLEdBQUcsV0FBVyxDQUFDLEVBQUUsQ0FBQywwQkFBMEIsRUFBRSxJQUFJLGNBQWMsRUFBRSxDQUFDLENBQUM7UUFDOUYsbUJBQWMsR0FBRyxXQUFXLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNuRCxrQkFBYSxHQUFHLFdBQVcsQ0FBQyxFQUFFLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2pELHdCQUFtQixHQUFHLFdBQVcsQ0FBQyxFQUFFLENBQUMsa0JBQWtCLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFHN0QsdUJBQWtCLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsQ0FBQztRQU1oRSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQzlCLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzdCLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDbkMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRU0sR0FBRyxDQUFDLFFBQStCO1FBQ3RDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7OytHQXpCUSxrQkFBa0I7bUhBQWxCLGtCQUFrQjsyRkFBbEIsa0JBQWtCO2tCQUQ5QixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQW5ndWxhclxyXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG4vLyBNb2RlbGxpXHJcbmltcG9ydCB7IEVuZHBvaW50RGVmIH0gZnJvbSAnLi9FbmRwb2ludERlZic7XHJcbmltcG9ydCB7IEpvYlByb2dyZXNzRHRvIH0gZnJvbSAnLi9Kb2JQcm9ncmVzc0R0byc7XHJcblxyXG4vKipcclxuICogQ2xhc3NlIGJhc2UgZGEgZXN0ZW5kZXJlIGNvbiBsYSBkZWZpbml6aW9uZSBkZWdsaSBFbmRwb2ludCBzdXBwb3J0YXRpIGRhbGwnYXBwbGljYXppb25lXHJcbiAqL1xyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBCYXNlTWVzc2FnZVNlcnZpY2Uge1xyXG5cclxuICAgIHByaXZhdGUgZGVmaW5pdGlvbnM6IEVuZHBvaW50RGVmPGFueSwgYW55PltdID0gW107XHJcblxyXG4gICAgcHVibGljIElOX0pvYlByb2dyZXNzTm90aWZpY2F0aW9uID0gRW5kcG9pbnREZWYuSW4oXCJTZW5kUHJvZ3Jlc3NOb3RpZmljYXRpb25cIiwgbmV3IEpvYlByb2dyZXNzRHRvKCkpO1xyXG4gICAgcHVibGljIElOX1NlbmRWZXJzaW9uID0gRW5kcG9pbnREZWYuSW4oXCJTZW5kVmVyc2lvblwiLCBcIlwiKTtcclxuICAgIHB1YmxpYyBJTl9DbGVhckNhY2hlID0gRW5kcG9pbnREZWYuSW4oXCJDbGVhckNhY2hlXCIsIFwiXCIpO1xyXG4gICAgcHVibGljIElOX0NsZWFyUHJlZmVyZWNuZXMgPSBFbmRwb2ludERlZi5JbihcIkNsZWFyUHJlZmVyZWNuZXNcIiwgXCJcIik7XHJcblxyXG5cclxuICAgIHB1YmxpYyBPVVRfUXVlcnlKb2JTdGF0dXMgPSBFbmRwb2ludERlZi5PdXQoXCJRdWVyeUpvYlN0YXR1c1wiLCBudWxsKTtcclxuXHJcbiAgICAvKiogRW50cnlwb2ludCBjaGUgcmVzdGl0dWlzY2UgdHV0dGkgZ2xpIEVuZHBvaW50IGRlbGwnYXBwbGljYXppb25lLiBEYSBvdmVycmlkYXJlIHF1YWxvcmEgbm9uIHZlbmdhIHV0aWxpenphdG8gaWwgbWV0b2RvICoqYWRkKiogKi9cclxuICAgIHB1YmxpYyBnZXQgQWxsRGVmaW5pdGlvbnMoKTogRW5kcG9pbnREZWY8YW55LCBhbnk+W10geyByZXR1cm4gdGhpcy5kZWZpbml0aW9uczsgfVxyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHRoaXMuYWRkKHRoaXMuSU5fSm9iUHJvZ3Jlc3NOb3RpZmljYXRpb24pO1xyXG4gICAgICAgIHRoaXMuYWRkKHRoaXMuSU5fU2VuZFZlcnNpb24pO1xyXG4gICAgICAgIHRoaXMuYWRkKHRoaXMuSU5fQ2xlYXJDYWNoZSk7XHJcbiAgICAgICAgdGhpcy5hZGQodGhpcy5JTl9DbGVhclByZWZlcmVjbmVzKTtcclxuICAgICAgICB0aGlzLmFkZCh0aGlzLk9VVF9RdWVyeUpvYlN0YXR1cyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFkZChlbmRwb2ludDogRW5kcG9pbnREZWY8YW55LCBhbnk+KSB7XHJcbiAgICAgICAgdGhpcy5kZWZpbml0aW9ucy5wdXNoKGVuZHBvaW50KTtcclxuICAgIH1cclxufSJdfQ==
35
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmFzZU1lc3NhZ2VTZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2lnbmFsci1ub3RpZmljYXRpb25zL3NyYy9saWIvbW9kZWxzL0Jhc2VNZXNzYWdlU2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxVQUFVO0FBQ1YsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxVQUFVO0FBQ1YsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7O0FBRWxEOztHQUVHO0FBRUgsTUFBTSxPQUFPLGtCQUFrQjtJQVkzQixvSUFBb0k7SUFDcEksSUFBVyxjQUFjLEtBQThCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7SUFFakY7UUFiUSxnQkFBVyxHQUE0QixFQUFFLENBQUM7UUFFM0MsK0JBQTBCLEdBQUcsV0FBVyxDQUFDLEVBQUUsQ0FBQywwQkFBMEIsRUFBRSxJQUFJLGNBQWMsRUFBRSxDQUFDLENBQUM7UUFDOUYsbUJBQWMsR0FBRyxXQUFXLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNuRCxrQkFBYSxHQUFHLFdBQVcsQ0FBQyxFQUFFLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2pELHdCQUFtQixHQUFHLFdBQVcsQ0FBQyxFQUFFLENBQUMsa0JBQWtCLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFHN0QsdUJBQWtCLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsQ0FBQztRQU1oRSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQzlCLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzdCLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDbkMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRU0sR0FBRyxDQUFDLFFBQStCO1FBQ3RDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7K0dBekJRLGtCQUFrQjttSEFBbEIsa0JBQWtCOzs0RkFBbEIsa0JBQWtCO2tCQUQ5QixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQW5ndWxhclxyXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG4vLyBNb2RlbGxpXHJcbmltcG9ydCB7IEVuZHBvaW50RGVmIH0gZnJvbSAnLi9FbmRwb2ludERlZic7XHJcbmltcG9ydCB7IEpvYlByb2dyZXNzRHRvIH0gZnJvbSAnLi9Kb2JQcm9ncmVzc0R0byc7XHJcblxyXG4vKipcclxuICogQ2xhc3NlIGJhc2UgZGEgZXN0ZW5kZXJlIGNvbiBsYSBkZWZpbml6aW9uZSBkZWdsaSBFbmRwb2ludCBzdXBwb3J0YXRpIGRhbGwnYXBwbGljYXppb25lXHJcbiAqL1xyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBCYXNlTWVzc2FnZVNlcnZpY2Uge1xyXG5cclxuICAgIHByaXZhdGUgZGVmaW5pdGlvbnM6IEVuZHBvaW50RGVmPGFueSwgYW55PltdID0gW107XHJcblxyXG4gICAgcHVibGljIElOX0pvYlByb2dyZXNzTm90aWZpY2F0aW9uID0gRW5kcG9pbnREZWYuSW4oXCJTZW5kUHJvZ3Jlc3NOb3RpZmljYXRpb25cIiwgbmV3IEpvYlByb2dyZXNzRHRvKCkpO1xyXG4gICAgcHVibGljIElOX1NlbmRWZXJzaW9uID0gRW5kcG9pbnREZWYuSW4oXCJTZW5kVmVyc2lvblwiLCBcIlwiKTtcclxuICAgIHB1YmxpYyBJTl9DbGVhckNhY2hlID0gRW5kcG9pbnREZWYuSW4oXCJDbGVhckNhY2hlXCIsIFwiXCIpO1xyXG4gICAgcHVibGljIElOX0NsZWFyUHJlZmVyZWNuZXMgPSBFbmRwb2ludERlZi5JbihcIkNsZWFyUHJlZmVyZWNuZXNcIiwgXCJcIik7XHJcblxyXG5cclxuICAgIHB1YmxpYyBPVVRfUXVlcnlKb2JTdGF0dXMgPSBFbmRwb2ludERlZi5PdXQoXCJRdWVyeUpvYlN0YXR1c1wiLCBudWxsKTtcclxuXHJcbiAgICAvKiogRW50cnlwb2ludCBjaGUgcmVzdGl0dWlzY2UgdHV0dGkgZ2xpIEVuZHBvaW50IGRlbGwnYXBwbGljYXppb25lLiBEYSBvdmVycmlkYXJlIHF1YWxvcmEgbm9uIHZlbmdhIHV0aWxpenphdG8gaWwgbWV0b2RvICoqYWRkKiogKi9cclxuICAgIHB1YmxpYyBnZXQgQWxsRGVmaW5pdGlvbnMoKTogRW5kcG9pbnREZWY8YW55LCBhbnk+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 }); }
22
25
  }
23
- SignalrNotificationsModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SignalrNotificationsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
24
- SignalrNotificationsModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.9", ngImport: i0, type: SignalrNotificationsModule });
25
- SignalrNotificationsModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SignalrNotificationsModule });
26
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SignalrNotificationsModule, decorators: [{
26
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SignalrNotificationsModule, decorators: [{
27
27
  type: NgModule
28
28
  }] });
29
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbmFsci1ub3RpZmljYXRpb25zLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3NpZ25hbHItbm90aWZpY2F0aW9ucy9zcmMvbGliL3NpZ25hbHItbm90aWZpY2F0aW9ucy5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFFBQVEsRUFBdUIsTUFBTSxlQUFlLENBQUM7QUFFOUQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDakUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDdkUsT0FBTyxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsY0FBYyxFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLE1BQU0sVUFBVSxDQUFDOztBQUdqSCxNQUFNLE9BQU8sMEJBQTBCO0lBQ3JDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBeUM7UUFDdEQsT0FBTztZQUNMLFFBQVEsRUFBRSwwQkFBMEI7WUFDcEMsU0FBUyxFQUFFO2dCQUNULG9CQUFvQjtnQkFDcEIsRUFBRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxjQUFjLElBQUksa0JBQWtCLEVBQUU7Z0JBQ3ZGLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRTtnQkFDeEQsRUFBRSxPQUFPLEVBQUUsZUFBZSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsT0FBTyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFO2dCQUN4RixFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxTQUFTLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUU7Z0JBQzVGLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLGNBQWMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRTtnQkFDcEcsRUFBRSxPQUFPLEVBQUUsY0FBYyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsYUFBYSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFO2dCQUNuRyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxPQUFPLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUU7YUFDbkY7U0FDRixDQUFDO0lBQ0osQ0FBQzs7dUhBZlUsMEJBQTBCO3dIQUExQiwwQkFBMEI7d0hBQTFCLDBCQUEwQjsyRkFBMUIsMEJBQTBCO2tCQUR0QyxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiXHJcbmltcG9ydCB7IE5nTW9kdWxlLCBNb2R1bGVXaXRoUHJvdmlkZXJzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFNpZ25hbHJOb3RpZmljYXRpb25zTW9kdWxlQ29uZmlnIH0gZnJvbSAnLi9jb25maWcvU2lnbmFsck5vdGlmaWNhdGlvbnNNb2R1bGVDb25maWcnO1xyXG5pbXBvcnQgeyBCYXNlTWVzc2FnZVNlcnZpY2UgfSBmcm9tICcuL21vZGVscy9CYXNlTWVzc2FnZVNlcnZpY2UnO1xyXG5pbXBvcnQgeyBOb3RpZmljYXRpb25zU2VydmljZSB9IGZyb20gJy4vc2lnbmFsci1ub3RpZmljYXRpb25zLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBFTkRQT0lOVF9VUkwsIFNJR05BTFJfRU5BQkxFRCwgU0dSX0RFQlVHX01PREUsIE1FU1NBR0VfUEFDSywgQVVUT19SRUNPTk5FQ1QsIEFWT0lEX1dTIH0gZnJvbSAnLi90b2tlbnMnO1xyXG5cclxuQE5nTW9kdWxlKClcclxuZXhwb3J0IGNsYXNzIFNpZ25hbHJOb3RpZmljYXRpb25zTW9kdWxlIHtcclxuICBzdGF0aWMgZm9yUm9vdChjb25maWc/OiBTaWduYWxyTm90aWZpY2F0aW9uc01vZHVsZUNvbmZpZyk6IE1vZHVsZVdpdGhQcm92aWRlcnM8U2lnbmFsck5vdGlmaWNhdGlvbnNNb2R1bGU+IHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIG5nTW9kdWxlOiBTaWduYWxyTm90aWZpY2F0aW9uc01vZHVsZSxcclxuICAgICAgcHJvdmlkZXJzOiBbXHJcbiAgICAgICAgTm90aWZpY2F0aW9uc1NlcnZpY2UsXHJcbiAgICAgICAgeyBwcm92aWRlOiBCYXNlTWVzc2FnZVNlcnZpY2UsIHVzZUNsYXNzOiBjb25maWc/Lm1lc3NhZ2VTZXJ2aWNlIHx8IEJhc2VNZXNzYWdlU2VydmljZSB9LFxyXG4gICAgICAgIHsgcHJvdmlkZTogRU5EUE9JTlRfVVJMLCB1c2VWYWx1ZTogY29uZmlnPy5lbmRwb2ludFVybCB9LFxyXG4gICAgICAgIHsgcHJvdmlkZTogU0lHTkFMUl9FTkFCTEVELCB1c2VWYWx1ZTogY29uZmlnPy5lbmFibGVkICE9IG51bGwgPyBjb25maWc/LmVuYWJsZWQgOiB0cnVlIH0sXHJcbiAgICAgICAgeyBwcm92aWRlOiBTR1JfREVCVUdfTU9ERSwgdXNlVmFsdWU6IGNvbmZpZz8uZGVidWdNb2RlICE9IG51bGwgPyBjb25maWc/LmRlYnVnTW9kZSA6IGZhbHNlIH0sXHJcbiAgICAgICAgeyBwcm92aWRlOiBNRVNTQUdFX1BBQ0ssIHVzZVZhbHVlOiBjb25maWc/LnVzZU1lc3NhZ2VQYWNrICE9IG51bGwgPyBjb25maWc/LnVzZU1lc3NhZ2VQYWNrIDogZmFsc2UgfSxcclxuICAgICAgICB7IHByb3ZpZGU6IEFVVE9fUkVDT05ORUNULCB1c2VWYWx1ZTogY29uZmlnPy5hdXRvUmVjb25uZWN0ICE9IG51bGwgPyBjb25maWc/LmF1dG9SZWNvbm5lY3QgOiB0cnVlIH0sXHJcbiAgICAgICAgeyBwcm92aWRlOiBBVk9JRF9XUywgdXNlVmFsdWU6IGNvbmZpZz8uYXZvaWRXcyAhPSBudWxsID8gY29uZmlnPy5hdm9pZFdzIDogZmFsc2UgfSxcclxuICAgICAgXVxyXG4gICAgfTtcclxuICB9XHJcbn0iXX0=
29
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbmFsci1ub3RpZmljYXRpb25zLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3NpZ25hbHItbm90aWZpY2F0aW9ucy9zcmMvbGliL3NpZ25hbHItbm90aWZpY2F0aW9ucy5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFFBQVEsRUFBdUIsTUFBTSxlQUFlLENBQUM7QUFFOUQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDakUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDdkUsT0FBTyxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsY0FBYyxFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLE1BQU0sVUFBVSxDQUFDOztBQUdqSCxNQUFNLE9BQU8sMEJBQTBCO0lBQ3JDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBeUM7UUFDdEQsT0FBTztZQUNMLFFBQVEsRUFBRSwwQkFBMEI7WUFDcEMsU0FBUyxFQUFFO2dCQUNULG9CQUFvQjtnQkFDcEIsRUFBRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxjQUFjLElBQUksa0JBQWtCLEVBQUU7Z0JBQ3ZGLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRTtnQkFDeEQsRUFBRSxPQUFPLEVBQUUsZUFBZSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsT0FBTyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFO2dCQUN4RixFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxTQUFTLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUU7Z0JBQzVGLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLGNBQWMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRTtnQkFDcEcsRUFBRSxPQUFPLEVBQUUsY0FBYyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsYUFBYSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFO2dCQUNuRyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxPQUFPLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUU7YUFDbkY7U0FDRixDQUFDO0lBQ0osQ0FBQzsrR0FmVSwwQkFBMEI7Z0hBQTFCLDBCQUEwQjtnSEFBMUIsMEJBQTBCOzs0RkFBMUIsMEJBQTBCO2tCQUR0QyxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiXHJcbmltcG9ydCB7IE5nTW9kdWxlLCBNb2R1bGVXaXRoUHJvdmlkZXJzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFNpZ25hbHJOb3RpZmljYXRpb25zTW9kdWxlQ29uZmlnIH0gZnJvbSAnLi9jb25maWcvU2lnbmFsck5vdGlmaWNhdGlvbnNNb2R1bGVDb25maWcnO1xyXG5pbXBvcnQgeyBCYXNlTWVzc2FnZVNlcnZpY2UgfSBmcm9tICcuL21vZGVscy9CYXNlTWVzc2FnZVNlcnZpY2UnO1xyXG5pbXBvcnQgeyBOb3RpZmljYXRpb25zU2VydmljZSB9IGZyb20gJy4vc2lnbmFsci1ub3RpZmljYXRpb25zLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBFTkRQT0lOVF9VUkwsIFNJR05BTFJfRU5BQkxFRCwgU0dSX0RFQlVHX01PREUsIE1FU1NBR0VfUEFDSywgQVVUT19SRUNPTk5FQ1QsIEFWT0lEX1dTIH0gZnJvbSAnLi90b2tlbnMnO1xyXG5cclxuQE5nTW9kdWxlKClcclxuZXhwb3J0IGNsYXNzIFNpZ25hbHJOb3RpZmljYXRpb25zTW9kdWxlIHtcclxuICBzdGF0aWMgZm9yUm9vdChjb25maWc/OiBTaWduYWxyTm90aWZpY2F0aW9uc01vZHVsZUNvbmZpZyk6IE1vZHVsZVdpdGhQcm92aWRlcnM8U2lnbmFsck5vdGlmaWNhdGlvbnNNb2R1bGU+IHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIG5nTW9kdWxlOiBTaWduYWxyTm90aWZpY2F0aW9uc01vZHVsZSxcclxuICAgICAgcHJvdmlkZXJzOiBbXHJcbiAgICAgICAgTm90aWZpY2F0aW9uc1NlcnZpY2UsXHJcbiAgICAgICAgeyBwcm92aWRlOiBCYXNlTWVzc2FnZVNlcnZpY2UsIHVzZUNsYXNzOiBjb25maWc/Lm1lc3NhZ2VTZXJ2aWNlIHx8IEJhc2VNZXNzYWdlU2VydmljZSB9LFxyXG4gICAgICAgIHsgcHJvdmlkZTogRU5EUE9JTlRfVVJMLCB1c2VWYWx1ZTogY29uZmlnPy5lbmRwb2ludFVybCB9LFxyXG4gICAgICAgIHsgcHJvdmlkZTogU0lHTkFMUl9FTkFCTEVELCB1c2VWYWx1ZTogY29uZmlnPy5lbmFibGVkICE9IG51bGwgPyBjb25maWc/LmVuYWJsZWQgOiB0cnVlIH0sXHJcbiAgICAgICAgeyBwcm92aWRlOiBTR1JfREVCVUdfTU9ERSwgdXNlVmFsdWU6IGNvbmZpZz8uZGVidWdNb2RlICE9IG51bGwgPyBjb25maWc/LmRlYnVnTW9kZSA6IGZhbHNlIH0sXHJcbiAgICAgICAgeyBwcm92aWRlOiBNRVNTQUdFX1BBQ0ssIHVzZVZhbHVlOiBjb25maWc/LnVzZU1lc3NhZ2VQYWNrICE9IG51bGwgPyBjb25maWc/LnVzZU1lc3NhZ2VQYWNrIDogZmFsc2UgfSxcclxuICAgICAgICB7IHByb3ZpZGU6IEFVVE9fUkVDT05ORUNULCB1c2VWYWx1ZTogY29uZmlnPy5hdXRvUmVjb25uZWN0ICE9IG51bGwgPyBjb25maWc/LmF1dG9SZWNvbm5lY3QgOiB0cnVlIH0sXHJcbiAgICAgICAgeyBwcm92aWRlOiBBVk9JRF9XUywgdXNlVmFsdWU6IGNvbmZpZz8uYXZvaWRXcyAhPSBudWxsID8gY29uZmlnPy5hdm9pZFdzIDogZmFsc2UgfSxcclxuICAgICAgXVxyXG4gICAgfTtcclxuICB9XHJcbn0iXX0=
@@ -31,7 +31,7 @@ export class NotificationsService {
31
31
  }
32
32
  async init() {
33
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.Debug : signalR.LogLevel.None };
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
35
  var builder = new signalR.HubConnectionBuilder().withUrl("/" + this.endpoint_url, pars);
36
36
  if (this.autoreconnect) {
37
37
  this.log(this.loc("Building SignalR Hub with Automatic Reconnection"));
@@ -220,10 +220,10 @@ export class NotificationsService {
220
220
  loc(message) {
221
221
  return message;
222
222
  }
223
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", 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 }); }
224
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NotificationsService }); }
223
225
  }
224
- NotificationsService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", 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 });
225
- NotificationsService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: NotificationsService });
226
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: NotificationsService, decorators: [{
226
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NotificationsService, decorators: [{
227
227
  type: Injectable
228
228
  }], ctorParameters: function () { return [{ type: i1.BaseMessageService }, { type: undefined, decorators: [{
229
229
  type: Inject,
@@ -244,4 +244,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
244
244
  type: Inject,
245
245
  args: [AUTO_RECONNECT]
246
246
  }] }]; } });
247
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbmFsci1ub3RpZmljYXRpb25zLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9zaWduYWxyLW5vdGlmaWNhdGlvbnMvc3JjL2xpYi9zaWduYWxyLW5vdGlmaWNhdGlvbnMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxVQUFVO0FBQ1YsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFbkQsa0NBQWtDO0FBQ2xDLE9BQU8sS0FBSyxPQUFPLE1BQU0sb0JBQW9CLENBQUM7QUFDOUMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDeEQsT0FBTyxFQUFjLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM1RCxPQUFPLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFLbkUsT0FBTyxFQUFFLGNBQWMsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLGVBQWUsRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLE1BQU0sVUFBVSxDQUFDOzs7QUFFakgsc0hBQXNIO0FBRXRILE1BQU0sT0FBTyxvQkFBb0I7SUFXNUIsMEJBQTBCO0lBQzNCLFlBQW9CLFVBQThCLEVBQWdDLFlBQW9CLEVBQWdDLE9BQWdCLEVBQTZCLE9BQWdCLEVBQW1DLE9BQWdCLEVBQWtDLEtBQWMsRUFBa0MsYUFBc0I7UUFBMVUsZUFBVSxHQUFWLFVBQVUsQ0FBb0I7UUFBZ0MsaUJBQVksR0FBWixZQUFZLENBQVE7UUFBZ0MsWUFBTyxHQUFQLE9BQU8sQ0FBUztRQUE2QixZQUFPLEdBQVAsT0FBTyxDQUFTO1FBQW1DLFlBQU8sR0FBUCxPQUFPLENBQVM7UUFBa0MsVUFBSyxHQUFMLEtBQUssQ0FBUztRQUFrQyxrQkFBYSxHQUFiLGFB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Qzs7aUhBMU9RLG9CQUFvQixvREFZK0IsWUFBWSxhQUF3QyxZQUFZLGFBQXFDLFFBQVEsYUFBb0MsZUFBZSxhQUFvQyxjQUFjLGFBQWtDLGNBQWM7cUhBWnJULG9CQUFvQjsyRkFBcEIsb0JBQW9CO2tCQURoQyxVQUFVOzswQkFhOEMsTUFBTTsyQkFBQyxZQUFZOzswQkFBaUMsTUFBTTsyQkFBQyxZQUFZOzswQkFBOEIsTUFBTTsyQkFBQyxRQUFROzswQkFBNkIsTUFBTTsyQkFBQyxlQUFlOzswQkFBNkIsTUFBTTsyQkFBQyxjQUFjOzswQkFBMkIsTUFBTTsyQkFBQyxjQUFjIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQW5ndWxhclxyXG5pbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3QgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5cclxuLy8gRGlyZXR0aXZlLCBDb21wb25lbnRpLCBMaWJyZXJpZVxyXG5pbXBvcnQgKiBhcyBzaWduYWxSIGZyb20gJ0BtaWNyb3NvZnQvc2lnbmFscic7XHJcbmltcG9ydCB7IEh1YkNvbm5lY3Rpb25TdGF0ZSB9IGZyb20gXCJAbWljcm9zb2Z0L3NpZ25hbHJcIjtcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCwgRU1QVFksIGZyb20sIG9mIH0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHsgY2F0Y2hFcnJvciwgY29uY2F0TWFwLCBkZWxheSwgdGFwIH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XHJcblxyXG4vLyBNb2RlbGxpXHJcbmltcG9ydCB7IEJhc2VNZXNzYWdlU2VydmljZSB9IGZyb20gJy4vbW9kZWxzL0Jhc2VNZXNzYWdlU2VydmljZSc7XHJcbmltcG9ydCB7IEVuZHBvaW50RGVmIH0gZnJvbSAnLi9tb2RlbHMvRW5kcG9pbnREZWYnO1xyXG5pbXBvcnQgeyBTR1JfREVCVUdfTU9ERSwgRU5EUE9JTlRfVVJMLCBNRVNTQUdFX1BBQ0ssIFNJR05BTFJfRU5BQkxFRCwgQVVUT19SRUNPTk5FQ1QsIEFWT0lEX1dTIH0gZnJvbSBcIi4vdG9rZW5zXCI7XHJcblxyXG4vKiogU2Vydml6aW8gY2hlIGdlc3Rpc2NlIGxhIGNvbXVuaWNhemlvbmUgY29uIHVuIEh1YiBTaWduYWxSIGluIGJhc2UgYWxsZSBjb25maWd1cmF6aW9uaSBmb3JuaXRlIGRhbGwnYXBwbGljYXppb25lICovXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIE5vdGlmaWNhdGlvbnNTZXJ2aWNlIHtcclxuXHJcbiAgICAvKiogQ2FjaGUgZGVnbGkgT2JzZXJ2YWJsZSBnZW5lcmF0aSBpbiBiYXNlIGFnbGkgRW5kcG9pbnQgZGlzcG9uaWJpbGkgKi9cclxuICAgIHByaXZhdGUgbm90aWZpY2F0aW9ucyQ6IHsgW2luZGV4OiBzdHJpbmddOiBTdWJqZWN0PGFueT4gfSA9IHt9O1xyXG5cclxuICAgIC8qKiBDb25uZXNzaW9uZSBTaWduYWxyICovXHJcbiAgICBwcml2YXRlIGNvbm5lY3Rpb246IHNpZ25hbFIuSHViQ29ubmVjdGlvbjtcclxuXHJcbiAgICAgLyoqIENvZGEgZGkgY2hpYW1hdGUgZGEgcmVjdXBlcmFyZSBxdWFuZG8gbGEgY29ubmVzc2lvbmUgdmllbmUgZmluYWxtZW50ZSBhcGVydGEgKi9cclxuICAgICBwcml2YXRlIFJlcXVlc3RzVG9SZWNvdmVyOiB7IGl0ZW06IEVuZHBvaW50RGVmPGFueSwgYW55PiwgZHRvOiBhbnkgfVtdID0gW107XHJcblxyXG4gICAgIC8qKiBAaWdub3JlIENvc3RydXR0b3JlICovXHJcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIE1lc3NhZ2VEZWY6IEJhc2VNZXNzYWdlU2VydmljZSwgQEluamVjdChFTkRQT0lOVF9VUkwpIHByaXZhdGUgZW5kcG9pbnRfdXJsOiBzdHJpbmcsIEBJbmplY3QoTUVTU0FHRV9QQUNLKSBwcml2YXRlIG1zZ3BhY2s6IGJvb2xlYW4sICBASW5qZWN0KEFWT0lEX1dTKSBwcml2YXRlIGF2b2lkV3M6IGJvb2xlYW4sIEBJbmplY3QoU0lHTkFMUl9FTkFCTEVEKSBwcml2YXRlIGVuYWJsZWQ6IGJvb2xlYW4sIEBJbmplY3QoU0dSX0RFQlVHX01PREUpIHByaXZhdGUgZGVidWc6IGJvb2xlYW4sIEBJbmplY3QoQVVUT19SRUNPTk5FQ1QpIHByaXZhdGUgYXV0b3JlY29ubmVjdDogYm9vbGVhbikge1xyXG4gICAgICAgIGlmICghdGhpcy5lbmFibGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nKHRoaXMubG9jKFwiU2lnbmFsUiB3b24ndCBiZSBlbmFibGVkIGFzIHBlciBjb25maWd1cmF0aW9uXCIpKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5pbml0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhc3luYyBpbml0KCl7XHJcbiAgICAgICAgdGhpcy5NZXNzYWdlRGVmLkFsbERlZmluaXRpb25zLmZvckVhY2goZGVmID0+IHsgdGhpcy5ub3RpZmljYXRpb25zJFtkZWYuZW5kcG9pbnRdID0gbmV3IFN1YmplY3Q8dHlwZW9mIGRlZi5pblR5cGVEZWZhdWx0PigpOyB9KTtcclxuXHJcbiAgICAgICAgbGV0IHBhcnM6IHNpZ25hbFIuSUh0dHBDb25uZWN0aW9uT3B0aW9ucyA9IHsgc2tpcE5lZ290aWF0aW9uOiB0aGlzLmF2b2lkV3MgPyBmYWxzZSA6IHRydWUsIHRyYW5zcG9ydDogdGhpcy5hdm9pZFdzID8gc2lnbmFsUi5IdHRwVHJhbnNwb3J0VHlwZS5Mb25nUG9sbGluZyA6IHNpZ25hbFIuSHR0cFRyYW5zcG9ydFR5cGUuV2ViU29ja2V0cywgbG9nZ2VyOiB0aGlzLmRlYnVnID8gc2lnbmFsUi5Mb2dMZXZlbC5EZWJ1ZyA6IHNpZ25hbFIuTG9nTGV2ZWwuTm9uZSB9O1xyXG4gICAgICAgIHZhciBidWlsZGVyID0gbmV3IHNpZ25hbFIuSHViQ29ubmVjdGlvbkJ1aWxkZXIoKS53aXRoVXJsKFwiL1wiICsgdGhpcy5lbmRwb2ludF91cmwsIHBhcnMpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5hdXRvcmVjb25uZWN0KSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nKHRoaXMubG9jKFwiQnVpbGRpbmcgU2lnbmFsUiBIdWIgd2l0aCBBdXRvbWF0aWMgUmVjb25uZWN0aW9uXCIpKTtcclxuICAgICAgICAgICAgLy8gMTAwIHRlbnRhdGl2aSBkaSByaWNvbm5lc3Npb25lLCAxIG9nbmkgNSBzZWNvbmRpXHJcbiAgICAgICAgICAgIGJ1aWxkZXIgPSBidWlsZGVyLndpdGhBdXRvbWF0aWNSZWNvbm5lY3QobmV3IEFycmF5KDEwMCkuZmlsbCg1ICogMTAwMCkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMubXNncGFjaykge1xyXG4gICAgICAgICAgICB0aGlzLmxvZyh0aGlzLmxvYyhcIkJ1aWxkaW5nIFNpZ25hbFIgSHViIHdpdGggTWVzc2FnZVBhY2sgcHJvdG9jb2xcIikpO1xyXG4gICAgICAgICAgICB2YXIgbXBocE1vZHVsZSA9IGF3YWl0IGltcG9ydChcIkBtaWNyb3NvZnQvc2lnbmFsci1wcm90b2NvbC1tc2dwYWNrXCIpO1xyXG4gICAgICAgICAgICBidWlsZGVyID0gYnVpbGRlci53aXRoSHViUHJvdG9jb2wobmV3IG1waHBNb2R1bGUuTWVzc2FnZVBhY2tIdWJQcm90b2NvbCgpKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5jb25uZWN0aW9uID0gYnVpbGRlci5idWlsZCgpO1xyXG4gICAgICAgIHRoaXMuY29ubmVjdCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLlJlcXVlc3RzVG9SZWNvdmVyLmxlbmd0aCA9PSAwKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLlJlcXVlc3RzVG9SZWNvdmVyLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZyh0aGlzLmxvYyhcIlJlY292ZXJpbmcgcmVxdWVzdCB0byBFbmRwb2ludFwiKSArIFwiIFwiICsgdGhpcy5SZXF1ZXN0c1RvUmVjb3ZlcltpXS5pdGVtLmVuZHBvaW50KVxyXG4gICAgICAgICAgICAgICAgdGhpcy5zZW5kKHRoaXMuUmVxdWVzdHNUb1JlY292ZXJbaV0uaXRlbSwgdGhpcy5SZXF1ZXN0c1RvUmVjb3ZlcltpXS5kdG8pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLlJlcXVlc3RzVG9SZWNvdmVyID0gW107XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFZmZldHR1YSBsYSBjb25uZXNzaW9uZSBhbGwnSHViIFNpZ25hbHIgZSByZWdpc3RyYSB0dXR0aSBnbGkgRW5kcG9pbnQgcGVyIGN1aSBpbCBCYWNrZW5kIGNvbXVuaWNhIGNvbiBpbCBGcm9udGVuZCBzdWxsYSAqKmNvbm5lY3Rpb24qKlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGNvbm5lY3Qob25Db25uZWN0ZWQ/OiAoKSA9PiB2b2lkKSB7XHJcbiAgICAgICAgdGhpcy5jb25uZWN0aW9uLnN0YXJ0KCkuY2F0Y2goZXJyID0+IGNvbnNvbGUubG9nKGVycikpLnRoZW4oXyA9PiBvbkNvbm5lY3RlZD8uKCkpO1xyXG4gICAgICAgIHRoaXMuTWVzc2FnZURlZi5BbGxEZWZpbml0aW9ucy5mb3JFYWNoKGQgPT4ge1xyXG4gICAgICAgICAgICAvL1JlZ2lzdHJvIHNvbG8gbGUgY29zZSBkaSBJTiwgcXVlbGxlIGRpIG91dCBzb25vIGNoaWFtYXRlIGNoZSBmYWNjaW8gaW8gYWwgQkUgcXVpbmRpIG5vbiBzZXJ2b25vXHJcbiAgICAgICAgICAgIGlmIChkLmluVHlwZURlZmF1bHQgIT09IG51bGwgJiYgKGQub3V0VHlwZURlZmF1bHQgPT09IG51bGwgfHwgZC5vdXRUeXBlRGVmYXVsdCA9PT0gdW5kZWZpbmVkKSlcclxuICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvbi5vbihkLmVuZHBvaW50LCAobWVzc2FnZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nKHRoaXMubG9jKFwiUmVxdWVzdCByZWNlaXZlZCBmcm9tIHRoZSBzZXJ2ZXIgZm9yIGVuZHBvaW50XCIpICsgXCIgJ1wiICsgZC5lbmRwb2ludCArIFwiJzogXCIgKyAobWVzc2FnZSA/IHRoaXMuc3Vic3RyaW5nTG9nKEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpKTogXCJbTm8gbWVzc2FnZV1cIikpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9ucyRbZC5lbmRwb2ludF0ubmV4dChtZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZyh0aGlzLmxvYyhcIlJlZnVzaW5nIHRvIHJlZ2lzdGVyIGVuZHBvaW50XCIpICsgXCIgXCIgKyBkLmVuZHBvaW50ICsgXCIgXCIgKyB0aGlzLmxvYyhcImJlY2F1c2UgaXQgaXMgbm90IGRlY2xhcmVkIGFzIElOIC0gT05MWVwiKSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFZmZldHR1YSB2ZXJpZmljaGUgc3VsbGEgY29ubmVzc2lvbmUgZSwgaW4gY2FzbyBub24gZm9zc2UgY29sbGVnYXRhLCB0ZW50YSBkaSByaWNvbm5ldHRlcmxhXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPCdPSycgfCAnS08nIHwgJ05PLU9QJz59ICdPSycgU2UgbGEgY29ubmVzc2lvbmUgw6ggZ2nDoCBjb25uZXNzYSBvIMOoIHN0YXRhIHJpY29ubmVzc2EgY29uIHN1Y2Nlc3NvLCAnS08nIFNlIG5vbiDDqCBzdGF0byBwb3NzaWJpbGUgcmljb25uZXR0ZXJlIFxyXG4gICAgICogdW5hIGNvbm5lc3Npb25lIGRpc2Nvbm5lc3NhLCAnTk8tT1AnIHNlIGxhIGNvbm5lc2lzb25lIMOoIGluIHVubyBzdGF0byBpbnRlcm1lZGlvIGNoZSBub24gcHXDsiBlc3NlcmUgbW9kaWZpY2F0b1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZW5zdXJlQ29ubmVjdGVkKCk6IFByb21pc2U8J09LJyB8ICdLTycgfCAnTk8tT1AnPiB7XHJcbiAgICAgICAgaWYgKHRoaXMuY29ubmVjdGlvbi5zdGF0ZSA9PSBIdWJDb25uZWN0aW9uU3RhdGUuRGlzY29ubmVjdGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nKHRoaXMubG9jKFwiQ29ubmVjdGlvbiBsb3N0IG9yIG1pc3NpbmcsIHJlY29ubmVjdGluZy4uLlwiKSk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9uLnN0YXJ0KClcclxuICAgICAgICAgICAgICAgIC50aGVuKF8gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoXCJPS1wiKTtcclxuICAgICAgICAgICAgICAgIH0sIF8gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nKHRoaXMubG9jKFwiQ2Fubm90IHJlY29ubmVjdCBTaWduYWxSLCBmcm9udGVuZCBIVUIgb2ZmbGluZVwiKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShcIktPXCIpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuY29ubmVjdGlvbi5zdGF0ZSA9PSBIdWJDb25uZWN0aW9uU3RhdGUuQ29ubmVjdGVkKVxyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFwiT0tcIik7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFwiTk8tT1BcIik7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW52aWEgdW4gbWVzc2FnZ2lvIGFsbCdIdWIgZGVsIEJhY2tlbmRcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtFbmRwb2ludERlZjxhbnksIFRPdXQ+fSBpdGVtIEVuZHBvaW50IGRhIGNvbnRhdHRhcmVcclxuICAgICAqIEBwYXJhbSB7VE91dH0gZHRvIER0byBkYSBpbnZpYXJlIGFsbCdFbmRwb2ludFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2VuZDxUT3V0PihpdGVtOiBFbmRwb2ludERlZjxhbnksIFRPdXQ+LCBkdG86IFRPdXQpIHtcclxuICAgICAgICBpZiAoIXRoaXMuY29ubmVjdGlvbikge1xyXG4gICAgICAgICAgICB0aGlzLlJlcXVlc3RzVG9SZWNvdmVyLnB1c2goeyBpdGVtLCBkdG8gfSk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5lbmFibGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nKHRoaXMubG9jKFwiU2VuZCByZXF1ZXN0IGlnbm9yZWQgYmVjYXVzZSBTaWduYWxSIGlzIG5vdCBhY3RpdmUgYnkgY29uZmlndXJhdGlvblwiKSk7XHJcbiAgICAgICAgICAgIHJldHVybiBFTVBUWTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb24uc3RhdGUgPT0gSHViQ29ubmVjdGlvblN0YXRlLkNvbm5lY3RpbmcgfHwgdGhpcy5jb25uZWN0aW9uLnN0YXRlID09IEh1YkNvbm5lY3Rpb25TdGF0ZS5SZWNvbm5lY3RpbmcgfHwgdGhpcy5jb25uZWN0aW9uLnN0YXRlID09IEh1YkNvbm5lY3Rpb25TdGF0ZS5EaXNjb25uZWN0aW5nKSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nKHRoaXMubG9jKFwiU2VuZCByZXF1ZXN0IHNlbnQgYmVmb3JlIGEgY29ubmVjdGlvbiB3YXMgaW4gc3RhYmxlIFN0YXRlLCB3YWl0aW5nIDEgc2Vjb25kIGFuZCByZXRyeWluZ1wiKSk7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyB0aGlzLnNlbmQoaXRlbSwgZHRvKTsgfSwgMTAwMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuY29ubmVjdGlvbi5zdGF0ZSA9PSBIdWJDb25uZWN0aW9uU3RhdGUuRGlzY29ubmVjdGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZW5zdXJlQ29ubmVjdGVkKCkudGhlbih0ID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICh0ID09IFwiS09cIikgdGhpcy5sb2codGhpcy5sb2MoXCJFUlJPUlMgb24gcmVjb25uZWN0aW5nIGJlZm9yZSByZXRyeWluZyBhIHNlbmQgY29tbWFuZC4gU2VudCBtZXNzYWdlIFdJTEwgQkUgTE9TVFwiKSk7XHJcbiAgICAgICAgICAgICAgICBlbHNlIHRoaXMuc2VuZChpdGVtLCBkdG8pO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uLnNlbmQoaXRlbS5lbmRwb2ludCwgZHRvKS50aGVuKF8gPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZGVidWcpXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5pbmZvKHRoaXMubG9jKFwiUmVxdWVzdCBzZW50IHRvIHNlcnZlclwiKSArIFwiIC0gXCIgKyBpdGVtLmVuZHBvaW50ICsgXCI6IFwiICsgdGhpcy5zdWJzdHJpbmdMb2coSlNPTi5zdHJpbmdpZnkoZHRvKSkpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbnZpYSB1biBtZXNzYWdnaW8gYWxsJ0h1YiBkZWwgQmFja2VuZCwgYXNwZXR0YW5kb3NpIHVuYSByaXNwb3N0YVxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge0VuZHBvaW50RGVmPFRPdXQsIFRJbj59IGl0ZW0gRW5kcG9pbnQgZGEgY29udGF0dGFyZVxyXG4gICAgICogQHBhcmFtIHtUT3V0fSBkdG8gRHRvIGRhIGludmlhcmUgYWxsJ0VuZHBvaW50XHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlPFRJbj59IE9ic2VydmFibGUgc3UgY3VpIGNpIHNpIHB1w7IgcmVnaXN0cmFyZSBwZXIgcmljZXZlcmUgaWwgcmlzdWx0YXRvIGRlbGxhIGNoaWFtYXRhXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBpbnZva2U8VE91dCwgVEluPihpdGVtOiBFbmRwb2ludERlZjxUT3V0LCBUSW4+LCBkdG86IFRPdXQpOiBPYnNlcnZhYmxlPFRJbj4ge1xyXG4gICAgICAgIGlmICghdGhpcy5lbmFibGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nKHRoaXMubG9jKFwiSW52b2tlIHJlcXVlc3QgaWdub3JlZCBiZWNhdXNlIFNpZ25hbFIgaXMgbm90IGFjdGl2ZSBieSBjb25maWd1cmF0aW9uXCIpKTtcclxuICAgICAgICAgICAgcmV0dXJuIEVNUFRZO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY29ubmVjdGlvbi5zdGF0ZSA9PSBIdWJDb25uZWN0aW9uU3RhdGUuQ29ubmVjdGluZyB8fCB0aGlzLmNvbm5lY3Rpb24uc3RhdGUgPT0gSHViQ29ubmVjdGlvblN0YXRlLlJlY29ubmVjdGluZyB8fCB0aGlzLmNvbm5lY3Rpb24uc3RhdGUgPT0gSHViQ29ubmVjdGlvblN0YXRlLkRpc2Nvbm5lY3RpbmcpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2codGhpcy5sb2MoXCJJbnZva2UgcmVxdWVzdCBzZW50IGJlZm9yZSBhIGNvbm5lY3Rpb24gd2FzIGluIHN0YWJsZSBTdGF0ZSwgd2FpdGluZyAxIHNlY29uZCBhbmQgcmV0cnlpbmdcIikpO1xyXG4gICAgICAgICAgICByZXR1cm4gb2YoKS5waXBlKGRlbGF5KDEwMDApLCBjb25jYXRNYXAoKCkgPT4gdGhpcy5pbnZva2UoaXRlbSwgZHRvKSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0aGlzLmNvbm5lY3Rpb24uc3RhdGUgPT0gSHViQ29ubmVjdGlvblN0YXRlLkRpc2Nvbm5lY3RlZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gZnJvbSh0aGlzLmVuc3VyZUNvbm5lY3RlZCgpKS5waXBlKGNvbmNhdE1hcCgocmVzKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAocmVzID09IFwiS09cIikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nKHRoaXMubG9jKFwiRVJST1JTIG9uIHJlY29ubmVjdGluZyBiZWZvcmUgcmV0cnlpbmcgYSBzZW5kIGNvbW1hbmQuIFNlbnQgbWVzc2FnZSBXSUxMIEJFIExPU1RcIikpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBFTVBUWTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgcmV0dXJuIHRoaXMuaW52b2tlKGl0ZW0sIGR0byk7XHJcbiAgICAgICAgICAgIH0pKVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZyb20odGhpcy5jb25uZWN0aW9uLmludm9rZTxUSW4+KGl0ZW0uZW5kcG9pbnQsIGR0bykpLnBpcGUoXHJcbiAgICAgICAgICAgICAgICB0YXAoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRlYnVnKSBjb25zb2xlLmxvZyh0aGlzLmxvYyhcIlJlcXVlc3QgaW52b2tlZCB0byBzZXJ2ZXJcIikgKyBcIiAtIFwiICsgaXRlbS5lbmRwb2ludCArIFwiOiBcIiArIHRoaXMuc3Vic3RyaW5nTG9nKEpTT04uc3RyaW5naWZ5KGR0bykpKTtcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSG9vayBwZXIgb3NzZXJ2YXJlIGkgZGF0aSBzcGVkaXRpIGFkIHVuIEVuZHBvaW50IGRhbCBCYWNrZW5kXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7RW5kcG9pbnREZWY8VEluLCBhbnk+fSBpdGVtIEVuZHBvaW50IHN1IGN1aSBhc2NvbHRhcmVcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMge09ic2VydmFibGU8VEluPn0gT2JzZXJ2YWJsZSBzdSBjdWkgY2kgc2kgcHXDsiByZWdpc3RyYXJlIHBlciByaWNldmVyZSBsJ29nZ2V0dG8gZ2VuZXJhdG8gYWQgb2duaSBjaGlhbWF0YSBkYWwgQmFja2VuZCBhbCBGcm9udGVuZFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb2JzZXJ2ZTxUSW4+KGl0ZW06IEVuZHBvaW50RGVmPFRJbiwgYW55Pik6IE9ic2VydmFibGU8VEluPiB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmVuYWJsZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2codGhpcy5sb2MoXCJPYnNlcnZlIHJlcXVlc3QgaWdub3JlZCBiZWNhdXNlIFNpZ25hbFIgaXMgbm90IGFjdGl2ZSBieSBjb25maWd1cmF0aW9uXCIpKTtcclxuICAgICAgICAgICAgcmV0dXJuIEVNUFRZO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5sb2codGhpcy5sb2MoXCJSZXR1cm5pbmcgb2JzZXJ2YWJsZSBmb3IgcmVxdWlyZWQgZW5kcG9pbnRcIikgKyBcIjogXCIgKyBpdGVtLmVuZHBvaW50KTtcclxuICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8VEluPj50aGlzLm5vdGlmaWNhdGlvbnMkW2l0ZW0uZW5kcG9pbnRdO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGlzY29ubmVzc2lvbmUgZGVsIHNpc3RlbWEgZGkgU2lnbmFsUlxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZTx2b2lkPn0gT2JzZXJ2YWJsZSBhIGN1aSByZWdpc3RyYXJzaSBjaGUgdmllbmUgY2hpYW1hdG8gcXVhbmRvIGxhIGRpc2Nvbm5lc3Npb25lIMOoIHRlcm1pbmF0YVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZGlzY29ubmVjdCgpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcclxuICAgICAgICAvL05PLU9QIHNlIG5vbiBhdHRpdm9cclxuICAgICAgICBpZiAoIXRoaXMuZW5hYmxlZCkge1xyXG4gICAgICAgICAgICB0aGlzLmxvZyh0aGlzLmxvYyhcIkRpc2Nvbm5lY3Rpb24gcmVxdWVzdCBpZ25vcmVkIGJlY2F1c2UgU2lnbmFsUiBpcyBub3QgYWN0aXZlIGJ5IGNvbmZpZ3VyYXRpb25cIikpO1xyXG4gICAgICAgICAgICByZXR1cm4gRU1QVFk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZnJvbSh0aGlzLmNvbm5lY3Rpb24uc3RvcCgpKS5waXBlKFxyXG4gICAgICAgICAgICBjYXRjaEVycm9yKChlcnIsIGNhdWdodCkgPT4geyBjb25zb2xlLmxvZyhlcnIpOyByZXR1cm4gb2YobnVsbCk7IH0pLFxyXG4gICAgICAgICAgICB0YXAoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2codGhpcy5sb2MoXCJEaXNjb25uZWN0aW9uIHJlcXVlc3QgaG9ub3JlZFwiKSk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRhZ2xpYSB1biBsb2cgdHJvcHBvIGx1bmdvXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IExvZyBkYSB0YWdsaWFyZVxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG1heGNoYXJzIE51bWVybyBtYXNzaW1vIGRpIGNhcmF0dGVyaSBkYSB0ZW5lcmVcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMge3N0cmluZ30gTG9nIHRhZ2xpYXRvXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgc3Vic3RyaW5nTG9nKHRleHQ6IHN0cmluZywgbWF4Y2hhcnM6IG51bWJlciA9IDEyMCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRleHQubGVuZ3RoID4gbWF4Y2hhcnMgPyB0ZXh0LnN1YnN0cigwLCBtYXhjaGFycykgKyBcIlsuLi5dXCIgOiB0ZXh0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3RhbXBhIHVuIGxvZyBhIGNvbnNvbGVcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgTWVzc2FnZ2lvIGRhIHN0YW1wYXJlXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgbG9nKG1lc3NhZ2U6IHN0cmluZykge1xyXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKVxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkBzaWduYWxyLW5vdGlmaWNhdGlvbnM6IFwiICsgbWVzc2FnZSlcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEhlbHBlciBkaSBsb2NhbGl6emF6aW9uZVxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSBNZXNzYWdnaW8gZGEgdHJhZHVycmVcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMge3N0cmluZ30gTWVzc2FnZ2lvIHRyYWRvdHRvXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgbG9jKG1lc3NhZ2U6IHN0cmluZykgOiBzdHJpbmd7XHJcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XHJcbiAgICB9XHJcbn0iXX0=
247
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbmFsci1ub3RpZmljYXRpb25zLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9zaWduYWxyLW5vdGlmaWNhdGlvbnMvc3JjL2xpYi9zaWduYWxyLW5vdGlmaWNhdGlvbnMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxVQUFVO0FBQ1YsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFbkQsa0NBQWtDO0FBQ2xDLE9BQU8sS0FBSyxPQUFPLE1BQU0sb0JBQW9CLENBQUM7QUFDOUMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDeEQsT0FBTyxFQUFjLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM1RCxPQUFPLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFLbkUsT0FBTyxFQUFFLGNBQWMsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLGVBQWUsRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLE1BQU0sVUFBVSxDQUFDOzs7QUFFakgsc0hBQXNIO0FBRXRILE1BQU0sT0FBTyxvQkFBb0I7SUFXNUIsMEJBQTBCO0lBQzNCLFlBQW9CLFVBQThCLEVBQWdDLFlBQW9CLEVBQWdDLE9BQWdCLEVBQTZCLE9BQWdCLEVBQW1DLE9BQWdCLEVBQWtDLEtBQWMsRUFBa0MsYUFBc0I7UUFBMVUsZUFBVSxHQUFWLFVBQVUsQ0FBb0I7UUFBZ0MsaUJBQVksR0FBWixZQUFZLENBQVE7UUFBZ0MsWUFBTyxHQUFQLE9BQU8sQ0FBUztRQUE2QixZQUFPLEdBQVAsT0FBTyxDQUFTO1FBQW1DLFlBQU8sR0FBUCxPQUFPLENBQVM7UUFBa0MsVUFBSyxHQUFMLEtBQUssQ0FBUztRQUFrQyxrQkFBYSxHQUFiLGFB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QzsrR0ExT1Esb0JBQW9CLG9EQVkrQixZQUFZLGFBQXdDLFlBQVksYUFBcUMsUUFBUSxhQUFvQyxlQUFlLGFBQW9DLGNBQWMsYUFBa0MsY0FBYzttSEFaclQsb0JBQW9COzs0RkFBcEIsb0JBQW9CO2tCQURoQyxVQUFVOzswQkFhOEMsTUFBTTsyQkFBQyxZQUFZOzswQkFBaUMsTUFBTTsyQkFBQyxZQUFZOzswQkFBOEIsTUFBTTsyQkFBQyxRQUFROzswQkFBNkIsTUFBTTsyQkFBQyxlQUFlOzswQkFBNkIsTUFBTTsyQkFBQyxjQUFjOzswQkFBMkIsTUFBTTsyQkFBQyxjQUFjIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQW5ndWxhclxyXG5pbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3QgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5cclxuLy8gRGlyZXR0aXZlLCBDb21wb25lbnRpLCBMaWJyZXJpZVxyXG5pbXBvcnQgKiBhcyBzaWduYWxSIGZyb20gJ0BtaWNyb3NvZnQvc2lnbmFscic7XHJcbmltcG9ydCB7IEh1YkNvbm5lY3Rpb25TdGF0ZSB9IGZyb20gXCJAbWljcm9zb2Z0L3NpZ25hbHJcIjtcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCwgRU1QVFksIGZyb20sIG9mIH0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHsgY2F0Y2hFcnJvciwgY29uY2F0TWFwLCBkZWxheSwgdGFwIH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XHJcblxyXG4vLyBNb2RlbGxpXHJcbmltcG9ydCB7IEJhc2VNZXNzYWdlU2VydmljZSB9IGZyb20gJy4vbW9kZWxzL0Jhc2VNZXNzYWdlU2VydmljZSc7XHJcbmltcG9ydCB7IEVuZHBvaW50RGVmIH0gZnJvbSAnLi9tb2RlbHMvRW5kcG9pbnREZWYnO1xyXG5pbXBvcnQgeyBTR1JfREVCVUdfTU9ERSwgRU5EUE9JTlRfVVJMLCBNRVNTQUdFX1BBQ0ssIFNJR05BTFJfRU5BQkxFRCwgQVVUT19SRUNPTk5FQ1QsIEFWT0lEX1dTIH0gZnJvbSBcIi4vdG9rZW5zXCI7XHJcblxyXG4vKiogU2Vydml6aW8gY2hlIGdlc3Rpc2NlIGxhIGNvbXVuaWNhemlvbmUgY29uIHVuIEh1YiBTaWduYWxSIGluIGJhc2UgYWxsZSBjb25maWd1cmF6aW9uaSBmb3JuaXRlIGRhbGwnYXBwbGljYXppb25lICovXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIE5vdGlmaWNhdGlvbnNTZXJ2aWNlIHtcclxuXHJcbiAgICAvKiogQ2FjaGUgZGVnbGkgT2JzZXJ2YWJsZSBnZW5lcmF0aSBpbiBiYXNlIGFnbGkgRW5kcG9pbnQgZGlzcG9uaWJpbGkgKi9cclxuICAgIHByaXZhdGUgbm90aWZpY2F0aW9ucyQ6IHsgW2luZGV4OiBzdHJpbmddOiBTdWJqZWN0PGFueT4gfSA9IHt9O1xyXG5cclxuICAgIC8qKiBDb25uZXNzaW9uZSBTaWduYWxyICovXHJcbiAgICBwcml2YXRlIGNvbm5lY3Rpb246IHNpZ25hbFIuSHViQ29ubmVjdGlvbjtcclxuXHJcbiAgICAgLyoqIENvZGEgZGkgY2hpYW1hdGUgZGEgcmVjdXBlcmFyZSBxdWFuZG8gbGEgY29ubmVzc2lvbmUgdmllbmUgZmluYWxtZW50ZSBhcGVydGEgKi9cclxuICAgICBwcml2YXRlIFJlcXVlc3RzVG9SZWNvdmVyOiB7IGl0ZW06IEVuZHBvaW50RGVmPGFueSwgYW55PiwgZHRvOiBhbnkgfVtdID0gW107XHJcblxyXG4gICAgIC8qKiBAaWdub3JlIENvc3RydXR0b3JlICovXHJcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIE1lc3NhZ2VEZWY6IEJhc2VNZXNzYWdlU2VydmljZSwgQEluamVjdChFTkRQT0lOVF9VUkwpIHByaXZhdGUgZW5kcG9pbnRfdXJsOiBzdHJpbmcsIEBJbmplY3QoTUVTU0FHRV9QQUNLKSBwcml2YXRlIG1zZ3BhY2s6IGJvb2xlYW4sICBASW5qZWN0KEFWT0lEX1dTKSBwcml2YXRlIGF2b2lkV3M6IGJvb2xlYW4sIEBJbmplY3QoU0lHTkFMUl9FTkFCTEVEKSBwcml2YXRlIGVuYWJsZWQ6IGJvb2xlYW4sIEBJbmplY3QoU0dSX0RFQlVHX01PREUpIHByaXZhdGUgZGVidWc6IGJvb2xlYW4sIEBJbmplY3QoQVVUT19SRUNPTk5FQ1QpIHByaXZhdGUgYXV0b3JlY29ubmVjdDogYm9vbGVhbikge1xyXG4gICAgICAgIGlmICghdGhpcy5lbmFibGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nKHRoaXMubG9jKFwiU2lnbmFsUiB3b24ndCBiZSBlbmFibGVkIGFzIHBlciBjb25maWd1cmF0aW9uXCIpKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5pbml0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhc3luYyBpbml0KCl7XHJcbiAgICAgICAgdGhpcy5NZXNzYWdlRGVmLkFsbERlZmluaXRpb25zLmZvckVhY2goZGVmID0+IHsgdGhpcy5ub3RpZmljYXRpb25zJFtkZWYuZW5kcG9pbnRdID0gbmV3IFN1YmplY3Q8dHlwZW9mIGRlZi5pblR5cGVEZWZhdWx0PigpOyB9KTtcclxuXHJcbiAgICAgICAgbGV0IHBhcnM6IHNpZ25hbFIuSUh0dHBDb25uZWN0aW9uT3B0aW9ucyA9IHsgc2tpcE5lZ290aWF0aW9uOiB0aGlzLmF2b2lkV3MgPyBmYWxzZSA6IHRydWUsIHRyYW5zcG9ydDogdGhpcy5hdm9pZFdzID8gc2lnbmFsUi5IdHRwVHJhbnNwb3J0VHlwZS5Mb25nUG9sbGluZyA6IHNpZ25hbFIuSHR0cFRyYW5zcG9ydFR5cGUuV2ViU29ja2V0cywgbG9nZ2VyOiB0aGlzLmRlYnVnID8gc2lnbmFsUi5Mb2dMZXZlbC5UcmFjZSA6IHNpZ25hbFIuTG9nTGV2ZWwuTm9uZSB9O1xyXG4gICAgICAgIHZhciBidWlsZGVyID0gbmV3IHNpZ25hbFIuSHViQ29ubmVjdGlvbkJ1aWxkZXIoKS53aXRoVXJsKFwiL1wiICsgdGhpcy5lbmRwb2ludF91cmwsIHBhcnMpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5hdXRvcmVjb25uZWN0KSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nKHRoaXMubG9jKFwiQnVpbGRpbmcgU2lnbmFsUiBIdWIgd2l0aCBBdXRvbWF0aWMgUmVjb25uZWN0aW9uXCIpKTtcclxuICAgICAgICAgICAgLy8gMTAwIHRlbnRhdGl2aSBkaSByaWNvbm5lc3Npb25lLCAxIG9nbmkgNSBzZWNvbmRpXHJcbiAgICAgICAgICAgIGJ1aWxkZXIgPSBidWlsZGVyLndpdGhBdXRvbWF0aWNSZWNvbm5lY3QobmV3IEFycmF5KDEwMCkuZmlsbCg1ICogMTAwMCkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMubXNncGFjaykge1xyXG4gICAgICAgICAgICB0aGlzLmxvZyh0aGlzLmxvYyhcIkJ1aWxkaW5nIFNpZ25hbFIgSHViIHdpdGggTWVzc2FnZVBhY2sgcHJvdG9jb2xcIikpO1xyXG4gICAgICAgICAgICB2YXIgbXBocE1vZHVsZSA9IGF3YWl0IGltcG9ydChcIkBtaWNyb3NvZnQvc2lnbmFsci1wcm90b2NvbC1tc2dwYWNrXCIpO1xyXG4gICAgICAgICAgICBidWlsZGVyID0gYnVpbGRlci53aXRoSHViUHJvdG9jb2wobmV3IG1waHBNb2R1bGUuTWVzc2FnZVBhY2tIdWJQcm90b2NvbCgpKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5jb25uZWN0aW9uID0gYnVpbGRlci5idWlsZCgpO1xyXG4gICAgICAgIHRoaXMuY29ubmVjdCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLlJlcXVlc3RzVG9SZWNvdmVyLmxlbmd0aCA9PSAwKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLlJlcXVlc3RzVG9SZWNvdmVyLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZyh0aGlzLmxvYyhcIlJlY292ZXJpbmcgcmVxdWVzdCB0byBFbmRwb2ludFwiKSArIFwiIFwiICsgdGhpcy5SZXF1ZXN0c1RvUmVjb3ZlcltpXS5pdGVtLmVuZHBvaW50KVxyXG4gICAgICAgICAgICAgICAgdGhpcy5zZW5kKHRoaXMuUmVxdWVzdHNUb1JlY292ZXJbaV0uaXRlbSwgdGhpcy5SZXF1ZXN0c1RvUmVjb3ZlcltpXS5kdG8pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLlJlcXVlc3RzVG9SZWNvdmVyID0gW107XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFZmZldHR1YSBsYSBjb25uZXNzaW9uZSBhbGwnSHViIFNpZ25hbHIgZSByZWdpc3RyYSB0dXR0aSBnbGkgRW5kcG9pbnQgcGVyIGN1aSBpbCBCYWNrZW5kIGNvbXVuaWNhIGNvbiBpbCBGcm9udGVuZCBzdWxsYSAqKmNvbm5lY3Rpb24qKlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGNvbm5lY3Qob25Db25uZWN0ZWQ/OiAoKSA9PiB2b2lkKSB7XHJcbiAgICAgICAgdGhpcy5jb25uZWN0aW9uLnN0YXJ0KCkuY2F0Y2goZXJyID0+IGNvbnNvbGUubG9nKGVycikpLnRoZW4oXyA9PiBvbkNvbm5lY3RlZD8uKCkpO1xyXG4gICAgICAgIHRoaXMuTWVzc2FnZURlZi5BbGxEZWZpbml0aW9ucy5mb3JFYWNoKGQgPT4ge1xyXG4gICAgICAgICAgICAvL1JlZ2lzdHJvIHNvbG8gbGUgY29zZSBkaSBJTiwgcXVlbGxlIGRpIG91dCBzb25vIGNoaWFtYXRlIGNoZSBmYWNjaW8gaW8gYWwgQkUgcXVpbmRpIG5vbiBzZXJ2b25vXHJcbiAgICAgICAgICAgIGlmIChkLmluVHlwZURlZmF1bHQgIT09IG51bGwgJiYgKGQub3V0VHlwZURlZmF1bHQgPT09IG51bGwgfHwgZC5vdXRUeXBlRGVmYXVsdCA9PT0gdW5kZWZpbmVkKSlcclxuICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvbi5vbihkLmVuZHBvaW50LCAobWVzc2FnZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nKHRoaXMubG9jKFwiUmVxdWVzdCByZWNlaXZlZCBmcm9tIHRoZSBzZXJ2ZXIgZm9yIGVuZHBvaW50XCIpICsgXCIgJ1wiICsgZC5lbmRwb2ludCArIFwiJzogXCIgKyAobWVzc2FnZSA/IHRoaXMuc3Vic3RyaW5nTG9nKEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpKTogXCJbTm8gbWVzc2FnZV1cIikpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9ucyRbZC5lbmRwb2ludF0ubmV4dChtZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZyh0aGlzLmxvYyhcIlJlZnVzaW5nIHRvIHJlZ2lzdGVyIGVuZHBvaW50XCIpICsgXCIgXCIgKyBkLmVuZHBvaW50ICsgXCIgXCIgKyB0aGlzLmxvYyhcImJlY2F1c2UgaXQgaXMgbm90IGRlY2xhcmVkIGFzIElOIC0gT05MWVwiKSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFZmZldHR1YSB2ZXJpZmljaGUgc3VsbGEgY29ubmVzc2lvbmUgZSwgaW4gY2FzbyBub24gZm9zc2UgY29sbGVnYXRhLCB0ZW50YSBkaSByaWNvbm5ldHRlcmxhXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPCdPSycgfCAnS08nIHwgJ05PLU9QJz59ICdPSycgU2UgbGEgY29ubmVzc2lvbmUgw6ggZ2nDoCBjb25uZXNzYSBvIMOoIHN0YXRhIHJpY29ubmVzc2EgY29uIHN1Y2Nlc3NvLCAnS08nIFNlIG5vbiDDqCBzdGF0byBwb3NzaWJpbGUgcmljb25uZXR0ZXJlIFxyXG4gICAgICogdW5hIGNvbm5lc3Npb25lIGRpc2Nvbm5lc3NhLCAnTk8tT1AnIHNlIGxhIGNvbm5lc2lzb25lIMOoIGluIHVubyBzdGF0byBpbnRlcm1lZGlvIGNoZSBub24gcHXDsiBlc3NlcmUgbW9kaWZpY2F0b1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZW5zdXJlQ29ubmVjdGVkKCk6IFByb21pc2U8J09LJyB8ICdLTycgfCAnTk8tT1AnPiB7XHJcbiAgICAgICAgaWYgKHRoaXMuY29ubmVjdGlvbi5zdGF0ZSA9PSBIdWJDb25uZWN0aW9uU3RhdGUuRGlzY29ubmVjdGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nKHRoaXMubG9jKFwiQ29ubmVjdGlvbiBsb3N0IG9yIG1pc3NpbmcsIHJlY29ubmVjdGluZy4uLlwiKSk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9uLnN0YXJ0KClcclxuICAgICAgICAgICAgICAgIC50aGVuKF8gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoXCJPS1wiKTtcclxuICAgICAgICAgICAgICAgIH0sIF8gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nKHRoaXMubG9jKFwiQ2Fubm90IHJlY29ubmVjdCBTaWduYWxSLCBmcm9udGVuZCBIVUIgb2ZmbGluZVwiKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShcIktPXCIpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuY29ubmVjdGlvbi5zdGF0ZSA9PSBIdWJDb25uZWN0aW9uU3RhdGUuQ29ubmVjdGVkKVxyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFwiT0tcIik7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFwiTk8tT1BcIik7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW52aWEgdW4gbWVzc2FnZ2lvIGFsbCdIdWIgZGVsIEJhY2tlbmRcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtFbmRwb2ludERlZjxhbnksIFRPdXQ+fSBpdGVtIEVuZHBvaW50IGRhIGNvbnRhdHRhcmVcclxuICAgICAqIEBwYXJhbSB7VE91dH0gZHRvIER0byBkYSBpbnZpYXJlIGFsbCdFbmRwb2ludFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2VuZDxUT3V0PihpdGVtOiBFbmRwb2ludERlZjxhbnksIFRPdXQ+LCBkdG86IFRPdXQpIHtcclxuICAgICAgICBpZiAoIXRoaXMuY29ubmVjdGlvbikge1xyXG4gICAgICAgICAgICB0aGlzLlJlcXVlc3RzVG9SZWNvdmVyLnB1c2goeyBpdGVtLCBkdG8gfSk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5lbmFibGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nKHRoaXMubG9jKFwiU2VuZCByZXF1ZXN0IGlnbm9yZWQgYmVjYXVzZSBTaWduYWxSIGlzIG5vdCBhY3RpdmUgYnkgY29uZmlndXJhdGlvblwiKSk7XHJcbiAgICAgICAgICAgIHJldHVybiBFTVBUWTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb24uc3RhdGUgPT0gSHViQ29ubmVjdGlvblN0YXRlLkNvbm5lY3RpbmcgfHwgdGhpcy5jb25uZWN0aW9uLnN0YXRlID09IEh1YkNvbm5lY3Rpb25TdGF0ZS5SZWNvbm5lY3RpbmcgfHwgdGhpcy5jb25uZWN0aW9uLnN0YXRlID09IEh1YkNvbm5lY3Rpb25TdGF0ZS5EaXNjb25uZWN0aW5nKSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nKHRoaXMubG9jKFwiU2VuZCByZXF1ZXN0IHNlbnQgYmVmb3JlIGEgY29ubmVjdGlvbiB3YXMgaW4gc3RhYmxlIFN0YXRlLCB3YWl0aW5nIDEgc2Vjb25kIGFuZCByZXRyeWluZ1wiKSk7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyB0aGlzLnNlbmQoaXRlbSwgZHRvKTsgfSwgMTAwMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuY29ubmVjdGlvbi5zdGF0ZSA9PSBIdWJDb25uZWN0aW9uU3RhdGUuRGlzY29ubmVjdGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZW5zdXJlQ29ubmVjdGVkKCkudGhlbih0ID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICh0ID09IFwiS09cIikgdGhpcy5sb2codGhpcy5sb2MoXCJFUlJPUlMgb24gcmVjb25uZWN0aW5nIGJlZm9yZSByZXRyeWluZyBhIHNlbmQgY29tbWFuZC4gU2VudCBtZXNzYWdlIFdJTEwgQkUgTE9TVFwiKSk7XHJcbiAgICAgICAgICAgICAgICBlbHNlIHRoaXMuc2VuZChpdGVtLCBkdG8pO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uLnNlbmQoaXRlbS5lbmRwb2ludCwgZHRvKS50aGVuKF8gPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZGVidWcpXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5pbmZvKHRoaXMubG9jKFwiUmVxdWVzdCBzZW50IHRvIHNlcnZlclwiKSArIFwiIC0gXCIgKyBpdGVtLmVuZHBvaW50ICsgXCI6IFwiICsgdGhpcy5zdWJzdHJpbmdMb2coSlNPTi5zdHJpbmdpZnkoZHRvKSkpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbnZpYSB1biBtZXNzYWdnaW8gYWxsJ0h1YiBkZWwgQmFja2VuZCwgYXNwZXR0YW5kb3NpIHVuYSByaXNwb3N0YVxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge0VuZHBvaW50RGVmPFRPdXQsIFRJbj59IGl0ZW0gRW5kcG9pbnQgZGEgY29udGF0dGFyZVxyXG4gICAgICogQHBhcmFtIHtUT3V0fSBkdG8gRHRvIGRhIGludmlhcmUgYWxsJ0VuZHBvaW50XHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlPFRJbj59IE9ic2VydmFibGUgc3UgY3VpIGNpIHNpIHB1w7IgcmVnaXN0cmFyZSBwZXIgcmljZXZlcmUgaWwgcmlzdWx0YXRvIGRlbGxhIGNoaWFtYXRhXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBpbnZva2U8VE91dCwgVEluPihpdGVtOiBFbmRwb2ludERlZjxUT3V0LCBUSW4+LCBkdG86IFRPdXQpOiBPYnNlcnZhYmxlPFRJbj4ge1xyXG4gICAgICAgIGlmICghdGhpcy5lbmFibGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nKHRoaXMubG9jKFwiSW52b2tlIHJlcXVlc3QgaWdub3JlZCBiZWNhdXNlIFNpZ25hbFIgaXMgbm90IGFjdGl2ZSBieSBjb25maWd1cmF0aW9uXCIpKTtcclxuICAgICAgICAgICAgcmV0dXJuIEVNUFRZO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY29ubmVjdGlvbi5zdGF0ZSA9PSBIdWJDb25uZWN0aW9uU3RhdGUuQ29ubmVjdGluZyB8fCB0aGlzLmNvbm5lY3Rpb24uc3RhdGUgPT0gSHViQ29ubmVjdGlvblN0YXRlLlJlY29ubmVjdGluZyB8fCB0aGlzLmNvbm5lY3Rpb24uc3RhdGUgPT0gSHViQ29ubmVjdGlvblN0YXRlLkRpc2Nvbm5lY3RpbmcpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2codGhpcy5sb2MoXCJJbnZva2UgcmVxdWVzdCBzZW50IGJlZm9yZSBhIGNvbm5lY3Rpb24gd2FzIGluIHN0YWJsZSBTdGF0ZSwgd2FpdGluZyAxIHNlY29uZCBhbmQgcmV0cnlpbmdcIikpO1xyXG4gICAgICAgICAgICByZXR1cm4gb2YoKS5waXBlKGRlbGF5KDEwMDApLCBjb25jYXRNYXAoKCkgPT4gdGhpcy5pbnZva2UoaXRlbSwgZHRvKSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0aGlzLmNvbm5lY3Rpb24uc3RhdGUgPT0gSHViQ29ubmVjdGlvblN0YXRlLkRpc2Nvbm5lY3RlZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gZnJvbSh0aGlzLmVuc3VyZUNvbm5lY3RlZCgpKS5waXBlKGNvbmNhdE1hcCgocmVzKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAocmVzID09IFwiS09cIikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nKHRoaXMubG9jKFwiRVJST1JTIG9uIHJlY29ubmVjdGluZyBiZWZvcmUgcmV0cnlpbmcgYSBzZW5kIGNvbW1hbmQuIFNlbnQgbWVzc2FnZSBXSUxMIEJFIExPU1RcIikpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBFTVBUWTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgcmV0dXJuIHRoaXMuaW52b2tlKGl0ZW0sIGR0byk7XHJcbiAgICAgICAgICAgIH0pKVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZyb20odGhpcy5jb25uZWN0aW9uLmludm9rZTxUSW4+KGl0ZW0uZW5kcG9pbnQsIGR0bykpLnBpcGUoXHJcbiAgICAgICAgICAgICAgICB0YXAoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRlYnVnKSBjb25zb2xlLmxvZyh0aGlzLmxvYyhcIlJlcXVlc3QgaW52b2tlZCB0byBzZXJ2ZXJcIikgKyBcIiAtIFwiICsgaXRlbS5lbmRwb2ludCArIFwiOiBcIiArIHRoaXMuc3Vic3RyaW5nTG9nKEpTT04uc3RyaW5naWZ5KGR0bykpKTtcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSG9vayBwZXIgb3NzZXJ2YXJlIGkgZGF0aSBzcGVkaXRpIGFkIHVuIEVuZHBvaW50IGRhbCBCYWNrZW5kXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7RW5kcG9pbnREZWY8VEluLCBhbnk+fSBpdGVtIEVuZHBvaW50IHN1IGN1aSBhc2NvbHRhcmVcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMge09ic2VydmFibGU8VEluPn0gT2JzZXJ2YWJsZSBzdSBjdWkgY2kgc2kgcHXDsiByZWdpc3RyYXJlIHBlciByaWNldmVyZSBsJ29nZ2V0dG8gZ2VuZXJhdG8gYWQgb2duaSBjaGlhbWF0YSBkYWwgQmFja2VuZCBhbCBGcm9udGVuZFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb2JzZXJ2ZTxUSW4+KGl0ZW06IEVuZHBvaW50RGVmPFRJbiwgYW55Pik6IE9ic2VydmFibGU8VEluPiB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmVuYWJsZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2codGhpcy5sb2MoXCJPYnNlcnZlIHJlcXVlc3QgaWdub3JlZCBiZWNhdXNlIFNpZ25hbFIgaXMgbm90IGFjdGl2ZSBieSBjb25maWd1cmF0aW9uXCIpKTtcclxuICAgICAgICAgICAgcmV0dXJuIEVNUFRZO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5sb2codGhpcy5sb2MoXCJSZXR1cm5pbmcgb2JzZXJ2YWJsZSBmb3IgcmVxdWlyZWQgZW5kcG9pbnRcIikgKyBcIjogXCIgKyBpdGVtLmVuZHBvaW50KTtcclxuICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8VEluPj50aGlzLm5vdGlmaWNhdGlvbnMkW2l0ZW0uZW5kcG9pbnRdO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGlzY29ubmVzc2lvbmUgZGVsIHNpc3RlbWEgZGkgU2lnbmFsUlxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZTx2b2lkPn0gT2JzZXJ2YWJsZSBhIGN1aSByZWdpc3RyYXJzaSBjaGUgdmllbmUgY2hpYW1hdG8gcXVhbmRvIGxhIGRpc2Nvbm5lc3Npb25lIMOoIHRlcm1pbmF0YVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZGlzY29ubmVjdCgpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcclxuICAgICAgICAvL05PLU9QIHNlIG5vbiBhdHRpdm9cclxuICAgICAgICBpZiAoIXRoaXMuZW5hYmxlZCkge1xyXG4gICAgICAgICAgICB0aGlzLmxvZyh0aGlzLmxvYyhcIkRpc2Nvbm5lY3Rpb24gcmVxdWVzdCBpZ25vcmVkIGJlY2F1c2UgU2lnbmFsUiBpcyBub3QgYWN0aXZlIGJ5IGNvbmZpZ3VyYXRpb25cIikpO1xyXG4gICAgICAgICAgICByZXR1cm4gRU1QVFk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZnJvbSh0aGlzLmNvbm5lY3Rpb24uc3RvcCgpKS5waXBlKFxyXG4gICAgICAgICAgICBjYXRjaEVycm9yKChlcnIsIGNhdWdodCkgPT4geyBjb25zb2xlLmxvZyhlcnIpOyByZXR1cm4gb2YobnVsbCk7IH0pLFxyXG4gICAgICAgICAgICB0YXAoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2codGhpcy5sb2MoXCJEaXNjb25uZWN0aW9uIHJlcXVlc3QgaG9ub3JlZFwiKSk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRhZ2xpYSB1biBsb2cgdHJvcHBvIGx1bmdvXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IExvZyBkYSB0YWdsaWFyZVxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG1heGNoYXJzIE51bWVybyBtYXNzaW1vIGRpIGNhcmF0dGVyaSBkYSB0ZW5lcmVcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMge3N0cmluZ30gTG9nIHRhZ2xpYXRvXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgc3Vic3RyaW5nTG9nKHRleHQ6IHN0cmluZywgbWF4Y2hhcnM6IG51bWJlciA9IDEyMCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRleHQubGVuZ3RoID4gbWF4Y2hhcnMgPyB0ZXh0LnN1YnN0cigwLCBtYXhjaGFycykgKyBcIlsuLi5dXCIgOiB0ZXh0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3RhbXBhIHVuIGxvZyBhIGNvbnNvbGVcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgTWVzc2FnZ2lvIGRhIHN0YW1wYXJlXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgbG9nKG1lc3NhZ2U6IHN0cmluZykge1xyXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKVxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkBzaWduYWxyLW5vdGlmaWNhdGlvbnM6IFwiICsgbWVzc2FnZSlcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEhlbHBlciBkaSBsb2NhbGl6emF6aW9uZVxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSBNZXNzYWdnaW8gZGEgdHJhZHVycmVcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMge3N0cmluZ30gTWVzc2FnZ2lvIHRyYWRvdHRvXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgbG9jKG1lc3NhZ2U6IHN0cmluZykgOiBzdHJpbmd7XHJcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XHJcbiAgICB9XHJcbn0iXX0=
@@ -86,10 +86,10 @@ class BaseMessageService {
86
86
  add(endpoint) {
87
87
  this.definitions.push(endpoint);
88
88
  }
89
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: BaseMessageService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
90
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: BaseMessageService }); }
89
91
  }
90
- BaseMessageService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: BaseMessageService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
91
- BaseMessageService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: BaseMessageService });
92
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: BaseMessageService, decorators: [{
92
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: BaseMessageService, decorators: [{
93
93
  type: Injectable
94
94
  }], ctorParameters: function () { return []; } });
95
95
 
@@ -117,7 +117,7 @@ class NotificationsService {
117
117
  }
118
118
  async init() {
119
119
  this.MessageDef.AllDefinitions.forEach(def => { this.notifications$[def.endpoint] = new Subject(); });
120
- let pars = { skipNegotiation: this.avoidWs ? false : true, transport: this.avoidWs ? signalR.HttpTransportType.LongPolling : signalR.HttpTransportType.WebSockets, logger: this.debug ? signalR.LogLevel.Debug : signalR.LogLevel.None };
120
+ 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 };
121
121
  var builder = new signalR.HubConnectionBuilder().withUrl("/" + this.endpoint_url, pars);
122
122
  if (this.autoreconnect) {
123
123
  this.log(this.loc("Building SignalR Hub with Automatic Reconnection"));
@@ -306,10 +306,10 @@ class NotificationsService {
306
306
  loc(message) {
307
307
  return message;
308
308
  }
309
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NotificationsService, deps: [{ token: BaseMessageService }, { token: ENDPOINT_URL }, { token: MESSAGE_PACK }, { token: AVOID_WS }, { token: SIGNALR_ENABLED }, { token: SGR_DEBUG_MODE }, { token: AUTO_RECONNECT }], target: i0.ɵɵFactoryTarget.Injectable }); }
310
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NotificationsService }); }
309
311
  }
310
- NotificationsService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: NotificationsService, deps: [{ token: BaseMessageService }, { token: ENDPOINT_URL }, { token: MESSAGE_PACK }, { token: AVOID_WS }, { token: SIGNALR_ENABLED }, { token: SGR_DEBUG_MODE }, { token: AUTO_RECONNECT }], target: i0.ɵɵFactoryTarget.Injectable });
311
- NotificationsService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: NotificationsService });
312
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: NotificationsService, decorators: [{
312
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NotificationsService, decorators: [{
313
313
  type: Injectable
314
314
  }], ctorParameters: function () { return [{ type: BaseMessageService }, { type: undefined, decorators: [{
315
315
  type: Inject,
@@ -347,11 +347,11 @@ class SignalrNotificationsModule {
347
347
  ]
348
348
  };
349
349
  }
350
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SignalrNotificationsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
351
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.2.12", ngImport: i0, type: SignalrNotificationsModule }); }
352
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SignalrNotificationsModule }); }
350
353
  }
351
- SignalrNotificationsModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SignalrNotificationsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
352
- SignalrNotificationsModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.9", ngImport: i0, type: SignalrNotificationsModule });
353
- SignalrNotificationsModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SignalrNotificationsModule });
354
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SignalrNotificationsModule, decorators: [{
354
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SignalrNotificationsModule, decorators: [{
355
355
  type: NgModule
356
356
  }] });
357
357
 
@@ -1 +1 @@
1
- {"version":3,"file":"esfaenza-signalr-notifications.mjs","sources":["../../../projects/signalr-notifications/src/lib/tokens.ts","../../../projects/signalr-notifications/src/lib/models/EndpointDef.ts","../../../projects/signalr-notifications/src/lib/models/JobProgressDto.ts","../../../projects/signalr-notifications/src/lib/models/BaseMessageService.ts","../../../projects/signalr-notifications/src/lib/signalr-notifications.service.ts","../../../projects/signalr-notifications/src/lib/signalr-notifications.module.ts","../../../projects/signalr-notifications/src/lib/config/SignalrNotificationsModuleConfig.ts","../../../projects/signalr-notifications/src/public-api.ts","../../../projects/signalr-notifications/src/esfaenza-signalr-notifications.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\r\n\r\n/**\r\n * Hub a cui collegarsi\r\n */\r\nexport const ENDPOINT_URL: InjectionToken<string> = new InjectionToken<string>('ENDPOINT_URL');\r\n\r\n/**\r\n * Indica se la libreria dev'essere attiva o no\r\n */\r\nexport const SIGNALR_ENABLED: InjectionToken<string> = new InjectionToken<boolean>('SIGNALR_ENABLED');\r\n\r\n/**\r\n * Indica se stampare messaggi di debug in console\r\n */\r\nexport const SGR_DEBUG_MODE: InjectionToken<string> = new InjectionToken<boolean>('SGR_DEBUG_MODE');\r\n\r\n/**\r\n * Indica se utilizzare il protocollo di trasferimento \"MessagePack\"\r\n */\r\nexport const MESSAGE_PACK: InjectionToken<boolean> = new InjectionToken<boolean>('MESSAGE_PACK');\r\n\r\n/**\r\n * Indica se tentare in automatico la riconnessione\r\n */\r\nexport const AUTO_RECONNECT: InjectionToken<boolean> = new InjectionToken<boolean>('AUTO_RECONNECT');\r\n\r\n/**\r\n * Indica se evitare i WebSocket, imposta il trasporto a LongPolling\r\n */\r\nexport const AVOID_WS: InjectionToken<boolean> = new InjectionToken<boolean>('MESSAGE_PACK');","/**\r\n * Definisce un Endpoint che spedisce un'informazione di tipo TIn e restituisce un'informazione di tipo TOut\r\n */\r\nexport class EndpointDef<TIn, TOut> {\r\n\r\n /**\r\n * Costruttore\r\n * \r\n * @param {string} endpoint Nome del metodo da chiamare nell'Hub del Backend contattato\r\n * @param {TIn} inTypeDefault Default per il tipo TIn. Utilizzato per fare Typecheck sulle chiamate da Backend a Frontend\r\n * @param {TOut} outTypeDefault Default per il tipo TOut. Utilizzato per fare Typecheck sulle chiamate da Frontend a Backend\r\n */\r\n constructor(public endpoint: string, public inTypeDefault: TIn, public outTypeDefault: TOut) { }\r\n\r\n\r\n /** Helper per la creazione rapida di un Endpoint di solo INPUT */\r\n public static In<TIn>(name: string, inTypeDefault: TIn): EndpointDef<TIn, void> {\r\n return new EndpointDef<TIn, void>(name, inTypeDefault, undefined);\r\n }\r\n\r\n /** Helper per la creazione rapida di un Endpoint di solo OUTPUT */\r\n public static Out<TOut>(name: string, outTypeDefault: TOut): EndpointDef<void, TOut> {\r\n return new EndpointDef<void, TOut>(name, undefined, outTypeDefault);\r\n }\r\n\r\n /** Helper per la creazione rapida di un Endpoint di INPUT e OUTPUT (BIDIREZIONALE) */\r\n public static Bi<TIn, TOut>(name: string, inTypeDefault: TIn, outTypeDefault: TOut): EndpointDef<TIn, TOut> {\r\n return new EndpointDef<TIn, TOut>(name, inTypeDefault, outTypeDefault);\r\n }\r\n}","export class JobProgressDto {\r\n instance: string;\r\n name: string;\r\n group: string;\r\n progress: number;\r\n type: string;\r\n\r\n description: string;\r\n user: string;\r\n etams: number;\r\n durationms: number;\r\n\r\n resultfile: string;\r\n resultreport: string;\r\n resultcomplexreport: string;\r\n\r\n actionid: string;\r\n logchunk: string;\r\n \r\n // !!!!! Vedi es-table.ReportParam\r\n resultreportparams: {\r\n /** Codice del parametro */\r\n id: string;\r\n /** Descrizione del parametro */\r\n description: string;\r\n /** Sequenza del parametro per ordinarlo logicamente rispetto agli altri */\r\n seq: number;\r\n /** Typecode C# della tipologia di parametro */\r\n typecode: number;\r\n /** Indica se i parametro è richiesto o meno */\r\n required: boolean;\r\n /** Valore del parametro, offerto sia come valore di default o in alternativa riempito lato UI */\r\n value?: any;\r\n /** Indica se questo parametro si basa su un enum. Se questa proprietà è true mi aspetto che almeno **enumtype** sia valorizzato */\r\n isenum: boolean;\r\n /** Indica se questo parametro si basa su un dizionario. Se questa proprietà è true mi aspetto che almeno **dictype** sia valorizzato */\r\n isdictionary: boolean;\r\n /** Indica se il parametro è di tipo data */\r\n isdate: boolean;\r\n /** Indica se il parametro è di tipo boolean */\r\n isboolean: boolean;\r\n /** Valori disponibili per questo parametro, da valorizzare in caso **enumtype** o **dictype** fossero valorizzati */\r\n availablevalues?: {\r\n id: string;\r\n description: string;\r\n }[];\r\n /** Tipo enumerabile del parametro (qualora fosse un dizionario di valori) */\r\n enumtype?: string;\r\n /** Colonna relativa e questo parametro */\r\n column?: string;\r\n /** Tipo del dizionario */\r\n dictype?: string;\r\n /** Indica un filtro da applicare nei confronti del Backend qualora si vogliano caricare solo le possibilità logicamente accettabili per questo parametro */\r\n dictionaryfilter?: string;\r\n /** Tipologia lato \"typescript\" di questo parametro, dev'essere sempre logicamente congruente al **typecode** */\r\n type?: \"string\" | \"number\" | \"date\" | \"boolean\";\r\n /** Eventuale pattern di validazione per questo parametro */\r\n pattern?: string;\r\n }[];\r\n}","// Angular\r\nimport { Injectable } from '@angular/core';\r\n\r\n// Modelli\r\nimport { EndpointDef } from './EndpointDef';\r\nimport { JobProgressDto } from './JobProgressDto';\r\n\r\n/**\r\n * Classe base da estendere con la definizione degli Endpoint supportati dall'applicazione\r\n */\r\n@Injectable()\r\nexport class BaseMessageService {\r\n\r\n private definitions: EndpointDef<any, any>[] = [];\r\n\r\n public IN_JobProgressNotification = EndpointDef.In(\"SendProgressNotification\", new JobProgressDto());\r\n public IN_SendVersion = EndpointDef.In(\"SendVersion\", \"\");\r\n public IN_ClearCache = EndpointDef.In(\"ClearCache\", \"\");\r\n public IN_ClearPreferecnes = EndpointDef.In(\"ClearPreferecnes\", \"\");\r\n\r\n\r\n public OUT_QueryJobStatus = EndpointDef.Out(\"QueryJobStatus\", null);\r\n\r\n /** Entrypoint che restituisce tutti gli Endpoint dell'applicazione. Da overridare qualora non venga utilizzato il metodo **add** */\r\n public get AllDefinitions(): EndpointDef<any, any>[] { return this.definitions; }\r\n\r\n constructor() {\r\n this.add(this.IN_JobProgressNotification);\r\n this.add(this.IN_SendVersion);\r\n this.add(this.IN_ClearCache);\r\n this.add(this.IN_ClearPreferecnes);\r\n this.add(this.OUT_QueryJobStatus);\r\n }\r\n\r\n public add(endpoint: EndpointDef<any, any>) {\r\n this.definitions.push(endpoint);\r\n }\r\n}","// Angular\r\nimport { Injectable, Inject } from \"@angular/core\";\r\n\r\n// Direttive, Componenti, Librerie\r\nimport * as signalR from '@microsoft/signalr';\r\nimport { HubConnectionState } from \"@microsoft/signalr\";\r\nimport { Observable, Subject, EMPTY, from, of } from \"rxjs\";\r\nimport { catchError, concatMap, delay, tap } from \"rxjs/operators\";\r\n\r\n// Modelli\r\nimport { BaseMessageService } from './models/BaseMessageService';\r\nimport { EndpointDef } from './models/EndpointDef';\r\nimport { SGR_DEBUG_MODE, ENDPOINT_URL, MESSAGE_PACK, SIGNALR_ENABLED, AUTO_RECONNECT, AVOID_WS } from \"./tokens\";\r\n\r\n/** Servizio che gestisce la comunicazione con un Hub SignalR in base alle configurazioni fornite dall'applicazione */\r\n@Injectable()\r\nexport class NotificationsService {\r\n\r\n /** Cache degli Observable generati in base agli Endpoint disponibili */\r\n private notifications$: { [index: string]: Subject<any> } = {};\r\n\r\n /** Connessione Signalr */\r\n private connection: signalR.HubConnection;\r\n\r\n /** Coda di chiamate da recuperare quando la connessione viene finalmente aperta */\r\n private RequestsToRecover: { item: EndpointDef<any, any>, dto: any }[] = [];\r\n\r\n /** @ignore Costruttore */\r\n constructor(private MessageDef: BaseMessageService, @Inject(ENDPOINT_URL) private endpoint_url: string, @Inject(MESSAGE_PACK) private msgpack: boolean, @Inject(AVOID_WS) private avoidWs: boolean, @Inject(SIGNALR_ENABLED) private enabled: boolean, @Inject(SGR_DEBUG_MODE) private debug: boolean, @Inject(AUTO_RECONNECT) private autoreconnect: boolean) {\r\n if (!this.enabled) {\r\n this.log(this.loc(\"SignalR won't be enabled as per configuration\"));\r\n return;\r\n }\r\n\r\n this.init();\r\n }\r\n\r\n private async init(){\r\n this.MessageDef.AllDefinitions.forEach(def => { this.notifications$[def.endpoint] = new Subject<typeof def.inTypeDefault>(); });\r\n\r\n let pars: signalR.IHttpConnectionOptions = { skipNegotiation: this.avoidWs ? false : true, transport: this.avoidWs ? signalR.HttpTransportType.LongPolling : signalR.HttpTransportType.WebSockets, logger: this.debug ? signalR.LogLevel.Debug : signalR.LogLevel.None };\r\n var builder = new signalR.HubConnectionBuilder().withUrl(\"/\" + this.endpoint_url, pars);\r\n\r\n if (this.autoreconnect) {\r\n this.log(this.loc(\"Building SignalR Hub with Automatic Reconnection\"));\r\n // 100 tentativi di riconnessione, 1 ogni 5 secondi\r\n builder = builder.withAutomaticReconnect(new Array(100).fill(5 * 1000));\r\n }\r\n\r\n if (this.msgpack) {\r\n this.log(this.loc(\"Building SignalR Hub with MessagePack protocol\"));\r\n var mphpModule = await import(\"@microsoft/signalr-protocol-msgpack\");\r\n builder = builder.withHubProtocol(new mphpModule.MessagePackHubProtocol())\r\n }\r\n\r\n this.connection = builder.build();\r\n this.connect(() => {\r\n if (this.RequestsToRecover.length == 0)\r\n return;\r\n\r\n for (let i = 0; i < this.RequestsToRecover.length; i++) {\r\n this.log(this.loc(\"Recovering request to Endpoint\") + \" \" + this.RequestsToRecover[i].item.endpoint)\r\n this.send(this.RequestsToRecover[i].item, this.RequestsToRecover[i].dto);\r\n }\r\n\r\n this.RequestsToRecover = [];\r\n });\r\n }\r\n\r\n /**\r\n * Effettua la connessione all'Hub Signalr e registra tutti gli Endpoint per cui il Backend comunica con il Frontend sulla **connection**\r\n */\r\n private connect(onConnected?: () => void) {\r\n this.connection.start().catch(err => console.log(err)).then(_ => onConnected?.());\r\n this.MessageDef.AllDefinitions.forEach(d => {\r\n //Registro solo le cose di IN, quelle di out sono chiamate che faccio io al BE quindi non servono\r\n if (d.inTypeDefault !== null && (d.outTypeDefault === null || d.outTypeDefault === undefined))\r\n this.connection.on(d.endpoint, (message) => {\r\n this.log(this.loc(\"Request received from the server for endpoint\") + \" '\" + d.endpoint + \"': \" + (message ? this.substringLog(JSON.stringify(message)): \"[No message]\"));\r\n this.notifications$[d.endpoint].next(message);\r\n });\r\n else\r\n this.log(this.loc(\"Refusing to register endpoint\") + \" \" + d.endpoint + \" \" + this.loc(\"because it is not declared as IN - ONLY\"));\r\n });\r\n }\r\n\r\n /**\r\n * Effettua verifiche sulla connessione e, in caso non fosse collegata, tenta di riconnetterla\r\n * \r\n * @returns {Promise<'OK' | 'KO' | 'NO-OP'>} 'OK' Se la connessione è già connessa o è stata riconnessa con successo, 'KO' Se non è stato possibile riconnettere \r\n * una connessione disconnessa, 'NO-OP' se la connesisone è in uno stato intermedio che non può essere modificato\r\n */\r\n public ensureConnected(): Promise<'OK' | 'KO' | 'NO-OP'> {\r\n if (this.connection.state == HubConnectionState.Disconnected) {\r\n this.log(this.loc(\"Connection lost or missing, reconnecting...\"));\r\n\r\n return this.connection.start()\r\n .then(_ => {\r\n return Promise.resolve(\"OK\");\r\n }, _ => {\r\n this.log(this.loc(\"Cannot reconnect SignalR, frontend HUB offline\"));\r\n return Promise.resolve(\"KO\");\r\n });\r\n }\r\n else if (this.connection.state == HubConnectionState.Connected)\r\n return Promise.resolve(\"OK\");\r\n else\r\n return Promise.resolve(\"NO-OP\");\r\n }\r\n\r\n\r\n /**\r\n * Invia un messaggio all'Hub del Backend\r\n * \r\n * @param {EndpointDef<any, TOut>} item Endpoint da contattare\r\n * @param {TOut} dto Dto da inviare all'Endpoint\r\n */\r\n public send<TOut>(item: EndpointDef<any, TOut>, dto: TOut) {\r\n if (!this.connection) {\r\n this.RequestsToRecover.push({ item, dto });\r\n return;\r\n }\r\n\r\n if (!this.enabled) {\r\n this.log(this.loc(\"Send request ignored because SignalR is not active by configuration\"));\r\n return EMPTY;\r\n }\r\n\r\n if (this.connection.state == HubConnectionState.Connecting || this.connection.state == HubConnectionState.Reconnecting || this.connection.state == HubConnectionState.Disconnecting) {\r\n this.log(this.loc(\"Send request sent before a connection was in stable State, waiting 1 second and retrying\"));\r\n setTimeout(() => { this.send(item, dto); }, 1000);\r\n }\r\n else if (this.connection.state == HubConnectionState.Disconnected) {\r\n this.ensureConnected().then(t => {\r\n if (t == \"KO\") this.log(this.loc(\"ERRORS on reconnecting before retrying a send command. Sent message WILL BE LOST\"));\r\n else this.send(item, dto);\r\n })\r\n }\r\n else {\r\n this.connection.send(item.endpoint, dto).then(_ => {\r\n if (this.debug)\r\n console.info(this.loc(\"Request sent to server\") + \" - \" + item.endpoint + \": \" + this.substringLog(JSON.stringify(dto)));\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Invia un messaggio all'Hub del Backend, aspettandosi una risposta\r\n * \r\n * @param {EndpointDef<TOut, TIn>} item Endpoint da contattare\r\n * @param {TOut} dto Dto da inviare all'Endpoint\r\n * \r\n * @returns {Observable<TIn>} Observable su cui ci si può registrare per ricevere il risultato della chiamata\r\n */\r\n public invoke<TOut, TIn>(item: EndpointDef<TOut, TIn>, dto: TOut): Observable<TIn> {\r\n if (!this.enabled) {\r\n this.log(this.loc(\"Invoke request ignored because SignalR is not active by configuration\"));\r\n return EMPTY;\r\n }\r\n\r\n if (this.connection.state == HubConnectionState.Connecting || this.connection.state == HubConnectionState.Reconnecting || this.connection.state == HubConnectionState.Disconnecting) {\r\n this.log(this.loc(\"Invoke request sent before a connection was in stable State, waiting 1 second and retrying\"));\r\n return of().pipe(delay(1000), concatMap(() => this.invoke(item, dto)));\r\n }\r\n else if (this.connection.state == HubConnectionState.Disconnected) {\r\n return from(this.ensureConnected()).pipe(concatMap((res) => {\r\n if (res == \"KO\") {\r\n this.log(this.loc(\"ERRORS on reconnecting before retrying a send command. Sent message WILL BE LOST\"));\r\n return EMPTY;\r\n }\r\n else return this.invoke(item, dto);\r\n }))\r\n }\r\n else {\r\n return from(this.connection.invoke<TIn>(item.endpoint, dto)).pipe(\r\n tap(() => {\r\n if (this.debug) console.log(this.loc(\"Request invoked to server\") + \" - \" + item.endpoint + \": \" + this.substringLog(JSON.stringify(dto)));\r\n })\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Hook per osservare i dati spediti ad un Endpoint dal Backend\r\n * \r\n * @param {EndpointDef<TIn, any>} item Endpoint su cui ascoltare\r\n * \r\n * @returns {Observable<TIn>} Observable su cui ci si può registrare per ricevere l'oggetto generato ad ogni chiamata dal Backend al Frontend\r\n */\r\n public observe<TIn>(item: EndpointDef<TIn, any>): Observable<TIn> {\r\n if (!this.enabled) {\r\n this.log(this.loc(\"Observe request ignored because SignalR is not active by configuration\"));\r\n return EMPTY;\r\n }\r\n\r\n this.log(this.loc(\"Returning observable for required endpoint\") + \": \" + item.endpoint);\r\n return <Observable<TIn>>this.notifications$[item.endpoint];\r\n }\r\n\r\n /**\r\n * Disconnessione del sistema di SignalR\r\n * \r\n * @returns {Observable<void>} Observable a cui registrarsi che viene chiamato quando la disconnessione è terminata\r\n */\r\n public disconnect(): Observable<void> {\r\n //NO-OP se non attivo\r\n if (!this.enabled) {\r\n this.log(this.loc(\"Disconnection request ignored because SignalR is not active by configuration\"));\r\n return EMPTY;\r\n }\r\n\r\n return from(this.connection.stop()).pipe(\r\n catchError((err, caught) => { console.log(err); return of(null); }),\r\n tap(() => {\r\n this.log(this.loc(\"Disconnection request honored\"));\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Taglia un log troppo lungo\r\n * \r\n * @param {string} text Log da tagliare\r\n * @param {number} maxchars Numero massimo di caratteri da tenere\r\n * \r\n * @returns {string} Log tagliato\r\n */\r\n private substringLog(text: string, maxchars: number = 120): string {\r\n return text.length > maxchars ? text.substr(0, maxchars) + \"[...]\" : text;\r\n }\r\n\r\n /**\r\n * Stampa un log a console\r\n * \r\n * @param {string} message Messaggio da stampare\r\n */\r\n private log(message: string) {\r\n if (this.debug)\r\n console.log(\"@signalr-notifications: \" + message)\r\n }\r\n\r\n /**\r\n * Helper di localizzazione\r\n * \r\n * @param {string} message Messaggio da tradurre\r\n * \r\n * @returns {string} Messaggio tradotto\r\n */\r\n private loc(message: string) : string{\r\n return message;\r\n }\r\n}","\r\nimport { NgModule, ModuleWithProviders } from '@angular/core';\r\nimport { SignalrNotificationsModuleConfig } from './config/SignalrNotificationsModuleConfig';\r\nimport { BaseMessageService } from './models/BaseMessageService';\r\nimport { NotificationsService } from './signalr-notifications.service';\r\nimport { ENDPOINT_URL, SIGNALR_ENABLED, SGR_DEBUG_MODE, MESSAGE_PACK, AUTO_RECONNECT, AVOID_WS } from './tokens';\r\n\r\n@NgModule()\r\nexport class SignalrNotificationsModule {\r\n static forRoot(config?: SignalrNotificationsModuleConfig): ModuleWithProviders<SignalrNotificationsModule> {\r\n return {\r\n ngModule: SignalrNotificationsModule,\r\n providers: [\r\n NotificationsService,\r\n { provide: BaseMessageService, useClass: config?.messageService || BaseMessageService },\r\n { provide: ENDPOINT_URL, useValue: config?.endpointUrl },\r\n { provide: SIGNALR_ENABLED, useValue: config?.enabled != null ? config?.enabled : true },\r\n { provide: SGR_DEBUG_MODE, useValue: config?.debugMode != null ? config?.debugMode : false },\r\n { provide: MESSAGE_PACK, useValue: config?.useMessagePack != null ? config?.useMessagePack : false },\r\n { provide: AUTO_RECONNECT, useValue: config?.autoReconnect != null ? config?.autoReconnect : true },\r\n { provide: AVOID_WS, useValue: config?.avoidWs != null ? config?.avoidWs : false },\r\n ]\r\n };\r\n }\r\n}","// Angular\r\nimport { Type } from '@angular/core';\r\n\r\n// Modelli\r\nimport { BaseMessageService } from '../models/BaseMessageService';\r\n\r\n/**\r\n * Classe di configurazione per la libreria\r\n */\r\nexport class SignalrNotificationsModuleConfig {\r\n\r\n /**\r\n * Url nei confronti del quale aprire la connessione SignalR\r\n */\r\n endpointUrl : string;\r\n\r\n /**\r\n * Servizio che definisce i messaggi di IN e OUT coi loro default\r\n */\r\n messageService?: Type<BaseMessageService>;\r\n\r\n /**\r\n * Indica se abilitare o meno la connessione SignalR nei confronti dell'URL **hubUrl**\r\n */\r\n enabled? : boolean;\r\n\r\n /**\r\n * Indica se utilizzare message pack come protocollo di trasmissione\r\n */\r\n useMessagePack? : boolean;\r\n\r\n /**\r\n * Indica se tentare di riconnettersi automaticamente quando la connessione cade\r\n */\r\n autoReconnect? : boolean;\r\n\r\n /**\r\n * Indica se scrivere o meno i messaggi di debug\r\n */\r\n debugMode? : boolean;\r\n\r\n /**\r\n * Indica se evitare di utilizzare i Websocket\r\n */\r\n avoidWs?; boolean;\r\n}","/*\n * Public API Surface of signalr-notifications\n */\n\nexport * from './lib/tokens';\nexport * from './lib/signalr-notifications.service';\nexport * from './lib/signalr-notifications.module';\nexport * from './lib/models/BaseMessageService';\nexport * from './lib/models/EndpointDef';\nexport * from './lib/models/JobProgressDto';\nexport * from './lib/config/SignalrNotificationsModuleConfig';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.BaseMessageService"],"mappings":"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"}
1
+ {"version":3,"file":"esfaenza-signalr-notifications.mjs","sources":["../../../projects/signalr-notifications/src/lib/tokens.ts","../../../projects/signalr-notifications/src/lib/models/EndpointDef.ts","../../../projects/signalr-notifications/src/lib/models/JobProgressDto.ts","../../../projects/signalr-notifications/src/lib/models/BaseMessageService.ts","../../../projects/signalr-notifications/src/lib/signalr-notifications.service.ts","../../../projects/signalr-notifications/src/lib/signalr-notifications.module.ts","../../../projects/signalr-notifications/src/lib/config/SignalrNotificationsModuleConfig.ts","../../../projects/signalr-notifications/src/public-api.ts","../../../projects/signalr-notifications/src/esfaenza-signalr-notifications.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\r\n\r\n/**\r\n * Hub a cui collegarsi\r\n */\r\nexport const ENDPOINT_URL: InjectionToken<string> = new InjectionToken<string>('ENDPOINT_URL');\r\n\r\n/**\r\n * Indica se la libreria dev'essere attiva o no\r\n */\r\nexport const SIGNALR_ENABLED: InjectionToken<string> = new InjectionToken<boolean>('SIGNALR_ENABLED');\r\n\r\n/**\r\n * Indica se stampare messaggi di debug in console\r\n */\r\nexport const SGR_DEBUG_MODE: InjectionToken<string> = new InjectionToken<boolean>('SGR_DEBUG_MODE');\r\n\r\n/**\r\n * Indica se utilizzare il protocollo di trasferimento \"MessagePack\"\r\n */\r\nexport const MESSAGE_PACK: InjectionToken<boolean> = new InjectionToken<boolean>('MESSAGE_PACK');\r\n\r\n/**\r\n * Indica se tentare in automatico la riconnessione\r\n */\r\nexport const AUTO_RECONNECT: InjectionToken<boolean> = new InjectionToken<boolean>('AUTO_RECONNECT');\r\n\r\n/**\r\n * Indica se evitare i WebSocket, imposta il trasporto a LongPolling\r\n */\r\nexport const AVOID_WS: InjectionToken<boolean> = new InjectionToken<boolean>('MESSAGE_PACK');","/**\r\n * Definisce un Endpoint che spedisce un'informazione di tipo TIn e restituisce un'informazione di tipo TOut\r\n */\r\nexport class EndpointDef<TIn, TOut> {\r\n\r\n /**\r\n * Costruttore\r\n * \r\n * @param {string} endpoint Nome del metodo da chiamare nell'Hub del Backend contattato\r\n * @param {TIn} inTypeDefault Default per il tipo TIn. Utilizzato per fare Typecheck sulle chiamate da Backend a Frontend\r\n * @param {TOut} outTypeDefault Default per il tipo TOut. Utilizzato per fare Typecheck sulle chiamate da Frontend a Backend\r\n */\r\n constructor(public endpoint: string, public inTypeDefault: TIn, public outTypeDefault: TOut) { }\r\n\r\n\r\n /** Helper per la creazione rapida di un Endpoint di solo INPUT */\r\n public static In<TIn>(name: string, inTypeDefault: TIn): EndpointDef<TIn, void> {\r\n return new EndpointDef<TIn, void>(name, inTypeDefault, undefined);\r\n }\r\n\r\n /** Helper per la creazione rapida di un Endpoint di solo OUTPUT */\r\n public static Out<TOut>(name: string, outTypeDefault: TOut): EndpointDef<void, TOut> {\r\n return new EndpointDef<void, TOut>(name, undefined, outTypeDefault);\r\n }\r\n\r\n /** Helper per la creazione rapida di un Endpoint di INPUT e OUTPUT (BIDIREZIONALE) */\r\n public static Bi<TIn, TOut>(name: string, inTypeDefault: TIn, outTypeDefault: TOut): EndpointDef<TIn, TOut> {\r\n return new EndpointDef<TIn, TOut>(name, inTypeDefault, outTypeDefault);\r\n }\r\n}","export class JobProgressDto {\r\n instance: string;\r\n name: string;\r\n group: string;\r\n progress: number;\r\n type: string;\r\n\r\n description: string;\r\n user: string;\r\n etams: number;\r\n durationms: number;\r\n\r\n resultfile: string;\r\n resultreport: string;\r\n resultcomplexreport: string;\r\n\r\n actionid: string;\r\n logchunk: string;\r\n \r\n // !!!!! Vedi es-table.ReportParam\r\n resultreportparams: {\r\n /** Codice del parametro */\r\n id: string;\r\n /** Descrizione del parametro */\r\n description: string;\r\n /** Sequenza del parametro per ordinarlo logicamente rispetto agli altri */\r\n seq: number;\r\n /** Typecode C# della tipologia di parametro */\r\n typecode: number;\r\n /** Indica se i parametro è richiesto o meno */\r\n required: boolean;\r\n /** Valore del parametro, offerto sia come valore di default o in alternativa riempito lato UI */\r\n value?: any;\r\n /** Indica se questo parametro si basa su un enum. Se questa proprietà è true mi aspetto che almeno **enumtype** sia valorizzato */\r\n isenum: boolean;\r\n /** Indica se questo parametro si basa su un dizionario. Se questa proprietà è true mi aspetto che almeno **dictype** sia valorizzato */\r\n isdictionary: boolean;\r\n /** Indica se il parametro è di tipo data */\r\n isdate: boolean;\r\n /** Indica se il parametro è di tipo boolean */\r\n isboolean: boolean;\r\n /** Valori disponibili per questo parametro, da valorizzare in caso **enumtype** o **dictype** fossero valorizzati */\r\n availablevalues?: {\r\n id: string;\r\n description: string;\r\n }[];\r\n /** Tipo enumerabile del parametro (qualora fosse un dizionario di valori) */\r\n enumtype?: string;\r\n /** Colonna relativa e questo parametro */\r\n column?: string;\r\n /** Tipo del dizionario */\r\n dictype?: string;\r\n /** Indica un filtro da applicare nei confronti del Backend qualora si vogliano caricare solo le possibilità logicamente accettabili per questo parametro */\r\n dictionaryfilter?: string;\r\n /** Tipologia lato \"typescript\" di questo parametro, dev'essere sempre logicamente congruente al **typecode** */\r\n type?: \"string\" | \"number\" | \"date\" | \"boolean\";\r\n /** Eventuale pattern di validazione per questo parametro */\r\n pattern?: string;\r\n }[];\r\n}","// Angular\r\nimport { Injectable } from '@angular/core';\r\n\r\n// Modelli\r\nimport { EndpointDef } from './EndpointDef';\r\nimport { JobProgressDto } from './JobProgressDto';\r\n\r\n/**\r\n * Classe base da estendere con la definizione degli Endpoint supportati dall'applicazione\r\n */\r\n@Injectable()\r\nexport class BaseMessageService {\r\n\r\n private definitions: EndpointDef<any, any>[] = [];\r\n\r\n public IN_JobProgressNotification = EndpointDef.In(\"SendProgressNotification\", new JobProgressDto());\r\n public IN_SendVersion = EndpointDef.In(\"SendVersion\", \"\");\r\n public IN_ClearCache = EndpointDef.In(\"ClearCache\", \"\");\r\n public IN_ClearPreferecnes = EndpointDef.In(\"ClearPreferecnes\", \"\");\r\n\r\n\r\n public OUT_QueryJobStatus = EndpointDef.Out(\"QueryJobStatus\", null);\r\n\r\n /** Entrypoint che restituisce tutti gli Endpoint dell'applicazione. Da overridare qualora non venga utilizzato il metodo **add** */\r\n public get AllDefinitions(): EndpointDef<any, any>[] { return this.definitions; }\r\n\r\n constructor() {\r\n this.add(this.IN_JobProgressNotification);\r\n this.add(this.IN_SendVersion);\r\n this.add(this.IN_ClearCache);\r\n this.add(this.IN_ClearPreferecnes);\r\n this.add(this.OUT_QueryJobStatus);\r\n }\r\n\r\n public add(endpoint: EndpointDef<any, any>) {\r\n this.definitions.push(endpoint);\r\n }\r\n}","// Angular\r\nimport { Injectable, Inject } from \"@angular/core\";\r\n\r\n// Direttive, Componenti, Librerie\r\nimport * as signalR from '@microsoft/signalr';\r\nimport { HubConnectionState } from \"@microsoft/signalr\";\r\nimport { Observable, Subject, EMPTY, from, of } from \"rxjs\";\r\nimport { catchError, concatMap, delay, tap } from \"rxjs/operators\";\r\n\r\n// Modelli\r\nimport { BaseMessageService } from './models/BaseMessageService';\r\nimport { EndpointDef } from './models/EndpointDef';\r\nimport { SGR_DEBUG_MODE, ENDPOINT_URL, MESSAGE_PACK, SIGNALR_ENABLED, AUTO_RECONNECT, AVOID_WS } from \"./tokens\";\r\n\r\n/** Servizio che gestisce la comunicazione con un Hub SignalR in base alle configurazioni fornite dall'applicazione */\r\n@Injectable()\r\nexport class NotificationsService {\r\n\r\n /** Cache degli Observable generati in base agli Endpoint disponibili */\r\n private notifications$: { [index: string]: Subject<any> } = {};\r\n\r\n /** Connessione Signalr */\r\n private connection: signalR.HubConnection;\r\n\r\n /** Coda di chiamate da recuperare quando la connessione viene finalmente aperta */\r\n private RequestsToRecover: { item: EndpointDef<any, any>, dto: any }[] = [];\r\n\r\n /** @ignore Costruttore */\r\n constructor(private MessageDef: BaseMessageService, @Inject(ENDPOINT_URL) private endpoint_url: string, @Inject(MESSAGE_PACK) private msgpack: boolean, @Inject(AVOID_WS) private avoidWs: boolean, @Inject(SIGNALR_ENABLED) private enabled: boolean, @Inject(SGR_DEBUG_MODE) private debug: boolean, @Inject(AUTO_RECONNECT) private autoreconnect: boolean) {\r\n if (!this.enabled) {\r\n this.log(this.loc(\"SignalR won't be enabled as per configuration\"));\r\n return;\r\n }\r\n\r\n this.init();\r\n }\r\n\r\n private async init(){\r\n this.MessageDef.AllDefinitions.forEach(def => { this.notifications$[def.endpoint] = new Subject<typeof def.inTypeDefault>(); });\r\n\r\n let pars: signalR.IHttpConnectionOptions = { skipNegotiation: this.avoidWs ? false : true, transport: this.avoidWs ? signalR.HttpTransportType.LongPolling : signalR.HttpTransportType.WebSockets, logger: this.debug ? signalR.LogLevel.Trace : signalR.LogLevel.None };\r\n var builder = new signalR.HubConnectionBuilder().withUrl(\"/\" + this.endpoint_url, pars);\r\n\r\n if (this.autoreconnect) {\r\n this.log(this.loc(\"Building SignalR Hub with Automatic Reconnection\"));\r\n // 100 tentativi di riconnessione, 1 ogni 5 secondi\r\n builder = builder.withAutomaticReconnect(new Array(100).fill(5 * 1000));\r\n }\r\n\r\n if (this.msgpack) {\r\n this.log(this.loc(\"Building SignalR Hub with MessagePack protocol\"));\r\n var mphpModule = await import(\"@microsoft/signalr-protocol-msgpack\");\r\n builder = builder.withHubProtocol(new mphpModule.MessagePackHubProtocol())\r\n }\r\n\r\n this.connection = builder.build();\r\n this.connect(() => {\r\n if (this.RequestsToRecover.length == 0)\r\n return;\r\n\r\n for (let i = 0; i < this.RequestsToRecover.length; i++) {\r\n this.log(this.loc(\"Recovering request to Endpoint\") + \" \" + this.RequestsToRecover[i].item.endpoint)\r\n this.send(this.RequestsToRecover[i].item, this.RequestsToRecover[i].dto);\r\n }\r\n\r\n this.RequestsToRecover = [];\r\n });\r\n }\r\n\r\n /**\r\n * Effettua la connessione all'Hub Signalr e registra tutti gli Endpoint per cui il Backend comunica con il Frontend sulla **connection**\r\n */\r\n private connect(onConnected?: () => void) {\r\n this.connection.start().catch(err => console.log(err)).then(_ => onConnected?.());\r\n this.MessageDef.AllDefinitions.forEach(d => {\r\n //Registro solo le cose di IN, quelle di out sono chiamate che faccio io al BE quindi non servono\r\n if (d.inTypeDefault !== null && (d.outTypeDefault === null || d.outTypeDefault === undefined))\r\n this.connection.on(d.endpoint, (message) => {\r\n this.log(this.loc(\"Request received from the server for endpoint\") + \" '\" + d.endpoint + \"': \" + (message ? this.substringLog(JSON.stringify(message)): \"[No message]\"));\r\n this.notifications$[d.endpoint].next(message);\r\n });\r\n else\r\n this.log(this.loc(\"Refusing to register endpoint\") + \" \" + d.endpoint + \" \" + this.loc(\"because it is not declared as IN - ONLY\"));\r\n });\r\n }\r\n\r\n /**\r\n * Effettua verifiche sulla connessione e, in caso non fosse collegata, tenta di riconnetterla\r\n * \r\n * @returns {Promise<'OK' | 'KO' | 'NO-OP'>} 'OK' Se la connessione è già connessa o è stata riconnessa con successo, 'KO' Se non è stato possibile riconnettere \r\n * una connessione disconnessa, 'NO-OP' se la connesisone è in uno stato intermedio che non può essere modificato\r\n */\r\n public ensureConnected(): Promise<'OK' | 'KO' | 'NO-OP'> {\r\n if (this.connection.state == HubConnectionState.Disconnected) {\r\n this.log(this.loc(\"Connection lost or missing, reconnecting...\"));\r\n\r\n return this.connection.start()\r\n .then(_ => {\r\n return Promise.resolve(\"OK\");\r\n }, _ => {\r\n this.log(this.loc(\"Cannot reconnect SignalR, frontend HUB offline\"));\r\n return Promise.resolve(\"KO\");\r\n });\r\n }\r\n else if (this.connection.state == HubConnectionState.Connected)\r\n return Promise.resolve(\"OK\");\r\n else\r\n return Promise.resolve(\"NO-OP\");\r\n }\r\n\r\n\r\n /**\r\n * Invia un messaggio all'Hub del Backend\r\n * \r\n * @param {EndpointDef<any, TOut>} item Endpoint da contattare\r\n * @param {TOut} dto Dto da inviare all'Endpoint\r\n */\r\n public send<TOut>(item: EndpointDef<any, TOut>, dto: TOut) {\r\n if (!this.connection) {\r\n this.RequestsToRecover.push({ item, dto });\r\n return;\r\n }\r\n\r\n if (!this.enabled) {\r\n this.log(this.loc(\"Send request ignored because SignalR is not active by configuration\"));\r\n return EMPTY;\r\n }\r\n\r\n if (this.connection.state == HubConnectionState.Connecting || this.connection.state == HubConnectionState.Reconnecting || this.connection.state == HubConnectionState.Disconnecting) {\r\n this.log(this.loc(\"Send request sent before a connection was in stable State, waiting 1 second and retrying\"));\r\n setTimeout(() => { this.send(item, dto); }, 1000);\r\n }\r\n else if (this.connection.state == HubConnectionState.Disconnected) {\r\n this.ensureConnected().then(t => {\r\n if (t == \"KO\") this.log(this.loc(\"ERRORS on reconnecting before retrying a send command. Sent message WILL BE LOST\"));\r\n else this.send(item, dto);\r\n })\r\n }\r\n else {\r\n this.connection.send(item.endpoint, dto).then(_ => {\r\n if (this.debug)\r\n console.info(this.loc(\"Request sent to server\") + \" - \" + item.endpoint + \": \" + this.substringLog(JSON.stringify(dto)));\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Invia un messaggio all'Hub del Backend, aspettandosi una risposta\r\n * \r\n * @param {EndpointDef<TOut, TIn>} item Endpoint da contattare\r\n * @param {TOut} dto Dto da inviare all'Endpoint\r\n * \r\n * @returns {Observable<TIn>} Observable su cui ci si può registrare per ricevere il risultato della chiamata\r\n */\r\n public invoke<TOut, TIn>(item: EndpointDef<TOut, TIn>, dto: TOut): Observable<TIn> {\r\n if (!this.enabled) {\r\n this.log(this.loc(\"Invoke request ignored because SignalR is not active by configuration\"));\r\n return EMPTY;\r\n }\r\n\r\n if (this.connection.state == HubConnectionState.Connecting || this.connection.state == HubConnectionState.Reconnecting || this.connection.state == HubConnectionState.Disconnecting) {\r\n this.log(this.loc(\"Invoke request sent before a connection was in stable State, waiting 1 second and retrying\"));\r\n return of().pipe(delay(1000), concatMap(() => this.invoke(item, dto)));\r\n }\r\n else if (this.connection.state == HubConnectionState.Disconnected) {\r\n return from(this.ensureConnected()).pipe(concatMap((res) => {\r\n if (res == \"KO\") {\r\n this.log(this.loc(\"ERRORS on reconnecting before retrying a send command. Sent message WILL BE LOST\"));\r\n return EMPTY;\r\n }\r\n else return this.invoke(item, dto);\r\n }))\r\n }\r\n else {\r\n return from(this.connection.invoke<TIn>(item.endpoint, dto)).pipe(\r\n tap(() => {\r\n if (this.debug) console.log(this.loc(\"Request invoked to server\") + \" - \" + item.endpoint + \": \" + this.substringLog(JSON.stringify(dto)));\r\n })\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Hook per osservare i dati spediti ad un Endpoint dal Backend\r\n * \r\n * @param {EndpointDef<TIn, any>} item Endpoint su cui ascoltare\r\n * \r\n * @returns {Observable<TIn>} Observable su cui ci si può registrare per ricevere l'oggetto generato ad ogni chiamata dal Backend al Frontend\r\n */\r\n public observe<TIn>(item: EndpointDef<TIn, any>): Observable<TIn> {\r\n if (!this.enabled) {\r\n this.log(this.loc(\"Observe request ignored because SignalR is not active by configuration\"));\r\n return EMPTY;\r\n }\r\n\r\n this.log(this.loc(\"Returning observable for required endpoint\") + \": \" + item.endpoint);\r\n return <Observable<TIn>>this.notifications$[item.endpoint];\r\n }\r\n\r\n /**\r\n * Disconnessione del sistema di SignalR\r\n * \r\n * @returns {Observable<void>} Observable a cui registrarsi che viene chiamato quando la disconnessione è terminata\r\n */\r\n public disconnect(): Observable<void> {\r\n //NO-OP se non attivo\r\n if (!this.enabled) {\r\n this.log(this.loc(\"Disconnection request ignored because SignalR is not active by configuration\"));\r\n return EMPTY;\r\n }\r\n\r\n return from(this.connection.stop()).pipe(\r\n catchError((err, caught) => { console.log(err); return of(null); }),\r\n tap(() => {\r\n this.log(this.loc(\"Disconnection request honored\"));\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Taglia un log troppo lungo\r\n * \r\n * @param {string} text Log da tagliare\r\n * @param {number} maxchars Numero massimo di caratteri da tenere\r\n * \r\n * @returns {string} Log tagliato\r\n */\r\n private substringLog(text: string, maxchars: number = 120): string {\r\n return text.length > maxchars ? text.substr(0, maxchars) + \"[...]\" : text;\r\n }\r\n\r\n /**\r\n * Stampa un log a console\r\n * \r\n * @param {string} message Messaggio da stampare\r\n */\r\n private log(message: string) {\r\n if (this.debug)\r\n console.log(\"@signalr-notifications: \" + message)\r\n }\r\n\r\n /**\r\n * Helper di localizzazione\r\n * \r\n * @param {string} message Messaggio da tradurre\r\n * \r\n * @returns {string} Messaggio tradotto\r\n */\r\n private loc(message: string) : string{\r\n return message;\r\n }\r\n}","\r\nimport { NgModule, ModuleWithProviders } from '@angular/core';\r\nimport { SignalrNotificationsModuleConfig } from './config/SignalrNotificationsModuleConfig';\r\nimport { BaseMessageService } from './models/BaseMessageService';\r\nimport { NotificationsService } from './signalr-notifications.service';\r\nimport { ENDPOINT_URL, SIGNALR_ENABLED, SGR_DEBUG_MODE, MESSAGE_PACK, AUTO_RECONNECT, AVOID_WS } from './tokens';\r\n\r\n@NgModule()\r\nexport class SignalrNotificationsModule {\r\n static forRoot(config?: SignalrNotificationsModuleConfig): ModuleWithProviders<SignalrNotificationsModule> {\r\n return {\r\n ngModule: SignalrNotificationsModule,\r\n providers: [\r\n NotificationsService,\r\n { provide: BaseMessageService, useClass: config?.messageService || BaseMessageService },\r\n { provide: ENDPOINT_URL, useValue: config?.endpointUrl },\r\n { provide: SIGNALR_ENABLED, useValue: config?.enabled != null ? config?.enabled : true },\r\n { provide: SGR_DEBUG_MODE, useValue: config?.debugMode != null ? config?.debugMode : false },\r\n { provide: MESSAGE_PACK, useValue: config?.useMessagePack != null ? config?.useMessagePack : false },\r\n { provide: AUTO_RECONNECT, useValue: config?.autoReconnect != null ? config?.autoReconnect : true },\r\n { provide: AVOID_WS, useValue: config?.avoidWs != null ? config?.avoidWs : false },\r\n ]\r\n };\r\n }\r\n}","// Angular\r\nimport { Type } from '@angular/core';\r\n\r\n// Modelli\r\nimport { BaseMessageService } from '../models/BaseMessageService';\r\n\r\n/**\r\n * Classe di configurazione per la libreria\r\n */\r\nexport class SignalrNotificationsModuleConfig {\r\n\r\n /**\r\n * Url nei confronti del quale aprire la connessione SignalR\r\n */\r\n endpointUrl : string;\r\n\r\n /**\r\n * Servizio che definisce i messaggi di IN e OUT coi loro default\r\n */\r\n messageService?: Type<BaseMessageService>;\r\n\r\n /**\r\n * Indica se abilitare o meno la connessione SignalR nei confronti dell'URL **hubUrl**\r\n */\r\n enabled? : boolean;\r\n\r\n /**\r\n * Indica se utilizzare message pack come protocollo di trasmissione\r\n */\r\n useMessagePack? : boolean;\r\n\r\n /**\r\n * Indica se tentare di riconnettersi automaticamente quando la connessione cade\r\n */\r\n autoReconnect? : boolean;\r\n\r\n /**\r\n * Indica se scrivere o meno i messaggi di debug\r\n */\r\n debugMode? : boolean;\r\n\r\n /**\r\n * Indica se evitare di utilizzare i Websocket\r\n */\r\n avoidWs?; boolean;\r\n}","/*\n * Public API Surface of signalr-notifications\n */\n\nexport * from './lib/tokens';\nexport * from './lib/signalr-notifications.service';\nexport * from './lib/signalr-notifications.module';\nexport * from './lib/models/BaseMessageService';\nexport * from './lib/models/EndpointDef';\nexport * from './lib/models/JobProgressDto';\nexport * from './lib/config/SignalrNotificationsModuleConfig';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.BaseMessageService"],"mappings":"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"}
package/package.json CHANGED
@@ -1,20 +1,16 @@
1
1
  {
2
2
  "name": "@esfaenza/signalr-notifications",
3
- "version": "15.2.17",
3
+ "version": "16.2.0",
4
4
  "dependencies": {
5
5
  "tslib": "^2.0.0"
6
6
  },
7
7
  "peerDependencies": {
8
- "@angular/common": "^15.2.9",
9
- "@angular/core": "^15.2.9",
10
- "@microsoft/signalr": "7.0.7",
11
- "@microsoft/signalr-protocol-msgpack": "7.0.7"
8
+ "@angular/common": "^16.2.12",
9
+ "@angular/core": "^16.2.12",
10
+ "@microsoft/signalr": "8.0.7",
11
+ "@microsoft/signalr-protocol-msgpack": "8.0.7"
12
12
  },
13
- "module": "fesm2015/esfaenza-signalr-notifications.mjs",
14
- "es2020": "fesm2020/esfaenza-signalr-notifications.mjs",
15
- "esm2020": "esm2020/esfaenza-signalr-notifications.mjs",
16
- "fesm2020": "fesm2020/esfaenza-signalr-notifications.mjs",
17
- "fesm2015": "fesm2015/esfaenza-signalr-notifications.mjs",
13
+ "module": "fesm2022/esfaenza-signalr-notifications.mjs",
18
14
  "typings": "index.d.ts",
19
15
  "exports": {
20
16
  "./package.json": {
@@ -22,11 +18,9 @@
22
18
  },
23
19
  ".": {
24
20
  "types": "./index.d.ts",
25
- "esm2020": "./esm2020/esfaenza-signalr-notifications.mjs",
26
- "es2020": "./fesm2020/esfaenza-signalr-notifications.mjs",
27
- "es2015": "./fesm2015/esfaenza-signalr-notifications.mjs",
28
- "node": "./fesm2015/esfaenza-signalr-notifications.mjs",
29
- "default": "./fesm2020/esfaenza-signalr-notifications.mjs"
21
+ "esm2022": "./esm2022/esfaenza-signalr-notifications.mjs",
22
+ "esm": "./esm2022/esfaenza-signalr-notifications.mjs",
23
+ "default": "./fesm2022/esfaenza-signalr-notifications.mjs"
30
24
  }
31
25
  },
32
26
  "sideEffects": false
@@ -1,377 +0,0 @@
1
- import * as i0 from '@angular/core';
2
- import { InjectionToken, Injectable, Inject, NgModule } from '@angular/core';
3
- import { __awaiter } from 'tslib';
4
- import * as signalR from '@microsoft/signalr';
5
- import { HubConnectionState } from '@microsoft/signalr';
6
- import { Subject, EMPTY, of, from } from 'rxjs';
7
- import { delay, concatMap, tap, catchError } from 'rxjs/operators';
8
-
9
- /**
10
- * Hub a cui collegarsi
11
- */
12
- const ENDPOINT_URL = new InjectionToken('ENDPOINT_URL');
13
- /**
14
- * Indica se la libreria dev'essere attiva o no
15
- */
16
- const SIGNALR_ENABLED = new InjectionToken('SIGNALR_ENABLED');
17
- /**
18
- * Indica se stampare messaggi di debug in console
19
- */
20
- const SGR_DEBUG_MODE = new InjectionToken('SGR_DEBUG_MODE');
21
- /**
22
- * Indica se utilizzare il protocollo di trasferimento "MessagePack"
23
- */
24
- const MESSAGE_PACK = new InjectionToken('MESSAGE_PACK');
25
- /**
26
- * Indica se tentare in automatico la riconnessione
27
- */
28
- const AUTO_RECONNECT = new InjectionToken('AUTO_RECONNECT');
29
- /**
30
- * Indica se evitare i WebSocket, imposta il trasporto a LongPolling
31
- */
32
- const AVOID_WS = new InjectionToken('MESSAGE_PACK');
33
-
34
- /**
35
- * Definisce un Endpoint che spedisce un'informazione di tipo TIn e restituisce un'informazione di tipo TOut
36
- */
37
- class EndpointDef {
38
- /**
39
- * Costruttore
40
- *
41
- * @param {string} endpoint Nome del metodo da chiamare nell'Hub del Backend contattato
42
- * @param {TIn} inTypeDefault Default per il tipo TIn. Utilizzato per fare Typecheck sulle chiamate da Backend a Frontend
43
- * @param {TOut} outTypeDefault Default per il tipo TOut. Utilizzato per fare Typecheck sulle chiamate da Frontend a Backend
44
- */
45
- constructor(endpoint, inTypeDefault, outTypeDefault) {
46
- this.endpoint = endpoint;
47
- this.inTypeDefault = inTypeDefault;
48
- this.outTypeDefault = outTypeDefault;
49
- }
50
- /** Helper per la creazione rapida di un Endpoint di solo INPUT */
51
- static In(name, inTypeDefault) {
52
- return new EndpointDef(name, inTypeDefault, undefined);
53
- }
54
- /** Helper per la creazione rapida di un Endpoint di solo OUTPUT */
55
- static Out(name, outTypeDefault) {
56
- return new EndpointDef(name, undefined, outTypeDefault);
57
- }
58
- /** Helper per la creazione rapida di un Endpoint di INPUT e OUTPUT (BIDIREZIONALE) */
59
- static Bi(name, inTypeDefault, outTypeDefault) {
60
- return new EndpointDef(name, inTypeDefault, outTypeDefault);
61
- }
62
- }
63
-
64
- class JobProgressDto {
65
- }
66
-
67
- // Angular
68
- /**
69
- * Classe base da estendere con la definizione degli Endpoint supportati dall'applicazione
70
- */
71
- class BaseMessageService {
72
- /** Entrypoint che restituisce tutti gli Endpoint dell'applicazione. Da overridare qualora non venga utilizzato il metodo **add** */
73
- get AllDefinitions() { return this.definitions; }
74
- constructor() {
75
- this.definitions = [];
76
- this.IN_JobProgressNotification = EndpointDef.In("SendProgressNotification", new JobProgressDto());
77
- this.IN_SendVersion = EndpointDef.In("SendVersion", "");
78
- this.IN_ClearCache = EndpointDef.In("ClearCache", "");
79
- this.IN_ClearPreferecnes = EndpointDef.In("ClearPreferecnes", "");
80
- this.OUT_QueryJobStatus = EndpointDef.Out("QueryJobStatus", null);
81
- this.add(this.IN_JobProgressNotification);
82
- this.add(this.IN_SendVersion);
83
- this.add(this.IN_ClearCache);
84
- this.add(this.IN_ClearPreferecnes);
85
- this.add(this.OUT_QueryJobStatus);
86
- }
87
- add(endpoint) {
88
- this.definitions.push(endpoint);
89
- }
90
- }
91
- BaseMessageService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: BaseMessageService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
92
- BaseMessageService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: BaseMessageService });
93
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: BaseMessageService, decorators: [{
94
- type: Injectable
95
- }], ctorParameters: function () { return []; } });
96
-
97
- /** Servizio che gestisce la comunicazione con un Hub SignalR in base alle configurazioni fornite dall'applicazione */
98
- class NotificationsService {
99
- /** @ignore Costruttore */
100
- constructor(MessageDef, endpoint_url, msgpack, avoidWs, enabled, debug, autoreconnect) {
101
- this.MessageDef = MessageDef;
102
- this.endpoint_url = endpoint_url;
103
- this.msgpack = msgpack;
104
- this.avoidWs = avoidWs;
105
- this.enabled = enabled;
106
- this.debug = debug;
107
- this.autoreconnect = autoreconnect;
108
- /** Cache degli Observable generati in base agli Endpoint disponibili */
109
- this.notifications$ = {};
110
- /** Coda di chiamate da recuperare quando la connessione viene finalmente aperta */
111
- this.RequestsToRecover = [];
112
- if (!this.enabled) {
113
- this.log(this.loc("SignalR won't be enabled as per configuration"));
114
- return;
115
- }
116
- this.init();
117
- }
118
- init() {
119
- return __awaiter(this, void 0, void 0, function* () {
120
- this.MessageDef.AllDefinitions.forEach(def => { this.notifications$[def.endpoint] = new Subject(); });
121
- let pars = { skipNegotiation: this.avoidWs ? false : true, transport: this.avoidWs ? signalR.HttpTransportType.LongPolling : signalR.HttpTransportType.WebSockets, logger: this.debug ? signalR.LogLevel.Debug : signalR.LogLevel.None };
122
- var builder = new signalR.HubConnectionBuilder().withUrl("/" + this.endpoint_url, pars);
123
- if (this.autoreconnect) {
124
- this.log(this.loc("Building SignalR Hub with Automatic Reconnection"));
125
- // 100 tentativi di riconnessione, 1 ogni 5 secondi
126
- builder = builder.withAutomaticReconnect(new Array(100).fill(5 * 1000));
127
- }
128
- if (this.msgpack) {
129
- this.log(this.loc("Building SignalR Hub with MessagePack protocol"));
130
- var mphpModule = yield import('@microsoft/signalr-protocol-msgpack');
131
- builder = builder.withHubProtocol(new mphpModule.MessagePackHubProtocol());
132
- }
133
- this.connection = builder.build();
134
- this.connect(() => {
135
- if (this.RequestsToRecover.length == 0)
136
- return;
137
- for (let i = 0; i < this.RequestsToRecover.length; i++) {
138
- this.log(this.loc("Recovering request to Endpoint") + " " + this.RequestsToRecover[i].item.endpoint);
139
- this.send(this.RequestsToRecover[i].item, this.RequestsToRecover[i].dto);
140
- }
141
- this.RequestsToRecover = [];
142
- });
143
- });
144
- }
145
- /**
146
- * Effettua la connessione all'Hub Signalr e registra tutti gli Endpoint per cui il Backend comunica con il Frontend sulla **connection**
147
- */
148
- connect(onConnected) {
149
- this.connection.start().catch(err => console.log(err)).then(_ => onConnected === null || onConnected === void 0 ? void 0 : onConnected());
150
- this.MessageDef.AllDefinitions.forEach(d => {
151
- //Registro solo le cose di IN, quelle di out sono chiamate che faccio io al BE quindi non servono
152
- if (d.inTypeDefault !== null && (d.outTypeDefault === null || d.outTypeDefault === undefined))
153
- this.connection.on(d.endpoint, (message) => {
154
- this.log(this.loc("Request received from the server for endpoint") + " '" + d.endpoint + "': " + (message ? this.substringLog(JSON.stringify(message)) : "[No message]"));
155
- this.notifications$[d.endpoint].next(message);
156
- });
157
- else
158
- this.log(this.loc("Refusing to register endpoint") + " " + d.endpoint + " " + this.loc("because it is not declared as IN - ONLY"));
159
- });
160
- }
161
- /**
162
- * Effettua verifiche sulla connessione e, in caso non fosse collegata, tenta di riconnetterla
163
- *
164
- * @returns {Promise<'OK' | 'KO' | 'NO-OP'>} 'OK' Se la connessione è già connessa o è stata riconnessa con successo, 'KO' Se non è stato possibile riconnettere
165
- * una connessione disconnessa, 'NO-OP' se la connesisone è in uno stato intermedio che non può essere modificato
166
- */
167
- ensureConnected() {
168
- if (this.connection.state == HubConnectionState.Disconnected) {
169
- this.log(this.loc("Connection lost or missing, reconnecting..."));
170
- return this.connection.start()
171
- .then(_ => {
172
- return Promise.resolve("OK");
173
- }, _ => {
174
- this.log(this.loc("Cannot reconnect SignalR, frontend HUB offline"));
175
- return Promise.resolve("KO");
176
- });
177
- }
178
- else if (this.connection.state == HubConnectionState.Connected)
179
- return Promise.resolve("OK");
180
- else
181
- return Promise.resolve("NO-OP");
182
- }
183
- /**
184
- * Invia un messaggio all'Hub del Backend
185
- *
186
- * @param {EndpointDef<any, TOut>} item Endpoint da contattare
187
- * @param {TOut} dto Dto da inviare all'Endpoint
188
- */
189
- send(item, dto) {
190
- if (!this.connection) {
191
- this.RequestsToRecover.push({ item, dto });
192
- return;
193
- }
194
- if (!this.enabled) {
195
- this.log(this.loc("Send request ignored because SignalR is not active by configuration"));
196
- return EMPTY;
197
- }
198
- if (this.connection.state == HubConnectionState.Connecting || this.connection.state == HubConnectionState.Reconnecting || this.connection.state == HubConnectionState.Disconnecting) {
199
- this.log(this.loc("Send request sent before a connection was in stable State, waiting 1 second and retrying"));
200
- setTimeout(() => { this.send(item, dto); }, 1000);
201
- }
202
- else if (this.connection.state == HubConnectionState.Disconnected) {
203
- this.ensureConnected().then(t => {
204
- if (t == "KO")
205
- this.log(this.loc("ERRORS on reconnecting before retrying a send command. Sent message WILL BE LOST"));
206
- else
207
- this.send(item, dto);
208
- });
209
- }
210
- else {
211
- this.connection.send(item.endpoint, dto).then(_ => {
212
- if (this.debug)
213
- console.info(this.loc("Request sent to server") + " - " + item.endpoint + ": " + this.substringLog(JSON.stringify(dto)));
214
- });
215
- }
216
- }
217
- /**
218
- * Invia un messaggio all'Hub del Backend, aspettandosi una risposta
219
- *
220
- * @param {EndpointDef<TOut, TIn>} item Endpoint da contattare
221
- * @param {TOut} dto Dto da inviare all'Endpoint
222
- *
223
- * @returns {Observable<TIn>} Observable su cui ci si può registrare per ricevere il risultato della chiamata
224
- */
225
- invoke(item, dto) {
226
- if (!this.enabled) {
227
- this.log(this.loc("Invoke request ignored because SignalR is not active by configuration"));
228
- return EMPTY;
229
- }
230
- if (this.connection.state == HubConnectionState.Connecting || this.connection.state == HubConnectionState.Reconnecting || this.connection.state == HubConnectionState.Disconnecting) {
231
- this.log(this.loc("Invoke request sent before a connection was in stable State, waiting 1 second and retrying"));
232
- return of().pipe(delay(1000), concatMap(() => this.invoke(item, dto)));
233
- }
234
- else if (this.connection.state == HubConnectionState.Disconnected) {
235
- return from(this.ensureConnected()).pipe(concatMap((res) => {
236
- if (res == "KO") {
237
- this.log(this.loc("ERRORS on reconnecting before retrying a send command. Sent message WILL BE LOST"));
238
- return EMPTY;
239
- }
240
- else
241
- return this.invoke(item, dto);
242
- }));
243
- }
244
- else {
245
- return from(this.connection.invoke(item.endpoint, dto)).pipe(tap(() => {
246
- if (this.debug)
247
- console.log(this.loc("Request invoked to server") + " - " + item.endpoint + ": " + this.substringLog(JSON.stringify(dto)));
248
- }));
249
- }
250
- }
251
- /**
252
- * Hook per osservare i dati spediti ad un Endpoint dal Backend
253
- *
254
- * @param {EndpointDef<TIn, any>} item Endpoint su cui ascoltare
255
- *
256
- * @returns {Observable<TIn>} Observable su cui ci si può registrare per ricevere l'oggetto generato ad ogni chiamata dal Backend al Frontend
257
- */
258
- observe(item) {
259
- if (!this.enabled) {
260
- this.log(this.loc("Observe request ignored because SignalR is not active by configuration"));
261
- return EMPTY;
262
- }
263
- this.log(this.loc("Returning observable for required endpoint") + ": " + item.endpoint);
264
- return this.notifications$[item.endpoint];
265
- }
266
- /**
267
- * Disconnessione del sistema di SignalR
268
- *
269
- * @returns {Observable<void>} Observable a cui registrarsi che viene chiamato quando la disconnessione è terminata
270
- */
271
- disconnect() {
272
- //NO-OP se non attivo
273
- if (!this.enabled) {
274
- this.log(this.loc("Disconnection request ignored because SignalR is not active by configuration"));
275
- return EMPTY;
276
- }
277
- return from(this.connection.stop()).pipe(catchError((err, caught) => { console.log(err); return of(null); }), tap(() => {
278
- this.log(this.loc("Disconnection request honored"));
279
- }));
280
- }
281
- /**
282
- * Taglia un log troppo lungo
283
- *
284
- * @param {string} text Log da tagliare
285
- * @param {number} maxchars Numero massimo di caratteri da tenere
286
- *
287
- * @returns {string} Log tagliato
288
- */
289
- substringLog(text, maxchars = 120) {
290
- return text.length > maxchars ? text.substr(0, maxchars) + "[...]" : text;
291
- }
292
- /**
293
- * Stampa un log a console
294
- *
295
- * @param {string} message Messaggio da stampare
296
- */
297
- log(message) {
298
- if (this.debug)
299
- console.log("@signalr-notifications: " + message);
300
- }
301
- /**
302
- * Helper di localizzazione
303
- *
304
- * @param {string} message Messaggio da tradurre
305
- *
306
- * @returns {string} Messaggio tradotto
307
- */
308
- loc(message) {
309
- return message;
310
- }
311
- }
312
- NotificationsService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: NotificationsService, deps: [{ token: BaseMessageService }, { token: ENDPOINT_URL }, { token: MESSAGE_PACK }, { token: AVOID_WS }, { token: SIGNALR_ENABLED }, { token: SGR_DEBUG_MODE }, { token: AUTO_RECONNECT }], target: i0.ɵɵFactoryTarget.Injectable });
313
- NotificationsService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: NotificationsService });
314
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: NotificationsService, decorators: [{
315
- type: Injectable
316
- }], ctorParameters: function () {
317
- return [{ type: BaseMessageService }, { type: undefined, decorators: [{
318
- type: Inject,
319
- args: [ENDPOINT_URL]
320
- }] }, { type: undefined, decorators: [{
321
- type: Inject,
322
- args: [MESSAGE_PACK]
323
- }] }, { type: undefined, decorators: [{
324
- type: Inject,
325
- args: [AVOID_WS]
326
- }] }, { type: undefined, decorators: [{
327
- type: Inject,
328
- args: [SIGNALR_ENABLED]
329
- }] }, { type: undefined, decorators: [{
330
- type: Inject,
331
- args: [SGR_DEBUG_MODE]
332
- }] }, { type: undefined, decorators: [{
333
- type: Inject,
334
- args: [AUTO_RECONNECT]
335
- }] }];
336
- } });
337
-
338
- class SignalrNotificationsModule {
339
- static forRoot(config) {
340
- return {
341
- ngModule: SignalrNotificationsModule,
342
- providers: [
343
- NotificationsService,
344
- { provide: BaseMessageService, useClass: (config === null || config === void 0 ? void 0 : config.messageService) || BaseMessageService },
345
- { provide: ENDPOINT_URL, useValue: config === null || config === void 0 ? void 0 : config.endpointUrl },
346
- { provide: SIGNALR_ENABLED, useValue: (config === null || config === void 0 ? void 0 : config.enabled) != null ? config === null || config === void 0 ? void 0 : config.enabled : true },
347
- { provide: SGR_DEBUG_MODE, useValue: (config === null || config === void 0 ? void 0 : config.debugMode) != null ? config === null || config === void 0 ? void 0 : config.debugMode : false },
348
- { provide: MESSAGE_PACK, useValue: (config === null || config === void 0 ? void 0 : config.useMessagePack) != null ? config === null || config === void 0 ? void 0 : config.useMessagePack : false },
349
- { provide: AUTO_RECONNECT, useValue: (config === null || config === void 0 ? void 0 : config.autoReconnect) != null ? config === null || config === void 0 ? void 0 : config.autoReconnect : true },
350
- { provide: AVOID_WS, useValue: (config === null || config === void 0 ? void 0 : config.avoidWs) != null ? config === null || config === void 0 ? void 0 : config.avoidWs : false },
351
- ]
352
- };
353
- }
354
- }
355
- SignalrNotificationsModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SignalrNotificationsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
356
- SignalrNotificationsModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.9", ngImport: i0, type: SignalrNotificationsModule });
357
- SignalrNotificationsModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SignalrNotificationsModule });
358
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SignalrNotificationsModule, decorators: [{
359
- type: NgModule
360
- }] });
361
-
362
- /**
363
- * Classe di configurazione per la libreria
364
- */
365
- class SignalrNotificationsModuleConfig {
366
- }
367
-
368
- /*
369
- * Public API Surface of signalr-notifications
370
- */
371
-
372
- /**
373
- * Generated bundle index. Do not edit.
374
- */
375
-
376
- export { AUTO_RECONNECT, AVOID_WS, BaseMessageService, ENDPOINT_URL, EndpointDef, JobProgressDto, MESSAGE_PACK, NotificationsService, SGR_DEBUG_MODE, SIGNALR_ENABLED, SignalrNotificationsModule, SignalrNotificationsModuleConfig };
377
- //# sourceMappingURL=esfaenza-signalr-notifications.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"esfaenza-signalr-notifications.mjs","sources":["../../../projects/signalr-notifications/src/lib/tokens.ts","../../../projects/signalr-notifications/src/lib/models/EndpointDef.ts","../../../projects/signalr-notifications/src/lib/models/JobProgressDto.ts","../../../projects/signalr-notifications/src/lib/models/BaseMessageService.ts","../../../projects/signalr-notifications/src/lib/signalr-notifications.service.ts","../../../projects/signalr-notifications/src/lib/signalr-notifications.module.ts","../../../projects/signalr-notifications/src/lib/config/SignalrNotificationsModuleConfig.ts","../../../projects/signalr-notifications/src/public-api.ts","../../../projects/signalr-notifications/src/esfaenza-signalr-notifications.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\r\n\r\n/**\r\n * Hub a cui collegarsi\r\n */\r\nexport const ENDPOINT_URL: InjectionToken<string> = new InjectionToken<string>('ENDPOINT_URL');\r\n\r\n/**\r\n * Indica se la libreria dev'essere attiva o no\r\n */\r\nexport const SIGNALR_ENABLED: InjectionToken<string> = new InjectionToken<boolean>('SIGNALR_ENABLED');\r\n\r\n/**\r\n * Indica se stampare messaggi di debug in console\r\n */\r\nexport const SGR_DEBUG_MODE: InjectionToken<string> = new InjectionToken<boolean>('SGR_DEBUG_MODE');\r\n\r\n/**\r\n * Indica se utilizzare il protocollo di trasferimento \"MessagePack\"\r\n */\r\nexport const MESSAGE_PACK: InjectionToken<boolean> = new InjectionToken<boolean>('MESSAGE_PACK');\r\n\r\n/**\r\n * Indica se tentare in automatico la riconnessione\r\n */\r\nexport const AUTO_RECONNECT: InjectionToken<boolean> = new InjectionToken<boolean>('AUTO_RECONNECT');\r\n\r\n/**\r\n * Indica se evitare i WebSocket, imposta il trasporto a LongPolling\r\n */\r\nexport const AVOID_WS: InjectionToken<boolean> = new InjectionToken<boolean>('MESSAGE_PACK');","/**\r\n * Definisce un Endpoint che spedisce un'informazione di tipo TIn e restituisce un'informazione di tipo TOut\r\n */\r\nexport class EndpointDef<TIn, TOut> {\r\n\r\n /**\r\n * Costruttore\r\n * \r\n * @param {string} endpoint Nome del metodo da chiamare nell'Hub del Backend contattato\r\n * @param {TIn} inTypeDefault Default per il tipo TIn. Utilizzato per fare Typecheck sulle chiamate da Backend a Frontend\r\n * @param {TOut} outTypeDefault Default per il tipo TOut. Utilizzato per fare Typecheck sulle chiamate da Frontend a Backend\r\n */\r\n constructor(public endpoint: string, public inTypeDefault: TIn, public outTypeDefault: TOut) { }\r\n\r\n\r\n /** Helper per la creazione rapida di un Endpoint di solo INPUT */\r\n public static In<TIn>(name: string, inTypeDefault: TIn): EndpointDef<TIn, void> {\r\n return new EndpointDef<TIn, void>(name, inTypeDefault, undefined);\r\n }\r\n\r\n /** Helper per la creazione rapida di un Endpoint di solo OUTPUT */\r\n public static Out<TOut>(name: string, outTypeDefault: TOut): EndpointDef<void, TOut> {\r\n return new EndpointDef<void, TOut>(name, undefined, outTypeDefault);\r\n }\r\n\r\n /** Helper per la creazione rapida di un Endpoint di INPUT e OUTPUT (BIDIREZIONALE) */\r\n public static Bi<TIn, TOut>(name: string, inTypeDefault: TIn, outTypeDefault: TOut): EndpointDef<TIn, TOut> {\r\n return new EndpointDef<TIn, TOut>(name, inTypeDefault, outTypeDefault);\r\n }\r\n}","export class JobProgressDto {\r\n instance: string;\r\n name: string;\r\n group: string;\r\n progress: number;\r\n type: string;\r\n\r\n description: string;\r\n user: string;\r\n etams: number;\r\n durationms: number;\r\n\r\n resultfile: string;\r\n resultreport: string;\r\n resultcomplexreport: string;\r\n\r\n actionid: string;\r\n logchunk: string;\r\n \r\n // !!!!! Vedi es-table.ReportParam\r\n resultreportparams: {\r\n /** Codice del parametro */\r\n id: string;\r\n /** Descrizione del parametro */\r\n description: string;\r\n /** Sequenza del parametro per ordinarlo logicamente rispetto agli altri */\r\n seq: number;\r\n /** Typecode C# della tipologia di parametro */\r\n typecode: number;\r\n /** Indica se i parametro è richiesto o meno */\r\n required: boolean;\r\n /** Valore del parametro, offerto sia come valore di default o in alternativa riempito lato UI */\r\n value?: any;\r\n /** Indica se questo parametro si basa su un enum. Se questa proprietà è true mi aspetto che almeno **enumtype** sia valorizzato */\r\n isenum: boolean;\r\n /** Indica se questo parametro si basa su un dizionario. Se questa proprietà è true mi aspetto che almeno **dictype** sia valorizzato */\r\n isdictionary: boolean;\r\n /** Indica se il parametro è di tipo data */\r\n isdate: boolean;\r\n /** Indica se il parametro è di tipo boolean */\r\n isboolean: boolean;\r\n /** Valori disponibili per questo parametro, da valorizzare in caso **enumtype** o **dictype** fossero valorizzati */\r\n availablevalues?: {\r\n id: string;\r\n description: string;\r\n }[];\r\n /** Tipo enumerabile del parametro (qualora fosse un dizionario di valori) */\r\n enumtype?: string;\r\n /** Colonna relativa e questo parametro */\r\n column?: string;\r\n /** Tipo del dizionario */\r\n dictype?: string;\r\n /** Indica un filtro da applicare nei confronti del Backend qualora si vogliano caricare solo le possibilità logicamente accettabili per questo parametro */\r\n dictionaryfilter?: string;\r\n /** Tipologia lato \"typescript\" di questo parametro, dev'essere sempre logicamente congruente al **typecode** */\r\n type?: \"string\" | \"number\" | \"date\" | \"boolean\";\r\n /** Eventuale pattern di validazione per questo parametro */\r\n pattern?: string;\r\n }[];\r\n}","// Angular\r\nimport { Injectable } from '@angular/core';\r\n\r\n// Modelli\r\nimport { EndpointDef } from './EndpointDef';\r\nimport { JobProgressDto } from './JobProgressDto';\r\n\r\n/**\r\n * Classe base da estendere con la definizione degli Endpoint supportati dall'applicazione\r\n */\r\n@Injectable()\r\nexport class BaseMessageService {\r\n\r\n private definitions: EndpointDef<any, any>[] = [];\r\n\r\n public IN_JobProgressNotification = EndpointDef.In(\"SendProgressNotification\", new JobProgressDto());\r\n public IN_SendVersion = EndpointDef.In(\"SendVersion\", \"\");\r\n public IN_ClearCache = EndpointDef.In(\"ClearCache\", \"\");\r\n public IN_ClearPreferecnes = EndpointDef.In(\"ClearPreferecnes\", \"\");\r\n\r\n\r\n public OUT_QueryJobStatus = EndpointDef.Out(\"QueryJobStatus\", null);\r\n\r\n /** Entrypoint che restituisce tutti gli Endpoint dell'applicazione. Da overridare qualora non venga utilizzato il metodo **add** */\r\n public get AllDefinitions(): EndpointDef<any, any>[] { return this.definitions; }\r\n\r\n constructor() {\r\n this.add(this.IN_JobProgressNotification);\r\n this.add(this.IN_SendVersion);\r\n this.add(this.IN_ClearCache);\r\n this.add(this.IN_ClearPreferecnes);\r\n this.add(this.OUT_QueryJobStatus);\r\n }\r\n\r\n public add(endpoint: EndpointDef<any, any>) {\r\n this.definitions.push(endpoint);\r\n }\r\n}","// Angular\r\nimport { Injectable, Inject } from \"@angular/core\";\r\n\r\n// Direttive, Componenti, Librerie\r\nimport * as signalR from '@microsoft/signalr';\r\nimport { HubConnectionState } from \"@microsoft/signalr\";\r\nimport { Observable, Subject, EMPTY, from, of } from \"rxjs\";\r\nimport { catchError, concatMap, delay, tap } from \"rxjs/operators\";\r\n\r\n// Modelli\r\nimport { BaseMessageService } from './models/BaseMessageService';\r\nimport { EndpointDef } from './models/EndpointDef';\r\nimport { SGR_DEBUG_MODE, ENDPOINT_URL, MESSAGE_PACK, SIGNALR_ENABLED, AUTO_RECONNECT, AVOID_WS } from \"./tokens\";\r\n\r\n/** Servizio che gestisce la comunicazione con un Hub SignalR in base alle configurazioni fornite dall'applicazione */\r\n@Injectable()\r\nexport class NotificationsService {\r\n\r\n /** Cache degli Observable generati in base agli Endpoint disponibili */\r\n private notifications$: { [index: string]: Subject<any> } = {};\r\n\r\n /** Connessione Signalr */\r\n private connection: signalR.HubConnection;\r\n\r\n /** Coda di chiamate da recuperare quando la connessione viene finalmente aperta */\r\n private RequestsToRecover: { item: EndpointDef<any, any>, dto: any }[] = [];\r\n\r\n /** @ignore Costruttore */\r\n constructor(private MessageDef: BaseMessageService, @Inject(ENDPOINT_URL) private endpoint_url: string, @Inject(MESSAGE_PACK) private msgpack: boolean, @Inject(AVOID_WS) private avoidWs: boolean, @Inject(SIGNALR_ENABLED) private enabled: boolean, @Inject(SGR_DEBUG_MODE) private debug: boolean, @Inject(AUTO_RECONNECT) private autoreconnect: boolean) {\r\n if (!this.enabled) {\r\n this.log(this.loc(\"SignalR won't be enabled as per configuration\"));\r\n return;\r\n }\r\n\r\n this.init();\r\n }\r\n\r\n private async init(){\r\n this.MessageDef.AllDefinitions.forEach(def => { this.notifications$[def.endpoint] = new Subject<typeof def.inTypeDefault>(); });\r\n\r\n let pars: signalR.IHttpConnectionOptions = { skipNegotiation: this.avoidWs ? false : true, transport: this.avoidWs ? signalR.HttpTransportType.LongPolling : signalR.HttpTransportType.WebSockets, logger: this.debug ? signalR.LogLevel.Debug : signalR.LogLevel.None };\r\n var builder = new signalR.HubConnectionBuilder().withUrl(\"/\" + this.endpoint_url, pars);\r\n\r\n if (this.autoreconnect) {\r\n this.log(this.loc(\"Building SignalR Hub with Automatic Reconnection\"));\r\n // 100 tentativi di riconnessione, 1 ogni 5 secondi\r\n builder = builder.withAutomaticReconnect(new Array(100).fill(5 * 1000));\r\n }\r\n\r\n if (this.msgpack) {\r\n this.log(this.loc(\"Building SignalR Hub with MessagePack protocol\"));\r\n var mphpModule = await import(\"@microsoft/signalr-protocol-msgpack\");\r\n builder = builder.withHubProtocol(new mphpModule.MessagePackHubProtocol())\r\n }\r\n\r\n this.connection = builder.build();\r\n this.connect(() => {\r\n if (this.RequestsToRecover.length == 0)\r\n return;\r\n\r\n for (let i = 0; i < this.RequestsToRecover.length; i++) {\r\n this.log(this.loc(\"Recovering request to Endpoint\") + \" \" + this.RequestsToRecover[i].item.endpoint)\r\n this.send(this.RequestsToRecover[i].item, this.RequestsToRecover[i].dto);\r\n }\r\n\r\n this.RequestsToRecover = [];\r\n });\r\n }\r\n\r\n /**\r\n * Effettua la connessione all'Hub Signalr e registra tutti gli Endpoint per cui il Backend comunica con il Frontend sulla **connection**\r\n */\r\n private connect(onConnected?: () => void) {\r\n this.connection.start().catch(err => console.log(err)).then(_ => onConnected?.());\r\n this.MessageDef.AllDefinitions.forEach(d => {\r\n //Registro solo le cose di IN, quelle di out sono chiamate che faccio io al BE quindi non servono\r\n if (d.inTypeDefault !== null && (d.outTypeDefault === null || d.outTypeDefault === undefined))\r\n this.connection.on(d.endpoint, (message) => {\r\n this.log(this.loc(\"Request received from the server for endpoint\") + \" '\" + d.endpoint + \"': \" + (message ? this.substringLog(JSON.stringify(message)): \"[No message]\"));\r\n this.notifications$[d.endpoint].next(message);\r\n });\r\n else\r\n this.log(this.loc(\"Refusing to register endpoint\") + \" \" + d.endpoint + \" \" + this.loc(\"because it is not declared as IN - ONLY\"));\r\n });\r\n }\r\n\r\n /**\r\n * Effettua verifiche sulla connessione e, in caso non fosse collegata, tenta di riconnetterla\r\n * \r\n * @returns {Promise<'OK' | 'KO' | 'NO-OP'>} 'OK' Se la connessione è già connessa o è stata riconnessa con successo, 'KO' Se non è stato possibile riconnettere \r\n * una connessione disconnessa, 'NO-OP' se la connesisone è in uno stato intermedio che non può essere modificato\r\n */\r\n public ensureConnected(): Promise<'OK' | 'KO' | 'NO-OP'> {\r\n if (this.connection.state == HubConnectionState.Disconnected) {\r\n this.log(this.loc(\"Connection lost or missing, reconnecting...\"));\r\n\r\n return this.connection.start()\r\n .then(_ => {\r\n return Promise.resolve(\"OK\");\r\n }, _ => {\r\n this.log(this.loc(\"Cannot reconnect SignalR, frontend HUB offline\"));\r\n return Promise.resolve(\"KO\");\r\n });\r\n }\r\n else if (this.connection.state == HubConnectionState.Connected)\r\n return Promise.resolve(\"OK\");\r\n else\r\n return Promise.resolve(\"NO-OP\");\r\n }\r\n\r\n\r\n /**\r\n * Invia un messaggio all'Hub del Backend\r\n * \r\n * @param {EndpointDef<any, TOut>} item Endpoint da contattare\r\n * @param {TOut} dto Dto da inviare all'Endpoint\r\n */\r\n public send<TOut>(item: EndpointDef<any, TOut>, dto: TOut) {\r\n if (!this.connection) {\r\n this.RequestsToRecover.push({ item, dto });\r\n return;\r\n }\r\n\r\n if (!this.enabled) {\r\n this.log(this.loc(\"Send request ignored because SignalR is not active by configuration\"));\r\n return EMPTY;\r\n }\r\n\r\n if (this.connection.state == HubConnectionState.Connecting || this.connection.state == HubConnectionState.Reconnecting || this.connection.state == HubConnectionState.Disconnecting) {\r\n this.log(this.loc(\"Send request sent before a connection was in stable State, waiting 1 second and retrying\"));\r\n setTimeout(() => { this.send(item, dto); }, 1000);\r\n }\r\n else if (this.connection.state == HubConnectionState.Disconnected) {\r\n this.ensureConnected().then(t => {\r\n if (t == \"KO\") this.log(this.loc(\"ERRORS on reconnecting before retrying a send command. Sent message WILL BE LOST\"));\r\n else this.send(item, dto);\r\n })\r\n }\r\n else {\r\n this.connection.send(item.endpoint, dto).then(_ => {\r\n if (this.debug)\r\n console.info(this.loc(\"Request sent to server\") + \" - \" + item.endpoint + \": \" + this.substringLog(JSON.stringify(dto)));\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Invia un messaggio all'Hub del Backend, aspettandosi una risposta\r\n * \r\n * @param {EndpointDef<TOut, TIn>} item Endpoint da contattare\r\n * @param {TOut} dto Dto da inviare all'Endpoint\r\n * \r\n * @returns {Observable<TIn>} Observable su cui ci si può registrare per ricevere il risultato della chiamata\r\n */\r\n public invoke<TOut, TIn>(item: EndpointDef<TOut, TIn>, dto: TOut): Observable<TIn> {\r\n if (!this.enabled) {\r\n this.log(this.loc(\"Invoke request ignored because SignalR is not active by configuration\"));\r\n return EMPTY;\r\n }\r\n\r\n if (this.connection.state == HubConnectionState.Connecting || this.connection.state == HubConnectionState.Reconnecting || this.connection.state == HubConnectionState.Disconnecting) {\r\n this.log(this.loc(\"Invoke request sent before a connection was in stable State, waiting 1 second and retrying\"));\r\n return of().pipe(delay(1000), concatMap(() => this.invoke(item, dto)));\r\n }\r\n else if (this.connection.state == HubConnectionState.Disconnected) {\r\n return from(this.ensureConnected()).pipe(concatMap((res) => {\r\n if (res == \"KO\") {\r\n this.log(this.loc(\"ERRORS on reconnecting before retrying a send command. Sent message WILL BE LOST\"));\r\n return EMPTY;\r\n }\r\n else return this.invoke(item, dto);\r\n }))\r\n }\r\n else {\r\n return from(this.connection.invoke<TIn>(item.endpoint, dto)).pipe(\r\n tap(() => {\r\n if (this.debug) console.log(this.loc(\"Request invoked to server\") + \" - \" + item.endpoint + \": \" + this.substringLog(JSON.stringify(dto)));\r\n })\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Hook per osservare i dati spediti ad un Endpoint dal Backend\r\n * \r\n * @param {EndpointDef<TIn, any>} item Endpoint su cui ascoltare\r\n * \r\n * @returns {Observable<TIn>} Observable su cui ci si può registrare per ricevere l'oggetto generato ad ogni chiamata dal Backend al Frontend\r\n */\r\n public observe<TIn>(item: EndpointDef<TIn, any>): Observable<TIn> {\r\n if (!this.enabled) {\r\n this.log(this.loc(\"Observe request ignored because SignalR is not active by configuration\"));\r\n return EMPTY;\r\n }\r\n\r\n this.log(this.loc(\"Returning observable for required endpoint\") + \": \" + item.endpoint);\r\n return <Observable<TIn>>this.notifications$[item.endpoint];\r\n }\r\n\r\n /**\r\n * Disconnessione del sistema di SignalR\r\n * \r\n * @returns {Observable<void>} Observable a cui registrarsi che viene chiamato quando la disconnessione è terminata\r\n */\r\n public disconnect(): Observable<void> {\r\n //NO-OP se non attivo\r\n if (!this.enabled) {\r\n this.log(this.loc(\"Disconnection request ignored because SignalR is not active by configuration\"));\r\n return EMPTY;\r\n }\r\n\r\n return from(this.connection.stop()).pipe(\r\n catchError((err, caught) => { console.log(err); return of(null); }),\r\n tap(() => {\r\n this.log(this.loc(\"Disconnection request honored\"));\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Taglia un log troppo lungo\r\n * \r\n * @param {string} text Log da tagliare\r\n * @param {number} maxchars Numero massimo di caratteri da tenere\r\n * \r\n * @returns {string} Log tagliato\r\n */\r\n private substringLog(text: string, maxchars: number = 120): string {\r\n return text.length > maxchars ? text.substr(0, maxchars) + \"[...]\" : text;\r\n }\r\n\r\n /**\r\n * Stampa un log a console\r\n * \r\n * @param {string} message Messaggio da stampare\r\n */\r\n private log(message: string) {\r\n if (this.debug)\r\n console.log(\"@signalr-notifications: \" + message)\r\n }\r\n\r\n /**\r\n * Helper di localizzazione\r\n * \r\n * @param {string} message Messaggio da tradurre\r\n * \r\n * @returns {string} Messaggio tradotto\r\n */\r\n private loc(message: string) : string{\r\n return message;\r\n }\r\n}","\r\nimport { NgModule, ModuleWithProviders } from '@angular/core';\r\nimport { SignalrNotificationsModuleConfig } from './config/SignalrNotificationsModuleConfig';\r\nimport { BaseMessageService } from './models/BaseMessageService';\r\nimport { NotificationsService } from './signalr-notifications.service';\r\nimport { ENDPOINT_URL, SIGNALR_ENABLED, SGR_DEBUG_MODE, MESSAGE_PACK, AUTO_RECONNECT, AVOID_WS } from './tokens';\r\n\r\n@NgModule()\r\nexport class SignalrNotificationsModule {\r\n static forRoot(config?: SignalrNotificationsModuleConfig): ModuleWithProviders<SignalrNotificationsModule> {\r\n return {\r\n ngModule: SignalrNotificationsModule,\r\n providers: [\r\n NotificationsService,\r\n { provide: BaseMessageService, useClass: config?.messageService || BaseMessageService },\r\n { provide: ENDPOINT_URL, useValue: config?.endpointUrl },\r\n { provide: SIGNALR_ENABLED, useValue: config?.enabled != null ? config?.enabled : true },\r\n { provide: SGR_DEBUG_MODE, useValue: config?.debugMode != null ? config?.debugMode : false },\r\n { provide: MESSAGE_PACK, useValue: config?.useMessagePack != null ? config?.useMessagePack : false },\r\n { provide: AUTO_RECONNECT, useValue: config?.autoReconnect != null ? config?.autoReconnect : true },\r\n { provide: AVOID_WS, useValue: config?.avoidWs != null ? config?.avoidWs : false },\r\n ]\r\n };\r\n }\r\n}","// Angular\r\nimport { Type } from '@angular/core';\r\n\r\n// Modelli\r\nimport { BaseMessageService } from '../models/BaseMessageService';\r\n\r\n/**\r\n * Classe di configurazione per la libreria\r\n */\r\nexport class SignalrNotificationsModuleConfig {\r\n\r\n /**\r\n * Url nei confronti del quale aprire la connessione SignalR\r\n */\r\n endpointUrl : string;\r\n\r\n /**\r\n * Servizio che definisce i messaggi di IN e OUT coi loro default\r\n */\r\n messageService?: Type<BaseMessageService>;\r\n\r\n /**\r\n * Indica se abilitare o meno la connessione SignalR nei confronti dell'URL **hubUrl**\r\n */\r\n enabled? : boolean;\r\n\r\n /**\r\n * Indica se utilizzare message pack come protocollo di trasmissione\r\n */\r\n useMessagePack? : boolean;\r\n\r\n /**\r\n * Indica se tentare di riconnettersi automaticamente quando la connessione cade\r\n */\r\n autoReconnect? : boolean;\r\n\r\n /**\r\n * Indica se scrivere o meno i messaggi di debug\r\n */\r\n debugMode? : boolean;\r\n\r\n /**\r\n * Indica se evitare di utilizzare i Websocket\r\n */\r\n avoidWs?; boolean;\r\n}","/*\n * Public API Surface of signalr-notifications\n */\n\nexport * from './lib/tokens';\nexport * from './lib/signalr-notifications.service';\nexport * from './lib/signalr-notifications.module';\nexport * from './lib/models/BaseMessageService';\nexport * from './lib/models/EndpointDef';\nexport * from './lib/models/JobProgressDto';\nexport * from './lib/config/SignalrNotificationsModuleConfig';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.BaseMessageService"],"mappings":"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"}
File without changes
File without changes
File without changes