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