| import { AjaxRequest, AjaxResponseType } from './types'; | 
| import { getXHRResponse } from './getXHRResponse'; | 
|   | 
| /** | 
|  * A normalized response from an AJAX request. To get the data from the response, | 
|  * you will want to read the `response` property. | 
|  * | 
|  * - DO NOT create instances of this class directly. | 
|  * - DO NOT subclass this class. | 
|  * | 
|  * It is advised not to hold this object in memory, as it has a reference to | 
|  * the original XHR used to make the request, as well as properties containing | 
|  * request and response data. | 
|  * | 
|  * @see {@link ajax} | 
|  * @see {@link AjaxConfig} | 
|  */ | 
| export class AjaxResponse<T> { | 
|   /** The HTTP status code */ | 
|   readonly status: number; | 
|   | 
|   /** | 
|    * The response data, if any. Note that this will automatically be converted to the proper type | 
|    */ | 
|   readonly response: T; | 
|   | 
|   /** | 
|    * The responseType set on the request. (For example: `""`, `"arraybuffer"`, `"blob"`, `"document"`, `"json"`, or `"text"`) | 
|    * @deprecated There isn't much reason to examine this. It's the same responseType set (or defaulted) on the ajax config. | 
|    * If you really need to examine this value, you can check it on the `request` or the `xhr`. Will be removed in v8. | 
|    */ | 
|   readonly responseType: XMLHttpRequestResponseType; | 
|   | 
|   /** | 
|    * The total number of bytes loaded so far. To be used with {@link total} while | 
|    * calculating progress. (You will want to set {@link includeDownloadProgress} or | 
|    * {@link includeDownloadProgress}) | 
|    */ | 
|   readonly loaded: number; | 
|   | 
|   /** | 
|    * The total number of bytes to be loaded. To be used with {@link loaded} while | 
|    * calculating progress. (You will want to set {@link includeDownloadProgress} or | 
|    * {@link includeDownloadProgress}) | 
|    */ | 
|   readonly total: number; | 
|   | 
|   /** | 
|    * A dictionary of the response headers. | 
|    */ | 
|   readonly responseHeaders: Record<string, string>; | 
|   | 
|   /** | 
|    * A normalized response from an AJAX request. To get the data from the response, | 
|    * you will want to read the `response` property. | 
|    * | 
|    * - DO NOT create instances of this class directly. | 
|    * - DO NOT subclass this class. | 
|    * | 
|    * @param originalEvent The original event object from the XHR `onload` event. | 
|    * @param xhr The `XMLHttpRequest` object used to make the request. This is useful for examining status code, etc. | 
|    * @param request The request settings used to make the HTTP request. | 
|    * @param type The type of the event emitted by the {@link ajax} Observable | 
|    */ | 
|   constructor( | 
|     /** | 
|      * The original event object from the raw XHR event. | 
|      */ | 
|     public readonly originalEvent: ProgressEvent, | 
|     /** | 
|      * The XMLHttpRequest object used to make the request. | 
|      * NOTE: It is advised not to hold this in memory, as it will retain references to all of it's event handlers | 
|      * and many other things related to the request. | 
|      */ | 
|     public readonly xhr: XMLHttpRequest, | 
|     /** | 
|      * The request parameters used to make the HTTP request. | 
|      */ | 
|     public readonly request: AjaxRequest, | 
|     /** | 
|      * The event type. This can be used to discern between different events | 
|      * if you're using progress events with {@link includeDownloadProgress} or | 
|      * {@link includeUploadProgress} settings in {@link AjaxConfig}. | 
|      * | 
|      * The event type consists of two parts: the {@link AjaxDirection} and the | 
|      * the event type. Merged with `_`, they form the `type` string. The | 
|      * direction can be an `upload` or a `download` direction, while an event can | 
|      * be `loadstart`, `progress` or `load`. | 
|      * | 
|      * `download_load` is the type of event when download has finished and the | 
|      * response is available. | 
|      */ | 
|     public readonly type: AjaxResponseType = 'download_load' | 
|   ) { | 
|     const { status, responseType } = xhr; | 
|     this.status = status ?? 0; | 
|     this.responseType = responseType ?? ''; | 
|   | 
|     // Parse the response headers in advance for the user. There's really | 
|     // not a great way to get all of them. So we need to parse the header string | 
|     // we get back. It comes in a simple enough format: | 
|     // | 
|     // header-name: value here | 
|     // content-type: application/json | 
|     // other-header-here: some, other, values, or, whatever | 
|     const allHeaders = xhr.getAllResponseHeaders(); | 
|     this.responseHeaders = allHeaders | 
|       ? // Split the header text into lines | 
|         allHeaders.split('\n').reduce((headers: Record<string, string>, line) => { | 
|           // Split the lines on the first ": " as | 
|           // "key: value". Note that the value could | 
|           // technically have a ": " in it. | 
|           const index = line.indexOf(': '); | 
|           headers[line.slice(0, index)] = line.slice(index + 2); | 
|           return headers; | 
|         }, {}) | 
|       : {}; | 
|   | 
|     this.response = getXHRResponse(xhr); | 
|     const { loaded, total } = originalEvent; | 
|     this.loaded = loaded; | 
|     this.total = total; | 
|   } | 
| } |