@nebula.js/stardust
Version:
Product and framework agnostic integration API for Qlik's Associative Engine
9 lines (7 loc) • 40.7 kB
JavaScript
/*
* @nebula.js/stardust v7.0.0
* Copyright (c) 2026 QlikTech International AB
* Released under the MIT license.
*/
System.register(["./index-DOrtww03.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:wt,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:Ht,getRestCallAuthParams:$t,getWebResourceAuthParams:At,getWebSocketAuthParams:vt,handleAuthenticationError:Pt,isHostCrossOrigin:kt,isWindows:bt,normalizeHostConfig:Et,onFatalAuthError:Lt,onPageRedirectRequested:Wt,onPageRedirectStarted:Nt,registerAuthModule:St,registerHostConfig:It,serializeHostConfig:Ut,setDefaultHostConfig:_t,toValidLocationUrl:Tt,toValidWebsocketLocationUrl:Ct,unregisterHostConfig:qt});const s=["authType","autoRedirect","authRedirectUserConfirmation","embedRuntimeUrl","host","onAuthFailed"],a=["apikey","oauth2","cookie","windowscookie","reference","anonymous","pfx"],i=async(e={})=>{const t=xt(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=`${Tt(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});function h(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 d(e){return h("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_-",e)}const p={},g=new Map;function m(e){const t=n(e)||{};return t.host&&(t.host=Tt(t)),o()&&Tt(t)===window.location.origin&&delete t.host,t.authType&&a.includes(t.authType)&&delete t.authType,t}function y(e,t){if("function"!=typeof t)return t}function w(e){const o=t(m(xt(e)));return JSON.stringify(o,y)}const k=new Map;function b(e,t){const o=t?.reference||null;if(o&&!k.has(o))throw new ut(`Host config with reference "${o}" is not registered. Please register it before using it.`);k.has(e)&&console.warn(`registerHostConfig: Host config with name "${e}" is already registered. Overwriting.`),k.set(e,t)}function T(e){return k.get(e)}function C(){return T("default")||{}}const v=new Map;function A(e){const t=w(e);let o=v.get(t);return o||(o={redirectRequestedListeners:new Set,redirectStartedListeners:new Set},v.set(t,o)),o}function P(e){const t=A(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 S(e){let t=e.clientId+(e.scope?`_${e.scope}`:"_user_default");return e.subject&&(t+=`_${e.subject}`),e.userId&&(t+=`_${e.userId}`),t}function _(e){return`${e.accessCode}_${e.clientId}`}const I={};var q,U;function E(e,t,o){localStorage.setItem(`${$}-${e}-${t}`,o)}function O(e,t,o){sessionStorage.setItem(`${$}-${e}-${t}`,o)}function R(e,t,o,n){return e.store(`${$}-${t}-${o}`,n)}function j(e,t){return localStorage.getItem(`qlik-qmfe-api-${e}-${t}`)||void 0}function x(e,t){return sessionStorage.getItem(`qlik-qmfe-api-${e}-${t}`)||void 0}function H(e,t,o){return e.get(`${$}-${t}-${o}`)}function L(e,t){t.forEach(t=>localStorage.removeItem(`${$}-${e}-${t}`))}function W(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}function D(e){return"object"==typeof e&&null!==e&&"function"==typeof e.store&&"function"==typeof e.get&&"function"==typeof e.delete}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 z(S(e),t,e.noCache,e.accessTokenStorage)}async function z(e,t,o,n){return o?t():(I[e]=I[e]||(async()=>{let o=await async function(e,t){let o,n;if("local"===t?(o=j(e,"access-token"),n=j(e,"refresh-token")):"session"===t?(o=x(e,"access-token"),n=x(e,"refresh-token")):D(t)&&(o=await H(t,e,"access-token"),n=await H(t,e,"refresh-token")),o)return{accessToken:o,refreshToken:n}}(e,n);return o||(o=await t(),"local"===n&&o?(o.accessToken&&E(e,"access-token",o.accessToken),o.refreshToken&&E(e,"refresh-token",o.refreshToken)):"session"===n&&o?(o.accessToken&&O(e,"access-token",o.accessToken),o.refreshToken&&O(e,"refresh-token",o.refreshToken)):D(n)&&o&&(o.accessToken&&await R(n,e,"access-token",o.accessToken),o.refreshToken&&await R(n,e,"refresh-token",o.refreshToken)),o)})(),I[e])}function M(e){const t=S(e);delete I[t],o()&&(L(t,["access-token","refresh-token"]),W(t,["access-token","refresh-token"])),D(e.accessTokenStorage)&&function(e,t,o){Promise.all(o.map(o=>e.delete(`${$}-${t}-${o}`)))}(e.accessTokenStorage,t,["access-token","refresh-token"])}function Q(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 F(e){return globalThis[e]}function K(e){if(e.errors)throw new ht(e.errors)}function J(e){const t=Object.keys(e);return t.sort(),t.map(t=>`${t}=${e[t]}`).join("&")}async function G(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 X(e){const t=e.clientId||"",o=Tt(e),n=d(128),r=d(43),s=await G(n),a=e.redirectUri||globalThis.location.href,i=S(e);M(e),O(i,"state",r),O(i,"verifier",n),O(i,"href",globalThis.location.href),O("","client-in-progress",i);const c=`${o}/oauth/authorize?${J({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 V(e,t,o,n){try{const r=await(await fetch(`${Tt(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 K(r),{accessToken:r.access_token,refreshToken:r.refresh_token,errors:r.errors}}catch(e){return console.error(e),new Promise(()=>{})}}function Y(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 Z(e){const{clientId:t,clientSecret:o,performInteractiveLogin:n}=e;if(!t||!o&&!n)throw new ut('A host config with authType set to "oauth2" has to provide a clientId and a clientSecret or a performInteractiveLogin function');return await B(e,async()=>{if(e.performInteractiveLogin)return ee(e);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(Y(t,o,n,r,s))})).json();return{accessToken:a.access_token,refreshToken:a.refresh_token,errors:a.errors}}(Tt(e),e.clientId,e.clientSecret,e.scope,e.subject,e.userId)})}async function ee(e){if(!e.performInteractiveLogin)return re("No performInteractiveLogin function in hostConfig");let t;try{const o=d(128),n=d(43),{code:r,state:s}=function(e){if("string"==typeof e){let t;try{t=new URL(e)}catch{t=new URL(e,"http://localhost")}const o=new URLSearchParams(t.search);return{code:o.get("code")||"",state:o.get("state")||""}}return e}(await Q(e.performInteractiveLogin)({getLoginUrl:async({redirectUri:r})=>(t=r,async function(e,t,o,n){const r=e.clientId||"",s=Tt(e),a=await G(n);return`${s}/oauth/authorize?${J({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?re("State returned by custom interactive login function does not match original"):r?await V(e,r,o,t):re("No code found in response from custom interactive login function"):re("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:String(e)}]}}}q="clearAllAccessTokens",U=()=>{console.log("Clearing tokens",I),Object.keys(I).forEach(e=>{console.log("Clearing access tokens for",e),L(e,["access-token","refresh-token"]),W(e,["access-token","refresh-token"])}),function(){for(const e in I)delete I[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[q]=U);let te=Promise.resolve("");async function oe(e){if(r()){const t=await Z(e);return t?(K(t),t.accessToken||""):""}return o()&&(te=te.then(async()=>{const t=await async function(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 F(e.getAccessToken)():await e.getAccessToken(),refreshToken:void 0,errors:void 0}}catch{return re("Could not fetch access token using custom function")}if(e.performInteractiveLogin)return ee(e);const t=S(e),o=N(t,"code"),n=N(t,"verifier");if(o&&n){const t=await V(e,o,n,e.redirectUri);if(t)return t}});return o||(e.performInteractiveLogin||(await P(e),X(e)),new Promise(()=>{}))}(e);return t?(K(t),t.accessToken||""):""})),te}async function ne(e){const t=await async function(e){return I[S(e)]}(e);if(M(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}}(Tt(e),t.refreshToken,e.clientSecret)});o&&K(o)}}function re(e){return{accessToken:void 0,refreshToken:void 0,errors:[{code:"",status:401,title:e,detail:""}]}}async function se(e,t,o){const n=await fetch(`${Tt(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 ht(JSON.parse(t).errors)}catch{return new ht([{code:"unknown",status:e.status,detail:t,title:"Unknown authentication error"}])}}(n);return(await n.json()).access_token}async function ae(e,t){try{return await t()}catch(o){const{retry:n}=await ue({hostConfig:e});if(n)return t();throw o}}function ie(){const e=Math.floor(Date.now()/1e3).toString(16);return`${e}${t=40-e.length,h("0123456789abcdef",t)}`;var t}async function ce(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 z(_(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}}(Tt(e),t,n,await async function(e){let t;if(o()){const o=_(e);t=j(o,"tracking-code"),t||(t=ie()),E(o,"tracking-code",t)}else t=ie();return t}(e)));if(!r)return"";if(r.errors)throw new ht(r.errors);return r.accessToken?r.accessToken:""}async function ue({hostConfig:e}){return function(e){const t=_(e);delete I[t],o()&&(L(t,["access-token","refresh-token"]),W(t,["access-token","refresh-token"]))}(e),{preventDefault:!1,retry:!0}}var le={requiredProps:["clientId","accessCode"],optionalProps:[],getRestCallAuthParams:async function({hostConfig:e}){return{headers:{Authorization:`Bearer ${await ce(e)}`},queryParams:{},credentials:"omit"}},getWebSocketAuthParams:async function({hostConfig:e}){return r()?{headers:{Authorization:`Bearer ${await ce(e)}`}}:{queryParams:{accessToken:await ae(e,async()=>se(e,await ce(e),"websocket"))}}},getWebResourceAuthParams:async function({hostConfig:e}){return{queryParams:{accessToken:await ae(e,async()=>se(e,await ce(e),"websocket"))}}},handleAuthenticationError:ue};var fe={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({})}},he=class extends Error{status;headers;data;constructor(e,t,o,n){super(e),this.status=t,this.headers=o,this.data=n,this.stack=me(this.stack)}},de=class extends Error{contentType;data;constructor(e,t,o){super(e),this.contentType=t,this.data=o,this.stack=me(this.stack)}};const pe=/^.+\/qmfe-api(?:\.js)?:(\d+)(?::\d+)?$/gim,ge=e=>{const t=e.match(pe);return Boolean(t&&t.length>0)};function me(e){if(!e)return e;const t=[],o=e.split("\n");o.reverse();for(const e of o){if(ge(e))break;t.unshift(e)}return t.join("\n")}function ye(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 we={};globalThis.__API_CACHE__DO_NOT_USE_OR_YOU_WILL_BE_FIRED=we,globalThis.QlikMain?.INTERNAL__DO_NOT_USE&&(globalThis.QlikMain.INTERNAL__DO_NOT_USE.apiCache=we);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=ye(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 Te(e){const t=[];return we[e]&&t.push(we[e]),we[".global"]&&t.push(we[".global"]),t}function Ce(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;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 de(`Cannot encode ${typeof e} as ${t}, body should be an object.`,t,e);if(Array.isArray(e))throw new de(`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 de(`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 de(`Cannot send ${typeof e} as ${t}, body should be a string.`,t,e);o["Content-Type"]=t,r=e;break;default:throw new de(`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,...Oe()};!f["User-Agent"]&&i&&(f["User-Agent"]=i);const h={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 d,p;if(r?.signal)h.signal=r.signal;else if(r?.timeoutMs&&r.timeoutMs>0){const e=new AbortController;d=setTimeout(()=>{e.abort()},r.timeoutMs),h.signal=e.signal}return p=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 he(Se(e),0,new Headers,{}))}return f}(t,h):await async function(e,t){try{return await fetch(e,t)}catch(e){return Promise.reject(new he(Se(e),0,new Headers,{}))}}(t,h),d&&clearTimeout(d),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=Re(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=Re(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 he(c,s,i,o);if(0===s)throw new he(c,302,i,o);return{status:s,headers:i,data:o}}(p,t)}async function Ie({method:e,pathTemplate:t,pathVariables:o,query:n,options:r}){const s=Tt(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,ye({...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,h={method:n,completeUrl:r,cacheKey:u,options:a},d=function(e,t){if(t?.options?.noCache)return;const{method:o,completeUrl:n,cacheKey:r}=t,s=Te(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,6e5))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,h);if(d)return d;const p=_e(n,r,s,l,a,i,c,f),g=async function(e,t,o,n){try{return await o}catch(o){const r=o,s=r.data;if(401===r.status||403===r.status&&"CSRF-TOKEN-2"===s?.code||function(e,t){const o=new URL(e,"http://dummy"),n=o.pathname.endsWith("/qps/csrftoken")&&o.searchParams.has("xrfkey");return 301===t||302===t||n&&403===t}(t,r.status)&&await bt(e)){if(globalThis.loggingOut)return Ee();const{retry:t,preventDefault:o}=await Pt({hostConfig:e,status:r.status,headers:r.headers,errorBody:s,canRetry:!!n});if(t&&n)return n();if(o)return Ee()}throw o}}(a?.hostConfig,r,p,o);return function(e,t,o){we[e]||(we[e]={});const{cacheKey:n}=t;if($e(t.method,t.completeUrl))return o.then(t=>{const o=Te(e);for(const e of o)Ce(e,n);return t});const r=we[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,h,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:g}))}function Ee(){return new Promise(()=>{})}function Oe(){if(!o())return{};const e=localStorage.getItem("qmfe-api-service-overrides-header");return e?{"X-Qlik-Overrides":e}:{}}function Re(e,t){const o=e;return o.download=t?(o=t)=>je(e,o):t=>je(e,t),o}async function je(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 Bt}),n=await e.arrayBuffer();o(t,new Uint8Array(n))}}const xe="qmfe-api/latest";async function He(e,t,n){return(Dt.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=xt(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} ${xe}`:xe;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 Le(e){!function(e){we[e]={}}(e)}async function We(e,t){const o=Tt(e);let n;n=await bt(e)?"/qps/csrftoken":"/api/v1/csrf-token";const r=async()=>{try{const o=(await He("csrf-token",{method:"get",pathTemplate:n,options:{hostConfig:e,maxCacheAge:5e3,noCache:t}})).headers.get("qlik-csrf-token");return o||""}catch(e){if(404===e.status)return"";throw e}};return t?(Ne[o]=r(),Ne[o]):(Ne[o]=Ne[o]||r(),Ne[o])}const Ne={};function De(e){return!1===e.crossSiteCookies?"same-origin":kt(e)?"include":"same-origin"}async function Be(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 ze={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 We(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 We(e),e.webIntegrationId&&(t["qlik-web-integration-id"]=e.webIntegrationId),{headers:t}}const t={"qlik-csrf-token":await We(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=Tt(e);delete Ne[t],Le("csrf-token")}(e),403===t)return{preventDefault:!1,retry:!0};const o=e.webIntegrationId?`qlik-web-integration-id=${e?.webIntegrationId}&`:"",n=Tt(e);return await P(e),globalThis.location.replace(`${n}/login?${o}returnto=${encodeURIComponent(globalThis.location.href)}`),{preventDefault:!0}}};var Me={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 Qe={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 Fe(e,t){try{return await t()}catch(o){const{retry:n}=await Ke({hostConfig:e});if(n)return t();throw o}}async function Ke({hostConfig:e}){return e.getAccessToken?(M(e),{preventDefault:!1,retry:!0}):e.performInteractiveLogin?(M(e),{retry:!0}):o()?(await P(e),X(e),{preventDefault:!0}):(await ne(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&&(O(n,"code",t),r!==globalThis.location.href&&globalThis.location.replace(r))}}();var Je={requiredProps:["clientId"],optionalProps:["clientSecret","redirectUri","accessTokenStorage","scope","subject","userId","noCache","getAccessToken","performInteractiveLogin"],getRestCallAuthParams:async function({hostConfig:e}){return{headers:{Authorization:`Bearer ${await oe(e)}`},queryParams:{},credentials:"omit"}},getWebSocketAuthParams:async function({hostConfig:e}){return r()?{headers:{Authorization:`Bearer ${await oe(e)}`}}:{queryParams:{accessToken:await Fe(e,async()=>se(e,await oe(e),"websocket"))}}},getWebResourceAuthParams:async function({hostConfig:e}){return{queryParams:{accessToken:await Fe(e,async()=>se(e,await oe(e),"webresource"))}}},handleAuthenticationError:Ke};var Ge={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 Ve(e){const t=Tt(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 Ye={requiredProps:[],optionalProps:["loginUri","crossSiteCookies","getAccessToken"],getRestCallAuthParams:async function({hostConfig:e}){return{headers:{"X-Qlik-XrfKey":Ve(e)},queryParams:{xrfkey:Ve(e)},credentials:De(e)}},getWebSocketAuthParams:async function({hostConfig:e}){return{queryParams:{xrfkey:Ve(e),"qlik-csrf-token":await We(e,!0)}}},handleAuthenticationError:async function({hostConfig:e}){if(e.loginUri)return await P(e),globalThis.location.replace(e.loginUri.replace("{location}",encodeURIComponent(globalThis.location.href))),{preventDefault:!0};if(e.getAccessToken){const t=await Be(e.getAccessToken);if(t)return await fetch(`${Tt(e)}/qlik-embed/main.js`,{method:"GET",mode:"cors",credentials:"include",headers:{"Content-Type":"application/json",Authorization:`Bearer ${t}`},cache:"no-cache"}),{retry:!0}}return{}}};const Ze=new Map;async function et(e){let t=function(e){const t=Ut(e);return Ze.get(t)}(e);if(!t){const o=await Be(e.getAccessToken);if(!o)throw new Error("Failed to acquire access token");t=(await fetch(`${Tt(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);Ze.set(o,t)}(e,t)}if(!t)throw new Error("Failed to exchange access token for cookie");return t}var tt={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:Ve(e)},headers:{Cookie:await et(e),"X-Qlik-XrfKey":Ve(e)},credentials:De(e)}},getWebSocketAuthParams:async function({hostConfig:e}){return{queryParams:{"qlik-csrf-token":await We(e,!0)},headers:{Cookie:await et(e)}}},handleAuthenticationError:async function({hostConfig:e}){return function(e){const t=Ut(e);Ze.delete(t)}(e),{retry:!0}}};var ot={requiredProps:["pfx"],optionalProps:["passphrase","userHeader"],getRestCallAuthParams:function({hostConfig:e}){return Promise.resolve({headers:{},queryParams:{},credentials:"omit",pfxOptions:{pfx:e?.pfx,passphrase:e?.passphrase}})},getWebSocketAuthParams:async function({hostConfig:e}){if(o())throw new Error("Not supported in browser environment");const t=e?.userHeader||"UserDirectory=INTERNAL; UserId=sa_engine";return Promise.resolve({headers:{"X-Qlik-User":t},pfxOptions:{pfx:e?.pfx,passphrase:e?.passphrase||""}})},handleAuthenticationError:function(){return Promise.resolve({})}};const nt={};let rt=Promise.resolve(),st=!1;function at(e,t){nt[e.toLowerCase()]=t}async function it(e){const t=xt(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":e.pfx?"pfx":await bt(e)?"windowscookie":"cookie"}st||(at("apikey",fe),at("cookie",ze),at("none",Qe),at("noauth",Me),at("oauth2",Je),at("anonymous",le),at("pfx",ot),o()?at("windowscookie",Ye):at("windowscookie",tt),at("reference",Ge),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 ht=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 dt=new Map;let pt,gt="";function mt(e){const t=w(e);let o=dt.get(t);return o||(o={listeners:new Set},dt.set(t,o)),o}function yt(e,t){if(e===pt&&t.message===gt)return;pt=e,gt=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 wt(e){return ct(e)}function kt(e){if(!globalThis.location?.origin)return!0;const t=xt(e);if(0===Object.keys(t).length)return!1;try{return new URL(Tt(t)).origin!==globalThis.location.origin}catch{}return!1}async function bt(e){const t=xt(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 Tt(e){const t=xt(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 Ct(e){const t=xt(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(Rt,"ws")}async function vt(e){const t=xt(e.hostConfig);try{return await(await it(t)).getWebSocketAuthParams({...e,hostConfig:t})}catch(e){throw yt(t,jt(e)),e}}async function At(e){const t=xt(e.hostConfig);try{return await((await it(t)).getWebResourceAuthParams?.({...e,hostConfig:t}))||{queryParams:{}}}catch(e){throw yt(t,jt(e)),e}}async function Pt(e){const t=xt(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;yt(t,function({errorBody:e,status:t}){const o=e;return"object"==typeof o?.errors?{message:new ht(o?.errors).message}:{message:`HTTP ${t}`}}({status:o,errorBody:n}))}return o}async function $t(e){const t=xt(e.hostConfig);try{return await(await it(t)).getRestCallAuthParams({...e,hostConfig:t})}catch(e){throw yt(t,jt(e)),e}}function St(e,t){at(e,t)}function _t(e){!function(e){b("default",e||{})}(e)}function It(e,t){b(e,t)}function qt(e){!function(e){k.has(e)?k.delete(e):console.warn(`unregisterHostConfig: Host config with name "${e}" not found.`)}(e)}function Ut(e){return w(e)}function Et(e){return function(e){const t=e||p,o=w(t);let n=g.get(o);return n||(n=m(xt(t)),g.set(o,n)),n}(e)}globalThis.loggingOut=!1;const Ot=e("logout",()=>{globalThis.loggingOut=!0,globalThis.location.href="/logout"}),Rt=/^http/;function jt(e){return{message:e.message||"Unknown error"}}function xt(e){if(e?.reference){const t=T(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:C()}function Ht(){return C()}function Lt(e,t){return function(e,t){const o=mt(e);return o.listeners.add(t),()=>{o.listeners.delete(t)}}(e,t)}function Wt(e,t){return function(e,t){const o=A(e);return o.redirectRequestedListeners.add(t),()=>{o.redirectRequestedListeners.delete(t)}}(e,t)}function Nt(e,t){return function(e,t){const o=A(e);return o.redirectStartedListeners.add(t),()=>{o.redirectStartedListeners.delete(t)}}(e,t)}let Dt;Dt=function(){const e=[...Dt?.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:wt,getDefaultHostConfig:Ht,getRestCallAuthParams:$t,getWebResourceAuthParams:At,getWebSocketAuthParams:vt,handleAuthenticationError:Pt,isHostCrossOrigin:kt,isWindows:bt,logout:Ot,registerAuthModule:St,registerHostConfig:It,serializeHostConfig:Ut,setDefaultHostConfig:_t,toValidLocationUrl:Tt,toValidWebsocketLocationUrl:Ct,unregisterHostConfig:qt,normalizeHostConfig:Et,onFatalAuthError:Lt,onPageRedirectRequested:Wt,onPageRedirectStarted:Nt});var Bt=Object.freeze({__proto__:null})}}});
//# sourceMappingURL=auth-cXJMiCSG-CzMjMvYI.js.map