@ng-atomic/common 15.1.1 → 16.1.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.
@@ -0,0 +1,26 @@
1
+ import { Injectable, InjectionToken, inject } from '@angular/core';
2
+ import { from } from 'rxjs';
3
+ import { mergeMap, take } from 'rxjs/operators';
4
+ import * as i0 from "@angular/core";
5
+ export const PROVIDE_AUTHORIZATION = new InjectionToken('PROVIDE_AUTHORIZATION');
6
+ export class AuthorizationInterceptor {
7
+ constructor() {
8
+ this.provide = inject(PROVIDE_AUTHORIZATION);
9
+ }
10
+ intercept(req, next) {
11
+ if (!req.url.startsWith('/api'))
12
+ return next.handle(req);
13
+ return from(this.provide())
14
+ .pipe(take(1))
15
+ .pipe(mergeMap(idToken => next.handle(idToken ? this.getRequestWithToken(req, idToken) : req)));
16
+ }
17
+ getRequestWithToken(req, token) {
18
+ return req.clone({ setHeaders: { Authorization: token } });
19
+ }
20
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AuthorizationInterceptor, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
21
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AuthorizationInterceptor }); }
22
+ }
23
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AuthorizationInterceptor, decorators: [{
24
+ type: Injectable
25
+ }] });
26
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aG9yaXphdGlvbi5pbnRlcmNlcHRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BuZy1hdG9taWMvY29tbW9uL3NyYy9saWIvaW50ZXJjZXB0b3JzL2F1dGhvcml6YXRpb24vYXV0aG9yaXphdGlvbi5pbnRlcmNlcHRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFbkUsT0FBTyxFQUFFLElBQUksRUFBYyxNQUFNLE1BQU0sQ0FBQztBQUN4QyxPQUFPLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDOztBQUdoRCxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLGNBQWMsQ0FBdUIsdUJBQXVCLENBQUMsQ0FBQztBQUd2RyxNQUFNLE9BQU8sd0JBQXdCO0lBRHJDO1FBR1UsWUFBTyxHQUFHLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO0tBYWpEO0lBWEMsU0FBUyxDQUFDLEdBQXlCLEVBQUUsSUFBaUI7UUFDcEQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUV6RCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7YUFDeEIsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNiLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BHLENBQUM7SUFFTyxtQkFBbUIsQ0FBQyxHQUF5QixFQUFFLEtBQWE7UUFDbEUsT0FBTyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsVUFBVSxFQUFFLEVBQUMsYUFBYSxFQUFFLEtBQUssRUFBQyxFQUFFLENBQUMsQ0FBQztJQUMzRCxDQUFDOytHQWRVLHdCQUF3QjttSEFBeEIsd0JBQXdCOzs0RkFBeEIsd0JBQXdCO2tCQURwQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0aW9uVG9rZW4sIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSHR0cFJlcXVlc3QsIEh0dHBIYW5kbGVyLCBIdHRwRXZlbnQsIEh0dHBJbnRlcmNlcHRvciB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IGZyb20sIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1lcmdlTWFwLCB0YWtlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5leHBvcnQgdHlwZSBQcm92aWRlQXV0aG9yaXphdGlvbiA9ICgpID0+IFByb21pc2U8c3RyaW5nIHwgbnVsbD4gfCBPYnNlcnZhYmxlPHN0cmluZyB8IG51bGw+O1xuZXhwb3J0IGNvbnN0IFBST1ZJREVfQVVUSE9SSVpBVElPTiA9IG5ldyBJbmplY3Rpb25Ub2tlbjxQcm92aWRlQXV0aG9yaXphdGlvbj4oJ1BST1ZJREVfQVVUSE9SSVpBVElPTicpO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQXV0aG9yaXphdGlvbkludGVyY2VwdG9yIGltcGxlbWVudHMgSHR0cEludGVyY2VwdG9yIHtcblxuICBwcml2YXRlIHByb3ZpZGUgPSBpbmplY3QoUFJPVklERV9BVVRIT1JJWkFUSU9OKTtcblxuICBpbnRlcmNlcHQocmVxOiBIdHRwUmVxdWVzdDx1bmtub3duPiwgbmV4dDogSHR0cEhhbmRsZXIpOiBPYnNlcnZhYmxlPEh0dHBFdmVudDx1bmtub3duPj4ge1xuICAgIGlmICghcmVxLnVybC5zdGFydHNXaXRoKCcvYXBpJykpIHJldHVybiBuZXh0LmhhbmRsZShyZXEpO1xuXG4gICAgcmV0dXJuIGZyb20odGhpcy5wcm92aWRlKCkpXG4gICAgICAucGlwZSh0YWtlKDEpKVxuICAgICAgLnBpcGUobWVyZ2VNYXAoaWRUb2tlbiA9PiBuZXh0LmhhbmRsZShpZFRva2VuID8gdGhpcy5nZXRSZXF1ZXN0V2l0aFRva2VuKHJlcSwgaWRUb2tlbikgOiByZXEpKSk7XG4gIH1cblxuICBwcml2YXRlIGdldFJlcXVlc3RXaXRoVG9rZW4ocmVxOiBIdHRwUmVxdWVzdDx1bmtub3duPiwgdG9rZW46IHN0cmluZykge1xuICAgIHJldHVybiByZXEuY2xvbmUoeyBzZXRIZWFkZXJzOiB7QXV0aG9yaXphdGlvbjogdG9rZW59IH0pO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,2 @@
1
+ export * from './authorization.interceptor';
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9AbmctYXRvbWljL2NvbW1vbi9zcmMvbGliL2ludGVyY2VwdG9ycy9hdXRob3JpemF0aW9uL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsNkJBQTZCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2F1dGhvcml6YXRpb24uaW50ZXJjZXB0b3InO1xuIl19
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './index';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctYXRvbWljLWNvbW1vbi1pbnRlcmNlcHRvcnMtYXV0aG9yaXphdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BuZy1hdG9taWMvY29tbW9uL3NyYy9saWIvaW50ZXJjZXB0b3JzL2F1dGhvcml6YXRpb24vbmctYXRvbWljLWNvbW1vbi1pbnRlcmNlcHRvcnMtYXV0aG9yaXphdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2luZGV4JztcbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export * from './throttle.interceptor';
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9AbmctYXRvbWljL2NvbW1vbi9zcmMvbGliL2ludGVyY2VwdG9ycy90aHJvdHRsZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLHdCQUF3QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi90aHJvdHRsZS5pbnRlcmNlcHRvcic7XG4iXX0=
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './index';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctYXRvbWljLWNvbW1vbi1pbnRlcmNlcHRvcnMtdGhyb3R0bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9AbmctYXRvbWljL2NvbW1vbi9zcmMvbGliL2ludGVyY2VwdG9ycy90aHJvdHRsZS9uZy1hdG9taWMtY29tbW9uLWludGVyY2VwdG9ycy10aHJvdHRsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2luZGV4JztcbiJdfQ==
@@ -0,0 +1,63 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { ReplaySubject, throwError } from 'rxjs';
3
+ import { catchError, finalize, tap } from 'rxjs/operators';
4
+ import * as i0 from "@angular/core";
5
+ class IcedCacheService {
6
+ constructor() {
7
+ this.cache = {};
8
+ }
9
+ has(key) {
10
+ return !!this.cache?.[key];
11
+ }
12
+ get(key) {
13
+ return this.cache[key];
14
+ }
15
+ set(key, value) {
16
+ this.cache[key] = value;
17
+ this.removeAfter(key, 10 * 1000);
18
+ }
19
+ removeAfter(key, ms = 1000) {
20
+ setTimeout(() => this.remove(key), ms);
21
+ }
22
+ remove(key) {
23
+ delete this.cache?.[key];
24
+ }
25
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: IcedCacheService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
26
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: IcedCacheService, providedIn: 'root' }); }
27
+ }
28
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: IcedCacheService, decorators: [{
29
+ type: Injectable,
30
+ args: [{
31
+ providedIn: 'root'
32
+ }]
33
+ }] });
34
+ export class ThrottleInterceptor {
35
+ constructor(cache) {
36
+ this.cache = cache;
37
+ }
38
+ intercept(req, next) {
39
+ if (!this.test(req))
40
+ return next.handle(req);
41
+ const key = this.buildKey(req);
42
+ if (!this.cache.has(key)) {
43
+ const subject = new ReplaySubject(1);
44
+ next.handle(req).pipe(tap(event => subject.next(event)), catchError((error) => (subject.error(error), throwError(error))), finalize(() => subject.complete())).subscribe(() => { });
45
+ this.cache.set(key, subject);
46
+ }
47
+ return this.cache.get(key);
48
+ }
49
+ test(req) {
50
+ if (req.method !== 'GET')
51
+ return false;
52
+ return req.url.startsWith('/api');
53
+ }
54
+ buildKey(req) {
55
+ return `${req.url}`;
56
+ }
57
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ThrottleInterceptor, deps: [{ token: IcedCacheService }], target: i0.ɵɵFactoryTarget.Injectable }); }
58
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ThrottleInterceptor }); }
59
+ }
60
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ThrottleInterceptor, decorators: [{
61
+ type: Injectable
62
+ }], ctorParameters: function () { return [{ type: IcedCacheService }]; } });
63
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhyb3R0bGUuaW50ZXJjZXB0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9AbmctYXRvbWljL2NvbW1vbi9zcmMvbGliL2ludGVyY2VwdG9ycy90aHJvdHRsZS90aHJvdHRsZS5pbnRlcmNlcHRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDLE9BQU8sRUFBYyxhQUFhLEVBQVcsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBQyxNQUFNLGdCQUFnQixDQUFDOztBQUcxRCxNQUdNLGdCQUFnQjtJQUh0QjtRQUlFLFVBQUssR0FBRyxFQUFFLENBQUM7S0FzQlo7SUFwQkMsR0FBRyxDQUFDLEdBQVc7UUFDYixPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVELEdBQUcsQ0FBQyxHQUFXO1FBQ2IsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFFRCxHQUFHLENBQUMsR0FBVyxFQUFFLEtBQWtDO1FBQ2pELElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQsV0FBVyxDQUFDLEdBQVcsRUFBRSxLQUFhLElBQUk7UUFDeEMsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVELE1BQU0sQ0FBQyxHQUFXO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzNCLENBQUM7K0dBdEJHLGdCQUFnQjttSEFBaEIsZ0JBQWdCLGNBRlIsTUFBTTs7NEZBRWQsZ0JBQWdCO2tCQUhyQixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQjs7QUEyQkQsTUFBTSxPQUFPLG1CQUFtQjtJQUU5QixZQUFvQixLQUF1QjtRQUF2QixVQUFLLEdBQUwsS0FBSyxDQUFrQjtJQUFJLENBQUM7SUFFaEQsU0FBUyxDQUFDLEdBQXlCLEVBQUUsSUFBaUI7UUFDcEQsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO1lBQUUsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRTdDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFL0IsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ3hCLE1BQU0sT0FBTyxHQUFHLElBQUksYUFBYSxDQUFxQixDQUFDLENBQUMsQ0FBQztZQUN6RCxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FDbkIsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUNqQyxVQUFVLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRSxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUNoRSxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQ25DLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztTQUM5QjtRQUVELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVTLElBQUksQ0FBQyxHQUF5QjtRQUN0QyxJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssS0FBSztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQ3ZDLE9BQU8sR0FBRyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVPLFFBQVEsQ0FBQyxHQUF5QjtRQUN4QyxPQUFPLEdBQUcsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ3RCLENBQUM7K0dBN0JVLG1CQUFtQjttSEFBbkIsbUJBQW1COzs0RkFBbkIsbUJBQW1CO2tCQUQvQixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSHR0cFJlcXVlc3QsIEh0dHBIYW5kbGVyLCBIdHRwRXZlbnQsIEh0dHBJbnRlcmNlcHRvciB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IE9ic2VydmFibGUsIFJlcGxheVN1YmplY3QsIFN1YmplY3QsIHRocm93RXJyb3IgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGNhdGNoRXJyb3IsIGZpbmFsaXplLCB0YXB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmNsYXNzIEljZWRDYWNoZVNlcnZpY2Uge1xuICBjYWNoZSA9IHt9O1xuXG4gIGhhcyhrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuY2FjaGU/LltrZXldO1xuICB9XG5cbiAgZ2V0KGtleTogc3RyaW5nKTogU3ViamVjdDxIdHRwRXZlbnQ8dW5rbm93bj4+IHtcbiAgICByZXR1cm4gdGhpcy5jYWNoZVtrZXldO1xuICB9XG5cbiAgc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogU3ViamVjdDxIdHRwRXZlbnQ8dW5rbm93bj4+KTogdm9pZCB7XG4gICAgdGhpcy5jYWNoZVtrZXldID0gdmFsdWU7XG4gICAgdGhpcy5yZW1vdmVBZnRlcihrZXksIDEwICogMTAwMCk7XG4gIH1cblxuICByZW1vdmVBZnRlcihrZXk6IHN0cmluZywgbXM6IG51bWJlciA9IDEwMDApIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMucmVtb3ZlKGtleSksIG1zKTtcbiAgfVxuXG4gIHJlbW92ZShrZXk6IHN0cmluZykge1xuICAgIGRlbGV0ZSB0aGlzLmNhY2hlPy5ba2V5XTtcbiAgfVxufVxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgVGhyb3R0bGVJbnRlcmNlcHRvciBpbXBsZW1lbnRzIEh0dHBJbnRlcmNlcHRvciB7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjYWNoZTogSWNlZENhY2hlU2VydmljZSkgeyB9XG5cbiAgaW50ZXJjZXB0KHJlcTogSHR0cFJlcXVlc3Q8dW5rbm93bj4sIG5leHQ6IEh0dHBIYW5kbGVyKTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8dW5rbm93bj4+IHtcbiAgICBpZiAoIXRoaXMudGVzdChyZXEpKSByZXR1cm4gbmV4dC5oYW5kbGUocmVxKTtcblxuICAgIGNvbnN0IGtleSA9IHRoaXMuYnVpbGRLZXkocmVxKTtcblxuICAgIGlmICghdGhpcy5jYWNoZS5oYXMoa2V5KSkge1xuICAgICAgY29uc3Qgc3ViamVjdCA9IG5ldyBSZXBsYXlTdWJqZWN0PEh0dHBFdmVudDx1bmtub3duPj4oMSk7XG4gICAgICBuZXh0LmhhbmRsZShyZXEpLnBpcGUoXG4gICAgICAgIHRhcChldmVudCA9PiBzdWJqZWN0Lm5leHQoZXZlbnQpKSxcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IChzdWJqZWN0LmVycm9yKGVycm9yKSwgdGhyb3dFcnJvcihlcnJvcikpKSxcbiAgICAgICAgZmluYWxpemUoKCkgPT4gc3ViamVjdC5jb21wbGV0ZSgpKSxcbiAgICAgICkuc3Vic2NyaWJlKCgpID0+IHt9KTtcbiAgICAgIHRoaXMuY2FjaGUuc2V0KGtleSwgc3ViamVjdCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuY2FjaGUuZ2V0KGtleSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgdGVzdChyZXE6IEh0dHBSZXF1ZXN0PHVua25vd24+KTogYm9vbGVhbiB7XG4gICAgaWYgKHJlcS5tZXRob2QgIT09ICdHRVQnKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHJlcS51cmwuc3RhcnRzV2l0aCgnL2FwaScpO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZEtleShyZXE6IEh0dHBSZXF1ZXN0PHVua25vd24+KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7cmVxLnVybH1gO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,26 @@
1
+ import { Injectable, InjectionToken, inject } from '@angular/core';
2
+ import { from } from 'rxjs';
3
+ import { mergeMap, take } from 'rxjs/operators';
4
+ import * as i0 from "@angular/core";
5
+ export const PROVIDE_AUTHORIZATION = new InjectionToken('PROVIDE_AUTHORIZATION');
6
+ export class AuthorizationInterceptor {
7
+ constructor() {
8
+ this.provide = inject(PROVIDE_AUTHORIZATION);
9
+ }
10
+ intercept(req, next) {
11
+ if (!req.url.startsWith('/api'))
12
+ return next.handle(req);
13
+ return from(this.provide())
14
+ .pipe(take(1))
15
+ .pipe(mergeMap(idToken => next.handle(idToken ? this.getRequestWithToken(req, idToken) : req)));
16
+ }
17
+ getRequestWithToken(req, token) {
18
+ return req.clone({ setHeaders: { Authorization: token } });
19
+ }
20
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AuthorizationInterceptor, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
21
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AuthorizationInterceptor }); }
22
+ }
23
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AuthorizationInterceptor, decorators: [{
24
+ type: Injectable
25
+ }] });
26
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aG9yaXphdGlvbi5pbnRlcmNlcHRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BuZy1hdG9taWMvY29tbW9uL3NyYy9saWIvaW50ZXJjZXB0b3JzL3Rva2VuL2F1dGhvcml6YXRpb24uaW50ZXJjZXB0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRW5FLE9BQU8sRUFBRSxJQUFJLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFDeEMsT0FBTyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7QUFHaEQsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxjQUFjLENBQXVCLHVCQUF1QixDQUFDLENBQUM7QUFHdkcsTUFBTSxPQUFPLHdCQUF3QjtJQURyQztRQUdVLFlBQU8sR0FBRyxNQUFNLENBQUMscUJBQXFCLENBQUMsQ0FBQztLQWFqRDtJQVhDLFNBQVMsQ0FBQyxHQUF5QixFQUFFLElBQWlCO1FBQ3BELElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFekQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO2FBQ3hCLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDYixJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwRyxDQUFDO0lBRU8sbUJBQW1CLENBQUMsR0FBeUIsRUFBRSxLQUFhO1FBQ2xFLE9BQU8sR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLFVBQVUsRUFBRSxFQUFDLGFBQWEsRUFBRSxLQUFLLEVBQUMsRUFBRSxDQUFDLENBQUM7SUFDM0QsQ0FBQzsrR0FkVSx3QkFBd0I7bUhBQXhCLHdCQUF3Qjs7NEZBQXhCLHdCQUF3QjtrQkFEcEMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIEluamVjdGlvblRva2VuLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEh0dHBSZXF1ZXN0LCBIdHRwSGFuZGxlciwgSHR0cEV2ZW50LCBIdHRwSW50ZXJjZXB0b3IgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBmcm9tLCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtZXJnZU1hcCwgdGFrZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuZXhwb3J0IHR5cGUgUHJvdmlkZUF1dGhvcml6YXRpb24gPSAoKSA9PiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHwgT2JzZXJ2YWJsZTxzdHJpbmcgfCBudWxsPjtcbmV4cG9ydCBjb25zdCBQUk9WSURFX0FVVEhPUklaQVRJT04gPSBuZXcgSW5qZWN0aW9uVG9rZW48UHJvdmlkZUF1dGhvcml6YXRpb24+KCdQUk9WSURFX0FVVEhPUklaQVRJT04nKTtcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEF1dGhvcml6YXRpb25JbnRlcmNlcHRvciBpbXBsZW1lbnRzIEh0dHBJbnRlcmNlcHRvciB7XG5cbiAgcHJpdmF0ZSBwcm92aWRlID0gaW5qZWN0KFBST1ZJREVfQVVUSE9SSVpBVElPTik7XG5cbiAgaW50ZXJjZXB0KHJlcTogSHR0cFJlcXVlc3Q8dW5rbm93bj4sIG5leHQ6IEh0dHBIYW5kbGVyKTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8dW5rbm93bj4+IHtcbiAgICBpZiAoIXJlcS51cmwuc3RhcnRzV2l0aCgnL2FwaScpKSByZXR1cm4gbmV4dC5oYW5kbGUocmVxKTtcblxuICAgIHJldHVybiBmcm9tKHRoaXMucHJvdmlkZSgpKVxuICAgICAgLnBpcGUodGFrZSgxKSlcbiAgICAgIC5waXBlKG1lcmdlTWFwKGlkVG9rZW4gPT4gbmV4dC5oYW5kbGUoaWRUb2tlbiA/IHRoaXMuZ2V0UmVxdWVzdFdpdGhUb2tlbihyZXEsIGlkVG9rZW4pIDogcmVxKSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRSZXF1ZXN0V2l0aFRva2VuKHJlcTogSHR0cFJlcXVlc3Q8dW5rbm93bj4sIHRva2VuOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gcmVxLmNsb25lKHsgc2V0SGVhZGVyczoge0F1dGhvcml6YXRpb246IHRva2VufSB9KTtcbiAgfVxufVxuIl19
@@ -0,0 +1,2 @@
1
+ export * from './authorization.interceptor';
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9AbmctYXRvbWljL2NvbW1vbi9zcmMvbGliL2ludGVyY2VwdG9ycy90b2tlbi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLDZCQUE2QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9hdXRob3JpemF0aW9uLmludGVyY2VwdG9yJztcbiJdfQ==
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './index';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctYXRvbWljLWNvbW1vbi1pbnRlcmNlcHRvcnMtdG9rZW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9AbmctYXRvbWljL2NvbW1vbi9zcmMvbGliL2ludGVyY2VwdG9ycy90b2tlbi9uZy1hdG9taWMtY29tbW9uLWludGVyY2VwdG9ycy10b2tlbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2luZGV4JztcbiJdfQ==
@@ -0,0 +1,33 @@
1
+ import * as i0 from '@angular/core';
2
+ import { InjectionToken, inject, Injectable } from '@angular/core';
3
+ import { from } from 'rxjs';
4
+ import { take, mergeMap } from 'rxjs/operators';
5
+
6
+ const PROVIDE_AUTHORIZATION = new InjectionToken('PROVIDE_AUTHORIZATION');
7
+ class AuthorizationInterceptor {
8
+ constructor() {
9
+ this.provide = inject(PROVIDE_AUTHORIZATION);
10
+ }
11
+ intercept(req, next) {
12
+ if (!req.url.startsWith('/api'))
13
+ return next.handle(req);
14
+ return from(this.provide())
15
+ .pipe(take(1))
16
+ .pipe(mergeMap(idToken => next.handle(idToken ? this.getRequestWithToken(req, idToken) : req)));
17
+ }
18
+ getRequestWithToken(req, token) {
19
+ return req.clone({ setHeaders: { Authorization: token } });
20
+ }
21
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AuthorizationInterceptor, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
22
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AuthorizationInterceptor }); }
23
+ }
24
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AuthorizationInterceptor, decorators: [{
25
+ type: Injectable
26
+ }] });
27
+
28
+ /**
29
+ * Generated bundle index. Do not edit.
30
+ */
31
+
32
+ export { AuthorizationInterceptor, PROVIDE_AUTHORIZATION };
33
+ //# sourceMappingURL=ng-atomic-common-interceptors-authorization.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ng-atomic-common-interceptors-authorization.mjs","sources":["../../../../../packages/@ng-atomic/common/src/lib/interceptors/authorization/authorization.interceptor.ts","../../../../../packages/@ng-atomic/common/src/lib/interceptors/authorization/ng-atomic-common-interceptors-authorization.ts"],"sourcesContent":["import { Injectable, InjectionToken, inject } from '@angular/core';\nimport { HttpRequest, HttpHandler, HttpEvent, HttpInterceptor } from '@angular/common/http';\nimport { from, Observable } from 'rxjs';\nimport { mergeMap, take } from 'rxjs/operators';\n\nexport type ProvideAuthorization = () => Promise<string | null> | Observable<string | null>;\nexport const PROVIDE_AUTHORIZATION = new InjectionToken<ProvideAuthorization>('PROVIDE_AUTHORIZATION');\n\n@Injectable()\nexport class AuthorizationInterceptor implements HttpInterceptor {\n\n private provide = inject(PROVIDE_AUTHORIZATION);\n\n intercept(req: HttpRequest<unknown>, next: HttpHandler): Observable<HttpEvent<unknown>> {\n if (!req.url.startsWith('/api')) return next.handle(req);\n\n return from(this.provide())\n .pipe(take(1))\n .pipe(mergeMap(idToken => next.handle(idToken ? this.getRequestWithToken(req, idToken) : req)));\n }\n\n private getRequestWithToken(req: HttpRequest<unknown>, token: string) {\n return req.clone({ setHeaders: {Authorization: token} });\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;MAMa,qBAAqB,GAAG,IAAI,cAAc,CAAuB,uBAAuB,EAAE;MAG1F,wBAAwB,CAAA;AADrC,IAAA,WAAA,GAAA;AAGU,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,qBAAqB,CAAC,CAAC;AAajD,KAAA;IAXC,SAAS,CAAC,GAAyB,EAAE,IAAiB,EAAA;QACpD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC;AAAE,YAAA,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AAEzD,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;AACxB,aAAA,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACb,aAAA,IAAI,CAAC,QAAQ,CAAC,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;KACnG;IAEO,mBAAmB,CAAC,GAAyB,EAAE,KAAa,EAAA;AAClE,QAAA,OAAO,GAAG,CAAC,KAAK,CAAC,EAAE,UAAU,EAAE,EAAC,aAAa,EAAE,KAAK,EAAC,EAAE,CAAC,CAAC;KAC1D;+GAdU,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;mHAAxB,wBAAwB,EAAA,CAAA,CAAA,EAAA;;4FAAxB,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBADpC,UAAU;;;ACRX;;AAEG;;;;"}
@@ -0,0 +1,70 @@
1
+ import * as i0 from '@angular/core';
2
+ import { Injectable } from '@angular/core';
3
+ import { ReplaySubject, throwError } from 'rxjs';
4
+ import { tap, catchError, finalize } from 'rxjs/operators';
5
+
6
+ class IcedCacheService {
7
+ constructor() {
8
+ this.cache = {};
9
+ }
10
+ has(key) {
11
+ return !!this.cache?.[key];
12
+ }
13
+ get(key) {
14
+ return this.cache[key];
15
+ }
16
+ set(key, value) {
17
+ this.cache[key] = value;
18
+ this.removeAfter(key, 10 * 1000);
19
+ }
20
+ removeAfter(key, ms = 1000) {
21
+ setTimeout(() => this.remove(key), ms);
22
+ }
23
+ remove(key) {
24
+ delete this.cache?.[key];
25
+ }
26
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: IcedCacheService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
27
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: IcedCacheService, providedIn: 'root' }); }
28
+ }
29
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: IcedCacheService, decorators: [{
30
+ type: Injectable,
31
+ args: [{
32
+ providedIn: 'root'
33
+ }]
34
+ }] });
35
+ class ThrottleInterceptor {
36
+ constructor(cache) {
37
+ this.cache = cache;
38
+ }
39
+ intercept(req, next) {
40
+ if (!this.test(req))
41
+ return next.handle(req);
42
+ const key = this.buildKey(req);
43
+ if (!this.cache.has(key)) {
44
+ const subject = new ReplaySubject(1);
45
+ next.handle(req).pipe(tap(event => subject.next(event)), catchError((error) => (subject.error(error), throwError(error))), finalize(() => subject.complete())).subscribe(() => { });
46
+ this.cache.set(key, subject);
47
+ }
48
+ return this.cache.get(key);
49
+ }
50
+ test(req) {
51
+ if (req.method !== 'GET')
52
+ return false;
53
+ return req.url.startsWith('/api');
54
+ }
55
+ buildKey(req) {
56
+ return `${req.url}`;
57
+ }
58
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ThrottleInterceptor, deps: [{ token: IcedCacheService }], target: i0.ɵɵFactoryTarget.Injectable }); }
59
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ThrottleInterceptor }); }
60
+ }
61
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ThrottleInterceptor, decorators: [{
62
+ type: Injectable
63
+ }], ctorParameters: function () { return [{ type: IcedCacheService }]; } });
64
+
65
+ /**
66
+ * Generated bundle index. Do not edit.
67
+ */
68
+
69
+ export { ThrottleInterceptor };
70
+ //# sourceMappingURL=ng-atomic-common-interceptors-throttle.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ng-atomic-common-interceptors-throttle.mjs","sources":["../../../../../packages/@ng-atomic/common/src/lib/interceptors/throttle/throttle.interceptor.ts","../../../../../packages/@ng-atomic/common/src/lib/interceptors/throttle/ng-atomic-common-interceptors-throttle.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { HttpRequest, HttpHandler, HttpEvent, HttpInterceptor } from '@angular/common/http';\nimport { Observable, ReplaySubject, Subject, throwError } from 'rxjs';\nimport { catchError, finalize, tap} from 'rxjs/operators';\n\n\n@Injectable({\n providedIn: 'root'\n})\nclass IcedCacheService {\n cache = {};\n\n has(key: string): boolean {\n return !!this.cache?.[key];\n }\n\n get(key: string): Subject<HttpEvent<unknown>> {\n return this.cache[key];\n }\n\n set(key: string, value: Subject<HttpEvent<unknown>>): void {\n this.cache[key] = value;\n this.removeAfter(key, 10 * 1000);\n }\n\n removeAfter(key: string, ms: number = 1000) {\n setTimeout(() => this.remove(key), ms);\n }\n\n remove(key: string) {\n delete this.cache?.[key];\n }\n}\n\n@Injectable()\nexport class ThrottleInterceptor implements HttpInterceptor {\n\n constructor(private cache: IcedCacheService) { }\n\n intercept(req: HttpRequest<unknown>, next: HttpHandler): Observable<HttpEvent<unknown>> {\n if (!this.test(req)) return next.handle(req);\n\n const key = this.buildKey(req);\n\n if (!this.cache.has(key)) {\n const subject = new ReplaySubject<HttpEvent<unknown>>(1);\n next.handle(req).pipe(\n tap(event => subject.next(event)),\n catchError((error) => (subject.error(error), throwError(error))),\n finalize(() => subject.complete()),\n ).subscribe(() => {});\n this.cache.set(key, subject);\n }\n\n return this.cache.get(key);\n }\n\n protected test(req: HttpRequest<unknown>): boolean {\n if (req.method !== 'GET') return false;\n return req.url.startsWith('/api');\n }\n\n private buildKey(req: HttpRequest<unknown>): string {\n return `${req.url}`;\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import * as i0 from '@angular/core';
2
+ import { InjectionToken, inject, Injectable } from '@angular/core';
3
+ import { from } from 'rxjs';
4
+ import { take, mergeMap } from 'rxjs/operators';
5
+
6
+ const PROVIDE_AUTHORIZATION = new InjectionToken('PROVIDE_AUTHORIZATION');
7
+ class AuthorizationInterceptor {
8
+ constructor() {
9
+ this.provide = inject(PROVIDE_AUTHORIZATION);
10
+ }
11
+ intercept(req, next) {
12
+ if (!req.url.startsWith('/api'))
13
+ return next.handle(req);
14
+ return from(this.provide())
15
+ .pipe(take(1))
16
+ .pipe(mergeMap(idToken => next.handle(idToken ? this.getRequestWithToken(req, idToken) : req)));
17
+ }
18
+ getRequestWithToken(req, token) {
19
+ return req.clone({ setHeaders: { Authorization: token } });
20
+ }
21
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AuthorizationInterceptor, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
22
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AuthorizationInterceptor }); }
23
+ }
24
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AuthorizationInterceptor, decorators: [{
25
+ type: Injectable
26
+ }] });
27
+
28
+ /**
29
+ * Generated bundle index. Do not edit.
30
+ */
31
+
32
+ export { AuthorizationInterceptor, PROVIDE_AUTHORIZATION };
33
+ //# sourceMappingURL=ng-atomic-common-interceptors-token.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ng-atomic-common-interceptors-token.mjs","sources":["../../../../../packages/@ng-atomic/common/src/lib/interceptors/token/authorization.interceptor.ts","../../../../../packages/@ng-atomic/common/src/lib/interceptors/token/ng-atomic-common-interceptors-token.ts"],"sourcesContent":["import { Injectable, InjectionToken, inject } from '@angular/core';\nimport { HttpRequest, HttpHandler, HttpEvent, HttpInterceptor } from '@angular/common/http';\nimport { from, Observable } from 'rxjs';\nimport { mergeMap, take } from 'rxjs/operators';\n\nexport type ProvideAuthorization = () => Promise<string | null> | Observable<string | null>;\nexport const PROVIDE_AUTHORIZATION = new InjectionToken<ProvideAuthorization>('PROVIDE_AUTHORIZATION');\n\n@Injectable()\nexport class AuthorizationInterceptor implements HttpInterceptor {\n\n private provide = inject(PROVIDE_AUTHORIZATION);\n\n intercept(req: HttpRequest<unknown>, next: HttpHandler): Observable<HttpEvent<unknown>> {\n if (!req.url.startsWith('/api')) return next.handle(req);\n\n return from(this.provide())\n .pipe(take(1))\n .pipe(mergeMap(idToken => next.handle(idToken ? this.getRequestWithToken(req, idToken) : req)));\n }\n\n private getRequestWithToken(req: HttpRequest<unknown>, token: string) {\n return req.clone({ setHeaders: {Authorization: token} });\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;MAMa,qBAAqB,GAAG,IAAI,cAAc,CAAuB,uBAAuB,EAAE;MAG1F,wBAAwB,CAAA;AADrC,IAAA,WAAA,GAAA;AAGU,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,qBAAqB,CAAC,CAAC;AAajD,KAAA;IAXC,SAAS,CAAC,GAAyB,EAAE,IAAiB,EAAA;QACpD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC;AAAE,YAAA,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AAEzD,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;AACxB,aAAA,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACb,aAAA,IAAI,CAAC,QAAQ,CAAC,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;KACnG;IAEO,mBAAmB,CAAC,GAAyB,EAAE,KAAa,EAAA;AAClE,QAAA,OAAO,GAAG,CAAC,KAAK,CAAC,EAAE,UAAU,EAAE,EAAC,aAAa,EAAE,KAAK,EAAC,EAAE,CAAC,CAAC;KAC1D;+GAdU,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;mHAAxB,wBAAwB,EAAA,CAAA,CAAA,EAAA;;4FAAxB,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBADpC,UAAU;;;ACRX;;AAEG;;;;"}
@@ -0,0 +1,13 @@
1
+ import { InjectionToken } from '@angular/core';
2
+ import { HttpRequest, HttpHandler, HttpEvent, HttpInterceptor } from '@angular/common/http';
3
+ import { Observable } from 'rxjs';
4
+ import * as i0 from "@angular/core";
5
+ export type ProvideAuthorization = () => Promise<string | null> | Observable<string | null>;
6
+ export declare const PROVIDE_AUTHORIZATION: InjectionToken<ProvideAuthorization>;
7
+ export declare class AuthorizationInterceptor implements HttpInterceptor {
8
+ private provide;
9
+ intercept(req: HttpRequest<unknown>, next: HttpHandler): Observable<HttpEvent<unknown>>;
10
+ private getRequestWithToken;
11
+ static ɵfac: i0.ɵɵFactoryDeclaration<AuthorizationInterceptor, never>;
12
+ static ɵprov: i0.ɵɵInjectableDeclaration<AuthorizationInterceptor>;
13
+ }
@@ -0,0 +1 @@
1
+ export * from './authorization.interceptor';
@@ -0,0 +1 @@
1
+ export * from './throttle.interceptor';
@@ -0,0 +1,23 @@
1
+ import { HttpRequest, HttpHandler, HttpEvent, HttpInterceptor } from '@angular/common/http';
2
+ import { Observable, Subject } from 'rxjs';
3
+ import * as i0 from "@angular/core";
4
+ declare class IcedCacheService {
5
+ cache: {};
6
+ has(key: string): boolean;
7
+ get(key: string): Subject<HttpEvent<unknown>>;
8
+ set(key: string, value: Subject<HttpEvent<unknown>>): void;
9
+ removeAfter(key: string, ms?: number): void;
10
+ remove(key: string): void;
11
+ static ɵfac: i0.ɵɵFactoryDeclaration<IcedCacheService, never>;
12
+ static ɵprov: i0.ɵɵInjectableDeclaration<IcedCacheService>;
13
+ }
14
+ export declare class ThrottleInterceptor implements HttpInterceptor {
15
+ private cache;
16
+ constructor(cache: IcedCacheService);
17
+ intercept(req: HttpRequest<unknown>, next: HttpHandler): Observable<HttpEvent<unknown>>;
18
+ protected test(req: HttpRequest<unknown>): boolean;
19
+ private buildKey;
20
+ static ɵfac: i0.ɵɵFactoryDeclaration<ThrottleInterceptor, never>;
21
+ static ɵprov: i0.ɵɵInjectableDeclaration<ThrottleInterceptor>;
22
+ }
23
+ export {};
@@ -0,0 +1,13 @@
1
+ import { InjectionToken } from '@angular/core';
2
+ import { HttpRequest, HttpHandler, HttpEvent, HttpInterceptor } from '@angular/common/http';
3
+ import { Observable } from 'rxjs';
4
+ import * as i0 from "@angular/core";
5
+ export type ProvideAuthorization = () => Promise<string | null> | Observable<string | null>;
6
+ export declare const PROVIDE_AUTHORIZATION: InjectionToken<ProvideAuthorization>;
7
+ export declare class AuthorizationInterceptor implements HttpInterceptor {
8
+ private provide;
9
+ intercept(req: HttpRequest<unknown>, next: HttpHandler): Observable<HttpEvent<unknown>>;
10
+ private getRequestWithToken;
11
+ static ɵfac: i0.ɵɵFactoryDeclaration<AuthorizationInterceptor, never>;
12
+ static ɵprov: i0.ɵɵInjectableDeclaration<AuthorizationInterceptor>;
13
+ }
@@ -0,0 +1 @@
1
+ export * from './authorization.interceptor';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ng-atomic/common",
3
- "version": "15.1.1",
3
+ "version": "16.1.0",
4
4
  "license": "MIT",
5
5
  "peerDependencies": {
6
6
  "@angular/cdk": "^16.0.0",
@@ -12,7 +12,7 @@
12
12
  "@angular/router": "^16.0.0",
13
13
  "@ngrx/component-store": "^16.0.0",
14
14
  "@ngrx/entity": "^16.0.0",
15
- "@nx-ddd/core": "15.1.1",
15
+ "@nx-ddd/core": "16.1.0",
16
16
  "dayjs": "1.11.10",
17
17
  "firebase": "^9.0.0",
18
18
  "flat": "^5.0.2",
@@ -55,6 +55,24 @@
55
55
  "esm": "./esm2022/directives/ios-safari-scroll-buggyfill/ng-atomic-common-directives-ios-safari-scroll-buggyfill.mjs",
56
56
  "default": "./fesm2022/ng-atomic-common-directives-ios-safari-scroll-buggyfill.mjs"
57
57
  },
58
+ "./interceptors/authorization": {
59
+ "types": "./interceptors/authorization/index.d.ts",
60
+ "esm2022": "./esm2022/interceptors/authorization/ng-atomic-common-interceptors-authorization.mjs",
61
+ "esm": "./esm2022/interceptors/authorization/ng-atomic-common-interceptors-authorization.mjs",
62
+ "default": "./fesm2022/ng-atomic-common-interceptors-authorization.mjs"
63
+ },
64
+ "./interceptors/throttle": {
65
+ "types": "./interceptors/throttle/index.d.ts",
66
+ "esm2022": "./esm2022/interceptors/throttle/ng-atomic-common-interceptors-throttle.mjs",
67
+ "esm": "./esm2022/interceptors/throttle/ng-atomic-common-interceptors-throttle.mjs",
68
+ "default": "./fesm2022/ng-atomic-common-interceptors-throttle.mjs"
69
+ },
70
+ "./interceptors/token": {
71
+ "types": "./interceptors/token/index.d.ts",
72
+ "esm2022": "./esm2022/interceptors/token/ng-atomic-common-interceptors-token.mjs",
73
+ "esm": "./esm2022/interceptors/token/ng-atomic-common-interceptors-token.mjs",
74
+ "default": "./fesm2022/ng-atomic-common-interceptors-token.mjs"
75
+ },
58
76
  "./pipes/actions": {
59
77
  "types": "./pipes/actions/index.d.ts",
60
78
  "esm2022": "./esm2022/pipes/actions/ng-atomic-common-pipes-actions.mjs",