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; | |