@nebula.js/stardust
Version:
Product and framework agnostic integration API for Qlik's Associative Engine
9 lines (7 loc) • 39.1 kB
JavaScript
/*
* @nebula.js/stardust v6.5.0
* Copyright (c) 2026 QlikTech International AB
* Released under the MIT license.
*/
System.register(["./index-BL5koipF.js"],(function(e){"use strict";var t,o,n,r;return{setters:[function(e){t=e.s,o=e.i,n=e.c,r=e.a}],execute:function(){e({determineAuthType:yt,getAccessToken:async function(e){const t=(await $t({method:"GET",...e})).headers?.Authorization;if(0===t.indexOf("Bearer "))return t.substring(7);throw new Error("Unknown format of authorization header returned by remote auth module")},getDefaultHostConfig:xt,getRestCallAuthParams:$t,getWebResourceAuthParams:At,getWebSocketAuthParams:vt,handleAuthenticationError:Pt,isHostCrossOrigin:kt,isWindows:bt,normalizeHostConfig:Et,onFatalAuthError:Wt,onPageRedirectRequested:Lt,onPageRedirectStarted:Nt,registerAuthModule:St,registerHostConfig:It,serializeHostConfig:Ut,setDefaultHostConfig:_t,toValidLocationUrl:Ct,toValidWebsocketLocationUrl:Tt,unregisterHostConfig:qt});const s=["authType","autoRedirect","authRedirectUserConfirmation","embedRuntimeUrl","host","onAuthFailed"],a=["apikey","oauth2","cookie","windowscookie","reference","anonymous"],i=async(e={})=>{const t=Ht(e.hostConfig);if("mock-backend-rest-recorder"===t.authType)return t.recordGetPlatform();if("mock-backend"===t?.authType)return t.mockGetPlatform();if("noauth"===t?.authType)return f({isUnknown:!0});let n=o()?window.QlikMain?.PRODUCT_INFO:void 0;if(!n){const{data:t,status:o}=await u(e);if(n=t,404===o)return f({isUnknown:!0});if(!n||o<=399&&o>=300)return f({isQSE:!0,isWindows:!0})}const r=(n.composition?.deploymentType||"").toLowerCase();return"qliksenseserver"===r?f({isQSE:!0,isWindows:!0,meta:l(n)}):"qliksensedesktop"===r?f({isQSD:!0,isWindows:!0,meta:l(n)}):"qliksensemobile"===r?f({isQSE:!0,isWindows:!0,meta:l(n)}):"cloud-console"===r?f({isCloud:!0,isCloudConsole:!0,meta:l(n)}):"fedramp"===n.composition?.provider?f({isCloud:!0,isQCG:!0,meta:l(n)}):f({isCloud:!0,isQCS:!0,meta:l(n)})},c={};const u=async({hostConfig:e,noCache:t}={})=>{const o=`${Ct(e)}/resources/autogenerated/product-info.json`;try{if(!(o in c)){const e={};globalThis.QlikMain?.resourceNeedsCredentials(o)&&(e.credentials="include"),c[o]=fetch(o,e).then((async e=>e.ok?{data:await e.json(),status:e.status}:{data:void 0,status:e.status}))}const e=await c[o];return(e.status>=400||!e.data)&&delete c[o],e}catch{return delete c[o],{data:void 0,status:500}}finally{t&&delete c[o]}},l=e=>{const t=e.externalUrls;if(!t)return;const o=e.composition?.productName??"Qlik",n=e.composition?.releaseLabel||"-",r="-"===n?o:`${o} (${n})`;return{productId:e.composition?.senseId??"qlik",productLabel:r,version:e.composition?.version,urls:{personalHelpBaseUrl:t.personalHelpBaseUrl,personalUpgradeBase:t.personalUpgradeBase,personalUpgradeUrl:t.personalUpgradeUrl,serverHelpBaseUrl:t.serverHelpBaseUrl,qlikWebPageUrl:t.qlikWebPageUrl}}},f=e=>({isCloud:!1,isQCS:!1,isQCG:!1,isCloudConsole:!1,isWindows:!1,isQSE:!1,isQSD:!1,isUnknown:!1,...e}),d="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_-",h="0123456789abcdef";function g(e,t){const o=new Uint8Array(t);globalThis.crypto.getRandomValues(o);let n="";for(let r=0;r<t;r++)n+=e[o[r]%e.length];return n}function p(e){return g(d,e)}const m={},w=new Map;function y(e){const t=n(e)||{};return t.host&&(t.host=Ct(t)),o()&&Ct(t)===window.location.origin&&delete t.host,t.authType&&a.includes(t.authType)&&delete t.authType,t}function k(e,t){if("function"!=typeof t)return t}function b(e){const o=t(y(Ht(e)));return JSON.stringify(o,k)}const C=new Map;function T(e,t){const o=t?.reference||null;if(o&&!C.has(o))throw new ut(`Host config with reference "${o}" is not registered. Please register it before using it.`);C.has(e)&&console.warn(`registerHostConfig: Host config with name "${e}" is already registered. Overwriting.`),C.set(e,t)}function v(e){return C.get(e)}function A(){return v("default")||{}}const P=new Map;function $(e){const t=b(e);let o=P.get(t);return o||(o={redirectRequestedListeners:new Set,redirectStartedListeners:new Set},P.set(t,o)),o}function S(e){const t=$(e),o=t.redirectRequestedListeners.size>0||e.authRedirectUserConfirmation;return e.autoRedirect||!o?Promise.resolve():"function"==typeof e.authRedirectUserConfirmation?e.authRedirectUserConfirmation().catch((()=>{})):new Promise((e=>{const o=()=>{for(const e of t.redirectStartedListeners)try{e()}catch(e){console.warn(e)}e()};for(const e of t.redirectRequestedListeners)try{e({proceed:o})}catch(e){console.warn(e)}}))}const _="qlik-qmfe-api";function I(e){let t=e.clientId+(e.scope?`_${e.scope}`:"_user_default");return e.subject&&(t+=`_${e.subject}`),e.userId&&(t+=`_${e.userId}`),t}function q(e){return`${e.accessCode}_${e.clientId}`}const U={};var E,j;function O(e,t,o){localStorage.setItem(`${_}-${e}-${t}`,o)}function R(e,t,o){sessionStorage.setItem(`${_}-${e}-${t}`,o)}function H(e,t){return localStorage.getItem(`${_}-${e}-${t}`)||void 0}function x(e,t){return sessionStorage.getItem(`${_}-${e}-${t}`)||void 0}function W(e,t){t.forEach((t=>localStorage.removeItem(`${_}-${e}-${t}`)))}function L(e,t){t.forEach((t=>sessionStorage.removeItem(`${_}-${e}-${t}`)))}function N(e,t){const o=`${_}-${e}-${t}`,n=sessionStorage.getItem(o)||void 0;return sessionStorage.removeItem(o),n}async function B(e,t){if(!e.clientId)throw new ut('A host config with authType set to "oauth2" has to also provide a clientId');return D(I(e),t,e.noCache,e.accessTokenStorage)}async function D(e,t,n,r){if(n)return t();const s=o(),a=U[e]||(s?function(e,t){let o,n;if("local"===t?(o=H(e,"access-token"),n=H(e,"refresh-token")):"session"===t&&(o=x(e,"access-token"),n=x(e,"refresh-token")),o)return{accessToken:o,refreshToken:n}}(e,r):void 0);if(a)return U[e]=a,Promise.resolve(a);const i=t();if(U[e]=i,s){const t=await i;"local"===r&&t?(t.accessToken&&O(e,"access-token",t.accessToken),t.refreshToken&&O(e,"refresh-token",t.refreshToken)):"session"===r&&t&&(t.accessToken&&R(e,"access-token",t.accessToken),t.refreshToken&&R(e,"refresh-token",t.refreshToken))}return i}function z(e){const t=I(e);delete U[t],o()&&(W(t,["access-token","refresh-token"]),L(t,["access-token","refresh-token"]))}function M(e){if("string"==typeof e){const t=function(e){return globalThis[e]}(e);if(!t)throw new Error(`No such function: ${e}`);return t}return e}function Q(e){if(e.errors)throw new dt(e.errors)}function F(e){const t=Object.keys(e);return t.sort(),t.map((t=>`${t}=${e[t]}`)).join("&")}async function K(e){const t=(new TextEncoder).encode(e),n=await globalThis.crypto.subtle.digest("SHA-256",t);return function(e){let t="";if(o()){const o=String.fromCharCode.apply(null,e);t=btoa(o)}else{if(!r())throw new Error("Environment not supported for oauth2 authentication");t=Buffer.from(e).toString("base64")}return t}(Array.from(new Uint8Array(n))).replaceAll(/\+/g,"-").replaceAll(/\//g,"_").replace(/=+$/,"")}async function J(e){const t=e.clientId||"",o=Ct(e),n=p(128),r=p(43),s=await K(n),a=e.redirectUri||globalThis.location.href,i=I(e);z(e),R(i,"state",r),R(i,"verifier",n),R(i,"href",globalThis.location.href),R("","client-in-progress",i);const c=`${o}/oauth/authorize?${F({response_type:"code",client_id:t,redirect_uri:a,scope:e.scope||"user_default",state:r,code_challenge:s,code_challenge_method:"S256"})}`;globalThis.location.replace(c)}async function G(e,t,o,n){try{const r=await(await fetch(`${Ct(e)}/oauth/token`,{method:"POST",credentials:"include",mode:"cors",headers:{"content-type":"application/json"},redirect:"follow",body:JSON.stringify({grant_type:"authorization_code",scope:e.scope||"user_default",...t?{code:t}:{},redirect_uri:n||globalThis.location.href,...o?{code_verifier:o}:{},client_id:e.clientId})})).json();return Q(r),{accessToken:r.access_token,refreshToken:r.refresh_token,errors:r.errors}}catch(e){return console.error(e),new Promise((()=>{}))}}function V(e,t,o,n,r){const s={client_id:e,client_secret:t,scope:o};return n?{...s,grant_type:"urn:qlik:oauth:user-impersonation",user_lookup:{field:"subject",value:n}}:r?{...s,grant_type:"urn:qlik:oauth:user-impersonation",user_lookup:{field:"userId",value:r}}:{...s,grant_type:"client_credentials"}}async function X(e){const{clientId:t,clientSecret:o}=e;if(!t||!o)throw new ut('A host config with authType set to "oauth2" has to provide a clientId and a clientSecret');return await B(e,(async()=>{if(!e.clientId||!e.clientSecret)throw new ut('A host config with authType set to "oauth2" has to provide a clientId and a clientSecret');return async function(e,t,o,n="user_default",r,s){const a=await(await fetch(`${e}/oauth/token`,{method:"POST",mode:"cors",headers:{"content-type":"application/json"},body:JSON.stringify(V(t,o,n,r,s))})).json();return{accessToken:a.access_token,refreshToken:a.refresh_token,errors:a.errors}}(Ct(e),e.clientId,e.clientSecret,e.scope,e.subject,e.userId)}))}async function Y(e){const{clientId:t}=e;if(!t)throw new ut('A host config with authType set to "oauth2" has to also provide a clientId');const o=await B(e,(async()=>{if(e.getAccessToken)try{return{accessToken:"string"==typeof e.getAccessToken?await(t=e.getAccessToken,globalThis[t])():await e.getAccessToken(),refreshToken:void 0,errors:void 0}}catch{return oe("Could not fetch access token using custom function")}var t;if(e.performInteractiveLogin){let t;try{const o=p(128),n=p(43),{code:r,state:s}=function(e){if("string"==typeof e){const t=new URLSearchParams(new URL(e).search);return{code:t.get("code")||"",state:t.get("state")||""}}return e}(await M(e.performInteractiveLogin)({getLoginUrl:async({redirectUri:r})=>(t=r,async function(e,t,o,n){const r=e.clientId||"",s=Ct(e),a=await K(n);return`${s}/oauth/authorize?${F({response_type:"code",client_id:r,redirect_uri:t,scope:e.scope||"user_default",state:o,code_challenge:a,code_challenge_method:"S256"})}`}(e,r,n,o))}));return t?n!==s?oe("State returned by custom interactive login function does not match original"):r?await G(e,r,o,t):oe("No code found in response from custom interactive login function"):oe("No redirect uri provided")}catch(e){return{accessToken:void 0,refreshToken:void 0,errors:[{code:"",status:401,title:"Could not perform custom interactive login",detail:`${e}`}]}}}const o=I(e),n=N(o,"code"),r=N(o,"verifier");if(n&&r){const t=await G(e,n,r,e.redirectUri);if(t)return t}}));return o||(e.performInteractiveLogin||(await S(e),J(e)),new Promise((()=>{})))}E="clearAllAccessTokens",j=()=>{console.log("Clearing tokens",U),Object.keys(U).forEach((e=>{console.log("Clearing access tokens for",e),W(e,["access-token","refresh-token"]),L(e,["access-token","refresh-token"])})),function(){for(const e in U)delete U[e]}()},(globalThis.location?.origin.startsWith("https://localhost:")||globalThis.location?.origin?.endsWith("qlik-stage.com"))&&globalThis.QlikMain&&(void 0===globalThis.QlikMain.INTERNAL__DO_NOT_USE.qix&&(globalThis.QlikMain.INTERNAL__DO_NOT_USE.qix={}),globalThis.QlikMain.INTERNAL__DO_NOT_USE.qix[E]=j);let Z=Promise.resolve("");async function ee(e){if(r()){const t=await X(e);return t?(Q(t),t.accessToken||""):""}return o()&&(Z=Z.then((async()=>{const t=await Y(e);return t?(Q(t),t.accessToken||""):""}))),Z}async function te(e){const t=await async function(e){return U[I(e)]}(e);if(z(e),t&&t.refreshToken&&e.clientSecret){const o=await B(e,(async()=>{if(!t||!t.refreshToken||!e.clientSecret)throw new Error("Trying to refresh tokens without refreshToken or clientSecret");return async function(e,t,o){const n=await(await fetch(`${e}/oauth/token`,{method:"POST",mode:"cors",headers:{"content-type":"application/json"},body:JSON.stringify({grant_type:"refresh_token",refresh_token:t,client_secret:o})})).json();return{accessToken:n.access_token,refreshToken:n.refresh_token,errors:n.errors}}(Ct(e),t.refreshToken,e.clientSecret)}));o&&Q(o)}}function oe(e){return{accessToken:void 0,refreshToken:void 0,errors:[{code:"",status:401,title:e,detail:""}]}}async function ne(e,t,o){const n=await fetch(`${Ct(e)}/oauth/token`,{method:"POST",credentials:"include",mode:"cors",headers:{"content-type":"application/json"},redirect:"follow",body:JSON.stringify({subject_token:t,subject_token_type:"urn:ietf:params:oauth:token-type:access_token",grant_type:"urn:ietf:params:oauth:grant-type:token-exchange",purpose:o,redirect_uri:globalThis.location?.href,client_id:e.clientId})});if(200!==n.status)throw await async function(e){const t=await e.text();try{return new dt(JSON.parse(t).errors)}catch{return new dt([{code:"unknown",status:e.status,detail:t,title:"Unknown authentication error"}])}}(n);return(await n.json()).access_token}async function re(e,t){try{return await t()}catch(o){const{retry:n}=await ie({hostConfig:e});if(n)return t();throw o}}function se(){const e=Math.floor(Date.now()/1e3).toString(16);return`${e}${t=40-e.length,g(h,t)}`;var t}async function ae(e){const{accessCode:t,clientId:n}=e;if(!t||!n)throw new ut('A host config with authType set to "anonymous" has to provide both an accessCode and clientId');const r=await async function(e,t){if(!e.accessCode)throw new ut('A host config with authType set to "anonymous" has to also provide an accessCode');return D(q(e),t,!1,void 0)}(e,(async()=>async function(e,t,o,n){const r=await(await fetch(`${e}/oauth/token/anonymous-embed`,{method:"POST",mode:"cors",headers:{"content-type":"application/json"},body:JSON.stringify({eac:t,client_id:o,grant_type:"urn:qlik:oauth:anonymous-embed",tracking_code:n})})).json();return{accessToken:r.access_token,refreshToken:r.refresh_token,errors:r.errors}}(Ct(e),t,n,await async function(e){let t;if(o()){const o=q(e);t=H(o,"tracking-code"),t||(t=se()),O(o,"tracking-code",t)}else t=se();return t}(e))));if(!r)return"";if(r.errors)throw new dt(r.errors);return r.accessToken?r.accessToken:""}async function ie({hostConfig:e}){return function(e){const t=q(e);delete U[t],o()&&(W(t,["access-token","refresh-token"]),L(t,["access-token","refresh-token"]))}(e),{preventDefault:!1,retry:!0}}var ce={requiredProps:["clientId","accessCode"],optionalProps:[],getRestCallAuthParams:async function({hostConfig:e}){return{headers:{Authorization:`Bearer ${await ae(e)}`},queryParams:{},credentials:"omit"}},getWebSocketAuthParams:async function({hostConfig:e}){return r()?{headers:{Authorization:`Bearer ${await ae(e)}`}}:{queryParams:{accessToken:await re(e,(async()=>ne(e,await ae(e),"websocket")))}}},getWebResourceAuthParams:async function({hostConfig:e}){return{queryParams:{accessToken:await re(e,(async()=>ne(e,await ae(e),"websocket")))}}},handleAuthenticationError:ie};var ue={requiredProps:["apiKey"],optionalProps:[],getRestCallAuthParams:function({hostConfig:e}){return Promise.resolve({headers:{Authorization:`Bearer ${e?.apiKey}`},queryParams:{},credentials:"omit"})},getWebSocketAuthParams:async function({hostConfig:e}){if(o())throw new Error("Not supported in browser environment");return Promise.resolve({headers:{Authorization:`Bearer ${e?.apiKey}`}})},handleAuthenticationError:function(){return Promise.resolve({})}},le=class extends Error{status;headers;data;constructor(e,t,o,n){super(e),this.status=t,this.headers=o,this.data=n,this.stack=ge(this.stack)}},fe=class extends Error{contentType;data;constructor(e,t,o){super(e),this.contentType=t,this.data=o,this.stack=ge(this.stack)}};const de=/^.+\/qmfe-api(?:\.js)?:(\d+)(?::\d+)?$/gim,he=e=>{const t=e.match(de);return Boolean(t&&t.length>0)};function ge(e){if(!e)return e;const t=[],o=e.split("\n");o.reverse();for(const e of o){if(he(e))break;t.unshift(e)}return t.join("\n")}function pe(e){return e?Object.entries(e).map((e=>{const[,t]=e;if(void 0!==t)return e.map((e=>encodeURIComponent(decodeURIComponent(e)))).join("=")})).filter(Boolean).join("&"):""}const me={};globalThis.__API_CACHE__DO_NOT_USE_OR_YOU_WILL_BE_FIRED=me;let we=6e5;const ye=".global";function ke(e,t,o){if(e?.noCache)return!1;if(!t||void 0===t.value)return!1;if(e?.useCacheIfAfter)return e.useCacheIfAfter.getTime()<=t.lastPulled;const n=Date.now()-t.lastPulled;return"number"==typeof e?.maxCacheAge?n<=e?.maxCacheAge:n<o}function be({url:e,query:t,headers:o,serializedHostConfig:n}){let r=e;if(t&&Object.keys(t).length>0){const o=pe(t);r=e.includes("?")?r.concat(`&${o}`):r.concat(`?${o}`)}return o&&Object.keys(o).length>0&&(r=r.concat(`+headers=${JSON.stringify(o)}`)),n&&"{}"!==n&&(r=r.concat(`+host-config=${n}`)),r}function Ce(e){const t=[];return me[e]&&t.push(me[e]),me[ye]&&t.push(me[ye]),t}function Te(e,t){const o=ve(t);for(const t in e){const n=ve(t);(o.startsWith(n)||n.startsWith(o))&&delete e[t]}}function ve(e){const t=e.indexOf("?");if(t>=0)return e.substring(0,t);const o=e.indexOf("+headers=");if(o>=0)return e.substring(0,o);const n=e.indexOf("+host-config=");return n>=0?e.substring(0,n):e}function Ae(e){return null==e||e&&(e instanceof Blob||e instanceof Object&&"[object Blob]"===e.toString())||e&&e instanceof ReadableStream||"string"==typeof e?e:JSON.parse(JSON.stringify(e))}function Pe(e){return e.then((e=>{const t={data:Ae(e.data),headers:e.headers,status:e.status};return e.next&&(t.next=e.next),e.prev&&(t.prev=e.prev),t}))}function $e(e,t){return"get"!==e&&"GET"!==e&&(!t.endsWith("/api/v1/licenses/allotments")||"post"!==e&&"POST"!==e)}function Se(e){return e instanceof Error?e.cause?e.message?`${e.message} - ${Se(e.cause)}`:Se(e.cause):e.message:String(e)}async function _e(e,t,o,n,r,s,a,i){const{body:c,contentTypeHeader:u,requestOptions:l}=function(e,t){if(!e)return{body:null,contentTypeHeader:{},requestOptions:{}};const o={},n={};let r=null;switch(t){case"":case"application/json":o["Content-Type"]="application/json",r=JSON.stringify(e);break;case"multipart/form-data":r=function(e){const t="multipart/form-data";if("object"!=typeof e)throw new fe(`Cannot encode ${typeof e} as ${t}, body should be an object.`,t,e);if(Array.isArray(e))throw new fe(`Cannot encode ${typeof e} as ${t}, body should be an object.`,t,e);if(e instanceof FormData)return e;const o=new FormData;return Object.entries(e).forEach((n=>{const[r,s]=n;switch(typeof s){case"boolean":case"number":case"string":o.set(r,`${s}`);break;case"object":if(s instanceof Blob)o.set(r,s);else if(s instanceof Uint8Array){const e=new Blob([s],{type:"application/octet-stream"});o.set(r,e)}else{const e=JSON.stringify(s),t=new Blob([e],{type:"application/json"});o.set(r,t,"")}break;default:throw new fe(`Cannot encode multipart-field "${r}" with value of type ${typeof s}, values must be objects, strings, numbers or boolean.`,t,e)}})),o}(e);break;case"application/octet-stream":o["Content-Type"]=t,n.duplex="half",r=e;break;case"text/plain":if("string"!=typeof e)throw new fe(`Cannot send ${typeof e} as ${t}, body should be a string.`,t,e);o["Content-Type"]=t,r=e;break;default:throw new fe(`Unsupported content-type "${t}", supported are: application/json, multipart/form-data, application/octet-stream and text/plain`,t,e)}return{body:r,contentTypeHeader:o,requestOptions:n}}(o,n??""),f={...u,...s,...r?.headers,...je()};!f["User-Agent"]&&i&&(f["User-Agent"]=i);const d={method:e,credentials:a,mode:"cors",headers:f,redirect:await bt(r?.hostConfig)?"manual":"follow",keepalive:r?.keepalive,progress:r?.progress,body:c,...l};let h,g;if(r?.signal)d.signal=r.signal;else if(r?.timeoutMs&&r.timeoutMs>0){const e=new AbortController;h=setTimeout((()=>{e.abort()}),r.timeoutMs),d.signal=e.signal}return g=r?.progress?await async function(e,{method:t,headers:o,credentials:n,keepalive:r,body:s,signal:a,progress:i}){const c=new XMLHttpRequest;let u,l;const f=new Promise(((e,t)=>{u=e,l=t}));if(c.open(t||"GET",e),"object"!=typeof o)throw Error("malformed headers",o);for(const[e,t]of Object.entries(o))c.setRequestHeader(e,t);r&&c.setRequestHeader("Connection","keep-alive"),a&&a.addEventListener("abort",(()=>{c.abort(),l()})),c.withCredentials="include"===n,i?.onUpload&&(c.upload.onprogress=e=>{const{loaded:t,total:o,lengthComputable:n}=e;i.onUpload?.({loaded:t,total:n?o:void 0})}),i?.onDownload&&(c.onprogress=e=>{const{loaded:t,total:o,lengthComputable:n}=e;i.onDownload?.({loaded:t,total:n?o:void 0})}),c.onloadend=()=>{const{status:e}=c,t={};for(const e of c.getAllResponseHeaders().split("\r\n")){const[o,n]=e.split(":",2);o&&n&&(t[o]=n)}c.response?u(new Response(c.response,{status:e,headers:t})):u(new Response(void 0,{status:e,headers:t}))};try{const e=s;c.send(e)}catch(e){return Promise.reject(new le(Se(e),0,new Headers,{}))}return f}(t,d):await async function(e,t){try{return await fetch(e,t)}catch(e){return Promise.reject(new le(Se(e),0,new Headers,{}))}}(t,d),h&&clearTimeout(h),await async function(e,t){let o;const n=e.headers.get("content-type")?.split(";")[0],r=e.headers.get("content-disposition")?.split(";");if(r&&"attachment"===r[0]){let t="";for(let e=1;e<r.length;e++){const o=r[e].trim();if(0===o.indexOf("filename")){const e=o.indexOf('"'),n=o.lastIndexOf('"');t=o.slice(e+1,n)}}o=Oe(await e.blob(),t)}else switch(n){case"image/png":case"image/jpeg":case"image/x-icon":case"application/offset+octet-stream":case"application/octet-stream":case"application/zip":case"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":case"application/pdf":o=Oe(await e.blob());break;case"text/event-stream":o=e.body;break;default:try{o=await e.text(),o=JSON.parse(o)}catch{}}const{status:s,statusText:a,headers:i}=e,c=`request to '${t}' failed with status ${s} ${a}.`;if(s>=300)throw new le(c,s,i,o);if(0===s)throw new le(c,302,i,o);return{status:s,headers:i,data:o}}(g,t)}async function Ie({method:e,pathTemplate:t,pathVariables:o,query:n,options:r}){const s=Ct(r?.hostConfig),{headers:a,queryParams:i,credentials:c}=await $t({hostConfig:r?.hostConfig,method:e}),u=s+function(e,t){let o=e;return t&&Object.keys(t).forEach((e=>{o=o.replace(`{${e}}`,t[e])})),o}(t,o),l=function(e,t){return""!==t?`${e}?${t}`:e}(u,pe({...n,...i})),f=Ut(r?.hostConfig);return{completeUrl:l,authHeaders:a,credentials:c,cacheKey:be({url:u,query:n,headers:r?.headers,serializedHostConfig:f})}}function qe(e,t){return Ue(e,t,(async()=>{const{authHeaders:o,credentials:n}=await Ie(t);return Ue(e,{...t,authHeaders:o,credentials:n,options:{...t.options,noCache:!0}},void 0)}))}function Ue(e,t,o){const{method:n,completeUrl:r,body:s,options:a,authHeaders:i,credentials:c,cacheKey:u,contentType:l,userAgent:f}=t,d={method:n,completeUrl:r,cacheKey:u,options:a},h=function(e,t){if(t?.options?.noCache)return;const{method:o,completeUrl:n,cacheKey:r}=t,s=Ce(e);if($e(o,n))return;let a;for(const e of s)if(r in e){if(a=e[r],a&&void 0!==a.value&&ke(t?.options,a,we))break;a=void 0}if(!a)return;return a.lastHit=new Date,a.hitCount+=1,a.accessedPaths.add(globalThis.location?globalThis.location.pathname:"node"),Pe(a.value)}(e,d);if(h)return h;const g=_e(n,r,s,l,a,i,c,f),p=async function(e,t,o){try{return await t}catch(t){const n=t,r=n.data;if(401===n.status||403===n.status&&"CSRF-TOKEN-2"===r?.code||(301===n.status||302===n.status)&&await bt(e)){if(globalThis.loggingOut)return Ee();const{retry:t,preventDefault:s}=await Pt({hostConfig:e,status:n.status,headers:n.headers,errorBody:r,canRetry:!!o});if(t&&o)return o();if(s)return Ee()}throw t}}(a?.hostConfig,g,o);return function(e,t,o){me[e]||(me[e]={});const{cacheKey:n}=t;if($e(t.method,t.completeUrl))return o.then((t=>{const o=Ce(e);for(const e of o)Te(e,n);return t}));const r=me[e],s=o.catch((e=>(delete r[n],Promise.reject(e))));return r[n]={lastPulled:Date.now(),value:s,lastHit:null,hitCount:0,accessedPaths:new Set},Pe(s)}(e,d,function(e,{method:t,body:o,options:n,authHeaders:r,credentials:s,value:a}){return a.then((a=>{const i=a.data;if(!i)return a;const c=Ut(n?.hostConfig),u=i.links?.prev?.href,l=i.links?.next?.href;return u&&(a.prev=a=>qe(e,{method:t,completeUrl:u,body:o,options:a||n,authHeaders:r,credentials:s,cacheKey:be({url:u,headers:n?.headers,serializedHostConfig:c})})),l&&(a.next=a=>qe(e,{method:t,completeUrl:l,body:o,options:a||n,authHeaders:r,credentials:s,cacheKey:be({url:l,headers:n?.headers,serializedHostConfig:c})})),a}))}(e,{...t,value:p}))}function Ee(){return new Promise((()=>{}))}function je(){if(!o())return{};const e=localStorage.getItem("qmfe-api-service-overrides-header");return e?{"X-Qlik-Overrides":e}:{}}function Oe(e,t){const o=e;return o.download=t?(o=t)=>Re(e,o):t=>Re(e,t),o}async function Re(e,t){if(o()){const o=document.createElement("a"),n=window.URL.createObjectURL(e);o.href=n,o.download=t,o.click(),window.URL.revokeObjectURL(n)}else{const{writeFileSync:o}=await Promise.resolve().then((function(){return Dt})),n=await e.arrayBuffer();o(t,new Uint8Array(n))}}const He="qmfe-api/latest";async function xe(e,t,n){return(Bt.getInterceptors()||[]).reduce(((e,t)=>o=>t(o,e)),(t=>async function(e,t){if("mock-backend-rest-recorder"===t.options?.hostConfig?.authType)return Promise.resolve(t.options?.hostConfig.recordInvokeFetch(t));if("mock-backend"===t.options?.hostConfig?.authType)return Promise.resolve(t.options?.hostConfig.mockInvokeFetch(t));if(function(e){const t=Ht(e);if(kt(t)){if(0===Object.keys(t).length)throw new ut("a host config must be provided when making a cross domain request");if(!t.host)throw new ut("A 'host' property must be set in host config when making a cross domain request")}}(t.options?.hostConfig),"noauth"===t.options?.hostConfig?.authType)return console.info("API call blocked: noauth auth module is configured, no API calls should be made"),{status:204,headers:new Headers,data:null};let n;n=t?.userAgent?t.userAgent:o()?`${window.navigator.userAgent} ${He}`:He;const{completeUrl:r,authHeaders:s,credentials:a,cacheKey:i}=await Ie(t);return qe(e,{...t,method:t.method.toUpperCase(),completeUrl:r,authHeaders:s,credentials:a,cacheKey:i,userAgent:n})}(e,t)))(t)}function We(e){!function(e){me[e]={}}(e)}const Le="qlik-csrf-token";async function Ne(e,t){const o=Ct(e);let n;n=await bt(e)?"/qps/csrftoken":"/api/v1/csrf-token";const r=async()=>{try{const o=(await xe("csrf-token",{method:"get",pathTemplate:n,options:{hostConfig:e,maxCacheAge:5e3,noCache:t}})).headers.get(Le);return o||""}catch(e){if(404===e.status)return"";throw e}};return t?(Be[o]=r(),Be[o]):(Be[o]=Be[o]||r(),Be[o])}const Be={};function De(e){return!1===e.crossSiteCookies?"same-origin":kt(e)?"include":"same-origin"}async function ze(e){if("function"==typeof e)return e();if("string"==typeof e){const t=function(e){return globalThis[e]}(e);if("function"!=typeof t)throw new Error(`getAccessToken function "${e}" not found on globalThis. Please make sure it is defined.`);return t()}}var Me={requiredProps:[],optionalProps:["webIntegrationId","crossSiteCookies","anonymousMode"],getRestCallAuthParams:async function({hostConfig:e,method:t}){const o={};var n;return"get"!==(n=t)&&"GET"!==n&&(o["qlik-csrf-token"]=await Ne(e)),e.webIntegrationId&&(o["qlik-web-integration-id"]=e.webIntegrationId),{headers:o,queryParams:{},credentials:De(e)}},getWebSocketAuthParams:async function({hostConfig:e}){if(r()){const t={};return t["qlik-csrf-token"]=await Ne(e),e.webIntegrationId&&(t["qlik-web-integration-id"]=e.webIntegrationId),{headers:t}}const t={"qlik-csrf-token":await Ne(e,!0)};return e.webIntegrationId&&(t["qlik-web-integration-id"]=e.webIntegrationId),{queryParams:t}},handleAuthenticationError:async function({hostConfig:e,status:t}){if(function(e){const t=Ct(e);delete Be[t],We("csrf-token")}(e),403===t)return{preventDefault:!1,retry:!0};const o=e.webIntegrationId?`qlik-web-integration-id=${e?.webIntegrationId}&`:"",n=Ct(e);return await S(e),globalThis.location.replace(`${n}/login?${o}returnto=${encodeURIComponent(globalThis.location.href)}`),{preventDefault:!0}}};var Qe={requiredProps:[],optionalProps:[],getRestCallAuthParams:function(e){return Promise.resolve({headers:{},queryParams:{},credentials:"same-origin"})},getWebSocketAuthParams:function(e){return Promise.resolve({queryParams:{}})},handleAuthenticationError:function(e){return Promise.resolve({})}};var Fe={requiredProps:[],optionalProps:[],getRestCallAuthParams:function(){return Promise.resolve({headers:{},queryParams:{},credentials:"same-origin"})},getWebSocketAuthParams:function(){return Promise.resolve({queryParams:{}})},handleAuthenticationError:function(){return Promise.resolve({})}};async function Ke(e,t){try{return await t()}catch(o){const{retry:n}=await Je({hostConfig:e});if(n)return t();throw o}}async function Je({hostConfig:e}){return e.getAccessToken?(z(e),{preventDefault:!1,retry:!0}):o()?e.performInteractiveLogin?(z(e),{retry:!0}):(await S(e),J(e),{preventDefault:!0}):(await te(e),{preventDefault:!1,retry:!0})}o()&&function(){const e=new URLSearchParams(globalThis.location.search),t=e.get("code")||void 0,o=e.get("state")||void 0;if(e.get("error")){const t=document.createElement("pre");t.innerText=`<code>${JSON.stringify({error:e.get("error"),error_code:e.get("error_code"),error_description:e.get("error_description"),error_detail:e.get("error_detail"),error_uri:e.get("error_uri")})}</code>`,document.body.prepend(t)}const n=N("","client-in-progress");if(n&&t&&o){const e=N(n,"state"),r=N(n,"href");e&&e===o&&r&&(R(n,"code",t),r!==globalThis.location.href&&globalThis.location.replace(r))}}();var Ge={requiredProps:["clientId"],optionalProps:["clientSecret","redirectUri","accessTokenStorage","scope","subject","userId","noCache","getAccessToken","performInteractiveLogin"],getRestCallAuthParams:async function({hostConfig:e}){return{headers:{Authorization:`Bearer ${await ee(e)}`},queryParams:{},credentials:"omit"}},getWebSocketAuthParams:async function({hostConfig:e}){return r()?{headers:{Authorization:`Bearer ${await ee(e)}`}}:{queryParams:{accessToken:await Ke(e,(async()=>ne(e,await ee(e),"websocket")))}}},getWebResourceAuthParams:async function({hostConfig:e}){return{queryParams:{accessToken:await Ke(e,(async()=>ne(e,await ee(e),"webresource")))}}},handleAuthenticationError:Je};var Ve={requiredProps:["reference"],optionalProps:[],getRestCallAuthParams:function(){throw new Error("getRestCallAuthParams should never be called for reference auth module")},getWebSocketAuthParams:function(){throw new Error("getWebSocketAuthParams should never be called for reference auth module")},handleAuthenticationError:function(){throw new Error("handleAuthenticationError should never be called for reference auth module")}};const Xe={};function Ye(e){const t=Ct(e);return Xe[t]=Xe[t]||function(){let e="";for(let t=0;t<16;t+=1){const t=Math.floor(62*Math.random());e+=t<10?t:t>9&&t<36?String.fromCharCode(t+55):String.fromCharCode(t+61)}return e}(),Xe[t]}var Ze={requiredProps:[],optionalProps:["loginUri","crossSiteCookies","getAccessToken"],getRestCallAuthParams:async function({hostConfig:e}){return{headers:{"X-Qlik-XrfKey":Ye(e)},queryParams:{xrfkey:Ye(e)},credentials:De(e)}},getWebSocketAuthParams:async function({hostConfig:e}){return{queryParams:{xrfkey:Ye(e),"qlik-csrf-token":await Ne(e,!0)}}},handleAuthenticationError:async function({hostConfig:e}){if(e.loginUri)return await S(e),globalThis.location.replace(e.loginUri.replace("{location}",encodeURIComponent(globalThis.location.href))),{preventDefault:!0};if(e.getAccessToken){const t=await ze(e.getAccessToken);if(t)return await fetch(`${Ct(e)}/qlik-embed/main.js`,{method:"GET",mode:"cors",credentials:"include",headers:{"Content-Type":"application/json",Authorization:`Bearer ${t}`}}),{retry:!0}}return{}}};const et=new Map;async function tt(e){let t=function(e){const t=Ut(e);return et.get(t)}(e);if(!t){const o=await ze(e.getAccessToken);if(!o)throw new Error("Failed to acquire access token");t=(await fetch(`${Ct(e)}/qlik-embed/main.js`,{method:"GET",mode:"cors",credentials:"include",headers:{"Content-Type":"application/json",Authorization:`Bearer ${o}`}})).headers.get("Set-Cookie")||void 0,t&&function(e,t){const o=Ut(e);et.set(o,t)}(e,t)}if(!t)throw new Error("Failed to exchange access token for cookie");return t}var ot={requiredProps:[],optionalProps:["loginUri","crossSiteCookies","getAccessToken"],validateHostConfig:e=>{if("function"==typeof e.getAccessToken)return!0;if("string"==typeof e.getAccessToken){if(!globalThis[e.getAccessToken])throw new ut('The "getAccessToken" function name provided does not exist on globalThis.');return!0}throw new ut('The "getAccessToken" property must be a function or the name of a globally defined function.')},getRestCallAuthParams:async function({hostConfig:e}){return{queryParams:{xrfkey:Ye(e)},headers:{Cookie:await tt(e),"X-Qlik-XrfKey":Ye(e)},credentials:De(e)}},getWebSocketAuthParams:async function({hostConfig:e}){return{queryParams:{"qlik-csrf-token":await Ne(e,!0)},headers:{Cookie:await tt(e)}}},handleAuthenticationError:async function({hostConfig:e}){return function(e){const t=Ut(e);et.delete(t)}(e),{retry:!0}}};const nt={};let rt=Promise.resolve(),st=!1;function at(e,t){nt[e.toLowerCase()]=t}async function it(e){const t=Ht(e),o=await ct(t);rt&&await rt;let n=function(e){return nt[e.toLowerCase()]}(o);if(n||(rt=(async()=>{n=await async function(e){const t=globalThis[e];if(t){let o;if(o="function"==typeof t?await t():t,o&&o.getRestCallAuthParams&&o.getWebSocketAuthParams&&o.handleAuthenticationError)return o;throw console.error("Not a valid auth module",o),new lt(e)}return Promise.resolve(void 0)}(o),n&&at(o,n)})(),await rt),!n)throw new lt(o);return n.validateHostConfig?n.validateHostConfig({authType:o,...t}):function(e,{requiredProps:t,optionalProps:o}){const n=[];for(const o of t)e[o]||n.push(o);if(n.length>0)throw new ut(`missing required properties in host config; '${n.join("', '")}'`);const r=[...s,...t,...o],a=[];Object.keys(e).forEach((e=>{r.includes(e)||a.push(e)})),a.length>0&&console.warn(`WARNING: unknown properties in host config; '${a.join("', '")}'`)}({authType:o,...t},{requiredProps:n.requiredProps||[],optionalProps:n.optionalProps||[]}),n}async function ct(e){return e.authType?e.authType:e.apiKey?"apikey":e.accessCode?"anonymous":e.clientId?"oauth2":e.webIntegrationId?"cookie":e.reference?"reference":await bt(e)?"windowscookie":"cookie"}st||(at("apikey",ue),at("cookie",Me),at("none",Fe),at("noauth",Qe),at("oauth2",Ge),at("anonymous",ce),o()?at("windowscookie",Ze):at("windowscookie",ot),at("reference",Ve),st=!0);var ut=e("InvalidHostConfigError",class extends Error{constructor(e){super(`Invalid host config: ${e}`),this.name="InvalidHostConfigError"}}),lt=(e("UnexpectedAuthTypeError",class extends Error{constructor(...e){super(`HostConfig is not properly configured. authType is expected to be ${e.map(((e,t)=>0===t?`"${e}"`:`or "${e}"`)).join(" ")}`),this.name="UnexpectedAuthTypeError"}}),e("InvalidAuthTypeError",class extends Error{constructor(e){super(`Not a valid auth type: ${e}, valid auth types are; '${Object.keys(nt).filter((e=>"qmfeembedframerauthmodule"!==e.toLowerCase())).join("', '")}'`),this.name="InvalidAuthTypeError"}}));function ft({title:e,detail:t,code:o,status:n}){return t?`${e} - ${t} (Status: ${n}, Code: ${o})`:`${e} (Status: ${n}, Code: ${o})`}var dt=e("AuthorizationError",class extends Error{errors;constructor(e){if("object"!=typeof e)return void super("Unknown error");const t=Array.isArray(e)?e:[e];super(t.map(ft).join(", ")),this.errors=t}});const ht=new Map;let gt,pt="";function mt(e){const t=b(e);let o=ht.get(t);return o||(o={listeners:new Set},ht.set(t,o)),o}function wt(e,t){if(e===gt&&t.message===pt)return;gt=e,pt=t.message;let o=!1;const n=mt(e);for(const e of n.listeners)try{o=!0,e(t)}catch(e){console.warn("Error in auth error listener",e)}if(e.onAuthFailed)try{o=!0,e.onAuthFailed(t)}catch(e){console.warn("Error in onAuthFailed callback",e)}o||console.error(t.message)}function yt(e){return ct(e)}function kt(e){if(!globalThis.location?.origin)return!0;const t=Ht(e);if(0===Object.keys(t).length)return!1;try{return new URL(Ct(t)).origin!==globalThis.location.origin}catch{}return!1}async function bt(e){const t=Ht(e);return"boolean"==typeof t.forceIsWindows?t.forceIsWindows:!(t.host?.endsWith(".qlik-stage.com")||t.host?.endsWith(".qlikcloud.com")||t.host?.endsWith(".qlikcloudgov.com"))&&("cookie"!==t.authType&&("windowscookie"===t.authType||(await i({hostConfig:e})).isWindows))}function Ct(e){const t=Ht(e)?.host?.trim();let o;for(o=t?t.toLowerCase().startsWith("https://")||t.toLowerCase().startsWith("http://")?t:`https://${t}`:"";"/"===o[o.length-1];)o=o.substring(0,o.length-1);return o}function Tt(e){const t=Ht(e)?.host;let o;for(o=t?t.toLowerCase().startsWith("https://")||t.toLowerCase().startsWith("http://")?t:`https://${t}`:globalThis.location.origin;"/"===o[o.length-1];)o=o.substring(0,o.length-1);return o.replace(Ot,"ws")}async function vt(e){const t=Ht(e.hostConfig);try{return await(await it(t)).getWebSocketAuthParams({...e,hostConfig:t})}catch(e){throw wt(t,Rt(e)),e}}async function At(e){const t=Ht(e.hostConfig);try{return await((await it(t)).getWebResourceAuthParams?.({...e,hostConfig:t}))||{queryParams:{}}}catch(e){throw wt(t,Rt(e)),e}}async function Pt(e){const t=Ht(e.hostConfig),o=await(await it(t)).handleAuthenticationError({...e,hostConfig:t}),n=e.canRetry&&o.retry,r=o.preventDefault;if(!n&&!r){const{status:o,errorBody:n}=e;wt(t,function({errorBody:e,status:t}){const o=e;return"object"==typeof o?.errors?{message:new dt(o?.errors).message}:{message:`HTTP ${t}`}}({status:o,errorBody:n}))}return o}async function $t(e){const t=Ht(e.hostConfig);try{return await(await it(t)).getRestCallAuthParams({...e,hostConfig:t})}catch(e){throw wt(t,Rt(e)),e}}function St(e,t){at(e,t)}function _t(e){!function(e){T("default",e||{})}(e)}function It(e,t){T(e,t)}function qt(e){!function(e){C.has(e)?C.delete(e):console.warn(`unregisterHostConfig: Host config with name "${e}" not found.`)}(e)}function Ut(e){return b(e)}function Et(e){return function(e){const t=e||m,o=b(t);let n=w.get(o);return n||(n=y(Ht(t)),w.set(o,n)),n}(e)}globalThis.loggingOut=!1;const jt=e("logout",(()=>{globalThis.loggingOut=!0,globalThis.location.href="/logout"})),Ot=/^http/;function Rt(e){return{message:e.message||"Unknown error"}}function Ht(e){if(e?.reference){const t=v(e.reference);if(!t)throw new ut(`Host config with name "${e.reference}" not found.`);return t}return e&&Object.keys(e).length>0?e:A()}function xt(){return A()}function Wt(e,t){return function(e,t){const o=mt(e);return o.listeners.add(t),()=>{o.listeners.delete(t)}}(e,t)}function Lt(e,t){return function(e,t){const o=$(e);return o.redirectRequestedListeners.add(t),()=>{o.redirectRequestedListeners.delete(t)}}(e,t)}function Nt(e,t){return function(e,t){const o=$(e);return o.redirectStartedListeners.add(t),()=>{o.redirectStartedListeners.delete(t)}}(e,t)}let Bt;Bt=function(){const e=[...Bt?.getInterceptors()||[]];return{addInterceptor:t=>(e.push(t),t),removeInterceptor:t=>{const o=e.indexOf(t);let n;return-1!==o&&(n=e.splice(o,1)[0]),n||null},getInterceptors:()=>e}}();e("default",{determineAuthType:yt,getDefaultHostConfig:xt,getRestCallAuthParams:$t,getWebResourceAuthParams:At,getWebSocketAuthParams:vt,handleAuthenticationError:Pt,isHostCrossOrigin:kt,isWindows:bt,logout:jt,registerAuthModule:St,registerHostConfig:It,serializeHostConfig:Ut,setDefaultHostConfig:_t,toValidLocationUrl:Ct,toValidWebsocketLocationUrl:Tt,unregisterHostConfig:qt,normalizeHostConfig:Et,onFatalAuthError:Wt,onPageRedirectRequested:Lt,onPageRedirectStarted:Nt});var Dt=Object.freeze({__proto__:null})}}}));
//# sourceMappingURL=auth-XusKk8IA-B-cuBRRF.js.map