import { AjaxRequest } from './types'; import { getXHRResponse } from './getXHRResponse'; import { createErrorClass } from '../util/createErrorClass'; /** * A normalized AJAX error. * * @see {@link ajax} * * @class AjaxError */ export interface AjaxError extends Error { /** * The XHR instance associated with the error. */ xhr: XMLHttpRequest; /** * The AjaxRequest associated with the error. */ request: AjaxRequest; /** * The HTTP status code, if the request has completed. If not, * it is set to `0`. */ status: number; /** * The responseType (e.g. 'json', 'arraybuffer', or 'xml'). */ responseType: XMLHttpRequestResponseType; /** * The response data. */ response: any; } export interface AjaxErrorCtor { /** * @deprecated Internal implementation detail. Do not construct error instances. * Cannot be tagged as internal: https://github.com/ReactiveX/rxjs/issues/6269 */ new (message: string, xhr: XMLHttpRequest, request: AjaxRequest): AjaxError; } /** * Thrown when an error occurs during an AJAX request. * This is only exported because it is useful for checking to see if an error * is an `instanceof AjaxError`. DO NOT create new instances of `AjaxError` with * the constructor. * * @class AjaxError * @see {@link ajax} */ export const AjaxError: AjaxErrorCtor = createErrorClass( (_super) => function AjaxErrorImpl(this: any, message: string, xhr: XMLHttpRequest, request: AjaxRequest) { this.message = message; this.name = 'AjaxError'; this.xhr = xhr; this.request = request; this.status = xhr.status; this.responseType = xhr.responseType; let response: any; try { // This can throw in IE, because we have to do a JSON.parse of // the response in some cases to get the expected response property. response = getXHRResponse(xhr); } catch (err) { response = xhr.responseText; } this.response = response; } ); export interface AjaxTimeoutError extends AjaxError {} export interface AjaxTimeoutErrorCtor { /** * @deprecated Internal implementation detail. Do not construct error instances. * Cannot be tagged as internal: https://github.com/ReactiveX/rxjs/issues/6269 */ new (xhr: XMLHttpRequest, request: AjaxRequest): AjaxTimeoutError; } /** * Thrown when an AJAX request times out. Not to be confused with {@link TimeoutError}. * * This is exported only because it is useful for checking to see if errors are an * `instanceof AjaxTimeoutError`. DO NOT use the constructor to create an instance of * this type. * * @class AjaxTimeoutError * @see {@link ajax} */ export const AjaxTimeoutError: AjaxTimeoutErrorCtor = (() => { function AjaxTimeoutErrorImpl(this: any, xhr: XMLHttpRequest, request: AjaxRequest) { AjaxError.call(this, 'ajax timeout', xhr, request); this.name = 'AjaxTimeoutError'; return this; } AjaxTimeoutErrorImpl.prototype = Object.create(AjaxError.prototype); return AjaxTimeoutErrorImpl; })() as any;