UNPKG

@angular/common

Version:

Angular - commonly needed directives and services

1 lines 44.4 kB
{"version":3,"file":"http.mjs","sources":["../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/packages/common/http/src/resource.ts","../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/packages/common/http/src/transfer_cache.ts"],"sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {\n Injector,\n Signal,\n ɵResourceImpl as ResourceImpl,\n inject,\n linkedSignal,\n assertInInjectionContext,\n signal,\n computed,\n ResourceStreamItem,\n type ValueEqualityFn,\n ɵRuntimeError,\n ɵRuntimeErrorCode,\n ɵencapsulateResourceError as encapsulateResourceError,\n} from '@angular/core';\nimport type {Subscription} from 'rxjs';\n\nimport {HttpRequest} from './request';\nimport {HttpClient} from './client';\nimport {HttpErrorResponse, HttpEventType, HttpProgressEvent, HttpResponseBase} from './response';\nimport {HttpHeaders} from './headers';\nimport {HttpParams} from './params';\nimport {HttpResourceRef, HttpResourceOptions, HttpResourceRequest} from './resource_api';\n\n/**\n * Type for the `httpRequest` top-level function, which includes the call signatures for the JSON-\n * based `httpRequest` as well as sub-functions for `ArrayBuffer`, `Blob`, and `string` type\n * requests.\n *\n * @experimental 19.2\n */\nexport interface HttpResourceFn {\n /**\n * Create a `Resource` that fetches data with an HTTP GET request to the given URL.\n *\n * The resource will update when the URL changes via signals.\n *\n * Uses `HttpClient` to make requests and supports interceptors, testing, and the other features\n * of the `HttpClient` API. Data is parsed as JSON by default - use a sub-function of\n * `httpResource`, such as `httpResource.text()`, to parse the response differently.\n *\n * @experimental 19.2\n */\n <TResult = unknown>(\n url: () => string | undefined,\n options: HttpResourceOptions<TResult, unknown> & {defaultValue: NoInfer<TResult>},\n ): HttpResourceRef<TResult>;\n\n /**\n * Create a `Resource` that fetches data with an HTTP GET request to the given URL.\n *\n * The resource will update when the URL changes via signals.\n *\n * Uses `HttpClient` to make requests and supports interceptors, testing, and the other features\n * of the `HttpClient` API. Data is parsed as JSON by default - use a sub-function of\n * `httpResource`, such as `httpResource.text()`, to parse the response differently.\n *\n * @experimental 19.2\n */\n <TResult = unknown>(\n url: () => string | undefined,\n options?: HttpResourceOptions<TResult, unknown>,\n ): HttpResourceRef<TResult | undefined>;\n\n /**\n * Create a `Resource` that fetches data with the configured HTTP request.\n *\n * The resource will update when the request changes via signals.\n *\n * Uses `HttpClient` to make requests and supports interceptors, testing, and the other features\n * of the `HttpClient` API. Data is parsed as JSON by default - use a sub-function of\n * `httpResource`, such as `httpResource.text()`, to parse the response differently.\n *\n * @experimental 19.2\n */\n <TResult = unknown>(\n request: () => HttpResourceRequest | undefined,\n options: HttpResourceOptions<TResult, unknown> & {defaultValue: NoInfer<TResult>},\n ): HttpResourceRef<TResult>;\n\n /**\n * Create a `Resource` that fetches data with the configured HTTP request.\n *\n * The resource will update when the request changes via signals.\n *\n * Uses `HttpClient` to make requests and supports interceptors, testing, and the other features\n * of the `HttpClient` API. Data is parsed as JSON by default - use a sub-function of\n * `httpResource`, such as `httpResource.text()`, to parse the response differently.\n *\n * @experimental 19.2\n */\n <TResult = unknown>(\n request: () => HttpResourceRequest | undefined,\n options?: HttpResourceOptions<TResult, unknown>,\n ): HttpResourceRef<TResult | undefined>;\n\n /**\n * Create a `Resource` that fetches data with the configured HTTP request.\n *\n * The resource will update when the URL or request changes via signals.\n *\n * Uses `HttpClient` to make requests and supports interceptors, testing, and the other features\n * of the `HttpClient` API. Data is parsed into an `ArrayBuffer`.\n *\n * @experimental 19.2\n */\n arrayBuffer: {\n <TResult = ArrayBuffer>(\n url: () => string | undefined,\n options: HttpResourceOptions<TResult, ArrayBuffer> & {defaultValue: NoInfer<TResult>},\n ): HttpResourceRef<TResult>;\n\n <TResult = ArrayBuffer>(\n url: () => string | undefined,\n options?: HttpResourceOptions<TResult, ArrayBuffer>,\n ): HttpResourceRef<TResult | undefined>;\n\n <TResult = ArrayBuffer>(\n request: () => HttpResourceRequest | undefined,\n options: HttpResourceOptions<TResult, ArrayBuffer> & {defaultValue: NoInfer<TResult>},\n ): HttpResourceRef<TResult>;\n\n <TResult = ArrayBuffer>(\n request: () => HttpResourceRequest | undefined,\n options?: HttpResourceOptions<TResult, ArrayBuffer>,\n ): HttpResourceRef<TResult | undefined>;\n };\n\n /**\n * Create a `Resource` that fetches data with the configured HTTP request.\n *\n * The resource will update when the URL or request changes via signals.\n *\n * Uses `HttpClient` to make requests and supports interceptors, testing, and the other features\n * of the `HttpClient` API. Data is parsed into a `Blob`.\n *\n * @experimental 19.2\n */\n blob: {\n <TResult = Blob>(\n url: () => string | undefined,\n options: HttpResourceOptions<TResult, Blob> & {defaultValue: NoInfer<TResult>},\n ): HttpResourceRef<TResult>;\n\n <TResult = Blob>(\n url: () => string | undefined,\n options?: HttpResourceOptions<TResult, Blob>,\n ): HttpResourceRef<TResult | undefined>;\n\n <TResult = Blob>(\n request: () => HttpResourceRequest | undefined,\n options: HttpResourceOptions<TResult, Blob> & {defaultValue: NoInfer<TResult>},\n ): HttpResourceRef<TResult>;\n\n <TResult = Blob>(\n request: () => HttpResourceRequest | undefined,\n options?: HttpResourceOptions<TResult, Blob>,\n ): HttpResourceRef<TResult | undefined>;\n };\n\n /**\n * Create a `Resource` that fetches data with the configured HTTP request.\n *\n * The resource will update when the URL or request changes via signals.\n *\n * Uses `HttpClient` to make requests and supports interceptors, testing, and the other features\n * of the `HttpClient` API. Data is parsed as a `string`.\n *\n * @experimental 19.2\n */\n text: {\n <TResult = string>(\n url: () => string | undefined,\n options: HttpResourceOptions<TResult, string> & {defaultValue: NoInfer<TResult>},\n ): HttpResourceRef<TResult>;\n\n <TResult = string>(\n url: () => string | undefined,\n options?: HttpResourceOptions<TResult, string>,\n ): HttpResourceRef<TResult | undefined>;\n\n <TResult = string>(\n request: () => HttpResourceRequest | undefined,\n options: HttpResourceOptions<TResult, string> & {defaultValue: NoInfer<TResult>},\n ): HttpResourceRef<TResult>;\n\n <TResult = string>(\n request: () => HttpResourceRequest | undefined,\n options?: HttpResourceOptions<TResult, string>,\n ): HttpResourceRef<TResult | undefined>;\n };\n}\n\n/**\n * `httpResource` makes a reactive HTTP request and exposes the request status and response value as\n * a `WritableResource`. By default, it assumes that the backend will return JSON data. To make a\n * request that expects a different kind of data, you can use a sub-constructor of `httpResource`,\n * such as `httpResource.text`.\n *\n * @experimental 19.2\n * @initializerApiFunction\n */\nexport const httpResource: HttpResourceFn = (() => {\n const jsonFn = makeHttpResourceFn<unknown>('json') as HttpResourceFn;\n jsonFn.arrayBuffer = makeHttpResourceFn<ArrayBuffer>('arraybuffer');\n jsonFn.blob = makeHttpResourceFn('blob');\n jsonFn.text = makeHttpResourceFn('text');\n return jsonFn;\n})();\n\n/**\n * The expected response type of the server.\n *\n * This is used to parse the response appropriately before returning it to\n * the requestee.\n */\ntype ResponseType = 'arraybuffer' | 'blob' | 'json' | 'text';\ntype RawRequestType = (() => string | undefined) | (() => HttpResourceRequest | undefined);\n\nfunction makeHttpResourceFn<TRaw>(responseType: ResponseType) {\n return function httpResource<TResult = TRaw>(\n request: RawRequestType,\n options?: HttpResourceOptions<TResult, TRaw>,\n ): HttpResourceRef<TResult> {\n if (ngDevMode && !options?.injector) {\n assertInInjectionContext(httpResource);\n }\n const injector = options?.injector ?? inject(Injector);\n return new HttpResourceImpl(\n injector,\n () => normalizeRequest(request, responseType),\n options?.defaultValue,\n options?.debugName,\n options?.parse as (value: unknown) => TResult,\n options?.equal as ValueEqualityFn<unknown>,\n ) as HttpResourceRef<TResult>;\n };\n}\n\nfunction normalizeRequest(\n request: RawRequestType,\n responseType: ResponseType,\n): HttpRequest<unknown> | undefined {\n let unwrappedRequest = typeof request === 'function' ? request() : request;\n if (unwrappedRequest === undefined) {\n return undefined;\n } else if (typeof unwrappedRequest === 'string') {\n unwrappedRequest = {url: unwrappedRequest};\n }\n\n const headers =\n unwrappedRequest.headers instanceof HttpHeaders\n ? unwrappedRequest.headers\n : new HttpHeaders(\n unwrappedRequest.headers as\n | Record<string, string | number | Array<string | number>>\n | undefined,\n );\n\n const params =\n unwrappedRequest.params instanceof HttpParams\n ? unwrappedRequest.params\n : new HttpParams({fromObject: unwrappedRequest.params});\n\n return new HttpRequest(\n unwrappedRequest.method ?? 'GET',\n unwrappedRequest.url,\n unwrappedRequest.body ?? null,\n {\n headers,\n params,\n reportProgress: unwrappedRequest.reportProgress,\n withCredentials: unwrappedRequest.withCredentials,\n keepalive: unwrappedRequest.keepalive,\n cache: unwrappedRequest.cache as RequestCache,\n priority: unwrappedRequest.priority as RequestPriority,\n mode: unwrappedRequest.mode as RequestMode,\n redirect: unwrappedRequest.redirect as RequestRedirect,\n responseType,\n context: unwrappedRequest.context,\n transferCache: unwrappedRequest.transferCache,\n credentials: unwrappedRequest.credentials as RequestCredentials,\n referrer: unwrappedRequest.referrer,\n referrerPolicy: unwrappedRequest.referrerPolicy as ReferrerPolicy,\n integrity: unwrappedRequest.integrity,\n timeout: unwrappedRequest.timeout,\n },\n );\n}\nclass HttpResourceImpl<T>\n extends ResourceImpl<T, HttpRequest<unknown> | undefined>\n implements HttpResourceRef<T>\n{\n private client!: HttpClient;\n private _headers = linkedSignal({\n source: this.extRequest,\n computation: () => undefined as HttpHeaders | undefined,\n });\n private _progress = linkedSignal({\n source: this.extRequest,\n computation: () => undefined as HttpProgressEvent | undefined,\n });\n private _statusCode = linkedSignal({\n source: this.extRequest,\n computation: () => undefined as number | undefined,\n });\n\n readonly headers = computed(() =>\n this.status() === 'resolved' || this.status() === 'error' ? this._headers() : undefined,\n );\n readonly progress = this._progress.asReadonly();\n readonly statusCode = this._statusCode.asReadonly();\n\n constructor(\n injector: Injector,\n request: () => HttpRequest<T> | undefined,\n defaultValue: T,\n debugName?: string,\n parse?: (value: unknown) => T,\n equal?: ValueEqualityFn<unknown>,\n ) {\n super(\n request,\n ({params: request, abortSignal}) => {\n let sub: Subscription;\n\n // Track the abort listener so it can be removed if the Observable completes (as a memory\n // optimization).\n const onAbort = () => sub.unsubscribe();\n abortSignal.addEventListener('abort', onAbort);\n\n // Start off stream as undefined.\n const stream = signal<ResourceStreamItem<T>>({value: undefined as T});\n let resolve: ((value: Signal<ResourceStreamItem<T>>) => void) | undefined;\n const promise = new Promise<Signal<ResourceStreamItem<T>>>((r) => (resolve = r));\n\n const send = (value: ResourceStreamItem<T>): void => {\n stream.set(value);\n resolve?.(stream);\n resolve = undefined;\n };\n\n sub = this.client.request(request!).subscribe({\n next: (event) => {\n switch (event.type) {\n case HttpEventType.Response:\n this._headers.set(event.headers);\n this._statusCode.set(event.status);\n try {\n send({value: parse ? parse(event.body) : (event.body as T)});\n } catch (error) {\n send({error: encapsulateResourceError(error)});\n }\n break;\n case HttpEventType.DownloadProgress:\n this._progress.set(event);\n break;\n }\n },\n error: (error) => {\n if (error instanceof HttpErrorResponse) {\n this._headers.set(error.headers);\n this._statusCode.set(error.status);\n }\n\n send({error});\n abortSignal.removeEventListener('abort', onAbort);\n },\n complete: () => {\n if (resolve) {\n send({\n error: new ɵRuntimeError(\n ɵRuntimeErrorCode.RESOURCE_COMPLETED_BEFORE_PRODUCING_VALUE,\n ngDevMode && 'Resource completed before producing a value',\n ),\n });\n }\n abortSignal.removeEventListener('abort', onAbort);\n },\n });\n\n return promise;\n },\n defaultValue,\n equal,\n debugName,\n injector,\n );\n this.client = injector.get(HttpClient);\n }\n\n override set(value: T): void {\n super.set(value);\n\n this._headers.set(undefined);\n this._progress.set(undefined);\n this._statusCode.set(undefined);\n }\n\n // This is a type only override of the method\n declare hasValue: () => this is HttpResourceRef<Exclude<T, undefined>>;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {\n APP_BOOTSTRAP_LISTENER,\n ApplicationRef,\n inject,\n InjectionToken,\n makeStateKey,\n Provider,\n StateKey,\n TransferState,\n ɵformatRuntimeError as formatRuntimeError,\n ɵperformanceMarkFeature as performanceMarkFeature,\n ɵtruncateMiddle as truncateMiddle,\n ɵRuntimeError as RuntimeError,\n} from '@angular/core';\nimport {Observable, of} from 'rxjs';\nimport {tap} from 'rxjs/operators';\n\nimport {RuntimeErrorCode} from './errors';\nimport {HttpHeaders} from './headers';\nimport {HTTP_ROOT_INTERCEPTOR_FNS, HttpHandlerFn} from './interceptor';\nimport {HttpRequest} from './request';\nimport {HttpEvent, HttpResponse} from './response';\nimport {HttpParams} from './params';\n\n/**\n * Options to configure how TransferCache should be used to cache requests made via HttpClient.\n *\n * @param includeHeaders Specifies which headers should be included into cached responses. No\n * headers are included by default.\n * @param filter A function that receives a request as an argument and returns a boolean to indicate\n * whether a request should be included into the cache.\n * @param includePostRequests Enables caching for POST requests. By default, only GET and HEAD\n * requests are cached. This option can be enabled if POST requests are used to retrieve data\n * (for example using GraphQL).\n * @param includeRequestsWithAuthHeaders Enables caching of requests containing either `Authorization`\n * or `Proxy-Authorization` headers. By default, these requests are excluded from caching.\n *\n * @see [Configuring the caching options](guide/ssr#configuring-the-caching-options)\n *\n * @publicApi\n */\nexport type HttpTransferCacheOptions = {\n includeHeaders?: string[];\n filter?: (req: HttpRequest<unknown>) => boolean;\n includePostRequests?: boolean;\n includeRequestsWithAuthHeaders?: boolean;\n};\n\n/**\n * If your application uses different HTTP origins to make API calls (via `HttpClient`) on the server and\n * on the client, the `HTTP_TRANSFER_CACHE_ORIGIN_MAP` token allows you to establish a mapping\n * between those origins, so that `HttpTransferCache` feature can recognize those requests as the same\n * ones and reuse the data cached on the server during hydration on the client.\n *\n * IMPORTANT: The `HTTP_TRANSFER_CACHE_ORIGIN_MAP` token should *only* be provided in\n * the *server* code of your application (typically in the `app.server.config.ts` script). Angular throws an\n * error if it detects that the token is defined while running on the client.\n *\n * @usageNotes\n *\n * When the same API endpoint is accessed via `http://internal-domain.com:8080` on the server and\n * via `https://external-domain.com` on the client, you can use the following configuration:\n * ```ts\n * // in app.server.config.ts\n * {\n * provide: HTTP_TRANSFER_CACHE_ORIGIN_MAP,\n * useValue: {\n * 'http://internal-domain.com:8080': 'https://external-domain.com'\n * }\n * }\n * ```\n *\n * @publicApi\n */\nexport const HTTP_TRANSFER_CACHE_ORIGIN_MAP = new InjectionToken<Record<string, string>>(\n typeof ngDevMode !== 'undefined' && ngDevMode ? 'HTTP_TRANSFER_CACHE_ORIGIN_MAP' : '',\n);\n\n/**\n * Keys within cached response data structure.\n */\n\nexport const BODY = 'b';\nexport const HEADERS = 'h';\nexport const STATUS = 's';\nexport const STATUS_TEXT = 'st';\nexport const REQ_URL = 'u';\nexport const RESPONSE_TYPE = 'rt';\n\ninterface TransferHttpResponse {\n /** body */\n [BODY]: any;\n /** headers */\n [HEADERS]: Record<string, string[]>;\n /** status */\n [STATUS]?: number;\n /** statusText */\n [STATUS_TEXT]?: string;\n /** url */\n [REQ_URL]?: string;\n /** responseType */\n [RESPONSE_TYPE]?: HttpRequest<unknown>['responseType'];\n}\n\ninterface CacheOptions extends HttpTransferCacheOptions {\n isCacheActive: boolean;\n}\n\nconst CACHE_OPTIONS = new InjectionToken<CacheOptions>(\n typeof ngDevMode !== 'undefined' && ngDevMode ? 'HTTP_TRANSFER_STATE_CACHE_OPTIONS' : '',\n);\n\n/**\n * A list of allowed HTTP methods to cache.\n */\nconst ALLOWED_METHODS = ['GET', 'HEAD'];\n\nexport function transferCacheInterceptorFn(\n req: HttpRequest<unknown>,\n next: HttpHandlerFn,\n): Observable<HttpEvent<unknown>> {\n const {isCacheActive, ...globalOptions} = inject(CACHE_OPTIONS);\n const {transferCache: requestOptions, method: requestMethod} = req;\n\n // In the following situations we do not want to cache the request\n if (\n !isCacheActive ||\n requestOptions === false ||\n // POST requests are allowed either globally or at request level\n (requestMethod === 'POST' && !globalOptions.includePostRequests && !requestOptions) ||\n (requestMethod !== 'POST' && !ALLOWED_METHODS.includes(requestMethod)) ||\n // Do not cache request that require authorization when includeRequestsWithAuthHeaders is falsey\n (!globalOptions.includeRequestsWithAuthHeaders && hasAuthHeaders(req)) ||\n globalOptions.filter?.(req) === false\n ) {\n return next(req);\n }\n\n const transferState = inject(TransferState);\n\n const originMap: Record<string, string> | null = inject(HTTP_TRANSFER_CACHE_ORIGIN_MAP, {\n optional: true,\n });\n\n if (typeof ngServerMode !== 'undefined' && !ngServerMode && originMap) {\n throw new RuntimeError(\n RuntimeErrorCode.HTTP_ORIGIN_MAP_USED_IN_CLIENT,\n ngDevMode &&\n 'Angular detected that the `HTTP_TRANSFER_CACHE_ORIGIN_MAP` token is configured and ' +\n 'present in the client side code. Please ensure that this token is only provided in the ' +\n 'server code of the application.',\n );\n }\n\n const requestUrl =\n typeof ngServerMode !== 'undefined' && ngServerMode && originMap\n ? mapRequestOriginUrl(req.url, originMap)\n : req.url;\n\n const storeKey = makeCacheKey(req, requestUrl);\n const response = transferState.get(storeKey, null);\n\n let headersToInclude = globalOptions.includeHeaders;\n if (typeof requestOptions === 'object' && requestOptions.includeHeaders) {\n // Request-specific config takes precedence over the global config.\n headersToInclude = requestOptions.includeHeaders;\n }\n\n if (response) {\n const {\n [BODY]: undecodedBody,\n [RESPONSE_TYPE]: responseType,\n [HEADERS]: httpHeaders,\n [STATUS]: status,\n [STATUS_TEXT]: statusText,\n [REQ_URL]: url,\n } = response;\n // Request found in cache. Respond using it.\n let body: ArrayBuffer | Blob | string | undefined = undecodedBody;\n\n switch (responseType) {\n case 'arraybuffer':\n body = new TextEncoder().encode(undecodedBody).buffer;\n break;\n case 'blob':\n body = new Blob([undecodedBody]);\n break;\n }\n\n // We want to warn users accessing a header provided from the cache\n // That HttpTransferCache alters the headers\n // The warning will be logged a single time by HttpHeaders instance\n let headers = new HttpHeaders(httpHeaders);\n if (typeof ngDevMode === 'undefined' || ngDevMode) {\n // Append extra logic in dev mode to produce a warning when a header\n // that was not transferred to the client is accessed in the code via `get`\n // and `has` calls.\n headers = appendMissingHeadersDetection(req.url, headers, headersToInclude ?? []);\n }\n\n return of(\n new HttpResponse({\n body,\n headers,\n status,\n statusText,\n url,\n }),\n );\n }\n\n const event$ = next(req);\n\n if (typeof ngServerMode !== 'undefined' && ngServerMode) {\n // Request not found in cache. Make the request and cache it if on the server.\n return event$.pipe(\n tap((event: HttpEvent<unknown>) => {\n // Only cache successful HTTP responses.\n if (event instanceof HttpResponse) {\n transferState.set<TransferHttpResponse>(storeKey, {\n [BODY]: event.body,\n [HEADERS]: getFilteredHeaders(event.headers, headersToInclude),\n [STATUS]: event.status,\n [STATUS_TEXT]: event.statusText,\n [REQ_URL]: requestUrl,\n [RESPONSE_TYPE]: req.responseType,\n });\n }\n }),\n );\n }\n\n return event$;\n}\n\n/** @returns true when the requests contains autorization related headers. */\nfunction hasAuthHeaders(req: HttpRequest<unknown>): boolean {\n return req.headers.has('authorization') || req.headers.has('proxy-authorization');\n}\n\nfunction getFilteredHeaders(\n headers: HttpHeaders,\n includeHeaders: string[] | undefined,\n): Record<string, string[]> {\n if (!includeHeaders) {\n return {};\n }\n\n const headersMap: Record<string, string[]> = {};\n for (const key of includeHeaders) {\n const values = headers.getAll(key);\n if (values !== null) {\n headersMap[key] = values;\n }\n }\n\n return headersMap;\n}\n\nfunction sortAndConcatParams(params: HttpParams | URLSearchParams): string {\n return [...params.keys()]\n .sort()\n .map((k) => `${k}=${params.getAll(k)}`)\n .join('&');\n}\n\nfunction makeCacheKey(\n request: HttpRequest<any>,\n mappedRequestUrl: string,\n): StateKey<TransferHttpResponse> {\n // make the params encoded same as a url so it's easy to identify\n const {params, method, responseType} = request;\n const encodedParams = sortAndConcatParams(params);\n\n let serializedBody = request.serializeBody();\n if (serializedBody instanceof URLSearchParams) {\n serializedBody = sortAndConcatParams(serializedBody);\n } else if (typeof serializedBody !== 'string') {\n serializedBody = '';\n }\n\n const key = [method, responseType, mappedRequestUrl, serializedBody, encodedParams].join('|');\n const hash = generateHash(key);\n\n return makeStateKey(hash);\n}\n\n/**\n * A method that returns a hash representation of a string using a variant of DJB2 hash\n * algorithm.\n *\n * This is the same hashing logic that is used to generate component ids.\n */\nfunction generateHash(value: string): string {\n let hash = 0;\n\n for (const char of value) {\n hash = (Math.imul(31, hash) + char.charCodeAt(0)) << 0;\n }\n\n // Force positive number hash.\n // 2147483647 = equivalent of Integer.MAX_VALUE.\n hash += 2147483647 + 1;\n\n return hash.toString();\n}\n\n/**\n * Returns the DI providers needed to enable HTTP transfer cache.\n *\n * By default, when using server rendering, requests are performed twice: once on the server and\n * other one on the browser.\n *\n * When these providers are added, requests performed on the server are cached and reused during the\n * bootstrapping of the application in the browser thus avoiding duplicate requests and reducing\n * load time.\n *\n * @see [Caching data when using HttpClient](guide/ssr#configuring-the-caching-options)\n *\n */\nexport function withHttpTransferCache(cacheOptions: HttpTransferCacheOptions): Provider[] {\n return [\n {\n provide: CACHE_OPTIONS,\n useFactory: (): CacheOptions => {\n performanceMarkFeature('NgHttpTransferCache');\n return {isCacheActive: true, ...cacheOptions};\n },\n },\n {\n provide: HTTP_ROOT_INTERCEPTOR_FNS,\n useValue: transferCacheInterceptorFn,\n multi: true,\n },\n {\n provide: APP_BOOTSTRAP_LISTENER,\n multi: true,\n useFactory: () => {\n const appRef = inject(ApplicationRef);\n const cacheState = inject(CACHE_OPTIONS);\n\n return () => {\n appRef.whenStable().then(() => {\n cacheState.isCacheActive = false;\n });\n };\n },\n },\n ];\n}\n\n/**\n * This function will add a proxy to an HttpHeader to intercept calls to get/has\n * and log a warning if the header entry requested has been removed\n */\nfunction appendMissingHeadersDetection(\n url: string,\n headers: HttpHeaders,\n headersToInclude: string[],\n): HttpHeaders {\n const warningProduced = new Set();\n return new Proxy<HttpHeaders>(headers, {\n get(target: HttpHeaders, prop: keyof HttpHeaders): unknown {\n const value = Reflect.get(target, prop);\n const methods: Set<keyof HttpHeaders> = new Set(['get', 'has', 'getAll']);\n\n if (typeof value !== 'function' || !methods.has(prop)) {\n return value;\n }\n\n return (headerName: string) => {\n // We log when the key has been removed and a warning hasn't been produced for the header\n const key = (prop + ':' + headerName).toLowerCase(); // e.g. `get:cache-control`\n if (!headersToInclude.includes(headerName) && !warningProduced.has(key)) {\n warningProduced.add(key);\n const truncatedUrl = truncateMiddle(url);\n\n console.warn(\n formatRuntimeError(\n RuntimeErrorCode.HEADERS_ALTERED_BY_TRANSFER_CACHE,\n `Angular detected that the \\`${headerName}\\` header is accessed, but the value of the header ` +\n `was not transferred from the server to the client by the HttpTransferCache. ` +\n `To include the value of the \\`${headerName}\\` header for the \\`${truncatedUrl}\\` request, ` +\n `use the \\`includeHeaders\\` list. The \\`includeHeaders\\` can be defined either ` +\n `on a request level by adding the \\`transferCache\\` parameter, or on an application ` +\n `level by adding the \\`httpCacheTransfer.includeHeaders\\` argument to the ` +\n `\\`provideClientHydration()\\` call. `,\n ),\n );\n }\n\n // invoking the original method\n return (value as Function).apply(target, [headerName]);\n };\n },\n });\n}\n\nfunction mapRequestOriginUrl(url: string, originMap: Record<string, string>): string {\n const origin = new URL(url, 'resolve://').origin;\n const mappedOrigin = originMap[origin];\n if (!mappedOrigin) {\n return url;\n }\n\n if (typeof ngDevMode === 'undefined' || ngDevMode) {\n verifyMappedOrigin(mappedOrigin);\n }\n\n return url.replace(origin, mappedOrigin);\n}\n\nfunction verifyMappedOrigin(url: string): void {\n if (new URL(url, 'resolve://').pathname !== '/') {\n throw new RuntimeError(\n RuntimeErrorCode.HTTP_ORIGIN_MAP_CONTAINS_PATH,\n 'Angular detected a URL with a path segment in the value provided for the ' +\n `\\`HTTP_TRANSFER_CACHE_ORIGIN_MAP\\` token: ${url}. The map should only contain origins ` +\n 'without any other segments.',\n );\n }\n}\n"],"names":["httpResource","jsonFn","makeHttpResourceFn","arrayBuffer","blob","text","responseType","request","options","ngDevMode","injector","assertInInjectionContext","inject","Injector","HttpResourceImpl","normalizeRequest","defaultValue","debugName","parse","equal","unwrappedRequest","undefined","url","headers","HttpHeaders","params","HttpParams","fromObject","HttpRequest","method","body","reportProgress","withCredentials","keepalive","cache","priority","mode","redirect","context","transferCache","credentials","referrer","referrerPolicy","integrity","timeout","ResourceImpl","client","_headers","linkedSignal","source","extRequest","computation","_progress","_statusCode","computed","status","progress","asReadonly","statusCode","constructor","abortSignal","sub","onAbort","unsubscribe","addEventListener","stream","signal","value","resolve","promise","Promise","r","send","set","subscribe","next","event","type","HttpEventType","Response","error","encapsulateResourceError","DownloadProgress","HttpErrorResponse","removeEventListener","complete","ɵRuntimeError","get","HttpClient","HTTP_TRANSFER_CACHE_ORIGIN_MAP","InjectionToken","BODY","HEADERS","STATUS","STATUS_TEXT","REQ_URL","RESPONSE_TYPE","CACHE_OPTIONS","ALLOWED_METHODS","transferCacheInterceptorFn","req","isCacheActive","globalOptions","requestOptions","requestMethod","includePostRequests","includes","includeRequestsWithAuthHeaders","hasAuthHeaders","filter","transferState","TransferState","originMap","optional","ngServerMode","RuntimeError","requestUrl","mapRequestOriginUrl","storeKey","makeCacheKey","response","headersToInclude","includeHeaders","undecodedBody","httpHeaders","statusText","TextEncoder","encode","buffer","Blob","appendMissingHeadersDetection","of","HttpResponse","event$","pipe","tap","getFilteredHeaders","has","headersMap","key","values","getAll","sortAndConcatParams","keys","sort","map","k","join","mappedRequestUrl","encodedParams","serializedBody","serializeBody","URLSearchParams","hash","generateHash","makeStateKey","char","Math","imul","charCodeAt","toString","withHttpTransferCache","cacheOptions","provide","useFactory","performanceMarkFeature","HTTP_ROOT_INTERCEPTOR_FNS","useValue","multi","APP_BOOTSTRAP_LISTENER","appRef","ApplicationRef","cacheState","whenStable","then","warningProduced","Set","Proxy","target","prop","Reflect","methods","headerName","toLowerCase","add","truncatedUrl","truncateMiddle","console","warn","formatRuntimeError","apply","origin","URL","mappedOrigin","verifyMappedOrigin","replace","pathname"],"mappings":"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"}