@nebula.js/stardust
Version:
Product and framework agnostic integration API for Qlik's Associative Engine
9 lines (7 loc) • 37.7 kB
JavaScript
/*
* @nebula.js/stardust v6.3.0
* Copyright (c) 2025 QlikTech International AB
* Released under the MIT license.
*/
System.register(["./index-n3wzati9.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(){let s;e({determineAuthType:lt,getAccessToken:async function(e){const t=(await wt({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:It,getRestCallAuthParams:wt,getWebResourceAuthParams:mt,getWebSocketAuthParams:pt,handleAuthenticationError:yt,isHostCrossOrigin:ft,isWindows:ht,registerAuthModule:kt,registerHostConfig:Ct,serializeHostConfig:vt,setDefaultHostConfig:bt,toValidLocationUrl:dt,toValidWebsocketLocationUrl:gt,unregisterHostConfig:Tt}),s=function(){const e=[...s?.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}}();const a=["authType","autoRedirect","authRedirectUserConfirmation","embedRuntimeUrl","host","onAuthFailed"],i=["apikey","oauth2","cookie","windowscookie","reference","anonymous"];let c=e=>crypto.getRandomValues(new Uint8Array(e)),u=(e,t=21)=>((e,t,o)=>{let n=(2<<Math.log2(e.length-1))-1,r=-~(1.6*n*t/e.length);return(s=t)=>{let a="";for(;;){let t=o(r),i=0|r;for(;i--;)if(a+=e[t[i]&n]||"",a.length>=s)return a}}})(e,0|t,c),l=(e=21)=>{let t="",o=crypto.getRandomValues(new Uint8Array(e|=0));for(;e--;)t+="useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict"[63&o[e]];return t};const f=async(e={})=>{const t=_t(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 p({isUnknown:!0});let n=o()?window.QlikMain?.productInfo?.():void 0;if(!n){const{data:t,status:o}=await d(e);if(n=t,404===o)return p({isUnknown:!0});if(!n||o<=399&&o>=300)return p({isQSE:!0,isWindows:!0})}const r=(n.composition?.deploymentType||"").toLowerCase();return"qliksenseserver"===r?p({isQSE:!0,isWindows:!0,meta:g(n)}):"qliksensedesktop"===r?p({isQSD:!0,isWindows:!0,meta:g(n)}):"qliksensemobile"===r?p({isQSE:!0,isWindows:!0,meta:g(n)}):"cloud-console"===r?p({isCloud:!0,isCloudConsole:!0,meta:g(n)}):"fedramp"===n.composition?.provider?p({isCloud:!0,isQCG:!0,meta:g(n)}):p({isCloud:!0,isQCS:!0,meta:g(n)})},h={};const d=async({hostConfig:e,noCache:t}={})=>{const o=`${dt(e)}/resources/autogenerated/product-info.json`;try{if(!(o in h)){const e={};globalThis.QlikMain?.resourceNeedsCredentials(o)&&(e.credentials="include"),h[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 h[o];return(e.status>=400||!e.data)&&delete h[o],e}catch{return delete h[o],{data:void 0,status:500}}finally{t&&delete h[o]}},g=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}}},p=e=>({isCloud:!1,isQCS:!1,isQCG:!1,isCloudConsole:!1,isWindows:!1,isQSE:!1,isQSD:!1,isUnknown:!1,...e});function m(e){return l(e)}const y="__QLIK_INTERNAL__DO_NOT_USE_OR_YOU_WILL_BE_FIRED";const w="qlik-qmfe-api";function k(e){let t=e.clientId+(e.scope?`_${e.scope}`:"_user_default");return e.subject&&(t+=`_${e.subject}`),e.userId&&(t+=`_${e.userId}`),t}function b(e){return`${e.accessCode}_${e.clientId}`}const C={};var T,v;function A(e,t,o){localStorage.setItem(`${w}-${e}-${t}`,o)}function P(e,t,o){sessionStorage.setItem(`${w}-${e}-${t}`,o)}function $(e,t){return localStorage.getItem(`${w}-${e}-${t}`)||void 0}function _(e,t){return sessionStorage.getItem(`${w}-${e}-${t}`)||void 0}function I(e,t){t.forEach((t=>localStorage.removeItem(`${w}-${e}-${t}`)))}function S(e,t){t.forEach((t=>sessionStorage.removeItem(`${w}-${e}-${t}`)))}function U(e,t){const o=`${w}-${e}-${t}`,n=sessionStorage.getItem(o)||void 0;return sessionStorage.removeItem(o),n}async function q(e,t){if(!e.clientId)throw new Ye('A host config with authType set to "oauth2" has to also provide a clientId');return E(k(e),t,e.noCache,e.accessTokenStorage)}async function E(e,t,n,r){if(n)return t();const s=o(),a=C[e]||(s?function(e,t){let o,n;if("local"===t?(o=$(e,"access-token"),n=$(e,"refresh-token")):"session"===t&&(o=_(e,"access-token"),n=_(e,"refresh-token")),o)return{accessToken:o,refreshToken:n}}(e,r):void 0);if(a)return C[e]=a,Promise.resolve(a);const i=t();if(C[e]=i,s){const t=await i;"local"===r&&t?(t.accessToken&&A(e,"access-token",t.accessToken),t.refreshToken&&A(e,"refresh-token",t.refreshToken)):"session"===r&&t&&(t.accessToken&&P(e,"access-token",t.accessToken),t.refreshToken&&P(e,"refresh-token",t.refreshToken))}return i}function j(e){const t=k(e);delete C[t],o()&&(I(t,["access-token","refresh-token"]),S(t,["access-token","refresh-token"]))}function O(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 R(e){if(e.errors)throw new tt(e.errors)}function H(e){const t=Object.keys(e);return t.sort(),t.map((t=>`${t}=${e[t]}`)).join("&")}async function W(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=dt(e),n=m(128),r=m(43),s=await W(n),a=e.redirectUri||globalThis.location.href,i=k(e);j(e),P(i,"state",r),P(i,"verifier",n),P(i,"href",globalThis.location.href),P("","client-in-progress",i);const c=`${o}/oauth/authorize?${H({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 L(e,t,o,n){try{const r=await(await fetch(`${dt(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 R(r),{accessToken:r.access_token,refreshToken:r.refresh_token,errors:r.errors}}catch(e){return console.error(e),new Promise((()=>{}))}}function B(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 N(e){const{clientId:t,clientSecret:o}=e;if(!t||!o)throw new Ye('A host config with authType set to "oauth2" has to provide a clientId and a clientSecret');return await q(e,(async()=>{if(!e.clientId||!e.clientSecret)throw new Ye('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(B(t,o,n,r,s))})).json();return{accessToken:a.access_token,refreshToken:a.refresh_token,errors:a.errors}}(dt(e),e.clientId,e.clientSecret,e.scope,e.subject,e.userId)}))}async function D(e){const{clientId:t}=e;if(!t)throw new Ye('A host config with authType set to "oauth2" has to also provide a clientId');const o=await q(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 F("Could not fetch access token using custom function")}var t;if(e.performInteractiveLogin){let t;try{const o=m(128),n=m(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 O(e.performInteractiveLogin)({getLoginUrl:async({redirectUri:r})=>(t=r,async function(e,t,o,n){const r=e.clientId||"",s=dt(e),a=await W(n);return`${s}/oauth/authorize?${H({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?F("State returned by custom interactive login function does not match original"):r?await L(e,r,o,t):F("No code found in response from custom interactive login function"):F("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=k(e),n=U(o,"code"),r=U(o,"verifier");if(n&&r){const t=await L(e,n,r,e.redirectUri);if(t)return t}}));return o||(e.performInteractiveLogin||(e.authRedirectUserConfirmation&&await e.authRedirectUserConfirmation(),x(e)),new Promise((()=>{})))}T="clearAllAccessTokens",v=()=>{console.log("Clearing tokens",C),Object.keys(C).forEach((e=>{console.log("Clearing access tokens for",e),I(e,["access-token","refresh-token"]),S(e,["access-token","refresh-token"])})),function(){for(const e in C)delete C[e]}()},(globalThis.location?.origin.startsWith("https://localhost:")||globalThis.location?.origin?.endsWith("qlik-stage.com"))&&(void 0===globalThis[y]&&(globalThis[y]={}),globalThis[y][T]=v);let z=Promise.resolve("");async function K(e){if(r()){const t=await N(e);return t?(R(t),t.accessToken||""):""}return o()&&(z=z.then((async()=>{const t=await D(e);return t?(R(t),t.accessToken||""):""}))),z}async function Q(e){const t=await async function(e){return C[k(e)]}(e);if(j(e),t&&t.refreshToken&&e.clientSecret){const o=await q(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}}(dt(e),t.refreshToken,e.clientSecret)}));o&&R(o)}}function F(e){return{accessToken:void 0,refreshToken:void 0,errors:[{code:"",status:401,title:e,detail:""}]}}async function M(e,t,o){const n=await fetch(`${dt(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 tt(JSON.parse(t).errors)}catch{return new tt([{code:"unknown",status:e.status,detail:t,title:"Unknown authentication error"}])}}(n);return(await n.json()).access_token}async function J(e,t){try{return await t()}catch(o){const{retry:n}=await X({hostConfig:e});if(n)return t();throw o}}function G(){const e=Math.floor(Date.now()/1e3).toString(16);return`${e}${t=40-e.length,u("1234567890abcdef",t)()}`;var t}async function V(e){const{accessCode:t,clientId:n}=e;if(!t||!n)throw new Ye('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 Ye('A host config with authType set to "anonymous" has to also provide an accessCode');return E(b(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}}(dt(e),t,n,await async function(e){let t;if(o()){const o=b(e);t=$(o,"tracking-code"),t||(t=G()),A(o,"tracking-code",t)}else t=G();return t}(e))));if(!r)return"";if(r.errors)throw new tt(r.errors);return r.accessToken?r.accessToken:""}async function X({hostConfig:e}){return function(e){const t=b(e);delete C[t],o()&&(I(t,["access-token","refresh-token"]),S(t,["access-token","refresh-token"]))}(e),{preventDefault:!1,retry:!0}}var Y={requiredProps:["clientId","accessCode"],optionalProps:[],getRestCallAuthParams:async function({hostConfig:e}){return{headers:{Authorization:`Bearer ${await V(e)}`},queryParams:{},credentials:"omit"}},getWebSocketAuthParams:async function({hostConfig:e}){return r()?{headers:{Authorization:`Bearer ${await V(e)}`}}:{queryParams:{accessToken:await J(e,(async()=>M(e,await V(e),"websocket")))}}},getWebResourceAuthParams:async function({hostConfig:e}){return{queryParams:{accessToken:await J(e,(async()=>M(e,await V(e),"websocket")))}}},handleAuthenticationError:X};var Z={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({})}},ee=class extends Error{status;headers;data;constructor(e,t,o,n){super(e),this.status=t,this.headers=o,this.data=n,this.stack=re(this.stack)}},te=class extends Error{contentType;data;constructor(e,t,o){super(e),this.contentType=t,this.data=o,this.stack=re(this.stack)}};const oe=/^.+\/qmfe-api(?:\.js)?:(\d+)(?::\d+)?$/gim,ne=e=>{const t=e.match(oe);return Boolean(t&&t.length>0)};function re(e){if(!e)return e;const t=[],o=e.split("\n");o.reverse();for(const e of o){if(ne(e))break;t.unshift(e)}return t.join("\n")}function se(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 ae={};globalThis.__API_CACHE__DO_NOT_USE_OR_YOU_WILL_BE_FIRED=ae;let ie=6e5;const ce=".global";function ue(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 le({url:e,query:t,headers:o,serializedHostConfig:n}){let r=e;if(t){const o=se(t);r=e.includes("?")?r.concat(`&${o}`):r.concat(`?${o}`)}return o&&(r=r.concat(`+headers=${JSON.stringify(o)}`)),n&&"{}"!==n&&(r=r.concat(`+host-config=${n}`)),r}function fe(e){const t=[];return ae[e]&&t.push(ae[e]),ae[ce]&&t.push(ae[ce]),t}function he(e,t){const o=de(t);for(const t in e){const n=de(t);(o.startsWith(n)||n.startsWith(o))&&delete e[t]}}function de(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 ge(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:ge(e.data),headers:e.headers,status:e.status};return e.next&&(t.next=e.next),e.prev&&(t.prev=e.prev),t}))}function me(e,t){return"get"!==e&&"GET"!==e&&(!t.endsWith("/api/v1/licenses/allotments")||"post"!==e&&"POST"!==e)}function ye(e){return e instanceof Error?e.cause?e.message?`${e.message} - ${ye(e.cause)}`:ye(e.cause):e.message:String(e)}async function we(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 te(`Cannot encode ${typeof e} as ${t}, body should be an object.`,t,e);if(Array.isArray(e))throw new te(`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 te(`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 te(`Cannot send ${typeof e} as ${t}, body should be a string.`,t,e);o["Content-Type"]=t,r=e;break;default:throw new te(`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,...ve()};!f["User-Agent"]&&i&&(f["User-Agent"]=i);const h={method:e,credentials:a,mode:"cors",headers:f,redirect:await ht(r?.hostConfig)?"manual":"follow",keepalive:r?.keepalive,progress:r?.progress,body:c,...l};let d,g;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 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 ee(ye(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 ee(ye(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=Ae(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=Ae(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 ee(c,s,i,o);if(0===s)throw new ee(c,302,i,o);return{status:s,headers:i,data:o}}(g,t)}async function ke({method:e,pathTemplate:t,pathVariables:o,query:n,options:r}){const s=dt(r?.hostConfig),{headers:a,queryParams:i,credentials:c}=await wt({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,se({...n,...i})),f=vt(r?.hostConfig);return{completeUrl:l,authHeaders:a,credentials:c,cacheKey:le({url:u,query:n,headers:r?.headers,serializedHostConfig:f})}}function be(e,t){return Ce(e,t,(async()=>{const{authHeaders:o,credentials:n}=await ke(t);return Ce(e,{...t,authHeaders:o,credentials:n,options:{...t.options,noCache:!0}},void 0)}))}function Ce(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=fe(e);if(me(o,n))return;let a;for(const e of s)if(r in e){if(a=e[r],a&&void 0!==a.value&&ue(t?.options,a,ie))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 g=we(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 ht(e)){if(globalThis.loggingOut)return Te();const{retry:t,preventDefault:s}=await yt({hostConfig:e,status:n.status,headers:n.headers,errorBody:r,canRetry:!!o});if(t&&o)return o();if(s)return Te()}throw t}}(a?.hostConfig,g,o);return function(e,t,o){ae[e]||(ae[e]={});const{cacheKey:n}=t;if(me(t.method,t.completeUrl))return o.then((t=>{const o=fe(e);for(const e of o)he(e,n);return t}));const r=ae[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=vt(n?.hostConfig),u=i.links?.prev?.href,l=i.links?.next?.href;return u&&(a.prev=a=>be(e,{method:t,completeUrl:u,body:o,options:a||n,authHeaders:r,credentials:s,cacheKey:le({url:u,headers:n?.headers,serializedHostConfig:c})})),l&&(a.next=a=>be(e,{method:t,completeUrl:l,body:o,options:a||n,authHeaders:r,credentials:s,cacheKey:le({url:l,headers:n?.headers,serializedHostConfig:c})})),a}))}(e,{...t,value:p}))}function Te(){return new Promise((()=>{}))}function ve(){if(!o())return{};const e=localStorage.getItem("qmfe-api-service-overrides-header");return e?{"X-Qlik-Overrides":e}:{}}function Ae(e,t){const o=e;return o.download=t?(o=t)=>Pe(e,o):t=>Pe(e,t),o}async function Pe(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 St})),n=await e.arrayBuffer();o(t,new Uint8Array(n))}}const $e="qmfe-api/latest";async function _e(e,t,n){return(s.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=_t(e);if(ft(t)){if(0===Object.keys(t).length)throw new Ye("a host config must be provided when making a cross domain request");if(!t.host)throw new Ye("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} ${$e}`:$e;const{completeUrl:r,authHeaders:s,credentials:a,cacheKey:i}=await ke(t);return be(e,{...t,method:t.method.toUpperCase(),completeUrl:r,authHeaders:s,credentials:a,cacheKey:i,userAgent:n})}(e,t)))(t)}const Ie="qlik-csrf-token";async function Se(e,t){const o=dt(e);let n;n=await ht(e)?"/qps/csrftoken":"/api/v1/csrf-token";const r=async()=>{try{const t=(await _e("csrf-token",{method:"get",pathTemplate:n,options:{hostConfig:e,noCache:!0}})).headers.get(Ie);return t||""}catch(e){if(404===e.status)return"";throw e}};return t?(Ue[o]=r(),Ue[o]):(Ue[o]=Ue[o]||r(),Ue[o])}const Ue={};function qe(e){return!1===e.crossSiteCookies?"same-origin":ft(e)?"include":"same-origin"}async function Ee(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 je={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 Se(e)),e.webIntegrationId&&(o["qlik-web-integration-id"]=e.webIntegrationId),{headers:o,queryParams:{},credentials:qe(e)}},getWebSocketAuthParams:async function({hostConfig:e}){if(r()){const t={};return t["qlik-csrf-token"]=await Se(e),e.webIntegrationId&&(t["qlik-web-integration-id"]=e.webIntegrationId),{headers:t}}const t={"qlik-csrf-token":await Se(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=dt(e);delete Ue[t]}(e),403===t)return{preventDefault:!1,retry:!0};const o=e.webIntegrationId?`qlik-web-integration-id=${e?.webIntegrationId}&`:"",n=dt(e);return e.authRedirectUserConfirmation&&await e.authRedirectUserConfirmation(),globalThis.location.replace(`${n}/login?${o}returnto=${encodeURIComponent(globalThis.location.href)}`),{preventDefault:!0}}};var Oe={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 Re={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 He(e,t){try{return await t()}catch(o){const{retry:n}=await We({hostConfig:e});if(n)return t();throw o}}async function We({hostConfig:e}){return e.getAccessToken?(j(e),{preventDefault:!1,retry:!0}):o()?e.performInteractiveLogin?(j(e),{retry:!0}):(e.authRedirectUserConfirmation&&await e.authRedirectUserConfirmation(),x(e),{preventDefault:!0}):(await Q(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=U("","client-in-progress");if(n&&t&&o){const e=U(n,"state"),r=U(n,"href");e&&e===o&&r&&(P(n,"code",t),r!==globalThis.location.href&&globalThis.location.replace(r))}}();var xe={requiredProps:["clientId"],optionalProps:["clientSecret","redirectUri","accessTokenStorage","scope","subject","userId","noCache","getAccessToken","performInteractiveLogin"],getRestCallAuthParams:async function({hostConfig:e}){return{headers:{Authorization:`Bearer ${await K(e)}`},queryParams:{},credentials:"omit"}},getWebSocketAuthParams:async function({hostConfig:e}){return r()?{headers:{Authorization:`Bearer ${await K(e)}`}}:{queryParams:{accessToken:await He(e,(async()=>M(e,await K(e),"websocket")))}}},getWebResourceAuthParams:async function({hostConfig:e}){return{queryParams:{accessToken:await He(e,(async()=>M(e,await K(e),"webresource")))}}},handleAuthenticationError:We};var Le={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 Be={};function Ne(e){const t=dt(e);return Be[t]=Be[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}(),Be[t]}var De={requiredProps:[],optionalProps:["loginUri","crossSiteCookies","getAccessToken"],getRestCallAuthParams:async function({hostConfig:e}){return{headers:{"X-Qlik-XrfKey":Ne(e)},queryParams:{xrfkey:Ne(e)},credentials:qe(e)}},getWebSocketAuthParams:async function({hostConfig:e}){return{queryParams:{xrfkey:Ne(e),"qlik-csrf-token":await Se(e,!0)}}},handleAuthenticationError:async function({hostConfig:e}){if(e.loginUri)return e.authRedirectUserConfirmation&&await e.authRedirectUserConfirmation(),globalThis.location.replace(e.loginUri.replace("{location}",encodeURIComponent(globalThis.location.href))),{preventDefault:!0};if(e.getAccessToken){const t=await Ee(e.getAccessToken);if(t)return await fetch(`${dt(e)}/qlik-embed/main.js`,{method:"GET",mode:"cors",credentials:"include",headers:{"Content-Type":"application/json",Authorization:`Bearer ${t}`}}),{retry:!0}}return{}}};const ze=new Map;async function Ke(e){let t=function(e){const t=vt(e);return ze.get(t)}(e);if(!t){const o=await Ee(e.getAccessToken);if(!o)throw new Error("Failed to acquire access token");t=(await fetch(`${dt(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=vt(e);ze.set(o,t)}(e,t)}if(!t)throw new Error("Failed to exchange access token for cookie");return t}var Qe={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 Ye('The "getAccessToken" function name provided does not exist on globalThis.');return!0}throw new Ye('The "getAccessToken" property must be a function or the name of a globally defined function.')},getRestCallAuthParams:async function({hostConfig:e}){return{queryParams:{xrfkey:Ne(e)},headers:{Cookie:await Ke(e),"X-Qlik-XrfKey":Ne(e)},credentials:qe(e)}},getWebSocketAuthParams:async function({hostConfig:e}){return{queryParams:{"qlik-csrf-token":await Se(e,!0)},headers:{Cookie:await Ke(e)}}},handleAuthenticationError:async function({hostConfig:e}){return function(e){const t=vt(e);ze.delete(t)}(e),{retry:!0}}};const Fe={};let Me=Promise.resolve(),Je=!1;function Ge(e,t){Fe[e.toLowerCase()]=t}async function Ve(e){const t=_t(e),o=await Xe(t);Me&&await Me;let n=function(e){return Fe[e.toLowerCase()]}(o);if(n||(Me=(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 Ze(e)}return Promise.resolve(void 0)}(o),n&&Ge(o,n)})(),await Me),!n)throw new Ze(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 Ye(`missing required properties in host config; '${n.join("', '")}'`);const r=[...a,...t,...o],s=[];Object.keys(e).forEach((e=>{r.includes(e)||s.push(e)})),s.length>0&&console.warn(`WARNING: unknown properties in host config; '${s.join("', '")}'`)}({authType:o,...t},{requiredProps:n.requiredProps||[],optionalProps:n.optionalProps||[]}),n}async function Xe(e){return e.authType?e.authType:e.apiKey?"apikey":e.accessCode?"anonymous":e.clientId?"oauth2":e.webIntegrationId?"cookie":e.reference?"reference":await ht(e)?"windowscookie":"cookie"}Je||(Ge("apikey",Z),Ge("cookie",je),Ge("none",Re),Ge("noauth",Oe),Ge("oauth2",xe),Ge("anonymous",Y),o()?Ge("windowscookie",De):Ge("windowscookie",Qe),Ge("reference",Le),Je=!0);var Ye=e("InvalidHostConfigError",class extends Error{constructor(e){super(`Invalid host config: ${e}`),this.name="InvalidHostConfigError"}}),Ze=(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(Fe).filter((e=>"qmfeembedframerauthmodule"!==e.toLowerCase())).join("', '")}'`),this.name="InvalidAuthTypeError"}}));function et({title:e,detail:t,code:o,status:n}){return t?`${e} - ${t} (Status: ${n}, Code: ${o})`:`${e} (Status: ${n}, Code: ${o})`}var tt=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(et).join(", ")),this.errors=t}});function ot(e,t){if("function"!=typeof t)return t}function nt(e){const r=t(function(e){const t=n(e)||{};return t.host&&(t.host=dt(t)),o()&&dt(t)===window.location.origin&&delete t.host,t.authType&&i.includes(t.authType)&&delete t.authType,t}(_t(e)));return JSON.stringify(r,ot)}const rt=new Map;function st(e,t){const o=t?.reference||null;if(o&&!rt.has(o))throw new Ye(`Host config with reference "${o}" is not registered. Please register it before using it.`);rt.has(e)&&console.warn(`registerHostConfig: Host config with name "${e}" is already registered. Overwriting.`),rt.set(e,t)}function at(e){return rt.get(e)}function it(){return at("default")||{}}globalThis.loggingOut=!1;let ct="";function ut({message:e}){e!==ct&&(ct=e,console.error(e))}function lt(e){return Xe(e)}function ft(e){if(!globalThis.location?.origin)return!0;const t=_t(e);if(0===Object.keys(t).length)return!1;try{return new URL(dt(t)).origin!==globalThis.location.origin}catch{}return!1}async function ht(e){const t=_t(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 f({hostConfig:e})).isWindows))}function dt(e){const t=_t(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 gt(e){const t=_t(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(Pt,"ws")}async function pt(e){const t=_t(e.hostConfig);try{return await(await Ve(t)).getWebSocketAuthParams({...e,hostConfig:t})}catch(e){throw(t.onAuthFailed||ut)($t(e)),e}}async function mt(e){const t=_t(e.hostConfig);try{return await((await Ve(t)).getWebResourceAuthParams?.({...e,hostConfig:t}))||{queryParams:{}}}catch(e){throw(t.onAuthFailed||ut)($t(e)),e}}async function yt(e){const t=_t(e.hostConfig),o=await(await Ve(t)).handleAuthenticationError({...e,hostConfig:t}),n=e.canRetry&&o.retry,r=o.preventDefault;if(!n&&!r){const{status:o,errorBody:n}=e;(t.onAuthFailed||ut)(function({errorBody:e,status:t}){const o=e;return"object"==typeof o?.errors?{message:new tt(o?.errors).message}:{message:`HTTP ${t}`}}({status:o,errorBody:n}))}return o}async function wt(e){const t=_t(e.hostConfig);try{return await(await Ve(t)).getRestCallAuthParams({...e,hostConfig:t})}catch(e){throw(t.onAuthFailed||ut)($t(e)),e}}function kt(e,t){Ge(e,t)}function bt(e){!function(e){st("default",e||{})}(e)}function Ct(e,t){st(e,t)}function Tt(e){!function(e){rt.has(e)?rt.delete(e):console.warn(`unregisterHostConfig: Host config with name "${e}" not found.`)}(e)}function vt(e){return nt(e)}const At=e("logout",(()=>{globalThis.loggingOut=!0,globalThis.location.href="/logout"})),Pt=/^http/;function $t(e){return{message:e.message||"Unknown error"}}function _t(e){if(e?.reference){const t=at(e.reference);if(!t)throw new Ye(`Host config with name "${e.reference}" not found.`);return t}return e&&Object.keys(e).length>0?e:it()}function It(){return it()}e("default",{determineAuthType:lt,getDefaultHostConfig:It,getRestCallAuthParams:wt,getWebResourceAuthParams:mt,getWebSocketAuthParams:pt,handleAuthenticationError:yt,isHostCrossOrigin:ft,isWindows:ht,logout:At,registerAuthModule:kt,registerHostConfig:Ct,serializeHostConfig:vt,setDefaultHostConfig:bt,toValidLocationUrl:dt,toValidWebsocketLocationUrl:gt,unregisterHostConfig:Tt});var St=Object.freeze({__proto__:null})}}}));
//# sourceMappingURL=auth-sNi1A67--DjXMah4q.js.map