@arcgis/core
Version:
ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API
490 lines (479 loc) • 19.3 kB
TypeScript
import type Error from "../core/Error.js";
import type { AbortOptions } from "../core/promiseUtils.js";
/**
* An object with the following properties that describe the request.
*
* @since 5.0
*/
export interface RequestOptions extends AbortOptions {
/**
* Indicates if and how requests to ArcGIS Services are authenticated.
* Only applicable when [esriConfig.request.useIdentity = true](https://developers.arcgis.com/javascript/latest/references/core/config/#Config-request).
* | Known Value | Description |
* |-------------|-------------|
* | auto | The user will be signed in when a secure resource is requested. |
* | anonymous | An error will be returned when a secure resource is requested. |
* | immediate | The user will be signed in before the resource is requested. |
* | no-prompt | Checks for whether the user is already signed in. If so, no additional prompts display for sign-in. |
*
* > [!WARNING]
* >
* > **Note:** This is not supported when used in a custom worker that is not using the [workers](https://developers.arcgis.com/javascript/latest/references/core/core/workers/) framework.
*
* @default auto
* @since 5.0
*/
authMode?: "anonymous" | "auto" | "immediate" | "no-prompt";
/**
* If uploading a file, specify the
* form data or element used to submit the file here. If specified, the parameters of the
* `query` will be added to the URL.
*
* @since 5.0
*/
body?: FormData | HTMLFormElement | string | null;
/**
* If `true`, the browser will send a request to the server instead of using the
* browser's local cache. If `false`, the browser's default cache handling will be used.
*
* @default false
* @since 5.0
*/
cacheBust?: boolean;
/**
* Headers to use for the request. This is an
* object whose property names are header names.
*
* @since 5.0
*/
headers?: Record<string, string>;
/**
* Indicates whether the browser will keep the associated request alive if the page that initiated it is unloaded before the request is complete, such as during page navigation or closing.
* See also [`keepalive`](https://developer.mozilla.org/en-US/docs/Web/API/Request/keepalive) for more details.
*
* @default false
* @since 5.0
*/
keepAlive?: boolean;
/**
* Indicates if the request should be made using the
* HTTP DELETE, HEAD, POST, or PUT method. By default, HTTP POST will be used for `auto` if the request size is longer than the `maxUrlLength` property set in [Config](https://developers.arcgis.com/javascript/latest/references/core/config/#Config-request).
*
* @default auto
* @since 5.0
*/
method?: "auto" | "delete" | "head" | "post" | "put";
/**
* Response format. For details on the specific types, see:
* [json](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object),
* [text](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String),
* [array-buffer](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer),
* [blob](https://developer.mozilla.org/en-US/docs/Web/API/Blob),
* [image](https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement),
* [native](https://developer.mozilla.org/en-US/docs/Web/API/Response),
* [native-request-init](https://developer.mozilla.org/en-US/docs/Web/API/RequestInit),
* [document](https://developer.mozilla.org/en-US/docs/Web/API/HTMLDocument), and
* [xml](https://developer.mozilla.org/en-US/docs/Web/API/XMLDocument)
*
* @default json
* @since 5.0
*/
responseType?: ResponseType;
/**
* Indicates the amount of time in milliseconds
* to wait for a response from the server. Set to `0` to wait for the response indefinitely.
*
* @default 62000
* @since 5.0
*/
timeout?: number;
/**
* Indicates the request should use the proxy. By default,
* this is determined automatically based on the domain of the request URL.
*
* @default false
* @since 5.0
*/
useProxy?: boolean;
/**
* Indicates if cross-site `Access-Control` requests should use credentials. It is also possible to push the domain to the config [trustedServers](https://developers.arcgis.com/javascript/latest/references/core/config/#Config-request) if an application requires credentials. For additional information on `withCredentials`, please refer to [this documentation](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/withCredentials).
*
* @default false
* @since 5.0
*/
withCredentials?: boolean;
/**
* Query parameters for the request.
*
* The query parameters will be added to the URL if a GET request is used, or if the `body` property is set. If the
* `body` property is not set, the query parameters will be added to the request body when a DELETE, POST, or PUT
* request is used.
*
* @since 5.0
*/
query?: Record<string, any> | URLSearchParams | null;
}
/** @since 5.0 */
export type ResponseType = "array-buffer" | "blob" | "document" | "image" | "json" | "native" | "native-request-init" | "text" | "xml";
/**
* Returns a promise that resolves to an object with the following specification.
* If the request returns an [Error](https://developers.arcgis.com/javascript/latest/references/core/core/Error/), the error object will
* include the details specified in [RequestErrorDetails](https://developers.arcgis.com/javascript/latest/references/core/request/types/#RequestErrorDetails).
*
* @since 5.0
* @example
* // request GeoJson data from USGS remote server
* let url = "https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/all_hour.geojson";
*
* esriRequest(url, {
* responseType: "json"
* }).then((response) => {
* // The requested data
* let geoJson = response.data;
* });
*/
export interface RequestResponse<T> {
/**
* The requested data. This value should match the [RequestOptions](https://developers.arcgis.com/javascript/latest/references/core/request/types/#RequestOptions) `responseType` with the data return type. Possible types are:
* [json](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object),
* [text](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String),
* [array-buffer](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer),
* [blob](https://developer.mozilla.org/en-US/docs/Web/API/Blob),
* [image](https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement),
* [native](https://developer.mozilla.org/en-US/docs/Web/API/Response),
* [native-request-init](https://developer.mozilla.org/en-US/docs/Web/API/RequestInit),
* [document](https://developer.mozilla.org/en-US/docs/Web/API/HTMLDocument), and
* [xml](https://developer.mozilla.org/en-US/docs/Web/API/XMLDocument).
*
* @since 5.0
*/
data: T;
/**
* Method for getting all headers sent from the server.
*
* @since 5.0
*/
getAllHeaders?: GetAllHeaders;
/**
* Method for getting a header sent from the server.
*
* @since 5.0
*/
getHeader?: GetHeader;
/**
* The status code of the http response.
*
* @since 5.0
*/
httpStatus?: number;
/**
* The options specified by the user in the data request. See [RequestOptions](https://developers.arcgis.com/javascript/latest/references/core/request/types/#RequestOptions) for available properties.
*
* @since 5.0
*/
requestOptions?: RequestOptions;
/**
* Indicates if the request required https.
*
* @since 5.0
*/
ssl?: boolean;
/**
* The URL used to request the data.
*
* @since 5.0
*/
url?: string;
}
/**
* A function to retrieve all headers sent from the server.
* CORS only allows a few response headers to be read by default, see: [Access-Control-Expose-Headers](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Expose-Headers).
*
* @returns An array of all headers returned from the server. Each header is an array containing the header name and its corresponding value.
* @since 5.0
* @example
* esriRequest(url, options)
* .then((response) => {
* console.log("All request headers: ", response.getAllHeaders());
* });
*/
export type GetAllHeaders = () => [
string,
string
][] | null | undefined;
/**
* A function to retrieve headers sent from the server.
* CORS only allows a few response headers to be read by default, see: [Access-Control-Expose-Headers](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Expose-Headers).
*
* @param headerName - The name of the header.
* @returns The header value.
* @since 5.0
* @example
* esriRequest(url, options)
* .then((response) => {
* // prints the content type of the request: 'application/json'
* console.log("header: ", response.getHeader('Content-Type'));
* });
*/
export type GetHeader = (headerName: string) => string | null | undefined;
/**
* The specification of the [details object](https://developers.arcgis.com/javascript/latest/references/core/core/Error/#details) returned in an
* [Error](https://developers.arcgis.com/javascript/latest/references/core/core/Error/) object.
*
* @since 5.0
*/
export interface RequestErrorDetails {
/**
* The URL of the request that returned an error message.
*
* @since 5.0
*/
url: string;
/**
* The options used in the http request.
*
* @since 5.0
*/
requestOptions: RequestOptions;
/**
* A function for retrieving all headers sent from the server.
*
* @since 5.0
*/
getAllHeaders: GetAllHeaders;
/**
* A function to retrieve headers sent from the server.
*
* @since 5.0
*/
getHeader: GetHeader;
/**
* The status code of the http response.
*
* @since 5.0
*/
httpStatus: number;
/**
* The raw error object if the server returned a JSON error, or the response text otherwise.
*
* @since 5.0
*/
raw: string | Object;
/**
* The error message subcode.
*
* @since 5.0
*/
subCode: number;
/**
* The error message code.
*
* @since 5.0
*/
messageCode: string;
/**
* Additional error message(s).
*
* @since 5.0
*/
messages: string[];
/**
* Indicates if the request required https.
*
* @since 5.0
*/
ssl: boolean;
}
/** @since 5.0 */
export interface RequestParameters {
/**
* The options specified by the user in the data request. See [RequestOptions](https://developers.arcgis.com/javascript/latest/references/core/request/types/#RequestOptions) for available properties.
*
* @since 5.0
*/
requestOptions: RequestOptions;
/**
* The request URL.
*
* @since 5.0
*/
url: string;
}
/**
* Specifies the object used for intercepting and modifying requests made via [esriRequest](https://developers.arcgis.com/javascript/latest/references/core/request/).
*
* @since 5.0
* @example
* const featureLayerUrl = "https://sampleserver6.arcgisonline.com/arcgis/rest/services/USA/MapServer/0";
*
* esriConfig.request.interceptors.push({
* // set the `urls` property to the URL of the FeatureLayer so that this
* // interceptor only applies to requests made to the FeatureLayer URL
* urls: featureLayerUrl,
* // use the BeforeInterceptorCallback to check if the query of the
* // FeatureLayer has a maxAllowableOffset property set.
* // if so, then set the maxAllowableOffset to 0
* before: function(params) {
* if (params.requestOptions.query.maxAllowableOffset) {
* params.requestOptions.query.maxAllowableOffset = 0;
* }
* },
* // use the AfterInterceptorCallback to check if `ssl` is set to 'true'
* // on the response to the request, if it's set to 'false', change
* // the value to 'true' before returning the response
* after: function(response) {
* if (!response.ssl) {
* response.ssl = true;
* }
* }
* });
* @example
* const featureLayer = new FeatureLayer({
* url: "https://sampleserver6.arcgisonline.com/arcgis/rest/services/USA/MapServer/3"
* });
*
* esriConfig.request.interceptors.push({
* urls: featureLayer.url,
* // set the error function and check if an error occurs, and if it's name is "AbortError"
* // if so, display a useful error about the layer, if not, ignore the error
* error: function(error) {
* if (error.name == "AbortError") {
* // we're only interested in aborted request errors
* console.error(`An error happened with layer ${featureLayer.title}`, error);
* }
* return;
* }
* });
*/
export interface RequestInterceptor {
/**
* Makes changes to the response after the request is sent, but before it's returned to the caller.
*
* @since 5.0
*/
after?: AfterInterceptorCallback;
/**
* Make changes to the request URL or options before the request is sent. A returned value will be used as the response data, which would prevent the request from being sent.
*
* @since 5.0
*/
before?: BeforeInterceptorCallback;
/**
* When an error occurs during the request processing, this function is called with an [Error](https://developers.arcgis.com/javascript/latest/references/core/core/Error/) object giving the details about what happened.
* For example, this could be used to log specific errors occurring with layers or services.
*
* @since 5.0
*/
error?: ErrorInterceptorCallback;
/**
* Sets or adds headers into `requestOptions.headers`. See also: [RequestOptions](https://developers.arcgis.com/javascript/latest/references/core/request/types/#RequestOptions).
*
* @since 5.0
*/
headers?: Record<string, string>;
/**
* Sets or adds query parameters into `requestOptions.query`. See also: [RequestOptions](https://developers.arcgis.com/javascript/latest/references/core/request/types/#RequestOptions).
*
* @since 5.0
*/
query?: Object;
/**
* Hardcodes the [response](https://developers.arcgis.com/javascript/latest/references/core/request/types/#RequestResponse). The request will not be sent. This is resolved as the response `data`.
*
* @since 5.0
*/
responseData?: any;
/**
* Specifies the URL(s) to apply to the interceptors. If the value is type `String`, then it matches if the request URL starts with that string. If null or undefined, the interceptor will apply to all relevant requests.
* If using a [`RegExp`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp), the [`g`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/global) and [`y`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/sticky) flags should not be used.
*
* @since 5.0
*/
urls?: RegExp | string | Array<RegExp | string>;
}
/**
* Makes changes to the response after the request is sent, but before it's returned to the caller.
*
* @param response - The response object.
* @since 5.0
* @example
* const featureLayerUrl = "https://sampleserver6.arcgisonline.com/arcgis/rest/services/USA/MapServer/0";
*
* esriConfig.request.interceptors.push({
* // set the `urls` property to the URL of the FeatureLayer so that this
* // interceptor only applies to requests made to the FeatureLayer URL
* urls: featureLayerUrl,
* // use the AfterInterceptorCallback to check if `ssl` is set to 'true'
* // on the response to the request, if it's set to 'false', change
* // the value to 'true' before returning the response
* after: function(response) {
* if (!response.ssl) {
* response.ssl = true;
* }
* }
* });
*/
export type AfterInterceptorCallback = (response: RequestResponse<any>) => void;
/**
* Makes changes to the request URL or options before the request is sent.
* A returned value will be used as the response data, which would prevent the request from being sent.
*
* If `null` or `undefined` is returned, the request is sent with whatever changes were made to the parameters.
* If an Error is returned, the request is rejected with an [esriError](https://developers.arcgis.com/javascript/latest/references/core/core/Error/).
* If any other type is returned, the request is resolved with the returned value as the [response data](https://developers.arcgis.com/javascript/latest/references/core/request/types/#RequestResponse) (request will not be sent).
*
* @param params - Parameters object that specifies the two properties that can be set.
* @returns Returns: `null`, `undefined`, [Error](https://developers.arcgis.com/javascript/latest/references/core/core/Error/), [response data](https://developers.arcgis.com/javascript/latest/references/core/request/types/#RequestResponse), or a Promise
* that resolves to any one of these object types.
* @since 5.0
* @example
* // modifying the query parameters
* const featureLayerUrl = "https://sampleserver6.arcgisonline.com/arcgis/rest/services/USA/MapServer/0";
*
* esriConfig.request.interceptors.push({
* // set the `urls` property to the URL of the FeatureLayer so that this
* // interceptor only applies to requests made to the FeatureLayer URL
* urls: featureLayerUrl,
* // use the BeforeInterceptorCallback to check if the query of the
* // FeatureLayer has a maxAllowableOffset property set.
* // if so, then set the maxAllowableOffset to 0
* before: function(params) {
* if (params.requestOptions.query.maxAllowableOffset) {
* params.requestOptions.query.maxAllowableOffset = 0;
* }
* }
* });
* @example
* // fetching the data in place of the requests
* const wmsLayerUrl = "https://sampleserver6.arcgisonline.com/arcgis/services/911CallsHotspot/MapServer/WMSServer";
*
* esriConfig.request.interceptors.push({
* urls: wmsLayerUrl,
* before: function(params) {
* if (params.url === url && params.requestOptions.responseType === "xml") {
* if ("fetch" in window && "TextDecoder" in window) {
* // decode the response as ISO-8859-1 if it's not UTF-8 as expected
* return fetch(url + "?SERVICE=WMS&REQUEST=GetCapabilities")
* .then(function(response) {
* return response.arrayBuffer();
* })
* .then(function(buffer) {
* let textDecoder = new TextDecoder("ISO-8859-1"); // specified in the Capabilities XML declaration
* let xmlText = textDecoder.decode(buffer);
* let parser = new DOMParser();
* xml = parser.parseFromString(xmlText, "application/xml");
* return xml;
* });
* }
* }
* }
* });
*/
export type BeforeInterceptorCallback = (params: RequestParameters) => any;
/**
* The error function detailing the reason why the [request](https://developers.arcgis.com/javascript/latest/references/core/request/types/#RequestInterceptor) failed.
*
* @param error - The error object. See [Error](https://developers.arcgis.com/javascript/latest/references/core/core/Error/) for more information.
* @since 5.0
*/
export type ErrorInterceptorCallback = (error: Error<unknown>) => void;