@solar-angular/http 18.3.1 → 19.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/fesm2022/solar-angular-http.mjs +3 -3
- package/fesm2022/solar-angular-http.mjs.map +1 -1
- package/package.json +3 -5
- package/esm2022/api.interceptor.mjs +0 -35
- package/esm2022/auto-host.interceptor.mjs +0 -20
- package/esm2022/caching/cache-manager.mjs +0 -76
- package/esm2022/caching/caching.interceptor.mjs +0 -50
- package/esm2022/caching/index.mjs +0 -3
- package/esm2022/common.interceptor.mjs +0 -23
- package/esm2022/http-context-tokens.mjs +0 -6
- package/esm2022/index.mjs +0 -6
- package/esm2022/solar-angular-http.mjs +0 -5
|
@@ -118,10 +118,10 @@ class CacheManager {
|
|
|
118
118
|
revokeAll() {
|
|
119
119
|
this.map.clear();
|
|
120
120
|
}
|
|
121
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
122
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
121
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: CacheManager, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
122
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: CacheManager, providedIn: 'root' }); }
|
|
123
123
|
}
|
|
124
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
124
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: CacheManager, decorators: [{
|
|
125
125
|
type: Injectable,
|
|
126
126
|
args: [{
|
|
127
127
|
providedIn: 'root'
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"solar-angular-http.mjs","sources":["../../../packages/http/src/api.interceptor.ts","../../../packages/http/src/auto-host.interceptor.ts","../../../packages/http/src/caching/cache-manager.ts","../../../packages/http/src/caching/caching.interceptor.ts","../../../packages/http/src/common.interceptor.ts","../../../packages/http/src/http-context-tokens.ts","../../../packages/http/src/solar-angular-http.ts"],"sourcesContent":["import { HttpContextToken, HttpEvent, HttpHandlerFn, HttpInterceptorFn, HttpRequest, HttpResponse } from '@angular/common/http';\nimport { inject, Injector, runInInjectionContext } from '@angular/core';\nimport { Result } from '@solar-kit/planets/sun';\nimport { Observable, tap } from 'rxjs';\n\n/** 是否为经过API拦截器,默认为 true */\nexport const API_TOKEN = new HttpContextToken(() => true);\n/** 是否捕获 `Result#code < 0` 的情况,默认为 true */\nexport const CATCH_RESULT_ERROR_TOKEN = new HttpContextToken(() => true);\n\n/**\n * 负责通用 API 请求的拦截\n * - 添加 `Api` 请求头\n * - 捕获响应异常并提示\n * - 使用 {@link API_TOKEN} 跳过该拦截器\n * - 使用 {@link CATCH_RESULT_ERROR_TOKEN} 跳过 `Result#code < 0` 捕获\n */\nexport function useApiInterceptor(onError: (result: Result | null) => void): HttpInterceptorFn {\n return (request: HttpRequest<unknown>, next: HttpHandlerFn): Observable<HttpEvent<unknown>> => {\n const injector = inject(Injector);\n\n if (!request.context.get(API_TOKEN)) {\n return next(request);\n }\n\n request = request.clone({\n headers: request.headers.set('Api', 'v1'),\n withCredentials: true\n });\n\n return next(request).pipe(\n tap((event) => {\n if (event instanceof HttpResponse && request.context.get(CATCH_RESULT_ERROR_TOKEN)) {\n const { body } = event as HttpResponse<Result>;\n if (!body || body.code < 0) {\n runInInjectionContext(injector, () => onError(body))\n }\n }\n })\n );\n };\n}\n","import { HttpContextToken, HttpInterceptorFn } from '@angular/common/http';\n\nexport const AUTO_HOST_TOEKN = new HttpContextToken(() => true);\n\n/**\n * 自动为 / 开头的 URL 添加 host\n * 可以使用 {@link AUTO_HOST_TOEKN} 来跳过该拦截器\n * @param host\n * @returns\n */\nexport function useAutoHostInterceptor(host: string): HttpInterceptorFn {\n return (request, next) => {\n if (\n request.context.get(AUTO_HOST_TOEKN) &&\n request.url.startsWith('/')\n ) {\n return next(request.clone({\n url: host + request.url\n }));\n }\n return next(request);\n };\n}\n","import { HttpContextToken, HttpRequest, HttpResponse } from '@angular/common/http';\nimport { Injectable } from '@angular/core';\n\ninterface CacheEntry {\n url: string;\n response: HttpResponse<unknown>;\n expire: number;\n}\n\n/**\n * 缓存令牌,值可以为:\n * - 布尔值,为 true 时,表示在一次会话中缓存永不过期,默认值为 false\n * - 缓存时间,单位毫秒\n */\nexport const CACHEABLE_TOKEN = new HttpContextToken<boolean | number>(() => false);\n\n@Injectable({\n providedIn: 'root'\n})\nexport class CacheManager {\n private map: Map<string, CacheEntry> = new Map<string, CacheEntry>();\n\n /**\n * 获取缓存\n * @param request\n */\n get(request: HttpRequest<unknown>): HttpResponse<unknown> | null {\n // 判断当前请求是否已被缓存,若未缓存则返回null\n const entry = this.map.get(request.urlWithParams);\n\n if (!entry) { return null; }\n // 若缓存命中,则判断缓存是否过期,若已过期则返回null。否则返回请求对应的响应对象\n return Date.now() > entry.expire ? null : entry.response;\n }\n\n /**\n * 缓存\n * @param request\n * @param response\n */\n put(request: HttpRequest<unknown>, response: HttpResponse<unknown>): void {\n const token = request.context.get(CACHEABLE_TOKEN) as true | number;\n const entry: CacheEntry = {\n url: request.urlWithParams,\n response: response,\n expire: Date.now() + (token === true ? Infinity : token)\n };\n // 以请求url作为键,CacheEntry对象为值,保存到cacheMap中\n this.map.set(entry.url, entry);\n }\n\n clear() {\n for (const [key, entry] of this.map) {\n if (Date.now() > entry.expire) {\n this.map.delete(key);\n }\n }\n }\n\n /**\n * 通过标记(字符串、正则)模糊查询以撤销缓存\n * @param mark\n */\n revoke(mark: string | RegExp) {\n for (const key of this.map.keys()) {\n if (mark instanceof RegExp ? mark.test(key) : key.includes(mark)) {\n this.map.delete(key);\n break;\n }\n }\n }\n\n /**\n * 清除所有缓存\n */\n revokeAll() {\n this.map.clear();\n }\n\n}\n","import { HttpEvent, HttpHandlerFn, HttpInterceptorFn, HttpRequest, HttpResponse } from '@angular/common/http';\nimport { inject } from '@angular/core';\nimport { Observable, finalize, of, share } from 'rxjs';\nimport { tap } from 'rxjs/operators';\nimport { CACHEABLE_TOKEN, CacheManager } from './cache-manager';\n\n/**\n * 缓存拦截器\n * 应该尽可能的提前设置该拦截器,以确保 HTTP 缓存拦截器的顺序能排在拦截器链表的靠前位置\n * @returns\n */\nexport function useCachingInterceptor(): HttpInterceptorFn {\n const requestingMap = new Map<string, Observable<HttpEvent<unknown>>>();\n\n return (request: HttpRequest<unknown>, next: HttpHandlerFn): Observable<HttpEvent<unknown>> => {\n const cacheManager = inject(CacheManager);\n\n // 判断当前请求是否可缓存\n if (!isCachable(request)) {\n return next(request);\n }\n\n // 缓存命中则直接返回\n const response = cacheManager.get(request);\n if (response) {\n return of(response);\n }\n\n // 如果可缓存的请求已经有正在请求的,就不重复发了\n const requesting = requestingMap.get(request.urlWithParams);\n if (requesting) {\n return requesting;\n }\n\n // 发送请求,成功后缓存\n const cacheRequest = next(request).pipe(\n tap(event => {\n cacheManager.clear();\n if (event instanceof HttpResponse) {\n cacheManager.put(request, event);\n }\n }),\n finalize(() =>\n requestingMap.delete(request.urlWithParams)\n ),\n share()\n );\n // 存入请求中\n requestingMap.set(request.urlWithParams, cacheRequest);\n\n return cacheRequest;\n };\n}\n\n/**\n * 判断请求是否可缓存\n * 一般只有 GET 请求才需要缓存\n * @param request\n */\nfunction isCachable(request: HttpRequest<unknown>): boolean {\n const value = request.context.get(CACHEABLE_TOKEN);\n return value === true || typeof value === 'number';\n}\n","import { HttpContextToken, HttpErrorResponse, HttpEvent, HttpHandlerFn, HttpInterceptorFn, HttpRequest, HttpStatusCode } from '@angular/common/http';\nimport { inject, Injector, runInInjectionContext } from '@angular/core';\nimport { catchError, Observable } from 'rxjs';\n\n/** 是否捕获 HTTP 请求错误(!2XX),默认为 true */\nexport const CATCH_HTTP_ERROR_TOKEN = new HttpContextToken(() => true);\n\n/**\n * 一个公共拦截器\n * - 捕获非 200 的 HTTP 请求错误并提示(除了 401)\n * - 使用 {@link CATCH_HTTP_ERROR_TOKEN} 跳过该拦截器\n * @returns\n */\nexport function useCommonInterceptor(onError: (error: HttpErrorResponse) => void): HttpInterceptorFn {\n return (request: HttpRequest<unknown>, next: HttpHandlerFn): Observable<HttpEvent<unknown>> => {\n const injector = inject(Injector);\n\n return next(request).pipe(\n catchError((error: HttpErrorResponse) => {\n if (request.context.get(CATCH_HTTP_ERROR_TOKEN) && error.status !== HttpStatusCode.Unauthorized) {\n runInInjectionContext(injector, () => onError(error));\n }\n\n throw error;\n })\n );\n };\n}\n","import { HttpContextToken } from '@angular/common/http';\n\n/** 是否启用请求认证,默认为 true */\nexport const AUTH_TOKEN = new HttpContextToken(() => true);\n/** 是否启用请求认证失败则重定向到登录页 */\nexport const AUTH_REDIRECT_TOKEN = new HttpContextToken(() => true);\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["tap"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"solar-angular-http.mjs","sources":["../../../packages/http/src/api.interceptor.ts","../../../packages/http/src/auto-host.interceptor.ts","../../../packages/http/src/caching/cache-manager.ts","../../../packages/http/src/caching/caching.interceptor.ts","../../../packages/http/src/common.interceptor.ts","../../../packages/http/src/http-context-tokens.ts","../../../packages/http/src/solar-angular-http.ts"],"sourcesContent":["import { HttpContextToken, HttpEvent, HttpHandlerFn, HttpInterceptorFn, HttpRequest, HttpResponse } from '@angular/common/http';\nimport { inject, Injector, runInInjectionContext } from '@angular/core';\nimport { Result } from '@solar-kit/planets/sun';\nimport { Observable, tap } from 'rxjs';\n\n/** 是否为经过API拦截器,默认为 true */\nexport const API_TOKEN = new HttpContextToken(() => true);\n/** 是否捕获 `Result#code < 0` 的情况,默认为 true */\nexport const CATCH_RESULT_ERROR_TOKEN = new HttpContextToken(() => true);\n\n/**\n * 负责通用 API 请求的拦截\n * - 添加 `Api` 请求头\n * - 捕获响应异常并提示\n * - 使用 {@link API_TOKEN} 跳过该拦截器\n * - 使用 {@link CATCH_RESULT_ERROR_TOKEN} 跳过 `Result#code < 0` 捕获\n */\nexport function useApiInterceptor(onError: (result: Result | null) => void): HttpInterceptorFn {\n return (request: HttpRequest<unknown>, next: HttpHandlerFn): Observable<HttpEvent<unknown>> => {\n const injector = inject(Injector);\n\n if (!request.context.get(API_TOKEN)) {\n return next(request);\n }\n\n request = request.clone({\n headers: request.headers.set('Api', 'v1'),\n withCredentials: true\n });\n\n return next(request).pipe(\n tap((event) => {\n if (event instanceof HttpResponse && request.context.get(CATCH_RESULT_ERROR_TOKEN)) {\n const { body } = event as HttpResponse<Result>;\n if (!body || body.code < 0) {\n runInInjectionContext(injector, () => onError(body))\n }\n }\n })\n );\n };\n}\n","import { HttpContextToken, HttpInterceptorFn } from '@angular/common/http';\n\nexport const AUTO_HOST_TOEKN = new HttpContextToken(() => true);\n\n/**\n * 自动为 / 开头的 URL 添加 host\n * 可以使用 {@link AUTO_HOST_TOEKN} 来跳过该拦截器\n * @param host\n * @returns\n */\nexport function useAutoHostInterceptor(host: string): HttpInterceptorFn {\n return (request, next) => {\n if (\n request.context.get(AUTO_HOST_TOEKN) &&\n request.url.startsWith('/')\n ) {\n return next(request.clone({\n url: host + request.url\n }));\n }\n return next(request);\n };\n}\n","import { HttpContextToken, HttpRequest, HttpResponse } from '@angular/common/http';\nimport { Injectable } from '@angular/core';\n\ninterface CacheEntry {\n url: string;\n response: HttpResponse<unknown>;\n expire: number;\n}\n\n/**\n * 缓存令牌,值可以为:\n * - 布尔值,为 true 时,表示在一次会话中缓存永不过期,默认值为 false\n * - 缓存时间,单位毫秒\n */\nexport const CACHEABLE_TOKEN = new HttpContextToken<boolean | number>(() => false);\n\n@Injectable({\n providedIn: 'root'\n})\nexport class CacheManager {\n private map: Map<string, CacheEntry> = new Map<string, CacheEntry>();\n\n /**\n * 获取缓存\n * @param request\n */\n get(request: HttpRequest<unknown>): HttpResponse<unknown> | null {\n // 判断当前请求是否已被缓存,若未缓存则返回null\n const entry = this.map.get(request.urlWithParams);\n\n if (!entry) { return null; }\n // 若缓存命中,则判断缓存是否过期,若已过期则返回null。否则返回请求对应的响应对象\n return Date.now() > entry.expire ? null : entry.response;\n }\n\n /**\n * 缓存\n * @param request\n * @param response\n */\n put(request: HttpRequest<unknown>, response: HttpResponse<unknown>): void {\n const token = request.context.get(CACHEABLE_TOKEN) as true | number;\n const entry: CacheEntry = {\n url: request.urlWithParams,\n response: response,\n expire: Date.now() + (token === true ? Infinity : token)\n };\n // 以请求url作为键,CacheEntry对象为值,保存到cacheMap中\n this.map.set(entry.url, entry);\n }\n\n clear() {\n for (const [key, entry] of this.map) {\n if (Date.now() > entry.expire) {\n this.map.delete(key);\n }\n }\n }\n\n /**\n * 通过标记(字符串、正则)模糊查询以撤销缓存\n * @param mark\n */\n revoke(mark: string | RegExp) {\n for (const key of this.map.keys()) {\n if (mark instanceof RegExp ? mark.test(key) : key.includes(mark)) {\n this.map.delete(key);\n break;\n }\n }\n }\n\n /**\n * 清除所有缓存\n */\n revokeAll() {\n this.map.clear();\n }\n\n}\n","import { HttpEvent, HttpHandlerFn, HttpInterceptorFn, HttpRequest, HttpResponse } from '@angular/common/http';\nimport { inject } from '@angular/core';\nimport { Observable, finalize, of, share } from 'rxjs';\nimport { tap } from 'rxjs/operators';\nimport { CACHEABLE_TOKEN, CacheManager } from './cache-manager';\n\n/**\n * 缓存拦截器\n * 应该尽可能的提前设置该拦截器,以确保 HTTP 缓存拦截器的顺序能排在拦截器链表的靠前位置\n * @returns\n */\nexport function useCachingInterceptor(): HttpInterceptorFn {\n const requestingMap = new Map<string, Observable<HttpEvent<unknown>>>();\n\n return (request: HttpRequest<unknown>, next: HttpHandlerFn): Observable<HttpEvent<unknown>> => {\n const cacheManager = inject(CacheManager);\n\n // 判断当前请求是否可缓存\n if (!isCachable(request)) {\n return next(request);\n }\n\n // 缓存命中则直接返回\n const response = cacheManager.get(request);\n if (response) {\n return of(response);\n }\n\n // 如果可缓存的请求已经有正在请求的,就不重复发了\n const requesting = requestingMap.get(request.urlWithParams);\n if (requesting) {\n return requesting;\n }\n\n // 发送请求,成功后缓存\n const cacheRequest = next(request).pipe(\n tap(event => {\n cacheManager.clear();\n if (event instanceof HttpResponse) {\n cacheManager.put(request, event);\n }\n }),\n finalize(() =>\n requestingMap.delete(request.urlWithParams)\n ),\n share()\n );\n // 存入请求中\n requestingMap.set(request.urlWithParams, cacheRequest);\n\n return cacheRequest;\n };\n}\n\n/**\n * 判断请求是否可缓存\n * 一般只有 GET 请求才需要缓存\n * @param request\n */\nfunction isCachable(request: HttpRequest<unknown>): boolean {\n const value = request.context.get(CACHEABLE_TOKEN);\n return value === true || typeof value === 'number';\n}\n","import { HttpContextToken, HttpErrorResponse, HttpEvent, HttpHandlerFn, HttpInterceptorFn, HttpRequest, HttpStatusCode } from '@angular/common/http';\nimport { inject, Injector, runInInjectionContext } from '@angular/core';\nimport { catchError, Observable } from 'rxjs';\n\n/** 是否捕获 HTTP 请求错误(!2XX),默认为 true */\nexport const CATCH_HTTP_ERROR_TOKEN = new HttpContextToken(() => true);\n\n/**\n * 一个公共拦截器\n * - 捕获非 200 的 HTTP 请求错误并提示(除了 401)\n * - 使用 {@link CATCH_HTTP_ERROR_TOKEN} 跳过该拦截器\n * @returns\n */\nexport function useCommonInterceptor(onError: (error: HttpErrorResponse) => void): HttpInterceptorFn {\n return (request: HttpRequest<unknown>, next: HttpHandlerFn): Observable<HttpEvent<unknown>> => {\n const injector = inject(Injector);\n\n return next(request).pipe(\n catchError((error: HttpErrorResponse) => {\n if (request.context.get(CATCH_HTTP_ERROR_TOKEN) && error.status !== HttpStatusCode.Unauthorized) {\n runInInjectionContext(injector, () => onError(error));\n }\n\n throw error;\n })\n );\n };\n}\n","import { HttpContextToken } from '@angular/common/http';\n\n/** 是否启用请求认证,默认为 true */\nexport const AUTH_TOKEN = new HttpContextToken(() => true);\n/** 是否启用请求认证失败则重定向到登录页 */\nexport const AUTH_REDIRECT_TOKEN = new HttpContextToken(() => true);\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["tap"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@solar-angular/http",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "19.0.1",
|
|
4
4
|
"sideEffects": false,
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
7
7
|
},
|
|
8
8
|
"peerDependencies": {
|
|
9
|
-
"@angular/common": "^
|
|
10
|
-
"@angular/core": "^
|
|
9
|
+
"@angular/common": "^19.0.0",
|
|
10
|
+
"@angular/core": "^19.0.0"
|
|
11
11
|
},
|
|
12
12
|
"module": "fesm2022/solar-angular-http.mjs",
|
|
13
13
|
"typings": "index.d.ts",
|
|
@@ -17,8 +17,6 @@
|
|
|
17
17
|
},
|
|
18
18
|
".": {
|
|
19
19
|
"types": "./index.d.ts",
|
|
20
|
-
"esm2022": "./esm2022/solar-angular-http.mjs",
|
|
21
|
-
"esm": "./esm2022/solar-angular-http.mjs",
|
|
22
20
|
"default": "./fesm2022/solar-angular-http.mjs"
|
|
23
21
|
}
|
|
24
22
|
},
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import { HttpContextToken, HttpResponse } from '@angular/common/http';
|
|
2
|
-
import { inject, Injector, runInInjectionContext } from '@angular/core';
|
|
3
|
-
import { tap } from 'rxjs';
|
|
4
|
-
/** 是否为经过API拦截器,默认为 true */
|
|
5
|
-
export const API_TOKEN = new HttpContextToken(() => true);
|
|
6
|
-
/** 是否捕获 `Result#code < 0` 的情况,默认为 true */
|
|
7
|
-
export const CATCH_RESULT_ERROR_TOKEN = new HttpContextToken(() => true);
|
|
8
|
-
/**
|
|
9
|
-
* 负责通用 API 请求的拦截
|
|
10
|
-
* - 添加 `Api` 请求头
|
|
11
|
-
* - 捕获响应异常并提示
|
|
12
|
-
* - 使用 {@link API_TOKEN} 跳过该拦截器
|
|
13
|
-
* - 使用 {@link CATCH_RESULT_ERROR_TOKEN} 跳过 `Result#code < 0` 捕获
|
|
14
|
-
*/
|
|
15
|
-
export function useApiInterceptor(onError) {
|
|
16
|
-
return (request, next) => {
|
|
17
|
-
const injector = inject(Injector);
|
|
18
|
-
if (!request.context.get(API_TOKEN)) {
|
|
19
|
-
return next(request);
|
|
20
|
-
}
|
|
21
|
-
request = request.clone({
|
|
22
|
-
headers: request.headers.set('Api', 'v1'),
|
|
23
|
-
withCredentials: true
|
|
24
|
-
});
|
|
25
|
-
return next(request).pipe(tap((event) => {
|
|
26
|
-
if (event instanceof HttpResponse && request.context.get(CATCH_RESULT_ERROR_TOKEN)) {
|
|
27
|
-
const { body } = event;
|
|
28
|
-
if (!body || body.code < 0) {
|
|
29
|
-
runInInjectionContext(injector, () => onError(body));
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
}));
|
|
33
|
-
};
|
|
34
|
-
}
|
|
35
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLmludGVyY2VwdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcGFja2FnZXMvaHR0cC9zcmMvYXBpLmludGVyY2VwdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxnQkFBZ0IsRUFBNEQsWUFBWSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDaEksT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFeEUsT0FBTyxFQUFjLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUV2QywyQkFBMkI7QUFDM0IsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLElBQUksZ0JBQWdCLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDMUQsMENBQTBDO0FBQzFDLE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFHLElBQUksZ0JBQWdCLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7QUFFekU7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLGlCQUFpQixDQUFDLE9BQXdDO0lBQ3hFLE9BQU8sQ0FBQyxPQUE2QixFQUFFLElBQW1CLEVBQWtDLEVBQUU7UUFDNUYsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRWxDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQ3BDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3ZCLENBQUM7UUFFRCxPQUFPLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztZQUN0QixPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQztZQUN6QyxlQUFlLEVBQUUsSUFBSTtTQUN0QixDQUFDLENBQUM7UUFFSCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQ3ZCLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ1osSUFBSSxLQUFLLFlBQVksWUFBWSxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLHdCQUF3QixDQUFDLEVBQUUsQ0FBQztnQkFDbkYsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLEtBQTZCLENBQUM7Z0JBQy9DLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDM0IscUJBQXFCLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO2dCQUN0RCxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cENvbnRleHRUb2tlbiwgSHR0cEV2ZW50LCBIdHRwSGFuZGxlckZuLCBIdHRwSW50ZXJjZXB0b3JGbiwgSHR0cFJlcXVlc3QsIEh0dHBSZXNwb25zZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IGluamVjdCwgSW5qZWN0b3IsIHJ1bkluSW5qZWN0aW9uQ29udGV4dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUmVzdWx0IH0gZnJvbSAnQHNvbGFyLWtpdC9wbGFuZXRzL3N1bic7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCB0YXAgfSBmcm9tICdyeGpzJztcblxuLyoqIOaYr+WQpuS4uue7j+i/h0FQSeaLpuaIquWZqO+8jOm7mOiupOS4uiB0cnVlICovXG5leHBvcnQgY29uc3QgQVBJX1RPS0VOID0gbmV3IEh0dHBDb250ZXh0VG9rZW4oKCkgPT4gdHJ1ZSk7XG4vKiog5piv5ZCm5o2V6I63IGBSZXN1bHQjY29kZSA8IDBgIOeahOaDheWGte+8jOm7mOiupOS4uiB0cnVlICovXG5leHBvcnQgY29uc3QgQ0FUQ0hfUkVTVUxUX0VSUk9SX1RPS0VOID0gbmV3IEh0dHBDb250ZXh0VG9rZW4oKCkgPT4gdHJ1ZSk7XG5cbi8qKlxuICog6LSf6LSj6YCa55SoIEFQSSDor7fmsYLnmoTmi6bmiKpcbiAqIC0g5re75YqgIGBBcGlgIOivt+axguWktFxuICogLSDmjZXojrflk43lupTlvILluLjlubbmj5DnpLpcbiAqIC0g5L2/55SoIHtAbGluayBBUElfVE9LRU59IOi3s+i/h+ivpeaLpuaIquWZqFxuICogLSDkvb/nlKgge0BsaW5rIENBVENIX1JFU1VMVF9FUlJPUl9UT0tFTn0g6Lez6L+HIGBSZXN1bHQjY29kZSA8IDBgIOaNleiOt1xuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlQXBpSW50ZXJjZXB0b3Iob25FcnJvcjogKHJlc3VsdDogUmVzdWx0IHwgbnVsbCkgPT4gdm9pZCk6IEh0dHBJbnRlcmNlcHRvckZuIHtcbiAgcmV0dXJuIChyZXF1ZXN0OiBIdHRwUmVxdWVzdDx1bmtub3duPiwgbmV4dDogSHR0cEhhbmRsZXJGbik6IE9ic2VydmFibGU8SHR0cEV2ZW50PHVua25vd24+PiA9PiB7XG4gICAgY29uc3QgaW5qZWN0b3IgPSBpbmplY3QoSW5qZWN0b3IpO1xuXG4gICAgaWYgKCFyZXF1ZXN0LmNvbnRleHQuZ2V0KEFQSV9UT0tFTikpIHtcbiAgICAgIHJldHVybiBuZXh0KHJlcXVlc3QpO1xuICAgIH1cblxuICAgIHJlcXVlc3QgPSByZXF1ZXN0LmNsb25lKHtcbiAgICAgIGhlYWRlcnM6IHJlcXVlc3QuaGVhZGVycy5zZXQoJ0FwaScsICd2MScpLFxuICAgICAgd2l0aENyZWRlbnRpYWxzOiB0cnVlXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbmV4dChyZXF1ZXN0KS5waXBlKFxuICAgICAgdGFwKChldmVudCkgPT4ge1xuICAgICAgICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgJiYgcmVxdWVzdC5jb250ZXh0LmdldChDQVRDSF9SRVNVTFRfRVJST1JfVE9LRU4pKSB7XG4gICAgICAgICAgY29uc3QgeyBib2R5IH0gPSBldmVudCBhcyBIdHRwUmVzcG9uc2U8UmVzdWx0PjtcbiAgICAgICAgICBpZiAoIWJvZHkgfHwgYm9keS5jb2RlIDwgMCkge1xuICAgICAgICAgICAgcnVuSW5JbmplY3Rpb25Db250ZXh0KGluamVjdG9yLCAoKSA9PiBvbkVycm9yKGJvZHkpKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICB9O1xufVxuIl19
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import { HttpContextToken } from '@angular/common/http';
|
|
2
|
-
export const AUTO_HOST_TOEKN = new HttpContextToken(() => true);
|
|
3
|
-
/**
|
|
4
|
-
* 自动为 / 开头的 URL 添加 host
|
|
5
|
-
* 可以使用 {@link AUTO_HOST_TOEKN} 来跳过该拦截器
|
|
6
|
-
* @param host
|
|
7
|
-
* @returns
|
|
8
|
-
*/
|
|
9
|
-
export function useAutoHostInterceptor(host) {
|
|
10
|
-
return (request, next) => {
|
|
11
|
-
if (request.context.get(AUTO_HOST_TOEKN) &&
|
|
12
|
-
request.url.startsWith('/')) {
|
|
13
|
-
return next(request.clone({
|
|
14
|
-
url: host + request.url
|
|
15
|
-
}));
|
|
16
|
-
}
|
|
17
|
-
return next(request);
|
|
18
|
-
};
|
|
19
|
-
}
|
|
20
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0by1ob3N0LmludGVyY2VwdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcGFja2FnZXMvaHR0cC9zcmMvYXV0by1ob3N0LmludGVyY2VwdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxnQkFBZ0IsRUFBcUIsTUFBTSxzQkFBc0IsQ0FBQztBQUUzRSxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsSUFBSSxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUVoRTs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxzQkFBc0IsQ0FBQyxJQUFZO0lBQ2pELE9BQU8sQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLEVBQUU7UUFDdkIsSUFDRSxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUM7WUFDcEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQzNCLENBQUM7WUFDRCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO2dCQUN4QixHQUFHLEVBQUUsSUFBSSxHQUFHLE9BQU8sQ0FBQyxHQUFHO2FBQ3hCLENBQUMsQ0FBQyxDQUFDO1FBQ04sQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3ZCLENBQUMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ29udGV4dFRva2VuLCBIdHRwSW50ZXJjZXB0b3JGbiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcblxuZXhwb3J0IGNvbnN0IEFVVE9fSE9TVF9UT0VLTiA9IG5ldyBIdHRwQ29udGV4dFRva2VuKCgpID0+IHRydWUpO1xuXG4vKipcbiAqIOiHquWKqOS4uiAvIOW8gOWktOeahCBVUkwg5re75YqgIGhvc3RcbiAqIOWPr+S7peS9v+eUqCB7QGxpbmsgQVVUT19IT1NUX1RPRUtOfSDmnaXot7Pov4for6Xmi6bmiKrlmahcbiAqIEBwYXJhbSBob3N0XG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlQXV0b0hvc3RJbnRlcmNlcHRvcihob3N0OiBzdHJpbmcpOiBIdHRwSW50ZXJjZXB0b3JGbiB7XG4gIHJldHVybiAocmVxdWVzdCwgbmV4dCkgPT4ge1xuICAgIGlmIChcbiAgICAgIHJlcXVlc3QuY29udGV4dC5nZXQoQVVUT19IT1NUX1RPRUtOKSAmJlxuICAgICAgcmVxdWVzdC51cmwuc3RhcnRzV2l0aCgnLycpXG4gICAgKSB7XG4gICAgICByZXR1cm4gbmV4dChyZXF1ZXN0LmNsb25lKHtcbiAgICAgICAgdXJsOiBob3N0ICsgcmVxdWVzdC51cmxcbiAgICAgIH0pKTtcbiAgICB9XG4gICAgcmV0dXJuIG5leHQocmVxdWVzdCk7XG4gIH07XG59XG4iXX0=
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
import { HttpContextToken } from '@angular/common/http';
|
|
2
|
-
import { Injectable } from '@angular/core';
|
|
3
|
-
import * as i0 from "@angular/core";
|
|
4
|
-
/**
|
|
5
|
-
* 缓存令牌,值可以为:
|
|
6
|
-
* - 布尔值,为 true 时,表示在一次会话中缓存永不过期,默认值为 false
|
|
7
|
-
* - 缓存时间,单位毫秒
|
|
8
|
-
*/
|
|
9
|
-
export const CACHEABLE_TOKEN = new HttpContextToken(() => false);
|
|
10
|
-
export class CacheManager {
|
|
11
|
-
constructor() {
|
|
12
|
-
this.map = new Map();
|
|
13
|
-
}
|
|
14
|
-
/**
|
|
15
|
-
* 获取缓存
|
|
16
|
-
* @param request
|
|
17
|
-
*/
|
|
18
|
-
get(request) {
|
|
19
|
-
// 判断当前请求是否已被缓存,若未缓存则返回null
|
|
20
|
-
const entry = this.map.get(request.urlWithParams);
|
|
21
|
-
if (!entry) {
|
|
22
|
-
return null;
|
|
23
|
-
}
|
|
24
|
-
// 若缓存命中,则判断缓存是否过期,若已过期则返回null。否则返回请求对应的响应对象
|
|
25
|
-
return Date.now() > entry.expire ? null : entry.response;
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* 缓存
|
|
29
|
-
* @param request
|
|
30
|
-
* @param response
|
|
31
|
-
*/
|
|
32
|
-
put(request, response) {
|
|
33
|
-
const token = request.context.get(CACHEABLE_TOKEN);
|
|
34
|
-
const entry = {
|
|
35
|
-
url: request.urlWithParams,
|
|
36
|
-
response: response,
|
|
37
|
-
expire: Date.now() + (token === true ? Infinity : token)
|
|
38
|
-
};
|
|
39
|
-
// 以请求url作为键,CacheEntry对象为值,保存到cacheMap中
|
|
40
|
-
this.map.set(entry.url, entry);
|
|
41
|
-
}
|
|
42
|
-
clear() {
|
|
43
|
-
for (const [key, entry] of this.map) {
|
|
44
|
-
if (Date.now() > entry.expire) {
|
|
45
|
-
this.map.delete(key);
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
/**
|
|
50
|
-
* 通过标记(字符串、正则)模糊查询以撤销缓存
|
|
51
|
-
* @param mark
|
|
52
|
-
*/
|
|
53
|
-
revoke(mark) {
|
|
54
|
-
for (const key of this.map.keys()) {
|
|
55
|
-
if (mark instanceof RegExp ? mark.test(key) : key.includes(mark)) {
|
|
56
|
-
this.map.delete(key);
|
|
57
|
-
break;
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
/**
|
|
62
|
-
* 清除所有缓存
|
|
63
|
-
*/
|
|
64
|
-
revokeAll() {
|
|
65
|
-
this.map.clear();
|
|
66
|
-
}
|
|
67
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CacheManager, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
68
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CacheManager, providedIn: 'root' }); }
|
|
69
|
-
}
|
|
70
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CacheManager, decorators: [{
|
|
71
|
-
type: Injectable,
|
|
72
|
-
args: [{
|
|
73
|
-
providedIn: 'root'
|
|
74
|
-
}]
|
|
75
|
-
}] });
|
|
76
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FjaGUtbWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL2h0dHAvc3JjL2NhY2hpbmcvY2FjaGUtbWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZ0JBQWdCLEVBQTZCLE1BQU0sc0JBQXNCLENBQUM7QUFDbkYsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFRM0M7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxJQUFJLGdCQUFnQixDQUFtQixHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUtuRixNQUFNLE9BQU8sWUFBWTtJQUh6QjtRQUlVLFFBQUcsR0FBNEIsSUFBSSxHQUFHLEVBQXNCLENBQUM7S0EyRHRFO0lBekRDOzs7T0FHRztJQUNILEdBQUcsQ0FBQyxPQUE2QjtRQUMvQiwyQkFBMkI7UUFDM0IsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBRWxELElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUFDLE9BQU8sSUFBSSxDQUFDO1FBQUMsQ0FBQztRQUM1Qiw0Q0FBNEM7UUFDNUMsT0FBTyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDO0lBQzNELENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsR0FBRyxDQUFDLE9BQTZCLEVBQUUsUUFBK0I7UUFDaEUsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFrQixDQUFDO1FBQ3BFLE1BQU0sS0FBSyxHQUFlO1lBQ3hCLEdBQUcsRUFBRSxPQUFPLENBQUMsYUFBYTtZQUMxQixRQUFRLEVBQUUsUUFBUTtZQUNsQixNQUFNLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7U0FDekQsQ0FBQztRQUNGLHdDQUF3QztRQUN4QyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRCxLQUFLO1FBQ0gsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNwQyxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQzlCLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZCLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNILE1BQU0sQ0FBQyxJQUFxQjtRQUMxQixLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUNsQyxJQUFJLElBQUksWUFBWSxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDakUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3JCLE1BQU07WUFDUixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNILFNBQVM7UUFDUCxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ25CLENBQUM7K0dBMURVLFlBQVk7bUhBQVosWUFBWSxjQUZYLE1BQU07OzRGQUVQLFlBQVk7a0JBSHhCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cENvbnRleHRUb2tlbiwgSHR0cFJlcXVlc3QsIEh0dHBSZXNwb25zZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW50ZXJmYWNlIENhY2hlRW50cnkge1xuICB1cmw6IHN0cmluZztcbiAgcmVzcG9uc2U6IEh0dHBSZXNwb25zZTx1bmtub3duPjtcbiAgZXhwaXJlOiBudW1iZXI7XG59XG5cbi8qKlxuICog57yT5a2Y5Luk54mMLOWAvOWPr+S7peS4ujpcbiAqIC0g5biD5bCU5YC877yM5Li6IHRydWUg5pe277yM6KGo56S65Zyo5LiA5qyh5Lya6K+d5Lit57yT5a2Y5rC45LiN6L+H5pyf77yM6buY6K6k5YC85Li6IGZhbHNlXG4gKiAtIOe8k+WtmOaXtumXtO+8jOWNleS9jeavq+enklxuICovXG5leHBvcnQgY29uc3QgQ0FDSEVBQkxFX1RPS0VOID0gbmV3IEh0dHBDb250ZXh0VG9rZW48Ym9vbGVhbiB8IG51bWJlcj4oKCkgPT4gZmFsc2UpO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBDYWNoZU1hbmFnZXIge1xuICBwcml2YXRlIG1hcDogTWFwPHN0cmluZywgQ2FjaGVFbnRyeT4gPSBuZXcgTWFwPHN0cmluZywgQ2FjaGVFbnRyeT4oKTtcblxuICAvKipcbiAgICog6I635Y+W57yT5a2YXG4gICAqIEBwYXJhbSByZXF1ZXN0XG4gICAqL1xuICBnZXQocmVxdWVzdDogSHR0cFJlcXVlc3Q8dW5rbm93bj4pOiBIdHRwUmVzcG9uc2U8dW5rbm93bj4gfCBudWxsIHtcbiAgICAvLyDliKTmlq3lvZPliY3or7fmsYLmmK/lkKblt7LooqvnvJPlrZjvvIzoi6XmnKrnvJPlrZjliJnov5Tlm55udWxsXG4gICAgY29uc3QgZW50cnkgPSB0aGlzLm1hcC5nZXQocmVxdWVzdC51cmxXaXRoUGFyYW1zKTtcblxuICAgIGlmICghZW50cnkpIHsgcmV0dXJuIG51bGw7IH1cbiAgICAvLyDoi6XnvJPlrZjlkb3kuK3vvIzliJnliKTmlq3nvJPlrZjmmK/lkKbov4fmnJ/vvIzoi6Xlt7Lov4fmnJ/liJnov5Tlm55udWxs44CC5ZCm5YiZ6L+U5Zue6K+35rGC5a+55bqU55qE5ZON5bqU5a+56LGhXG4gICAgcmV0dXJuIERhdGUubm93KCkgPiBlbnRyeS5leHBpcmUgPyBudWxsIDogZW50cnkucmVzcG9uc2U7XG4gIH1cblxuICAvKipcbiAgICog57yT5a2YXG4gICAqIEBwYXJhbSByZXF1ZXN0XG4gICAqIEBwYXJhbSByZXNwb25zZVxuICAgKi9cbiAgcHV0KHJlcXVlc3Q6IEh0dHBSZXF1ZXN0PHVua25vd24+LCByZXNwb25zZTogSHR0cFJlc3BvbnNlPHVua25vd24+KTogdm9pZCB7XG4gICAgY29uc3QgdG9rZW4gPSByZXF1ZXN0LmNvbnRleHQuZ2V0KENBQ0hFQUJMRV9UT0tFTikgYXMgdHJ1ZSB8IG51bWJlcjtcbiAgICBjb25zdCBlbnRyeTogQ2FjaGVFbnRyeSA9IHtcbiAgICAgIHVybDogcmVxdWVzdC51cmxXaXRoUGFyYW1zLFxuICAgICAgcmVzcG9uc2U6IHJlc3BvbnNlLFxuICAgICAgZXhwaXJlOiBEYXRlLm5vdygpICsgKHRva2VuID09PSB0cnVlID8gSW5maW5pdHkgOiB0b2tlbilcbiAgICB9O1xuICAgIC8vIOS7peivt+axgnVybOS9nOS4uumUru+8jENhY2hlRW50cnnlr7nosaHkuLrlgLzvvIzkv53lrZjliLBjYWNoZU1hcOS4rVxuICAgIHRoaXMubWFwLnNldChlbnRyeS51cmwsIGVudHJ5KTtcbiAgfVxuXG4gIGNsZWFyKCkge1xuICAgIGZvciAoY29uc3QgW2tleSwgZW50cnldIG9mIHRoaXMubWFwKSB7XG4gICAgICBpZiAoRGF0ZS5ub3coKSA+IGVudHJ5LmV4cGlyZSkge1xuICAgICAgICB0aGlzLm1hcC5kZWxldGUoa2V5KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog6YCa6L+H5qCH6K6w77yI5a2X56ym5Liy44CB5q2j5YiZ77yJ5qih57OK5p+l6K+i5Lul5pKk6ZSA57yT5a2YXG4gICAqIEBwYXJhbSBtYXJrXG4gICAqL1xuICByZXZva2UobWFyazogc3RyaW5nIHwgUmVnRXhwKSB7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgdGhpcy5tYXAua2V5cygpKSB7XG4gICAgICBpZiAobWFyayBpbnN0YW5jZW9mIFJlZ0V4cCA/IG1hcmsudGVzdChrZXkpIDoga2V5LmluY2x1ZGVzKG1hcmspKSB7XG4gICAgICAgIHRoaXMubWFwLmRlbGV0ZShrZXkpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5riF6Zmk5omA5pyJ57yT5a2YXG4gICAqL1xuICByZXZva2VBbGwoKSB7XG4gICAgdGhpcy5tYXAuY2xlYXIoKTtcbiAgfVxuXG59XG4iXX0=
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
import { HttpResponse } from '@angular/common/http';
|
|
2
|
-
import { inject } from '@angular/core';
|
|
3
|
-
import { finalize, of, share } from 'rxjs';
|
|
4
|
-
import { tap } from 'rxjs/operators';
|
|
5
|
-
import { CACHEABLE_TOKEN, CacheManager } from './cache-manager';
|
|
6
|
-
/**
|
|
7
|
-
* 缓存拦截器
|
|
8
|
-
* 应该尽可能的提前设置该拦截器,以确保 HTTP 缓存拦截器的顺序能排在拦截器链表的靠前位置
|
|
9
|
-
* @returns
|
|
10
|
-
*/
|
|
11
|
-
export function useCachingInterceptor() {
|
|
12
|
-
const requestingMap = new Map();
|
|
13
|
-
return (request, next) => {
|
|
14
|
-
const cacheManager = inject(CacheManager);
|
|
15
|
-
// 判断当前请求是否可缓存
|
|
16
|
-
if (!isCachable(request)) {
|
|
17
|
-
return next(request);
|
|
18
|
-
}
|
|
19
|
-
// 缓存命中则直接返回
|
|
20
|
-
const response = cacheManager.get(request);
|
|
21
|
-
if (response) {
|
|
22
|
-
return of(response);
|
|
23
|
-
}
|
|
24
|
-
// 如果可缓存的请求已经有正在请求的,就不重复发了
|
|
25
|
-
const requesting = requestingMap.get(request.urlWithParams);
|
|
26
|
-
if (requesting) {
|
|
27
|
-
return requesting;
|
|
28
|
-
}
|
|
29
|
-
// 发送请求,成功后缓存
|
|
30
|
-
const cacheRequest = next(request).pipe(tap(event => {
|
|
31
|
-
cacheManager.clear();
|
|
32
|
-
if (event instanceof HttpResponse) {
|
|
33
|
-
cacheManager.put(request, event);
|
|
34
|
-
}
|
|
35
|
-
}), finalize(() => requestingMap.delete(request.urlWithParams)), share());
|
|
36
|
-
// 存入请求中
|
|
37
|
-
requestingMap.set(request.urlWithParams, cacheRequest);
|
|
38
|
-
return cacheRequest;
|
|
39
|
-
};
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* 判断请求是否可缓存
|
|
43
|
-
* 一般只有 GET 请求才需要缓存
|
|
44
|
-
* @param request
|
|
45
|
-
*/
|
|
46
|
-
function isCachable(request) {
|
|
47
|
-
const value = request.context.get(CACHEABLE_TOKEN);
|
|
48
|
-
return value === true || typeof value === 'number';
|
|
49
|
-
}
|
|
50
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FjaGluZy5pbnRlcmNlcHRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL2h0dHAvc3JjL2NhY2hpbmcvY2FjaGluZy5pbnRlcmNlcHRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQTRELFlBQVksRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzlHLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkMsT0FBTyxFQUFjLFFBQVEsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3ZELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyQyxPQUFPLEVBQUUsZUFBZSxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRWhFOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUscUJBQXFCO0lBQ25DLE1BQU0sYUFBYSxHQUFHLElBQUksR0FBRyxFQUEwQyxDQUFDO0lBRXhFLE9BQU8sQ0FBQyxPQUE2QixFQUFFLElBQW1CLEVBQWtDLEVBQUU7UUFDNUYsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRTFDLGNBQWM7UUFDZCxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDekIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdkIsQ0FBQztRQUVELFlBQVk7UUFDWixNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzNDLElBQUksUUFBUSxFQUFFLENBQUM7WUFDYixPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN0QixDQUFDO1FBRUQsMEJBQTBCO1FBQzFCLE1BQU0sVUFBVSxHQUFHLGFBQWEsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzVELElBQUksVUFBVSxFQUFFLENBQUM7WUFDZixPQUFPLFVBQVUsQ0FBQztRQUNwQixDQUFDO1FBRUQsYUFBYTtRQUNiLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQ3JDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNWLFlBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNyQixJQUFJLEtBQUssWUFBWSxZQUFZLEVBQUUsQ0FBQztnQkFDbEMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDbkMsQ0FBQztRQUNILENBQUMsQ0FBQyxFQUNGLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FDWixhQUFhLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FDNUMsRUFDRCxLQUFLLEVBQUUsQ0FDUixDQUFDO1FBQ0YsUUFBUTtRQUNSLGFBQWEsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUV2RCxPQUFPLFlBQVksQ0FBQztJQUN0QixDQUFDLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsVUFBVSxDQUFDLE9BQTZCO0lBQy9DLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQ25ELE9BQU8sS0FBSyxLQUFLLElBQUksSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLENBQUM7QUFDckQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBFdmVudCwgSHR0cEhhbmRsZXJGbiwgSHR0cEludGVyY2VwdG9yRm4sIEh0dHBSZXF1ZXN0LCBIdHRwUmVzcG9uc2UgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIGZpbmFsaXplLCBvZiwgc2hhcmUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IENBQ0hFQUJMRV9UT0tFTiwgQ2FjaGVNYW5hZ2VyIH0gZnJvbSAnLi9jYWNoZS1tYW5hZ2VyJztcblxuLyoqXG4gKiDnvJPlrZjmi6bmiKrlmahcbiAqIOW6lOivpeWwveWPr+iDveeahOaPkOWJjeiuvue9ruivpeaLpuaIquWZqO+8jOS7peehruS/nSBIVFRQIOe8k+WtmOaLpuaIquWZqOeahOmhuuW6j+iDveaOkuWcqOaLpuaIquWZqOmTvuihqOeahOmdoOWJjeS9jee9rlxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUNhY2hpbmdJbnRlcmNlcHRvcigpOiBIdHRwSW50ZXJjZXB0b3JGbiB7XG4gIGNvbnN0IHJlcXVlc3RpbmdNYXAgPSBuZXcgTWFwPHN0cmluZywgT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8dW5rbm93bj4+PigpO1xuXG4gIHJldHVybiAocmVxdWVzdDogSHR0cFJlcXVlc3Q8dW5rbm93bj4sIG5leHQ6IEh0dHBIYW5kbGVyRm4pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDx1bmtub3duPj4gPT4ge1xuICAgIGNvbnN0IGNhY2hlTWFuYWdlciA9IGluamVjdChDYWNoZU1hbmFnZXIpO1xuXG4gICAgLy8g5Yik5pat5b2T5YmN6K+35rGC5piv5ZCm5Y+v57yT5a2YXG4gICAgaWYgKCFpc0NhY2hhYmxlKHJlcXVlc3QpKSB7XG4gICAgICByZXR1cm4gbmV4dChyZXF1ZXN0KTtcbiAgICB9XG5cbiAgICAvLyDnvJPlrZjlkb3kuK3liJnnm7TmjqXov5Tlm55cbiAgICBjb25zdCByZXNwb25zZSA9IGNhY2hlTWFuYWdlci5nZXQocmVxdWVzdCk7XG4gICAgaWYgKHJlc3BvbnNlKSB7XG4gICAgICByZXR1cm4gb2YocmVzcG9uc2UpO1xuICAgIH1cblxuICAgIC8vIOWmguaenOWPr+e8k+WtmOeahOivt+axguW3sue7j+acieato+WcqOivt+axgueahO+8jOWwseS4jemHjeWkjeWPkeS6hlxuICAgIGNvbnN0IHJlcXVlc3RpbmcgPSByZXF1ZXN0aW5nTWFwLmdldChyZXF1ZXN0LnVybFdpdGhQYXJhbXMpO1xuICAgIGlmIChyZXF1ZXN0aW5nKSB7XG4gICAgICByZXR1cm4gcmVxdWVzdGluZztcbiAgICB9XG5cbiAgICAvLyDlj5HpgIHor7fmsYLvvIzmiJDlip/lkI7nvJPlrZhcbiAgICBjb25zdCBjYWNoZVJlcXVlc3QgPSBuZXh0KHJlcXVlc3QpLnBpcGUoXG4gICAgICB0YXAoZXZlbnQgPT4ge1xuICAgICAgICBjYWNoZU1hbmFnZXIuY2xlYXIoKTtcbiAgICAgICAgaWYgKGV2ZW50IGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlKSB7XG4gICAgICAgICAgY2FjaGVNYW5hZ2VyLnB1dChyZXF1ZXN0LCBldmVudCk7XG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgICAgZmluYWxpemUoKCkgPT5cbiAgICAgICAgcmVxdWVzdGluZ01hcC5kZWxldGUocmVxdWVzdC51cmxXaXRoUGFyYW1zKVxuICAgICAgKSxcbiAgICAgIHNoYXJlKClcbiAgICApO1xuICAgIC8vIOWtmOWFpeivt+axguS4rVxuICAgIHJlcXVlc3RpbmdNYXAuc2V0KHJlcXVlc3QudXJsV2l0aFBhcmFtcywgY2FjaGVSZXF1ZXN0KTtcblxuICAgIHJldHVybiBjYWNoZVJlcXVlc3Q7XG4gIH07XG59XG5cbi8qKlxuICog5Yik5pat6K+35rGC5piv5ZCm5Y+v57yT5a2YXG4gKiDkuIDoiKzlj6rmnIkgR0VUIOivt+axguaJjemcgOimgee8k+WtmFxuICogQHBhcmFtIHJlcXVlc3RcbiAqL1xuZnVuY3Rpb24gaXNDYWNoYWJsZShyZXF1ZXN0OiBIdHRwUmVxdWVzdDx1bmtub3duPik6IGJvb2xlYW4ge1xuICBjb25zdCB2YWx1ZSA9IHJlcXVlc3QuY29udGV4dC5nZXQoQ0FDSEVBQkxFX1RPS0VOKTtcbiAgcmV0dXJuIHZhbHVlID09PSB0cnVlIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcic7XG59XG4iXX0=
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
export * from './cache-manager';
|
|
2
|
-
export * from './caching.interceptor';
|
|
3
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9odHRwL3NyYy9jYWNoaW5nL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsaUJBQWlCLENBQUM7QUFDaEMsY0FBYyx1QkFBdUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vY2FjaGUtbWFuYWdlcic7XG5leHBvcnQgKiBmcm9tICcuL2NhY2hpbmcuaW50ZXJjZXB0b3InO1xuIl19
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import { HttpContextToken, HttpStatusCode } from '@angular/common/http';
|
|
2
|
-
import { inject, Injector, runInInjectionContext } from '@angular/core';
|
|
3
|
-
import { catchError } from 'rxjs';
|
|
4
|
-
/** 是否捕获 HTTP 请求错误(!2XX),默认为 true */
|
|
5
|
-
export const CATCH_HTTP_ERROR_TOKEN = new HttpContextToken(() => true);
|
|
6
|
-
/**
|
|
7
|
-
* 一个公共拦截器
|
|
8
|
-
* - 捕获非 200 的 HTTP 请求错误并提示(除了 401)
|
|
9
|
-
* - 使用 {@link CATCH_HTTP_ERROR_TOKEN} 跳过该拦截器
|
|
10
|
-
* @returns
|
|
11
|
-
*/
|
|
12
|
-
export function useCommonInterceptor(onError) {
|
|
13
|
-
return (request, next) => {
|
|
14
|
-
const injector = inject(Injector);
|
|
15
|
-
return next(request).pipe(catchError((error) => {
|
|
16
|
-
if (request.context.get(CATCH_HTTP_ERROR_TOKEN) && error.status !== HttpStatusCode.Unauthorized) {
|
|
17
|
-
runInInjectionContext(injector, () => onError(error));
|
|
18
|
-
}
|
|
19
|
-
throw error;
|
|
20
|
-
}));
|
|
21
|
-
};
|
|
22
|
-
}
|
|
23
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLmludGVyY2VwdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcGFja2FnZXMvaHR0cC9zcmMvY29tbW9uLmludGVyY2VwdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxnQkFBZ0IsRUFBK0UsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDckosT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDeEUsT0FBTyxFQUFFLFVBQVUsRUFBYyxNQUFNLE1BQU0sQ0FBQztBQUU5QyxvQ0FBb0M7QUFDcEMsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUcsSUFBSSxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUV2RTs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FBQyxPQUEyQztJQUM5RSxPQUFPLENBQUMsT0FBNkIsRUFBRSxJQUFtQixFQUFrQyxFQUFFO1FBQzVGLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUVsQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQ3ZCLFVBQVUsQ0FBQyxDQUFDLEtBQXdCLEVBQUUsRUFBRTtZQUN0QyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLHNCQUFzQixDQUFDLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxjQUFjLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQ2hHLHFCQUFxQixDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUN4RCxDQUFDO1lBRUQsTUFBTSxLQUFLLENBQUM7UUFDZCxDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBDb250ZXh0VG9rZW4sIEh0dHBFcnJvclJlc3BvbnNlLCBIdHRwRXZlbnQsIEh0dHBIYW5kbGVyRm4sIEh0dHBJbnRlcmNlcHRvckZuLCBIdHRwUmVxdWVzdCwgSHR0cFN0YXR1c0NvZGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBpbmplY3QsIEluamVjdG9yLCBydW5JbkluamVjdGlvbkNvbnRleHQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGNhdGNoRXJyb3IsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcblxuLyoqIOaYr+WQpuaNleiOtyBIVFRQIOivt+axgumUmeivr++8iCEyWFjvvInvvIzpu5jorqTkuLogdHJ1ZSAqL1xuZXhwb3J0IGNvbnN0IENBVENIX0hUVFBfRVJST1JfVE9LRU4gPSBuZXcgSHR0cENvbnRleHRUb2tlbigoKSA9PiB0cnVlKTtcblxuLyoqXG4gKiDkuIDkuKrlhazlhbHmi6bmiKrlmahcbiAqIC0g5o2V6I636Z2eIDIwMCDnmoQgSFRUUCDor7fmsYLplJnor6/lubbmj5DnpLrvvIjpmaTkuoYgNDAx77yJXG4gKiAtIOS9v+eUqCB7QGxpbmsgQ0FUQ0hfSFRUUF9FUlJPUl9UT0tFTn0g6Lez6L+H6K+l5oum5oiq5ZmoXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlQ29tbW9uSW50ZXJjZXB0b3Iob25FcnJvcjogKGVycm9yOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4gdm9pZCk6IEh0dHBJbnRlcmNlcHRvckZuIHtcbiAgcmV0dXJuIChyZXF1ZXN0OiBIdHRwUmVxdWVzdDx1bmtub3duPiwgbmV4dDogSHR0cEhhbmRsZXJGbik6IE9ic2VydmFibGU8SHR0cEV2ZW50PHVua25vd24+PiA9PiB7XG4gICAgY29uc3QgaW5qZWN0b3IgPSBpbmplY3QoSW5qZWN0b3IpO1xuXG4gICAgcmV0dXJuIG5leHQocmVxdWVzdCkucGlwZShcbiAgICAgIGNhdGNoRXJyb3IoKGVycm9yOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4ge1xuICAgICAgICBpZiAocmVxdWVzdC5jb250ZXh0LmdldChDQVRDSF9IVFRQX0VSUk9SX1RPS0VOKSAmJiBlcnJvci5zdGF0dXMgIT09IEh0dHBTdGF0dXNDb2RlLlVuYXV0aG9yaXplZCkge1xuICAgICAgICAgIHJ1bkluSW5qZWN0aW9uQ29udGV4dChpbmplY3RvciwgKCkgPT4gb25FcnJvcihlcnJvcikpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9KVxuICAgICk7XG4gIH07XG59XG4iXX0=
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import { HttpContextToken } from '@angular/common/http';
|
|
2
|
-
/** 是否启用请求认证,默认为 true */
|
|
3
|
-
export const AUTH_TOKEN = new HttpContextToken(() => true);
|
|
4
|
-
/** 是否启用请求认证失败则重定向到登录页 */
|
|
5
|
-
export const AUTH_REDIRECT_TOKEN = new HttpContextToken(() => true);
|
|
6
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC1jb250ZXh0LXRva2Vucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3BhY2thZ2VzL2h0dHAvc3JjL2h0dHAtY29udGV4dC10b2tlbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFeEQsd0JBQXdCO0FBQ3hCLE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRyxJQUFJLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzNELHlCQUF5QjtBQUN6QixNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cENvbnRleHRUb2tlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcblxuLyoqIOaYr+WQpuWQr+eUqOivt+axguiupOivge+8jOm7mOiupOS4uiB0cnVlICovXG5leHBvcnQgY29uc3QgQVVUSF9UT0tFTiA9IG5ldyBIdHRwQ29udGV4dFRva2VuKCgpID0+IHRydWUpO1xuLyoqIOaYr+WQpuWQr+eUqOivt+axguiupOivgeWksei0peWImemHjeWumuWQkeWIsOeZu+W9lemhtSAqL1xuZXhwb3J0IGNvbnN0IEFVVEhfUkVESVJFQ1RfVE9LRU4gPSBuZXcgSHR0cENvbnRleHRUb2tlbigoKSA9PiB0cnVlKTtcbiJdfQ==
|
package/esm2022/index.mjs
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
export * from './api.interceptor';
|
|
2
|
-
export * from './auto-host.interceptor';
|
|
3
|
-
export * from './caching';
|
|
4
|
-
export * from './common.interceptor';
|
|
5
|
-
export * from './http-context-tokens';
|
|
6
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wYWNrYWdlcy9odHRwL3NyYy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLG1CQUFtQixDQUFDO0FBQ2xDLGNBQWMseUJBQXlCLENBQUM7QUFDeEMsY0FBYyxXQUFXLENBQUM7QUFDMUIsY0FBYyxzQkFBc0IsQ0FBQztBQUNyQyxjQUFjLHVCQUF1QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9hcGkuaW50ZXJjZXB0b3InO1xuZXhwb3J0ICogZnJvbSAnLi9hdXRvLWhvc3QuaW50ZXJjZXB0b3InO1xuZXhwb3J0ICogZnJvbSAnLi9jYWNoaW5nJztcbmV4cG9ydCAqIGZyb20gJy4vY29tbW9uLmludGVyY2VwdG9yJztcbmV4cG9ydCAqIGZyb20gJy4vaHR0cC1jb250ZXh0LXRva2Vucyc7XG4iXX0=
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Generated bundle index. Do not edit.
|
|
3
|
-
*/
|
|
4
|
-
export * from './index';
|
|
5
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29sYXItYW5ndWxhci1odHRwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcGFja2FnZXMvaHR0cC9zcmMvc29sYXItYW5ndWxhci1odHRwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxTQUFTLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdlbmVyYXRlZCBidW5kbGUgaW5kZXguIERvIG5vdCBlZGl0LlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vaW5kZXgnO1xuIl19
|