{"version":3,"file":"http.mjs","sources":["../../../../../darwin_arm64-fastbuild-ST-fdfa778d11ba/bin/packages/common/http/src/transfer_cache.ts","../../../../../darwin_arm64-fastbuild-ST-fdfa778d11ba/bin/packages/common/http/src/resource.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  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\nexport const 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\nfunction shouldCacheRequest(req: HttpRequest<unknown>, options: CacheOptions): boolean {\n  const {isCacheActive, ...globalOptions} = options;\n  const {transferCache: requestOptions, method: requestMethod} = req;\n\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 false;\n  }\n\n  return true;\n}\n\nfunction getHeadersToInclude(\n  options: CacheOptions,\n  requestOptions: HttpTransferCacheOptions | boolean | undefined,\n): string[] | undefined {\n  const {includeHeaders: globalHeaders} = options;\n  let headersToInclude = globalHeaders;\n  if (typeof requestOptions === 'object' && requestOptions.includeHeaders) {\n    // Request-specific config takes precedence over the global config.\n    headersToInclude = requestOptions.includeHeaders;\n  }\n  return headersToInclude;\n}\n\nexport function retrieveStateFromCache(\n  req: HttpRequest<unknown>,\n  options: CacheOptions,\n  transferState: TransferState,\n  originMap: Record<string, string> | null,\n): HttpResponse<unknown> | null {\n  const {transferCache: requestOptions} = req;\n\n  // In the following situations we do not want to cache the request\n  if (!shouldCacheRequest(req, options)) {\n    return null;\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  const headersToInclude = getHeadersToInclude(options, requestOptions);\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 = fromBase64(undecodedBody);\n        break;\n      case 'blob':\n        body = new Blob([fromBase64(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 new HttpResponse({\n      body,\n      headers,\n      status,\n      statusText,\n      url,\n    });\n  }\n\n  return null;\n}\n\nexport function transferCacheInterceptorFn(\n  req: HttpRequest<unknown>,\n  next: HttpHandlerFn,\n): Observable<HttpEvent<unknown>> {\n  const options = inject(CACHE_OPTIONS);\n  const transferState = inject(TransferState);\n\n  const originMap = inject(HTTP_TRANSFER_CACHE_ORIGIN_MAP, {optional: true});\n\n  const cachedResponse = retrieveStateFromCache(req, options, transferState, originMap);\n  if (cachedResponse) {\n    return of(cachedResponse);\n  }\n\n  const {transferCache: requestOptions} = req;\n  const headersToInclude = getHeadersToInclude(options, requestOptions);\n\n  const requestUrl =\n    typeof ngServerMode !== 'undefined' && ngServerMode && originMap\n      ? mapRequestOriginUrl(req.url, originMap)\n      : req.url;\n  const storeKey = makeCacheKey(req, requestUrl);\n\n  // In the following situations we do not want to cache the request\n  if (!shouldCacheRequest(req, options)) {\n    return next(req);\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]:\n              req.responseType === 'arraybuffer' || req.responseType === 'blob'\n                ? toBase64(event.body)\n                : 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\nfunction toBase64(buffer: unknown): string {\n  //TODO: replace with when is Baseline widely available\n  // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint8Array/toBase64\n  const bytes = new Uint8Array(buffer as ArrayBufferLike);\n\n  const CHUNK_SIZE = 0x8000; // 32,768 bytes (~32 KB) per chunk, to avoid stack overflow\n\n  let binaryString = '';\n\n  for (let i = 0; i < bytes.length; i += CHUNK_SIZE) {\n    const chunk = bytes.subarray(i, i + CHUNK_SIZE);\n    binaryString += String.fromCharCode.apply(null, chunk as unknown as number[]);\n  }\n  return btoa(binaryString);\n}\n\nfunction fromBase64(base64: string): ArrayBuffer {\n  const binary = atob(base64);\n  const bytes = Uint8Array.from(binary, (c) => c.charCodeAt(0));\n  return bytes.buffer;\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","/**\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  TransferState,\n  untracked,\n} from '@angular/core';\nimport type {Subscription} from 'rxjs';\n\nimport {HttpRequest} from './request';\nimport {HttpClient} from './client';\nimport {HttpErrorResponse, HttpEventType, HttpProgressEvent} from './response';\nimport {HttpHeaders} from './headers';\nimport {HttpParams} from './params';\nimport {HttpResourceRef, HttpResourceOptions, HttpResourceRequest} from './resource_api';\nimport {\n  CACHE_OPTIONS,\n  HTTP_TRANSFER_CACHE_ORIGIN_MAP,\n  retrieveStateFromCache,\n} from './transfer_cache';\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\n    const cacheOptions = injector.get(CACHE_OPTIONS, null, {optional: true});\n    const transferState = injector.get(TransferState, null, {optional: true});\n    const originMap = injector.get(HTTP_TRANSFER_CACHE_ORIGIN_MAP, null, {optional: true});\n\n    const getInitialStream = (req: HttpRequest<unknown> | undefined) => {\n      if (cacheOptions && transferState && req) {\n        const cachedResponse = retrieveStateFromCache(req, cacheOptions, transferState, originMap);\n        if (cachedResponse) {\n          try {\n            const body = cachedResponse.body as TRaw;\n            const parsed = options?.parse ? options.parse(body) : (body as unknown as TResult);\n            return signal({value: parsed});\n          } catch (e) {\n            if (typeof ngDevMode === 'undefined' || ngDevMode) {\n              console.warn(\n                `Angular detected an error while parsing the cached response for the httpResource at \\`${req.url}\\`. ` +\n                  `The resource will fall back to its default value and try again asynchronously.`,\n                e,\n              );\n            }\n          }\n        }\n      }\n      return undefined;\n    };\n\n    return new HttpResourceImpl(\n      injector,\n      () => normalizeRequest(request, responseType),\n      options?.defaultValue as TResult,\n      options?.debugName,\n      options?.parse as (value: unknown) => TResult,\n      options?.equal as ValueEqualityFn<unknown>,\n      getInitialStream,\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<unknown> | undefined,\n    defaultValue: T,\n    debugName?: string,\n    parse?: (value: unknown) => T,\n    equal?: ValueEqualityFn<unknown>,\n    getInitialStream?: (\n      request: HttpRequest<unknown> | undefined,\n    ) => Signal<ResourceStreamItem<T>> | undefined,\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      getInitialStream,\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"],"names":["HTTP_TRANSFER_CACHE_ORIGIN_MAP","InjectionToken","ngDevMode","BODY","HEADERS","STATUS","STATUS_TEXT","REQ_URL","RESPONSE_TYPE","CACHE_OPTIONS","ALLOWED_METHODS","shouldCacheRequest","req","options","isCacheActive","globalOptions","transferCache","requestOptions","method","requestMethod","includePostRequests","includes","includeRequestsWithAuthHeaders","hasAuthHeaders","filter","getHeadersToInclude","includeHeaders","globalHeaders","headersToInclude","retrieveStateFromCache","transferState","originMap","ngServerMode","RuntimeError","requestUrl","mapRequestOriginUrl","url","storeKey","makeCacheKey","response","get","undecodedBody","responseType","httpHeaders","status","statusText","body","fromBase64","Blob","headers","HttpHeaders","appendMissingHeadersDetection","HttpResponse","transferCacheInterceptorFn","next","inject","TransferState","optional","cachedResponse","of","event$","pipe","tap","event","set","toBase64","getFilteredHeaders","has","headersMap","key","values","getAll","sortAndConcatParams","params","keys","sort","map","k","join","request","mappedRequestUrl","encodedParams","serializedBody","serializeBody","URLSearchParams","hash","generateHash","makeStateKey","value","char","Math","imul","charCodeAt","toString","buffer","bytes","Uint8Array","CHUNK_SIZE","binaryString","i","length","chunk","subarray","String","fromCharCode","apply","btoa","base64","binary","atob","from","c","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","origin","URL","mappedOrigin","verifyMappedOrigin","replace","pathname","httpResource","jsonFn","makeHttpResourceFn","arrayBuffer","blob","text","injector","assertInInjectionContext","Injector","getInitialStream","parsed","parse","signal","e","undefined","HttpResourceImpl","normalizeRequest","defaultValue","debugName","equal","unwrappedRequest","HttpParams","fromObject","HttpRequest","reportProgress","withCredentials","keepalive","cache","priority","mode","redirect","context","credentials","referrer","referrerPolicy","integrity","timeout","ResourceImpl","client","_headers","linkedSignal","source","extRequest","computation","_progress","_statusCode","computed","progress","asReadonly","statusCode","constructor","abortSignal","sub","onAbort","unsubscribe","addEventListener","stream","resolve","promise","Promise","r","send","subscribe","type","HttpEventType","Response","error","encapsulateResourceError","DownloadProgress","HttpErrorResponse","removeEventListener","complete","ɵRuntimeError","HttpClient"],"mappings":"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"}