mirror of
https://github.com/angular/angular.git
synced 2026-09-14 13:54:52 +08:00
d452b388bd
At present, the get() method provided by HttpContext will never return null. Sometimes we need to check whether an http token is included, so add the has() method to HttpContext. PR Close #43887
111 lines
2.9 KiB
TypeScript
111 lines
2.9 KiB
TypeScript
/**
|
|
* @license
|
|
* Copyright Google LLC All Rights Reserved.
|
|
*
|
|
* Use of this source code is governed by an MIT-style license that can be
|
|
* found in the LICENSE file at https://angular.io/license
|
|
*/
|
|
|
|
/**
|
|
* A token used to manipulate and access values stored in `HttpContext`.
|
|
*
|
|
* @publicApi
|
|
*/
|
|
export class HttpContextToken<T> {
|
|
constructor(public readonly defaultValue: () => T) {}
|
|
}
|
|
|
|
/**
|
|
* Http context stores arbitrary user defined values and ensures type safety without
|
|
* actually knowing the types. It is backed by a `Map` and guarantees that keys do not clash.
|
|
*
|
|
* This context is mutable and is shared between cloned requests unless explicitly specified.
|
|
*
|
|
* @usageNotes
|
|
*
|
|
* ### Usage Example
|
|
*
|
|
* ```typescript
|
|
* // inside cache.interceptors.ts
|
|
* export const IS_CACHE_ENABLED = new HttpContextToken<boolean>(() => false);
|
|
*
|
|
* export class CacheInterceptor implements HttpInterceptor {
|
|
*
|
|
* intercept(req: HttpRequest<any>, delegate: HttpHandler): Observable<HttpEvent<any>> {
|
|
* if (req.context.get(IS_CACHE_ENABLED) === true) {
|
|
* return ...;
|
|
* }
|
|
* return delegate.handle(req);
|
|
* }
|
|
* }
|
|
*
|
|
* // inside a service
|
|
*
|
|
* this.httpClient.get('/api/weather', {
|
|
* context: new HttpContext().set(IS_CACHE_ENABLED, true)
|
|
* }).subscribe(...);
|
|
* ```
|
|
*
|
|
* @publicApi
|
|
*/
|
|
export class HttpContext {
|
|
private readonly map = new Map<HttpContextToken<unknown>, unknown>();
|
|
|
|
/**
|
|
* Store a value in the context. If a value is already present it will be overwritten.
|
|
*
|
|
* @param token The reference to an instance of `HttpContextToken`.
|
|
* @param value The value to store.
|
|
*
|
|
* @returns A reference to itself for easy chaining.
|
|
*/
|
|
set<T>(token: HttpContextToken<T>, value: T): HttpContext {
|
|
this.map.set(token, value);
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Retrieve the value associated with the given token.
|
|
*
|
|
* @param token The reference to an instance of `HttpContextToken`.
|
|
*
|
|
* @returns The stored value or default if one is defined.
|
|
*/
|
|
get<T>(token: HttpContextToken<T>): T {
|
|
if (!this.map.has(token)) {
|
|
this.map.set(token, token.defaultValue());
|
|
}
|
|
return this.map.get(token) as T;
|
|
}
|
|
|
|
/**
|
|
* Delete the value associated with the given token.
|
|
*
|
|
* @param token The reference to an instance of `HttpContextToken`.
|
|
*
|
|
* @returns A reference to itself for easy chaining.
|
|
*/
|
|
delete(token: HttpContextToken<unknown>): HttpContext {
|
|
this.map.delete(token);
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Checks for existence of a given token.
|
|
*
|
|
* @param token The reference to an instance of `HttpContextToken`.
|
|
*
|
|
* @returns True if the token exists, false otherwise.
|
|
*/
|
|
has(token: HttpContextToken<unknown>): boolean {
|
|
return this.map.has(token);
|
|
}
|
|
|
|
/**
|
|
* @returns a list of tokens currently stored in the context.
|
|
*/
|
|
keys(): IterableIterator<HttpContextToken<unknown>> {
|
|
return this.map.keys();
|
|
}
|
|
}
|