@descope/web-js-sdk 0.1.0-alpha.15 → 0.1.0-alpha.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.esm.js CHANGED
@@ -1,2 +1,2 @@
1
- import{__classPrivateFieldSet as e,__classPrivateFieldGet as t,__rest as n}from"tslib";import a from"@descope/core-js-sdk";import{load as o}from"@fingerprintjs/fingerprintjs-pro";import s from"js-cookie";const i="undefined"!=typeof window,r=i&&localStorage.getItem("fingerprint.public.key")||"A9aCLRHzKCv3uL69oqDr",l=i&&(null===localStorage||void 0===localStorage?void 0:localStorage.getItem("fingerprint.endpoint.url"))||"https://fp.descope.com",c=(e="",t="")=>({vsid:e,vrid:t}),u=(e=!1)=>{const t=localStorage.getItem("fp");if(!t)return null;const n=JSON.parse(t);return(new Date).getTime()>n.expiry&&!e?null:n.value},d=async e=>{try{if(u())return;const t=(Date.now().toString(36)+Math.random().toString(36).substring(2)+Math.random().toString(36).substring(2)).substring(0,27),n=o({apiKey:e||r,endpoint:l}),a=await n,{requestId:s}=await a.get({linkedId:t});(e=>{const t={value:e,expiry:(new Date).getTime()+864e5};localStorage.setItem("fp",JSON.stringify(t))})(c(t,s))}catch(e){global.FB_DEBUG&&console.error(e)}};var g,p,f,h,w;const b=e=>Object.assign({},e);class v{constructor(t){g.add(this),p.set(this,void 0),f.set(this,{}),h.set(this,0),e(this,p,t,"f")}get current(){return b(t(this,p,"f"))}update(n){const a=n;if(!((e,t)=>{const n=e&&Object.getOwnPropertyNames(e)||[],a=t&&Object.getOwnPropertyNames(t)||[];if(n.length!==a.length)return!1;for(let a=0;a<n.length;a+=1){const o=n[a];if(e[o]!==t[o])return!1}return!0})(t(this,p,"f"),a)){const n=t(this,p,"f");e(this,p,a,"f"),Object.freeze(t(this,p,"f")),setTimeout((()=>{Object.values(t(this,f,"f")).forEach((e=>e(b(a),n)))}),0)}}subscribe(n){e(this,h,t(this,h,"f")+1,"f"),t(this,f,"f")[t(this,h,"f")]=n;const a=t(this,h,"f");return()=>t(this,g,"m",w).call(this,a.toString())}unsubscribeAll(){e(this,f,{},"f")}}p=new WeakMap,f=new WeakMap,h=new WeakMap,g=new WeakSet,w=function(e){!!t(this,f,"f")[e]&&delete t(this,f,"f")[e]};let S=[];function m(e,t,n){const a=function(e){const t=e.split(".");try{if(3===t.length){const t=JSON.parse(window.atob(e.split(".")[1]));if(t.exp)return new Date(1e3*t.exp)}}catch(e){}return null}(t);if(a){let t;for(;t=S.pop();)clearTimeout(t);const o=a.getTime()-2e4-(new Date).getTime(),s=setTimeout((()=>{e(n)}),o);S.push(s)}}async function y(e,t,a,o){var r;try{if(401===t.status)return a.sessionToken.update({sessionToken:""}),void a.user.update({});const l=await(null==t?void 0:t.json());if(l){const t=function(e){return(null==e?void 0:e.authInfo)||e||{}}(l),{sessionJwt:c,refreshJwt:u,user:d}=t,g=n(t,["sessionJwt","refreshJwt","user"]);if(o.persistTokens&&(function(e,{cookiePath:t,cookieDomain:n,cookieExpiration:a},o){e&&(o?s.set("DS",e,{path:t,domain:n,expires:a,sameSite:"None",secure:!0}):localStorage&&localStorage.setItem("DS",e))}(c,g,o.sessionTokenViaCookie),function(e){localStorage&&e&&localStorage.setItem("DSR",e)}(u)),c&&a.sessionToken.update({sessionToken:c}),d){const e=null===(r=null==d?void 0:d.externalIds)||void 0===r?void 0:r[0];i&&e&&(null===localStorage||void 0===localStorage||localStorage.setItem("dls_last_user_external_id",e)),a.user.update(d)}c&&u&&o.autoRefresh&&m(e,c,u)}}catch(e){console.error("Could not set tokens from body",e)}}function k(){return localStorage?null===localStorage||void 0===localStorage?void 0:localStorage.getItem("DSR"):""}function O(){return s.get("DS")||(null===localStorage||void 0===localStorage?void 0:localStorage.getItem("DS"))||""}async function I(e){const t=function(e){var t;const n=JSON.parse(e);return n.publicKey.challenge=D(n.publicKey.challenge),n.publicKey.user.id=D(n.publicKey.user.id),null===(t=n.publicKey.excludeCredentials)||void 0===t||t.forEach((e=>{e.id=D(e.id)})),n}(e),n=await navigator.credentials.create(t);return a=n,JSON.stringify(Object.assign(Object.assign({},a),{rawId:C(a.rawId),response:Object.assign(Object.assign({},a.response),{attestationObject:C(a.response.attestationObject),clientDataJSON:C(a.response.clientDataJSON)})}));var a}async function j(e){const t=function(e){var t;const n=JSON.parse(e);return n.publicKey.challenge=D(n.publicKey.challenge),null===(t=n.publicKey.allowCredentials)||void 0===t||t.forEach((e=>{e.id=D(e.id)})),n}(e),n=await navigator.credentials.get(t);return a=n,JSON.stringify(Object.assign(Object.assign({},a),{rawId:C(a.rawId),response:Object.assign(Object.assign({},a.response),{authenticatorData:C(a.response.authenticatorData),clientDataJSON:C(a.response.clientDataJSON),signature:C(a.response.signature),userHandle:a.response.userHandle?C(a.response.userHandle):void 0})}));var a}async function T(e=!1){if(!i)return Promise.resolve(!1);const t=!!(PublicKeyCredential&&navigator.credentials&&navigator.credentials.create&&navigator.credentials.get);return t&&e&&PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable?PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable():t}function D(e){const t=e.replace(/_/g,"/").replace(/-/g,"+");return Uint8Array.from(atob(t),(e=>e.charCodeAt(0))).buffer}function C(e){return btoa(String.fromCharCode.apply(null,new Uint8Array(e))).replace(/\//g,"_").replace(/\+/g,"-").replace(/=/g,"")}var x=e=>{var{autoRefresh:t=!0,persistTokens:o=!0,sessionTokenViaCookie:r,fpKey:l,fpLoad:g}=e,p=n(e,["autoRefresh","persistTokens","sessionTokenViaCookie","fpKey","fpLoad"]);i?g&&d(l).catch((()=>null)):console.warn("Fingerprint is a client side only capability and will not work when running in the server");const f=p;let h,w;const b=new v({sessionToken:""}),S=new v({});f.hooks={beforeRequest:e=>null==h?void 0:h(e),afterRequest:(e,t)=>null==w?void 0:w(e,t)};const m=a(f),O=(D=m,{async signUp(e,t){const n=await D.webauthn.signUp.start(e,window.location.origin,t),a=await I(n.data.options);return await D.webauthn.signUp.finish(n.data.transactionId,a)},async signIn(e){const t=await D.webauthn.signIn.start(e,window.location.origin),n=await j(t.data.options);return await D.webauthn.signIn.finish(t.data.transactionId,n)},async signUpOrIn(e){var t;const n=await D.webauthn.signUpOrIn.start(e,window.location.origin);if(null===(t=n.data)||void 0===t?void 0:t.create){const e=await I(n.data.options);return await D.webauthn.signUp.finish(n.data.transactionId,e)}{const e=await j(n.data.options);return await D.webauthn.signIn.finish(n.data.transactionId,e)}},async update(e,t){const n=await D.webauthn.update.start(e,window.location.origin,t),a=await I(n.data.options);return await D.webauthn.update.finish(n.data.transactionId,a)},helpers:{create:I,get:j,isSupported:T}});var D;const C=Object.assign(Object.assign({},m),{flow:Object.assign(Object.assign({},m.flow),{start:async(e,t,n,a)=>{const o=await O.helpers.isSupported(),s=null===localStorage||void 0===localStorage?void 0:localStorage.getItem("dls_last_user_external_id"),i={tenant:null==a?void 0:a.tenant,redirectUrl:window.location.href,deviceInfo:{webAuthnSupport:o}};return s&&(i.lastUser={externalId:s}),m.flow.start(e,t,n,i)}}),webauthn:O,onSessionTokenChange:e=>{var t;const n=null===(t=b.current)||void 0===t?void 0:t.sessionToken;return n&&e(n),b.subscribe((({sessionToken:t})=>{e(t)}))},onUserChange:e=>{const t=S.current;return t&&Object.entries(t).length>0&&e(t),S.subscribe((t=>{e(t)}))},getRefreshToken:k});return i?(t&&["logout","logoutAll"].forEach((e=>{const t=m[e];C[e]=(...e)=>{const n=k(),a=[(null==e?void 0:e.shift())||n,...e],o=t(...a);return null===localStorage||void 0===localStorage||localStorage.removeItem("DSR"),null===localStorage||void 0===localStorage||localStorage.removeItem("DS"),s.remove("DS"),i&&(null===localStorage||void 0===localStorage||localStorage.removeItem("dls_last_user_external_id")),b.update({sessionToken:""}),o}})),h=e=>(e.body&&(e.body.fpData=u(!0)||c()),!e.token&&o&&(e.token=k()),e.headers=Object.assign(Object.assign({},e.headers),{"x-descope-sdk-name":"web-js","x-descope-sdk-version":"0.1.0-alpha.15"}),e),C.me=async(...e)=>{var t;const n=await m.me(...e);if(n.ok){const e=await(null===(t=n.response)||void 0===t?void 0:t.clone().json());S.update(e)}return n},(t||o)&&(w=(e,n)=>{y(C.refresh,n,{sessionToken:b,user:S},{autoRefresh:t,persistTokens:o,sessionTokenViaCookie:r})}),t&&k()&&C.refresh(),C):(console.warn("Storing auth tokens in local storage and cookies are a client side only capabilities and will not be done when running in the server"),C)};export{x as default,O as getSessionToken};
1
+ import{__rest as e}from"tslib";import t,{wrapWith as n}from"@descope/core-js-sdk";import{load as a}from"@fingerprintjs/fingerprintjs-pro";import o from"js-cookie";const r=(e,t)=>{var n;return["beforeRequest","afterRequest"].reduce(((n,a)=>{var o;return n[a]=[].concat((null===(o=e.hooks)||void 0===o?void 0:o[a])||[]).concat((null==t?void 0:t[a])||[]),n}),null!==(n=e.hooks)&&void 0!==n?n:e.hooks={}),e},s=async e=>{if(!(null==e?void 0:e.ok))return{};const t=await(null==e?void 0:e.clone().json());return(null==t?void 0:t.authInfo)||t||{}},i=async e=>{const t=await s(e);return(null==t?void 0:t.user)||((null==t?void 0:t.hasOwnProperty("userId"))?t:void 0)},l="undefined"!=typeof localStorage,c=(e,t)=>l&&(null===localStorage||void 0===localStorage?void 0:localStorage.setItem(e,t)),u=e=>l&&(null===localStorage||void 0===localStorage?void 0:localStorage.getItem(e)),d=e=>l&&(null===localStorage||void 0===localStorage?void 0:localStorage.removeItem(e)),g=e=>Object.assign(e,{headers:Object.assign(Object.assign({},e.headers),{"x-descope-sdk-name":"web-js","x-descope-sdk-version":"0.1.0-alpha.17"})}),p="undefined"!=typeof window,f=p&&localStorage.getItem("fingerprint.public.key")||"A9aCLRHzKCv3uL69oqDr",w=p&&(null===localStorage||void 0===localStorage?void 0:localStorage.getItem("fingerprint.endpoint.url"))||"https://fp.descope.com",b=(e="",t="")=>({vsid:e,vrid:t}),h=(e=!1)=>{const t=localStorage.getItem("fp");if(!t)return null;const n=JSON.parse(t);return(new Date).getTime()>n.expiry&&!e?null:n.value},v=async e=>{try{if(h())return;const t=(Date.now().toString(36)+Math.random().toString(36).substring(2)+Math.random().toString(36).substring(2)).substring(0,27),n=a({apiKey:e||f,endpoint:w}),o=await n,{requestId:r}=await o.get({linkedId:t});(e=>{const t={value:e,expiry:(new Date).getTime()+864e5};localStorage.setItem("fp",JSON.stringify(t))})(b(t,r))}catch(e){global.FB_DEBUG&&console.error(e)}},y=e=>(e.body&&(e.body.fpData=h(!0)||b()),e),S=e=>async(...t)=>{t[1]=t[1]||{};const[,n]=t,a=u("dls_last_user_external_id");a&&(n.lastUser={externalId:a});return await e(...t)},m=e=>async(...t)=>{const n=await e(...t);return d("dls_last_user_external_id"),n};function O(){const e=[];return{pub:t=>{e.forEach((e=>e(t)))},sub:t=>{const n=e.push(t)-1;return()=>e.splice(n,1)}}}const I=(t={},n)=>{var{refreshJwt:a,sessionJwt:r}=t,s=e(t,["refreshJwt","sessionJwt"]);void 0===n&&(n=!1),a&&c("DSR",a),r&&(n?function(e,t,{cookiePath:n,cookieDomain:a,cookieExpiration:r}){if(t){const s=new Date(1e3*r);o.set(e,t,{path:n,domain:a,expires:s,sameSite:"None",secure:!0})}}("DS",r,s):c("DS",r))};function j(){return u("DSR")||""}function k(){return o.get("DS")||u("DS")||""}function D(){d("DSR"),d("DS"),o.remove("DS")}const J=e=>Object.assign(e,{token:e.token||j()}),T=e=>async(...t)=>{const n=await e(...t);return D(),n};async function x(e){const t=function(e){var t;const n=JSON.parse(e);return n.publicKey.challenge=R(n.publicKey.challenge),n.publicKey.user.id=R(n.publicKey.user.id),null===(t=n.publicKey.excludeCredentials)||void 0===t||t.forEach((e=>{e.id=R(e.id)})),n}(e),n=await navigator.credentials.create(t);return a=n,JSON.stringify(Object.assign(Object.assign({},a),{rawId:_(a.rawId),response:Object.assign(Object.assign({},a.response),{attestationObject:_(a.response.attestationObject),clientDataJSON:_(a.response.clientDataJSON)})}));var a}async function A(e){const t=function(e){var t;const n=JSON.parse(e);return n.publicKey.challenge=R(n.publicKey.challenge),null===(t=n.publicKey.allowCredentials)||void 0===t||t.forEach((e=>{e.id=R(e.id)})),n}(e),n=await navigator.credentials.get(t);return a=n,JSON.stringify(Object.assign(Object.assign({},a),{rawId:_(a.rawId),response:Object.assign(Object.assign({},a.response),{authenticatorData:_(a.response.authenticatorData),clientDataJSON:_(a.response.clientDataJSON),signature:_(a.response.signature),userHandle:a.response.userHandle?_(a.response.userHandle):void 0})}));var a}async function K(e=!1){if(!p)return Promise.resolve(!1);const t=!!(PublicKeyCredential&&navigator.credentials&&navigator.credentials.create&&navigator.credentials.get);return t&&e&&PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable?PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable():t}function R(e){const t=e.replace(/_/g,"/").replace(/-/g,"+");return Uint8Array.from(atob(t),(e=>e.charCodeAt(0))).buffer}function _(e){return btoa(String.fromCharCode.apply(null,new Uint8Array(e))).replace(/\//g,"_").replace(/\+/g,"-").replace(/=/g,"")}var C=e=>Object.assign(Object.assign({},e.flow),{start:async(t,n,a,o)=>{const r=await K(),s=Object.assign(Object.assign({},n),{redirectUrl:window.location.href,deviceInfo:{webAuthnSupport:r}});return e.flow.start(t,s,a,o)}});const U=function(...e){return t=>e.reduce(((e,t)=>t(e)),t)}((e=>t=>{const a=e(r(t,{afterRequest:async(e,t)=>{var n;const a=await i(t),o=null===(n=null==a?void 0:a.externalIds)||void 0===n?void 0:n[0];o&&(e=>{c("dls_last_user_external_id",e)})(o)}}));let o=n(a,["flow.start"],S);return o=n(o,["logout","logoutAll"],m),o}),(t=>n=>{var{fpKey:a,fpLoad:o}=n,s=e(n,["fpKey","fpLoad"]);return p?o&&v(a).catch((()=>null)):console.warn("Fingerprint is a client side only capability and will not work when running in the server"),t(r(s,{beforeRequest:y}))}),(t=>a=>{var o=e(a,["autoRefresh"]);const{clearAllTimers:i,setTimer:l}=(()=>{const e=[];return{clearAllTimers:()=>{for(;e.length;)clearTimeout(e.pop())},setTimer:(t,n)=>{e.push(setTimeout(t,n))}}})(),c=t(r(o,{afterRequest:async(e,t)=>{const{refreshJwt:n,sessionJwt:a}=await s(t);if(401===(null==t?void 0:t.status))i();else if(a){const e=((o=(e=>{const t=e.split(".");try{if(3===t.length){const e=JSON.parse(window.atob(t[1]));if(e.exp)return new Date(1e3*e.exp)}}catch(e){}return null})(a))?o.getTime()-(new Date).getTime():0)-2e4;i(),l((()=>c.refresh(n)),e)}var o}}));return n(c,["logout","logoutAll"],(e=>async(...t)=>{const n=await e(...t);return i(),n}))}),(e=>t=>e(r(t,{beforeRequest:g}))),(e=>t=>{const a=O(),o=O(),l=e(r(t,{afterRequest:async(e,t)=>{if(401===(null==t?void 0:t.status))a.pub(null),o.pub(null);else{const e=await i(t);e&&o.pub(e);const{sessionJwt:n}=await s(t);n&&a.pub(n)}}})),c=n(l,["logout","logoutAll"],(e=>async(...t)=>{const n=await e(...t);return a.pub(null),o.pub(null),n}));return Object.assign(c,{onSessionTokenChange:a.sub,onUserChange:o.sub})}),(t=>a=>{var{persistTokens:o,sessionTokenViaCookie:i}=a,l=e(a,["persistTokens","sessionTokenViaCookie"]);if(p||console.warn("Storing auth tokens in local storage and cookies are a client side only capabilities and will not be done when running in the server"),!o||!p)return t(l);const c=t(r(l,{beforeRequest:J,afterRequest:async(e,t)=>{401===(null==t?void 0:t.status)?D():I(await s(t),i)}})),u=n(c,["logout","logoutAll"],T);return Object.assign(u,{getRefreshToken:j,getSessionToken:k})}))(((...e)=>{const n=t(...e);return Object.assign(Object.assign({},n),{flow:C(n),webauthn:(a=n,{async signUp(e,t){const n=await a.webauthn.signUp.start(e,window.location.origin,t),o=await x(n.data.options);return await a.webauthn.signUp.finish(n.data.transactionId,o)},async signIn(e){const t=await a.webauthn.signIn.start(e,window.location.origin),n=await A(t.data.options);return await a.webauthn.signIn.finish(t.data.transactionId,n)},async signUpOrIn(e){var t;const n=await a.webauthn.signUpOrIn.start(e,window.location.origin);if(null===(t=n.data)||void 0===t?void 0:t.create){const e=await x(n.data.options);return await a.webauthn.signUp.finish(n.data.transactionId,e)}{const e=await A(n.data.options);return await a.webauthn.signIn.finish(n.data.transactionId,e)}},async update(e,t){const n=await a.webauthn.update.start(e,window.location.origin,t),o=await x(n.data.options);return await a.webauthn.update.finish(n.data.transactionId,o)},helpers:{create:x,get:A,isSupported:K}})});var a}));export{U as default};
2
2
  //# sourceMappingURL=index.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.js","sources":["../src/constants.ts","../src/fp.ts","../src/helpers.ts","../src/state.ts","../src/tokens.ts","../src/webauthn.ts","../src/index.ts"],"sourcesContent":["const FINGERPRINT_PUBLIC_KEY = 'fingerprint.public.key';\nconst FINGERPRINT_ENDPOINT_URL = 'fingerprint.endpoint.url';\n\n// This sdk can be used in SSR apps\nexport const IS_BROWSER = typeof window !== 'undefined';\n/** Fingerprint.js identity key */\nexport const FP_KEY =\n\t(IS_BROWSER && localStorage.getItem(FINGERPRINT_PUBLIC_KEY)) || 'A9aCLRHzKCv3uL69oqDr';\n/** Fingerprint.js custom API endpoint */\nexport const FP_EP_URL =\n\t(IS_BROWSER && localStorage?.getItem(FINGERPRINT_ENDPOINT_URL)) || 'https://fp.descope.com';\n/** Fingerprint visitor data */\nexport const FP_BODY_DATA = 'fpData';\n/** Session ID for visitor */\nexport const VISITOR_SESSION_ID_PARAM = 'vsid';\n/** Request ID for visitor */\nexport const VISITOR_REQUEST_ID_PARAM = 'vrid';\n/** FP storage key */\nexport const FP_STORAGE_KEY = 'fp';\n/** External Id of the last user logged in */\nexport const LOCAL_STORAGE_LAST_USER_EXTERNAL_ID = 'dls_last_user_external_id';\n","import { load } from '@fingerprintjs/fingerprintjs-pro';\nimport {\n\tFP_EP_URL,\n\tFP_KEY,\n\tFP_STORAGE_KEY,\n\tVISITOR_REQUEST_ID_PARAM,\n\tVISITOR_SESSION_ID_PARAM\n} from './constants';\nimport { generateUUID } from './helpers';\n\ntype FingerprintObject = {\n\t[VISITOR_SESSION_ID_PARAM]: string;\n\t[VISITOR_REQUEST_ID_PARAM]: string;\n};\n\n// Storage FP Keys TTL is 24 hours\nconst STORAGE_TTL_MS = 24 * 60 * 60 * 1000;\n\nconst createFingerprintObject = (\n\tsessionId: string = '',\n\trequestId: string = ''\n): FingerprintObject => ({\n\t[VISITOR_SESSION_ID_PARAM]: sessionId,\n\t[VISITOR_REQUEST_ID_PARAM]: requestId\n});\n\n// Set FP data to storage with expiration\n// We set the request id and session id together so they will have the same TTL\n// This implementation is based on https://www.sohamkamani.com/javascript/localstorage-with-ttl-expiry/\nconst setFPToStorage = (value: FingerprintObject) => {\n\tconst now = new Date();\n\t// `item` is an object which contains the value\n\t// as well as the time when it's supposed to expire\n\tconst item = {\n\t\tvalue,\n\t\texpiry: now.getTime() + STORAGE_TTL_MS\n\t};\n\tlocalStorage.setItem(FP_STORAGE_KEY, JSON.stringify(item));\n};\n\n// Get Fingerprint from storage, will return null if not exists, of if expired\nconst getFPFromStorage = (returnExpired = false): FingerprintObject => {\n\tconst itemStr = localStorage.getItem(FP_STORAGE_KEY);\n\t// if the item doesn't exist, return null\n\tif (!itemStr) {\n\t\treturn null;\n\t}\n\tconst item = JSON.parse(itemStr);\n\tconst now = new Date();\n\t// compare the expiry time of the item with the current time\n\t// return null if needed\n\tif (now.getTime() > item.expiry && !returnExpired) {\n\t\treturn null;\n\t}\n\treturn item.value;\n};\n\n/**\n * Ensure fingerprint ids (request id, session id) exist.\n * If not, It will generate and load them into to browser storage.\n * NOTE: Using fingerprintJS data has cost, use considerably.\n * @param fpKey FingerprintJS API key\n */\nexport const ensureFingerprintIds = async (fpKey?: string) => {\n\ttry {\n\t\tif (getFPFromStorage()) {\n\t\t\t// FP is already in storage, no need to\n\t\t\treturn;\n\t\t}\n\n\t\tconst sessionId = generateUUID();\n\t\tconst agentP = load({ apiKey: fpKey || FP_KEY, endpoint: FP_EP_URL });\n\t\tconst agent = await agentP;\n\t\tconst { requestId } = await agent.get({ linkedId: sessionId });\n\t\tconst fpData = createFingerprintObject(sessionId, requestId);\n\t\tsetFPToStorage(fpData);\n\t} catch (ex) {\n\t\t// istanbul ignore next\n\t\tif (global.FB_DEBUG) {\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.error(ex);\n\t\t}\n\t}\n};\n\n/**\n * Get Fingerprint data (request ids) from storage, or create empty object\n * If data is expired, return it anyway\n */\nexport const getFingerprintData = (): FingerprintObject => {\n\t// get from storage, fallback to default\n\treturn getFPFromStorage(true) || createFingerprintObject();\n};\n","/** Generate UUID based on current time and some randomness */\nexport const generateUUID = () => {\n\t// return alphanumeric, sortable uuid of 27 characters\n\treturn (\n\t\tDate.now().toString(36) +\n\t\tMath.random().toString(36).substring(2) + // removing '0.' prefix\n\t\tMath.random().toString(36).substring(2)\n\t).substring(0, 27);\n};\n","// supported state types are string and object\ntype StateObject = Record<string, any>;\n\ntype Subscribers<T> = Record<string, SubscribeCb<T>>;\n\nconst compare = <T extends StateObject>(a: T, b: T) => {\n\tconst aProperties = (a && Object.getOwnPropertyNames(a)) || [];\n\tconst bProperties = (b && Object.getOwnPropertyNames(b)) || [];\n\n\tif (aProperties.length !== bProperties.length) {\n\t\treturn false;\n\t}\n\n\tfor (let i = 0; i < aProperties.length; i += 1) {\n\t\tconst propName = aProperties[i];\n\n\t\tif (a[propName] !== b[propName]) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n};\n\nconst clone = (state: StateObject): StateObject => {\n\treturn { ...state };\n};\n\nclass State<T extends StateObject> {\n\t#state: T;\n\n\t#subscribers: Subscribers<T> = {};\n\n\t#token = 0;\n\n\tconstructor(init: T) {\n\t\tthis.#state = init;\n\t}\n\n\tget current() {\n\t\treturn clone(this.#state) as T;\n\t}\n\n\tupdate(newState: T) {\n\t\tconst nextState: T = newState;\n\t\tif (!compare(this.#state, nextState)) {\n\t\t\tconst prevState = this.#state;\n\t\t\tthis.#state = nextState as T;\n\t\t\tObject.freeze(this.#state);\n\n\t\t\tsetTimeout(() => {\n\t\t\t\tObject.values(this.#subscribers).forEach((cb) => cb(clone(nextState) as T, prevState));\n\t\t\t}, 0);\n\t\t}\n\t}\n\n\tsubscribe(cb: SubscribeCb<T>) {\n\t\tthis.#token += 1;\n\t\tthis.#subscribers[this.#token] = cb;\n\n\t\t// return unsubscribe function\n\t\tconst currentToken = this.#token;\n\t\treturn () => this.#unsubscribe(currentToken.toString());\n\t}\n\n\t#unsubscribe(token: string) {\n\t\tconst isFound = !!this.#subscribers[token];\n\n\t\tif (isFound) {\n\t\t\tdelete this.#subscribers[token];\n\t\t}\n\t}\n\n\tunsubscribeAll() {\n\t\tthis.#subscribers = {};\n\t}\n}\nexport type SubscribeCb<T> = (state: T, prevState?: T) => void;\nexport default State;\n","import { JWTResponse } from '@descope/core-js-sdk';\nimport Cookies from 'js-cookie';\nimport { IS_BROWSER, LOCAL_STORAGE_LAST_USER_EXTERNAL_ID } from './constants';\nimport { RefreshFn, SdkState, TokensOptions } from './types';\n\n/** Default name for the session cookie name / local storage key */\nconst sessionTokenKey = 'DS';\n/** Default name for the refresh local storage key */\nconst refreshTokenKey = 'DSR';\n/** Holds the list of timer IDs for auto-refresh of the session token timers so we can clean them later */\nlet refreshTimeoutIds: NodeJS.Timeout[] = [];\n\n/**\n * Store refresh token in localStorage.\n * This is only relevant for development where the refresh token is returned in the response body.\n * For production, it is recommended to configure Descope project to return refresh token as httpOnly cookie as it is more secure this way.\n * @param refreshJwt The refresh JWT to store\n */\nfunction setRefreshToken(refreshJwt: string) {\n\tif (localStorage && refreshJwt) {\n\t\tlocalStorage.setItem(refreshTokenKey, refreshJwt);\n\t}\n}\n\n/**\n * Store the session JWT as a cookie on the given domain and path with the given expiration.\n * This is useful so that the application backend will automatically get the cookie for the session\n * @param sessionJwt The session JWT to store as a cookie\n * @param cookieParams configuration that is usually returned from the JWT\n * @param sessionTokenViaCookie weather to store session token on cookie or not\n */\nfunction setSessionToken(\n\tsessionJwt: string,\n\t{ cookiePath, cookieDomain, cookieExpiration }: Partial<JWTResponse>,\n\tsessionTokenViaCookie?: boolean\n) {\n\tif (sessionJwt) {\n\t\tif (sessionTokenViaCookie) {\n\t\t\tCookies.set(sessionTokenKey, sessionJwt, {\n\t\t\t\tpath: cookiePath,\n\t\t\t\tdomain: cookieDomain,\n\t\t\t\texpires: cookieExpiration,\n\t\t\t\tsameSite: 'None',\n\t\t\t\tsecure: true\n\t\t\t});\n\t\t} else {\n\t\t\tlocalStorage && localStorage.setItem(sessionTokenKey, sessionJwt);\n\t\t}\n\t}\n}\n\n/**\n * Get the JWT expiration WITHOUT VALIDATING the JWT\n * @param token The JWT to extract expiration from\n * @returns The Date for when the JWT expires or null if there is an issue\n */\nfunction getSessionExpiration(token: string) {\n\tconst parts = token.split('.');\n\ttry {\n\t\tif (parts.length === 3) {\n\t\t\tconst claims = JSON.parse(window.atob(token.split('.')[1]));\n\t\t\tif (claims.exp) {\n\t\t\t\treturn new Date(claims.exp * 1000);\n\t\t\t}\n\t\t}\n\t} catch (ex) {\n\t\t// fallback to null\n\t}\n\t// istanbul ignore next\n\treturn null;\n}\n\n/**\n * Start a timer to auto-refresh the session JWT based on the expiry of the session\n * @param refreshFn The function to actually perform the refresh\n * @param sessionJwt The current session JWT to extract timeout from\n * @param refreshJWT The current refresh JWT to be used for refresh function\n */\nfunction setRefreshSessionTimeout(refreshFn: RefreshFn, sessionJwt: string, refreshJWT: string) {\n\tconst sessionExpiration = getSessionExpiration(sessionJwt);\n\tif (sessionExpiration) {\n\t\tlet previousTimeout: NodeJS.Timeout;\n\t\twhile ((previousTimeout = refreshTimeoutIds.pop())) {\n\t\t\tclearTimeout(previousTimeout);\n\t\t}\n\t\t// set refresh to happen 20 (magic number) seconds before session token is expired\n\t\tconst refreshTimeout = sessionExpiration.getTime() - 20 * 1000 - new Date().getTime();\n\t\tconst timeoutId = setTimeout(() => {\n\t\t\t// token can also be empty if the refresh JWT is returned as httpOnly cookie\n\t\t\trefreshFn(refreshJWT);\n\t\t}, refreshTimeout);\n\t\trefreshTimeoutIds.push(timeoutId);\n\t}\n}\n\n/**\n * Extracts JWT response from request body.\n * @param body The response body\n */\nfunction extractJWTResponse(body: any): JWTResponse {\n\t// auth info can be in body authInfo attribute, or the body itself, depending on the core-sdk function\n\treturn body?.authInfo || body || ({} as JWTResponse);\n}\n\n/**\n * Hook function to wrap around Descope SDK and handle tokens\n * @param refreshFn The function to use for refreshing token\n * @param res The raw HTTP response\n * @param state The callbacks that are used to update session token\n * @param options token options that are used for tokens management purposes\n */\nexport async function handleDescopeTokens(\n\trefreshFn: RefreshFn,\n\tres: Response,\n\tstate: SdkState,\n\toptions: TokensOptions\n) {\n\ttry {\n\t\tif (res.status === 401) {\n\t\t\t// reset state if got unauthorized status code\n\t\t\tstate.sessionToken.update({ sessionToken: '' });\n\t\t\tstate.user.update({});\n\t\t\treturn;\n\t\t}\n\t\tconst body = await res?.json();\n\t\tif (body) {\n\t\t\tconst { sessionJwt, refreshJwt, user, ...cookieParams } = extractJWTResponse(body);\n\t\t\t// Persist token\n\t\t\tif (options.persistTokens) {\n\t\t\t\tsetSessionToken(sessionJwt, cookieParams, options.sessionTokenViaCookie);\n\t\t\t\tsetRefreshToken(refreshJwt);\n\t\t\t}\n\n\t\t\t// Update state\n\t\t\tif (sessionJwt) {\n\t\t\t\tstate.sessionToken.update({ sessionToken: sessionJwt });\n\t\t\t}\n\t\t\tif (user) {\n\t\t\t\tconst externalId = user?.externalIds?.[0];\n\t\t\t\tif (IS_BROWSER && externalId) {\n\t\t\t\t\tlocalStorage?.setItem(LOCAL_STORAGE_LAST_USER_EXTERNAL_ID, externalId);\n\t\t\t\t}\n\t\t\t\tstate.user.update(user);\n\t\t\t}\n\n\t\t\t// Auto refresh\n\t\t\tif (sessionJwt && refreshJwt && options.autoRefresh) {\n\t\t\t\tsetRefreshSessionTimeout(refreshFn, sessionJwt, refreshJwt);\n\t\t\t}\n\t\t}\n\t} catch (ex) {\n\t\t// istanbul ignore next\n\t\t// eslint-disable-next-line no-console\n\t\tconsole.error('Could not set tokens from body', ex);\n\t}\n}\n\n/** Return the refresh token from the localStorage. Not for production usage because refresh token will not be saved in localStorage. */\nexport function getRefreshToken() {\n\treturn localStorage ? localStorage?.getItem(refreshTokenKey) : '';\n}\n\n/**\n * Return the session token. first try to get from cookie, and fallback to local storage\n * See sessionTokenViaCookie option for more details about session token location\n */\nexport function getSessionToken(): string {\n\treturn Cookies.get(sessionTokenKey) || localStorage?.getItem(sessionTokenKey) || '';\n}\n\n/** Remove both the localStorage refresh JWT and the session cookie */\nexport function clearTokens() {\n\tlocalStorage?.removeItem(refreshTokenKey);\n\tlocalStorage?.removeItem(sessionTokenKey);\n\tCookies.remove(sessionTokenKey);\n}\n","import { IS_BROWSER } from './constants';\nimport { CoreSdk } from './types';\n\n/** Constructs a higher level WebAuthn API that wraps the functions from code-js-sdk */\nconst createWebAuthn = (sdk: CoreSdk) => ({\n\tasync signUp(identifier: string, name: string) {\n\t\tconst startResponse = await sdk.webauthn.signUp.start(identifier, window.location.origin, name);\n\t\tconst createResponse = await create(startResponse.data.options);\n\t\tconst finishResponse = await sdk.webauthn.signUp.finish(\n\t\t\tstartResponse.data.transactionId,\n\t\t\tcreateResponse\n\t\t);\n\t\treturn finishResponse;\n\t},\n\n\tasync signIn(identifier: string) {\n\t\tconst startResponse = await sdk.webauthn.signIn.start(identifier, window.location.origin);\n\t\tconst getResponse = await get(startResponse.data.options);\n\t\tconst finishResponse = await sdk.webauthn.signIn.finish(\n\t\t\tstartResponse.data.transactionId,\n\t\t\tgetResponse\n\t\t);\n\t\treturn finishResponse;\n\t},\n\n\tasync signUpOrIn(identifier: string) {\n\t\tconst startResponse = await sdk.webauthn.signUpOrIn.start(identifier, window.location.origin);\n\t\tif (startResponse.data?.create) {\n\t\t\tconst createResponse = await create(startResponse.data.options);\n\t\t\tconst finishResponse = await sdk.webauthn.signUp.finish(\n\t\t\t\tstartResponse.data.transactionId,\n\t\t\t\tcreateResponse\n\t\t\t);\n\t\t\treturn finishResponse;\n\t\t} else {\n\t\t\tconst getResponse = await get(startResponse.data.options);\n\t\t\tconst finishResponse = await sdk.webauthn.signIn.finish(\n\t\t\t\tstartResponse.data.transactionId,\n\t\t\t\tgetResponse\n\t\t\t);\n\t\t\treturn finishResponse;\n\t\t}\n\t},\n\n\tasync update(identifier: string, token: string) {\n\t\tconst startResponse = await sdk.webauthn.update.start(\n\t\t\tidentifier,\n\t\t\twindow.location.origin,\n\t\t\ttoken\n\t\t);\n\t\tconst createResponse = await create(startResponse.data.options);\n\t\tconst finishResponse = await sdk.webauthn.update.finish(\n\t\t\tstartResponse.data.transactionId,\n\t\t\tcreateResponse\n\t\t);\n\t\treturn finishResponse;\n\t},\n\n\t/** Helper functions for working with WebAuthn browser APIs using JSON data */\n\thelpers: {\n\t\t/** Wraps the navigation.credentials.create call to translate JSON inputs and outputs */\n\t\tcreate,\n\t\t/** Wraps the navigation.credentials.get call to translate JSON inputs and outputs */\n\t\tget,\n\t\t/** Checks if the browser supports WebAuthn,\n\t\t * and can optionally require in addition that The browser supports WebAuthn with built-in biometrics */\n\t\tisSupported\n\t}\n});\n\n// Helpers functions\n\nasync function create(options: string): Promise<string> {\n\tconst createOptions = decodeCreateOptions(options);\n\tconst createResponse = (await navigator.credentials.create(\n\t\tcreateOptions\n\t)) as AttestationPublicKeyCredential;\n\treturn encodeCreateResponse(createResponse);\n}\n\nasync function get(options: string): Promise<string> {\n\tconst getOptions = decodeGetOptions(options);\n\tconst getResponse = (await navigator.credentials.get(getOptions)) as AssertionPublicKeyCredential;\n\treturn encodeGetResponse(getResponse);\n}\n\nasync function isSupported(requirePlatformAuthenticator: boolean = false): Promise<boolean> {\n\tif (!IS_BROWSER) {\n\t\treturn Promise.resolve(false);\n\t}\n\tconst supported = !!(\n\t\tPublicKeyCredential &&\n\t\tnavigator.credentials &&\n\t\tnavigator.credentials.create &&\n\t\tnavigator.credentials.get\n\t);\n\tif (\n\t\tsupported &&\n\t\trequirePlatformAuthenticator &&\n\t\tPublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable\n\t) {\n\t\treturn PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable();\n\t}\n\treturn supported;\n}\n\n// Conversion of data structures for Create/Attestation/Register ceremony\n\ntype AttestationPublicKeyCredential = PublicKeyCredential & {\n\tresponse: AuthenticatorAttestationResponse;\n};\n\nfunction decodeCreateOptions(value: string): CredentialCreationOptions {\n\tconst options = JSON.parse(value);\n\toptions.publicKey.challenge = decodeBase64Url(options.publicKey.challenge);\n\toptions.publicKey.user.id = decodeBase64Url(options.publicKey.user.id);\n\toptions.publicKey.excludeCredentials?.forEach((item: any) => {\n\t\titem.id = decodeBase64Url(item.id);\n\t});\n\treturn options;\n}\n\nfunction encodeCreateResponse(credential: AttestationPublicKeyCredential): string {\n\treturn JSON.stringify({\n\t\t...credential,\n\t\trawId: encodeBase64Url(credential.rawId),\n\t\tresponse: {\n\t\t\t...credential.response,\n\t\t\tattestationObject: encodeBase64Url(credential.response.attestationObject),\n\t\t\tclientDataJSON: encodeBase64Url(credential.response.clientDataJSON)\n\t\t}\n\t});\n}\n\n// Conversion of data structures for Get/Assertion/Login ceremony\n\ntype AssertionPublicKeyCredential = PublicKeyCredential & {\n\tresponse: AuthenticatorAssertionResponse;\n};\n\nfunction decodeGetOptions(value: string): CredentialRequestOptions {\n\tconst options = JSON.parse(value);\n\toptions.publicKey.challenge = decodeBase64Url(options.publicKey.challenge);\n\toptions.publicKey.allowCredentials?.forEach((item: any) => {\n\t\titem.id = decodeBase64Url(item.id);\n\t});\n\treturn options;\n}\n\nfunction encodeGetResponse(credential: AssertionPublicKeyCredential): string {\n\treturn JSON.stringify({\n\t\t...credential,\n\t\trawId: encodeBase64Url(credential.rawId),\n\t\tresponse: {\n\t\t\t...credential.response,\n\t\t\tauthenticatorData: encodeBase64Url(credential.response.authenticatorData),\n\t\t\tclientDataJSON: encodeBase64Url(credential.response.clientDataJSON),\n\t\t\tsignature: encodeBase64Url(credential.response.signature),\n\t\t\tuserHandle: credential.response.userHandle\n\t\t\t\t? encodeBase64Url(credential.response.userHandle)\n\t\t\t\t: undefined\n\t\t}\n\t});\n}\n\n// Conversion between ArrayBuffers and Base64Url strings\n\nfunction decodeBase64Url(value: string): ArrayBufferLike {\n\tconst base64 = value.replace(/_/g, '/').replace(/-/g, '+');\n\treturn Uint8Array.from(atob(base64), (c) => c.charCodeAt(0)).buffer;\n}\n\nfunction encodeBase64Url(value: ArrayBufferLike): string {\n\tconst base64 = btoa(String.fromCharCode.apply(null, new Uint8Array(value)));\n\treturn base64.replace(/\\//g, '_').replace(/\\+/g, '-').replace(/=/g, '');\n}\n\n// Exports\n\nexport default createWebAuthn;\n","import createSdk, { UserResponse } from '@descope/core-js-sdk';\nimport { FP_BODY_DATA, IS_BROWSER, LOCAL_STORAGE_LAST_USER_EXTERNAL_ID } from './constants';\nimport { ensureFingerprintIds, getFingerprintData } from './fp';\nimport State from './state';\nimport { clearTokens, getRefreshToken, getSessionToken, handleDescopeTokens } from './tokens';\nimport { CoreSdk, TokensOptions } from './types';\nimport createWebAuthn from './webauthn';\n\ndeclare const BUILD_VERSION: string;\n\n/** Configuration arguments which include the Descope core SDK args and fingerprint configuration.\n * Also specifies token options - if we should persist tokens from responses automatically and auto-refresh.\n */\nexport type WebJSSDKArgs = Parameters<typeof createSdk>[0] &\n\tTokensOptions & {\n\t\t// FingerprintJS API key\n\t\tfpKey?: string;\n\t\t// If true, sdk object initialization will load FingerprintJS data into storage, for later usage\n\t\tfpLoad?: boolean;\n\t};\n\n// Export function to get session token, to be used by package consumers\nexport { getSessionToken };\n\n/**\n * Wrapper around DescopeSDK to handle fingerprint.js and storage of JWT tokens in cookies and localStorage,\n * It also sets a timer to refresh session JWT automatically.\n */\nexport default ({\n\tautoRefresh = true,\n\tpersistTokens = true,\n\tsessionTokenViaCookie,\n\tfpKey,\n\tfpLoad,\n\t...args\n}: WebJSSDKArgs) => {\n\t// istanbul ignore next\n\tif (!IS_BROWSER) {\n\t\t// eslint-disable-next-line no-console\n\t\tconsole.warn(\n\t\t\t'Fingerprint is a client side only capability and will not work when running in the server'\n\t\t);\n\t} else if (fpLoad) {\n\t\tensureFingerprintIds(fpKey).catch(() => null);\n\t}\n\n\tconst sdkConfig = args;\n\n\t// we defer defining the hook implementations themselves until the webSdk is created later, so that the hooks\n\t// call the actual webSdk functions rather than those from coreSdk, and so that the sdk functions used by\n\t// the hooks can be mocked\n\tlet beforeRequestHook: typeof sdkConfig.hooks.beforeRequest;\n\tlet afterRequestHook: typeof sdkConfig.hooks.afterRequest;\n\n\tconst sessionToken = new State<{ sessionToken: string }>({ sessionToken: '' });\n\tconst user = new State<UserResponse>({} as UserResponse);\n\n\tsdkConfig.hooks = {\n\t\tbeforeRequest: (config) => {\n\t\t\treturn beforeRequestHook?.(config);\n\t\t},\n\t\tafterRequest: (req, res) => {\n\t\t\treturn afterRequestHook?.(req, res);\n\t\t}\n\t};\n\n\tconst coreSdk = createSdk(sdkConfig);\n\tconst webauthnSdk = createWebAuthn(coreSdk);\n\n\tconst webSdk = {\n\t\t...coreSdk,\n\t\tflow: {\n\t\t\t...coreSdk.flow,\n\t\t\tstart: async (\n\t\t\t\tflowId: string,\n\t\t\t\tinteractionId?: string,\n\t\t\t\tinput?: Record<string, FormDataEntryValue>,\n\t\t\t\toptions?: { tenant?: string }\n\t\t\t) => {\n\t\t\t\tconst webAuthnSupport = await webauthnSdk.helpers.isSupported();\n\t\t\t\tconst lastUserExternalId = localStorage?.getItem(LOCAL_STORAGE_LAST_USER_EXTERNAL_ID);\n\t\t\t\tconst readyOptions: Parameters<typeof coreSdk.flow.start>[3] = {\n\t\t\t\t\ttenant: options?.tenant,\n\t\t\t\t\tredirectUrl: window.location.href,\n\t\t\t\t\tdeviceInfo: {\n\t\t\t\t\t\twebAuthnSupport\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\tif (lastUserExternalId) {\n\t\t\t\t\treadyOptions.lastUser = {\n\t\t\t\t\t\texternalId: lastUserExternalId\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\treturn coreSdk.flow.start(flowId, interactionId, input, readyOptions);\n\t\t\t}\n\t\t},\n\t\twebauthn: webauthnSdk,\n\t\tonSessionTokenChange: (cb: (sessionToken: string) => void) => {\n\t\t\t// wrapper callback converts from the state object to sessionToken string\n\t\t\tconst bcWrapper = ({ sessionToken }) => {\n\t\t\t\tcb(sessionToken);\n\t\t\t};\n\n\t\t\t// run callback with current state for a case that the state's consumer calls 'subscribe' after state was already updated\n\t\t\tconst currentSessionToken = sessionToken.current?.sessionToken;\n\t\t\tif (currentSessionToken) {\n\t\t\t\tcb(currentSessionToken);\n\t\t\t}\n\t\t\treturn sessionToken.subscribe(bcWrapper);\n\t\t},\n\t\tonUserChange: (cb: (user: UserResponse) => void) => {\n\t\t\tconst bcWrapper = (user: UserResponse) => {\n\t\t\t\tcb(user);\n\t\t\t};\n\t\t\tconst currUser = user.current;\n\t\t\t// run callback with current state for a case that the state's consumer calls 'subscribe' after state was already updated\n\t\t\tif (currUser && Object.entries(currUser).length > 0) {\n\t\t\t\tcb(currUser);\n\t\t\t}\n\n\t\t\treturn user.subscribe(bcWrapper);\n\t\t},\n\t\t// Returns refresh token. Use this function when:\n\t\t// 1. You need to pass refresh token to another party (For example, in SSR)\n\t\t// 2. Descope project's configuration is set to manage token response in BODY (in contrast to manage response in COOKIES)\n\t\t// NOTE: Refresh token is sensitive token. Prefer using this function only for testing, and to manage token response in COOKIES)\n\t\tgetRefreshToken\n\t};\n\n\tif (!IS_BROWSER) {\n\t\t// eslint-disable-next-line no-console\n\t\tconsole.warn(\n\t\t\t'Storing auth tokens in local storage and cookies are a client side only capabilities and will not be done when running in the server'\n\t\t);\n\t\treturn webSdk;\n\t}\n\n\tif (autoRefresh) {\n\t\t// Make it easier for Descoper to just call logout/logoutAll without parameters,\n\t\t// In case this is a dev env and refresh is stored in localStorage\n\t\t['logout', 'logoutAll'].forEach((fnName) => {\n\t\t\tconst originFn = coreSdk[fnName] as Function;\n\t\t\twebSdk[fnName] = (...args: any) => {\n\t\t\t\tconst refreshToken = getRefreshToken();\n\t\t\t\tconst token = args?.shift();\n\t\t\t\tconst logoutArgs = [token || refreshToken, ...args];\n\t\t\t\tconst res = originFn(...logoutArgs);\n\t\t\t\tclearTokens();\n\t\t\t\tIS_BROWSER && localStorage?.removeItem(LOCAL_STORAGE_LAST_USER_EXTERNAL_ID);\n\t\t\t\tsessionToken.update({ sessionToken: '' });\n\t\t\t\treturn res;\n\t\t\t};\n\t\t});\n\t}\n\n\tbeforeRequestHook = (config) => {\n\t\tif (config.body) {\n\t\t\tconfig.body[FP_BODY_DATA] = getFingerprintData();\n\t\t}\n\n\t\tif (!config.token && persistTokens) {\n\t\t\tconfig.token = getRefreshToken();\n\t\t}\n\t\tconfig.headers = {\n\t\t\t...config.headers,\n\t\t\t'x-descope-sdk-name': 'web-js',\n\t\t\t'x-descope-sdk-version': BUILD_VERSION\n\t\t};\n\t\treturn config;\n\t};\n\n\twebSdk.me = async (...args: Parameters<CoreSdk['me']>) => {\n\t\tconst res = await coreSdk.me(...args);\n\t\tif (res.ok) {\n\t\t\tconst body = await res.response?.clone().json();\n\t\t\tuser.update(body);\n\t\t}\n\t\treturn res;\n\t};\n\n\tif (autoRefresh || persistTokens) {\n\t\tafterRequestHook = (_, res) => {\n\t\t\thandleDescopeTokens(\n\t\t\t\twebSdk.refresh,\n\t\t\t\tres,\n\t\t\t\t{ sessionToken, user },\n\t\t\t\t{ autoRefresh, persistTokens, sessionTokenViaCookie }\n\t\t\t);\n\t\t};\n\t}\n\n\tif (autoRefresh) {\n\t\tif (getRefreshToken()) {\n\t\t\t// refresh on init is done after afterRequestHook is configured\n\t\t\twebSdk.refresh();\n\t\t}\n\t}\n\n\treturn webSdk;\n};\n"],"names":["IS_BROWSER","window","FP_KEY","localStorage","getItem","FP_EP_URL","createFingerprintObject","sessionId","requestId","vsid","vrid","getFPFromStorage","returnExpired","itemStr","item","JSON","parse","Date","getTime","expiry","value","ensureFingerprintIds","async","fpKey","now","toString","Math","random","substring","agentP","load","apiKey","endpoint","agent","get","linkedId","setItem","stringify","setFPToStorage","ex","global","FB_DEBUG","console","error","clone","state","Object","assign","State","constructor","init","_State_state","set","this","_State_subscribers","_State_token","__classPrivateFieldSet","current","__classPrivateFieldGet","update","newState","nextState","a","b","aProperties","getOwnPropertyNames","bProperties","length","i","propName","compare","prevState","freeze","setTimeout","values","forEach","cb","subscribe","currentToken","_State_instances","_State_unsubscribe","call","unsubscribeAll","token","refreshTimeoutIds","setRefreshSessionTimeout","refreshFn","sessionJwt","refreshJWT","sessionExpiration","parts","split","claims","atob","exp","getSessionExpiration","previousTimeout","pop","clearTimeout","refreshTimeout","timeoutId","push","handleDescopeTokens","res","options","status","sessionToken","user","body","json","_b","authInfo","extractJWTResponse","refreshJwt","cookieParams","__rest","persistTokens","cookiePath","cookieDomain","cookieExpiration","sessionTokenViaCookie","Cookies","path","domain","expires","sameSite","secure","setSessionToken","setRefreshToken","externalId","_a","externalIds","autoRefresh","getRefreshToken","getSessionToken","create","createOptions","publicKey","challenge","decodeBase64Url","id","excludeCredentials","decodeCreateOptions","createResponse","navigator","credentials","credential","rawId","encodeBase64Url","response","attestationObject","clientDataJSON","getOptions","allowCredentials","decodeGetOptions","getResponse","authenticatorData","signature","userHandle","undefined","isSupported","requirePlatformAuthenticator","Promise","resolve","supported","PublicKeyCredential","isUserVerifyingPlatformAuthenticatorAvailable","base64","replace","Uint8Array","from","c","charCodeAt","buffer","btoa","String","fromCharCode","apply","index","fpLoad","args","catch","warn","sdkConfig","beforeRequestHook","afterRequestHook","hooks","beforeRequest","config","afterRequest","req","coreSdk","createSdk","webauthnSdk","sdk","identifier","name","startResponse","webauthn","signUp","start","location","origin","data","finish","transactionId","signIn","signUpOrIn","helpers","webSdk","flow","flowId","interactionId","input","webAuthnSupport","lastUserExternalId","readyOptions","tenant","redirectUrl","href","deviceInfo","lastUser","onSessionTokenChange","currentSessionToken","onUserChange","currUser","entries","fnName","originFn","refreshToken","logoutArgs","shift","removeItem","remove","headers","me","ok","_","refresh"],"mappings":"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"}
1
+ {"version":3,"file":"index.esm.js","sources":["../src/enhancers/helpers/index.ts","../src/enhancers/withAnalytics.ts","../src/constants.ts","../src/enhancers/withFingerprint/constants.ts","../src/enhancers/withFingerprint/helpers.ts","../src/enhancers/withFingerprint/index.ts","../src/enhancers/withLastLoggedInUser/index.ts","../src/enhancers/withLastLoggedInUser/helpers.ts","../src/enhancers/withLastLoggedInUser/constants.ts","../src/enhancers/withNotifications/helpers.ts","../src/enhancers/withPersistTokens/helpers.ts","../src/enhancers/withPersistTokens/constants.ts","../src/enhancers/withPersistTokens/index.ts","../src/sdk/webauthn.ts","../src/sdk/flow.ts","../src/sdk/index.ts","../src/index.ts","../src/enhancers/helpers/compose.ts","../src/enhancers/withAutoRefresh/index.ts","../src/enhancers/withAutoRefresh/helpers.ts","../src/enhancers/withNotifications/index.ts"],"sourcesContent":["import { JWTResponse, UserResponse } from '@descope/core-js-sdk';\nimport { CoreSdkConfig } from '../../types';\n\n/**\n * Add hooks to an existing core-sdk config\n */\nexport const addHooks = <Config extends CoreSdkConfig>(\n\tconfig: Config,\n\thooks: Config['hooks']\n): Config => {\n\t['beforeRequest', 'afterRequest'].reduce((acc, key) => {\n\t\tacc[key] = [].concat(config.hooks?.[key] || []).concat(hooks?.[key] || []);\n\n\t\treturn acc;\n\t}, (config.hooks ??= {}));\n\n\treturn config;\n};\n\nexport { compose } from './compose';\n\n/**\n * Extract auth info (JWT response) from fetch response\n * We assume that the auth info is under a \"authInfo\" attribute (flow response)\n * Or the body itself (other auth methods response)\n */\nexport const getAuthInfoFromResponse = async (res: Response): Promise<Partial<JWTResponse>> => {\n\tif (!res?.ok) return {};\n\tconst body = await res?.clone().json();\n\treturn body?.authInfo || body || {};\n};\n\n/**\n * Extract user from fetch response\n * User my exist under \"user\" attribute (auth methods response)\n * Or the body itself (when calling \"me\")\n */\nexport const getUserFromResponse = async (res: Response): Promise<UserResponse> | undefined => {\n\tconst authInfo = await getAuthInfoFromResponse(res);\n\n\treturn (\n\t\tauthInfo?.user || (authInfo?.hasOwnProperty('userId') ? (authInfo as UserResponse) : undefined)\n\t);\n};\n\nexport const isLocalStorage = typeof localStorage !== 'undefined';\n\nexport const setLocalStorage = (key: string, value: string) =>\n\tisLocalStorage && localStorage?.setItem(key, value);\nexport const getLocalStorage = (key: string) => isLocalStorage && localStorage?.getItem(key);\nexport const removeLocalStorage = (key: string) => isLocalStorage && localStorage?.removeItem(key);\n","import { CreateWebSdk } from '../sdk';\nimport { BeforeRequestHook } from '../types';\nimport { addHooks } from './helpers';\n\ndeclare const BUILD_VERSION: string;\n\nconst beforeRequest: BeforeRequestHook = (config) =>\n\tObject.assign(config, {\n\t\theaders: {\n\t\t\t...config.headers,\n\t\t\t'x-descope-sdk-name': 'web-js',\n\t\t\t'x-descope-sdk-version': BUILD_VERSION\n\t\t}\n\t});\n\n/**\n * Adds analytics headers to requests\n */\nexport const withAnalytics =\n\t<T extends CreateWebSdk>(createSdk: T) =>\n\t(config: Parameters<T>[0]) =>\n\t\tcreateSdk(addHooks(config, { beforeRequest }));\n","// This sdk can be used in SSR apps\nexport const IS_BROWSER = typeof window !== 'undefined';\n","import { IS_BROWSER } from '../../constants';\n\nconst FINGERPRINT_PUBLIC_KEY = 'fingerprint.public.key';\nconst FINGERPRINT_ENDPOINT_URL = 'fingerprint.endpoint.url';\n\n/** Fingerprint.js identity key */\nexport const FP_KEY =\n\t(IS_BROWSER && localStorage.getItem(FINGERPRINT_PUBLIC_KEY)) || 'A9aCLRHzKCv3uL69oqDr';\n/** Fingerprint.js custom API endpoint */\nexport const FP_EP_URL =\n\t(IS_BROWSER && localStorage?.getItem(FINGERPRINT_ENDPOINT_URL)) || 'https://fp.descope.com';\n/** Fingerprint visitor data */\nexport const FP_BODY_DATA = 'fpData';\n/** Session ID for visitor */\nexport const VISITOR_SESSION_ID_PARAM = 'vsid';\n/** Request ID for visitor */\nexport const VISITOR_REQUEST_ID_PARAM = 'vrid';\n/** FP storage key */\nexport const FP_STORAGE_KEY = 'fp';\n// Storage FP Keys TTL is 24 hours\nexport const STORAGE_TTL_MS = 24 * 60 * 60 * 1000;\n","import { load } from '@fingerprintjs/fingerprintjs-pro';\nimport {\n\tFP_EP_URL,\n\tFP_KEY,\n\tFP_STORAGE_KEY,\n\tSTORAGE_TTL_MS,\n\tVISITOR_REQUEST_ID_PARAM,\n\tVISITOR_SESSION_ID_PARAM\n} from './constants';\nimport { FingerprintObject } from './types';\n\nconst createFingerprintObject = (\n\tsessionId: string = '',\n\trequestId: string = ''\n): FingerprintObject => ({\n\t[VISITOR_SESSION_ID_PARAM]: sessionId,\n\t[VISITOR_REQUEST_ID_PARAM]: requestId\n});\n\n/** Generate UUID based on current time and some randomness */\nconst generateUUID = () => {\n\t// return alphanumeric, sortable uuid of 27 characters\n\treturn (\n\t\tDate.now().toString(36) +\n\t\tMath.random().toString(36).substring(2) + // removing '0.' prefix\n\t\tMath.random().toString(36).substring(2)\n\t).substring(0, 27);\n};\n\n// Set FP data to storage with expiration\n// We set the request id and session id together so they will have the same TTL\n// This implementation is based on https://www.sohamkamani.com/javascript/localstorage-with-ttl-expiry/\nconst setFPToStorage = (value: FingerprintObject) => {\n\tconst now = new Date();\n\t// `item` is an object which contains the value\n\t// as well as the time when it's supposed to expire\n\tconst item = {\n\t\tvalue,\n\t\texpiry: now.getTime() + STORAGE_TTL_MS\n\t};\n\tlocalStorage.setItem(FP_STORAGE_KEY, JSON.stringify(item));\n};\n\n// Get Fingerprint from storage, will return null if not exists, of if expired\nconst getFPFromStorage = (returnExpired = false): FingerprintObject => {\n\tconst itemStr = localStorage.getItem(FP_STORAGE_KEY);\n\t// if the item doesn't exist, return null\n\tif (!itemStr) {\n\t\treturn null;\n\t}\n\tconst item = JSON.parse(itemStr);\n\tconst now = new Date();\n\t// compare the expiry time of the item with the current time\n\t// return null if needed\n\tif (now.getTime() > item.expiry && !returnExpired) {\n\t\treturn null;\n\t}\n\treturn item.value;\n};\n\n/**\n * Ensure fingerprint ids (request id, session id) exist.\n * If not, It will generate and load them into to browser storage.\n * NOTE: Using fingerprintJS data has cost, use considerably.\n * @param fpKey FingerprintJS API key\n */\nexport const ensureFingerprintIds = async (fpKey?: string) => {\n\ttry {\n\t\tif (getFPFromStorage()) {\n\t\t\t// FP is already in storage, no need to\n\t\t\treturn;\n\t\t}\n\n\t\tconst sessionId = generateUUID();\n\t\tconst agentP = load({ apiKey: fpKey || FP_KEY, endpoint: FP_EP_URL });\n\t\tconst agent = await agentP;\n\t\tconst { requestId } = await agent.get({ linkedId: sessionId });\n\t\tconst fpData = createFingerprintObject(sessionId, requestId);\n\t\tsetFPToStorage(fpData);\n\t} catch (ex) {\n\t\t// istanbul ignore next\n\t\tif (global.FB_DEBUG) {\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.error(ex);\n\t\t}\n\t}\n};\n\n/**\n * Get Fingerprint data (request ids) from storage, or create empty object\n * If data is expired, return it anyway\n */\nexport const getFingerprintData = (): FingerprintObject => {\n\t// get from storage, fallback to default\n\treturn getFPFromStorage(true) || createFingerprintObject();\n};\n","import { IS_BROWSER } from '../../constants';\nimport { CreateWebSdk } from '../../sdk';\nimport { BeforeRequestHook } from '../../types';\nimport { addHooks } from '../helpers';\nimport { FP_BODY_DATA } from './constants';\nimport { ensureFingerprintIds, getFingerprintData } from './helpers';\nimport { FingerprintOptions } from './types';\n\nconst beforeRequest: BeforeRequestHook = (config) => {\n\tif (config.body) {\n\t\tconfig.body[FP_BODY_DATA] = getFingerprintData();\n\t}\n\n\treturn config;\n};\n\n/**\n * Add fingerprint data to outgoing requests\n */\nexport const withFingerprint =\n\t<T extends CreateWebSdk>(createSdk: T) =>\n\t({ fpKey, fpLoad, ...config }: Parameters<T>[0] & FingerprintOptions) => {\n\t\tif (!IS_BROWSER) {\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.warn(\n\t\t\t\t'Fingerprint is a client side only capability and will not work when running in the server'\n\t\t\t);\n\t\t} else if (fpLoad) {\n\t\t\tensureFingerprintIds(fpKey).catch(() => null);\n\t\t}\n\n\t\treturn createSdk(addHooks(config, { beforeRequest }));\n\t};\n","import { SdkFnWrapper, wrapWith } from '@descope/core-js-sdk';\nimport { CreateWebSdk } from '../../sdk';\nimport { AfterRequestHook, CoreSdk } from '../../types';\nimport { addHooks, getUserFromResponse } from '../helpers';\nimport { getLastUserExternalId, removeLastUserExternalId, setLastUserExternalId } from './helpers';\n\n/**\n * Adds last logged in user to flow start request\n */\n// eslint-disable-next-line import/exports-last\nexport const withLastLoggedInUser =\n\t<T extends CreateWebSdk>(createSdk: T) =>\n\t(config: Parameters<T>[0]) => {\n\t\tconst afterRequest: AfterRequestHook = async (_req, res) => {\n\t\t\tconst userDetails = await getUserFromResponse(res);\n\t\t\tconst externalId = userDetails?.externalIds?.[0];\n\t\t\tif (externalId) setLastUserExternalId(externalId);\n\t\t};\n\n\t\tconst sdk = createSdk(addHooks(config, { afterRequest }));\n\n\t\tlet wrappedSdk = wrapWith(sdk, ['flow.start'], startWrapper);\n\t\twrappedSdk = wrapWith(wrappedSdk, ['logout', 'logoutAll'], logoutWrapper);\n\n\t\treturn wrappedSdk;\n\t};\n\nconst startWrapper: SdkFnWrapper<{}> =\n\t(fn) =>\n\tasync (...args) => {\n\t\targs[1] = args[1] || {};\n\t\tconst [, options] = args as unknown as Parameters<CoreSdk['flow']['start']>;\n\t\tconst externalId = getLastUserExternalId();\n\n\t\tif (externalId) {\n\t\t\toptions.lastUser = { externalId };\n\t\t}\n\n\t\tconst resp = await fn(...args);\n\n\t\treturn resp;\n\t};\n\nconst logoutWrapper: SdkFnWrapper<{}> =\n\t(fn) =>\n\tasync (...args) => {\n\t\tconst resp = await fn(...args);\n\n\t\tremoveLastUserExternalId();\n\n\t\treturn resp;\n\t};\n","import { getLocalStorage, removeLocalStorage, setLocalStorage } from '../helpers';\nimport { LOCAL_STORAGE_LAST_USER_EXTERNAL_ID } from './constants';\n\nexport const setLastUserExternalId = (externalId: string) => {\n\treturn setLocalStorage(LOCAL_STORAGE_LAST_USER_EXTERNAL_ID, externalId);\n};\n\nexport const getLastUserExternalId = () => {\n\treturn getLocalStorage(LOCAL_STORAGE_LAST_USER_EXTERNAL_ID);\n};\n\nexport const removeLastUserExternalId = () => {\n\treturn removeLocalStorage(LOCAL_STORAGE_LAST_USER_EXTERNAL_ID);\n};\n","/** External Id of the last user logged in */\nexport const LOCAL_STORAGE_LAST_USER_EXTERNAL_ID = 'dls_last_user_external_id';\n","// create publisher/subscriber instances\nexport function createPubSub<T extends any>() {\n\tconst cbs = [];\n\n\tconst sub = (cb: (data: T) => void) => {\n\t\tconst idx = cbs.push(cb) - 1;\n\t\treturn () => cbs.splice(idx, 1);\n\t};\n\n\tconst pub = (data: T) => {\n\t\tcbs.forEach((cb) => cb(data));\n\t};\n\n\treturn { pub, sub };\n}\n","import { JWTResponse } from '@descope/core-js-sdk';\nimport Cookies from 'js-cookie';\nimport { BeforeRequestHook } from '../../types';\nimport { REFRESH_TOKEN_KEY, SESSION_TOKEN_KEY } from './constants';\nimport { getLocalStorage, removeLocalStorage, setLocalStorage } from '../helpers';\n\n/**\n * Store the session JWT as a cookie on the given domain and path with the given expiration.\n * This is useful so that the application backend will automatically get the cookie for the session\n * @param name cookie name\n * @param value The JWT to store as a cookie\n * @param cookieParams configuration that is usually returned from the JWT\n */\nfunction setJwtTokenCookie(\n\tname: string,\n\tvalue: string,\n\t{ cookiePath, cookieDomain, cookieExpiration }: Partial<JWTResponse>\n) {\n\tif (value) {\n\t\tconst expires = new Date(cookieExpiration * 1000); // we are getting response from the server in seconds instead of ms\n\t\tCookies.set(name, value, {\n\t\t\tpath: cookiePath,\n\t\t\tdomain: cookieDomain,\n\t\t\texpires,\n\t\t\tsameSite: 'None',\n\t\t\tsecure: true\n\t\t});\n\t}\n}\n\nexport const persistTokens = (\n\t{ refreshJwt, sessionJwt, ...cookieParams } = {} as Partial<JWTResponse>,\n\tsessionTokenViaCookie = false\n) => {\n\t// persist refresh token\n\trefreshJwt && setLocalStorage(REFRESH_TOKEN_KEY, refreshJwt);\n\n\t// persist session token\n\tif (sessionJwt) {\n\t\tsessionTokenViaCookie\n\t\t\t? setJwtTokenCookie(SESSION_TOKEN_KEY, sessionJwt, cookieParams)\n\t\t\t: setLocalStorage(SESSION_TOKEN_KEY, sessionJwt);\n\t}\n};\n\n/** Return the refresh token from the localStorage. Not for production usage because refresh token will not be saved in localStorage. */\nexport function getRefreshToken() {\n\treturn getLocalStorage(REFRESH_TOKEN_KEY) || '';\n}\n\n/**\n * Return the session token. first try to get from cookie, and fallback to local storage\n * See sessionTokenViaCookie option for more details about session token location\n */\nexport function getSessionToken(): string {\n\treturn Cookies.get(SESSION_TOKEN_KEY) || getLocalStorage(SESSION_TOKEN_KEY) || '';\n}\n\n/** Remove both the localStorage refresh JWT and the session cookie */\nexport function clearTokens() {\n\tremoveLocalStorage(REFRESH_TOKEN_KEY);\n\tremoveLocalStorage(SESSION_TOKEN_KEY);\n\tCookies.remove(SESSION_TOKEN_KEY);\n}\n\nexport const beforeRequest: BeforeRequestHook = (config) =>\n\tObject.assign(config, { token: config.token || getRefreshToken() });\n","/** Default name for the session cookie name / local storage key */\nexport const SESSION_TOKEN_KEY = 'DS';\n/** Default name for the refresh local storage key */\nexport const REFRESH_TOKEN_KEY = 'DSR';\n","/* eslint-disable import/exports-last */\nimport { SdkFnWrapper, wrapWith } from '@descope/core-js-sdk';\nimport { IS_BROWSER } from '../../constants';\nimport { CreateWebSdk } from '../../sdk';\nimport { AfterRequestHook } from '../../types';\nimport { addHooks, getAuthInfoFromResponse } from '../helpers';\nimport {\n\tbeforeRequest,\n\tclearTokens,\n\tgetRefreshToken,\n\tgetSessionToken,\n\tpersistTokens\n} from './helpers';\nimport { PersistTokensOptions } from './types';\n\n/**\n * Persist authentication tokens in cookie/storage\n */\nexport const withPersistTokens =\n\t<T extends CreateWebSdk>(createSdk: T) =>\n\t<A extends boolean>({\n\t\tpersistTokens: isPersistTokens,\n\t\tsessionTokenViaCookie,\n\t\t...config\n\t}: Parameters<T>[0] & PersistTokensOptions<A>): A extends true\n\t\t? ReturnType<T> & {\n\t\t\t\tgetRefreshToken: typeof getRefreshToken;\n\t\t\t\tgetSessionToken: typeof getSessionToken;\n\t\t }\n\t\t: ReturnType<T> => {\n\t\tif (!IS_BROWSER) {\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.warn(\n\t\t\t\t'Storing auth tokens in local storage and cookies are a client side only capabilities and will not be done when running in the server'\n\t\t\t);\n\t\t}\n\n\t\tif (!isPersistTokens || !IS_BROWSER) return createSdk(config) as any;\n\n\t\tconst afterRequest: AfterRequestHook = async (_req, res) => {\n\t\t\tif (res?.status === 401) {\n\t\t\t\tclearTokens();\n\t\t\t} else {\n\t\t\t\tpersistTokens(await getAuthInfoFromResponse(res), sessionTokenViaCookie);\n\t\t\t}\n\t\t};\n\n\t\tconst sdk = createSdk(addHooks(config, { beforeRequest, afterRequest }));\n\n\t\tconst wrappedSdk = wrapWith(sdk, ['logout', 'logoutAll'], wrapper);\n\n\t\treturn Object.assign(wrappedSdk, { getRefreshToken, getSessionToken }) as any;\n\t};\n\nconst wrapper: SdkFnWrapper<{}> =\n\t(fn) =>\n\tasync (...args) => {\n\t\tconst resp = await fn(...args);\n\n\t\tclearTokens();\n\n\t\treturn resp;\n\t};\n\nexport default withPersistTokens;\n","import { IS_BROWSER } from '../constants';\nimport { CoreSdk } from '../types';\n\n/** Constructs a higher level WebAuthn API that wraps the functions from code-js-sdk */\nconst createWebAuthn = (sdk: CoreSdk) => ({\n\tasync signUp(identifier: string, name: string) {\n\t\tconst startResponse = await sdk.webauthn.signUp.start(identifier, window.location.origin, name);\n\t\tconst createResponse = await create(startResponse.data.options);\n\t\tconst finishResponse = await sdk.webauthn.signUp.finish(\n\t\t\tstartResponse.data.transactionId,\n\t\t\tcreateResponse\n\t\t);\n\t\treturn finishResponse;\n\t},\n\n\tasync signIn(identifier: string) {\n\t\tconst startResponse = await sdk.webauthn.signIn.start(identifier, window.location.origin);\n\t\tconst getResponse = await get(startResponse.data.options);\n\t\tconst finishResponse = await sdk.webauthn.signIn.finish(\n\t\t\tstartResponse.data.transactionId,\n\t\t\tgetResponse\n\t\t);\n\t\treturn finishResponse;\n\t},\n\n\tasync signUpOrIn(identifier: string) {\n\t\tconst startResponse = await sdk.webauthn.signUpOrIn.start(identifier, window.location.origin);\n\t\tif (startResponse.data?.create) {\n\t\t\tconst createResponse = await create(startResponse.data.options);\n\t\t\tconst finishResponse = await sdk.webauthn.signUp.finish(\n\t\t\t\tstartResponse.data.transactionId,\n\t\t\t\tcreateResponse\n\t\t\t);\n\t\t\treturn finishResponse;\n\t\t} else {\n\t\t\tconst getResponse = await get(startResponse.data.options);\n\t\t\tconst finishResponse = await sdk.webauthn.signIn.finish(\n\t\t\t\tstartResponse.data.transactionId,\n\t\t\t\tgetResponse\n\t\t\t);\n\t\t\treturn finishResponse;\n\t\t}\n\t},\n\n\tasync update(identifier: string, token: string) {\n\t\tconst startResponse = await sdk.webauthn.update.start(\n\t\t\tidentifier,\n\t\t\twindow.location.origin,\n\t\t\ttoken\n\t\t);\n\t\tconst createResponse = await create(startResponse.data.options);\n\t\tconst finishResponse = await sdk.webauthn.update.finish(\n\t\t\tstartResponse.data.transactionId,\n\t\t\tcreateResponse\n\t\t);\n\t\treturn finishResponse;\n\t},\n\n\t/** Helper functions for working with WebAuthn browser APIs using JSON data */\n\thelpers: {\n\t\t/** Wraps the navigation.credentials.create call to translate JSON inputs and outputs */\n\t\tcreate,\n\t\t/** Wraps the navigation.credentials.get call to translate JSON inputs and outputs */\n\t\tget,\n\t\t/** Checks if the browser supports WebAuthn,\n\t\t * and can optionally require in addition that The browser supports WebAuthn with built-in biometrics */\n\t\tisSupported\n\t}\n});\n\n// Helpers functions\n\nasync function create(options: string): Promise<string> {\n\tconst createOptions = decodeCreateOptions(options);\n\tconst createResponse = (await navigator.credentials.create(\n\t\tcreateOptions\n\t)) as AttestationPublicKeyCredential;\n\treturn encodeCreateResponse(createResponse);\n}\n\nasync function get(options: string): Promise<string> {\n\tconst getOptions = decodeGetOptions(options);\n\tconst getResponse = (await navigator.credentials.get(getOptions)) as AssertionPublicKeyCredential;\n\treturn encodeGetResponse(getResponse);\n}\n\n// eslint-disable-next-line import/exports-last\nexport async function isSupported(requirePlatformAuthenticator: boolean = false): Promise<boolean> {\n\tif (!IS_BROWSER) {\n\t\treturn Promise.resolve(false);\n\t}\n\tconst supported = !!(\n\t\tPublicKeyCredential &&\n\t\tnavigator.credentials &&\n\t\tnavigator.credentials.create &&\n\t\tnavigator.credentials.get\n\t);\n\tif (\n\t\tsupported &&\n\t\trequirePlatformAuthenticator &&\n\t\tPublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable\n\t) {\n\t\treturn PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable();\n\t}\n\treturn supported;\n}\n\n// Conversion of data structures for Create/Attestation/Register ceremony\n\ntype AttestationPublicKeyCredential = PublicKeyCredential & {\n\tresponse: AuthenticatorAttestationResponse;\n};\n\nfunction decodeCreateOptions(value: string): CredentialCreationOptions {\n\tconst options = JSON.parse(value);\n\toptions.publicKey.challenge = decodeBase64Url(options.publicKey.challenge);\n\toptions.publicKey.user.id = decodeBase64Url(options.publicKey.user.id);\n\toptions.publicKey.excludeCredentials?.forEach((item: any) => {\n\t\titem.id = decodeBase64Url(item.id);\n\t});\n\treturn options;\n}\n\nfunction encodeCreateResponse(credential: AttestationPublicKeyCredential): string {\n\treturn JSON.stringify({\n\t\t...credential,\n\t\trawId: encodeBase64Url(credential.rawId),\n\t\tresponse: {\n\t\t\t...credential.response,\n\t\t\tattestationObject: encodeBase64Url(credential.response.attestationObject),\n\t\t\tclientDataJSON: encodeBase64Url(credential.response.clientDataJSON)\n\t\t}\n\t});\n}\n\n// Conversion of data structures for Get/Assertion/Login ceremony\n\ntype AssertionPublicKeyCredential = PublicKeyCredential & {\n\tresponse: AuthenticatorAssertionResponse;\n};\n\nfunction decodeGetOptions(value: string): CredentialRequestOptions {\n\tconst options = JSON.parse(value);\n\toptions.publicKey.challenge = decodeBase64Url(options.publicKey.challenge);\n\toptions.publicKey.allowCredentials?.forEach((item: any) => {\n\t\titem.id = decodeBase64Url(item.id);\n\t});\n\treturn options;\n}\n\nfunction encodeGetResponse(credential: AssertionPublicKeyCredential): string {\n\treturn JSON.stringify({\n\t\t...credential,\n\t\trawId: encodeBase64Url(credential.rawId),\n\t\tresponse: {\n\t\t\t...credential.response,\n\t\t\tauthenticatorData: encodeBase64Url(credential.response.authenticatorData),\n\t\t\tclientDataJSON: encodeBase64Url(credential.response.clientDataJSON),\n\t\t\tsignature: encodeBase64Url(credential.response.signature),\n\t\t\tuserHandle: credential.response.userHandle\n\t\t\t\t? encodeBase64Url(credential.response.userHandle)\n\t\t\t\t: undefined\n\t\t}\n\t});\n}\n\n// Conversion between ArrayBuffers and Base64Url strings\n\nfunction decodeBase64Url(value: string): ArrayBufferLike {\n\tconst base64 = value.replace(/_/g, '/').replace(/-/g, '+');\n\treturn Uint8Array.from(atob(base64), (c) => c.charCodeAt(0)).buffer;\n}\n\nfunction encodeBase64Url(value: ArrayBufferLike): string {\n\tconst base64 = btoa(String.fromCharCode.apply(null, new Uint8Array(value)));\n\treturn base64.replace(/\\//g, '_').replace(/\\+/g, '-').replace(/=/g, '');\n}\n\n// Exports\nexport default createWebAuthn;\n","import { CoreSdk } from '../types';\nimport { isSupported } from './webauthn';\n\nexport default (coreSdk: CoreSdk) => ({\n\t...coreSdk.flow,\n\t// wrap start fn and adds more data to the start options\n\tstart: async (\n\t\tflowId: string,\n\t\toptions?: { tenant?: string },\n\t\tinteractionId?: string,\n\t\tinput?: Record<string, FormDataEntryValue>\n\t) => {\n\t\tconst webAuthnSupport = await isSupported();\n\t\tconst decoratedOptions: Parameters<typeof coreSdk.flow.start>[1] = {\n\t\t\t...options,\n\t\t\tredirectUrl: window.location.href,\n\t\t\tdeviceInfo: {\n\t\t\t\twebAuthnSupport\n\t\t\t}\n\t\t};\n\n\t\treturn coreSdk.flow.start(flowId, decoratedOptions, interactionId, input);\n\t}\n});\n","import createCoreSdk from '@descope/core-js-sdk';\nimport createWebAuthn from './webauthn';\nimport withFlow from './flow';\n\nconst createSdk = (...args: Parameters<typeof createCoreSdk>) => {\n\tconst coreSdk = createCoreSdk(...args);\n\n\treturn {\n\t\t...coreSdk,\n\t\tflow: withFlow(coreSdk),\n\t\twebauthn: createWebAuthn(coreSdk)\n\t};\n};\n\nexport default createSdk;\n\nexport type CreateWebSdk = typeof createSdk;\nexport type WebSdk = ReturnType<CreateWebSdk>;\n","import { compose } from './enhancers/helpers';\nimport { withAnalytics } from './enhancers/withAnalytics';\nimport { withAutoRefresh } from './enhancers/withAutoRefresh';\nimport { withFingerprint } from './enhancers/withFingerprint';\nimport { withLastLoggedInUser } from './enhancers/withLastLoggedInUser';\nimport { withNotifications } from './enhancers/withNotifications';\nimport withPersistTokens from './enhancers/withPersistTokens';\nimport createSdk from './sdk';\n\nconst decoratedCreateSdk = compose(\n\twithLastLoggedInUser,\n\twithFingerprint,\n\twithAutoRefresh,\n\twithAnalytics,\n\twithNotifications,\n\twithPersistTokens // must be last due to TS known limitation https://github.com/microsoft/TypeScript/issues/30727\n)(createSdk);\n\nexport default decoratedCreateSdk;\n","import { CreateWebSdk, WebSdk } from '../../sdk';\n\ntype Fn = (arg: any) => any;\n\nexport function compose<Input, A1>(fn1: (input: Input) => A1): (input: Input) => A1;\n\nexport function compose<Input, A1, A2>(\n\tfn1: (input: Input) => A1,\n\tfn2: (input: A1) => A2\n): (input: Input) => A2;\n\nexport function compose<Input, A1, A2, A3>(\n\tfn1: (input: Input) => A1,\n\tfn2: (input: A1) => A2,\n\tfn3: (input: A2) => A3\n): (input: Input) => A3;\n\nexport function compose<Input, A1, A2, A3, A4>(\n\tfn1: (input: Input) => A1,\n\tfn2: (input: A1) => A2,\n\tfn3: (input: A2) => A3,\n\tfn4: (input: A3) => A4\n): (input: Input) => A4;\n\nexport function compose<Input, A1, A2, A3, A4, A5>(\n\tfn1: (input: Input) => A1,\n\tfn2: (input: A1) => A2,\n\tfn3: (input: A2) => A3,\n\tfn4: (input: A3) => A4,\n\tfn5: (input: A4) => A5\n): (input: Input) => A5;\n\nexport function compose<Input, A1, A2, A3, A4, A5, A6>(\n\tfn1: (input: Input) => A1,\n\tfn2: (input: A1) => A2,\n\tfn3: (input: A2) => A3,\n\tfn4: (input: A3) => A4,\n\tfn5: (input: A4) => A5,\n\tfn6: (input: A5) => A6\n): (input: Input) => A6;\n\nexport function compose<Input, A1, A2, A3, A4, A5, A6, A7>(\n\tfn1: (input: Input) => A1,\n\tfn2: (input: A1) => A2,\n\tfn3: (input: A2) => A3,\n\tfn4: (input: A3) => A4,\n\tfn5: (input: A4) => A5,\n\tfn6: (input: A5) => A6,\n\tfn7: (input: A6) => A7\n): (input: Input) => A7;\n\nexport function compose<Input, A1, A2, A3, A4, A5, A6, A7, A8>(\n\tfn1: (input: Input) => A1,\n\tfn2: (input: A1) => A2,\n\tfn3: (input: A2) => A3,\n\tfn4: (input: A3) => A4,\n\tfn5: (input: A4) => A5,\n\tfn6: (input: A5) => A6,\n\tfn7: (input: A6) => A7,\n\tfn8: (input: A7) => A8\n): (input: Input) => A8;\n\nexport function compose<Input, A1, A2, A3, A4, A5, A6, A7, A8, A9>(\n\tfn1: (input: Input) => A1,\n\tfn2: (input: A1) => A2,\n\tfn3: (input: A2) => A3,\n\tfn4: (input: A3) => A4,\n\tfn5: (input: A4) => A5,\n\tfn6: (input: A5) => A6,\n\tfn7: (input: A6) => A7,\n\tfn8: (input: A7) => A8,\n\tfn9: (input: A8) => A9\n): (input: Input) => A9;\n\nexport function compose<Input, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10>(\n\tfn1: (input: Input) => A1,\n\tfn2: (input: A1) => A2,\n\tfn3: (input: A2) => A3,\n\tfn4: (input: A3) => A4,\n\tfn5: (input: A4) => A5,\n\tfn6: (input: A5) => A6,\n\tfn7: (input: A6) => A7,\n\tfn8: (input: A7) => A8,\n\tfn9: (input: A8) => A9,\n\tfn10: (input: A9) => A10\n): (input: Input) => A10;\n\n/**\n * Currently there is no way to create a compose function in Typescript without using overloading\n * This function currently support up to 10 wrappers\n * If needed you can add more by duplicating the type and add more parameters\n */\n\nexport function compose(...args: Fn[]) {\n\treturn (data: any) => args.reduce((acc, elem) => elem(acc), data) as any;\n}\n","import { SdkFnWrapper, wrapWith } from '@descope/core-js-sdk';\nimport { CreateWebSdk } from '../../sdk';\nimport { AfterRequestHook } from '../../types';\nimport { addHooks, getAuthInfoFromResponse } from '../helpers';\nimport { createTimerFunctions, getTokenExpiration, millisecondsUntilDate } from './helpers';\nimport { AutoRefreshOptions } from './types';\n\n// The amount of time (ms) to trigger the refresh before session expires\nconst REFRESH_THRESHOLD = 20 * 1000; // 20 sec\n\n/**\n * Automatically refresh the session token before it expires\n * It uses the the refresh token that is extracted from API response to do that\n */\nexport const withAutoRefresh =\n\t<T extends CreateWebSdk>(createSdk: T) =>\n\t({ autoRefresh, ...config }: Parameters<T>[0] & AutoRefreshOptions) => {\n\t\t// if we hold a single timer id, there might be a case where we override it before canceling the timer, this might cause many calls to refresh\n\t\t// in order to prevent it, we hold a list of timers and cancel all of them when a new timer is set, which means we should have one active timer only at a time\n\t\tconst { clearAllTimers, setTimer } = createTimerFunctions();\n\n\t\tconst afterRequest: AfterRequestHook = async (_req, res) => {\n\t\t\tconst { refreshJwt, sessionJwt } = await getAuthInfoFromResponse(res);\n\n\t\t\t// if we got 401 we want to cancel all timers\n\t\t\tif (res?.status === 401) {\n\t\t\t\tclearAllTimers();\n\t\t\t} else if (sessionJwt) {\n\t\t\t\tconst timeout = millisecondsUntilDate(getTokenExpiration(sessionJwt)) - REFRESH_THRESHOLD;\n\t\t\t\tclearAllTimers();\n\t\t\t\tsetTimer(() => sdk.refresh(refreshJwt), timeout);\n\t\t\t}\n\t\t};\n\n\t\tconst sdk = createSdk(addHooks(config, { afterRequest }));\n\n\t\tconst wrapper: SdkFnWrapper<{}> =\n\t\t\t(fn) =>\n\t\t\tasync (...args) => {\n\t\t\t\tconst resp = await fn(...args);\n\n\t\t\t\tclearAllTimers();\n\n\t\t\t\treturn resp;\n\t\t\t};\n\n\t\treturn wrapWith(sdk, ['logout', 'logoutAll'], wrapper);\n\t};\n","/**\n * Get the JWT expiration WITHOUT VALIDATING the JWT\n * @param token The JWT to extract expiration from\n * @returns The Date for when the JWT expires or null if there is an issue\n */\nexport const getTokenExpiration = (token: string) => {\n\tconst parts = token.split('.');\n\ttry {\n\t\tif (parts.length === 3) {\n\t\t\tconst claims = JSON.parse(window.atob(parts[1]));\n\t\t\tif (claims.exp) {\n\t\t\t\treturn new Date(claims.exp * 1000);\n\t\t\t}\n\t\t}\n\t} catch (e) {}\n\treturn null;\n};\n\nexport const millisecondsUntilDate = (date: Date) =>\n\tdate ? date.getTime() - new Date().getTime() : 0;\n\nexport const createTimerFunctions = () => {\n\tconst timerIds: NodeJS.Timeout[] = [];\n\n\tconst clearAllTimers = () => {\n\t\twhile (timerIds.length) {\n\t\t\tclearTimeout(timerIds.pop());\n\t\t}\n\t};\n\n\tconst setTimer = (cb: () => void, timeout: number) => {\n\t\ttimerIds.push(setTimeout(cb, timeout));\n\t};\n\n\treturn { clearAllTimers, setTimer };\n};\n","import { SdkFnWrapper, UserResponse, wrapWith } from '@descope/core-js-sdk';\nimport { CreateWebSdk, WebSdk } from '../../sdk';\nimport { AfterRequestHook } from '../../types';\nimport { addHooks, getAuthInfoFromResponse, getUserFromResponse } from '../helpers';\nimport { createPubSub } from './helpers';\n\n/**\n * Adds 2 event functions to the sdk,\n * onSessionTokenChange: Gets a callback and call it whenever there is a change in session token\n * onUserChange: Gets a callback and call it whenever there is a change in current logged in user\n */\nexport const withNotifications =\n\t<T extends CreateWebSdk>(createSdk: T) =>\n\t(config: Parameters<T>[0]) => {\n\t\tconst sessionPS = createPubSub<string | null>();\n\t\tconst userPS = createPubSub<UserResponse | null>();\n\n\t\tconst afterRequest: AfterRequestHook = async (_req, res) => {\n\t\t\tif (res?.status === 401) {\n\t\t\t\tsessionPS.pub(null);\n\t\t\t\tuserPS.pub(null);\n\t\t\t} else {\n\t\t\t\tconst userDetails = await getUserFromResponse(res);\n\t\t\t\tif (userDetails) userPS.pub(userDetails);\n\n\t\t\t\tconst { sessionJwt } = await getAuthInfoFromResponse(res);\n\t\t\t\tif (sessionJwt) sessionPS.pub(sessionJwt);\n\t\t\t}\n\t\t};\n\n\t\tconst sdk = createSdk(addHooks(config, { afterRequest }));\n\n\t\tconst wrapper: SdkFnWrapper<{}> =\n\t\t\t(fn) =>\n\t\t\tasync (...args) => {\n\t\t\t\tconst resp = await fn(...args);\n\n\t\t\t\tsessionPS.pub(null);\n\t\t\t\tuserPS.pub(null);\n\n\t\t\t\treturn resp;\n\t\t\t};\n\n\t\tconst wrappedSdk = wrapWith(sdk, ['logout', 'logoutAll'], wrapper);\n\n\t\treturn Object.assign(wrappedSdk, {\n\t\t\tonSessionTokenChange: sessionPS.sub,\n\t\t\tonUserChange: userPS.sub\n\t\t});\n\t};\n"],"names":["addHooks","config","hooks","reduce","acc","key","concat","_a","getAuthInfoFromResponse","async","res","ok","body","clone","json","authInfo","getUserFromResponse","user","hasOwnProperty","undefined","isLocalStorage","localStorage","setLocalStorage","value","setItem","getLocalStorage","getItem","removeLocalStorage","removeItem","beforeRequest","Object","assign","headers","IS_BROWSER","window","FP_KEY","FP_EP_URL","createFingerprintObject","sessionId","requestId","vsid","vrid","getFPFromStorage","returnExpired","itemStr","item","JSON","parse","Date","getTime","expiry","ensureFingerprintIds","fpKey","now","toString","Math","random","substring","agentP","load","apiKey","endpoint","agent","get","linkedId","stringify","setFPToStorage","ex","global","FB_DEBUG","console","error","startWrapper","fn","args","options","externalId","lastUser","logoutWrapper","resp","createPubSub","cbs","pub","data","forEach","cb","sub","idx","push","splice","persistTokens","sessionTokenViaCookie","refreshJwt","sessionJwt","cookieParams","__rest","name","cookiePath","cookieDomain","cookieExpiration","expires","Cookies","set","path","domain","sameSite","secure","setJwtTokenCookie","getRefreshToken","getSessionToken","clearTokens","remove","token","wrapper","create","createOptions","publicKey","challenge","decodeBase64Url","id","excludeCredentials","decodeCreateOptions","createResponse","navigator","credentials","credential","rawId","encodeBase64Url","response","attestationObject","clientDataJSON","getOptions","allowCredentials","decodeGetOptions","getResponse","authenticatorData","signature","userHandle","isSupported","requirePlatformAuthenticator","Promise","resolve","supported","PublicKeyCredential","isUserVerifyingPlatformAuthenticatorAvailable","base64","replace","Uint8Array","from","atob","c","charCodeAt","buffer","btoa","String","fromCharCode","apply","withFlow","coreSdk","flow","start","flowId","interactionId","input","webAuthnSupport","decoratedOptions","redirectUrl","location","href","deviceInfo","decoratedCreateSdk","elem","compose","createSdk","sdk","afterRequest","_req","userDetails","externalIds","setLastUserExternalId","wrappedSdk","wrapWith","fpLoad","catch","warn","clearAllTimers","setTimer","timerIds","length","clearTimeout","pop","timeout","setTimeout","createTimerFunctions","status","date","parts","split","claims","exp","e","getTokenExpiration","refresh","sessionPS","userPS","onSessionTokenChange","onUserChange","isPersistTokens","createCoreSdk","webauthn","identifier","startResponse","signUp","origin","finish","transactionId","signIn","signUpOrIn","update","helpers"],"mappings":"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"}
package/dist/index.umd.js CHANGED
@@ -1,4 +1,4 @@
1
- !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).Descope={})}(this,(function(e){"use strict";var t=function(){return t=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var o in t=arguments[n])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},t.apply(this,arguments)};function n(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&Object.prototype.propertyIsEnumerable.call(e,r[o])&&(n[r[o]]=e[r[o]])}return n}function r(e,t,n,r){if("a"===n&&!r)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!r:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===n?r:"a"===n?r.call(e):r?r.value:t.get(e)}function o(e,t,n,r,o){if("m"===r)throw new TypeError("Private method is not writable");if("a"===r&&!o)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!o:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===r?o.call(e,n):o?o.value=n:t.set(e,n),n}function i(e){this.message=e}i.prototype=new Error,i.prototype.name="InvalidCharacterError";var a="undefined"!=typeof window&&window.atob&&window.atob.bind(window)||function(e){var t=String(e).replace(/=+$/,"");if(t.length%4==1)throw new i("'atob' failed: The string to be decoded is not correctly encoded.");for(var n,r,o=0,a=0,s="";r=t.charAt(a++);~r&&(n=o%4?64*n+r:r,o++%4)?s+=String.fromCharCode(255&n>>(-2*o&6)):0)r="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(r);return s};function s(e){this.message=e}function c(e,t){if("string"!=typeof e)throw new s("Invalid token specified");var n=!0===(t=t||{}).header?0:1;try{return JSON.parse(function(e){var t=e.replace(/-/g,"+").replace(/_/g,"/");switch(t.length%4){case 0:break;case 2:t+="==";break;case 3:t+="=";break;default:throw"Illegal base64url string!"}try{return function(e){return decodeURIComponent(a(e).replace(/(.)/g,(function(e,t){var n=t.charCodeAt(0).toString(16).toUpperCase();return n.length<2&&(n="0"+n),"%"+n})))}(t)}catch(e){return a(t)}}(e.split(".")[n]))}catch(e){throw new s("Invalid token specified: "+e.message)}}s.prototype=new Error,s.prototype.name="InvalidTokenError";var u="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},l="__lodash_hash_undefined__",d="[object Function]",p="[object GeneratorFunction]",f=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,h=/^\w*$/,g=/^\./,v=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,y=/\\(\\)?/g,b=/^\[object .+?Constructor\]$/,w="object"==typeof u&&u&&u.Object===Object&&u,m="object"==typeof self&&self&&self.Object===Object&&self,k=w||m||Function("return this")();var I,O=Array.prototype,j=Function.prototype,S=Object.prototype,_=k["__core-js_shared__"],x=(I=/[^.]+$/.exec(_&&_.keys&&_.keys.IE_PROTO||""))?"Symbol(src)_1."+I:"",P=j.toString,U=S.hasOwnProperty,T=S.toString,C=RegExp("^"+P.call(U).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),E=k.Symbol,R=O.splice,A=z(k,"Map"),D=z(Object,"create"),q=E?E.prototype:void 0,J=q?q.toString:void 0;function $(e){var t=-1,n=e?e.length:0;for(this.clear();++t<n;){var r=e[t];this.set(r[0],r[1])}}function M(e){var t=-1,n=e?e.length:0;for(this.clear();++t<n;){var r=e[t];this.set(r[0],r[1])}}function K(e){var t=-1,n=e?e.length:0;for(this.clear();++t<n;){var r=e[t];this.set(r[0],r[1])}}function N(e,t){for(var n,r,o=e.length;o--;)if((n=e[o][0])===(r=t)||n!=n&&r!=r)return o;return-1}function L(e,t){var n;t=function(e,t){if(G(e))return!1;var n=typeof e;if("number"==n||"symbol"==n||"boolean"==n||null==e||Q(e))return!0;return h.test(e)||!f.test(e)||null!=t&&e in Object(t)}(t,e)?[t]:G(n=t)?n:H(n);for(var r=0,o=t.length;null!=e&&r<o;)e=e[V(t[r++])];return r&&r==o?e:void 0}function B(e){if(!Z(e)||(t=e,x&&x in t))return!1;var t,n=function(e){var t=Z(e)?T.call(e):"";return t==d||t==p}(e)||function(e){var t=!1;if(null!=e&&"function"!=typeof e.toString)try{t=!!(e+"")}catch(e){}return t}(e)?C:b;return n.test(function(e){if(null!=e){try{return P.call(e)}catch(e){}try{return e+""}catch(e){}}return""}(e))}function F(e,t){var n,r,o=e.__data__;return("string"==(r=typeof(n=t))||"number"==r||"symbol"==r||"boolean"==r?"__proto__"!==n:null===n)?o["string"==typeof t?"string":"hash"]:o.map}function z(e,t){var n=function(e,t){return null==e?void 0:e[t]}(e,t);return B(n)?n:void 0}$.prototype.clear=function(){this.__data__=D?D(null):{}},$.prototype.delete=function(e){return this.has(e)&&delete this.__data__[e]},$.prototype.get=function(e){var t=this.__data__;if(D){var n=t[e];return n===l?void 0:n}return U.call(t,e)?t[e]:void 0},$.prototype.has=function(e){var t=this.__data__;return D?void 0!==t[e]:U.call(t,e)},$.prototype.set=function(e,t){return this.__data__[e]=D&&void 0===t?l:t,this},M.prototype.clear=function(){this.__data__=[]},M.prototype.delete=function(e){var t=this.__data__,n=N(t,e);return!(n<0)&&(n==t.length-1?t.pop():R.call(t,n,1),!0)},M.prototype.get=function(e){var t=this.__data__,n=N(t,e);return n<0?void 0:t[n][1]},M.prototype.has=function(e){return N(this.__data__,e)>-1},M.prototype.set=function(e,t){var n=this.__data__,r=N(n,e);return r<0?n.push([e,t]):n[r][1]=t,this},K.prototype.clear=function(){this.__data__={hash:new $,map:new(A||M),string:new $}},K.prototype.delete=function(e){return F(this,e).delete(e)},K.prototype.get=function(e){return F(this,e).get(e)},K.prototype.has=function(e){return F(this,e).has(e)},K.prototype.set=function(e,t){return F(this,e).set(e,t),this};var H=W((function(e){var t;e=null==(t=e)?"":function(e){if("string"==typeof e)return e;if(Q(e))return J?J.call(e):"";var t=e+"";return"0"==t&&1/e==-1/0?"-0":t}(t);var n=[];return g.test(e)&&n.push(""),e.replace(v,(function(e,t,r,o){n.push(r?o.replace(y,"$1"):t||e)})),n}));function V(e){if("string"==typeof e||Q(e))return e;var t=e+"";return"0"==t&&1/e==-1/0?"-0":t}function W(e,t){if("function"!=typeof e||t&&"function"!=typeof t)throw new TypeError("Expected a function");var n=function(){var r=arguments,o=t?t.apply(this,r):r[0],i=n.cache;if(i.has(o))return i.get(o);var a=e.apply(this,r);return n.cache=i.set(o,a),a};return n.cache=new(W.Cache||K),n}W.Cache=K;var G=Array.isArray;function Z(e){var t=typeof e;return!!e&&("object"==t||"function"==t)}function Q(e){return"symbol"==typeof e||function(e){return!!e&&"object"==typeof e}(e)&&"[object Symbol]"==T.call(e)}var X=function(e,t,n){var r=null==e?void 0:L(e,t);return void 0===r?n:r},Y="/v1/auth/accesskey/exchange",ee="/v1/auth/otp/verify",te="/v1/auth/otp/signin",ne="/v1/auth/otp/signup",re={email:"/v1/auth/otp/update/email",phone:"/v1/auth/otp/update/phone"},oe="/v1/auth/otp/signup-in",ie="/v1/auth/magiclink/verify",ae="/v1/auth/magiclink/signin",se="/v1/auth/magiclink/signup",ce={email:"/v1/auth/magiclink/update/email",phone:"/v1/auth/magiclink/update/phone"},ue="/v1/auth/magiclink/signup-in",le="/v1/auth/enchantedlink/verify",de="/v1/auth/enchantedlink/signin",pe="/v1/auth/enchantedlink/signup",fe="/v1/auth/enchantedlink/pending-session",he={email:"/v1/auth/enchantedlink/update/email"},ge="/v1/auth/enchantedlink/signup-in",ve="/v1/auth/oauth/authorize",ye="/v1/auth/oauth/exchange",be="/v1/auth/saml/authorize",we="/v1/auth/saml/exchange",me="/v1/auth/totp/verify",ke="/v1/auth/totp/signup",Ie="/v1/user/totp/update",Oe={start:"/v1/auth/webauthn/signup/start",finish:"/v1/auth/webauthn/signup/finish"},je={start:"/v1/auth/webauthn/signin/start",finish:"/v1/auth/webauthn/signin/finish"},Se={start:"/v1/auth/webauthn/signup-in/start"},_e={start:"v1/auth/webauthn/update/start",finish:"/v1/auth/webauthn/update/finish"},xe="/v1/flow/start",Pe="/v1/flow/next";const Ue=()=>{const e={};return{headers(t){const n="function"==typeof t.entries?Object.fromEntries(t.entries()):t;return e.Headers=JSON.stringify(n),this},body(t){return e.Body=t,this},url(t){return e.Url=t.toString(),this},method(t){return e.Method=t,this},title(t){return e.Title=t,this},status(t){return e.Status=t,this},build:()=>Object.keys(e).flatMap((t=>e[t]?[`${"Title"!==t?`${t}: `:""}${e[t]}`]:[])).join("\n")}};var Te;!function(e){e.get="GET",e.delete="DELETE",e.post="POST",e.put="PUT"}(Te||(Te={}));const Ce=(...e)=>new Headers(e.reduce(((e,t)=>{const n=(e=>Array.isArray(e)?e:e instanceof Headers?Array.from(e.entries()):e?Object.entries(e):[])(t);return n.reduce(((t,[n,r])=>(e[n]=r,e)),e),e}),{})),Ee=e=>void 0===e?void 0:JSON.stringify(e),Re=(e,t="")=>{let n=e;return t&&(n=n+":"+t),{Authorization:`Bearer ${n}`}},Ae=({baseUrl:e,projectId:t,baseConfig:n,logger:r,hooks:o,cookiePolicy:i})=>{const a=((e,t)=>{const n=t||fetch;if(!n)throw new Error("fetch is not defined");return e?async(...t)=>{e.log((e=>Ue().title("Request").url(e[0]).method(e[1].method).headers(e[1].headers).body(e[1].body).build())(t));const r=await n(...t);return e[r.ok?"log":"error"](await(async e=>{const t=await(e.clone?e.clone().text():e.text());return e.text=()=>Promise.resolve(t),e.json=()=>Promise.resolve(JSON.parse(t)),Ue().title("Response").url(e.url.toString()).status(`${e.status} ${e.statusText}`).headers(e.headers).body(t).build()})(r)),r}:n})(r),s=async r=>{const s=(null==o?void 0:o.beforeRequest)?o.beforeRequest(r):r,{path:c,body:u,headers:l,queryParams:d,method:p,token:f}=s,h=await a((({path:e,baseUrl:t,queryParams:n})=>{const r=new URL(e,t);return n&&(r.search=new URLSearchParams(n).toString()),r})({path:c,baseUrl:e,queryParams:d}),{headers:Ce(Re(t,f),{"x-descope-sdk-name":"core-js","x-descope-sdk-version":"0.0.41-alpha.34"},(null==n?void 0:n.baseHeaders)||{},l),method:p,body:Ee(u),credentials:i||"include"});return(null==o?void 0:o.afterRequest)&&o.afterRequest(r,null==h?void 0:h.clone()),h};return{get:(e,{headers:t,queryParams:n,token:r}={})=>s({path:e,headers:t,queryParams:n,body:void 0,method:Te.get,token:r}),post:(e,t,{headers:n,queryParams:r,token:o}={})=>s({path:e,headers:n,queryParams:r,body:t,method:Te.post,token:o}),put:(e,t,{headers:n,queryParams:r,token:o}={})=>s({path:e,headers:n,queryParams:r,body:t,method:Te.put,token:o}),delete:(e,t,{headers:n,queryParams:r,token:o}={})=>s({path:e,headers:n,queryParams:r,body:t,method:Te.delete,token:o})}};function De(e,t,n){var r;let o=qe(e);t&&(o=null===(r=o.tenants)||void 0===r?void 0:r[t]);const i=o[n];return Array.isArray(i)?i:[]}function qe(e){if("string"!=typeof e||!e)throw new Error("Invalid token provided");return c(e)}function Je(e){const{exp:t}=qe(e);return(new Date).getTime()/1e3>t}function $e(e,t){return De(e,t,"permissions")}function Me(e,t){return De(e,t,"roles")}const Ke=(...e)=>e.join("/").replace(/\/{2,}/g,"/");async function Ne(e,t){const n=await e,r={code:n.status,ok:n.ok,response:n},o=await n.clone().json();return n.ok?r.data=t?t(o):o:r.error=o,r}const Le=(e,t)=>(n=t)=>t=>!e(t)&&n.replace("{val}",t),Be=(...e)=>({validate:t=>(e.forEach((e=>{const n=e(t);if(n)throw new Error(n)})),!0)}),Fe=e=>t=>e.test(t),ze=Fe(/^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/),He=Fe(/^\+[1-9]{1}[0-9]{3,14}$/),Ve=Le(ze,'"{val}" is not a valid email'),We=Le(He,'"{val}" is not a valid phone number'),Ge=Le((1,e=>e.length>=1),"Minimum length is 1");const Ze=Le((e=>"string"==typeof e),"Input is not a string"),Qe=(...e)=>t=>(...n)=>(e.forEach(((e,t)=>Be(...e).validate(n[t]))),t(...n)),Xe=e=>[Ze(`"${e}" must be a string`),Ge(`"${e}" must not be empty`)],Ye=e=>[Ze(`"${e}" must be a string`),Ve()],et=e=>[Ze(`"${e}" must be a string`),We()],tt=Qe(Xe("accessKey")),nt=e=>({exchange:tt((t=>Ne(e.post(Y,{},{token:t}))))});var rt,ot,it,at,st;!function(e){e.sms="sms",e.whatsapp="whatsapp"}(rt||(rt={})),function(e){e.email="email",e.sms="sms",e.whatsapp="whatsapp"}(ot||(ot={})),function(e){e.waiting="waiting",e.running="running",e.completed="completed",e.failed="failed"}(it||(it={})),function(e){e.signUp="signup",e.signIn="signin",e.verify="verify"}(at||(at={})),function(e){e.signUp="signup",e.signIn="signin",e.verify="verify",e.updatePhone="updatePhone"}(st||(st={}));const ct=Xe("identifier"),ut=Qe(ct,Xe("code")),lt=Qe(ct),dt=Qe(ct,et("phone")),pt=Qe(ct,Ye("email")),ft=e=>({verify:Object.keys(ot).reduce(((t,n)=>Object.assign(Object.assign({},t),{[n]:ut(((t,r)=>Ne(e.post(Ke(ee,n),{code:r,externalId:t}))))})),{}),signIn:Object.keys(ot).reduce(((t,n)=>Object.assign(Object.assign({},t),{[n]:lt(((t,r,o)=>Ne(e.post(Ke(te,n),{externalId:t,loginOptions:r},{token:o}))))})),{}),signUp:Object.keys(ot).reduce(((t,n)=>Object.assign(Object.assign({},t),{[n]:lt(((t,r)=>Ne(e.post(Ke(ne,n),{externalId:t,user:r}))))})),{}),signUpOrIn:Object.keys(ot).reduce(((t,n)=>Object.assign(Object.assign({},t),{[n]:lt((t=>Ne(e.post(Ke(oe,n),{externalId:t}))))})),{}),update:{email:pt(((t,n,r)=>Ne(e.post(re.email,{externalId:t,email:n},{token:r})))),phone:Object.keys(rt).reduce(((t,n)=>Object.assign(Object.assign({},t),{[n]:dt(((t,r,o)=>Ne(e.post(Ke(re.phone,n),{externalId:t,phone:r},{token:o}))))})),{})}}),ht=Xe("identifier"),gt=Xe("uri"),vt=Qe(Xe("token")),yt=Qe(ht,gt),bt=Qe(ht,et("phone"),gt),wt=Qe(ht,Ye("email"),gt),mt=e=>({verify:vt((t=>Ne(e.post(ie,{token:t})))),signIn:Object.keys(ot).reduce(((t,n)=>Object.assign(Object.assign({},t),{[n]:yt(((t,r,o,i)=>Ne(e.post(Ke(ae,n),{externalId:t,URI:r,loginOptions:o},{token:i}))))})),{}),signUp:Object.keys(ot).reduce(((t,n)=>Object.assign(Object.assign({},t),{[n]:yt(((t,r,o)=>Ne(e.post(Ke(se,n),{externalId:t,URI:r,user:o}))))})),{}),signUpOrIn:Object.keys(ot).reduce(((t,n)=>Object.assign(Object.assign({},t),{[n]:yt(((t,r)=>Ne(e.post(Ke(ue,n),{externalId:t,URI:r}))))})),{}),update:{email:wt(((t,n,r,o)=>Ne(e.post(ce.email,{externalId:t,email:n,URI:r},{token:o})))),phone:Object.keys(rt).reduce(((t,n)=>Object.assign(Object.assign({},t),{[n]:bt(((t,r,o,i)=>Ne(e.post(Ke(ce.phone,n),{externalId:t,phone:r,URI:o},{token:i}))))})),{})}}),kt=Xe("identifier"),It=Xe("uri"),Ot=Qe(Xe("token")),jt=Qe(kt,It),St=Qe(Xe("pendingRef")),_t=Qe(kt,Ye("email"),It),xt=e=>({verify:Ot((t=>Ne(e.post(le,{token:t})))),signIn:jt(((t,n,r,o)=>Ne(e.post(Ke(de,ot.email),{externalId:t,URI:n,loginOptions:r},{token:o})))),signUpOrIn:jt(((t,n)=>Ne(e.post(Ke(ge,ot.email),{externalId:t,URI:n})))),signUp:jt(((t,n,r)=>Ne(e.post(Ke(pe,ot.email),{externalId:t,URI:n,user:r})))),waitForSession:St(((t,n)=>new Promise((r=>{const{pollingIntervalMs:o,timeoutMs:i}=(({pollingIntervalMs:e=1e3,timeoutMs:t=6e5}={})=>({pollingIntervalMs:Math.max(e||1e3,1e3),timeoutMs:Math.min(t||6e5,6e5)}))(n);let a;const s=setInterval((async()=>{const n=await e.post(fe,{pendingRef:t});n.ok&&(clearInterval(s),a&&clearTimeout(a),r(Ne(Promise.resolve(n))))}),o);a=setTimeout((()=>{r({error:{message:`Session polling timeout exceeded: ${i}ms`,errorCode:"0"},ok:!1}),clearInterval(s)}),i)})))),update:{email:_t(((t,n,r,o)=>Ne(e.post(he.email,{externalId:t,email:n,URI:r},{token:o}))))}});var Pt;!function(e){e.facebook="facebook",e.github="github",e.google="google",e.microsoft="microsoft",e.gitlab="gitlab",e.apple="apple"}(Pt||(Pt={}));const Ut=Qe(Xe("code")),Tt=e=>({start:Object.keys(Pt).reduce(((t,n)=>Object.assign(Object.assign({},t),{[n]:async(t,{redirect:r=!1}={},o,i)=>{const a=await e.post(ve,o||{},{queryParams:Object.assign({provider:n},t&&{redirectURL:t}),token:i});if(!r||!a.ok)return Ne(Promise.resolve(a));const{url:s}=await a.json();window.location.href=s}})),{}),exchange:Ut((t=>Ne(e.post(ye,{code:t}))))}),Ct=Qe(Xe("flowId")),Et=Qe(Xe("executionId"),Xe("stepId"),Xe("interactionId")),Rt=e=>({start:Ct(((t,n,r,o)=>Ne(e.post(xe,{flowId:t,options:o,interactionId:n,input:r})))),next:Et(((t,n,r,o)=>Ne(e.post(Pe,{executionId:t,stepId:n,interactionId:r,input:o}))))}),At=Qe(Xe("tenant")),Dt=Qe(Xe("code")),qt=e=>({start:At((async(t,n,{redirect:r=!1}={},o,i)=>{const a=await e.post(be,o||{},{queryParams:{tenant:t,redirectURL:n},token:i});if(!r||!a.ok)return Ne(Promise.resolve(a));const{url:s}=await a.json();window.location.href=s})),exchange:Dt((t=>Ne(e.post(we,{code:t}))))}),Jt=Xe("identifier"),$t=Qe(Jt,Xe("code")),Mt=Qe(Jt),Kt=Qe(Jt),Nt=e=>({signUp:Mt(((t,n)=>Ne(e.post(ke,{externalId:t,user:n})))),verify:$t(((t,n,r,o)=>Ne(e.post(me,{externalId:t,code:n,loginOptions:r},{token:o})))),update:Kt(((t,n)=>Ne(e.post(Ie,{externalId:t},{token:n}))))}),Lt=Xe("identifier"),Bt=Xe("origin"),Ft=Qe(Lt,Bt,Xe("name")),zt=Qe(Lt,Bt),Ht=Qe(Lt,Bt,Xe("token")),Vt=Qe(Xe("transactionId"),Xe("response")),Wt=e=>({signUp:{start:Ft(((t,n,r)=>Ne(e.post(Oe.start,{user:{externalId:t,name:r},origin:n})))),finish:Vt(((t,n)=>Ne(e.post(Oe.finish,{transactionId:t,response:n}))))},signIn:{start:zt(((t,n,r,o)=>Ne(e.post(je.start,{externalId:t,origin:n,loginOptions:r},{token:o})))),finish:Vt(((t,n)=>Ne(e.post(je.finish,{transactionId:t,response:n}))))},signUpOrIn:{start:zt(((t,n)=>Ne(e.post(Se.start,{externalId:t,origin:n}))))},update:{start:Ht(((t,n,r)=>Ne(e.post(_e.start,{externalId:t,origin:n},{token:r})))),finish:Vt(((t,n)=>Ne(e.post(_e.finish,{transactionId:t,response:n}))))}}),Gt=Qe(Xe("token"));var Zt;const Qt=Qe([("projectId",Zt=Xe("projectId"),Le(((e,t)=>e=>Be(...t).validate(X(e,"projectId")))(0,Zt))())])((({projectId:e,logger:t,baseUrl:n,hooks:r,cookiePolicy:o})=>{return i=Ae({baseUrl:n||"https://api.descope.com",projectId:e,logger:t,hooks:r,cookiePolicy:o}),{accessKey:nt(i),otp:ft(i),magicLink:mt(i),enchantedLink:xt(i),oauth:Tt(i),saml:qt(i),totp:Nt(i),webauthn:Wt(i),flow:Rt(i),refresh:e=>Ne(i.post("/v1/auth/refresh",{},{token:e})),logout:e=>Ne(i.post("/v1/auth/logout",{},{token:e})),logoutAll:e=>Ne(i.post("/v1/auth/logoutall",{},{token:e})),me:e=>Ne(i.get("/v1/auth/me",{token:e})),isJwtExpired:Gt(Je),getJwtPermissions:Gt($e),getJwtRoles:Gt(Me),httpClient:i};var i}));Qt.DeliveryMethods=ot;const Xt="undefined"!=typeof window,Yt=Xt&&localStorage.getItem("fingerprint.public.key")||"A9aCLRHzKCv3uL69oqDr",en=Xt&&(null===localStorage||void 0===localStorage?void 0:localStorage.getItem("fingerprint.endpoint.url"))||"https://fp.descope.com",tn="dls_last_user_external_id";function nn(e,t){var n=[];return function(e,t){var n,r,o=(r=function(){for(var e=0,t=0,n=arguments.length;t<n;t++)e+=arguments[t].length;var r=Array(e),o=0;for(t=0;t<n;t++)for(var i=arguments[t],a=0,s=i.length;a<s;a++,o++)r[o]=i[a];return r}(e),{current:function(){return r[0]},postpone:function(){var e=r.shift();void 0!==e&&r.push(e)},exclude:function(){r.shift()}}),i=(100,3e3,n=0,function(){return Math.random()*Math.min(3e3,100*Math.pow(2,n++))}),a=o.current();if(void 0===a)return Promise.reject(new TypeError("The list of script URL patterns is empty"));var s=function(e,n){return t(e).catch((function(e){if(n+1>=5)throw e;!function(e){if(!(e instanceof Error))return!1;var t=e.message;return"Blocked by CSP"===t||"9319"===t}(e)?o.postpone():o.exclude();var t,r=o.current();if(void 0===r)throw e;return(t=i(),new Promise((function(e){return setTimeout(e,t)}))).then((function(){return s(r,n+1)}))}))};return s(a,0)}(e,(function(e){var r=new Date,o=function(){return n.push({url:e,startedAt:r,finishedAt:new Date})},i=t(e);return i.then(o,o),i})).then((function(e){return[e,{attempts:n}]}))}var rn="Failed to load the JS script of the agent";function on(e){var r;e.scriptUrlPattern;var o=e.token,i=e.apiKey,a=void 0===i?o:i,s=n(e,["scriptUrlPattern","token","apiKey"]),c=null!==(r=function(e,t){return function(e,t){return Object.prototype.hasOwnProperty.call(e,t)}(e,t)?e[t]:void 0}(e,"scriptUrlPattern"))&&void 0!==r?r:"https://fpnpmcdn.net/v<version>/<apiKey>/loader_v<loaderVersion>.js";return Promise.resolve().then((function(){if(!a||"string"!=typeof a)throw new Error("API key required");return nn(function(e,t){return(Array.isArray(e)?e:[e]).map((function(e){return function(e,t){var n=encodeURIComponent;return e.replace(/<[^<>]+>/g,(function(e){return"<version>"===e?"3":"<apiKey>"===e?n(t):"<loaderVersion>"===e?n("3.8.1"):e}))}(String(e),t)}))}(c,a),an).catch(cn)})).then((function(e){var n=e[0],r=e[1];return n.load(t(t({},s),{ldi:r}))}))}function an(e){return function(e,t,n,r){var o,i=document,a="securitypolicyviolation",s=function(t){var n=new URL(e,location.href),r=t.blockedURI;r!==n.href&&r!==n.protocol.slice(0,-1)&&r!==n.origin||(o=t,c())};i.addEventListener(a,s);var c=function(){return i.removeEventListener(a,s)};return Promise.resolve().then(t).then((function(e){return c(),e}),(function(e){return new Promise((function(e){return setTimeout(e)})).then((function(){if(c(),o)return function(){throw new Error("Blocked by CSP")}();throw e}))}))}(e,(function(){return function(e){return new Promise((function(t,n){var r=document.createElement("script"),o=function(){var e;return null===(e=r.parentNode)||void 0===e?void 0:e.removeChild(r)},i=document.head||document.getElementsByTagName("head")[0];r.onload=function(){o(),t()},r.onerror=function(){o(),n(new Error(rn))},r.async=!0,r.src=e,i.appendChild(r)}))}(e)})).then(sn)}function sn(){var e=window,t="__fpjs_p_l_b",n=e[t];if(function(e,t){var n,r=null===(n=Object.getOwnPropertyDescriptor)||void 0===n?void 0:n.call(Object,e,t);(null==r?void 0:r.configurable)?delete e[t]:r&&!r.writable||(e[t]=void 0)}(e,t),"function"!=typeof(null==n?void 0:n.load))throw new Error("9319");return n}function cn(e){throw e instanceof Error&&"9319"===e.message?new Error(rn):e}const un=(e="",t="")=>({vsid:e,vrid:t}),ln=(e=!1)=>{const t=localStorage.getItem("fp");if(!t)return null;const n=JSON.parse(t);return(new Date).getTime()>n.expiry&&!e?null:n.value},dn=async e=>{try{if(ln())return;const t=(Date.now().toString(36)+Math.random().toString(36).substring(2)+Math.random().toString(36).substring(2)).substring(0,27),n=on({apiKey:e||Yt,endpoint:en}),r=await n,{requestId:o}=await r.get({linkedId:t});(e=>{const t={value:e,expiry:(new Date).getTime()+864e5};localStorage.setItem("fp",JSON.stringify(t))})(un(t,o))}catch(e){global.FB_DEBUG&&console.error(e)}};var pn,fn,hn,gn,vn;const yn=e=>Object.assign({},e);class bn{constructor(e){pn.add(this),fn.set(this,void 0),hn.set(this,{}),gn.set(this,0),o(this,fn,e,"f")}get current(){return yn(r(this,fn,"f"))}update(e){const t=e;if(!((e,t)=>{const n=e&&Object.getOwnPropertyNames(e)||[],r=t&&Object.getOwnPropertyNames(t)||[];if(n.length!==r.length)return!1;for(let r=0;r<n.length;r+=1){const o=n[r];if(e[o]!==t[o])return!1}return!0})(r(this,fn,"f"),t)){const e=r(this,fn,"f");o(this,fn,t,"f"),Object.freeze(r(this,fn,"f")),setTimeout((()=>{Object.values(r(this,hn,"f")).forEach((n=>n(yn(t),e)))}),0)}}subscribe(e){o(this,gn,r(this,gn,"f")+1,"f"),r(this,hn,"f")[r(this,gn,"f")]=e;const t=r(this,gn,"f");return()=>r(this,pn,"m",vn).call(this,t.toString())}unsubscribeAll(){o(this,hn,{},"f")}}
1
+ !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).Descope=t()}(this,(function(){"use strict";const e=(e,t)=>{var n;return["beforeRequest","afterRequest"].reduce(((n,r)=>{var o;return n[r]=[].concat((null===(o=e.hooks)||void 0===o?void 0:o[r])||[]).concat((null==t?void 0:t[r])||[]),n}),null!==(n=e.hooks)&&void 0!==n?n:e.hooks={}),e},t=async e=>{if(!(null==e?void 0:e.ok))return{};const t=await(null==e?void 0:e.clone().json());return(null==t?void 0:t.authInfo)||t||{}},n=async e=>{const n=await t(e);return(null==n?void 0:n.user)||((null==n?void 0:n.hasOwnProperty("userId"))?n:void 0)},r="undefined"!=typeof localStorage,o=(e,t)=>r&&(null===localStorage||void 0===localStorage?void 0:localStorage.setItem(e,t)),a=e=>r&&(null===localStorage||void 0===localStorage?void 0:localStorage.getItem(e)),i=e=>r&&(null===localStorage||void 0===localStorage?void 0:localStorage.removeItem(e)),s=e=>Object.assign(e,{headers:Object.assign(Object.assign({},e.headers),{"x-descope-sdk-name":"web-js","x-descope-sdk-version":"0.1.0-alpha.17"})});var c=function(){return c=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var o in t=arguments[n])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},c.apply(this,arguments)};function u(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&Object.prototype.propertyIsEnumerable.call(e,r[o])&&(n[r[o]]=e[r[o]])}return n}function l(e){this.message=e}l.prototype=new Error,l.prototype.name="InvalidCharacterError";var d="undefined"!=typeof window&&window.atob&&window.atob.bind(window)||function(e){var t=String(e).replace(/=+$/,"");if(t.length%4==1)throw new l("'atob' failed: The string to be decoded is not correctly encoded.");for(var n,r,o=0,a=0,i="";r=t.charAt(a++);~r&&(n=o%4?64*n+r:r,o++%4)?i+=String.fromCharCode(255&n>>(-2*o&6)):0)r="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(r);return i};function p(e){this.message=e}function f(e,t){if("string"!=typeof e)throw new p("Invalid token specified");var n=!0===(t=t||{}).header?0:1;try{return JSON.parse(function(e){var t=e.replace(/-/g,"+").replace(/_/g,"/");switch(t.length%4){case 0:break;case 2:t+="==";break;case 3:t+="=";break;default:throw"Illegal base64url string!"}try{return function(e){return decodeURIComponent(d(e).replace(/(.)/g,(function(e,t){var n=t.charCodeAt(0).toString(16).toUpperCase();return n.length<2&&(n="0"+n),"%"+n})))}(t)}catch(e){return d(t)}}(e.split(".")[n]))}catch(e){throw new p("Invalid token specified: "+e.message)}}p.prototype=new Error,p.prototype.name="InvalidTokenError";var h="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},g="__lodash_hash_undefined__",v="[object Function]",y="[object GeneratorFunction]",b=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,w=/^\w*$/,m=/^\./,k=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,O=/\\(\\)?/g,I=/^\[object .+?Constructor\]$/,j="object"==typeof h&&h&&h.Object===Object&&h,_="object"==typeof self&&self&&self.Object===Object&&self,x=j||_||Function("return this")();var S,U=Array.prototype,P=Function.prototype,R=Object.prototype,E=x["__core-js_shared__"],C=(S=/[^.]+$/.exec(E&&E.keys&&E.keys.IE_PROTO||""))?"Symbol(src)_1."+S:"",T=P.toString,A=R.hasOwnProperty,q=R.toString,D=RegExp("^"+T.call(A).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),J=x.Symbol,$=U.splice,K=Q(x,"Map"),M=Q(Object,"create"),N=J?J.prototype:void 0,L=N?N.toString:void 0;function B(e){var t=-1,n=e?e.length:0;for(this.clear();++t<n;){var r=e[t];this.set(r[0],r[1])}}function F(e){var t=-1,n=e?e.length:0;for(this.clear();++t<n;){var r=e[t];this.set(r[0],r[1])}}function z(e){var t=-1,n=e?e.length:0;for(this.clear();++t<n;){var r=e[t];this.set(r[0],r[1])}}function H(e,t){for(var n,r,o=e.length;o--;)if((n=e[o][0])===(r=t)||n!=n&&r!=r)return o;return-1}function V(e,t){var n;t=function(e,t){if(ee(e))return!1;var n=typeof e;if("number"==n||"symbol"==n||"boolean"==n||null==e||ne(e))return!0;return w.test(e)||!b.test(e)||null!=t&&e in Object(t)}(t,e)?[t]:ee(n=t)?n:W(n);for(var r=0,o=t.length;null!=e&&r<o;)e=e[X(t[r++])];return r&&r==o?e:void 0}function G(e){if(!te(e)||(t=e,C&&C in t))return!1;var t,n=function(e){var t=te(e)?q.call(e):"";return t==v||t==y}(e)||function(e){var t=!1;if(null!=e&&"function"!=typeof e.toString)try{t=!!(e+"")}catch(e){}return t}(e)?D:I;return n.test(function(e){if(null!=e){try{return T.call(e)}catch(e){}try{return e+""}catch(e){}}return""}(e))}function Z(e,t){var n,r,o=e.__data__;return("string"==(r=typeof(n=t))||"number"==r||"symbol"==r||"boolean"==r?"__proto__"!==n:null===n)?o["string"==typeof t?"string":"hash"]:o.map}function Q(e,t){var n=function(e,t){return null==e?void 0:e[t]}(e,t);return G(n)?n:void 0}B.prototype.clear=function(){this.__data__=M?M(null):{}},B.prototype.delete=function(e){return this.has(e)&&delete this.__data__[e]},B.prototype.get=function(e){var t=this.__data__;if(M){var n=t[e];return n===g?void 0:n}return A.call(t,e)?t[e]:void 0},B.prototype.has=function(e){var t=this.__data__;return M?void 0!==t[e]:A.call(t,e)},B.prototype.set=function(e,t){return this.__data__[e]=M&&void 0===t?g:t,this},F.prototype.clear=function(){this.__data__=[]},F.prototype.delete=function(e){var t=this.__data__,n=H(t,e);return!(n<0)&&(n==t.length-1?t.pop():$.call(t,n,1),!0)},F.prototype.get=function(e){var t=this.__data__,n=H(t,e);return n<0?void 0:t[n][1]},F.prototype.has=function(e){return H(this.__data__,e)>-1},F.prototype.set=function(e,t){var n=this.__data__,r=H(n,e);return r<0?n.push([e,t]):n[r][1]=t,this},z.prototype.clear=function(){this.__data__={hash:new B,map:new(K||F),string:new B}},z.prototype.delete=function(e){return Z(this,e).delete(e)},z.prototype.get=function(e){return Z(this,e).get(e)},z.prototype.has=function(e){return Z(this,e).has(e)},z.prototype.set=function(e,t){return Z(this,e).set(e,t),this};var W=Y((function(e){var t;e=null==(t=e)?"":function(e){if("string"==typeof e)return e;if(ne(e))return L?L.call(e):"";var t=e+"";return"0"==t&&1/e==-1/0?"-0":t}(t);var n=[];return m.test(e)&&n.push(""),e.replace(k,(function(e,t,r,o){n.push(r?o.replace(O,"$1"):t||e)})),n}));function X(e){if("string"==typeof e||ne(e))return e;var t=e+"";return"0"==t&&1/e==-1/0?"-0":t}function Y(e,t){if("function"!=typeof e||t&&"function"!=typeof t)throw new TypeError("Expected a function");var n=function(){var r=arguments,o=t?t.apply(this,r):r[0],a=n.cache;if(a.has(o))return a.get(o);var i=e.apply(this,r);return n.cache=a.set(o,i),i};return n.cache=new(Y.Cache||z),n}Y.Cache=z;var ee=Array.isArray;function te(e){var t=typeof e;return!!e&&("object"==t||"function"==t)}function ne(e){return"symbol"==typeof e||function(e){return!!e&&"object"==typeof e}(e)&&"[object Symbol]"==q.call(e)}var re=function(e,t,n){var r=null==e?void 0:V(e,t);return void 0===r?n:r},oe="/v1/auth/accesskey/exchange",ae="/v1/auth/otp/verify",ie="/v1/auth/otp/signin",se="/v1/auth/otp/signup",ce={email:"/v1/auth/otp/update/email",phone:"/v1/auth/otp/update/phone"},ue="/v1/auth/otp/signup-in",le="/v1/auth/magiclink/verify",de="/v1/auth/magiclink/signin",pe="/v1/auth/magiclink/signup",fe={email:"/v1/auth/magiclink/update/email",phone:"/v1/auth/magiclink/update/phone"},he="/v1/auth/magiclink/signup-in",ge="/v1/auth/enchantedlink/verify",ve="/v1/auth/enchantedlink/signin",ye="/v1/auth/enchantedlink/signup",be="/v1/auth/enchantedlink/pending-session",we={email:"/v1/auth/enchantedlink/update/email"},me="/v1/auth/enchantedlink/signup-in",ke="/v1/auth/oauth/authorize",Oe="/v1/auth/oauth/exchange",Ie="/v1/auth/saml/authorize",je="/v1/auth/saml/exchange",_e="/v1/auth/totp/verify",xe="/v1/auth/totp/signup",Se="/v1/user/totp/update",Ue={start:"/v1/auth/webauthn/signup/start",finish:"/v1/auth/webauthn/signup/finish"},Pe={start:"/v1/auth/webauthn/signin/start",finish:"/v1/auth/webauthn/signin/finish"},Re={start:"/v1/auth/webauthn/signup-in/start"},Ee={start:"v1/auth/webauthn/update/start",finish:"/v1/auth/webauthn/update/finish"},Ce="/v1/auth/refresh",Te="/v1/auth/logout",Ae="/v1/auth/logoutall",qe="/v1/auth/me",De="/v1/flow/start",Je="/v1/flow/next";const $e=()=>{const e={};return{headers(t){const n="function"==typeof t.entries?Object.fromEntries(t.entries()):t;return e.Headers=JSON.stringify(n),this},body(t){return e.Body=t,this},url(t){return e.Url=t.toString(),this},method(t){return e.Method=t,this},title(t){return e.Title=t,this},status(t){return e.Status=t,this},build:()=>Object.keys(e).flatMap((t=>e[t]?[`${"Title"!==t?`${t}: `:""}${e[t]}`]:[])).join("\n")}};var Ke;!function(e){e.get="GET",e.delete="DELETE",e.post="POST",e.put="PUT"}(Ke||(Ke={}));const Me=(...e)=>new Headers(e.reduce(((e,t)=>{const n=(e=>Array.isArray(e)?e:e instanceof Headers?Array.from(e.entries()):e?Object.entries(e):[])(t);return n.reduce(((t,[n,r])=>(e[n]=r,e)),e),e}),{})),Ne=e=>void 0===e?void 0:JSON.stringify(e),Le=(e,t="")=>{let n=e;return t&&(n=n+":"+t),{Authorization:`Bearer ${n}`}},Be=({baseUrl:e,projectId:t,baseConfig:n,logger:r,hooks:o,cookiePolicy:a})=>{const i=((e,t)=>{const n=t||fetch;if(!n)throw new Error("fetch is not defined");return e?async(...t)=>{e.log((e=>$e().title("Request").url(e[0]).method(e[1].method).headers(e[1].headers).body(e[1].body).build())(t));const r=await n(...t);return e[r.ok?"log":"error"](await(async e=>{const t=await(e.clone?e.clone().text():e.text());return e.text=()=>Promise.resolve(t),e.json=()=>Promise.resolve(JSON.parse(t)),$e().title("Response").url(e.url.toString()).status(`${e.status} ${e.statusText}`).headers(e.headers).body(t).build()})(r)),r}:n})(r),s=async r=>{const s=(null==o?void 0:o.beforeRequest)?o.beforeRequest(r):r,{path:c,body:u,headers:l,queryParams:d,method:p,token:f}=s,h=await i((({path:e,baseUrl:t,queryParams:n})=>{const r=new URL(e,t);return n&&(r.search=new URLSearchParams(n).toString()),r})({path:c,baseUrl:e,queryParams:d}),{headers:Me(Le(t,f),{"x-descope-sdk-name":"core-js","x-descope-sdk-version":"0.0.41-alpha.36"},(null==n?void 0:n.baseHeaders)||{},l),method:p,body:Ne(u),credentials:a||"include"});return(null==o?void 0:o.afterRequest)&&o.afterRequest(r,null==h?void 0:h.clone()),h};return{get:(e,{headers:t,queryParams:n,token:r}={})=>s({path:e,headers:t,queryParams:n,body:void 0,method:Ke.get,token:r}),post:(e,t,{headers:n,queryParams:r,token:o}={})=>s({path:e,headers:n,queryParams:r,body:t,method:Ke.post,token:o}),put:(e,t,{headers:n,queryParams:r,token:o}={})=>s({path:e,headers:n,queryParams:r,body:t,method:Ke.put,token:o}),delete:(e,t,{headers:n,queryParams:r,token:o}={})=>s({path:e,headers:n,queryParams:r,body:t,method:Ke.delete,token:o}),hooks:o}};function Fe(e,t,n){var r;let o=ze(e);t&&(o=null===(r=o.tenants)||void 0===r?void 0:r[t]);const a=o[n];return Array.isArray(a)?a:[]}function ze(e){if("string"!=typeof e||!e)throw new Error("Invalid token provided");return f(e)}function He(e){const{exp:t}=ze(e);return(new Date).getTime()/1e3>t}function Ve(e,t){return Fe(e,t,"permissions")}function Ge(e,t){return Fe(e,t,"roles")}const Ze=(...e)=>e.join("/").replace(/\/{2,}/g,"/");async function Qe(e,t){const n=await e,r={code:n.status,ok:n.ok,response:n},o=await n.clone().json();return n.ok?r.data=t?t(o):o:r.error=o,r}const We=(e,t)=>(n=t)=>t=>!e(t)&&n.replace("{val}",t),Xe=(...e)=>({validate:t=>(e.forEach((e=>{const n=e(t);if(n)throw new Error(n)})),!0)}),Ye=e=>t=>e.test(t),et=Ye(/^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/),tt=Ye(/^\+[1-9]{1}[0-9]{3,14}$/),nt=We(et,'"{val}" is not a valid email'),rt=We(tt,'"{val}" is not a valid phone number'),ot=We((1,e=>e.length>=1),"Minimum length is 1");const at=We((e=>"string"==typeof e),"Input is not a string"),it=(...e)=>t=>(...n)=>(e.forEach(((e,t)=>Xe(...e).validate(n[t]))),t(...n)),st=e=>[at(`"${e}" must be a string`),ot(`"${e}" must not be empty`)],ct=e=>[at(`"${e}" must be a string`),nt()],ut=e=>[at(`"${e}" must be a string`),rt()],lt=it(st("accessKey")),dt=e=>({exchange:lt((t=>Qe(e.post(oe,{},{token:t}))))});var pt,ft,ht,gt,vt;!function(e){e.sms="sms",e.whatsapp="whatsapp"}(pt||(pt={})),function(e){e.email="email",e.sms="sms",e.whatsapp="whatsapp"}(ft||(ft={})),function(e){e.waiting="waiting",e.running="running",e.completed="completed",e.failed="failed"}(ht||(ht={})),function(e){e.signUp="signup",e.signIn="signin",e.verify="verify"}(gt||(gt={})),function(e){e.signUp="signup",e.signIn="signin",e.verify="verify",e.updatePhone="updatePhone"}(vt||(vt={}));const yt=st("identifier"),bt=it(yt,st("code")),wt=it(yt),mt=it(yt,ut("phone")),kt=it(yt,ct("email")),Ot=e=>({verify:Object.keys(ft).reduce(((t,n)=>Object.assign(Object.assign({},t),{[n]:bt(((t,r)=>Qe(e.post(Ze(ae,n),{code:r,externalId:t}))))})),{}),signIn:Object.keys(ft).reduce(((t,n)=>Object.assign(Object.assign({},t),{[n]:wt(((t,r,o)=>Qe(e.post(Ze(ie,n),{externalId:t,loginOptions:r},{token:o}))))})),{}),signUp:Object.keys(ft).reduce(((t,n)=>Object.assign(Object.assign({},t),{[n]:wt(((t,r)=>Qe(e.post(Ze(se,n),{externalId:t,user:r}))))})),{}),signUpOrIn:Object.keys(ft).reduce(((t,n)=>Object.assign(Object.assign({},t),{[n]:wt((t=>Qe(e.post(Ze(ue,n),{externalId:t}))))})),{}),update:{email:kt(((t,n,r)=>Qe(e.post(ce.email,{externalId:t,email:n},{token:r})))),phone:Object.keys(pt).reduce(((t,n)=>Object.assign(Object.assign({},t),{[n]:mt(((t,r,o)=>Qe(e.post(Ze(ce.phone,n),{externalId:t,phone:r},{token:o}))))})),{})}}),It=st("identifier"),jt=st("uri"),_t=it(st("token")),xt=it(It,jt),St=it(It,ut("phone"),jt),Ut=it(It,ct("email"),jt),Pt=e=>({verify:_t((t=>Qe(e.post(le,{token:t})))),signIn:Object.keys(ft).reduce(((t,n)=>Object.assign(Object.assign({},t),{[n]:xt(((t,r,o,a)=>Qe(e.post(Ze(de,n),{externalId:t,URI:r,loginOptions:o},{token:a}))))})),{}),signUp:Object.keys(ft).reduce(((t,n)=>Object.assign(Object.assign({},t),{[n]:xt(((t,r,o)=>Qe(e.post(Ze(pe,n),{externalId:t,URI:r,user:o}))))})),{}),signUpOrIn:Object.keys(ft).reduce(((t,n)=>Object.assign(Object.assign({},t),{[n]:xt(((t,r)=>Qe(e.post(Ze(he,n),{externalId:t,URI:r}))))})),{}),update:{email:Ut(((t,n,r,o)=>Qe(e.post(fe.email,{externalId:t,email:n,URI:r},{token:o})))),phone:Object.keys(pt).reduce(((t,n)=>Object.assign(Object.assign({},t),{[n]:St(((t,r,o,a)=>Qe(e.post(Ze(fe.phone,n),{externalId:t,phone:r,URI:o},{token:a}))))})),{})}}),Rt=st("identifier"),Et=st("uri"),Ct=it(st("token")),Tt=it(Rt,Et),At=it(st("pendingRef")),qt=it(Rt,ct("email"),Et),Dt=e=>({verify:Ct((t=>Qe(e.post(ge,{token:t})))),signIn:Tt(((t,n,r,o)=>Qe(e.post(Ze(ve,ft.email),{externalId:t,URI:n,loginOptions:r},{token:o})))),signUpOrIn:Tt(((t,n)=>Qe(e.post(Ze(me,ft.email),{externalId:t,URI:n})))),signUp:Tt(((t,n,r)=>Qe(e.post(Ze(ye,ft.email),{externalId:t,URI:n,user:r})))),waitForSession:At(((t,n)=>new Promise((r=>{const{pollingIntervalMs:o,timeoutMs:a}=(({pollingIntervalMs:e=1e3,timeoutMs:t=6e5}={})=>({pollingIntervalMs:Math.max(e||1e3,1e3),timeoutMs:Math.min(t||6e5,6e5)}))(n);let i;const s=setInterval((async()=>{const n=await e.post(be,{pendingRef:t});n.ok&&(clearInterval(s),i&&clearTimeout(i),r(Qe(Promise.resolve(n))))}),o);i=setTimeout((()=>{r({error:{message:`Session polling timeout exceeded: ${a}ms`,errorCode:"0"},ok:!1}),clearInterval(s)}),a)})))),update:{email:qt(((t,n,r,o)=>Qe(e.post(we.email,{externalId:t,email:n,URI:r},{token:o}))))}});var Jt;!function(e){e.facebook="facebook",e.github="github",e.google="google",e.microsoft="microsoft",e.gitlab="gitlab",e.apple="apple"}(Jt||(Jt={}));const $t=it(st("code")),Kt=e=>({start:Object.keys(Jt).reduce(((t,n)=>Object.assign(Object.assign({},t),{[n]:async(t,{redirect:r=!1}={},o,a)=>{const i=await e.post(ke,o||{},{queryParams:Object.assign({provider:n},t&&{redirectURL:t}),token:a});if(!r||!i.ok)return Qe(Promise.resolve(i));const{url:s}=await i.json();window.location.href=s}})),{}),exchange:$t((t=>Qe(e.post(Oe,{code:t}))))}),Mt=it(st("flowId")),Nt=it(st("executionId"),st("stepId"),st("interactionId")),Lt=e=>({start:Mt(((t,n,r,o)=>Qe(e.post(De,{flowId:t,options:n,interactionId:r,input:o})))),next:Nt(((t,n,r,o)=>Qe(e.post(Je,{executionId:t,stepId:n,interactionId:r,input:o}))))}),Bt=it(st("tenant")),Ft=it(st("code")),zt=e=>({start:Bt((async(t,n,{redirect:r=!1}={},o,a)=>{const i=await e.post(Ie,o||{},{queryParams:{tenant:t,redirectURL:n},token:a});if(!r||!i.ok)return Qe(Promise.resolve(i));const{url:s}=await i.json();window.location.href=s})),exchange:Ft((t=>Qe(e.post(je,{code:t}))))}),Ht=st("identifier"),Vt=it(Ht,st("code")),Gt=it(Ht),Zt=it(Ht),Qt=e=>({signUp:Gt(((t,n)=>Qe(e.post(xe,{externalId:t,user:n})))),verify:Vt(((t,n,r,o)=>Qe(e.post(_e,{externalId:t,code:n,loginOptions:r},{token:o})))),update:Zt(((t,n)=>Qe(e.post(Se,{externalId:t},{token:n}))))}),Wt=st("identifier"),Xt=st("origin"),Yt=it(Wt,Xt,st("name")),en=it(Wt,Xt),tn=it(Wt,Xt,st("token")),nn=it(st("transactionId"),st("response")),rn=e=>({signUp:{start:Yt(((t,n,r)=>Qe(e.post(Ue.start,{user:{externalId:t,name:r},origin:n})))),finish:nn(((t,n)=>Qe(e.post(Ue.finish,{transactionId:t,response:n}))))},signIn:{start:en(((t,n,r,o)=>Qe(e.post(Pe.start,{externalId:t,origin:n,loginOptions:r},{token:o})))),finish:nn(((t,n)=>Qe(e.post(Pe.finish,{transactionId:t,response:n}))))},signUpOrIn:{start:en(((t,n)=>Qe(e.post(Re.start,{externalId:t,origin:n}))))},update:{start:tn(((t,n,r)=>Qe(e.post(Ee.start,{externalId:t,origin:n},{token:r})))),finish:nn(((t,n)=>Qe(e.post(Ee.finish,{transactionId:t,response:n}))))}}),on=it(st("token")),an=(e,t,n)=>(t.forEach((t=>{const r=t.split(".");let o=r.shift(),a=e;for(;r.length>0;){if(a=a[o],!o||!a)throw Error(`Invalid path "${t}", "${o}" is missing or has no value`);o=r.shift()}if("function"!=typeof a[o])throw Error(`"${t}" is not a function`);const i=a[o];a[o]=n(i)})),e);var sn;let cn=it([("projectId",sn=st("projectId"),We(((e,t)=>e=>Xe(...t).validate(re(e,"projectId")))(0,sn))())])((e=>{var t,n;const r=[].concat((null===(t=e.hooks)||void 0===t?void 0:t.beforeRequest)||[]),o=[].concat((null===(n=e.hooks)||void 0===n?void 0:n.afterRequest)||[]);return(({projectId:e,logger:t,baseUrl:n,hooks:r,cookiePolicy:o})=>{return a=Be({baseUrl:n||"https://api.descope.com",projectId:e,logger:t,hooks:r,cookiePolicy:o}),{accessKey:dt(a),otp:Ot(a),magicLink:Pt(a),enchantedLink:Dt(a),oauth:Kt(a),saml:zt(a),totp:Qt(a),webauthn:rn(a),flow:Lt(a),refresh:e=>Qe(a.post(Ce,{},{token:e})),logout:e=>Qe(a.post(Te,{},{token:e})),logoutAll:e=>Qe(a.post(Ae,{},{token:e})),me:e=>Qe(a.get(qe,{token:e})),isJwtExpired:on(He),getJwtPermissions:on(Ve),getJwtRoles:on(Ge),httpClient:a};var a})(Object.assign(Object.assign({},e),{hooks:{beforeRequest:e=>null==r?void 0:r.reduce(((e,t)=>t(e)),e),afterRequest:(e,t)=>{null==o||o.forEach((n=>n(e,null==t?void 0:t.clone())))}}}))}));var un=Object.assign(cn,{DeliveryMethods:ft});const ln="undefined"!=typeof window,dn=ln&&localStorage.getItem("fingerprint.public.key")||"A9aCLRHzKCv3uL69oqDr",pn=ln&&(null===localStorage||void 0===localStorage?void 0:localStorage.getItem("fingerprint.endpoint.url"))||"https://fp.descope.com";function fn(e,t){var n=[];return function(e,t){var n,r,o=(r=function(){for(var e=0,t=0,n=arguments.length;t<n;t++)e+=arguments[t].length;var r=Array(e),o=0;for(t=0;t<n;t++)for(var a=arguments[t],i=0,s=a.length;i<s;i++,o++)r[o]=a[i];return r}(e),{current:function(){return r[0]},postpone:function(){var e=r.shift();void 0!==e&&r.push(e)},exclude:function(){r.shift()}}),a=(100,3e3,n=0,function(){return Math.random()*Math.min(3e3,100*Math.pow(2,n++))}),i=o.current();if(void 0===i)return Promise.reject(new TypeError("The list of script URL patterns is empty"));var s=function(e,n){return t(e).catch((function(e){if(n+1>=5)throw e;!function(e){if(!(e instanceof Error))return!1;var t=e.message;return"Blocked by CSP"===t||"9319"===t}(e)?o.postpone():o.exclude();var t,r=o.current();if(void 0===r)throw e;return(t=a(),new Promise((function(e){return setTimeout(e,t)}))).then((function(){return s(r,n+1)}))}))};return s(i,0)}(e,(function(e){var r=new Date,o=function(){return n.push({url:e,startedAt:r,finishedAt:new Date})},a=t(e);return a.then(o,o),a})).then((function(e){return[e,{attempts:n}]}))}var hn="Failed to load the JS script of the agent";function gn(e){var t;e.scriptUrlPattern;var n=e.token,r=e.apiKey,o=void 0===r?n:r,a=u(e,["scriptUrlPattern","token","apiKey"]),i=null!==(t=function(e,t){return function(e,t){return Object.prototype.hasOwnProperty.call(e,t)}(e,t)?e[t]:void 0}(e,"scriptUrlPattern"))&&void 0!==t?t:"https://fpnpmcdn.net/v<version>/<apiKey>/loader_v<loaderVersion>.js";return Promise.resolve().then((function(){if(!o||"string"!=typeof o)throw new Error("API key required");return fn(function(e,t){return(Array.isArray(e)?e:[e]).map((function(e){return function(e,t){var n=encodeURIComponent;return e.replace(/<[^<>]+>/g,(function(e){return"<version>"===e?"3":"<apiKey>"===e?n(t):"<loaderVersion>"===e?n("3.8.1"):e}))}(String(e),t)}))}(i,o),vn).catch(bn)})).then((function(e){var t=e[0],n=e[1];return t.load(c(c({},a),{ldi:n}))}))}function vn(e){return function(e,t,n,r){var o,a=document,i="securitypolicyviolation",s=function(t){var n=new URL(e,location.href),r=t.blockedURI;r!==n.href&&r!==n.protocol.slice(0,-1)&&r!==n.origin||(o=t,c())};a.addEventListener(i,s);var c=function(){return a.removeEventListener(i,s)};return Promise.resolve().then(t).then((function(e){return c(),e}),(function(e){return new Promise((function(e){return setTimeout(e)})).then((function(){if(c(),o)return function(){throw new Error("Blocked by CSP")}();throw e}))}))}(e,(function(){return function(e){return new Promise((function(t,n){var r=document.createElement("script"),o=function(){var e;return null===(e=r.parentNode)||void 0===e?void 0:e.removeChild(r)},a=document.head||document.getElementsByTagName("head")[0];r.onload=function(){o(),t()},r.onerror=function(){o(),n(new Error(hn))},r.async=!0,r.src=e,a.appendChild(r)}))}(e)})).then(yn)}function yn(){var e=window,t="__fpjs_p_l_b",n=e[t];if(function(e,t){var n,r=null===(n=Object.getOwnPropertyDescriptor)||void 0===n?void 0:n.call(Object,e,t);(null==r?void 0:r.configurable)?delete e[t]:r&&!r.writable||(e[t]=void 0)}(e,t),"function"!=typeof(null==n?void 0:n.load))throw new Error("9319");return n}function bn(e){throw e instanceof Error&&"9319"===e.message?new Error(hn):e}const wn=(e="",t="")=>({vsid:e,vrid:t}),mn=(e=!1)=>{const t=localStorage.getItem("fp");if(!t)return null;const n=JSON.parse(t);return(new Date).getTime()>n.expiry&&!e?null:n.value},kn=async e=>{try{if(mn())return;const t=(Date.now().toString(36)+Math.random().toString(36).substring(2)+Math.random().toString(36).substring(2)).substring(0,27),n=gn({apiKey:e||dn,endpoint:pn}),r=await n,{requestId:o}=await r.get({linkedId:t});(e=>{const t={value:e,expiry:(new Date).getTime()+864e5};localStorage.setItem("fp",JSON.stringify(t))})(wn(t,o))}catch(e){global.FB_DEBUG&&console.error(e)}},On=e=>(e.body&&(e.body.fpData=mn(!0)||wn()),e),In="dls_last_user_external_id",jn=e=>async(...t)=>{t[1]=t[1]||{};const[,n]=t,r=a(In);r&&(n.lastUser={externalId:r});return await e(...t)},_n=e=>async(...t)=>{const n=await e(...t);return i(In),n};function xn(){const e=[];return{pub:t=>{e.forEach((e=>e(t)))},sub:t=>{const n=e.push(t)-1;return()=>e.splice(n,1)}}}
2
2
  /*! js-cookie v3.0.1 | MIT */
3
- function wn(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)e[r]=n[r]}return e}fn=new WeakMap,hn=new WeakMap,gn=new WeakMap,pn=new WeakSet,vn=function(e){!!r(this,hn,"f")[e]&&delete r(this,hn,"f")[e]};var mn=function e(t,n){function r(e,r,o){if("undefined"!=typeof document){"number"==typeof(o=wn({},n,o)).expires&&(o.expires=new Date(Date.now()+864e5*o.expires)),o.expires&&(o.expires=o.expires.toUTCString()),e=encodeURIComponent(e).replace(/%(2[346B]|5E|60|7C)/g,decodeURIComponent).replace(/[()]/g,escape);var i="";for(var a in o)o[a]&&(i+="; "+a,!0!==o[a]&&(i+="="+o[a].split(";")[0]));return document.cookie=e+"="+t.write(r,e)+i}}return Object.create({set:r,get:function(e){if("undefined"!=typeof document&&(!arguments.length||e)){for(var n=document.cookie?document.cookie.split("; "):[],r={},o=0;o<n.length;o++){var i=n[o].split("="),a=i.slice(1).join("=");try{var s=decodeURIComponent(i[0]);if(r[s]=t.read(a,s),e===s)break}catch(e){}}return e?r[e]:r}},remove:function(e,t){r(e,"",wn({},t,{expires:-1}))},withAttributes:function(t){return e(this.converter,wn({},this.attributes,t))},withConverter:function(t){return e(wn({},this.converter,t),this.attributes)}},{attributes:{value:Object.freeze(n)},converter:{value:Object.freeze(t)}})}({read:function(e){return'"'===e[0]&&(e=e.slice(1,-1)),e.replace(/(%[\dA-F]{2})+/gi,decodeURIComponent)},write:function(e){return encodeURIComponent(e).replace(/%(2[346BF]|3[AC-F]|40|5[BDE]|60|7[BCD])/g,decodeURIComponent)}},{path:"/"});const kn="DS",In="DSR";let On=[];function jn(e,t,n){const r=function(e){const t=e.split(".");try{if(3===t.length){const t=JSON.parse(window.atob(e.split(".")[1]));if(t.exp)return new Date(1e3*t.exp)}}catch(e){}return null}(t);if(r){let t;for(;t=On.pop();)clearTimeout(t);const o=r.getTime()-2e4-(new Date).getTime(),i=setTimeout((()=>{e(n)}),o);On.push(i)}}async function Sn(e,t,r,o){var i;try{if(401===t.status)return r.sessionToken.update({sessionToken:""}),void r.user.update({});const a=await(null==t?void 0:t.json());if(a){const t=function(e){return(null==e?void 0:e.authInfo)||e||{}}(a),{sessionJwt:s,refreshJwt:c,user:u}=t,l=n(t,["sessionJwt","refreshJwt","user"]);if(o.persistTokens&&(function(e,{cookiePath:t,cookieDomain:n,cookieExpiration:r},o){e&&(o?mn.set(kn,e,{path:t,domain:n,expires:r,sameSite:"None",secure:!0}):localStorage&&localStorage.setItem(kn,e))}(s,l,o.sessionTokenViaCookie),function(e){localStorage&&e&&localStorage.setItem(In,e)}(c)),s&&r.sessionToken.update({sessionToken:s}),u){const e=null===(i=null==u?void 0:u.externalIds)||void 0===i?void 0:i[0];Xt&&e&&(null===localStorage||void 0===localStorage||localStorage.setItem(tn,e)),r.user.update(u)}s&&c&&o.autoRefresh&&jn(e,s,c)}}catch(e){console.error("Could not set tokens from body",e)}}function _n(){return localStorage?null===localStorage||void 0===localStorage?void 0:localStorage.getItem(In):""}async function xn(e){const t=function(e){var t;const n=JSON.parse(e);return n.publicKey.challenge=Tn(n.publicKey.challenge),n.publicKey.user.id=Tn(n.publicKey.user.id),null===(t=n.publicKey.excludeCredentials)||void 0===t||t.forEach((e=>{e.id=Tn(e.id)})),n}(e),n=await navigator.credentials.create(t);return r=n,JSON.stringify(Object.assign(Object.assign({},r),{rawId:Cn(r.rawId),response:Object.assign(Object.assign({},r.response),{attestationObject:Cn(r.response.attestationObject),clientDataJSON:Cn(r.response.clientDataJSON)})}));var r}async function Pn(e){const t=function(e){var t;const n=JSON.parse(e);return n.publicKey.challenge=Tn(n.publicKey.challenge),null===(t=n.publicKey.allowCredentials)||void 0===t||t.forEach((e=>{e.id=Tn(e.id)})),n}(e),n=await navigator.credentials.get(t);return r=n,JSON.stringify(Object.assign(Object.assign({},r),{rawId:Cn(r.rawId),response:Object.assign(Object.assign({},r.response),{authenticatorData:Cn(r.response.authenticatorData),clientDataJSON:Cn(r.response.clientDataJSON),signature:Cn(r.response.signature),userHandle:r.response.userHandle?Cn(r.response.userHandle):void 0})}));var r}async function Un(e=!1){if(!Xt)return Promise.resolve(!1);const t=!!(PublicKeyCredential&&navigator.credentials&&navigator.credentials.create&&navigator.credentials.get);return t&&e&&PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable?PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable():t}function Tn(e){const t=e.replace(/_/g,"/").replace(/-/g,"+");return Uint8Array.from(atob(t),(e=>e.charCodeAt(0))).buffer}function Cn(e){return btoa(String.fromCharCode.apply(null,new Uint8Array(e))).replace(/\//g,"_").replace(/\+/g,"-").replace(/=/g,"")}e.createSdk=e=>{var{autoRefresh:t=!0,persistTokens:r=!0,sessionTokenViaCookie:o,fpKey:i,fpLoad:a}=e,s=n(e,["autoRefresh","persistTokens","sessionTokenViaCookie","fpKey","fpLoad"]);Xt?a&&dn(i).catch((()=>null)):console.warn("Fingerprint is a client side only capability and will not work when running in the server");const c=s;let u,l;const d=new bn({sessionToken:""}),p=new bn({});c.hooks={beforeRequest:e=>null==u?void 0:u(e),afterRequest:(e,t)=>null==l?void 0:l(e,t)};const f=Qt(c),h=(g=f,{async signUp(e,t){const n=await g.webauthn.signUp.start(e,window.location.origin,t),r=await xn(n.data.options);return await g.webauthn.signUp.finish(n.data.transactionId,r)},async signIn(e){const t=await g.webauthn.signIn.start(e,window.location.origin),n=await Pn(t.data.options);return await g.webauthn.signIn.finish(t.data.transactionId,n)},async signUpOrIn(e){var t;const n=await g.webauthn.signUpOrIn.start(e,window.location.origin);if(null===(t=n.data)||void 0===t?void 0:t.create){const e=await xn(n.data.options);return await g.webauthn.signUp.finish(n.data.transactionId,e)}{const e=await Pn(n.data.options);return await g.webauthn.signIn.finish(n.data.transactionId,e)}},async update(e,t){const n=await g.webauthn.update.start(e,window.location.origin,t),r=await xn(n.data.options);return await g.webauthn.update.finish(n.data.transactionId,r)},helpers:{create:xn,get:Pn,isSupported:Un}});var g;const v=Object.assign(Object.assign({},f),{flow:Object.assign(Object.assign({},f.flow),{start:async(e,t,n,r)=>{const o=await h.helpers.isSupported(),i=null===localStorage||void 0===localStorage?void 0:localStorage.getItem(tn),a={tenant:null==r?void 0:r.tenant,redirectUrl:window.location.href,deviceInfo:{webAuthnSupport:o}};return i&&(a.lastUser={externalId:i}),f.flow.start(e,t,n,a)}}),webauthn:h,onSessionTokenChange:e=>{var t;const n=null===(t=d.current)||void 0===t?void 0:t.sessionToken;return n&&e(n),d.subscribe((({sessionToken:t})=>{e(t)}))},onUserChange:e=>{const t=p.current;return t&&Object.entries(t).length>0&&e(t),p.subscribe((t=>{e(t)}))},getRefreshToken:_n});return Xt?(t&&["logout","logoutAll"].forEach((e=>{const t=f[e];v[e]=(...e)=>{const n=_n(),r=[(null==e?void 0:e.shift())||n,...e],o=t(...r);return null===localStorage||void 0===localStorage||localStorage.removeItem(In),null===localStorage||void 0===localStorage||localStorage.removeItem(kn),mn.remove(kn),Xt&&(null===localStorage||void 0===localStorage||localStorage.removeItem(tn)),d.update({sessionToken:""}),o}})),u=e=>(e.body&&(e.body.fpData=ln(!0)||un()),!e.token&&r&&(e.token=_n()),e.headers=Object.assign(Object.assign({},e.headers),{"x-descope-sdk-name":"web-js","x-descope-sdk-version":"0.1.0-alpha.15"}),e),v.me=async(...e)=>{var t;const n=await f.me(...e);if(n.ok){const e=await(null===(t=n.response)||void 0===t?void 0:t.clone().json());p.update(e)}return n},(t||r)&&(l=(e,n)=>{Sn(v.refresh,n,{sessionToken:d,user:p},{autoRefresh:t,persistTokens:r,sessionTokenViaCookie:o})}),t&&_n()&&v.refresh(),v):(console.warn("Storing auth tokens in local storage and cookies are a client side only capabilities and will not be done when running in the server"),v)},e.getSessionToken=function(){return mn.get(kn)||(null===localStorage||void 0===localStorage?void 0:localStorage.getItem(kn))||""},Object.defineProperty(e,"__esModule",{value:!0})}));
3
+ function Sn(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)e[r]=n[r]}return e}var Un=function e(t,n){function r(e,r,o){if("undefined"!=typeof document){"number"==typeof(o=Sn({},n,o)).expires&&(o.expires=new Date(Date.now()+864e5*o.expires)),o.expires&&(o.expires=o.expires.toUTCString()),e=encodeURIComponent(e).replace(/%(2[346B]|5E|60|7C)/g,decodeURIComponent).replace(/[()]/g,escape);var a="";for(var i in o)o[i]&&(a+="; "+i,!0!==o[i]&&(a+="="+o[i].split(";")[0]));return document.cookie=e+"="+t.write(r,e)+a}}return Object.create({set:r,get:function(e){if("undefined"!=typeof document&&(!arguments.length||e)){for(var n=document.cookie?document.cookie.split("; "):[],r={},o=0;o<n.length;o++){var a=n[o].split("="),i=a.slice(1).join("=");try{var s=decodeURIComponent(a[0]);if(r[s]=t.read(i,s),e===s)break}catch(e){}}return e?r[e]:r}},remove:function(e,t){r(e,"",Sn({},t,{expires:-1}))},withAttributes:function(t){return e(this.converter,Sn({},this.attributes,t))},withConverter:function(t){return e(Sn({},this.converter,t),this.attributes)}},{attributes:{value:Object.freeze(n)},converter:{value:Object.freeze(t)}})}({read:function(e){return'"'===e[0]&&(e=e.slice(1,-1)),e.replace(/(%[\dA-F]{2})+/gi,decodeURIComponent)},write:function(e){return encodeURIComponent(e).replace(/%(2[346BF]|3[AC-F]|40|5[BDE]|60|7[BCD])/g,decodeURIComponent)}},{path:"/"});const Pn="DS",Rn="DSR";const En=(e={},t)=>{var{refreshJwt:n,sessionJwt:r}=e,a=u(e,["refreshJwt","sessionJwt"]);void 0===t&&(t=!1),n&&o(Rn,n),r&&(t?function(e,t,{cookiePath:n,cookieDomain:r,cookieExpiration:o}){if(t){const a=new Date(1e3*o);Un.set(e,t,{path:n,domain:r,expires:a,sameSite:"None",secure:!0})}}(Pn,r,a):o(Pn,r))};function Cn(){return a(Rn)||""}function Tn(){return Un.get(Pn)||a(Pn)||""}function An(){i(Rn),i(Pn),Un.remove(Pn)}const qn=e=>Object.assign(e,{token:e.token||Cn()}),Dn=e=>async(...t)=>{const n=await e(...t);return An(),n};async function Jn(e){const t=function(e){var t;const n=JSON.parse(e);return n.publicKey.challenge=Mn(n.publicKey.challenge),n.publicKey.user.id=Mn(n.publicKey.user.id),null===(t=n.publicKey.excludeCredentials)||void 0===t||t.forEach((e=>{e.id=Mn(e.id)})),n}(e),n=await navigator.credentials.create(t);return r=n,JSON.stringify(Object.assign(Object.assign({},r),{rawId:Nn(r.rawId),response:Object.assign(Object.assign({},r.response),{attestationObject:Nn(r.response.attestationObject),clientDataJSON:Nn(r.response.clientDataJSON)})}));var r}async function $n(e){const t=function(e){var t;const n=JSON.parse(e);return n.publicKey.challenge=Mn(n.publicKey.challenge),null===(t=n.publicKey.allowCredentials)||void 0===t||t.forEach((e=>{e.id=Mn(e.id)})),n}(e),n=await navigator.credentials.get(t);return r=n,JSON.stringify(Object.assign(Object.assign({},r),{rawId:Nn(r.rawId),response:Object.assign(Object.assign({},r.response),{authenticatorData:Nn(r.response.authenticatorData),clientDataJSON:Nn(r.response.clientDataJSON),signature:Nn(r.response.signature),userHandle:r.response.userHandle?Nn(r.response.userHandle):void 0})}));var r}async function Kn(e=!1){if(!ln)return Promise.resolve(!1);const t=!!(PublicKeyCredential&&navigator.credentials&&navigator.credentials.create&&navigator.credentials.get);return t&&e&&PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable?PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable():t}function Mn(e){const t=e.replace(/_/g,"/").replace(/-/g,"+");return Uint8Array.from(atob(t),(e=>e.charCodeAt(0))).buffer}function Nn(e){return btoa(String.fromCharCode.apply(null,new Uint8Array(e))).replace(/\//g,"_").replace(/\+/g,"-").replace(/=/g,"")}var Ln=e=>Object.assign(Object.assign({},e.flow),{start:async(t,n,r,o)=>{const a=await Kn(),i=Object.assign(Object.assign({},n),{redirectUrl:window.location.href,deviceInfo:{webAuthnSupport:a}});return e.flow.start(t,i,r,o)}});const Bn=function(...e){return t=>e.reduce(((e,t)=>t(e)),t)}((t=>r=>{const a=t(e(r,{afterRequest:async(e,t)=>{var r;const a=await n(t),i=null===(r=null==a?void 0:a.externalIds)||void 0===r?void 0:r[0];i&&(e=>{o(In,e)})(i)}}));let i=an(a,["flow.start"],jn);return i=an(i,["logout","logoutAll"],_n),i}),(t=>n=>{var{fpKey:r,fpLoad:o}=n,a=u(n,["fpKey","fpLoad"]);return ln?o&&kn(r).catch((()=>null)):console.warn("Fingerprint is a client side only capability and will not work when running in the server"),t(e(a,{beforeRequest:On}))}),(n=>r=>{var o=u(r,["autoRefresh"]);const{clearAllTimers:a,setTimer:i}=(()=>{const e=[];return{clearAllTimers:()=>{for(;e.length;)clearTimeout(e.pop())},setTimer:(t,n)=>{e.push(setTimeout(t,n))}}})(),s=n(e(o,{afterRequest:async(e,n)=>{const{refreshJwt:r,sessionJwt:o}=await t(n);if(401===(null==n?void 0:n.status))a();else if(o){const e=((c=(e=>{const t=e.split(".");try{if(3===t.length){const e=JSON.parse(window.atob(t[1]));if(e.exp)return new Date(1e3*e.exp)}}catch(e){}return null})(o))?c.getTime()-(new Date).getTime():0)-2e4;a(),i((()=>s.refresh(r)),e)}var c}}));return an(s,["logout","logoutAll"],(e=>async(...t)=>{const n=await e(...t);return a(),n}))}),(t=>n=>t(e(n,{beforeRequest:s}))),(r=>o=>{const a=xn(),i=xn(),s=r(e(o,{afterRequest:async(e,r)=>{if(401===(null==r?void 0:r.status))a.pub(null),i.pub(null);else{const e=await n(r);e&&i.pub(e);const{sessionJwt:o}=await t(r);o&&a.pub(o)}}})),c=an(s,["logout","logoutAll"],(e=>async(...t)=>{const n=await e(...t);return a.pub(null),i.pub(null),n}));return Object.assign(c,{onSessionTokenChange:a.sub,onUserChange:i.sub})}),(n=>r=>{var{persistTokens:o,sessionTokenViaCookie:a}=r,i=u(r,["persistTokens","sessionTokenViaCookie"]);if(ln||console.warn("Storing auth tokens in local storage and cookies are a client side only capabilities and will not be done when running in the server"),!o||!ln)return n(i);const s=n(e(i,{beforeRequest:qn,afterRequest:async(e,n)=>{401===(null==n?void 0:n.status)?An():En(await t(n),a)}})),c=an(s,["logout","logoutAll"],Dn);return Object.assign(c,{getRefreshToken:Cn,getSessionToken:Tn})}))(((...e)=>{const t=un(...e);return Object.assign(Object.assign({},t),{flow:Ln(t),webauthn:(n=t,{async signUp(e,t){const r=await n.webauthn.signUp.start(e,window.location.origin,t),o=await Jn(r.data.options);return await n.webauthn.signUp.finish(r.data.transactionId,o)},async signIn(e){const t=await n.webauthn.signIn.start(e,window.location.origin),r=await $n(t.data.options);return await n.webauthn.signIn.finish(t.data.transactionId,r)},async signUpOrIn(e){var t;const r=await n.webauthn.signUpOrIn.start(e,window.location.origin);if(null===(t=r.data)||void 0===t?void 0:t.create){const e=await Jn(r.data.options);return await n.webauthn.signUp.finish(r.data.transactionId,e)}{const e=await $n(r.data.options);return await n.webauthn.signIn.finish(r.data.transactionId,e)}},async update(e,t){const r=await n.webauthn.update.start(e,window.location.origin,t),o=await Jn(r.data.options);return await n.webauthn.update.finish(r.data.transactionId,o)},helpers:{create:Jn,get:$n,isSupported:Kn}})});var n}));return Bn}));
4
4
  //# sourceMappingURL=index.umd.js.map