UNPKG

@esri/arcgis-rest-request

Version:

Common methods and utilities for @esri/arcgis-rest-js packages.

8 lines (7 loc) 38.7 kB
/* @preserve * @esri/arcgis-rest-request - v4.7.1 - Apache-2.0 * Copyright (c) 2017-2025 Esri, Inc. * Mon Jul 28 2025 20:35:51 GMT+0000 (Coordinated Universal Time) */ !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).arcgisRest=e.arcgisRest||{})}(this,(function(e){"use strict";function t(e){return Object.keys(e).some((t=>{let r=e[t];if(!r)return!1;r&&r.toParam&&(r=r.toParam());switch(r.constructor.name){case"Array":case"Object":case"Date":case"Function":case"Boolean":case"String":case"Number":return!1;default:return!0}}))}function r(e){const t={};return Object.keys(e).forEach((r=>{var s,n;let i=e[r];if(i&&i.toParam&&(i=i.toParam()),!i&&0!==i&&"boolean"!=typeof i&&"string"!=typeof i)return;let o;switch(i.constructor.name){case"Array":const e=null===(n=null===(s=i[0])||void 0===s?void 0:s.constructor)||void 0===n?void 0:n.name;o="Array"===e?i:"Object"===e?JSON.stringify(i):i.join(",");break;case"Object":o=JSON.stringify(i);break;case"Date":o=i.valueOf();break;case"Function":o=null;break;case"Boolean":o=i+"";break;default:o=i}(o||0===o||"string"==typeof o||Array.isArray(o))&&(t[r]=o)})),t}function s(e,t){return Array.isArray(t)&&t[0]&&Array.isArray(t[0])?t.map((t=>s(e,t))).join("&"):encodeURIComponent(e)+"="+encodeURIComponent(t)}function n(e){const t=r(e);return Object.keys(t).map((e=>s(e,t[e]))).join("&")}const i=globalThis.FormData,o=globalThis.File,a=globalThis.Blob;function c(e,s){const o=t(e)||s,a=r(e);if(o){const e=new i;return Object.keys(a).forEach((t=>{if("undefined"!=typeof Blob&&a[t]instanceof Blob){const r=a.fileName||a[t].name||t;e.append(t,a[t],r)}else e.append(t,a[t])})),e}return n(e)}class h extends Error{constructor(e,t,r,s,n){super(e);const i=new.target.prototype;Object.setPrototypeOf(this,i),e=e||"UNKNOWN_ERROR",t=t||"UNKNOWN_ERROR_CODE",this.name="ArcGISRequestError",this.message="UNKNOWN_ERROR_CODE"===t?e:`${t}: ${e}`,this.originalMessage=e,this.code=t,this.response=r,this.url=s,this.options=n}}const l={noCorsDomains:[],crossOriginNoCorsDomains:{},pendingNoCorsRequests:{}},u="ARCGIS_REST_JS_NO_CORS";globalThis[u]||(globalThis[u]=Object.assign({},l));const d=globalThis[u];function p(e){const t=new URL(e);e=t.origin+t.pathname,t.search.includes("f=json")&&(e+="?f=json");const r=t.origin;return d.pendingNoCorsRequests[r]||(d.pendingNoCorsRequests[r]=fetch(e,{mode:"no-cors",credentials:"include",cache:"no-store"}).then((e=>{-1===d.noCorsDomains.indexOf(r)&&d.noCorsDomains.push(r),d.crossOriginNoCorsDomains[r.toLowerCase()]=Date.now(),delete d.pendingNoCorsRequests[r]})).catch((e=>(delete d.pendingNoCorsRequests[r],Promise.reject(new Error(`no-cors request to ${r} failed`)))))),d.pendingNoCorsRequests[r]}function g(e){e.forEach((e=>{e=e.toLowerCase(),/^https?:\/\//.test(e)?f(e):(f("http://"+e),f("https://"+e))}))}function f(e){const t=new URL(e).origin;-1===d.noCorsDomains.indexOf(t)&&d.noCorsDomains.push(t)}function m(e){let t=!1;if(d.noCorsDomains.length){const r=new URL(e).origin.toLowerCase();t=d.noCorsDomains.some((e=>r.includes(e)))}return t}function E(e){let t=!1;if(m(e)){const r=new URL(e).origin.toLowerCase(),s=d.crossOriginNoCorsDomains[r]||0;Date.now()-36e5>s&&(t=!0)}return t}function w(e){console&&console.warn&&console.warn.apply(console,[e])}function k(){return Promise.resolve({fetch:globalThis.fetch,Headers:globalThis.Headers,Response:globalThis.Response,Request:globalThis.Request})}const S="@esri/arcgis-rest-js";function T(){return globalThis.DEFAULT_ARCGIS_REQUEST_OPTIONS||{httpMethod:"POST",params:{f:"json"}}}class _ extends h{constructor(e="AUTHENTICATION_ERROR",t="AUTHENTICATION_ERROR_CODE",r,s,n){super(e,t,r,s,n),this.name="ArcGISAuthError",this.message="AUTHENTICATION_ERROR_CODE"===t?e:`${t}: ${e}`;const i=new.target.prototype;Object.setPrototypeOf(this,i)}retry(e,t=1){let r=0;const s=(n,i)=>{r+=1,e(this.url,this.options).then((e=>{const t=Object.assign(Object.assign({},this.options),{authentication:e});return R(this.url,t)})).then((e=>{n(e)})).catch((e=>{"ArcGISAuthError"===e.name&&r<t?s(n,i):e.name===this.name&&e.message===this.message&&r>=t?i(this):i(e)}))};return new Promise(((e,t)=>{s(e,t)}))}}function O(e,t,r,s,n){if(e.code>=400){const{message:r,code:n}=e;throw new h(r,n,e,t,s)}if(e.error){const{message:r,code:i,messageCode:o}=e.error,a=o||i||"UNKNOWN_ERROR_CODE";if(498===i||499===i)throw n||new _(r,a,e,t,s);throw new h(r,a,e,t,s)}if("failed"===e.status||"failure"===e.status){let r,n="UNKNOWN_ERROR_CODE";try{r=JSON.parse(e.statusMessage).message,n=JSON.parse(e.statusMessage).code}catch(t){r=e.statusMessage||e.message}throw new h(r,n,e,t,s)}return e}function R(e,r){const s=T(),i=Object.assign(Object.assign(Object.assign({httpMethod:"POST"},s),r),{params:Object.assign(Object.assign({},s.params),r.params),headers:Object.assign(Object.assign({},s.headers),r.headers)}),{httpMethod:o,rawResponse:a}=i,l=Object.assign({f:"json"},i.params);let u=null;const d={method:o,signal:i.signal,credentials:i.credentials||"same-origin"};let f;if(m(e)&&(d.credentials="include"),i.headers&&i.headers["X-Esri-Auth-Client-Id"]&&e.indexOf("/oauth2/platformSelf")>-1&&(d.credentials="include"),"string"==typeof i.authentication){const e=i.authentication;f={portal:"https://www.arcgis.com/sharing/rest",getToken:()=>Promise.resolve(e)},i.authentication.startsWith("AAPK")||i.authentication.startsWith("AATK")||i.suppressWarnings||globalThis.ARCGIS_REST_JS_SUPPRESS_TOKEN_WARNING||(w("Using an oAuth 2.0 access token directly in the token option is discouraged. Consider using ArcGISIdentityManager or Application session. See https://esriurl.com/arcgis-rest-js-direct-token-warning for more information."),globalThis.ARCGIS_REST_JS_SUPPRESS_TOKEN_WARNING=!0)}else f=i.authentication;const _=e;let R=!1;"undefined"!=typeof window&&(R=function(e,t){var r;if((t||window)&&e){const s=null===(r=(t=t||window).location)||void 0===r?void 0:r.origin;return e.startsWith(s)}return!1}(e));const A=!R&&E(e);i.headers&&i.headers["X-Esri-Auth-Client-Id"]&&e.indexOf("/oauth2/platformSelf")>-1&&(d.credentials="include");let b=Promise.resolve();return A&&(d.credentials="include",b=p(e)),b.then((()=>f?f.getToken(e).catch((t=>(t.url=e,t.options=i,u=t,Promise.resolve("")))):Promise.resolve(""))).then((r=>{r.length&&(l.token=r),f&&f.getDomainCredentials&&(d.credentials=f.getDomainCredentials(e));const s={};if("GET"===d.method){l.token&&i.hideToken&&"undefined"==typeof window&&(s["X-Esri-Authorization"]=`Bearer ${l.token}`,delete l.token);const t=""===n(l)?e:e+"?"+n(l);i.maxUrlLength&&t.length>i.maxUrlLength||!i.maxUrlLength&&t.length>2e3||l.token&&i.hideToken?(d.method="POST",r.length&&i.hideToken&&(l.token=r,delete s["X-Esri-Authorization"])):e=t}const o=new RegExp("/items/.+/updateResources").test(e);return"POST"===d.method&&(d.body=c(l,o)),d.headers=Object.assign(Object.assign({},s),i.headers),("undefined"==typeof window||window&&void 0===window.document)&&!d.headers.referer&&(d.headers.referer=S),t(l)||o||(d.headers["Content-Type"]="application/x-www-form-urlencoded"),globalThis.fetch?globalThis.fetch(e,d):k().then((({fetch:t})=>t(e,d)))})).then((t=>{if(!t.ok)return t.json().then((r=>{const{status:s,statusText:n}=t,{message:o,details:a}=r.error,c=`${o}. ${a?a.join(" "):""}`.trim();throw new h(c,`HTTP ${s} ${n}`,r,e,i)})).catch((r=>{if("ArcGISRequestError"===r.name)throw r;const{status:s,statusText:n}=t;throw new h(n,`HTTP ${s}`,t,e,i)}));if(a)return t;switch(l.f){case"json":case"geojson":return t.json();case"html":case"text":return t.text();default:return t.blob()}})).then((t=>{if("json"!==l.f&&"geojson"!==l.f||a)return t;{const r=O(t,_,0,i,u);if(t&&/\/sharing\/rest\/(accounts|portals)\/self/i.test(e)&&Array.isArray(t.authorizedCrossOriginNoCorsDomains)&&g(t.authorizedCrossOriginNoCorsDomains),u){const t=e.toLowerCase().split(/\/rest(\/admin)?\/services\//)[0];i.authentication.federatedServers[t]={token:[],expires:new Date(Date.now()+864e5)},u=null}return r}}))}function A(e,t={params:{f:"json"}}){const{request:r}=t,s=function(e,t){var r={};for(var s in e)Object.prototype.hasOwnProperty.call(e,s)&&t.indexOf(s)<0&&(r[s]=e[s]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var n=0;for(s=Object.getOwnPropertySymbols(e);n<s.length;n++)t.indexOf(s[n])<0&&Object.prototype.propertyIsEnumerable.call(e,s[n])&&(r[s[n]]=e[s[n]])}return r}(t,["request"]);return r?r(e,s):R(e,s).catch((e=>e instanceof _&&t.authentication&&"string"!=typeof t.authentication&&t.authentication.canRefresh&&t.authentication.refreshCredentials?e.retry((()=>t.authentication.refreshCredentials()),1):Promise.reject(e)))}var b,I;e.ArcGISTokenRequestErrorCodes=void 0,(b=e.ArcGISTokenRequestErrorCodes||(e.ArcGISTokenRequestErrorCodes={})).TOKEN_REFRESH_FAILED="TOKEN_REFRESH_FAILED",b.GENERATE_TOKEN_FOR_SERVER_FAILED="GENERATE_TOKEN_FOR_SERVER_FAILED",b.REFRESH_TOKEN_EXCHANGE_FAILED="REFRESH_TOKEN_EXCHANGE_FAILED",b.NOT_FEDERATED="NOT_FEDERATED",b.UNKNOWN_ERROR_CODE="UNKNOWN_ERROR_CODE";class v extends Error{constructor(t="UNKNOWN_ERROR",r=e.ArcGISTokenRequestErrorCodes.UNKNOWN_ERROR_CODE,s,n,i){super(t);const o=new.target.prototype;Object.setPrototypeOf(this,o),this.name="ArcGISTokenRequestError",this.message=`${r}: ${t}`,this.originalMessage=t,this.code=r,this.response=s,this.url=n,this.options=i}}class y extends Error{constructor(){super("The user has denied your authorization request.");const e=new.target.prototype;Object.setPrototypeOf(this,e),this.name="ArcGISAccessDeniedError"}}class C extends Error{constructor(e="Unknown error",t){super(e);const r=new.target.prototype;Object.setPrototypeOf(this,r),this.name="ArcGISJobError",this.message=`${t.status}: ${e}`,this.status=t.status,this.id=t.id,this.jobInfo=t}}function U(e){return"string"!=typeof e||"/"===(e=e.trim())[e.length-1]&&(e=e.slice(0,-1)),e}function x(e){const[t,r]=e.split("=");return{key:decodeURIComponent(t),value:decodeURIComponent(r)}}function D(e){return!e||e.length<=0?{}:e.replace(/^#/,"").replace(/^\?/,"").split("&").reduce(((e,t)=>{const{key:r,value:s}=x(t);return e[r]=s,e}),{})}e.ErrorTypes=void 0,(I=e.ErrorTypes||(e.ErrorTypes={})).ArcGISRequestError="ArcGISRequestError",I.ArcGISAuthError="ArcGISAuthError",I.ArcGISAccessDeniedError="ArcGISAccessDeniedError",I.ArcGISTokenRequestError="ArcGISTokenRequestError";const j=3e5;function N(e,t){const r=t;return r.rawResponse=!1,A(e,r).then((e=>{if("token"in e&&"expires"in e)return{token:e.token,username:t.params.username,expires:new Date(e.expires)};const r={token:e.access_token,username:e.username,expires:new Date(Date.now()+1e3*e.expires_in-j),ssl:!0===e.ssl};return e.refresh_token&&(r.refreshToken=e.refresh_token),e.refresh_token_expires_in&&(r.refreshTokenExpires=new Date(Date.now()+1e3*e.refresh_token_expires_in-j)),r}))}class P{constructor(e){this.portal=e.portal?U(e.portal):"https://www.arcgis.com/sharing/rest",this._username=e.username}get username(){return this._username?this._username:this._user&&this._user.username?this._user.username:void 0}getUsername(){return this.username?Promise.resolve(this.username):this.getUser().then((e=>e.username))}getUser(e){if(this._pendingUserRequest)return this._pendingUserRequest;if(this._user)return Promise.resolve(this._user);{const t=`${this.portal}/community/self`,r=Object.assign(Object.assign({httpMethod:"GET",authentication:this},e),{rawResponse:!1});return this._pendingUserRequest=A(t,r).then((e=>(this._user=e,this._pendingUserRequest=null,e))),this._pendingUserRequest}}clearCachedUserInfo(){this._user=null}}class J extends P{constructor(e){super(e),this.clientId=e.clientId,this.clientSecret=e.clientSecret,this.token=e.token,this.expires=e.expires,this.portal=e.portal||"https://www.arcgis.com/sharing/rest",this.duration=e.duration||7200}static fromCredentials(e){return new J(e)}getToken(e,t){return this.token&&this.expires&&this.expires.getTime()>Date.now()?Promise.resolve(this.token):(this._pendingTokenRequest||(this._pendingTokenRequest=this.refreshToken(t)),this._pendingTokenRequest)}refreshToken(t){const r=Object.assign({params:{client_id:this.clientId,client_secret:this.clientSecret,grant_type:"client_credentials",expiration:this.duration}},t);return N(`${this.portal}/oauth2/token/`,r).then((e=>(this._pendingTokenRequest=null,this.setToken(e.token),this.setExpires(e.expires),e.token))).catch((t=>{throw new v(t.message,e.ArcGISTokenRequestErrorCodes.TOKEN_REFRESH_FAILED,t.response,t.url,t.options)}))}refreshCredentials(){return this.clearCachedUserInfo(),this.refreshToken().then((()=>this))}toJSON(){return{type:"ApplicationCredentialsManager",clientId:this.clientId,clientSecret:this.clientSecret,token:this.token,expires:this.expires,portal:this.portal,duration:this.duration}}serialize(){return JSON.stringify(this.toJSON())}static deserialize(e){const t=JSON.parse(e);return new J({clientId:t.clientId,clientSecret:t.clientSecret,token:t.token,expires:new Date(t.expires),portal:t.portal,duration:t.duration})}setToken(e){this.token=e}setExpires(e){this.expires=e}}class q extends P{constructor(e){super(e),this.portal="https://www.arcgis.com/sharing/rest",this.key=e.key}static fromKey(e){return new q("string"==typeof e?{key:e}:e)}get token(){return this.key}getToken(e){return Promise.resolve(this.key)}toJSON(){return{type:"ApiKeyManager",token:this.key,username:this.username,portal:this.portal}}serialize(){return JSON.stringify(this)}static deserialize(e){const t=JSON.parse(e);return new q({key:t.token,username:t.username,portal:t.portal})}}const M=/^https?:\/\/(\S+)\.arcgis\.com.+/;function F(e){return M.test(e)}function G(e){if(!M.test(e))return e;switch($(e)){case"dev":return"https://devext.arcgis.com/sharing/rest";case"qa":return"https://qaext.arcgis.com/sharing/rest";default:return"https://www.arcgis.com/sharing/rest"}}function $(e){if(!M.test(e))return null;const t=e.match(M)[1].split(".").pop();return t.includes("dev")?"dev":t.includes("qa")?"qa":"production"}function z(e,t){const r=U(G(t)).replace(/https?:\/\//,""),s=U(e).replace(/https?:\/\//,"");return new RegExp(s,"i").test(r)}function L(e,t){const r=F(e),s=F(t),n=$(e),i=$(t);return!(!r||!s||n!==i)}function H(e,t,r="https://www.arcgis.com/sharing/rest"){return A(`${r}/oauth2/validateAppAccess`,{method:"POST",params:{f:"json",client_id:t,token:e}})}function B(e){const t=`${U(e.portal||"https://www.arcgis.com/sharing/rest")}/oauth2/revokeToken/`,r=e.token,s=e.clientId;delete e.portal,delete e.clientId,delete e.token;const n=Object.assign(Object.assign({},e),{httpMethod:"POST",params:{client_id:s,auth_token:r}});return A(t,n).then((e=>{if(!e.success)throw new h("Unable to revoke token",500,e,t,n);return e}))}function K(e,t=window){return!t&&window&&(t=window),t.btoa(String.fromCharCode.apply(null,e)).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}function W(e){!e&&window&&(e=window);return K(e.crypto.getRandomValues(new Uint8Array(32)))}class X extends P{constructor(e){if(super(e),this.clientId=e.clientId,this._refreshToken=e.refreshToken,this._refreshTokenExpires=e.refreshTokenExpires,this.password=e.password,this._token=e.token,this._tokenExpires=e.tokenExpires,this.portal=e.portal?U(e.portal):"https://www.arcgis.com/sharing/rest",this.ssl=e.ssl,this.provider=e.provider||"arcgis",this.tokenDuration=e.tokenDuration||20160,this.redirectUri=e.redirectUri,this.server=e.server,this.referer=e.referer,this.federatedServers={},this.trustedDomains=[],e.server){const t=this.getServerRootUrl(e.server);this.federatedServers[t]={token:e.token,expires:e.tokenExpires}}this._pendingTokenRequests={}}get token(){return this._token}get tokenExpires(){return this._tokenExpires}get refreshToken(){return this._refreshToken}get refreshTokenExpires(){return this._refreshTokenExpires}get canRefresh(){return!(!this.username||!this.password)||!!(this.clientId&&this.refreshToken&&this.redirectUri)}static beginOAuth2(e,t){!t&&window&&(t=window);const{portal:r,provider:s,clientId:i,expiration:o,redirectUri:a,popup:c,popupWindowFeatures:h,locale:l,params:u,style:d,pkce:p,state:g}=Object.assign({portal:"https://www.arcgis.com/sharing/rest",provider:"arcgis",expiration:20160,popup:!0,popupWindowFeatures:"height=400,width=600,menubar=no,location=yes,resizable=yes,scrollbars=yes,status=yes",locale:"",style:"",pkce:!0},e),f=g||W(t),m=`ARCGIS_REST_JS_AUTH_STATE_${i}`;t.localStorage.setItem(m,f);let E=`${U(r)}/oauth2/authorize`;const w={client_id:i,response_type:p?"code":"token",expiration:o,redirect_uri:a,state:JSON.stringify({id:f,originalUrl:t.location.href}),locale:l,style:d};let k;if("arcgis"!==s&&(E=`${U(r)}/oauth2/social/authorize`,w.socialLoginProviderName=s,w.autoAccountCreateForSocial=!0),p){const e=W(t),r=`ARCGIS_REST_JS_CODE_VERIFIER_${i}`;t.localStorage.setItem(r,e),k=function(e,t=window){if(!t&&window&&(t=window),e&&t.isSecureContext&&t.crypto&&t.crypto.subtle){const r=(new t.TextEncoder).encode(e);return t.crypto.subtle.digest("SHA-256",r).then((e=>K(new Uint8Array(e),t)))}return Promise.resolve(null)}(e,t).then((function(t){w.code_challenge_method=t?"S256":"plain",w.code_challenge=t||e}))}else k=Promise.resolve();return k.then((()=>(E=`${E}?${n(w)}`,u&&(E=`${E}&${n(u)}`),c?new Promise(((e,s)=>{t.addEventListener(`arcgis-rest-js-popup-auth-${i}`,(t=>{if("access_denied"===t.detail.error){const e=new y;return s(e),e}if(t.detail.errorMessage){const e=new _(t.detail.errorMessage,t.detail.error);return s(e),e}e(new X({clientId:i,portal:r,ssl:t.detail.ssl,token:t.detail.token,tokenExpires:t.detail.expires,username:t.detail.username,refreshToken:t.detail.refreshToken,refreshTokenExpires:t.detail.refreshTokenExpires,redirectUri:a}))}),{once:!0}),t.open(E,"oauth-window",h),t.dispatchEvent(new CustomEvent("arcgis-rest-js-popup-auth-start"))})):void(t.location.href=E))))}static completeOAuth2(e,t){!t&&window&&(t=window);const{portal:r,clientId:s,popup:n,pkce:i,redirectUri:o}=Object.assign({portal:"https://www.arcgis.com/sharing/rest",popup:!0,pkce:!0},e),a=`ARCGIS_REST_JS_AUTH_STATE_${s}`,c=t.localStorage.getItem(a),h=D(i?t.location.search.replace(/^\?/,""):t.location.hash.replace(/^#/,"")),l=h&&h.state?JSON.parse(h.state):void 0;function u(e,r,i){return t.localStorage.removeItem(a),n&&t.opener?(t.opener.dispatchEvent(new CustomEvent(`arcgis-rest-js-popup-auth-${s}`,{detail:{error:r,errorMessage:e}})),void t.close()):(i&&t.history.replaceState(t.history.state,"",i),"access_denied"===r?Promise.reject(new y):Promise.reject(new _(e,r)))}function d(e,i){return t.localStorage.removeItem(a),n&&t.opener?(t.opener.dispatchEvent(new CustomEvent(`arcgis-rest-js-popup-auth-${s}`,{detail:Object.assign({},e)})),void t.close()):(t.history.replaceState(t.history.state,"",i),new X({clientId:s,portal:r,ssl:e.ssl,token:e.token,tokenExpires:e.expires,username:e.username,refreshToken:e.refreshToken,refreshTokenExpires:e.refreshTokenExpires,redirectUri:o||location.href.replace(location.search,"")}))}if(!c||!l)return u("No authentication state was found, call `ArcGISIdentityManager.beginOAuth2(...)` to start the authentication process.","no-auth-state");if(l.id!==c)return u("Saved client state did not match server sent state.","mismatched-auth-state");if(h.error){const e=h.error;return u(h.error_description||"Unknown error",e,l.originalUrl)}if(i&&h.code){const e=U(`${r}/oauth2/token/`),n=`ARCGIS_REST_JS_CODE_VERIFIER_${s}`,i=t.localStorage.getItem(n);return t.localStorage.removeItem(n),N(e,{httpMethod:"POST",params:{client_id:s,code_verifier:i,grant_type:"authorization_code",redirect_uri:o||location.href.replace(location.search,""),code:h.code}}).then((e=>d(Object.assign(Object.assign({},e),l),l.originalUrl))).catch((e=>u(e.originalMessage,e.code,l.originalUrl)))}return!i&&h.access_token?Promise.resolve(d(Object.assign({token:h.access_token,expires:new Date(Date.now()+1e3*parseInt(h.expires_in,10)),ssl:"true"===h.ssl,username:h.username},l),l.originalUrl)):u("Unknown error","oauth-error",l.originalUrl)}static fromParent(e,t){let r;return!t&&window&&(t=window),new Promise(((s,n)=>{r=e=>{if(e.source===t.parent&&e.data)try{return s(X.parentMessageHandler(e))}catch(e){return n(e)}},t.addEventListener("message",r,!1),t.parent.postMessage({type:"arcgis:auth:requestCredential"},e)})).then((e=>(t.removeEventListener("message",r,!1),e)))}static authorize(e,t){const{portal:r,clientId:s,expiration:i,redirectUri:o,state:a}=Object.assign({portal:"https://arcgis.com/sharing/rest",expiration:20160},e),c={client_id:s,expiration:i,response_type:"code",redirect_uri:o};a&&(c.state=a);const h=`${r}/oauth2/authorize?${n(c)}`;t.writeHead(301,{Location:h}),t.end()}static exchangeAuthorizationCode(t,r){const{portal:s,clientId:n,redirectUri:i}=Object.assign({portal:"https://www.arcgis.com/sharing/rest"},t);return N(`${s}/oauth2/token`,{params:{grant_type:"authorization_code",client_id:n,redirect_uri:i,code:r}}).then((e=>new X({clientId:n,portal:s,ssl:e.ssl,redirectUri:i,refreshToken:e.refreshToken,refreshTokenExpires:e.refreshTokenExpires,token:e.token,tokenExpires:e.expires,username:e.username}))).catch((t=>{throw new v(t.message,e.ArcGISTokenRequestErrorCodes.REFRESH_TOKEN_EXCHANGE_FAILED,t.response,t.url,t.options)}))}static deserialize(e){const t=JSON.parse(e);return new X({clientId:t.clientId,refreshToken:t.refreshToken,refreshTokenExpires:t.refreshTokenExpires?new Date(t.refreshTokenExpires):void 0,username:t.username,password:t.password,token:t.token,tokenExpires:t.tokenExpires?new Date(t.tokenExpires):void 0,portal:t.portal,ssl:t.ssl,tokenDuration:t.tokenDuration,redirectUri:t.redirectUri,server:t.server})}static fromCredential(e,t){const r=void 0===e.ssl||e.ssl,s=e.expires||Date.now()+72e5;return t.hasServer?new X({server:e.server,ssl:r,token:e.token,username:e.userId,tokenExpires:new Date(s)}):new X({portal:U(e.server.includes("sharing/rest")?e.server:e.server+"/sharing/rest"),ssl:r,token:e.token,username:e.userId,tokenExpires:new Date(s)})}static parentMessageHandler(e){if("arcgis:auth:credential"===e.data.type){const t=e.data.credential;return function(e){return"string"==typeof e.userId||"number"==typeof e.expires}(t)?X.fromCredential(t,{hasPortal:!0,hasServer:!1,server:t.server}):new X(t)}if("arcgis:auth:error"===e.data.type){const t=new Error(e.data.error.message);throw t.name=e.data.error.name,t}throw new Error("Unknown message type.")}static destroy(e){return B({clientId:e.clientId,portal:e.portal,token:e.refreshToken||e.token})}static fromToken(e){const t=new X(e);return t.getUser().then((()=>t))}static signIn(e){const t=new X(e);return t.getUser().then((()=>t))}toCredential(){return{expires:this.tokenExpires.getTime(),server:this.server||this.portal,ssl:this.ssl,token:this.token,userId:this.username}}getPortal(e){if(this._pendingPortalRequest)return this._pendingPortalRequest;if(this._portalInfo)return Promise.resolve(this._portalInfo);{const t=`${this.portal}/portals/self`,r=Object.assign(Object.assign({httpMethod:"GET",authentication:this},e),{rawResponse:!1});return this._pendingPortalRequest=A(t,r).then((e=>(this._portalInfo=e,this._pendingPortalRequest=null,e))),this._pendingPortalRequest}}getToken(e,t){return L(this.portal,e)||new RegExp(this.portal,"i").test(e)?this.getFreshToken(t):this.getTokenForServer(e,t)}validateAppAccess(e){return this.getToken(this.portal).then((t=>H(t,e)))}toJSON(){return{type:"ArcGISIdentityManager",clientId:this.clientId,refreshToken:this.refreshToken,refreshTokenExpires:this.refreshTokenExpires||void 0,username:this.username,password:this.password,token:this.token,tokenExpires:this.tokenExpires||void 0,portal:this.portal,ssl:this.ssl,tokenDuration:this.tokenDuration,redirectUri:this.redirectUri,server:this.server}}serialize(){return JSON.stringify(this)}enablePostMessageAuth(e,t){!t&&window&&(t=window),this._hostHandler=this.createPostMessageHandler(e),t.addEventListener("message",this._hostHandler,!1)}disablePostMessageAuth(e){!e&&window&&(e=window),e.removeEventListener("message",this._hostHandler,!1)}refreshCredentials(t){return this.clearCachedUserInfo(),this.username&&this.password?this.refreshWithUsernameAndPassword(t):this.clientId&&this.refreshToken?this.refreshWithRefreshToken():Promise.reject(new v("Unable to refresh token. No refresh token or password present.",e.ArcGISTokenRequestErrorCodes.TOKEN_REFRESH_FAILED))}getServerRootUrl(e){const[t]=U(e).split(/\/rest(\/admin)?\/services(?:\/|#|\?|$)/),[r,s,n]=t.match(/(https?:\/\/)(.+)/),[i,...o]=n.split("/");return`${s}${i.toLowerCase()}/${o.join("/")}`}getDomainCredentials(e){return this.trustedDomains&&this.trustedDomains.length?(e=e.toLowerCase(),this.trustedDomains.some((t=>e.startsWith(t.toLowerCase())))?"include":"same-origin"):"same-origin"}signOut(){return X.destroy(this)}createPostMessageHandler(e){return t=>{const r=e.indexOf(t.origin)>-1,s="arcgis:auth:requestCredential"===t.data.type,n=this.tokenExpires.getTime()>Date.now();if(r&&s){let e={};if(n){const t=this.toCredential();t.server=t.server.replace("/sharing/rest",""),e={type:"arcgis:auth:credential",credential:t}}else e={type:"arcgis:auth:error",error:{name:"tokenExpiredError",message:"Token was expired, and not returned to the child application"}};t.source.postMessage(e,t.origin)}}}getTokenForServer(t,r){const s=this.getServerRootUrl(t),n=this.federatedServers[s];return n&&n.expires&&n.expires.getTime()>Date.now()?Promise.resolve(n.token):(this._pendingTokenRequests[s]||(this._pendingTokenRequests[s]=this.fetchAuthorizedDomains().then((()=>A(`${s}/rest/info`,{credentials:this.getDomainCredentials(t)}).then((n=>{if(n.owningSystemUrl){if(z(n.owningSystemUrl,this.portal))return A(`${n.owningSystemUrl}/sharing/rest/info`,r);throw new v(`${t} is not federated with ${this.portal}.`,e.ArcGISTokenRequestErrorCodes.NOT_FEDERATED)}if(n.authInfo&&void 0!==this.federatedServers[s])return Promise.resolve({authInfo:n.authInfo});throw new v(`${t} is not federated with any portal and is not explicitly trusted.`,e.ArcGISTokenRequestErrorCodes.NOT_FEDERATED)})).then((e=>this.token&&this.tokenExpires.getTime()<Date.now()?this.server?this.refreshCredentials().then((()=>({token:this.token,expires:this.tokenExpires}))):this.refreshCredentials().then((()=>this.generateTokenForServer(e.authInfo.tokenServicesUrl,s))):this.generateTokenForServer(e.authInfo.tokenServicesUrl,s))).then((e=>(this.federatedServers[s]=e,delete this._pendingTokenRequests[s],e.token)))))),this._pendingTokenRequests[s])}generateTokenForServer(t,r){return A(t,{params:{token:this.token,serverUrl:r,expiration:this.tokenDuration}}).then((e=>({token:e.token,expires:new Date(e.expires-3e5)}))).catch((t=>{throw new v(t.message,e.ArcGISTokenRequestErrorCodes.GENERATE_TOKEN_FOR_SERVER_FAILED,t.response,t.url,t.options)}))}getFreshToken(e){return this.token&&!this.tokenExpires||this.token&&this.tokenExpires&&this.tokenExpires.getTime()>Date.now()?Promise.resolve(this.token):(this._pendingTokenRequests[this.portal]||(this._pendingTokenRequests[this.portal]=this.refreshCredentials(e).then((()=>(this._pendingTokenRequests[this.portal]=null,this.token)))),this._pendingTokenRequests[this.portal])}refreshWithUsernameAndPassword(t){const r={username:this.username,password:this.password,expiration:this.tokenDuration,client:"referer",referer:this.referer?this.referer:"undefined"!=typeof window&&void 0!==window.document&&window.location&&window.location.origin?window.location.origin:S};return(this.server?A(`${this.getServerRootUrl(this.server)}/rest/info`).then((e=>A(e.authInfo.tokenServicesUrl,Object.assign({params:r},t)))):A(`${this.portal}/generateToken`,Object.assign({params:r},t))).then((e=>(this.updateToken(e.token,new Date(e.expires)),this))).catch((t=>{throw new v(t.message,e.ArcGISTokenRequestErrorCodes.TOKEN_REFRESH_FAILED,t.response,t.url,t.options)}))}refreshWithRefreshToken(t){if(this.refreshToken&&this.refreshTokenExpires&&this.refreshTokenExpires.getTime()-864e5<Date.now())return this.exchangeRefreshToken(t);const r=Object.assign({params:{client_id:this.clientId,refresh_token:this.refreshToken,grant_type:"refresh_token"}},t);return N(`${this.portal}/oauth2/token`,r).then((e=>this.updateToken(e.token,e.expires))).catch((t=>{throw new v(t.message,e.ArcGISTokenRequestErrorCodes.TOKEN_REFRESH_FAILED,t.response,t.url,t.options)}))}updateToken(e,t){return this._token=e,this._tokenExpires=t,this}exchangeRefreshToken(t){const r=Object.assign({params:{client_id:this.clientId,refresh_token:this.refreshToken,redirect_uri:this.redirectUri,grant_type:"exchange_refresh_token"}},t);return N(`${this.portal}/oauth2/token`,r).then((e=>(this._token=e.token,this._tokenExpires=e.expires,this._refreshToken=e.refreshToken,this._refreshTokenExpires=e.refreshTokenExpires,this))).catch((t=>{throw new v(t.message,e.ArcGISTokenRequestErrorCodes.REFRESH_TOKEN_EXCHANGE_FAILED,t.response,t.url,t.options)}))}fetchAuthorizedDomains(){return this.server||!this.portal?Promise.resolve(this):this.getPortal().then((e=>(e.authorizedCrossOriginDomains&&e.authorizedCrossOriginDomains.length&&(this.trustedDomains=e.authorizedCrossOriginDomains.filter((e=>!e.startsWith("http://"))).map((e=>e.startsWith("https://")?e:`https://${e}`))),this)))}}function V(e){return console.log("DEPRECATED:, 'UserSession' is deprecated. Use 'ArcGISIdentityManager' instead."),new X(e)}var Q;V.beginOAuth2=function(...e){return console.warn("DEPRECATED:, 'UserSession.beginOAuth2' is deprecated. Use 'ArcGISIdentityManager.beginOAuth2' instead."),X.beginOAuth2(...e)},V.completeOAuth2=function(...e){return console.warn("DEPRECATED:, 'UserSession.completeOAuth2()' is deprecated. Use 'ArcGISIdentityManager.completeOAuth2()' instead."),e.length<=1&&console.warn("WARNING:, 'UserSession.completeOAuth2()' is now async and returns a promise the resolves to an instance of `ArcGISIdentityManager`."),X.completeOAuth2(...e)},V.fromParent=function(...e){return console.warn("DEPRECATED:, 'UserSession.fromParent' is deprecated. Use 'ArcGISIdentityManager.fromParent' instead."),X.fromParent(...e)},V.authorize=function(...e){return console.warn("DEPRECATED:, 'UserSession.authorize' is deprecated. Use 'ArcGISIdentityManager.authorize' instead."),X.authorize(...e)},V.exchangeAuthorizationCode=function(...e){return console.warn("DEPRECATED:, 'UserSession.exchangeAuthorizationCode' is deprecated. Use 'ArcGISIdentityManager.exchangeAuthorizationCode' instead."),X.exchangeAuthorizationCode(...e)},V.fromCredential=function(...e){return console.log("DEPRECATED:, 'UserSession.fromCredential' is deprecated. Use 'ArcGISIdentityManager.fromCredential' instead."),console.warn("WARNING:, 'UserSession.fromCredential' now requires a `ServerInfo` object from the JS API as a second parameter."),X.fromCredential(...e)},V.deserialize=function(...e){return console.log("DEPRECATED:, 'UserSession.deserialize' is deprecated. Use 'ArcGISIdentityManager.deserialize' instead."),X.deserialize(...e)},e.JOB_STATUSES=void 0,(Q=e.JOB_STATUSES||(e.JOB_STATUSES={})).Success="Succeeded",Q.Failed="Failed",Q.Waiting="Waiting",Q.Cancelled="Cancelled",Q.Cancelling="Cancelling",Q.New="New",Q.Executing="Executing",Q.Submitted="Submitted",Q.Failure="Failure",Q.TimedOut="TimedOut",Q.Error="Error",Q.Status="Etatus",Q.Unknown="Unknown";const Y={pollingRate:2e3,startMonitoring:!1};class Z{constructor(t){this.executePoll=async()=>{let t;try{t=await this.getJobInfo()}catch(t){return void this.emitter.emit(e.JOB_STATUSES.Error,t)}this.emitter.emit(e.JOB_STATUSES.Status,t),this.emitter.emit(t.status,t)};const{url:r,id:s,pollingRate:n,authentication:i}=Object.assign(Object.assign({},Y),t);var o;this.url=r,this.id=s,this.authentication=i,this._pollingRate=n,this.emitter={all:o=o||new Map,on:function(e,t){var r=o.get(e);r?r.push(t):o.set(e,[t])},off:function(e,t){var r=o.get(e);r&&(t?r.splice(r.indexOf(t)>>>0,1):o.set(e,[]))},emit:function(e,t){var r=o.get(e);r&&r.slice().map((function(e){e(t)})),(r=o.get("*"))&&r.slice().map((function(r){r(e,t)}))}},t.startMonitoring&&this.startEventMonitoring(n)}static deserialize(e,t){const r=Object.assign(Object.assign(Object.assign({},Y),JSON.parse(e)),t);return A(`${r.url}/jobs/${r.id}`,{authentication:r.authentication}).then((()=>new Z(r)))}static fromExistingJob(e){const t=Object.assign(Object.assign({},Y),e);return A(`${U(t.url.replace(/\/submitJob\/?/,""))}/jobs/${t.id}`,{authentication:t.authentication}).then((()=>new Z(t)))}static submitJob(e){const{url:t,params:r,authentication:s,pollingRate:n,startMonitoring:i}=Object.assign(Object.assign({},Y),e),o=function(e){return Object.keys(e).reduce(((t,r)=>{const s=e[r],n=s.constructor.name;return t[r]="Array"===n?JSON.stringify(s):s,t}),{})}(r),a=U(t.replace(/\/submitJob\/?/,""));return A(a+"/submitJob",{params:o,authentication:s}).then((e=>new Z({url:a,authentication:s,id:e.jobId,startMonitoring:i,pollingRate:n})))}get jobUrl(){return`${this.url}/jobs/${this.id}`}get isMonitoring(){return!!this.setIntervalHandler}get pollingRate(){return this._pollingRate}set pollingRate(e){this.stopEventMonitoring(),this.startEventMonitoring(e)}getJobInfo(){return A(this.jobUrl,{authentication:this.authentication}).then((t=>{const r=Object.assign({id:t.jobId,status:void 0},t);switch(delete r.jobId,delete r.jobStatus,t.jobStatus){case"esriJobCancelled":r.status=e.JOB_STATUSES.Cancelled;break;case"esriJobCancelling":r.status=e.JOB_STATUSES.Cancelling;break;case"esriJobNew":r.status=e.JOB_STATUSES.New;break;case"esriJobWaiting":r.status=e.JOB_STATUSES.Waiting;break;case"esriJobExecuting":r.status=e.JOB_STATUSES.Executing;break;case"esriJobSubmitted":r.status=e.JOB_STATUSES.Submitted;break;case"esriJobTimedOut":r.status=e.JOB_STATUSES.TimedOut;break;case"esriJobFailed":r.status=e.JOB_STATUSES.Failed;break;case"expectedFailure":r.status=e.JOB_STATUSES.Failure;break;case"esriJobSucceeded":r.status=e.JOB_STATUSES.Success}return r}))}on(e,t){this.emitter.on(e,t)}once(e,t){const r=s=>{this.emitter.off(e,r),t(s)};this.emitter.on(e,r),t.__arcgis_job_once_original_function__=r}off(e,t){t.__arcgis_job_once_original_function__?this.emitter.off(e,t.__arcgis_job_once_original_function__):this.emitter.off(e,t)}async getResult(e){return this.waitForCompletion().then((t=>A(this.jobUrl+"/"+t.results[e].paramUrl,{authentication:this.authentication})))}toJSON(){return{id:this.id,url:this.url,startMonitoring:this.isMonitoring,pollingRate:this.pollingRate}}serialize(){return JSON.stringify(this)}async waitForCompletion(){const t=await this.getJobInfo();return t.status===e.JOB_STATUSES.Success?Promise.resolve(t):t.status===e.JOB_STATUSES.Cancelling||t.status===e.JOB_STATUSES.Cancelled||t.status===e.JOB_STATUSES.Failed||t.status===e.JOB_STATUSES.Failure||t.status===e.JOB_STATUSES.TimedOut?(this.stopInternalEventMonitoring(),Promise.reject(new C("Job cancelled or failed.",t))):new Promise(((t,r)=>{this.startInternalEventMonitoring(),this.once(e.JOB_STATUSES.Cancelled,(e=>{this.stopInternalEventMonitoring(),r(new C("Job cancelled.",e))})),this.once(e.JOB_STATUSES.TimedOut,(e=>{this.stopInternalEventMonitoring(),r(new C("Job timed out.",e))})),this.once(e.JOB_STATUSES.Failed,(e=>{this.stopInternalEventMonitoring(),r(new C("Job failed.",e))})),this.once(e.JOB_STATUSES.Success,(e=>{this.stopInternalEventMonitoring(),t(e)}))}))}async getAllResults(){return this.waitForCompletion().then((e=>{const t=Object.keys(e.results),r=t.map((t=>A(this.jobUrl+"/"+e.results[t].paramUrl,{authentication:this.authentication}).then((e=>e))));return Promise.all(r).then((e=>t.reduce(((r,s,n)=>(r[t[n]]=e[n],r)),{})))}))}cancelJob(){return A(this.jobUrl+"/cancel",{authentication:this.authentication,params:{id:this.id,returnMessages:!1}}).then((e=>(this.emitter.emit("cancelled",e),e)))}startInternalEventMonitoring(e=Y.pollingRate){this._pollingRate=e,this.isMonitoring||(this.setIntervalHandler=setInterval(this.executePoll,this.pollingRate))}stopInternalEventMonitoring(){this.isMonitoring&&!this.didUserEnableMonitoring&&clearTimeout(this.setIntervalHandler)}startEventMonitoring(e=Y.pollingRate){this._pollingRate=e,this.didUserEnableMonitoring=!0,this.isMonitoring||(this.setIntervalHandler=setInterval(this.executePoll,this.pollingRate))}stopEventMonitoring(){this.isMonitoring&&this.didUserEnableMonitoring&&clearTimeout(this.setIntervalHandler)}}e.ApiKey=function(e){return console.log("DEPRECATED:, 'ApiKey' is deprecated. Use 'ApiKeyManager' instead."),new q(e)},e.ApiKeyManager=q,e.ApplicationCredentialsManager=J,e.ApplicationSession=function(e){return console.log("DEPRECATED: 'ApplicationSession' is deprecated. Use 'ApplicationCredentialsManager' instead."),new J(e)},e.ArcGISAccessDeniedError=y,e.ArcGISAuthError=_,e.ArcGISIdentityManager=X,e.ArcGISJobError=C,e.ArcGISRequestError=h,e.ArcGISTokenRequestError=v,e.Blob=a,e.File=o,e.FormData=i,e.Job=Z,e.NODEJS_DEFAULT_REFERER_HEADER=S,e.UserSession=V,e.appendCustomParams=function(e,t,r){const s=Object.assign(Object.assign({params:{}},r),e);return s.params=t.reduce(((t,r)=>((e[r]||"boolean"==typeof e[r]||"number"==typeof e[r]&&0===e[r])&&(t[r]=e[r]),t)),s.params),["params","httpMethod","rawResponse","authentication","hideToken","portal","credentials","maxUrlLength","headers","signal","suppressWarnings","request"].reduce(((e,t)=>(s[t]&&(e[t]=s[t]),e)),{})},e.canUseOnlineToken=L,e.checkForErrors=O,e.cleanUrl=U,e.decodeParam=x,e.decodeQueryString=D,e.encodeFormData=c,e.encodeParam=s,e.encodeQueryString=n,e.exchangeToken=function(e,t,r="https://www.arcgis.com/sharing/rest"){return A(`${r}/oauth2/exchangeToken`,{method:"POST",params:{f:"json",client_id:t,token:e}}).then((e=>e.token))},e.fetchToken=N,e.getDefaultRequestOptions=T,e.getFetch=k,e.getOnlineEnvironment=$,e.getRegisteredNoCorsDomains=function(){return d.noCorsDomains},e.internalRequest=R,e.isFederated=z,e.isNoCorsDomain=m,e.isNoCorsRequestRequired=E,e.isOnline=F,e.normalizeOnlinePortalUrl=G,e.platformSelf=function(e,t,r="https://www.arcgis.com/sharing/rest"){return A(`${r}/oauth2/platformSelf?f=json`,{method:"POST",headers:{"X-Esri-Auth-Client-Id":e,"X-Esri-Auth-Redirect-Uri":t},params:{f:"json"}})},e.processParams=r,e.registerNoCorsDomains=g,e.request=A,e.requiresFormData=t,e.revokeToken=B,e.sendNoCorsRequest=p,e.setDefaultRequestOptions=function(e,t){e.authentication&&!t&&w("You should not set `authentication` as a default in a shared environment such as a web server which will process multiple users requests. You can call `setDefaultRequestOptions` with `true` as a second argument to disable this warning."),globalThis.DEFAULT_ARCGIS_REQUEST_OPTIONS=e},e.validateAppAccess=H,e.warn=w,e.withOptions=function(e,t){return(...r)=>{const s="object"==typeof r[r.length-1]?Object.assign(Object.assign({},e),r.pop()):e;return t(...r,s)}},Object.defineProperty(e,"__esModule",{value:!0})})); //# sourceMappingURL=request.umd.min.js.map