ngx-cho-common 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -0
- package/esm2022/lib/guards/feature-guard.service.mjs +32 -0
- package/esm2022/lib/guards/unsaved-changes.guard.mjs +13 -0
- package/esm2022/lib/logging/console-logger.sink.mjs +27 -0
- package/esm2022/lib/logging/logger-sink-configuration.interface.mjs +2 -0
- package/esm2022/lib/logging/logger-sink.interface.mjs +2 -0
- package/esm2022/lib/logging/logger.model.mjs +3 -0
- package/esm2022/lib/logging/logger.service.mjs +127 -0
- package/esm2022/lib/logging/models/client-log-entry.interface.mjs +2 -0
- package/esm2022/lib/logging/models/severity-level.enum.mjs +9 -0
- package/esm2022/lib/logging/server-logger.sink.mjs +51 -0
- package/esm2022/lib/models/deactivatable.interface.mjs +2 -0
- package/esm2022/lib/models/uuid.model.mjs +32 -0
- package/esm2022/lib/security/auth-callback/auth-callback.component.mjs +18 -0
- package/esm2022/lib/security/models/auth-user.model.mjs +84 -0
- package/esm2022/lib/security/models/authorization-context.model.mjs +6 -0
- package/esm2022/lib/security/models/security-policy.model.mjs +15 -0
- package/esm2022/lib/security/security-policies.mjs +3 -0
- package/esm2022/lib/security/services/auth-guard.service.mjs +32 -0
- package/esm2022/lib/security/services/auth.service.mjs +131 -0
- package/esm2022/lib/security/signin/signin.component.mjs +18 -0
- package/esm2022/lib/security/signout/signout.component.mjs +18 -0
- package/esm2022/lib/services/date.service.mjs +40 -0
- package/esm2022/lib/services/download.service.mjs +49 -0
- package/esm2022/lib/services/feature.service.mjs +66 -0
- package/esm2022/lib/services/interval.service.mjs +115 -0
- package/esm2022/lib/services/local-storage.service.mjs +29 -0
- package/esm2022/lib/services/modal.service.mjs +34 -0
- package/esm2022/lib/services/navigation.service.mjs +45 -0
- package/esm2022/lib/services/object.service.mjs +33 -0
- package/esm2022/lib/services/rest-client.service.mjs +136 -0
- package/esm2022/lib/services/route-param.service.mjs +53 -0
- package/esm2022/lib/services/session-storage.service.mjs +29 -0
- package/esm2022/lib/types/indexable.type.mjs +2 -0
- package/esm2022/lib/types/name-value-item.type.mjs +2 -0
- package/esm2022/ngx-cho-common.mjs +5 -0
- package/esm2022/public-api.mjs +32 -0
- package/fesm2022/ngx-cho-common.mjs +1196 -0
- package/fesm2022/ngx-cho-common.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/guards/feature-guard.service.d.ts +14 -0
- package/lib/guards/unsaved-changes.guard.d.ts +11 -0
- package/lib/logging/console-logger.sink.d.ts +10 -0
- package/lib/logging/logger-sink-configuration.interface.d.ts +14 -0
- package/lib/logging/logger-sink.interface.d.ts +7 -0
- package/lib/logging/logger.model.d.ts +10 -0
- package/lib/logging/logger.service.d.ts +29 -0
- package/lib/logging/models/client-log-entry.interface.d.ts +10 -0
- package/lib/logging/models/severity-level.enum.d.ts +7 -0
- package/lib/logging/server-logger.sink.d.ts +27 -0
- package/lib/models/deactivatable.interface.d.ts +4 -0
- package/lib/models/uuid.model.d.ts +4 -0
- package/lib/security/auth-callback/auth-callback.component.d.ts +10 -0
- package/lib/security/models/auth-user.model.d.ts +57 -0
- package/lib/security/models/authorization-context.model.d.ts +5 -0
- package/lib/security/models/security-policy.model.d.ts +9 -0
- package/lib/security/security-policies.d.ts +3 -0
- package/lib/security/services/auth-guard.service.d.ts +12 -0
- package/lib/security/services/auth.service.d.ts +60 -0
- package/lib/security/signin/signin.component.d.ts +10 -0
- package/lib/security/signout/signout.component.d.ts +10 -0
- package/lib/services/date.service.d.ts +11 -0
- package/lib/services/download.service.d.ts +13 -0
- package/lib/services/feature.service.d.ts +40 -0
- package/lib/services/interval.service.d.ts +37 -0
- package/lib/services/local-storage.service.d.ts +9 -0
- package/lib/services/modal.service.d.ts +12 -0
- package/lib/services/navigation.service.d.ts +14 -0
- package/lib/services/object.service.d.ts +14 -0
- package/lib/services/rest-client.service.d.ts +88 -0
- package/lib/services/route-param.service.d.ts +17 -0
- package/lib/services/session-storage.service.d.ts +9 -0
- package/lib/types/indexable.type.d.ts +6 -0
- package/lib/types/name-value-item.type.d.ts +5 -0
- package/package.json +30 -0
- package/public-api.d.ts +33 -0
package/README.md
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# NgxChoCommon
|
|
2
|
+
|
|
3
|
+
This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 17.3.0.
|
|
4
|
+
|
|
5
|
+
## Code scaffolding
|
|
6
|
+
|
|
7
|
+
Run `ng generate component component-name --project ngx-cho-common` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module --project ngx-cho-common`.
|
|
8
|
+
> Note: Don't forget to add `--project ngx-cho-common` or else it will be added to the default project in your `angular.json` file.
|
|
9
|
+
|
|
10
|
+
## Build
|
|
11
|
+
|
|
12
|
+
Run `ng build ngx-cho-common` to build the project. The build artifacts will be stored in the `dist/` directory.
|
|
13
|
+
|
|
14
|
+
## Publishing
|
|
15
|
+
|
|
16
|
+
After building your library with `ng build ngx-cho-common`, go to the dist folder `cd dist/ngx-cho-common` and run `npm publish`.
|
|
17
|
+
|
|
18
|
+
## Running unit tests
|
|
19
|
+
|
|
20
|
+
Run `ng test ngx-cho-common` to execute the unit tests via [Karma](https://karma-runner.github.io).
|
|
21
|
+
|
|
22
|
+
## Further help
|
|
23
|
+
|
|
24
|
+
To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.io/cli) page.
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
import * as i1 from "../services/feature.service";
|
|
4
|
+
import * as i2 from "../services/navigation.service";
|
|
5
|
+
import * as i3 from "ngx-toastr";
|
|
6
|
+
export class FeatureGuardService {
|
|
7
|
+
constructor(featureService, navigationService, toastr) {
|
|
8
|
+
this.featureService = featureService;
|
|
9
|
+
this.navigationService = navigationService;
|
|
10
|
+
this.toastr = toastr;
|
|
11
|
+
}
|
|
12
|
+
async canActivate(route) {
|
|
13
|
+
const routeFeature = route.data['feature'];
|
|
14
|
+
if (!routeFeature) {
|
|
15
|
+
return true;
|
|
16
|
+
}
|
|
17
|
+
await this.featureService.checkEnabledFeatures();
|
|
18
|
+
if (!this.featureService.checkFeatureIsEnabled(routeFeature)) {
|
|
19
|
+
this.toastr.error("Oops! It doesn't look like this feature has been enabled.");
|
|
20
|
+
this.navigationService.goBack();
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
return true;
|
|
24
|
+
}
|
|
25
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FeatureGuardService, deps: [{ token: i1.FeatureService }, { token: i2.NavigationService }, { token: i3.ToastrService }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
26
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FeatureGuardService, providedIn: 'root' }); }
|
|
27
|
+
}
|
|
28
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FeatureGuardService, decorators: [{
|
|
29
|
+
type: Injectable,
|
|
30
|
+
args: [{ providedIn: 'root' }]
|
|
31
|
+
}], ctorParameters: () => [{ type: i1.FeatureService }, { type: i2.NavigationService }, { type: i3.ToastrService }] });
|
|
32
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmVhdHVyZS1ndWFyZC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWNoby1jb21tb24vc3JjL2xpYi9ndWFyZHMvZmVhdHVyZS1ndWFyZC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7O0FBUTNDLE1BQU0sT0FBTyxtQkFBbUI7SUFDNUIsWUFDcUIsY0FBOEIsRUFDOUIsaUJBQW9DLEVBQ3BDLE1BQXFCO1FBRnJCLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QixzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBQ3BDLFdBQU0sR0FBTixNQUFNLENBQWU7SUFDdkMsQ0FBQztJQUVHLEtBQUssQ0FBQyxXQUFXLENBQUMsS0FBNkI7UUFDbEQsTUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQVcsQ0FBQztRQUVyRCxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDaEIsT0FBTyxJQUFJLENBQUM7UUFDaEIsQ0FBQztRQUVELE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBRWpELElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLHFCQUFxQixDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7WUFDM0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsMkRBQTJELENBQUMsQ0FBQztZQUUvRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLENBQUM7WUFFaEMsT0FBTyxLQUFLLENBQUM7UUFDakIsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7K0dBekJRLG1CQUFtQjttSEFBbkIsbUJBQW1CLGNBRE4sTUFBTTs7NEZBQ25CLG1CQUFtQjtrQkFEL0IsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90IH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcblxuaW1wb3J0IHsgVG9hc3RyU2VydmljZSB9IGZyb20gJ25neC10b2FzdHInO1xuaW1wb3J0IHsgRmVhdHVyZVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9mZWF0dXJlLnNlcnZpY2UnO1xuaW1wb3J0IHsgTmF2aWdhdGlvblNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9uYXZpZ2F0aW9uLnNlcnZpY2UnO1xuXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIEZlYXR1cmVHdWFyZFNlcnZpY2Uge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGZlYXR1cmVTZXJ2aWNlOiBGZWF0dXJlU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBuYXZpZ2F0aW9uU2VydmljZTogTmF2aWdhdGlvblNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgdG9hc3RyOiBUb2FzdHJTZXJ2aWNlXG4gICAgKSB7fVxuXG4gICAgcHVibGljIGFzeW5jIGNhbkFjdGl2YXRlKHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGNvbnN0IHJvdXRlRmVhdHVyZSA9IHJvdXRlLmRhdGFbJ2ZlYXR1cmUnXSBhcyBzdHJpbmc7XG5cbiAgICAgICAgaWYgKCFyb3V0ZUZlYXR1cmUpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgdGhpcy5mZWF0dXJlU2VydmljZS5jaGVja0VuYWJsZWRGZWF0dXJlcygpO1xuXG4gICAgICAgIGlmICghdGhpcy5mZWF0dXJlU2VydmljZS5jaGVja0ZlYXR1cmVJc0VuYWJsZWQocm91dGVGZWF0dXJlKSkge1xuICAgICAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IoXCJPb3BzISBJdCBkb2Vzbid0IGxvb2sgbGlrZSB0aGlzIGZlYXR1cmUgaGFzIGJlZW4gZW5hYmxlZC5cIik7XG5cbiAgICAgICAgICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuZ29CYWNrKCk7XG5cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export class UnsavedChangesGuard {
|
|
4
|
+
canDeactivate(component) {
|
|
5
|
+
return component.onDeactivate ? component.onDeactivate() : true;
|
|
6
|
+
}
|
|
7
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: UnsavedChangesGuard, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
8
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: UnsavedChangesGuard }); }
|
|
9
|
+
}
|
|
10
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: UnsavedChangesGuard, decorators: [{
|
|
11
|
+
type: Injectable
|
|
12
|
+
}] });
|
|
13
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5zYXZlZC1jaGFuZ2VzLmd1YXJkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWNoby1jb21tb24vc3JjL2xpYi9ndWFyZHMvdW5zYXZlZC1jaGFuZ2VzLmd1YXJkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBTTNDLE1BQU0sT0FBTyxtQkFBbUI7SUFJNUIsYUFBYSxDQUFDLFNBQXlCO1FBQ25DLE9BQU8sU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDcEUsQ0FBQzsrR0FOUSxtQkFBbUI7bUhBQW5CLG1CQUFtQjs7NEZBQW5CLG1CQUFtQjtrQkFEL0IsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlU25hcHNob3QgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgSURlYWN0aXZhdGFibGUgfSBmcm9tICcuLi9tb2RlbHMvZGVhY3RpdmF0YWJsZS5pbnRlcmZhY2UnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgVW5zYXZlZENoYW5nZXNHdWFyZCB7XG4gICAgY29tcG9uZW50OiBJRGVhY3RpdmF0YWJsZSB8IHVuZGVmaW5lZDtcbiAgICByb3V0ZTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCB8IHVuZGVmaW5lZDtcblxuICAgIGNhbkRlYWN0aXZhdGUoY29tcG9uZW50OiBJRGVhY3RpdmF0YWJsZSk6IE9ic2VydmFibGU8Ym9vbGVhbj4gfCBQcm9taXNlPGJvb2xlYW4+IHwgYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBjb21wb25lbnQub25EZWFjdGl2YXRlID8gY29tcG9uZW50Lm9uRGVhY3RpdmF0ZSgpIDogdHJ1ZTtcbiAgICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { SeverityLevel } from './models/severity-level.enum';
|
|
2
|
+
export class ConsoleLoggerSink {
|
|
3
|
+
constructor(name, level) {
|
|
4
|
+
this.name = name;
|
|
5
|
+
this.level = level;
|
|
6
|
+
this.consoleMethods = new Map([
|
|
7
|
+
[SeverityLevel.verbose, console.log],
|
|
8
|
+
[SeverityLevel.information, console.info || console.log],
|
|
9
|
+
[SeverityLevel.warning, console.warn || console.log],
|
|
10
|
+
[SeverityLevel.error, console.error || console.log],
|
|
11
|
+
[SeverityLevel.critical, console.error || console.log],
|
|
12
|
+
]);
|
|
13
|
+
}
|
|
14
|
+
write(logEntry) {
|
|
15
|
+
const consoleMethod = this.consoleMethods.get(logEntry.severityLevel) || console.log;
|
|
16
|
+
if (logEntry.stackTrace) {
|
|
17
|
+
const error = new Error(logEntry.message);
|
|
18
|
+
error.stack = logEntry.stackTrace;
|
|
19
|
+
consoleMethod(error);
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
consoleMethod(logEntry.message);
|
|
23
|
+
}
|
|
24
|
+
return Promise.resolve();
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc29sZS1sb2dnZXIuc2luay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1jaG8tY29tbW9uL3NyYy9saWIvbG9nZ2luZy9jb25zb2xlLWxvZ2dlci5zaW5rLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUc3RCxNQUFNLE9BQU8saUJBQWlCO0lBVzFCLFlBQTRCLElBQVksRUFBUyxLQUFvQjtRQUF6QyxTQUFJLEdBQUosSUFBSSxDQUFRO1FBQVMsVUFBSyxHQUFMLEtBQUssQ0FBZTtRQVY3RCxtQkFBYyxHQUFHLElBQUksR0FBRyxDQUM1QjtZQUNJLENBQUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDO1lBQ3BDLENBQUMsYUFBYSxDQUFDLFdBQVcsRUFBRSxPQUFPLENBQUMsSUFBSSxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUM7WUFDeEQsQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxJQUFJLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQztZQUNwRCxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUssSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDO1lBQ25ELENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsS0FBSyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUM7U0FDekQsQ0FDSixDQUFDO0lBRXNFLENBQUM7SUFFekUsS0FBSyxDQUFDLFFBQXlCO1FBQzNCLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDO1FBRXJGLElBQUksUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3RCLE1BQU0sS0FBSyxHQUFHLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUMxQyxLQUFLLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUM7WUFFbEMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pCLENBQUM7YUFBTSxDQUFDO1lBQ0osYUFBYSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNwQyxDQUFDO1FBRUQsT0FBTyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDN0IsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSUNsaWVudExvZ0VudHJ5IH0gZnJvbSAnLi9tb2RlbHMvY2xpZW50LWxvZy1lbnRyeS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgU2V2ZXJpdHlMZXZlbCB9IGZyb20gJy4vbW9kZWxzL3NldmVyaXR5LWxldmVsLmVudW0nO1xuaW1wb3J0IHsgSUxvZ2dlclNpbmsgfSBmcm9tICcuL2xvZ2dlci1zaW5rLmludGVyZmFjZSc7XG5cbmV4cG9ydCBjbGFzcyBDb25zb2xlTG9nZ2VyU2luayBpbXBsZW1lbnRzIElMb2dnZXJTaW5rIHtcbiAgICBwcml2YXRlIGNvbnNvbGVNZXRob2RzID0gbmV3IE1hcDxTZXZlcml0eUxldmVsLCAobWVzc2FnZTogdW5rbm93biwgLi4uYXJnczogdW5rbm93bltdKSA9PiB2b2lkPihcbiAgICAgICAgW1xuICAgICAgICAgICAgW1NldmVyaXR5TGV2ZWwudmVyYm9zZSwgY29uc29sZS5sb2ddLFxuICAgICAgICAgICAgW1NldmVyaXR5TGV2ZWwuaW5mb3JtYXRpb24sIGNvbnNvbGUuaW5mbyB8fCBjb25zb2xlLmxvZ10sXG4gICAgICAgICAgICBbU2V2ZXJpdHlMZXZlbC53YXJuaW5nLCBjb25zb2xlLndhcm4gfHwgY29uc29sZS5sb2ddLFxuICAgICAgICAgICAgW1NldmVyaXR5TGV2ZWwuZXJyb3IsIGNvbnNvbGUuZXJyb3IgfHwgY29uc29sZS5sb2ddLFxuICAgICAgICAgICAgW1NldmVyaXR5TGV2ZWwuY3JpdGljYWwsIGNvbnNvbGUuZXJyb3IgfHwgY29uc29sZS5sb2ddLFxuICAgICAgICBdXG4gICAgKTtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBuYW1lOiBzdHJpbmcsIHB1YmxpYyBsZXZlbDogU2V2ZXJpdHlMZXZlbCkge31cblxuICAgIHdyaXRlKGxvZ0VudHJ5OiBJQ2xpZW50TG9nRW50cnkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgY29uc29sZU1ldGhvZCA9IHRoaXMuY29uc29sZU1ldGhvZHMuZ2V0KGxvZ0VudHJ5LnNldmVyaXR5TGV2ZWwpIHx8IGNvbnNvbGUubG9nO1xuXG4gICAgICAgIGlmIChsb2dFbnRyeS5zdGFja1RyYWNlKSB7XG4gICAgICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcihsb2dFbnRyeS5tZXNzYWdlKTtcbiAgICAgICAgICAgIGVycm9yLnN0YWNrID0gbG9nRW50cnkuc3RhY2tUcmFjZTtcblxuICAgICAgICAgICAgY29uc29sZU1ldGhvZChlcnJvcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlTWV0aG9kKGxvZ0VudHJ5Lm1lc3NhZ2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2VyLXNpbmstY29uZmlndXJhdGlvbi5pbnRlcmZhY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtY2hvLWNvbW1vbi9zcmMvbGliL2xvZ2dpbmcvbG9nZ2VyLXNpbmstY29uZmlndXJhdGlvbi5pbnRlcmZhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdG9yIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTZXZlcml0eUxldmVsIH0gZnJvbSAnLi9tb2RlbHMvc2V2ZXJpdHktbGV2ZWwuZW51bSc7XG5pbXBvcnQgeyBJTG9nZ2VyU2luayB9IGZyb20gJy4vbG9nZ2VyLXNpbmsuaW50ZXJmYWNlJztcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJy4vbG9nZ2VyLm1vZGVsJztcblxudHlwZSBMb2dnZXJTaW5rQ29uc3RydWN0b3IgPSB7XG4gICAgbmV3IChcbiAgICAgICAgbmFtZTogc3RyaW5nLFxuICAgICAgICBsZXZlbDogU2V2ZXJpdHlMZXZlbCxcbiAgICAgICAgYXJncz86IHVua25vd24sXG4gICAgICAgIGxvZ2dlcj86IExvZ2dlcixcbiAgICAgICAgaW5qZWN0b3I/OiBJbmplY3RvclxuICAgICk6IElMb2dnZXJTaW5rO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBJTG9nZ2VyU2lua0NvbmZpZ3VyYXRpb24ge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICB0eXBlOiBMb2dnZXJTaW5rQ29uc3RydWN0b3I7XG4gICAgbGV2ZWw6IFNldmVyaXR5TGV2ZWw7XG4gICAgYXJnczogdW5rbm93bjtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2VyLXNpbmsuaW50ZXJmYWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWNoby1jb21tb24vc3JjL2xpYi9sb2dnaW5nL2xvZ2dlci1zaW5rLmludGVyZmFjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSUNsaWVudExvZ0VudHJ5IH0gZnJvbSAnLi9tb2RlbHMvY2xpZW50LWxvZy1lbnRyeS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgU2V2ZXJpdHlMZXZlbCB9IGZyb20gJy4vbW9kZWxzL3NldmVyaXR5LWxldmVsLmVudW0nO1xuXG5leHBvcnQgaW50ZXJmYWNlIElMb2dnZXJTaW5rIHtcbiAgICBsZXZlbDogU2V2ZXJpdHlMZXZlbDtcbiAgICBuYW1lOiBzdHJpbmc7XG5cbiAgICB3cml0ZShsb2dFbnRyeTogSUNsaWVudExvZ0VudHJ5KTogdm9pZDtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export class Logger {
|
|
2
|
+
}
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2VyLm1vZGVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWNoby1jb21tb24vc3JjL2xpYi9sb2dnaW5nL2xvZ2dlci5tb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFLQSxNQUFNLE9BQWdCLE1BQU07Q0FLM0IiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBPcHRpb25hbExvZ1BhcmFtZXRlcnMgPSB7XG4gICAgc3RhY2tUcmFjZT86IHN0cmluZztcbiAgICBkYXRhPzogdW5rbm93bjtcbn07XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBMb2dnZXIge1xuICAgIGFic3RyYWN0IGxvZ0Vycm9yKG1lc3NhZ2U6IHN0cmluZyB8IEVycm9yLCBvcHRpb25zPzogT3B0aW9uYWxMb2dQYXJhbWV0ZXJzKTogdm9pZDtcbiAgICBhYnN0cmFjdCBsb2dJbmZvKG1lc3NhZ2U6IHN0cmluZywgb3B0aW9ucz86IE9wdGlvbmFsTG9nUGFyYW1ldGVycyk6IHZvaWQ7XG4gICAgYWJzdHJhY3QgbG9nVmVyYm9zZShtZXNzYWdlOiBzdHJpbmcsIG9wdGlvbnM/OiBPcHRpb25hbExvZ1BhcmFtZXRlcnMpOiB2b2lkO1xuICAgIGFic3RyYWN0IGxvZ1dhcm5pbmcobWVzc2FnZTogc3RyaW5nLCBvcHRpb25zPzogT3B0aW9uYWxMb2dQYXJhbWV0ZXJzKTogdm9pZDtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { Inject, Injectable } from '@angular/core';
|
|
2
|
+
import { SeverityLevel } from './models/severity-level.enum';
|
|
3
|
+
import { Uuid } from '../models/uuid.model';
|
|
4
|
+
import { ZonedDateTime } from '@js-joda/core';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "@angular/router";
|
|
7
|
+
import * as i2 from "../security/services/auth.service";
|
|
8
|
+
export class LoggerService {
|
|
9
|
+
static { this.overrideQueryStringRegex = /log\.(\w+)/; }
|
|
10
|
+
constructor(loggerSinkConfiguration, activatedRoute, authService, injector) {
|
|
11
|
+
this.loggerSinkConfiguration = loggerSinkConfiguration;
|
|
12
|
+
this.activatedRoute = activatedRoute;
|
|
13
|
+
this.authService = authService;
|
|
14
|
+
this.injector = injector;
|
|
15
|
+
this.sessionId = Uuid.create();
|
|
16
|
+
this.sinks = new Array();
|
|
17
|
+
this.minimumLevel = SeverityLevel.error;
|
|
18
|
+
this.readConfiguration();
|
|
19
|
+
this.activatedRoute.queryParams.subscribe(async (params) => {
|
|
20
|
+
const isDebug = this.authService.checkPolicy('debug');
|
|
21
|
+
if (isDebug) {
|
|
22
|
+
let updated = false;
|
|
23
|
+
for (const key of Object.keys(params)) {
|
|
24
|
+
const match = key.match(LoggerService.overrideQueryStringRegex);
|
|
25
|
+
if (match?.length === 2) {
|
|
26
|
+
const [paramName, sinkName] = match;
|
|
27
|
+
const sink = this.sinks.find(s => s.name === sinkName);
|
|
28
|
+
if (!sink) {
|
|
29
|
+
throw new Error(`Cannot find sink with name '${sinkName}'.`);
|
|
30
|
+
}
|
|
31
|
+
const value = params[paramName];
|
|
32
|
+
let level;
|
|
33
|
+
if (!value) {
|
|
34
|
+
throw new Error(`Missing value for query string parameter '${paramName}'.`);
|
|
35
|
+
}
|
|
36
|
+
else if (!(level = parseInt(value))) {
|
|
37
|
+
level =
|
|
38
|
+
SeverityLevel[value.toLowerCase()];
|
|
39
|
+
}
|
|
40
|
+
sink.level = level;
|
|
41
|
+
updated = true;
|
|
42
|
+
console.log(`Logging sink '${sinkName}' set to '${value}'.`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
if (updated) {
|
|
46
|
+
this.refreshSinks();
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
logError(message, options) {
|
|
52
|
+
if (typeof message === 'string') {
|
|
53
|
+
this.logWrite(SeverityLevel.error, message, options);
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
const error = message;
|
|
57
|
+
this.logWrite(SeverityLevel.error, error.message, Object.assign({ stackTrace: error.stack }, options));
|
|
58
|
+
}
|
|
59
|
+
logInfo(message, options) {
|
|
60
|
+
this.logWrite(SeverityLevel.information, message, options);
|
|
61
|
+
}
|
|
62
|
+
logVerbose(message, options) {
|
|
63
|
+
this.logWrite(SeverityLevel.verbose, message, options);
|
|
64
|
+
}
|
|
65
|
+
logWarning(message, options) {
|
|
66
|
+
this.logWrite(SeverityLevel.warning, message, options);
|
|
67
|
+
}
|
|
68
|
+
logWrite(level, message, options) {
|
|
69
|
+
if (level < this.minimumLevel) {
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
const logEntry = {
|
|
73
|
+
createdDateTime: ZonedDateTime.now().withFixedOffsetZone().toString(),
|
|
74
|
+
sessionId: this.sessionId,
|
|
75
|
+
severityLevel: level,
|
|
76
|
+
message: message,
|
|
77
|
+
stackTrace: options?.stackTrace,
|
|
78
|
+
url: window.location.href,
|
|
79
|
+
userAgent: navigator.userAgent,
|
|
80
|
+
jsonData: options?.data ? JSON.stringify(options.data) : undefined,
|
|
81
|
+
};
|
|
82
|
+
for (const sink of this.sinks) {
|
|
83
|
+
if (level >= sink.level) {
|
|
84
|
+
try {
|
|
85
|
+
sink.write(logEntry);
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
this.logError(`Error writing log entry to sink '${sink.name}'.`, {
|
|
89
|
+
stackTrace: error.stack,
|
|
90
|
+
data: { sink: sink.name },
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
readConfiguration() {
|
|
97
|
+
const sinkConfigs = this.loggerSinkConfiguration;
|
|
98
|
+
if (sinkConfigs) {
|
|
99
|
+
for (const sinkConfig of sinkConfigs) {
|
|
100
|
+
this.requiredProperty(sinkConfig, 'name');
|
|
101
|
+
this.requiredProperty(sinkConfig, 'type');
|
|
102
|
+
this.requiredProperty(sinkConfig, 'level');
|
|
103
|
+
const sink = new sinkConfig.type(sinkConfig.name, sinkConfig.level, sinkConfig.args, this, this.injector);
|
|
104
|
+
this.sinks.push(sink);
|
|
105
|
+
}
|
|
106
|
+
this.refreshSinks();
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
refreshSinks() {
|
|
110
|
+
this.minimumLevel = this.sinks.reduce((l, s) => Math.min(l, s.level), SeverityLevel.critical);
|
|
111
|
+
}
|
|
112
|
+
requiredProperty(obj, propertyName) {
|
|
113
|
+
if (obj[propertyName] == null) {
|
|
114
|
+
throw new Error(`Missing required property '${propertyName}' in the logger section of environment.ts.`);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: LoggerService, deps: [{ token: 'loggerSinkConfiguration' }, { token: i1.ActivatedRoute }, { token: i2.AuthService }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
118
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: LoggerService, providedIn: 'root' }); }
|
|
119
|
+
}
|
|
120
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: LoggerService, decorators: [{
|
|
121
|
+
type: Injectable,
|
|
122
|
+
args: [{ providedIn: 'root' }]
|
|
123
|
+
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
124
|
+
type: Inject,
|
|
125
|
+
args: ['loggerSinkConfiguration']
|
|
126
|
+
}] }, { type: i1.ActivatedRoute }, { type: i2.AuthService }, { type: i0.Injector }] });
|
|
127
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2VyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtY2hvLWNvbW1vbi9zcmMvbGliL2xvZ2dpbmcvbG9nZ2VyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBSUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQVksTUFBTSxlQUFlLENBQUM7QUFFN0QsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzdELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7O0FBRzlDLE1BQU0sT0FBTyxhQUFhO2FBQ04sNkJBQXdCLEdBQUcsWUFBWSxBQUFmLENBQWdCO0lBT3hELFlBRVksdUJBQW1ELEVBQzFDLGNBQThCLEVBQzlCLFdBQXdCLEVBQ3hCLFFBQWtCO1FBSDNCLDRCQUF1QixHQUF2Qix1QkFBdUIsQ0FBNEI7UUFDMUMsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzlCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLGFBQVEsR0FBUixRQUFRLENBQVU7UUFWOUIsY0FBUyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUMxQixVQUFLLEdBQUcsSUFBSSxLQUFLLEVBQWUsQ0FBQztRQUUxQyxpQkFBWSxHQUFHLGFBQWEsQ0FBQyxLQUFLLENBQUM7UUFTL0IsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFFekIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBQyxNQUFNLEVBQUMsRUFBRTtZQUNyRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUV0RCxJQUFJLE9BQU8sRUFBRSxDQUFDO2dCQUNWLElBQUksT0FBTyxHQUFHLEtB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QkFBeUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBBdXRoU2VydmljZSB9IGZyb20gJy4uL3NlY3VyaXR5L3NlcnZpY2VzL2F1dGguc2VydmljZSc7XG5pbXBvcnQgeyBJTG9nZ2VyU2luayB9IGZyb20gJy4vbG9nZ2VyLXNpbmsuaW50ZXJmYWNlJztcbmltcG9ydCB7IElMb2dnZXJTaW5rQ29uZmlndXJhdGlvbiB9IGZyb20gJy4vbG9nZ2VyLXNpbmstY29uZmlndXJhdGlvbi5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBJbmplY3RvciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTG9nZ2VyLCBPcHRpb25hbExvZ1BhcmFtZXRlcnMgfSBmcm9tICcuL2xvZ2dlci5tb2RlbCc7XG5pbXBvcnQgeyBTZXZlcml0eUxldmVsIH0gZnJvbSAnLi9tb2RlbHMvc2V2ZXJpdHktbGV2ZWwuZW51bSc7XG5pbXBvcnQgeyBVdWlkIH0gZnJvbSAnLi4vbW9kZWxzL3V1aWQubW9kZWwnO1xuaW1wb3J0IHsgWm9uZWREYXRlVGltZSB9IGZyb20gJ0Bqcy1qb2RhL2NvcmUnO1xuXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIExvZ2dlclNlcnZpY2UgaW1wbGVtZW50cyBMb2dnZXIge1xuICAgIHN0YXRpYyByZWFkb25seSBvdmVycmlkZVF1ZXJ5U3RyaW5nUmVnZXggPSAvbG9nXFwuKFxcdyspLztcblxuICAgIHJlYWRvbmx5IHNlc3Npb25JZCA9IFV1aWQuY3JlYXRlKCk7XG4gICAgcmVhZG9ubHkgc2lua3MgPSBuZXcgQXJyYXk8SUxvZ2dlclNpbms+KCk7XG5cbiAgICBtaW5pbXVtTGV2ZWwgPSBTZXZlcml0eUxldmVsLmVycm9yO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIEBJbmplY3QoJ2xvZ2dlclNpbmtDb25maWd1cmF0aW9uJylcbiAgICAgICAgcHJpdmF0ZSBsb2dnZXJTaW5rQ29uZmlndXJhdGlvbjogSUxvZ2dlclNpbmtDb25maWd1cmF0aW9uW10sXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGF1dGhTZXJ2aWNlOiBBdXRoU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBpbmplY3RvcjogSW5qZWN0b3JcbiAgICApIHtcbiAgICAgICAgdGhpcy5yZWFkQ29uZmlndXJhdGlvbigpO1xuXG4gICAgICAgIHRoaXMuYWN0aXZhdGVkUm91dGUucXVlcnlQYXJhbXMuc3Vic2NyaWJlKGFzeW5jIHBhcmFtcyA9PiB7XG4gICAgICAgICAgICBjb25zdCBpc0RlYnVnID0gdGhpcy5hdXRoU2VydmljZS5jaGVja1BvbGljeSgnZGVidWcnKTtcblxuICAgICAgICAgICAgaWYgKGlzRGVidWcpIHtcbiAgICAgICAgICAgICAgICBsZXQgdXBkYXRlZCA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMocGFyYW1zKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXRjaCA9IGtleS5tYXRjaChMb2dnZXJTZXJ2aWNlLm92ZXJyaWRlUXVlcnlTdHJpbmdSZWdleCk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoPy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFtwYXJhbU5hbWUsIHNpbmtOYW1lXSA9IG1hdGNoO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2luayA9IHRoaXMuc2lua3MuZmluZChzID0+IHMubmFtZSA9PT0gc2lua05hbWUpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNpbmspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBmaW5kIHNpbmsgd2l0aCBuYW1lICcke3NpbmtOYW1lfScuYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gcGFyYW1zW3BhcmFtTmFtZV07XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGV2ZWw6IFNldmVyaXR5TGV2ZWw7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBNaXNzaW5nIHZhbHVlIGZvciBxdWVyeSBzdHJpbmcgcGFyYW1ldGVyICcke3BhcmFtTmFtZX0nLmBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghKGxldmVsID0gcGFyc2VJbnQodmFsdWUpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V2ZXJpdHlMZXZlbFt2YWx1ZS50b0xvd2VyQ2FzZSgpIGFzIGtleW9mIHR5cGVvZiBTZXZlcml0eUxldmVsXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgc2luay5sZXZlbCA9IGxldmVsO1xuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZCA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBMb2dnaW5nIHNpbmsgJyR7c2lua05hbWV9JyBzZXQgdG8gJyR7dmFsdWV9Jy5gKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh1cGRhdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVmcmVzaFNpbmtzKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBsb2dFcnJvcihtZXNzYWdlOiBzdHJpbmcgfCBFcnJvciwgb3B0aW9ucz86IE9wdGlvbmFsTG9nUGFyYW1ldGVycyk6IHZvaWQge1xuICAgICAgICBpZiAodHlwZW9mIG1lc3NhZ2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ1dyaXRlKFNldmVyaXR5TGV2ZWwuZXJyb3IsIG1lc3NhZ2UsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZXJyb3IgPSBtZXNzYWdlIGFzIEVycm9yO1xuICAgICAgICB0aGlzLmxvZ1dyaXRlKFxuICAgICAgICAgICAgU2V2ZXJpdHlMZXZlbC5lcnJvcixcbiAgICAgICAgICAgIGVycm9yLm1lc3NhZ2UsXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKHsgc3RhY2tUcmFjZTogZXJyb3Iuc3RhY2sgfSwgb3B0aW9ucylcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBsb2dJbmZvKG1lc3NhZ2U6IHN0cmluZywgb3B0aW9ucz86IE9wdGlvbmFsTG9nUGFyYW1ldGVycyk6IHZvaWQge1xuICAgICAgICB0aGlzLmxvZ1dyaXRlKFNldmVyaXR5TGV2ZWwuaW5mb3JtYXRpb24sIG1lc3NhZ2UsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIGxvZ1ZlcmJvc2UobWVzc2FnZTogc3RyaW5nLCBvcHRpb25zPzogT3B0aW9uYWxMb2dQYXJhbWV0ZXJzKTogdm9pZCB7XG4gICAgICAgIHRoaXMubG9nV3JpdGUoU2V2ZXJpdHlMZXZlbC52ZXJib3NlLCBtZXNzYWdlLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBsb2dXYXJuaW5nKG1lc3NhZ2U6IHN0cmluZywgb3B0aW9ucz86IE9wdGlvbmFsTG9nUGFyYW1ldGVycyk6IHZvaWQge1xuICAgICAgICB0aGlzLmxvZ1dyaXRlKFNldmVyaXR5TGV2ZWwud2FybmluZywgbWVzc2FnZSwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBsb2dXcml0ZShsZXZlbDogU2V2ZXJpdHlMZXZlbCwgbWVzc2FnZTogc3RyaW5nLCBvcHRpb25zPzogT3B0aW9uYWxMb2dQYXJhbWV0ZXJzKTogdm9pZCB7XG4gICAgICAgIGlmIChsZXZlbCA8IHRoaXMubWluaW11bUxldmVsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsb2dFbnRyeSA9IHtcbiAgICAgICAgICAgIGNyZWF0ZWREYXRlVGltZTogWm9uZWREYXRlVGltZS5ub3coKS53aXRoRml4ZWRPZmZzZXRab25lKCkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIHNlc3Npb25JZDogdGhpcy5zZXNzaW9uSWQsXG4gICAgICAgICAgICBzZXZlcml0eUxldmVsOiBsZXZlbCxcbiAgICAgICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgICAgICAgICBzdGFja1RyYWNlOiBvcHRpb25zPy5zdGFja1RyYWNlLFxuICAgICAgICAgICAgdXJsOiB3aW5kb3cubG9jYXRpb24uaHJlZixcbiAgICAgICAgICAgIHVzZXJBZ2VudDogbmF2aWdhdG9yLnVzZXJBZ2VudCxcbiAgICAgICAgICAgIGpzb25EYXRhOiBvcHRpb25zPy5kYXRhID8gSlNPTi5zdHJpbmdpZnkob3B0aW9ucy5kYXRhKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgfTtcblxuICAgICAgICBmb3IgKGNvbnN0IHNpbmsgb2YgdGhpcy5zaW5rcykge1xuICAgICAgICAgICAgaWYgKGxldmVsID49IHNpbmsubGV2ZWwpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBzaW5rLndyaXRlKGxvZ0VudHJ5KTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ0Vycm9yKGBFcnJvciB3cml0aW5nIGxvZyBlbnRyeSB0byBzaW5rICcke3NpbmsubmFtZX0nLmAsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrVHJhY2U6IChlcnJvciBhcyBFcnJvcikuc3RhY2ssXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiB7IHNpbms6IHNpbmsubmFtZSB9LFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHJlYWRDb25maWd1cmF0aW9uKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBzaW5rQ29uZmlncyA9IHRoaXMubG9nZ2VyU2lua0NvbmZpZ3VyYXRpb247XG5cbiAgICAgICAgaWYgKHNpbmtDb25maWdzKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHNpbmtDb25maWcgb2Ygc2lua0NvbmZpZ3MpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlcXVpcmVkUHJvcGVydHkoc2lua0NvbmZpZywgJ25hbWUnKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlcXVpcmVkUHJvcGVydHkoc2lua0NvbmZpZywgJ3R5cGUnKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlcXVpcmVkUHJvcGVydHkoc2lua0NvbmZpZywgJ2xldmVsJyk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBzaW5rID0gbmV3IHNpbmtDb25maWcudHlwZShcbiAgICAgICAgICAgICAgICAgICAgc2lua0NvbmZpZy5uYW1lLFxuICAgICAgICAgICAgICAgICAgICBzaW5rQ29uZmlnLmxldmVsLFxuICAgICAgICAgICAgICAgICAgICBzaW5rQ29uZmlnLmFyZ3MsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5qZWN0b3JcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5zaW5rcy5wdXNoKHNpbmspO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hTaW5rcygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZWZyZXNoU2lua3MoKTogdm9pZCB7XG4gICAgICAgIHRoaXMubWluaW11bUxldmVsID0gdGhpcy5zaW5rcy5yZWR1Y2UoXG4gICAgICAgICAgICAobCwgcykgPT4gTWF0aC5taW4obCwgcy5sZXZlbCksXG4gICAgICAgICAgICBTZXZlcml0eUxldmVsLmNyaXRpY2FsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZXF1aXJlZFByb3BlcnR5KG9iajogdW5rbm93biwgcHJvcGVydHlOYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgaWYgKChvYmogYXMgbmV2ZXIpW3Byb3BlcnR5TmFtZV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgIGBNaXNzaW5nIHJlcXVpcmVkIHByb3BlcnR5ICcke3Byb3BlcnR5TmFtZX0nIGluIHRoZSBsb2dnZXIgc2VjdGlvbiBvZiBlbnZpcm9ubWVudC50cy5gXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxufVxuIl19
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LWxvZy1lbnRyeS5pbnRlcmZhY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtY2hvLWNvbW1vbi9zcmMvbGliL2xvZ2dpbmcvbW9kZWxzL2NsaWVudC1sb2ctZW50cnkuaW50ZXJmYWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTZXZlcml0eUxldmVsIH0gZnJvbSAnLi9zZXZlcml0eS1sZXZlbC5lbnVtJztcblxuZXhwb3J0IGludGVyZmFjZSBJQ2xpZW50TG9nRW50cnkge1xuICAgIGNyZWF0ZWREYXRlVGltZTogc3RyaW5nO1xuICAgIHNlc3Npb25JZDogc3RyaW5nO1xuICAgIHNldmVyaXR5TGV2ZWw6IFNldmVyaXR5TGV2ZWw7XG4gICAgbWVzc2FnZTogc3RyaW5nO1xuICAgIHN0YWNrVHJhY2U/OiBzdHJpbmc7XG4gICAgdXJsOiBzdHJpbmc7XG4gICAganNvbkRhdGE/OiBzdHJpbmc7XG59XG4iXX0=
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export var SeverityLevel;
|
|
2
|
+
(function (SeverityLevel) {
|
|
3
|
+
SeverityLevel[SeverityLevel["verbose"] = 0] = "verbose";
|
|
4
|
+
SeverityLevel[SeverityLevel["information"] = 1] = "information";
|
|
5
|
+
SeverityLevel[SeverityLevel["warning"] = 2] = "warning";
|
|
6
|
+
SeverityLevel[SeverityLevel["error"] = 3] = "error";
|
|
7
|
+
SeverityLevel[SeverityLevel["critical"] = 4] = "critical";
|
|
8
|
+
})(SeverityLevel || (SeverityLevel = {}));
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V2ZXJpdHktbGV2ZWwuZW51bS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1jaG8tY29tbW9uL3NyYy9saWIvbG9nZ2luZy9tb2RlbHMvc2V2ZXJpdHktbGV2ZWwuZW51bS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLENBQU4sSUFBWSxhQU1YO0FBTkQsV0FBWSxhQUFhO0lBQ3JCLHVEQUFXLENBQUE7SUFDWCwrREFBZSxDQUFBO0lBQ2YsdURBQVcsQ0FBQTtJQUNYLG1EQUFTLENBQUE7SUFDVCx5REFBWSxDQUFBO0FBQ2hCLENBQUMsRUFOVyxhQUFhLEtBQWIsYUFBYSxRQU14QiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBlbnVtIFNldmVyaXR5TGV2ZWwge1xuICAgIHZlcmJvc2UgPSAwLFxuICAgIGluZm9ybWF0aW9uID0gMSxcbiAgICB3YXJuaW5nID0gMixcbiAgICBlcnJvciA9IDMsXG4gICAgY3JpdGljYWwgPSA0LFxufVxuIl19
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { RestClient } from '../services/rest-client.service';
|
|
2
|
+
import { IntervalService } from '../services/interval.service';
|
|
3
|
+
export class ServerLoggerSink {
|
|
4
|
+
constructor(name, level, args, logger, injector) {
|
|
5
|
+
this.name = name;
|
|
6
|
+
this.level = level;
|
|
7
|
+
this.args = args;
|
|
8
|
+
this.logger = logger;
|
|
9
|
+
this.injector = injector;
|
|
10
|
+
this.retryCount = 10;
|
|
11
|
+
this.postFrequency = 15 * 1000 /*15 seconds*/;
|
|
12
|
+
this.entryBuffer = new Array();
|
|
13
|
+
this.errorCount = 0;
|
|
14
|
+
if (!args?.url) {
|
|
15
|
+
throw new Error(`Missing required argument 'url' for sink ${this.constructor.name}.`);
|
|
16
|
+
}
|
|
17
|
+
const intervalService = injector.get(IntervalService);
|
|
18
|
+
this.$interval = intervalService.create(() => this.flush(), this.postFrequency);
|
|
19
|
+
this.$interval.start();
|
|
20
|
+
}
|
|
21
|
+
write(logEntry) {
|
|
22
|
+
this.entryBuffer.push(logEntry);
|
|
23
|
+
}
|
|
24
|
+
async flush() {
|
|
25
|
+
if (this.entryBuffer.length === 0) {
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
const mark = this.entryBuffer.length;
|
|
29
|
+
try {
|
|
30
|
+
await this.postLogEntries(this.entryBuffer);
|
|
31
|
+
this.entryBuffer = this.entryBuffer.slice(mark);
|
|
32
|
+
this.errorCount = 0;
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
this.logger.logError(error);
|
|
36
|
+
if (this.errorCount++ > this.retryCount) {
|
|
37
|
+
this.$interval.stop();
|
|
38
|
+
throw new Error(`Error posting log entries to server. Retried ${this.retryCount} times and giving up.`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
postLogEntries(entries) {
|
|
43
|
+
const restClient = this.injector.get(RestClient);
|
|
44
|
+
const restOptions = Object.assign({}, this.args, {
|
|
45
|
+
body: entries,
|
|
46
|
+
showSpinner: false,
|
|
47
|
+
});
|
|
48
|
+
return restClient.post(this.args.url, restOptions);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLWxvZ2dlci5zaW5rLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWNoby1jb21tb24vc3JjL2xpYi9sb2dnaW5nL3NlcnZlci1sb2dnZXIuc2luay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFLQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDN0QsT0FBTyxFQUFpQixlQUFlLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQU85RSxNQUFNLE9BQU8sZ0JBQWdCO0lBU3pCLFlBQ29CLElBQVksRUFDckIsS0FBb0IsRUFDWCxJQUEyQixFQUMxQixNQUFjLEVBQ2QsUUFBa0I7UUFKbkIsU0FBSSxHQUFKLElBQUksQ0FBUTtRQUNyQixVQUFLLEdBQUwsS0FBSyxDQUFlO1FBQ1gsU0FBSSxHQUFKLElBQUksQ0FBdUI7UUFDMUIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLGFBQVEsR0FBUixRQUFRLENBQVU7UUFidEIsZUFBVSxHQUFHLEVBQUUsQ0FBQztRQUNoQixrQkFBYSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDO1FBSTFELGdCQUFXLEdBQUcsSUFBSSxLQUFLLEVBQW1CLENBQUM7UUFDM0MsZUFBVSxHQUFHLENBQUMsQ0FBQztRQVNYLElBQUksQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUM7WUFDYixNQUFNLElBQUksS0FBSyxDQUFDLDRDQUE0QyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7UUFDMUYsQ0FBQztRQUVELE1BQU0sZUFBZSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQWtCLGVBQWUsQ0FBQyxDQUFDO1FBQ3ZFLElBQUksQ0FBQyxTQUFTLEdBQUcsZUFBZSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBRWhGLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVELEtBQUssQ0FBQyxRQUF5QjtRQUMzQixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRU8sS0FBSyxDQUFDLEtBQUs7UUFDZixJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2hDLE9BQU87UUFDWCxDQUFDO1FBRUQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUM7UUFFckMsSUFBSSxDQUFDO1lBQ0QsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUU1QyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2hELElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDO1FBQ3hCLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBYyxDQUFDLENBQUM7WUFFckMsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUN0QyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUN0QixNQUFNLElBQUksS0FBSyxDQUNYLGlEQUFpRCxJQUFJLENBQUMsVUFBVSx1QkFBdUIsQ0FDMUYsQ0FBQztZQUNOLENBQUM7UUFDTCxDQUFDO0lBQ0wsQ0FBQztJQUVPLGNBQWMsQ0FBQyxPQUEwQjtRQUM3QyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBYSxVQUFVLENBQUMsQ0FBQztRQUM3RCxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQzdDLElBQUksRUFBRSxPQUFPO1lBQ2IsV0FBVyxFQUFFLEtBQUs7U0FDckIsQ0FBQyxDQUFDO1FBRUgsT0FBTyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdG9yIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJTG9nZ2VyU2luayB9IGZyb20gJy4vbG9nZ2VyLXNpbmsuaW50ZXJmYWNlJztcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJy4vbG9nZ2VyLm1vZGVsJztcbmltcG9ydCB7IElDbGllbnRMb2dFbnRyeSB9IGZyb20gJy4vbW9kZWxzL2NsaWVudC1sb2ctZW50cnkuaW50ZXJmYWNlJztcbmltcG9ydCB7IFNldmVyaXR5TGV2ZWwgfSBmcm9tICcuL21vZGVscy9zZXZlcml0eS1sZXZlbC5lbnVtJztcbmltcG9ydCB7IFJlc3RDbGllbnQgfSBmcm9tICcuLi9zZXJ2aWNlcy9yZXN0LWNsaWVudC5zZXJ2aWNlJztcbmltcG9ydCB7IEludGVydmFsVGltZXIsIEludGVydmFsU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2ludGVydmFsLnNlcnZpY2UnO1xuXG50eXBlIFNlcnZlckxvZ2dlckFyZ3VtZW50cyA9IHtcbiAgICBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgdXJsOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgY2xhc3MgU2VydmVyTG9nZ2VyU2luayBpbXBsZW1lbnRzIElMb2dnZXJTaW5rIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJldHJ5Q291bnQgPSAxMDtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBvc3RGcmVxdWVuY3kgPSAxNSAqIDEwMDAgLyoxNSBzZWNvbmRzKi87XG5cbiAgICAkaW50ZXJ2YWw6IEludGVydmFsVGltZXI7XG5cbiAgICBlbnRyeUJ1ZmZlciA9IG5ldyBBcnJheTxJQ2xpZW50TG9nRW50cnk+KCk7XG4gICAgZXJyb3JDb3VudCA9IDA7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IG5hbWU6IHN0cmluZyxcbiAgICAgICAgcHVibGljIGxldmVsOiBTZXZlcml0eUxldmVsLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgYXJnczogU2VydmVyTG9nZ2VyQXJndW1lbnRzLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGxvZ2dlcjogTG9nZ2VyLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGluamVjdG9yOiBJbmplY3RvclxuICAgICkge1xuICAgICAgICBpZiAoIWFyZ3M/LnVybCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIHJlcXVpcmVkIGFyZ3VtZW50ICd1cmwnIGZvciBzaW5rICR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfS5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGludGVydmFsU2VydmljZSA9IGluamVjdG9yLmdldDxJbnRlcnZhbFNlcnZpY2U+KEludGVydmFsU2VydmljZSk7XG4gICAgICAgIHRoaXMuJGludGVydmFsID0gaW50ZXJ2YWxTZXJ2aWNlLmNyZWF0ZSgoKSA9PiB0aGlzLmZsdXNoKCksIHRoaXMucG9zdEZyZXF1ZW5jeSk7XG5cbiAgICAgICAgdGhpcy4kaW50ZXJ2YWwuc3RhcnQoKTtcbiAgICB9XG5cbiAgICB3cml0ZShsb2dFbnRyeTogSUNsaWVudExvZ0VudHJ5KTogdm9pZCB7XG4gICAgICAgIHRoaXMuZW50cnlCdWZmZXIucHVzaChsb2dFbnRyeSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBmbHVzaCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMuZW50cnlCdWZmZXIubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtYXJrID0gdGhpcy5lbnRyeUJ1ZmZlci5sZW5ndGg7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucG9zdExvZ0VudHJpZXModGhpcy5lbnRyeUJ1ZmZlcik7XG5cbiAgICAgICAgICAgIHRoaXMuZW50cnlCdWZmZXIgPSB0aGlzLmVudHJ5QnVmZmVyLnNsaWNlKG1hcmspO1xuICAgICAgICAgICAgdGhpcy5lcnJvckNvdW50ID0gMDtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZ0Vycm9yKGVycm9yIGFzIEVycm9yKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuZXJyb3JDb3VudCsrID4gdGhpcy5yZXRyeUNvdW50KSB7XG4gICAgICAgICAgICAgICAgdGhpcy4kaW50ZXJ2YWwuc3RvcCgpO1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgYEVycm9yIHBvc3RpbmcgbG9nIGVudHJpZXMgdG8gc2VydmVyLiAgUmV0cmllZCAke3RoaXMucmV0cnlDb3VudH0gdGltZXMgYW5kIGdpdmluZyB1cC5gXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgcG9zdExvZ0VudHJpZXMoZW50cmllczogSUNsaWVudExvZ0VudHJ5W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgcmVzdENsaWVudCA9IHRoaXMuaW5qZWN0b3IuZ2V0PFJlc3RDbGllbnQ+KFJlc3RDbGllbnQpO1xuICAgICAgICBjb25zdCByZXN0T3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuYXJncywge1xuICAgICAgICAgICAgYm9keTogZW50cmllcyxcbiAgICAgICAgICAgIHNob3dTcGlubmVyOiBmYWxzZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHJlc3RDbGllbnQucG9zdCh0aGlzLmFyZ3MudXJsLCByZXN0T3B0aW9ucyk7XG4gICAgfVxufVxuIl19
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVhY3RpdmF0YWJsZS5pbnRlcmZhY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtY2hvLWNvbW1vbi9zcmMvbGliL21vZGVscy9kZWFjdGl2YXRhYmxlLmludGVyZmFjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIElEZWFjdGl2YXRhYmxlIHtcbiAgICBvbkRlYWN0aXZhdGU6ICgpID0+IE9ic2VydmFibGU8Ym9vbGVhbj4gfCBQcm9taXNlPGJvb2xlYW4+IHwgYm9vbGVhbjtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export class Uuid {
|
|
2
|
+
static create() {
|
|
3
|
+
const bytes = crypto.getRandomValues(new Uint8Array(16));
|
|
4
|
+
bytes[6] = (bytes[6] & 0x0f) | 0x40;
|
|
5
|
+
bytes[8] = (bytes[8] & 0x3f) | 0x80;
|
|
6
|
+
let index = 0;
|
|
7
|
+
return (Uuid.toHex(bytes[index++]) +
|
|
8
|
+
Uuid.toHex(bytes[index++]) +
|
|
9
|
+
Uuid.toHex(bytes[index++]) +
|
|
10
|
+
Uuid.toHex(bytes[index++]) +
|
|
11
|
+
'-' +
|
|
12
|
+
Uuid.toHex(bytes[index++]) +
|
|
13
|
+
Uuid.toHex(bytes[index++]) +
|
|
14
|
+
'-' +
|
|
15
|
+
Uuid.toHex(bytes[index++]) +
|
|
16
|
+
Uuid.toHex(bytes[index++]) +
|
|
17
|
+
'-' +
|
|
18
|
+
Uuid.toHex(bytes[index++]) +
|
|
19
|
+
Uuid.toHex(bytes[index++]) +
|
|
20
|
+
'-' +
|
|
21
|
+
Uuid.toHex(bytes[index++]) +
|
|
22
|
+
Uuid.toHex(bytes[index++]) +
|
|
23
|
+
Uuid.toHex(bytes[index++]) +
|
|
24
|
+
Uuid.toHex(bytes[index++]) +
|
|
25
|
+
Uuid.toHex(bytes[index++]) +
|
|
26
|
+
Uuid.toHex(bytes[index++]));
|
|
27
|
+
}
|
|
28
|
+
static toHex(byte) {
|
|
29
|
+
return (0x100 | byte).toString(16).substr(1);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXVpZC5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1jaG8tY29tbW9uL3NyYy9saWIvbW9kZWxzL3V1aWQubW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxPQUFPLElBQUk7SUFDTixNQUFNLENBQUMsTUFBTTtRQUNoQixNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDLElBQUksVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDekQsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQztRQUNwQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBRXBDLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztRQUVkLE9BQU8sQ0FDSCxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQzFCLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDMUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUMxQixJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQzFCLEdBQUc7WUFDSCxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQzFCLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDMUIsR0FBRztZQUNILElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDMUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUMxQixHQUFHO1lBQ0gsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUMxQixJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQzFCLEdBQUc7WUFDSCxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQzFCLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDMUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUMxQixJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQzFCLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDMUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUM3QixDQUFDO0lBQ04sQ0FBQztJQUVPLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBWTtRQUM3QixPQUFPLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakQsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNsYXNzIFV1aWQge1xuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlKCk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IGJ5dGVzID0gY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhuZXcgVWludDhBcnJheSgxNikpO1xuICAgICAgICBieXRlc1s2XSA9IChieXRlc1s2XSAmIDB4MGYpIHwgMHg0MDtcbiAgICAgICAgYnl0ZXNbOF0gPSAoYnl0ZXNbOF0gJiAweDNmKSB8IDB4ODA7XG5cbiAgICAgICAgbGV0IGluZGV4ID0gMDtcblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgVXVpZC50b0hleChieXRlc1tpbmRleCsrXSkgK1xuICAgICAgICAgICAgVXVpZC50b0hleChieXRlc1tpbmRleCsrXSkgK1xuICAgICAgICAgICAgVXVpZC50b0hleChieXRlc1tpbmRleCsrXSkgK1xuICAgICAgICAgICAgVXVpZC50b0hleChieXRlc1tpbmRleCsrXSkgK1xuICAgICAgICAgICAgJy0nICtcbiAgICAgICAgICAgIFV1aWQudG9IZXgoYnl0ZXNbaW5kZXgrK10pICtcbiAgICAgICAgICAgIFV1aWQudG9IZXgoYnl0ZXNbaW5kZXgrK10pICtcbiAgICAgICAgICAgICctJyArXG4gICAgICAgICAgICBVdWlkLnRvSGV4KGJ5dGVzW2luZGV4KytdKSArXG4gICAgICAgICAgICBVdWlkLnRvSGV4KGJ5dGVzW2luZGV4KytdKSArXG4gICAgICAgICAgICAnLScgK1xuICAgICAgICAgICAgVXVpZC50b0hleChieXRlc1tpbmRleCsrXSkgK1xuICAgICAgICAgICAgVXVpZC50b0hleChieXRlc1tpbmRleCsrXSkgK1xuICAgICAgICAgICAgJy0nICtcbiAgICAgICAgICAgIFV1aWQudG9IZXgoYnl0ZXNbaW5kZXgrK10pICtcbiAgICAgICAgICAgIFV1aWQudG9IZXgoYnl0ZXNbaW5kZXgrK10pICtcbiAgICAgICAgICAgIFV1aWQudG9IZXgoYnl0ZXNbaW5kZXgrK10pICtcbiAgICAgICAgICAgIFV1aWQudG9IZXgoYnl0ZXNbaW5kZXgrK10pICtcbiAgICAgICAgICAgIFV1aWQudG9IZXgoYnl0ZXNbaW5kZXgrK10pICtcbiAgICAgICAgICAgIFV1aWQudG9IZXgoYnl0ZXNbaW5kZXgrK10pXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgdG9IZXgoYnl0ZTogbnVtYmVyKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuICgweDEwMCB8IGJ5dGUpLnRvU3RyaW5nKDE2KS5zdWJzdHIoMSk7XG4gICAgfVxufVxuIl19
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Component } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
import * as i1 from "../services/auth.service";
|
|
4
|
+
export class AuthCallbackComponent {
|
|
5
|
+
constructor(authService) {
|
|
6
|
+
this.authService = authService;
|
|
7
|
+
}
|
|
8
|
+
ngOnInit() {
|
|
9
|
+
return this.authService.completeAuthentication();
|
|
10
|
+
}
|
|
11
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AuthCallbackComponent, deps: [{ token: i1.AuthService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
12
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: AuthCallbackComponent, selector: "app-auth-callback", ngImport: i0, template: "" }); }
|
|
13
|
+
}
|
|
14
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AuthCallbackComponent, decorators: [{
|
|
15
|
+
type: Component,
|
|
16
|
+
args: [{ selector: 'app-auth-callback', template: "" }]
|
|
17
|
+
}], ctorParameters: () => [{ type: i1.AuthService }] });
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC1jYWxsYmFjay5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtY2hvLWNvbW1vbi9zcmMvbGliL3NlY3VyaXR5L2F1dGgtY2FsbGJhY2svYXV0aC1jYWxsYmFjay5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtY2hvLWNvbW1vbi9zcmMvbGliL3NlY3VyaXR5L2F1dGgtY2FsbGJhY2svYXV0aC1jYWxsYmFjay5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLE1BQU0sZUFBZSxDQUFDOzs7QUFPbEQsTUFBTSxPQUFPLHFCQUFxQjtJQUM5QixZQUFvQixXQUF3QjtRQUF4QixnQkFBVyxHQUFYLFdBQVcsQ0FBYTtJQUFHLENBQUM7SUFFaEQsUUFBUTtRQUNKLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO0lBQ3JELENBQUM7K0dBTFEscUJBQXFCO21HQUFyQixxQkFBcUIseURDUGxDLEVBQUE7OzRGRE9hLHFCQUFxQjtrQkFKakMsU0FBUzsrQkFDSSxtQkFBbUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQXV0aFNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9hdXRoLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2FwcC1hdXRoLWNhbGxiYWNrJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vYXV0aC1jYWxsYmFjay5jb21wb25lbnQuaHRtbCcsXG59KVxuZXhwb3J0IGNsYXNzIEF1dGhDYWxsYmFja0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBhdXRoU2VydmljZTogQXV0aFNlcnZpY2UpIHt9XG5cbiAgICBuZ09uSW5pdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXV0aFNlcnZpY2UuY29tcGxldGVBdXRoZW50aWNhdGlvbigpO1xuICAgIH1cbn1cbiIsIiJdfQ==
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
export class AuthUser {
|
|
2
|
+
static { this.anonymous = new AuthUser(); }
|
|
3
|
+
/**
|
|
4
|
+
* Constructs a user object from a given oidc user object.
|
|
5
|
+
*
|
|
6
|
+
* @param oidcUser The oidc user object.
|
|
7
|
+
*/
|
|
8
|
+
constructor(oidcUser = null) {
|
|
9
|
+
this.oidcUser = oidcUser;
|
|
10
|
+
this.oidcUser = oidcUser;
|
|
11
|
+
if (oidcUser == null) {
|
|
12
|
+
this.isAuthenticated = false;
|
|
13
|
+
}
|
|
14
|
+
else {
|
|
15
|
+
this.isAuthenticated = true;
|
|
16
|
+
this.authorizationHeader = `${oidcUser.token_type} ${oidcUser.access_token}`;
|
|
17
|
+
this.name = oidcUser.profile?.name;
|
|
18
|
+
this.firstName = oidcUser.profile?.given_name;
|
|
19
|
+
this.lastName = oidcUser.profile?.family_name;
|
|
20
|
+
this.fullName = `${this.firstName} ${this.lastName}`;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Gets the raw claims associated with the user.
|
|
25
|
+
*/
|
|
26
|
+
get claims() {
|
|
27
|
+
return this.oidcUser?.profile || {};
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Determines whether the currently authenticated user is in any of an
|
|
31
|
+
* array of roles.
|
|
32
|
+
*
|
|
33
|
+
* @param roles An array of required roles.
|
|
34
|
+
* @returns True if the user has any of the required roles, false otherwise.
|
|
35
|
+
*/
|
|
36
|
+
hasAnyRole(...roles) {
|
|
37
|
+
const roleClaim = this.claims['role'];
|
|
38
|
+
if (roleClaim == null) {
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
const claimRoles = Array.isArray(roleClaim) ? roleClaim : [roleClaim];
|
|
42
|
+
return roles.some(r => claimRoles.some(cr => r.toLowerCase() === cr.toLowerCase()));
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Determines whether the currently authenticated user has a claim,
|
|
46
|
+
* and optionally, whether the claim has a specific value.
|
|
47
|
+
*
|
|
48
|
+
* @param claimType Claim type to match
|
|
49
|
+
* @param claimValue Optional claim value to match
|
|
50
|
+
*
|
|
51
|
+
* @returns True if the user has the required claim, false otherwise.
|
|
52
|
+
*/
|
|
53
|
+
hasClaim(claimType, claimValue) {
|
|
54
|
+
const value = this.claims[claimType];
|
|
55
|
+
return !!value && (!claimValue || value === claimValue);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Determines whether the currently authenticated user is a customer.
|
|
59
|
+
*/
|
|
60
|
+
get isCustomer() {
|
|
61
|
+
return this.hasClaim('ch:customer');
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Determines whether the currently authenticated user is an employee.
|
|
65
|
+
*/
|
|
66
|
+
get isEmployee() {
|
|
67
|
+
return this.hasAnyRole('ch:Employee');
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Creates a user object given an oidc user object.
|
|
71
|
+
*
|
|
72
|
+
* @param oidcUser The oidc user object.
|
|
73
|
+
* @returns A user object for the given oidc user object. If no oidc
|
|
74
|
+
* user object is specified or it has expired, returns the anonymous
|
|
75
|
+
* user.
|
|
76
|
+
*/
|
|
77
|
+
static from(oidcUser) {
|
|
78
|
+
if (oidcUser === null || oidcUser.expired) {
|
|
79
|
+
return AuthUser.anonymous;
|
|
80
|
+
}
|
|
81
|
+
return new AuthUser(oidcUser);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC11c2VyLm1vZGVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWNoby1jb21tb24vc3JjL2xpYi9zZWN1cml0eS9tb2RlbHMvYXV0aC11c2VyLm1vZGVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLE1BQU0sT0FBTyxRQUFRO2FBQ00sY0FBUyxHQUFHLElBQUksUUFBUSxFQUFFLENBQUM7SUFTbEQ7Ozs7T0FJRztJQUNILFlBQXFDLFdBQTRCLElBQUk7UUFBaEMsYUFBUSxHQUFSLFFBQVEsQ0FBd0I7UUFDakUsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFFekIsSUFBSSxRQUFRLElBQUksSUFBSSxFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7UUFDakMsQ0FBQzthQUFNLENBQUM7WUFDSixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztZQUM1QixJQUFJLENBQUMsbUJBQW1CLEdBQUcsR0FBRyxRQUFRLENBQUMsVUFBVSxJQUFJLFFBQVEsQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUM3RSxJQUFJLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDO1lBQ25DLElBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUM7WUFDOUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUMsT0FBTyxFQUFFLFdBQVcsQ0FBQztZQUM5QyxJQUFJLENBQUMsUUFBUSxHQUFHLEdBQUcsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDekQsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNILElBQVcsTUFBTTtRQUNiLE9BQU8sSUFBSSxDQUFDLFFBQVEsRUFBRSxPQUFPLElBQUksRUFBRSxDQUFDO0lBQ3hDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxVQUFVLENBQUMsR0FBRyxLQUFlO1FBQ2hDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFdEMsSUFBSSxTQUFTLElBQUksSUFBSSxFQUFFLENBQUM7WUFDcEIsT0FBTyxLQUFLLENBQUM7UUFDakIsQ0FBQztRQUVELE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN0RSxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDeEYsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0ksUUFBUSxDQUFDLFNBQWlCLEVBQUUsVUFBbUI7UUFDbEQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNyQyxPQUFPLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLFVBQVUsSUFBSSxLQUFLLEtBQUssVUFBVSxDQUFDLENBQUM7SUFDNUQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBVyxVQUFVO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFXLFVBQVU7UUFDakIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ksTUFBTSxDQUFDLElBQUksQ0FBQyxRQUF5QjtRQUN4QyxJQUFJLFFBQVEsS0FBSyxJQUFJLElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3hDLE9BQU8sUUFBUSxDQUFDLFNBQVMsQ0FBQztRQUM5QixDQUFDO1FBRUQsT0FBTyxJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNsQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVXNlciBhcyBPaWRjVXNlciB9IGZyb20gJ29pZGMtY2xpZW50JztcbmltcG9ydCB7IEluZGV4YWJsZSB9IGZyb20gJy4uLy4uL3R5cGVzL2luZGV4YWJsZS50eXBlJztcblxuZXhwb3J0IGNsYXNzIEF1dGhVc2VyIHtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGFub255bW91cyA9IG5ldyBBdXRoVXNlcigpO1xuXG4gICAgcHVibGljIHJlYWRvbmx5IGlzQXV0aGVudGljYXRlZDogYm9vbGVhbjtcbiAgICBwdWJsaWMgcmVhZG9ubHkgYXV0aG9yaXphdGlvbkhlYWRlcj86IHN0cmluZztcbiAgICBwdWJsaWMgcmVhZG9ubHkgZmlyc3ROYW1lPzogc3RyaW5nO1xuICAgIHB1YmxpYyByZWFkb25seSBsYXN0TmFtZT86IHN0cmluZztcbiAgICBwdWJsaWMgcmVhZG9ubHkgZnVsbE5hbWU/OiBzdHJpbmc7XG4gICAgcHVibGljIHJlYWRvbmx5IG5hbWU/OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIGEgdXNlciBvYmplY3QgZnJvbSBhIGdpdmVuIG9pZGMgdXNlciBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb2lkY1VzZXIgVGhlIG9pZGMgdXNlciBvYmplY3QuXG4gICAgICovXG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IG9pZGNVc2VyOiBPaWRjVXNlciB8IG51bGwgPSBudWxsKSB7XG4gICAgICAgIHRoaXMub2lkY1VzZXIgPSBvaWRjVXNlcjtcblxuICAgICAgICBpZiAob2lkY1VzZXIgPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5pc0F1dGhlbnRpY2F0ZWQgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaXNBdXRoZW50aWNhdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuYXV0aG9yaXphdGlvbkhlYWRlciA9IGAke29pZGNVc2VyLnRva2VuX3R5cGV9ICR7b2lkY1VzZXIuYWNjZXNzX3Rva2VufWA7XG4gICAgICAgICAgICB0aGlzLm5hbWUgPSBvaWRjVXNlci5wcm9maWxlPy5uYW1lO1xuICAgICAgICAgICAgdGhpcy5maXJzdE5hbWUgPSBvaWRjVXNlci5wcm9maWxlPy5naXZlbl9uYW1lO1xuICAgICAgICAgICAgdGhpcy5sYXN0TmFtZSA9IG9pZGNVc2VyLnByb2ZpbGU/LmZhbWlseV9uYW1lO1xuICAgICAgICAgICAgdGhpcy5mdWxsTmFtZSA9IGAke3RoaXMuZmlyc3ROYW1lfSAke3RoaXMubGFzdE5hbWV9YDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHJhdyBjbGFpbXMgYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgY2xhaW1zKCk6IEluZGV4YWJsZSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9pZGNVc2VyPy5wcm9maWxlIHx8IHt9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERldGVybWluZXMgd2hldGhlciB0aGUgY3VycmVudGx5IGF1dGhlbnRpY2F0ZWQgdXNlciBpcyBpbiBhbnkgb2YgYW5cbiAgICAgKiBhcnJheSBvZiByb2xlcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByb2xlcyBBbiBhcnJheSBvZiByZXF1aXJlZCByb2xlcy5cbiAgICAgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSB1c2VyIGhhcyBhbnkgb2YgdGhlIHJlcXVpcmVkIHJvbGVzLCBmYWxzZSBvdGhlcndpc2UuXG4gICAgICovXG4gICAgcHVibGljIGhhc0FueVJvbGUoLi4ucm9sZXM6IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHJvbGVDbGFpbSA9IHRoaXMuY2xhaW1zWydyb2xlJ107XG5cbiAgICAgICAgaWYgKHJvbGVDbGFpbSA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjbGFpbVJvbGVzID0gQXJyYXkuaXNBcnJheShyb2xlQ2xhaW0pID8gcm9sZUNsYWltIDogW3JvbGVDbGFpbV07XG4gICAgICAgIHJldHVybiByb2xlcy5zb21lKHIgPT4gY2xhaW1Sb2xlcy5zb21lKGNyID0+IHIudG9Mb3dlckNhc2UoKSA9PT0gY3IudG9Mb3dlckNhc2UoKSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERldGVybWluZXMgd2hldGhlciB0aGUgY3VycmVudGx5IGF1dGhlbnRpY2F0ZWQgdXNlciBoYXMgYSBjbGFpbSxcbiAgICAgKiBhbmQgb3B0aW9uYWxseSwgd2hldGhlciB0aGUgY2xhaW0gaGFzIGEgc3BlY2lmaWMgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY2xhaW1UeXBlIENsYWltIHR5cGUgdG8gbWF0Y2hcbiAgICAgKiBAcGFyYW0gY2xhaW1WYWx1ZSBPcHRpb25hbCBjbGFpbSB2YWx1ZSB0byBtYXRjaFxuICAgICAqXG4gICAgICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgdXNlciBoYXMgdGhlIHJlcXVpcmVkIGNsYWltLCBmYWxzZSBvdGhlcndpc2UuXG4gICAgICovXG4gICAgcHVibGljIGhhc0NsYWltKGNsYWltVHlwZTogc3RyaW5nLCBjbGFpbVZhbHVlPzogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5jbGFpbXNbY2xhaW1UeXBlXTtcbiAgICAgICAgcmV0dXJuICEhdmFsdWUgJiYgKCFjbGFpbVZhbHVlIHx8IHZhbHVlID09PSBjbGFpbVZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGN1cnJlbnRseSBhdXRoZW50aWNhdGVkIHVzZXIgaXMgYSBjdXN0b21lci5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGlzQ3VzdG9tZXIoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhc0NsYWltKCdjaDpjdXN0b21lcicpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERldGVybWluZXMgd2hldGhlciB0aGUgY3VycmVudGx5IGF1dGhlbnRpY2F0ZWQgdXNlciBpcyBhbiBlbXBsb3llZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGlzRW1wbG95ZWUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhc0FueVJvbGUoJ2NoOkVtcGxveWVlJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHVzZXIgb2JqZWN0IGdpdmVuIGFuIG9pZGMgdXNlciBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb2lkY1VzZXIgVGhlIG9pZGMgdXNlciBvYmplY3QuXG4gICAgICogQHJldHVybnMgQSB1c2VyIG9iamVjdCBmb3IgdGhlIGdpdmVuIG9pZGMgdXNlciBvYmplY3QuICBJZiBubyBvaWRjXG4gICAgICogdXNlciBvYmplY3QgaXMgc3BlY2lmaWVkIG9yIGl0IGhhcyBleHBpcmVkLCByZXR1cm5zIHRoZSBhbm9ueW1vdXNcbiAgICAgKiB1c2VyLlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZnJvbShvaWRjVXNlcjogT2lkY1VzZXIgfCBudWxsKTogQXV0aFVzZXIge1xuICAgICAgICBpZiAob2lkY1VzZXIgPT09IG51bGwgfHwgb2lkY1VzZXIuZXhwaXJlZCkge1xuICAgICAgICAgICAgcmV0dXJuIEF1dGhVc2VyLmFub255bW91cztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgQXV0aFVzZXIob2lkY1VzZXIpO1xuICAgIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export class AuthorizationContext {
|
|
2
|
+
constructor(user) {
|
|
3
|
+
this.user = user;
|
|
4
|
+
}
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aG9yaXphdGlvbi1jb250ZXh0Lm1vZGVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWNoby1jb21tb24vc3JjL2xpYi9zZWN1cml0eS9tb2RlbHMvYXV0aG9yaXphdGlvbi1jb250ZXh0Lm1vZGVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE1BQU0sT0FBTyxvQkFBb0I7SUFDN0IsWUFBNEIsSUFBYztRQUFkLFNBQUksR0FBSixJQUFJLENBQVU7SUFBRyxDQUFDO0NBQ2pEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXV0aFVzZXIgfSBmcm9tICcuL2F1dGgtdXNlci5tb2RlbCc7XG5cbmV4cG9ydCBjbGFzcyBBdXRob3JpemF0aW9uQ29udGV4dCB7XG4gICAgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IHVzZXI6IEF1dGhVc2VyKSB7fVxufVxuIl19
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export class SecurityPolicy {
|
|
2
|
+
constructor(name, requirement) {
|
|
3
|
+
this.name = name;
|
|
4
|
+
this.requirement = requirement;
|
|
5
|
+
this._succeeded = false;
|
|
6
|
+
}
|
|
7
|
+
get succeeded() {
|
|
8
|
+
return this._succeeded;
|
|
9
|
+
}
|
|
10
|
+
evaluate(context) {
|
|
11
|
+
this._succeeded = this.requirement(context);
|
|
12
|
+
return this._succeeded;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VjdXJpdHktcG9saWN5Lm1vZGVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWNoby1jb21tb24vc3JjL2xpYi9zZWN1cml0eS9tb2RlbHMvc2VjdXJpdHktcG9saWN5Lm1vZGVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE1BQU0sT0FBTyxjQUFjO0lBR3ZCLFlBQ29CLElBQVksRUFDWCxXQUF1RDtRQUR4RCxTQUFJLEdBQUosSUFBSSxDQUFRO1FBQ1gsZ0JBQVcsR0FBWCxXQUFXLENBQTRDO1FBSnBFLGVBQVUsR0FBRyxLQUFLLENBQUM7SUFLeEIsQ0FBQztJQUVKLElBQVcsU0FBUztRQUNoQixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDM0IsQ0FBQztJQUVNLFFBQVEsQ0FBQyxPQUE2QjtRQUN6QyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDNUMsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQzNCLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEF1dGhvcml6YXRpb25Db250ZXh0IH0gZnJvbSAnLi9hdXRob3JpemF0aW9uLWNvbnRleHQubW9kZWwnO1xuXG5leHBvcnQgY2xhc3MgU2VjdXJpdHlQb2xpY3kge1xuICAgIHByaXZhdGUgX3N1Y2NlZWRlZCA9IGZhbHNlO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBuYW1lOiBzdHJpbmcsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgcmVxdWlyZW1lbnQ6IChjb250ZXh0OiBBdXRob3JpemF0aW9uQ29udGV4dCkgPT4gYm9vbGVhblxuICAgICkge31cblxuICAgIHB1YmxpYyBnZXQgc3VjY2VlZGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3VjY2VlZGVkO1xuICAgIH1cblxuICAgIHB1YmxpYyBldmFsdWF0ZShjb250ZXh0OiBBdXRob3JpemF0aW9uQ29udGV4dCk6IGJvb2xlYW4ge1xuICAgICAgICB0aGlzLl9zdWNjZWVkZWQgPSB0aGlzLnJlcXVpcmVtZW50KGNvbnRleHQpO1xuICAgICAgICByZXR1cm4gdGhpcy5fc3VjY2VlZGVkO1xuICAgIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { InjectionToken } from '@angular/core';
|
|
2
|
+
export const SECURITY_POLICIES = new InjectionToken('');
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VjdXJpdHktcG9saWNpZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtY2hvLWNvbW1vbi9zcmMvbGliL3NlY3VyaXR5L3NlY3VyaXR5LXBvbGljaWVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHL0MsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxjQUFjLENBQW1CLEVBQUUsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFNlY3VyaXR5UG9saWN5IH0gZnJvbSAnLi9tb2RlbHMvc2VjdXJpdHktcG9saWN5Lm1vZGVsJztcblxuZXhwb3J0IGNvbnN0IFNFQ1VSSVRZX1BPTElDSUVTID0gbmV3IEluamVjdGlvblRva2VuPFNlY3VyaXR5UG9saWN5W10+KCcnKTtcbiJdfQ==
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
import * as i1 from "./auth.service";
|
|
4
|
+
import * as i2 from "ngx-toastr";
|
|
5
|
+
export class AuthGuardService {
|
|
6
|
+
constructor(authService, toastr) {
|
|
7
|
+
this.authService = authService;
|
|
8
|
+
this.toastr = toastr;
|
|
9
|
+
}
|
|
10
|
+
async canActivate(route, state) {
|
|
11
|
+
if (await this.authService.checkIsAuthenticated()) {
|
|
12
|
+
const routePolicy = route.data['policy'];
|
|
13
|
+
if (!routePolicy) {
|
|
14
|
+
return true;
|
|
15
|
+
}
|
|
16
|
+
if (!this.authService.checkPolicy(routePolicy)) {
|
|
17
|
+
this.toastr.error("Oops! It doesn't look like you are authorized to access this page.");
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
return true;
|
|
21
|
+
}
|
|
22
|
+
await this.authService.startAuthentication(state.url);
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AuthGuardService, deps: [{ token: i1.AuthService }, { token: i2.ToastrService }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
26
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AuthGuardService, providedIn: 'root' }); }
|
|
27
|
+
}
|
|
28
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AuthGuardService, decorators: [{
|
|
29
|
+
type: Injectable,
|
|
30
|
+
args: [{ providedIn: 'root' }]
|
|
31
|
+
}], ctorParameters: () => [{ type: i1.AuthService }, { type: i2.ToastrService }] });
|
|
32
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC1ndWFyZC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWNoby1jb21tb24vc3JjL2xpYi9zZWN1cml0eS9zZXJ2aWNlcy9hdXRoLWd1YXJkLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7OztBQU0zQyxNQUFNLE9BQU8sZ0JBQWdCO0lBQ3pCLFlBQ1ksV0FBd0IsRUFDeEIsTUFBcUI7UUFEckIsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIsV0FBTSxHQUFOLE1BQU0sQ0FBZTtJQUM5QixDQUFDO0lBRUcsS0FBSyxDQUFDLFdBQVcsQ0FDcEIsS0FBNkIsRUFDN0IsS0FBMEI7UUFFMUIsSUFBSSxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsb0JBQW9CLEVBQUUsRUFBRSxDQUFDO1lBQ2hELE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFXLENBQUM7WUFFbkQsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUNmLE9BQU8sSUFBSSxDQUFDO1lBQ2hCLENBQUM7WUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztnQkFDN0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQ2Isb0VBQW9FLENBQ3ZFLENBQUM7Z0JBQ0YsT0FBTyxLQUFLLENBQUM7WUFDakIsQ0FBQztZQUVELE9BQU8sSUFBSSxDQUFDO1FBQ2hCLENBQUM7UUFFRCxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3RELE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7K0dBN0JRLGdCQUFnQjttSEFBaEIsZ0JBQWdCLGNBREgsTUFBTTs7NEZBQ25CLGdCQUFnQjtrQkFENUIsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LCBSb3V0ZXJTdGF0ZVNuYXBzaG90IH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IFRvYXN0clNlcnZpY2UgfSBmcm9tICduZ3gtdG9hc3RyJztcbmltcG9ydCB7IEF1dGhTZXJ2aWNlIH0gZnJvbSAnLi9hdXRoLnNlcnZpY2UnO1xuXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIEF1dGhHdWFyZFNlcnZpY2Uge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIGF1dGhTZXJ2aWNlOiBBdXRoU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSB0b2FzdHI6IFRvYXN0clNlcnZpY2VcbiAgICApIHt9XG5cbiAgICBwdWJsaWMgYXN5bmMgY2FuQWN0aXZhdGUoXG4gICAgICAgIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LFxuICAgICAgICBzdGF0ZTogUm91dGVyU3RhdGVTbmFwc2hvdFxuICAgICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBpZiAoYXdhaXQgdGhpcy5hdXRoU2VydmljZS5jaGVja0lzQXV0aGVudGljYXRlZCgpKSB7XG4gICAgICAgICAgICBjb25zdCByb3V0ZVBvbGljeSA9IHJvdXRlLmRhdGFbJ3BvbGljeSddIGFzIHN0cmluZztcblxuICAgICAgICAgICAgaWYgKCFyb3V0ZVBvbGljeSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIXRoaXMuYXV0aFNlcnZpY2UuY2hlY2tQb2xpY3kocm91dGVQb2xpY3kpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIFwiT29wcyEgSXQgZG9lc24ndCBsb29rIGxpa2UgeW91IGFyZSBhdXRob3JpemVkIHRvIGFjY2VzcyB0aGlzIHBhZ2UuXCJcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCB0aGlzLmF1dGhTZXJ2aWNlLnN0YXJ0QXV0aGVudGljYXRpb24oc3RhdGUudXJsKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cbiJdfQ==
|