diff options
Diffstat (limited to 'node_modules/rxjs/src/internal/ajax/AjaxResponse.ts')
| -rw-r--r-- | node_modules/rxjs/src/internal/ajax/AjaxResponse.ts | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/node_modules/rxjs/src/internal/ajax/AjaxResponse.ts b/node_modules/rxjs/src/internal/ajax/AjaxResponse.ts new file mode 100644 index 0000000..c9ca915 --- /dev/null +++ b/node_modules/rxjs/src/internal/ajax/AjaxResponse.ts @@ -0,0 +1,124 @@ +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; + } +} |
